diff --git a/src/base-environments/youth_room/crouch_volume.gd b/src/base-environments/youth_room/crouch_volume.gd new file mode 100644 index 0000000..053f59d --- /dev/null +++ b/src/base-environments/youth_room/crouch_volume.gd @@ -0,0 +1,15 @@ +class_name CrouchVolume extends Area3D + +func ready(): + body_entered.connect(notify_player_entry) + body_exited.connect(notify_player_exit) + +func notify_player_entry(body: RigidBody3D): + print("Player entered Crouch area.") + if body is Player: + body.inside_crouch_volume.append(self) + +func notify_player_exit(body: RigidBody3D): + if body is Player: + body.inside_crouch_volume.erase(self) + body.crouched = false diff --git a/src/base-environments/youth_room/youth_room.tscn b/src/base-environments/youth_room/youth_room.tscn index 05b870b..07d4736 100644 --- a/src/base-environments/youth_room/youth_room.tscn +++ b/src/base-environments/youth_room/youth_room.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=114 format=4 uid="uid://b3b0gyvklqn50"] +[gd_scene load_steps=115 format=4 uid="uid://b3b0gyvklqn50"] [ext_resource type="Script" uid="uid://belkrno67sft0" path="res://base-environments/youth_room/room_handle.gd" id="1_aitp0"] [ext_resource type="PackedScene" uid="uid://c0i4ydmxtxfho" path="res://base-environments/youth_room/import/youth_room.glb" id="1_jf3oi"] [ext_resource type="AudioStream" uid="uid://1h6k2d8q1kw3" path="res://base-environments/youth_room/import/sounds/rain_on_window.mp3" id="2_3haaq"] [ext_resource type="PackedScene" uid="uid://mkccbig41bqb" path="res://logic-scenes/player_controller/player_controller.tscn" id="3_foj4y"] [ext_resource type="AudioStream" uid="uid://bbpo1hu35yer8" path="res://base-environments/youth_room/import/sounds/thunder.mp3" id="3_wcypa"] +[ext_resource type="Script" uid="uid://c281w7earok6w" path="res://base-environments/youth_room/crouch_volume.gd" id="3_x3dlb"] [ext_resource type="PackedScene" uid="uid://bnskiyx1sksww" path="res://logic-scenes/board/physics-board.tscn" id="4_gyjxx"] [ext_resource type="AudioStream" uid="uid://1tvopjmo6dp2" path="res://base-environments/youth_room/audio/Azure Studios - mgd-723687677.mp3" id="5_fe1yj"] [ext_resource type="PackedScene" uid="uid://citwb7f4dl3l1" path="res://thank-you.tscn" id="5_kts6y"] @@ -90,7 +91,7 @@ height = 1.0 [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_kewqg"] radius = 0.787239 -height = 3.19663 +height = 4.07459 [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_k4x40"] radius = 1.0352 @@ -1606,6 +1607,7 @@ script = ExtResource("1_aitp0") unique_name_in_owner = true process_mode = 4 transform = Transform3D(0.686123, 0, 0.727485, 0, 1, 0, -0.727485, 0, 0.686123, 0.63, 0, 0.925) +collision_mask = 3 [node name="colission" type="Node3D" parent="logic"] @@ -1716,11 +1718,12 @@ collision_mask = 2 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.170028, 0.244833, -0.0455775) shape = SubResource("CapsuleShape3D_f1g8m") -[node name="ladder_reset" type="Area3D" parent="logic/Bed and Ladders"] +[node name="bed_duck" type="Area3D" parent="logic/Bed and Ladders"] collision_layer = 2 collision_mask = 2 +script = ExtResource("3_x3dlb") -[node name="CollisionShape3D" type="CollisionShape3D" parent="logic/Bed and Ladders/ladder_reset"] +[node name="CollisionShape3D" type="CollisionShape3D" parent="logic/Bed and Ladders/bed_duck"] transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0.916567, 1.64525, -1.14479) shape = SubResource("CapsuleShape3D_kewqg") @@ -1733,12 +1736,13 @@ collision_mask = 2 transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0, 0, 0) shape = SubResource("CapsuleShape3D_k4x40") -[node name="bed_reset" type="Area3D" parent="logic/Bed and Ladders"] +[node name="bed_crouch" type="Area3D" parent="logic/Bed and Ladders"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.24356, 0, -0.796765) collision_layer = 2 collision_mask = 2 +script = ExtResource("3_x3dlb") -[node name="CollisionShape3D" type="CollisionShape3D" parent="logic/Bed and Ladders/bed_reset"] +[node name="CollisionShape3D" type="CollisionShape3D" parent="logic/Bed and Ladders/bed_crouch"] transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0.107988, 1.56575e-08, -0.358201) shape = SubResource("CapsuleShape3D_4q8vc") @@ -2432,10 +2436,8 @@ light_array = Array[Vector3]([Vector3(-0.545, 0.915, 1.035), Vector3(-0.47, 0.85 [connection signal="ui_exited" from="logic/PlayerController" to="SceneUI" method="hide"] [connection signal="body_entered" from="logic/Bed and Ladders/ladder_trigger" to="logic/PlayerController" method="_on_bed_enter"] [connection signal="body_entered" from="logic/Bed and Ladders/ladder_trigger" to="logic/Bed and Ladders/ladder" method="raise"] -[connection signal="body_exited" from="logic/Bed and Ladders/ladder_reset" to="logic/PlayerController" method="_on_bed_exit"] -[connection signal="body_exited" from="logic/Bed and Ladders/ladder_reset" to="logic/Bed and Ladders/ladder" method="reset"] +[connection signal="body_exited" from="logic/Bed and Ladders/bed_duck" to="logic/Bed and Ladders/ladder" method="reset"] [connection signal="body_entered" from="logic/Bed and Ladders/bed_enter" to="logic/PlayerController" method="_on_bed_enter"] -[connection signal="body_exited" from="logic/Bed and Ladders/bed_reset" to="logic/PlayerController" method="_on_bed_exit"] [connection signal="body_exited" from="logic/Bed and Ladders/reset_failover" to="logic/PlayerController" method="_on_bed_exit"] [connection signal="pressed" from="logic/UI/ending_button" to="logic/UI/ending_button" method="hide"] [connection signal="pressed" from="logic/UI/ending_button" to="logic/UI/ending" method="show"] diff --git a/src/logic-scenes/player_controller/player_controller.gd b/src/logic-scenes/player_controller/player_controller.gd index 2026e28..0d03a5d 100644 --- a/src/logic-scenes/player_controller/player_controller.gd +++ b/src/logic-scenes/player_controller/player_controller.gd @@ -52,7 +52,17 @@ var rotation_speed: Vector2 = Vector2.ZERO var current_mouse_rotation: Vector2 = Vector2.ZERO var noise: Noise = FastNoiseLite.new() -var crouched:bool = false +var crouched:bool = false: + set(set_crouching): + if is_node_ready(): + if set_crouching and not crouched: + $PlayerAnimationPlayer.play("crouch") + crouched = set_crouching + elif (not set_crouching and crouched) and not crouch_held: + if can_stand_up(): + $PlayerAnimationPlayer.play("stand_up") + crouch_toggled = false + crouched = set_crouching var on_crouch_cooldown:bool = false @onready var yaw: Node3D = $Yaw @@ -79,6 +89,7 @@ func _ready(): _handle_jitter(0) ui_prober.area_entered.connect(_on_ray_entered) ui_prober.area_exited.connect(_on_ray_exited) + $CrouchDetector.area_exited.connect(exit_crouch) func _process(_delta): @@ -209,6 +220,23 @@ func _input(event:InputEvent): if focus_ray.is_colliding(): focus_ray.get_collider().handle(event) get_viewport().set_input_as_handled() + + if event.is_action_pressed("crouch"): + cround_start_time = Time.get_unix_time_from_system() + crouch_held = true + if crouch_toggled: + crouched = false + #crouch_toggled is being released by crouch setter + else: + crouched = true + + if event.is_action_released("crouch"): + crouch_held = false + if Time.get_unix_time_from_system() > cround_start_time + 0.5: + if crouched: + crouched = false + else: + crouch_toggled = true func play_scene(id: int, _repeat): if id == Scenes.id.YOUTH_DRAEVEN: @@ -218,7 +246,11 @@ func scene_finished(_id, repeat: bool): if repeat: State.take_stage(self, true) +var crouch_held: bool = false +var crouch_toggled: bool = false +var cround_start_time: float = 0 func _on_bed_enter(_body): + return if not (crouched or on_crouch_cooldown): $PlayerAnimationPlayer.queue("crouch") var tween = create_tween() @@ -226,6 +258,7 @@ func _on_bed_enter(_body): crouched = true func _on_bed_exit(_body): + return if crouched: crouched = false $PlayerAnimationPlayer.queue("stand_up") @@ -235,3 +268,16 @@ func _on_bed_exit(_body): on_crouch_cooldown = true await get_tree().create_timer(1.0).timeout on_crouch_cooldown = false + +var inside_crouch_volume: Array[CrouchVolume] = [] + +#returns true, if the player character can stand upright. +func can_stand_up() -> bool: + for area: Area3D in $CrouchDetector.get_overlapping_areas(): + if area is CrouchVolume: + return false + return true + +func exit_crouch(body): + if body is Area3D: + crouched = false diff --git a/src/logic-scenes/player_controller/player_controller.tscn b/src/logic-scenes/player_controller/player_controller.tscn index bcf8aa7..16b68e8 100644 --- a/src/logic-scenes/player_controller/player_controller.tscn +++ b/src/logic-scenes/player_controller/player_controller.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=9 format=3 uid="uid://mkccbig41bqb"] +[gd_scene load_steps=10 format=3 uid="uid://mkccbig41bqb"] [ext_resource type="Script" uid="uid://bk618uyhghswx" path="res://logic-scenes/player_controller/player_controller.gd" id="1_0b4mi"] @@ -8,8 +8,9 @@ friction = 0.0 [sub_resource type="SeparationRayShape3D" id="SeparationRayShape3D_hpoj0"] length = 1.29801 -[sub_resource type="SphereShape3D" id="8"] -radius = 0.307047 +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_hpoj0"] +radius = 0.3 +height = 1.2 [sub_resource type="Animation" id="11"] length = 0.001 @@ -37,6 +38,42 @@ tracks/1/keys = { "update": 0, "values": [Vector3(0, 0, 0)] } +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("PlayerCollision:shape:height") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.2] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("PlayerCollision:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(0, 0.6, 0)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath(".:max_speed") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [3.0] +} [sub_resource type="Animation" id="12"] resource_name = "crouch" @@ -65,6 +102,42 @@ tracks/1/keys = { "update": 0, "values": [Vector3(0, 0, 0), Vector3(-30, 0, -10), Vector3(-20, 0, 3), Vector3(0, 0, 0), Vector3(0, 0, 0)] } +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("PlayerCollision:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 1.01), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector3(0, 0.6, 0), Vector3(0, 0.3, 0)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("PlayerCollision:shape:height") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 1.01), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [1.2, 0.6] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath(".:max_speed") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.69), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [3.0, 1.5] +} [sub_resource type="Animation" id="14"] resource_name = "stand_up" @@ -93,6 +166,42 @@ tracks/1/keys = { "update": 0, "values": [Vector3(0, 0, 0), Vector3(-4.79133, 3.17287, -3.71499), Vector3(24.594, -3.154, -4.794), Vector3(0.103793, -1.69217, -1.78899), Vector3(0, 0, 0)] } +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("PlayerCollision:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 1.01), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector3(0, 0.3, 0), Vector3(0, 0.6, 0)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("PlayerCollision:shape:height") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 1.03333), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.6, 1.2] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath(".:max_speed") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0.9, 2.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [1.5, 3.0] +} [sub_resource type="AnimationLibrary" id="AnimationLibrary_xbx3w"] _data = { @@ -101,9 +210,10 @@ _data = { &"stand_up": SubResource("14") } +[sub_resource type="SphereShape3D" id="SphereShape3D_hpoj0"] +radius = 0.3 + [node name="PlayerController" type="RigidBody3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.26517, 1.19209e-07, 1.70185) -collision_layer = 3 axis_lock_angular_x = true axis_lock_angular_y = true axis_lock_angular_z = true @@ -139,10 +249,18 @@ transform = Transform3D(-1, 0, -8.74229e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, shape = SubResource("SeparationRayShape3D_hpoj0") [node name="PlayerCollision" type="CollisionShape3D" parent="."] -transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.322255, 0) -shape = SubResource("8") +transform = Transform3D(1, 0, 0, 0, -1, 8.74228e-08, 0, -8.74228e-08, -1, 0, 0.6, 0) +shape = SubResource("CapsuleShape3D_hpoj0") [node name="PlayerAnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"": SubResource("AnimationLibrary_xbx3w") } + +[node name="CrouchDetector" type="Area3D" parent="."] +collision_layer = 3 +collision_mask = 3 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="CrouchDetector"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.35, 0) +shape = SubResource("SphereShape3D_hpoj0") diff --git a/src/project.godot b/src/project.godot index 096505b..4d89afe 100644 --- a/src/project.godot +++ b/src/project.godot @@ -176,6 +176,13 @@ option_memento_ui={ , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":2,"pressure":0.0,"pressed":false,"script":null) ] } +crouch={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194326,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":7,"pressure":0.0,"pressed":false,"script":null) +] +} [internationalization]