From 2d4b6105b67f79040c7e297868636aaaabff93b4 Mon Sep 17 00:00:00 2001 From: KirbyKidJ <70983335+KirbyKid256@users.noreply.github.com> Date: Thu, 25 Sep 2025 17:47:11 -0700 Subject: [PATCH 1/3] All-Stars Pose at Level End This adds a new and optional animation for Characters called `PoseDoor`. When a character uses this animation, they stop at the entrance of the castle door to strike a pose like in All-Stars. --- Scenes/Prefabs/LevelObjects/EndFinalCastle.tscn | 4 ++++ Scenes/Prefabs/LevelObjects/EndSmallCastle.tscn | 4 ++++ Scripts/Classes/Entities/Player.gd | 3 +++ Scripts/Classes/States/Player/LevelExit.gd | 1 + Scripts/Parts/EndCastle.gd | 12 ++++++++++++ 5 files changed, 24 insertions(+) diff --git a/Scenes/Prefabs/LevelObjects/EndFinalCastle.tscn b/Scenes/Prefabs/LevelObjects/EndFinalCastle.tscn index 9dafc8c..c8df1dc 100644 --- a/Scenes/Prefabs/LevelObjects/EndFinalCastle.tscn +++ b/Scenes/Prefabs/LevelObjects/EndFinalCastle.tscn @@ -175,6 +175,10 @@ collision_mask = 0 position = Vector2(21, -9) shape = SubResource("RectangleShape2D_6fi1c") +[node name="PosePoint" type="Node2D" parent="Overlay/PlayerDetection"] +unique_name_in_owner = true +position = Vector2(-16, 0) + [node name="Overlay2" type="TileMapLayer" parent="Overlay"] show_behind_parent = true tile_map_data = PackedByteArray("AAAEAAAAAAAHABQAAAAEAAEAAAAHABQAAAAEAAIAAAAHABQAAAAEAAMAAAAHABQAAAAFAAAAAAAHABQAAAAFAAEAAAAHABQAAAAFAAIAAAAHABQAAAAFAAMAAAAHABQAAAAIAAAAAAAHABQAAAAIAAEAAAAHABQAAAAIAAIAAAAHABQAAAAIAAMAAAAHABQAAAAJAAAAAAAHABQAAAAJAAEAAAAHABQAAAAJAAIAAAAHABQAAAAJAAMAAAAHABQAAAA=") diff --git a/Scenes/Prefabs/LevelObjects/EndSmallCastle.tscn b/Scenes/Prefabs/LevelObjects/EndSmallCastle.tscn index 1e3c089..dea2b44 100644 --- a/Scenes/Prefabs/LevelObjects/EndSmallCastle.tscn +++ b/Scenes/Prefabs/LevelObjects/EndSmallCastle.tscn @@ -155,6 +155,10 @@ collision_mask = 0 position = Vector2(21, -9) shape = SubResource("RectangleShape2D_4yifo") +[node name="PosePoint" type="Node2D" parent="Overlay/PlayerDetection"] +unique_name_in_owner = true +position = Vector2(-16, 0) + [node name="OverlaySprite" type="Sprite2D" parent="."] visible = false z_index = 10 diff --git a/Scripts/Classes/Entities/Player.gd b/Scripts/Classes/Entities/Player.gd index 87bc6cd..41d7795 100644 --- a/Scripts/Classes/Entities/Player.gd +++ b/Scripts/Classes/Entities/Player.gd @@ -74,6 +74,7 @@ var pipe_move_direction := 1 var stomp_combo := 0 var is_invincible := false +var is_posing := false const COMBO_VALS := [100, 200, 400, 500, 800, 1000, 2000, 4000, 5000, 8000, null] @@ -82,6 +83,8 @@ const COMBO_VALS := [100, 200, 400, 500, 800, 1000, 2000, 4000, 5000, 8000, null @onready var normal_state: Node = $States/Normal @export var auto_death_pit := true +var can_pose := true + var can_hurt := true var in_water := false diff --git a/Scripts/Classes/States/Player/LevelExit.gd b/Scripts/Classes/States/Player/LevelExit.gd index 245ba84..16ab42e 100644 --- a/Scripts/Classes/States/Player/LevelExit.gd +++ b/Scripts/Classes/States/Player/LevelExit.gd @@ -7,6 +7,7 @@ func enter(_msg := {}) -> void: player.get_node("CameraCenterJoint/RightWall").set_collision_layer_value(1, false) func physics_update(delta: float) -> void: + if player.is_posing: return player.input_direction = 1 player.can_run = false player.normal_state.handle_movement(delta) diff --git a/Scripts/Parts/EndCastle.gd b/Scripts/Parts/EndCastle.gd index ca9db1d..a763b4d 100644 --- a/Scripts/Parts/EndCastle.gd +++ b/Scripts/Parts/EndCastle.gd @@ -39,6 +39,18 @@ func _process(_delta: float) -> void: if get_node_or_null("Wall") != null: %Wall.visible = show_walls +func _physics_process(_delta: float) -> void: + for i: Player in get_tree().get_nodes_in_group("Players"): + if not i.sprite.sprite_frames.has_animation("PoseDoor"): i.can_pose = false; continue + if i.can_pose and i.global_position >= %PosePoint.global_position and i.sprite.sprite_frames.has_animation("PoseDoor"): + i.is_posing = true; i.can_pose = false + i.play_animation("PoseDoor") + i.sprite.animation_finished.connect(on_pose_finished.bind(i)) + i.sprite.animation_looped.connect(on_pose_finished.bind(i)) + +func on_pose_finished(player: Player) -> void: + player.is_posing = false + func on_music_finished() -> void: do_sequence() From a7eeab14a3f9f4c3139f00bfebe91e6508b027e4 Mon Sep 17 00:00:00 2001 From: KirbyKidJ <70983335+KirbyKid256@users.noreply.github.com> Date: Thu, 25 Sep 2025 17:57:26 -0700 Subject: [PATCH 2/3] I realized I didn't need an extra Node2D --- Scenes/Prefabs/LevelObjects/EndFinalCastle.tscn | 4 ---- Scenes/Prefabs/LevelObjects/EndSmallCastle.tscn | 4 ---- Scripts/Parts/EndCastle.gd | 2 +- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/Scenes/Prefabs/LevelObjects/EndFinalCastle.tscn b/Scenes/Prefabs/LevelObjects/EndFinalCastle.tscn index c8df1dc..9dafc8c 100644 --- a/Scenes/Prefabs/LevelObjects/EndFinalCastle.tscn +++ b/Scenes/Prefabs/LevelObjects/EndFinalCastle.tscn @@ -175,10 +175,6 @@ collision_mask = 0 position = Vector2(21, -9) shape = SubResource("RectangleShape2D_6fi1c") -[node name="PosePoint" type="Node2D" parent="Overlay/PlayerDetection"] -unique_name_in_owner = true -position = Vector2(-16, 0) - [node name="Overlay2" type="TileMapLayer" parent="Overlay"] show_behind_parent = true tile_map_data = PackedByteArray("AAAEAAAAAAAHABQAAAAEAAEAAAAHABQAAAAEAAIAAAAHABQAAAAEAAMAAAAHABQAAAAFAAAAAAAHABQAAAAFAAEAAAAHABQAAAAFAAIAAAAHABQAAAAFAAMAAAAHABQAAAAIAAAAAAAHABQAAAAIAAEAAAAHABQAAAAIAAIAAAAHABQAAAAIAAMAAAAHABQAAAAJAAAAAAAHABQAAAAJAAEAAAAHABQAAAAJAAIAAAAHABQAAAAJAAMAAAAHABQAAAA=") diff --git a/Scenes/Prefabs/LevelObjects/EndSmallCastle.tscn b/Scenes/Prefabs/LevelObjects/EndSmallCastle.tscn index dea2b44..1e3c089 100644 --- a/Scenes/Prefabs/LevelObjects/EndSmallCastle.tscn +++ b/Scenes/Prefabs/LevelObjects/EndSmallCastle.tscn @@ -155,10 +155,6 @@ collision_mask = 0 position = Vector2(21, -9) shape = SubResource("RectangleShape2D_4yifo") -[node name="PosePoint" type="Node2D" parent="Overlay/PlayerDetection"] -unique_name_in_owner = true -position = Vector2(-16, 0) - [node name="OverlaySprite" type="Sprite2D" parent="."] visible = false z_index = 10 diff --git a/Scripts/Parts/EndCastle.gd b/Scripts/Parts/EndCastle.gd index a763b4d..d923f21 100644 --- a/Scripts/Parts/EndCastle.gd +++ b/Scripts/Parts/EndCastle.gd @@ -42,7 +42,7 @@ func _process(_delta: float) -> void: func _physics_process(_delta: float) -> void: for i: Player in get_tree().get_nodes_in_group("Players"): if not i.sprite.sprite_frames.has_animation("PoseDoor"): i.can_pose = false; continue - if i.can_pose and i.global_position >= %PosePoint.global_position and i.sprite.sprite_frames.has_animation("PoseDoor"): + if i.can_pose and i.global_position >= global_position and i.sprite.sprite_frames.has_animation("PoseDoor"): i.is_posing = true; i.can_pose = false i.play_animation("PoseDoor") i.sprite.animation_finished.connect(on_pose_finished.bind(i)) From db23384a0cd24ece733c22adcdb9e8c9daa9032d Mon Sep 17 00:00:00 2001 From: KirbyKidJ <70983335+KirbyKid256@users.noreply.github.com> Date: Thu, 25 Sep 2025 18:55:16 -0700 Subject: [PATCH 3/3] Fixed position offsetting bug --- Scripts/Parts/EndCastle.gd | 1 + 1 file changed, 1 insertion(+) diff --git a/Scripts/Parts/EndCastle.gd b/Scripts/Parts/EndCastle.gd index d923f21..3ece9a0 100644 --- a/Scripts/Parts/EndCastle.gd +++ b/Scripts/Parts/EndCastle.gd @@ -44,6 +44,7 @@ func _physics_process(_delta: float) -> void: if not i.sprite.sprite_frames.has_animation("PoseDoor"): i.can_pose = false; continue if i.can_pose and i.global_position >= global_position and i.sprite.sprite_frames.has_animation("PoseDoor"): i.is_posing = true; i.can_pose = false + i.global_position = global_position i.play_animation("PoseDoor") i.sprite.animation_finished.connect(on_pose_finished.bind(i)) i.sprite.animation_looped.connect(on_pose_finished.bind(i))