5 # flags and variables here
6 @export var state_priority: int
7 @export var animation_name: String
8 @export var animation_speed_scale := 1.0
9 @export var cooldown_time := 0.0
10 @export var stamina_toll := 0.0
11 @export var energy_toll := 0.0
12 @export var transition_to_self := false
15 var state_finished: bool
16 var enter_state_time: float
17 var exit_state_time: float = 0
18 var animation_finished: bool
20 var has_queued_state: bool
21 var queued_state_name: String
24 # this should be filled out before states are deployed!
25 var states: Dictionary
28 func states_priority_sort(a: String, b: String):
29 var state_a: State = states.get(a)
30 var state_b: State = states.get(b)
33 print_debug("Unrecognized state: " + a)
35 print_debug("Unrecognized state: " + b)
37 var priority_a: int = state_a.state_priority if state_a else -1
38 var priority_b: int = state_b.state_priority if state_b else -1
39 return priority_a > priority_b
42 func should_enter(input: InputPacket) -> String:
43 input.player_actions.sort_custom(states_priority_sort)
44 return input.player_actions[0]
47 func update(_input: InputPacket, delta: float):
52 func on_enter_state():
60 func mark_enter_state():
61 enter_state_time = Time.get_unix_time_from_system()
64 func mark_exit_state():
65 exit_state_time = Time.get_unix_time_from_system()
68 func get_remaining_cooldown_time() -> float:
69 if cooldown_time <= 0:
72 var time_since_exit := Time.get_unix_time_from_system() - exit_state_time
73 if time_since_exit >= cooldown_time:
76 return cooldown_time - time_since_exit
79 func get_progress() -> float:
80 var now := Time.get_unix_time_from_system()
81 return now - enter_state_time
84 func _when_animation_started(_anim_name: StringName):
85 animation_finished = false
88 func _when_animation_finished(_anim_name: StringName):
89 animation_finished = true
92 func check_combos(input: InputPacket):
93 for combo: Combo in get_children():
94 if combo.is_triggered(input):
95 queued_state_name = combo.triggered_state_name
96 has_queued_state = true
99 func ok_to_queue_next_state() -> bool:
100 return player.model.skeleton.queue_next_state
103 func ok_to_transition_to_queued_state():
104 return player.model.skeleton.transition_to_queued_state
107 func react_to_hit(hit: HitPacket):
108 print(player.name + " got hit by " + hit.weapon.equipped_by.name)
110 # increase energy for the player who did the hit
111 hit.weapon.equipped_by.energy_points = min(
112 hit.weapon.equipped_by.energy_points + hit.weapon.energy_return_on_hit,
113 player.max_energy_points
117 player.hit_points = max(
118 player.hit_points - hit.base_damage,
122 # choose state based on HP
123 if player.hit_points > 0:
124 queued_state_name = "Hit"
126 queued_state_name = "Death"
127 has_queued_state = true
130 func is_attacking() -> bool:
131 return player.model.skeleton.is_attacking
134 func regain_stamina(delta: float):
135 if player.stamina_points < player.max_stamina_points:
136 player.stamina_points += player.stamina_regain_per_sec * delta
137 if player.stamina_points > player.max_stamina_points:
138 player.stamina_points = player.max_stamina_points