summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/battle_anim_80CA710.s16
-rw-r--r--asm/cable_car.s2
-rw-r--r--asm/field_weather.s397
-rw-r--r--data/field_weather.s2
-rw-r--r--data/graphics.s4
-rw-r--r--graphics/battle_anims/backgrounds/fog.bin (renamed from graphics/weather/fog1.bin)bin2048 -> 2048 bytes
-rw-r--r--graphics/weather/fog0.pngbin928 -> 0 bytes
-rw-r--r--graphics/weather/fog1.pngbin1018 -> 928 bytes
-rw-r--r--graphics/weather/fog2.pngbin0 -> 1018 bytes
-rw-r--r--include/field_weather.h53
-rw-r--r--include/gba/io_reg.h23
-rw-r--r--src/field/field_weather.c255
-rw-r--r--src/field/field_weather_2.c892
-rw-r--r--src/field/overworld.c2
14 files changed, 726 insertions, 920 deletions
diff --git a/asm/battle_anim_80CA710.s b/asm/battle_anim_80CA710.s
index 121cb076b..5f46883f7 100644
--- a/asm/battle_anim_80CA710.s
+++ b/asm/battle_anim_80CA710.s
@@ -11280,14 +11280,14 @@ _080D812A:
ldr r2, _080D81C4 @ =0x85000400
str r2, [r0, 0x8]
ldr r2, [r0, 0x8]
- ldr r2, _080D81C8 @ =gWeatherFog1Tiles
+ ldr r2, _080D81C8 @ =gWeatherFog2Tiles
ldr r3, [sp]
str r2, [r0]
str r3, [r0, 0x4]
ldr r2, _080D81CC @ =0x80000400
str r2, [r0, 0x8]
ldr r0, [r0, 0x8]
- ldr r0, _080D81D0 @ =gWeatherFog1Tilemap
+ ldr r0, _080D81D0 @ =gBattleAnimFogTilemap
bl LZDecompressVram
ldr r0, _080D81D4 @ =gUnknown_083970E8
mov r1, sp
@@ -11326,9 +11326,9 @@ _080D81B8: .4byte gUnknown_030041B4
_080D81BC: .4byte REG_BG1HOFS
_080D81C0: .4byte 0x040000d4
_080D81C4: .4byte 0x85000400
-_080D81C8: .4byte gWeatherFog1Tiles
+_080D81C8: .4byte gWeatherFog2Tiles
_080D81CC: .4byte 0x80000400
-_080D81D0: .4byte gWeatherFog1Tilemap
+_080D81D0: .4byte gBattleAnimFogTilemap
_080D81D4: .4byte gUnknown_083970E8
_080D81D8: .4byte gTasks
_080D81DC: .4byte sub_80D81E0
@@ -11672,14 +11672,14 @@ _080D845E:
ldr r2, _080D84FC @ =0x85000400
str r2, [r0, 0x8]
ldr r2, [r0, 0x8]
- ldr r2, _080D8500 @ =gWeatherFog1Tiles
+ ldr r2, _080D8500 @ =gWeatherFog2Tiles
ldr r3, [sp]
str r2, [r0]
str r3, [r0, 0x4]
ldr r2, _080D8504 @ =0x80000400
str r2, [r0, 0x8]
ldr r0, [r0, 0x8]
- ldr r0, _080D8508 @ =gWeatherFog1Tilemap
+ ldr r0, _080D8508 @ =gBattleAnimFogTilemap
bl LZDecompressVram
ldr r0, _080D850C @ =gUnknown_083970E8
mov r1, sp
@@ -11720,9 +11720,9 @@ _080D84F0: .4byte gUnknown_030041B4
_080D84F4: .4byte REG_BG1HOFS
_080D84F8: .4byte 0x040000d4
_080D84FC: .4byte 0x85000400
-_080D8500: .4byte gWeatherFog1Tiles
+_080D8500: .4byte gWeatherFog2Tiles
_080D8504: .4byte 0x80000400
-_080D8508: .4byte gWeatherFog1Tilemap
+_080D8508: .4byte gBattleAnimFogTilemap
_080D850C: .4byte gUnknown_083970E8
_080D8510: .4byte gTasks
_080D8514: .4byte 0x0000ffff
diff --git a/asm/cable_car.s b/asm/cable_car.s
index abafe5500..e1131c549 100644
--- a/asm/cable_car.s
+++ b/asm/cable_car.s
@@ -204,7 +204,7 @@ _08123384:
bl ResetTasks
bl FreeAllSpritePalettes
bl ResetPaletteFade
- bl sub_807C828
+ bl StartWeather
movs r4, 0
ldr r0, _081233D4 @ =gWeatherPtr
ldr r0, [r0]
diff --git a/asm/field_weather.s b/asm/field_weather.s
index 507b67fd8..aedcfe582 100644
--- a/asm/field_weather.s
+++ b/asm/field_weather.s
@@ -5,373 +5,6 @@
.text
- thumb_func_start sub_807F6E8
-sub_807F6E8: @ 807F6E8
- push {r4,r5,lr}
- sub sp, 0x8
- ldr r0, _0807F75C @ =gWeatherPtr
- ldr r0, [r0]
- ldr r1, _0807F760 @ =0x000006fb
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807F792
- ldr r0, _0807F764 @ =gWeatherFog1SpriteSheet
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [sp]
- str r1, [sp, 0x4]
- mov r0, sp
- bl LoadSpriteSheet
- movs r5, 0
-_0807F70C:
- ldr r0, _0807F768 @ =gSpriteTemplate_839AB90
- movs r1, 0
- movs r2, 0
- movs r3, 0xFF
- bl CreateSpriteAtEnd
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x40
- beq _0807F770
- lsls r4, r0, 4
- adds r4, r0
- lsls r4, 2
- ldr r0, _0807F76C @ =gSprites
- adds r4, r0
- adds r0, r5, 0
- movs r1, 0x5
- bl __umodsi3
- strh r0, [r4, 0x2E]
- lsls r0, 16
- lsrs r0, 10
- adds r0, 0x20
- strh r0, [r4, 0x20]
- adds r0, r5, 0
- movs r1, 0x5
- bl __udivsi3
- lsls r0, 16
- lsrs r0, 10
- adds r0, 0x20
- strh r0, [r4, 0x22]
- ldr r2, _0807F75C @ =gWeatherPtr
- ldr r0, [r2]
- lsls r1, r5, 2
- adds r0, 0xA0
- adds r0, r1
- str r4, [r0]
- b _0807F77E
- .align 2, 0
-_0807F75C: .4byte gWeatherPtr
-_0807F760: .4byte 0x000006fb
-_0807F764: .4byte gWeatherFog1SpriteSheet
-_0807F768: .4byte gSpriteTemplate_839AB90
-_0807F76C: .4byte gSprites
-_0807F770:
- ldr r2, _0807F79C @ =gWeatherPtr
- ldr r1, [r2]
- lsls r0, r5, 2
- adds r1, 0xA0
- adds r1, r0
- movs r0, 0
- str r0, [r1]
-_0807F77E:
- adds r0, r5, 0x1
- lsls r0, 16
- lsrs r5, r0, 16
- cmp r5, 0x13
- bls _0807F70C
- ldr r0, [r2]
- ldr r1, _0807F7A0 @ =0x000006fb
- adds r0, r1
- movs r1, 0x1
- strb r1, [r0]
-_0807F792:
- add sp, 0x8
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807F79C: .4byte gWeatherPtr
-_0807F7A0: .4byte 0x000006fb
- thumb_func_end sub_807F6E8
-
- thumb_func_start sub_807F7A4
-sub_807F7A4: @ 807F7A4
- push {r4,r5,lr}
- ldr r0, _0807F7EC @ =gWeatherPtr
- ldr r1, [r0]
- ldr r2, _0807F7F0 @ =0x000006fb
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- beq _0807F7E4
- movs r4, 0
- adds r5, r1, 0
- adds r5, 0xA0
-_0807F7BA:
- lsls r0, r4, 2
- adds r0, r5, r0
- ldr r0, [r0]
- cmp r0, 0
- beq _0807F7C8
- bl DestroySprite
-_0807F7C8:
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r4, 0x13
- bls _0807F7BA
- ldr r0, _0807F7F4 @ =0x00001201
- bl FreeSpriteTilesByTag
- ldr r0, _0807F7EC @ =gWeatherPtr
- ldr r0, [r0]
- ldr r1, _0807F7F0 @ =0x000006fb
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
-_0807F7E4:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807F7EC: .4byte gWeatherPtr
-_0807F7F0: .4byte 0x000006fb
-_0807F7F4: .4byte 0x00001201
- thumb_func_end sub_807F7A4
-
- thumb_func_start sub_807F7F8
-sub_807F7F8: @ 807F7F8
- push {lr}
- ldr r0, _0807F844 @ =gWeatherPtr
- ldr r1, [r0]
- ldr r0, _0807F848 @ =0x000006cc
- adds r2, r1, r0
- movs r3, 0
- movs r0, 0
- strh r0, [r2]
- ldr r2, _0807F84C @ =0x000006d2
- adds r0, r1, r2
- strb r3, [r0]
- subs r2, 0x11
- adds r0, r1, r2
- strb r3, [r0]
- ldr r3, _0807F850 @ =0x000006c2
- adds r0, r1, r3
- movs r2, 0x14
- strb r2, [r0]
- adds r3, 0x3C
- adds r0, r1, r3
- strh r2, [r0]
- movs r0, 0xE0
- lsls r0, 3
- adds r1, r0
- ldrb r0, [r1]
- cmp r0, 0
- bne _0807F840
- movs r0, 0
- movs r1, 0x10
- bl sub_807DB64
- ldr r1, _0807F854 @ =REG_BLDALPHA
- movs r2, 0xFD
- lsls r2, 6
- adds r0, r2, 0
- strh r0, [r1]
-_0807F840:
- pop {r0}
- bx r0
- .align 2, 0
-_0807F844: .4byte gWeatherPtr
-_0807F848: .4byte 0x000006cc
-_0807F84C: .4byte 0x000006d2
-_0807F850: .4byte 0x000006c2
-_0807F854: .4byte REG_BLDALPHA
- thumb_func_end sub_807F7F8
-
- thumb_func_start sub_807F858
-sub_807F858: @ 807F858
- push {r4,lr}
- bl sub_807F7F8
- ldr r0, _0807F880 @ =gWeatherPtr
- ldr r1, [r0]
- ldr r2, _0807F884 @ =0x000006d2
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807F878
- adds r4, r1, r2
-_0807F86E:
- bl sub_807F888
- ldrb r0, [r4]
- cmp r0, 0
- beq _0807F86E
-_0807F878:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807F880: .4byte gWeatherPtr
-_0807F884: .4byte 0x000006d2
- thumb_func_end sub_807F858
-
- thumb_func_start sub_807F888
-sub_807F888: @ 807F888
- push {r4,r5,lr}
- ldr r2, _0807F8CC @ =gWeatherPtr
- ldr r1, [r2]
- ldr r0, _0807F8D0 @ =gSpriteCoordOffsetX
- ldrh r0, [r0]
- ldr r3, _0807F8D4 @ =0x000001ff
- ands r3, r0
- ldr r0, _0807F8D8 @ =0x000006fc
- adds r1, r0
- strh r3, [r1]
- cmp r3, 0xEF
- bls _0807F8B4
- adds r4, r1, 0
- adds r1, r3, 0
-_0807F8A4:
- adds r3, r1, 0
- subs r3, 0xF0
- adds r1, r3, 0
- lsls r0, r3, 16
- lsrs r0, 16
- cmp r0, 0xEF
- bhi _0807F8A4
- strh r3, [r4]
-_0807F8B4:
- ldr r5, [r2]
- ldr r1, _0807F8DC @ =0x000006cc
- adds r4, r5, r1
- ldrh r0, [r4]
- cmp r0, 0x1
- beq _0807F8EC
- cmp r0, 0x1
- bgt _0807F8E0
- cmp r0, 0
- beq _0807F8E6
- b _0807F928
- .align 2, 0
-_0807F8CC: .4byte gWeatherPtr
-_0807F8D0: .4byte gSpriteCoordOffsetX
-_0807F8D4: .4byte 0x000001ff
-_0807F8D8: .4byte 0x000006fc
-_0807F8DC: .4byte 0x000006cc
-_0807F8E0:
- cmp r0, 0x2
- beq _0807F908
- b _0807F928
-_0807F8E6:
- bl sub_807F99C
- b _0807F91A
-_0807F8EC:
- movs r1, 0xE0
- lsls r1, 3
- adds r0, r5, r1
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807F8FC
- bl sub_807F9AC
-_0807F8FC:
- movs r0, 0x10
- movs r1, 0
- movs r2, 0x1
- bl sub_807DBA4
- b _0807F91A
-_0807F908:
- bl sub_807DBE8
- lsls r0, 24
- cmp r0, 0
- beq _0807F92C
- ldr r0, _0807F924 @ =0x000006d2
- adds r1, r5, r0
- movs r0, 0x1
- strb r0, [r1]
-_0807F91A:
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- b _0807F92C
- .align 2, 0
-_0807F924: .4byte 0x000006d2
-_0807F928:
- bl sub_807DBE8
-_0807F92C:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_807F888
-
- thumb_func_start sub_807F934
-sub_807F934: @ 807F934
- push {r4,lr}
- ldr r0, _0807F950 @ =gWeatherPtr
- ldr r0, [r0]
- ldr r1, _0807F954 @ =0x000006ce
- adds r4, r0, r1
- ldrh r0, [r4]
- cmp r0, 0x1
- beq _0807F96A
- cmp r0, 0x1
- bgt _0807F958
- cmp r0, 0
- beq _0807F95E
- b _0807F98C
- .align 2, 0
-_0807F950: .4byte gWeatherPtr
-_0807F954: .4byte 0x000006ce
-_0807F958:
- cmp r0, 0x2
- beq _0807F980
- b _0807F98C
-_0807F95E:
- movs r0, 0
- movs r1, 0x10
- movs r2, 0x1
- bl sub_807DBA4
- b _0807F978
-_0807F96A:
- bl sub_807DBE8
- lsls r0, 24
- cmp r0, 0
- beq _0807F994
- bl sub_807FA54
-_0807F978:
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- b _0807F994
-_0807F980:
- ldr r1, _0807F990 @ =REG_BLDALPHA
- movs r0, 0
- strh r0, [r1]
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
-_0807F98C:
- movs r0, 0
- b _0807F996
- .align 2, 0
-_0807F990: .4byte REG_BLDALPHA
-_0807F994:
- movs r0, 0x1
-_0807F996:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_807F934
-
- thumb_func_start sub_807F99C
-sub_807F99C: @ 807F99C
- push {lr}
- ldr r0, _0807F9A8 @ =gWeatherAshSpriteSheet
- bl LoadSpriteSheet
- pop {r0}
- bx r0
- .align 2, 0
-_0807F9A8: .4byte gWeatherAshSpriteSheet
- thumb_func_end sub_807F99C
-
thumb_func_start sub_807F9AC
sub_807F9AC: @ 807F9AC
push {r4,r5,lr}
@@ -618,7 +251,7 @@ sub_807FB24: @ 807FB24
strh r2, [r0]
movs r0, 0
movs r1, 0x10
- bl sub_807DB64
+ bl Weather_SetBlendCoeffs
_0807FB8E:
pop {r4}
pop {r0}
@@ -687,10 +320,10 @@ _0807FC0C:
movs r0, 0xC
movs r1, 0x8
movs r2, 0x8
- bl sub_807DBA4
+ bl Weather_SetTargetBlendCoeffs
b _0807FC2A
_0807FC18:
- bl sub_807DBE8
+ bl Weather_UpdateBlend
lsls r0, 24
cmp r0, 0
beq _0807FC30
@@ -737,10 +370,10 @@ _0807FC6A:
movs r0, 0
movs r1, 0x10
movs r2, 0x1
- bl sub_807DBA4
+ bl Weather_SetTargetBlendCoeffs
b _0807FC86
_0807FC76:
- bl sub_807DBE8
+ bl Weather_UpdateBlend
lsls r0, 24
cmp r0, 0
beq _0807FC92
@@ -848,7 +481,7 @@ sub_807FD30: @ 807FD30
ldrb r0, [r0]
cmp r0, 0
bne _0807FDD6
- ldr r0, _0807FDA4 @ =gWeatherFog0SpriteSheet
+ ldr r0, _0807FDA4 @ =gWeatherFog1SpriteSheet
ldr r1, [r0, 0x4]
ldr r0, [r0]
str r0, [sp]
@@ -893,7 +526,7 @@ _0807FD54:
.align 2, 0
_0807FD9C: .4byte gWeatherPtr
_0807FDA0: .4byte 0x00000724
-_0807FDA4: .4byte gWeatherFog0SpriteSheet
+_0807FDA4: .4byte gWeatherFog1SpriteSheet
_0807FDA8: .4byte gSpriteTemplate_839AC04
_0807FDAC: .4byte gSprites
_0807FDB0:
@@ -1068,7 +701,7 @@ sub_807FE9C: @ 807FE9C
_0807FEF0:
movs r0, 0
movs r1, 0x10
- bl sub_807DB64
+ bl Weather_SetBlendCoeffs
_0807FEF8:
pop {r4}
pop {r0}
@@ -1150,10 +783,10 @@ _0807FF98:
movs r0, 0x10
movs r1, 0
movs r2, 0
- bl sub_807DBA4
+ bl Weather_SetTargetBlendCoeffs
b _0807FFB6
_0807FFA4:
- bl sub_807DBE8
+ bl Weather_UpdateBlend
lsls r0, 24
cmp r0, 0
beq _0807FFBC
@@ -1201,10 +834,10 @@ _0807FFFA:
movs r0, 0
movs r1, 0x10
movs r2, 0
- bl sub_807DBA4
+ bl Weather_SetTargetBlendCoeffs
b _08080016
_08080006:
- bl sub_807DBE8
+ bl Weather_UpdateBlend
lsls r0, 24
cmp r0, 0
beq _08080022
@@ -1793,7 +1426,7 @@ sub_8080470: @ 8080470
thumb_func_start sub_8080474
sub_8080474: @ 8080474
push {r4,r5,lr}
- bl sub_807F49C
+ bl Fog2_InitVars
ldr r0, _080804B4 @ =gWeatherPtr
ldr r4, [r0]
ldr r1, _080804B8 @ =0x0000072e
@@ -1859,7 +1492,7 @@ _080804F4: .4byte 0x000006d2
thumb_func_start sub_80804F8
sub_80804F8: @ 80804F8
push {r4-r7,lr}
- bl sub_807F52C
+ bl Fog2_Main
ldr r0, _08080558 @ =gWeatherPtr
ldr r5, [r0]
ldr r0, _0808055C @ =0x00000726
@@ -1916,7 +1549,7 @@ _08080568: .4byte 0x0000072a
thumb_func_start sub_808056C
sub_808056C: @ 808056C
push {lr}
- bl sub_807F5EC
+ bl Fog2_Finish
lsls r0, 24
cmp r0, 0
beq _0808057C
diff --git a/data/field_weather.s b/data/field_weather.s
index 9ca3eef3a..f6f794092 100644
--- a/data/field_weather.s
+++ b/data/field_weather.s
@@ -24,7 +24,7 @@ gUnknown_0839AC68:: @ 839AC68
.align 2
gWeatherBubbleSpriteSheet:: @ 839AC70
- obj_tiles WeatherBubbleTiles, 0x40, 0x1205
+ obj_tiles gWeatherBubbleTiles, 0x40, 0x1205
.align 1
gUnknown_0839AC78:: @ 839AC78
diff --git a/data/graphics.s b/data/graphics.s
index d24039de6..f1c7c37a3 100644
--- a/data/graphics.s
+++ b/data/graphics.s
@@ -2997,8 +2997,8 @@ gBattleAnimSpriteSheet_277:: @ 8E6DA54
.incbin "graphics/battle_anims/sprites/277.4bpp.lz"
.align 2
-gWeatherFog1Tilemap:: @ 8E6DE48
- .incbin "graphics/weather/fog1.bin.lz"
+gBattleAnimFogTilemap:: @ 8E6DE48
+ .incbin "graphics/battle_anims/backgrounds/fog.bin.lz"
.align 2
gBattleAnimSpritePalette_283:: @ 8E6DFC0
diff --git a/graphics/weather/fog1.bin b/graphics/battle_anims/backgrounds/fog.bin
index 1f9d53f95..1f9d53f95 100644
--- a/graphics/weather/fog1.bin
+++ b/graphics/battle_anims/backgrounds/fog.bin
Binary files differ
diff --git a/graphics/weather/fog0.png b/graphics/weather/fog0.png
deleted file mode 100644
index 198c6f494..000000000
--- a/graphics/weather/fog0.png
+++ /dev/null
Binary files differ
diff --git a/graphics/weather/fog1.png b/graphics/weather/fog1.png
index 02e3cd3cb..198c6f494 100644
--- a/graphics/weather/fog1.png
+++ b/graphics/weather/fog1.png
Binary files differ
diff --git a/graphics/weather/fog2.png b/graphics/weather/fog2.png
new file mode 100644
index 000000000..02e3cd3cb
--- /dev/null
+++ b/graphics/weather/fog2.png
Binary files differ
diff --git a/include/field_weather.h b/include/field_weather.h
index e99b64344..c099a4977 100644
--- a/include/field_weather.h
+++ b/include/field_weather.h
@@ -1,20 +1,30 @@
#ifndef GUARD_WEATHER_H
#define GUARD_WEATHER_H
+#define WEATHER_NONE 0
#define WEATHER_CLOUDS 1
#define WEATHER_RAIN_LIGHT 3
#define WEATHER_SNOW 4
#define WEATHER_RAIN_MED 5
+#define WEATHER_FOG_2 6
+#define WEATHER_FOG_1 7
#define WEATHER_DROUGHT 12
#define WEATHER_RAIN_HEAVY 13
struct Sprite;
+// TODO: This might be a union
+struct Weather2
+{
+ /*0x00*/ u8 filler0[0xA0];
+ /*0xA0*/ struct Sprite *fogSprites[20];
+};
+
struct Weather
{
- struct Sprite *unknown_0[24];
- struct Sprite *snowflakeSprites[0x65]; // snowflakes?
- struct Sprite *cloudSprites[3];
+ /*0x000*/ struct Sprite *rainSprites[24];
+ /*0x060*/ struct Sprite *snowflakeSprites[0x65]; // snowflakes?
+ /*0x1F4*/ struct Sprite *cloudSprites[3];
u8 unknown_200[2][32];
u8 filler_240[0x460-0x240];
u8 unk460[2][32];
@@ -32,11 +42,11 @@ struct Weather
u8 unknown_6C9;
u8 unknown_6CA;
u8 unknown_6CB;
- u16 unknown_6CC;
+ u16 initStep;
u16 unknown_6CE;
u8 currWeather;
- u8 unknown_6D1;
- u8 unknown_6D2;
+ u8 nextWeather;
+ u8 weatherGfxLoaded;
u8 unknown_6D3;
u8 unknown_6D4;
u8 unknown_6D5;
@@ -47,25 +57,26 @@ struct Weather
u8 unknown_6DB;
u8 unknown_6DC;
u8 rainStrength;
- u8 unknown_6DE;
+ /*0x6DE*/ u8 cloudsActive;
u8 filler_6DF[1];
u16 unknown_6E0;
u16 unknown_6E2;
- u8 unknown_6E4;
+ u8 snowflakeSpriteCount;
u8 unknown_6E5;
u16 unknown_6E6;
- u16 unknown_6E8;
+ u16 thunderCounter;
u8 unknown_6EA;
u8 unknown_6EB;
u8 unknown_6EC;
u8 unknown_6ED;
- u16 unknown_6EE;
+ u16 fog2ScrollPosX;
u16 unknown_6F0;
u16 unknown_6F2;
u8 unknown_6F4[6];
u8 unknown_6FA;
- u8 unknown_6FB;
- u8 filler_6FC[4];
+ u8 unknown_6FB; // fogActive
+ u16 unknown_6FC;
+ u16 unknown_6FE;
u8 unknown_700;
u8 filler_701[0x15];
u8 unknown_716;
@@ -75,13 +86,13 @@ struct Weather
u8 filler_725[9];
u8 unknown_72E;
u8 filler_72F;
- u16 unknown_730;
- u16 unknown_732;
- u16 unknown_734;
- u16 unknown_736;
+ u16 currBlendEVA;
+ u16 currBlendEVB;
+ u16 targetBlendEVA;
+ u16 targetBlendEVB;
u8 unknown_738;
u8 unknown_739;
- u8 unknown_73A;
+ u8 blendDelay;
u8 filler_73B[0x3C-0x3B];
s16 unknown_73C;
s16 unknown_73E;
@@ -92,12 +103,12 @@ struct Weather
u8 unknown_74E;
};
-void sub_807C828(void);
+void StartWeather(void);
void DoWeatherEffect(u8 effect);
void sub_807C988(u8 effect);
void sub_807C9B4(u8 effect);
-void sub_807C9E4(u8);
-void sub_807CA34(u8);
+void Task_WeatherInit(u8);
+void Task_WeatherMain(u8);
void sub_807CAE8(void);
void nullsub_38(void);
void sub_807CB10(void);
@@ -120,7 +131,7 @@ void fade_screen(u8, u8);
void sub_807D78C(u8 tag);
void sub_807D874(u8);
// ...
-void sub_807DB64(u8, u8);
+void Weather_SetBlendCoeffs(u8, u8);
// ...
void sub_807DE68(void);
// ...
diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h
index d483d4ddc..6dbe5e8ed 100644
--- a/include/gba/io_reg.h
+++ b/include/gba/io_reg.h
@@ -539,7 +539,28 @@
#define BGCNT_AFF1024x1024 0xC000
// BLDCNT
-
+// Bits 0-5 select layers for the 1st target
+#define BLDCNT_TGT1_BG0 (1 << 0)
+#define BLDCNT_TGT1_BG1 (1 << 1)
+#define BLDCNT_TGT1_BG2 (1 << 2)
+#define BLDCNT_TGT1_BG3 (1 << 3)
+#define BLDCNT_TGT1_OBJ (1 << 4)
+#define BLDCNT_TGT1_BD (1 << 5)
+// Bits 6-7 select the special effect
+#define BLDCNT_EFFECT_NONE (0 << 6) // no special effect
+#define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA)
+#define BLDCNT_EFFECT_LIGHTEN (2 << 6) // 1st target becomes whiter (controlled by BLDY)
+#define BLDCNT_EFFECT_DARKEN (3 << 6) // 1st target becomes blacker (controlled by BLDY)
+// Bits 8-13 select layers for the 2nd target
+#define BLDCNT_TGT2_BG0 (1 << 8)
+#define BLDCNT_TGT2_BG1 (1 << 9)
+#define BLDCNT_TGT2_BG2 (1 << 10)
+#define BLDCNT_TGT2_BG3 (1 << 11)
+#define BLDCNT_TGT2_OBJ (1 << 12)
+#define BLDCNT_TGT2_BD (1 << 13)
+
+// BLDALPHA
+#define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1))
// SOUNDCNT_H
#define SOUND_CGB_MIX_QUARTER 0x0000
diff --git a/src/field/field_weather.c b/src/field/field_weather.c
index 2d4711b81..edb186b95 100644
--- a/src/field/field_weather.c
+++ b/src/field/field_weather.c
@@ -28,10 +28,10 @@ struct WeatherPaletteData
struct WeatherCallbacks
{
- void (*func0)(void);
- void (*func1)(void);
- void (*func2)(void);
- u8 (*func3)(void);
+ void (*initVars)(void);
+ void (*main)(void);
+ void (*initAll)(void);
+ u8 (*finish)(void);
};
extern struct Weather gWeather;
@@ -48,7 +48,7 @@ const u8 DroughtPaletteData_5[] = INCBIN_U8("graphics/weather/drought5.bin.lz");
extern u8 (*gUnknown_0202FC48)[32];
extern u8 gUnknown_0202F9E8[32];
-const u8 *const gUnknown_08396FA8[] =
+static const u8 *const sCompressedDroughtPalettes[] =
{
DroughtPaletteData_0,
DroughtPaletteData_1,
@@ -65,34 +65,34 @@ const u8 *const gUnknown_08396FA8[] =
// this file produces the same result as accessing gWeather directly.
struct Weather *const gWeatherPtr = &gWeather;
-void sub_807CAE8(void);
-void nullsub_38(void);
-u8 sub_807CB0C(void);
-void sub_807DE78(void);
-void sub_807DEF4(void);
-void sub_807DEC4(void);
-u8 sub_807DF54(void);
+void None_Init(void);
+void None_Main(void);
+u8 None_Finish(void);
+void Clouds_InitVars(void);
+void Clouds_Main(void);
+void Clouds_InitAll(void);
+u8 Clouds_Finish(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 LightRain_Main(void);
+void LightRain_InitAll(void);
+u8 LightRain_Finish(void);
void Snow_InitVars(void);
-void snowflakes_progress2(void);
-void sub_807EA18(void);
-u8 sub_807EAC0(void);
-void sub_807EE80(void);
-void sub_807EFC0(void);
-void sub_807EEF4(void);
-u8 sub_807F34C(void);
-void sub_807F49C(void);
-void sub_807F52C(void);
-void sub_807F4FC(void);
-u8 sub_807F5EC(void);
-void sub_807F7F8(void);
+void Snow_Main(void);
+void Snow_InitAll(void);
+u8 Snow_Finish(void);
+void MedRain_InitVars(void);
+void Rain_Main(void);
+void MedRain_InitAll(void);
+u8 Rain_Finish(void);
+void Fog2_InitVars(void);
+void Fog2_Main(void);
+void Fog2_InitAll(void);
+u8 Fog2_Finish(void);
+void Fog1_InitVars(void);
void sub_807F888(void);
void sub_807F858(void);
u8 sub_807F934(void);
@@ -104,10 +104,10 @@ 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 Fog2_InitVars(void);
+void Fog2_Main(void);
+void Fog2_InitAll(void);
+u8 Fog2_Finish(void);
void sub_8080430(void);
void nullsub_56(void);
void sub_8080460(void);
@@ -116,32 +116,32 @@ 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 HeavyRain_InitVars(void);
+void Rain_Main(void);
+void HeavyRain_InitAll(void);
+u8 Rain_Finish(void);
void sub_8080474(void);
void sub_80804F8(void);
void sub_80804C8(void);
u8 sub_808056C(void);
-const struct WeatherCallbacks gUnknown_08396FC8[] =
+static const struct WeatherCallbacks sWeatherFuncs[] =
{
- {sub_807CAE8, nullsub_38, sub_807CAE8, sub_807CB0C},
- {sub_807DE78, sub_807DEF4, sub_807DEC4, sub_807DF54},
- {sub_807DF9C, nullsub_55, sub_807DFC0, sub_807DFD0},
- {LightRain_InitVars, sub_807E400, sub_807E3D0, sub_807E460}, // light rain
- {Snow_InitVars, snowflakes_progress2, sub_807EA18, sub_807EAC0}, // snow
- {sub_807EE80, sub_807EFC0, sub_807EEF4, sub_807F34C},
- {sub_807F49C, sub_807F52C, sub_807F4FC, sub_807F5EC},
- {sub_807F7F8, sub_807F888, sub_807F858, sub_807F934},
- {sub_807FE9C, sub_807FF4C, sub_807FF1C, sub_807FFC8},
- {sub_807FB24, sub_807FBD8, sub_807FBA8, sub_807FC3C},
- {sub_807F49C, sub_807F52C, sub_807F4FC, sub_807F5EC},
- {sub_8080430, nullsub_56, sub_8080460, sub_8080470},
- {sub_807E110, sub_807E174, sub_807E144, sub_807E258},
- {sub_807EF24, sub_807EFC0, sub_807EF90, sub_807F34C},
- {sub_8080474, sub_80804F8, sub_80804C8, sub_808056C},
+ {None_Init, None_Main, None_Init, None_Finish},
+ {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish},
+ {sub_807DF9C, nullsub_55, sub_807DFC0, sub_807DFD0},
+ {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, // light rain
+ {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish}, // snow
+ {MedRain_InitVars, Rain_Main, MedRain_InitAll, Rain_Finish},
+ {Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish},
+ {Fog1_InitVars, sub_807F888, sub_807F858, sub_807F934}, // fog 1
+ {sub_807FE9C, sub_807FF4C, sub_807FF1C, sub_807FFC8},
+ {sub_807FB24, sub_807FBD8, sub_807FBA8, sub_807FC3C},
+ {Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish},
+ {sub_8080430, nullsub_56, sub_8080460, sub_8080470},
+ {sub_807E110, sub_807E174, sub_807E144, sub_807E258},
+ {HeavyRain_InitVars, Rain_Main, HeavyRain_InitAll, Rain_Finish},
+ {sub_8080474, sub_80804F8, sub_80804C8, sub_808056C},
};
void (*const gUnknown_083970B8[])(void) =
@@ -190,10 +190,10 @@ const u8 gUnknown_083970C8[] =
const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal");
-void sub_807C828(void)
+void StartWeather(void)
{
u8 index;
- if (!FuncIsActiveTask(sub_807CA34))
+ if (!FuncIsActiveTask(Task_WeatherMain))
{
index = AllocSpritePalette(0x1200);
CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32);
@@ -202,8 +202,8 @@ void sub_807C828(void)
gWeatherPtr->unknown_6D4 = AllocSpritePalette(0x1201);
gWeatherPtr->unknown_6DA = 0;
gWeatherPtr->unknown_6D8 = 0;
- gWeatherPtr->unknown_6DE = 0;
- gWeatherPtr->unknown_6E4 = 0;
+ gWeatherPtr->cloudsActive = 0;
+ gWeatherPtr->snowflakeSpriteCount = 0;
gWeatherPtr->unknown_700 = 0;
gWeatherPtr->unknown_6FB = 0;
gWeatherPtr->unknown_724 = 0;
@@ -211,12 +211,12 @@ void sub_807C828(void)
gWeatherPtr->unknown_717 = 0;
gWeatherPtr->unknown_72E = 0;
gWeatherPtr->unknown_6FA = 0;
- sub_807DB64(16, 0);
+ Weather_SetBlendCoeffs(16, 0);
gWeatherPtr->currWeather = 0;
gWeatherPtr->unknown_6C6 = 3;
gWeatherPtr->unknown_6C8 = 0;
gWeatherPtr->unknown_6D3 = 1;
- gWeatherPtr->unknown_6C9 = CreateTask(sub_807C9E4, 80);
+ gWeatherPtr->unknown_6C9 = CreateTask(Task_WeatherInit, 80);
}
}
@@ -226,12 +226,12 @@ void DoWeatherEffect(u8 effect)
{
PlayRainSoundEffect();
}
- if (gWeatherPtr->unknown_6D1 != effect && gWeatherPtr->currWeather == effect)
+ if (gWeatherPtr->nextWeather != effect && gWeatherPtr->currWeather == effect)
{
- gUnknown_08396FC8[effect].func0();
+ sWeatherFuncs[effect].initVars();
}
gWeatherPtr->unknown_6D3 = 0;
- gWeatherPtr->unknown_6D1 = effect;
+ gWeatherPtr->nextWeather = effect;
gWeatherPtr->unknown_6CE = 0;
}
@@ -239,59 +239,57 @@ void sub_807C988(u8 effect)
{
PlayRainSoundEffect();
gWeatherPtr->currWeather = effect;
- gWeatherPtr->unknown_6D1 = effect;
+ gWeatherPtr->nextWeather = effect;
}
void sub_807C9B4(u8 effect)
{
PlayRainSoundEffect();
gWeatherPtr->currWeather = effect;
- gWeatherPtr->unknown_6D1 = effect;
+ gWeatherPtr->nextWeather = effect;
gWeatherPtr->unknown_6C8 = 1;
}
-void sub_807C9E4(u8 taskId)
+void Task_WeatherInit(u8 taskId)
{
if (gWeatherPtr->unknown_6C8)
{
- gUnknown_08396FC8[gWeatherPtr->currWeather].func2();
- gTasks[taskId].func = sub_807CA34;
+ sWeatherFuncs[gWeatherPtr->currWeather].initAll();
+ gTasks[taskId].func = Task_WeatherMain;
}
}
-void sub_807CA34(u8 task)
+void Task_WeatherMain(u8 taskId)
{
- u8 v1;
- if (gWeatherPtr->currWeather != gWeatherPtr->unknown_6D1)
+ if (gWeatherPtr->currWeather != gWeatherPtr->nextWeather)
{
- v1 = gUnknown_08396FC8[gWeatherPtr->currWeather].func3();
- if (!v1)
+ if (!sWeatherFuncs[gWeatherPtr->currWeather].finish())
{
- gUnknown_08396FC8[gWeatherPtr->unknown_6D1].func0();
- gWeatherPtr->unknown_6C3 = 0; // compiler reuses v1
- gWeatherPtr->unknown_6C6 = 0; // compiler reuses v1
- gWeatherPtr->currWeather = gWeatherPtr->unknown_6D1;
+ sWeatherFuncs[gWeatherPtr->nextWeather].initVars();
+ gWeatherPtr->unknown_6C3 = 0;
+ gWeatherPtr->unknown_6C6 = 0;
+ gWeatherPtr->currWeather = gWeatherPtr->nextWeather;
gWeatherPtr->unknown_6D3 = 1;
}
}
else
{
- gUnknown_08396FC8[gWeatherPtr->currWeather].func1();
+ sWeatherFuncs[gWeatherPtr->currWeather].main();
}
gUnknown_083970B8[gWeatherPtr->unknown_6C6]();
}
-void sub_807CAE8(void)
+void None_Init(void)
{
gWeatherPtr->unknown_6C1 = 0;
gWeatherPtr->unknown_6C2 = 0;
}
-void nullsub_38(void)
+void None_Main(void)
{
}
-u8 sub_807CB0C(void)
+u8 None_Finish(void)
{
return 0;
}
@@ -627,14 +625,14 @@ void sub_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e)
}
}
-void sub_807D304(s8 a, u8 arg2, u16 c)
+void sub_807D304(s8 a, u8 coeff, u16 c)
{
struct RGBColor color;
u8 r_;
u8 g_;
u8 b_;
u16 r4;
- u16 r5;
+ u16 palOffset;
u16 r12;
a = -a - 1;
@@ -642,13 +640,13 @@ void sub_807D304(s8 a, u8 arg2, u16 c)
r_ = color.r;
g_ = color.g;
b_ = color.b;
- r5 = 0;
+ palOffset = 0;
for (r4 = 0; r4 < 32; r4++)
{
if (gUnknown_030006DC[r4] == 0)
{
- BlendPalette(r5, 16, arg2, c);
- r5 += 16;
+ BlendPalette(palOffset, 16, coeff, c);
+ palOffset += 16;
}
else
{
@@ -660,7 +658,7 @@ void sub_807D304(s8 a, u8 arg2, u16 c)
u8 r1, g1, b1;
u8 r2, g2, b2;
- color1 = *(struct RGBColor *)&gPlttBufferUnfaded[r5];
+ color1 = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
r1 = color1.r;
g1 = color1.g;
b1 = color1.b;
@@ -671,11 +669,11 @@ void sub_807D304(s8 a, u8 arg2, u16 c)
g2 = color2.g;
b2 = color2.b;
- r2 += ((r_ - r2) * arg2) >> 4;
- g2 += ((g_ - g2) * arg2) >> 4;
- b2 += ((b_ - b2) * arg2) >> 4;
+ r2 += ((r_ - r2) * coeff) >> 4;
+ g2 += ((g_ - g2) * coeff) >> 4;
+ b2 += ((b_ - b2) * coeff) >> 4;
- gPlttBufferFaded[r5++] = (b2 << 10) | (g2 << 5) | r2;
+ gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2;
}
}
}
@@ -775,28 +773,28 @@ void sub_807D5F0(u8 a, u8 b, u8 c)
}
}
-void fade_screen(u8 a, u8 b)
+void fade_screen(u8 a, u8 delay)
{
- u32 r4;
+ u32 fadeColor;
u32 r1;
u32 r2;
switch (a)
{
case 0:
- r4 = 0;
+ fadeColor = 0;
r1 = 0;
break;
case 2:
- r4 = 0xFFFF;
+ fadeColor = 0xFFFF;
r1 = 0;
break;
case 1:
- r4 = 0;
+ fadeColor = 0;
r1 = 1;
break;
case 3:
- r4 = 0xFFFF;
+ fadeColor = 0xFFFF;
r1 = 1;
break;
default:
@@ -823,20 +821,20 @@ void fade_screen(u8 a, u8 b)
{
if (r2 != 0)
CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
- BeginNormalPaletteFade(0xFFFFFFFF, b, 0, 16, r4);
+ BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor);
gWeatherPtr->unknown_6C6 = 2;
}
else
{
- gWeatherPtr->unknown_6C4 = r4;
+ gWeatherPtr->unknown_6C4 = fadeColor;
if (r2 != 0)
gWeatherPtr->unknown_6C7 = 0;
else
- BeginNormalPaletteFade(0xFFFFFFFF, b, 16, 0, r4);
+ BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor);
gWeatherPtr->unknown_6C6 = 1;
gWeatherPtr->unknown_6CA = 1;
gWeatherPtr->unknown_6CB = 0;
- sub_807DB64(gWeatherPtr->unknown_730, gWeatherPtr->unknown_732);
+ Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);
gWeatherPtr->unknown_6C8 = 1;
}
}
@@ -909,7 +907,7 @@ void sub_807D8F0(u8 *a, u8 *b)
if (r4 < 7)
{
r4--;
- LZ77UnCompWram(gUnknown_08396FA8[r4], eWeatherPaletteData.data[r4]);
+ LZ77UnCompWram(sCompressedDroughtPalettes[r4], eWeatherPaletteData.data[r4]);
if (r4 == 0)
{
eWeatherPaletteData.data[r4][0] = 0x421;
@@ -921,8 +919,7 @@ void sub_807D8F0(u8 *a, u8 *b)
for (i = 0; i < 0x1000; i++)
eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4 - 1][i];
}
- (*a)++;
- if (*a == 7)
+ if (++(*a) == 7)
{
*a = 32;
*b = 32;
@@ -997,52 +994,58 @@ void sub_807DA4C(void)
}
}
-void sub_807DB64(u8 a, u8 b)
+void Weather_SetBlendCoeffs(u8 eva, u8 evb)
{
- gWeatherPtr->unknown_730 = a;
- gWeatherPtr->unknown_732 = b;
- gWeatherPtr->unknown_734 = a;
- gWeatherPtr->unknown_736 = b;
- REG_BLDALPHA = (b << 8) | a;
+ gWeatherPtr->currBlendEVA = eva;
+ gWeatherPtr->currBlendEVB = evb;
+ gWeatherPtr->targetBlendEVA = eva;
+ gWeatherPtr->targetBlendEVB = evb;
+ REG_BLDALPHA = BLDALPHA_BLEND(eva, evb);
}
-void sub_807DBA4(u8 a, u8 b, int c)
+void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay)
{
- gWeatherPtr->unknown_734 = a;
- gWeatherPtr->unknown_736 = b;
- gWeatherPtr->unknown_73A = c;
+ gWeatherPtr->targetBlendEVA = eva;
+ gWeatherPtr->targetBlendEVB = evb;
+ gWeatherPtr->blendDelay = delay;
gWeatherPtr->unknown_739 = 0;
gWeatherPtr->unknown_738 = 0;
}
-bool8 sub_807DBE8(void)
+bool8 Weather_UpdateBlend(void)
{
- if (gWeatherPtr->unknown_730 == gWeatherPtr->unknown_734
- && gWeatherPtr->unknown_732 == gWeatherPtr->unknown_736)
+ if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA
+ && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)
return TRUE;
- if (++gWeatherPtr->unknown_739 > gWeatherPtr->unknown_73A)
+
+ if (++gWeatherPtr->unknown_739 > gWeatherPtr->blendDelay)
{
gWeatherPtr->unknown_739 = 0;
gWeatherPtr->unknown_738++;
+
+ // Update currBlendEVA and currBlendEVB on alternate frames
if (gWeatherPtr->unknown_738 & 1)
{
- if (gWeatherPtr->unknown_730 < gWeatherPtr->unknown_734)
- gWeatherPtr->unknown_730++;
- else if (gWeatherPtr->unknown_730 > gWeatherPtr->unknown_734)
- gWeatherPtr->unknown_730--;
+ if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA)
+ gWeatherPtr->currBlendEVA++;
+ else if (gWeatherPtr->currBlendEVA > gWeatherPtr->targetBlendEVA)
+ gWeatherPtr->currBlendEVA--;
}
else
{
- if (gWeatherPtr->unknown_732 < gWeatherPtr->unknown_736)
- gWeatherPtr->unknown_732++;
- else if (gWeatherPtr->unknown_732 > gWeatherPtr->unknown_736)
- gWeatherPtr->unknown_732--;
+ if (gWeatherPtr->currBlendEVB < gWeatherPtr->targetBlendEVB)
+ gWeatherPtr->currBlendEVB++;
+ else if (gWeatherPtr->currBlendEVB > gWeatherPtr->targetBlendEVB)
+ gWeatherPtr->currBlendEVB--;
}
}
- REG_BLDALPHA = (gWeatherPtr->unknown_732 << 8) | gWeatherPtr->unknown_730;
- if (gWeatherPtr->unknown_730 == gWeatherPtr->unknown_734
- && gWeatherPtr->unknown_732 == gWeatherPtr->unknown_736)
+
+ REG_BLDALPHA = BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);
+
+ if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA
+ && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)
return TRUE;
+
return FALSE;
}
diff --git a/src/field/field_weather_2.c b/src/field/field_weather_2.c
index fa97df459..d2ef34f6f 100644
--- a/src/field/field_weather_2.c
+++ b/src/field/field_weather_2.c
@@ -11,34 +11,28 @@
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 u8 gWeatherFog2Tiles[] = INCBIN_U8("graphics/weather/fog2.4bpp");
+const u8 gWeatherCloudTiles[] = INCBIN_U8("graphics/weather/cloud.4bpp");
+const u8 gWeatherSnow1Tiles[] = INCBIN_U8("graphics/weather/snow0.4bpp");
+const u8 gWeatherSnow2Tiles[] = INCBIN_U8("graphics/weather/snow1.4bpp");
+const u8 gWeatherBubbleTiles[] = INCBIN_U8("graphics/weather/bubble.4bpp");
+const u8 gWeatherAshTiles[] = INCBIN_U8("graphics/weather/ash.4bpp");
+const u8 gWeatherRainTiles[] = INCBIN_U8("graphics/weather/rain.4bpp");
+const u8 gWeatherSandstormTiles[] = INCBIN_U8("graphics/weather/sandstorm.4bpp");
-const struct Coords16 gUnknown_0839A9C8[] =
+static const struct Coords16 gUnknown_0839A9C8[] =
{
{ 0, 66},
{ 5, 73},
{10, 78},
};
-const struct SpriteSheet gWeatherCloudSpriteSheet = {WeatherCloudTiles, 0x800, 0x1200};
+static const struct SpriteSheet sCloudSpriteSheet = {gWeatherCloudTiles, 0x800, 0x1200};
-const struct OamData gOamData_839A9DC =
+static const struct OamData gOamData_839A9DC =
{
.y = 0,
.affineMode = 0,
@@ -55,19 +49,19 @@ const struct OamData gOamData_839A9DC =
.affineParam = 0,
};
-const union AnimCmd gSpriteAnim_839A9E4[] =
+static const union AnimCmd gSpriteAnim_839A9E4[] =
{
ANIMCMD_FRAME(0, 16),
ANIMCMD_END,
};
-const union AnimCmd *const gSpriteAnimTable_839A9EC[] =
+static const union AnimCmd *const gSpriteAnimTable_839A9EC[] =
{
gSpriteAnim_839A9E4,
};
void sub_807E0F4(struct Sprite *);
-const struct SpriteTemplate gSpriteTemplate_839A9F0 =
+static const struct SpriteTemplate sCloudSpriteTemplate =
{
.tileTag = 4608,
.paletteTag = 4609,
@@ -84,8 +78,8 @@ 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 Weather_SetTargetBlendCoeffs(u8 a, u8 b, int c);
+extern bool8 Weather_UpdateBlend(void);
extern void SetRainStrengthFromSoundEffect(u16 sndEff);
extern void sub_807D5F0(u8 a, u8 b, u8 c);
@@ -93,44 +87,44 @@ extern void sub_807D5F0(u8 a, u8 b, u8 c);
// Clouds
//------------------------------------------------------------------------------
-void sub_807DE78(void)
+void Clouds_InitVars(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);
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->initStep = 0;
+ if (gWeatherPtr->cloudsActive == FALSE)
+ Weather_SetBlendCoeffs(0, 16);
}
-void sub_807DEF4(void);
+void Clouds_Main(void);
-void sub_807DEC4(void)
+void Clouds_InitAll(void)
{
- sub_807DE78();
- while (gWeatherPtr->unknown_6D2 == 0)
- sub_807DEF4();
+ Clouds_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Clouds_Main();
}
-void sub_807DFD4(void);
+void CreateCloudSprites(void);
-void sub_807DEF4(void)
+void Clouds_Main(void)
{
- switch (gWeatherPtr->unknown_6CC)
+ switch (gWeatherPtr->initStep)
{
case 0:
- sub_807DFD4();
- gWeatherPtr->unknown_6CC++;
+ CreateCloudSprites();
+ gWeatherPtr->initStep++;
break;
case 1:
- sub_807DBA4(12, 8, 1);
- gWeatherPtr->unknown_6CC++;
+ Weather_SetTargetBlendCoeffs(12, 8, 1);
+ gWeatherPtr->initStep++;
break;
case 2:
- if (sub_807DBE8())
+ if (Weather_UpdateBlend())
{
- gWeatherPtr->unknown_6D2 = 1;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
}
break;
}
@@ -138,16 +132,16 @@ void sub_807DEF4(void)
void sub_807E0A0(void);
-bool8 sub_807DF54(void)
+bool8 Clouds_Finish(void)
{
switch (gWeatherPtr->unknown_6CE)
{
case 0:
- sub_807DBA4(0, 16, 1);
+ Weather_SetTargetBlendCoeffs(0, 16, 1);
gWeatherPtr->unknown_6CE++;
return TRUE;
case 1:
- if (sub_807DBE8())
+ if (Weather_UpdateBlend())
{
sub_807E0A0();
gWeatherPtr->unknown_6CE++;
@@ -177,17 +171,17 @@ int sub_807DFD0(void)
return 0;
}
-void sub_807DFD4(void)
+void CreateCloudSprites(void)
{
u16 i;
- if (gWeatherPtr->unknown_6DE == 1)
+ if (gWeatherPtr->cloudsActive == TRUE)
return;
- LoadSpriteSheet(&gWeatherCloudSpriteSheet);
+ LoadSpriteSheet(&sCloudSpriteSheet);
sub_807D8C0(gUnknown_08397108);
for (i = 0; i < 3; i++)
{
- u8 spriteId = CreateSprite(&gSpriteTemplate_839A9F0, 0, 0, 0xFF);
+ u8 spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF);
if (spriteId != 64)
{
@@ -203,14 +197,14 @@ void sub_807DFD4(void)
gWeatherPtr->cloudSprites[i] = NULL;
}
}
- gWeatherPtr->unknown_6DE = 1;
+ gWeatherPtr->cloudsActive = TRUE;
}
void sub_807E0A0(void)
{
u16 i;
- if (gWeatherPtr->unknown_6DE == 0)
+ if (gWeatherPtr->cloudsActive == FALSE)
return;
for (i = 0; i < 3; i++)
{
@@ -218,7 +212,7 @@ void sub_807E0A0(void)
DestroySprite(gWeatherPtr->cloudSprites[i]);
}
FreeSpriteTilesByTag(0x1200);
- gWeatherPtr->unknown_6DE = 0;
+ gWeatherPtr->cloudsActive = FALSE;
}
void sub_807E0F4(struct Sprite *sprite)
@@ -230,8 +224,8 @@ void sub_807E0F4(struct Sprite *sprite)
void sub_807E110(void)
{
- gWeatherPtr->unknown_6CC = 0;
- gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
gWeatherPtr->unknown_6C1 = 0;
gWeatherPtr->unknown_6C2 = 0;
}
@@ -241,36 +235,36 @@ void sub_807E174(void);
void sub_807E144(void)
{
sub_807E110();
- while (gWeatherPtr->unknown_6D2 == 0)
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
sub_807E174();
}
void sub_807E174(void)
{
- switch (gWeatherPtr->unknown_6CC)
+ switch (gWeatherPtr->initStep)
{
case 0:
if (gWeatherPtr->unknown_6C6 != 0)
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
break;
case 1:
sub_807D9A8();
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
break;
case 2:
if (sub_807D9C8() == FALSE)
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
break;
case 3:
sub_807DA14();
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
break;
case 4:
sub_807DA4C();
if (gWeatherPtr->unknown_73C == 6)
{
- gWeatherPtr->unknown_6D2 = 1;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
}
break;
default:
@@ -307,7 +301,8 @@ void task50_0807B6D4(u8 taskId)
task->tBlendDelay = 0;
task->tWinRange = REG_WININ;
REG_WININ = WIN_RANGE(63, 63);
- REG_BLDCNT = 0x9E;
+ REG_BLDCNT = BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ
+ | BLDCNT_EFFECT_LIGHTEN;
REG_BLDY = 0;
task->tState++;
// fall through
@@ -357,8 +352,8 @@ void task50_0807B6D4(u8 taskId)
void LightRain_InitVars(void)
{
- gWeatherPtr->unknown_6CC = 0;
- gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
gWeatherPtr->unknown_6D6 = 0;
gWeatherPtr->unknown_6DB = 8;
gWeatherPtr->unknown_6DC = 0;
@@ -368,36 +363,36 @@ void LightRain_InitVars(void)
SetRainStrengthFromSoundEffect(SE_T_KOAME);
}
-void sub_807E400(void);
+void LightRain_Main(void);
-void sub_807E3D0(void)
+void LightRain_InitAll(void)
{
LightRain_InitVars();
- while (gWeatherPtr->unknown_6D2 == 0)
- sub_807E400();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ LightRain_Main();
}
-void sub_807E7A4(void);
-u8 sub_807E7B4(void);
+void LoadRainSpriteSheet(void);
+u8 CreateRainSprites(void);
u8 sub_807E8E8(void);
-void sub_807E400(void)
+void LightRain_Main(void)
{
- switch (gWeatherPtr->unknown_6CC)
+ switch (gWeatherPtr->initStep)
{
case 0:
- sub_807E7A4();
- gWeatherPtr->unknown_6CC++;
+ LoadRainSpriteSheet();
+ gWeatherPtr->initStep++;
break;
case 1:
- if (sub_807E7B4() == 0)
- gWeatherPtr->unknown_6CC++;
+ if (CreateRainSprites() == 0)
+ gWeatherPtr->initStep++;
break;
case 2:
if (sub_807E8E8() == FALSE)
{
- gWeatherPtr->unknown_6D2 = 1;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
}
break;
}
@@ -405,14 +400,14 @@ void sub_807E400(void)
void sub_807E974(void);
-bool8 sub_807E460(void)
+bool8 LightRain_Finish(void)
{
switch (gWeatherPtr->unknown_6CE)
{
case 0:
- if (gWeatherPtr->unknown_6D1 == 3
- || gWeatherPtr->unknown_6D1 == 5
- || gWeatherPtr->unknown_6D1 == 13)
+ if (gWeatherPtr->nextWeather == WEATHER_RAIN_LIGHT
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_MED
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_HEAVY)
{
gWeatherPtr->unknown_6CE = 0xFF;
return FALSE;
@@ -542,11 +537,11 @@ void sub_807E6F0(struct Sprite *sprite, u16 b)
}
}
-extern const struct SpriteSheet gUnknown_0839AACC; // defined below
+extern const struct SpriteSheet sRainSpriteSheet; // defined below
-void sub_807E7A4(void)
+void LoadRainSpriteSheet(void)
{
- LoadSpriteSheet(&gUnknown_0839AACC);
+ LoadSpriteSheet(&sRainSpriteSheet);
}
const struct Coords16 gUnknown_0839AA08[] =
@@ -577,7 +572,7 @@ const struct Coords16 gUnknown_0839AA08[] =
{ 48, 96},
};
-const struct OamData gOamData_839AA68 =
+static const struct OamData gOamData_839AA68 =
{
.y = 0,
.affineMode = 0,
@@ -594,13 +589,13 @@ const struct OamData gOamData_839AA68 =
.affineParam = 0,
};
-const union AnimCmd gSpriteAnim_839AA70[] =
+static const union AnimCmd gSpriteAnim_839AA70[] =
{
ANIMCMD_FRAME(0, 16),
ANIMCMD_JUMP(0),
};
-const union AnimCmd gSpriteAnim_839AA78[] =
+static const union AnimCmd gSpriteAnim_839AA78[] =
{
ANIMCMD_FRAME(8, 3),
ANIMCMD_FRAME(32, 2),
@@ -608,7 +603,7 @@ const union AnimCmd gSpriteAnim_839AA78[] =
ANIMCMD_END,
};
-const union AnimCmd gSpriteAnim_839AA88[] =
+static const union AnimCmd gSpriteAnim_839AA88[] =
{
ANIMCMD_FRAME(8, 3),
ANIMCMD_FRAME(16, 3),
@@ -616,14 +611,14 @@ const union AnimCmd gSpriteAnim_839AA88[] =
ANIMCMD_END,
};
-const union AnimCmd *const gSpriteAnimTable_839AA98[] =
+static const union AnimCmd *const gSpriteAnimTable_839AA98[] =
{
gSpriteAnim_839AA70,
gSpriteAnim_839AA78,
gSpriteAnim_839AA88,
};
-const struct SpriteTemplate gSpriteTemplate_839AAA4 =
+static const struct SpriteTemplate sRainSpriteTemplate =
{
.tileTag = 4614,
.paletteTag = 4608,
@@ -647,9 +642,9 @@ const u16 gUnknown_0839AAC4[][2] =
{12, 10},
};
-const struct SpriteSheet gUnknown_0839AACC = {WeatherRainTiles, sizeof(WeatherRainTiles), 0x1206};
+static const struct SpriteSheet sRainSpriteSheet = {gWeatherRainTiles, sizeof(gWeatherRainTiles), 0x1206};
-const struct OamData gOamData_839AAD4 =
+static const struct OamData gOamData_839AAD4 =
{
.y = 0,
.affineMode = 0,
@@ -666,32 +661,32 @@ const struct OamData gOamData_839AAD4 =
.affineParam = 0,
};
-const struct SpriteFrameImage gSpriteImageTable_839AADC[] =
+static const struct SpriteFrameImage gSpriteImageTable_839AADC[] =
{
- {gSpriteImage_8398948, sizeof(gSpriteImage_8398948)},
- {gSpriteImage_8398968, sizeof(gSpriteImage_8398968)},
+ {gWeatherSnow1Tiles, sizeof(gWeatherSnow1Tiles)},
+ {gWeatherSnow2Tiles, sizeof(gWeatherSnow2Tiles)},
};
-const union AnimCmd gSpriteAnim_839AAEC[] =
+static const union AnimCmd gSpriteAnim_839AAEC[] =
{
ANIMCMD_FRAME(0, 16),
ANIMCMD_END,
};
-const union AnimCmd gSpriteAnim_839AAF4[] =
+static const union AnimCmd gSpriteAnim_839AAF4[] =
{
ANIMCMD_FRAME(1, 16),
ANIMCMD_END,
};
-const union AnimCmd *const gSpriteAnimTable_839AAFC[] =
+static const union AnimCmd *const gSpriteAnimTable_839AAFC[] =
{
gSpriteAnim_839AAEC,
gSpriteAnim_839AAF4,
};
void sub_807ED48(struct Sprite *);
-const struct SpriteTemplate gSpriteTemplate_839AB04 =
+static const struct SpriteTemplate sSnowflakeSpriteTemplate =
{
.tileTag = 0xFFFF,
.paletteTag = 4608,
@@ -703,9 +698,9 @@ const struct SpriteTemplate gSpriteTemplate_839AB04 =
};
// unused data
-const u16 unusedData_839AB1C[] = {0, 6, 6, 12, 18, 42, 300, 300};
+static const u16 unusedData_839AB1C[] = {0, 6, 6, 12, 18, 42, 300, 300};
-const struct OamData gOamData_839AB2C =
+static const struct OamData gOamData_839AB2C =
{
.y = 0,
.affineMode = 0,
@@ -722,43 +717,43 @@ const struct OamData gOamData_839AB2C =
.affineParam = 0,
};
-const union AnimCmd gSpriteAnim_839AB34[] =
+static const union AnimCmd gSpriteAnim_839AB34[] =
{
ANIMCMD_FRAME(0, 16),
ANIMCMD_END,
};
-const union AnimCmd gSpriteAnim_839AB3C[] =
+static const union AnimCmd gSpriteAnim_839AB3C[] =
{
ANIMCMD_FRAME(32, 16),
ANIMCMD_END,
};
-const union AnimCmd gSpriteAnim_839AB44[] =
+static const union AnimCmd gSpriteAnim_839AB44[] =
{
ANIMCMD_FRAME(64, 16),
ANIMCMD_END,
};
-const union AnimCmd gSpriteAnim_839AB4C[] =
+static const union AnimCmd gSpriteAnim_839AB4C[] =
{
ANIMCMD_FRAME(96, 16),
ANIMCMD_END,
};
-const union AnimCmd gSpriteAnim_839AB54[] =
+static const union AnimCmd gSpriteAnim_839AB54[] =
{
ANIMCMD_FRAME(128, 16),
ANIMCMD_END,
};
-const union AnimCmd gSpriteAnim_839AB5C[] =
+static const union AnimCmd gSpriteAnim_839AB5C[] =
{
ANIMCMD_FRAME(160, 16),
ANIMCMD_END,
};
-const union AnimCmd *const gSpriteAnimTable_839AB64[] =
+static const union AnimCmd *const gSpriteAnimTable_839AB64[] =
{
gSpriteAnim_839AB34,
gSpriteAnim_839AB3C,
@@ -768,19 +763,19 @@ const union AnimCmd *const gSpriteAnimTable_839AB64[] =
gSpriteAnim_839AB5C,
};
-const union AffineAnimCmd gSpriteAffineAnim_839AB7C[] =
+static const union AffineAnimCmd gSpriteAffineAnim_839AB7C[] =
{
AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
AFFINEANIMCMD_END,
};
-const union AffineAnimCmd *const gSpriteAffineAnimTable_839AB8C[] =
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_839AB8C[] =
{
gSpriteAffineAnim_839AB7C,
};
-void sub_807F688(struct Sprite *);
-const struct SpriteTemplate gSpriteTemplate_839AB90 =
+static void Fog2SpriteCallback(struct Sprite *);
+static const struct SpriteTemplate sFog2SpriteTemplate =
{
.tileTag = 4609,
.paletteTag = 4608,
@@ -788,145 +783,10 @@ const struct SpriteTemplate gSpriteTemplate_839AB90 =
.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,
+ .callback = Fog2SpriteCallback,
};
-const struct SpriteSheet gWeatherSandstormSpriteSheet = {WeatherSandstormTiles, sizeof(WeatherSandstormTiles), 0x1204};
-
-bool8 sub_807E7B4(void)
+bool8 CreateRainSprites(void)
{
u8 r7;
u8 spriteId;
@@ -935,7 +795,7 @@ bool8 sub_807E7B4(void)
return FALSE;
r7 = gWeatherPtr->unknown_6DA;
- spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839AAA4,
+ spriteId = CreateSpriteAtEnd(&sRainSpriteTemplate,
gUnknown_0839AA08[r7].x, gUnknown_0839AA08[r7].y, 78);
if (spriteId != 64)
{
@@ -946,11 +806,11 @@ bool8 sub_807E7B4(void)
sub_807E4EC(&gSprites[spriteId]);
sub_807E6F0(&gSprites[spriteId], r7 * 9);
gSprites[spriteId].invisible = TRUE;
- gWeatherPtr->unknown_0[r7] = &gSprites[spriteId];
+ gWeatherPtr->rainSprites[r7] = &gSprites[spriteId];
}
else
{
- gWeatherPtr->unknown_0[r7] = NULL;
+ gWeatherPtr->rainSprites[r7] = NULL;
}
if (++gWeatherPtr->unknown_6DA == 24)
@@ -959,12 +819,12 @@ bool8 sub_807E7B4(void)
for (i = 0; i < 24; i++)
{
- if (gWeatherPtr->unknown_0[i] != NULL)
+ if (gWeatherPtr->rainSprites[i] != NULL)
{
- if (gWeatherPtr->unknown_0[i]->data[6] == 0)
- gWeatherPtr->unknown_0[i]->callback = sub_807E5C0;
+ if (gWeatherPtr->rainSprites[i]->data[6] == 0)
+ gWeatherPtr->rainSprites[i]->callback = sub_807E5C0;
else
- gWeatherPtr->unknown_0[i]->callback = sub_807E6C4;
+ gWeatherPtr->rainSprites[i]->callback = sub_807E6C4;
}
}
return FALSE;
@@ -982,13 +842,13 @@ bool8 sub_807E8E8(void)
gWeatherPtr->unknown_6D6 = 0;
if (gWeatherPtr->unknown_6D8 < gWeatherPtr->unknown_6D9)
{
- gWeatherPtr->unknown_0[gWeatherPtr->unknown_6D8++]->data[5] = 1;
+ gWeatherPtr->rainSprites[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;
+ gWeatherPtr->rainSprites[gWeatherPtr->unknown_6D8]->data[5] = 0;
+ gWeatherPtr->rainSprites[gWeatherPtr->unknown_6D8]->invisible = TRUE;
}
}
return TRUE;
@@ -1000,8 +860,8 @@ void sub_807E974(void)
for (i = 0; i < gWeatherPtr->unknown_6DA; i++)
{
- if (gWeatherPtr->unknown_0[i] != NULL)
- DestroySprite(gWeatherPtr->unknown_0[i]);
+ if (gWeatherPtr->rainSprites[i] != NULL)
+ DestroySprite(gWeatherPtr->rainSprites[i]);
}
gWeatherPtr->unknown_6DA = 0;
FreeSpriteTilesByTag(0x1206);
@@ -1013,26 +873,26 @@ void sub_807E974(void)
void Snow_InitVars(void)
{
- gWeatherPtr->unknown_6CC = 0;
- gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
gWeatherPtr->unknown_6C1 = 3;
gWeatherPtr->unknown_6C2 = 20;
gWeatherPtr->unknown_6E5 = 16;
gWeatherPtr->unknown_6E0 = 0;
}
-void snowflakes_progress2(void);
+void Snow_Main(void);
void sub_807ED48(struct Sprite *);
-void sub_807EA18(void)
+void Snow_InitAll(void)
{
Snow_InitVars();
- while (gWeatherPtr->unknown_6D2 == 0)
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
{
u16 i;
- snowflakes_progress2();
- for (i = 0; i < gWeatherPtr->unknown_6E4; i++)
+ Snow_Main();
+ for (i = 0; i < gWeatherPtr->snowflakeSpriteCount; i++)
{
sub_807ED48(gWeatherPtr->snowflakeSprites[i]);
}
@@ -1041,16 +901,16 @@ void sub_807EA18(void)
u8 snowflakes_progress(void);
-void snowflakes_progress2(void)
+void Snow_Main(void)
{
- if (gWeatherPtr->unknown_6CC == 0 && snowflakes_progress() == FALSE)
+ if (gWeatherPtr->initStep == 0 && snowflakes_progress() == FALSE)
{
- gWeatherPtr->unknown_6D2 = 1;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
}
}
-bool8 sub_807EAC0(void)
+bool8 Snow_Finish(void)
{
switch (gWeatherPtr->unknown_6CE)
{
@@ -1070,46 +930,46 @@ bool8 sub_807EAC0(void)
return FALSE;
}
-bool8 snowflake_add(void);
-bool8 snowflake_remove(void);
+bool8 CreateSnowflakeSprite(void);
+bool8 RemoveSnowflakeSprite(void);
bool8 snowflakes_progress(void)
{
- if (gWeatherPtr->unknown_6E4 == gWeatherPtr->unknown_6E5)
+ if (gWeatherPtr->snowflakeSpriteCount == 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();
+ if (gWeatherPtr->snowflakeSpriteCount < gWeatherPtr->unknown_6E5)
+ CreateSnowflakeSprite();
else
- snowflake_remove();
+ RemoveSnowflakeSprite();
}
- return (gWeatherPtr->unknown_6E4 != gWeatherPtr->unknown_6E5);
+ return (gWeatherPtr->snowflakeSpriteCount != gWeatherPtr->unknown_6E5);
}
void sub_807EC40(struct Sprite *);
-bool8 snowflake_add(void)
+bool8 CreateSnowflakeSprite(void)
{
- u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839AB04, 0, 0, 78);
+ u8 spriteId = CreateSpriteAtEnd(&sSnowflakeSpriteTemplate, 0, 0, 78);
if (spriteId == 64)
return FALSE;
- gSprites[spriteId].data[4] = gWeatherPtr->unknown_6E4;
+ gSprites[spriteId].data[4] = gWeatherPtr->snowflakeSpriteCount;
sub_807EC40(&gSprites[spriteId]);
gSprites[spriteId].coordOffsetEnabled = TRUE;
- gWeatherPtr->snowflakeSprites[gWeatherPtr->unknown_6E4++] = &gSprites[spriteId];
+ gWeatherPtr->snowflakeSprites[gWeatherPtr->snowflakeSpriteCount++] = &gSprites[spriteId];
return TRUE;
}
-bool8 snowflake_remove(void)
+bool8 RemoveSnowflakeSprite(void)
{
- if (gWeatherPtr->unknown_6E4 != 0)
+ if (gWeatherPtr->snowflakeSpriteCount != 0)
{
- DestroySprite(gWeatherPtr->snowflakeSprites[--gWeatherPtr->unknown_6E4]);
+ DestroySprite(gWeatherPtr->snowflakeSprites[--gWeatherPtr->snowflakeSpriteCount]);
return TRUE;
}
return FALSE;
@@ -1196,108 +1056,108 @@ void sub_807ED48(struct Sprite *sprite)
// Medium Rain
//------------------------------------------------------------------------------
-void sub_807EE80(void)
+void MedRain_InitVars(void)
{
- gWeatherPtr->unknown_6CC = 0;
- gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
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->weatherGfxLoaded = FALSE; // duplicate assignment
gWeatherPtr->unknown_6ED = 0;
SetRainStrengthFromSoundEffect(SE_T_AME);
}
-void sub_807EFC0(void);
+void Rain_Main(void);
-void sub_807EEF4(void)
+void MedRain_InitAll(void)
{
- sub_807EE80();
- while (gWeatherPtr->unknown_6D2 == 0)
- sub_807EFC0();
+ MedRain_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Rain_Main();
}
//------------------------------------------------------------------------------
// Heavy Rain
//------------------------------------------------------------------------------
-void sub_807EF24(void)
+void HeavyRain_InitVars(void)
{
- gWeatherPtr->unknown_6CC = 0;
- gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
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
+ gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment
SetRainStrengthFromSoundEffect(SE_T_OOAME);
}
-void sub_807EF90(void)
+void HeavyRain_InitAll(void)
{
- sub_807EF24();
- while (gWeatherPtr->unknown_6D2 == 0)
- sub_807EFC0();
+ HeavyRain_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Rain_Main();
}
-void sub_807F434(void);
-void sub_807F3F8(u16);
+void UpdateThunderSound(void);
+void SetThunderCounter(u16);
-void sub_807EFC0(void)
+void Rain_Main(void)
{
- sub_807F434();
- switch (gWeatherPtr->unknown_6CC)
+ UpdateThunderSound();
+ switch (gWeatherPtr->initStep)
{
case 0:
- sub_807E7A4();
- gWeatherPtr->unknown_6CC++;
+ LoadRainSpriteSheet();
+ gWeatherPtr->initStep++;
break;
case 1:
- if (sub_807E7B4())
+ if (CreateRainSprites())
break;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
break;
case 2:
if (sub_807E8E8())
break;
- gWeatherPtr->unknown_6D2 = 1;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
break;
case 3:
if (gWeatherPtr->unknown_6C6 == 0)
break;
- gWeatherPtr->unknown_6CC = 6;
+ gWeatherPtr->initStep = 6;
break;
case 4:
gWeatherPtr->unknown_6EA = 1;
gWeatherPtr->unknown_6E6 = (Random() % 360) + 360;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
// fall through
case 5:
if (--gWeatherPtr->unknown_6E6 != 0)
break;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
break;
case 6:
gWeatherPtr->unknown_6EA = 1;
gWeatherPtr->unknown_6EB = Random() % 2;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
break;
case 7:
gWeatherPtr->unknown_6EC = (Random() & 1) + 1;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
// fall through
case 8:
sub_807D5BC(19);
if (gWeatherPtr->unknown_6EB == 0 && gWeatherPtr->unknown_6EC == 1)
- sub_807F3F8(20);
+ SetThunderCounter(20);
gWeatherPtr->unknown_6E6 = (Random() % 3) + 6;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
break;
case 9:
if (--gWeatherPtr->unknown_6E6 != 0)
@@ -1307,51 +1167,51 @@ void sub_807EFC0(void)
if (--gWeatherPtr->unknown_6EC != 0)
{
gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
- gWeatherPtr->unknown_6CC = 10;
+ gWeatherPtr->initStep = 10;
}
else if (gWeatherPtr->unknown_6EB == 0)
{
- gWeatherPtr->unknown_6CC = 4;
+ gWeatherPtr->initStep = 4;
}
else
{
- gWeatherPtr->unknown_6CC = 11;
+ gWeatherPtr->initStep = 11;
}
break;
case 10:
if (--gWeatherPtr->unknown_6E6 != 0)
break;
- gWeatherPtr->unknown_6CC = 8;
+ gWeatherPtr->initStep = 8;
break;
case 11:
gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
break;
case 12:
if (--gWeatherPtr->unknown_6E6 != 0)
break;
- sub_807F3F8(100);
+ SetThunderCounter(100);
sub_807D5BC(19);
// Why use "% 16" everywhere else and "& 0xF" here. So dumb.
gWeatherPtr->unknown_6E6 = (Random() & 0xF) + 30;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
break;
case 13:
if (--gWeatherPtr->unknown_6E6 != 0)
break;
sub_807D5F0(19, 3, 5);
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->initStep++;
break;
case 14:
if (gWeatherPtr->unknown_6C6 != 3)
break;
gWeatherPtr->unknown_6EA = 1;
- gWeatherPtr->unknown_6CC = 4;
+ gWeatherPtr->initStep = 4;
break;
}
}
-bool8 sub_807F34C(void)
+bool8 Rain_Finish(void)
{
switch (gWeatherPtr->unknown_6CE)
{
@@ -1360,12 +1220,12 @@ bool8 sub_807F34C(void)
gWeatherPtr->unknown_6CE++;
// fall through
case 1:
- sub_807EFC0();
+ Rain_Main();
if (gWeatherPtr->unknown_6EA != 0)
{
- if (gWeatherPtr->unknown_6D1 == 3
- || gWeatherPtr->unknown_6D1 == 5
- || gWeatherPtr->unknown_6D1 == 13)
+ if (gWeatherPtr->nextWeather == WEATHER_RAIN_LIGHT
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_MED
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_HEAVY)
return FALSE;
gWeatherPtr->unknown_6D9 = 0;
gWeatherPtr->unknown_6CE++;
@@ -1384,20 +1244,20 @@ bool8 sub_807F34C(void)
return TRUE;
}
-void sub_807F3F8(u16 a)
+void SetThunderCounter(u16 max)
{
if (gWeatherPtr->unknown_6ED == 0)
{
- gWeatherPtr->unknown_6E8 = Random() % a;
+ gWeatherPtr->thunderCounter = Random() % max;
gWeatherPtr->unknown_6ED = 1;
}
}
-void sub_807F434(void)
+void UpdateThunderSound(void)
{
if (gWeatherPtr->unknown_6ED == 1)
{
- if (gWeatherPtr->unknown_6E8 == 0)
+ if (gWeatherPtr->thunderCounter == 0)
{
if (IsSEPlaying())
return;
@@ -1409,70 +1269,72 @@ void sub_807F434(void)
}
else
{
- gWeatherPtr->unknown_6E8--;
+ gWeatherPtr->thunderCounter--;
}
}
}
-void sub_807F49C(void)
+//------------------------------------------------------------------------------
+// Fog 2
+//------------------------------------------------------------------------------
+
+void Fog2_Main(void);
+static void CreateFog2Sprites(void);
+static void DestroyFog2Sprites(void);
+
+void Fog2_InitVars(void)
{
- gWeatherPtr->unknown_6CC = 0;
- gWeatherPtr->unknown_6D2 = 0;
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
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);
+ gWeatherPtr->fog2ScrollPosX = 0;
+ Weather_SetBlendCoeffs(0, 16);
}
}
-void sub_807F52C(void);
-
-void sub_807F4FC(void)
+void Fog2_InitAll(void)
{
- sub_807F49C();
- while (gWeatherPtr->unknown_6D2 == 0)
- sub_807F52C();
+ Fog2_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Fog2_Main();
}
-void sub_807F6E8(void);
-
-void sub_807F52C(void)
+void Fog2_Main(void)
{
- gWeatherPtr->unknown_6EE = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
+ gWeatherPtr->fog2ScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
if (++gWeatherPtr->unknown_6F0 > 3)
{
gWeatherPtr->unknown_6F0 = 0;
gWeatherPtr->unknown_6F2++;
}
- switch (gWeatherPtr->unknown_6CC)
+ switch (gWeatherPtr->initStep)
{
case 0:
- sub_807F6E8();
- if (gWeatherPtr->currWeather == 6)
- sub_807DBA4(12, 8, 3);
+ CreateFog2Sprites();
+ if (gWeatherPtr->currWeather == WEATHER_FOG_2)
+ Weather_SetTargetBlendCoeffs(12, 8, 3);
else
- sub_807DBA4(4, 16, 0);
- gWeatherPtr->unknown_6CC++;
+ Weather_SetTargetBlendCoeffs(4, 16, 0);
+ gWeatherPtr->initStep++;
break;
case 1:
- if (sub_807DBE8())
+ if (Weather_UpdateBlend())
{
- gWeatherPtr->unknown_6D2 = 1;
- gWeatherPtr->unknown_6CC++;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
}
break;
}
}
-void sub_807F7A4(void);
-
-bool8 sub_807F5EC(void)
+bool8 Fog2_Finish(void)
{
- gWeatherPtr->unknown_6EE = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
+ gWeatherPtr->fog2ScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
if (++gWeatherPtr->unknown_6F0 > 3)
{
gWeatherPtr->unknown_6F0 = 0;
@@ -1481,16 +1343,16 @@ bool8 sub_807F5EC(void)
switch (gWeatherPtr->unknown_6CE)
{
case 0:
- sub_807DBA4(0, 16, 3);
+ Weather_SetTargetBlendCoeffs(0, 16, 3);
gWeatherPtr->unknown_6CE++;
break;
case 1:
- if (!sub_807DBE8())
+ if (!Weather_UpdateBlend())
break;
gWeatherPtr->unknown_6CE++;
break;
case 2:
- sub_807F7A4();
+ DestroyFog2Sprites();
gWeatherPtr->unknown_6CE++;
break;
default:
@@ -1499,13 +1361,289 @@ bool8 sub_807F5EC(void)
return TRUE;
}
-void sub_807F688(struct Sprite *sprite)
+#define sprColumn data[0]
+
+static void Fog2SpriteCallback(struct Sprite *sprite)
{
sprite->pos2.y = (u8)gSpriteCoordOffsetY;
- sprite->pos1.x = gWeatherPtr->unknown_6EE + 32 + sprite->data[0] * 64;
+ sprite->pos1.x = gWeatherPtr->fog2ScrollPosX + 32 + sprite->sprColumn * 64;
if (sprite->pos1.x > 0x10F)
{
- sprite->pos1.x = 480 + gWeatherPtr->unknown_6EE - (4 - sprite->data[0]) * 64;
+ sprite->pos1.x = 480 + gWeatherPtr->fog2ScrollPosX - (4 - sprite->sprColumn) * 64;
sprite->pos1.x &= 0x1FF;
}
}
+
+static void CreateFog2Sprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->unknown_6FB == 0)
+ {
+ struct SpriteSheet fog2SpriteSheet = {gWeatherFog2Tiles, sizeof(gWeatherFog2Tiles), 0x1201};
+
+ LoadSpriteSheet(&fog2SpriteSheet);
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sFog2SpriteTemplate, 0, 0, 0xFF);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ sprite->sprColumn = i % 5;
+ sprite->pos1.x = (i % 5) * 64 + 32;
+ sprite->pos1.y = (i / 5) * 64 + 32;
+ ((struct Weather2 *)gWeatherPtr)->fogSprites[i] = sprite;
+ }
+ else
+ {
+ ((struct Weather2 *)gWeatherPtr)->fogSprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->unknown_6FB = 1;
+ }
+}
+
+#undef sprColumn
+
+static void DestroyFog2Sprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->unknown_6FB != 0)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (((struct Weather2 *)gWeatherPtr)->fogSprites[i] != NULL)
+ DestroySprite(((struct Weather2 *)gWeatherPtr)->fogSprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1201);
+ gWeatherPtr->unknown_6FB = 0;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Fog 1
+//------------------------------------------------------------------------------
+
+void Fog1_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6FE = 20;
+ if (gWeatherPtr->unknown_700 == 0)
+ {
+ Weather_SetBlendCoeffs(0, 16);
+ REG_BLDALPHA = BLDALPHA_BLEND(64, 63); // Those aren't even valid coefficients!
+ }
+}
+
+void sub_807F888(void);
+
+void sub_807F858(void)
+{
+ Fog1_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ sub_807F888();
+}
+
+void sub_807F99C(void);
+void sub_807F9AC(void);
+
+void sub_807F888(void)
+{
+ gWeatherPtr->unknown_6FC = gSpriteCoordOffsetX & 0x1FF;
+ while (gWeatherPtr->unknown_6FC > 0xEF)
+ gWeatherPtr->unknown_6FC -= 0xF0;
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ sub_807F99C();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (gWeatherPtr->unknown_700 == 0)
+ sub_807F9AC();
+ Weather_SetTargetBlendCoeffs(16, 0, 1);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ default:
+ Weather_UpdateBlend();
+ break;
+ }
+}
+
+void sub_807FA54(void);
+
+bool8 sub_807F934(void)
+{
+ switch (gWeatherPtr->unknown_6CE)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 1);
+ gWeatherPtr->unknown_6CE++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ sub_807FA54();
+ gWeatherPtr->unknown_6CE++;
+ break;
+ case 2:
+ REG_BLDALPHA = 0;
+ gWeatherPtr->unknown_6CE++;
+ return FALSE;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+const struct SpriteSheet gWeatherAshSpriteSheet = {gWeatherAshTiles, sizeof(gWeatherAshTiles), 0x1202};
+
+void sub_807F99C(void)
+{
+ LoadSpriteSheet(&gWeatherAshSpriteSheet);
+}
+
+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 gWeatherFog1SpriteSheet = {gWeatherFog1Tiles, sizeof(gWeatherFog1Tiles), 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 = {gWeatherSandstormTiles, sizeof(gWeatherSandstormTiles), 0x1204};
+
diff --git a/src/field/overworld.c b/src/field/overworld.c
index 59aac5c33..387745f94 100644
--- a/src/field/overworld.c
+++ b/src/field/overworld.c
@@ -1737,7 +1737,7 @@ void sub_8054D4C(u32 a1)
sub_805C7C4(0);
FieldEffectActiveListClear();
InitFieldMessageBox();
- sub_807C828();
+ StartWeather();
sub_8080750();
if (!a1)
SetUpFieldTasks();