summaryrefslogtreecommitdiff
path: root/src/field/field_weather.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/field/field_weather.c')
-rw-r--r--src/field/field_weather.c327
1 files changed, 165 insertions, 162 deletions
diff --git a/src/field/field_weather.c b/src/field/field_weather.c
index 2d4711b81..ff7c2e4c4 100644
--- a/src/field/field_weather.c
+++ b/src/field/field_weather.c
@@ -3,7 +3,7 @@
#include "field_map_obj.h"
#include "field_weather.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
@@ -28,10 +28,10 @@ struct WeatherPaletteData
struct WeatherCallbacks
{
- void (*func0)(void);
- void (*func1)(void);
- void (*func2)(void);
- u8 (*func3)(void);
+ void (*initVars)(void);
+ void (*main)(void);
+ void (*initAll)(void);
+ bool8 (*finish)(void);
};
extern struct Weather gWeather;
@@ -48,7 +48,7 @@ const u8 DroughtPaletteData_5[] = INCBIN_U8("graphics/weather/drought5.bin.lz");
extern u8 (*gUnknown_0202FC48)[32];
extern u8 gUnknown_0202F9E8[32];
-const u8 *const gUnknown_08396FA8[] =
+static const u8 *const sCompressedDroughtPalettes[] =
{
DroughtPaletteData_0,
DroughtPaletteData_1,
@@ -65,83 +65,83 @@ const u8 *const gUnknown_08396FA8[] =
// this file produces the same result as accessing gWeather directly.
struct Weather *const gWeatherPtr = &gWeather;
-void sub_807CAE8(void);
-void nullsub_38(void);
-u8 sub_807CB0C(void);
-void sub_807DE78(void);
-void sub_807DEF4(void);
-void sub_807DEC4(void);
-u8 sub_807DF54(void);
-void sub_807DF9C(void);
-void nullsub_55(void);
-void sub_807DFC0(void);
-u8 sub_807DFD0(void);
+void None_Init(void);
+void None_Main(void);
+bool8 None_Finish(void);
+void Clouds_InitVars(void);
+void Clouds_Main(void);
+void Clouds_InitAll(void);
+bool8 Clouds_Finish(void);
+void Weather2_InitVars(void);
+void Weather2_Main(void);
+void Weather2_InitAll(void);
+bool8 Weather2_Finish(void);
void LightRain_InitVars(void);
-void sub_807E400(void);
-void sub_807E3D0(void);
-u8 sub_807E460(void);
+void LightRain_Main(void);
+void LightRain_InitAll(void);
+bool8 LightRain_Finish(void);
void Snow_InitVars(void);
-void snowflakes_progress2(void);
-void sub_807EA18(void);
-u8 sub_807EAC0(void);
-void sub_807EE80(void);
-void sub_807EFC0(void);
-void sub_807EEF4(void);
-u8 sub_807F34C(void);
-void sub_807F49C(void);
-void sub_807F52C(void);
-void sub_807F4FC(void);
-u8 sub_807F5EC(void);
-void sub_807F7F8(void);
-void sub_807F888(void);
-void sub_807F858(void);
-u8 sub_807F934(void);
-void sub_807FE9C(void);
-void sub_807FF4C(void);
-void sub_807FF1C(void);
-u8 sub_807FFC8(void);
-void sub_807FB24(void);
-void sub_807FBD8(void);
-void sub_807FBA8(void);
-u8 sub_807FC3C(void);
-void sub_807F49C(void);
-void sub_807F52C(void);
-void sub_807F4FC(void);
-u8 sub_807F5EC(void);
-void sub_8080430(void);
-void nullsub_56(void);
-void sub_8080460(void);
-u8 sub_8080470(void);
-void sub_807E110(void);
-void sub_807E174(void);
-void sub_807E144(void);
-u8 sub_807E258(void);
-void sub_807EF24(void);
-void sub_807EFC0(void);
-void sub_807EF90(void);
-u8 sub_807F34C(void);
-void sub_8080474(void);
-void sub_80804F8(void);
-void sub_80804C8(void);
-u8 sub_808056C(void);
-
-const struct WeatherCallbacks gUnknown_08396FC8[] =
+void Snow_Main(void);
+void Snow_InitAll(void);
+bool8 Snow_Finish(void);
+void MedRain_InitVars(void);
+void Rain_Main(void);
+void MedRain_InitAll(void);
+bool8 Rain_Finish(void);
+void Fog1_InitVars(void);
+void Fog1_Main(void);
+void Fog1_InitAll(void);
+bool8 Fog1_Finish(void);
+void Ash_InitVars(void);
+void Ash_Main(void);
+void Ash_InitAll(void);
+bool8 Ash_Finish(void);
+void Sandstorm_InitVars(void);
+void Sandstorm_Main(void);
+void Sandstorm_InitAll(void);
+bool8 Sandstorm_Finish(void);
+void Fog2_InitVars(void);
+void Fog2_Main(void);
+void Fog2_InitAll(void);
+bool8 Fog2_Finish(void);
+void Fog1_InitVars(void);
+void Fog1_Main(void);
+void Fog1_InitAll(void);
+bool8 Fog1_Finish(void);
+void Weather11_InitVars(void);
+void Weather11_Main(void);
+void Weather11_InitAll(void);
+bool8 Weather11_Finish(void);
+void Drought_InitVars(void);
+void Drought_Main(void);
+void Drought_InitAll(void);
+bool8 Drought_Finish(void);
+void HeavyRain_InitVars(void);
+void Rain_Main(void);
+void HeavyRain_InitAll(void);
+bool8 Rain_Finish(void);
+void Bubbles_InitVars(void);
+void Bubbles_Main(void);
+void Bubbles_InitAll(void);
+bool8 Bubbles_Finish(void);
+
+static const struct WeatherCallbacks sWeatherFuncs[] =
{
- {sub_807CAE8, nullsub_38, sub_807CAE8, sub_807CB0C},
- {sub_807DE78, sub_807DEF4, sub_807DEC4, sub_807DF54},
- {sub_807DF9C, nullsub_55, sub_807DFC0, sub_807DFD0},
- {LightRain_InitVars, sub_807E400, sub_807E3D0, sub_807E460}, // light rain
- {Snow_InitVars, snowflakes_progress2, sub_807EA18, sub_807EAC0}, // snow
- {sub_807EE80, sub_807EFC0, sub_807EEF4, sub_807F34C},
- {sub_807F49C, sub_807F52C, sub_807F4FC, sub_807F5EC},
- {sub_807F7F8, sub_807F888, sub_807F858, sub_807F934},
- {sub_807FE9C, sub_807FF4C, sub_807FF1C, sub_807FFC8},
- {sub_807FB24, sub_807FBD8, sub_807FBA8, sub_807FC3C},
- {sub_807F49C, sub_807F52C, sub_807F4FC, sub_807F5EC},
- {sub_8080430, nullsub_56, sub_8080460, sub_8080470},
- {sub_807E110, sub_807E174, sub_807E144, sub_807E258},
- {sub_807EF24, sub_807EFC0, sub_807EF90, sub_807F34C},
- {sub_8080474, sub_80804F8, sub_80804C8, sub_808056C},
+ {None_Init, None_Main, None_Init, None_Finish},
+ {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish},
+ {Weather2_InitVars, Weather2_Main, Weather2_InitAll, Weather2_Finish},
+ {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, // light rain
+ {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish},
+ {MedRain_InitVars, Rain_Main, MedRain_InitAll, Rain_Finish},
+ {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish},
+ {Ash_InitVars, Ash_Main, Ash_InitAll, Ash_Finish},
+ {Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish},
+ {Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish},
+ {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish},
+ {Weather11_InitVars, Weather11_Main, Weather11_InitAll, Weather11_Finish},
+ {Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish},
+ {HeavyRain_InitVars, Rain_Main, HeavyRain_InitAll, Rain_Finish},
+ {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish},
};
void (*const gUnknown_083970B8[])(void) =
@@ -190,33 +190,33 @@ const u8 gUnknown_083970C8[] =
const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal");
-void sub_807C828(void)
+void StartWeather(void)
{
u8 index;
- if (!FuncIsActiveTask(sub_807CA34))
+ if (!FuncIsActiveTask(Task_WeatherMain))
{
index = AllocSpritePalette(0x1200);
CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32);
sub_807CB10();
gWeatherPtr->unknown_6D5 = index;
gWeatherPtr->unknown_6D4 = AllocSpritePalette(0x1201);
- gWeatherPtr->unknown_6DA = 0;
+ gWeatherPtr->rainSpriteCount = 0;
gWeatherPtr->unknown_6D8 = 0;
- gWeatherPtr->unknown_6DE = 0;
- gWeatherPtr->unknown_6E4 = 0;
- gWeatherPtr->unknown_700 = 0;
- gWeatherPtr->unknown_6FB = 0;
- gWeatherPtr->unknown_724 = 0;
- gWeatherPtr->unknown_716 = 0;
- gWeatherPtr->unknown_717 = 0;
+ gWeatherPtr->cloudSpritesCreated = 0;
+ gWeatherPtr->snowflakeSpriteCount = 0;
+ gWeatherPtr->ashSpritesCreated = 0;
+ gWeatherPtr->fog1SpritesCreated = 0;
+ gWeatherPtr->fog2SpritesCreated = 0;
+ gWeatherPtr->sandstormSprites1Created = 0;
+ gWeatherPtr->sandstormSprites2Created = 0;
gWeatherPtr->unknown_72E = 0;
gWeatherPtr->unknown_6FA = 0;
- sub_807DB64(16, 0);
+ Weather_SetBlendCoeffs(16, 0);
gWeatherPtr->currWeather = 0;
gWeatherPtr->unknown_6C6 = 3;
gWeatherPtr->unknown_6C8 = 0;
gWeatherPtr->unknown_6D3 = 1;
- gWeatherPtr->unknown_6C9 = CreateTask(sub_807C9E4, 80);
+ gWeatherPtr->unknown_6C9 = CreateTask(Task_WeatherInit, 80);
}
}
@@ -226,72 +226,70 @@ void DoWeatherEffect(u8 effect)
{
PlayRainSoundEffect();
}
- if (gWeatherPtr->unknown_6D1 != effect && gWeatherPtr->currWeather == effect)
+ if (gWeatherPtr->nextWeather != effect && gWeatherPtr->currWeather == effect)
{
- gUnknown_08396FC8[effect].func0();
+ sWeatherFuncs[effect].initVars();
}
gWeatherPtr->unknown_6D3 = 0;
- gWeatherPtr->unknown_6D1 = effect;
- gWeatherPtr->unknown_6CE = 0;
+ gWeatherPtr->nextWeather = effect;
+ gWeatherPtr->finishStep = 0;
}
void sub_807C988(u8 effect)
{
PlayRainSoundEffect();
gWeatherPtr->currWeather = effect;
- gWeatherPtr->unknown_6D1 = effect;
+ gWeatherPtr->nextWeather = effect;
}
void sub_807C9B4(u8 effect)
{
PlayRainSoundEffect();
gWeatherPtr->currWeather = effect;
- gWeatherPtr->unknown_6D1 = effect;
+ gWeatherPtr->nextWeather = effect;
gWeatherPtr->unknown_6C8 = 1;
}
-void sub_807C9E4(u8 taskId)
+void Task_WeatherInit(u8 taskId)
{
if (gWeatherPtr->unknown_6C8)
{
- gUnknown_08396FC8[gWeatherPtr->currWeather].func2();
- gTasks[taskId].func = sub_807CA34;
+ sWeatherFuncs[gWeatherPtr->currWeather].initAll();
+ gTasks[taskId].func = Task_WeatherMain;
}
}
-void sub_807CA34(u8 task)
+void Task_WeatherMain(u8 taskId)
{
- u8 v1;
- if (gWeatherPtr->currWeather != gWeatherPtr->unknown_6D1)
+ if (gWeatherPtr->currWeather != gWeatherPtr->nextWeather)
{
- v1 = gUnknown_08396FC8[gWeatherPtr->currWeather].func3();
- if (!v1)
+ if (!sWeatherFuncs[gWeatherPtr->currWeather].finish())
{
- gUnknown_08396FC8[gWeatherPtr->unknown_6D1].func0();
- gWeatherPtr->unknown_6C3 = 0; // compiler reuses v1
- gWeatherPtr->unknown_6C6 = 0; // compiler reuses v1
- gWeatherPtr->currWeather = gWeatherPtr->unknown_6D1;
+ sWeatherFuncs[gWeatherPtr->nextWeather].initVars();
+ gWeatherPtr->unknown_6C3 = 0;
+ gWeatherPtr->unknown_6C6 = 0;
+ gWeatherPtr->currWeather = gWeatherPtr->nextWeather;
gWeatherPtr->unknown_6D3 = 1;
}
}
else
{
- gUnknown_08396FC8[gWeatherPtr->currWeather].func1();
+ sWeatherFuncs[gWeatherPtr->currWeather].main();
}
gUnknown_083970B8[gWeatherPtr->unknown_6C6]();
}
-void sub_807CAE8(void)
+void None_Init(void)
{
gWeatherPtr->unknown_6C1 = 0;
gWeatherPtr->unknown_6C2 = 0;
}
-void nullsub_38(void)
+void None_Main(void)
{
}
-u8 sub_807CB0C(void)
+u8 None_Finish(void)
{
return 0;
}
@@ -627,14 +625,14 @@ void sub_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e)
}
}
-void sub_807D304(s8 a, u8 arg2, u16 c)
+void sub_807D304(s8 a, u8 coeff, u16 c)
{
struct RGBColor color;
u8 r_;
u8 g_;
u8 b_;
u16 r4;
- u16 r5;
+ u16 palOffset;
u16 r12;
a = -a - 1;
@@ -642,13 +640,13 @@ void sub_807D304(s8 a, u8 arg2, u16 c)
r_ = color.r;
g_ = color.g;
b_ = color.b;
- r5 = 0;
+ palOffset = 0;
for (r4 = 0; r4 < 32; r4++)
{
if (gUnknown_030006DC[r4] == 0)
{
- BlendPalette(r5, 16, arg2, c);
- r5 += 16;
+ BlendPalette(palOffset, 16, coeff, c);
+ palOffset += 16;
}
else
{
@@ -660,7 +658,7 @@ void sub_807D304(s8 a, u8 arg2, u16 c)
u8 r1, g1, b1;
u8 r2, g2, b2;
- color1 = *(struct RGBColor *)&gPlttBufferUnfaded[r5];
+ color1 = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
r1 = color1.r;
g1 = color1.g;
b1 = color1.b;
@@ -671,11 +669,11 @@ void sub_807D304(s8 a, u8 arg2, u16 c)
g2 = color2.g;
b2 = color2.b;
- r2 += ((r_ - r2) * arg2) >> 4;
- g2 += ((g_ - g2) * arg2) >> 4;
- b2 += ((b_ - b2) * arg2) >> 4;
+ r2 += ((r_ - r2) * coeff) >> 4;
+ g2 += ((g_ - g2) * coeff) >> 4;
+ b2 += ((b_ - b2) * coeff) >> 4;
- gPlttBufferFaded[r5++] = (b2 << 10) | (g2 << 5) | r2;
+ gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2;
}
}
}
@@ -775,28 +773,28 @@ void sub_807D5F0(u8 a, u8 b, u8 c)
}
}
-void fade_screen(u8 a, u8 b)
+void fade_screen(u8 a, u8 delay)
{
- u32 r4;
+ u32 fadeColor;
u32 r1;
u32 r2;
switch (a)
{
case 0:
- r4 = 0;
+ fadeColor = 0;
r1 = 0;
break;
case 2:
- r4 = 0xFFFF;
+ fadeColor = 0xFFFF;
r1 = 0;
break;
case 1:
- r4 = 0;
+ fadeColor = 0;
r1 = 1;
break;
case 3:
- r4 = 0xFFFF;
+ fadeColor = 0xFFFF;
r1 = 1;
break;
default:
@@ -823,20 +821,20 @@ void fade_screen(u8 a, u8 b)
{
if (r2 != 0)
CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
- BeginNormalPaletteFade(0xFFFFFFFF, b, 0, 16, r4);
+ BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor);
gWeatherPtr->unknown_6C6 = 2;
}
else
{
- gWeatherPtr->unknown_6C4 = r4;
+ gWeatherPtr->unknown_6C4 = fadeColor;
if (r2 != 0)
gWeatherPtr->unknown_6C7 = 0;
else
- BeginNormalPaletteFade(0xFFFFFFFF, b, 16, 0, r4);
+ BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor);
gWeatherPtr->unknown_6C6 = 1;
gWeatherPtr->unknown_6CA = 1;
gWeatherPtr->unknown_6CB = 0;
- sub_807DB64(gWeatherPtr->unknown_730, gWeatherPtr->unknown_732);
+ Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);
gWeatherPtr->unknown_6C8 = 1;
}
}
@@ -909,7 +907,7 @@ void sub_807D8F0(u8 *a, u8 *b)
if (r4 < 7)
{
r4--;
- LZ77UnCompWram(gUnknown_08396FA8[r4], eWeatherPaletteData.data[r4]);
+ LZ77UnCompWram(sCompressedDroughtPalettes[r4], eWeatherPaletteData.data[r4]);
if (r4 == 0)
{
eWeatherPaletteData.data[r4][0] = 0x421;
@@ -921,8 +919,7 @@ void sub_807D8F0(u8 *a, u8 *b)
for (i = 0; i < 0x1000; i++)
eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4 - 1][i];
}
- (*a)++;
- if (*a == 7)
+ if (++(*a) == 7)
{
*a = 32;
*b = 32;
@@ -997,52 +994,58 @@ void sub_807DA4C(void)
}
}
-void sub_807DB64(u8 a, u8 b)
+void Weather_SetBlendCoeffs(u8 eva, u8 evb)
{
- gWeatherPtr->unknown_730 = a;
- gWeatherPtr->unknown_732 = b;
- gWeatherPtr->unknown_734 = a;
- gWeatherPtr->unknown_736 = b;
- REG_BLDALPHA = (b << 8) | a;
+ gWeatherPtr->currBlendEVA = eva;
+ gWeatherPtr->currBlendEVB = evb;
+ gWeatherPtr->targetBlendEVA = eva;
+ gWeatherPtr->targetBlendEVB = evb;
+ REG_BLDALPHA = BLDALPHA_BLEND(eva, evb);
}
-void sub_807DBA4(u8 a, u8 b, int c)
+void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay)
{
- gWeatherPtr->unknown_734 = a;
- gWeatherPtr->unknown_736 = b;
- gWeatherPtr->unknown_73A = c;
+ gWeatherPtr->targetBlendEVA = eva;
+ gWeatherPtr->targetBlendEVB = evb;
+ gWeatherPtr->blendDelay = delay;
gWeatherPtr->unknown_739 = 0;
gWeatherPtr->unknown_738 = 0;
}
-bool8 sub_807DBE8(void)
+bool8 Weather_UpdateBlend(void)
{
- if (gWeatherPtr->unknown_730 == gWeatherPtr->unknown_734
- && gWeatherPtr->unknown_732 == gWeatherPtr->unknown_736)
+ if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA
+ && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)
return TRUE;
- if (++gWeatherPtr->unknown_739 > gWeatherPtr->unknown_73A)
+
+ if (++gWeatherPtr->unknown_739 > gWeatherPtr->blendDelay)
{
gWeatherPtr->unknown_739 = 0;
gWeatherPtr->unknown_738++;
+
+ // Update currBlendEVA and currBlendEVB on alternate frames
if (gWeatherPtr->unknown_738 & 1)
{
- if (gWeatherPtr->unknown_730 < gWeatherPtr->unknown_734)
- gWeatherPtr->unknown_730++;
- else if (gWeatherPtr->unknown_730 > gWeatherPtr->unknown_734)
- gWeatherPtr->unknown_730--;
+ if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA)
+ gWeatherPtr->currBlendEVA++;
+ else if (gWeatherPtr->currBlendEVA > gWeatherPtr->targetBlendEVA)
+ gWeatherPtr->currBlendEVA--;
}
else
{
- if (gWeatherPtr->unknown_732 < gWeatherPtr->unknown_736)
- gWeatherPtr->unknown_732++;
- else if (gWeatherPtr->unknown_732 > gWeatherPtr->unknown_736)
- gWeatherPtr->unknown_732--;
+ if (gWeatherPtr->currBlendEVB < gWeatherPtr->targetBlendEVB)
+ gWeatherPtr->currBlendEVB++;
+ else if (gWeatherPtr->currBlendEVB > gWeatherPtr->targetBlendEVB)
+ gWeatherPtr->currBlendEVB--;
}
}
- REG_BLDALPHA = (gWeatherPtr->unknown_732 << 8) | gWeatherPtr->unknown_730;
- if (gWeatherPtr->unknown_730 == gWeatherPtr->unknown_734
- && gWeatherPtr->unknown_732 == gWeatherPtr->unknown_736)
+
+ REG_BLDALPHA = BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);
+
+ if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA
+ && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)
return TRUE;
+
return FALSE;
}