TinyAdventure/game_ui.gd

170 lines
4.5 KiB
GDScript

class_name GameUI
extends Control
signal quit_game_scene
@onready var tool_slots = %ToolSlots
@onready var tool_container:ItemGrid = %ToolContainer
@onready var game_menu_ui = %GameMenuUI
@onready var inventory_dialog = %InventoryDialog
@onready var build_dialog = %BuildDialog
@onready var debug_panel: Panel = %DebugPanel
var picked_up_level_items:Array[NodePath] = []
var _game_scene:Game
var _player:Player
var _all_recipes:Array[RecipeResource] = []
func _ready():
for file in DirAccess.get_files_at("res://data/recipes"):
var resource_file = "res://data/recipes/" + file
var recipe:RecipeResource = load(resource_file) as RecipeResource
_all_recipes.append(recipe)
tool_container.connect("item_selected", _on_tool_select)
func activate_game_scene(game_scene:Node3D) -> void:
_game_scene = game_scene as Game
if _game_scene != null:
debug_panel.build_system = game_scene.build_system
if _player != null:
disconnect_player_signals()
_player = game_scene.find_child("Player", true, false)
assert(_player != null)
update_player_signals()
tool_slots.show()
tool_container.displayStacks(_player.inventory.get_tool_item_stacks())
# When saving a game we need to know which items were picked up.
for pickup_item in get_tree().get_nodes_in_group("pickup_item"):
pickup_item.connect("item_picked_up", on_item_pickup)
game_menu_ui.hide()
func _process(_delta):
if _player == null:
# TODO: make sure game ui is deactivated when no game running
return
assert(_player != null and tool_container.get_child_count() >= _player.selected_tool_slot_index)
for i in range(tool_container.get_child_count()):
var item_slot:ItemSlot = tool_container.get_child(i) as ItemSlot
assert(item_slot != null)
if i == _player.selected_tool_slot_index:
item_slot.selected = true
else:
item_slot.selected = false
if not _player.has_build_tool_active() and build_dialog.visible:
build_dialog.hide()
if _game_scene != null:
if _player.has_build_tool_active() and _game_scene.build_system.build_item != null:
_game_scene.build_system.is_active = true
else:
_game_scene.build_system.is_active = false
func _on_message_timer_timeout():
%MessagesContainer.visible = false
func _on_player_trigger_message(message):
%MessagesContainer/MessageTextEdit.text = message
%MessagesContainer/MessageTimer.start(1)
%MessagesContainer.visible = true
print(message)
func on_item_pickup(node_path:NodePath):
picked_up_level_items.append(node_path)
func disconnect_player_signals():
_player.disconnect("trigger_message", _on_player_trigger_message)
func update_player_signals():
_player.connect("trigger_message", _on_player_trigger_message)
func _unhandled_key_input(event:InputEvent):
var key_event:InputEventKey = event as InputEventKey
if key_event and key_event.pressed and key_event.get_keycode_with_modifiers() == KEY_ESCAPE:
if %GameMenuUI.visible:
%GameMenuUI.hide()
else:
%GameMenuUI.show()
func _on_game_menu_ui_visibility_changed():
# Function gets triggered when scene is still in construction. In that
# case just return.
if tool_slots == null or _game_scene == null:
return
if %GameMenuUI.visible:
tool_slots.hide()
_game_scene.process_mode = Node.PROCESS_MODE_DISABLED
else:
tool_slots.show()
_game_scene.process_mode = Node.PROCESS_MODE_INHERIT
func _on_back_to_game_button_pressed():
%GameMenuUI.hide()
func _unhandled_input(event):
if not visible:
return
if event.is_action_released("toggle_inventory"):
if inventory_dialog.visible:
inventory_dialog.hide()
else:
inventory_dialog.open(_all_recipes, _player.inventory)
if _player == null or _player.is_queued_for_deletion():
return
if _player.has_build_tool_active() and event.is_action_released("toggle_build_menu"):
if build_dialog.visible:
build_dialog.hide()
else:
build_dialog.open(_all_recipes, _player.inventory)
if _game_scene.build_system.is_active and _game_scene.build_system.build_item != null:
return
elif _player.handle_tool_slot_input_events(event):
get_viewport().set_input_as_handled()
return
func _on_tool_select(item_slot:ItemSlot) -> void:
var tool_slot_index = tool_container.get_slot_index(item_slot)
_player.set_tool_slot_index(tool_slot_index)
func _on_build_items_container_item_selected(item_slot:ItemSlot) -> void:
if _game_scene:
if item_slot != null:
_game_scene.build_system.build_item = item_slot.get_item()
else:
_game_scene.build_system.build_item = null
build_dialog.hide()
func _on_quit_to_main_menu_button_pressed() -> void:
quit_game_scene.emit()