mirror of
https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
synced 2025-12-06 03:30:22 -08:00
Fixes an issue with the DoorPose animation and detection I added where if there was another End Castle behind you, you'd get sent back in the level. This is primarily an issue for Custom Levels, and is extremely noticeable when reloading resource packs. And in the video below, it also broke the Door Pose animation in the level. This PR adds an extra check by using a collision shape to make sure the player is in the right area before applying the positional changes.
134 lines
4.1 KiB
GDScript
134 lines
4.1 KiB
GDScript
extends Node2D
|
|
|
|
var time_save := 0
|
|
|
|
signal finished_sequence
|
|
const FIREWORK = preload("res://Scenes/Prefabs/Particles/Firework.tscn")
|
|
|
|
var tally_finished := false
|
|
var music_finished := false
|
|
var tree = null
|
|
var show_walls := false
|
|
var doing_sequence := false
|
|
|
|
var can_transition := false
|
|
|
|
static var is_transitioning := false
|
|
|
|
func _ready() -> void:
|
|
await Global.level_complete_begin
|
|
$Overlay.show()
|
|
$OverlaySprite.show()
|
|
$Overlay/PlayerDetection.set_collision_layer_value(1, true)
|
|
Global.score_tally_finished.connect(on_tally_finished)
|
|
if Global.current_game_mode == Global.GameMode.BOO_RACE:
|
|
get_tree().create_timer(3.5, false).timeout.connect(on_music_finished)
|
|
else:
|
|
get_tree().create_timer(5.5, false).timeout.connect(on_music_finished)
|
|
time_save = Global.time
|
|
|
|
func update_cam_limit() -> void:
|
|
$CameraRightLimit._enter_tree()
|
|
|
|
func _process(_delta: float) -> void:
|
|
$Overlay.modulate.a = int($SmallCastleVisual.use_sprite == false)
|
|
if Global.level_editor != null && scene_file_path == "res://Scenes/Prefabs/LevelObjects/EndFinalCastle.tscn":
|
|
var is_smbs: bool = Global.current_campaign == "SMBS"
|
|
$SmallCastleVisual.visible = !is_smbs
|
|
$SmallCastleVisual2.visible = is_smbs
|
|
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 i.state_machine.get_state() == "LevelExit" and i.can_pose and $PlayerDetection.is_player_in_area() 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))
|
|
|
|
func on_pose_finished(player: Player) -> void:
|
|
player.is_posing = false
|
|
player.z_index = -2
|
|
|
|
func on_music_finished() -> void:
|
|
do_sequence()
|
|
|
|
func on_tally_finished() -> void:
|
|
$FlagJoint/Flag/AnimationPlayer.play("Raise")
|
|
|
|
func do_sequence() -> void:
|
|
if Global.current_game_mode != Global.GameMode.BOO_RACE:
|
|
await get_tree().create_timer(1, false).timeout
|
|
if Global.current_campaign == "SMBLL":
|
|
await do_lost_levels_firework_check()
|
|
else:
|
|
await do_firework_check()
|
|
await get_tree().create_timer(1, false).timeout
|
|
if is_transitioning == false:
|
|
is_transitioning = true
|
|
exit_level()
|
|
|
|
func do_firework_check() -> void:
|
|
var digit = time_save % 10
|
|
if [1, 3, 6].has(digit):
|
|
await show_fireworks(digit)
|
|
return
|
|
|
|
func do_lost_levels_firework_check() -> void:
|
|
var coin_digit = Global.coins % 10
|
|
var time_digit = time_save % 10
|
|
if coin_digit == time_digit:
|
|
if coin_digit % 2 == 0:
|
|
await show_fireworks(6)
|
|
else:
|
|
await show_fireworks(3)
|
|
if Global.coins % 11 == 0:
|
|
AudioManager.play_sfx("1_up", global_position)
|
|
if [Global.GameMode.CHALLENGE, Global.GameMode.BOO_RACE].has(Global.current_game_mode) or Settings.file.difficulty.inf_lives:
|
|
Global.score += 2000
|
|
$ScoreNoteSpawner.spawn_note(2000)
|
|
else:
|
|
Global.lives += 1
|
|
spawn_one_up_note()
|
|
|
|
const ONE_UP_NOTE = preload("uid://dopxwjj37gu0l")
|
|
|
|
func spawn_one_up_note() -> void:
|
|
var note = ONE_UP_NOTE.instantiate()
|
|
note.global_position = global_position + Vector2(0, -16)
|
|
owner.add_sibling(note)
|
|
|
|
func _exit_tree() -> void:
|
|
is_transitioning = false
|
|
|
|
func show_fireworks(amount := 0) -> void:
|
|
for i in amount:
|
|
spawn_firework()
|
|
await get_tree().create_timer(0.5, false).timeout
|
|
|
|
func spawn_firework() -> void:
|
|
var node = FIREWORK.instantiate()
|
|
Global.score += 500
|
|
node.position.x = randf_range(-48, 48)
|
|
node.position.y = randf_range(-112, -150)
|
|
add_child(node)
|
|
AudioManager.play_sfx("firework", node.global_position)
|
|
|
|
|
|
func exit_level() -> void:
|
|
await Global.frame_rule
|
|
match Global.current_game_mode:
|
|
Global.GameMode.MARATHON_PRACTICE:
|
|
Global.reset_values()
|
|
Global.open_marathon_results()
|
|
Global.GameMode.CUSTOM_LEVEL:
|
|
Global.transition_to_scene("res://Scenes/Levels/CustomLevelMenu.tscn")
|
|
Global.GameMode.LEVEL_EDITOR:
|
|
Global.level_editor.stop_testing()
|
|
_:
|
|
if Global.current_campaign == "SMBANN":
|
|
Global.open_disco_results()
|
|
else:
|
|
Global.current_level.transition_to_next_level()
|