340 lines
8.1 KiB
GDScript
340 lines
8.1 KiB
GDScript
# Escoria inputs manager
|
|
# Catches, handles and distributes input events for the game
|
|
extends Node
|
|
class_name ESCInputsManager
|
|
|
|
|
|
# Valid input flags
|
|
# * INPUT_ALL: All input is allowed
|
|
# * INPUT_NONE: No input is allowed at all
|
|
# * INPUT_SKIP: Only skipping dialogs is allowed
|
|
enum {
|
|
INPUT_ALL,
|
|
INPUT_NONE,
|
|
INPUT_SKIP,
|
|
}
|
|
|
|
|
|
# Input action for use by InputMap
|
|
const SWITCH_ACTION_VERB = "switch_action_verb"
|
|
|
|
# Input action for use by InputMap
|
|
const ESC_SHOW_DEBUG_PROMPT = "esc_show_debug_prompt"
|
|
|
|
|
|
# The current input mode
|
|
var input_mode = INPUT_ALL
|
|
|
|
# A LIFO stack of hovered items
|
|
var hover_stack: Array = []
|
|
|
|
# The global id of the topmost item from the hover_stack
|
|
var hotspot_focused: String = ""
|
|
|
|
|
|
# Register core signals (from escoria.gd)
|
|
func register_core():
|
|
escoria.connect(
|
|
"request_pause_menu",
|
|
self,
|
|
"_on_pause_menu_requested"
|
|
)
|
|
|
|
|
|
# Connect the item signals to the local methods
|
|
func register_inventory_item(item: Node):
|
|
item.connect(
|
|
"mouse_left_inventory_item",
|
|
self,
|
|
"_on_mouse_left_click_inventory_item"
|
|
)
|
|
item.connect(
|
|
"mouse_double_left_inventory_item",
|
|
self,
|
|
"_on_mouse_double_left_click_inventory_item"
|
|
)
|
|
item.connect(
|
|
"mouse_right_inventory_item",
|
|
self,
|
|
"_on_mouse_right_click_inventory_item"
|
|
)
|
|
|
|
item.connect(
|
|
"inventory_item_focused",
|
|
self,
|
|
"_on_mouse_entered_inventory_item"
|
|
)
|
|
item.connect(
|
|
"inventory_item_unfocused",
|
|
self,
|
|
"_on_mouse_exited_inventory_item"
|
|
)
|
|
|
|
|
|
func register_background(background: ESCBackground):
|
|
background.connect(
|
|
"left_click_on_bg",
|
|
self,
|
|
"_on_left_click_on_bg"
|
|
)
|
|
background.connect(
|
|
"right_click_on_bg",
|
|
escoria.inputs_manager,
|
|
"_on_right_click_on_bg"
|
|
)
|
|
background.connect(
|
|
"double_left_click_on_bg",
|
|
escoria.inputs_manager,
|
|
"_on_double_left_click_on_bg"
|
|
)
|
|
background.connect(
|
|
"mouse_wheel_up",
|
|
self,
|
|
"_on_mousewheel_action",
|
|
[1]
|
|
)
|
|
background.connect(
|
|
"mouse_wheel_down",
|
|
self,
|
|
"_on_mousewheel_action",
|
|
[-1]
|
|
)
|
|
|
|
|
|
# Clear the stack of hovered items
|
|
func clear_stack():
|
|
hover_stack = []
|
|
|
|
|
|
# The background was clicked with the LMB
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - position: Position of the click
|
|
func _on_left_click_on_bg(position: Vector2) -> void:
|
|
if input_mode == INPUT_ALL and hotspot_focused.empty():
|
|
escoria.logger.info("Left click on background at ", [str(position)])
|
|
escoria.main.current_scene.game.left_click_on_bg(position)
|
|
|
|
|
|
# The background was double-clicked with the LMB
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - position: Position of the click
|
|
func _on_double_left_click_on_bg(position: Vector2) -> void:
|
|
if input_mode == INPUT_ALL and hotspot_focused.empty():
|
|
escoria.logger.info(
|
|
"Double left click on background at %s" % str(position)
|
|
)
|
|
escoria.main.current_scene.game.left_double_click_on_bg(position)
|
|
|
|
|
|
# The background was clicked with the RMB
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - position: Position of the click
|
|
func _on_right_click_on_bg(position: Vector2) -> void:
|
|
if input_mode == INPUT_ALL and hotspot_focused.empty():
|
|
escoria.logger.info("Right click on background at ", [str(position)])
|
|
escoria.main.current_scene.game.right_click_on_bg(position)
|
|
|
|
|
|
# An inventory item was clicked with the LMB
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - inventory_item_global_id: The global id of the clicked inventory item
|
|
# - event: The input event received
|
|
func _on_mouse_left_click_inventory_item(
|
|
inventory_item_global_id: String,
|
|
event: InputEvent
|
|
) -> void:
|
|
escoria.logger.info(
|
|
"Inventory item left clicked %s " % inventory_item_global_id
|
|
)
|
|
escoria.main.current_scene.game.left_click_on_inventory_item(
|
|
inventory_item_global_id,
|
|
event
|
|
)
|
|
|
|
|
|
# An inventory item was clicked with the RMB
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - inventory_item_global_id: The global id of the clicked inventory item
|
|
# - event: The input event received
|
|
func _on_mouse_right_click_inventory_item(
|
|
inventory_item_global_id: String,
|
|
event: InputEvent
|
|
) -> void:
|
|
if input_mode == INPUT_ALL:
|
|
escoria.logger.info(
|
|
"Inventory item right clicked %s" % inventory_item_global_id
|
|
)
|
|
escoria.main.current_scene.game.right_click_on_inventory_item(
|
|
inventory_item_global_id,
|
|
event
|
|
)
|
|
|
|
|
|
# An inventory item was doublce-clicked with the LMB
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - inventory_item_global_id: The global id of the clicked inventory item
|
|
# - event: The input event received
|
|
func _on_mouse_double_left_click_inventory_item(
|
|
inventory_item_global_id: String,
|
|
event: InputEvent
|
|
) -> void:
|
|
if input_mode == INPUT_ALL:
|
|
escoria.logger.info(
|
|
"Inventory item double left clicked %s" % inventory_item_global_id
|
|
)
|
|
escoria.main.current_scene.game.left_double_click_on_inventory_item(
|
|
inventory_item_global_id,
|
|
event
|
|
)
|
|
|
|
|
|
# The mouse entered an inventory item
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - inventory_item_global_id: The global id of the inventory item
|
|
# that is hovered
|
|
func _on_mouse_entered_inventory_item(inventory_item_global_id: String) -> void:
|
|
escoria.logger.info(
|
|
"Inventory item focused %s" % inventory_item_global_id
|
|
)
|
|
escoria.main.current_scene.game.inventory_item_focused(
|
|
inventory_item_global_id
|
|
)
|
|
|
|
|
|
# The mouse exited an inventory item
|
|
func _on_mouse_exited_inventory_item() -> void:
|
|
escoria.logger.info("Inventory item unfocused")
|
|
escoria.main.current_scene.game.inventory_item_unfocused()
|
|
|
|
|
|
# The mouse entered an Escoria item
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - item: The Escoria item hovered
|
|
func _on_mouse_entered_item(item: ESCItem) -> void:
|
|
escoria.logger.info("Item focused: ", [item.global_id])
|
|
_clean_hover_stack()
|
|
|
|
if not hover_stack.empty():
|
|
if item.z_index < hover_stack.back().z_index:
|
|
hover_stack.insert(hover_stack.size() - 1, item)
|
|
else:
|
|
hover_stack.push_back(item)
|
|
else:
|
|
hover_stack.push_back(item)
|
|
|
|
hotspot_focused = hover_stack.back().global_id
|
|
escoria.main.current_scene.game.element_focused(item.global_id)
|
|
|
|
|
|
# The mouse exited an Escoria item
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - item: The Escoria item hovered
|
|
func _on_mouse_exited_item(item: ESCItem) -> void:
|
|
escoria.logger.info("Item unfocused: ", [item.global_id])
|
|
_hover_stack_erase_item(item)
|
|
if hover_stack.empty():
|
|
hotspot_focused = ""
|
|
escoria.main.current_scene.game.element_unfocused()
|
|
else:
|
|
hotspot_focused = hover_stack.back().global_id
|
|
escoria.main.current_scene.game.element_focused(hotspot_focused)
|
|
|
|
|
|
# An Escoria item was clicked with the LMB
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - item: The Escoria item clicked
|
|
# - event: The input event from the click
|
|
func _on_mouse_left_clicked_item(item: ESCItem, event: InputEvent) -> void:
|
|
if input_mode == INPUT_ALL:
|
|
if hover_stack.empty() or hover_stack.back() == item:
|
|
escoria.logger.info("Item left clicked", [item.global_id, event])
|
|
hotspot_focused = item.global_id
|
|
escoria.main.current_scene.game.left_click_on_item(
|
|
item.global_id,
|
|
event
|
|
)
|
|
|
|
|
|
# An Escoria item was double-clicked with the LMB
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - item: The Escoria item clicked
|
|
# - event: The input event from the click
|
|
func _on_mouse_left_double_clicked_item(
|
|
item: ESCItem,
|
|
event: InputEvent
|
|
) -> void:
|
|
if input_mode == INPUT_ALL:
|
|
escoria.logger.info("Item left double clicked", [item.global_id, event])
|
|
hotspot_focused = item.global_id
|
|
escoria.main.current_scene.game.left_double_click_on_item(
|
|
item.global_id,
|
|
event
|
|
)
|
|
|
|
|
|
# An Escoria item was clicked with the RMB
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - item: The Escoria item clicked
|
|
# - event: The input event from the click
|
|
func _on_mouse_right_clicked_item(item: ESCItem, event: InputEvent) -> void:
|
|
if input_mode == INPUT_ALL:
|
|
escoria.logger.info("Item right clicked", [item.global_id, event])
|
|
hotspot_focused = item.global_id
|
|
escoria.main.current_scene.game.right_click_on_item(
|
|
item.global_id,
|
|
event
|
|
)
|
|
|
|
|
|
# The mousewheel was turned
|
|
#
|
|
# #### Parameters
|
|
#
|
|
# - direction: The direction the wheel was turned. 1 = up, -1 = down
|
|
func _on_mousewheel_action(direction: int):
|
|
escoria.main.current_scene.game.mousewheel_action(direction)
|
|
|
|
|
|
# Event when the pause menu was requested
|
|
func _on_pause_menu_requested():
|
|
escoria.main.current_scene.game.pause_game()
|
|
|
|
|
|
# Clean the hover stack
|
|
func _clean_hover_stack():
|
|
for e in hover_stack:
|
|
if e == null or !is_instance_valid(e):
|
|
hover_stack.erase(e)
|
|
|
|
|
|
# Remove the given item from the stack
|
|
#
|
|
# #### Parameters
|
|
# - item: the item to remove from the hover stack
|
|
func _hover_stack_erase_item(item):
|
|
hover_stack.erase(item)
|