From 0a314a409cbbfdd82266ec334502aa4d91af4077 Mon Sep 17 00:00:00 2001 From: derek Date: Mon, 16 Jun 2025 11:07:18 -0500 Subject: [PATCH] added most player movement states and started work on 'on foot' --- assets/player.tscn | 25 ++++++- project.godot | 2 +- scripts/CharacterStates.gd | 2 +- scripts/PlayerStates.gd | 91 ++--------------------- scripts/StateMachine.gd | 2 +- scripts/player.gd | 140 +++++++---------------------------- scripts/weapon_uberscript.gd | 6 ++ 7 files changed, 64 insertions(+), 204 deletions(-) diff --git a/assets/player.tscn b/assets/player.tscn index 511bfd5..c85a98a 100644 --- a/assets/player.tscn +++ b/assets/player.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=38 format=3 uid="uid://drwae3loscbw7"] +[gd_scene load_steps=39 format=3 uid="uid://drwae3loscbw7"] [ext_resource type="Script" uid="uid://bieeh1iro4ji1" path="res://scripts/player.gd" id="1_x7wms"] [ext_resource type="Script" uid="uid://csju024nerln6" path="res://scripts/StateMachine.gd" id="2_irwor"] [ext_resource type="Script" uid="uid://s2nes6cthron" path="res://scripts/recoil.gd" id="3_405jc"] +[ext_resource type="Script" uid="uid://o7g6oowyn6pe" path="res://scripts/player_on_foot.gd" id="3_ib4e7"] [ext_resource type="Texture2D" uid="uid://cknftvqq8rbrm" path="res://assets/Textures/Cookie_tutorial_texture_flashlight.png" id="4_x670l"] [ext_resource type="PackedScene" uid="uid://dqgtnykkbngem" path="res://assets/weapon_select.tscn" id="5_bvbcl"] [ext_resource type="PackedScene" uid="uid://br882tlh3cfwu" path="res://hud.tscn" id="5_yenaw"] @@ -135,8 +136,28 @@ script = ExtResource("1_x7wms") SENSITIVITY = 0.008 weapon_holder = NodePath("Head/Recoil/Camera3D/WeaponHolder") -[node name="States" type="Node" parent="."] +[node name="States" type="Node" parent="." node_paths=PackedStringArray("player_character", "initial_state")] script = ExtResource("2_irwor") +player_character = NodePath("..") +initial_state = NodePath("On Foot") + +[node name="On Foot" type="Node" parent="States"] +script = ExtResource("3_ib4e7") +metadata/_custom_type_script = "uid://dk0vg5btak80a" + +[node name="Crouched" type="Node" parent="States"] + +[node name="Jumping" type="Node" parent="States"] + +[node name="Wall Running" type="Node" parent="States"] + +[node name="Ground Pound" type="Node" parent="States"] + +[node name="Knocked" type="Node" parent="States"] + +[node name="Stunned" type="Node" parent="States"] + +[node name="On Ladder" type="Node" parent="States"] [node name="HealthIndicator" type="ColorRect" parent="."] material = SubResource("CanvasItemMaterial_l5ga0") diff --git a/project.godot b/project.godot index f2b8dd6..2ea5981 100644 --- a/project.godot +++ b/project.godot @@ -12,7 +12,7 @@ config_version=5 config/name="First Person Test" config/tags=PackedStringArray("fps") -run/main_scene="uid://f7e0v1r6ra6c" +run/main_scene="uid://cfaydhd6u5bmb" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="uid://6svuq1l83al5" diff --git a/scripts/CharacterStates.gd b/scripts/CharacterStates.gd index 0596528..193daa3 100644 --- a/scripts/CharacterStates.gd +++ b/scripts/CharacterStates.gd @@ -1,5 +1,5 @@ extends State -class_name CharacterState +class_name CharacterState @export var character: CharacterBody3D @export var move_speed: float = 3 diff --git a/scripts/PlayerStates.gd b/scripts/PlayerStates.gd index f056ca6..6ab3f16 100644 --- a/scripts/PlayerStates.gd +++ b/scripts/PlayerStates.gd @@ -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) diff --git a/scripts/StateMachine.gd b/scripts/StateMachine.gd index 392cdb4..aed1ab0 100644 --- a/scripts/StateMachine.gd +++ b/scripts/StateMachine.gd @@ -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 diff --git a/scripts/player.gd b/scripts/player.gd index 350c1ee..25144ac 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -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 diff --git a/scripts/weapon_uberscript.gd b/scripts/weapon_uberscript.gd index 0c1430e..168bd2b 100644 --- a/scripts/weapon_uberscript.gd +++ b/scripts/weapon_uberscript.gd @@ -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))