From 8a62b37798531ef33a8ed247a5827fe047386d85 Mon Sep 17 00:00:00 2001 From: jdaster64 Date: Tue, 23 Sep 2025 15:56:25 -0400 Subject: [PATCH 1/4] shell kick scoring changes, duplicate 10k fix --- Scripts/Classes/Entities/ShellClass.gd | 45 +++++++++++++++++--------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/Scripts/Classes/Entities/ShellClass.gd b/Scripts/Classes/Entities/ShellClass.gd index a4f950a..4406e19 100644 --- a/Scripts/Classes/Entities/ShellClass.gd +++ b/Scripts/Classes/Entities/ShellClass.gd @@ -15,7 +15,7 @@ var can_kick := false var player: Player = null -const COMBO_VALS := [500, 800, 1000, 2000, 4000, 5000, 8000, null] +const COMBO_VALS := [100, 200, 400, 500, 800, 1000, 2000, 4000, 5000, 8000, null] var wake_meter := 0.0 ## SMB1R IS WOKE @@ -40,7 +40,7 @@ func on_player_stomped_on(stomped_player: Player) -> void: return if not moving: direction = sign(global_position.x - stomped_player.global_position.x) - kick() + kick(stomped_player) else: DiscoLevel.combo_meter += 10 moving = false @@ -59,18 +59,41 @@ func on_player_hit(hit_player: Player) -> void: return if not moving: direction = sign(global_position.x - hit_player.global_position.x ) - kick() + kick(hit_player) else: hit_player.damage() + +func award_score(award_level: int) -> void: + if award_level >= 10: + if Global.current_game_mode == Global.GameMode.CHALLENGE or Settings.file.difficulty.inf_lives: + $ScoreNoteSpawner.spawn_note(10000) + else: + AudioManager.play_global_sfx("1_up") + Global.lives += 1 + $ScoreNoteSpawner.spawn_one_up_note() + else: + $ScoreNoteSpawner.spawn_note(COMBO_VALS[award_level]) + +func get_kick_award(hit_player: Player) -> int: + var award_level = hit_player.stomp_combo + 2 + if wake_meter > 6.96: + award_level = 9 + elif wake_meter > 6.75: + award_level = 5 + elif wake_meter > 6.25: + award_level = 3 + if award_level > 10: + award_level = 10 + return award_level -func kick() -> void: +func kick(hit_player: Player) -> void: update_hitbox() DiscoLevel.combo_meter += 25 moving = true if can_air_kick: $ScoreNoteSpawner.spawn_note(8000) else: - $ScoreNoteSpawner.spawn_note(400) + award_score(get_kick_award(hit_player)) AudioManager.play_sfx("kick", global_position) func _physics_process(delta: float) -> void: @@ -105,16 +128,8 @@ func handle_block_collision() -> void: i.shell_block_hit.emit(self) func add_combo() -> void: - if combo >= 7: - if Global.current_game_mode == Global.GameMode.CHALLENGE or Settings.file.difficulty.inf_lives: - Global.score += 10000 - $ScoreNoteSpawner.spawn_note(10000) - else: - AudioManager.play_global_sfx("1_up") - Global.lives += 1 - $ScoreNoteSpawner.spawn_one_up_note() - else: - $ScoreNoteSpawner.spawn_note(COMBO_VALS[combo]) + award_score(combo + 3) + if combo < 7: combo += 1 func update_hitbox() -> void: From beea267f991fc11e99b6c28c58cf8136a44e8272 Mon Sep 17 00:00:00 2001 From: jdaster64 Date: Wed, 24 Sep 2025 00:54:44 -0400 Subject: [PATCH 2/4] Suppress stomp points shortly after a kick --- Scripts/Classes/Entities/Player.gd | 25 ++++++++++++------------ Scripts/Classes/Entities/ShellClass.gd | 27 ++++++++++++++++++-------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/Scripts/Classes/Entities/Player.gd b/Scripts/Classes/Entities/Player.gd index 07cf85e..3c7a5bb 100644 --- a/Scripts/Classes/Entities/Player.gd +++ b/Scripts/Classes/Entities/Player.gd @@ -363,9 +363,9 @@ func is_actually_on_ceiling() -> bool: return true return false -func enemy_bounce_off(add_combo := true) -> void: +func enemy_bounce_off(add_combo := true, award_score := true) -> void: if add_combo: - add_stomp_combo() + add_stomp_combo(award_score) jump_cancelled = not Global.player_action_pressed("jump", player_id) await get_tree().physics_frame if Global.player_action_pressed("jump", player_id): @@ -375,18 +375,19 @@ func enemy_bounce_off(add_combo := true) -> void: else: velocity.y = -200 -func add_stomp_combo() -> void: +func add_stomp_combo(award_score := true) -> void: if stomp_combo >= 10: - if Global.current_game_mode == Global.GameMode.CHALLENGE or Settings.file.difficulty.inf_lives: - Global.score += 10000 - score_note_spawner.spawn_note(10000) - else: - Global.lives += 1 - AudioManager.play_global_sfx("1_up") - score_note_spawner.spawn_one_up_note() + if award_score: + if Global.current_game_mode == Global.GameMode.CHALLENGE or Settings.file.difficulty.inf_lives: + score_note_spawner.spawn_note(10000) + else: + Global.lives += 1 + AudioManager.play_global_sfx("1_up") + score_note_spawner.spawn_one_up_note() else: - Global.score += COMBO_VALS[stomp_combo] - score_note_spawner.spawn_note(COMBO_VALS[stomp_combo]) + if award_score: + Global.score += COMBO_VALS[stomp_combo] + score_note_spawner.spawn_note(COMBO_VALS[stomp_combo]) stomp_combo += 1 func bump_ceiling() -> void: diff --git a/Scripts/Classes/Entities/ShellClass.gd b/Scripts/Classes/Entities/ShellClass.gd index 4406e19..ed326df 100644 --- a/Scripts/Classes/Entities/ShellClass.gd +++ b/Scripts/Classes/Entities/ShellClass.gd @@ -25,6 +25,8 @@ var can_update := true var can_air_kick := false +var time_since_kicked := 0.0 ## For disabling stomp score if too close to a kick + func _ready() -> void: $Sprite.flip_v = flipped if flipped: @@ -45,8 +47,14 @@ func on_player_stomped_on(stomped_player: Player) -> void: DiscoLevel.combo_meter += 10 moving = false AudioManager.play_sfx("enemy_stomp", global_position) - stomped_player.enemy_bounce_off() - if Global.current_game_mode == Global.GameMode.CHALLENGE and stomped_player.stomp_combo >= 10: + + stomped_player.enemy_bounce_off(true, time_since_kicked > 0.1) + + ## TODO(jdaster64): Try to figure out a way to recreate the exact + ## anti-farm method used in Deluxe (permanently increasing the points) + ## without affecting normal scoring, and killing the Koopa only when + ## an increased kick results in 8000 points. + if Global.current_game_mode == Global.GameMode.CHALLENGE and stomped_player.stomp_combo >= 8: die_from_object(stomped_player) func block_bounced(_block: Block) -> void: @@ -76,20 +84,22 @@ func award_score(award_level: int) -> void: func get_kick_award(hit_player: Player) -> int: var award_level = hit_player.stomp_combo + 2 - if wake_meter > 6.96: - award_level = 9 - elif wake_meter > 6.75: - award_level = 5 - elif wake_meter > 6.25: - award_level = 3 if award_level > 10: award_level = 10 + # Award special amounts of points if close to waking up. + if wake_meter > 7 - 0.04: + award_level = 9 + elif wake_meter > 7 - 0.25: + award_level = 5 + elif wake_meter > 7 - 0.75: + award_level = 3 return award_level func kick(hit_player: Player) -> void: update_hitbox() DiscoLevel.combo_meter += 25 moving = true + time_since_kicked = 0.0 if can_air_kick: $ScoreNoteSpawner.spawn_note(8000) else: @@ -102,6 +112,7 @@ func _physics_process(delta: float) -> void: handle_block_collision() if moving: wake_meter = 0 + time_since_kicked += delta $Sprite.play("Spin") else: combo = 0 From 0270faf75fdf336d39c33c738575c59b5edf0a11 Mon Sep 17 00:00:00 2001 From: jdaster64 Date: Wed, 24 Sep 2025 10:21:10 -0400 Subject: [PATCH 3/4] Rework anti-infinite scoring mechanisms for Challenge Mode --- .../Classes/Entities/Enemies/KoopaTroopa.gd | 3 ++ Scripts/Classes/Entities/ShellClass.gd | 29 +++++++++++-------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Scripts/Classes/Entities/Enemies/KoopaTroopa.gd b/Scripts/Classes/Entities/Enemies/KoopaTroopa.gd index 03382c9..04168df 100644 --- a/Scripts/Classes/Entities/Enemies/KoopaTroopa.gd +++ b/Scripts/Classes/Entities/Enemies/KoopaTroopa.gd @@ -10,6 +10,8 @@ var fly_wave := PI var dead := false +var times_kicked := 0 ## For anti-infinite scoring in Challenge mode + func _ready() -> void: if has_meta("fly_2"): fly_wave = 0 @@ -64,6 +66,7 @@ func summon_shell(flipped := false, launch := false) -> void: DiscoLevel.combo_amount += 1 var shell = load(shell_scene).instantiate() shell.flipped = flipped + shell.times_kicked = times_kicked shell.old_entity = self.duplicate() if launch: AudioManager.play_sfx("kick", global_position) diff --git a/Scripts/Classes/Entities/ShellClass.gd b/Scripts/Classes/Entities/ShellClass.gd index ed326df..a4ca655 100644 --- a/Scripts/Classes/Entities/ShellClass.gd +++ b/Scripts/Classes/Entities/ShellClass.gd @@ -3,6 +3,8 @@ extends Enemy var moving := false +var moving_time := 0.0 + const MOVE_SPEED := 192 const AIR_MOVE_SPEED := 64 @@ -25,7 +27,7 @@ var can_update := true var can_air_kick := false -var time_since_kicked := 0.0 ## For disabling stomp score if too close to a kick +var times_kicked := 0 func _ready() -> void: $Sprite.flip_v = flipped @@ -47,15 +49,7 @@ func on_player_stomped_on(stomped_player: Player) -> void: DiscoLevel.combo_meter += 10 moving = false AudioManager.play_sfx("enemy_stomp", global_position) - - stomped_player.enemy_bounce_off(true, time_since_kicked > 0.1) - - ## TODO(jdaster64): Try to figure out a way to recreate the exact - ## anti-farm method used in Deluxe (permanently increasing the points) - ## without affecting normal scoring, and killing the Koopa only when - ## an increased kick results in 8000 points. - if Global.current_game_mode == Global.GameMode.CHALLENGE and stomped_player.stomp_combo >= 8: - die_from_object(stomped_player) + stomped_player.enemy_bounce_off(true, moving_time > 0.1) func block_bounced(_block: Block) -> void: velocity.y = -200 @@ -99,12 +93,18 @@ func kick(hit_player: Player) -> void: update_hitbox() DiscoLevel.combo_meter += 25 moving = true - time_since_kicked = 0.0 + moving_time = 0.0 if can_air_kick: $ScoreNoteSpawner.spawn_note(8000) else: award_score(get_kick_award(hit_player)) AudioManager.play_sfx("kick", global_position) + + # Limit the number of times you can kick the same shell. + if Global.current_game_mode == Global.GameMode.CHALLENGE: + times_kicked += 1 + if times_kicked >= 7: + die_from_object(hit_player) func _physics_process(delta: float) -> void: handle_movement(delta) @@ -112,7 +112,7 @@ func _physics_process(delta: float) -> void: handle_block_collision() if moving: wake_meter = 0 - time_since_kicked += delta + moving_time += delta $Sprite.play("Spin") else: combo = 0 @@ -128,6 +128,7 @@ func handle_waking(delta: float) -> void: func summon_original_entity() -> void: old_entity.global_position = global_position + old_entity.times_kicked = times_kicked add_sibling(old_entity) queue_free() @@ -142,6 +143,10 @@ func add_combo() -> void: award_score(combo + 3) if combo < 7: combo += 1 + + # Force limit on how long you can let a shell hit respawning enemies. + if Global.current_game_mode == Global.GameMode.CHALLENGE and moving_time > 12.0: + die() func update_hitbox() -> void: can_kick = false From b3694e0cf2d0383b6044529e593a9980b4395d1e Mon Sep 17 00:00:00 2001 From: jdaster64 Date: Wed, 24 Sep 2025 10:32:16 -0400 Subject: [PATCH 4/4] Revert 10k stomp change in Player --- Scripts/Classes/Entities/Player.gd | 1 + 1 file changed, 1 insertion(+) diff --git a/Scripts/Classes/Entities/Player.gd b/Scripts/Classes/Entities/Player.gd index 8dc3940..87bc6cd 100644 --- a/Scripts/Classes/Entities/Player.gd +++ b/Scripts/Classes/Entities/Player.gd @@ -392,6 +392,7 @@ func add_stomp_combo(award_score := true) -> void: if stomp_combo >= 10: if award_score: if Global.current_game_mode == Global.GameMode.CHALLENGE or Settings.file.difficulty.inf_lives: + Global.score += 10000 score_note_spawner.spawn_note(10000) else: Global.lives += 1