extends State class_name PlayerState #etat du joueur : ajoute a State le PlayerCharacter, l'input, les hints du HUD et les helpers de mouvement. #les hints sont publiees par StateHints (un composant du joueur) : la StateMachine n'en sait rien. signal hints_changed #a emettre quand get_hints() change alors que l'etat est actif @export var hints : Array[Hint] = [] #cas simple : se regle dans l'inspecteur @export var keep_previous_hints : bool = false #etats transitoires (Dodge...) : on ne touche pas aux hints affiches var player : PlayerCharacter #renseigne par enter() : les etats n'ont plus besoin de le stocker eux-memes var input : InputManagementComponent #lecture de l'input du joueur (raccourci vers player.player_input) func enter(new_actor : Node) -> void: player = new_actor as PlayerCharacter input = player.player_input super(new_actor) func get_hints() -> Array[Hint]: return hints #a surcharger seulement quand les hints dependent d'une condition #---------- transitions du joueur ---------- func fall() -> bool: #quitter le sol : la posture accroupie est annulee (on retombe debout), puis passage en InairState player.is_crouching = false return request_transition(States.INAIR) func request_locomotion() -> bool: #vers Walk ou Run, selon la derniere allure choisie (player.locomotion) return request_transition(player.get_locomotion_state()) func request_ground_state(moving : bool) -> bool: #retour au sol : Idle si le joueur est immobile, sinon Walk ou Run selon la derniere allure return request_locomotion() if moving else request_transition(States.IDLE) #---------- helpers de mouvement ---------- func accelerate(target_speed : float, accel : float, delta : float) -> void: #vers la vitesse voulue dans la direction de move_dir player.velocity.x = lerpf(player.velocity.x, player.move_dir.x * target_speed, accel * delta) player.velocity.z = lerpf(player.velocity.z, player.move_dir.y * target_speed, accel * delta) func slow_down(delta : float) -> void: player.velocity.x = lerpf(player.velocity.x, 0.0, player.move_deccel * delta) player.velocity.z = lerpf(player.velocity.z, 0.0, player.move_deccel * delta)