HSM implementation cookbook
[!CAUTION] Do not paste inline
HierarchicalStatesamples from pre-lattice baselines — they double-exit()on pop. Use MANDATORY scripts.
State base contract
class_name State extends Node
var state_machine: Node
func enter(_msg: Dictionary = {}) -> void: pass
func exit() -> void: pass
func update(_delta: float) -> void: pass
func physics_update(_delta: float) -> void: pass
func handle_input(_event: InputEvent) -> void: passRouting
| Need | Script |
|---|---|
| Hierarchy | hsm_hierarchical_base.gd |
| Push/pop overlays | hsm_pushdown_stack.gd |
| Guards | hsm_transition_guard.gd |
| Context | hsm_state_context.gd |
Best practices
- One state per file (
class_name). - Signal
state_changedfor audio/VFX syncers. - Every
push_stateneeds apop_stateplan.
Pushdown resume: enter({"is_resume": true}) — hsm_reentry_aware_state.gd.