fix: wire movement controller before state machine; harden machine lookup

This commit is contained in:
2026-06-03 15:14:10 -04:00
parent 24a8651a6d
commit c0a90df690
2 changed files with 43 additions and 24 deletions
+38 -16
View File
@@ -12,6 +12,21 @@ signal chain_updated(count: int, bonus: float)
var machine: MovementStateMachine
var jump_buffered: bool = false
var _ready_ran: bool = false
# ── Helpers ───────────────────────────────────────────────────────────────────
func _ensure_machine() -> MovementStateMachine:
if typeof(_machine) != TYPE_NIL and is_instance_valid(_machine):
return _machine as MovementStateMachine
var candidates := [
get_node("MovementStateMachine") if has_node("MovementStateMachine") else null,
_machine if is_instance_valid(_machine) and _machine.has_method("register_chain_mechanic") else null,
]
for c in candidates:
if c and (c is MovementStateMachine or (c.has_method("switch_to") and c.has_method("register_chain_mechanic"))):
_machine = c
return _machine
return null
# ── Input references ─────────────────────────────────────────────────────────
func _unhandled_input(event: InputEvent) -> void:
@@ -31,22 +46,29 @@ func _unhandled_input(event: InputEvent) -> void:
func _ready() -> void:
_machine.player = self
_machine.params = params
# Mirror signal up
_machine.movement_event.connect(func(ev, data):
if ev == "chain_updated":
chain_updated.emit(data.count, data.bonus)
)
if _ready_ran:
return
_ready_ran = true
var node := _ensure_machine()
if node:
var sm := node
sm.player = self
sm.params = params
# Mirror signal up
sm.movement_event.connect(func(ev, data):
if ev == "chain_updated":
chain_updated.emit(data.count, data.bonus)
)
func _process(_delta: float) -> void:
var fsm_node = _machine.get_node("MovementStateMachine")
if fsm_node and fsm_node.has_method("switch_to"):
_machine.input_jump_just_pressed = Input.is_action_just_pressed("jump") and not _machine.input_jump_pressed
_machine.input_jump_pressed = Input.is_action_pressed("jump")
_machine.input_sprint = Input.is_action_pressed("sprint")
_machine.input_crouch = Input.is_action_pressed("crouch")
_machine.input_dash = Input.is_action_just_pressed("dash") and not _machine.input_dash
var input_v := Input.get_vector("move_left", "move_right", "move_forward", "move_back")
_machine.input_dir = input_v
var node := _ensure_machine()
if not node:
return
# Keep one consistent source of truth for inputs
node.input_jump_just_pressed = Input.is_action_just_pressed("jump") and not node.input_jump_pressed
node.input_jump_pressed = Input.is_action_pressed("jump")
node.input_sprint = Input.is_action_pressed("sprint")
node.input_crouch = Input.is_action_pressed("crouch")
node.input_dash = Input.is_action_just_pressed("dash") and not node.input_dash
node.input_dir = Input.get_vector("move_left", "move_right", "move_forward", "move_back")