ChessBuilder/Systems/StateMachine/StateMachine.gd
2025-03-09 17:13:04 -05:00

60 lines
1.8 KiB
GDScript

class_name StateMachine extends Node
@export var initialState: ChessGameState = null
@onready var state: ChessGameState = (func getInitialState() -> State:
return initialState if initialState != null else get_child(0)
).call()
@onready var parent = get_parent()
var previouseState = null
var disabled = true
@onready var stateString: RichTextLabel = owner.get_node("StateLabel")
func _ready() -> void:
print("Ready Statemachine")
func start() -> void:
disabled = false
for stateNode: ChessGameState in find_children("*", "ChessGameState"):
stateNode.game = owner
stateNode.finished.connect(transitionToNextState)
await owner.ready
state.enter("")
func enter() -> void:
disabled = false
state.enter("")
func enable() -> void:
disabled = false
func disable() -> void:
disabled = true
func unhandledInput(event: InputEvent) -> void:
# print("StateMachine received input:", event)
state.handleInput(event)
func process(delta: float) -> void: state.update(delta)
func transitionToNextState(targetStatePath: String, data: Dictionary = {}) -> void:
if disabled:
previouseState = state.name
state.exit()
state = get_node(Constants.ROUND_END)
stateString.text = Constants.ROUND_END;
state.enter(previouseState, data)
print("DISABLED TRANSITION TO: ", targetStatePath, "Going to", Constants.ROUND_END)
return
print("TRANSITIONING TO: ", targetStatePath)
if not has_node(targetStatePath):
printerr(owner.name + ": Trying to transition to state " + targetStatePath + " but it does not exist.")
return
previouseState = state.name
state.exit()
state = get_node(targetStatePath)
stateString.text = targetStatePath;
state.enter(previouseState, data)