Document thunderstorm

This commit is contained in:
GriffinR
2021-04-04 00:23:06 -04:00
parent 1494a83035
commit b926fa6b07
3 changed files with 111 additions and 78 deletions
+24 -19
View File
@@ -46,11 +46,11 @@ struct Weather
u8 gammaStepDelay; u8 gammaStepDelay;
u8 gammaStepFrameCounter; u8 gammaStepFrameCounter;
u16 fadeDestColor; u16 fadeDestColor;
/*0x6C6*/ u8 palProcessingState; u8 palProcessingState;
/*0x6C7*/ u8 fadeScreenCounter; u8 fadeScreenCounter;
/*0x6C8*/ bool8 readyForInit; bool8 readyForInit;
/*0x6C9*/ u8 taskId; u8 taskId;
/*0x6CA*/ u8 unknown_6CA; u8 unknown_6CA;
u8 unknown_6CB; u8 unknown_6CB;
u16 initStep; u16 initStep;
u16 finishStep; u16 finishStep;
@@ -60,6 +60,7 @@ struct Weather
bool8 weatherChangeComplete; bool8 weatherChangeComplete;
u8 weatherPicSpritePalIndex; u8 weatherPicSpritePalIndex;
u8 altGammaSpritePalIndex; u8 altGammaSpritePalIndex;
// Rain
u16 rainSpriteVisibleCounter; u16 rainSpriteVisibleCounter;
u8 curRainSpriteIndex; u8 curRainSpriteIndex;
u8 targetRainSpriteCount; u8 targetRainSpriteCount;
@@ -67,37 +68,41 @@ struct Weather
u8 rainSpriteVisibleDelay; u8 rainSpriteVisibleDelay;
u8 isDownpour; u8 isDownpour;
u8 rainStrength; u8 rainStrength;
/*0x6DE*/ u8 cloudSpritesCreated; u8 cloudSpritesCreated;
u8 filler_6DF[1]; // Snow
u16 snowflakeVisibleCounter; u16 snowflakeVisibleCounter;
u16 unknown_6E2; u16 unknown_6E2;
u8 snowflakeSpriteCount; u8 snowflakeSpriteCount;
u8 targetSnowflakeSpriteCount; u8 targetSnowflakeSpriteCount;
u16 unknown_6E6; // Thunderstorm
u16 thunderDelay;
u16 thunderCounter; u16 thunderCounter;
u8 unknown_6EA; bool8 thunderAllowEnd;
u8 unknown_6EB; bool8 thunderSkipShort;
u8 unknown_6EC; u8 thunderShortRetries;
u8 thunderTriggered; bool8 thunderTriggered;
// Horizontal fog
u16 fogHScrollPosX; u16 fogHScrollPosX;
u16 fogHScrollCounter; u16 fogHScrollCounter;
u16 fogHScrollOffset; u16 fogHScrollOffset;
u8 lightenedFogSpritePals[6]; u8 lightenedFogSpritePals[6];
u8 lightenedFogSpritePalsCount; u8 lightenedFogSpritePalsCount;
u8 fogHSpritesCreated; u8 fogHSpritesCreated;
// Ash
u16 ashBaseSpritesX; u16 ashBaseSpritesX;
u16 unknown_6FE; u16 unknown_6FE;
u8 ashSpritesCreated; u8 ashSpritesCreated;
u8 filler_701[3]; // Sandstorm
u32 sandstormXOffset; u32 sandstormXOffset;
u32 sandstormYOffset; u32 sandstormYOffset;
u8 filler_70C[2]; u16 sandstormUnused;
u16 sandstormBaseSpritesX; u16 sandstormBaseSpritesX;
u16 sandstormPosY; u16 sandstormPosY;
u16 sandstormWaveIndex; u16 sandstormWaveIndex;
u16 sandstormWaveCounter; u16 sandstormWaveCounter;
u8 sandstormSpritesCreated; u8 sandstormSpritesCreated;
u8 sandstormSwirlSpritesCreated; u8 sandstormSwirlSpritesCreated;
// Diagonal fog
u16 fogDBaseSpritesX; u16 fogDBaseSpritesX;
u16 fogDPosY; u16 fogDPosY;
u16 fogDScrollXCounter; u16 fogDScrollXCounter;
@@ -105,13 +110,13 @@ struct Weather
u16 fogDXOffset; u16 fogDXOffset;
u16 fogDYOffset; u16 fogDYOffset;
u8 fogDSpritesCreated; u8 fogDSpritesCreated;
u8 filler_725[1]; // Bubbles
u16 bubblesDelayCounter; u16 bubblesDelayCounter;
u16 bubblesDelayIndex; u16 bubblesDelayIndex;
u16 bubblesCoordsIndex; u16 bubblesCoordsIndex;
u16 bubblesSpriteCount; u16 bubblesSpriteCount;
u8 bubblesSpritesCreated; u8 bubblesSpritesCreated;
u8 filler_72F;
u16 currBlendEVA; u16 currBlendEVA;
u16 currBlendEVB; u16 currBlendEVB;
u16 targetBlendEVA; u16 targetBlendEVA;
@@ -119,12 +124,12 @@ struct Weather
u8 blendUpdateCounter; u8 blendUpdateCounter;
u8 blendFrameCounter; u8 blendFrameCounter;
u8 blendDelay; u8 blendDelay;
u8 filler_73B[0x3C-0x3B]; // Drought
s16 droughtBrightnessStage; s16 droughtBrightnessStage;
s16 droughtLastBrightnessStage; s16 droughtLastBrightnessStage;
s16 droughtTimer; s16 droughtTimer;
s16 droughtState; s16 droughtState;
u8 filler_744[0xD-4]; u8 droughtUnused[9];
s8 loadDroughtPalsIndex; s8 loadDroughtPalsIndex;
u8 loadDroughtPalsOffset; u8 loadDroughtPalsOffset;
}; };
@@ -141,7 +146,7 @@ void StartWeather(void);
void SetNextWeather(u8 weather); void SetNextWeather(u8 weather);
void SetCurrentAndNextWeather(u8 weather); void SetCurrentAndNextWeather(u8 weather);
void SetCurrentAndNextWeatherNoDelay(u8 weather); void SetCurrentAndNextWeatherNoDelay(u8 weather);
void sub_80ABC48(s8 gammaIndex); void ApplyWeatherGammaShiftIfIdle(s8 gammaIndex);
void sub_80ABC7C(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay); void sub_80ABC7C(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay);
void FadeScreen(u8 mode, s8 delay); void FadeScreen(u8 mode, s8 delay);
bool8 IsWeatherNotFadingIn(void); bool8 IsWeatherNotFadingIn(void);
+3 -3
View File
@@ -710,7 +710,7 @@ static bool8 LightenSpritePaletteInFog(u8 paletteIndex)
return FALSE; return FALSE;
} }
void sub_80ABC48(s8 gammaIndex) void ApplyWeatherGammaShiftIfIdle(s8 gammaIndex)
{ {
if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE)
{ {
@@ -728,7 +728,7 @@ void sub_80ABC7C(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay)
gWeatherPtr->gammaTargetIndex = gammaTargetIndex; gWeatherPtr->gammaTargetIndex = gammaTargetIndex;
gWeatherPtr->gammaStepFrameCounter = 0; gWeatherPtr->gammaStepFrameCounter = 0;
gWeatherPtr->gammaStepDelay = gammaStepDelay; gWeatherPtr->gammaStepDelay = gammaStepDelay;
sub_80ABC48(gammaIndex); ApplyWeatherGammaShiftIfIdle(gammaIndex);
} }
} }
@@ -887,7 +887,7 @@ bool8 LoadDroughtWeatherPalettes(void)
static void SetDroughtGamma(s8 gammaIndex) static void SetDroughtGamma(s8 gammaIndex)
{ {
sub_80ABC48(-gammaIndex - 1); ApplyWeatherGammaShiftIfIdle(-gammaIndex - 1);
} }
void DroughtStateInit(void) void DroughtStateInit(void)
+84 -56
View File
@@ -677,7 +677,7 @@ static bool8 CreateRainSprite(void)
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
{ {
gSprites[spriteId].tActive = 0; gSprites[spriteId].tActive = FALSE;
gSprites[spriteId].tRandom = spriteIndex * 145; gSprites[spriteId].tRandom = spriteIndex * 145;
while (gSprites[spriteId].tRandom >= 600) while (gSprites[spriteId].tRandom >= 600)
gSprites[spriteId].tRandom -= 600; gSprites[spriteId].tRandom -= 600;
@@ -722,12 +722,12 @@ static bool8 UpdateVisibleRainSprites(void)
gWeatherPtr->rainSpriteVisibleCounter = 0; gWeatherPtr->rainSpriteVisibleCounter = 0;
if (gWeatherPtr->curRainSpriteIndex < gWeatherPtr->targetRainSpriteCount) if (gWeatherPtr->curRainSpriteIndex < gWeatherPtr->targetRainSpriteCount)
{ {
gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex++]->tActive = 1; gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex++]->tActive = TRUE;
} }
else else
{ {
gWeatherPtr->curRainSpriteIndex--; gWeatherPtr->curRainSpriteIndex--;
gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex]->tActive = 0; gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex]->tActive = FALSE;
gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex]->invisible = TRUE; gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex]->invisible = TRUE;
} }
} }
@@ -1011,9 +1011,32 @@ static void UpdateSnowflakeSprite(struct Sprite *sprite)
// WEATHER_RAIN_THUNDERSTORM // WEATHER_RAIN_THUNDERSTORM
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
enum {
// This block of states is run only once
// when first setting up the thunderstorm
TSTORM_STATE_LOAD_RAIN,
TSTORM_STATE_CREATE_RAIN,
TSTORM_STATE_INIT_RAIN,
TSTORM_STATE_WAIT_CHANGE,
// The thunderstorm loops through these states,
// not necessarily in order.
TSTORM_STATE_LOOP_START,
TSTORM_STATE_LOOP_WAIT,
TSTORM_STATE_INIT_THUNDER_SHORT_1,
TSTORM_STATE_INIT_THUNDER_SHORT_2,
TSTORM_STATE_TRY_THUNDER_SHORT,
TSTORM_STATE_TRY_NEW_THUNDER,
TSTORM_STATE_WAIT_THUNDER_SHORT,
TSTORM_STATE_INIT_THUNDER_LONG,
TSTORM_STATE_WAIT_THUNDER_LONG,
TSTORM_STATE_FADE_THUNDER_LONG,
TSTORM_STATE_END_THUNDER_LONG,
};
void Thunderstorm_InitVars(void) void Thunderstorm_InitVars(void)
{ {
gWeatherPtr->initStep = 0; gWeatherPtr->initStep = TSTORM_STATE_LOAD_RAIN;
gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->weatherGfxLoaded = FALSE;
gWeatherPtr->rainSpriteVisibleCounter = 0; gWeatherPtr->rainSpriteVisibleCounter = 0;
gWeatherPtr->rainSpriteVisibleDelay = 4; gWeatherPtr->rainSpriteVisibleDelay = 4;
@@ -1022,7 +1045,7 @@ void Thunderstorm_InitVars(void)
gWeatherPtr->gammaTargetIndex = 3; gWeatherPtr->gammaTargetIndex = 3;
gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment
gWeatherPtr->thunderTriggered = 0; gWeatherPtr->thunderTriggered = FALSE;
SetRainStrengthFromSoundEffect(SE_THUNDERSTORM); SetRainStrengthFromSoundEffect(SE_THUNDERSTORM);
} }
@@ -1042,7 +1065,7 @@ static void SetThunderCounter(u16);
void Downpour_InitVars(void) void Downpour_InitVars(void)
{ {
gWeatherPtr->initStep = 0; gWeatherPtr->initStep = TSTORM_STATE_LOAD_RAIN;
gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->weatherGfxLoaded = FALSE;
gWeatherPtr->rainSpriteVisibleCounter = 0; gWeatherPtr->rainSpriteVisibleCounter = 0;
gWeatherPtr->rainSpriteVisibleDelay = 4; gWeatherPtr->rainSpriteVisibleDelay = 4;
@@ -1066,100 +1089,105 @@ void Thunderstorm_Main(void)
UpdateThunderSound(); UpdateThunderSound();
switch (gWeatherPtr->initStep) switch (gWeatherPtr->initStep)
{ {
case 0: case TSTORM_STATE_LOAD_RAIN:
LoadRainSpriteSheet(); LoadRainSpriteSheet();
gWeatherPtr->initStep++; gWeatherPtr->initStep++;
break; break;
case 1: case TSTORM_STATE_CREATE_RAIN:
if (!CreateRainSprite()) if (!CreateRainSprite())
gWeatherPtr->initStep++; gWeatherPtr->initStep++;
break; break;
case 2: case TSTORM_STATE_INIT_RAIN:
if (!UpdateVisibleRainSprites()) if (!UpdateVisibleRainSprites())
{ {
gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->weatherGfxLoaded = TRUE;
gWeatherPtr->initStep++; gWeatherPtr->initStep++;
} }
break; break;
case 3: case TSTORM_STATE_WAIT_CHANGE:
if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER) if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER)
gWeatherPtr->initStep = 6; gWeatherPtr->initStep = TSTORM_STATE_INIT_THUNDER_SHORT_1;
break; break;
case 4: case TSTORM_STATE_LOOP_START:
gWeatherPtr->unknown_6EA = 1; gWeatherPtr->thunderAllowEnd = TRUE;
gWeatherPtr->unknown_6E6 = (Random() % 360) + 360; gWeatherPtr->thunderDelay = (Random() % 360) + 360;
gWeatherPtr->initStep++; gWeatherPtr->initStep++;
// fall through // fall through
case 5: case TSTORM_STATE_LOOP_WAIT:
if (--gWeatherPtr->unknown_6E6 == 0) // Wait between 360-720 frames before trying thunder again
if (--gWeatherPtr->thunderDelay == 0)
gWeatherPtr->initStep++; gWeatherPtr->initStep++;
break; break;
case 6: case TSTORM_STATE_INIT_THUNDER_SHORT_1:
gWeatherPtr->unknown_6EA = 1; gWeatherPtr->thunderAllowEnd = TRUE;
gWeatherPtr->unknown_6EB = Random() % 2; gWeatherPtr->thunderSkipShort = Random() % 2;
gWeatherPtr->initStep++; gWeatherPtr->initStep++;
break; break;
case 7: case TSTORM_STATE_INIT_THUNDER_SHORT_2:
gWeatherPtr->unknown_6EC = (Random() & 1) + 1; gWeatherPtr->thunderShortRetries = (Random() & 1) + 1;
gWeatherPtr->initStep++; gWeatherPtr->initStep++;
// fall through // fall through
case 8: case TSTORM_STATE_TRY_THUNDER_SHORT:
sub_80ABC48(19); ApplyWeatherGammaShiftIfIdle(19);
if (gWeatherPtr->unknown_6EB == 0 && gWeatherPtr->unknown_6EC == 1) if (!gWeatherPtr->thunderSkipShort && gWeatherPtr->thunderShortRetries == 1)
SetThunderCounter(20); SetThunderCounter(20); // Do short thunder
gWeatherPtr->unknown_6E6 = (Random() % 3) + 6; gWeatherPtr->thunderDelay = (Random() % 3) + 6;
gWeatherPtr->initStep++; gWeatherPtr->initStep++;
break; break;
case 9: case TSTORM_STATE_TRY_NEW_THUNDER:
if (--gWeatherPtr->unknown_6E6 == 0) if (--gWeatherPtr->thunderDelay == 0)
{ {
sub_80ABC48(3); ApplyWeatherGammaShiftIfIdle(3);
gWeatherPtr->unknown_6EA = 1; gWeatherPtr->thunderAllowEnd = TRUE;
if (--gWeatherPtr->unknown_6EC != 0) if (--gWeatherPtr->thunderShortRetries != 0)
{ {
gWeatherPtr->unknown_6E6 = (Random() % 16) + 60; // Try a short thunder again
gWeatherPtr->initStep = 10; gWeatherPtr->thunderDelay = (Random() % 16) + 60;
gWeatherPtr->initStep = TSTORM_STATE_WAIT_THUNDER_SHORT;
} }
else if (gWeatherPtr->unknown_6EB == 0) else if (!gWeatherPtr->thunderSkipShort)
{ {
gWeatherPtr->initStep = 4; // No more thunder, restart loop
gWeatherPtr->initStep = TSTORM_STATE_LOOP_START;
} }
else else
{ {
gWeatherPtr->initStep = 11; // Set up long thunder
gWeatherPtr->initStep = TSTORM_STATE_INIT_THUNDER_LONG;
} }
} }
break; break;
case 10: case TSTORM_STATE_WAIT_THUNDER_SHORT:
if (--gWeatherPtr->unknown_6E6 == 0) if (--gWeatherPtr->thunderDelay == 0)
gWeatherPtr->initStep = 8; gWeatherPtr->initStep = TSTORM_STATE_TRY_THUNDER_SHORT;
break; break;
case 11: case TSTORM_STATE_INIT_THUNDER_LONG:
gWeatherPtr->unknown_6E6 = (Random() % 16) + 60; gWeatherPtr->thunderDelay = (Random() % 16) + 60;
gWeatherPtr->initStep++; gWeatherPtr->initStep++;
break; break;
case 12: case TSTORM_STATE_WAIT_THUNDER_LONG:
if (--gWeatherPtr->unknown_6E6 == 0) if (--gWeatherPtr->thunderDelay == 0)
{ {
// Do long thunder
SetThunderCounter(100); SetThunderCounter(100);
sub_80ABC48(19); ApplyWeatherGammaShiftIfIdle(19);
gWeatherPtr->unknown_6E6 = (Random() & 0xF) + 30; gWeatherPtr->thunderDelay = (Random() & 0xF) + 30;
gWeatherPtr->initStep++; gWeatherPtr->initStep++;
} }
break; break;
case 13: case TSTORM_STATE_FADE_THUNDER_LONG:
if (--gWeatherPtr->unknown_6E6 == 0) if (--gWeatherPtr->thunderDelay == 0)
{ {
sub_80ABC7C(19, 3, 5); sub_80ABC7C(19, 3, 5);
gWeatherPtr->initStep++; gWeatherPtr->initStep++;
} }
break; break;
case 14: case TSTORM_STATE_END_THUNDER_LONG:
if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE)
{ {
gWeatherPtr->unknown_6EA = 1; gWeatherPtr->thunderAllowEnd = TRUE;
gWeatherPtr->initStep = 4; gWeatherPtr->initStep = TSTORM_STATE_LOOP_START;
} }
break; break;
} }
@@ -1170,12 +1198,12 @@ bool8 Thunderstorm_Finish(void)
switch (gWeatherPtr->finishStep) switch (gWeatherPtr->finishStep)
{ {
case 0: case 0:
gWeatherPtr->unknown_6EA = 0; gWeatherPtr->thunderAllowEnd = FALSE;
gWeatherPtr->finishStep++; gWeatherPtr->finishStep++;
// fall through // fall through
case 1: case 1:
Thunderstorm_Main(); Thunderstorm_Main();
if (gWeatherPtr->unknown_6EA) if (gWeatherPtr->thunderAllowEnd)
{ {
if (gWeatherPtr->nextWeather == WEATHER_RAIN if (gWeatherPtr->nextWeather == WEATHER_RAIN
|| gWeatherPtr->nextWeather == WEATHER_RAIN_THUNDERSTORM || gWeatherPtr->nextWeather == WEATHER_RAIN_THUNDERSTORM
@@ -1203,16 +1231,16 @@ bool8 Thunderstorm_Finish(void)
static void SetThunderCounter(u16 max) static void SetThunderCounter(u16 max)
{ {
if (gWeatherPtr->thunderTriggered == 0) if (!gWeatherPtr->thunderTriggered)
{ {
gWeatherPtr->thunderCounter = Random() % max; gWeatherPtr->thunderCounter = Random() % max;
gWeatherPtr->thunderTriggered = 1; gWeatherPtr->thunderTriggered = TRUE;
} }
} }
static void UpdateThunderSound(void) static void UpdateThunderSound(void)
{ {
if (gWeatherPtr->thunderTriggered == 1) if (gWeatherPtr->thunderTriggered == TRUE)
{ {
if (gWeatherPtr->thunderCounter == 0) if (gWeatherPtr->thunderCounter == 0)
{ {
@@ -1224,7 +1252,7 @@ static void UpdateThunderSound(void)
else else
PlaySE(SE_THUNDER2); PlaySE(SE_THUNDER2);
gWeatherPtr->thunderTriggered = 0; gWeatherPtr->thunderTriggered = FALSE;
} }
else else
{ {