feat: Add player action and input managers to handle player actions, movement, targeting, and visual feedback.

This commit is contained in:
Yogi Wiguna
2026-02-04 14:25:21 +08:00
parent 757051aca8
commit 77b8542896
5 changed files with 182 additions and 59 deletions
+38
View File
@@ -55,6 +55,31 @@ func _process(delta):
player.attempt_target_action(2)
elif Input.is_key_pressed(KEY_4):
player.attempt_target_action(3)
# Targeting Mode Preview
var main = player.get_node_or_null("/root/Main")
if main and main.ui_manager and main.ui_manager.current_action_state == main.ui_manager.ActionState.TARGETING:
# Use mouse position raycast to determine hover
var viewport = player.get_viewport()
var mouse_pos = viewport.get_mouse_position()
var camera = viewport.get_camera_3d()
var from = camera.project_ray_origin(mouse_pos)
var to = from + camera.project_ray_normal(mouse_pos) * 1000
var hover_grid = player.raycast_to_grid(from, to)
# print("Targeting Hover: %s, Skill: %d" % [hover_grid, main.ui_manager.pending_skill_id]) # Debug
# Only update if valid position
if hover_grid != Vector2i(-1, -1):
var st_manager = player.get_node_or_null("SpecialTilesManager")
if st_manager:
var area = st_manager.get_skill_affected_area(main.ui_manager.pending_skill_id, hover_grid)
# Choose highlight color/mesh based on skill
# User Request: Use default hover item (1)
var highlight_id = 1
player.highlight_cells_if_authorized(area, highlight_id)
func handle_unhandled_input(event):
# Early return if not authorized human player
@@ -120,6 +145,19 @@ func handle_grid_click(grid_position: Vector2i):
main.ui_manager.ActionState.RANDOMIZING:
if grid_position in player.highlighted_cells:
main.randomize_item_at_position(grid_position)
# Add TARGETING State
main.ui_manager.ActionState.TARGETING:
var skill_id = main.ui_manager.pending_skill_id
if skill_id != -1:
var st_manager = player.get_node_or_null("SpecialTilesManager")
if st_manager:
# Clear Highlights FIRST to avoid overwriting the newly placed tiles
player.clear_highlights()
st_manager.execute_targeted_effect(skill_id, grid_position)
# Reset state
main.ui_manager.pending_skill_id = -1
main.ui_manager.current_action_state = main.ui_manager.ActionState.NONE
func handle_slot_gui_input(event, slot_index, slot_ui) -> int: