Files
ai-game-2/ActionState.gd
2026-04-05 23:11:56 -07:00

65 lines
1.8 KiB
GDScript

extends Node
enum Action { WALK = 0, LOOK = 1, TOUCH = 2, TALK = 3 }
var current_action: int = Action.WALK:
set(value):
current_action = value
action_changed.emit(value)
signal action_changed(new_action: int)
# Centralized SetPiece hover tracking
var current_scene: Node = null
var hovered_setpieces: Array[SetPiece] = []
var top_hovered_setpiece: SetPiece = null
signal hover_changed(piece: SetPiece)
func get_action_name() -> String:
match current_action:
Action.WALK: return "walk"
Action.LOOK: return "look"
Action.TOUCH: return "touch"
Action.TALK: return "talk"
return "walk"
func get_action_enum() -> int:
return current_action
func set_current_scene(scene: Node) -> void:
current_scene = scene
hovered_setpieces.clear()
top_hovered_setpiece = null
func get_top_hovered_setpiece() -> SetPiece:
return top_hovered_setpiece
func _process(_delta: float) -> void:
if not current_scene:
return
var global_mouse_pos = get_viewport().get_mouse_position()
var camera = get_viewport().get_camera_2d()
if camera:
global_mouse_pos = camera.get_global_mouse_position()
# Find all SetPieces in current scene
var new_hovered: Array[SetPiece] = []
for piece in current_scene.find_children("*", "SetPiece", true, false):
if piece is SetPiece:
var local_pos = piece.to_local(global_mouse_pos)
if piece.polygon.size() > 0 and Geometry2D.is_point_in_polygon(local_pos, piece.polygon):
new_hovered.append(piece)
# Sort by priority (highest first)
new_hovered.sort_custom(func(a, b): return b.priority > a.priority)
# Check if top piece changed
var new_top = new_hovered[0] if new_hovered.size() > 0 else null
if new_top != top_hovered_setpiece:
top_hovered_setpiece = new_top
hover_changed.emit(top_hovered_setpiece)
hovered_setpieces = new_hovered