65 lines
1.8 KiB
GDScript
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
|