extends Node class_name State #etat generique d'une StateMachine : il ne connait ni le joueur, ni le HUD, ni le jeu. Reutilisable pour un PNJ, un pokemon sauvage... #pour le joueur, voir PlayerState (qui ajoute le joueur, l'input, les hints et les helpers de mouvement). # #un etat surcharge on_enter() / exit() / update() / physics_update() et demande ses transitions avec request_transition(). var actor : Node #le node pilote par la machine (CharacterBody3D, joueur, PNJ...), renseigne par enter() var machine : StateMachine #renseigne par la StateMachine #donnees echangees entre etats (renseignees par la StateMachine, jamais ecrites a la main dans un autre etat) : var enter_data : Dictionary = {} #recues de l'etat precedent, lisibles dans on_enter() et ensuite var outgoing_data : Dictionary = {} #envoyees a l'etat suivant par request_transition(), lisibles dans exit() var next_state_name : String = "" #destination, renseignee avant exit() : exit() sait ou on va #---------- cycle de vie ---------- func enter(new_actor : Node) -> void: actor = new_actor on_enter() func on_enter() -> void: #a surcharger a la place de enter() : actor est deja assigne pass func exit() -> void: pass func update(_delta : float) -> void: pass func physics_update(_delta : float) -> void: pass #---------- transitions ---------- func request_transition(new_state_name : String, data : Dictionary = {}) -> bool: #demande une transition et renvoie true seulement si elle a vraiment eu lieu #(la StateMachine peut la refuser : etat bloque, etat inconnu, ou demande d'un etat qui n'est plus l'etat courant) #data : transmise a l'etat suivant (enter_data), et lisible par exit() de celui-ci (outgoing_data) if machine == null: return false return machine.request(self, new_state_name, data)