diff --git a/src/player/camera_controller.gd b/src/player/camera_controller.gd index 180ec36..f1dad75 100644 --- a/src/player/camera_controller.gd +++ b/src/player/camera_controller.gd @@ -35,6 +35,11 @@ func camera_motion(motion: Vector2) -> void: ) +func reset_pitch(tween_duration: float) -> void: + var tween := create_tween() + tween.tween_property(self, "_target:x", 0, tween_duration) + + func _physics_process(delta: float) -> void: var mouse_accel: float = Game.settings.mouse_acceleration if player.firing: diff --git a/src/player/player.gd b/src/player/player.gd index d7b833c..5afa53e 100644 --- a/src/player/player.gd +++ b/src/player/player.gd @@ -7,6 +7,13 @@ class_name Player extends CharacterBody3D @export var activity_enabled := true @export var look_enabled := true +@export var camera_rumble: float: + set(value): + if Game.settings.enable_screen_shake: + cam_rumbler.intensity = value + get: + return cam_rumbler.intensity + @export_category("Movement") @export_group("Speed") @export var run_speed := 80.0 @@ -43,6 +50,7 @@ var _was_on_floor := false @onready var hud: PlayerHUD = %PlayerHUD @onready var camera_pivot: CameraController = %CameraPivot +@onready var cam_rumbler: Rumbler3D = %CamRumbler @onready var interact_ray: RayCast3D = %InteractRay @@ -53,6 +61,7 @@ var _was_on_floor := false @onready var crouch_head_area: Area3D = %CrouchHeadArea @onready var crouch_animation: AnimationPlayer = %CrouchAnimation +@onready var grab_animation: AnimationPlayer = %GrabAnimation @onready var jump_game_sound_emitter: GameSoundEmitter = %JumpGameSoundEmitter @@ -131,12 +140,33 @@ func toggle_crouch() -> void: crouch() +## Get fuckign grabbed, idiot! +## Begin grab death sequence animation. +func get_grabbed(look_target: Vector3) -> void: + movement_enabled = false + activity_enabled = false + look_enabled = false + + uncrouch() + grab_animation.play("get_grabbed") + camera_pivot.reset_pitch(0.4) + + #endregion #region _physics_process func _physics_process(delta: float) -> void: + # REMOVEME + if Input.is_action_just_pressed("ui_page_down"): + get_grabbed(Vector3.FORWARD) + if Input.is_action_just_pressed("ui_page_up"): + movement_enabled = true + activity_enabled = true + look_enabled = true + grab_animation.play("RESET") + # Will be null if no valid interactor is selected. var interactive: Interactive = interact_ray.get_collider() as Interactive hud.select_interactive(interactive) diff --git a/src/player/player.tscn b/src/player/player.tscn index 0a5407f..bdc3dd4 100644 --- a/src/player/player.tscn +++ b/src/player/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=57 format=3 uid="uid://bwe2jdmvinhqd"] +[gd_scene load_steps=62 format=3 uid="uid://bwe2jdmvinhqd"] [ext_resource type="Script" uid="uid://buwh0g1ga2aka" path="res://src/player/player.gd" id="1_npueo"] [ext_resource type="Script" uid="uid://cx1yt0drthpw3" path="res://src/player/camera_controller.gd" id="2_veeqv"] @@ -7,6 +7,7 @@ [ext_resource type="Script" uid="uid://cwy3akimaeib" path="res://src/player/tool_mount.gd" id="3_jiejy"] [ext_resource type="PackedScene" uid="uid://dq1x21tq06dud" path="res://src/ui/hud/player_hud.tscn" id="5_jvafu"] [ext_resource type="PackedScene" uid="uid://qknkdy6aics1" path="res://src/equipment/toothbrush/toothbrush.tscn" id="6_o822w"] +[ext_resource type="Script" uid="uid://b274q7uvn0cvp" path="res://src/ui/rumbler_3d.gd" id="7_p6grl"] [ext_resource type="Script" uid="uid://b1vyq7e81nyt0" path="res://src/player/headbob_controller.gd" id="7_x42xx"] [ext_resource type="Script" uid="uid://ecrhsueph7at" path="res://src/player/footsteps/footstep_controller.gd" id="9_hja65"] [ext_resource type="Script" uid="uid://brqa2wbtaspw4" path="res://src/player/footsteps/foot_controller.gd" id="9_l271a"] @@ -430,6 +431,175 @@ _data = { [sub_resource type="SphereShape3D" id="SphereShape3D_p6grl"] radius = 3.0 +[sub_resource type="Animation" id="Animation_e7e1q"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:z") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:x") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/4/type = "bezier" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:y") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/5/type = "bezier" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:z") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/6/type = "bezier" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath(".:camera_rumble") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="Animation" id="Animation_p6grl"] +resource_name = "get_grabbed" +length = 6.0 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.5) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.2, 0.00167316, -1.385, -0.0999666, 0.665918, 0.0333333, 0.566197, -1.385, -0.0416667, 0.6662, 0.0083333, 0.113592, -1.385, -0.0876723, -0.0501441, 0.25, 0), +"times": PackedFloat32Array(0, 0.333333, 0.566667, 0.8) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:z") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.333333, -0.39514, -0.254137, -0.0666667, -0.000457972, 0.25, 0, -0.254137, -0.0666667, -0.000457972, 0.0601447, 0.231214, 0.304548, -0.563731, -0.0123209, 0.25, 0, 0.304548, -0.25, 0, 0.06, 0.231, 0.885, -0.563731, -0.0123209, 0.25, 0), +"times": PackedFloat32Array(0, 0.366667, 2.96667, 3.56667, 5.26667, 5.86667) +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:x") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0), +"points": PackedFloat32Array(0, -0.05, 0, 0.133333, 2.74114, 0, -0.1, 0.428854, 0.0666667, 0.168909, 0, -0.0666667, 0.178293, 0.0083333, 0.0844504, -1.20654e-08, -0.0876723, -0.0331565, 0.25, 0), +"times": PackedFloat32Array(0, 0.333333, 0.566667, 0.8) +} +tracks/4/type = "bezier" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:y") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.333333, -0.0229232, -1.0426, -0.933333, -0.279974, 0.25, 0, -1.043, -0.25, 0, 0.0333333, 0.158983, -0.878928, -0.25, 0, 0.25, 0, -0.878928, -0.25, 0, 0.033, 0.159, -0.758089, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.8, 2.96667, 3.56667, 5.26667, 5.86667) +} +tracks/5/type = "bezier" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:z") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 1.5708, -0.0876722, 0.463211, 0.0344108, -0.0689299, 1.5708, -0.0322559, -0.00752902, 0.25, 0, 1.571, -0.25, 0, 0, 0.04, 1.68, -0.25, 0, 0.25, 0, 1.68, -0.25, 0, 0, 0.04, 1.71, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.566667, 0.733333, 2.96667, 3.66667, 5.26667, 5.96667) +} +tracks/6/type = "bezier" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath(".:camera_rumble") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0, 0.161517, 0, -0.767, 0, 0.25, 0, 0, -0.25, 0, 0, 0.02, 0, -0.5, 0, 0.25, 0, 0, -0.25, 0, 0, 0.02, 0, -0.5, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.3, 1, 2.96667, 3.66667, 5.26667, 5.96667) +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_e7e1q"] +_data = { +&"RESET": SubResource("Animation_e7e1q"), +&"get_grabbed": SubResource("Animation_p6grl") +} + +[sub_resource type="PlaneMesh" id="PlaneMesh_p6grl"] + [node name="Player" type="CharacterBody3D"] collision_layer = 8 collision_mask = 33 @@ -459,15 +629,23 @@ visible = false unique_name_in_owner = true visible = false -[node name="Camera3D" type="Camera3D" parent="CameraPosition/CameraPivot"] +[node name="TransformedPosition" type="Node3D" parent="CameraPosition/CameraPivot"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) + +[node name="CamRumbler" type="Node3D" parent="CameraPosition/CameraPivot/TransformedPosition"] +unique_name_in_owner = true +script = ExtResource("7_p6grl") +metadata/_custom_type_script = "uid://b274q7uvn0cvp" + +[node name="Camera3D" type="Camera3D" parent="CameraPosition/CameraPivot/TransformedPosition/CamRumbler"] current = true -[node name="InteractRay" type="RayCast3D" parent="CameraPosition/CameraPivot/Camera3D"] +[node name="InteractRay" type="RayCast3D" parent="CameraPosition/CameraPivot/TransformedPosition/CamRumbler/Camera3D"] unique_name_in_owner = true target_position = Vector3(0, 0, -1.5) collision_mask = 2 -[node name="FarLight" type="OmniLight3D" parent="CameraPosition/CameraPivot/Camera3D"] +[node name="FarLight" type="OmniLight3D" parent="CameraPosition/CameraPivot/TransformedPosition/CamRumbler/Camera3D"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.1) light_energy = 0.05 light_specular = 0.01 @@ -475,18 +653,18 @@ light_cull_mask = 4294967293 omni_range = 50.0 omni_attenuation = 0.0 -[node name="NearLight" type="OmniLight3D" parent="CameraPosition/CameraPivot/Camera3D"] +[node name="NearLight" type="OmniLight3D" parent="CameraPosition/CameraPivot/TransformedPosition/CamRumbler/Camera3D"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.1) light_specular = 0.01 light_cull_mask = 4294967293 omni_range = 2.0 -[node name="HeadbobAnimation" type="AnimationPlayer" parent="CameraPosition/CameraPivot/Camera3D"] +[node name="HeadbobAnimation" type="AnimationPlayer" parent="CameraPosition/CameraPivot/TransformedPosition/CamRumbler/Camera3D"] libraries = { &"": SubResource("AnimationLibrary_l271a") } -[node name="HeadbobController" type="AnimationTree" parent="CameraPosition/CameraPivot/Camera3D/HeadbobAnimation"] +[node name="HeadbobController" type="AnimationTree" parent="CameraPosition/CameraPivot/TransformedPosition/CamRumbler/Camera3D/HeadbobAnimation"] unique_name_in_owner = true root_node = NodePath("%HeadbobController/../..") tree_root = SubResource("AnimationNodeBlendTree_ylhto") @@ -591,3 +769,14 @@ metadata/_custom_type_script = "uid://c5o1d2shq2qig" [node name="CollisionShape3D" type="CollisionShape3D" parent="JumpGameSoundEmitter"] shape = SubResource("SphereShape3D_p6grl") + +[node name="GrabAnimation" type="AnimationPlayer" parent="."] +unique_name_in_owner = true +libraries = { +&"": SubResource("AnimationLibrary_e7e1q") +} + +[node name="DebugFloor" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0) +visible = false +mesh = SubResource("PlaneMesh_p6grl")