stage.c mostly aligned

This commit is contained in:
Oliver Bell committed 2026-04-27 23:59:50 +01:00
1 parent d485fedd3a
commit 3d17f86417
2 files changed
+932 -100

No files matched your search

+412 -40
View File
@@ -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
+520 -60
View File
@@ -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