Files
storyteller-godot/scripts/main.gd
Aodhan Collins b42521a008 Initial MVP
2026-01-26 02:57:40 +00:00

86 lines
3.2 KiB
GDScript

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)