From fa38e603a1b78e8feb7670710ac110ce3ec7f6a2 Mon Sep 17 00:00:00 2001 From: Jonas Reith Date: Wed, 26 Aug 2026 19:05:30 +0200 Subject: [PATCH] Initial commit: WayfarersWanderer project state Godot 4.6 exploration game with player movement, step-rotation camera rig, and POI interaction system (explore/rest/close menu). main.tscn is a test scene with placeholder props; debug/ holds unwired terrain prototypes (voxel river, procedural island mesh, cross-shaped hub --- .editorconfig | 4 + .gitattributes | 2 + .gitignore | 3 + assets/debug/checkerboard.png | Bin 0 -> 602 bytes assets/debug/checkerboard.png.import | 41 +++ assets/models/forest.glb | Bin 0 -> 69884 bytes assets/models/forest.glb.import | 42 +++ assets/models/forest_tree_greenv1.png | Bin 0 -> 3388 bytes assets/models/forest_tree_greenv1.png.import | 44 +++ assets/models/mountain.glb | Bin 0 -> 12524 bytes assets/models/mountain.glb.import | 42 +++ assets/models/mountain2v5.glb | Bin 0 -> 13188 bytes assets/models/mountain2v5.glb.import | 42 +++ .../sprites/enviroment/Brown-gray_ruins2.png | Bin 0 -> 3524 bytes .../enviroment/Brown-gray_ruins2.png.import | 41 +++ assets/sprites/player/debug_player.png | Bin 0 -> 18208 bytes assets/sprites/player/debug_player.png.import | 41 +++ camera_rig.gd | 77 +++++ camera_rig.gd.uid | 1 + debug/FreeCam.gd | 34 ++ debug/FreeCam.gd.uid | 1 + debug/Grenze.gd | 271 +++++++++++++++ debug/Grenze.gd.uid | 1 + debug/IslandMesh.gd | 100 ++++++ debug/IslandMesh.gd.uid | 1 + debug/fluss_proto.tscn | 22 ++ debug/flying_island.tscn | 36 ++ debug/voxel.gd | 134 ++++++++ debug/voxel.gd.uid | 1 + interaction_manager.gd | 59 ++++ interaction_manager.gd.uid | 1 + interaction_ui.gd | 68 ++++ interaction_ui.gd.uid | 1 + interaction_ui.tscn | 57 ++++ main.tscn | 323 ++++++++++++++++++ modeltest.tscn | 8 + player.gd | 62 ++++ player.gd.uid | 1 + player.tscn | 153 +++++++++ poi.gd | 48 +++ poi.gd.uid | 1 + poi.tscn | 55 +++ preview_scene.tscn3183368435.tmp | 16 + preview_scene.tscn3781868854.tmp | 16 + project.godot | 128 +++++++ 45 files changed, 1978 insertions(+) create mode 100755 .editorconfig create mode 100755 .gitattributes create mode 100755 .gitignore create mode 100755 assets/debug/checkerboard.png create mode 100755 assets/debug/checkerboard.png.import create mode 100644 assets/models/forest.glb create mode 100644 assets/models/forest.glb.import create mode 100644 assets/models/forest_tree_greenv1.png create mode 100644 assets/models/forest_tree_greenv1.png.import create mode 100644 assets/models/mountain.glb create mode 100644 assets/models/mountain.glb.import create mode 100644 assets/models/mountain2v5.glb create mode 100644 assets/models/mountain2v5.glb.import create mode 100755 assets/sprites/enviroment/Brown-gray_ruins2.png create mode 100755 assets/sprites/enviroment/Brown-gray_ruins2.png.import create mode 100755 assets/sprites/player/debug_player.png create mode 100755 assets/sprites/player/debug_player.png.import create mode 100755 camera_rig.gd create mode 100755 camera_rig.gd.uid create mode 100644 debug/FreeCam.gd create mode 100644 debug/FreeCam.gd.uid create mode 100644 debug/Grenze.gd create mode 100644 debug/Grenze.gd.uid create mode 100644 debug/IslandMesh.gd create mode 100644 debug/IslandMesh.gd.uid create mode 100644 debug/fluss_proto.tscn create mode 100644 debug/flying_island.tscn create mode 100644 debug/voxel.gd create mode 100644 debug/voxel.gd.uid create mode 100755 interaction_manager.gd create mode 100755 interaction_manager.gd.uid create mode 100755 interaction_ui.gd create mode 100755 interaction_ui.gd.uid create mode 100755 interaction_ui.tscn create mode 100755 main.tscn create mode 100644 modeltest.tscn create mode 100755 player.gd create mode 100755 player.gd.uid create mode 100644 player.tscn create mode 100755 poi.gd create mode 100755 poi.gd.uid create mode 100755 poi.tscn create mode 100755 preview_scene.tscn3183368435.tmp create mode 100755 preview_scene.tscn3781868854.tmp create mode 100755 project.godot diff --git a/.editorconfig b/.editorconfig new file mode 100755 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100755 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..0af181c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Godot 4+ specific ignores +.godot/ +/android/ diff --git a/assets/debug/checkerboard.png b/assets/debug/checkerboard.png new file mode 100755 index 0000000000000000000000000000000000000000..dde451ac8731dc1211ce83f87d5313962ee7fc8d GIT binary patch literal 602 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5890C>L#5>RT_9d@kh>GZx^prw85o#EJY5_^ zD(1Ysj-w(y?ssCWNoFU2~m_c`eW`o!T5eM!Jt_7?n ztQVMOF=a6NGHz*DHXNnT{$Ti>)Y$(0xc!3R=skS#_L0$!aS3xO-@(XOP@?g4^>bP0 Hl+XkK+jy}R literal 0 HcmV?d00001 diff --git a/assets/debug/checkerboard.png.import b/assets/debug/checkerboard.png.import new file mode 100755 index 0000000..9f838f2 --- /dev/null +++ b/assets/debug/checkerboard.png.import @@ -0,0 +1,41 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3ajv7vb8c4fb" +path.s3tc="res://.godot/imported/checkerboard.png-4dad1517039036e2382fd0e75874c867.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/debug/checkerboard.png" +dest_files=["res://.godot/imported/checkerboard.png-4dad1517039036e2382fd0e75874c867.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/assets/models/forest.glb b/assets/models/forest.glb new file mode 100644 index 0000000000000000000000000000000000000000..1750919e75fb173c0c7f3fb129486b611648500f GIT binary patch literal 69884 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 BJH!A0 literal 0 HcmV?d00001 diff --git a/assets/models/forest.glb.import b/assets/models/forest.glb.import new file mode 100644 index 0000000..f24416f --- /dev/null +++ b/assets/models/forest.glb.import @@ -0,0 +1,42 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://be2uq7ixlbv6b" +path="res://.godot/imported/forest.glb-afdae727313ccf3677ce0399e0a685a4.scn" + +[deps] + +source_file="res://assets/models/forest.glb" +dest_files=["res://.godot/imported/forest.glb-afdae727313ccf3677ce0399e0a685a4.scn"] + +[params] + +nodes/root_type="StaticBody3D" +nodes/root_name="" +nodes/root_script=null +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 diff --git a/assets/models/forest_tree_greenv1.png b/assets/models/forest_tree_greenv1.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9c657513e8d008d7ff9793a4bcebbd0819d1a6 GIT binary patch literal 3388 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 literal 0 HcmV?d00001 diff --git a/assets/models/mountain.glb.import b/assets/models/mountain.glb.import new file mode 100644 index 0000000..fa6036e --- /dev/null +++ b/assets/models/mountain.glb.import @@ -0,0 +1,42 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dmhs1oy1kh6hi" +path="res://.godot/imported/mountain.glb-8b287651a1bb38426cf17e1af324657c.scn" + +[deps] + +source_file="res://assets/models/mountain.glb" +dest_files=["res://.godot/imported/mountain.glb-8b287651a1bb38426cf17e1af324657c.scn"] + +[params] + +nodes/root_type="StaticBody3D" +nodes/root_name="" +nodes/root_script=null +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 diff --git a/assets/models/mountain2v5.glb b/assets/models/mountain2v5.glb new file mode 100644 index 0000000000000000000000000000000000000000..9ae19f126e9361b8aa0c2a6c32be5d0cdd95ec2c GIT binary patch literal 13188 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/enviroment/Brown-gray_ruins2.png.import b/assets/sprites/enviroment/Brown-gray_ruins2.png.import new file mode 100755 index 0000000..fbe0957 --- /dev/null +++ b/assets/sprites/enviroment/Brown-gray_ruins2.png.import @@ -0,0 +1,41 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0u8xjymrfw2x" +path.s3tc="res://.godot/imported/Brown-gray_ruins2.png-84005ae1fb5515afcbec8705a5b236e9.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/sprites/enviroment/Brown-gray_ruins2.png" +dest_files=["res://.godot/imported/Brown-gray_ruins2.png-84005ae1fb5515afcbec8705a5b236e9.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/assets/sprites/player/debug_player.png b/assets/sprites/player/debug_player.png new file mode 100755 index 0000000000000000000000000000000000000000..437e2a666ecd77b9d0334124e4da1857a285f98e GIT binary patch literal 18208 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 M+G?4(VQ2Jz04Z>JMgRZ+ literal 0 HcmV?d00001 diff --git a/assets/sprites/player/debug_player.png.import b/assets/sprites/player/debug_player.png.import new file mode 100755 index 0000000..957886e --- /dev/null +++ b/assets/sprites/player/debug_player.png.import @@ -0,0 +1,41 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://epcqli428yem" +path.s3tc="res://.godot/imported/debug_player.png-3f02112dbaffc1fe27016269e0bd44e1.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/sprites/player/debug_player.png" +dest_files=["res://.godot/imported/debug_player.png-3f02112dbaffc1fe27016269e0bd44e1.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/camera_rig.gd b/camera_rig.gd new file mode 100755 index 0000000..0d00f63 --- /dev/null +++ b/camera_rig.gd @@ -0,0 +1,77 @@ +extends Node3D + +@export var target: NodePath # Player-Pfad hier im Inspector setzen! +@export var rotation_step: float = 45.0 # 360/8 Steps +@export var rotation_speed: float = 3.0 # Smooth-Rotation +@export var zoom_min: float = 4.0 +@export var zoom_max: float = 20.0 +@export var zoom_step: float = 1.5 +@export var mouse_sensitivity: float = 0.3 + +var _target_node: Node3D +var _current_zoom: float = 10.0 +var _target_rotation_y: float = 0.0 +var _mouse_rotating: bool = false + +@onready var arm: Node3D = $CameraArm +@onready var camera: Camera3D = $CameraArm/Camera3D + +func _ready() -> void: + _target_node = get_node(target) + _current_zoom = camera.position.z + +func _input(event: InputEvent) -> void: + # Maus-Scroll Zoom + if event is InputEventMouseButton: + if event.button_index == MOUSE_BUTTON_WHEEL_UP: + _current_zoom = clamp(_current_zoom - zoom_step, zoom_min, zoom_max) + elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN: + _current_zoom = clamp(_current_zoom + zoom_step, zoom_min, zoom_max) + # Rechte Maustaste für Maus-Kamerarotation + elif event.button_index == MOUSE_BUTTON_RIGHT: + _mouse_rotating = event.pressed + Input.set_mouse_mode( + Input.MOUSE_MODE_CAPTURED if _mouse_rotating else Input.MOUSE_MODE_VISIBLE + ) + + # Maus-Bewegung → Kamera-Rotation + if event is InputEventMouseMotion and _mouse_rotating: + _target_rotation_y -= event.relative.x * mouse_sensitivity + +func _process(delta: float) -> void: + if not _target_node: + return + + # Kamera folgt Player (Position) + #global_position = global_position.lerp(_target_node.global_position, 10.0 * delta) + global_position = _target_node.global_position # Kein Lerp, exakt folgen + + # Step-Rotation (Q/E + LB/RB) + if Input.is_action_just_pressed("cam_rotate_left"): + _target_rotation_y += rotation_step + if Input.is_action_just_pressed("cam_rotate_right"): + _target_rotation_y -= rotation_step + + # Rechter Stick X → kontinuierliche Rotation + # var stick_x = Input.get_axis("", "") # → siehe Hinweis unten + # Füge in Input Map "cam_rotate_analog_left/right" für Stick hinzu + # var stick_x = Input.get_axis("cam_rotate_analog_left", "cam_rotate_analog_right") + # _target_rotation_y -= stick_x * rotation_speed * delta * 100 + + # Controller Trigger Zoom + var zoom_in_val = Input.get_action_strength("zoom_in") + var zoom_out_val = Input.get_action_strength("zoom_out") + _current_zoom = clamp( + _current_zoom - (zoom_in_val - zoom_out_val) * zoom_step * delta * 5, + zoom_min, zoom_max + ) + + # Rotation smoothen + rotation_degrees.y = lerp_angle( + deg_to_rad(rotation_degrees.y), + deg_to_rad(_target_rotation_y), + rotation_speed * delta + ) * (180.0 / PI) + + # Zoom anwenden + camera.position.z = lerp(camera.position.z, _current_zoom, 10.0 * delta) diff --git a/camera_rig.gd.uid b/camera_rig.gd.uid new file mode 100755 index 0000000..357af39 --- /dev/null +++ b/camera_rig.gd.uid @@ -0,0 +1 @@ +uid://b0y06y7c0bihj diff --git a/debug/FreeCam.gd b/debug/FreeCam.gd new file mode 100644 index 0000000..af438b7 --- /dev/null +++ b/debug/FreeCam.gd @@ -0,0 +1,34 @@ +extends Node3D + +@export var fly_speed : float = 20.0 +@export var fast_speed : float = 60.0 +@export var sensitivity: float = 0.003 + +var yaw : float = PI +var pitch : float = -0.38 +var captured: bool = false + +func _unhandled_input(e: InputEvent) -> void: + if e is InputEventMouseButton and e.button_index == MOUSE_BUTTON_RIGHT: + captured = e.pressed + Input.set_mouse_mode( + Input.MOUSE_MODE_CAPTURED if captured else Input.MOUSE_MODE_VISIBLE) + if e is InputEventMouseMotion and captured: + yaw -= e.relative.x * sensitivity + pitch = clamp(pitch - e.relative.y * sensitivity, -1.4, 0.2) + rotation = Vector3(pitch, yaw, 0) + if e is InputEventKey and e.pressed and e.keycode == KEY_ESCAPE: + captured = false + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + +func _process(delta: float) -> void: + var spd := fast_speed if Input.is_key_pressed(KEY_SHIFT) else fly_speed + var move := Vector3.ZERO + if Input.is_key_pressed(KEY_W): move -= global_transform.basis.z + if Input.is_key_pressed(KEY_S): move += global_transform.basis.z + if Input.is_key_pressed(KEY_A): move -= global_transform.basis.x + if Input.is_key_pressed(KEY_D): move += global_transform.basis.x + if Input.is_key_pressed(KEY_E): move += Vector3.UP + if Input.is_key_pressed(KEY_Q): move -= Vector3.UP + if move.length_squared() > 0: + position += move.normalized() * spd * delta diff --git a/debug/FreeCam.gd.uid b/debug/FreeCam.gd.uid new file mode 100644 index 0000000..e15c86a --- /dev/null +++ b/debug/FreeCam.gd.uid @@ -0,0 +1 @@ +uid://bia8axed2ndwj diff --git a/debug/Grenze.gd b/debug/Grenze.gd new file mode 100644 index 0000000..dd94268 --- /dev/null +++ b/debug/Grenze.gd @@ -0,0 +1,271 @@ +extends Node3D + +@export var berg_scale : float = .002 + +# Welt-Parameter +const ISLAND_RADIUS : float = 512.0 +const GRID : float = 1.0 # 1m pro Block +const CORRIDOR_WIDTH : int = 3 # Korridor-Breite in Blöcken +const CENTER_RADIUS : float = 120.0 # Radius Mittelzone + +# Pass-Position: Anteil vom Rand der Mittelzone (0=Mitte, 1=Inselrand) +# 0.35 = ca. erstes Drittel ab Mittelzone Richtung Rand +const PASS_POS : float = 0.35 +const PASS_WIDTH : int = 3 # Lücke in Blöcken + +func _ready() -> void: + _spawn_kreuz() + _spawn_mittelring() + _spawn_ozean() + +# ═══════════════════════════════════════════════════════════════ +# KREUZ — 4 Arme: Nord, Süd, West = Berge | Ost = Fluss +# ═══════════════════════════════════════════════════════════════ +func _spawn_kreuz() -> void: + # Jeder Arm geht von CENTER_RADIUS bis ISLAND_RADIUS + _spawn_arm_berge("Nord", Vector3( 0, 0, -1)) + _spawn_arm_berge("Sued", Vector3( 0, 0, 1)) + _spawn_arm_berge("West", Vector3(-1, 0, 0)) + _spawn_arm_fluss("Ost", Vector3( 1, 0, 0)) + +# ── Berg-Arm ───────────────────────────────────────────────── +func _spawn_arm_berge(label: String, dir: Vector3) -> void: + var grp := Node3D.new() + grp.name = "Arm_" + label + add_child(grp) + + var perp := dir.cross(Vector3.UP).normalized() + var arm_len := ISLAND_RADIUS - CENTER_RADIUS + var steps := int(arm_len / GRID) + + # Pass-Bereich berechnen (in Steps ab Mittelzone) + var pass_start := int(steps * PASS_POS) + var pass_end := pass_start + PASS_WIDTH + + # Große Berg-Modelle vorbauen + var large_meshes := _make_large_berge() + var small_meshes := _make_small_berge() + + for step in range(steps): + # Position entlang des Arms + var dist := CENTER_RADIUS + step * GRID + GRID * 0.5 + var center := dir * dist + + var in_pass := (step >= pass_start and step < pass_end) + + for col in range(-CORRIDOR_WIDTH / 2, CORRIDOR_WIDTH / 2 + 1): + var pos := center + perp * (col * GRID) + pos.y = 0.0 + + if in_pass: + # Im Pass: nur außen kleine Berge, Mitte frei + if abs(col) == CORRIDOR_WIDTH / 2: + _place_berg(grp, pos, small_meshes) + # col == 0 → frei (Durchgang) + else: + # Außenreihen → kleine Berge dicht + if abs(col) >= 1: + _place_berg(grp, pos, small_meshes) + # Mittelreihe → große Berge + else: + _place_berg(grp, pos, large_meshes) + + # Pass-Marker (Platzhalter Tor) + var pass_dist := CENTER_RADIUS + (pass_start + PASS_WIDTH * 0.5) * GRID + var pass_center := dir * pass_dist + _spawn_pass_marker(grp, pass_center) + +func _place_berg(parent: Node3D, pos: Vector3, meshes: Array) -> void: + var mi := MeshInstance3D.new() + mi.mesh = meshes[randi() % meshes.size()] + mi.position = pos + # Zufällige Y-Rotation für Abwechslung + mi.rotation.y = randf() * TAU + parent.add_child(mi) + +# ── Fluss-Arm ──────────────────────────────────────────────── +func _spawn_arm_fluss(label: String, dir: Vector3) -> void: + var grp := Node3D.new() + grp.name = "Arm_" + label + add_child(grp) + + var arm_len := ISLAND_RADIUS - CENTER_RADIUS + var steps := int(arm_len / GRID) + + var pass_start := int(steps * PASS_POS) + var pass_end := pass_start + PASS_WIDTH + + var mat_wasser := StandardMaterial3D.new() + mat_wasser.albedo_color = Color(0.18, 0.45, 0.78) + mat_wasser.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + + for step in range(steps): + var dist := CENTER_RADIUS + step * GRID + GRID * 0.5 + var pos := dir * dist + pos.y = -0.5 # 1m tief eingeschnitten + + var in_pass := (step >= pass_start and step < pass_end) + + if in_pass: + # Brücken-Block + _spawn_bruecke_block(grp, dir * dist) + else: + # Fluss-Block: 1x1m Wasser + var mi := MeshInstance3D.new() + var box := BoxMesh.new() + box.size = Vector3(GRID, GRID, GRID) + box.surface_set_material(0, mat_wasser) + mi.mesh = box + mi.position = pos + mi.name = "Fluss_" + str(step) + grp.add_child(mi) + +func _spawn_bruecke_block(parent: Node3D, pos: Vector3) -> void: + var mi := MeshInstance3D.new() + var box := BoxMesh.new() + box.size = Vector3(GRID * 3.0, 0.3, GRID * 3.0) + var mat := StandardMaterial3D.new() + mat.albedo_color = Color(0.55, 0.45, 0.32) + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + box.surface_set_material(0, mat) + mi.mesh = box + mi.position = pos + Vector3(0, 0.65, 0) + mi.name = "Bruecke" + parent.add_child(mi) + +# ── Pass-Marker ─────────────────────────────────────────────── +func _spawn_pass_marker(parent: Node3D, pos: Vector3) -> void: + var mi := MeshInstance3D.new() + var box := BoxMesh.new() + box.size = Vector3(2.0, 4.0, 2.0) + var mat := StandardMaterial3D.new() + mat.albedo_color = Color(0.85, 0.78, 0.40) + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + box.surface_set_material(0, mat) + mi.mesh = box + mi.position = pos + Vector3(0, 2.0, 0) + mi.name = "PassMarker" + parent.add_child(mi) + +# ═══════════════════════════════════════════════════════════════ +# MITTELRING — Bergring um die Mittelzone +# ═══════════════════════════════════════════════════════════════ +func _spawn_mittelring() -> void: + var grp := Node3D.new() + grp.name = "Mittelring" + add_child(grp) + + var large_meshes := _make_large_berge() + var small_meshes := _make_small_berge() + + # Umfang des Kreises in 1m-Schritten + var circumference := TAU * CENTER_RADIUS + var steps := int(circumference / GRID) + + # Die 4 Kreuz-Arme blockieren bestimmte Winkel → dort Pässe + # Arm-Winkel: Nord=270°, Süd=90°, West=180°, Ost=0° + var arm_angles := [0.0, PI * 0.5, PI, PI * 1.5] + var pass_half := (float(PASS_WIDTH) * GRID) / CENTER_RADIUS # Winkel-Halbbreite + + for step in range(steps): + var angle := float(step) / steps * TAU + + # Prüfen ob dieser Winkel in einem Arm-Durchgang liegt + var in_arm := false + for arm_a in arm_angles: + var diff: float = abs(angle_difference(angle, arm_a)) + if diff < pass_half * 1.5: + in_arm = true + break + + # Innenring (dicht am Center_radius) + var r_inner := CENTER_RADIUS - 1.0 + var pos_i := Vector3(cos(angle)*r_inner, 0, sin(angle)*r_inner) + # Außenring + var r_outer := CENTER_RADIUS + 2.0 + var pos_o := Vector3(cos(angle)*r_outer, 0, sin(angle)*r_outer) + + if not in_arm: + _place_berg(grp, pos_i, large_meshes) + _place_berg(grp, pos_o, small_meshes) + +# Hilfsfunktion: Winkel-Differenz -PI..PI +func angle_difference(a: float, b: float) -> float: + var d := fmod(a - b + TAU, TAU) + if d > PI: d -= TAU + return d + +# ═══════════════════════════════════════════════════════════════ +# BERG-MODELLE — prozedural, mehrere Varianten +# ═══════════════════════════════════════════════════════════════ +func _make_large_berge() -> Array: + var result := [] + # 4 große Varianten: breiter, massiver + var configs := [ + [8.0, 0.05, 22.0, 6], + [10.0, 0.05, 18.0, 7], + [7.0, 0.05, 26.0, 5], + [12.0, 0.05, 20.0, 8], + ] + for cfg in configs: + result.append(_make_berg_mesh(cfg[0], cfg[1], cfg[2] * berg_scale, int(cfg[3]), false)) + return result + +func _make_small_berge() -> Array: + var result := [] + # 6 kleine Varianten: schmaler, dichter packbar + var configs := [ + [3.0, 0.02, 10.0, 5], + [2.5, 0.02, 8.0, 6], + [4.0, 0.02, 12.0, 5], + [2.0, 0.02, 7.0, 4], + [3.5, 0.02, 11.0, 6], + [2.8, 0.02, 9.0, 5], + ] + for cfg in configs: + result.append(_make_berg_mesh(cfg[0], cfg[1], cfg[2], int(cfg[3]), true)) + return result + +func _make_berg_mesh(bot_r: float, top_r: float, h: float, + sides: int, small: bool) -> Mesh: + var st := SurfaceTool.new() + st.begin(Mesh.PRIMITIVE_TRIANGLES) + + var tip := Vector3(0, h, 0) + var gray := randf_range(0.35, 0.55) if not small else randf_range(0.40, 0.58) + var col := Color(gray, gray * 0.97, gray * 0.93) + var col_b := Color(gray * 0.7, gray * 0.68, gray * 0.65) + + for s in range(sides): + var a0 := float(s) / sides * TAU + var a1 := float(s+1) / sides * TAU + var b0 := Vector3(cos(a0)*bot_r, 0, sin(a0)*bot_r) + var b1 := Vector3(cos(a1)*bot_r, 0, sin(a1)*bot_r) + var t0 := Vector3(cos(a0)*top_r, h, sin(a0)*top_r) + var t1 := Vector3(cos(a1)*top_r, h, sin(a1)*top_r) + + # Seite + var n := (b1 - b0).cross(tip - b0).normalized() + st.set_normal(n); st.set_color(col) + st.add_vertex(b0); st.add_vertex(tip); st.add_vertex(b1) + # Boden-Cap + st.set_normal(Vector3(0,-1,0)); st.set_color(col_b) + st.add_vertex(Vector3(0,0,0)); st.add_vertex(b1); st.add_vertex(b0) + + return st.commit() + +# ═══════════════════════════════════════════════════════════════ +# OZEAN unter der Insel +# ═══════════════════════════════════════════════════════════════ +func _spawn_ozean() -> void: + var mi := MeshInstance3D.new() + var plane := PlaneMesh.new() + plane.size = Vector2(4096, 4096) + var mat := StandardMaterial3D.new() + mat.albedo_color = Color(0.08, 0.25, 0.52) + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + plane.surface_set_material(0, mat) + mi.mesh = plane + mi.position = Vector3(0, -40, 0) + mi.name = "Ozean" + add_child(mi) diff --git a/debug/Grenze.gd.uid b/debug/Grenze.gd.uid new file mode 100644 index 0000000..22a9b55 --- /dev/null +++ b/debug/Grenze.gd.uid @@ -0,0 +1 @@ +uid://cql864jt4i24 diff --git a/debug/IslandMesh.gd b/debug/IslandMesh.gd new file mode 100644 index 0000000..7bd7c58 --- /dev/null +++ b/debug/IslandMesh.gd @@ -0,0 +1,100 @@ +extends Node3D + +@export var radius : float = 1024.0 +@export var segments: int = 128 +@export var seed_val: int = 42 +@export var erosion : float = 0.18 + +func _ready() -> void: + _build() + +func _build() -> void: + var noise := FastNoiseLite.new() + noise.seed = seed_val + noise.noise_type = FastNoiseLite.TYPE_SIMPLEX_SMOOTH + noise.frequency = 0.008 + + var st := SurfaceTool.new() + st.begin(Mesh.PRIMITIVE_TRIANGLES) + var verts: PackedVector3Array = [] + var colrs: PackedColorArray = [] + var seg := segments + + for i in range(seg + 1): + for j in range(seg + 1): + var u := float(i) / seg + var v := float(j) / seg + var angle := u * TAU + var r := v * radius + var en := 1.0 + noise.get_noise_2d( + cos(angle) * 80.0, + sin(angle) * 80.0) * erosion + var x := cos(angle) * r * en + var z := sin(angle) * r * en + var dn := r / radius + # Komplett flach — nur Rand fällt ab + var y := -6.0 * pow(dn, 6.0) + verts.append(Vector3(x, y, z)) + colrs.append(_col(dn)) + + for i in range(seg): + for j in range(seg): + var idx := i * (seg + 1) + j + var a := idx; var b := idx + 1 + var c := idx+(seg+1); var d := idx+(seg+1)+1 + var n := (verts[b]-verts[a]).cross(verts[c]-verts[a]).normalized() + for vtx in [a, b, c]: + st.set_normal(n); st.set_color(colrs[vtx]) + st.add_vertex(verts[vtx]) + for vtx in [b, d, c]: + st.set_normal(n); st.set_color(colrs[vtx]) + st.add_vertex(verts[vtx]) + + var mesh := st.commit() + var mat := StandardMaterial3D.new() + mat.vertex_color_use_as_albedo = true + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + mesh.surface_set_material(0, mat) + var mi := MeshInstance3D.new() + mi.mesh = mesh + add_child(mi) + + _build_underside() + +func _col(dn: float) -> Color: + if dn > 0.93: return Color(0.45, 0.38, 0.28) # Erdrand + if dn > 0.85: return Color(0.38, 0.55, 0.25) # Gras außen + return Color(0.42, 0.65, 0.30) # Gras + +func _build_underside() -> void: + var st := SurfaceTool.new() + st.begin(Mesh.PRIMITIVE_TRIANGLES) + var seg := 80 + var bot := Vector3(0, -18.0, 0) + var noise := FastNoiseLite.new() + noise.seed = seed_val + 1 + for i in range(seg): + var a0 := float(i) / seg * TAU + var a1 := float(i+1) / seg * TAU + var r := radius * 0.9 + var e0 := 1.0 + noise.get_noise_2d(cos(a0)*80, sin(a0)*80) * erosion + var e1 := 1.0 + noise.get_noise_2d(cos(a1)*80, sin(a1)*80) * erosion + var p0 := Vector3(cos(a0)*r*e0, -2.0, sin(a0)*r*e0) + var p1 := Vector3(cos(a1)*r*e1, -2.0, sin(a1)*r*e1) + var col := Color(0.30, 0.25, 0.18) + st.set_color(col); st.set_normal(Vector3(0,-1,0)) + st.add_vertex(bot); st.add_vertex(p1); st.add_vertex(p0) + # Seite + var t0 := Vector3(p0.x, 0.0, p0.z) + var t1 := Vector3(p1.x, 0.0, p1.z) + st.add_vertex(p0); st.add_vertex(t0); st.add_vertex(p1) + st.add_vertex(t0); st.add_vertex(t1); st.add_vertex(p1) + var mesh := st.commit() + var mat := StandardMaterial3D.new() + mat.vertex_color_use_as_albedo = true + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + mat.cull_mode = BaseMaterial3D.CULL_DISABLED + mesh.surface_set_material(0, mat) + var mi := MeshInstance3D.new() + mi.mesh = mesh + add_child(mi) diff --git a/debug/IslandMesh.gd.uid b/debug/IslandMesh.gd.uid new file mode 100644 index 0000000..2017f65 --- /dev/null +++ b/debug/IslandMesh.gd.uid @@ -0,0 +1 @@ +uid://d0xuftjl5xssi diff --git a/debug/fluss_proto.tscn b/debug/fluss_proto.tscn new file mode 100644 index 0000000..78a1aac --- /dev/null +++ b/debug/fluss_proto.tscn @@ -0,0 +1,22 @@ +[gd_scene format=3 uid="uid://cidsmilm68b5q"] + +[ext_resource type="PackedScene" uid="uid://dljjlqptwc2a2" path="res://player.tscn" id="1_ei44b"] +[ext_resource type="Script" uid="uid://syb1gkanuju7" path="res://debug/voxel.gd" id="1_iosed"] +[ext_resource type="Script" uid="uid://bia8axed2ndwj" path="res://debug/FreeCam.gd" id="2_sjo6i"] + +[node name="FlussProto" type="Node3D" unique_id=962938880] + +[node name="Player" parent="." unique_id=1949521754 instance=ExtResource("1_ei44b")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.98786944, 4.5496826, 4.1674347) + +[node name="Voxel" type="Node3D" parent="." unique_id=1517507308] +script = ExtResource("1_iosed") + +[node name="FlyCamera2" type="Node3D" parent="." unique_id=409666653] +transform = Transform3D(1, 0, 0, 0, 0.92718387, 0.3746066, 0, -0.3746066, 0.92718387, 0, 20, 40) +script = ExtResource("2_sjo6i") + +[node name="Camera3D" type="Camera3D" parent="FlyCamera2" unique_id=808390848] +fov = 65.0 +near = 0.1 +far = 1000.0 diff --git a/debug/flying_island.tscn b/debug/flying_island.tscn new file mode 100644 index 0000000..78984cb --- /dev/null +++ b/debug/flying_island.tscn @@ -0,0 +1,36 @@ +[gd_scene format=3 uid="uid://xes77y1x72b6"] + +[ext_resource type="Script" uid="uid://bia8axed2ndwj" path="res://debug/FreeCam.gd" id="1_idwjx"] +[ext_resource type="Script" uid="uid://d0xuftjl5xssi" path="res://debug/IslandMesh.gd" id="2_obm1k"] +[ext_resource type="Script" uid="uid://cql864jt4i24" path="res://debug/Grenze.gd" id="3_3bsno"] + +[sub_resource type="Environment" id="Environment_obm1k"] +background_mode = 1 +background_color = Color(0.16470589, 0.25490198, 0.36078432, 1) +ambient_light_source = 2 +ambient_light_color = Color(0.23529412, 0.25490198, 0.29411766, 1) +ambient_light_energy = 0.8 + +[node name="FlyingIsland" type="Node3D" unique_id=1133718991] + +[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1194180535] +environment = SubResource("Environment_obm1k") + +[node name="Sun" type="DirectionalLight3D" parent="." unique_id=919416523] +transform = Transform3D(0.8660254, -0.35355338, 0.35355338, 0, 0.70710677, 0.70710677, -0.5, -0.6123724, 0.6123724, 0, 0, 0) +light_energy = 1.2 + +[node name="FlyCamera" type="Node3D" parent="." unique_id=86070119] +transform = Transform3D(1, 0, 0, 0, 0.92718387, 0.3746066, 0, -0.3746066, 0.92718387, 0, 60, 120) +script = ExtResource("1_idwjx") + +[node name="Camera3D" type="Camera3D" parent="FlyCamera" unique_id=1353892435] +fov = 65.0 +near = 0.1 +far = 1000.0 + +[node name="IslandMesh" type="Node3D" parent="." unique_id=1416580731] +script = ExtResource("2_obm1k") + +[node name="Grenze" type="Node3D" parent="." unique_id=139532892] +script = ExtResource("3_3bsno") diff --git a/debug/voxel.gd b/debug/voxel.gd new file mode 100644 index 0000000..1dc9183 --- /dev/null +++ b/debug/voxel.gd @@ -0,0 +1,134 @@ +extends Node3D + +const W := 10 # Breite X +const D := 10 # Tiefe Z +const H := 3 # Höhe Y + +# Fluss läuft entlang Z, mittig auf X +const FLUSS_X := 5 # Welche X-Spalte (0-basiert, Mitte = 4 oder 5) +const FLUSS_TIEFE := 2 # Wie viele Blöcke von oben rausgenommen +const WASSER_Y := 0 # Y-Index wo Wasser sitzt (unterster Block des Grabens) + +# Materialien — einmal erstellen, mehrfach nutzen +var mat_erde : StandardMaterial3D +var mat_gras : StandardMaterial3D +var mat_wasser : ShaderMaterial + +func _ready() -> void: + _make_materials() + _build() + +# ═══════════════════════════════════════════════ +# MATERIALIEN +# ═══════════════════════════════════════════════ +func _make_materials() -> void: + mat_erde = StandardMaterial3D.new() + mat_erde.albedo_color = Color(0.38, 0.26, 0.16) + mat_erde.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + + mat_gras = StandardMaterial3D.new() + mat_gras.albedo_color = Color(0.35, 0.60, 0.22) + mat_gras.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + + # Wasser-Shader + var shader := Shader.new() + shader.code = """ +shader_type spatial; +render_mode unshaded, cull_disabled, blend_mix; + +uniform vec4 color_shallow : source_color = vec4(0.2, 0.55, 0.85, 0.75); +uniform vec4 color_deep : source_color = vec4(0.1, 0.35, 0.70, 0.90); +uniform float speed : hint_range(0.0, 2.0) = 0.6; +uniform float wave_scale : hint_range(0.1, 5.0) = 1.5; + +void fragment() { + vec2 uv = UV * wave_scale + vec2(TIME * speed, TIME * speed * 0.4); + float wave = sin(uv.x * 6.28) * 0.5 + 0.5; + wave += sin(uv.y * 6.28 * 1.3 + TIME * speed) * 0.3; + wave = clamp(wave * 0.5, 0.0, 1.0); + ALBEDO = mix(color_shallow.rgb, color_deep.rgb, wave); + ALPHA = mix(color_shallow.a, color_deep.a, wave); +} +""" + mat_wasser = ShaderMaterial.new() + mat_wasser.shader = shader + +# ═══════════════════════════════════════════════ +# WELT BAUEN +# ═══════════════════════════════════════════════ +func _build() -> void: + for x in range(W): + for z in range(D): + _build_spalte(x, z) + +func _build_spalte(x: int, z: int) -> void: + var ist_fluss := (x == FLUSS_X) + + for y in range(H): + # Fluss-Graben: oberste FLUSS_TIEFE Blöcke fehlen + if ist_fluss and y >= (H - FLUSS_TIEFE): + continue + + var mat : StandardMaterial3D + if y == H - 1 and not ist_fluss: + mat = mat_gras # Oberste Schicht = Gras + else: + mat = mat_erde # Alles darunter = Erde + + _place_block(Vector3(x, y, z), mat) + + # Wasser in den Graben + if ist_fluss: + var wasser_y := H - FLUSS_TIEFE # Wasser sitzt auf dem Boden des Grabens + _place_wasser(Vector3(x, wasser_y, z)) + + # Wasserfall: wo Fluss auf Z-Rand trifft + if ist_fluss and (z == 0 or z == D - 1): + _spawn_wasserfall(x, z) + +# ═══════════════════════════════════════════════ +# BLÖCKE PLATZIEREN +# ═══════════════════════════════════════════════ +func _place_block(pos: Vector3, mat: StandardMaterial3D) -> void: + var mi := MeshInstance3D.new() + var box := BoxMesh.new() + box.size = Vector3(1, 1, 1) + box.surface_set_material(0, mat) + mi.mesh = box + mi.position = pos + Vector3(0.5, 0.5, 0.5) # Pivot unten-links + add_child(mi) + +func _place_wasser(pos: Vector3) -> void: + var mi := MeshInstance3D.new() + var box := BoxMesh.new() + # Wasser etwas flacher als 1m damit man Tiefe sieht + box.size = Vector3(1.0, 0.65, 1.0) + box.surface_set_material(0, mat_wasser) + mi.mesh = box + mi.position = pos + Vector3(0.5, 0.33, 0.5) + mi.transparency = 0.3 + add_child(mi) + +# ═══════════════════════════════════════════════ +# WASSERFALL +# ═══════════════════════════════════════════════ +func _spawn_wasserfall(x: int, z: int) -> void: + # Vertikale Wasser-Plane von Graben-Unterkante bis Boden + var fall_h := float(H - FLUSS_TIEFE) # Höhe des Falls + var mi := MeshInstance3D.new() + var quad := QuadMesh.new() + quad.size = Vector2(1.0, fall_h) + quad.surface_set_material(0, mat_wasser) + mi.mesh = quad + + # Positionierung: Außenkante der Platte + var dir_z := -1.0 if z == 0 else 1.0 + mi.position = Vector3( + x + 0.5, + fall_h * 0.5, # Vertikal zentriert + z + 0.5 * dir_z # Außenkante + ) + # Plane zeigt nach außen + mi.rotation.y = 0.0 if z == D - 1 else PI + + add_child(mi) diff --git a/debug/voxel.gd.uid b/debug/voxel.gd.uid new file mode 100644 index 0000000..77ada88 --- /dev/null +++ b/debug/voxel.gd.uid @@ -0,0 +1 @@ +uid://syb1gkanuju7 diff --git a/interaction_manager.gd b/interaction_manager.gd new file mode 100755 index 0000000..ff7a495 --- /dev/null +++ b/interaction_manager.gd @@ -0,0 +1,59 @@ +extends Node + +signal interaction_opened +signal interaction_closed + +var active: bool = false +var current_poi: Node = null + +func open_poi(poi: Node) -> void: + active = true + current_poi = poi + InteractionUI.show_menu(poi.poi_name, _get_main_options()) + +func _get_main_options() -> Array: + return [ + { "label": "Erkunden", "action": "explore" }, + { "label": "Ausruhen", "action": "rest" }, + { "label": "Beenden", "action": "close" }, + ] + +func handle_selection(action: String) -> void: + match action: + "explore": + InteractionUI.show_menu("Erkunden", _get_explore_options()) + "rest": + InteractionUI.show_text("Du rastest eine Weile...\nDu fühlst dich erholt.") + "close": + close() + +func handle_explore(action: String) -> void: + match action: + "track_follow": + var success = randf() > 0.5 + if success: + InteractionUI.show_text("Du folgst den Spuren...\nEine seltene Tierbeobachtung!") + else: + InteractionUI.show_text("Du folgst den Spuren...\nDas Tier ist verschwunden.") + "track_leave": + close() + +func _get_explore_options() -> Array: + # Zufälliges Ereignis beim Erkunden + var roll = randf() + if roll < 0.5: + InteractionUI.show_text("Du findest Tierspuren!") + return [ + { "label": "Tier verfolgen", "action": "track_follow" }, + { "label": "In Ruhe lassen", "action": "track_leave" }, + ] + else: + InteractionUI.show_text("Nichts Besonderes zu finden.") + return [ + { "label": "Zurück", "action": "close" }, + ] + +func close() -> void: + active = false + current_poi = null + InteractionUI.hide_menu() diff --git a/interaction_manager.gd.uid b/interaction_manager.gd.uid new file mode 100755 index 0000000..f815713 --- /dev/null +++ b/interaction_manager.gd.uid @@ -0,0 +1 @@ +uid://cbg1abspfwgxo diff --git a/interaction_ui.gd b/interaction_ui.gd new file mode 100755 index 0000000..535a8a9 --- /dev/null +++ b/interaction_ui.gd @@ -0,0 +1,68 @@ +extends CanvasLayer + +@onready var panel = $Panel +@onready var title_label = $Panel/TitleLabel +@onready var message_label = $Panel/MessageLabel +@onready var option_container = $Panel/OptionContainer +@onready var hint_label = $Panel/HintLabel + +var current_options: Array = [] +var selected_index: int = 0 +var mode: String = "menu" # "menu" oder "text" + +func _ready() -> void: + panel.visible = false + +func show_menu(title: String, options: Array) -> void: + mode = "menu" + panel.visible = true + title_label.text = title + message_label.text = "" + hint_label.text = "[ESC/B] Beenden" + current_options = options + selected_index = 0 + _rebuild_options() + +func show_text(text: String) -> void: + mode = "text" + message_label.text = text + hint_label.text = "[F/A] Weiter [ESC/B] Beenden" + _clear_options() + +func hide_menu() -> void: + panel.visible = false + current_options = [] + +func _rebuild_options() -> void: + _clear_options() + for i in current_options.size(): + var btn = Button.new() + btn.text = current_options[i]["label"] + btn.focus_mode = Control.FOCUS_ALL + option_container.add_child(btn) + var action = current_options[i]["action"] + btn.pressed.connect(_on_option_pressed.bind(action)) + # Ersten Button fokussieren + if option_container.get_child_count() > 0: + option_container.get_child(0).grab_focus() + +func _clear_options() -> void: + for child in option_container.get_children(): + child.queue_free() + +func _on_option_pressed(action: String) -> void: + # Unterscheiden ob wir im Erkunden-Submenu sind + if action in ["track_follow", "track_leave"]: + InteractionManager.handle_explore(action) + else: + InteractionManager.handle_selection(action) + +func _input(event: InputEvent) -> void: + if not panel.visible: + return + if Input.is_action_just_pressed("cancel"): + InteractionManager.close() + # Im Text-Mode mit F/A weiterklicken + if mode == "text" and Input.is_action_just_pressed("interact"): + # Zurück zum Hauptmenü + InteractionManager.open_poi(InteractionManager.current_poi) diff --git a/interaction_ui.gd.uid b/interaction_ui.gd.uid new file mode 100755 index 0000000..abb3b56 --- /dev/null +++ b/interaction_ui.gd.uid @@ -0,0 +1 @@ +uid://dv2w4x8t53ym diff --git a/interaction_ui.tscn b/interaction_ui.tscn new file mode 100755 index 0000000..e5dc802 --- /dev/null +++ b/interaction_ui.tscn @@ -0,0 +1,57 @@ +[gd_scene format=3 uid="uid://cmg2008xfel2v"] + +[ext_resource type="Script" uid="uid://dv2w4x8t53ym" path="res://interaction_ui.gd" id="1_y37vg"] + +[node name="InteractionUI" type="CanvasLayer" unique_id=1122298615] +script = ExtResource("1_y37vg") + +[node name="Panel" type="Panel" parent="." unique_id=1371415037] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 0 +size_flags_vertical = 8 + +[node name="HintLabel" type="Label" parent="Panel" unique_id=2014325289] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -308.0 +offset_top = -43.0 +grow_horizontal = 0 +grow_vertical = 0 + +[node name="TitleLabel" type="Label" parent="Panel" unique_id=1341922505] +layout_mode = 1 +offset_left = 40.0 +offset_top = 31.0 +offset_right = 716.0 +offset_bottom = 54.0 +size_flags_vertical = 0 + +[node name="OptionContainer" type="VBoxContainer" parent="Panel" unique_id=58274880] +layout_mode = 0 +offset_left = 302.0 +offset_top = 204.0 +offset_right = 978.0 +offset_bottom = 204.0 +size_flags_vertical = 8 + +[node name="MessageLabel" type="Label" parent="Panel" unique_id=2104555059] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -38.0 +offset_top = -184.0 +offset_right = 299.0 +offset_bottom = -161.0 +grow_horizontal = 2 +grow_vertical = 2 diff --git a/main.tscn b/main.tscn new file mode 100755 index 0000000..2055292 --- /dev/null +++ b/main.tscn @@ -0,0 +1,323 @@ +[gd_scene format=3 uid="uid://bju1lndv8l1mo"] + +[ext_resource type="Script" uid="uid://ckrqvbqw08kin" path="res://player.gd" id="1_0xm2m"] +[ext_resource type="Texture2D" uid="uid://c3ajv7vb8c4fb" path="res://assets/debug/checkerboard.png" id="1_1bvp3"] +[ext_resource type="Texture2D" uid="uid://epcqli428yem" path="res://assets/sprites/player/debug_player.png" id="2_h2yge"] +[ext_resource type="Script" uid="uid://b0y06y7c0bihj" path="res://camera_rig.gd" id="3_h2yge"] +[ext_resource type="PackedScene" uid="uid://be6ufrc3dsjge" path="res://poi.tscn" id="5_lquwl"] +[ext_resource type="PackedScene" uid="uid://dmhs1oy1kh6hi" path="res://assets/models/mountain.glb" id="6_7mycd"] +[ext_resource type="PackedScene" uid="uid://gl4qpk4wto1e" path="res://assets/models/mountain2v5.glb" id="7_272bh"] +[ext_resource type="PackedScene" uid="uid://be2uq7ixlbv6b" path="res://assets/models/forest.glb" id="8_5vw27"] + +[sub_resource type="Environment" id="Environment_h2yge"] +ambient_light_color = Color(0, 0, 0.31764707, 1) +ambient_light_energy = 0.3 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lquwl"] +albedo_texture = ExtResource("1_1bvp3") + +[sub_resource type="CylinderMesh" id="CylinderMesh_lquwl"] +top_radius = 100.0 +bottom_radius = 100.0 +height = 0.2 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_h2yge"] +shading_mode = 0 +albedo_color = Color(0, 0.32156864, 0, 1) + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_lquwl"] +height = 0.2 +radius = 100.0 + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_7mycd"] +height = 0.5 +radius = 0.16 + +[sub_resource type="AtlasTexture" id="AtlasTexture_lquwl"] +atlas = ExtResource("2_h2yge") +region = Rect2(0, 0, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7mycd"] +atlas = ExtResource("2_h2yge") +region = Rect2(48, 0, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_272bh"] +atlas = ExtResource("2_h2yge") +region = Rect2(96, 0, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5vw27"] +atlas = ExtResource("2_h2yge") +region = Rect2(0, 0, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kek77"] +atlas = ExtResource("2_h2yge") +region = Rect2(48, 0, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4c57u"] +atlas = ExtResource("2_h2yge") +region = Rect2(96, 0, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_efxa6"] +atlas = ExtResource("2_h2yge") +region = Rect2(0, 60, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dg77c"] +atlas = ExtResource("2_h2yge") +region = Rect2(48, 60, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ycdy4"] +atlas = ExtResource("2_h2yge") +region = Rect2(96, 60, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_w48qg"] +atlas = ExtResource("2_h2yge") +region = Rect2(0, 120, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vivmo"] +atlas = ExtResource("2_h2yge") +region = Rect2(48, 120, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2cqfq"] +atlas = ExtResource("2_h2yge") +region = Rect2(96, 120, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yaehf"] +atlas = ExtResource("2_h2yge") +region = Rect2(0, 180, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_074og"] +atlas = ExtResource("2_h2yge") +region = Rect2(48, 180, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cegan"] +atlas = ExtResource("2_h2yge") +region = Rect2(96, 180, 48, 60) + +[sub_resource type="SpriteFrames" id="SpriteFrames_82xsv"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_lquwl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7mycd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_272bh") +}], +"loop": true, +"name": &"idle", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_5vw27") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kek77") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4c57u") +}], +"loop": true, +"name": &"move_down", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_efxa6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dg77c") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ycdy4") +}], +"loop": true, +"name": &"move_left", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_w48qg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vivmo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2cqfq") +}], +"loop": true, +"name": &"move_right", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_yaehf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_074og") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cegan") +}], +"loop": true, +"name": &"move_up", +"speed": 5.0 +}] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_7mycd"] +radius = 7.0 +height = 20.0 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_5vw27"] +radius = 8.5078125 +height = 17.015625 + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_5vw27"] +height = 2.2817383 +radius = 0.72021484 + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_kek77"] +height = 1.8276367 +radius = 0.5517578 + +[node name="Main" type="Node3D" unique_id=1313637872] + +[node name="Environment" type="WorldEnvironment" parent="." unique_id=753803863] +environment = SubResource("Environment_h2yge") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=630943989] + +[node name="Ground" type="StaticBody3D" parent="." unique_id=309197966] + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground" unique_id=479475733] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00084638596, -0.2, -0.001806736) +material_override = SubResource("StandardMaterial3D_lquwl") +mesh = SubResource("CylinderMesh_lquwl") +surface_material_override/0 = SubResource("StandardMaterial3D_h2yge") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground" unique_id=1301061872] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.2, 0) +shape = SubResource("CylinderShape3D_lquwl") + +[node name="Player" type="CharacterBody3D" parent="." unique_id=1504574304 groups=["player"]] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.25, 0) +script = ExtResource("1_0xm2m") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Player" unique_id=1483851051] +shape = SubResource("CylinderShape3D_7mycd") + +[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="Player" unique_id=155581900] +billboard = 2 +texture_filter = 0 +sprite_frames = SubResource("SpriteFrames_82xsv") +animation = &"idle" + +[node name="CameraRig" type="Node3D" parent="." unique_id=1094565525 groups=["camera_rig"]] +script = ExtResource("3_h2yge") +target = NodePath("../Player") + +[node name="CameraArm" type="Node3D" parent="CameraRig" unique_id=1827622739] +transform = Transform3D(1, 0, 0, 0, 0.81915206, 0.57357645, 0, -0.57357645, 0.81915206, 0, 0, 0) + +[node name="Camera3D" type="Camera3D" parent="CameraRig/CameraArm" unique_id=1414235198] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 12) +fov = 50.0 +near = 0.1 +far = 500.0 + +[node name="POI" parent="." unique_id=1770000468 instance=ExtResource("5_lquwl")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0.5, 2) + +[node name="Node3D" type="Node3D" parent="." unique_id=597556846] +transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 3.6214647, -0.23645921, 0.47627413) + +[node name="mountain" parent="Node3D" unique_id=2116024014 instance=ExtResource("6_7mycd")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -7.0459113) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D/mountain" unique_id=1378662574] +shape = SubResource("CapsuleShape3D_7mycd") + +[node name="mountain2" parent="Node3D" unique_id=1164111955 instance=ExtResource("6_7mycd")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.6505966, 0, -7.0459113) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D/mountain2" unique_id=1044531282] +shape = SubResource("CapsuleShape3D_7mycd") + +[node name="mountain3" parent="Node3D" unique_id=1031030133 instance=ExtResource("6_7mycd")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5228462, 0, -2.3011575) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D/mountain3" unique_id=1670981761] +shape = SubResource("CapsuleShape3D_7mycd") + +[node name="mountain4" parent="Node3D" unique_id=213527076 instance=ExtResource("6_7mycd")] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D/mountain4" unique_id=370339188] +shape = SubResource("CapsuleShape3D_7mycd") + +[node name="Node3D2" type="Node3D" parent="." unique_id=97687536] + +[node name="mountain2v5" parent="Node3D2" unique_id=1347056585 instance=ExtResource("7_272bh")] +transform = Transform3D(0.05, 0, 0, 0, 0.05, 0, 0, 0, 0.05, 5.449942, -0.15, 0.60275173) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D2/mountain2v5" unique_id=1250318876] +shape = SubResource("CapsuleShape3D_5vw27") + +[node name="mountain2v6" parent="Node3D2" unique_id=722974757 instance=ExtResource("7_272bh")] +transform = Transform3D(0.05, 0, 0, 0, 0.05, 0, 0, 0, 0.05, 5.309197, -0.15, 0.16273117) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D2/mountain2v6" unique_id=232796233] +shape = SubResource("CapsuleShape3D_5vw27") + +[node name="mountain2v7" parent="Node3D2" unique_id=279879297 instance=ExtResource("7_272bh")] +transform = Transform3D(0.05, 0, 0, 0, 0.05, 0, 0, 0, 0.05, 5.801124, -0.15, -0.25847834) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D2/mountain2v7" unique_id=271099516] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.04194641, 0.13291359, -0.03959179) +shape = SubResource("CapsuleShape3D_5vw27") + +[node name="mountain2v8" parent="Node3D2" unique_id=1413121196 instance=ExtResource("7_272bh")] +transform = Transform3D(0.05, 0, 0, 0, 0.05, 0, 0, 0, 0.05, 6.2565756, -0.15, 0.1419242) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D2/mountain2v8" unique_id=632282427] +shape = SubResource("CapsuleShape3D_5vw27") + +[node name="mountain2v9" parent="Node3D2" unique_id=888354952 instance=ExtResource("7_272bh")] +transform = Transform3D(0.05, 0, 0, 0, 0.05, 0, 0, 0, 0.05, 5.309197, -0.15, -0.051428914) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D2/mountain2v9" unique_id=1549534653] +shape = SubResource("CapsuleShape3D_5vw27") + +[node name="Node3D3" type="Node3D" parent="." unique_id=2010190045] +transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 6.5570726, 0.80977285, 4.959112) + +[node name="forest" parent="Node3D3" unique_id=1142695276 instance=ExtResource("8_5vw27")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.89663315, -3.8352594, -0.41697693) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D3/forest" unique_id=1992100035] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0569582, -0.37715888, -0.2822442) +shape = SubResource("CylinderShape3D_5vw27") + +[node name="CollisionShape3D2" type="CollisionShape3D" parent="Node3D3/forest" unique_id=2004443612] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.1139164, -0.75431776, 0.11189556) +shape = SubResource("CylinderShape3D_5vw27") + +[node name="CollisionShape3D3" type="CollisionShape3D" parent="Node3D3/forest" unique_id=1398520795] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4591012, -0.5861306, 0.51387644) +shape = SubResource("CylinderShape3D_5vw27") + +[node name="forest2" parent="Node3D3" unique_id=2120638756 instance=ExtResource("8_5vw27")] +transform = Transform3D(-0.87206924, 0, 0.4893825, 0, 1, 0, -0.4893825, 0, -0.87206924, 0, -3.83526, 0) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D3/forest2" unique_id=92773776] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.15763283, -0.2685547, -0.28089857) +shape = SubResource("CylinderShape3D_kek77") + +[node name="CollisionShape3D2" type="CollisionShape3D" parent="Node3D3/forest2" unique_id=291722829] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.021739006, -0.5371094, 0.2103684) +shape = SubResource("CylinderShape3D_kek77") + +[node name="CollisionShape3D3" type="CollisionShape3D" parent="Node3D3/forest2" unique_id=1876581014] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.084690094, -0.5371094, 0.40002155) +shape = SubResource("CylinderShape3D_kek77") diff --git a/modeltest.tscn b/modeltest.tscn new file mode 100644 index 0000000..4046fed --- /dev/null +++ b/modeltest.tscn @@ -0,0 +1,8 @@ +[gd_scene format=3 uid="uid://b645207svctxk"] + +[ext_resource type="PackedScene" uid="uid://dmhs1oy1kh6hi" path="res://assets/models/mountain.glb" id="1_lqtyj"] + +[node name="TestModelworld" type="Node3D" unique_id=2084483331] + +[node name="mountain" parent="." unique_id=2029213902 instance=ExtResource("1_lqtyj")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.034547806, 1.1920929e-07, -0.028554201) diff --git a/player.gd b/player.gd new file mode 100755 index 0000000..ce64b65 --- /dev/null +++ b/player.gd @@ -0,0 +1,62 @@ +extends CharacterBody3D + +@export var move_speed: float = 5.0 +@export var gravity: float = 9.8 + +var camera_rig: Node3D + +@onready var sprite: AnimatedSprite3D = $AnimatedSprite3D + +func _ready() -> void: + camera_rig = get_tree().get_first_node_in_group("camera_rig") + if camera_rig == null: + push_error("CameraRig nicht gefunden! Gruppe 'camera_rig' gesetzt?") + +func _physics_process(delta: float) -> void: + # Bewegung sperren während Interaction + if InteractionManager.active: + velocity = Vector3.ZERO + return + # Schwerkraft + if not is_on_floor(): + velocity.y -= gravity * delta + + # Eingabe + var input_dir = Vector2( + Input.get_axis("move_left", "move_right"), + Input.get_axis("move_forward", "move_backward") + ) + + if input_dir != Vector2.ZERO: + var cam_basis = camera_rig.global_transform.basis + var forward = -cam_basis.z + var right = cam_basis.x + forward.y = 0 + right.y = 0 + forward = forward.normalized() + right = right.normalized() + + var move_dir = (forward * -input_dir.y + right * input_dir.x).normalized() + velocity.x = move_dir.x * move_speed + velocity.z = move_dir.z * move_speed + + _update_animation(input_dir) + else: + velocity.x = move_toward(velocity.x, 0, move_speed) + velocity.z = move_toward(velocity.z, 0, move_speed) + sprite.play("idle") + + move_and_slide() + +func _update_animation(input_dir: Vector2) -> void: + + if input_dir.y > 0.1: + sprite.play("move_down") + elif input_dir.y < -0.1: + sprite.play("move_up") + elif input_dir.x > 0.1: + sprite.play("move_right") + elif input_dir.x < -0.1: + sprite.play("move_left") + else: + sprite.play("idle") diff --git a/player.gd.uid b/player.gd.uid new file mode 100755 index 0000000..cd9b419 --- /dev/null +++ b/player.gd.uid @@ -0,0 +1 @@ +uid://ckrqvbqw08kin diff --git a/player.tscn b/player.tscn new file mode 100644 index 0000000..dfeb729 --- /dev/null +++ b/player.tscn @@ -0,0 +1,153 @@ +[gd_scene format=3 uid="uid://dljjlqptwc2a2"] + +[ext_resource type="Script" uid="uid://ckrqvbqw08kin" path="res://player.gd" id="1_onrkg"] +[ext_resource type="Texture2D" uid="uid://epcqli428yem" path="res://assets/sprites/player/debug_player.png" id="2_i3pqv"] + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_7mycd"] +height = 0.5 +radius = 0.16 + +[sub_resource type="AtlasTexture" id="AtlasTexture_lquwl"] +atlas = ExtResource("2_i3pqv") +region = Rect2(0, 0, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7mycd"] +atlas = ExtResource("2_i3pqv") +region = Rect2(48, 0, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_272bh"] +atlas = ExtResource("2_i3pqv") +region = Rect2(96, 0, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5vw27"] +atlas = ExtResource("2_i3pqv") +region = Rect2(0, 0, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kek77"] +atlas = ExtResource("2_i3pqv") +region = Rect2(48, 0, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4c57u"] +atlas = ExtResource("2_i3pqv") +region = Rect2(96, 0, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_efxa6"] +atlas = ExtResource("2_i3pqv") +region = Rect2(0, 60, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dg77c"] +atlas = ExtResource("2_i3pqv") +region = Rect2(48, 60, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ycdy4"] +atlas = ExtResource("2_i3pqv") +region = Rect2(96, 60, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_w48qg"] +atlas = ExtResource("2_i3pqv") +region = Rect2(0, 120, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vivmo"] +atlas = ExtResource("2_i3pqv") +region = Rect2(48, 120, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2cqfq"] +atlas = ExtResource("2_i3pqv") +region = Rect2(96, 120, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yaehf"] +atlas = ExtResource("2_i3pqv") +region = Rect2(0, 180, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_074og"] +atlas = ExtResource("2_i3pqv") +region = Rect2(48, 180, 48, 60) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cegan"] +atlas = ExtResource("2_i3pqv") +region = Rect2(96, 180, 48, 60) + +[sub_resource type="SpriteFrames" id="SpriteFrames_82xsv"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_lquwl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7mycd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_272bh") +}], +"loop": true, +"name": &"idle", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_5vw27") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kek77") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4c57u") +}], +"loop": true, +"name": &"move_down", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_efxa6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dg77c") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ycdy4") +}], +"loop": true, +"name": &"move_left", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_w48qg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vivmo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2cqfq") +}], +"loop": true, +"name": &"move_right", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_yaehf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_074og") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cegan") +}], +"loop": true, +"name": &"move_up", +"speed": 5.0 +}] + +[node name="Player" type="CharacterBody3D" unique_id=1949521754 groups=["player"]] +script = ExtResource("1_onrkg") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=2092151561] +shape = SubResource("CylinderShape3D_7mycd") + +[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="." unique_id=1093854571] +billboard = 2 +texture_filter = 0 +sprite_frames = SubResource("SpriteFrames_82xsv") +animation = &"idle" diff --git a/poi.gd b/poi.gd new file mode 100755 index 0000000..33879ca --- /dev/null +++ b/poi.gd @@ -0,0 +1,48 @@ +extends Area3D + +@export var poi_name: String = "Ruinen" + +@onready var sprite: AnimatedSprite3D = $AnimatedSprite3D +@onready var name_label: Label3D = $Billboard/NameLabel +@onready var prompt: Label3D = $Billboard/InteractionPrompt + +var player_nearby: bool = false +var visited: bool = false + +func _ready() -> void: + prompt.visible = false + prompt.text = "[F] Interact" + _update_visuals() + body_entered.connect(_on_body_entered) + body_exited.connect(_on_body_exited) + +func _update_visuals() -> void: + if visited: + name_label.text = poi_name + # Normale Farbe + sprite.modulate = Color(1.0, 1.0, 1.0, 1.0) + name_label.modulate = Color(1.0, 1.0, 1.0, 1.0) + else: + name_label.text = "???" + # Ausgegraut + sprite.modulate = Color(0.4, 0.4, 0.4, 1.0) + name_label.modulate = Color(0.6, 0.6, 0.6, 1.0) + +func _on_body_entered(body: Node3D) -> void: + if body.is_in_group("player"): + player_nearby = true + prompt.text = "[F] Interact" + prompt.visible = true + +func _on_body_exited(body: Node3D) -> void: + if body.is_in_group("player"): + player_nearby = false + prompt.visible = false + +func _input(event: InputEvent) -> void: + if player_nearby and Input.is_action_just_pressed("interact"): + # Beim ersten Besuch entdecken + if not visited: + visited = true + _update_visuals() + InteractionManager.open_poi(self) diff --git a/poi.gd.uid b/poi.gd.uid new file mode 100755 index 0000000..cf3fbda --- /dev/null +++ b/poi.gd.uid @@ -0,0 +1 @@ +uid://c12tpdqhr2l5 diff --git a/poi.tscn b/poi.tscn new file mode 100755 index 0000000..c325cc7 --- /dev/null +++ b/poi.tscn @@ -0,0 +1,55 @@ +[gd_scene format=3 uid="uid://be6ufrc3dsjge"] + +[ext_resource type="Script" uid="uid://c12tpdqhr2l5" path="res://poi.gd" id="1_gwpk6"] +[ext_resource type="Texture2D" uid="uid://c0u8xjymrfw2x" path="res://assets/sprites/enviroment/Brown-gray_ruins2.png" id="2_yof6k"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_gwpk6"] +radius = 0.8699188 + +[sub_resource type="AtlasTexture" id="AtlasTexture_mekjb"] +atlas = ExtResource("2_yof6k") +region = Rect2(0, 0, 80, 80) + +[sub_resource type="SpriteFrames" id="SpriteFrames_0surh"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_mekjb") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="BoxShape3D" id="BoxShape3D_gwpk6"] +size = Vector3(0.8, 2.132, 2.333828) + +[node name="POI" type="Area3D" unique_id=1770000468] +script = ExtResource("1_gwpk6") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=2115487742] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.6096671) +shape = SubResource("SphereShape3D_gwpk6") + +[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="." unique_id=1205831120] +sprite_frames = SubResource("SpriteFrames_0surh") + +[node name="StaticBody3D" type="StaticBody3D" parent="." unique_id=1488376384] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" unique_id=461988177] +transform = Transform3D(0.6, 0, 0, 0, 0.6, 0, 0, 0, 0.6, 0, 0, -0.69380605) +shape = SubResource("BoxShape3D_gwpk6") + +[node name="Billboard" type="Node3D" parent="." unique_id=36237536] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) + +[node name="NameLabel" type="Label3D" parent="Billboard" unique_id=1419647885] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0) +billboard = 1 +text = "???" +font_size = 16 + +[node name="InteractionPrompt" type="Label3D" parent="Billboard" unique_id=2059219662] +visible = false +billboard = 1 +font_size = 12 diff --git a/preview_scene.tscn3183368435.tmp b/preview_scene.tscn3183368435.tmp new file mode 100755 index 0000000..3f88902 --- /dev/null +++ b/preview_scene.tscn3183368435.tmp @@ -0,0 +1,16 @@ +[gd_scene format=3 uid="uid://e8b1otd57xce"] + +[ext_resource type="Script" uid="uid://dehw4udbgwx4f" path="res://hightmap_gen.gd" id="1_regv8"] +[ext_resource type="Script" uid="uid://db1kymxglg8m1" path="res://preview_camera.gd" id="2_ji7iu"] + +[node name="PreviewScene" type="Node2D" unique_id=887284748] + +[node name="HightmapGen" type="Node" parent="." unique_id=1525090931] +script = ExtResource("1_regv8") + +[node name="preview_camera" type="Camera2D" parent="." unique_id=1468922324] +script = ExtResource("2_ji7iu") + +[node name="TextureRect" type="TextureRect" parent="." unique_id=1360046958] +offset_right = 40.0 +offset_bottom = 40.0 diff --git a/preview_scene.tscn3781868854.tmp b/preview_scene.tscn3781868854.tmp new file mode 100755 index 0000000..3f88902 --- /dev/null +++ b/preview_scene.tscn3781868854.tmp @@ -0,0 +1,16 @@ +[gd_scene format=3 uid="uid://e8b1otd57xce"] + +[ext_resource type="Script" uid="uid://dehw4udbgwx4f" path="res://hightmap_gen.gd" id="1_regv8"] +[ext_resource type="Script" uid="uid://db1kymxglg8m1" path="res://preview_camera.gd" id="2_ji7iu"] + +[node name="PreviewScene" type="Node2D" unique_id=887284748] + +[node name="HightmapGen" type="Node" parent="." unique_id=1525090931] +script = ExtResource("1_regv8") + +[node name="preview_camera" type="Camera2D" parent="." unique_id=1468922324] +script = ExtResource("2_ji7iu") + +[node name="TextureRect" type="TextureRect" parent="." unique_id=1360046958] +offset_right = 40.0 +offset_bottom = 40.0 diff --git a/project.godot b/project.godot new file mode 100755 index 0000000..364ac0c --- /dev/null +++ b/project.godot @@ -0,0 +1,128 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="WayfarersWanderer" +run/main_scene="uid://bju1lndv8l1mo" +config/features=PackedStringArray("4.6", "GL Compatibility") + +[autoload] + +InteractionManager="*uid://cbg1abspfwgxo" +InteractionUI="*uid://cmg2008xfel2v" + +[display] + +window/size/viewport_width=1280 +window/size/viewport_height=720 + +[editor_plugins] + +enabled=PackedStringArray("res://addons/zylann.hterrain/plugin.cfg") + +[input] + +move_forward={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null) +] +} +move_backward={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null) +] +} +move_left={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null) +] +} +move_right={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null) +] +} +cam_rotate_left={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":81,"key_label":0,"unicode":113,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":9,"pressure":0.0,"pressed":false,"script":null) +] +} +cam_rotate_right={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":10,"pressure":0.0,"pressed":false,"script":null) +] +} +zoom_in={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194437,"key_label":0,"unicode":43,"location":0,"echo":false,"script":null) +, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":4,"axis_value":1.0,"script":null) +] +} +zoom_out={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194435,"key_label":0,"unicode":45,"location":0,"echo":false,"script":null) +, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":5,"axis_value":1.0,"script":null) +] +} +interact={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":false,"script":null) +] +} +cancel={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":false,"script":null) +] +} +ui_select_up={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":11,"pressure":0.0,"pressed":false,"script":null) +] +} +ui_select_down={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":12,"pressure":0.0,"pressed":false,"script":null) +] +} +ui_select_left={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":13,"pressure":0.0,"pressed":false,"script":null) +] +} +ui_select_right={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":14,"pressure":0.0,"pressed":false,"script":null) +] +} + +[physics] + +3d/physics_engine="Jolt Physics" + +[rendering] + +rendering_device/driver.windows="d3d12" +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility"