diff options
author | Cameron Hall <camthesaxman@users.noreply.github.com> | 2017-11-25 13:29:59 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-25 13:29:59 -0600 |
commit | 20c5936f0c9fd15d34fce0409e8835282ea2fcaf (patch) | |
tree | b6f63c6ed83b72741af2e30d990cb4f931d8fc8d /src | |
parent | cc03fa4c4046c4ab4dc11234ca1dde1f888fa9bf (diff) | |
parent | c9a21f43bd074e532c745560b1d7d412f6ea8456 (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.c | 1640 | ||||
-rw-r--r-- | src/field/field_weather_2.c | 1511 |
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; + } +} |