Player (player/player.gd, shared by both island.tscn's real Player and the player/player.tscn debug prototype via the same script): - Health (max_health/health, take_damage, heal_full, death via change_scene_to_file to a new Game Over screen). - Left-click move-to-point layered onto existing WASD (WASD cancels an active click-target and takes priority; click-move re-derives the existing screen-relative animation logic from the world-space direction instead of duplicating it). New "attack" input action (Space) does a simple range check against everything in the "enemies" group. Runs via _unhandled_input so an open interaction menu naturally takes priority (button consumes the event first). New systems: - world/enemy/enemy.gd + .tscn: direct-chase CharacterBody3D (no pathfinding), contact damage with its own cooldown, reports death to ArenaManager rather than freeing itself (which owns the live count). - world/arena/tiles/: 6 placeholder tile scenes (4 plain floor colors, 2 with a simple obstacle pillar) — pure static geometry, same unshaded-flat-color convention as terrain.gd. - autoload/arena_manager.gd (new singleton): assembles a 3x3 grid of random tiles (center forced to plain floor) under a persistent ArenaRoot positioned far below the island (0,-300,0, group "arena_root"), rebuilding it fresh on every trigger since only one arena is ever active. Adds 4 axis-aligned invisible walls (same idea as terrain.gd's _build_edge_barrier, no rotation needed for a square). Spawns 3 enemies, teleports the player in. On the last enemy's death: calls the POI's mark_visited(), reuses InteractionManager.open_message() (existing, previously-unused code) for a "Sieg!" message, then teleports the player back after a timer. - world/poi/poi_arena.gd + .tscn: same Area3D/sprite shell as poi.gd, but interacting starts an arena directly instead of opening the generic menu (same divergence pattern poi_gate.gd already established). Exposes the same duck-typed `visited` field, so poi_gate.gd's region-gate group check needed zero changes. - boot/game_over_screen.gd + .tscn: same Control/Panel/Button structure as main_menu.tscn, one button back to the main menu. - world/ui/player_hud.gd + .tscn: minimal CanvasLayer HP label. Content pass: poi.gd gained `event_text` (falls back to the old flat placeholder if unset); interaction_manager.gd's "explore" case uses it and "rest" now actually calls player.heal_full(). Applied to region 1: Ort1/Ort4/Ort6 became arena POIs, Ort2/Ort3/Ort5 got distinct event text — first concrete proof of the "mix of events and arenas" pattern, replicating to regions 2-6 is a fast follow-up. Verified headless via direct method calls (confirmed limitation: synthetic clicks/keypresses don't reliably drive _unhandled_input in this harness): start_arena produces 9 tiles + a wall body + 3 enemies and teleports the player near y=-300; killing all 3 enemies flips the POI's visited flag and opens the win message; completing the win flow returns the player next to the original POI; marking the other 5 region-1 POIs visited then correctly unlocks GateR1toR2 (proving the arena-POI/gate integration without touching poi_gate.gd); player take_damage(max_health) triggers is_dead and a scene change to game_over_screen.tscn (confirmed after allowing deferred frames to process). Also verified an enemy actually closes distance on the player and lands contact damage over a live physics simulation, and that the player's attack respects both damage and cooldown. Not verifiable headlessly, needs in-editor testing: real click-to-move and Space-bar attack end-to-end, combat feel/balance, arena tile visuals.
137 lines
9.0 KiB
Plaintext
Executable File
137 lines
9.0 KiB
Plaintext
Executable File
; 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="res://boot/opening_screen.tscn"
|
|
config/features=PackedStringArray("4.6", "GL Compatibility")
|
|
|
|
[autoload]
|
|
|
|
InteractionManager="*uid://cbg1abspfwgxo"
|
|
InteractionUI="*uid://cmg2008xfel2v"
|
|
SaveManager="*res://autoload/save_manager.gd"
|
|
ArenaManager="*res://autoload/arena_manager.gd"
|
|
|
|
[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)
|
|
]
|
|
}
|
|
attack={
|
|
"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":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
|
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":2,"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"
|