From 638495f4a39a900a852c1678d86ffa316beba70b Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Sat, 15 Mar 2025 06:54:35 -0400 Subject: [PATCH] wall kicks can work --- assets/textures/player/capri.png | Bin 5044 -> 5117 bytes assets/textures/player/capri.xcf | Bin 8435 -> 9588 bytes maps/level_z.tscn | 4 +- objects/player/player.gd | 22 +++++++++++ objects/player/player.tscn | 61 ++++++++++++++++++++++++++++++- 5 files changed, 83 insertions(+), 4 deletions(-) diff --git a/assets/textures/player/capri.png b/assets/textures/player/capri.png index 390564ca3c1658ded69f1973d631a37184cc5048..dfd1bf4ee7ee172e1865909de4f681939a8fa85a 100644 GIT binary patch delta 1162 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 Ee}oj$*Z=?k delta 454 zcmez3_1SSk0wdGL#O=(EnG9gS)&-$CwnJ#HUl3Y=5kd>eL1>XM2rae zWK5e}$Ra%XJSRI7YZHjc3Y2D@HTf{R_vW{(3mF;P;qvT@Ve;&|Hy>vI!N|A;D#yWi z0Vc)yV)F-19wsL4ZX2QZ64{1cRh1}y_ay#NDC zy};&989OHCdLGWrC*({R`GE|OItL(D0OHAi<-an?R0D%SnsGWf6lB(K)=>0e0RZ2n BT4DeI 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"]