diff --git a/sa1/src/game/shared/stage/stage.c b/sa1/src/game/shared/stage/stage.c index a63828899..f9ffa263d 100644 --- a/sa1/src/game/shared/stage/stage.c +++ b/sa1/src/game/shared/stage/stage.c @@ -41,7 +41,7 @@ struct Task *gGameStageTask = NULL; void Task_GameStage(void); void TaskDestructor_GameStage(struct Task *t); -void StageInit_MPCollectRings(void); +void StageInit_CollectRings(void); // TODO: Declare in headers! extern struct Task *sub_80550F8(void); @@ -87,6 +87,34 @@ const VoidFn sStageInitProcs[NUM_LEVEL_IDS] = { void sub_80213C0(u32 UNUSED characterId, u32 UNUSED levelId, Player *player); #endif +#ifndef COLLECT_RINGS_ROM +#if (GAME == GAME_SA2) +void ApplyGameStageSettings(void) +{ + gLevelScore = 0; + gFinalBossActive = FALSE; + gNumLives = 3; + + if (IS_MULTI_PLAYER) { + gNumLives = 1; + } + + if ((gGameMode == GAME_MODE_TIME_ATTACK || gGameMode == GAME_MODE_BOSS_TIME_ATTACK || gGameMode == GAME_MODE_MULTI_PLAYER + || gGameMode == GAME_MODE_TEAM_PLAY) + || (gStageFlags & STAGE_FLAG__DEMO_RUNNING)) { + gDifficultyLevel = DIFFICULTY_NORMAL; + } else { + gDifficultyLevel = LOADED_SAVE->difficultyLevel; + } + + if ((gStageFlags & STAGE_FLAG__DEMO_RUNNING)) { + SetPlayerControls(A_BUTTON, B_BUTTON, R_BUTTON); + } else { + SetPlayerControls(LOADED_SAVE->buttonConfig.jump, LOADED_SAVE->buttonConfig.attack, LOADED_SAVE->buttonConfig.trick); + } +} +#endif + void GameStageStart(void) { gTrappedAnimalVariant = 0; @@ -99,20 +127,22 @@ void GameStageStart(void) CallSetStageSpawnPos(gSelectedCharacter, gCurrentLevel, 0, &gPlayer); } else if (IS_EXTRA_STAGE(gCurrentLevel)) { CallSetStageSpawnPos(gSelectedCharacter, gCurrentLevel, 0, &gPlayer); - } else { - CallSetStageSpawnPos(gSelectedCharacter, gCurrentLevel, 0, &gPlayer); + } else +#endif + { + if (!IS_EXTRA_STAGE(gCurrentLevel)) { + CallSetStageSpawnPos(gSelectedCharacter, gCurrentLevel, 0, &gPlayer); - if (gTailsEnabled && (gSelectedCharacter == CHARACTER_SONIC)) { - gNumSingleplayerCharacters = 2; - CallSetStageSpawnPos(CHARACTER_TAILS, gCurrentLevel, 1, &gPartner); +#if (GAME == GAME_SA1) + if (gTailsEnabled && (gSelectedCharacter == CHARACTER_SONIC)) { + gNumSingleplayerCharacters = 2; + CallSetStageSpawnPos(CHARACTER_TAILS, gCurrentLevel, 1, &gPartner); + } +#elif (GAME == GAME_SA2) + gCheese = NULL; +#endif } } -#elif (GAME == GAME_SA2) - if (!IS_EXTRA_STAGE(gCurrentLevel)) { - CallSetStageSpawnPos(gSelectedCharacter, gCurrentLevel, 0, &gPlayer); - gCheese = NULL; - } -#endif gStageTime = 0; gStageFlags &= ~STAGE_FLAG__GRAVITY_INVERTED; @@ -141,6 +171,7 @@ void GameStageStart(void) CreateGameStage(); } +#endif void CreateGameStage(void) { @@ -231,15 +262,16 @@ void CreateGameStage(void) } } } else { - StageInit_MPCollectRings(); + StageInit_CollectRings(); } #elif (GAME == GAME_SA2) gSpikesUnknownTimer = 0; if (!IS_EXTRA_STAGE(gCurrentLevel)) { - sub_80213C0(gSelectedCharacter, gCurrentLevel, &gPlayer); + CreatePlayer(gSelectedCharacter, gCurrentLevel, &gPlayer); } +#ifndef COLLECT_RINGS_ROM if (IS_BOSS_STAGE(gCurrentLevel)) { gBossCameraClampYLower = gBossCameraYClamps[LEVEL_TO_ZONE(gCurrentLevel)][0]; gBossCameraClampYUpper = gBossCameraYClamps[LEVEL_TO_ZONE(gCurrentLevel)][1]; @@ -254,13 +286,17 @@ void CreateGameStage(void) gBossCameraClampYUpper = gBossCameraYClamps[ZONE_FINAL + 1][1]; } } +#endif +#ifndef COLLECT_RINGS_ROM if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { CreateStageMusicManager(); SetupStageIntro(); InitCamera(gCurrentLevel); sStageInitProcs[gCurrentLevel](); - } else { + } else +#endif + { InitCamera(0); StageInit_CollectRings(); CreateCollectRingsTimeDisplay(); @@ -268,9 +304,11 @@ void CreateGameStage(void) gStageFlags &= ~STAGE_FLAG__ACT_START; } +#ifndef COLLECT_RINGS_ROM if (gCurrentLevel != LEVEL_INDEX(ZONE_1, ACT_1)) { CreateStageWaterTask(-1, 0, 0); } +#endif gStageFlags &= ~STAGE_FLAG__2; gStageFlags &= ~STAGE_FLAG__TIMER_REVERSED; @@ -336,7 +374,9 @@ void CreateGameStage(void) if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { gPlayer.itemEffect |= PLAYER_ITEM_EFFECT__TELEPORT; } - } else { + } else +#ifndef COLLECT_RINGS_ROM + { for (i = 0; i < 4; i++) { gMultiplayerRanks[i] = -1; } @@ -353,19 +393,20 @@ void CreateGameStage(void) CreateRaceProgressIndicator(); } #endif +#endif } void Task_GameStage(void) { u16 sioId = SIO_MULTI_CNT->id; u32 timeStep; - +#ifndef COLLECT_RINGS_ROM if (IS_SINGLE_PLAYER) { #if DEBUG -#include "game/sa1/ui/character_select.h" +#include "game/sa2/ui/character_select.h" if (gInput & SELECT_BUTTON) { - u32 initialCharacter = CHARACTER_TAILS; - bool32 allUnlocked = TRUE; + const u32 initialCharacter = CHARACTER_TAILS; + const bool32 allUnlocked = TRUE; TasksDestroyAll(); #if (GAME == GAME_SA1) CreateCharacterSelectionScreen(initialCharacter); @@ -380,7 +421,9 @@ void Task_GameStage(void) } gStageTime++; timeStep = 1; - } else { + } else +#endif + { u32 framesSinceStageStart = (gFrameCount - gMPStageStartFrameCount); timeStep = framesSinceStageStart - gStageTime; gStageTime = framesSinceStageStart; @@ -431,7 +474,7 @@ void Task_GameStage(void) } // If player is not connected, switch back to our player - if (!GetBit(gMultiplayerConnections, gCamera.spectatorTarget)) { + if (!CONNECTION_REGISTERED(gCamera.spectatorTarget)) { gCamera.spectatorTarget = sioId; } @@ -454,6 +497,7 @@ void Task_GameStage(void) return; } +#ifndef COLLECT_RINGS_ROM if (IS_SINGLE_PLAYER) { gStageFlags |= STAGE_FLAG__ACT_START; @@ -481,11 +525,15 @@ void Task_GameStage(void) } gPlayer.moveState |= MOVESTATE_DEAD; m4aSongNumStart(SE_TIME_UP); - } else { + } +#endif + else { gStageFlags |= STAGE_FLAG__ACT_START; CreateMultiplayerFinishHandler(); } - } else { + } +#ifndef COLLECT_RINGS_ROM + else { gCourseTime += timeStep; if (gCourseTime <= MAX_COURSE_TIME) { return; @@ -512,8 +560,53 @@ void Task_GameStage(void) CreateMultiplayerFinishHandler(); } } +#endif } +#if (GAME == GAME_SA2) +#if COLLECT_RINGS_ROM +void ApplyGameStageSettings(void) +{ + gLevelScore = 0; + gFinalBossActive = FALSE; + gNumLives = 3; + + if (IS_MULTI_PLAYER) { + gNumLives = 1; + } + + SetPlayerControls(A_BUTTON, B_BUTTON, R_BUTTON); +} + +void GameStageStart(void) +{ + gTrappedAnimalVariant = 0; + gBossIndex = 0; + gRingCount = 0; + + // Unused leftover var from SA1, used for CPU "Partner" Tails + gNumSingleplayerCharacters = 1; + + if (gCurrentLevel != LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53)) { + CallSetStageSpawnPos(gSelectedCharacter, gCurrentLevel, 0, &gPlayer); + // gCheese = NULL; + } + + gStageTime = 0; + gStageFlags &= ~STAGE_FLAG__GRAVITY_INVERTED; + + gMPStageStartFrameCount = gFrameCount; + + gCheckpointTime = TIME(0, 0); + + gCourseTime = TIME(3, 0); + + CreateGameStage(); +} +#endif +#endif + +#ifndef COLLECT_RINGS_ROM void HandleLifeLost(void) { gStageFlags |= STAGE_FLAG__DISABLE_PAUSE_MENU; @@ -560,6 +653,7 @@ void HandleLifeLost(void) } } } +#endif #if (GAME == GAME_SA1) void HandleDeath(void) @@ -589,7 +683,6 @@ void HandleDeath(void) CreateTimeOver(); } } -#endif void GoToNextLevel(void) { @@ -600,7 +693,6 @@ void GoToNextLevel(void) gBgSpritesCount = 0; PAUSE_GRAPHICS_QUEUE(); -#if (GAME == GAME_SA1) m4aMPlayAllStop(); m4aSoundVSyncOff(); @@ -622,11 +714,9 @@ void GoToNextLevel(void) SlowDmaStop(1); SlowDmaStop(2); SlowDmaStop(3); -#endif WriteSaveGame(); -#if (GAME == GAME_SA1) REG_IE = irqEnable; REG_IE; REG_IME = irqMasterEnable; @@ -637,27 +727,51 @@ void GoToNextLevel(void) m4aSoundVSyncOn(); gFlags &= ~FLAGS_8000; -#endif -#if (GAME == GAME_SA1) - if (gGameMode != GAME_MODE_TIME_ATTACK) -#elif (GAME == GAME_SA2) - if (gGameMode == GAME_MODE_SINGLE_PLAYER) -#endif - { + if (gGameMode != GAME_MODE_TIME_ATTACK) { if (++gCurrentLevel < NUM_LEVEL_IDS) { GameStageStart(); } - } -#if (GAME == GAME_SA1) - else { + } else { CreateTimeAttackLobbyScreen(); } -#endif } +#endif + +#ifndef COLLECT_RINGS_ROM +#if (GAME == GAME_SA2) +// NOTE: It's kind of redundant to check whether we are in Zone 5's boss stage +// on every single stage init. (for changing music to Knuckles' fight BGM) +// +// But maybe it doesn't matter as it's only called once per stage start. +static inline void StageInit_SetMusic_inline(u16 level) +{ + if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { + if (gSelectedCharacter == CHARACTER_SONIC && LOADED_SAVE->unlockedLevels[CHARACTER_SONIC] <= gCurrentLevel + && gCurrentLevel == LEVEL_INDEX(ZONE_5, ACT_BOSS)) { + gMusicManagerState.unk1 = 0x10 | 0xE; + } else { + m4aSongNumStart(gLevelSongs[level]); + } + } else { + m4aSongNumStart(MUS_VS_2); + } +} +#endif + +#if (GAME == GAME_SA2) +void StageInit_Zone1Act1(void) +{ + CreateStageWaterTask(0x830, 0x7F207F20, 0); + CreatePaletteLoaderTask(0x2000, 897, 0, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +} +#endif void StageInit_Zone3Act1(void) { +#if (GAME == GAME_SA1) CreatePaletteLoaderTask(0x2000, 816, 0, 0); CreatePaletteLoaderTask(0x2000, 817, 0, 0); CreatePaletteLoaderTask(0x2000, 818, 0, 0); @@ -671,10 +785,18 @@ void StageInit_Zone3Act1(void) CreatePaletteLoaderTask(0x2000, 826, 0, 0); // Chao Stage removes this loader m4aSongNumStart(MUS_CASINO_PARADISE__ACT_1); +#elif (GAME == GAME_SA2) + CreatePaletteLoaderTask(0x2000, 900, 0, NULL); + CreatePaletteLoaderTask(0x2000, 900, 1, NULL); + CreatePaletteLoaderTask(0x2000, 900, 2, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +#endif } void StageInit_Zone3Act2(void) { +#if (GAME == GAME_SA1) CreatePaletteLoaderTask(0x2000, 816, 0, 0); CreatePaletteLoaderTask(0x2000, 817, 0, 0); CreatePaletteLoaderTask(0x2000, 818, 0, 0); @@ -688,10 +810,40 @@ void StageInit_Zone3Act2(void) CreatePaletteLoaderTask(0x2000, 826, 0, 0); m4aSongNumStart(MUS_CASINO_PARADISE__ACT_2); +#elif (GAME == GAME_SA2) + CreatePaletteLoaderTask(0x2000, 900, 0, NULL); + CreatePaletteLoaderTask(0x2000, 900, 1, NULL); + CreatePaletteLoaderTask(0x2000, 900, 2, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +#endif } +#if (GAME == GAME_SA2) +void StageInit_Zone4Act1(void) +{ + CreatePaletteLoaderTask(0x2000, 906, 2, NULL); + CreatePaletteLoaderTask(0x2000, 906, 0, NULL); + CreatePaletteLoaderTask(0x2000, 906, 1, NULL); + CreatePaletteLoaderTask(0x2000, 901, 0, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +} + +void StageInit_Zone4Act2(void) +{ + CreatePaletteLoaderTask(0x2000, 906, 2, NULL); + CreatePaletteLoaderTask(0x2000, 906, 0, NULL); + CreatePaletteLoaderTask(0x2000, 906, 1, NULL); + CreatePaletteLoaderTask(0x2000, 901, 0, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +} +#endif + void StageInit_Zone6Act1(void) { +#if (GAME == GAME_SA1) CreatePaletteLoaderTask(0x2000, 839, 0, 0); CreatePaletteLoaderTask(0x2000, 840, 0, 0); CreatePaletteLoaderTask(0x2000, 841, 0, 0); @@ -738,8 +890,79 @@ void StageInit_Zone6Act1(void) gCourseTime = TIME(5, 0); } } +#elif (GAME == GAME_SA2) + CreatePaletteLoaderTask(0x2000, 940, 0, NULL); + CreatePaletteLoaderTask(0x2000, 940, 1, NULL); + CreatePaletteLoaderTask(0x2000, 940, 2, NULL); + CreatePaletteLoaderTask(0x2000, 940, 3, NULL); + CreatePaletteLoaderTask(0x2000, 940, 4, NULL); + CreatePaletteLoaderTask(0x2000, 940, 5, NULL); + CreatePaletteLoaderTask(0x2000, 940, 6, NULL); + CreatePaletteLoaderTask(0x2000, 940, 7, NULL); + CreatePaletteLoaderTask(0x2000, 940, 8, NULL); + CreatePaletteLoaderTask(0x2000, 940, 9, NULL); + CreatePaletteLoaderTask(0x2000, 940, 11, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +#endif } +#if (GAME == GAME_SA2) +void StageInit_Zone6Act2(void) +{ + CreatePaletteLoaderTask(0x2000, 940, 0, NULL); + CreatePaletteLoaderTask(0x2000, 940, 1, NULL); + CreatePaletteLoaderTask(0x2000, 940, 2, NULL); + CreatePaletteLoaderTask(0x2000, 940, 3, NULL); + CreatePaletteLoaderTask(0x2000, 940, 4, NULL); + CreatePaletteLoaderTask(0x2000, 940, 5, NULL); + CreatePaletteLoaderTask(0x2000, 940, 6, NULL); + CreatePaletteLoaderTask(0x2000, 940, 7, NULL); + CreatePaletteLoaderTask(0x2000, 940, 8, NULL); + CreatePaletteLoaderTask(0x2000, 940, 9, NULL); + CreatePaletteLoaderTask(0x2000, 940, 11, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +} + +void StageInit_Zone7Act1(void) +{ + CreatePaletteLoaderTask(0x2000, 941, 0, NULL); + CreatePaletteLoaderTask(0x2000, 942, 0, NULL); + CreatePaletteLoaderTask(0x2000, 943, 0, NULL); + CreatePaletteLoaderTask(0x2000, 944, 0, NULL); + CreatePaletteLoaderTask(0x2000, 945, 0, NULL); + CreatePaletteLoaderTask(0x2000, 946, 0, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +} + +void StageInit_Zone7Act2(void) +{ + CreatePaletteLoaderTask(0x2000, 941, 0, NULL); + CreatePaletteLoaderTask(0x2000, 942, 0, NULL); + CreatePaletteLoaderTask(0x2000, 943, 0, NULL); + CreatePaletteLoaderTask(0x2000, 944, 0, NULL); + CreatePaletteLoaderTask(0x2000, 945, 0, NULL); + CreatePaletteLoaderTask(0x2000, 946, 0, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +} + +void StageInit_Zone7ActBoss(void) +{ + CreatePaletteLoaderTask(0x2000, 941, 0, NULL); + CreatePaletteLoaderTask(0x2000, 942, 0, NULL); + CreatePaletteLoaderTask(0x2000, 943, 0, NULL); + CreatePaletteLoaderTask(0x2000, 944, 0, NULL); + CreatePaletteLoaderTask(0x2000, 945, 0, NULL); + CreatePaletteLoaderTask(0x2000, 946, 0, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +} +#endif + +#if (GAME == GAME_SA1) void StageInit_PinballChaoGarden(void) { CreatePaletteLoaderTask(0x2000, 816, 0, 0); @@ -756,7 +979,10 @@ void StageInit_PinballChaoGarden(void) m4aSongNumStart(MUS_CASINO_PARADISE__ACT_1); } +#endif +#endif +#if (GAME == GAME_SA1) void ApplyGameStageSettings(void) { gLevelScore = 0; @@ -776,6 +1002,7 @@ void ApplyGameStageSettings(void) SetPlayerControls(LOADED_SAVE->btnConfig); GameStageStart(); } +#endif void DestroyStageTasks(void) { @@ -793,6 +1020,51 @@ void DestroyStageTasks(void) DestroyCameraMovementTask(); } +#if (GAME == GAME_SA2) +#ifndef COLLECT_RINGS_ROM +void HandleDeath(void) +{ + gStageFlags |= STAGE_FLAG__DISABLE_PAUSE_MENU; + + if (gGameMode == GAME_MODE_TIME_ATTACK || gGameMode == GAME_MODE_BOSS_TIME_ATTACK) { + TasksDestroyAll(); + PAUSE_BACKGROUNDS_QUEUE(); + gBgSpritesCount = 0; + PAUSE_GRAPHICS_QUEUE(); + CreateTimeAttackLobbyScreen(); + gNumLives = 2; + return; + } + + if (--gNumLives == 0) { + CreateGameOverScreen(OVER_CAUSE_ZERO_LIVES); + } else { + CreateGameOverScreen(OVER_CAUSE_TIME_UP); + } +} + +// Unused. +// Leftover from SA1, but smaller than in there. +void GoToNextLevel(void) +{ + u16 irqEnable, irqMasterEnable, dispStat; + + TasksDestroyAll(); + PAUSE_BACKGROUNDS_QUEUE(); + gBgSpritesCount = 0; + PAUSE_GRAPHICS_QUEUE(); + + WriteSaveGame(); + + if (gGameMode == GAME_MODE_SINGLE_PLAYER) { + if (++gCurrentLevel < NUM_LEVEL_IDS) { + GameStageStart(); + } + } +} +#endif +#endif + void TaskDestructor_GameStage(struct Task *t) { #if (GAME == GAME_SA1) @@ -805,6 +1077,8 @@ void TaskDestructor_GameStage(struct Task *t) m4aMPlayAllStop(); } +#ifndef COLLECT_RINGS_ROM +#if (GAME == GAME_SA1) void StageInit_Zone1Act1(void) { CreatePaletteLoaderTask(0x2000, 814, 0, 0); @@ -812,9 +1086,11 @@ void StageInit_Zone1Act1(void) m4aSongNumStart(MUS_NEO_GREEN_HILL__ACT_1); } +#endif void StageInit_Zone1Act2(void) { +#if (GAME == GAME_SA1) CreatePaletteLoaderTask(0x2000, 814, 0, 0); CreatePaletteLoaderTask(0x2000, 815, 0, 0); CreatePaletteLoaderTask(0x2000, 820, 1, 0); @@ -825,26 +1101,51 @@ void StageInit_Zone1Act2(void) } m4aSongNumStart(MUS_NEO_GREEN_HILL__ACT_2); +#elif (GAME == GAME_SA2) + CreatePaletteLoaderTask(0x2000, 897, 0, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +#endif } +#if (GAME == GAME_SA2) +void StageInit_Zone1ActBoss(void) { StageInit_SetMusic_inline(gCurrentLevel); } +#endif + void StageInit_Zone2Act1(void) { +#if (GAME == GAME_SA1) CreatePaletteLoaderTask(0x2000, 819, 0, 0); CreatePaletteLoaderTask(0x2000, 845, 0, 0); CreatePaletteLoaderTask(0x2000, 849, 0, 0); m4aSongNumStart(MUS_SECRET_BASE__ACT_1); +#elif (GAME == GAME_SA2) + StageInit_SetMusic_inline(gCurrentLevel); +#endif } void StageInit_Zone2Act2(void) { +#if (GAME == GAME_SA1) CreatePaletteLoaderTask(0x2000, 819, 0, 0); CreatePaletteLoaderTask(0x2000, 845, 0, 0); CreatePaletteLoaderTask(0x2000, 849, 0, 0); m4aSongNumStart(MUS_SECRET_BASE__ACT_2); +#elif (GAME == GAME_SA2) + StageInit_SetMusic_inline(gCurrentLevel); +#endif } +#if (GAME == GAME_SA2) + +void StageInit_Zone2ActBoss(void) { StageInit_SetMusic_inline(gCurrentLevel); } + +void StageInit_Zone3ActBoss(void) { StageInit_SetMusic_inline(gCurrentLevel); } +#endif + +#if (GAME == GAME_SA1) void StageInit_Zone4Act1(void) { CreatePaletteLoaderTask(0x2000, 822, 0, 0); @@ -862,21 +1163,44 @@ void StageInit_Zone4Act2(void) m4aSongNumStart(MUS_ICE_MOUNTAIN__ACT_2); } +#endif + +#if (GAME == GAME_SA2) +void StageInit_Zone4ActBoss(void) { StageInit_SetMusic_inline(gCurrentLevel); } +#endif void StageInit_Zone5Act1(void) { +#if (GAME == GAME_SA1) CreatePaletteLoaderTask(0x2000, 823, 0, 0); m4aSongNumStart(MUS_ANGEL_ISLAND__ACT_1); +#elif (GAME == GAME_SA2) + StageInit_SetMusic_inline(gCurrentLevel); +#endif } void StageInit_Zone5Act2(void) { +#if (GAME == GAME_SA1) CreatePaletteLoaderTask(0x2000, 823, 0, 0); m4aSongNumStart(MUS_ANGEL_ISLAND__ACT_2); +#elif (GAME == GAME_SA2) + StageInit_SetMusic_inline(gCurrentLevel); +#endif } +#if (GAME == GAME_SA2) +void StageInit_Zone5ActBoss(void) +{ + CreatePaletteLoaderTask(0x2000, 686, 0, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +} +#endif + +#if (GAME == GAME_SA1) void StageInit_Zone6Act2(void) { CreatePaletteLoaderTask(0x2000, 829, 0, 0); @@ -890,11 +1214,38 @@ void StageInit_Zone6Act2(void) m4aSongNumStart(MUS_COSMIC_ANGEL); } +#endif +#if (GAME == GAME_SA2) +void StageInit_Zone6ActBoss(void) { StageInit_SetMusic_inline(gCurrentLevel); } +#endif + +#if (GAME == GAME_SA1) void StageInit_Zone7Act1(void) { m4aSongNumStart(MUS_X_ZONE); } void StageInit_Zone7Act2(void) { m4aSongNumStart(MUS_EXTRA_BOSS); } +#endif +#if (GAME == GAME_SA2) +void StageInit_ZoneFinalActXX(void) +{ + CreatePaletteLoaderTask(0x2000, 686, 0, NULL); + + StageInit_SetMusic_inline(gCurrentLevel); +} + +void StageInit_ZoneFinalActTA53(void) { StageInit_SetMusic_inline(gCurrentLevel); } + +void StageInit_MultiplayerSinglePak(void) { StageInit_SetMusic_inline(gCurrentLevel); } + +void StageInit_31(void) { StageInit_SetMusic_inline(gCurrentLevel); } + +void StageInit_32(void) { StageInit_SetMusic_inline(gCurrentLevel); } + +void StageInit_33(void) { StageInit_SetMusic_inline(gCurrentLevel); } +#endif + +#if (GAME == GAME_SA1) void StageInit_ForestChaoGarden(void) { CreatePaletteLoaderTask(0x2000, 814, 0, 0); @@ -927,13 +1278,34 @@ void StageInit_SpaceChaoGarden(void) m4aSongNumStart(MUS_COSMIC_ANGEL); } +#endif +#endif -void StageInit_MPCollectRings(void) +void StageInit_CollectRings(void) { +#if (GAME == GAME_SA1) CreatePaletteLoaderTask(0x2000, 814, 0, 0); CreatePaletteLoaderTask(0x2000, 815, 0, 0); CreatePaletteLoaderTask(0x2000, 820, 1, 0); CreatePaletteLoaderTask(0x2000, 820, 0, 0); m4aSongNumStart(MUS_VS_RING_RUSH_MODE); +#elif (GAME == GAME_SA2) +#ifndef COLLECT_RINGS_ROM + StageInit_SetMusic_inline(gCurrentLevel); +#else + m4aSongNumStart(MUS_VS_2); +#endif +#endif } + +#if (GAME == GAME_SA2) +#if COLLECT_RINGS_ROM +// ?? +void StageInit_CollectRingsRom(void) { m4aSongNumStart(MUS_VS_2); } +#endif + +#ifndef COLLECT_RINGS_ROM +void StageInit_SetMusic(u16 level) { StageInit_SetMusic_inline(level); } +#endif +#endif diff --git a/src/game/shared/stage/stage.c b/src/game/shared/stage/stage.c index 58792f6d8..dbb719ddc 100644 --- a/src/game/shared/stage/stage.c +++ b/src/game/shared/stage/stage.c @@ -125,6 +125,7 @@ extern const u8 CollTileRot_zone_1_act_1_fg[]; extern const u8 CollFlags_zone_1_act_1_fg[]; #ifndef COLLECT_RINGS_ROM +#if (GAME == GAME_SA2) void ApplyGameStageSettings(void) { gLevelScore = 0; @@ -149,19 +150,35 @@ void ApplyGameStageSettings(void) SetPlayerControls(LOADED_SAVE->buttonConfig.jump, LOADED_SAVE->buttonConfig.attack, LOADED_SAVE->buttonConfig.trick); } } +#endif void GameStageStart(void) { gTrappedAnimalVariant = 0; gBossIndex = 0; gRingCount = 0; - - // Unused leftover var from SA1, used for CPU "Partner" Tails gNumSingleplayerCharacters = 1; - if (gCurrentLevel != LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53)) { +#if (GAME == GAME_SA1) + if (IS_MULTI_PLAYER) { CallSetStageSpawnPos(gSelectedCharacter, gCurrentLevel, 0, &gPlayer); - gCheese = NULL; + } else if (IS_EXTRA_STAGE(gCurrentLevel)) { + CallSetStageSpawnPos(gSelectedCharacter, gCurrentLevel, 0, &gPlayer); + } else +#endif + { + if (!IS_EXTRA_STAGE(gCurrentLevel)) { + CallSetStageSpawnPos(gSelectedCharacter, gCurrentLevel, 0, &gPlayer); + +#if (GAME == GAME_SA1) + if (gTailsEnabled && (gSelectedCharacter == CHARACTER_SONIC)) { + gNumSingleplayerCharacters = 2; + CallSetStageSpawnPos(CHARACTER_TAILS, gCurrentLevel, 1, &gPartner); + } +#elif (GAME == GAME_SA2) + gCheese = NULL; +#endif + } } gStageTime = 0; @@ -173,11 +190,21 @@ void GameStageStart(void) gCheckpointTime = TIME(0, 0); +#if (GAME == GAME_SA1) + if ((gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) || (gGameMode == GAME_MODE_CHAO_HUNT)) { + gCourseTime = TIME(3, 0); + } else if (gGameMode == GAME_MODE_TEAM_PLAY) { + gCourseTime = TIME(5, 0); + } else { + gCourseTime = TIME(0, 0); + } +#elif (GAME == GAME_SA2) if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { gCourseTime = TIME(0, 0); } else { gCourseTime = TIME(3, 0); } +#endif CreateGameStage(); } @@ -186,24 +213,101 @@ void GameStageStart(void) void CreateGameStage(void) { u8 i; + u32 j; +#if (GAME == GAME_SA1) + struct Task *someTask; +#ifdef BUG_FIX + someTask = NULL; +#endif +#endif gGameStageTask = TaskCreate(Task_GameStage, 0, 0xff00, 0, TaskDestructor_GameStage); gActiveCollectRingEffectCount = 0; +#if (GAME == GAME_SA2) gSpecialRingCount = 0; - gFinalBossActive = FALSE; + gFinalBossActive = 0; +#endif gStageFlags |= (STAGE_FLAG__DISABLE_PAUSE_MENU | STAGE_FLAG__ACT_START); gStageFlags &= ~STAGE_FLAG__GRAVITY_INVERTED; +#if (GAME == GAME_SA2) gBossRingsShallRespawn = FALSE; gBossRingsRespawnCount = BOSS_RINGS_DEFAULT_RESPAWN_COUNT; gBoostEffectTasksCreated = 0; +#endif - sub_801F044(); + SA2_LABEL(sub_801F044)(); + +#if (GAME == GAME_SA1) + CreateStageMusicManager(); + + if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { + someTask = sub_80550F8(); + } + + gSpikesUnknownTimer = 0; + + if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { + CreateChaoHuntHUD(); + } + + if (IS_MULTI_PLAYER) { + CreatePlayer(gSelectedCharacter, gCurrentLevel, &gPlayer); + } else if (IS_EXTRA_STAGE(gCurrentLevel)) { + CreatePlayer(gSelectedCharacter, gCurrentLevel, &gPlayer); + } else { + CreatePlayer(gSelectedCharacter, gCurrentLevel, &gPlayer); + + if (gNumSingleplayerCharacters == 2) { + CreatePlayer(PARTNER_CHARACTER, gCurrentLevel, &gPartner); + } + } + + if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { + InitCamera(gCurrentLevel); + } else { + InitCamera(LEVEL_INDEX(ZONE_1, ACT_1)); + } + + gStageFlags &= ~STAGE_FLAG__2; + gStageFlags &= ~STAGE_FLAG__TIMER_REVERSED; + + if ((gGameMode != GAME_MODE_SINGLE_PLAYER) && (gGameMode != GAME_MODE_TIME_ATTACK) && (gGameMode != GAME_MODE_RACE) + && (gGameMode != GAME_MODE_MULTI_PLAYER)) { + gStageFlags |= STAGE_FLAG__TIMER_REVERSED; + } + + CreateStageRingsManager(); + CreateStageEntitiesManager(); + + if (LEVEL_TO_ZONE(gCurrentLevel) != ZONE_4) { + CreateStageWaterTask(-1, 0, 0); + } + + if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { + sStageInitProcs[gCurrentLevel](); + + if (gCurrentLevel == LEVEL_INDEX(ZONE_2, ACT_1)) { + if (CreateSpotlightsManager()) { +#ifdef BUG_FIX + if (someTask != NULL) +#endif + { + Struct_sub_80550F8 *strc = TASK_DATA(someTask); + strc->screenBlank = 1; + } + } + } + } else { + StageInit_MPCollectRings(); + } +#elif (GAME == GAME_SA2) gSpikesUnknownTimer = 0; if (!IS_EXTRA_STAGE(gCurrentLevel)) { CreatePlayer(gSelectedCharacter, gCurrentLevel, &gPlayer); } + #ifndef COLLECT_RINGS_ROM if (IS_BOSS_STAGE(gCurrentLevel)) { gBossCameraClampYLower = gBossCameraYClamps[LEVEL_TO_ZONE(gCurrentLevel)][0]; @@ -252,6 +356,7 @@ void CreateGameStage(void) CreateStageRingsManager(); CreateStageEntitiesManager(); +#endif SA2_LABEL(gUnknown_03001944) = 0; SA2_LABEL(gUnknown_030017F0) = 0x100; @@ -271,21 +376,38 @@ void CreateGameStage(void) for (i = 0; i < MULTI_SIO_PLAYERS_MAX; i++) { gMultiplayerCharRings[i] = 0; - if (CONNECTION_REGISTERED(i)) { + if (GetBit(gMultiplayerConnections, i)) { CreateMultiplayerPlayer(i); if (i != SIO_MULTI_CNT->id) { CreateOpponentPositionIndicator(i); - } else { + } +#if (GAME == GAME_SA2) + else { CreateSelfPositionIndicator(); } +#endif } gMultiplayerRanks[i] = -1; + if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { gMultiplayerCharacters[i] = i; } } +#if (GAME == GAME_SA1) + if (gGameMode == GAME_MODE_CHAO_HUNT || gGameMode == GAME_MODE_TEAM_PLAY) { + for (j = 0; j < ARRAY_COUNT(gChaoTasks); j++) { + gChaoTasks[j] = CreateMultiplayerChao((u8)(uintptr_t)gChaoTasks[j], j); + + if (gGameMode == GAME_MODE_CHAO_HUNT) { + // TODO: This check does not make sense! + break; + } + } + } +#endif + if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { gPlayer.itemEffect |= PLAYER_ITEM_EFFECT__TELEPORT; } @@ -297,6 +419,7 @@ void CreateGameStage(void) } } +#if (GAME == GAME_SA2) gCheese = NULL; if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { @@ -307,6 +430,7 @@ void CreateGameStage(void) CreateRaceProgressIndicator(); } #endif +#endif } void Task_GameStage(void) @@ -476,6 +600,7 @@ void Task_GameStage(void) #endif } +#if (GAME == GAME_SA2) #if COLLECT_RINGS_ROM void ApplyGameStageSettings(void) { @@ -516,6 +641,7 @@ void GameStageStart(void) CreateGameStage(); } #endif +#endif #ifndef COLLECT_RINGS_ROM void HandleLifeLost(void) @@ -564,7 +690,93 @@ void HandleLifeLost(void) } } } +#endif +#if (GAME == GAME_SA1) +void HandleDeath(void) +{ + gStageFlags |= STAGE_FLAG__DISABLE_PAUSE_MENU; + + if (GAME_MODE_IS_TIME_ATTACK) { + TasksDestroyAll(); + PAUSE_BACKGROUNDS_QUEUE(); + + gBgSpritesCount = 0; + + PAUSE_GRAPHICS_QUEUE(); + CreateTimeAttackLobbyScreen(); + } else if (--gNumLives == 0) { + if (SA2_LABEL(gUnknown_0300543C) > 0) { + SA2_LABEL(gUnknown_0300543C)--; + CreateGameOverScreen(OVER_CAUSE_ZERO_LIVES); + } else { + s32 score = (gLevelScore < LOADED_SAVE->unk420) ? LOADED_SAVE->unk420 : gLevelScore; + + LOADED_SAVE->unk420 = score; + + CreateGameOverScreen(OVER_CAUSE_TIME_UP); + } + } else { + CreateTimeOver(); + } +} + +void GoToNextLevel(void) +{ + u16 irqEnable, irqMasterEnable, dispStat; + + TasksDestroyAll(); + PAUSE_BACKGROUNDS_QUEUE(); + gBgSpritesCount = 0; + PAUSE_GRAPHICS_QUEUE(); + + m4aMPlayAllStop(); + m4aSoundVSyncOff(); + + gFlags |= FLAGS_8000; + irqEnable = REG_IE; + irqMasterEnable = REG_IME; + dispStat = REG_DISPSTAT; + + REG_IE = 0; + REG_IE; + REG_IME = 0; + REG_IME; + REG_DISPSTAT = 0; + REG_DISPSTAT; + + gFlags &= ~FLAGS_EXECUTE_HBLANK_COPY; + + SlowDmaStop(0); + SlowDmaStop(1); + SlowDmaStop(2); + SlowDmaStop(3); + + WriteSaveGame(); + + REG_IE = irqEnable; + REG_IE; + REG_IME = irqMasterEnable; + REG_IME; + REG_DISPSTAT = dispStat; + REG_DISPSTAT; + + m4aSoundVSyncOn(); + + gFlags &= ~FLAGS_8000; + + if (gGameMode != GAME_MODE_TIME_ATTACK) { + if (++gCurrentLevel < NUM_LEVEL_IDS) { + GameStageStart(); + } + } else { + CreateTimeAttackLobbyScreen(); + } +} +#endif + +#ifndef COLLECT_RINGS_ROM +#if (GAME == GAME_SA2) // NOTE: It's kind of redundant to check whether we are in Zone 5's boss stage // on every single stage init. (for changing music to Knuckles' fight BGM) // @@ -582,7 +794,9 @@ static inline void StageInit_SetMusic_inline(u16 level) m4aSongNumStart(MUS_VS_2); } } +#endif +#if (GAME == GAME_SA2) void StageInit_Zone1Act1(void) { CreateStageWaterTask(0x830, 0x7F207F20, 0); @@ -590,25 +804,59 @@ void StageInit_Zone1Act1(void) StageInit_SetMusic_inline(gCurrentLevel); } +#endif void StageInit_Zone3Act1(void) { +#if (GAME == GAME_SA1) + CreatePaletteLoaderTask(0x2000, 816, 0, 0); + CreatePaletteLoaderTask(0x2000, 817, 0, 0); + CreatePaletteLoaderTask(0x2000, 818, 0, 0); + CreatePaletteLoaderTask(0x2000, 824, 0, 0); + CreatePaletteLoaderTask(0x2000, 825, 0, 0); + CreatePaletteLoaderTask(0x2000, 827, 0, 0); // TODO/BUG?: Should this be 826? + CreatePaletteLoaderTask(0x2000, 827, 0, 0); + CreatePaletteLoaderTask(0x2000, 828, 0, 0); + CreatePaletteLoaderTask(0x2000, 843, 0, 0); + CreatePaletteLoaderTask(0x2000, 844, 0, 0); + CreatePaletteLoaderTask(0x2000, 826, 0, 0); // Chao Stage removes this loader + + m4aSongNumStart(MUS_CASINO_PARADISE__ACT_1); +#elif (GAME == GAME_SA2) CreatePaletteLoaderTask(0x2000, 900, 0, NULL); CreatePaletteLoaderTask(0x2000, 900, 1, NULL); CreatePaletteLoaderTask(0x2000, 900, 2, NULL); StageInit_SetMusic_inline(gCurrentLevel); +#endif } void StageInit_Zone3Act2(void) { +#if (GAME == GAME_SA1) + CreatePaletteLoaderTask(0x2000, 816, 0, 0); + CreatePaletteLoaderTask(0x2000, 817, 0, 0); + CreatePaletteLoaderTask(0x2000, 818, 0, 0); + CreatePaletteLoaderTask(0x2000, 824, 0, 0); + CreatePaletteLoaderTask(0x2000, 825, 0, 0); + CreatePaletteLoaderTask(0x2000, 827, 0, 0); // TODO/BUG?: Should this be 826? + CreatePaletteLoaderTask(0x2000, 827, 0, 0); + CreatePaletteLoaderTask(0x2000, 828, 0, 0); + CreatePaletteLoaderTask(0x2000, 843, 0, 0); + CreatePaletteLoaderTask(0x2000, 844, 0, 0); + CreatePaletteLoaderTask(0x2000, 826, 0, 0); + + m4aSongNumStart(MUS_CASINO_PARADISE__ACT_2); +#elif (GAME == GAME_SA2) CreatePaletteLoaderTask(0x2000, 900, 0, NULL); CreatePaletteLoaderTask(0x2000, 900, 1, NULL); CreatePaletteLoaderTask(0x2000, 900, 2, NULL); StageInit_SetMusic_inline(gCurrentLevel); +#endif } +#if (GAME == GAME_SA2) void StageInit_Zone4Act1(void) { CreatePaletteLoaderTask(0x2000, 906, 2, NULL); @@ -628,9 +876,58 @@ void StageInit_Zone4Act2(void) StageInit_SetMusic_inline(gCurrentLevel); } +#endif void StageInit_Zone6Act1(void) { +#if (GAME == GAME_SA1) + CreatePaletteLoaderTask(0x2000, 839, 0, 0); + CreatePaletteLoaderTask(0x2000, 840, 0, 0); + CreatePaletteLoaderTask(0x2000, 841, 0, 0); + CreatePaletteLoaderTask(0x2000, 842, 0, 0); + + m4aSongNumStart(MUS_EGG_ROCKET); + + if (gBossIndex > 0) { + // This section only gets called after hitting a checkpoint! + // + // Rocket "started", so don't allow player to leave. + gCamera.minX = EGG_ROCKET_LAUNCH_MIN_X; + gCamera.SA2_LABEL(unk50) |= 0x8000; + gBgCntRegs[3] &= ~(BGCNT_TXT512x512); + + if (gGameMode == GAME_MODE_SINGLE_PLAYER) { + gStageFlags |= STAGE_FLAG__TIMER_REVERSED; + gCourseTime = TIME(5, 0); + } + } + + if (gBossIndex > 1) { + // Rocket booster removed + // + // 'maxY' set because we are "climbing" the rocket and positive Y goes down. + gCamera.maxY = EGG_ROCKET_BOOSTER_DEPART_MAX_Y; + gCamera.SA2_LABEL(unk50) |= 0x8000; + gBgCntRegs[3] &= ~(BGCNT_TXT512x512); + + if (gGameMode == GAME_MODE_SINGLE_PLAYER) { + gStageFlags |= STAGE_FLAG__TIMER_REVERSED; + gCourseTime = TIME(5, 0); + } + } + + if (gBossIndex > 2) { + gBgCntRegs[3] &= ~(BGCNT_TXT512x512); + gCamera.SA2_LABEL(unk50) |= 0x4000; + gCamera.SA2_LABEL(unk50) &= ~0x8000; + gCamera.maxY = EGG_ROCKET_MIDDLE_DEPART_MAX_Y; + + if (gGameMode == GAME_MODE_SINGLE_PLAYER) { + gStageFlags |= STAGE_FLAG__TIMER_REVERSED; + gCourseTime = TIME(5, 0); + } + } +#elif (GAME == GAME_SA2) CreatePaletteLoaderTask(0x2000, 940, 0, NULL); CreatePaletteLoaderTask(0x2000, 940, 1, NULL); CreatePaletteLoaderTask(0x2000, 940, 2, NULL); @@ -644,8 +941,10 @@ void StageInit_Zone6Act1(void) CreatePaletteLoaderTask(0x2000, 940, 11, NULL); StageInit_SetMusic_inline(gCurrentLevel); +#endif } +#if (GAME == GAME_SA2) void StageInit_Zone6Act2(void) { CreatePaletteLoaderTask(0x2000, 940, 0, NULL); @@ -700,6 +999,48 @@ void StageInit_Zone7ActBoss(void) } #endif +#if (GAME == GAME_SA1) +void StageInit_PinballChaoGarden(void) +{ + CreatePaletteLoaderTask(0x2000, 816, 0, 0); + CreatePaletteLoaderTask(0x2000, 817, 0, 0); + CreatePaletteLoaderTask(0x2000, 818, 0, 0); + CreatePaletteLoaderTask(0x2000, 824, 0, 0); + CreatePaletteLoaderTask(0x2000, 825, 0, 0); + CreatePaletteLoaderTask(0x2000, 827, 0, 0); // TODO/BUG?: Should this be 826? + CreatePaletteLoaderTask(0x2000, 827, 0, 0); + CreatePaletteLoaderTask(0x2000, 828, 0, 0); + CreatePaletteLoaderTask(0x2000, 843, 0, 0); + CreatePaletteLoaderTask(0x2000, 844, 0, 0); + // Regular Casino Paradise loads palette anim 826 here. + + m4aSongNumStart(MUS_CASINO_PARADISE__ACT_1); +} +#endif +#endif + +#if (GAME == GAME_SA1) +void ApplyGameStageSettings(void) +{ + gLevelScore = 0; + gNumLives = 3; + gFinalBossActive = gCurrentLevel; + + if (IS_MULTI_PLAYER) { + gNumLives = 1; + } + + if ((gGameMode == GAME_MODE_TIME_ATTACK || (gGameMode == GAME_MODE_RACE) || (gGameMode == GAME_MODE_MULTI_PLAYER)) + || (gStageFlags & STAGE_FLAG__DEMO_RUNNING)) { + gDifficultyLevel = LOADED_SAVE->difficultyLevel; + LOADED_SAVE->difficultyLevel = DIFFICULTY_NORMAL; + } + + SetPlayerControls(LOADED_SAVE->btnConfig); + GameStageStart(); +} +#endif + void DestroyStageTasks(void) { TaskDestroy(gGameStageTask); @@ -715,6 +1056,7 @@ void DestroyStageTasks(void) DestroyCameraMovementTask(); } +#if (GAME == GAME_SA2) #ifndef COLLECT_RINGS_ROM void HandleDeath(void) { @@ -748,62 +1090,16 @@ void GoToNextLevel(void) gBgSpritesCount = 0; PAUSE_GRAPHICS_QUEUE(); -#if (GAME == GAME_SA1) - m4aMPlayAllStop(); - m4aSoundVSyncOff(); - - gFlags |= FLAGS_8000; - irqEnable = REG_IE; - irqMasterEnable = REG_IME; - dispStat = REG_DISPSTAT; - - REG_IE = 0; - REG_IE; - REG_IME = 0; - REG_IME; - REG_DISPSTAT = 0; - REG_DISPSTAT; - - gFlags &= ~FLAGS_EXECUTE_HBLANK_COPY; - - SlowDmaStop(0); - SlowDmaStop(1); - SlowDmaStop(2); - SlowDmaStop(3); -#endif - WriteSaveGame(); -#if (GAME == GAME_SA1) - REG_IE = irqEnable; - REG_IE; - REG_IME = irqMasterEnable; - REG_IME; - REG_DISPSTAT = dispStat; - REG_DISPSTAT; - - m4aSoundVSyncOn(); - - gFlags &= ~FLAGS_8000; -#endif - -#if (GAME == GAME_SA1) - if (gGameMode != GAME_MODE_TIME_ATTACK) -#elif (GAME == GAME_SA2) - if (gGameMode == GAME_MODE_SINGLE_PLAYER) -#endif - { + if (gGameMode == GAME_MODE_SINGLE_PLAYER) { if (++gCurrentLevel < NUM_LEVEL_IDS) { GameStageStart(); } } -#if (GAME == GAME_SA1) - else { - CreateTimeAttackLobbyScreen(); - } -#endif } #endif +#endif void TaskDestructor_GameStage(struct Task *t) { @@ -820,38 +1116,155 @@ void TaskDestructor_GameStage(struct Task *t) } #ifndef COLLECT_RINGS_ROM +#if (GAME == GAME_SA1) +void StageInit_Zone1Act1(void) +{ + CreatePaletteLoaderTask(0x2000, 814, 0, 0); + CreatePaletteLoaderTask(0x2000, 815, 0, 0); + + m4aSongNumStart(MUS_NEO_GREEN_HILL__ACT_1); +} +#endif + void StageInit_Zone1Act2(void) { +#if (GAME == GAME_SA1) + CreatePaletteLoaderTask(0x2000, 814, 0, 0); + CreatePaletteLoaderTask(0x2000, 815, 0, 0); + CreatePaletteLoaderTask(0x2000, 820, 1, 0); + CreatePaletteLoaderTask(0x2000, 820, 0, 0); + + if (IS_SINGLE_PLAYER) { + gCamera.maxX = gRefCollision->pxWidth - 768; + } + + m4aSongNumStart(MUS_NEO_GREEN_HILL__ACT_2); +#elif (GAME == GAME_SA2) CreatePaletteLoaderTask(0x2000, 897, 0, NULL); StageInit_SetMusic_inline(gCurrentLevel); +#endif } +#if (GAME == GAME_SA2) void StageInit_Zone1ActBoss(void) { StageInit_SetMusic_inline(gCurrentLevel); } +#endif -void StageInit_Zone2Act1(void) { StageInit_SetMusic_inline(gCurrentLevel); } +void StageInit_Zone2Act1(void) +{ +#if (GAME == GAME_SA1) + CreatePaletteLoaderTask(0x2000, 819, 0, 0); + CreatePaletteLoaderTask(0x2000, 845, 0, 0); + CreatePaletteLoaderTask(0x2000, 849, 0, 0); -void StageInit_Zone2Act2(void) { StageInit_SetMusic_inline(gCurrentLevel); } + m4aSongNumStart(MUS_SECRET_BASE__ACT_1); +#elif (GAME == GAME_SA2) + StageInit_SetMusic_inline(gCurrentLevel); +#endif +} + +void StageInit_Zone2Act2(void) +{ +#if (GAME == GAME_SA1) + CreatePaletteLoaderTask(0x2000, 819, 0, 0); + CreatePaletteLoaderTask(0x2000, 845, 0, 0); + CreatePaletteLoaderTask(0x2000, 849, 0, 0); + + m4aSongNumStart(MUS_SECRET_BASE__ACT_2); +#elif (GAME == GAME_SA2) + StageInit_SetMusic_inline(gCurrentLevel); +#endif +} + +#if (GAME == GAME_SA2) void StageInit_Zone2ActBoss(void) { StageInit_SetMusic_inline(gCurrentLevel); } void StageInit_Zone3ActBoss(void) { StageInit_SetMusic_inline(gCurrentLevel); } +#endif +#if (GAME == GAME_SA1) +void StageInit_Zone4Act1(void) +{ + CreatePaletteLoaderTask(0x2000, 822, 0, 0); + CreatePaletteLoaderTask(0x2000, 821, 0, 0); + CreateStageWaterTask(INITIAL_WATERLEVEL_ZONE_4_ACT_1, 0x7F207F20, 0); + + m4aSongNumStart(MUS_ICE_MOUNTAIN__ACT_1); +} + +void StageInit_Zone4Act2(void) +{ + CreatePaletteLoaderTask(0x2000, 822, 0, 0); + CreatePaletteLoaderTask(0x2000, 821, 0, 0); + CreateStageWaterTask(INITIAL_WATERLEVEL_ZONE_4_ACT_2, 0x7F207F20, 0); + + m4aSongNumStart(MUS_ICE_MOUNTAIN__ACT_2); +} +#endif + +#if (GAME == GAME_SA2) void StageInit_Zone4ActBoss(void) { StageInit_SetMusic_inline(gCurrentLevel); } +#endif -void StageInit_Zone5Act1(void) { StageInit_SetMusic_inline(gCurrentLevel); } +void StageInit_Zone5Act1(void) +{ +#if (GAME == GAME_SA1) + CreatePaletteLoaderTask(0x2000, 823, 0, 0); -void StageInit_Zone5Act2(void) { StageInit_SetMusic_inline(gCurrentLevel); } + m4aSongNumStart(MUS_ANGEL_ISLAND__ACT_1); +#elif (GAME == GAME_SA2) + StageInit_SetMusic_inline(gCurrentLevel); +#endif +} +void StageInit_Zone5Act2(void) +{ +#if (GAME == GAME_SA1) + CreatePaletteLoaderTask(0x2000, 823, 0, 0); + + m4aSongNumStart(MUS_ANGEL_ISLAND__ACT_2); +#elif (GAME == GAME_SA2) + StageInit_SetMusic_inline(gCurrentLevel); +#endif +} + +#if (GAME == GAME_SA2) void StageInit_Zone5ActBoss(void) { CreatePaletteLoaderTask(0x2000, 686, 0, NULL); StageInit_SetMusic_inline(gCurrentLevel); } +#endif +#if (GAME == GAME_SA1) +void StageInit_Zone6Act2(void) +{ + CreatePaletteLoaderTask(0x2000, 829, 0, 0); + CreatePaletteLoaderTask(0x2000, 830, 0, 0); + CreatePaletteLoaderTask(0x2000, 831, 0, 0); + CreatePaletteLoaderTask(0x2000, 850, 0, 0); + CreatePaletteLoaderTask(0x2000, 851, 0, 0); + CreatePaletteLoaderTask(0x2000, 848, 0, 0); + CreatePaletteLoaderTask(0x2000, 846, 0, 0); + CreatePaletteLoaderTask(0x2000, 847, 0, 0); + + m4aSongNumStart(MUS_COSMIC_ANGEL); +} +#endif + +#if (GAME == GAME_SA2) void StageInit_Zone6ActBoss(void) { StageInit_SetMusic_inline(gCurrentLevel); } +#endif +#if (GAME == GAME_SA1) +void StageInit_Zone7Act1(void) { m4aSongNumStart(MUS_X_ZONE); } + +void StageInit_Zone7Act2(void) { m4aSongNumStart(MUS_EXTRA_BOSS); } +#endif + +#if (GAME == GAME_SA2) void StageInit_ZoneFinalActXX(void) { CreatePaletteLoaderTask(0x2000, 686, 0, NULL); @@ -872,15 +1285,61 @@ void StageInit_33(void) { StageInit_SetMusic_inline(gCurrentLevel); } void StageInit_Dummy(void) { StageInit_SetMusic_inline(gCurrentLevel); } #endif +#if (GAME == GAME_SA1) +void StageInit_ForestChaoGarden(void) +{ + CreatePaletteLoaderTask(0x2000, 814, 0, 0); + CreatePaletteLoaderTask(0x2000, 815, 0, 0); + CreatePaletteLoaderTask(0x2000, 820, 1, 0); + CreatePaletteLoaderTask(0x2000, 820, 0, 0); + + m4aSongNumStart(MUS_NEO_GREEN_HILL__ACT_1); +} + +void StageInit_FactoryChaoGarden(void) +{ + CreatePaletteLoaderTask(0x2000, 819, 0, 0); + CreatePaletteLoaderTask(0x2000, 845, 0, 0); + CreatePaletteLoaderTask(0x2000, 849, 0, 0); + + m4aSongNumStart(MUS_SECRET_BASE__ACT_1); +} + +void StageInit_SpaceChaoGarden(void) +{ + CreatePaletteLoaderTask(0x2000, 829, 0, 0); + CreatePaletteLoaderTask(0x2000, 830, 0, 0); + CreatePaletteLoaderTask(0x2000, 831, 0, 0); + CreatePaletteLoaderTask(0x2000, 850, 0, 0); + CreatePaletteLoaderTask(0x2000, 851, 0, 0); + CreatePaletteLoaderTask(0x2000, 848, 0, 0); + CreatePaletteLoaderTask(0x2000, 846, 0, 0); + CreatePaletteLoaderTask(0x2000, 847, 0, 0); + + m4aSongNumStart(MUS_COSMIC_ANGEL); +} +#endif +#endif + void StageInit_CollectRings(void) { +#if (GAME == GAME_SA1) + CreatePaletteLoaderTask(0x2000, 814, 0, 0); + CreatePaletteLoaderTask(0x2000, 815, 0, 0); + CreatePaletteLoaderTask(0x2000, 820, 1, 0); + CreatePaletteLoaderTask(0x2000, 820, 0, 0); + + m4aSongNumStart(MUS_VS_RING_RUSH_MODE); +#elif (GAME == GAME_SA2) #ifndef COLLECT_RINGS_ROM StageInit_SetMusic_inline(gCurrentLevel); #else m4aSongNumStart(MUS_VS_2); #endif +#endif } +#if (GAME == GAME_SA2) #if COLLECT_RINGS_ROM // ?? void StageInit_CollectRingsRom(void) { m4aSongNumStart(MUS_VS_2); } @@ -889,3 +1348,4 @@ void StageInit_CollectRingsRom(void) { m4aSongNumStart(MUS_VS_2); } #ifndef COLLECT_RINGS_ROM void StageInit_SetMusic(u16 level) { StageInit_SetMusic_inline(level); } #endif +#endif