166 lines
4.4 KiB
GDScript
166 lines
4.4 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[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:
|
|
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():
|
|
_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:
|
|
_game_scene.build_system.build_item = item_slot.get_item()
|
|
build_dialog.hide()
|
|
|
|
|
|
func _on_quit_to_main_menu_button_pressed() -> void:
|
|
quit_game_scene.emit()
|