]> purplebirdman git - frog-ninja.git/blob - asset/character/model/state/state.gd
Squashed commit of the following:
[frog-ninja.git] / asset / character / model / state / state.gd
1 extends Node
2 class_name State
3
4 ###
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
13
14 var player: Player
15 var state_finished: bool
16 var enter_state_time: float
17 var exit_state_time: float = 0
18 var animation_finished: bool
19
20 var has_queued_state: bool
21 var queued_state_name: String
22
23
24 # this should be filled out before states are deployed!
25 var states: Dictionary
26
27
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)
31         
32         if not state_a:
33                 print_debug("Unrecognized state: " + a)
34         if not state_b:
35                 print_debug("Unrecognized state: " + b)
36
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
40
41
42 func should_enter(input: InputPacket) -> String:
43         input.player_actions.sort_custom(states_priority_sort)
44         return input.player_actions[0]
45
46
47 func update(_input: InputPacket, delta: float):
48         regain_stamina(delta)
49         pass
50
51
52 func on_enter_state():
53         pass
54
55
56 func on_exit_state():
57         pass
58
59
60 func mark_enter_state():
61         enter_state_time = Time.get_unix_time_from_system()
62
63
64 func mark_exit_state():
65         exit_state_time = Time.get_unix_time_from_system()
66
67
68 func get_remaining_cooldown_time() -> float:
69         if cooldown_time <= 0:
70                 return 0
71
72         var time_since_exit := Time.get_unix_time_from_system() - exit_state_time
73         if time_since_exit >= cooldown_time:
74                 return 0
75         else:
76                 return cooldown_time - time_since_exit
77
78
79 func get_progress() -> float:
80         var now := Time.get_unix_time_from_system()
81         return now - enter_state_time
82
83
84 func _when_animation_started(_anim_name: StringName):
85         animation_finished = false
86
87
88 func _when_animation_finished(_anim_name: StringName):
89         animation_finished = true
90
91
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
97
98
99 func ok_to_queue_next_state() -> bool:
100         return player.model.skeleton.queue_next_state
101
102
103 func ok_to_transition_to_queued_state():
104         return player.model.skeleton.transition_to_queued_state
105
106
107 func react_to_hit(hit: HitPacket):
108         print(player.name + " got hit by " + hit.weapon.equipped_by.name)
109         
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
114                 )
115         
116         # manage hit points
117         player.hit_points = max(
118                 player.hit_points - hit.base_damage,
119                 0
120                 )
121
122         # choose state based on HP
123         if player.hit_points > 0:
124                 queued_state_name = "Hit"
125         else:
126                 queued_state_name = "Death"
127         has_queued_state = true
128
129
130 func is_attacking() -> bool:
131         return player.model.skeleton.is_attacking
132
133
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