Attempt2/src/actors/players/playerE/PlayerE-Movement_StateReceiver.gd
2025-03-25 19:54:28 -07:00

280 lines
7.7 KiB
GDScript

extends Movement_StateReceiver
func _ready():
var state_ref :State
var state_name :String
state_name = 'jump'
state_ref = get_node(callable_state_machine).get_state_reference(state_name)
#TODO Should probably assert here or something.
state_ref.connect("state_entered", self, "_on_state_entered_" + state_name)
# Lets see if this nutty thing works
# var state_ref :State = get_node(callable_state_machine).get_state_reference('idle')
# state_ref.connect("state_entered", self, "_on_state_entered_idle")
# It works but node order really mattered.
# State machine needed to be processed first probably for ready function.
# good to know!
var player_number: int = 1
func get_movement_direction() -> float:
#return Input.get_axis('move_left', 'move_right')
desired_movement_vector.x = Input.get_axis("move_left_" + str(player_number), "move_right_" + str(player_number))
return Input.get_axis("move_left_" + str(player_number), "move_right_" + str(player_number))
var _wants_jump :bool
func wants_jump() -> bool:
if Input.is_action_just_pressed("jump_" + str(player_number)):
desired_movement_vector.y = UP
_wants_jump = true
return true
else:
_wants_jump = false
return false
var _wants_crouch :bool
func wants_crouch() -> bool:
if Input.is_action_pressed("crouch_" + str(player_number)):
_wants_crouch = true
return true
else:
_wants_crouch = false
return false
var _wants_shoot :bool
func wants_shoot() -> bool:
if Input.is_action_just_pressed("attack_" + str(player_number)):
_wants_shoot = true
return true
else:
_wants_shoot = false
return false
var _wants_attack_secondary :bool
func wants_attack_secondary() -> bool:
if Input.is_action_just_pressed("attack_secondary_" + str(player_number)):
_wants_attack_secondary = true
return true
else:
_wants_attack_secondary = false
return false
var _wants_dash :bool
func wants_dash() -> bool:
if Input.is_action_just_pressed("dash_" + str(player_number)):
_wants_dash = true
return true
else:
_wants_dash = false
return false
var _wants_roll :bool
func wants_roll() -> bool:
if Input.is_action_just_pressed("dash_" + str(player_number)) and Input.is_action_pressed("ui_up"):
_wants_roll = true
return true
else:
_wants_roll = false
return false
#TODO: This is probably not a good way to do this.
# we want to check input once and make decisions based on
# velocity and desired movement.
#func _state_process_physics_input_idle():
# get_movement_direction()
#
#func _state_process_physics_input_move():
# get_movement_direction()
# Probably better to do it this way then allocating individual
# state functions that all do the same thing.
func process_physics_input(delta):
# call the parent, Which would call the individuals
.process_physics_input(delta)
# then process movement controls
physics_delta = delta
get_movement_direction()
wants_jump()
wants_crouch()
wants_shoot()
wants_attack_secondary()
wants_dash()
wants_roll()
func flip_sprite_to_movement_direction():
if desired_movement_vector.x != 0.0:
parent.transform.x.x = desired_movement_vector.x
func _state_process_physics_idle():
if desired_movement_vector.y == UP:
request_state_change.call_func('jump')
if _wants_crouch == true:
request_state_change.call_func('crouch')
#TODO: May need that 'bump' logic to make velocity work.
if desired_movement_vector.x != 0: # and velocity.x != 0:
request_state_change.call_func('move')
if !parent.is_on_floor():
#return fall_state
request_state_change.call_func('fall')
if _wants_roll == true:
request_state_change.call_func('roll')
if _wants_shoot == true:
request_state_change.call_func('attack_shoot')
if _wants_attack_secondary == true:
request_state_change.call_func('attack_sword')
func _state_process_physics_attack_shoot():
if current_state.animation_finished == true:
request_state_change.call_func('idle')
if !parent.is_on_floor():
#return fall_state
request_state_change.call_func('fall')
func _state_process_physics_attack_sword():
if current_state.animation_finished == true:
request_state_change.call_func('idle')
if !parent.is_on_floor():
#return fall_state
request_state_change.call_func('fall')
func _state_process_physics_roll():
if current_state.animation_finished == true:
request_state_change.call_func('idle')
# Force role in facing direction
# instead of movement direction
move_actor_as_desired(parent.transform.x.x)
if !parent.is_on_floor():
#return fall_state
request_state_change.call_func('fall')
func _state_process_physics_land():
if current_state.animation_finished == true:
request_state_change.call_func('idle')
if !parent.is_on_floor():
#return fall_state
request_state_change.call_func('fall')
move_actor_as_desired()
func _state_process_physics_hurt():
if current_state.state_timeout.time_left == 0:
request_state_change.call_func('idle')
# if !parent.is_on_floor():
# #return fall_state
# request_state_change.call_func('fall')
velocity.y += current_state.gravity * physics_delta
#parent.velocity = parent.move_and_slide(parent.velocity, Vector2(0, -1))
velocity.x = parent.transform.x.x * -1 * current_state.horizontal_speed
# if (parent.direction.x > 0):
# parent.velocity.x = 1 * move_speed
# else:
# parent.velocity.x = -1 * move_speed
velocity = parent.move_and_slide(velocity, Vector2(0, -1))
func _state_process_physics_fall():
flip_sprite_to_movement_direction()
if $"../LedgeDetector".is_colliding() and !$"../WallDetector".is_colliding():
#print("it touched me!")
UiManager.debug_text = (str($"../LedgeDetector".get_collision_point()))
request_state_change.call_func('ledge_grab')
if parent.is_on_floor():
#modifier.reference()
#idle_state.modifier = landing_modifier
request_state_change.call_func('land')
move_actor_as_desired()
func _state_process_physics_jump():
#UiManager.debug_text = (str(velocity))
flip_sprite_to_movement_direction()
#Apparently we're instantly landing
# if parent.is_on_floor():
# #modifier.reference()
# #idle_state.modifier = landing_modifier
# request_state_change.call_func('idle')
if velocity.y > 0:
request_state_change.call_func('fall')
move_actor_as_desired()
func _state_process_physics_move():
# flip sprite in direction
flip_sprite_to_movement_direction()
if desired_movement_vector.y == UP:
request_state_change.call_func('jump')
if desired_movement_vector.x == 0:
request_state_change.call_func('idle')
if !parent.is_on_floor():
request_state_change.call_func('fall')
move_actor_as_desired()
func _state_process_physics_ledge_grab():
UiManager.debug_text = (str(velocity))
if _wants_crouch:
request_state_change.call_func('fall')
func _state_process_physics_crouch():
# flip sprite in direction
flip_sprite_to_movement_direction()
if _wants_crouch != true:
request_state_change.call_func('idle')
if !parent.is_on_floor():
request_state_change.call_func('fall')
if _wants_crouch == true and desired_movement_vector.x != 0:
request_state_change.call_func('crouch_move')
elif desired_movement_vector.x != 0: # and velocity.x != 0:
request_state_change.call_func('move')
func _state_process_physics_crouch_move():
# flip sprite in direction
flip_sprite_to_movement_direction()
if _wants_crouch != true:
request_state_change.call_func('idle')
if !parent.is_on_floor():
request_state_change.call_func('fall')
if _wants_crouch == true and desired_movement_vector.x == 0:
request_state_change.call_func('crouch')
elif _wants_crouch != true and desired_movement_vector.x != 0:
request_state_change.call_func('move')
move_actor_as_desired()
#func _on_state_entered_idle():
# print("Movement State Idle State Entered!")
func _on_state_entered_jump():
#TODO: Make this a state variable
# I used to call it 'jump_force' like an idiot.
velocity.y = -200