summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCameron Hall <camthesaxman@users.noreply.github.com>2017-11-25 13:29:59 -0600
committerGitHub <noreply@github.com>2017-11-25 13:29:59 -0600
commit20c5936f0c9fd15d34fce0409e8835282ea2fcaf (patch)
treeb6f63c6ed83b72741af2e30d990cb4f931d8fc8d /src
parentcc03fa4c4046c4ab4dc11234ca1dde1f888fa9bf (diff)
parentc9a21f43bd074e532c745560b1d7d412f6ea8456 (diff)
Merge pull request #474 from camthesaxman/decompile_field_weather
split field_weather.c and convert more data
Diffstat (limited to 'src')
-rw-r--r--src/field/field_weather.c1640
-rw-r--r--src/field/field_weather_2.c1511
2 files changed, 1838 insertions, 1313 deletions
diff --git a/src/field/field_weather.c b/src/field/field_weather.c
index acd8b81ff..2d4711b81 100644
--- a/src/field/field_weather.c
+++ b/src/field/field_weather.c
@@ -26,110 +26,18 @@ struct WeatherPaletteData
u16 data[0][0x1000]; // unknown length
};
-struct Weather
+struct WeatherCallbacks
{
- struct Sprite *unknown_0[24];
- struct Sprite *unknown_60[0x65]; // snowflakes?
- struct Sprite *unknown_1F4[3];
- u8 unknown_200[2][32];
- u8 filler_240[0x460-0x240];
- u8 unk460[2][32];
- u8 filler4A0[0x6B6-0x4A0];
- s8 unknown_6B6;
- u8 filler_6B7[0xC0-0xB7];
- s8 unknown_6C0;
- s8 unknown_6C1;
- u8 unknown_6C2;
- u8 unknown_6C3;
- u16 unknown_6C4;
- u8 unknown_6C6;
- u8 unknown_6C7;
- u8 unknown_6C8;
- u8 unknown_6C9;
- u8 unknown_6CA;
- u8 unknown_6CB;
- u16 unknown_6CC;
- u16 unknown_6CE;
- u8 unknown_6D0;
- u8 unknown_6D1;
- u8 unknown_6D2;
- u8 unknown_6D3;
- u8 unknown_6D4;
- u8 unknown_6D5;
- u16 unknown_6D6;
- u8 unknown_6D8;
- u8 unknown_6D9;
- u8 unknown_6DA;
- u8 unknown_6DB;
- u8 unknown_6DC;
- u8 unknown_6DD;
- u8 unknown_6DE;
- u8 filler_6DF[1];
- u16 unknown_6E0;
- u16 unknown_6E2;
- u8 unknown_6E4;
- u8 unknown_6E5;
- u16 unknown_6E6;
- u16 unknown_6E8;
- u8 unknown_6EA;
- u8 unknown_6EB;
- u8 unknown_6EC;
- u8 unknown_6ED;
- u16 unknown_6EE;
- u16 unknown_6F0;
- u16 unknown_6F2;
- u8 unknown_6F4[6];
- u8 unknown_6FA;
- u8 unknown_6FB;
- u8 filler_6FC[4];
- u8 unknown_700;
- u8 filler_701[0x15];
- u8 unknown_716;
- u8 unknown_717;
- u8 filler_718[0xc];
- u8 unknown_724;
- u8 filler_725[9];
- u8 unknown_72E;
- u8 filler_72F;
- u16 unknown_730;
- u16 unknown_732;
- u16 unknown_734;
- u16 unknown_736;
- u8 unknown_738;
- u8 unknown_739;
- u8 unknown_73A;
- u8 filler_73B[0x3C-0x3B];
- s16 unknown_73C;
- s16 unknown_73E;
- s16 unknown_740;
- s16 unknown_742;
- u8 filler_744[0xD-4];
- s8 unknown_74D;
- u8 unknown_74E;
+ void (*func0)(void);
+ void (*func1)(void);
+ void (*func2)(void);
+ u8 (*func3)(void);
};
-#define gWeather gUnknown_0202F7E8
-extern struct Weather gUnknown_0202F7E8;
+extern struct Weather gWeather;
extern u8 gUnknown_0202FF38[];
extern u16 gUnknown_0202FF58;
-extern u8 *gUnknown_083970E8;
-extern u8 (*gUnknown_08396FC8[][4])(void);
-extern u8 (*gUnknown_083970B8[])(void);
IWRAM_DATA const u8 *gUnknown_030006DC;
-extern const u8 gUnknown_083970C8[];
-
-// This is a pointer to gWeather. All code sub_807DE78 and below uses this pointer,
-// while everything above accesses gWeather directly.
-extern struct Weather *const gUnknown_08396FC4;
-
-extern const struct SpriteSheet gUnknown_0839A9D4;
-extern const struct SpriteTemplate gSpriteTemplate_839A9F0;
-extern const u16 gUnknown_08397108[];
-//extern const s16 gUnknown_0839A9C8[][2];
-extern const struct Coords16 gUnknown_0839A9C8[];
-extern const struct SpriteSheet gUnknown_0839AACC;
-extern const struct SpriteTemplate gSpriteTemplate_839AAA4;
-extern const struct SpriteTemplate gSpriteTemplate_839AB04;
const u8 DroughtPaletteData_0[] = INCBIN_U8("graphics/weather/drought0.bin.lz");
const u8 DroughtPaletteData_1[] = INCBIN_U8("graphics/weather/drought1.bin.lz");
@@ -151,71 +59,202 @@ const u8 *const gUnknown_08396FA8[] =
gSharedMem,
};
+// This is a pointer to gWeather. All code in this file accesses gWeather directly,
+// while code in other field weather files accesses gWeather through this pointer.
+// This is likely the result of compiler optimization, since using the pointer in
+// 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 LightRain_InitVars(void);
+void sub_807E400(void);
+void sub_807E3D0(void);
+u8 sub_807E460(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[] =
+{
+ {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},
+};
+
+void (*const gUnknown_083970B8[])(void) =
+{
+ sub_807CC24,
+ sub_807CCAC,
+ nullsub_39,
+ nullsub_39,
+};
+
+const u8 gUnknown_083970C8[] =
+{
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 2,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+};
+
+const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal");
+
void sub_807C828(void)
{
u8 index;
- if (!FuncIsActiveTask(&sub_807CA34))
+ if (!FuncIsActiveTask(sub_807CA34))
{
index = AllocSpritePalette(0x1200);
- CpuCopy32(&gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32);
+ CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32);
sub_807CB10();
- gWeather.unknown_6D5 = index;
- gWeather.unknown_6D4 = AllocSpritePalette(0x1201);
- gWeather.unknown_6DA = 0;
- gWeather.unknown_6D8 = 0;
- gWeather.unknown_6DE = 0;
- gWeather.unknown_6E4 = 0;
- gWeather.unknown_700 = 0;
- gWeather.unknown_6FB = 0;
- gWeather.unknown_724 = 0;
- gWeather.unknown_716 = 0;
- gWeather.unknown_717 = 0;
- gWeather.unknown_72E = 0;
- gWeather.unknown_6FA = 0;
+ gWeatherPtr->unknown_6D5 = index;
+ gWeatherPtr->unknown_6D4 = AllocSpritePalette(0x1201);
+ gWeatherPtr->unknown_6DA = 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->unknown_72E = 0;
+ gWeatherPtr->unknown_6FA = 0;
sub_807DB64(16, 0);
- gWeather.unknown_6D0 = 0;
- gWeather.unknown_6C6 = 3;
- gWeather.unknown_6C8 = 0;
- gWeather.unknown_6D3 = 1;
- gWeather.unknown_6C9 = CreateTask(sub_807C9E4, 80);
+ gWeatherPtr->currWeather = 0;
+ gWeatherPtr->unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C8 = 0;
+ gWeatherPtr->unknown_6D3 = 1;
+ gWeatherPtr->unknown_6C9 = CreateTask(sub_807C9E4, 80);
}
}
void DoWeatherEffect(u8 effect)
{
- if (effect != 3 && effect != 5 && effect != 13)
+ if (effect != WEATHER_RAIN_LIGHT && effect != WEATHER_RAIN_MED && effect != WEATHER_RAIN_HEAVY)
{
PlayRainSoundEffect();
}
- if (gWeather.unknown_6D1 != effect && gWeather.unknown_6D0 == effect)
+ if (gWeatherPtr->unknown_6D1 != effect && gWeatherPtr->currWeather == effect)
{
- gUnknown_08396FC8[effect][0]();
+ gUnknown_08396FC8[effect].func0();
}
- gWeather.unknown_6D3 = 0;
- gWeather.unknown_6D1 = effect;
- gWeather.unknown_6CE = 0;
+ gWeatherPtr->unknown_6D3 = 0;
+ gWeatherPtr->unknown_6D1 = effect;
+ gWeatherPtr->unknown_6CE = 0;
}
void sub_807C988(u8 effect)
{
PlayRainSoundEffect();
- gWeather.unknown_6D0 = effect;
- gWeather.unknown_6D1 = effect;
+ gWeatherPtr->currWeather = effect;
+ gWeatherPtr->unknown_6D1 = effect;
}
void sub_807C9B4(u8 effect)
{
PlayRainSoundEffect();
- gWeather.unknown_6D0 = effect;
- gWeather.unknown_6D1 = effect;
- gWeather.unknown_6C8 = 1;
+ gWeatherPtr->currWeather = effect;
+ gWeatherPtr->unknown_6D1 = effect;
+ gWeatherPtr->unknown_6C8 = 1;
}
void sub_807C9E4(u8 taskId)
{
- if (gWeather.unknown_6C8)
+ if (gWeatherPtr->unknown_6C8)
{
- gUnknown_08396FC8[gWeather.unknown_6D0][2]();
+ gUnknown_08396FC8[gWeatherPtr->currWeather].func2();
gTasks[taskId].func = sub_807CA34;
}
}
@@ -223,36 +262,36 @@ void sub_807C9E4(u8 taskId)
void sub_807CA34(u8 task)
{
u8 v1;
- if (gWeather.unknown_6D0 != gWeather.unknown_6D1)
+ if (gWeatherPtr->currWeather != gWeatherPtr->unknown_6D1)
{
- v1 = gUnknown_08396FC8[gWeather.unknown_6D0][3]();
+ v1 = gUnknown_08396FC8[gWeatherPtr->currWeather].func3();
if (!v1)
{
- gUnknown_08396FC8[gWeather.unknown_6D1][0]();
- gWeather.unknown_6C3 = 0; // compiler reuses v1
- gWeather.unknown_6C6 = 0; // compiler reuses v1
- gWeather.unknown_6D0 = gWeather.unknown_6D1;
- gWeather.unknown_6D3 = 1;
+ 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;
+ gWeatherPtr->unknown_6D3 = 1;
}
}
else
{
- gUnknown_08396FC8[gWeather.unknown_6D0][1]();
+ gUnknown_08396FC8[gWeatherPtr->currWeather].func1();
}
- gUnknown_083970B8[gWeather.unknown_6C6]();
+ gUnknown_083970B8[gWeatherPtr->unknown_6C6]();
}
void sub_807CAE8(void)
{
- gWeather.unknown_6C1 = 0;
- gWeather.unknown_6C2 = 0;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 0;
}
void nullsub_38(void)
{
}
-u32 sub_807CB0C(void)
+u8 sub_807CB0C(void)
{
return 0;
}
@@ -274,9 +313,9 @@ void sub_807CB10(void)
for (v0 = 0; v0 <= 1; v0++)
{
if (v0 == 0)
- v1 = gWeather.unknown_200;
+ v1 = gWeatherPtr->unknown_200;
else
- v1 = gWeather.unk460;
+ v1 = gWeatherPtr->unk460;
for (v2 = 0; (u16)v2 <= 0x1f; v2++)
{
@@ -332,53 +371,53 @@ void sub_807CB10(void)
void sub_807CC24(void)
{
- if (gWeather.unknown_6C0 == gWeather.unknown_6C1)
+ if (gWeatherPtr->unknown_6C0 == gWeatherPtr->unknown_6C1)
{
- gWeather.unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C6 = 3;
}
else
{
- if (++gWeather.unknown_6C3 >= gWeather.unknown_6C2)
+ if (++gWeatherPtr->unknown_6C3 >= gWeatherPtr->unknown_6C2)
{
- gWeather.unknown_6C3 = 0;
- if (gWeather.unknown_6C0 < gWeather.unknown_6C1)
- gWeather.unknown_6C0++;
+ gWeatherPtr->unknown_6C3 = 0;
+ if (gWeatherPtr->unknown_6C0 < gWeatherPtr->unknown_6C1)
+ gWeatherPtr->unknown_6C0++;
else
- gWeather.unknown_6C0--;
- sub_807CEBC(0, 0x20, gWeather.unknown_6C0);
+ gWeatherPtr->unknown_6C0--;
+ sub_807CEBC(0, 0x20, gWeatherPtr->unknown_6C0);
}
}
}
void sub_807CCAC(void)
{
- if (++gWeather.unknown_6CB > 1)
- gWeather.unknown_6CA = 0;
- switch (gWeather.unknown_6D0)
+ if (++gWeatherPtr->unknown_6CB > 1)
+ gWeatherPtr->unknown_6CA = 0;
+ switch (gWeatherPtr->currWeather)
{
- case 3:
- case 4:
- case 5:
+ case WEATHER_RAIN_LIGHT:
+ case WEATHER_RAIN_MED:
+ case WEATHER_RAIN_HEAVY:
+ case WEATHER_SNOW:
case 11:
- case 13:
if (sub_807CDC4() == 0)
{
- gWeather.unknown_6C0 = 3;
- gWeather.unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C0 = 3;
+ gWeatherPtr->unknown_6C6 = 3;
}
break;
case 12:
if (sub_807CE24() == 0)
{
- gWeather.unknown_6C0 = -6;
- gWeather.unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C0 = -6;
+ gWeatherPtr->unknown_6C6 = 3;
}
break;
case 6:
if (sub_807CE7C() == 0)
{
- gWeather.unknown_6C0 = 0;
- gWeather.unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C0 = 0;
+ gWeatherPtr->unknown_6C6 = 3;
}
break;
case 7:
@@ -388,8 +427,8 @@ void sub_807CCAC(void)
default:
if (!gPaletteFade.active)
{
- gWeather.unknown_6C0 = gWeather.unknown_6C1;
- gWeather.unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C0 = gWeatherPtr->unknown_6C1;
+ gWeatherPtr->unknown_6C6 = 3;
}
break;
}
@@ -397,38 +436,38 @@ void sub_807CCAC(void)
u8 sub_807CDC4(void)
{
- if (gWeather.unknown_6C7 == 0x10)
+ if (gWeatherPtr->unknown_6C7 == 0x10)
return 0;
- if (++gWeather.unknown_6C7 >= 0x10)
+ if (++gWeatherPtr->unknown_6C7 >= 0x10)
{
sub_807CEBC(0, 0x20, 3);
- gWeather.unknown_6C7 = 0x10;
+ gWeatherPtr->unknown_6C7 = 0x10;
return 0;
}
- sub_807D1BC(0, 0x20, 3, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
+ sub_807D1BC(0, 0x20, 3, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4);
return 1;
}
u8 sub_807CE24(void)
{
- if (gWeather.unknown_6C7 == 0x10)
+ if (gWeatherPtr->unknown_6C7 == 0x10)
return 0;
- if (++gWeather.unknown_6C7 >= 0x10)
+ if (++gWeatherPtr->unknown_6C7 >= 0x10)
{
sub_807CEBC(0, 0x20, -6);
- gWeather.unknown_6C7 = 0x10;
+ gWeatherPtr->unknown_6C7 = 0x10;
return 0;
}
- sub_807D304(-6, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
+ sub_807D304(-6, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4);
return 1;
}
u8 sub_807CE7C(void)
{
- if (gWeather.unknown_6C7 == 0x10)
+ if (gWeatherPtr->unknown_6C7 == 0x10)
return 0;
- ++gWeather.unknown_6C7;
- sub_807D424(0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
+ ++gWeatherPtr->unknown_6C7;
+ sub_807D424(0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4);
return 1;
}
@@ -460,10 +499,10 @@ void sub_807CEBC(u8 a, u8 b, s8 c)
{
u8 r, g, b;
- if (gUnknown_030006DC[r4] == 2 || r4 - 16 == gWeather.unknown_6D5)
- r6 = gWeather.unk460[c];
+ if (gUnknown_030006DC[r4] == 2 || r4 - 16 == gWeatherPtr->unknown_6D5)
+ r6 = gWeatherPtr->unk460[c];
else
- r6 = gWeather.unknown_200[c];
+ r6 = gWeatherPtr->unknown_200[c];
if (r4 == 16 || r4 > 0x1B)
{
for (i = 0; i < 16; i++)
@@ -567,9 +606,9 @@ void sub_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e)
u8 *r5;
if (gUnknown_030006DC[r4] == 1)
- r5 = gWeather.unknown_200[c];
+ r5 = gWeatherPtr->unknown_200[c];
else
- r5 = gWeather.unk460[c];
+ r5 = gWeatherPtr->unk460[c];
for (i = 0; i < 16; i++)
{
@@ -695,10 +734,10 @@ void sub_807D424(u8 a, u16 b)
void sub_807D540(u8 a)
{
- if (gWeather.unknown_6FA < 6)
+ if (gWeatherPtr->unknown_6FA < 6)
{
- gWeather.unknown_6F4[gWeather.unknown_6FA] = a;
- gWeather.unknown_6FA++;
+ gWeatherPtr->unknown_6F4[gWeatherPtr->unknown_6FA] = a;
+ gWeatherPtr->unknown_6FA++;
}
}
@@ -706,9 +745,9 @@ bool8 sub_807D574(u8 a)
{
u16 i;
- for (i = 0; i < gWeather.unknown_6FA; i++)
+ for (i = 0; i < gWeatherPtr->unknown_6FA; i++)
{
- if (gWeather.unknown_6F4[i] == a)
+ if (gWeatherPtr->unknown_6F4[i] == a)
return TRUE;
}
return FALSE;
@@ -716,22 +755,22 @@ bool8 sub_807D574(u8 a)
void sub_807D5BC(s8 a)
{
- if (gWeather.unknown_6C6 == 3)
+ if (gWeatherPtr->unknown_6C6 == 3)
{
sub_807CEBC(0, 32, a);
- gWeather.unknown_6C0 = a;
+ gWeatherPtr->unknown_6C0 = a;
}
}
void sub_807D5F0(u8 a, u8 b, u8 c)
{
- if (gWeather.unknown_6C6 == 3)
+ if (gWeatherPtr->unknown_6C6 == 3)
{
- gWeather.unknown_6C6 = 0;
- gWeather.unknown_6C0 = a;
- gWeather.unknown_6C1 = b;
- gWeather.unknown_6C3 = 0;
- gWeather.unknown_6C2 = c;
+ gWeatherPtr->unknown_6C6 = 0;
+ gWeatherPtr->unknown_6C0 = a;
+ gWeatherPtr->unknown_6C1 = b;
+ gWeatherPtr->unknown_6C3 = 0;
+ gWeatherPtr->unknown_6C2 = c;
sub_807D5BC(a);
}
}
@@ -764,15 +803,15 @@ void fade_screen(u8 a, u8 b)
return;
}
- switch (gWeather.unknown_6D0)
+ switch (gWeatherPtr->currWeather)
{
- case 3:
- case 4:
- case 5:
+ case WEATHER_RAIN_LIGHT:
+ case WEATHER_RAIN_MED:
+ case WEATHER_RAIN_HEAVY:
+ case WEATHER_SNOW:
case 6:
case 11:
case 12:
- case 13:
r2 = 1;
break;
default:
@@ -785,26 +824,26 @@ void fade_screen(u8 a, u8 b)
if (r2 != 0)
CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
BeginNormalPaletteFade(0xFFFFFFFF, b, 0, 16, r4);
- gWeather.unknown_6C6 = 2;
+ gWeatherPtr->unknown_6C6 = 2;
}
else
{
- gWeather.unknown_6C4 = r4;
+ gWeatherPtr->unknown_6C4 = r4;
if (r2 != 0)
- gWeather.unknown_6C7 = 0;
+ gWeatherPtr->unknown_6C7 = 0;
else
BeginNormalPaletteFade(0xFFFFFFFF, b, 16, 0, r4);
- gWeather.unknown_6C6 = 1;
- gWeather.unknown_6CA = 1;
- gWeather.unknown_6CB = 0;
- sub_807DB64(gWeather.unknown_730, gWeather.unknown_732);
- gWeather.unknown_6C8 = 1;
+ gWeatherPtr->unknown_6C6 = 1;
+ gWeatherPtr->unknown_6CA = 1;
+ gWeatherPtr->unknown_6CB = 0;
+ sub_807DB64(gWeatherPtr->unknown_730, gWeatherPtr->unknown_732);
+ gWeatherPtr->unknown_6C8 = 1;
}
}
bool8 sub_807D770(void)
{
- return gWeather.unknown_6C6 ^ 1 ? TRUE : FALSE;
+ return gWeatherPtr->unknown_6C6 ^ 1 ? TRUE : FALSE;
}
void sub_807D78C(u8 a)
@@ -812,16 +851,16 @@ void sub_807D78C(u8 a)
u16 r4 = 16 + a;
u16 i;
- switch (gWeather.unknown_6C6)
+ switch (gWeatherPtr->unknown_6C6)
{
case 1:
- if (gWeather.unknown_6CA != 0)
+ if (gWeatherPtr->unknown_6CA != 0)
{
- if (gWeather.unknown_6D0 == 6)
+ if (gWeatherPtr->currWeather == 6)
sub_807D540(r4);
r4 *= 16;
for (i = 0; i < 16; i++)
- gPlttBufferFaded[r4 + i] = gWeather.unknown_6C4;
+ gPlttBufferFaded[r4 + i] = gWeatherPtr->unknown_6C4;
}
break;
case 2:
@@ -830,9 +869,9 @@ void sub_807D78C(u8 a)
BlendPalette(r4, 16, gPaletteFade.y, gPaletteFade.blendColor);
break;
default:
- if (gWeather.unknown_6D0 != 6)
+ if (gWeatherPtr->currWeather != 6)
{
- sub_807CEBC(r4, 1, gWeather.unknown_6C0);
+ sub_807CEBC(r4, 1, gWeatherPtr->unknown_6C0);
}
else
{
@@ -845,21 +884,21 @@ void sub_807D78C(u8 a)
void sub_807D874(u8 a)
{
- sub_807CEBC(a, 1, gWeather.unknown_6C0);
+ sub_807CEBC(a, 1, gWeatherPtr->unknown_6C0);
}
u8 unref_sub_807D894(void)
{
- if (gWeather.unknown_6C6 == 1)
- return gWeather.unknown_6CA;
+ if (gWeatherPtr->unknown_6C6 == 1)
+ return gWeatherPtr->unknown_6CA;
else
return 0;
}
void sub_807D8C0(const u16 *palette)
{
- LoadPalette(palette, 0x100 + gWeather.unknown_6D4 * 16, 32);
- sub_807D78C(gWeather.unknown_6D4);
+ LoadPalette(palette, 0x100 + gWeatherPtr->unknown_6D4 * 16, 32);
+ sub_807D78C(gWeatherPtr->unknown_6D4);
}
void sub_807D8F0(u8 *a, u8 *b)
@@ -893,16 +932,16 @@ void sub_807D8F0(u8 *a, u8 *b)
void sub_807D9A8(void)
{
- gWeather.unknown_74D = 1;
- gWeather.unknown_74E = 1;
+ gWeatherPtr->unknown_74D = 1;
+ gWeatherPtr->unknown_74E = 1;
}
bool8 sub_807D9C8(void)
{
- if (gWeather.unknown_74D < 32)
+ if (gWeatherPtr->unknown_74D < 32)
{
- sub_807D8F0(&gWeather.unknown_74D, &gWeather.unknown_74E);
- if (gWeather.unknown_74D < 32)
+ sub_807D8F0(&gWeatherPtr->unknown_74D, &gWeatherPtr->unknown_74E);
+ if (gWeatherPtr->unknown_74D < 32)
return TRUE;
}
return FALSE;
@@ -915,44 +954,44 @@ void sub_807DA04(s8 a)
void sub_807DA14(void)
{
- gWeather.unknown_73C = 0;
- gWeather.unknown_740 = 0;
- gWeather.unknown_742 = 0;
- gWeather.unknown_73E = 0;
+ gWeatherPtr->unknown_73C = 0;
+ gWeatherPtr->unknown_740 = 0;
+ gWeatherPtr->unknown_742 = 0;
+ gWeatherPtr->unknown_73E = 0;
gUnknown_0202FF58 = 5;
}
void sub_807DA4C(void)
{
- switch (gWeather.unknown_742)
+ switch (gWeatherPtr->unknown_742)
{
case 0:
- if (++gWeather.unknown_740 > gUnknown_0202FF58)
+ if (++gWeatherPtr->unknown_740 > gUnknown_0202FF58)
{
- gWeather.unknown_740 = 0;
- sub_807DA04(gWeather.unknown_73C++);
- if (gWeather.unknown_73C > 5)
+ gWeatherPtr->unknown_740 = 0;
+ sub_807DA04(gWeatherPtr->unknown_73C++);
+ if (gWeatherPtr->unknown_73C > 5)
{
- gWeather.unknown_73E = gWeather.unknown_73C;
- gWeather.unknown_742 = 1;
- gWeather.unknown_740 = 0x3C;
+ gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C;
+ gWeatherPtr->unknown_742 = 1;
+ gWeatherPtr->unknown_740 = 0x3C;
}
}
break;
case 1:
- gWeather.unknown_740 = (gWeather.unknown_740 + 3) & 0x7F;
- gWeather.unknown_73C = ((gSineTable[gWeather.unknown_740] - 1) >> 6) + 2;
- if (gWeather.unknown_73C != gWeather.unknown_73E)
- sub_807DA04(gWeather.unknown_73C);
- gWeather.unknown_73E = gWeather.unknown_73C;
+ gWeatherPtr->unknown_740 = (gWeatherPtr->unknown_740 + 3) & 0x7F;
+ gWeatherPtr->unknown_73C = ((gSineTable[gWeatherPtr->unknown_740] - 1) >> 6) + 2;
+ if (gWeatherPtr->unknown_73C != gWeatherPtr->unknown_73E)
+ sub_807DA04(gWeatherPtr->unknown_73C);
+ gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C;
break;
case 2:
- if (++gWeather.unknown_740 > gUnknown_0202FF58)
+ if (++gWeatherPtr->unknown_740 > gUnknown_0202FF58)
{
- gWeather.unknown_740 = 0;
- sub_807DA04(--gWeather.unknown_73C);
- if (gWeather.unknown_73C == 3)
- gWeather.unknown_742 = 0;
+ gWeatherPtr->unknown_740 = 0;
+ sub_807DA04(--gWeatherPtr->unknown_73C);
+ if (gWeatherPtr->unknown_73C == 3)
+ gWeatherPtr->unknown_742 = 0;
}
break;
}
@@ -960,49 +999,49 @@ void sub_807DA4C(void)
void sub_807DB64(u8 a, u8 b)
{
- gWeather.unknown_730 = a;
- gWeather.unknown_732 = b;
- gWeather.unknown_734 = a;
- gWeather.unknown_736 = b;
+ gWeatherPtr->unknown_730 = a;
+ gWeatherPtr->unknown_732 = b;
+ gWeatherPtr->unknown_734 = a;
+ gWeatherPtr->unknown_736 = b;
REG_BLDALPHA = (b << 8) | a;
}
void sub_807DBA4(u8 a, u8 b, int c)
{
- gWeather.unknown_734 = a;
- gWeather.unknown_736 = b;
- gWeather.unknown_73A = c;
- gWeather.unknown_739 = 0;
- gWeather.unknown_738 = 0;
+ gWeatherPtr->unknown_734 = a;
+ gWeatherPtr->unknown_736 = b;
+ gWeatherPtr->unknown_73A = c;
+ gWeatherPtr->unknown_739 = 0;
+ gWeatherPtr->unknown_738 = 0;
}
bool8 sub_807DBE8(void)
{
- if (gWeather.unknown_730 == gWeather.unknown_734
- && gWeather.unknown_732 == gWeather.unknown_736)
+ if (gWeatherPtr->unknown_730 == gWeatherPtr->unknown_734
+ && gWeatherPtr->unknown_732 == gWeatherPtr->unknown_736)
return TRUE;
- if (++gWeather.unknown_739 > gWeather.unknown_73A)
+ if (++gWeatherPtr->unknown_739 > gWeatherPtr->unknown_73A)
{
- gWeather.unknown_739 = 0;
- gWeather.unknown_738++;
- if (gWeather.unknown_738 & 1)
+ gWeatherPtr->unknown_739 = 0;
+ gWeatherPtr->unknown_738++;
+ if (gWeatherPtr->unknown_738 & 1)
{
- if (gWeather.unknown_730 < gWeather.unknown_734)
- gWeather.unknown_730++;
- else if (gWeather.unknown_730 > gWeather.unknown_734)
- gWeather.unknown_730--;
+ if (gWeatherPtr->unknown_730 < gWeatherPtr->unknown_734)
+ gWeatherPtr->unknown_730++;
+ else if (gWeatherPtr->unknown_730 > gWeatherPtr->unknown_734)
+ gWeatherPtr->unknown_730--;
}
else
{
- if (gWeather.unknown_732 < gWeather.unknown_736)
- gWeather.unknown_732++;
- else if (gWeather.unknown_732 > gWeather.unknown_736)
- gWeather.unknown_732--;
+ if (gWeatherPtr->unknown_732 < gWeatherPtr->unknown_736)
+ gWeatherPtr->unknown_732++;
+ else if (gWeatherPtr->unknown_732 > gWeatherPtr->unknown_736)
+ gWeatherPtr->unknown_732--;
}
}
- REG_BLDALPHA = (gWeather.unknown_732 << 8) | gWeather.unknown_730;
- if (gWeather.unknown_730 == gWeather.unknown_734
- && gWeather.unknown_732 == gWeather.unknown_736)
+ REG_BLDALPHA = (gWeatherPtr->unknown_732 << 8) | gWeatherPtr->unknown_730;
+ if (gWeatherPtr->unknown_730 == gWeatherPtr->unknown_734
+ && gWeatherPtr->unknown_732 == gWeatherPtr->unknown_736)
return TRUE;
return FALSE;
}
@@ -1046,23 +1085,23 @@ void unref_sub_807DCB4(u8 a)
u8 weather_get_current(void)
{
- return gWeather.unknown_6D0;
+ return gWeatherPtr->currWeather;
}
-void sub_807DD5C(u16 sndEff)
+void SetRainStrengthFromSoundEffect(u16 sndEff)
{
- if (gUnknown_0202F7E8.unknown_6C6 != 2)
+ if (gWeatherPtr->unknown_6C6 != 2)
{
switch (sndEff)
{
case SE_T_KOAME:
- gUnknown_0202F7E8.unknown_6DD = 0;
+ gWeatherPtr->rainStrength = 0;
break;
case SE_T_OOAME:
- gUnknown_0202F7E8.unknown_6DD = 1;
+ gWeatherPtr->rainStrength = 1;
break;
case SE_T_AME:
- gUnknown_0202F7E8.unknown_6DD = 2;
+ gWeatherPtr->rainStrength = 2;
break;
default:
return;
@@ -1075,17 +1114,17 @@ void PlayRainSoundEffect(void)
{
if (IsSpecialSEPlaying())
{
- switch (gUnknown_0202F7E8.unknown_6DD)
+ switch (gWeatherPtr->rainStrength)
{
case 0:
- PlaySE(0x56);
+ PlaySE(SE_T_KOAME_E);
break;
case 1:
- PlaySE(0x54);
+ PlaySE(SE_T_OOAME_E);
break;
case 2:
default:
- PlaySE(0x52);
+ PlaySE(SE_T_AME_E);
break;
}
}
@@ -1093,17 +1132,17 @@ void PlayRainSoundEffect(void)
u8 sub_807DDFC(void)
{
- return gUnknown_0202F7E8.unknown_6D3;
+ return gWeatherPtr->unknown_6D3;
}
void sub_807DE10(void)
{
- gUnknown_0202F7E8.unknown_6C6 = 2;
+ gWeatherPtr->unknown_6C6 = 2;
}
void unref_sub_807DE24(void)
{
- gUnknown_0202F7E8.unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C6 = 3;
}
void sub_807DE38(u8 a)
@@ -1117,1028 +1156,3 @@ void sub_807DE68(void)
{
gUnknown_030006DC = gUnknown_083970C8;
}
-
-void sub_807DE78(void)
-{
- gUnknown_08396FC4->unknown_6C1 = 0;
- gUnknown_08396FC4->unknown_6C2 = 20;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6CC = 0;
- if (gUnknown_08396FC4->unknown_6DE == 0)
- sub_807DB64(0, 16);
-}
-
-void sub_807DEF4(void);
-
-void sub_807DEC4(void)
-{
- sub_807DE78();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- sub_807DEF4();
-}
-
-void sub_807DFD4(void);
-
-void sub_807DEF4(void)
-{
- switch (gUnknown_08396FC4->unknown_6CC)
- {
- case 0:
- sub_807DFD4();
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 1:
- sub_807DBA4(12, 8, 1);
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 2:
- if (sub_807DBE8())
- {
- gUnknown_08396FC4->unknown_6D2 = 1;
- gUnknown_08396FC4->unknown_6CC++;
- }
- break;
- }
-}
-
-void sub_807E0A0(void);
-
-bool8 sub_807DF54(void)
-{
- switch (gUnknown_08396FC4->unknown_6CE)
- {
- case 0:
- sub_807DBA4(0, 16, 1);
- gUnknown_08396FC4->unknown_6CE++;
- return TRUE;
- case 1:
- if (sub_807DBE8())
- {
- sub_807E0A0();
- gUnknown_08396FC4->unknown_6CE++;
- }
- return TRUE;
- }
- return FALSE;
-}
-
-void sub_807DF9C(void)
-{
- gUnknown_08396FC4->unknown_6C1 = 0;
- gUnknown_08396FC4->unknown_6C2 = 20;
-}
-
-void sub_807DFC0(void)
-{
- sub_807DF9C();
-}
-
-void nullsub_55(void)
-{
-}
-
-int sub_807DFD0(void)
-{
- return 0;
-}
-
-void sub_807DFD4(void)
-{
- u16 i;
-
- if (gUnknown_08396FC4->unknown_6DE == 1)
- return;
- LoadSpriteSheet(&gUnknown_0839A9D4);
- sub_807D8C0(gUnknown_08397108);
- for (i = 0; i < 3; i++)
- {
- u8 spriteId = CreateSprite(&gSpriteTemplate_839A9F0, 0, 0, 0xFF);
-
- if (spriteId != 64)
- {
- struct Sprite *sprite;
-
- gUnknown_08396FC4->unknown_1F4[i] = &gSprites[spriteId];
- sprite = gUnknown_08396FC4->unknown_1F4[i];
- sub_80603CC(gUnknown_0839A9C8[i].x + 7, gUnknown_0839A9C8[i].y + 7, &sprite->pos1.x, &sprite->pos1.y);
- sprite->coordOffsetEnabled = TRUE;
- }
- else
- {
- gUnknown_08396FC4->unknown_1F4[i] = NULL;
- }
- }
- gUnknown_08396FC4->unknown_6DE = 1;
-}
-
-void sub_807E0A0(void)
-{
- u16 i;
-
- if (gUnknown_08396FC4->unknown_6DE == 0)
- return;
- for (i = 0; i < 3; i++)
- {
- if (gUnknown_08396FC4->unknown_1F4[i] != NULL)
- DestroySprite(gUnknown_08396FC4->unknown_1F4[i]);
- }
- FreeSpriteTilesByTag(0x1200);
- gUnknown_08396FC4->unknown_6DE = 0;
-}
-
-void sub_807E0F4(struct Sprite *sprite)
-{
- sprite->data[0] = (sprite->data[0] + 1) & 1;
- if (sprite->data[0] != 0)
- sprite->pos1.x--;
-}
-
-void sub_807E110(void)
-{
- gUnknown_08396FC4->unknown_6CC = 0;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6C1 = 0;
- gUnknown_08396FC4->unknown_6C2 = 0;
-}
-
-void sub_807E174(void);
-
-void sub_807E144(void)
-{
- sub_807E110();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- sub_807E174();
-}
-
-void sub_807E174(void)
-{
- switch (gUnknown_08396FC4->unknown_6CC)
- {
- case 0:
- if (gUnknown_08396FC4->unknown_6C6 != 0)
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 1:
- sub_807D9A8();
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 2:
- if (sub_807D9C8() == FALSE)
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 3:
- sub_807DA14();
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 4:
- sub_807DA4C();
- if (gUnknown_08396FC4->unknown_73C == 6)
- {
- gUnknown_08396FC4->unknown_6D2 = 1;
- gUnknown_08396FC4->unknown_6CC++;
- }
- break;
- default:
- sub_807DA4C();
- break;
- }
-}
-
-int sub_807E258(void)
-{
- return 0;
-}
-
-void task50_0807B6D4(u8);
-
-void sub_807E25C(void)
-{
- CreateTask(task50_0807B6D4, 0x50);
-}
-
-#define tState data[0]
-#define tBlendY data[1]
-#define tBlendDelay data[2]
-#define tWinRange data[3]
-
-void task50_0807B6D4(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
-
- switch (task->tState)
- {
- case 0:
- task->tBlendY = 0;
- task->tBlendDelay = 0;
- task->tWinRange = REG_WININ;
- REG_WININ = WIN_RANGE(63, 63);
- REG_BLDCNT = 0x9E;
- REG_BLDY = 0;
- task->tState++;
- // fall through
- case 1:
- task->tBlendY += 3;
- if (task->tBlendY > 16)
- task->tBlendY = 16;
- REG_BLDY = task->tBlendY;
- if (task->tBlendY >= 16)
- task->tState++;
- break;
- case 2:
- task->tBlendDelay++;
- if (task->tBlendDelay > 9)
- {
- task->tBlendDelay = 0;
- task->tBlendY--;
- if (task->tBlendY <= 0)
- {
- task->tBlendY = 0;
- task->tState++;
- }
- REG_BLDY = task->tBlendY;
- }
- break;
- case 3:
- REG_BLDCNT = 0;
- REG_BLDY = 0;
- REG_WININ = task->tWinRange;
- task->tState++;
- break;
- case 4:
- EnableBothScriptContexts();
- DestroyTask(taskId);
- break;
- }
-}
-
-#undef tState
-#undef tBlendY
-#undef tBlendDelay
-#undef tWinRange
-
-void sub_807E364(void)
-{
- gUnknown_08396FC4->unknown_6CC = 0;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6D6 = 0;
- gUnknown_08396FC4->unknown_6DB = 8;
- gUnknown_08396FC4->unknown_6DC = 0;
- gUnknown_08396FC4->unknown_6D9 = 10;
- gUnknown_08396FC4->unknown_6C1 = 3;
- gUnknown_08396FC4->unknown_6C2 = 20;
- sub_807DD5C(SE_T_KOAME);
-}
-
-void sub_807E400(void);
-
-void sub_807E3D0(void)
-{
- sub_807E364();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- sub_807E400();
-}
-
-void sub_807E7A4(void);
-u8 sub_807E7B4(void);
-u8 sub_807E8E8(void);
-
-void sub_807E400(void)
-{
- switch (gUnknown_08396FC4->unknown_6CC)
- {
- case 0:
- sub_807E7A4();
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 1:
- if (sub_807E7B4() == 0)
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 2:
- if (sub_807E8E8() == FALSE)
- {
- gUnknown_08396FC4->unknown_6D2 = 1;
- gUnknown_08396FC4->unknown_6CC++;
- }
- break;
- }
-}
-
-void sub_807E974(void);
-
-bool8 sub_807E460(void)
-{
- switch (gUnknown_08396FC4->unknown_6CE)
- {
- case 0:
- if (gUnknown_08396FC4->unknown_6D1 == 3
- || gUnknown_08396FC4->unknown_6D1 == 5
- || gUnknown_08396FC4->unknown_6D1 == 13)
- {
- gUnknown_08396FC4->unknown_6CE = 0xFF;
- return FALSE;
- }
- else
- {
- gUnknown_08396FC4->unknown_6D9 = 0;
- gUnknown_08396FC4->unknown_6CE++;
- }
- // fall through
- case 1:
- if (sub_807E8E8() == FALSE)
- {
- sub_807E974();
- gUnknown_08396FC4->unknown_6CE++;
- return FALSE;
- }
- return TRUE;
- }
- return FALSE;
-}
-
-//extern const struct Coords16 gUnknown_0839AAC4[];
-extern const u16 gUnknown_0839AAC4[][2];
-//extern const struct Coords16 gUnknown_0839AABC[];
-extern const s16 gUnknown_0839AABC[][2];
-
-void sub_807E4EC(struct Sprite *sprite)
-{
- u32 randVal;
- u16 r6;
- s32 r4;
- s32 r0;
-
- if (sprite->data[1] == 0)
- sprite->data[1] = 361;
- randVal = sprite->data[1] * 1103515245 + 12345;
- sprite->data[1] = ((randVal & 0x7FFF0000) >> 16) % 600;
-
- r6 = gUnknown_0839AAC4[gUnknown_08396FC4->unknown_6DC][0];
-
- r4 = sprite->data[1] % 30;
- sprite->data[2] = r4 * 8; // useless assignment
-
- r0 = sprite->data[1] / 30;
- sprite->data[3] = r0 * 8; // useless assignment
-
- sprite->data[2] = r4;
- sprite->data[2] <<= 7;
-
- sprite->data[3] = r0;
- sprite->data[3] <<= 7;
-
- sprite->data[2] -= gUnknown_0839AABC[gUnknown_08396FC4->unknown_6DC][0] * r6;
- sprite->data[3] -= gUnknown_0839AABC[gUnknown_08396FC4->unknown_6DC][1] * r6;
-
- StartSpriteAnim(sprite, 0);
- sprite->data[4] = 0;
- sprite->coordOffsetEnabled = FALSE;
- sprite->data[0] = r6;
-}
-
-void sub_807E5C0(struct Sprite *sprite)
-{
- if (sprite->data[4] == 0)
- {
- sprite->data[2] += gUnknown_0839AABC[gUnknown_08396FC4->unknown_6DC][0];
- sprite->data[3] += gUnknown_0839AABC[gUnknown_08396FC4->unknown_6DC][1];
- sprite->pos1.x = sprite->data[2] >> 4;
- sprite->pos1.y = sprite->data[3] >> 4;
-
- if (sprite->data[5] != 0
- && (sprite->pos1.x >= -8 && sprite->pos1.x <= 248)
- && sprite->pos1.y >= -16 && sprite->pos1.y <= 176)
- sprite->invisible = FALSE;
- else
- sprite->invisible = TRUE;
-
- sprite->data[0]--;
- if (sprite->data[0] == 0)
- {
- StartSpriteAnim(sprite, gUnknown_08396FC4->unknown_6DC + 1);
- sprite->data[4] = 1;
- sprite->pos1.x -= gSpriteCoordOffsetX;
- sprite->pos1.y -= gSpriteCoordOffsetY;
- sprite->coordOffsetEnabled = TRUE;
- }
- }
- else if (sprite->animEnded)
- {
- sprite->invisible = TRUE;
- sub_807E4EC(sprite);
- }
-}
-
-void sub_807E6C4(struct Sprite *sprite)
-{
- if (sprite->data[0] == 0)
- {
- sub_807E4EC(sprite);
- sprite->callback = sub_807E5C0;
- }
- else
- {
- sprite->data[0]--;
- }
-}
-
-void sub_807E6F0(struct Sprite *sprite, u16 b)
-{
- u16 r8 = gUnknown_0839AAC4[gUnknown_08396FC4->unknown_6DC][0];
- u16 r6 = b / (gUnknown_0839AAC4[gUnknown_08396FC4->unknown_6DC][1] + r8);
- u16 r4 = b % (gUnknown_0839AAC4[gUnknown_08396FC4->unknown_6DC][1] + r8);
-
- while (--r6 != 0xFFFF)
- sub_807E4EC(sprite);
- if (r4 < r8)
- {
- while (--r4 != 0xFFFF)
- sub_807E5C0(sprite);
- sprite->data[6] = 0;
- }
- else
- {
- sprite->data[0] = r4 - r8;
- sprite->invisible = TRUE;
- sprite->data[6] = 1;
- }
-}
-
-void sub_807E7A4(void)
-{
- LoadSpriteSheet(&gUnknown_0839AACC);
-}
-
-extern const struct Coords16 gUnknown_0839AA08[];
-
-bool8 sub_807E7B4(void)
-{
- u8 r7;
- u8 spriteId;
-
- if (gUnknown_08396FC4->unknown_6DA == 24)
- return FALSE;
-
- r7 = gUnknown_08396FC4->unknown_6DA;
- spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839AAA4,
- gUnknown_0839AA08[r7].x, gUnknown_0839AA08[r7].y, 78);
- if (spriteId != 64)
- {
- gSprites[spriteId].data[5] = 0;
- gSprites[spriteId].data[1] = r7 * 145;
- while (gSprites[spriteId].data[1] >= 600)
- gSprites[spriteId].data[1] -= 600;
- sub_807E4EC(&gSprites[spriteId]);
- sub_807E6F0(&gSprites[spriteId], r7 * 9);
- gSprites[spriteId].invisible = TRUE;
- gUnknown_08396FC4->unknown_0[r7] = &gSprites[spriteId];
- }
- else
- {
- gUnknown_08396FC4->unknown_0[r7] = NULL;
- }
-
- if (++gUnknown_08396FC4->unknown_6DA == 24)
- {
- u16 i;
-
- for (i = 0; i < 24; i++)
- {
- if (gUnknown_08396FC4->unknown_0[i] != NULL)
- {
- if (gUnknown_08396FC4->unknown_0[i]->data[6] == 0)
- gUnknown_08396FC4->unknown_0[i]->callback = sub_807E5C0;
- else
- gUnknown_08396FC4->unknown_0[i]->callback = sub_807E6C4;
- }
- }
- return FALSE;
- }
- return TRUE;
-}
-
-bool8 sub_807E8E8(void)
-{
- if (gUnknown_08396FC4->unknown_6D8 == gUnknown_08396FC4->unknown_6D9)
- return FALSE;
-
- if (++gUnknown_08396FC4->unknown_6D6 > gUnknown_08396FC4->unknown_6DB)
- {
- gUnknown_08396FC4->unknown_6D6 = 0;
- if (gUnknown_08396FC4->unknown_6D8 < gUnknown_08396FC4->unknown_6D9)
- {
- gUnknown_08396FC4->unknown_0[gUnknown_08396FC4->unknown_6D8++]->data[5] = 1;
- }
- else
- {
- gUnknown_08396FC4->unknown_6D8--;
- gUnknown_08396FC4->unknown_0[gUnknown_08396FC4->unknown_6D8]->data[5] = 0;
- gUnknown_08396FC4->unknown_0[gUnknown_08396FC4->unknown_6D8]->invisible = TRUE;
- }
- }
- return TRUE;
-}
-
-void sub_807E974(void)
-{
- u16 i;
-
- for (i = 0; i < gUnknown_08396FC4->unknown_6DA; i++)
- {
- if (gUnknown_08396FC4->unknown_0[i] != NULL)
- DestroySprite(gUnknown_08396FC4->unknown_0[i]);
- }
- gUnknown_08396FC4->unknown_6DA = 0;
- FreeSpriteTilesByTag(0x1206);
-}
-
-void sub_807E9C8(void)
-{
- gUnknown_08396FC4->unknown_6CC = 0;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6C1 = 3;
- gUnknown_08396FC4->unknown_6C2 = 20;
- gUnknown_08396FC4->unknown_6E5 = 16;
- gUnknown_08396FC4->unknown_6E0 = 0;
-}
-
-void snowflakes_progress2(void);
-void sub_807ED48(struct Sprite *);
-
-void sub_807EA18(void)
-{
- sub_807E9C8();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- {
- u16 i;
-
- snowflakes_progress2();
- for (i = 0; i < gUnknown_08396FC4->unknown_6E4; i++)
- {
- sub_807ED48(gUnknown_08396FC4->unknown_60[i]);
- }
- }
-}
-
-u8 snowflakes_progress(void);
-
-void snowflakes_progress2(void)
-{
- if (gUnknown_08396FC4->unknown_6CC == 0 && snowflakes_progress() == FALSE)
- {
- gUnknown_08396FC4->unknown_6D2 = 1;
- gUnknown_08396FC4->unknown_6CC++;
- }
-}
-
-bool8 sub_807EAC0(void)
-{
- switch (gUnknown_08396FC4->unknown_6CE)
- {
- case 0:
- gUnknown_08396FC4->unknown_6E5 = 0;
- gUnknown_08396FC4->unknown_6E0 = 0;
- gUnknown_08396FC4->unknown_6CE++;
- // fall through
- case 1:
- if (snowflakes_progress() == FALSE)
- {
- gUnknown_08396FC4->unknown_6CE++;
- return FALSE;
- }
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 snowflake_add(void);
-bool8 snowflake_remove(void);
-
-bool8 snowflakes_progress(void)
-{
- if (gUnknown_08396FC4->unknown_6E4 == gUnknown_08396FC4->unknown_6E5)
- return FALSE;
-
- gUnknown_08396FC4->unknown_6E0++;
- if (gUnknown_08396FC4->unknown_6E0 > 36)
- {
- gUnknown_08396FC4->unknown_6E0 = 0;
- if (gUnknown_08396FC4->unknown_6E4 < gUnknown_08396FC4->unknown_6E5)
- snowflake_add();
- else
- snowflake_remove();
- }
- return (gUnknown_08396FC4->unknown_6E4 != gUnknown_08396FC4->unknown_6E5);
-}
-
-void sub_807EC40(struct Sprite *);
-
-bool8 snowflake_add(void)
-{
- u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839AB04, 0, 0, 78);
-
- if (spriteId == 64)
- return FALSE;
- gSprites[spriteId].data[4] = gUnknown_08396FC4->unknown_6E4;
- sub_807EC40(&gSprites[spriteId]);
- gSprites[spriteId].coordOffsetEnabled = TRUE;
- gUnknown_08396FC4->unknown_60[gUnknown_08396FC4->unknown_6E4++] = &gSprites[spriteId];
- return TRUE;
-}
-
-bool8 snowflake_remove(void)
-{
- if (gUnknown_08396FC4->unknown_6E4 != 0)
- {
- DestroySprite(gUnknown_08396FC4->unknown_60[--gUnknown_08396FC4->unknown_6E4]);
- return TRUE;
- }
- return FALSE;
-}
-
-void sub_807EC40(struct Sprite *sprite)
-{
- u16 r4 = ((sprite->data[4] * 5) & 7) * 30 + (Random() % 30);
- u16 r6;
-
- sprite->pos1.y = -3 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
- sprite->pos1.x = r4 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
- sprite->data[0] = sprite->pos1.y * 128;
- sprite->pos2.x = 0;
- r6 = Random();
- sprite->data[1] = (r6 & 3) * 5 + 64;
- sprite->data[7] = (r6 & 3) * 5 + 64;
- StartSpriteAnim(sprite, (r6 & 1) ? 0 : 1);
- sprite->data[3] = 0;
- sprite->data[2] = ((r6 & 3) == 0) ? 2 : 1;
- sprite->data[6] = (r6 & 0x1F) + 210;
- sprite->data[5] = 0;
-}
-
-void sub_807ECEC(struct Sprite *sprite)
-{
- if (gUnknown_08396FC4->unknown_6E2 > 18)
- {
- sprite->invisible = FALSE;
- sprite->callback = sub_807ED48;
- sprite->pos1.y = 0xFA - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
- sprite->data[0] = sprite->pos1.y * 128;
- gUnknown_08396FC4->unknown_6E2 = 0;
- }
-}
-
-void sub_807ED48(struct Sprite *sprite)
-{
- s16 r3;
- s16 r2;
-
- sprite->data[0] += sprite->data[1];
- sprite->pos1.y = sprite->data[0] >> 7;
- sprite->data[3] = (sprite->data[3] + sprite->data[2]) & 0xFF;
- sprite->pos2.x = gSineTable[sprite->data[3]] / 64;
-
- r3 = (sprite->pos1.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX) & 0x1FF;
- if (r3 & 0x100)
- r3 = -0x100 | r3; // hmm... what is this?
- if (r3 < -3)
- sprite->pos1.x = 242 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
- else if (r3 > 242)
- sprite->pos1.x = -3 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
-
- r2 = (sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY) & 0xFF;
- if (r2 > 163 && r2 < 171)
- {
- sprite->pos1.y = 250 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
- sprite->data[0] = sprite->pos1.y * 128;
- sprite->data[5] = 0;
- sprite->data[6] = 220;
- }
- else if (r2 > 242 && r2 < 250)
- {
- sprite->pos1.y = 163;
- sprite->data[0] = sprite->pos1.y * 128;
- sprite->data[5] = 0;
- sprite->data[6] = 220;
- sprite->invisible = TRUE;
- sprite->callback = sub_807ECEC;
- }
-
- sprite->data[5]++;
- if (sprite->data[5] == sprite->data[6])
- {
- sub_807EC40(sprite);
- sprite->pos1.y = 250;
- sprite->invisible = TRUE;
- sprite->callback = sub_807ECEC;
- }
-}
-
-void sub_807EE80(void)
-{
- gUnknown_08396FC4->unknown_6CC = 0;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6D6 = 0;
- gUnknown_08396FC4->unknown_6DB = 4;
- gUnknown_08396FC4->unknown_6DC = 0;
- gUnknown_08396FC4->unknown_6D9 = 16;
- gUnknown_08396FC4->unknown_6C1 = 3;
- gUnknown_08396FC4->unknown_6C2 = 20;
- gUnknown_08396FC4->unknown_6D2 = 0; // duplicate assignment
- gUnknown_08396FC4->unknown_6ED = 0;
- sub_807DD5C(0x51);
-}
-
-void sub_807EFC0(void);
-
-void sub_807EEF4(void)
-{
- sub_807EE80();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- sub_807EFC0();
-}
-
-void sub_807EF24(void)
-{
- gUnknown_08396FC4->unknown_6CC = 0;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6D6 = 0;
- gUnknown_08396FC4->unknown_6DB = 4;
- gUnknown_08396FC4->unknown_6DC = 1;
- gUnknown_08396FC4->unknown_6D9 = 24;
- gUnknown_08396FC4->unknown_6C1 = 3;
- gUnknown_08396FC4->unknown_6C2 = 20;
- gUnknown_08396FC4->unknown_6D2 = 0; // duplicate assignment
- sub_807DD5C(0x53);
-}
-
-void sub_807EF90(void)
-{
- sub_807EF24();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- sub_807EFC0();
-}
-
-void sub_807F434(void);
-void sub_807F3F8(u16);
-
-void sub_807EFC0(void)
-{
- sub_807F434();
- switch (gUnknown_08396FC4->unknown_6CC)
- {
- case 0:
- sub_807E7A4();
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 1:
- if (sub_807E7B4())
- break;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 2:
- if (sub_807E8E8())
- break;
- gUnknown_08396FC4->unknown_6D2 = 1;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 3:
- if (gUnknown_08396FC4->unknown_6C6 == 0)
- break;
- gUnknown_08396FC4->unknown_6CC = 6;
- break;
- case 4:
- gUnknown_08396FC4->unknown_6EA = 1;
- gUnknown_08396FC4->unknown_6E6 = (Random() % 360) + 360;
- gUnknown_08396FC4->unknown_6CC++;
- // fall through
- case 5:
- if (--gUnknown_08396FC4->unknown_6E6 != 0)
- break;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 6:
- gUnknown_08396FC4->unknown_6EA = 1;
- gUnknown_08396FC4->unknown_6EB = Random() % 2;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 7:
- gUnknown_08396FC4->unknown_6EC = (Random() & 1) + 1;
- gUnknown_08396FC4->unknown_6CC++;
- // fall through
- case 8:
- sub_807D5BC(19);
- if (gUnknown_08396FC4->unknown_6EB == 0 && gUnknown_08396FC4->unknown_6EC == 1)
- sub_807F3F8(20);
- gUnknown_08396FC4->unknown_6E6 = (Random() % 3) + 6;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 9:
- if (--gUnknown_08396FC4->unknown_6E6 != 0)
- break;
- sub_807D5BC(3);
- gUnknown_08396FC4->unknown_6EA = 1;
- if (--gUnknown_08396FC4->unknown_6EC != 0)
- {
- gUnknown_08396FC4->unknown_6E6 = (Random() % 16) + 60;
- gUnknown_08396FC4->unknown_6CC = 10;
- }
- else if (gUnknown_08396FC4->unknown_6EB == 0)
- {
- gUnknown_08396FC4->unknown_6CC = 4;
- }
- else
- {
- gUnknown_08396FC4->unknown_6CC = 11;
- }
- break;
- case 10:
- if (--gUnknown_08396FC4->unknown_6E6 != 0)
- break;
- gUnknown_08396FC4->unknown_6CC = 8;
- break;
- case 11:
- gUnknown_08396FC4->unknown_6E6 = (Random() % 16) + 60;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 12:
- if (--gUnknown_08396FC4->unknown_6E6 != 0)
- break;
- sub_807F3F8(100);
- sub_807D5BC(19);
- // Why use "% 16" everywhere else and "& 0xF" here. So dumb.
- gUnknown_08396FC4->unknown_6E6 = (Random() & 0xF) + 30;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 13:
- if (--gUnknown_08396FC4->unknown_6E6 != 0)
- break;
- sub_807D5F0(19, 3, 5);
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 14:
- if (gUnknown_08396FC4->unknown_6C6 != 3)
- break;
- gUnknown_08396FC4->unknown_6EA = 1;
- gUnknown_08396FC4->unknown_6CC = 4;
- break;
- }
-}
-
-bool8 sub_807F34C(void)
-{
- switch (gUnknown_08396FC4->unknown_6CE)
- {
- case 0:
- gUnknown_08396FC4->unknown_6EA = 0;
- gUnknown_08396FC4->unknown_6CE++;
- // fall through
- case 1:
- sub_807EFC0();
- if (gUnknown_08396FC4->unknown_6EA != 0)
- {
- if (gUnknown_08396FC4->unknown_6D1 == 3
- || gUnknown_08396FC4->unknown_6D1 == 5
- || gUnknown_08396FC4->unknown_6D1 == 13)
- return FALSE;
- gUnknown_08396FC4->unknown_6D9 = 0;
- gUnknown_08396FC4->unknown_6CE++;
- }
- break;
- case 2:
- if (sub_807E8E8())
- break;
- sub_807E974();
- gUnknown_08396FC4->unknown_6ED = 0;
- gUnknown_08396FC4->unknown_6CE++;
- return FALSE;
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-void sub_807F3F8(u16 a)
-{
- if (gUnknown_08396FC4->unknown_6ED == 0)
- {
- gUnknown_08396FC4->unknown_6E8 = Random() % a;
- gUnknown_08396FC4->unknown_6ED = 1;
- }
-}
-
-void sub_807F434(void)
-{
- if (gUnknown_08396FC4->unknown_6ED == 1)
- {
- if (gUnknown_08396FC4->unknown_6E8 == 0)
- {
- if (IsSEPlaying())
- return;
- if (Random() & 1)
- PlaySE(0x57);
- else
- PlaySE(0x58);
- gUnknown_08396FC4->unknown_6ED = 0;
- }
- else
- {
- gUnknown_08396FC4->unknown_6E8--;
- }
- }
-}
-
-void sub_807F49C(void)
-{
- gUnknown_08396FC4->unknown_6CC = 0;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6C1 = 0;
- gUnknown_08396FC4->unknown_6C2 = 20;
- if (gUnknown_08396FC4->unknown_6FB == 0)
- {
- gUnknown_08396FC4->unknown_6F0 = 0;
- gUnknown_08396FC4->unknown_6F2 = 0;
- gUnknown_08396FC4->unknown_6EE = 0;
- sub_807DB64(0, 16);
- }
-}
-
-void sub_807F52C(void);
-
-void sub_807F4FC(void)
-{
- sub_807F49C();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- sub_807F52C();
-}
-
-void sub_807F6E8(void);
-
-void sub_807F52C(void)
-{
- gUnknown_08396FC4->unknown_6EE = (gSpriteCoordOffsetX - gUnknown_08396FC4->unknown_6F2) & 0xFF;
- if (++gUnknown_08396FC4->unknown_6F0 > 3)
- {
- gUnknown_08396FC4->unknown_6F0 = 0;
- gUnknown_08396FC4->unknown_6F2++;
- }
- switch (gUnknown_08396FC4->unknown_6CC)
- {
- case 0:
- sub_807F6E8();
- if (gUnknown_08396FC4->unknown_6D0 == 6)
- sub_807DBA4(12, 8, 3);
- else
- sub_807DBA4(4, 16, 0);
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 1:
- if (sub_807DBE8())
- {
- gUnknown_08396FC4->unknown_6D2 = 1;
- gUnknown_08396FC4->unknown_6CC++;
- }
- break;
- }
-}
-
-void sub_807F7A4(void);
-
-bool8 sub_807F5EC(void)
-{
- gUnknown_08396FC4->unknown_6EE = (gSpriteCoordOffsetX - gUnknown_08396FC4->unknown_6F2) & 0xFF;
- if (++gUnknown_08396FC4->unknown_6F0 > 3)
- {
- gUnknown_08396FC4->unknown_6F0 = 0;
- gUnknown_08396FC4->unknown_6F2++;
- }
- switch (gUnknown_08396FC4->unknown_6CE)
- {
- case 0:
- sub_807DBA4(0, 16, 3);
- gUnknown_08396FC4->unknown_6CE++;
- break;
- case 1:
- if (!sub_807DBE8())
- break;
- gUnknown_08396FC4->unknown_6CE++;
- break;
- case 2:
- sub_807F7A4();
- gUnknown_08396FC4->unknown_6CE++;
- break;
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-void sub_807F688(struct Sprite *sprite)
-{
- sprite->pos2.y = (u8)gSpriteCoordOffsetY;
- sprite->pos1.x = gUnknown_08396FC4->unknown_6EE + 32 + sprite->data[0] * 64;
- if (sprite->pos1.x > 0x10F)
- {
- sprite->pos1.x = 480 + gUnknown_08396FC4->unknown_6EE - (4 - sprite->data[0]) * 64;
- sprite->pos1.x &= 0x1FF;
- }
-}
diff --git a/src/field/field_weather_2.c b/src/field/field_weather_2.c
new file mode 100644
index 000000000..fa97df459
--- /dev/null
+++ b/src/field/field_weather_2.c
@@ -0,0 +1,1511 @@
+#include "global.h"
+#include "field_map_obj.h"
+#include "field_weather.h"
+#include "rng.h"
+#include "script.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+
+extern struct Weather *const gWeatherPtr;
+
+//extern const s16 gUnknown_0839A9C8[][2];
+extern const struct SpriteSheet gWeatherCloudSpriteSheet;
+extern const struct SpriteTemplate gSpriteTemplate_839A9F0;
+extern const struct SpriteTemplate gSpriteTemplate_839AAA4;
+extern const struct SpriteTemplate gSpriteTemplate_839AB04;
+
+const u16 gUnknown_08397108[] = INCBIN_U16("graphics/weather/1.gbapal");
+const u16 gUnknown_08397128[] = INCBIN_U16("graphics/weather/2.gbapal");
+const u8 WeatherFog0Tiles[] = INCBIN_U8("graphics/weather/fog0.4bpp");
+const u8 gWeatherFog1Tiles[] = INCBIN_U8("graphics/weather/fog1.4bpp");
+const u8 WeatherCloudTiles[] = INCBIN_U8("graphics/weather/cloud.4bpp");
+const u8 gSpriteImage_8398948[] = INCBIN_U8("graphics/weather/snow0.4bpp");
+const u8 gSpriteImage_8398968[] = INCBIN_U8("graphics/weather/snow1.4bpp");
+const u8 WeatherBubbleTiles[] = INCBIN_U8("graphics/weather/bubble.4bpp");
+const u8 WeatherAshTiles[] = INCBIN_U8("graphics/weather/ash.4bpp");
+const u8 WeatherRainTiles[] = INCBIN_U8("graphics/weather/rain.4bpp");
+const u8 WeatherSandstormTiles[] = INCBIN_U8("graphics/weather/sandstorm.4bpp");
+
+const struct Coords16 gUnknown_0839A9C8[] =
+{
+ { 0, 66},
+ { 5, 73},
+ {10, 78},
+};
+
+const struct SpriteSheet gWeatherCloudSpriteSheet = {WeatherCloudTiles, 0x800, 0x1200};
+
+const struct OamData gOamData_839A9DC =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_839A9E4[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839A9EC[] =
+{
+ gSpriteAnim_839A9E4,
+};
+
+void sub_807E0F4(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_839A9F0 =
+{
+ .tileTag = 4608,
+ .paletteTag = 4609,
+ .oam = &gOamData_839A9DC,
+ .anims = gSpriteAnimTable_839A9EC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807E0F4,
+};
+
+extern void sub_807D5BC(s8 a);
+extern void sub_807D8C0(const u16 *palette);
+extern void sub_807D9A8(void);
+extern bool8 sub_807D9C8(void);
+extern void sub_807DA14(void);
+extern void sub_807DA4C(void);
+extern void sub_807DBA4(u8 a, u8 b, int c);
+extern bool8 sub_807DBE8(void);
+extern void SetRainStrengthFromSoundEffect(u16 sndEff);
+extern void sub_807D5F0(u8 a, u8 b, u8 c);
+
+//------------------------------------------------------------------------------
+// Clouds
+//------------------------------------------------------------------------------
+
+void sub_807DE78(void)
+{
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->unknown_6CC = 0;
+ if (gWeatherPtr->unknown_6DE == 0)
+ sub_807DB64(0, 16);
+}
+
+void sub_807DEF4(void);
+
+void sub_807DEC4(void)
+{
+ sub_807DE78();
+ while (gWeatherPtr->unknown_6D2 == 0)
+ sub_807DEF4();
+}
+
+void sub_807DFD4(void);
+
+void sub_807DEF4(void)
+{
+ switch (gWeatherPtr->unknown_6CC)
+ {
+ case 0:
+ sub_807DFD4();
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 1:
+ sub_807DBA4(12, 8, 1);
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 2:
+ if (sub_807DBE8())
+ {
+ gWeatherPtr->unknown_6D2 = 1;
+ gWeatherPtr->unknown_6CC++;
+ }
+ break;
+ }
+}
+
+void sub_807E0A0(void);
+
+bool8 sub_807DF54(void)
+{
+ switch (gWeatherPtr->unknown_6CE)
+ {
+ case 0:
+ sub_807DBA4(0, 16, 1);
+ gWeatherPtr->unknown_6CE++;
+ return TRUE;
+ case 1:
+ if (sub_807DBE8())
+ {
+ sub_807E0A0();
+ gWeatherPtr->unknown_6CE++;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_807DF9C(void)
+{
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+}
+
+void sub_807DFC0(void)
+{
+ sub_807DF9C();
+}
+
+void nullsub_55(void)
+{
+}
+
+int sub_807DFD0(void)
+{
+ return 0;
+}
+
+void sub_807DFD4(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->unknown_6DE == 1)
+ return;
+ LoadSpriteSheet(&gWeatherCloudSpriteSheet);
+ sub_807D8C0(gUnknown_08397108);
+ for (i = 0; i < 3; i++)
+ {
+ u8 spriteId = CreateSprite(&gSpriteTemplate_839A9F0, 0, 0, 0xFF);
+
+ if (spriteId != 64)
+ {
+ struct Sprite *sprite;
+
+ gWeatherPtr->cloudSprites[i] = &gSprites[spriteId];
+ sprite = gWeatherPtr->cloudSprites[i];
+ sub_80603CC(gUnknown_0839A9C8[i].x + 7, gUnknown_0839A9C8[i].y + 7, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->coordOffsetEnabled = TRUE;
+ }
+ else
+ {
+ gWeatherPtr->cloudSprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->unknown_6DE = 1;
+}
+
+void sub_807E0A0(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->unknown_6DE == 0)
+ return;
+ for (i = 0; i < 3; i++)
+ {
+ if (gWeatherPtr->cloudSprites[i] != NULL)
+ DestroySprite(gWeatherPtr->cloudSprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1200);
+ gWeatherPtr->unknown_6DE = 0;
+}
+
+void sub_807E0F4(struct Sprite *sprite)
+{
+ sprite->data[0] = (sprite->data[0] + 1) & 1;
+ if (sprite->data[0] != 0)
+ sprite->pos1.x--;
+}
+
+void sub_807E110(void)
+{
+ gWeatherPtr->unknown_6CC = 0;
+ gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 0;
+}
+
+void sub_807E174(void);
+
+void sub_807E144(void)
+{
+ sub_807E110();
+ while (gWeatherPtr->unknown_6D2 == 0)
+ sub_807E174();
+}
+
+void sub_807E174(void)
+{
+ switch (gWeatherPtr->unknown_6CC)
+ {
+ case 0:
+ if (gWeatherPtr->unknown_6C6 != 0)
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 1:
+ sub_807D9A8();
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 2:
+ if (sub_807D9C8() == FALSE)
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 3:
+ sub_807DA14();
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 4:
+ sub_807DA4C();
+ if (gWeatherPtr->unknown_73C == 6)
+ {
+ gWeatherPtr->unknown_6D2 = 1;
+ gWeatherPtr->unknown_6CC++;
+ }
+ break;
+ default:
+ sub_807DA4C();
+ break;
+ }
+}
+
+int sub_807E258(void)
+{
+ return 0;
+}
+
+void task50_0807B6D4(u8);
+
+void sub_807E25C(void)
+{
+ CreateTask(task50_0807B6D4, 0x50);
+}
+
+#define tState data[0]
+#define tBlendY data[1]
+#define tBlendDelay data[2]
+#define tWinRange data[3]
+
+void task50_0807B6D4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->tState)
+ {
+ case 0:
+ task->tBlendY = 0;
+ task->tBlendDelay = 0;
+ task->tWinRange = REG_WININ;
+ REG_WININ = WIN_RANGE(63, 63);
+ REG_BLDCNT = 0x9E;
+ REG_BLDY = 0;
+ task->tState++;
+ // fall through
+ case 1:
+ task->tBlendY += 3;
+ if (task->tBlendY > 16)
+ task->tBlendY = 16;
+ REG_BLDY = task->tBlendY;
+ if (task->tBlendY >= 16)
+ task->tState++;
+ break;
+ case 2:
+ task->tBlendDelay++;
+ if (task->tBlendDelay > 9)
+ {
+ task->tBlendDelay = 0;
+ task->tBlendY--;
+ if (task->tBlendY <= 0)
+ {
+ task->tBlendY = 0;
+ task->tState++;
+ }
+ REG_BLDY = task->tBlendY;
+ }
+ break;
+ case 3:
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ REG_WININ = task->tWinRange;
+ task->tState++;
+ break;
+ case 4:
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+#undef tState
+#undef tBlendY
+#undef tBlendDelay
+#undef tWinRange
+
+//------------------------------------------------------------------------------
+// Light Rain
+//------------------------------------------------------------------------------
+
+void LightRain_InitVars(void)
+{
+ gWeatherPtr->unknown_6CC = 0;
+ gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->unknown_6D6 = 0;
+ gWeatherPtr->unknown_6DB = 8;
+ gWeatherPtr->unknown_6DC = 0;
+ gWeatherPtr->unknown_6D9 = 10;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ SetRainStrengthFromSoundEffect(SE_T_KOAME);
+}
+
+void sub_807E400(void);
+
+void sub_807E3D0(void)
+{
+ LightRain_InitVars();
+ while (gWeatherPtr->unknown_6D2 == 0)
+ sub_807E400();
+}
+
+void sub_807E7A4(void);
+u8 sub_807E7B4(void);
+u8 sub_807E8E8(void);
+
+void sub_807E400(void)
+{
+ switch (gWeatherPtr->unknown_6CC)
+ {
+ case 0:
+ sub_807E7A4();
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 1:
+ if (sub_807E7B4() == 0)
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 2:
+ if (sub_807E8E8() == FALSE)
+ {
+ gWeatherPtr->unknown_6D2 = 1;
+ gWeatherPtr->unknown_6CC++;
+ }
+ break;
+ }
+}
+
+void sub_807E974(void);
+
+bool8 sub_807E460(void)
+{
+ switch (gWeatherPtr->unknown_6CE)
+ {
+ case 0:
+ if (gWeatherPtr->unknown_6D1 == 3
+ || gWeatherPtr->unknown_6D1 == 5
+ || gWeatherPtr->unknown_6D1 == 13)
+ {
+ gWeatherPtr->unknown_6CE = 0xFF;
+ return FALSE;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6D9 = 0;
+ gWeatherPtr->unknown_6CE++;
+ }
+ // fall through
+ case 1:
+ if (sub_807E8E8() == FALSE)
+ {
+ sub_807E974();
+ gWeatherPtr->unknown_6CE++;
+ return FALSE;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+// defined below
+extern const s16 gUnknown_0839AABC[][2];
+extern const u16 gUnknown_0839AAC4[][2];
+
+void sub_807E4EC(struct Sprite *sprite)
+{
+ u32 randVal;
+ u16 r6;
+ s32 r4;
+ s32 r0;
+
+ if (sprite->data[1] == 0)
+ sprite->data[1] = 361;
+ randVal = sprite->data[1] * 1103515245 + 12345;
+ sprite->data[1] = ((randVal & 0x7FFF0000) >> 16) % 600;
+
+ r6 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0];
+
+ r4 = sprite->data[1] % 30;
+ sprite->data[2] = r4 * 8; // useless assignment
+
+ r0 = sprite->data[1] / 30;
+ sprite->data[3] = r0 * 8; // useless assignment
+
+ sprite->data[2] = r4;
+ sprite->data[2] <<= 7;
+
+ sprite->data[3] = r0;
+ sprite->data[3] <<= 7;
+
+ sprite->data[2] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0] * r6;
+ sprite->data[3] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1] * r6;
+
+ StartSpriteAnim(sprite, 0);
+ sprite->data[4] = 0;
+ sprite->coordOffsetEnabled = FALSE;
+ sprite->data[0] = r6;
+}
+
+void sub_807E5C0(struct Sprite *sprite)
+{
+ if (sprite->data[4] == 0)
+ {
+ sprite->data[2] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0];
+ sprite->data[3] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1];
+ sprite->pos1.x = sprite->data[2] >> 4;
+ sprite->pos1.y = sprite->data[3] >> 4;
+
+ if (sprite->data[5] != 0
+ && (sprite->pos1.x >= -8 && sprite->pos1.x <= 248)
+ && sprite->pos1.y >= -16 && sprite->pos1.y <= 176)
+ sprite->invisible = FALSE;
+ else
+ sprite->invisible = TRUE;
+
+ sprite->data[0]--;
+ if (sprite->data[0] == 0)
+ {
+ StartSpriteAnim(sprite, gWeatherPtr->unknown_6DC + 1);
+ sprite->data[4] = 1;
+ sprite->pos1.x -= gSpriteCoordOffsetX;
+ sprite->pos1.y -= gSpriteCoordOffsetY;
+ sprite->coordOffsetEnabled = TRUE;
+ }
+ }
+ else if (sprite->animEnded)
+ {
+ sprite->invisible = TRUE;
+ sub_807E4EC(sprite);
+ }
+}
+
+void sub_807E6C4(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sub_807E4EC(sprite);
+ sprite->callback = sub_807E5C0;
+ }
+ else
+ {
+ sprite->data[0]--;
+ }
+}
+
+void sub_807E6F0(struct Sprite *sprite, u16 b)
+{
+ u16 r8 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0];
+ u16 r6 = b / (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8);
+ u16 r4 = b % (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8);
+
+ while (--r6 != 0xFFFF)
+ sub_807E4EC(sprite);
+ if (r4 < r8)
+ {
+ while (--r4 != 0xFFFF)
+ sub_807E5C0(sprite);
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ sprite->data[0] = r4 - r8;
+ sprite->invisible = TRUE;
+ sprite->data[6] = 1;
+ }
+}
+
+extern const struct SpriteSheet gUnknown_0839AACC; // defined below
+
+void sub_807E7A4(void)
+{
+ LoadSpriteSheet(&gUnknown_0839AACC);
+}
+
+const struct Coords16 gUnknown_0839AA08[] =
+{
+ { 0, 0},
+ { 0, 160},
+ { 0, 64},
+ {144, 224},
+ {144, 128},
+ { 32, 32},
+ { 32, 192},
+ { 32, 96},
+ { 72, 128},
+ { 72, 32},
+ { 72, 192},
+ {216, 96},
+ {216, 0},
+ {104, 160},
+ {104, 64},
+ {104, 224},
+ {144, 0},
+ {144, 160},
+ {144, 64},
+ { 32, 224},
+ { 32, 128},
+ { 72, 32},
+ { 72, 192},
+ { 48, 96},
+};
+
+const struct OamData gOamData_839AA68 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 2,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 2,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_839AA70[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gSpriteAnim_839AA78[] =
+{
+ ANIMCMD_FRAME(8, 3),
+ ANIMCMD_FRAME(32, 2),
+ ANIMCMD_FRAME(40, 2),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_839AA88[] =
+{
+ ANIMCMD_FRAME(8, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(24, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839AA98[] =
+{
+ gSpriteAnim_839AA70,
+ gSpriteAnim_839AA78,
+ gSpriteAnim_839AA88,
+};
+
+const struct SpriteTemplate gSpriteTemplate_839AAA4 =
+{
+ .tileTag = 4614,
+ .paletteTag = 4608,
+ .oam = &gOamData_839AA68,
+ .anims = gSpriteAnimTable_839AA98,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807E5C0,
+};
+
+
+const s16 gUnknown_0839AABC[][2] =
+{
+ {-104, 208},
+ {-160, 320},
+};
+
+const u16 gUnknown_0839AAC4[][2] =
+{
+ {18, 7},
+ {12, 10},
+};
+
+const struct SpriteSheet gUnknown_0839AACC = {WeatherRainTiles, sizeof(WeatherRainTiles), 0x1206};
+
+const struct OamData gOamData_839AAD4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct SpriteFrameImage gSpriteImageTable_839AADC[] =
+{
+ {gSpriteImage_8398948, sizeof(gSpriteImage_8398948)},
+ {gSpriteImage_8398968, sizeof(gSpriteImage_8398968)},
+};
+
+const union AnimCmd gSpriteAnim_839AAEC[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_839AAF4[] =
+{
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839AAFC[] =
+{
+ gSpriteAnim_839AAEC,
+ gSpriteAnim_839AAF4,
+};
+
+void sub_807ED48(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_839AB04 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 4608,
+ .oam = &gOamData_839AAD4,
+ .anims = gSpriteAnimTable_839AAFC,
+ .images = gSpriteImageTable_839AADC,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807ED48,
+};
+
+// unused data
+const u16 unusedData_839AB1C[] = {0, 6, 6, 12, 18, 42, 300, 300};
+
+const struct OamData gOamData_839AB2C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_839AB34[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_839AB3C[] =
+{
+ ANIMCMD_FRAME(32, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_839AB44[] =
+{
+ ANIMCMD_FRAME(64, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_839AB4C[] =
+{
+ ANIMCMD_FRAME(96, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_839AB54[] =
+{
+ ANIMCMD_FRAME(128, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_839AB5C[] =
+{
+ ANIMCMD_FRAME(160, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839AB64[] =
+{
+ gSpriteAnim_839AB34,
+ gSpriteAnim_839AB3C,
+ gSpriteAnim_839AB44,
+ gSpriteAnim_839AB4C,
+ gSpriteAnim_839AB54,
+ gSpriteAnim_839AB5C,
+};
+
+const union AffineAnimCmd gSpriteAffineAnim_839AB7C[] =
+{
+ AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+const union AffineAnimCmd *const gSpriteAffineAnimTable_839AB8C[] =
+{
+ gSpriteAffineAnim_839AB7C,
+};
+
+void sub_807F688(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_839AB90 =
+{
+ .tileTag = 4609,
+ .paletteTag = 4608,
+ .oam = &gOamData_839AB2C,
+ .anims = gSpriteAnimTable_839AB64,
+ .images = NULL,
+ .affineAnims = gSpriteAffineAnimTable_839AB8C,
+ .callback = sub_807F688,
+};
+
+const struct SpriteSheet gWeatherFog1SpriteSheet = {gWeatherFog1Tiles, sizeof(gWeatherFog1Tiles), 0x1201};
+const struct SpriteSheet gWeatherAshSpriteSheet = {WeatherAshTiles, sizeof(WeatherAshTiles), 0x1202};
+
+const struct OamData gOamData_839ABB8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 15,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_839ABC0[] =
+{
+ ANIMCMD_FRAME(0, 60),
+ ANIMCMD_FRAME(64, 60),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const gSpriteAnimTable_839ABCC[] =
+{
+ gSpriteAnim_839ABC0,
+};
+
+void sub_807FAA8(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_839ABD0 =
+{
+ .tileTag = 4610,
+ .paletteTag = 4608,
+ .oam = &gOamData_839ABB8,
+ .anims = gSpriteAnimTable_839ABCC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807FAA8,
+};
+
+const struct SpriteSheet gWeatherFog0SpriteSheet = {WeatherFog0Tiles, sizeof(WeatherFog0Tiles), 0x1203};
+
+const struct OamData gOamData_839ABF0 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_839ABF8[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839AC00[] =
+{
+ gSpriteAnim_839ABF8,
+};
+
+void sub_807FE3C(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_839AC04 =
+{
+ .tileTag = 4611,
+ .paletteTag = 4608,
+ .oam = &gOamData_839ABF0,
+ .anims = gSpriteAnimTable_839AC00,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807FE3C,
+};
+
+const struct OamData gOamData_839AC1C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_839AC24[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_839AC2C[] =
+{
+ ANIMCMD_FRAME(64, 3),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839AC34[] =
+{
+ gSpriteAnim_839AC24,
+ gSpriteAnim_839AC2C,
+};
+
+void sub_8080338(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_839AC3C =
+{
+ .tileTag = 4612,
+ .paletteTag = 4609,
+ .oam = &gOamData_839AC1C,
+ .anims = gSpriteAnimTable_839AC34,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8080338,
+};
+
+const struct SpriteSheet gWeatherSandstormSpriteSheet = {WeatherSandstormTiles, sizeof(WeatherSandstormTiles), 0x1204};
+
+bool8 sub_807E7B4(void)
+{
+ u8 r7;
+ u8 spriteId;
+
+ if (gWeatherPtr->unknown_6DA == 24)
+ return FALSE;
+
+ r7 = gWeatherPtr->unknown_6DA;
+ spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839AAA4,
+ gUnknown_0839AA08[r7].x, gUnknown_0839AA08[r7].y, 78);
+ if (spriteId != 64)
+ {
+ gSprites[spriteId].data[5] = 0;
+ gSprites[spriteId].data[1] = r7 * 145;
+ while (gSprites[spriteId].data[1] >= 600)
+ gSprites[spriteId].data[1] -= 600;
+ sub_807E4EC(&gSprites[spriteId]);
+ sub_807E6F0(&gSprites[spriteId], r7 * 9);
+ gSprites[spriteId].invisible = TRUE;
+ gWeatherPtr->unknown_0[r7] = &gSprites[spriteId];
+ }
+ else
+ {
+ gWeatherPtr->unknown_0[r7] = NULL;
+ }
+
+ if (++gWeatherPtr->unknown_6DA == 24)
+ {
+ u16 i;
+
+ for (i = 0; i < 24; i++)
+ {
+ if (gWeatherPtr->unknown_0[i] != NULL)
+ {
+ if (gWeatherPtr->unknown_0[i]->data[6] == 0)
+ gWeatherPtr->unknown_0[i]->callback = sub_807E5C0;
+ else
+ gWeatherPtr->unknown_0[i]->callback = sub_807E6C4;
+ }
+ }
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 sub_807E8E8(void)
+{
+ if (gWeatherPtr->unknown_6D8 == gWeatherPtr->unknown_6D9)
+ return FALSE;
+
+ if (++gWeatherPtr->unknown_6D6 > gWeatherPtr->unknown_6DB)
+ {
+ gWeatherPtr->unknown_6D6 = 0;
+ if (gWeatherPtr->unknown_6D8 < gWeatherPtr->unknown_6D9)
+ {
+ gWeatherPtr->unknown_0[gWeatherPtr->unknown_6D8++]->data[5] = 1;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6D8--;
+ gWeatherPtr->unknown_0[gWeatherPtr->unknown_6D8]->data[5] = 0;
+ gWeatherPtr->unknown_0[gWeatherPtr->unknown_6D8]->invisible = TRUE;
+ }
+ }
+ return TRUE;
+}
+
+void sub_807E974(void)
+{
+ u16 i;
+
+ for (i = 0; i < gWeatherPtr->unknown_6DA; i++)
+ {
+ if (gWeatherPtr->unknown_0[i] != NULL)
+ DestroySprite(gWeatherPtr->unknown_0[i]);
+ }
+ gWeatherPtr->unknown_6DA = 0;
+ FreeSpriteTilesByTag(0x1206);
+}
+
+//------------------------------------------------------------------------------
+// Snow
+//------------------------------------------------------------------------------
+
+void Snow_InitVars(void)
+{
+ gWeatherPtr->unknown_6CC = 0;
+ gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6E5 = 16;
+ gWeatherPtr->unknown_6E0 = 0;
+}
+
+void snowflakes_progress2(void);
+void sub_807ED48(struct Sprite *);
+
+void sub_807EA18(void)
+{
+ Snow_InitVars();
+ while (gWeatherPtr->unknown_6D2 == 0)
+ {
+ u16 i;
+
+ snowflakes_progress2();
+ for (i = 0; i < gWeatherPtr->unknown_6E4; i++)
+ {
+ sub_807ED48(gWeatherPtr->snowflakeSprites[i]);
+ }
+ }
+}
+
+u8 snowflakes_progress(void);
+
+void snowflakes_progress2(void)
+{
+ if (gWeatherPtr->unknown_6CC == 0 && snowflakes_progress() == FALSE)
+ {
+ gWeatherPtr->unknown_6D2 = 1;
+ gWeatherPtr->unknown_6CC++;
+ }
+}
+
+bool8 sub_807EAC0(void)
+{
+ switch (gWeatherPtr->unknown_6CE)
+ {
+ case 0:
+ gWeatherPtr->unknown_6E5 = 0;
+ gWeatherPtr->unknown_6E0 = 0;
+ gWeatherPtr->unknown_6CE++;
+ // fall through
+ case 1:
+ if (snowflakes_progress() == FALSE)
+ {
+ gWeatherPtr->unknown_6CE++;
+ return FALSE;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 snowflake_add(void);
+bool8 snowflake_remove(void);
+
+bool8 snowflakes_progress(void)
+{
+ if (gWeatherPtr->unknown_6E4 == gWeatherPtr->unknown_6E5)
+ return FALSE;
+
+ gWeatherPtr->unknown_6E0++;
+ if (gWeatherPtr->unknown_6E0 > 36)
+ {
+ gWeatherPtr->unknown_6E0 = 0;
+ if (gWeatherPtr->unknown_6E4 < gWeatherPtr->unknown_6E5)
+ snowflake_add();
+ else
+ snowflake_remove();
+ }
+ return (gWeatherPtr->unknown_6E4 != gWeatherPtr->unknown_6E5);
+}
+
+void sub_807EC40(struct Sprite *);
+
+bool8 snowflake_add(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839AB04, 0, 0, 78);
+
+ if (spriteId == 64)
+ return FALSE;
+ gSprites[spriteId].data[4] = gWeatherPtr->unknown_6E4;
+ sub_807EC40(&gSprites[spriteId]);
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ gWeatherPtr->snowflakeSprites[gWeatherPtr->unknown_6E4++] = &gSprites[spriteId];
+ return TRUE;
+}
+
+bool8 snowflake_remove(void)
+{
+ if (gWeatherPtr->unknown_6E4 != 0)
+ {
+ DestroySprite(gWeatherPtr->snowflakeSprites[--gWeatherPtr->unknown_6E4]);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_807EC40(struct Sprite *sprite)
+{
+ u16 r4 = ((sprite->data[4] * 5) & 7) * 30 + (Random() % 30);
+ u16 r6;
+
+ sprite->pos1.y = -3 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->pos1.x = r4 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+ sprite->data[0] = sprite->pos1.y * 128;
+ sprite->pos2.x = 0;
+ r6 = Random();
+ sprite->data[1] = (r6 & 3) * 5 + 64;
+ sprite->data[7] = (r6 & 3) * 5 + 64;
+ StartSpriteAnim(sprite, (r6 & 1) ? 0 : 1);
+ sprite->data[3] = 0;
+ sprite->data[2] = ((r6 & 3) == 0) ? 2 : 1;
+ sprite->data[6] = (r6 & 0x1F) + 210;
+ sprite->data[5] = 0;
+}
+
+void sub_807ECEC(struct Sprite *sprite)
+{
+ if (gWeatherPtr->unknown_6E2 > 18)
+ {
+ sprite->invisible = FALSE;
+ sprite->callback = sub_807ED48;
+ sprite->pos1.y = 0xFA - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->data[0] = sprite->pos1.y * 128;
+ gWeatherPtr->unknown_6E2 = 0;
+ }
+}
+
+void sub_807ED48(struct Sprite *sprite)
+{
+ s16 r3;
+ s16 r2;
+
+ sprite->data[0] += sprite->data[1];
+ sprite->pos1.y = sprite->data[0] >> 7;
+ sprite->data[3] = (sprite->data[3] + sprite->data[2]) & 0xFF;
+ sprite->pos2.x = gSineTable[sprite->data[3]] / 64;
+
+ r3 = (sprite->pos1.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX) & 0x1FF;
+ if (r3 & 0x100)
+ r3 = -0x100 | r3; // hmm... what is this?
+ if (r3 < -3)
+ sprite->pos1.x = 242 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+ else if (r3 > 242)
+ sprite->pos1.x = -3 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+
+ r2 = (sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY) & 0xFF;
+ if (r2 > 163 && r2 < 171)
+ {
+ sprite->pos1.y = 250 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->data[0] = sprite->pos1.y * 128;
+ sprite->data[5] = 0;
+ sprite->data[6] = 220;
+ }
+ else if (r2 > 242 && r2 < 250)
+ {
+ sprite->pos1.y = 163;
+ sprite->data[0] = sprite->pos1.y * 128;
+ sprite->data[5] = 0;
+ sprite->data[6] = 220;
+ sprite->invisible = TRUE;
+ sprite->callback = sub_807ECEC;
+ }
+
+ sprite->data[5]++;
+ if (sprite->data[5] == sprite->data[6])
+ {
+ sub_807EC40(sprite);
+ sprite->pos1.y = 250;
+ sprite->invisible = TRUE;
+ sprite->callback = sub_807ECEC;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Medium Rain
+//------------------------------------------------------------------------------
+
+void sub_807EE80(void)
+{
+ gWeatherPtr->unknown_6CC = 0;
+ gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->unknown_6D6 = 0;
+ gWeatherPtr->unknown_6DB = 4;
+ gWeatherPtr->unknown_6DC = 0;
+ gWeatherPtr->unknown_6D9 = 16;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6D2 = 0; // duplicate assignment
+ gWeatherPtr->unknown_6ED = 0;
+ SetRainStrengthFromSoundEffect(SE_T_AME);
+}
+
+void sub_807EFC0(void);
+
+void sub_807EEF4(void)
+{
+ sub_807EE80();
+ while (gWeatherPtr->unknown_6D2 == 0)
+ sub_807EFC0();
+}
+
+//------------------------------------------------------------------------------
+// Heavy Rain
+//------------------------------------------------------------------------------
+
+void sub_807EF24(void)
+{
+ gWeatherPtr->unknown_6CC = 0;
+ gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->unknown_6D6 = 0;
+ gWeatherPtr->unknown_6DB = 4;
+ gWeatherPtr->unknown_6DC = 1;
+ gWeatherPtr->unknown_6D9 = 24;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6D2 = 0; // duplicate assignment
+ SetRainStrengthFromSoundEffect(SE_T_OOAME);
+}
+
+void sub_807EF90(void)
+{
+ sub_807EF24();
+ while (gWeatherPtr->unknown_6D2 == 0)
+ sub_807EFC0();
+}
+
+void sub_807F434(void);
+void sub_807F3F8(u16);
+
+void sub_807EFC0(void)
+{
+ sub_807F434();
+ switch (gWeatherPtr->unknown_6CC)
+ {
+ case 0:
+ sub_807E7A4();
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 1:
+ if (sub_807E7B4())
+ break;
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 2:
+ if (sub_807E8E8())
+ break;
+ gWeatherPtr->unknown_6D2 = 1;
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 3:
+ if (gWeatherPtr->unknown_6C6 == 0)
+ break;
+ gWeatherPtr->unknown_6CC = 6;
+ break;
+ case 4:
+ gWeatherPtr->unknown_6EA = 1;
+ gWeatherPtr->unknown_6E6 = (Random() % 360) + 360;
+ gWeatherPtr->unknown_6CC++;
+ // fall through
+ case 5:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 6:
+ gWeatherPtr->unknown_6EA = 1;
+ gWeatherPtr->unknown_6EB = Random() % 2;
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 7:
+ gWeatherPtr->unknown_6EC = (Random() & 1) + 1;
+ gWeatherPtr->unknown_6CC++;
+ // fall through
+ case 8:
+ sub_807D5BC(19);
+ if (gWeatherPtr->unknown_6EB == 0 && gWeatherPtr->unknown_6EC == 1)
+ sub_807F3F8(20);
+ gWeatherPtr->unknown_6E6 = (Random() % 3) + 6;
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 9:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ sub_807D5BC(3);
+ gWeatherPtr->unknown_6EA = 1;
+ if (--gWeatherPtr->unknown_6EC != 0)
+ {
+ gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
+ gWeatherPtr->unknown_6CC = 10;
+ }
+ else if (gWeatherPtr->unknown_6EB == 0)
+ {
+ gWeatherPtr->unknown_6CC = 4;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6CC = 11;
+ }
+ break;
+ case 10:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ gWeatherPtr->unknown_6CC = 8;
+ break;
+ case 11:
+ gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 12:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ sub_807F3F8(100);
+ sub_807D5BC(19);
+ // Why use "% 16" everywhere else and "& 0xF" here. So dumb.
+ gWeatherPtr->unknown_6E6 = (Random() & 0xF) + 30;
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 13:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ sub_807D5F0(19, 3, 5);
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 14:
+ if (gWeatherPtr->unknown_6C6 != 3)
+ break;
+ gWeatherPtr->unknown_6EA = 1;
+ gWeatherPtr->unknown_6CC = 4;
+ break;
+ }
+}
+
+bool8 sub_807F34C(void)
+{
+ switch (gWeatherPtr->unknown_6CE)
+ {
+ case 0:
+ gWeatherPtr->unknown_6EA = 0;
+ gWeatherPtr->unknown_6CE++;
+ // fall through
+ case 1:
+ sub_807EFC0();
+ if (gWeatherPtr->unknown_6EA != 0)
+ {
+ if (gWeatherPtr->unknown_6D1 == 3
+ || gWeatherPtr->unknown_6D1 == 5
+ || gWeatherPtr->unknown_6D1 == 13)
+ return FALSE;
+ gWeatherPtr->unknown_6D9 = 0;
+ gWeatherPtr->unknown_6CE++;
+ }
+ break;
+ case 2:
+ if (sub_807E8E8())
+ break;
+ sub_807E974();
+ gWeatherPtr->unknown_6ED = 0;
+ gWeatherPtr->unknown_6CE++;
+ return FALSE;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_807F3F8(u16 a)
+{
+ if (gWeatherPtr->unknown_6ED == 0)
+ {
+ gWeatherPtr->unknown_6E8 = Random() % a;
+ gWeatherPtr->unknown_6ED = 1;
+ }
+}
+
+void sub_807F434(void)
+{
+ if (gWeatherPtr->unknown_6ED == 1)
+ {
+ if (gWeatherPtr->unknown_6E8 == 0)
+ {
+ if (IsSEPlaying())
+ return;
+ if (Random() & 1)
+ PlaySE(SE_T_KAMI);
+ else
+ PlaySE(SE_T_KAMI2);
+ gWeatherPtr->unknown_6ED = 0;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6E8--;
+ }
+ }
+}
+
+void sub_807F49C(void)
+{
+ gWeatherPtr->unknown_6CC = 0;
+ gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ if (gWeatherPtr->unknown_6FB == 0)
+ {
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2 = 0;
+ gWeatherPtr->unknown_6EE = 0;
+ sub_807DB64(0, 16);
+ }
+}
+
+void sub_807F52C(void);
+
+void sub_807F4FC(void)
+{
+ sub_807F49C();
+ while (gWeatherPtr->unknown_6D2 == 0)
+ sub_807F52C();
+}
+
+void sub_807F6E8(void);
+
+void sub_807F52C(void)
+{
+ gWeatherPtr->unknown_6EE = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
+ if (++gWeatherPtr->unknown_6F0 > 3)
+ {
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2++;
+ }
+ switch (gWeatherPtr->unknown_6CC)
+ {
+ case 0:
+ sub_807F6E8();
+ if (gWeatherPtr->currWeather == 6)
+ sub_807DBA4(12, 8, 3);
+ else
+ sub_807DBA4(4, 16, 0);
+ gWeatherPtr->unknown_6CC++;
+ break;
+ case 1:
+ if (sub_807DBE8())
+ {
+ gWeatherPtr->unknown_6D2 = 1;
+ gWeatherPtr->unknown_6CC++;
+ }
+ break;
+ }
+}
+
+void sub_807F7A4(void);
+
+bool8 sub_807F5EC(void)
+{
+ gWeatherPtr->unknown_6EE = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
+ if (++gWeatherPtr->unknown_6F0 > 3)
+ {
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2++;
+ }
+ switch (gWeatherPtr->unknown_6CE)
+ {
+ case 0:
+ sub_807DBA4(0, 16, 3);
+ gWeatherPtr->unknown_6CE++;
+ break;
+ case 1:
+ if (!sub_807DBE8())
+ break;
+ gWeatherPtr->unknown_6CE++;
+ break;
+ case 2:
+ sub_807F7A4();
+ gWeatherPtr->unknown_6CE++;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_807F688(struct Sprite *sprite)
+{
+ sprite->pos2.y = (u8)gSpriteCoordOffsetY;
+ sprite->pos1.x = gWeatherPtr->unknown_6EE + 32 + sprite->data[0] * 64;
+ if (sprite->pos1.x > 0x10F)
+ {
+ sprite->pos1.x = 480 + gWeatherPtr->unknown_6EE - (4 - sprite->data[0]) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}