summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@gmail.com>2020-03-16 20:37:51 -0400
committerPikalaxALT <PikalaxALT@gmail.com>2020-03-16 20:37:51 -0400
commit51eac4e14bc75f2b3d925b46d63969cfabf0d48e (patch)
treec79b9d5b88c1ddf8b81e4ccaf343ba19b8452786
parent6e00e822101c4c3f68bce0789ba56133b24b586b (diff)
field_weather_util
-rw-r--r--asm/field_weather_util.s287
-rw-r--r--asm/overworld.s4
-rw-r--r--data/field_weather.s6
-rw-r--r--include/blend_palette.h1
-rw-r--r--include/constants/weather.h2
-rw-r--r--include/field_weather.h116
-rw-r--r--include/field_weather_effects.h55
-rw-r--r--include/global.h2
-rw-r--r--src/field_weather.c191
-rw-r--r--src/field_weather_util.c105
-rw-r--r--src/title_screen.c16
11 files changed, 313 insertions, 472 deletions
diff --git a/asm/field_weather_util.s b/asm/field_weather_util.s
index c31f35763..d018bae19 100644
--- a/asm/field_weather_util.s
+++ b/asm/field_weather_util.s
@@ -5,291 +5,4 @@
.text
- thumb_func_start sub_807B0C4
-sub_807B0C4: @ 807B0C4
- push {lr}
- adds r1, r0, 0
- adds r3, r2, 0
- ldr r0, _0807B0E8 @ =gWeather
- movs r2, 0xDA
- lsls r2, 3
- adds r0, r2
- ldrb r0, [r0]
- cmp r0, 0xB
- beq _0807B0F0
- cmp r0, 0xB
- bgt _0807B0EC
- cmp r0, 0x5
- bgt _0807B0FA
- cmp r0, 0x3
- blt _0807B0FA
- b _0807B0F0
- .align 2, 0
-_0807B0E8: .4byte gWeather
-_0807B0EC:
- cmp r0, 0xD
- bne _0807B0FA
-_0807B0F0:
- adds r0, r1, 0
- movs r1, 0
- movs r2, 0x3
- bl sub_8045314
-_0807B0FA:
- pop {r0}
- bx r0
- thumb_func_end sub_807B0C4
-
- thumb_func_start SetSav1Weather
-SetSav1Weather: @ 807B100
- push {r4,r5,lr}
- ldr r4, _0807B12C @ =gSaveBlock1Ptr
- ldr r1, [r4]
- adds r1, 0x2E
- ldrb r5, [r1]
- lsls r0, 24
- lsrs r0, 24
- bl TranslateWeatherNum
- ldr r1, [r4]
- adds r1, 0x2E
- strb r0, [r1]
- ldr r0, [r4]
- adds r0, 0x2E
- ldrb r0, [r0]
- adds r1, r5, 0
- bl UpdateRainCounter
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807B12C: .4byte gSaveBlock1Ptr
- thumb_func_end SetSav1Weather
-
- thumb_func_start sav1_get_weather_probably
-sav1_get_weather_probably: @ 807B130
- ldr r0, _0807B13C @ =gSaveBlock1Ptr
- ldr r0, [r0]
- adds r0, 0x2E
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_0807B13C: .4byte gSaveBlock1Ptr
- thumb_func_end sav1_get_weather_probably
-
- thumb_func_start SetSav1WeatherFromCurrMapHeader
-SetSav1WeatherFromCurrMapHeader: @ 807B140
- push {r4,r5,lr}
- ldr r4, _0807B16C @ =gSaveBlock1Ptr
- ldr r0, [r4]
- adds r0, 0x2E
- ldrb r5, [r0]
- ldr r0, _0807B170 @ =gMapHeader
- ldrb r0, [r0, 0x16]
- bl TranslateWeatherNum
- ldr r1, [r4]
- adds r1, 0x2E
- strb r0, [r1]
- ldr r0, [r4]
- adds r0, 0x2E
- ldrb r0, [r0]
- adds r1, r5, 0
- bl UpdateRainCounter
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807B16C: .4byte gSaveBlock1Ptr
-_0807B170: .4byte gMapHeader
- thumb_func_end SetSav1WeatherFromCurrMapHeader
-
- thumb_func_start SetWeather
-SetWeather: @ 807B174
- push {lr}
- bl SetSav1Weather
- bl sav1_get_weather_probably
- lsls r0, 24
- lsrs r0, 24
- bl SetNextWeather
- pop {r0}
- bx r0
- thumb_func_end SetWeather
-
- thumb_func_start sub_807B18C
-sub_807B18C: @ 807B18C
- push {lr}
- bl SetSav1Weather
- bl sav1_get_weather_probably
- lsls r0, 24
- lsrs r0, 24
- bl SetCurrentAndNextWeather
- pop {r0}
- bx r0
- thumb_func_end sub_807B18C
-
- thumb_func_start DoCurrentWeather
-DoCurrentWeather: @ 807B1A4
- push {lr}
- bl sav1_get_weather_probably
- lsls r0, 24
- lsrs r0, 24
- bl SetNextWeather
- pop {r0}
- bx r0
- thumb_func_end DoCurrentWeather
-
- thumb_func_start sub_807B1B8
-sub_807B1B8: @ 807B1B8
- push {lr}
- bl sav1_get_weather_probably
- lsls r0, 24
- lsrs r0, 24
- bl SetCurrentAndNextWeather
- pop {r0}
- bx r0
- thumb_func_end sub_807B1B8
-
- thumb_func_start TranslateWeatherNum
-TranslateWeatherNum: @ 807B1CC
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x15
- bhi _0807B294
- lsls r0, 2
- ldr r1, _0807B1E0 @ =_0807B1E4
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0807B1E0: .4byte _0807B1E4
- .align 2, 0
-_0807B1E4:
- .4byte _0807B294
- .4byte _0807B23C
- .4byte _0807B240
- .4byte _0807B244
- .4byte _0807B248
- .4byte _0807B24C
- .4byte _0807B250
- .4byte _0807B254
- .4byte _0807B258
- .4byte _0807B25C
- .4byte _0807B260
- .4byte _0807B264
- .4byte _0807B268
- .4byte _0807B26C
- .4byte _0807B270
- .4byte _0807B294
- .4byte _0807B294
- .4byte _0807B294
- .4byte _0807B294
- .4byte _0807B294
- .4byte _0807B274
- .4byte _0807B27C
-_0807B23C:
- movs r0, 0x1
- b _0807B296
-_0807B240:
- movs r0, 0x2
- b _0807B296
-_0807B244:
- movs r0, 0x3
- b _0807B296
-_0807B248:
- movs r0, 0x4
- b _0807B296
-_0807B24C:
- movs r0, 0x5
- b _0807B296
-_0807B250:
- movs r0, 0x6
- b _0807B296
-_0807B254:
- movs r0, 0x7
- b _0807B296
-_0807B258:
- movs r0, 0x8
- b _0807B296
-_0807B25C:
- movs r0, 0x9
- b _0807B296
-_0807B260:
- movs r0, 0xA
- b _0807B296
-_0807B264:
- movs r0, 0xB
- b _0807B296
-_0807B268:
- movs r0, 0xC
- b _0807B296
-_0807B26C:
- movs r0, 0xD
- b _0807B296
-_0807B270:
- movs r0, 0xE
- b _0807B296
-_0807B274:
- ldr r1, _0807B278 @ =gUnknown_83C65C0
- b _0807B27E
- .align 2, 0
-_0807B278: .4byte gUnknown_83C65C0
-_0807B27C:
- ldr r1, _0807B28C @ =gUnknown_83C65C4
-_0807B27E:
- ldr r0, _0807B290 @ =gSaveBlock1Ptr
- ldr r0, [r0]
- adds r0, 0x2F
- ldrb r0, [r0]
- adds r0, r1
- ldrb r0, [r0]
- b _0807B296
- .align 2, 0
-_0807B28C: .4byte gUnknown_83C65C4
-_0807B290: .4byte gSaveBlock1Ptr
-_0807B294:
- movs r0, 0
-_0807B296:
- pop {r1}
- bx r1
- thumb_func_end TranslateWeatherNum
-
- thumb_func_start UpdateWeatherPerDay
-UpdateWeatherPerDay: @ 807B29C
- lsls r0, 16
- ldr r1, _0807B2B8 @ =gSaveBlock1Ptr
- ldr r2, [r1]
- adds r2, 0x2F
- lsrs r0, 16
- ldrb r1, [r2]
- adds r0, r1
- lsls r0, 16
- movs r1, 0xC0
- lsls r1, 10
- ands r1, r0
- lsrs r1, 16
- strb r1, [r2]
- bx lr
- .align 2, 0
-_0807B2B8: .4byte gSaveBlock1Ptr
- thumb_func_end UpdateWeatherPerDay
-
- thumb_func_start UpdateRainCounter
-UpdateRainCounter: @ 807B2BC
- push {lr}
- lsls r0, 24
- lsls r1, 24
- lsrs r2, r0, 24
- cmp r0, r1
- beq _0807B2D6
- cmp r2, 0x3
- beq _0807B2D0
- cmp r2, 0x5
- bne _0807B2D6
-_0807B2D0:
- movs r0, 0x28
- bl IncrementGameStat
-_0807B2D6:
- pop {r0}
- bx r0
- thumb_func_end UpdateRainCounter
-
.align 2, 0 @ Don't pad with nop
diff --git a/asm/overworld.s b/asm/overworld.s
index 504fecbf1..179d79fdc 100644
--- a/asm/overworld.s
+++ b/asm/overworld.s
@@ -4645,7 +4645,7 @@ _08057050:
_08057056:
bl FieldEffectActiveListClear
bl StartWeather
- bl sub_807B1B8
+ bl ResumePausedWeather
cmp r4, 0
bne _0805706A
bl SetUpFieldTasks
@@ -5401,7 +5401,7 @@ _0805769C:
bl InstallCameraPanAheadCallback
bl FieldEffectActiveListClear
bl StartWeather
- bl sub_807B1B8
+ bl ResumePausedWeather
bl SetUpFieldTasks
bl mapheader_run_script_with_tag_x5
b _0805772A
diff --git a/data/field_weather.s b/data/field_weather.s
index 7e40ea747..acd7744cd 100644
--- a/data/field_weather.s
+++ b/data/field_weather.s
@@ -7,12 +7,6 @@
.section .rodata
.align 2
-gUnknown_83C65C0:: @ 83C65C0
- .byte 0x02, 0x03, 0x05, 0x03
-
-gUnknown_83C65C4:: @ 83C65C4
- .byte 0x02, 0x02, 0x03, 0x02
-
gUnknown_83C65C8:: @ 83C65C8
.2byte 0x0000, 0x0042, 0x0005, 0x0049, 0x000a, 0x004e
diff --git a/include/blend_palette.h b/include/blend_palette.h
index 4ece15d69..7f0826187 100644
--- a/include/blend_palette.h
+++ b/include/blend_palette.h
@@ -10,5 +10,6 @@
// Exported ROM declarations
void BlendPalette(u16, u16, u8, u16);
+void sub_8045314(u16 * palbuff, u16 blend_pal, u32 coefficient, s32 size);
#endif //GUARD_BLEND_PALETTE_H
diff --git a/include/constants/weather.h b/include/constants/weather.h
index 77be45c51..241dc5e2a 100644
--- a/include/constants/weather.h
+++ b/include/constants/weather.h
@@ -16,5 +16,7 @@
#define WEATHER_DROUGHT 12 // unused and broken in overworld
#define WEATHER_DOWNPOUR 13 // unused
#define WEATHER_UNDERWATER_BUBBLES 14 // unused
+#define WEATHER_ROUTE119_CYCLE 20 // unused
+#define WEATHER_ROUTE123_CYCLE 21 // unused
#endif // GUARD_CONSTANTS_WEATHER_H
diff --git a/include/field_weather.h b/include/field_weather.h
index 1f2d9902e..b4006b3ad 100644
--- a/include/field_weather.h
+++ b/include/field_weather.h
@@ -2,6 +2,119 @@
#define GUARD_WEATHER_H
#include "global.h"
+#include "constants/field_weather.h"
+
+struct Weather
+{
+ union
+ {
+ struct
+ {
+ struct Sprite *rainSprites[MAX_RAIN_SPRITES];
+ struct Sprite *snowflakeSprites[101];
+ struct Sprite *cloudSprites[NUM_CLOUD_SPRITES];
+ } s1;
+ struct
+ {
+ u8 filler0[0xA0];
+ struct Sprite *fogHSprites[NUM_FOG_HORIZONTAL_SPRITES];
+ struct Sprite *ashSprites[NUM_ASH_SPRITES];
+ struct Sprite *fogDSprites[NUM_FOG_DIAGONAL_SPRITES];
+ struct Sprite *sandstormSprites1[NUM_SANDSTORM_SPRITES];
+ struct Sprite *sandstormSprites2[NUM_SWIRL_SANDSTORM_SPRITES];
+ } s2;
+ } sprites;
+ u8 gammaShifts[19][32];
+ u8 altGammaShifts[19][32];
+ s8 gammaIndex;
+ s8 gammaTargetIndex;
+ u8 gammaStepDelay;
+ u8 gammaStepFrameCounter;
+ u16 fadeDestColor;
+ /*0x6C6*/ u8 palProcessingState;
+ /*0x6C7*/ u8 fadeScreenCounter;
+ /*0x6C8*/ bool8 readyForInit;
+ /*0x6C9*/ u8 taskId;
+ /*0x6CA*/ u8 unknown_6CA;
+ u8 unknown_6CB;
+ u16 initStep;
+ u16 finishStep;
+ u8 currWeather;
+ u8 nextWeather;
+ u8 weatherGfxLoaded;
+ bool8 weatherChangeComplete;
+ u8 weatherPicSpritePalIndex;
+ u8 altGammaSpritePalIndex;
+ u16 rainSpriteVisibleCounter;
+ u8 curRainSpriteIndex;
+ u8 targetRainSpriteCount;
+ u8 rainSpriteCount;
+ u8 rainSpriteVisibleDelay;
+ u8 isDownpour;
+ u8 rainStrength;
+ /*0x6DE*/ u8 cloudSpritesCreated;
+ u8 filler_6DF[1];
+ u16 snowflakeVisibleCounter;
+ u16 unknown_6E2;
+ u8 snowflakeSpriteCount;
+ u8 targetSnowflakeSpriteCount;
+ u16 unknown_6E6;
+ u16 thunderCounter;
+ u8 unknown_6EA;
+ u8 unknown_6EB;
+ u8 unknown_6EC;
+ u8 thunderTriggered;
+ u16 fogHScrollPosX;
+ u16 fogHScrollCounter;
+ u16 fogHScrollOffset;
+ u8 lightenedFogSpritePals[6];
+ u8 lightenedFogSpritePalsCount;
+ u8 fogHSpritesCreated;
+ u16 ashBaseSpritesX;
+ u16 unknown_6FE;
+ u8 ashSpritesCreated;
+ u8 filler_701[3];
+ u32 sandstormXOffset;
+ u32 sandstormYOffset;
+ u8 filler_70C[2];
+ u16 sandstormBaseSpritesX;
+ u16 sandstormPosY;
+ u16 sandstormWaveIndex;
+ u16 sandstormWaveCounter;
+ u8 sandstormSpritesCreated;
+ u8 sandstormSwirlSpritesCreated;
+ u16 fogDBaseSpritesX;
+ u16 fogDPosY;
+ u16 fogDScrollXCounter;
+ u16 fogDScrollYCounter;
+ u16 fogDXOffset;
+ u16 fogDYOffset;
+ u8 fogDSpritesCreated;
+ u8 filler_725[1];
+ u16 bubblesDelayCounter;
+ u16 bubblesDelayIndex;
+ u16 bubblesCoordsIndex;
+ u16 bubblesSpriteCount;
+ u8 bubblesSpritesCreated;
+ u8 filler_72F;
+ u16 currBlendEVA;
+ u16 currBlendEVB;
+ u16 targetBlendEVA;
+ u16 targetBlendEVB;
+ u8 blendUpdateCounter;
+ u8 blendFrameCounter;
+ u8 blendDelay;
+ u8 filler_73B[0x3C-0x3B];
+ s16 unknown_73C;
+ s16 unknown_73E;
+ s16 unknown_740;
+ s16 unknown_742;
+ u8 filler_744[0xD-4];
+ s8 loadDroughtPalsIndex;
+ u8 loadDroughtPalsOffset;
+};
+
+extern struct Weather *const gWeatherPtr;
void FadeScreen(u8 mode, s8 delay);
@@ -22,4 +135,7 @@ void UpdateSpritePaletteWithWeather(u8 palIdx);
void ResetPreservedPalettesInWeather(void);
void PreservePaletteInWeather(u8 palIdx);
+void SetNextWeather(u8 weather);
+void SetCurrentAndNextWeather(u8 weather);
+
#endif // GUARD_WEATHER_H
diff --git a/include/field_weather_effects.h b/include/field_weather_effects.h
new file mode 100644
index 000000000..11d3314a2
--- /dev/null
+++ b/include/field_weather_effects.h
@@ -0,0 +1,55 @@
+#ifndef GUARD_FIELD_WEATHER_EFFECTS_H
+#define GUARD_FIELD_WEATHER_EFFECTS_H
+
+bool8 Ash_Finish(void);
+bool8 Bubbles_Finish(void);
+bool8 Clouds_Finish(void);
+bool8 Fog1_Finish(void);
+bool8 Fog2_Finish(void);
+bool8 LightRain_Finish(void);
+bool8 Rain_Finish(void);
+bool8 Sandstorm_Finish(void);
+bool8 Snow_Finish(void);
+bool8 sub_807B434(void);
+bool8 sub_807B6BC(void);
+bool8 sub_807D8D0(void);
+void Ash_InitAll(void);
+void Ash_InitVars(void);
+void Ash_Main(void);
+void Bubbles_InitAll(void);
+void Bubbles_InitVars(void);
+void Bubbles_Main(void);
+void Clouds_InitAll(void);
+void Clouds_InitVars(void);
+void Clouds_Main(void);
+void Drought_InitAll(void);
+void Drought_InitVars(void);
+void Drought_Main(void);
+void Fog1_InitAll(void);
+void Fog1_InitVars(void);
+void Fog1_Main(void);
+void Fog2_InitAll(void);
+void Fog2_InitVars(void);
+void Fog2_Main(void);
+void LightRain_InitAll(void);
+void LightRain_InitVars(void);
+void LightRain_Main(void);
+void Rain_Main(void);
+void Sandstorm_InitAll(void);
+void Sandstorm_InitVars(void);
+void Sandstorm_Main(void);
+void Snow_InitAll(void);
+void Snow_InitVars(void);
+void Weather11_InitAll(void);
+void Weather11_InitVars(void);
+void Weather2_InitAll(void);
+void Weather2_InitVars(void);
+void nullsub_48(void);
+void nullsub_49(void);
+void snowflakes_progress2(void);
+void sub_807C2E4(void);
+void sub_807C358(void);
+void sub_807C388(void);
+void sub_807C3F4(void);
+
+#endif //GUARD_FIELD_WEATHER_EFFECTS_H
diff --git a/include/global.h b/include/global.h
index 8a8877143..b2fd67b4b 100644
--- a/include/global.h
+++ b/include/global.h
@@ -749,7 +749,7 @@ struct SaveBlock1
/*0x0024*/ struct WarpData escapeWarp;
/*0x002C*/ u16 savedMusic;
/*0x002E*/ u8 weather;
- /*0x002F*/ u8 filler_2F;
+ /*0x002F*/ u8 weatherCycleStage;
/*0x0030*/ u8 flashLevel;
/*0x0032*/ u16 mapLayoutId;
/*0x0034*/ u8 playerPartyCount;
diff --git a/src/field_weather.c b/src/field_weather.c
index fb5f4eee7..192ec8f44 100644
--- a/src/field_weather.c
+++ b/src/field_weather.c
@@ -4,6 +4,7 @@
#include "field_effect.h"
#include "field_weather.h"
#include "field_weather_util.h"
+#include "field_weather_effects.h"
#include "task.h"
#include "trig.h"
#include "constants/field_weather.h"
@@ -39,116 +40,6 @@ struct WeatherCallbacks
bool8 (*finish)(void);
};
-struct Weather
-{
- union
- {
- struct
- {
- struct Sprite *rainSprites[MAX_RAIN_SPRITES];
- struct Sprite *snowflakeSprites[101];
- struct Sprite *cloudSprites[NUM_CLOUD_SPRITES];
- } s1;
- struct
- {
- u8 filler0[0xA0];
- struct Sprite *fogHSprites[NUM_FOG_HORIZONTAL_SPRITES];
- struct Sprite *ashSprites[NUM_ASH_SPRITES];
- struct Sprite *fogDSprites[NUM_FOG_DIAGONAL_SPRITES];
- struct Sprite *sandstormSprites1[NUM_SANDSTORM_SPRITES];
- struct Sprite *sandstormSprites2[NUM_SWIRL_SANDSTORM_SPRITES];
- } s2;
- } sprites;
- u8 gammaShifts[19][32];
- u8 altGammaShifts[19][32];
- s8 gammaIndex;
- s8 gammaTargetIndex;
- u8 gammaStepDelay;
- u8 gammaStepFrameCounter;
- u16 fadeDestColor;
- /*0x6C6*/ u8 palProcessingState;
- /*0x6C7*/ u8 fadeScreenCounter;
- /*0x6C8*/ bool8 readyForInit;
- /*0x6C9*/ u8 taskId;
- /*0x6CA*/ u8 unknown_6CA;
- u8 unknown_6CB;
- u16 initStep;
- u16 finishStep;
- u8 currWeather;
- u8 nextWeather;
- u8 weatherGfxLoaded;
- bool8 weatherChangeComplete;
- u8 weatherPicSpritePalIndex;
- u8 altGammaSpritePalIndex;
- u16 rainSpriteVisibleCounter;
- u8 curRainSpriteIndex;
- u8 targetRainSpriteCount;
- u8 rainSpriteCount;
- u8 rainSpriteVisibleDelay;
- u8 isDownpour;
- u8 rainStrength;
- /*0x6DE*/ u8 cloudSpritesCreated;
- u8 filler_6DF[1];
- u16 snowflakeVisibleCounter;
- u16 unknown_6E2;
- u8 snowflakeSpriteCount;
- u8 targetSnowflakeSpriteCount;
- u16 unknown_6E6;
- u16 thunderCounter;
- u8 unknown_6EA;
- u8 unknown_6EB;
- u8 unknown_6EC;
- u8 thunderTriggered;
- u16 fogHScrollPosX;
- u16 fogHScrollCounter;
- u16 fogHScrollOffset;
- u8 lightenedFogSpritePals[6];
- u8 lightenedFogSpritePalsCount;
- u8 fogHSpritesCreated;
- u16 ashBaseSpritesX;
- u16 unknown_6FE;
- u8 ashSpritesCreated;
- u8 filler_701[3];
- u32 sandstormXOffset;
- u32 sandstormYOffset;
- u8 filler_70C[2];
- u16 sandstormBaseSpritesX;
- u16 sandstormPosY;
- u16 sandstormWaveIndex;
- u16 sandstormWaveCounter;
- u8 sandstormSpritesCreated;
- u8 sandstormSwirlSpritesCreated;
- u16 fogDBaseSpritesX;
- u16 fogDPosY;
- u16 fogDScrollXCounter;
- u16 fogDScrollYCounter;
- u16 fogDXOffset;
- u16 fogDYOffset;
- u8 fogDSpritesCreated;
- u8 filler_725[1];
- u16 bubblesDelayCounter;
- u16 bubblesDelayIndex;
- u16 bubblesCoordsIndex;
- u16 bubblesSpriteCount;
- u8 bubblesSpritesCreated;
- u8 filler_72F;
- u16 currBlendEVA;
- u16 currBlendEVB;
- u16 targetBlendEVA;
- u16 targetBlendEVB;
- u8 blendUpdateCounter;
- u8 blendFrameCounter;
- u8 blendDelay;
- u8 filler_73B[0x3C-0x3B];
- s16 unknown_73C;
- s16 unknown_73E;
- s16 unknown_740;
- s16 unknown_742;
- u8 filler_744[0xD-4];
- s8 loadDroughtPalsIndex;
- u8 loadDroughtPalsOffset;
-};
-
EWRAM_DATA struct Weather gWeather = {};
EWRAM_DATA u8 sFieldEffectPaletteGammaTypes[32] = {};
EWRAM_DATA const u8 *sPaletteGammaTypes = NULL;
@@ -172,72 +63,6 @@ void DoNothing(void);
void ApplyFogBlend(u8 blendCoeff, u16 blendColor);
bool8 LightenSpritePaletteInFog(u8 paletteIndex);
void Weather_SetBlendCoeffs(u8, u8);
-bool8 Ash_Finish(void);
-bool8 Bubbles_Finish(void);
-bool8 Clouds_Finish(void);
-bool8 Fog1_Finish(void);
-bool8 Fog2_Finish(void);
-bool8 LightRain_Finish(void);
-bool8 Rain_Finish(void);
-bool8 Sandstorm_Finish(void);
-bool8 Snow_Finish(void);
-bool8 sub_807B434(void);
-bool8 sub_807B6BC(void);
-bool8 sub_807D8D0(void);
-void Ash_InitAll(void);
-void Ash_InitVars(void);
-void Ash_Main(void);
-void Bubbles_InitAll(void);
-void Bubbles_InitVars(void);
-void Bubbles_Main(void);
-void Clouds_InitAll(void);
-void Clouds_InitVars(void);
-void Clouds_Main(void);
-void Drought_InitAll(void);
-void Drought_InitVars(void);
-void Drought_Main(void);
-void Fog1_InitAll(void);
-void Fog1_InitVars(void);
-void Fog1_Main(void);
-void Fog2_InitAll(void);
-void Fog2_InitVars(void);
-void Fog2_Main(void);
-void LightRain_InitAll(void);
-void LightRain_InitVars(void);
-void LightRain_Main(void);
-void Rain_Main(void);
-void Sandstorm_InitAll(void);
-void Sandstorm_InitVars(void);
-void Sandstorm_Main(void);
-void Snow_InitAll(void);
-void Snow_InitVars(void);
-void Weather11_InitAll(void);
-void Weather11_InitVars(void);
-void Weather2_InitAll(void);
-void Weather2_InitVars(void);
-void nullsub_48(void);
-void nullsub_49(void);
-void snowflakes_progress2(void);
-void sub_807C2E4(void);
-void sub_807C358(void);
-void sub_807C388(void);
-void sub_807C3F4(void);
-
-const u32 gUnknown_83BFBE4[] = INCBIN_U32("graphics/field_effects/unk_83BFBE4.bin.lz");
-const u32 gUnknown_83C0408[] = INCBIN_U32("graphics/field_effects/unk_83C0408.bin.lz");
-const u32 gUnknown_83C0C00[] = INCBIN_U32("graphics/field_effects/unk_83C0C00.bin.lz");
-const u32 gUnknown_83C139C[] = INCBIN_U32("graphics/field_effects/unk_83C139C.bin.lz");
-const u32 gUnknown_83C1BB8[] = INCBIN_U32("graphics/field_effects/unk_83C1BB8.bin.lz");
-const u32 gUnknown_83C2380[] = INCBIN_U32("graphics/field_effects/unk_83C2380.bin.lz");
-
-const u32 *const gUnknown_83C2BA4[] = {
- gUnknown_83BFBE4,
- gUnknown_83C0408,
- gUnknown_83C0C00,
- gUnknown_83C139C,
- gUnknown_83C1BB8,
- gUnknown_83C2380
-};
struct Weather *const gWeatherPtr = &gWeather;
@@ -1318,3 +1143,17 @@ void ResetPreservedPalettesInWeather(void)
{
sPaletteGammaTypes = sBasePaletteGammaTypes;
}
+
+void sub_807B0C4(u16 *palbuf, u16 *unused, u32 size)
+{
+ switch (gWeatherPtr->currWeather)
+ {
+ case WEATHER_RAIN:
+ case WEATHER_SNOW:
+ case WEATHER_RAIN_THUNDERSTORM:
+ case WEATHER_SHADE:
+ case WEATHER_DOWNPOUR:
+ sub_8045314(palbuf, RGB_BLACK, 3, size);
+ break;
+ }
+}
diff --git a/src/field_weather_util.c b/src/field_weather_util.c
index ed1ce5236..40c5fbe4d 100644
--- a/src/field_weather_util.c
+++ b/src/field_weather_util.c
@@ -1,4 +1,10 @@
#include "global.h"
+#include "field_weather.h"
+#include "overworld.h"
+#include "constants/weather.h"
+
+u8 TranslateWeatherNum(u8 weather);
+void UpdateRainCounter(u8 newWeather, u8 oldWeather);
const u16 gUnknown_83C2D00[] = INCBIN_U16("graphics/field_effects/unk_83C2D00.gbapal");
const u16 gUnknown_83C2D20[] = INCBIN_U16("graphics/field_effects/unk_83C2D20.gbapal");
@@ -10,3 +16,102 @@ const u16 gUnknown_83C4580[] = INCBIN_U16("graphics/field_effects/unk_83C4580.4b
const u16 gUnknown_83C45C0[] = INCBIN_U16("graphics/field_effects/unk_83C45C0.4bpp");
const u16 gUnknown_83C55C0[] = INCBIN_U16("graphics/field_effects/unk_83C55C0.4bpp");
const u16 gUnknown_83C5BC0[] = INCBIN_U16("graphics/field_effects/unk_83C5BC0.4bpp");
+
+void SetSav1Weather(u32 weather)
+{
+ u8 oldWeather = gSaveBlock1Ptr->weather;
+ gSaveBlock1Ptr->weather = TranslateWeatherNum(weather);
+ UpdateRainCounter(gSaveBlock1Ptr->weather, oldWeather);
+}
+
+u8 GetSav1Weather(void)
+{
+ return gSaveBlock1Ptr->weather;
+}
+
+void SetSav1WeatherFromCurrMapHeader(void)
+{
+ u8 oldWeather = gSaveBlock1Ptr->weather;
+ gSaveBlock1Ptr->weather = TranslateWeatherNum(gMapHeader.weather);
+ UpdateRainCounter(gSaveBlock1Ptr->weather, oldWeather);
+}
+
+void SetWeather(u32 weather)
+{
+ SetSav1Weather(weather);
+ SetNextWeather(GetSav1Weather());
+}
+
+void SetWeather_Unused(u32 weather)
+{
+ SetSav1Weather(weather);
+ SetCurrentAndNextWeather(GetSav1Weather());
+}
+
+void DoCurrentWeather(void)
+{
+ u8 weather = GetSav1Weather();
+
+ SetNextWeather(weather);
+}
+
+void ResumePausedWeather(void)
+{
+ u8 weather = GetSav1Weather();
+
+ SetCurrentAndNextWeather(weather);
+}
+
+const u8 sWeatherCycleRoute119[] =
+ {
+ WEATHER_SUNNY,
+ WEATHER_RAIN,
+ WEATHER_RAIN_THUNDERSTORM,
+ WEATHER_RAIN,
+ };
+const u8 sWeatherCycleRoute123[] =
+ {
+ WEATHER_SUNNY,
+ WEATHER_SUNNY,
+ WEATHER_RAIN,
+ WEATHER_SUNNY,
+ };
+
+u8 TranslateWeatherNum(u8 weather)
+{
+ switch (weather)
+ {
+ case WEATHER_NONE: return WEATHER_NONE;
+ case WEATHER_SUNNY_CLOUDS: return WEATHER_SUNNY_CLOUDS;
+ case WEATHER_SUNNY: return WEATHER_SUNNY;
+ case WEATHER_RAIN: return WEATHER_RAIN;
+ case WEATHER_SNOW: return WEATHER_SNOW;
+ case WEATHER_RAIN_THUNDERSTORM: return WEATHER_RAIN_THUNDERSTORM;
+ case WEATHER_FOG_HORIZONTAL: return WEATHER_FOG_HORIZONTAL;
+ case WEATHER_VOLCANIC_ASH: return WEATHER_VOLCANIC_ASH;
+ case WEATHER_SANDSTORM: return WEATHER_SANDSTORM;
+ case WEATHER_FOG_DIAGONAL: return WEATHER_FOG_DIAGONAL;
+ case WEATHER_UNDERWATER: return WEATHER_UNDERWATER;
+ case WEATHER_SHADE: return WEATHER_SHADE;
+ case WEATHER_DROUGHT: return WEATHER_DROUGHT;
+ case WEATHER_DOWNPOUR: return WEATHER_DOWNPOUR;
+ case WEATHER_UNDERWATER_BUBBLES: return WEATHER_UNDERWATER_BUBBLES;
+ case WEATHER_ROUTE119_CYCLE: return sWeatherCycleRoute119[gSaveBlock1Ptr->weatherCycleStage];
+ case WEATHER_ROUTE123_CYCLE: return sWeatherCycleRoute123[gSaveBlock1Ptr->weatherCycleStage];
+ default: return WEATHER_NONE;
+ }
+}
+
+void UpdateWeatherPerDay(u16 increment)
+{
+ u16 weatherStage = gSaveBlock1Ptr->weatherCycleStage + increment;
+ weatherStage %= 4;
+ gSaveBlock1Ptr->weatherCycleStage = weatherStage;
+}
+
+void UpdateRainCounter(u8 newWeather, u8 oldWeather)
+{
+ if (newWeather != oldWeather
+ && (newWeather == WEATHER_RAIN || newWeather == WEATHER_RAIN_THUNDERSTORM))
+ IncrementGameStat(GAME_STAT_GOT_RAINED_ON);
+}
diff --git a/src/title_screen.c b/src/title_screen.c
index 0ff0a6b96..555b58e8f 100644
--- a/src/title_screen.c
+++ b/src/title_screen.c
@@ -305,6 +305,22 @@ static const u16 gUnknown_LG_83BFA10[] = {
};
#endif
+const u32 gUnknown_83BFBE4[] = INCBIN_U32("graphics/field_effects/unk_83BFBE4.bin.lz");
+const u32 gUnknown_83C0408[] = INCBIN_U32("graphics/field_effects/unk_83C0408.bin.lz");
+const u32 gUnknown_83C0C00[] = INCBIN_U32("graphics/field_effects/unk_83C0C00.bin.lz");
+const u32 gUnknown_83C139C[] = INCBIN_U32("graphics/field_effects/unk_83C139C.bin.lz");
+const u32 gUnknown_83C1BB8[] = INCBIN_U32("graphics/field_effects/unk_83C1BB8.bin.lz");
+const u32 gUnknown_83C2380[] = INCBIN_U32("graphics/field_effects/unk_83C2380.bin.lz");
+
+const u32 *const gUnknown_83C2BA4[] = {
+ gUnknown_83BFBE4,
+ gUnknown_83C0408,
+ gUnknown_83C0C00,
+ gUnknown_83C139C,
+ gUnknown_83C1BB8,
+ gUnknown_83C2380
+};
+
void CB2_InitTitleScreen(void)
{
switch (gMain.state)