103 lines
2.8 KiB
GDScript
103 lines
2.8 KiB
GDScript
extends StateAnimatedActor
|
|
|
|
export (NodePath) var jump_node
|
|
export (NodePath) var idle_node
|
|
export (NodePath) var fall_node
|
|
export (NodePath) var move_node
|
|
export (NodePath) var draw_weapon_node
|
|
|
|
onready var jump_state: State = get_node(jump_node)
|
|
onready var idle_state: State = get_node(idle_node)
|
|
onready var fall_state: State = get_node(fall_node)
|
|
onready var move_state: State = get_node(move_node)
|
|
onready var weapon_state_modifier: StateModifier = get_node(draw_weapon_node)
|
|
|
|
|
|
var can_fire = true
|
|
signal do_attack()
|
|
|
|
func enter() -> void:
|
|
#.enter()
|
|
##TODO: Turn this to clear only the animation modifiers.
|
|
modifier_stack_ref.clear()
|
|
mod_animation_sequence.clear()
|
|
#mod_animation_sequence = animation_sequence.duplicate(true)
|
|
mod_animation_sequence.append_array(animation_sequence)
|
|
# Reset animation suffix in case there isn't one
|
|
animation_suffix = '_shoot'
|
|
animation_index = 0
|
|
current_animation_sequence = 0
|
|
#var enter_animation = ''
|
|
var enter_frame = 0
|
|
|
|
if debug_state:
|
|
print(parent.name, " entering State: ", self.name)
|
|
move_component.current_movement_state = self.name
|
|
emit_signal("state_entered")
|
|
|
|
state_timeout.start()
|
|
can_fire = true
|
|
# if modifier_stack_ref.has($"../draw_weapon") == false:
|
|
# $"../draw_weapon".enter()
|
|
# modifier_stack_ref.push_front($"../draw_weapon")
|
|
if debug_state:
|
|
print("Previous State Info: ", previous_animation_name, " ",
|
|
previous_state_frame_number, " ", previous_state_name)
|
|
match previous_animation_name:
|
|
"idle":
|
|
animations.play("_shoot")
|
|
"run":
|
|
animations.play("run_shoot")
|
|
animations.frame = previous_state_frame_number
|
|
"jump":
|
|
animations.play("jump_shoot")
|
|
animations.frame = previous_state_frame_number
|
|
_:
|
|
print("Warning!: Attack state encountered unhandled prev animation: ", previous_animation_name)
|
|
|
|
func process_frame(delta: float) -> State:
|
|
# if animations.frame == 2:
|
|
# animations.stop()
|
|
if state_timeout.time_left == 0 and animations.animation == "shoot":
|
|
return idle_state
|
|
return null
|
|
|
|
|
|
func process_physics(delta: float) -> State:
|
|
|
|
if can_fire: # trying to do this in the physics because irrecular behavior
|
|
emit_signal("do_attack")
|
|
can_fire = false
|
|
|
|
if move_component.wants_jump() and parent.is_on_floor():
|
|
return jump_state
|
|
|
|
move_actor_as_desired(delta)
|
|
|
|
if previous_state_name == "move" and move_component.velocity.x == 0.0:
|
|
return idle_state
|
|
|
|
if previous_state_name == "idle" and move_component.velocity.x != 0.0:
|
|
return move_state
|
|
|
|
if move_component.get_movement_direction() != 0.0:
|
|
parent.transform.x.x = move_component.get_movement_direction()
|
|
|
|
# if move_component.velocity.x != 0.0:
|
|
# return move_state
|
|
|
|
if !parent.is_on_floor():
|
|
return fall_state
|
|
|
|
|
|
return null
|
|
|
|
func exit() -> void:
|
|
# force timer reset
|
|
weapon_state_modifier.state_timeout.start()
|
|
push_animation_state_modifier(weapon_state_modifier)
|
|
#$"../draw_weapon".state_timeout.start()
|
|
|
|
return
|
|
|