extends Node2D @onready var game_manager = $GameManager @onready var room_label = $UI/MainLayout/Sidebar/RoomLabel @onready var log_label = $UI/MainLayout/GameView/Log @onready var input_field = $UI/MainLayout/GameView/Input @onready var minimap = $UI/MainLayout/Sidebar/Minimap @onready var stats_label = $UI/MainLayout/Sidebar/StatsLabel @onready var btn_north = $UI/MainLayout/Sidebar/Controls/BtnNorth @onready var btn_south = $UI/MainLayout/Sidebar/Controls/BtnSouth @onready var btn_east = $UI/MainLayout/Sidebar/Controls/HBox/BtnEast @onready var btn_west = $UI/MainLayout/Sidebar/Controls/HBox/BtnWest @onready var btn_save = $UI/MainLayout/Sidebar/Controls/BtnSave @onready var btn_load = $UI/MainLayout/Sidebar/Controls/BtnLoad @onready var combat_ui = $UI/CombatUI @onready var main_layout = $UI/MainLayout @onready var combat_enemy_label = $UI/CombatUI/Panel/VBox/EnemyLabel @onready var btn_attack = $UI/CombatUI/Panel/VBox/Actions/BtnAttack @onready var btn_flee = $UI/CombatUI/Panel/VBox/Actions/BtnFlee func _ready(): # Connect signals game_manager.room_changed.connect(_on_room_changed) game_manager.log_message.connect(_on_log_message) game_manager.stats_changed.connect(_on_stats_changed) game_manager.combat_started.connect(_on_combat_started) game_manager.combat_ended.connect(_on_combat_ended) game_manager.combat_log.connect(_on_combat_log) game_manager.damage_taken.connect(func(amount): shake_screen()) btn_north.pressed.connect(func(): game_manager.move("north")) btn_south.pressed.connect(func(): game_manager.move("south")) btn_east.pressed.connect(func(): game_manager.move("east")) btn_west.pressed.connect(func(): game_manager.move("west")) btn_save.pressed.connect(game_manager.save_game) btn_load.pressed.connect(game_manager.load_game) btn_attack.pressed.connect(game_manager.player_attack) btn_flee.pressed.connect(game_manager.flee) input_field.text_submitted.connect(_on_input_submitted) # Clear log log_label.text = "" func _on_input_submitted(text: String): if text.strip_edges() == "": return game_manager.process_user_input(text) input_field.text = "" func _on_room_changed(room_data: RoomData): room_label.text = room_data.room_name minimap.update_map(room_data.id, game_manager.game_state.explored_rooms) func _on_log_message(message: String): log_label.text += message + "\n" func _on_stats_changed(hp, max_hp, inventory): stats_label.text = "HP: %d/%d\nItems: %d" % [hp, max_hp, inventory.size()] func _on_combat_started(enemy): main_layout.visible = false combat_ui.visible = true combat_enemy_label.text = "%s (HP: %d/%d)" % [enemy.name, enemy.hp, enemy.max_hp] func _on_combat_ended(won): combat_ui.visible = false main_layout.visible = true func _on_combat_log(message): if game_manager.current_enemy: var enemy = game_manager.current_enemy combat_enemy_label.text = "%s (HP: %d/%d)\n%s" % [enemy.name, enemy.hp, enemy.max_hp, message] func shake_screen(intensity: float = 10.0, duration: float = 0.5): var tween = create_tween() var ui_node = $UI for i in range(10): var offset = Vector2(randf_range(-intensity, intensity), randf_range(-intensity, intensity)) tween.tween_property(ui_node, "offset", offset, duration / 10) tween.tween_property(ui_node, "offset", Vector2.ZERO, duration / 10)