added most player movement states and started work on 'on foot'

This commit is contained in:
derek
2025-06-16 11:07:18 -05:00
parent d732abbcf8
commit 0a314a409c
7 changed files with 64 additions and 204 deletions

View File

@@ -1,5 +1,5 @@
extends State
class_name CharacterState
class_name CharacterState
@export var character: CharacterBody3D
@export var move_speed: float = 3

View File

@@ -1,91 +1,14 @@
extends State
class_name PlayerState
@export var character: CharacterBody3D
@export var move_speed: float = 3
@export var body_turn_speed: float = 3
@export var head_turn_speed: float = 6.0
@export var can_see: bool = true # indicates whether the character is able to see things in the state
@export var poi_investigate: bool = false
@export var poi_change_to_search: bool = false
@export var poi_update_waypoint_immediately: bool = false
@export var move_speed: float = 12
@export var move_transition_speed : float = 7
@onready var player_character = get_parent().player_character
var move_target
var look_target
func character_has_target():
if character.player_last_seen != null:
return true
if character.point_of_interest != null:
return true
return false
func update_move_target():
if character.player_last_seen != null:
return character.player_last_seen
elif character.point_of_interest != null:
return character.point_of_interest["point"]
else:
return character.global_position
func search_on_lost_target():
if !character.is_player_visible():
Transitioned.emit(self, "attack")
func move_target_adj(position):
return Vector3(position.x, character.global_position.y, position.z)
func rotate_to_face2D(object, target, target_offset_angle, delta, turn_speed):
#to allow both nodes and positions to be passed to this function, test the target and use Vector3 coords
var target_transformed
if target == null:
target_transformed = object.global_position
elif target is Vector3:
target_transformed = target
elif target is Node3D:
target_transformed = target.global_position
var pos2d = Vector2(object.global_position.x, object.global_position.z)
var target_pos2d = Vector2(target_transformed.x, target_transformed.z)
var direction = (pos2d - target_pos2d)
return lerp_angle(object.global_rotation.y, atan2(direction.x, direction.y) + deg_to_rad(target_offset_angle), delta * turn_speed)
func rotate_to_face3D(object: Node3D, target, target_offset_angle: Vector3, delta: float, turn_speed: float):
if target == null:
return
var target_positon
if target is Vector3:
target_positon = target
else:
target_positon = target.global_position
var desired_rotation = object.global_transform.looking_at(target_positon, Vector3.UP).basis.get_euler()
var current_rotation = object.global_rotation
#Interpolate each axis
current_rotation.x = lerp_angle(current_rotation.x, desired_rotation.x + target_offset_angle.x, delta * turn_speed)
current_rotation.y = lerp_angle(current_rotation.y, desired_rotation.y + target_offset_angle.y, delta * turn_speed)
current_rotation.z = lerp_angle(current_rotation.z, desired_rotation.z + target_offset_angle.z, delta * turn_speed)
#clamp pitch
var max_downward_pitch = deg_to_rad(85)
var min_upward_pitch = deg_to_rad(-45)
current_rotation.x = clamp(current_rotation.x, min_upward_pitch, max_downward_pitch)
object.global_rotation = current_rotation
func move_to_nav_point(delta):
var destination = character.nav_agent.get_next_path_position()
var local_destination = destination - character.global_position
var new_velocity = local_destination.normalized() * move_speed
character.nav_agent.set_velocity(new_velocity)
character.global_rotation.y = rotate_to_face2D(character, destination, 0, delta, body_turn_speed)
func velocity_computed(safe_velocity):
character.velocity = character.velocity.move_toward(safe_velocity, .25)
func update_minimap(priority, duration, color):
SignalBus.emit_signal("ui_minimap_point", character, character.global_position, 1, duration, color)
func standard_movement(delta):
player_character.velocity.x = lerp(player_character.velocity.x, player_character.movement_input().x * move_speed,delta * move_transition_speed)
player_character.velocity.z = lerp(player_character.velocity.z, player_character.movement_input().z * move_speed,delta * move_transition_speed)

View File

@@ -1,7 +1,7 @@
extends Node
class_name StateMachine
@export var player : Player
@export var player_character : Player
@export var initial_state : State
var current_state : State

View File

@@ -53,6 +53,9 @@ var last_ground_pos
@export var BASE_FOV : float = 80
@export var FOV_CHANGE = 1.5
## Movement
var input_dir
## GUNS AND AMMO
var gun : Node
var holstered_gun_id : int
@@ -174,103 +177,6 @@ func _input(event) -> void:
func _physics_process(delta):
if !dead and !level_control.paused:
# Add the gravity.
if is_on_floor():
double_jump = true
air_dash = level_control.gamemode.air_dash_max
else:
velocity.y += level_control.gamemode.gravity * delta
if abs(velocity.y) >= .1:
moving_fast = true
# Handle jump.
if Input.is_action_just_pressed("jump"):
if is_on_floor() and !is_climbing:
velocity.y += level_control.gamemode.jump_velocity
weapon_dip_pos += JUMP_WEAPON_DIP
crouched = false
elif wall_jump():
velocity += Vector3(velocity.x * 5,12,velocity.z * 5)
elif double_jump == true and !is_climbing:
velocity.y += level_control.gamemode.jump_velocity
double_jump = false
## HANDLE MOVEMENT DIRECTION
var input_dir
var direction
#GetKB Input
input_dir = Input.get_vector("move_left", "move_right", "move_up", "move_down")
#Get Joy Input
input_dir += joypad_walk()
if abs(Input.get_joy_axis(0,JOY_AXIS_LEFT_X)) > L_JOYSTICK_SENSITIVITY or abs(Input.get_joy_axis(0,JOY_AXIS_LEFT_Y)) > L_JOYSTICK_SENSITIVITY:
direction = (self.transform.basis * Vector3(input_dir.x, 0, input_dir.y))
else:
direction = (self.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
# Handle Sprint
if Input.is_action_just_pressed("sprint") and !is_on_floor():
if air_dash > 0:
velocity.x += direction.x * level_control.gamemode.dash_speed
velocity.z += direction.z * level_control.gamemode.dash_speed
air_dash -= 1
if Input.is_action_pressed("move_left"):
wall_ray_1.enabled = true
else:
wall_ray_1.enabled = false
if Input.is_action_pressed("move_right"):
wall_ray_2.enabled = true
else:
wall_ray_2.enabled = false
if Input.is_action_just_pressed("crouch"):
if crouched:
if !crouch_check.is_colliding():
crouched = !crouched
recoil.add_recoil(Vector3(-.2,.03,.03),5,10)
crouch_audio.play()
else:
recoil.add_recoil(Vector3(-.2,.03,.03),20,10)
hit_head.play()
else:
crouched = !crouched
recoil.add_recoil(Vector3(.2,0,0),5,10)
if is_on_floor():
crouch_audio.play()
velocity += direction * 20
else:
velocity.y -= 25
#walking
if is_on_floor() and !is_climbing:
if direction:
velocity.x = lerp(velocity.x, direction.x * speed, delta * GROUND_TRANSITION_SPEED)
velocity.z = lerp(velocity.z, direction.z * speed, delta * GROUND_TRANSITION_SPEED)
else:
velocity.x = lerp(velocity.x, direction.x * speed, delta * 6.5) + (direction.x * level_control.gamemode.dash_speed)
velocity.z = lerp(velocity.z, direction.z * speed, delta * 6.5) + (direction.z * level_control.gamemode.dash_speed)
#ladder movement
elif is_climbing and !is_on_floor():
gravity = 0.0
if direction:
velocity.y = -direction.z * speed * .75
velocity.x = direction.x * speed * .3
else:
velocity.y = lerp(velocity.y, -direction.z * speed, delta * 6.5)
velocity.x = lerp(velocity.x, direction.x * speed, delta * 6.5)
#movement in air
else:
velocity.x = lerp(velocity.x, direction.x * speed, delta * AIR_TRANSITION_SPEED)
velocity.z = lerp(velocity.z, direction.z * speed, delta * AIR_TRANSITION_SPEED)
## Wall Running
if wall_ray_1.is_colliding() or wall_ray_2.is_colliding():
if abs(Vector2(velocity.x,velocity.z)) >= Vector2(5.0,5.0):
velocity.y = clamp(velocity.y,-1,abs(velocity.y))
air_dash = 1
# Head bob
t_bob += delta * velocity.length() * float(is_on_floor())
camera.transform.origin = _headbob(t_bob)
@@ -333,11 +239,6 @@ func _physics_process(delta):
if level_control.gamemode.stamina_regen == true:
remaining_stamina = clamp(remaining_stamina + (delta * level_control.gamemode.stamina_gain/Engine.time_scale), 0, level_control.gamemode.max_stamina)
# Reloading
if Input.is_action_just_pressed("reload"):
gun.reload()
if Input.is_action_pressed("inspect") and !gun.anim_player.is_playing():
gun.anim_player.play("inspect")
@@ -349,12 +250,6 @@ func _physics_process(delta):
flashlight_on = true
flashlight_audio.play()
# Shooting & fire modes
if Input.is_action_pressed("shoot"):
if gun != null:
gun.shoot()
# Gun folding out of the way
if gun_ray.is_colliding():
var distance_to_wall = 1 - (gun_ray.global_position.distance_to(gun_ray.get_collision_point()) / abs(gun_ray.target_position.z))
@@ -454,11 +349,25 @@ func _physics_process(delta):
hold_item(delta)
move_and_slide()
crouch(delta)
weapon_tilt(input_dir.x, delta)
weapon_tilt(input_dir, delta)
weapon_sway(delta)
weapon_bob(velocity.length(), delta)
## MOVEMENT
func movement_input():
## HANDLE MOVEMENT DIRECTION
var direction
#GetKB Input
input_dir = Input.get_vector("move_left", "move_right", "move_up", "move_down")
#Get Joy Input
input_dir += joypad_walk()
if abs(Input.get_joy_axis(0,JOY_AXIS_LEFT_X)) > L_JOYSTICK_SENSITIVITY or abs(Input.get_joy_axis(0,JOY_AXIS_LEFT_Y)) > L_JOYSTICK_SENSITIVITY:
direction = (self.transform.basis * Vector3(input_dir.x, 0, input_dir.y))
else:
direction = (self.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
return direction
func joypad_walk():
# Joypad right stick look control
var dir_out = Vector2(0,0)
@@ -662,12 +571,13 @@ func focus_on_target():
camera.attributes.dof_blur_far_enabled = false
camera.attributes.dof_blur_near_enabled = false
func weapon_tilt(input_x, delta):
if !ads:
if weapon_holder:
weapon_holder.rotation.z = lerp(weapon_holder.rotation.z, -input_x * weapon_rotation_amount * 10, 4 * delta)
if camera:
camera.rotation.z = lerp(camera.rotation.z, -input_x * HEAD_TILT_AMT, 5 * delta)
func weapon_tilt(input, delta):
if input:
if !ads:
if weapon_holder:
weapon_holder.rotation.z = lerp(weapon_holder.rotation.z, -input.x * weapon_rotation_amount * 10, 4 * delta)
if camera:
camera.rotation.z = lerp(camera.rotation.z, -input.x * HEAD_TILT_AMT, 5 * delta)
func weapon_sway(delta):
#aim gun at center screen

View File

@@ -66,6 +66,12 @@ func _ready():
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta):
if Input.is_action_pressed("shoot"):
shoot()
if Input.is_action_just_pressed("reload"):
reload()
if chamber != null:
var rot_amount = revolver_chamber_rot_amt * _delta * 10
chamber.rotate_object_local(Vector3(0,-1,0),deg_to_rad(rot_amount))