rename gauntlet→candy_survival + rewrite Candy Survival per boss design

- Rename enum GAUNTLET→CANDY_SURVIVAL, all gauntlet_*→candy_survival_*
- Rename files: gauntlet_manager→candy_survival_manager, candy_cannon→candy_survival_npc, gauntlet.tscn→candy_survival.tscn
- Rewrite candy_survival_manager.gd: blueprints, candy stack, Mekton delivery, Sugar Rush, knock/ghost charges, sticky-as-wall
- Update player_movement_manager.gd: smack→knock system, ghost integration
- All Candy Survival issues (#54-57, #65-70) retitled per boss design
- Shared managers (goals_cycle, goal, player_race, playerboard, turn) untouched
This commit is contained in:
god
2026-07-06 01:28:39 +08:00
parent 114748a54f
commit 528e22875d
33 changed files with 731 additions and 2181 deletions
+54 -54
View File
@@ -1,11 +1,11 @@
# tests/test_gauntlet_registration.gd
# Tests for [Gauntlet] #1 Game Mode Registration
# Validates GAUNTLET enum, string conversion, lobby integration, and arena setup
# tests/test_candy_survival_registration.gd
# Tests for Candy Survival] #1 Game Mode Registration
# Validates CANDY_SURVIVAL enum, string conversion, lobby integration, and arena setup
extends GutTest
func before_all():
gut.p("=== Gauntlet Registration Tests [Gauntlet #1] ===")
gut.p("=== Candy Survival Registration Tests Candy Survival #1] ===")
func after_each():
pass
@@ -14,35 +14,35 @@ func after_each():
# GameMode Enum Tests
# =============================================================================
# Test 1: GAUNTLET enum value exists and equals 3
func test_gauntlet_enum_exists():
assert_eq(GameMode.Mode.GAUNTLET, 3, "GAUNTLET should be enum value 3")
# Test 1: CANDY_SURVIVAL enum value exists and equals 3
func test_candy_survival_enum_exists():
assert_eq(GameMode.Mode.CANDY_SURVIVAL, 3, "CANDY_SURVIVAL should be enum value 3")
# Test 2: All 3 modes are present in enum
func test_all_modes_in_enum():
assert_eq(GameMode.Mode.FREEMODE, 0, "FREEMODE should be 0")
assert_eq(GameMode.Mode.STOP_N_GO, 1, "STOP_N_GO should be 1")
assert_eq(GameMode.Mode.GAUNTLET, 3, "GAUNTLET should be 3")
assert_eq(GameMode.Mode.CANDY_SURVIVAL, 3, "CANDY_SURVIVAL should be 3")
# =============================================================================
# String Conversion Tests
# =============================================================================
# Test 3: from_string recognizes "Candy Pump Survival"
func test_from_string_candy_cannon():
var result = GameMode.from_string("Candy Pump Survival")
assert_eq(result, GameMode.Mode.GAUNTLET, "from_string should parse 'Candy Pump Survival' as GAUNTLET")
# Test 3: from_string recognizes "Candy Survival"
func test_from_string_candy_survival():
var result = GameMode.from_string("Candy Survival")
assert_eq(result, GameMode.Mode.CANDY_SURVIVAL, "from_string should parse 'Candy Survival' as CANDY_SURVIVAL")
# Test 4: mode_to_string returns "Candy Pump Survival" for GAUNTLET
# Test 4: mode_to_string returns "Candy Survival" for CANDY_SURVIVAL
func test_mode_to_string_gauntlet():
var result = GameMode.mode_to_string(GameMode.Mode.GAUNTLET)
assert_eq(result, "Candy Pump Survival", "mode_to_string should return 'Candy Pump Survival'")
var result = GameMode.mode_to_string(GameMode.Mode.CANDY_SURVIVAL)
assert_eq(result, "Candy Survival", "mode_to_string should return 'Candy Survival'")
# Test 5: Round-trip conversion is lossless
func test_round_trip_conversion():
var mode_str = GameMode.mode_to_string(GameMode.Mode.GAUNTLET)
var mode_str = GameMode.mode_to_string(GameMode.Mode.CANDY_SURVIVAL)
var mode_enum = GameMode.from_string(mode_str)
assert_eq(mode_enum, GameMode.Mode.GAUNTLET, "Round-trip should preserve GAUNTLET")
assert_eq(mode_enum, GameMode.Mode.CANDY_SURVIVAL, "Round-trip should preserve CANDY_SURVIVAL")
# Test 6: All existing modes still round-trip correctly
func test_existing_modes_round_trip():
@@ -60,10 +60,10 @@ func test_unknown_string_defaults_freemode():
# get_all_modes Tests
# =============================================================================
# Test 8: get_all_modes includes "Candy Pump Survival"
# Test 8: get_all_modes includes "Candy Survival"
func test_get_all_modes_includes_gauntlet():
var modes = GameMode.get_all_modes()
assert_has(modes, "Candy Pump Survival", "get_all_modes should include 'Candy Pump Survival'")
assert_has(modes, "Candy Survival", "get_all_modes should include 'Candy Survival'")
# Test 9: get_all_modes returns exactly 3 entries
func test_get_all_modes_count():
@@ -75,16 +75,16 @@ func test_get_all_modes_order():
var modes = GameMode.get_all_modes()
assert_eq(modes[0], "Freemode", "First mode should be Freemode")
assert_eq(modes[1], "Stop n Go", "Second mode should be Stop n Go")
assert_eq(modes[2], "Candy Pump Survival", "Third mode should be Candy Pump Survival")
assert_eq(modes[2], "Candy Survival", "Third mode should be Candy Survival")
# =============================================================================
# is_restricted Tests
# =============================================================================
# Test 11: GAUNTLET is a restricted mode
func test_gauntlet_is_restricted():
var result = GameMode.is_restricted(GameMode.Mode.GAUNTLET)
assert_true(result, "GAUNTLET should be restricted (dedicated arena)")
# Test 11: CANDY_SURVIVAL is a restricted mode
func test_candy_survival_is_restricted():
var result = GameMode.is_restricted(GameMode.Mode.CANDY_SURVIVAL)
assert_true(result, "CANDY_SURVIVAL should be restricted (dedicated arena)")
# Test 12: FREEMODE is NOT restricted
func test_freemode_not_restricted():
@@ -94,46 +94,46 @@ func test_freemode_not_restricted():
# Test 13: All restricted modes are confirmed
func test_all_restricted_modes():
assert_true(GameMode.is_restricted(GameMode.Mode.STOP_N_GO), "STOP_N_GO should be restricted")
assert_true(GameMode.is_restricted(GameMode.Mode.GAUNTLET), "GAUNTLET should be restricted")
assert_true(GameMode.is_restricted(GameMode.Mode.CANDY_SURVIVAL), "CANDY_SURVIVAL should be restricted")
# =============================================================================
# LobbyManager Integration Tests
# =============================================================================
# Test 14: Lobby available_game_modes includes "Candy Pump Survival"
# Test 14: Lobby available_game_modes includes "Candy Survival"
func test_lobby_modes_includes_gauntlet():
var modes = LobbyManager.available_game_modes
assert_has(modes, "Candy Pump Survival", "LobbyManager.available_game_modes should include 'Candy Pump Survival'")
assert_has(modes, "Candy Survival", "LobbyManager.available_game_modes should include 'Candy Survival'")
# Test 15: gauntlet_manager.gd script file exists
func test_gauntlet_manager_script_exists():
var script_exists = ResourceLoader.exists("res://scripts/managers/gauntlet_manager.gd")
assert_true(script_exists, "gauntlet_manager.gd should exist")
# Test 15: candy_survival_manager.gd script file exists
func test_candy_survival_manager_script_exists():
var script_exists = ResourceLoader.exists("res://scripts/managers/candy_survival_manager.gd")
assert_true(script_exists, "candy_survival_manager.gd should exist")
# Test 16: GauntletManager class can be loaded
func test_gauntlet_manager_loads():
var script = load("res://scripts/managers/gauntlet_manager.gd")
assert_not_null(script, "gauntlet_manager.gd should load without errors")
# Test 16: CandySurvivalManager class can be loaded
func test_candy_survival_manager_loads():
var script = load("res://scripts/managers/candy_survival_manager.gd")
assert_not_null(script, "candy_survival_manager.gd should load without errors")
# Test 17: GauntletManager has required methods
func test_gauntlet_manager_has_methods():
var manager = GauntletManager.new()
assert_true(manager.has_method("_setup_arena"), "GauntletManager should have _setup_arena()")
assert_true(manager.has_method("_apply_arena_setup"), "GauntletManager should have _apply_arena_setup()")
assert_true(manager.has_method("start_game_mode"), "GauntletManager should have start_game_mode()")
assert_true(manager.has_method("initialize"), "GauntletManager should have initialize()")
# Test 17: CandySurvivalManager has required methods
func test_candy_survival_manager_has_methods():
var manager = CandySurvivalManager.new()
assert_true(manager.has_method("_setup_arena"), "CandySurvivalManager should have _setup_arena()")
assert_true(manager.has_method("_apply_arena_setup"), "CandySurvivalManager should have _apply_arena_setup()")
assert_true(manager.has_method("start_game_mode"), "CandySurvivalManager should have start_game_mode()")
assert_true(manager.has_method("initialize"), "CandySurvivalManager should have initialize()")
manager.free()
# Test 18: GauntletManager arena constants are correct
func test_gauntlet_arena_constants():
assert_eq(GauntletManager.ARENA_COLUMNS, 20, "Arena should be 20 columns")
assert_eq(GauntletManager.ARENA_ROWS, 20, "Arena should be 20 rows")
assert_eq(GauntletManager.NPC_SIZE, 3, "NPC zone should be 3x3")
assert_eq(GauntletManager.NPC_CENTER, Vector2i(9, 9), "NPC center should be at (9,9)")
# Test 18: CandySurvivalManager arena constants are correct
func test_candy_survival_arena_constants():
assert_eq(CandySurvivalManager.ARENA_COLUMNS, 20, "Arena should be 20 columns")
assert_eq(CandySurvivalManager.ARENA_ROWS, 20, "Arena should be 20 rows")
assert_eq(CandySurvivalManager.NPC_SIZE, 3, "NPC zone should be 3x3")
assert_eq(CandySurvivalManager.NPC_CENTER, Vector2i(9, 9), "NPC center should be at (9,9)")
# Test 19: NPC zone detection works
func test_npc_zone_detection():
var manager = GauntletManager.new()
var manager = CandySurvivalManager.new()
# Center of NPC zone
assert_true(manager._is_npc_zone(Vector2i(9, 9)), "Center (9,9) should be NPC zone")
# Edges of NPC zone
@@ -146,10 +146,10 @@ func test_npc_zone_detection():
manager.free()
# Test 20: Phase enum has 3 phases
func test_gauntlet_phases():
assert_eq(GauntletManager.Phase.OPEN_ARENA, 0, "OPEN_ARENA should be 0")
assert_eq(GauntletManager.Phase.ROUTE_PRESSURE, 1, "ROUTE_PRESSURE should be 1")
assert_eq(GauntletManager.Phase.SURVIVAL_ENDGAME, 2, "SURVIVAL_ENDGAME should be 2")
func test_candy_survival_phases():
assert_eq(CandySurvivalManager.Phase.OPEN_ARENA, 0, "OPEN_ARENA should be 0")
assert_eq(CandySurvivalManager.Phase.ROUTE_PRESSURE, 1, "ROUTE_PRESSURE should be 1")
assert_eq(CandySurvivalManager.Phase.SURVIVAL_ENDGAME, 2, "SURVIVAL_ENDGAME should be 2")
func after_all():
gut.p("=== Gauntlet Registration Tests Complete ===")
gut.p("=== Candy Survival Registration Tests Complete ===")