summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGriffinR <griffin.g.richards@gmail.com>2021-04-04 00:23:06 -0400
committerGriffinR <griffin.g.richards@gmail.com>2021-04-04 00:44:20 -0400
commitb926fa6b0741cc878e4de5fe81183af12275d267 (patch)
tree5fffd12455826e33346f593bdf9d0e7800d76701
parent1494a8303579e2bd92d24554b1f3e1cebd97a273 (diff)
Document thunderstorm
-rw-r--r--include/field_weather.h43
-rw-r--r--src/field_weather.c6
-rw-r--r--src/field_weather_effect.c140
3 files changed, 111 insertions, 78 deletions
diff --git a/include/field_weather.h b/include/field_weather.h
index 894c661be..48118c9a6 100644
--- a/include/field_weather.h
+++ b/include/field_weather.h
@@ -46,11 +46,11 @@ struct Weather
u8 gammaStepDelay;
u8 gammaStepFrameCounter;
u16 fadeDestColor;
- /*0x6C6*/ u8 palProcessingState;
- /*0x6C7*/ u8 fadeScreenCounter;
- /*0x6C8*/ bool8 readyForInit;
- /*0x6C9*/ u8 taskId;
- /*0x6CA*/ u8 unknown_6CA;
+ u8 palProcessingState;
+ u8 fadeScreenCounter;
+ bool8 readyForInit;
+ u8 taskId;
+ u8 unknown_6CA;
u8 unknown_6CB;
u16 initStep;
u16 finishStep;
@@ -60,6 +60,7 @@ struct Weather
bool8 weatherChangeComplete;
u8 weatherPicSpritePalIndex;
u8 altGammaSpritePalIndex;
+ // Rain
u16 rainSpriteVisibleCounter;
u8 curRainSpriteIndex;
u8 targetRainSpriteCount;
@@ -67,37 +68,41 @@ struct Weather
u8 rainSpriteVisibleDelay;
u8 isDownpour;
u8 rainStrength;
- /*0x6DE*/ u8 cloudSpritesCreated;
- u8 filler_6DF[1];
+ u8 cloudSpritesCreated;
+ // Snow
u16 snowflakeVisibleCounter;
u16 unknown_6E2;
u8 snowflakeSpriteCount;
u8 targetSnowflakeSpriteCount;
- u16 unknown_6E6;
+ // Thunderstorm
+ u16 thunderDelay;
u16 thunderCounter;
- u8 unknown_6EA;
- u8 unknown_6EB;
- u8 unknown_6EC;
- u8 thunderTriggered;
+ bool8 thunderAllowEnd;
+ bool8 thunderSkipShort;
+ u8 thunderShortRetries;
+ bool8 thunderTriggered;
+ // Horizontal fog
u16 fogHScrollPosX;
u16 fogHScrollCounter;
u16 fogHScrollOffset;
u8 lightenedFogSpritePals[6];
u8 lightenedFogSpritePalsCount;
u8 fogHSpritesCreated;
+ // Ash
u16 ashBaseSpritesX;
u16 unknown_6FE;
u8 ashSpritesCreated;
- u8 filler_701[3];
+ // Sandstorm
u32 sandstormXOffset;
u32 sandstormYOffset;
- u8 filler_70C[2];
+ u16 sandstormUnused;
u16 sandstormBaseSpritesX;
u16 sandstormPosY;
u16 sandstormWaveIndex;
u16 sandstormWaveCounter;
u8 sandstormSpritesCreated;
u8 sandstormSwirlSpritesCreated;
+ // Diagonal fog
u16 fogDBaseSpritesX;
u16 fogDPosY;
u16 fogDScrollXCounter;
@@ -105,13 +110,13 @@ struct Weather
u16 fogDXOffset;
u16 fogDYOffset;
u8 fogDSpritesCreated;
- u8 filler_725[1];
+ // Bubbles
u16 bubblesDelayCounter;
u16 bubblesDelayIndex;
u16 bubblesCoordsIndex;
u16 bubblesSpriteCount;
u8 bubblesSpritesCreated;
- u8 filler_72F;
+
u16 currBlendEVA;
u16 currBlendEVB;
u16 targetBlendEVA;
@@ -119,12 +124,12 @@ struct Weather
u8 blendUpdateCounter;
u8 blendFrameCounter;
u8 blendDelay;
- u8 filler_73B[0x3C-0x3B];
+ // Drought
s16 droughtBrightnessStage;
s16 droughtLastBrightnessStage;
s16 droughtTimer;
s16 droughtState;
- u8 filler_744[0xD-4];
+ u8 droughtUnused[9];
s8 loadDroughtPalsIndex;
u8 loadDroughtPalsOffset;
};
@@ -141,7 +146,7 @@ void StartWeather(void);
void SetNextWeather(u8 weather);
void SetCurrentAndNextWeather(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 FadeScreen(u8 mode, s8 delay);
bool8 IsWeatherNotFadingIn(void);
diff --git a/src/field_weather.c b/src/field_weather.c
index 331f0be78..67051377c 100644
--- a/src/field_weather.c
+++ b/src/field_weather.c
@@ -710,7 +710,7 @@ static bool8 LightenSpritePaletteInFog(u8 paletteIndex)
return FALSE;
}
-void sub_80ABC48(s8 gammaIndex)
+void ApplyWeatherGammaShiftIfIdle(s8 gammaIndex)
{
if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE)
{
@@ -728,7 +728,7 @@ void sub_80ABC7C(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay)
gWeatherPtr->gammaTargetIndex = gammaTargetIndex;
gWeatherPtr->gammaStepFrameCounter = 0;
gWeatherPtr->gammaStepDelay = gammaStepDelay;
- sub_80ABC48(gammaIndex);
+ ApplyWeatherGammaShiftIfIdle(gammaIndex);
}
}
@@ -887,7 +887,7 @@ bool8 LoadDroughtWeatherPalettes(void)
static void SetDroughtGamma(s8 gammaIndex)
{
- sub_80ABC48(-gammaIndex - 1);
+ ApplyWeatherGammaShiftIfIdle(-gammaIndex - 1);
}
void DroughtStateInit(void)
diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c
index b8a09faad..1069bc9a2 100644
--- a/src/field_weather_effect.c
+++ b/src/field_weather_effect.c
@@ -677,7 +677,7 @@ static bool8 CreateRainSprite(void)
if (spriteId != MAX_SPRITES)
{
- gSprites[spriteId].tActive = 0;
+ gSprites[spriteId].tActive = FALSE;
gSprites[spriteId].tRandom = spriteIndex * 145;
while (gSprites[spriteId].tRandom >= 600)
gSprites[spriteId].tRandom -= 600;
@@ -722,12 +722,12 @@ static bool8 UpdateVisibleRainSprites(void)
gWeatherPtr->rainSpriteVisibleCounter = 0;
if (gWeatherPtr->curRainSpriteIndex < gWeatherPtr->targetRainSpriteCount)
{
- gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex++]->tActive = 1;
+ gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex++]->tActive = TRUE;
}
else
{
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;
}
}
@@ -1011,9 +1011,32 @@ static void UpdateSnowflakeSprite(struct Sprite *sprite)
// 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)
{
- gWeatherPtr->initStep = 0;
+ gWeatherPtr->initStep = TSTORM_STATE_LOAD_RAIN;
gWeatherPtr->weatherGfxLoaded = FALSE;
gWeatherPtr->rainSpriteVisibleCounter = 0;
gWeatherPtr->rainSpriteVisibleDelay = 4;
@@ -1022,7 +1045,7 @@ void Thunderstorm_InitVars(void)
gWeatherPtr->gammaTargetIndex = 3;
gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment
- gWeatherPtr->thunderTriggered = 0;
+ gWeatherPtr->thunderTriggered = FALSE;
SetRainStrengthFromSoundEffect(SE_THUNDERSTORM);
}
@@ -1042,7 +1065,7 @@ static void SetThunderCounter(u16);
void Downpour_InitVars(void)
{
- gWeatherPtr->initStep = 0;
+ gWeatherPtr->initStep = TSTORM_STATE_LOAD_RAIN;
gWeatherPtr->weatherGfxLoaded = FALSE;
gWeatherPtr->rainSpriteVisibleCounter = 0;
gWeatherPtr->rainSpriteVisibleDelay = 4;
@@ -1066,100 +1089,105 @@ void Thunderstorm_Main(void)
UpdateThunderSound();
switch (gWeatherPtr->initStep)
{
- case 0:
+ case TSTORM_STATE_LOAD_RAIN:
LoadRainSpriteSheet();
gWeatherPtr->initStep++;
break;
- case 1:
+ case TSTORM_STATE_CREATE_RAIN:
if (!CreateRainSprite())
gWeatherPtr->initStep++;
break;
- case 2:
+ case TSTORM_STATE_INIT_RAIN:
if (!UpdateVisibleRainSprites())
{
gWeatherPtr->weatherGfxLoaded = TRUE;
gWeatherPtr->initStep++;
}
break;
- case 3:
+ case TSTORM_STATE_WAIT_CHANGE:
if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER)
- gWeatherPtr->initStep = 6;
+ gWeatherPtr->initStep = TSTORM_STATE_INIT_THUNDER_SHORT_1;
break;
- case 4:
- gWeatherPtr->unknown_6EA = 1;
- gWeatherPtr->unknown_6E6 = (Random() % 360) + 360;
+ case TSTORM_STATE_LOOP_START:
+ gWeatherPtr->thunderAllowEnd = TRUE;
+ gWeatherPtr->thunderDelay = (Random() % 360) + 360;
gWeatherPtr->initStep++;
// fall through
- case 5:
- if (--gWeatherPtr->unknown_6E6 == 0)
+ case TSTORM_STATE_LOOP_WAIT:
+ // Wait between 360-720 frames before trying thunder again
+ if (--gWeatherPtr->thunderDelay == 0)
gWeatherPtr->initStep++;
break;
- case 6:
- gWeatherPtr->unknown_6EA = 1;
- gWeatherPtr->unknown_6EB = Random() % 2;
+ case TSTORM_STATE_INIT_THUNDER_SHORT_1:
+ gWeatherPtr->thunderAllowEnd = TRUE;
+ gWeatherPtr->thunderSkipShort = Random() % 2;
gWeatherPtr->initStep++;
break;
- case 7:
- gWeatherPtr->unknown_6EC = (Random() & 1) + 1;
+ case TSTORM_STATE_INIT_THUNDER_SHORT_2:
+ gWeatherPtr->thunderShortRetries = (Random() & 1) + 1;
gWeatherPtr->initStep++;
// fall through
- case 8:
- sub_80ABC48(19);
- if (gWeatherPtr->unknown_6EB == 0 && gWeatherPtr->unknown_6EC == 1)
- SetThunderCounter(20);
+ case TSTORM_STATE_TRY_THUNDER_SHORT:
+ ApplyWeatherGammaShiftIfIdle(19);
+ if (!gWeatherPtr->thunderSkipShort && gWeatherPtr->thunderShortRetries == 1)
+ SetThunderCounter(20); // Do short thunder
- gWeatherPtr->unknown_6E6 = (Random() % 3) + 6;
+ gWeatherPtr->thunderDelay = (Random() % 3) + 6;
gWeatherPtr->initStep++;
break;
- case 9:
- if (--gWeatherPtr->unknown_6E6 == 0)
+ case TSTORM_STATE_TRY_NEW_THUNDER:
+ if (--gWeatherPtr->thunderDelay == 0)
{
- sub_80ABC48(3);
- gWeatherPtr->unknown_6EA = 1;
- if (--gWeatherPtr->unknown_6EC != 0)
+ ApplyWeatherGammaShiftIfIdle(3);
+ gWeatherPtr->thunderAllowEnd = TRUE;
+ if (--gWeatherPtr->thunderShortRetries != 0)
{
- gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
- gWeatherPtr->initStep = 10;
+ // Try a short thunder again
+ 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
{
- gWeatherPtr->initStep = 11;
+ // Set up long thunder
+ gWeatherPtr->initStep = TSTORM_STATE_INIT_THUNDER_LONG;
}
}
break;
- case 10:
- if (--gWeatherPtr->unknown_6E6 == 0)
- gWeatherPtr->initStep = 8;
+ case TSTORM_STATE_WAIT_THUNDER_SHORT:
+ if (--gWeatherPtr->thunderDelay == 0)
+ gWeatherPtr->initStep = TSTORM_STATE_TRY_THUNDER_SHORT;
break;
- case 11:
- gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
+ case TSTORM_STATE_INIT_THUNDER_LONG:
+ gWeatherPtr->thunderDelay = (Random() % 16) + 60;
gWeatherPtr->initStep++;
break;
- case 12:
- if (--gWeatherPtr->unknown_6E6 == 0)
+ case TSTORM_STATE_WAIT_THUNDER_LONG:
+ if (--gWeatherPtr->thunderDelay == 0)
{
+ // Do long thunder
SetThunderCounter(100);
- sub_80ABC48(19);
- gWeatherPtr->unknown_6E6 = (Random() & 0xF) + 30;
+ ApplyWeatherGammaShiftIfIdle(19);
+ gWeatherPtr->thunderDelay = (Random() & 0xF) + 30;
gWeatherPtr->initStep++;
}
break;
- case 13:
- if (--gWeatherPtr->unknown_6E6 == 0)
+ case TSTORM_STATE_FADE_THUNDER_LONG:
+ if (--gWeatherPtr->thunderDelay == 0)
{
sub_80ABC7C(19, 3, 5);
gWeatherPtr->initStep++;
}
break;
- case 14:
+ case TSTORM_STATE_END_THUNDER_LONG:
if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE)
{
- gWeatherPtr->unknown_6EA = 1;
- gWeatherPtr->initStep = 4;
+ gWeatherPtr->thunderAllowEnd = TRUE;
+ gWeatherPtr->initStep = TSTORM_STATE_LOOP_START;
}
break;
}
@@ -1170,12 +1198,12 @@ bool8 Thunderstorm_Finish(void)
switch (gWeatherPtr->finishStep)
{
case 0:
- gWeatherPtr->unknown_6EA = 0;
+ gWeatherPtr->thunderAllowEnd = FALSE;
gWeatherPtr->finishStep++;
// fall through
case 1:
Thunderstorm_Main();
- if (gWeatherPtr->unknown_6EA)
+ if (gWeatherPtr->thunderAllowEnd)
{
if (gWeatherPtr->nextWeather == WEATHER_RAIN
|| gWeatherPtr->nextWeather == WEATHER_RAIN_THUNDERSTORM
@@ -1203,16 +1231,16 @@ bool8 Thunderstorm_Finish(void)
static void SetThunderCounter(u16 max)
{
- if (gWeatherPtr->thunderTriggered == 0)
+ if (!gWeatherPtr->thunderTriggered)
{
gWeatherPtr->thunderCounter = Random() % max;
- gWeatherPtr->thunderTriggered = 1;
+ gWeatherPtr->thunderTriggered = TRUE;
}
}
static void UpdateThunderSound(void)
{
- if (gWeatherPtr->thunderTriggered == 1)
+ if (gWeatherPtr->thunderTriggered == TRUE)
{
if (gWeatherPtr->thunderCounter == 0)
{
@@ -1224,7 +1252,7 @@ static void UpdateThunderSound(void)
else
PlaySE(SE_THUNDER2);
- gWeatherPtr->thunderTriggered = 0;
+ gWeatherPtr->thunderTriggered = FALSE;
}
else
{