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 var picked_up_level_items:Array[NodePath] = [] var _game_scene:Node3D 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) func activate_game_scene(game_scene:Node3D) -> void: _game_scene = game_scene 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.highlighted = true else: item_slot.highlighted = 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"): print ("Showing inventory of player " + str(_player)) inventory_dialog.open(_all_recipes, _player.inventory)