diff --git a/assets/textures/player/capri.png b/assets/textures/player/capri.png index 390564c..dfd1bf4 100644 Binary files a/assets/textures/player/capri.png and b/assets/textures/player/capri.png differ diff --git a/assets/textures/player/capri.xcf b/assets/textures/player/capri.xcf index 720dce9..6cd12ef 100644 Binary files a/assets/textures/player/capri.xcf and b/assets/textures/player/capri.xcf differ diff --git a/maps/level_z.tscn b/maps/level_z.tscn index 8d2d0de..2d295e5 100644 --- a/maps/level_z.tscn +++ b/maps/level_z.tscn @@ -24,11 +24,11 @@ texture = ExtResource("1_h5jcm") [node name="TileMap" type="TileMapLayer" parent="."] z_index = -100 use_parent_material = true -tile_map_data = PackedByteArray("AAAAAAsAAAAAAAAAAAABAAsAAAAAAAAAAAACAAsAAAAAAAAAAAAHAAsAAAAAAAAAAAAIAAsAAAAAAAAAAAAJAAsAAAAAAAAAAAAKAAsAAAAAAAAAAAALAAsAAAAAAAAAAAANAAsAAAAAAAAAAAAOAAsAAAAAAAAAAAAPAAsAAAAAAAAAAAAQAAsAAAAAAAAAAAARAAsAAAAAAAAAAAADAAsAAAAAAAAAAAAEAAsAAAAAAAAAAAAFAAsAAAAAAAAAAAAGAAsAAAAAAAAAAAAMAAsAAAAAAAAAAAAFAAoAAAAAAAAAAAAGAAoAAAAAAAAAAAAGAAkAAAAAAAAAAAAHAAkAAAAAAAAAAAAIAAkAAAAAAAAAAAAJAAkAAAAAAAAAAAAKAAkAAAAAAAAAAAALAAkAAAAAAAAAAAAMAAkAAAAAAAAAAAALAAoAAAAAAAAAAAAKAAoAAAAAAAAAAAAJAAoAAAAAAAAAAAAIAAoAAAAAAAAAAAAHAAoAAAAAAAAAAAAMAAoAAAAAAAAAAAANAAoAAAAAAAAAAAAOAAoAAAAAAAAAAAAPAAoAAAAAAAAAAAAPAAkAAAAAAAAAAAAQAAkAAAAAAAAAAAAQAAoAAAAAAAAAAAARAAkAAAAAAAAAAAARAAoAAAAAAAAAAAAFAAkAAAAAAAAAAAAEAAkAAAAAAAAAAAADAAkAAAAAAAAAAAACAAkAAAAAAAAAAAABAAkAAAAAAAAAAAABAAoAAAAAAAAAAAACAAoAAAAAAAAAAAADAAoAAAAAAAAAAAAEAAoAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAkAAAAAAAAAAAABAAgAAAAAAAAAAAABAAcAAAAAAAAAAAABAAYAAAAAAAAAAAABAAUAAAAAAAAAAAABAAQAAAAAAAAAAAABAAMAAAAAAAAAAAABAAIAAAAAAAAAAAANAAkAAAAAAAAAAAAOAAkAAAAAAAAAAAA=") +tile_map_data = PackedByteArray("AAAAAAsAAAAAAAAAAAABAAsAAAAAAAAAAAACAAsAAAAAAAAAAAAHAAsAAAAAAAAAAAAIAAsAAAAAAAAAAAAJAAsAAAAAAAAAAAAKAAsAAAAAAAAAAAALAAsAAAAAAAAAAAANAAsAAAAAAAAAAAAOAAsAAAAAAAAAAAAPAAsAAAAAAAAAAAAQAAsAAAAAAAAAAAARAAsAAAAAAAAAAAADAAsAAAAAAAAAAAAEAAsAAAAAAAAAAAAFAAsAAAAAAAAAAAAGAAsAAAAAAAAAAAAMAAsAAAAAAAAAAAAFAAoAAAAAAAAAAAAGAAoAAAAAAAAAAAAGAAkAAAAAAAAAAAAHAAkAAAAAAAAAAAAIAAkAAAAAAAAAAAAJAAkAAAAAAAAAAAAKAAkAAAAAAAAAAAALAAkAAAAAAAAAAAAMAAkAAAAAAAAAAAALAAoAAAAAAAAAAAAKAAoAAAAAAAAAAAAJAAoAAAAAAAAAAAAIAAoAAAAAAAAAAAAHAAoAAAAAAAAAAAAMAAoAAAAAAAAAAAANAAoAAAAAAAAAAAAOAAoAAAAAAAAAAAAPAAoAAAAAAAAAAAAPAAkAAAAAAAAAAAAQAAkAAAAAAAAAAAAQAAoAAAAAAAAAAAARAAkAAAAAAAAAAAARAAoAAAAAAAAAAAAFAAkAAAAAAAAAAAAEAAkAAAAAAAAAAAADAAkAAAAAAAAAAAACAAkAAAAAAAAAAAABAAkAAAAAAAAAAAABAAoAAAAAAAAAAAACAAoAAAAAAAAAAAADAAoAAAAAAAAAAAAEAAoAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAkAAAAAAAAAAAABAAgAAAAAAAAAAAABAAcAAAAAAAAAAAABAAYAAAAAAAAAAAABAAUAAAAAAAAAAAABAAQAAAAAAAAAAAABAAMAAAAAAAAAAAABAAIAAAAAAAAAAAANAAkAAAAAAAAAAAAOAAkAAAAAAAAAAAAIAAgAAAAAAAAAAAAIAAcAAAAAAAAAAAAJAAcAAAAAAAAAAAAJAAgAAAAAAAAAAAA=") tile_set = ExtResource("2_dj7w1") [node name="Lashy" parent="." instance=ExtResource("4_gykx6")] -position = Vector2(144, 112) +position = Vector2(88, 40) launch_power = 300.0 idle_radius = 6.0 diff --git a/objects/player/player.gd b/objects/player/player.gd index 0c7ac0b..20dcd43 100644 --- a/objects/player/player.gd +++ b/objects/player/player.gd @@ -7,6 +7,8 @@ extends CharacterBody2D @export var max_run_speed: float @export var turn_acceleration: float @export var stopping_force: float +@export var bonk_speed_threshold: float +@export var bonk_power: float @export_group("Air Movement") @export var gravity: float @@ -39,6 +41,7 @@ var input_dir: Vector2 = Vector2.ZERO: var _last_velocity: Vector2 = Vector2.ZERO var _splat_normal: Vector2 = Vector2.ZERO +var _bonk_cancel_velocity: Vector2 = Vector2.ZERO func _physics_process(delta: float) -> void: @@ -94,6 +97,25 @@ func _apply_turn_acceleration(delta: float) -> void: #endregion +#region Bonk +func _check_for_bonk(_delta: float) -> void: + if absf(velocity.x) >= bonk_speed_threshold: + wall_cast.force_shapecast_update() + if wall_cast.is_colliding(): + state_chart.send_event(&"bonked") + +func _enter_bonk() -> void: + _bonk_cancel_velocity = velocity * Vector2(-1.0, 1.0) # horizontally inverted velocity + velocity = Vector2.ZERO + +func _cancel_bonk() -> void: + velocity = _bonk_cancel_velocity + +func _apply_bonk() -> void: + velocity.x = signf(_bonk_cancel_velocity.x) * bonk_power +#endregion + + #region Falling func _apply_gravity(delta: float) -> void: if input_dir.y > 0.0: diff --git a/objects/player/player.tscn b/objects/player/player.tscn index 54c0aaa..7bd3388 100644 --- a/objects/player/player.tscn +++ b/objects/player/player.tscn @@ -117,6 +117,8 @@ run_acceleration = 200.0 max_run_speed = 100.0 turn_acceleration = 300.0 stopping_force = 250.0 +bonk_speed_threshold = 75.0 +bonk_power = 80.0 gravity = 450.0 fast_gravity = 675.0 jump_power = 180.0 @@ -144,7 +146,6 @@ texture = ExtResource("3_trcll") offset = Vector2(0, -2) hframes = 8 vframes = 4 -frame = 7 region_rect = Rect2(0, 0, 64, 64) [node name="Idle" type="Node" parent="Graphics/Sprite"] @@ -154,6 +155,14 @@ script = ExtResource("4_bsdw5") script = ExtResource("4_bsdw5") first_frame = Vector2i(1, 0) +[node name="Bonk" type="Node" parent="Graphics/Sprite"] +script = ExtResource("4_bsdw5") +first_frame = Vector2i(3, 0) + +[node name="StunnedFall" type="Node" parent="Graphics/Sprite"] +script = ExtResource("4_bsdw5") +first_frame = Vector2i(3, 2) + [node name="Skid" type="Node" parent="Graphics/Sprite"] script = ExtResource("4_bsdw5") first_frame = Vector2i(2, 0) @@ -273,6 +282,12 @@ editor_description = "Player is standing on a floor." script = ExtResource("6_jnxnd") initial_state = NodePath("Standing") +[node name="on Bonked" type="Node" parent="StateChart/Root/Grounded"] +script = ExtResource("7_rgjdc") +to = NodePath("../../Floating/Bonk") +event = &"bonked" +delay_in_seconds = "0.0" + [node name="on JumpPressed" type="Node" parent="StateChart/Root/Grounded"] script = ExtResource("7_rgjdc") to = NodePath("../../Airborne/Jumping") @@ -381,6 +396,12 @@ to = NodePath("../../../Floating/ChompVault") event = &"corner_detected" delay_in_seconds = "0.0" +[node name="on Bonked" type="Node" parent="StateChart/Root/Airborne/Falling"] +script = ExtResource("7_rgjdc") +to = NodePath("../../../Floating/Bonk") +event = &"bonked" +delay_in_seconds = "0.0" + [node name="Jumping" type="Node" parent="StateChart/Root/Airborne"] editor_description = "Player has jumped and is rising." script = ExtResource("6_jnxnd") @@ -399,6 +420,12 @@ to = NodePath("../../../Floating/ChompVault") event = &"corner_detected" delay_in_seconds = "0.0" +[node name="on Bonked" type="Node" parent="StateChart/Root/Airborne/Jumping"] +script = ExtResource("7_rgjdc") +to = NodePath("../../../Floating/Bonk") +event = &"bonked" +delay_in_seconds = "0.0" + [node name="FromGround" type="Node" parent="StateChart/Root/Airborne/Jumping"] script = ExtResource("10_mvu25") @@ -416,6 +443,15 @@ to = NodePath("../../../Floating/Splat") event = &"splatted" delay_in_seconds = "0.0" +[node name="StunnedFalling" type="Node" parent="StateChart/Root/Airborne"] +script = ExtResource("10_mvu25") + +[node name="on Bonked" type="Node" parent="StateChart/Root/Airborne/StunnedFalling"] +script = ExtResource("7_rgjdc") +to = NodePath("../../../Floating/Bonk") +event = &"bonked" +delay_in_seconds = "0.0" + [node name="Floating" type="Node" parent="StateChart/Root"] script = ExtResource("6_jnxnd") initial_state = NodePath("UnSplat") @@ -447,7 +483,7 @@ to = NodePath("../../../Airborne/Falling") event = &"grab_pressed" delay_in_seconds = "0.0" -[node name="on TimeOut" type="Node" parent="StateChart/Root/Floating/Splat"] +[node name="on Timeout" type="Node" parent="StateChart/Root/Floating/Splat"] script = ExtResource("7_rgjdc") to = NodePath("../../UnSplat") delay_in_seconds = "0.75" @@ -461,9 +497,24 @@ script = ExtResource("7_rgjdc") to = NodePath("../../../Airborne/Falling") delay_in_seconds = "0.25" +[node name="Bonk" type="Node" parent="StateChart/Root/Floating"] +script = ExtResource("10_mvu25") + +[node name="on Timeout" type="Node" parent="StateChart/Root/Floating/Bonk"] +script = ExtResource("7_rgjdc") +to = NodePath("../../../Airborne/StunnedFalling") +delay_in_seconds = "0.2" + +[node name="on JumpPressed" type="Node" parent="StateChart/Root/Floating/Bonk"] +script = ExtResource("7_rgjdc") +to = NodePath("../../../Airborne/Jumping/FromGround") +event = &"jump_pressed" +delay_in_seconds = "0.0" + [connection signal="finished" from="Graphics/Sprite/ChompVault" to="StateChart/Root/Floating/ChompVault/on AnimationFinished" method="take"] [connection signal="taken" from="StateChart/Root/on Killed" to="." method="_reset_position"] [connection signal="taken" from="StateChart/Root/on Killed" to="Sounds/Death" method="play"] +[connection signal="state_physics_processing" from="StateChart/Root/Grounded" to="." method="_check_for_bonk"] [connection signal="state_entered" from="StateChart/Root/Grounded/Standing/Idle" to="Graphics/Sprite/Idle" method="play"] [connection signal="state_entered" from="StateChart/Root/Grounded/Standing/Stopping" to="Graphics/Sprite/Run" method="play"] [connection signal="state_physics_processing" from="StateChart/Root/Grounded/Standing/Stopping" to="." method="_slow_to_stop"] @@ -475,6 +526,7 @@ delay_in_seconds = "0.25" [connection signal="state_physics_processing" from="StateChart/Root/Grounded/Turning" to="." method="_apply_turn_acceleration"] [connection signal="state_physics_processing" from="StateChart/Root/Airborne" to="." method="_apply_gravity"] [connection signal="state_physics_processing" from="StateChart/Root/Airborne" to="." method="_check_for_corner"] +[connection signal="state_physics_processing" from="StateChart/Root/Airborne" to="." method="_check_for_bonk"] [connection signal="state_entered" from="StateChart/Root/Airborne/Falling" to="Graphics/Sprite/Fall" method="play"] [connection signal="state_entered" from="StateChart/Root/Airborne/Jumping" to="Graphics/Sprite/Jump" method="play"] [connection signal="state_entered" from="StateChart/Root/Airborne/Jumping/FromGround" to="." method="_start_jump"] @@ -486,6 +538,7 @@ delay_in_seconds = "0.25" [connection signal="state_physics_processing" from="StateChart/Root/Airborne/Missile" to="." method="_check_for_splat"] [connection signal="state_physics_processing" from="StateChart/Root/Airborne/Missile" to="." method="_face_towards_velocity"] [connection signal="taken" from="StateChart/Root/Airborne/Missile/on Splatted" to="Sounds/HitWall" method="play"] +[connection signal="state_entered" from="StateChart/Root/Airborne/StunnedFalling" to="Graphics/Sprite/StunnedFall" method="play"] [connection signal="state_entered" from="StateChart/Root/Floating/ChompVault" to="." method="_start_chomp_vault"] [connection signal="state_entered" from="StateChart/Root/Floating/ChompVault" to="Graphics/Sprite/ChompVault" method="play"] [connection signal="taken" from="StateChart/Root/Floating/ChompVault/on AnimationFinished" to="." method="_end_chomp_vault"] @@ -494,3 +547,7 @@ delay_in_seconds = "0.25" [connection signal="taken" from="StateChart/Root/Floating/Splat/on GrabPressed" to="." method="_restore_graphics_rotation"] [connection signal="state_entered" from="StateChart/Root/Floating/UnSplat" to="Graphics/Sprite/UnSplat" method="play"] [connection signal="state_exited" from="StateChart/Root/Floating/UnSplat" to="." method="_restore_graphics_rotation"] +[connection signal="state_entered" from="StateChart/Root/Floating/Bonk" to="." method="_enter_bonk"] +[connection signal="state_entered" from="StateChart/Root/Floating/Bonk" to="Graphics/Sprite/Bonk" method="play"] +[connection signal="taken" from="StateChart/Root/Floating/Bonk/on Timeout" to="." method="_apply_bonk"] +[connection signal="taken" from="StateChart/Root/Floating/Bonk/on JumpPressed" to="." method="_cancel_bonk"]