class_name GameUI extends Control @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 var picked_up_level_items:Array[NodePath] = [] var _game_scene:Game var _player:Player var _all_recipes:Array[Recipe] = [] func _ready(): for file in DirAccess.get_files_at("res://data/recipes"): var resource_file = "res://data/recipes/" + file var recipe:Recipe = load(resource_file) as Recipe _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: picked_up_level_items = [] 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(): _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 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) #_player.selected_tool_slot_index(tool_slot_index) func _on_build_items_container_item_selected(item_slot:ItemSlot) -> void: if _game_scene: _game_scene.build_system.build_item = item_slot.get_item() build_dialog.hide()