summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorProjectRevoTPP <projectrevotpp@hotmail.com>2017-11-26 16:19:44 -0500
committerProjectRevoTPP <projectrevotpp@hotmail.com>2017-11-26 16:19:44 -0500
commitcf84c5406bf9b08950722d90ba4eba3bd8606080 (patch)
tree0140b0b3cb4b1b0b523cd39a71fd775d911c65d0
parent2d70a16fa09eb545b0e236313be6daaa6d17964a (diff)
parent4e7e4cf467e6243994d19971d7cbee33c2f7bd25 (diff)
merge
-rw-r--r--asm/cable_car.s26
-rw-r--r--asm/field_weather.s2327
-rwxr-xr-xasm/ice.s8
-rwxr-xr-xasm/pc_screen_effect.s179
-rw-r--r--common_syms/engine/random.txt (renamed from common_syms/engine/rng.txt)0
-rw-r--r--data/field_weather.s456
-rw-r--r--data/graphics.s4
-rwxr-xr-xdata/pc_screen_effect.s16
-rw-r--r--graphics/battle_anims/backgrounds/fog.bin (renamed from graphics/weather/fog1.bin)bin2048 -> 2048 bytes
-rw-r--r--graphics/weather/fog2.png (renamed from graphics/weather/fog0.png)bin928 -> 928 bytes
-rw-r--r--include/field_weather.h139
-rw-r--r--include/gba/io_reg.h23
-rw-r--r--include/random.h (renamed from include/rng.h)7
-rw-r--r--ld_script.txt8
-rwxr-xr-xsrc/anim/angel_kiss.c2
-rwxr-xr-xsrc/anim/bullet.c2
-rwxr-xr-xsrc/anim/orbs.c2
-rw-r--r--src/battle/battle_2.c2
-rw-r--r--src/battle/battle_3.c2
-rw-r--r--src/battle/battle_4.c2
-rw-r--r--src/battle/battle_ai.c2
-rw-r--r--src/battle/battle_setup.c2
-rw-r--r--src/battle/battle_transition.c2
-rw-r--r--src/engine/link.c2
-rw-r--r--src/engine/main.c2
-rw-r--r--src/engine/random.c (renamed from src/engine/rng.c)2
-rw-r--r--src/engine/record_mixing.c2
-rw-r--r--src/engine/time_events.c2
-rw-r--r--src/field/battle_tower.c2
-rw-r--r--src/field/berry.c2
-rw-r--r--src/field/daycare.c2
-rw-r--r--src/field/dewford_trend.c2
-rw-r--r--src/field/easy_chat.c2
-rw-r--r--src/field/field_map_obj.c2
-rw-r--r--src/field/field_player_avatar.c2
-rw-r--r--src/field/field_specials.c2
-rw-r--r--src/field/field_weather.c1715
-rw-r--r--src/field/field_weather_effects.c2383
-rw-r--r--src/field/lottery_corner.c2
-rw-r--r--src/field/mauville_man.c2
-rw-r--r--src/field/overworld.c8
-rw-r--r--src/field/pc_screen_effect.c128
-rw-r--r--src/field/roamer.c2
-rw-r--r--src/field/scrcmd.c4
-rw-r--r--src/field/tv.c4
-rw-r--r--src/field/wild_encounter.c2
-rw-r--r--src/pokemon/pokedex.c2
-rw-r--r--src/pokemon/pokemon_1.c2
-rw-r--r--src/pokemon/pokemon_2.c2
-rw-r--r--src/pokemon/pokemon_3.c2
-rw-r--r--src/scene/berry_blender.c2
-rw-r--r--src/scene/contest_painting.c2
-rw-r--r--src/scene/credits.c2
-rw-r--r--src/scene/egg_hatch.c2
-rw-r--r--src/scene/evolution_graphics.c2
-rw-r--r--src/scene/hall_of_fame.c2
-rw-r--r--src/scene/intro.c2
-rwxr-xr-xsrc/scene/intro_credits_graphics.c2
-rw-r--r--src/scene/new_game.c2
-rw-r--r--src/script_pokemon_util_80C4BF0.c2
-rw-r--r--sym_common.txt2
-rw-r--r--sym_ewram.txt2
-rw-r--r--tools/preproc/preproc.cpp4
63 files changed, 3112 insertions, 4411 deletions
diff --git a/asm/cable_car.s b/asm/cable_car.s
index 8283a58aa..e1131c549 100644
--- a/asm/cable_car.s
+++ b/asm/cable_car.s
@@ -204,9 +204,9 @@ _08123384:
bl ResetTasks
bl FreeAllSpritePalettes
bl ResetPaletteFade
- bl sub_807C828
+ bl StartWeather
movs r4, 0
- ldr r0, _081233D4 @ =gUnknown_08396FC4
+ ldr r0, _081233D4 @ =gWeatherPtr
ldr r0, [r0]
adds r1, r0, 0
adds r1, 0xF0
@@ -234,7 +234,7 @@ _081233A4:
adds r0, 0x1
b _0812370C
.align 2, 0
-_081233D4: .4byte gUnknown_08396FC4
+_081233D4: .4byte gWeatherPtr
_081233D8: .4byte gSpriteCoordOffsetX
_081233DC: .4byte gSpriteCoordOffsetY
_081233E0: .4byte gMain
@@ -326,7 +326,7 @@ _081234A0:
_081234B4: .4byte gUnknown_02039274
_081234B8: .4byte 0x0000043c
_081234BC:
- ldr r0, _081234FC @ =gUnknown_08396FC4
+ ldr r0, _081234FC @ =gWeatherPtr
ldr r0, [r0]
adds r1, r0, 0
adds r1, 0xF0
@@ -361,7 +361,7 @@ _081234E6:
adds r0, 0x1
b _0812370C
.align 2, 0
-_081234FC: .4byte gUnknown_08396FC4
+_081234FC: .4byte gWeatherPtr
_08123500: .4byte 0x0000043c
_08123504:
ldr r0, _08123578 @ =0x0600e800
@@ -630,7 +630,7 @@ sub_8123740: @ 8123740
movs r0, 0
bl sub_807C9B4
add r7, sp, 0x4
- ldr r0, _08123858 @ =gUnknown_08396FC4
+ ldr r0, _08123858 @ =gWeatherPtr
ldr r0, [r0]
adds r1, r0, 0
adds r1, 0xF0
@@ -754,7 +754,7 @@ _081237E0:
bx r0
.align 2, 0
_08123854: .4byte gSpriteCoordOffsetX
-_08123858: .4byte gUnknown_08396FC4
+_08123858: .4byte gWeatherPtr
_0812385C: .4byte gSharedMem
_08123860: .4byte 0x040000d4
_08123864: .4byte 0x85000400
@@ -821,7 +821,7 @@ _081238D0:
beq _081238DC
b _081239D6
_081238DC:
- ldr r0, _08123920 @ =gUnknown_08396FC4
+ ldr r0, _08123920 @ =gWeatherPtr
ldr r0, [r0]
adds r2, r0, 0
adds r2, 0xF0
@@ -857,9 +857,9 @@ _0812390C:
strb r0, [r1, 0x1]
b _081239D6
.align 2, 0
-_08123920: .4byte gUnknown_08396FC4
+_08123920: .4byte gWeatherPtr
_08123924:
- ldr r0, _08123938 @ =gUnknown_08396FC4
+ ldr r0, _08123938 @ =gWeatherPtr
ldr r2, [r0]
movs r1, 0xDA
lsls r1, 3
@@ -870,7 +870,7 @@ _08123924:
strb r0, [r3, 0x1]
b _081239D6
.align 2, 0
-_08123938: .4byte gUnknown_08396FC4
+_08123938: .4byte gWeatherPtr
_0812393C:
ldrh r1, [r3, 0x6]
ldrh r0, [r3, 0x4]
@@ -1239,7 +1239,7 @@ _08123C10: .4byte 0x00000944
_08123C14: .4byte gUnknown_02039274
_08123C18: .4byte gSpriteCoordOffsetX
_08123C1C:
- ldr r0, _08123C38 @ =gUnknown_08396FC4
+ ldr r0, _08123C38 @ =gWeatherPtr
ldr r4, [r0]
ldr r2, _08123C3C @ =0x000006fc
adds r4, r2
@@ -1254,7 +1254,7 @@ _08123C26:
pop {r0}
bx r0
.align 2, 0
-_08123C38: .4byte gUnknown_08396FC4
+_08123C38: .4byte gWeatherPtr
_08123C3C: .4byte 0x000006fc
thumb_func_end sub_8123AF8
diff --git a/asm/field_weather.s b/asm/field_weather.s
deleted file mode 100644
index d42926db8..000000000
--- a/asm/field_weather.s
+++ /dev/null
@@ -1,2327 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_807F6E8
-sub_807F6E8: @ 807F6E8
- push {r4,r5,lr}
- sub sp, 0x8
- ldr r0, _0807F75C @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r1, _0807F760 @ =0x000006fb
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807F792
- ldr r0, _0807F764 @ =gUnknown_0839ABA8
- 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 @ =gUnknown_08396FC4
- ldr r0, [r2]
- lsls r1, r5, 2
- adds r0, 0xA0
- adds r0, r1
- str r4, [r0]
- b _0807F77E
- .align 2, 0
-_0807F75C: .4byte gUnknown_08396FC4
-_0807F760: .4byte 0x000006fb
-_0807F764: .4byte gUnknown_0839ABA8
-_0807F768: .4byte gSpriteTemplate_839AB90
-_0807F76C: .4byte gSprites
-_0807F770:
- ldr r2, _0807F79C @ =gUnknown_08396FC4
- 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 gUnknown_08396FC4
-_0807F7A0: .4byte 0x000006fb
- thumb_func_end sub_807F6E8
-
- thumb_func_start sub_807F7A4
-sub_807F7A4: @ 807F7A4
- push {r4,r5,lr}
- ldr r0, _0807F7EC @ =gUnknown_08396FC4
- 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 @ =gUnknown_08396FC4
- 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 gUnknown_08396FC4
-_0807F7F0: .4byte 0x000006fb
-_0807F7F4: .4byte 0x00001201
- thumb_func_end sub_807F7A4
-
- thumb_func_start sub_807F7F8
-sub_807F7F8: @ 807F7F8
- push {lr}
- ldr r0, _0807F844 @ =gUnknown_08396FC4
- 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 gUnknown_08396FC4
-_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 @ =gUnknown_08396FC4
- 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 gUnknown_08396FC4
-_0807F884: .4byte 0x000006d2
- thumb_func_end sub_807F858
-
- thumb_func_start sub_807F888
-sub_807F888: @ 807F888
- push {r4,r5,lr}
- ldr r2, _0807F8CC @ =gUnknown_08396FC4
- 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 gUnknown_08396FC4
-_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 @ =gUnknown_08396FC4
- 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 gUnknown_08396FC4
-_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 @ =gUnknown_0839ABB0
- bl LoadSpriteSheet
- pop {r0}
- bx r0
- .align 2, 0
-_0807F9A8: .4byte gUnknown_0839ABB0
- thumb_func_end sub_807F99C
-
- thumb_func_start sub_807F9AC
-sub_807F9AC: @ 807F9AC
- push {r4,r5,lr}
- ldr r0, _0807FA18 @ =gUnknown_08396FC4
- ldr r0, [r0]
- movs r1, 0xE0
- lsls r1, 3
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807FA48
- movs r5, 0
-_0807F9C0:
- ldr r0, _0807FA1C @ =gSpriteTemplate_839ABD0
- movs r1, 0
- movs r2, 0
- movs r3, 0x4E
- bl CreateSpriteAtEnd
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x40
- beq _0807FA24
- lsls r4, r0, 4
- adds r4, r0
- lsls r4, 2
- ldr r0, _0807FA20 @ =gSprites
- adds r4, r0
- movs r0, 0
- strh r0, [r4, 0x30]
- adds r0, r5, 0
- movs r1, 0x5
- bl __umodsi3
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4, 0x32]
- adds r0, r5, 0
- movs r1, 0x5
- bl __udivsi3
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4, 0x34]
- movs r1, 0x34
- ldrsh r0, [r4, r1]
- lsls r0, 6
- adds r0, 0x20
- strh r0, [r4, 0x2E]
- ldr r2, _0807FA18 @ =gUnknown_08396FC4
- ldr r0, [r2]
- lsls r1, r5, 2
- adds r0, 0xF0
- adds r0, r1
- str r4, [r0]
- b _0807FA32
- .align 2, 0
-_0807FA18: .4byte gUnknown_08396FC4
-_0807FA1C: .4byte gSpriteTemplate_839ABD0
-_0807FA20: .4byte gSprites
-_0807FA24:
- ldr r2, _0807FA50 @ =gUnknown_08396FC4
- ldr r1, [r2]
- lsls r0, r5, 2
- adds r1, 0xF0
- adds r1, r0
- movs r0, 0
- str r0, [r1]
-_0807FA32:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x13
- bls _0807F9C0
- ldr r0, [r2]
- movs r1, 0xE0
- lsls r1, 3
- adds r0, r1
- movs r1, 0x1
- strb r1, [r0]
-_0807FA48:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FA50: .4byte gUnknown_08396FC4
- thumb_func_end sub_807F9AC
-
- thumb_func_start sub_807FA54
-sub_807FA54: @ 807FA54
- push {r4,r5,lr}
- ldr r0, _0807FAA0 @ =gUnknown_08396FC4
- ldr r1, [r0]
- movs r2, 0xE0
- lsls r2, 3
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- beq _0807FA98
- movs r4, 0
- adds r5, r1, 0
- adds r5, 0xF0
-_0807FA6C:
- lsls r0, r4, 2
- adds r0, r5, r0
- ldr r0, [r0]
- cmp r0, 0
- beq _0807FA7A
- bl DestroySprite
-_0807FA7A:
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r4, 0x13
- bls _0807FA6C
- ldr r0, _0807FAA4 @ =0x00001202
- bl FreeSpriteTilesByTag
- ldr r0, _0807FAA0 @ =gUnknown_08396FC4
- ldr r0, [r0]
- movs r1, 0xE0
- lsls r1, 3
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
-_0807FA98:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FAA0: .4byte gUnknown_08396FC4
-_0807FAA4: .4byte 0x00001202
- thumb_func_end sub_807FA54
-
- thumb_func_start sub_807FAA8
-sub_807FAA8: @ 807FAA8
- push {r4,lr}
- adds r3, r0, 0
- ldrh r0, [r3, 0x30]
- adds r0, 0x1
- strh r0, [r3, 0x30]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x5
- ble _0807FAC4
- movs r0, 0
- strh r0, [r3, 0x30]
- ldrh r0, [r3, 0x2E]
- adds r0, 0x1
- strh r0, [r3, 0x2E]
-_0807FAC4:
- ldr r1, _0807FB10 @ =gSpriteCoordOffsetY
- ldrh r0, [r3, 0x2E]
- ldrh r1, [r1]
- adds r0, r1
- strh r0, [r3, 0x22]
- ldr r0, _0807FB14 @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r1, _0807FB18 @ =0x000006fc
- adds r2, r0, r1
- ldrh r1, [r2]
- adds r1, 0x20
- movs r4, 0x32
- ldrsh r0, [r3, r4]
- lsls r0, 6
- adds r1, r0
- strh r1, [r3, 0x20]
- lsls r1, 16
- ldr r0, _0807FB1C @ =0x010f0000
- cmp r1, r0
- ble _0807FB08
- movs r0, 0xF0
- lsls r0, 1
- adds r1, r0, 0
- ldrh r2, [r2]
- adds r1, r2
- movs r4, 0x32
- ldrsh r2, [r3, r4]
- movs r0, 0x4
- subs r0, r2
- lsls r0, 6
- subs r1, r0
- ldr r0, _0807FB20 @ =0x000001ff
- ands r1, r0
- strh r1, [r3, 0x20]
-_0807FB08:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FB10: .4byte gSpriteCoordOffsetY
-_0807FB14: .4byte gUnknown_08396FC4
-_0807FB18: .4byte 0x000006fc
-_0807FB1C: .4byte 0x010f0000
-_0807FB20: .4byte 0x000001ff
- thumb_func_end sub_807FAA8
-
- thumb_func_start sub_807FB24
-sub_807FB24: @ 807FB24
- push {r4,lr}
- ldr r0, _0807FB94 @ =gUnknown_08396FC4
- ldr r3, [r0]
- ldr r1, _0807FB98 @ =0x000006cc
- adds r0, r3, r1
- movs r1, 0
- movs r2, 0
- strh r2, [r0]
- ldr r4, _0807FB9C @ =0x000006d2
- adds r0, r3, r4
- strb r1, [r0]
- subs r4, 0x11
- adds r0, r3, r4
- strb r1, [r0]
- ldr r0, _0807FBA0 @ =0x000006c2
- adds r1, r3, r0
- movs r0, 0x14
- strb r0, [r1]
- movs r1, 0xDE
- lsls r1, 3
- adds r0, r3, r1
- strh r2, [r0]
- adds r4, 0x31
- adds r1, r3, r4
- movs r0, 0x1
- strh r0, [r1]
- ldr r1, _0807FBA4 @ =0x00000724
- adds r0, r3, r1
- ldrb r2, [r0]
- cmp r2, 0
- bne _0807FB8E
- adds r4, 0x2A
- adds r0, r3, r4
- strh r2, [r0]
- subs r1, 0x6
- adds r0, r3, r1
- strh r2, [r0]
- adds r4, 0x4
- adds r0, r3, r4
- strh r2, [r0]
- adds r1, 0x4
- adds r0, r3, r1
- strh r2, [r0]
- subs r4, 0x8
- adds r0, r3, r4
- strh r2, [r0]
- subs r1, 0x8
- adds r0, r3, r1
- strh r2, [r0]
- movs r0, 0
- movs r1, 0x10
- bl sub_807DB64
-_0807FB8E:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FB94: .4byte gUnknown_08396FC4
-_0807FB98: .4byte 0x000006cc
-_0807FB9C: .4byte 0x000006d2
-_0807FBA0: .4byte 0x000006c2
-_0807FBA4: .4byte 0x00000724
- thumb_func_end sub_807FB24
-
- thumb_func_start sub_807FBA8
-sub_807FBA8: @ 807FBA8
- push {r4,lr}
- bl sub_807FB24
- ldr r0, _0807FBD0 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _0807FBD4 @ =0x000006d2
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807FBC8
- adds r4, r1, r2
-_0807FBBE:
- bl sub_807FBD8
- ldrb r0, [r4]
- cmp r0, 0
- beq _0807FBBE
-_0807FBC8:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FBD0: .4byte gUnknown_08396FC4
-_0807FBD4: .4byte 0x000006d2
- thumb_func_end sub_807FBA8
-
- thumb_func_start sub_807FBD8
-sub_807FBD8: @ 807FBD8
- push {r4,r5,lr}
- bl sub_807FC9C
- ldr r0, _0807FBF8 @ =gUnknown_08396FC4
- ldr r5, [r0]
- ldr r0, _0807FBFC @ =0x000006cc
- adds r4, r5, r0
- ldrh r0, [r4]
- cmp r0, 0x1
- beq _0807FC0C
- cmp r0, 0x1
- bgt _0807FC00
- cmp r0, 0
- beq _0807FC06
- b _0807FC30
- .align 2, 0
-_0807FBF8: .4byte gUnknown_08396FC4
-_0807FBFC: .4byte 0x000006cc
-_0807FC00:
- cmp r0, 0x2
- beq _0807FC18
- b _0807FC30
-_0807FC06:
- bl sub_807FD30
- b _0807FC2A
-_0807FC0C:
- movs r0, 0xC
- movs r1, 0x8
- movs r2, 0x8
- bl sub_807DBA4
- b _0807FC2A
-_0807FC18:
- bl sub_807DBE8
- lsls r0, 24
- cmp r0, 0
- beq _0807FC30
- ldr r0, _0807FC38 @ =0x000006d2
- adds r1, r5, r0
- movs r0, 0x1
- strb r0, [r1]
-_0807FC2A:
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
-_0807FC30:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FC38: .4byte 0x000006d2
- thumb_func_end sub_807FBD8
-
- thumb_func_start sub_807FC3C
-sub_807FC3C: @ 807FC3C
- push {r4,lr}
- bl sub_807FC9C
- ldr r0, _0807FC5C @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r1, _0807FC60 @ =0x000006ce
- adds r4, r0, r1
- ldrh r0, [r4]
- cmp r0, 0x1
- beq _0807FC76
- cmp r0, 0x1
- bgt _0807FC64
- cmp r0, 0
- beq _0807FC6A
- b _0807FC8E
- .align 2, 0
-_0807FC5C: .4byte gUnknown_08396FC4
-_0807FC60: .4byte 0x000006ce
-_0807FC64:
- cmp r0, 0x2
- beq _0807FC82
- b _0807FC8E
-_0807FC6A:
- movs r0, 0
- movs r1, 0x10
- movs r2, 0x1
- bl sub_807DBA4
- b _0807FC86
-_0807FC76:
- bl sub_807DBE8
- lsls r0, 24
- cmp r0, 0
- beq _0807FC92
- b _0807FC86
-_0807FC82:
- bl sub_807FDE8
-_0807FC86:
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- b _0807FC92
-_0807FC8E:
- movs r0, 0
- b _0807FC94
-_0807FC92:
- movs r0, 0x1
-_0807FC94:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_807FC3C
-
- thumb_func_start sub_807FC9C
-sub_807FC9C: @ 807FC9C
- push {r4,r5,lr}
- ldr r0, _0807FD14 @ =gUnknown_08396FC4
- ldr r3, [r0]
- ldr r0, _0807FD18 @ =0x0000071c
- adds r2, r3, r0
- ldrh r0, [r2]
- adds r0, 0x1
- movs r5, 0
- strh r0, [r2]
- ldr r1, _0807FD1C @ =0x0000ffff
- adds r4, r1, 0
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x2
- bls _0807FCC8
- movs r0, 0xE4
- lsls r0, 3
- adds r1, r3, r0
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- strh r5, [r2]
-_0807FCC8:
- ldr r1, _0807FD20 @ =0x0000071e
- adds r2, r3, r1
- ldrh r0, [r2]
- adds r0, 0x1
- strh r0, [r2]
- ands r0, r4
- cmp r0, 0x4
- bls _0807FCE4
- ldr r0, _0807FD24 @ =0x00000722
- adds r1, r3, r0
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- strh r5, [r2]
-_0807FCE4:
- ldr r0, _0807FD28 @ =gSpriteCoordOffsetX
- movs r2, 0xE4
- lsls r2, 3
- adds r1, r3, r2
- ldrh r0, [r0]
- ldrh r1, [r1]
- subs r0, r1
- movs r1, 0xFF
- ands r0, r1
- subs r2, 0x8
- adds r1, r3, r2
- strh r0, [r1]
- ldr r1, _0807FD2C @ =gSpriteCoordOffsetY
- adds r2, 0xA
- adds r0, r3, r2
- ldrh r0, [r0]
- ldrh r1, [r1]
- adds r0, r1
- subs r2, 0x8
- adds r1, r3, r2
- strh r0, [r1]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FD14: .4byte gUnknown_08396FC4
-_0807FD18: .4byte 0x0000071c
-_0807FD1C: .4byte 0x0000ffff
-_0807FD20: .4byte 0x0000071e
-_0807FD24: .4byte 0x00000722
-_0807FD28: .4byte gSpriteCoordOffsetX
-_0807FD2C: .4byte gSpriteCoordOffsetY
- thumb_func_end sub_807FC9C
-
- thumb_func_start sub_807FD30
-sub_807FD30: @ 807FD30
- push {r4-r6,lr}
- sub sp, 0x8
- ldr r0, _0807FD9C @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r1, _0807FDA0 @ =0x00000724
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807FDD6
- ldr r0, _0807FDA4 @ =gUnknown_0839ABE8
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [sp]
- str r1, [sp, 0x4]
- mov r0, sp
- bl LoadSpriteSheet
- movs r6, 0
-_0807FD54:
- adds r0, r6, 0
- movs r1, 0x5
- bl __udivsi3
- adds r5, r0, 0
- lsls r2, r5, 22
- asrs r2, 16
- ldr r0, _0807FDA8 @ =gSpriteTemplate_839AC04
- movs r1, 0
- movs r3, 0xFF
- bl CreateSpriteAtEnd
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x40
- beq _0807FDB0
- lsls r4, r0, 4
- adds r4, r0
- lsls r4, 2
- ldr r0, _0807FDAC @ =gSprites
- adds r4, r0
- adds r0, r6, 0
- movs r1, 0x5
- bl __umodsi3
- strh r0, [r4, 0x2E]
- strh r5, [r4, 0x30]
- ldr r2, _0807FD9C @ =gUnknown_08396FC4
- ldr r0, [r2]
- lsls r1, r6, 2
- movs r3, 0xA0
- lsls r3, 1
- adds r0, r3
- adds r0, r1
- str r4, [r0]
- b _0807FDC2
- .align 2, 0
-_0807FD9C: .4byte gUnknown_08396FC4
-_0807FDA0: .4byte 0x00000724
-_0807FDA4: .4byte gUnknown_0839ABE8
-_0807FDA8: .4byte gSpriteTemplate_839AC04
-_0807FDAC: .4byte gSprites
-_0807FDB0:
- ldr r2, _0807FDE0 @ =gUnknown_08396FC4
- ldr r1, [r2]
- lsls r0, r6, 2
- movs r3, 0xA0
- lsls r3, 1
- adds r1, r3
- adds r1, r0
- movs r0, 0
- str r0, [r1]
-_0807FDC2:
- adds r0, r6, 0x1
- lsls r0, 16
- lsrs r6, r0, 16
- cmp r6, 0x13
- bls _0807FD54
- ldr r0, [r2]
- ldr r1, _0807FDE4 @ =0x00000724
- adds r0, r1
- movs r1, 0x1
- strb r1, [r0]
-_0807FDD6:
- add sp, 0x8
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FDE0: .4byte gUnknown_08396FC4
-_0807FDE4: .4byte 0x00000724
- thumb_func_end sub_807FD30
-
- thumb_func_start sub_807FDE8
-sub_807FDE8: @ 807FDE8
- push {r4,r5,lr}
- ldr r0, _0807FE30 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _0807FE34 @ =0x00000724
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- beq _0807FE2A
- movs r4, 0
- movs r0, 0xA0
- lsls r0, 1
- adds r5, r1, r0
-_0807FE00:
- lsls r0, r4, 2
- adds r0, r5, r0
- ldr r0, [r0]
- cmp r0, 0
- beq _0807FE0E
- bl DestroySprite
-_0807FE0E:
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r4, 0x13
- bls _0807FE00
- ldr r0, _0807FE38 @ =0x00001203
- bl FreeSpriteTilesByTag
- ldr r0, _0807FE30 @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r1, _0807FE34 @ =0x00000724
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
-_0807FE2A:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FE30: .4byte gUnknown_08396FC4
-_0807FE34: .4byte 0x00000724
-_0807FE38: .4byte 0x00001203
- thumb_func_end sub_807FDE8
-
- thumb_func_start sub_807FE3C
-sub_807FE3C: @ 807FE3C
- push {r4,lr}
- adds r3, r0, 0
- ldr r0, _0807FE8C @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _0807FE90 @ =0x0000071a
- adds r0, r1, r2
- ldrh r0, [r0]
- strh r0, [r3, 0x26]
- movs r4, 0xE3
- lsls r4, 3
- adds r2, r1, r4
- ldrh r1, [r2]
- adds r1, 0x20
- movs r4, 0x2E
- ldrsh r0, [r3, r4]
- lsls r0, 6
- adds r1, r0
- strh r1, [r3, 0x20]
- lsls r1, 16
- ldr r0, _0807FE94 @ =0x010f0000
- cmp r1, r0
- ble _0807FE84
- movs r0, 0xF0
- lsls r0, 1
- adds r1, r0, 0
- ldrh r2, [r2]
- adds r1, r2
- movs r4, 0x2E
- ldrsh r2, [r3, r4]
- movs r0, 0x4
- subs r0, r2
- lsls r0, 6
- subs r1, r0
- ldr r0, _0807FE98 @ =0x000001ff
- ands r1, r0
- strh r1, [r3, 0x20]
-_0807FE84:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FE8C: .4byte gUnknown_08396FC4
-_0807FE90: .4byte 0x0000071a
-_0807FE94: .4byte 0x010f0000
-_0807FE98: .4byte 0x000001ff
- thumb_func_end sub_807FE3C
-
- thumb_func_start sub_807FE9C
-sub_807FE9C: @ 807FE9C
- push {r4,lr}
- ldr r0, _0807FF00 @ =gUnknown_08396FC4
- ldr r3, [r0]
- ldr r0, _0807FF04 @ =0x000006cc
- adds r1, r3, r0
- movs r2, 0
- movs r0, 0
- strh r0, [r1]
- ldr r1, _0807FF08 @ =0x000006d2
- adds r0, r3, r1
- strb r2, [r0]
- ldr r4, _0807FF0C @ =0x000006c1
- adds r0, r3, r4
- strb r2, [r0]
- ldr r0, _0807FF10 @ =0x000006c2
- adds r1, r3, r0
- movs r0, 0x14
- strb r0, [r1]
- ldr r1, _0807FF14 @ =0x00000716
- adds r0, r3, r1
- ldrb r2, [r0]
- cmp r2, 0
- bne _0807FEF8
- adds r4, 0x43
- adds r1, r3, r4
- adds r4, 0x4
- adds r0, r3, r4
- str r2, [r0]
- str r2, [r1]
- ldr r0, _0807FF18 @ =0x00000712
- adds r1, r3, r0
- movs r0, 0x8
- strh r0, [r1]
- adds r4, 0xC
- adds r0, r3, r4
- strh r2, [r0]
- ldrh r2, [r1]
- cmp r2, 0x5F
- bls _0807FEF0
- movs r0, 0x80
- subs r0, r2
- strh r0, [r1]
-_0807FEF0:
- movs r0, 0
- movs r1, 0x10
- bl sub_807DB64
-_0807FEF8:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FF00: .4byte gUnknown_08396FC4
-_0807FF04: .4byte 0x000006cc
-_0807FF08: .4byte 0x000006d2
-_0807FF0C: .4byte 0x000006c1
-_0807FF10: .4byte 0x000006c2
-_0807FF14: .4byte 0x00000716
-_0807FF18: .4byte 0x00000712
- thumb_func_end sub_807FE9C
-
- thumb_func_start sub_807FF1C
-sub_807FF1C: @ 807FF1C
- push {r4,lr}
- bl sub_807FE9C
- ldr r0, _0807FF44 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _0807FF48 @ =0x000006d2
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807FF3C
- adds r4, r1, r2
-_0807FF32:
- bl sub_807FF4C
- ldrb r0, [r4]
- cmp r0, 0
- beq _0807FF32
-_0807FF3C:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FF44: .4byte gUnknown_08396FC4
-_0807FF48: .4byte 0x000006d2
- thumb_func_end sub_807FF1C
-
- thumb_func_start sub_807FF4C
-sub_807FF4C: @ 807FF4C
- push {r4,r5,lr}
- bl sub_8080064
- bl sub_808002C
- ldr r0, _0807FF7C @ =gUnknown_08396FC4
- ldr r5, [r0]
- ldr r0, _0807FF80 @ =0x00000712
- adds r1, r5, r0
- ldrh r0, [r1]
- cmp r0, 0x5F
- bls _0807FF68
- movs r0, 0x20
- strh r0, [r1]
-_0807FF68:
- ldr r0, _0807FF84 @ =0x000006cc
- adds r4, r5, r0
- ldrh r0, [r4]
- cmp r0, 0x1
- beq _0807FF98
- cmp r0, 0x1
- bgt _0807FF88
- cmp r0, 0
- beq _0807FF8E
- b _0807FFBC
- .align 2, 0
-_0807FF7C: .4byte gUnknown_08396FC4
-_0807FF80: .4byte 0x00000712
-_0807FF84: .4byte 0x000006cc
-_0807FF88:
- cmp r0, 0x2
- beq _0807FFA4
- b _0807FFBC
-_0807FF8E:
- bl sub_8080178
- bl sub_8080238
- b _0807FFB6
-_0807FF98:
- movs r0, 0x10
- movs r1, 0
- movs r2, 0
- bl sub_807DBA4
- b _0807FFB6
-_0807FFA4:
- bl sub_807DBE8
- lsls r0, 24
- cmp r0, 0
- beq _0807FFBC
- ldr r0, _0807FFC4 @ =0x000006d2
- adds r1, r5, r0
- movs r0, 0x1
- strb r0, [r1]
-_0807FFB6:
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
-_0807FFBC:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807FFC4: .4byte 0x000006d2
- thumb_func_end sub_807FF4C
-
- thumb_func_start sub_807FFC8
-sub_807FFC8: @ 807FFC8
- push {r4,lr}
- bl sub_8080064
- bl sub_808002C
- ldr r0, _0807FFEC @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r1, _0807FFF0 @ =0x000006ce
- adds r4, r0, r1
- ldrh r0, [r4]
- cmp r0, 0x1
- beq _08080006
- cmp r0, 0x1
- bgt _0807FFF4
- cmp r0, 0
- beq _0807FFFA
- b _0808001E
- .align 2, 0
-_0807FFEC: .4byte gUnknown_08396FC4
-_0807FFF0: .4byte 0x000006ce
-_0807FFF4:
- cmp r0, 0x2
- beq _08080012
- b _0808001E
-_0807FFFA:
- movs r0, 0
- movs r1, 0x10
- movs r2, 0
- bl sub_807DBA4
- b _08080016
-_08080006:
- bl sub_807DBE8
- lsls r0, 24
- cmp r0, 0
- beq _08080022
- b _08080016
-_08080012:
- bl sub_80800E4
-_08080016:
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- b _08080022
-_0808001E:
- movs r0, 0
- b _08080024
-_08080022:
- movs r0, 0x1
-_08080024:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_807FFC8
-
- thumb_func_start sub_808002C
-sub_808002C: @ 808002C
- push {lr}
- ldr r0, _08080058 @ =gUnknown_08396FC4
- ldr r2, [r0]
- ldr r0, _0808005C @ =0x00000714
- adds r3, r2, r0
- ldrh r0, [r3]
- adds r1, r0, 0x1
- strh r1, [r3]
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x4
- bls _08080052
- ldr r1, _08080060 @ =0x00000712
- adds r0, r2, r1
- ldrh r1, [r0]
- adds r1, 0x1
- movs r2, 0
- strh r1, [r0]
- strh r2, [r3]
-_08080052:
- pop {r0}
- bx r0
- .align 2, 0
-_08080058: .4byte gUnknown_08396FC4
-_0808005C: .4byte 0x00000714
-_08080060: .4byte 0x00000712
- thumb_func_end sub_808002C
-
- thumb_func_start sub_8080064
-sub_8080064: @ 8080064
- push {r4-r6,lr}
- ldr r0, _080800C8 @ =gUnknown_08396FC4
- ldr r2, [r0]
- ldr r0, _080800CC @ =0x00000704
- adds r4, r2, r0
- ldr r6, _080800D0 @ =gSineTable
- ldr r1, _080800D4 @ =0x00000712
- adds r5, r2, r1
- ldrh r0, [r5]
- lsls r0, 1
- adds r0, r6
- movs r3, 0
- ldrsh r1, [r0, r3]
- lsls r1, 2
- ldr r0, [r4]
- subs r0, r1
- str r0, [r4]
- movs r0, 0xE1
- lsls r0, 3
- adds r3, r2, r0
- ldrh r0, [r5]
- lsls r0, 1
- adds r0, r6
- movs r5, 0
- ldrsh r1, [r0, r5]
- ldr r0, [r3]
- subs r0, r1
- str r0, [r3]
- ldr r1, _080800D8 @ =gSpriteCoordOffsetX
- ldr r0, [r4]
- lsrs r0, 8
- ldrh r1, [r1]
- adds r0, r1
- movs r1, 0xFF
- ands r0, r1
- ldr r4, _080800DC @ =0x0000070e
- adds r1, r2, r4
- strh r0, [r1]
- ldr r1, _080800E0 @ =gSpriteCoordOffsetY
- ldr r0, [r3]
- lsrs r0, 8
- ldrh r1, [r1]
- adds r0, r1
- movs r5, 0xE2
- lsls r5, 3
- adds r2, r5
- strh r0, [r2]
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080800C8: .4byte gUnknown_08396FC4
-_080800CC: .4byte 0x00000704
-_080800D0: .4byte gSineTable
-_080800D4: .4byte 0x00000712
-_080800D8: .4byte gSpriteCoordOffsetX
-_080800DC: .4byte 0x0000070e
-_080800E0: .4byte gSpriteCoordOffsetY
- thumb_func_end sub_8080064
-
- thumb_func_start sub_80800E4
-sub_80800E4: @ 80800E4
- push {r4,r5,lr}
- ldr r0, _08080168 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _0808016C @ =0x00000716
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- beq _08080126
- movs r4, 0
- movs r0, 0xC8
- lsls r0, 1
- adds r5, r1, r0
-_080800FC:
- lsls r0, r4, 2
- adds r0, r5, r0
- ldr r0, [r0]
- cmp r0, 0
- beq _0808010A
- bl DestroySprite
-_0808010A:
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r4, 0x13
- bls _080800FC
- ldr r0, _08080168 @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r1, _0808016C @ =0x00000716
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
- ldr r0, _08080170 @ =0x00001204
- bl FreeSpriteTilesByTag
-_08080126:
- ldr r0, _08080168 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _08080174 @ =0x00000717
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- beq _08080160
- movs r4, 0
- movs r0, 0xF0
- lsls r0, 1
- adds r5, r1, r0
-_0808013C:
- lsls r0, r4, 2
- adds r0, r5, r0
- ldr r0, [r0]
- cmp r0, 0
- beq _0808014A
- bl DestroySprite
-_0808014A:
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r4, 0x4
- bls _0808013C
- ldr r0, _08080168 @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r1, _08080174 @ =0x00000717
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
-_08080160:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08080168: .4byte gUnknown_08396FC4
-_0808016C: .4byte 0x00000716
-_08080170: .4byte 0x00001204
-_08080174: .4byte 0x00000717
- thumb_func_end sub_80800E4
-
- thumb_func_start sub_8080178
-sub_8080178: @ 8080178
- push {r4-r7,lr}
- sub sp, 0x4
- ldr r0, _080801E8 @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r1, _080801EC @ =0x00000716
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0
- bne _08080226
- ldr r0, _080801F0 @ =gUnknown_0839AC54
- bl LoadSpriteSheet
- ldr r0, _080801F4 @ =gUnknown_08397128
- bl sub_807D8C0
- movs r7, 0
-_08080198:
- adds r0, r7, 0
- movs r1, 0x5
- bl __udivsi3
- adds r6, r0, 0
- lsls r2, r6, 22
- asrs r2, 16
- ldr r0, _080801F8 @ =gSpriteTemplate_839AC3C
- movs r1, 0
- movs r3, 0x1
- bl CreateSpriteAtEnd
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x40
- beq _08080200
- ldr r2, _080801E8 @ =gUnknown_08396FC4
- ldr r5, [r2]
- lsls r0, r7, 2
- movs r3, 0xC8
- lsls r3, 1
- adds r5, r3
- adds r5, r0
- lsls r4, r1, 4
- adds r4, r1
- lsls r4, 2
- ldr r0, _080801FC @ =gSprites
- adds r4, r0
- str r4, [r5]
- adds r0, r7, 0
- movs r1, 0x5
- str r2, [sp]
- bl __umodsi3
- strh r0, [r4, 0x2E]
- ldr r0, [r5]
- strh r6, [r0, 0x30]
- ldr r2, [sp]
- b _08080212
- .align 2, 0
-_080801E8: .4byte gUnknown_08396FC4
-_080801EC: .4byte 0x00000716
-_080801F0: .4byte gUnknown_0839AC54
-_080801F4: .4byte gUnknown_08397128
-_080801F8: .4byte gSpriteTemplate_839AC3C
-_080801FC: .4byte gSprites
-_08080200:
- ldr r2, _08080230 @ =gUnknown_08396FC4
- ldr r1, [r2]
- lsls r0, r7, 2
- movs r3, 0xC8
- lsls r3, 1
- adds r1, r3
- adds r1, r0
- movs r0, 0
- str r0, [r1]
-_08080212:
- adds r0, r7, 0x1
- lsls r0, 16
- lsrs r7, r0, 16
- cmp r7, 0x13
- bls _08080198
- ldr r0, [r2]
- ldr r1, _08080234 @ =0x00000716
- adds r0, r1
- movs r1, 0x1
- strb r1, [r0]
-_08080226:
- add sp, 0x4
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08080230: .4byte gUnknown_08396FC4
-_08080234: .4byte 0x00000716
- thumb_func_end sub_8080178
-
- thumb_func_start sub_8080238
-sub_8080238: @ 8080238
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- ldr r4, _080802E0 @ =gUnknown_08396FC4
- ldr r0, [r4]
- ldr r1, _080802E4 @ =0x00000717
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0
- bne _08080324
- movs r7, 0
- mov r9, r4
- movs r2, 0
- mov r10, r2
-_08080258:
- lsls r0, r7, 1
- mov r8, r0
- adds r6, r0, r7
- lsls r5, r6, 4
- adds r1, r5, 0
- adds r1, 0x18
- lsls r1, 16
- asrs r1, 16
- ldr r0, _080802E8 @ =gSpriteTemplate_839AC3C
- movs r2, 0xD0
- movs r3, 0x1
- bl CreateSpriteAtEnd
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x40
- beq _080802FC
- mov r2, r9
- ldr r4, [r2]
- lsls r0, r7, 2
- movs r2, 0xF0
- lsls r2, 1
- adds r4, r2
- adds r4, r0
- lsls r2, r1, 4
- adds r2, r1
- lsls r2, 2
- ldr r0, _080802EC @ =gSprites
- adds r2, r0
- str r2, [r4]
- ldrb r1, [r2, 0x3]
- movs r0, 0x3F
- ands r0, r1
- movs r1, 0x80
- orrs r0, r1
- strb r0, [r2, 0x3]
- ldr r1, [r4]
- adds r0, r6, r5
- strh r0, [r1, 0x30]
- ldr r1, [r4]
- movs r0, 0x8
- strh r0, [r1, 0x2E]
- ldr r0, [r4]
- mov r1, r10
- strh r1, [r0, 0x32]
- ldr r1, [r4]
- ldr r0, _080802F0 @ =0x00006730
- strh r0, [r1, 0x36]
- ldr r1, [r4]
- ldr r0, _080802F4 @ =gUnknown_0839AC5C
- add r0, r8
- ldrh r0, [r0]
- strh r0, [r1, 0x34]
- ldr r0, [r4]
- movs r1, 0x1
- bl StartSpriteAnim
- ldr r0, [r4]
- movs r1, 0
- movs r2, 0x2
- movs r3, 0
- bl CalcCenterToCornerVec
- ldr r1, [r4]
- ldr r0, _080802F8 @ =sub_8080398
- str r0, [r1, 0x1C]
- b _0808030E
- .align 2, 0
-_080802E0: .4byte gUnknown_08396FC4
-_080802E4: .4byte 0x00000717
-_080802E8: .4byte gSpriteTemplate_839AC3C
-_080802EC: .4byte gSprites
-_080802F0: .4byte 0x00006730
-_080802F4: .4byte gUnknown_0839AC5C
-_080802F8: .4byte sub_8080398
-_080802FC:
- mov r2, r9
- ldr r0, [r2]
- lsls r1, r7, 2
- movs r2, 0xF0
- lsls r2, 1
- adds r0, r2
- adds r0, r1
- mov r1, r10
- str r1, [r0]
-_0808030E:
- mov r2, r9
- ldr r0, [r2]
- ldr r1, _08080334 @ =0x00000717
- adds r0, r1
- movs r1, 0x1
- strb r1, [r0]
- adds r0, r7, 0x1
- lsls r0, 16
- lsrs r7, r0, 16
- cmp r7, 0x4
- bls _08080258
-_08080324:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08080334: .4byte 0x00000717
- thumb_func_end sub_8080238
-
- thumb_func_start sub_8080338
-sub_8080338: @ 8080338
- push {r4,lr}
- adds r3, r0, 0
- ldr r0, _08080388 @ =gUnknown_08396FC4
- ldr r1, [r0]
- movs r2, 0xE2
- lsls r2, 3
- adds r0, r1, r2
- ldrh r0, [r0]
- strh r0, [r3, 0x26]
- ldr r4, _0808038C @ =0x0000070e
- adds r2, r1, r4
- ldrh r1, [r2]
- adds r1, 0x20
- movs r4, 0x2E
- ldrsh r0, [r3, r4]
- lsls r0, 6
- adds r1, r0
- strh r1, [r3, 0x20]
- lsls r1, 16
- ldr r0, _08080390 @ =0x010f0000
- cmp r1, r0
- ble _08080380
- movs r0, 0xF0
- lsls r0, 1
- adds r1, r0, 0
- ldrh r2, [r2]
- adds r1, r2
- movs r4, 0x2E
- ldrsh r2, [r3, r4]
- movs r0, 0x4
- subs r0, r2
- lsls r0, 6
- subs r1, r0
- ldr r0, _08080394 @ =0x000001ff
- ands r1, r0
- strh r1, [r3, 0x20]
-_08080380:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08080388: .4byte gUnknown_08396FC4
-_0808038C: .4byte 0x0000070e
-_08080390: .4byte 0x010f0000
-_08080394: .4byte 0x000001ff
- thumb_func_end sub_8080338
-
- thumb_func_start sub_8080398
-sub_8080398: @ 8080398
- push {lr}
- adds r2, r0, 0
- ldrh r0, [r2, 0x34]
- subs r0, 0x1
- strh r0, [r2, 0x34]
- lsls r0, 16
- asrs r0, 16
- movs r1, 0x1
- negs r1, r1
- cmp r0, r1
- bne _080803B2
- ldr r0, _080803B8 @ =sub_80803BC
- str r0, [r2, 0x1C]
-_080803B2:
- pop {r0}
- bx r0
- .align 2, 0
-_080803B8: .4byte sub_80803BC
- thumb_func_end sub_8080398
-
- thumb_func_start sub_80803BC
-sub_80803BC: @ 80803BC
- push {r4,r5,lr}
- adds r5, r0, 0
- ldrh r0, [r5, 0x22]
- subs r0, 0x1
- strh r0, [r5, 0x22]
- lsls r0, 16
- asrs r0, 16
- movs r1, 0x30
- negs r1, r1
- cmp r0, r1
- bge _080803DA
- movs r0, 0xD0
- strh r0, [r5, 0x22]
- movs r0, 0x4
- strh r0, [r5, 0x2E]
-_080803DA:
- movs r0, 0x2E
- ldrsh r4, [r5, r0]
- ldr r3, _0808042C @ =gSineTable
- movs r2, 0x30
- ldrsh r1, [r5, r2]
- lsls r0, r1, 1
- adds r0, r3
- movs r2, 0
- ldrsh r0, [r0, r2]
- adds r2, r4, 0
- muls r2, r0
- adds r1, 0x40
- lsls r1, 1
- adds r1, r3
- movs r3, 0
- ldrsh r0, [r1, r3]
- muls r0, r4
- lsrs r2, 8
- strh r2, [r5, 0x24]
- lsrs r0, 8
- strh r0, [r5, 0x26]
- ldrh r0, [r5, 0x30]
- adds r0, 0xA
- movs r1, 0xFF
- ands r0, r1
- strh r0, [r5, 0x30]
- ldrh r0, [r5, 0x32]
- adds r0, 0x1
- strh r0, [r5, 0x32]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x8
- ble _08080426
- movs r0, 0
- strh r0, [r5, 0x32]
- ldrh r0, [r5, 0x2E]
- adds r0, 0x1
- strh r0, [r5, 0x2E]
-_08080426:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0808042C: .4byte gSineTable
- thumb_func_end sub_80803BC
-
- thumb_func_start sub_8080430
-sub_8080430: @ 8080430
- ldr r0, _08080450 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r0, _08080454 @ =0x000006cc
- adds r2, r1, r0
- movs r0, 0
- strh r0, [r2]
- ldr r0, _08080458 @ =0x000006c1
- adds r2, r1, r0
- movs r0, 0x3
- strb r0, [r2]
- ldr r0, _0808045C @ =0x000006c2
- adds r1, r0
- movs r0, 0x14
- strb r0, [r1]
- bx lr
- .align 2, 0
-_08080450: .4byte gUnknown_08396FC4
-_08080454: .4byte 0x000006cc
-_08080458: .4byte 0x000006c1
-_0808045C: .4byte 0x000006c2
- thumb_func_end sub_8080430
-
- thumb_func_start sub_8080460
-sub_8080460: @ 8080460
- push {lr}
- bl sub_8080430
- pop {r0}
- bx r0
- thumb_func_end sub_8080460
-
- thumb_func_start nullsub_56
-nullsub_56: @ 808046C
- bx lr
- thumb_func_end nullsub_56
-
- thumb_func_start sub_8080470
-sub_8080470: @ 8080470
- movs r0, 0
- bx lr
- thumb_func_end sub_8080470
-
- thumb_func_start sub_8080474
-sub_8080474: @ 8080474
- push {r4,r5,lr}
- bl sub_807F49C
- ldr r0, _080804B4 @ =gUnknown_08396FC4
- ldr r4, [r0]
- ldr r1, _080804B8 @ =0x0000072e
- adds r0, r4, r1
- ldrb r5, [r0]
- cmp r5, 0
- bne _080804AC
- ldr r0, _080804BC @ =gUnknown_0839AC70
- bl LoadSpriteSheet
- movs r2, 0xE5
- lsls r2, 3
- adds r0, r4, r2
- strh r5, [r0]
- ldr r0, _080804C0 @ =gUnknown_0839AC68
- ldrb r1, [r0]
- subs r2, 0x2
- adds r0, r4, r2
- strh r1, [r0]
- ldr r1, _080804C4 @ =0x0000072a
- adds r0, r4, r1
- strh r5, [r0]
- adds r2, 0x6
- adds r0, r4, r2
- strh r5, [r0]
-_080804AC:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080804B4: .4byte gUnknown_08396FC4
-_080804B8: .4byte 0x0000072e
-_080804BC: .4byte gUnknown_0839AC70
-_080804C0: .4byte gUnknown_0839AC68
-_080804C4: .4byte 0x0000072a
- thumb_func_end sub_8080474
-
- thumb_func_start sub_80804C8
-sub_80804C8: @ 80804C8
- push {r4,lr}
- bl sub_8080474
- ldr r0, _080804F0 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _080804F4 @ =0x000006d2
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- bne _080804E8
- adds r4, r1, r2
-_080804DE:
- bl sub_80804F8
- ldrb r0, [r4]
- cmp r0, 0
- beq _080804DE
-_080804E8:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080804F0: .4byte gUnknown_08396FC4
-_080804F4: .4byte 0x000006d2
- thumb_func_end sub_80804C8
-
- thumb_func_start sub_80804F8
-sub_80804F8: @ 80804F8
- push {r4-r7,lr}
- bl sub_807F52C
- ldr r0, _08080558 @ =gUnknown_08396FC4
- ldr r5, [r0]
- ldr r0, _0808055C @ =0x00000726
- adds r4, r5, r0
- ldrh r0, [r4]
- adds r0, 0x1
- movs r6, 0
- strh r0, [r4]
- ldr r1, _08080560 @ =0x0000ffff
- adds r7, r1, 0
- ldr r2, _08080564 @ =gUnknown_0839AC68
- movs r1, 0xE5
- lsls r1, 3
- adds r3, r5, r1
- ldrh r1, [r3]
- adds r1, r2
- lsls r0, 16
- lsrs r0, 16
- ldrb r1, [r1]
- cmp r0, r1
- bls _08080550
- strh r6, [r4]
- ldrh r0, [r3]
- adds r0, 0x1
- strh r0, [r3]
- ands r0, r7
- cmp r0, 0x7
- bls _08080538
- strh r6, [r3]
-_08080538:
- ldr r0, _08080568 @ =0x0000072a
- adds r4, r5, r0
- ldrh r0, [r4]
- bl sub_8080588
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- ands r0, r7
- cmp r0, 0xC
- bls _08080550
- strh r6, [r4]
-_08080550:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08080558: .4byte gUnknown_08396FC4
-_0808055C: .4byte 0x00000726
-_08080560: .4byte 0x0000ffff
-_08080564: .4byte gUnknown_0839AC68
-_08080568: .4byte 0x0000072a
- thumb_func_end sub_80804F8
-
- thumb_func_start sub_808056C
-sub_808056C: @ 808056C
- push {lr}
- bl sub_807F5EC
- lsls r0, 24
- cmp r0, 0
- beq _0808057C
- movs r0, 0x1
- b _08080582
-_0808057C:
- bl sub_8080610
- movs r0, 0
-_08080582:
- pop {r1}
- bx r1
- thumb_func_end sub_808056C
-
- thumb_func_start sub_8080588
-sub_8080588: @ 8080588
- push {r4,lr}
- lsls r0, 16
- ldr r1, _080805F8 @ =gUnknown_0839AC78
- lsrs r0, 14
- adds r3, r0, r1
- adds r1, 0x2
- adds r0, r1
- ldr r1, _080805FC @ =gSpriteCoordOffsetY
- ldrh r2, [r0]
- ldrh r0, [r1]
- subs r2, r0
- ldr r0, _08080600 @ =gSpriteTemplate_839ACBC
- movs r4, 0
- ldrsh r1, [r3, r4]
- lsls r2, 16
- asrs r2, 16
- movs r3, 0
- bl CreateSpriteAtEnd
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x40
- beq _080805F0
- ldr r0, _08080604 @ =gSprites
- lsls r1, r2, 4
- adds r1, r2
- lsls r1, 2
- adds r1, r0
- ldrb r2, [r1, 0x5]
- movs r0, 0xD
- negs r0, r0
- ands r0, r2
- movs r2, 0x4
- orrs r0, r2
- strb r0, [r1, 0x5]
- adds r3, r1, 0
- adds r3, 0x3E
- ldrb r0, [r3]
- movs r2, 0x2
- orrs r0, r2
- strb r0, [r3]
- movs r0, 0
- strh r0, [r1, 0x2E]
- strh r0, [r1, 0x30]
- strh r0, [r1, 0x32]
- ldr r0, _08080608 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r0, _0808060C @ =0x0000072c
- adds r1, r0
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
-_080805F0:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080805F8: .4byte gUnknown_0839AC78
-_080805FC: .4byte gSpriteCoordOffsetY
-_08080600: .4byte gSpriteTemplate_839ACBC
-_08080604: .4byte gSprites
-_08080608: .4byte gUnknown_08396FC4
-_0808060C: .4byte 0x0000072c
- thumb_func_end sub_8080588
-
- thumb_func_start sub_8080610
-sub_8080610: @ 8080610
- push {r4,r5,lr}
- movs r4, 0
- ldr r5, _08080648 @ =gSprites
-_08080616:
- lsls r0, r4, 4
- adds r0, r4
- lsls r2, r0, 2
- adds r0, r5, 0
- adds r0, 0x14
- adds r0, r2, r0
- ldr r1, [r0]
- ldr r0, _0808064C @ =gSpriteTemplate_839ACBC
- cmp r1, r0
- bne _08080630
- adds r0, r2, r5
- bl DestroySprite
-_08080630:
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r4, 0x3F
- bls _08080616
- ldr r0, _08080650 @ =0x00001205
- bl FreeSpriteTilesByTag
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08080648: .4byte gSprites
-_0808064C: .4byte gSpriteTemplate_839ACBC
-_08080650: .4byte 0x00001205
- thumb_func_end sub_8080610
-
- thumb_func_start unc_0807DAB4
-unc_0807DAB4: @ 8080654
- push {lr}
- adds r1, r0, 0
- ldrh r0, [r1, 0x2E]
- movs r2, 0
- adds r0, 0x2
- strh r0, [r1, 0x2E]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x8
- ble _08080694
- strh r2, [r1, 0x2E]
- movs r3, 0x30
- ldrsh r0, [r1, r3]
- cmp r0, 0
- bne _08080686
- ldrh r0, [r1, 0x24]
- adds r0, 0x1
- strh r0, [r1, 0x24]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x4
- ble _08080694
- movs r0, 0x1
- strh r0, [r1, 0x30]
- b _08080694
-_08080686:
- ldrh r0, [r1, 0x24]
- subs r0, 0x1
- strh r0, [r1, 0x24]
- lsls r0, 16
- cmp r0, 0
- bgt _08080694
- strh r2, [r1, 0x30]
-_08080694:
- ldrh r0, [r1, 0x22]
- subs r0, 0x3
- strh r0, [r1, 0x22]
- ldrh r0, [r1, 0x32]
- adds r0, 0x1
- strh r0, [r1, 0x32]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x77
- ble _080806AE
- adds r0, r1, 0
- bl DestroySprite
-_080806AE:
- pop {r0}
- bx r0
- thumb_func_end unc_0807DAB4
-
- thumb_func_start SetSav1Weather
-SetSav1Weather: @ 80806B4
- push {r4,r5,lr}
- ldr r4, _080806D4 @ =gSaveBlock1
- adds r4, 0x2E
- ldrb r5, [r4]
- lsls r0, 24
- lsrs r0, 24
- bl TranslateWeatherNum
- strb r0, [r4]
- ldrb r0, [r4]
- adds r1, r5, 0
- bl UpdateRainCounter
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080806D4: .4byte gSaveBlock1
- thumb_func_end SetSav1Weather
-
- thumb_func_start GetSav1Weather
-GetSav1Weather: @ 80806D8
- ldr r0, _080806E0 @ =gSaveBlock1
- adds r0, 0x2E
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_080806E0: .4byte gSaveBlock1
- thumb_func_end GetSav1Weather
-
- thumb_func_start sub_80806E4
-sub_80806E4: @ 80806E4
- push {r4,r5,lr}
- ldr r4, _08080704 @ =gSaveBlock1
- adds r4, 0x2E
- ldrb r5, [r4]
- ldr r0, _08080708 @ =gMapHeader
- ldrb r0, [r0, 0x16]
- bl TranslateWeatherNum
- strb r0, [r4]
- ldrb r0, [r4]
- adds r1, r5, 0
- bl UpdateRainCounter
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08080704: .4byte gSaveBlock1
-_08080708: .4byte gMapHeader
- thumb_func_end sub_80806E4
-
- thumb_func_start SetWeather
-SetWeather: @ 808070C
- push {lr}
- bl SetSav1Weather
- bl GetSav1Weather
- lsls r0, 24
- lsrs r0, 24
- bl DoWeatherEffect
- pop {r0}
- bx r0
- thumb_func_end SetWeather
-
- thumb_func_start SetWeather_Unused
-SetWeather_Unused: @ 8080724
- push {lr}
- bl SetSav1Weather
- bl GetSav1Weather
- lsls r0, 24
- lsrs r0, 24
- bl sub_807C988
- pop {r0}
- bx r0
- thumb_func_end SetWeather_Unused
-
- thumb_func_start DoCurrentWeather
-DoCurrentWeather: @ 808073C
- push {lr}
- bl GetSav1Weather
- lsls r0, 24
- lsrs r0, 24
- bl DoWeatherEffect
- pop {r0}
- bx r0
- thumb_func_end DoCurrentWeather
-
- thumb_func_start sub_8080750
-sub_8080750: @ 8080750
- push {lr}
- bl GetSav1Weather
- lsls r0, 24
- lsrs r0, 24
- bl sub_807C988
- pop {r0}
- bx r0
- thumb_func_end sub_8080750
-
- thumb_func_start TranslateWeatherNum
-TranslateWeatherNum: @ 8080764
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x15
- bhi _0808082C
- lsls r0, 2
- ldr r1, _08080778 @ =_0808077C
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08080778: .4byte _0808077C
- .align 2, 0
-_0808077C:
- .4byte _0808082C
- .4byte _080807D4
- .4byte _080807D8
- .4byte _080807DC
- .4byte _080807E0
- .4byte _080807E4
- .4byte _080807E8
- .4byte _080807EC
- .4byte _080807F0
- .4byte _080807F4
- .4byte _080807F8
- .4byte _080807FC
- .4byte _08080800
- .4byte _08080804
- .4byte _08080808
- .4byte _0808082C
- .4byte _0808082C
- .4byte _0808082C
- .4byte _0808082C
- .4byte _0808082C
- .4byte _0808080C
- .4byte _08080814
-_080807D4:
- movs r0, 0x1
- b _0808082E
-_080807D8:
- movs r0, 0x2
- b _0808082E
-_080807DC:
- movs r0, 0x3
- b _0808082E
-_080807E0:
- movs r0, 0x4
- b _0808082E
-_080807E4:
- movs r0, 0x5
- b _0808082E
-_080807E8:
- movs r0, 0x6
- b _0808082E
-_080807EC:
- movs r0, 0x7
- b _0808082E
-_080807F0:
- movs r0, 0x8
- b _0808082E
-_080807F4:
- movs r0, 0x9
- b _0808082E
-_080807F8:
- movs r0, 0xA
- b _0808082E
-_080807FC:
- movs r0, 0xB
- b _0808082E
-_08080800:
- movs r0, 0xC
- b _0808082E
-_08080804:
- movs r0, 0xD
- b _0808082E
-_08080808:
- movs r0, 0xE
- b _0808082E
-_0808080C:
- ldr r1, _08080810 @ =gUnknown_0839ACD4
- b _08080816
- .align 2, 0
-_08080810: .4byte gUnknown_0839ACD4
-_08080814:
- ldr r1, _08080824 @ =gUnknown_0839ACD8
-_08080816:
- ldr r0, _08080828 @ =gSaveBlock1
- adds r0, 0x2F
- ldrb r0, [r0]
- adds r0, r1
- ldrb r0, [r0]
- b _0808082E
- .align 2, 0
-_08080824: .4byte gUnknown_0839ACD8
-_08080828: .4byte gSaveBlock1
-_0808082C:
- movs r0, 0
-_0808082E:
- pop {r1}
- bx r1
- thumb_func_end TranslateWeatherNum
-
- thumb_func_start UpdateWeatherPerDay
-UpdateWeatherPerDay: @ 8080834
- lsls r0, 16
- ldr r2, _08080850 @ =gSaveBlock1
- 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
-_08080850: .4byte gSaveBlock1
- thumb_func_end UpdateWeatherPerDay
-
- thumb_func_start UpdateRainCounter
-UpdateRainCounter: @ 8080854
- push {lr}
- lsls r0, 24
- lsls r1, 24
- lsrs r2, r0, 24
- cmp r0, r1
- beq _0808086E
- cmp r2, 0x3
- beq _08080868
- cmp r2, 0x5
- bne _0808086E
-_08080868:
- movs r0, 0x28
- bl IncrementGameStat
-_0808086E:
- pop {r0}
- bx r0
- thumb_func_end UpdateRainCounter
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/ice.s b/asm/ice.s
index 6314ba5b5..285b48e1b 100755
--- a/asm/ice.s
+++ b/asm/ice.s
@@ -1382,7 +1382,7 @@ _080D812A:
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
@@ -1423,7 +1423,7 @@ _080D81C0: .4byte 0x040000d4
_080D81C4: .4byte 0x85000400
_080D81C8: .4byte gWeatherFog1Tiles
_080D81CC: .4byte 0x80000400
-_080D81D0: .4byte gWeatherFog1Tilemap
+_080D81D0: .4byte gBattleAnimFogTilemap
_080D81D4: .4byte gUnknown_083970E8
_080D81D8: .4byte gTasks
_080D81DC: .4byte sub_80D81E0
@@ -1774,7 +1774,7 @@ _080D845E:
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
@@ -1817,7 +1817,7 @@ _080D84F8: .4byte 0x040000d4
_080D84FC: .4byte 0x85000400
_080D8500: .4byte gWeatherFog1Tiles
_080D8504: .4byte 0x80000400
-_080D8508: .4byte gWeatherFog1Tilemap
+_080D8508: .4byte gBattleAnimFogTilemap
_080D850C: .4byte gUnknown_083970E8
_080D8510: .4byte gTasks
_080D8514: .4byte 0x0000ffff
diff --git a/asm/pc_screen_effect.s b/asm/pc_screen_effect.s
index d549d85e1..3c4f96e32 100755
--- a/asm/pc_screen_effect.s
+++ b/asm/pc_screen_effect.s
@@ -6,185 +6,6 @@
.text
- thumb_func_start sub_80C5CD4
-sub_80C5CD4: @ 80C5CD4
- push {r4-r7,lr}
- sub sp, 0x28
- adds r7, r0, 0
- ldr r0, _080C5D64 @ =gUnknown_083D1898
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [sp, 0x18]
- str r1, [sp, 0x1C]
- ldr r0, _080C5D68 @ =gUnknown_083D18A0
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [sp, 0x20]
- str r1, [sp, 0x24]
- mov r1, sp
- ldr r0, _080C5D6C @ =gSpriteTemplate_83D18A8
- ldm r0!, {r2-r4}
- stm r1!, {r2-r4}
- ldm r0!, {r2-r4}
- stm r1!, {r2-r4}
- ldrh r3, [r7]
- lsls r2, r3, 16
- add r0, sp, 0x18
- ldrh r1, [r0, 0x4]
- orrs r1, r2
- str r1, [r0, 0x4]
- mov r1, sp
- movs r6, 0
- strh r3, [r1]
- ldrh r2, [r7, 0x2]
- ldr r5, _080C5D70 @ =0xffff0000
- add r4, sp, 0x20
- ldr r1, [r4, 0x4]
- ands r1, r5
- orrs r1, r2
- str r1, [r4, 0x4]
- mov r1, sp
- strh r2, [r1, 0x2]
- bl LoadSpriteSheet
- adds r0, r4, 0
- bl LoadSpritePalette
- movs r0, 0x1
- strh r0, [r7, 0xC]
- strh r6, [r7, 0xA]
- strh r6, [r7, 0x8]
- ldrh r0, [r7, 0x2]
- bl IndexOfSpritePaletteTag
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x80
- lsls r1, 9
- lsls r1, r0
- bics r5, r1
- str r5, [r7, 0x10]
- ldrh r0, [r7, 0x4]
- cmp r0, 0
- bne _080C5D4E
- movs r0, 0x10
- strh r0, [r7, 0x4]
-_080C5D4E:
- ldrh r0, [r7, 0x6]
- cmp r0, 0
- bne _080C5D58
- movs r0, 0x14
- strh r0, [r7, 0x6]
-_080C5D58:
- ldr r0, _080C5D74 @ =gUnknown_020387EC
- str r7, [r0]
- movs r4, 0
- ldr r5, _080C5D78 @ =gSprites
- b _080C5D94
- .align 2, 0
-_080C5D64: .4byte gUnknown_083D1898
-_080C5D68: .4byte gUnknown_083D18A0
-_080C5D6C: .4byte gSpriteTemplate_83D18A8
-_080C5D70: .4byte 0xffff0000
-_080C5D74: .4byte gUnknown_020387EC
-_080C5D78: .4byte gSprites
-_080C5D7C:
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r5
- ldrh r1, [r7, 0x4]
- cmp r4, 0x3
- bhi _080C5D8C
- negs r1, r1
-_080C5D8C:
- strh r1, [r0, 0x2E]
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
-_080C5D94:
- cmp r4, 0x7
- bhi _080C5DB2
- lsls r1, r4, 5
- adds r1, 0x8
- lsls r1, 16
- asrs r1, 16
- mov r0, sp
- movs r2, 0x50
- movs r3, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x40
- bne _080C5D7C
-_080C5DB2:
- ldr r1, _080C5DC8 @ =REG_BLDCNT
- movs r0, 0xBF
- strh r0, [r1]
- adds r1, 0x4
- movs r0, 0x10
- strh r0, [r1]
- add sp, 0x28
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080C5DC8: .4byte REG_BLDCNT
- thumb_func_end sub_80C5CD4
-
- thumb_func_start sub_80C5DCC
-sub_80C5DCC: @ 80C5DCC
- push {r4,lr}
- ldr r4, _080C5E10 @ =gUnknown_020387EC
- ldr r1, [r4]
- ldrh r0, [r1, 0x8]
- cmp r0, 0
- bne _080C5DF0
- ldr r0, [r1, 0x10]
- ldr r2, _080C5E14 @ =0x0000ffff
- movs r1, 0x10
- bl BlendPalettes
- ldr r0, _080C5E18 @ =sub_80C603C
- bl sub_80C61B0
- ldr r1, [r4]
- ldrh r0, [r1, 0x8]
- adds r0, 0x1
- strh r0, [r1, 0x8]
-_080C5DF0:
- ldr r1, [r4]
- ldrh r0, [r1, 0xA]
- cmp r0, 0x7
- bls _080C5E0A
- ldrh r0, [r1, 0x6]
- ldrh r2, [r1, 0xC]
- adds r0, r2
- movs r2, 0
- strh r0, [r1, 0xC]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x4F
- bgt _080C5E1C
-_080C5E0A:
- movs r0, 0
- b _080C5E2E
- .align 2, 0
-_080C5E10: .4byte gUnknown_020387EC
-_080C5E14: .4byte 0x0000ffff
-_080C5E18: .4byte sub_80C603C
-_080C5E1C:
- movs r0, 0x50
- strh r0, [r1, 0xC]
- ldr r0, _080C5E34 @ =REG_BLDCNT
- strh r2, [r0]
- adds r0, 0x4
- strh r2, [r0]
- bl ClearGpuRegBits
- movs r0, 0x1
-_080C5E2E:
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080C5E34: .4byte REG_BLDCNT
- thumb_func_end sub_80C5DCC
-
thumb_func_start sub_80C5E38
sub_80C5E38: @ 80C5E38
push {r4-r7,lr}
diff --git a/common_syms/engine/rng.txt b/common_syms/engine/random.txt
index 794439ea5..794439ea5 100644
--- a/common_syms/engine/rng.txt
+++ b/common_syms/engine/random.txt
diff --git a/data/field_weather.s b/data/field_weather.s
deleted file mode 100644
index 1b0076451..000000000
--- a/data/field_weather.s
+++ /dev/null
@@ -1,456 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .section .rodata
-
- .align 2
-gUnknown_08396FC4:: @ 8396FC4
- .4byte gUnknown_0202F7E8
-
- .align 2
-gUnknown_08396FC8:: @ 8396FC8
- .4byte sub_807CAE8, nullsub_38, sub_807CAE8, sub_807CB0C
- .4byte sub_807DE78, sub_807DEF4, sub_807DEC4, sub_807DF54
- .4byte sub_807DF9C, nullsub_55, sub_807DFC0, sub_807DFD0
- .4byte sub_807E364, sub_807E400, sub_807E3D0, sub_807E460
- .4byte sub_807E9C8, snowflakes_progress2, sub_807EA18, sub_807EAC0
- .4byte sub_807EE80, sub_807EFC0, sub_807EEF4, sub_807F34C
- .4byte sub_807F49C, sub_807F52C, sub_807F4FC, sub_807F5EC
- .4byte sub_807F7F8, sub_807F888, sub_807F858, sub_807F934
- .4byte sub_807FE9C, sub_807FF4C, sub_807FF1C, sub_807FFC8
- .4byte sub_807FB24, sub_807FBD8, sub_807FBA8, sub_807FC3C
- .4byte sub_807F49C, sub_807F52C, sub_807F4FC, sub_807F5EC
- .4byte sub_8080430, nullsub_56, sub_8080460, sub_8080470
- .4byte sub_807E110, sub_807E174, sub_807E144, sub_807E258
- .4byte sub_807EF24, sub_807EFC0, sub_807EF90, sub_807F34C
- .4byte sub_8080474, sub_80804F8, sub_80804C8, sub_808056C
-
- .align 2
-gUnknown_083970B8:: @ 83970B8
- .4byte sub_807CC24
- .4byte sub_807CCAC
- .4byte nullsub_39
- .4byte nullsub_39
-
-gUnknown_083970C8:: @ 83970C8
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 0
- .byte 0
- .byte 2
- .byte 1
- .byte 2
- .byte 2
- .byte 2
- .byte 2
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 2
- .byte 1
- .byte 1
- .byte 1
- .byte 1
- .byte 1
-
- .align 2
-gUnknown_083970E8:: @ 83970E8
- .incbin "graphics/weather/0.gbapal"
-
- .align 2
-gUnknown_08397108:: @ 8397108
- .incbin "graphics/weather/1.gbapal"
-
- .align 2
-gUnknown_08397128:: @ 8397128
- .incbin "graphics/weather/2.gbapal"
-
- .align 2
-WeatherFog0Tiles: @ 8397148
- .incbin "graphics/weather/fog0.4bpp"
-
- .align 2
-gWeatherFog1Tiles:: @ 8397948
- .incbin "graphics/weather/fog1.4bpp"
-
- .align 2
-WeatherCloudTiles: @ 8398148
- .incbin "graphics/weather/cloud.4bpp"
-
- .align 2
-gSpriteImage_8398948:: @ 8398948
- .incbin "graphics/weather/snow0.4bpp"
-
- .align 2
-gSpriteImage_8398968:: @ 8398968
- .incbin "graphics/weather/snow1.4bpp"
-
- .align 2
-WeatherBubbleTiles: @ 8398988
- .incbin "graphics/weather/bubble.4bpp"
-
- .align 2
-WeatherAshTiles: @ 83989C8
- .incbin "graphics/weather/ash.4bpp"
-
- .align 2
-WeatherRainTiles: @ 83999C8
- .incbin "graphics/weather/rain.4bpp"
-
- .align 2
-WeatherSandstormTiles: @ 8399FC8
- .incbin "graphics/weather/sandstorm.4bpp"
-
- .align 1
-gUnknown_0839A9C8:: @ 839A9C8
- .2byte 0, 66
- .2byte 5, 73
- .2byte 10, 78
-
- .align 2
-gUnknown_0839A9D4:: @ 839A9D4
- obj_tiles WeatherCloudTiles, 0x800, 0x1200
-
- .align 2
-gOamData_839A9DC:: @ 839A9DC
- .2byte 0x0400
- .2byte 0xC000
- .2byte 0x0C00
-
- .align 2
-gSpriteAnim_839A9E4:: @ 839A9E4
- obj_image_anim_frame 0, 16
- obj_image_anim_end
-
- .align 2
-gSpriteAnimTable_839A9EC:: @ 839A9EC
- .4byte gSpriteAnim_839A9E4
-
- .align 2
-gSpriteTemplate_839A9F0:: @ 839A9F0
- spr_template 4608, 4609, gOamData_839A9DC, gSpriteAnimTable_839A9EC, NULL, gDummySpriteAffineAnimTable, sub_807E0F4
-
- .align 1
-gUnknown_0839AA08:: @ 839AA08
- .2byte 0, 0
- .2byte 0, 160
- .2byte 0, 64
- .2byte 144, 224
- .2byte 144, 128
- .2byte 32, 32
- .2byte 32, 192
- .2byte 32, 96
- .2byte 72, 128
- .2byte 72, 32
- .2byte 72, 192
- .2byte 216, 96
- .2byte 216, 0
- .2byte 104, 160
- .2byte 104, 64
- .2byte 104, 224
- .2byte 144, 0
- .2byte 144, 160
- .2byte 144, 64
- .2byte 32, 224
- .2byte 32, 128
- .2byte 72, 32
- .2byte 72, 192
- .2byte 48, 96
-
- .align 2
-gOamData_839AA68:: @ 839AA68
- .2byte 0x8000
- .2byte 0x8000
- .2byte 0x2400
-
- .align 2
-gSpriteAnim_839AA70:: @ 839AA70
- obj_image_anim_frame 0, 16
- obj_image_anim_jump 0
-
- .align 2
-gSpriteAnim_839AA78:: @ 839AA78
- obj_image_anim_frame 8, 3
- obj_image_anim_frame 32, 2
- obj_image_anim_frame 40, 2
- obj_image_anim_end
-
- .align 2
-gSpriteAnim_839AA88:: @ 839AA88
- obj_image_anim_frame 8, 3
- obj_image_anim_frame 16, 3
- obj_image_anim_frame 24, 4
- obj_image_anim_end
-
- .align 2
-gSpriteAnimTable_839AA98:: @ 839AA98
- .4byte gSpriteAnim_839AA70
- .4byte gSpriteAnim_839AA78
- .4byte gSpriteAnim_839AA88
-
- .align 2
-gSpriteTemplate_839AAA4:: @ 839AAA4
- spr_template 4614, 4608, gOamData_839AA68, gSpriteAnimTable_839AA98, NULL, gDummySpriteAffineAnimTable, sub_807E5C0
-
- .align 1
-gUnknown_0839AABC:: @ 839AABC
- .2byte -104, 208
- .2byte -160, 320
-
- .align 1
-gUnknown_0839AAC4:: @ 839AAC4
- .2byte 18, 7, 12, 10
-
- .align 2
-gUnknown_0839AACC:: @ 839AACC
- obj_tiles WeatherRainTiles, 0x600, 0x1206
-
- .align 2
-gOamData_839AAD4:: @ 839AAD4
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0400
-
- .align 2
-gSpriteImageTable_839AADC:: @ 839AADC
- obj_frame_tiles gSpriteImage_8398948, 0x20
- obj_frame_tiles gSpriteImage_8398968, 0x20
-
- .align 2
-gSpriteAnim_839AAEC:: @ 839AAEC
- obj_image_anim_frame 0, 16
- obj_image_anim_end
-
- .align 2
-gSpriteAnim_839AAF4:: @ 839AAF4
- obj_image_anim_frame 1, 16
- obj_image_anim_end
-
- .align 2
-gSpriteAnimTable_839AAFC:: @ 839AAFC
- .4byte gSpriteAnim_839AAEC
- .4byte gSpriteAnim_839AAF4
-
- .align 2
-gSpriteTemplate_839AB04:: @ 839AB04
- spr_template 0xFFFF, 4608, gOamData_839AAD4, gSpriteAnimTable_839AAFC, gSpriteImageTable_839AADC, gDummySpriteAffineAnimTable, sub_807ED48
-
-@ unused data
- .2byte 0
- .2byte 6
- .2byte 6
- .2byte 12
- .2byte 18
- .2byte 42
- .2byte 300
- .2byte 300
-
- .align 2
-gOamData_839AB2C:: @ 839AB2C
- .2byte 0x0400
- .2byte 0xC000
- .2byte 0x0800
-
- .align 2
-gSpriteAnim_839AB34:: @ 839AB34
- obj_image_anim_frame 0, 16
- obj_image_anim_end
-
- .align 2
-gSpriteAnim_839AB3C:: @ 839AB3C
- obj_image_anim_frame 32, 16
- obj_image_anim_end
-
- .align 2
-gSpriteAnim_839AB44:: @ 839AB44
- obj_image_anim_frame 64, 16
- obj_image_anim_end
-
- .align 2
-gSpriteAnim_839AB4C:: @ 839AB4C
- obj_image_anim_frame 96, 16
- obj_image_anim_end
-
- .align 2
-gSpriteAnim_839AB54:: @ 839AB54
- obj_image_anim_frame 128, 16
- obj_image_anim_end
-
- .align 2
-gSpriteAnim_839AB5C:: @ 839AB5C
- obj_image_anim_frame 160, 16
- obj_image_anim_end
-
- .align 2
-gSpriteAnimTable_839AB64:: @ 839AB64
- .4byte gSpriteAnim_839AB34
- .4byte gSpriteAnim_839AB3C
- .4byte gSpriteAnim_839AB44
- .4byte gSpriteAnim_839AB4C
- .4byte gSpriteAnim_839AB54
- .4byte gSpriteAnim_839AB5C
-
- .align 2
-gSpriteAffineAnim_839AB7C:: @ 839AB7C
- obj_rot_scal_anim_frame 0x200, 0x200, 0, 0
- obj_rot_scal_anim_end
-
- .align 2
-gSpriteAffineAnimTable_839AB8C:: @ 839AB8C
- .4byte gSpriteAffineAnim_839AB7C
-
- .align 2
-gSpriteTemplate_839AB90:: @ 839AB90
- spr_template 4609, 4608, gOamData_839AB2C, gSpriteAnimTable_839AB64, NULL, gSpriteAffineAnimTable_839AB8C, sub_807F688
-
- .align 2
-gUnknown_0839ABA8:: @ 839ABA8
- obj_tiles gWeatherFog1Tiles, 0x800, 0x1201
-
- .align 2
-gUnknown_0839ABB0:: @ 839ABB0
- obj_tiles WeatherAshTiles, 0x1000, 0x1202
-
- .align 2
-gOamData_839ABB8:: @ 839ABB8
- .2byte 0x0400
- .2byte 0xC000
- .2byte 0xF400
-
- .align 2
-gSpriteAnim_839ABC0:: @ 839ABC0
- obj_image_anim_frame 0, 60
- obj_image_anim_frame 64, 60
- obj_image_anim_jump 0
-
- .align 2
-gSpriteAnimTable_839ABCC:: @ 839ABCC
- .4byte gSpriteAnim_839ABC0
-
- .align 2
-gSpriteTemplate_839ABD0:: @ 839ABD0
- spr_template 4610, 4608, gOamData_839ABB8, gSpriteAnimTable_839ABCC, NULL, gDummySpriteAffineAnimTable, sub_807FAA8
-
- .align 2
-gUnknown_0839ABE8:: @ 839ABE8
- obj_tiles WeatherFog0Tiles, 0x800, 0x1203
-
- .align 2
-gOamData_839ABF0:: @ 839ABF0
- .2byte 0x0400
- .2byte 0xC000
- .2byte 0x0800
-
- .align 2
-gSpriteAnim_839ABF8:: @ 839ABF8
- obj_image_anim_frame 0, 16
- obj_image_anim_end
-
- .align 2
-gSpriteAnimTable_839AC00:: @ 839AC00
- .4byte gSpriteAnim_839ABF8
-
- .align 2
-gSpriteTemplate_839AC04:: @ 839AC04
- spr_template 4611, 4608, gOamData_839ABF0, gSpriteAnimTable_839AC00, NULL, gDummySpriteAffineAnimTable, sub_807FE3C
-
- .align 2
-gOamData_839AC1C:: @ 839AC1C
- .2byte 0x0400
- .2byte 0xC000
- .2byte 0x0400
-
- .align 2
-gSpriteAnim_839AC24:: @ 839AC24
- obj_image_anim_frame 0, 3
- obj_image_anim_end
-
- .align 2
-gSpriteAnim_839AC2C:: @ 839AC2C
- obj_image_anim_frame 64, 3
- obj_image_anim_end
-
- .align 2
-gSpriteAnimTable_839AC34:: @ 839AC34
- .4byte gSpriteAnim_839AC24
- .4byte gSpriteAnim_839AC2C
-
- .align 2
-gSpriteTemplate_839AC3C:: @ 839AC3C
- spr_template 4612, 4609, gOamData_839AC1C, gSpriteAnimTable_839AC34, NULL, gDummySpriteAffineAnimTable, sub_8080338
-
- .align 2
-gUnknown_0839AC54:: @ 839AC54
- obj_tiles WeatherSandstormTiles, 0xA00, 0x1204
-
- .align 1
-gUnknown_0839AC5C:: @ 839AC5C
- .2byte 0
- .2byte 120
- .2byte 80
- .2byte 160
- .2byte 40
- .2byte 0
-
-gUnknown_0839AC68:: @ 839AC68
- .byte 40
- .byte 90
- .byte 60
- .byte 90
- .byte 2
- .byte 60
- .byte 40
- .byte 30
-
- .align 2
-gUnknown_0839AC70:: @ 839AC70
- obj_tiles WeatherBubbleTiles, 0x40, 0x1205
-
- .align 1
-gUnknown_0839AC78:: @ 839AC78
- .2byte 120, 160
- .2byte 376, 160
- .2byte 40, 140
- .2byte 296, 140
- .2byte 180, 130
- .2byte 436, 130
- .2byte 60, 160
- .2byte 436, 160
- .2byte 220, 180
- .2byte 476, 180
- .2byte 10, 90
- .2byte 266, 90
- .2byte 256, 160
-
- .align 2
-gSpriteAnim_839ACAC:: @ 839ACAC
- obj_image_anim_frame 0, 16
- obj_image_anim_frame 1, 16
- obj_image_anim_end
-
- .align 2
-gSpriteAnimTable_839ACB8:: @ 839ACB8
- .4byte gSpriteAnim_839ACAC
-
- .align 2
-gSpriteTemplate_839ACBC:: @ 839ACBC
- spr_template 4613, 4608, gOamData_837DF24, gSpriteAnimTable_839ACB8, NULL, gDummySpriteAffineAnimTable, unc_0807DAB4
-
-gUnknown_0839ACD4:: @ 839ACD4
- .byte 2, 3, 5, 3
-
-gUnknown_0839ACD8:: @ 839ACD8
- .byte 2, 2, 3, 2
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/data/pc_screen_effect.s b/data/pc_screen_effect.s
index 4f860213a..c33957945 100755
--- a/data/pc_screen_effect.s
+++ b/data/pc_screen_effect.s
@@ -4,22 +4,6 @@
.section .rodata
.align 2
-gUnknown_083D1898:: @ 83D1898
- obj_tiles gUnknownGfx_083D190C, 0x80, 0
-
- .align 2
-gUnknown_083D18A0:: @ 83D18A0
- obj_pal gUnknownPal_083D18EC, 0x0000
-
- .align 2
-gSpriteTemplate_83D18A8:: @ 83D18A8
- spr_template 0, 0, gOamData_83D18D8, gSpriteAnimTable_83D18E8, NULL, gDummySpriteAffineAnimTable, sub_80C60CC
-
- .align 2
-gSpriteTemplate_83D18C0:: @ 83D18C0
- spr_template 0, 0, gOamData_83D18D8, gSpriteAnimTable_83D18E8, NULL, gDummySpriteAffineAnimTable, sub_80C6130
-
- .align 2
gOamData_83D18D8:: @ 83D18D8
.2byte 0x4000
.2byte 0x4000
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/fog2.png
index 198c6f494..198c6f494 100644
--- a/graphics/weather/fog0.png
+++ b/graphics/weather/fog2.png
Binary files differ
diff --git a/include/field_weather.h b/include/field_weather.h
index b711f91d6..ed16b2bf6 100644
--- a/include/field_weather.h
+++ b/include/field_weather.h
@@ -1,15 +1,142 @@
#ifndef GUARD_WEATHER_H
#define GUARD_WEATHER_H
-void sub_807C828(void);
+#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_1 6
+#define WEATHER_ASH 7
+#define WEATHER_FOG_2 9
+#define WEATHER_DROUGHT 12
+#define WEATHER_RAIN_HEAVY 13
+#define WEATHER_BUBBLES 14
+
+struct Sprite;
+
+struct Weather
+{
+ union
+ {
+ struct
+ {
+ struct Sprite *rainSprites[24];
+ struct Sprite *snowflakeSprites[101];
+ struct Sprite *cloudSprites[3];
+ } s1;
+ struct
+ {
+ u8 filler0[0xA0];
+ struct Sprite *fog1Sprites[20];
+ struct Sprite *ashSprites[20];
+ struct Sprite *fog2Sprites[20];
+ struct Sprite *sandstormSprites1[20];
+ struct Sprite *sandstormSprites2[5];
+ } s2;
+ } sprites;
+ u8 unknown_200[2][32];
+ u8 filler_240[0x460-0x240];
+ u8 unk460[2][32];
+ u8 filler4A0[0x6B6-0x4A0];
+ s8 unknown_6B6;
+ u8 filler_6B7[0xC0-0xB7];
+ s8 unknown_6C0;
+ s8 unknown_6C1;
+ u8 unknown_6C2;
+ u8 unknown_6C3;
+ u16 unknown_6C4;
+ u8 unknown_6C6;
+ u8 unknown_6C7;
+ u8 unknown_6C8;
+ u8 unknown_6C9;
+ u8 unknown_6CA;
+ u8 unknown_6CB;
+ u16 initStep;
+ u16 finishStep;
+ u8 currWeather;
+ u8 nextWeather;
+ u8 weatherGfxLoaded;
+ u8 unknown_6D3;
+ u8 unknown_6D4;
+ u8 unknown_6D5;
+ u16 unknown_6D6;
+ u8 unknown_6D8;
+ u8 unknown_6D9;
+ u8 rainSpriteCount;
+ u8 unknown_6DB;
+ u8 unknown_6DC;
+ u8 rainStrength;
+ /*0x6DE*/ u8 cloudSpritesCreated;
+ u8 filler_6DF[1];
+ u16 unknown_6E0;
+ u16 unknown_6E2;
+ u8 snowflakeSpriteCount;
+ u8 unknown_6E5;
+ u16 unknown_6E6;
+ u16 thunderCounter;
+ u8 unknown_6EA;
+ u8 unknown_6EB;
+ u8 unknown_6EC;
+ u8 unknown_6ED;
+ u16 fog1ScrollPosX;
+ u16 unknown_6F0;
+ u16 unknown_6F2;
+ u8 unknown_6F4[6];
+ u8 unknown_6FA;
+ u8 fog1SpritesCreated;
+ u16 unknown_6FC;
+ u16 unknown_6FE;
+ u8 ashSpritesCreated;
+ u8 filler_701[3];
+ u32 unknown_704;
+ u32 unknown_708;
+ u8 filler_70C[2];
+ u16 unknown_70E;
+ u16 unknown_710;
+ u16 unknown_712;
+ u16 unknown_714;
+ u8 sandstormSprites1Created;
+ u8 sandstormSprites2Created;
+ u16 unknown_718;
+ u16 unknown_71A;
+ u16 unknown_71C;
+ u16 unknown_71E;
+ u16 unknown_720;
+ u16 unknown_722;
+ u8 fog2SpritesCreated;
+ u8 filler_725[1];
+ u16 unknown_726;
+ u16 unknown_728;
+ u16 unknown_72A;
+ u16 unknown_72C;
+ u8 unknown_72E;
+ u8 filler_72F;
+ u16 currBlendEVA;
+ u16 currBlendEVB;
+ u16 targetBlendEVA;
+ u16 targetBlendEVB;
+ u8 unknown_738;
+ u8 unknown_739;
+ 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 unknown_74D;
+ u8 unknown_74E;
+};
+
+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);
-u32 sub_807CB0C(void);
void sub_807CB10(void);
void sub_807CC24(void);
void sub_807CCAC(void);
@@ -30,7 +157,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);
// ...
@@ -38,7 +165,7 @@ void PlayRainSoundEffect(void);
// ...
void SetSav1Weather(u32);
u8 GetSav1Weather(void);
-void sub_80806E4(void);
+void SetSav1WeatherFromCurrMapHeader(void);
// ...
void DoCurrentWeather(void);
void sub_8080750();
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/include/rng.h b/include/random.h
index dec8c6e26..a928a97b5 100644
--- a/include/rng.h
+++ b/include/random.h
@@ -1,5 +1,5 @@
-#ifndef GUARD_RNG_H
-#define GUARD_RNG_H
+#ifndef GUARD_RANDOM_H
+#define GUARD_RANDOM_H
extern u32 gRngValue;
@@ -12,4 +12,5 @@ u16 Random(void);
//Sets the initial seed value of the pseudorandom number generator
void SeedRng(u16 seed);
-#endif // GUARD_RNG_H
+#endif // GUARD_RANDOM_H
+
diff --git a/ld_script.txt b/ld_script.txt
index eb3e414f9..4ff52a41e 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -65,7 +65,7 @@ SECTIONS {
src/pokemon/pokemon_3.o(.text);
src/de_rom_8040FE0.o(.text);
src/engine/trig.o(.text);
- src/engine/rng.o(.text);
+ src/engine/random.o(.text);
src/engine/util.o(.text);
src/engine/blend_palette.o(.text);
src/field/daycare.o(.text);
@@ -111,7 +111,7 @@ SECTIONS {
src/battle/battle_anim_807B69C.o(.text);
src/scene/title_screen.o(.text);
src/field/field_weather.o(.text);
- asm/field_weather.o(.text);
+ src/field/field_weather_effects.o(.text);
src/field/field_fadetransition.o(.text);
src/field/field_screen_effect.o(.text);
src/battle/battle_setup.o(.text);
@@ -158,6 +158,7 @@ SECTIONS {
src/script_pokemon_util_80C4BF0.o(.text);
src/field/field_poison.o(.text);
src/pokemon/pokemon_size_record.o(.text);
+ src/field/pc_screen_effect.o(.text);
asm/pc_screen_effect.o(.text);
src/field/fldeff_secretpower.o(.text);
src/field/fldeff_secret_base_pc.o(.text);
@@ -497,7 +498,7 @@ SECTIONS {
src/battle/battle_anim_807B69C.o(.rodata);
src/scene/title_screen.o(.rodata);
src/field/field_weather.o(.rodata);
- data/field_weather.o(.rodata);
+ src/field/field_weather_effects.o(.rodata);
src/field/field_screen_effect.o(.rodata);
src/battle/battle_setup.o(.rodata);
src/engine/cable_club.o(.rodata);
@@ -535,6 +536,7 @@ SECTIONS {
src/field/tv.o(.rodata);
data/contest_link_80C2020.o(.rodata);
src/pokemon/pokemon_size_record.o(.rodata);
+ src/field/pc_screen_effect.o(.rodata);
data/pc_screen_effect.o(.rodata);
data/fldeff_secretpower.o(.rodata);
data/fldeff_decoration.o(.rodata);
diff --git a/src/anim/angel_kiss.c b/src/anim/angel_kiss.c
index f6b16506a..453c4d802 100755
--- a/src/anim/angel_kiss.c
+++ b/src/anim/angel_kiss.c
@@ -3,7 +3,7 @@
#include "trig.h"
#include "battle_anim.h"
#include "sound.h"
-#include "rng.h"
+#include "random.h"
extern s16 gBattleAnimArgs[];
extern u8 gBattleAnimBankAttacker;
diff --git a/src/anim/bullet.c b/src/anim/bullet.c
index 02d1e351b..11306873a 100755
--- a/src/anim/bullet.c
+++ b/src/anim/bullet.c
@@ -3,7 +3,7 @@
#include "trig.h"
#include "battle_anim.h"
#include "sound.h"
-#include "rng.h"
+#include "random.h"
extern s16 gBattleAnimArgs[];
extern u8 gBattleAnimBankAttacker;
diff --git a/src/anim/orbs.c b/src/anim/orbs.c
index c54b5cd73..22e7d3895 100755
--- a/src/anim/orbs.c
+++ b/src/anim/orbs.c
@@ -2,7 +2,7 @@
#include "rom_8077ABC.h"
#include "trig.h"
#include "battle_anim.h"
-#include "rng.h"
+#include "random.h"
extern s16 gBattleAnimArgs[];
extern u8 gBattleAnimBankAttacker;
diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c
index 6d406c5e5..a3cd15042 100644
--- a/src/battle/battle_2.c
+++ b/src/battle/battle_2.c
@@ -13,7 +13,7 @@
#include "pokeball.h"
#include "pokedex.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "rom3.h"
#include "rom_8077ABC.h"
#include "rom_8094928.h"
diff --git a/src/battle/battle_3.c b/src/battle/battle_3.c
index 958ee0b55..263eb2be5 100644
--- a/src/battle/battle_3.c
+++ b/src/battle/battle_3.c
@@ -8,7 +8,7 @@
#include "species.h"
#include "pokemon.h"
#include "data2.h"
-#include "rng.h"
+#include "random.h"
#include "text.h"
#include "battle_move_effects.h"
#include "string_util.h"
diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c
index 73530c486..088f30669 100644
--- a/src/battle/battle_4.c
+++ b/src/battle/battle_4.c
@@ -7,7 +7,7 @@
#include "items.h"
#include "data2.h"
#include "hold_effects.h"
-#include "rng.h"
+#include "random.h"
#include "rom3.h"
#include "species.h"
#include "pokemon.h"
diff --git a/src/battle/battle_ai.c b/src/battle/battle_ai.c
index cb6c10676..0348c3ccd 100644
--- a/src/battle/battle_ai.c
+++ b/src/battle/battle_ai.c
@@ -7,7 +7,7 @@
#include "item.h"
#include "moves.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "rom_8077ABC.h"
#include "species.h"
#include "util.h"
diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c
index dab87b462..3d63a85c9 100644
--- a/src/battle/battle_setup.c
+++ b/src/battle/battle_setup.c
@@ -17,7 +17,7 @@
#include "metatile_behavior.h"
#include "opponent_constants.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "safari_zone.h"
#include "script.h"
diff --git a/src/battle/battle_transition.c b/src/battle/battle_transition.c
index 7f6c114f6..f7c8073c5 100644
--- a/src/battle/battle_transition.c
+++ b/src/battle/battle_transition.c
@@ -6,7 +6,7 @@
#include "palette.h"
#include "trig.h"
#include "field_effect.h"
-#include "rng.h"
+#include "random.h"
#include "sprite.h"
#include "sound.h"
#include "songs.h"
diff --git a/src/engine/link.c b/src/engine/link.c
index 002d397d2..441f3707b 100644
--- a/src/engine/link.c
+++ b/src/engine/link.c
@@ -7,7 +7,7 @@
#include "main.h"
#include "menu.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "save.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/engine/main.c b/src/engine/main.c
index ea381cb31..82a5fffb4 100644
--- a/src/engine/main.c
+++ b/src/engine/main.c
@@ -7,7 +7,7 @@
#include "load_save.h"
#include "m4a.h"
#include "play_time.h"
-#include "rng.h"
+#include "random.h"
#include "rom3.h"
#include "overworld.h"
#include "rtc.h"
diff --git a/src/engine/rng.c b/src/engine/random.c
index 7d4b5600e..8f82b722f 100644
--- a/src/engine/rng.c
+++ b/src/engine/random.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "rng.h"
+#include "random.h"
// The number 1103515245 comes from the example implementation of rand and srand
// in the ISO C standard.
diff --git a/src/engine/record_mixing.c b/src/engine/record_mixing.c
index cf51bec9e..4b5f1b6d5 100644
--- a/src/engine/record_mixing.c
+++ b/src/engine/record_mixing.c
@@ -13,7 +13,7 @@
#include "mauville_man.h"
#include "menu.h"
#include "mystery_event_script.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "save.h"
#include "script.h"
diff --git a/src/engine/time_events.c b/src/engine/time_events.c
index accb03db8..831048add 100644
--- a/src/engine/time_events.c
+++ b/src/engine/time_events.c
@@ -3,7 +3,7 @@
#include "event_data.h"
#include "field_weather.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "rtc.h"
#include "script.h"
diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c
index d6271643c..2b45766dd 100644
--- a/src/field/battle_tower.c
+++ b/src/field/battle_tower.c
@@ -14,7 +14,7 @@
#include "new_game.h"
#include "overworld.h"
#include "pokedex.h"
-#include "rng.h"
+#include "random.h"
#include "save.h"
#include "script_pokemon_80C4.h"
#include "species.h"
diff --git a/src/field/berry.c b/src/field/berry.c
index cd1fc5c94..973bc56ff 100644
--- a/src/field/berry.c
+++ b/src/field/berry.c
@@ -8,7 +8,7 @@
#include "item_use.h"
#include "items.h"
#include "main.h"
-#include "rng.h"
+#include "random.h"
#include "text.h"
#define BERRY_NAME_LENGTH 6
diff --git a/src/field/daycare.c b/src/field/daycare.c
index 2b58a0d5d..9f7e3b989 100644
--- a/src/field/daycare.c
+++ b/src/field/daycare.c
@@ -12,7 +12,7 @@
#include "party_menu.h"
#include "pokemon.h"
#include "pokemon_storage_system.h"
-#include "rng.h"
+#include "random.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/field/dewford_trend.c b/src/field/dewford_trend.c
index 102784066..bdcd76ec5 100644
--- a/src/field/dewford_trend.c
+++ b/src/field/dewford_trend.c
@@ -3,7 +3,7 @@
#include "easy_chat.h"
#include "event_data.h"
#include "link.h"
-#include "rng.h"
+#include "random.h"
#include "text.h"
#include "ewram.h"
diff --git a/src/field/easy_chat.c b/src/field/easy_chat.c
index 8e7413516..7a4ae045e 100644
--- a/src/field/easy_chat.c
+++ b/src/field/easy_chat.c
@@ -4,7 +4,7 @@
#include "event_data.h"
#include "field_message_box.h"
#include "pokedex.h"
-#include "rng.h"
+#include "random.h"
#include "string_util.h"
#include "strings.h"
#include "strings2.h"
diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c
index 98f6fedab..20edbc34f 100644
--- a/src/field/field_map_obj.c
+++ b/src/field/field_map_obj.c
@@ -10,7 +10,7 @@
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "sprite.h"
#include "metatile_behavior.h"
diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c
index e7da9b1b7..a26638b39 100644
--- a/src/field/field_player_avatar.c
+++ b/src/field/field_player_avatar.c
@@ -13,7 +13,7 @@
#include "menu.h"
#include "metatile_behavior.h"
#include "party_menu.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "rotating_gate.h"
#include "script.h"
diff --git a/src/field/field_specials.c b/src/field/field_specials.c
index 48e9b44aa..e5bb1b798 100644
--- a/src/field/field_specials.c
+++ b/src/field/field_specials.c
@@ -34,7 +34,7 @@
#include "battle_tower.h"
#include "field_weather.h"
#include "pokemon_summary_screen.h"
-#include "rng.h"
+#include "random.h"
#if ENGLISH
#define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD
diff --git a/src/field/field_weather.c b/src/field/field_weather.c
index acd8b81ff..ff7c2e4c4 100644
--- a/src/field/field_weather.c
+++ b/src/field/field_weather.c
@@ -3,7 +3,7 @@
#include "field_map_obj.h"
#include "field_weather.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
@@ -26,110 +26,18 @@ struct WeatherPaletteData
u16 data[0][0x1000]; // unknown length
};
-struct Weather
+struct WeatherCallbacks
{
- struct Sprite *unknown_0[24];
- struct Sprite *unknown_60[0x65]; // snowflakes?
- struct Sprite *unknown_1F4[3];
- u8 unknown_200[2][32];
- u8 filler_240[0x460-0x240];
- u8 unk460[2][32];
- u8 filler4A0[0x6B6-0x4A0];
- s8 unknown_6B6;
- u8 filler_6B7[0xC0-0xB7];
- s8 unknown_6C0;
- s8 unknown_6C1;
- u8 unknown_6C2;
- u8 unknown_6C3;
- u16 unknown_6C4;
- u8 unknown_6C6;
- u8 unknown_6C7;
- u8 unknown_6C8;
- u8 unknown_6C9;
- u8 unknown_6CA;
- u8 unknown_6CB;
- u16 unknown_6CC;
- u16 unknown_6CE;
- u8 unknown_6D0;
- u8 unknown_6D1;
- u8 unknown_6D2;
- u8 unknown_6D3;
- u8 unknown_6D4;
- u8 unknown_6D5;
- u16 unknown_6D6;
- u8 unknown_6D8;
- u8 unknown_6D9;
- u8 unknown_6DA;
- u8 unknown_6DB;
- u8 unknown_6DC;
- u8 unknown_6DD;
- u8 unknown_6DE;
- u8 filler_6DF[1];
- u16 unknown_6E0;
- u16 unknown_6E2;
- u8 unknown_6E4;
- u8 unknown_6E5;
- u16 unknown_6E6;
- u16 unknown_6E8;
- u8 unknown_6EA;
- u8 unknown_6EB;
- u8 unknown_6EC;
- u8 unknown_6ED;
- u16 unknown_6EE;
- u16 unknown_6F0;
- u16 unknown_6F2;
- u8 unknown_6F4[6];
- u8 unknown_6FA;
- u8 unknown_6FB;
- u8 filler_6FC[4];
- u8 unknown_700;
- u8 filler_701[0x15];
- u8 unknown_716;
- u8 unknown_717;
- u8 filler_718[0xc];
- u8 unknown_724;
- u8 filler_725[9];
- u8 unknown_72E;
- u8 filler_72F;
- u16 unknown_730;
- u16 unknown_732;
- u16 unknown_734;
- u16 unknown_736;
- u8 unknown_738;
- u8 unknown_739;
- u8 unknown_73A;
- u8 filler_73B[0x3C-0x3B];
- s16 unknown_73C;
- s16 unknown_73E;
- s16 unknown_740;
- s16 unknown_742;
- u8 filler_744[0xD-4];
- s8 unknown_74D;
- u8 unknown_74E;
+ void (*initVars)(void);
+ void (*main)(void);
+ void (*initAll)(void);
+ bool8 (*finish)(void);
};
-#define gWeather gUnknown_0202F7E8
-extern struct Weather gUnknown_0202F7E8;
+extern struct Weather gWeather;
extern u8 gUnknown_0202FF38[];
extern u16 gUnknown_0202FF58;
-extern u8 *gUnknown_083970E8;
-extern u8 (*gUnknown_08396FC8[][4])(void);
-extern u8 (*gUnknown_083970B8[])(void);
IWRAM_DATA const u8 *gUnknown_030006DC;
-extern const u8 gUnknown_083970C8[];
-
-// This is a pointer to gWeather. All code sub_807DE78 and below uses this pointer,
-// while everything above accesses gWeather directly.
-extern struct Weather *const gUnknown_08396FC4;
-
-extern const struct SpriteSheet gUnknown_0839A9D4;
-extern const struct SpriteTemplate gSpriteTemplate_839A9F0;
-extern const u16 gUnknown_08397108[];
-//extern const s16 gUnknown_0839A9C8[][2];
-extern const struct Coords16 gUnknown_0839A9C8[];
-extern const struct SpriteSheet gUnknown_0839AACC;
-extern const struct SpriteTemplate gSpriteTemplate_839AAA4;
-extern const struct SpriteTemplate gSpriteTemplate_839AB04;
const u8 DroughtPaletteData_0[] = INCBIN_U8("graphics/weather/drought0.bin.lz");
const u8 DroughtPaletteData_1[] = INCBIN_U8("graphics/weather/drought1.bin.lz");
@@ -140,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,
@@ -151,108 +59,237 @@ const u8 *const gUnknown_08396FA8[] =
gSharedMem,
};
-void sub_807C828(void)
+// This is a pointer to gWeather. All code in this file accesses gWeather directly,
+// while code in other field weather files accesses gWeather through this pointer.
+// This is likely the result of compiler optimization, since using the pointer in
+// this file produces the same result as accessing gWeather directly.
+struct Weather *const gWeatherPtr = &gWeather;
+
+void None_Init(void);
+void None_Main(void);
+bool8 None_Finish(void);
+void Clouds_InitVars(void);
+void Clouds_Main(void);
+void Clouds_InitAll(void);
+bool8 Clouds_Finish(void);
+void Weather2_InitVars(void);
+void Weather2_Main(void);
+void Weather2_InitAll(void);
+bool8 Weather2_Finish(void);
+void LightRain_InitVars(void);
+void LightRain_Main(void);
+void LightRain_InitAll(void);
+bool8 LightRain_Finish(void);
+void Snow_InitVars(void);
+void Snow_Main(void);
+void Snow_InitAll(void);
+bool8 Snow_Finish(void);
+void MedRain_InitVars(void);
+void Rain_Main(void);
+void MedRain_InitAll(void);
+bool8 Rain_Finish(void);
+void Fog1_InitVars(void);
+void Fog1_Main(void);
+void Fog1_InitAll(void);
+bool8 Fog1_Finish(void);
+void Ash_InitVars(void);
+void Ash_Main(void);
+void Ash_InitAll(void);
+bool8 Ash_Finish(void);
+void Sandstorm_InitVars(void);
+void Sandstorm_Main(void);
+void Sandstorm_InitAll(void);
+bool8 Sandstorm_Finish(void);
+void Fog2_InitVars(void);
+void Fog2_Main(void);
+void Fog2_InitAll(void);
+bool8 Fog2_Finish(void);
+void Fog1_InitVars(void);
+void Fog1_Main(void);
+void Fog1_InitAll(void);
+bool8 Fog1_Finish(void);
+void Weather11_InitVars(void);
+void Weather11_Main(void);
+void Weather11_InitAll(void);
+bool8 Weather11_Finish(void);
+void Drought_InitVars(void);
+void Drought_Main(void);
+void Drought_InitAll(void);
+bool8 Drought_Finish(void);
+void HeavyRain_InitVars(void);
+void Rain_Main(void);
+void HeavyRain_InitAll(void);
+bool8 Rain_Finish(void);
+void Bubbles_InitVars(void);
+void Bubbles_Main(void);
+void Bubbles_InitAll(void);
+bool8 Bubbles_Finish(void);
+
+static const struct WeatherCallbacks sWeatherFuncs[] =
+{
+ {None_Init, None_Main, None_Init, None_Finish},
+ {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish},
+ {Weather2_InitVars, Weather2_Main, Weather2_InitAll, Weather2_Finish},
+ {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, // light rain
+ {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish},
+ {MedRain_InitVars, Rain_Main, MedRain_InitAll, Rain_Finish},
+ {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish},
+ {Ash_InitVars, Ash_Main, Ash_InitAll, Ash_Finish},
+ {Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish},
+ {Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish},
+ {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish},
+ {Weather11_InitVars, Weather11_Main, Weather11_InitAll, Weather11_Finish},
+ {Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish},
+ {HeavyRain_InitVars, Rain_Main, HeavyRain_InitAll, Rain_Finish},
+ {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish},
+};
+
+void (*const gUnknown_083970B8[])(void) =
+{
+ sub_807CC24,
+ sub_807CCAC,
+ nullsub_39,
+ nullsub_39,
+};
+
+const u8 gUnknown_083970C8[] =
+{
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 2,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+};
+
+const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal");
+
+void StartWeather(void)
{
u8 index;
- if (!FuncIsActiveTask(&sub_807CA34))
+ if (!FuncIsActiveTask(Task_WeatherMain))
{
index = AllocSpritePalette(0x1200);
- CpuCopy32(&gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32);
+ CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32);
sub_807CB10();
- gWeather.unknown_6D5 = index;
- gWeather.unknown_6D4 = AllocSpritePalette(0x1201);
- gWeather.unknown_6DA = 0;
- gWeather.unknown_6D8 = 0;
- gWeather.unknown_6DE = 0;
- gWeather.unknown_6E4 = 0;
- gWeather.unknown_700 = 0;
- gWeather.unknown_6FB = 0;
- gWeather.unknown_724 = 0;
- gWeather.unknown_716 = 0;
- gWeather.unknown_717 = 0;
- gWeather.unknown_72E = 0;
- gWeather.unknown_6FA = 0;
- sub_807DB64(16, 0);
- gWeather.unknown_6D0 = 0;
- gWeather.unknown_6C6 = 3;
- gWeather.unknown_6C8 = 0;
- gWeather.unknown_6D3 = 1;
- gWeather.unknown_6C9 = CreateTask(sub_807C9E4, 80);
+ gWeatherPtr->unknown_6D5 = index;
+ gWeatherPtr->unknown_6D4 = AllocSpritePalette(0x1201);
+ gWeatherPtr->rainSpriteCount = 0;
+ gWeatherPtr->unknown_6D8 = 0;
+ gWeatherPtr->cloudSpritesCreated = 0;
+ gWeatherPtr->snowflakeSpriteCount = 0;
+ gWeatherPtr->ashSpritesCreated = 0;
+ gWeatherPtr->fog1SpritesCreated = 0;
+ gWeatherPtr->fog2SpritesCreated = 0;
+ gWeatherPtr->sandstormSprites1Created = 0;
+ gWeatherPtr->sandstormSprites2Created = 0;
+ gWeatherPtr->unknown_72E = 0;
+ gWeatherPtr->unknown_6FA = 0;
+ Weather_SetBlendCoeffs(16, 0);
+ gWeatherPtr->currWeather = 0;
+ gWeatherPtr->unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C8 = 0;
+ gWeatherPtr->unknown_6D3 = 1;
+ gWeatherPtr->unknown_6C9 = CreateTask(Task_WeatherInit, 80);
}
}
void DoWeatherEffect(u8 effect)
{
- if (effect != 3 && effect != 5 && effect != 13)
+ if (effect != WEATHER_RAIN_LIGHT && effect != WEATHER_RAIN_MED && effect != WEATHER_RAIN_HEAVY)
{
PlayRainSoundEffect();
}
- if (gWeather.unknown_6D1 != effect && gWeather.unknown_6D0 == effect)
+ if (gWeatherPtr->nextWeather != effect && gWeatherPtr->currWeather == effect)
{
- gUnknown_08396FC8[effect][0]();
+ sWeatherFuncs[effect].initVars();
}
- gWeather.unknown_6D3 = 0;
- gWeather.unknown_6D1 = effect;
- gWeather.unknown_6CE = 0;
+ gWeatherPtr->unknown_6D3 = 0;
+ gWeatherPtr->nextWeather = effect;
+ gWeatherPtr->finishStep = 0;
}
void sub_807C988(u8 effect)
{
PlayRainSoundEffect();
- gWeather.unknown_6D0 = effect;
- gWeather.unknown_6D1 = effect;
+ gWeatherPtr->currWeather = effect;
+ gWeatherPtr->nextWeather = effect;
}
void sub_807C9B4(u8 effect)
{
PlayRainSoundEffect();
- gWeather.unknown_6D0 = effect;
- gWeather.unknown_6D1 = effect;
- gWeather.unknown_6C8 = 1;
+ gWeatherPtr->currWeather = effect;
+ gWeatherPtr->nextWeather = effect;
+ gWeatherPtr->unknown_6C8 = 1;
}
-void sub_807C9E4(u8 taskId)
+void Task_WeatherInit(u8 taskId)
{
- if (gWeather.unknown_6C8)
+ if (gWeatherPtr->unknown_6C8)
{
- gUnknown_08396FC8[gWeather.unknown_6D0][2]();
- 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 (gWeather.unknown_6D0 != gWeather.unknown_6D1)
+ if (gWeatherPtr->currWeather != gWeatherPtr->nextWeather)
{
- v1 = gUnknown_08396FC8[gWeather.unknown_6D0][3]();
- if (!v1)
+ if (!sWeatherFuncs[gWeatherPtr->currWeather].finish())
{
- gUnknown_08396FC8[gWeather.unknown_6D1][0]();
- gWeather.unknown_6C3 = 0; // compiler reuses v1
- gWeather.unknown_6C6 = 0; // compiler reuses v1
- gWeather.unknown_6D0 = gWeather.unknown_6D1;
- gWeather.unknown_6D3 = 1;
+ sWeatherFuncs[gWeatherPtr->nextWeather].initVars();
+ gWeatherPtr->unknown_6C3 = 0;
+ gWeatherPtr->unknown_6C6 = 0;
+ gWeatherPtr->currWeather = gWeatherPtr->nextWeather;
+ gWeatherPtr->unknown_6D3 = 1;
}
}
else
{
- gUnknown_08396FC8[gWeather.unknown_6D0][1]();
+ sWeatherFuncs[gWeatherPtr->currWeather].main();
}
- gUnknown_083970B8[gWeather.unknown_6C6]();
+ gUnknown_083970B8[gWeatherPtr->unknown_6C6]();
}
-void sub_807CAE8(void)
+void None_Init(void)
{
- gWeather.unknown_6C1 = 0;
- gWeather.unknown_6C2 = 0;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 0;
}
-void nullsub_38(void)
+void None_Main(void)
{
}
-u32 sub_807CB0C(void)
+u8 None_Finish(void)
{
return 0;
}
@@ -274,9 +311,9 @@ void sub_807CB10(void)
for (v0 = 0; v0 <= 1; v0++)
{
if (v0 == 0)
- v1 = gWeather.unknown_200;
+ v1 = gWeatherPtr->unknown_200;
else
- v1 = gWeather.unk460;
+ v1 = gWeatherPtr->unk460;
for (v2 = 0; (u16)v2 <= 0x1f; v2++)
{
@@ -332,53 +369,53 @@ void sub_807CB10(void)
void sub_807CC24(void)
{
- if (gWeather.unknown_6C0 == gWeather.unknown_6C1)
+ if (gWeatherPtr->unknown_6C0 == gWeatherPtr->unknown_6C1)
{
- gWeather.unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C6 = 3;
}
else
{
- if (++gWeather.unknown_6C3 >= gWeather.unknown_6C2)
+ if (++gWeatherPtr->unknown_6C3 >= gWeatherPtr->unknown_6C2)
{
- gWeather.unknown_6C3 = 0;
- if (gWeather.unknown_6C0 < gWeather.unknown_6C1)
- gWeather.unknown_6C0++;
+ gWeatherPtr->unknown_6C3 = 0;
+ if (gWeatherPtr->unknown_6C0 < gWeatherPtr->unknown_6C1)
+ gWeatherPtr->unknown_6C0++;
else
- gWeather.unknown_6C0--;
- sub_807CEBC(0, 0x20, gWeather.unknown_6C0);
+ gWeatherPtr->unknown_6C0--;
+ sub_807CEBC(0, 0x20, gWeatherPtr->unknown_6C0);
}
}
}
void sub_807CCAC(void)
{
- if (++gWeather.unknown_6CB > 1)
- gWeather.unknown_6CA = 0;
- switch (gWeather.unknown_6D0)
+ if (++gWeatherPtr->unknown_6CB > 1)
+ gWeatherPtr->unknown_6CA = 0;
+ switch (gWeatherPtr->currWeather)
{
- case 3:
- case 4:
- case 5:
+ case WEATHER_RAIN_LIGHT:
+ case WEATHER_RAIN_MED:
+ case WEATHER_RAIN_HEAVY:
+ case WEATHER_SNOW:
case 11:
- case 13:
if (sub_807CDC4() == 0)
{
- gWeather.unknown_6C0 = 3;
- gWeather.unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C0 = 3;
+ gWeatherPtr->unknown_6C6 = 3;
}
break;
case 12:
if (sub_807CE24() == 0)
{
- gWeather.unknown_6C0 = -6;
- gWeather.unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C0 = -6;
+ gWeatherPtr->unknown_6C6 = 3;
}
break;
case 6:
if (sub_807CE7C() == 0)
{
- gWeather.unknown_6C0 = 0;
- gWeather.unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C0 = 0;
+ gWeatherPtr->unknown_6C6 = 3;
}
break;
case 7:
@@ -388,8 +425,8 @@ void sub_807CCAC(void)
default:
if (!gPaletteFade.active)
{
- gWeather.unknown_6C0 = gWeather.unknown_6C1;
- gWeather.unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C0 = gWeatherPtr->unknown_6C1;
+ gWeatherPtr->unknown_6C6 = 3;
}
break;
}
@@ -397,38 +434,38 @@ void sub_807CCAC(void)
u8 sub_807CDC4(void)
{
- if (gWeather.unknown_6C7 == 0x10)
+ if (gWeatherPtr->unknown_6C7 == 0x10)
return 0;
- if (++gWeather.unknown_6C7 >= 0x10)
+ if (++gWeatherPtr->unknown_6C7 >= 0x10)
{
sub_807CEBC(0, 0x20, 3);
- gWeather.unknown_6C7 = 0x10;
+ gWeatherPtr->unknown_6C7 = 0x10;
return 0;
}
- sub_807D1BC(0, 0x20, 3, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
+ sub_807D1BC(0, 0x20, 3, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4);
return 1;
}
u8 sub_807CE24(void)
{
- if (gWeather.unknown_6C7 == 0x10)
+ if (gWeatherPtr->unknown_6C7 == 0x10)
return 0;
- if (++gWeather.unknown_6C7 >= 0x10)
+ if (++gWeatherPtr->unknown_6C7 >= 0x10)
{
sub_807CEBC(0, 0x20, -6);
- gWeather.unknown_6C7 = 0x10;
+ gWeatherPtr->unknown_6C7 = 0x10;
return 0;
}
- sub_807D304(-6, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
+ sub_807D304(-6, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4);
return 1;
}
u8 sub_807CE7C(void)
{
- if (gWeather.unknown_6C7 == 0x10)
+ if (gWeatherPtr->unknown_6C7 == 0x10)
return 0;
- ++gWeather.unknown_6C7;
- sub_807D424(0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
+ ++gWeatherPtr->unknown_6C7;
+ sub_807D424(0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4);
return 1;
}
@@ -460,10 +497,10 @@ void sub_807CEBC(u8 a, u8 b, s8 c)
{
u8 r, g, b;
- if (gUnknown_030006DC[r4] == 2 || r4 - 16 == gWeather.unknown_6D5)
- r6 = gWeather.unk460[c];
+ if (gUnknown_030006DC[r4] == 2 || r4 - 16 == gWeatherPtr->unknown_6D5)
+ r6 = gWeatherPtr->unk460[c];
else
- r6 = gWeather.unknown_200[c];
+ r6 = gWeatherPtr->unknown_200[c];
if (r4 == 16 || r4 > 0x1B)
{
for (i = 0; i < 16; i++)
@@ -567,9 +604,9 @@ void sub_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e)
u8 *r5;
if (gUnknown_030006DC[r4] == 1)
- r5 = gWeather.unknown_200[c];
+ r5 = gWeatherPtr->unknown_200[c];
else
- r5 = gWeather.unk460[c];
+ r5 = gWeatherPtr->unk460[c];
for (i = 0; i < 16; i++)
{
@@ -588,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;
@@ -603,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
{
@@ -621,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;
@@ -632,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;
}
}
}
@@ -695,10 +732,10 @@ void sub_807D424(u8 a, u16 b)
void sub_807D540(u8 a)
{
- if (gWeather.unknown_6FA < 6)
+ if (gWeatherPtr->unknown_6FA < 6)
{
- gWeather.unknown_6F4[gWeather.unknown_6FA] = a;
- gWeather.unknown_6FA++;
+ gWeatherPtr->unknown_6F4[gWeatherPtr->unknown_6FA] = a;
+ gWeatherPtr->unknown_6FA++;
}
}
@@ -706,9 +743,9 @@ bool8 sub_807D574(u8 a)
{
u16 i;
- for (i = 0; i < gWeather.unknown_6FA; i++)
+ for (i = 0; i < gWeatherPtr->unknown_6FA; i++)
{
- if (gWeather.unknown_6F4[i] == a)
+ if (gWeatherPtr->unknown_6F4[i] == a)
return TRUE;
}
return FALSE;
@@ -716,63 +753,63 @@ bool8 sub_807D574(u8 a)
void sub_807D5BC(s8 a)
{
- if (gWeather.unknown_6C6 == 3)
+ if (gWeatherPtr->unknown_6C6 == 3)
{
sub_807CEBC(0, 32, a);
- gWeather.unknown_6C0 = a;
+ gWeatherPtr->unknown_6C0 = a;
}
}
void sub_807D5F0(u8 a, u8 b, u8 c)
{
- if (gWeather.unknown_6C6 == 3)
+ if (gWeatherPtr->unknown_6C6 == 3)
{
- gWeather.unknown_6C6 = 0;
- gWeather.unknown_6C0 = a;
- gWeather.unknown_6C1 = b;
- gWeather.unknown_6C3 = 0;
- gWeather.unknown_6C2 = c;
+ gWeatherPtr->unknown_6C6 = 0;
+ gWeatherPtr->unknown_6C0 = a;
+ gWeatherPtr->unknown_6C1 = b;
+ gWeatherPtr->unknown_6C3 = 0;
+ gWeatherPtr->unknown_6C2 = c;
sub_807D5BC(a);
}
}
-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:
return;
}
- switch (gWeather.unknown_6D0)
+ switch (gWeatherPtr->currWeather)
{
- case 3:
- case 4:
- case 5:
+ case WEATHER_RAIN_LIGHT:
+ case WEATHER_RAIN_MED:
+ case WEATHER_RAIN_HEAVY:
+ case WEATHER_SNOW:
case 6:
case 11:
case 12:
- case 13:
r2 = 1;
break;
default:
@@ -784,27 +821,27 @@ void fade_screen(u8 a, u8 b)
{
if (r2 != 0)
CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
- BeginNormalPaletteFade(0xFFFFFFFF, b, 0, 16, r4);
- gWeather.unknown_6C6 = 2;
+ BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor);
+ gWeatherPtr->unknown_6C6 = 2;
}
else
{
- gWeather.unknown_6C4 = r4;
+ gWeatherPtr->unknown_6C4 = fadeColor;
if (r2 != 0)
- gWeather.unknown_6C7 = 0;
+ gWeatherPtr->unknown_6C7 = 0;
else
- BeginNormalPaletteFade(0xFFFFFFFF, b, 16, 0, r4);
- gWeather.unknown_6C6 = 1;
- gWeather.unknown_6CA = 1;
- gWeather.unknown_6CB = 0;
- sub_807DB64(gWeather.unknown_730, gWeather.unknown_732);
- gWeather.unknown_6C8 = 1;
+ BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor);
+ gWeatherPtr->unknown_6C6 = 1;
+ gWeatherPtr->unknown_6CA = 1;
+ gWeatherPtr->unknown_6CB = 0;
+ Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);
+ gWeatherPtr->unknown_6C8 = 1;
}
}
bool8 sub_807D770(void)
{
- return gWeather.unknown_6C6 ^ 1 ? TRUE : FALSE;
+ return gWeatherPtr->unknown_6C6 ^ 1 ? TRUE : FALSE;
}
void sub_807D78C(u8 a)
@@ -812,16 +849,16 @@ void sub_807D78C(u8 a)
u16 r4 = 16 + a;
u16 i;
- switch (gWeather.unknown_6C6)
+ switch (gWeatherPtr->unknown_6C6)
{
case 1:
- if (gWeather.unknown_6CA != 0)
+ if (gWeatherPtr->unknown_6CA != 0)
{
- if (gWeather.unknown_6D0 == 6)
+ if (gWeatherPtr->currWeather == 6)
sub_807D540(r4);
r4 *= 16;
for (i = 0; i < 16; i++)
- gPlttBufferFaded[r4 + i] = gWeather.unknown_6C4;
+ gPlttBufferFaded[r4 + i] = gWeatherPtr->unknown_6C4;
}
break;
case 2:
@@ -830,9 +867,9 @@ void sub_807D78C(u8 a)
BlendPalette(r4, 16, gPaletteFade.y, gPaletteFade.blendColor);
break;
default:
- if (gWeather.unknown_6D0 != 6)
+ if (gWeatherPtr->currWeather != 6)
{
- sub_807CEBC(r4, 1, gWeather.unknown_6C0);
+ sub_807CEBC(r4, 1, gWeatherPtr->unknown_6C0);
}
else
{
@@ -845,21 +882,21 @@ void sub_807D78C(u8 a)
void sub_807D874(u8 a)
{
- sub_807CEBC(a, 1, gWeather.unknown_6C0);
+ sub_807CEBC(a, 1, gWeatherPtr->unknown_6C0);
}
u8 unref_sub_807D894(void)
{
- if (gWeather.unknown_6C6 == 1)
- return gWeather.unknown_6CA;
+ if (gWeatherPtr->unknown_6C6 == 1)
+ return gWeatherPtr->unknown_6CA;
else
return 0;
}
void sub_807D8C0(const u16 *palette)
{
- LoadPalette(palette, 0x100 + gWeather.unknown_6D4 * 16, 32);
- sub_807D78C(gWeather.unknown_6D4);
+ LoadPalette(palette, 0x100 + gWeatherPtr->unknown_6D4 * 16, 32);
+ sub_807D78C(gWeatherPtr->unknown_6D4);
}
void sub_807D8F0(u8 *a, u8 *b)
@@ -870,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;
@@ -882,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;
@@ -893,16 +929,16 @@ void sub_807D8F0(u8 *a, u8 *b)
void sub_807D9A8(void)
{
- gWeather.unknown_74D = 1;
- gWeather.unknown_74E = 1;
+ gWeatherPtr->unknown_74D = 1;
+ gWeatherPtr->unknown_74E = 1;
}
bool8 sub_807D9C8(void)
{
- if (gWeather.unknown_74D < 32)
+ if (gWeatherPtr->unknown_74D < 32)
{
- sub_807D8F0(&gWeather.unknown_74D, &gWeather.unknown_74E);
- if (gWeather.unknown_74D < 32)
+ sub_807D8F0(&gWeatherPtr->unknown_74D, &gWeatherPtr->unknown_74E);
+ if (gWeatherPtr->unknown_74D < 32)
return TRUE;
}
return FALSE;
@@ -915,95 +951,101 @@ void sub_807DA04(s8 a)
void sub_807DA14(void)
{
- gWeather.unknown_73C = 0;
- gWeather.unknown_740 = 0;
- gWeather.unknown_742 = 0;
- gWeather.unknown_73E = 0;
+ gWeatherPtr->unknown_73C = 0;
+ gWeatherPtr->unknown_740 = 0;
+ gWeatherPtr->unknown_742 = 0;
+ gWeatherPtr->unknown_73E = 0;
gUnknown_0202FF58 = 5;
}
void sub_807DA4C(void)
{
- switch (gWeather.unknown_742)
+ switch (gWeatherPtr->unknown_742)
{
case 0:
- if (++gWeather.unknown_740 > gUnknown_0202FF58)
+ if (++gWeatherPtr->unknown_740 > gUnknown_0202FF58)
{
- gWeather.unknown_740 = 0;
- sub_807DA04(gWeather.unknown_73C++);
- if (gWeather.unknown_73C > 5)
+ gWeatherPtr->unknown_740 = 0;
+ sub_807DA04(gWeatherPtr->unknown_73C++);
+ if (gWeatherPtr->unknown_73C > 5)
{
- gWeather.unknown_73E = gWeather.unknown_73C;
- gWeather.unknown_742 = 1;
- gWeather.unknown_740 = 0x3C;
+ gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C;
+ gWeatherPtr->unknown_742 = 1;
+ gWeatherPtr->unknown_740 = 0x3C;
}
}
break;
case 1:
- gWeather.unknown_740 = (gWeather.unknown_740 + 3) & 0x7F;
- gWeather.unknown_73C = ((gSineTable[gWeather.unknown_740] - 1) >> 6) + 2;
- if (gWeather.unknown_73C != gWeather.unknown_73E)
- sub_807DA04(gWeather.unknown_73C);
- gWeather.unknown_73E = gWeather.unknown_73C;
+ gWeatherPtr->unknown_740 = (gWeatherPtr->unknown_740 + 3) & 0x7F;
+ gWeatherPtr->unknown_73C = ((gSineTable[gWeatherPtr->unknown_740] - 1) >> 6) + 2;
+ if (gWeatherPtr->unknown_73C != gWeatherPtr->unknown_73E)
+ sub_807DA04(gWeatherPtr->unknown_73C);
+ gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C;
break;
case 2:
- if (++gWeather.unknown_740 > gUnknown_0202FF58)
+ if (++gWeatherPtr->unknown_740 > gUnknown_0202FF58)
{
- gWeather.unknown_740 = 0;
- sub_807DA04(--gWeather.unknown_73C);
- if (gWeather.unknown_73C == 3)
- gWeather.unknown_742 = 0;
+ gWeatherPtr->unknown_740 = 0;
+ sub_807DA04(--gWeatherPtr->unknown_73C);
+ if (gWeatherPtr->unknown_73C == 3)
+ gWeatherPtr->unknown_742 = 0;
}
break;
}
}
-void sub_807DB64(u8 a, u8 b)
+void Weather_SetBlendCoeffs(u8 eva, u8 evb)
{
- gWeather.unknown_730 = a;
- gWeather.unknown_732 = b;
- gWeather.unknown_734 = a;
- gWeather.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)
{
- gWeather.unknown_734 = a;
- gWeather.unknown_736 = b;
- gWeather.unknown_73A = c;
- gWeather.unknown_739 = 0;
- gWeather.unknown_738 = 0;
+ 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 (gWeather.unknown_730 == gWeather.unknown_734
- && gWeather.unknown_732 == gWeather.unknown_736)
+ if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA
+ && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)
return TRUE;
- if (++gWeather.unknown_739 > gWeather.unknown_73A)
+
+ if (++gWeatherPtr->unknown_739 > gWeatherPtr->blendDelay)
{
- gWeather.unknown_739 = 0;
- gWeather.unknown_738++;
- if (gWeather.unknown_738 & 1)
+ gWeatherPtr->unknown_739 = 0;
+ gWeatherPtr->unknown_738++;
+
+ // Update currBlendEVA and currBlendEVB on alternate frames
+ if (gWeatherPtr->unknown_738 & 1)
{
- if (gWeather.unknown_730 < gWeather.unknown_734)
- gWeather.unknown_730++;
- else if (gWeather.unknown_730 > gWeather.unknown_734)
- gWeather.unknown_730--;
+ if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA)
+ gWeatherPtr->currBlendEVA++;
+ else if (gWeatherPtr->currBlendEVA > gWeatherPtr->targetBlendEVA)
+ gWeatherPtr->currBlendEVA--;
}
else
{
- if (gWeather.unknown_732 < gWeather.unknown_736)
- gWeather.unknown_732++;
- else if (gWeather.unknown_732 > gWeather.unknown_736)
- gWeather.unknown_732--;
+ if (gWeatherPtr->currBlendEVB < gWeatherPtr->targetBlendEVB)
+ gWeatherPtr->currBlendEVB++;
+ else if (gWeatherPtr->currBlendEVB > gWeatherPtr->targetBlendEVB)
+ gWeatherPtr->currBlendEVB--;
}
}
- REG_BLDALPHA = (gWeather.unknown_732 << 8) | gWeather.unknown_730;
- if (gWeather.unknown_730 == gWeather.unknown_734
- && gWeather.unknown_732 == gWeather.unknown_736)
+
+ REG_BLDALPHA = BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);
+
+ if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA
+ && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)
return TRUE;
+
return FALSE;
}
@@ -1046,23 +1088,23 @@ void unref_sub_807DCB4(u8 a)
u8 weather_get_current(void)
{
- return gWeather.unknown_6D0;
+ return gWeatherPtr->currWeather;
}
-void sub_807DD5C(u16 sndEff)
+void SetRainStrengthFromSoundEffect(u16 sndEff)
{
- if (gUnknown_0202F7E8.unknown_6C6 != 2)
+ if (gWeatherPtr->unknown_6C6 != 2)
{
switch (sndEff)
{
case SE_T_KOAME:
- gUnknown_0202F7E8.unknown_6DD = 0;
+ gWeatherPtr->rainStrength = 0;
break;
case SE_T_OOAME:
- gUnknown_0202F7E8.unknown_6DD = 1;
+ gWeatherPtr->rainStrength = 1;
break;
case SE_T_AME:
- gUnknown_0202F7E8.unknown_6DD = 2;
+ gWeatherPtr->rainStrength = 2;
break;
default:
return;
@@ -1075,17 +1117,17 @@ void PlayRainSoundEffect(void)
{
if (IsSpecialSEPlaying())
{
- switch (gUnknown_0202F7E8.unknown_6DD)
+ switch (gWeatherPtr->rainStrength)
{
case 0:
- PlaySE(0x56);
+ PlaySE(SE_T_KOAME_E);
break;
case 1:
- PlaySE(0x54);
+ PlaySE(SE_T_OOAME_E);
break;
case 2:
default:
- PlaySE(0x52);
+ PlaySE(SE_T_AME_E);
break;
}
}
@@ -1093,17 +1135,17 @@ void PlayRainSoundEffect(void)
u8 sub_807DDFC(void)
{
- return gUnknown_0202F7E8.unknown_6D3;
+ return gWeatherPtr->unknown_6D3;
}
void sub_807DE10(void)
{
- gUnknown_0202F7E8.unknown_6C6 = 2;
+ gWeatherPtr->unknown_6C6 = 2;
}
void unref_sub_807DE24(void)
{
- gUnknown_0202F7E8.unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C6 = 3;
}
void sub_807DE38(u8 a)
@@ -1117,1028 +1159,3 @@ void sub_807DE68(void)
{
gUnknown_030006DC = gUnknown_083970C8;
}
-
-void sub_807DE78(void)
-{
- gUnknown_08396FC4->unknown_6C1 = 0;
- gUnknown_08396FC4->unknown_6C2 = 20;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6CC = 0;
- if (gUnknown_08396FC4->unknown_6DE == 0)
- sub_807DB64(0, 16);
-}
-
-void sub_807DEF4(void);
-
-void sub_807DEC4(void)
-{
- sub_807DE78();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- sub_807DEF4();
-}
-
-void sub_807DFD4(void);
-
-void sub_807DEF4(void)
-{
- switch (gUnknown_08396FC4->unknown_6CC)
- {
- case 0:
- sub_807DFD4();
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 1:
- sub_807DBA4(12, 8, 1);
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 2:
- if (sub_807DBE8())
- {
- gUnknown_08396FC4->unknown_6D2 = 1;
- gUnknown_08396FC4->unknown_6CC++;
- }
- break;
- }
-}
-
-void sub_807E0A0(void);
-
-bool8 sub_807DF54(void)
-{
- switch (gUnknown_08396FC4->unknown_6CE)
- {
- case 0:
- sub_807DBA4(0, 16, 1);
- gUnknown_08396FC4->unknown_6CE++;
- return TRUE;
- case 1:
- if (sub_807DBE8())
- {
- sub_807E0A0();
- gUnknown_08396FC4->unknown_6CE++;
- }
- return TRUE;
- }
- return FALSE;
-}
-
-void sub_807DF9C(void)
-{
- gUnknown_08396FC4->unknown_6C1 = 0;
- gUnknown_08396FC4->unknown_6C2 = 20;
-}
-
-void sub_807DFC0(void)
-{
- sub_807DF9C();
-}
-
-void nullsub_55(void)
-{
-}
-
-int sub_807DFD0(void)
-{
- return 0;
-}
-
-void sub_807DFD4(void)
-{
- u16 i;
-
- if (gUnknown_08396FC4->unknown_6DE == 1)
- return;
- LoadSpriteSheet(&gUnknown_0839A9D4);
- sub_807D8C0(gUnknown_08397108);
- for (i = 0; i < 3; i++)
- {
- u8 spriteId = CreateSprite(&gSpriteTemplate_839A9F0, 0, 0, 0xFF);
-
- if (spriteId != 64)
- {
- struct Sprite *sprite;
-
- gUnknown_08396FC4->unknown_1F4[i] = &gSprites[spriteId];
- sprite = gUnknown_08396FC4->unknown_1F4[i];
- sub_80603CC(gUnknown_0839A9C8[i].x + 7, gUnknown_0839A9C8[i].y + 7, &sprite->pos1.x, &sprite->pos1.y);
- sprite->coordOffsetEnabled = TRUE;
- }
- else
- {
- gUnknown_08396FC4->unknown_1F4[i] = NULL;
- }
- }
- gUnknown_08396FC4->unknown_6DE = 1;
-}
-
-void sub_807E0A0(void)
-{
- u16 i;
-
- if (gUnknown_08396FC4->unknown_6DE == 0)
- return;
- for (i = 0; i < 3; i++)
- {
- if (gUnknown_08396FC4->unknown_1F4[i] != NULL)
- DestroySprite(gUnknown_08396FC4->unknown_1F4[i]);
- }
- FreeSpriteTilesByTag(0x1200);
- gUnknown_08396FC4->unknown_6DE = 0;
-}
-
-void sub_807E0F4(struct Sprite *sprite)
-{
- sprite->data[0] = (sprite->data[0] + 1) & 1;
- if (sprite->data[0] != 0)
- sprite->pos1.x--;
-}
-
-void sub_807E110(void)
-{
- gUnknown_08396FC4->unknown_6CC = 0;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6C1 = 0;
- gUnknown_08396FC4->unknown_6C2 = 0;
-}
-
-void sub_807E174(void);
-
-void sub_807E144(void)
-{
- sub_807E110();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- sub_807E174();
-}
-
-void sub_807E174(void)
-{
- switch (gUnknown_08396FC4->unknown_6CC)
- {
- case 0:
- if (gUnknown_08396FC4->unknown_6C6 != 0)
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 1:
- sub_807D9A8();
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 2:
- if (sub_807D9C8() == FALSE)
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 3:
- sub_807DA14();
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 4:
- sub_807DA4C();
- if (gUnknown_08396FC4->unknown_73C == 6)
- {
- gUnknown_08396FC4->unknown_6D2 = 1;
- gUnknown_08396FC4->unknown_6CC++;
- }
- break;
- default:
- sub_807DA4C();
- break;
- }
-}
-
-int sub_807E258(void)
-{
- return 0;
-}
-
-void task50_0807B6D4(u8);
-
-void sub_807E25C(void)
-{
- CreateTask(task50_0807B6D4, 0x50);
-}
-
-#define tState data[0]
-#define tBlendY data[1]
-#define tBlendDelay data[2]
-#define tWinRange data[3]
-
-void task50_0807B6D4(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
-
- switch (task->tState)
- {
- case 0:
- task->tBlendY = 0;
- task->tBlendDelay = 0;
- task->tWinRange = REG_WININ;
- REG_WININ = WIN_RANGE(63, 63);
- REG_BLDCNT = 0x9E;
- REG_BLDY = 0;
- task->tState++;
- // fall through
- case 1:
- task->tBlendY += 3;
- if (task->tBlendY > 16)
- task->tBlendY = 16;
- REG_BLDY = task->tBlendY;
- if (task->tBlendY >= 16)
- task->tState++;
- break;
- case 2:
- task->tBlendDelay++;
- if (task->tBlendDelay > 9)
- {
- task->tBlendDelay = 0;
- task->tBlendY--;
- if (task->tBlendY <= 0)
- {
- task->tBlendY = 0;
- task->tState++;
- }
- REG_BLDY = task->tBlendY;
- }
- break;
- case 3:
- REG_BLDCNT = 0;
- REG_BLDY = 0;
- REG_WININ = task->tWinRange;
- task->tState++;
- break;
- case 4:
- EnableBothScriptContexts();
- DestroyTask(taskId);
- break;
- }
-}
-
-#undef tState
-#undef tBlendY
-#undef tBlendDelay
-#undef tWinRange
-
-void sub_807E364(void)
-{
- gUnknown_08396FC4->unknown_6CC = 0;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6D6 = 0;
- gUnknown_08396FC4->unknown_6DB = 8;
- gUnknown_08396FC4->unknown_6DC = 0;
- gUnknown_08396FC4->unknown_6D9 = 10;
- gUnknown_08396FC4->unknown_6C1 = 3;
- gUnknown_08396FC4->unknown_6C2 = 20;
- sub_807DD5C(SE_T_KOAME);
-}
-
-void sub_807E400(void);
-
-void sub_807E3D0(void)
-{
- sub_807E364();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- sub_807E400();
-}
-
-void sub_807E7A4(void);
-u8 sub_807E7B4(void);
-u8 sub_807E8E8(void);
-
-void sub_807E400(void)
-{
- switch (gUnknown_08396FC4->unknown_6CC)
- {
- case 0:
- sub_807E7A4();
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 1:
- if (sub_807E7B4() == 0)
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 2:
- if (sub_807E8E8() == FALSE)
- {
- gUnknown_08396FC4->unknown_6D2 = 1;
- gUnknown_08396FC4->unknown_6CC++;
- }
- break;
- }
-}
-
-void sub_807E974(void);
-
-bool8 sub_807E460(void)
-{
- switch (gUnknown_08396FC4->unknown_6CE)
- {
- case 0:
- if (gUnknown_08396FC4->unknown_6D1 == 3
- || gUnknown_08396FC4->unknown_6D1 == 5
- || gUnknown_08396FC4->unknown_6D1 == 13)
- {
- gUnknown_08396FC4->unknown_6CE = 0xFF;
- return FALSE;
- }
- else
- {
- gUnknown_08396FC4->unknown_6D9 = 0;
- gUnknown_08396FC4->unknown_6CE++;
- }
- // fall through
- case 1:
- if (sub_807E8E8() == FALSE)
- {
- sub_807E974();
- gUnknown_08396FC4->unknown_6CE++;
- return FALSE;
- }
- return TRUE;
- }
- return FALSE;
-}
-
-//extern const struct Coords16 gUnknown_0839AAC4[];
-extern const u16 gUnknown_0839AAC4[][2];
-//extern const struct Coords16 gUnknown_0839AABC[];
-extern const s16 gUnknown_0839AABC[][2];
-
-void sub_807E4EC(struct Sprite *sprite)
-{
- u32 randVal;
- u16 r6;
- s32 r4;
- s32 r0;
-
- if (sprite->data[1] == 0)
- sprite->data[1] = 361;
- randVal = sprite->data[1] * 1103515245 + 12345;
- sprite->data[1] = ((randVal & 0x7FFF0000) >> 16) % 600;
-
- r6 = gUnknown_0839AAC4[gUnknown_08396FC4->unknown_6DC][0];
-
- r4 = sprite->data[1] % 30;
- sprite->data[2] = r4 * 8; // useless assignment
-
- r0 = sprite->data[1] / 30;
- sprite->data[3] = r0 * 8; // useless assignment
-
- sprite->data[2] = r4;
- sprite->data[2] <<= 7;
-
- sprite->data[3] = r0;
- sprite->data[3] <<= 7;
-
- sprite->data[2] -= gUnknown_0839AABC[gUnknown_08396FC4->unknown_6DC][0] * r6;
- sprite->data[3] -= gUnknown_0839AABC[gUnknown_08396FC4->unknown_6DC][1] * r6;
-
- StartSpriteAnim(sprite, 0);
- sprite->data[4] = 0;
- sprite->coordOffsetEnabled = FALSE;
- sprite->data[0] = r6;
-}
-
-void sub_807E5C0(struct Sprite *sprite)
-{
- if (sprite->data[4] == 0)
- {
- sprite->data[2] += gUnknown_0839AABC[gUnknown_08396FC4->unknown_6DC][0];
- sprite->data[3] += gUnknown_0839AABC[gUnknown_08396FC4->unknown_6DC][1];
- sprite->pos1.x = sprite->data[2] >> 4;
- sprite->pos1.y = sprite->data[3] >> 4;
-
- if (sprite->data[5] != 0
- && (sprite->pos1.x >= -8 && sprite->pos1.x <= 248)
- && sprite->pos1.y >= -16 && sprite->pos1.y <= 176)
- sprite->invisible = FALSE;
- else
- sprite->invisible = TRUE;
-
- sprite->data[0]--;
- if (sprite->data[0] == 0)
- {
- StartSpriteAnim(sprite, gUnknown_08396FC4->unknown_6DC + 1);
- sprite->data[4] = 1;
- sprite->pos1.x -= gSpriteCoordOffsetX;
- sprite->pos1.y -= gSpriteCoordOffsetY;
- sprite->coordOffsetEnabled = TRUE;
- }
- }
- else if (sprite->animEnded)
- {
- sprite->invisible = TRUE;
- sub_807E4EC(sprite);
- }
-}
-
-void sub_807E6C4(struct Sprite *sprite)
-{
- if (sprite->data[0] == 0)
- {
- sub_807E4EC(sprite);
- sprite->callback = sub_807E5C0;
- }
- else
- {
- sprite->data[0]--;
- }
-}
-
-void sub_807E6F0(struct Sprite *sprite, u16 b)
-{
- u16 r8 = gUnknown_0839AAC4[gUnknown_08396FC4->unknown_6DC][0];
- u16 r6 = b / (gUnknown_0839AAC4[gUnknown_08396FC4->unknown_6DC][1] + r8);
- u16 r4 = b % (gUnknown_0839AAC4[gUnknown_08396FC4->unknown_6DC][1] + r8);
-
- while (--r6 != 0xFFFF)
- sub_807E4EC(sprite);
- if (r4 < r8)
- {
- while (--r4 != 0xFFFF)
- sub_807E5C0(sprite);
- sprite->data[6] = 0;
- }
- else
- {
- sprite->data[0] = r4 - r8;
- sprite->invisible = TRUE;
- sprite->data[6] = 1;
- }
-}
-
-void sub_807E7A4(void)
-{
- LoadSpriteSheet(&gUnknown_0839AACC);
-}
-
-extern const struct Coords16 gUnknown_0839AA08[];
-
-bool8 sub_807E7B4(void)
-{
- u8 r7;
- u8 spriteId;
-
- if (gUnknown_08396FC4->unknown_6DA == 24)
- return FALSE;
-
- r7 = gUnknown_08396FC4->unknown_6DA;
- spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839AAA4,
- gUnknown_0839AA08[r7].x, gUnknown_0839AA08[r7].y, 78);
- if (spriteId != 64)
- {
- gSprites[spriteId].data[5] = 0;
- gSprites[spriteId].data[1] = r7 * 145;
- while (gSprites[spriteId].data[1] >= 600)
- gSprites[spriteId].data[1] -= 600;
- sub_807E4EC(&gSprites[spriteId]);
- sub_807E6F0(&gSprites[spriteId], r7 * 9);
- gSprites[spriteId].invisible = TRUE;
- gUnknown_08396FC4->unknown_0[r7] = &gSprites[spriteId];
- }
- else
- {
- gUnknown_08396FC4->unknown_0[r7] = NULL;
- }
-
- if (++gUnknown_08396FC4->unknown_6DA == 24)
- {
- u16 i;
-
- for (i = 0; i < 24; i++)
- {
- if (gUnknown_08396FC4->unknown_0[i] != NULL)
- {
- if (gUnknown_08396FC4->unknown_0[i]->data[6] == 0)
- gUnknown_08396FC4->unknown_0[i]->callback = sub_807E5C0;
- else
- gUnknown_08396FC4->unknown_0[i]->callback = sub_807E6C4;
- }
- }
- return FALSE;
- }
- return TRUE;
-}
-
-bool8 sub_807E8E8(void)
-{
- if (gUnknown_08396FC4->unknown_6D8 == gUnknown_08396FC4->unknown_6D9)
- return FALSE;
-
- if (++gUnknown_08396FC4->unknown_6D6 > gUnknown_08396FC4->unknown_6DB)
- {
- gUnknown_08396FC4->unknown_6D6 = 0;
- if (gUnknown_08396FC4->unknown_6D8 < gUnknown_08396FC4->unknown_6D9)
- {
- gUnknown_08396FC4->unknown_0[gUnknown_08396FC4->unknown_6D8++]->data[5] = 1;
- }
- else
- {
- gUnknown_08396FC4->unknown_6D8--;
- gUnknown_08396FC4->unknown_0[gUnknown_08396FC4->unknown_6D8]->data[5] = 0;
- gUnknown_08396FC4->unknown_0[gUnknown_08396FC4->unknown_6D8]->invisible = TRUE;
- }
- }
- return TRUE;
-}
-
-void sub_807E974(void)
-{
- u16 i;
-
- for (i = 0; i < gUnknown_08396FC4->unknown_6DA; i++)
- {
- if (gUnknown_08396FC4->unknown_0[i] != NULL)
- DestroySprite(gUnknown_08396FC4->unknown_0[i]);
- }
- gUnknown_08396FC4->unknown_6DA = 0;
- FreeSpriteTilesByTag(0x1206);
-}
-
-void sub_807E9C8(void)
-{
- gUnknown_08396FC4->unknown_6CC = 0;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6C1 = 3;
- gUnknown_08396FC4->unknown_6C2 = 20;
- gUnknown_08396FC4->unknown_6E5 = 16;
- gUnknown_08396FC4->unknown_6E0 = 0;
-}
-
-void snowflakes_progress2(void);
-void sub_807ED48(struct Sprite *);
-
-void sub_807EA18(void)
-{
- sub_807E9C8();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- {
- u16 i;
-
- snowflakes_progress2();
- for (i = 0; i < gUnknown_08396FC4->unknown_6E4; i++)
- {
- sub_807ED48(gUnknown_08396FC4->unknown_60[i]);
- }
- }
-}
-
-u8 snowflakes_progress(void);
-
-void snowflakes_progress2(void)
-{
- if (gUnknown_08396FC4->unknown_6CC == 0 && snowflakes_progress() == FALSE)
- {
- gUnknown_08396FC4->unknown_6D2 = 1;
- gUnknown_08396FC4->unknown_6CC++;
- }
-}
-
-bool8 sub_807EAC0(void)
-{
- switch (gUnknown_08396FC4->unknown_6CE)
- {
- case 0:
- gUnknown_08396FC4->unknown_6E5 = 0;
- gUnknown_08396FC4->unknown_6E0 = 0;
- gUnknown_08396FC4->unknown_6CE++;
- // fall through
- case 1:
- if (snowflakes_progress() == FALSE)
- {
- gUnknown_08396FC4->unknown_6CE++;
- return FALSE;
- }
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 snowflake_add(void);
-bool8 snowflake_remove(void);
-
-bool8 snowflakes_progress(void)
-{
- if (gUnknown_08396FC4->unknown_6E4 == gUnknown_08396FC4->unknown_6E5)
- return FALSE;
-
- gUnknown_08396FC4->unknown_6E0++;
- if (gUnknown_08396FC4->unknown_6E0 > 36)
- {
- gUnknown_08396FC4->unknown_6E0 = 0;
- if (gUnknown_08396FC4->unknown_6E4 < gUnknown_08396FC4->unknown_6E5)
- snowflake_add();
- else
- snowflake_remove();
- }
- return (gUnknown_08396FC4->unknown_6E4 != gUnknown_08396FC4->unknown_6E5);
-}
-
-void sub_807EC40(struct Sprite *);
-
-bool8 snowflake_add(void)
-{
- u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839AB04, 0, 0, 78);
-
- if (spriteId == 64)
- return FALSE;
- gSprites[spriteId].data[4] = gUnknown_08396FC4->unknown_6E4;
- sub_807EC40(&gSprites[spriteId]);
- gSprites[spriteId].coordOffsetEnabled = TRUE;
- gUnknown_08396FC4->unknown_60[gUnknown_08396FC4->unknown_6E4++] = &gSprites[spriteId];
- return TRUE;
-}
-
-bool8 snowflake_remove(void)
-{
- if (gUnknown_08396FC4->unknown_6E4 != 0)
- {
- DestroySprite(gUnknown_08396FC4->unknown_60[--gUnknown_08396FC4->unknown_6E4]);
- return TRUE;
- }
- return FALSE;
-}
-
-void sub_807EC40(struct Sprite *sprite)
-{
- u16 r4 = ((sprite->data[4] * 5) & 7) * 30 + (Random() % 30);
- u16 r6;
-
- sprite->pos1.y = -3 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
- sprite->pos1.x = r4 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
- sprite->data[0] = sprite->pos1.y * 128;
- sprite->pos2.x = 0;
- r6 = Random();
- sprite->data[1] = (r6 & 3) * 5 + 64;
- sprite->data[7] = (r6 & 3) * 5 + 64;
- StartSpriteAnim(sprite, (r6 & 1) ? 0 : 1);
- sprite->data[3] = 0;
- sprite->data[2] = ((r6 & 3) == 0) ? 2 : 1;
- sprite->data[6] = (r6 & 0x1F) + 210;
- sprite->data[5] = 0;
-}
-
-void sub_807ECEC(struct Sprite *sprite)
-{
- if (gUnknown_08396FC4->unknown_6E2 > 18)
- {
- sprite->invisible = FALSE;
- sprite->callback = sub_807ED48;
- sprite->pos1.y = 0xFA - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
- sprite->data[0] = sprite->pos1.y * 128;
- gUnknown_08396FC4->unknown_6E2 = 0;
- }
-}
-
-void sub_807ED48(struct Sprite *sprite)
-{
- s16 r3;
- s16 r2;
-
- sprite->data[0] += sprite->data[1];
- sprite->pos1.y = sprite->data[0] >> 7;
- sprite->data[3] = (sprite->data[3] + sprite->data[2]) & 0xFF;
- sprite->pos2.x = gSineTable[sprite->data[3]] / 64;
-
- r3 = (sprite->pos1.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX) & 0x1FF;
- if (r3 & 0x100)
- r3 = -0x100 | r3; // hmm... what is this?
- if (r3 < -3)
- sprite->pos1.x = 242 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
- else if (r3 > 242)
- sprite->pos1.x = -3 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
-
- r2 = (sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY) & 0xFF;
- if (r2 > 163 && r2 < 171)
- {
- sprite->pos1.y = 250 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
- sprite->data[0] = sprite->pos1.y * 128;
- sprite->data[5] = 0;
- sprite->data[6] = 220;
- }
- else if (r2 > 242 && r2 < 250)
- {
- sprite->pos1.y = 163;
- sprite->data[0] = sprite->pos1.y * 128;
- sprite->data[5] = 0;
- sprite->data[6] = 220;
- sprite->invisible = TRUE;
- sprite->callback = sub_807ECEC;
- }
-
- sprite->data[5]++;
- if (sprite->data[5] == sprite->data[6])
- {
- sub_807EC40(sprite);
- sprite->pos1.y = 250;
- sprite->invisible = TRUE;
- sprite->callback = sub_807ECEC;
- }
-}
-
-void sub_807EE80(void)
-{
- gUnknown_08396FC4->unknown_6CC = 0;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6D6 = 0;
- gUnknown_08396FC4->unknown_6DB = 4;
- gUnknown_08396FC4->unknown_6DC = 0;
- gUnknown_08396FC4->unknown_6D9 = 16;
- gUnknown_08396FC4->unknown_6C1 = 3;
- gUnknown_08396FC4->unknown_6C2 = 20;
- gUnknown_08396FC4->unknown_6D2 = 0; // duplicate assignment
- gUnknown_08396FC4->unknown_6ED = 0;
- sub_807DD5C(0x51);
-}
-
-void sub_807EFC0(void);
-
-void sub_807EEF4(void)
-{
- sub_807EE80();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- sub_807EFC0();
-}
-
-void sub_807EF24(void)
-{
- gUnknown_08396FC4->unknown_6CC = 0;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6D6 = 0;
- gUnknown_08396FC4->unknown_6DB = 4;
- gUnknown_08396FC4->unknown_6DC = 1;
- gUnknown_08396FC4->unknown_6D9 = 24;
- gUnknown_08396FC4->unknown_6C1 = 3;
- gUnknown_08396FC4->unknown_6C2 = 20;
- gUnknown_08396FC4->unknown_6D2 = 0; // duplicate assignment
- sub_807DD5C(0x53);
-}
-
-void sub_807EF90(void)
-{
- sub_807EF24();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- sub_807EFC0();
-}
-
-void sub_807F434(void);
-void sub_807F3F8(u16);
-
-void sub_807EFC0(void)
-{
- sub_807F434();
- switch (gUnknown_08396FC4->unknown_6CC)
- {
- case 0:
- sub_807E7A4();
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 1:
- if (sub_807E7B4())
- break;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 2:
- if (sub_807E8E8())
- break;
- gUnknown_08396FC4->unknown_6D2 = 1;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 3:
- if (gUnknown_08396FC4->unknown_6C6 == 0)
- break;
- gUnknown_08396FC4->unknown_6CC = 6;
- break;
- case 4:
- gUnknown_08396FC4->unknown_6EA = 1;
- gUnknown_08396FC4->unknown_6E6 = (Random() % 360) + 360;
- gUnknown_08396FC4->unknown_6CC++;
- // fall through
- case 5:
- if (--gUnknown_08396FC4->unknown_6E6 != 0)
- break;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 6:
- gUnknown_08396FC4->unknown_6EA = 1;
- gUnknown_08396FC4->unknown_6EB = Random() % 2;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 7:
- gUnknown_08396FC4->unknown_6EC = (Random() & 1) + 1;
- gUnknown_08396FC4->unknown_6CC++;
- // fall through
- case 8:
- sub_807D5BC(19);
- if (gUnknown_08396FC4->unknown_6EB == 0 && gUnknown_08396FC4->unknown_6EC == 1)
- sub_807F3F8(20);
- gUnknown_08396FC4->unknown_6E6 = (Random() % 3) + 6;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 9:
- if (--gUnknown_08396FC4->unknown_6E6 != 0)
- break;
- sub_807D5BC(3);
- gUnknown_08396FC4->unknown_6EA = 1;
- if (--gUnknown_08396FC4->unknown_6EC != 0)
- {
- gUnknown_08396FC4->unknown_6E6 = (Random() % 16) + 60;
- gUnknown_08396FC4->unknown_6CC = 10;
- }
- else if (gUnknown_08396FC4->unknown_6EB == 0)
- {
- gUnknown_08396FC4->unknown_6CC = 4;
- }
- else
- {
- gUnknown_08396FC4->unknown_6CC = 11;
- }
- break;
- case 10:
- if (--gUnknown_08396FC4->unknown_6E6 != 0)
- break;
- gUnknown_08396FC4->unknown_6CC = 8;
- break;
- case 11:
- gUnknown_08396FC4->unknown_6E6 = (Random() % 16) + 60;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 12:
- if (--gUnknown_08396FC4->unknown_6E6 != 0)
- break;
- sub_807F3F8(100);
- sub_807D5BC(19);
- // Why use "% 16" everywhere else and "& 0xF" here. So dumb.
- gUnknown_08396FC4->unknown_6E6 = (Random() & 0xF) + 30;
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 13:
- if (--gUnknown_08396FC4->unknown_6E6 != 0)
- break;
- sub_807D5F0(19, 3, 5);
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 14:
- if (gUnknown_08396FC4->unknown_6C6 != 3)
- break;
- gUnknown_08396FC4->unknown_6EA = 1;
- gUnknown_08396FC4->unknown_6CC = 4;
- break;
- }
-}
-
-bool8 sub_807F34C(void)
-{
- switch (gUnknown_08396FC4->unknown_6CE)
- {
- case 0:
- gUnknown_08396FC4->unknown_6EA = 0;
- gUnknown_08396FC4->unknown_6CE++;
- // fall through
- case 1:
- sub_807EFC0();
- if (gUnknown_08396FC4->unknown_6EA != 0)
- {
- if (gUnknown_08396FC4->unknown_6D1 == 3
- || gUnknown_08396FC4->unknown_6D1 == 5
- || gUnknown_08396FC4->unknown_6D1 == 13)
- return FALSE;
- gUnknown_08396FC4->unknown_6D9 = 0;
- gUnknown_08396FC4->unknown_6CE++;
- }
- break;
- case 2:
- if (sub_807E8E8())
- break;
- sub_807E974();
- gUnknown_08396FC4->unknown_6ED = 0;
- gUnknown_08396FC4->unknown_6CE++;
- return FALSE;
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-void sub_807F3F8(u16 a)
-{
- if (gUnknown_08396FC4->unknown_6ED == 0)
- {
- gUnknown_08396FC4->unknown_6E8 = Random() % a;
- gUnknown_08396FC4->unknown_6ED = 1;
- }
-}
-
-void sub_807F434(void)
-{
- if (gUnknown_08396FC4->unknown_6ED == 1)
- {
- if (gUnknown_08396FC4->unknown_6E8 == 0)
- {
- if (IsSEPlaying())
- return;
- if (Random() & 1)
- PlaySE(0x57);
- else
- PlaySE(0x58);
- gUnknown_08396FC4->unknown_6ED = 0;
- }
- else
- {
- gUnknown_08396FC4->unknown_6E8--;
- }
- }
-}
-
-void sub_807F49C(void)
-{
- gUnknown_08396FC4->unknown_6CC = 0;
- gUnknown_08396FC4->unknown_6D2 = 0;
- gUnknown_08396FC4->unknown_6C1 = 0;
- gUnknown_08396FC4->unknown_6C2 = 20;
- if (gUnknown_08396FC4->unknown_6FB == 0)
- {
- gUnknown_08396FC4->unknown_6F0 = 0;
- gUnknown_08396FC4->unknown_6F2 = 0;
- gUnknown_08396FC4->unknown_6EE = 0;
- sub_807DB64(0, 16);
- }
-}
-
-void sub_807F52C(void);
-
-void sub_807F4FC(void)
-{
- sub_807F49C();
- while (gUnknown_08396FC4->unknown_6D2 == 0)
- sub_807F52C();
-}
-
-void sub_807F6E8(void);
-
-void sub_807F52C(void)
-{
- gUnknown_08396FC4->unknown_6EE = (gSpriteCoordOffsetX - gUnknown_08396FC4->unknown_6F2) & 0xFF;
- if (++gUnknown_08396FC4->unknown_6F0 > 3)
- {
- gUnknown_08396FC4->unknown_6F0 = 0;
- gUnknown_08396FC4->unknown_6F2++;
- }
- switch (gUnknown_08396FC4->unknown_6CC)
- {
- case 0:
- sub_807F6E8();
- if (gUnknown_08396FC4->unknown_6D0 == 6)
- sub_807DBA4(12, 8, 3);
- else
- sub_807DBA4(4, 16, 0);
- gUnknown_08396FC4->unknown_6CC++;
- break;
- case 1:
- if (sub_807DBE8())
- {
- gUnknown_08396FC4->unknown_6D2 = 1;
- gUnknown_08396FC4->unknown_6CC++;
- }
- break;
- }
-}
-
-void sub_807F7A4(void);
-
-bool8 sub_807F5EC(void)
-{
- gUnknown_08396FC4->unknown_6EE = (gSpriteCoordOffsetX - gUnknown_08396FC4->unknown_6F2) & 0xFF;
- if (++gUnknown_08396FC4->unknown_6F0 > 3)
- {
- gUnknown_08396FC4->unknown_6F0 = 0;
- gUnknown_08396FC4->unknown_6F2++;
- }
- switch (gUnknown_08396FC4->unknown_6CE)
- {
- case 0:
- sub_807DBA4(0, 16, 3);
- gUnknown_08396FC4->unknown_6CE++;
- break;
- case 1:
- if (!sub_807DBE8())
- break;
- gUnknown_08396FC4->unknown_6CE++;
- break;
- case 2:
- sub_807F7A4();
- gUnknown_08396FC4->unknown_6CE++;
- break;
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-void sub_807F688(struct Sprite *sprite)
-{
- sprite->pos2.y = (u8)gSpriteCoordOffsetY;
- sprite->pos1.x = gUnknown_08396FC4->unknown_6EE + 32 + sprite->data[0] * 64;
- if (sprite->pos1.x > 0x10F)
- {
- sprite->pos1.x = 480 + gUnknown_08396FC4->unknown_6EE - (4 - sprite->data[0]) * 64;
- sprite->pos1.x &= 0x1FF;
- }
-}
diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c
new file mode 100644
index 000000000..b1dca6396
--- /dev/null
+++ b/src/field/field_weather_effects.c
@@ -0,0 +1,2383 @@
+#include "global.h"
+#include "field_map_obj.h"
+#include "field_weather.h"
+#include "overworld.h"
+#include "random.h"
+#include "script.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+
+extern struct Weather *const gWeatherPtr;
+
+const u16 gUnknown_08397108[] = INCBIN_U16("graphics/weather/1.gbapal");
+const u16 gUnknown_08397128[] = INCBIN_U16("graphics/weather/2.gbapal");
+const u8 gWeatherFog2Tiles[] = INCBIN_U8("graphics/weather/fog2.4bpp");
+const u8 gWeatherFog1Tiles[] = INCBIN_U8("graphics/weather/fog1.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");
+
+static const struct Coords16 gUnknown_0839A9C8[] =
+{
+ { 0, 66},
+ { 5, 73},
+ {10, 78},
+};
+
+static const struct SpriteSheet sCloudSpriteSheet = {gWeatherCloudTiles, sizeof(gWeatherCloudTiles), 0x1200};
+
+static const struct OamData gOamData_839A9DC =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd gSpriteAnim_839A9E4[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839A9EC[] =
+{
+ gSpriteAnim_839A9E4,
+};
+
+void sub_807E0F4(struct Sprite *);
+static const struct SpriteTemplate sCloudSpriteTemplate =
+{
+ .tileTag = 4608,
+ .paletteTag = 4609,
+ .oam = &gOamData_839A9DC,
+ .anims = gSpriteAnimTable_839A9EC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807E0F4,
+};
+
+extern void sub_807D5BC(s8 a);
+extern void sub_807D8C0(const u16 *palette);
+extern void sub_807D9A8(void);
+extern bool8 sub_807D9C8(void);
+extern void sub_807DA14(void);
+extern void sub_807DA4C(void);
+extern void 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);
+
+//------------------------------------------------------------------------------
+// Clouds
+//------------------------------------------------------------------------------
+
+void Clouds_InitVars(void)
+{
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->initStep = 0;
+ if (gWeatherPtr->cloudSpritesCreated == FALSE)
+ Weather_SetBlendCoeffs(0, 16);
+}
+
+void Clouds_Main(void);
+
+void Clouds_InitAll(void)
+{
+ Clouds_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Clouds_Main();
+}
+
+void CreateCloudSprites(void);
+
+void Clouds_Main(void)
+{
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ CreateCloudSprites();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ Weather_SetTargetBlendCoeffs(12, 8, 1);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (Weather_UpdateBlend())
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+ break;
+ }
+}
+
+void sub_807E0A0(void);
+
+bool8 Clouds_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 1);
+ gWeatherPtr->finishStep++;
+ return TRUE;
+ case 1:
+ if (Weather_UpdateBlend())
+ {
+ sub_807E0A0();
+ gWeatherPtr->finishStep++;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+//------------------------------------------------------------------------------
+// Weather 2
+//------------------------------------------------------------------------------
+
+void Weather2_InitVars(void)
+{
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+}
+
+void Weather2_InitAll(void)
+{
+ Weather2_InitVars();
+}
+
+void Weather2_Main(void)
+{
+}
+
+int Weather2_Finish(void)
+{
+ return 0;
+}
+
+void CreateCloudSprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->cloudSpritesCreated == TRUE)
+ return;
+ LoadSpriteSheet(&sCloudSpriteSheet);
+ sub_807D8C0(gUnknown_08397108);
+ for (i = 0; i < 3; i++)
+ {
+ u8 spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF);
+
+ if (spriteId != 64)
+ {
+ struct Sprite *sprite;
+
+ gWeatherPtr->sprites.s1.cloudSprites[i] = &gSprites[spriteId];
+ sprite = gWeatherPtr->sprites.s1.cloudSprites[i];
+ sub_80603CC(gUnknown_0839A9C8[i].x + 7, gUnknown_0839A9C8[i].y + 7, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->coordOffsetEnabled = TRUE;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s1.cloudSprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->cloudSpritesCreated = TRUE;
+}
+
+void sub_807E0A0(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->cloudSpritesCreated == FALSE)
+ return;
+ for (i = 0; i < 3; i++)
+ {
+ if (gWeatherPtr->sprites.s1.cloudSprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s1.cloudSprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1200);
+ gWeatherPtr->cloudSpritesCreated = FALSE;
+}
+
+void sub_807E0F4(struct Sprite *sprite)
+{
+ sprite->data[0] = (sprite->data[0] + 1) & 1;
+ if (sprite->data[0] != 0)
+ sprite->pos1.x--;
+}
+
+//------------------------------------------------------------------------------
+// Drought
+//------------------------------------------------------------------------------
+
+void Drought_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 0;
+}
+
+void Drought_Main(void);
+
+void Drought_InitAll(void)
+{
+ Drought_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Drought_Main();
+}
+
+void Drought_Main(void)
+{
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ if (gWeatherPtr->unknown_6C6 != 0)
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ sub_807D9A8();
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (sub_807D9C8() == FALSE)
+ gWeatherPtr->initStep++;
+ break;
+ case 3:
+ sub_807DA14();
+ gWeatherPtr->initStep++;
+ break;
+ case 4:
+ sub_807DA4C();
+ if (gWeatherPtr->unknown_73C == 6)
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+ break;
+ default:
+ sub_807DA4C();
+ break;
+ }
+}
+
+int Drought_Finish(void)
+{
+ return 0;
+}
+
+void task50_0807B6D4(u8);
+
+void sub_807E25C(void)
+{
+ CreateTask(task50_0807B6D4, 0x50);
+}
+
+#define tState data[0]
+#define tBlendY data[1]
+#define tBlendDelay data[2]
+#define tWinRange data[3]
+
+void task50_0807B6D4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->tState)
+ {
+ case 0:
+ task->tBlendY = 0;
+ task->tBlendDelay = 0;
+ task->tWinRange = REG_WININ;
+ REG_WININ = WIN_RANGE(63, 63);
+ REG_BLDCNT = BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ
+ | BLDCNT_EFFECT_LIGHTEN;
+ REG_BLDY = 0;
+ task->tState++;
+ // fall through
+ case 1:
+ task->tBlendY += 3;
+ if (task->tBlendY > 16)
+ task->tBlendY = 16;
+ REG_BLDY = task->tBlendY;
+ if (task->tBlendY >= 16)
+ task->tState++;
+ break;
+ case 2:
+ task->tBlendDelay++;
+ if (task->tBlendDelay > 9)
+ {
+ task->tBlendDelay = 0;
+ task->tBlendY--;
+ if (task->tBlendY <= 0)
+ {
+ task->tBlendY = 0;
+ task->tState++;
+ }
+ REG_BLDY = task->tBlendY;
+ }
+ break;
+ case 3:
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ REG_WININ = task->tWinRange;
+ task->tState++;
+ break;
+ case 4:
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+#undef tState
+#undef tBlendY
+#undef tBlendDelay
+#undef tWinRange
+
+//------------------------------------------------------------------------------
+// Light Rain
+//------------------------------------------------------------------------------
+
+void LightRain_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6D6 = 0;
+ gWeatherPtr->unknown_6DB = 8;
+ gWeatherPtr->unknown_6DC = 0;
+ gWeatherPtr->unknown_6D9 = 10;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ SetRainStrengthFromSoundEffect(SE_T_KOAME);
+}
+
+void LightRain_Main(void);
+
+void LightRain_InitAll(void)
+{
+ LightRain_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ LightRain_Main();
+}
+
+void LoadRainSpriteSheet(void);
+u8 CreateRainSprite(void);
+u8 sub_807E8E8(void);
+
+void LightRain_Main(void)
+{
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ LoadRainSpriteSheet();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (CreateRainSprite() == 0)
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (sub_807E8E8() == FALSE)
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+ break;
+ }
+}
+
+void DestroyRainSprites(void);
+
+bool8 LightRain_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ if (gWeatherPtr->nextWeather == WEATHER_RAIN_LIGHT
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_MED
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_HEAVY)
+ {
+ gWeatherPtr->finishStep = 0xFF;
+ return FALSE;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6D9 = 0;
+ gWeatherPtr->finishStep++;
+ }
+ // fall through
+ case 1:
+ if (sub_807E8E8() == FALSE)
+ {
+ DestroyRainSprites();
+ gWeatherPtr->finishStep++;
+ return FALSE;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+// defined below
+extern const s16 gUnknown_0839AABC[][2];
+extern const u16 gUnknown_0839AAC4[][2];
+
+void sub_807E4EC(struct Sprite *sprite)
+{
+ u32 randVal;
+ u16 r6;
+ s32 r4;
+ s32 r0;
+
+ if (sprite->data[1] == 0)
+ sprite->data[1] = 361;
+ randVal = sprite->data[1] * 1103515245 + 12345;
+ sprite->data[1] = ((randVal & 0x7FFF0000) >> 16) % 600;
+
+ r6 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0];
+
+ r4 = sprite->data[1] % 30;
+ sprite->data[2] = r4 * 8; // useless assignment
+
+ r0 = sprite->data[1] / 30;
+ sprite->data[3] = r0 * 8; // useless assignment
+
+ sprite->data[2] = r4;
+ sprite->data[2] <<= 7;
+
+ sprite->data[3] = r0;
+ sprite->data[3] <<= 7;
+
+ sprite->data[2] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0] * r6;
+ sprite->data[3] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1] * r6;
+
+ StartSpriteAnim(sprite, 0);
+ sprite->data[4] = 0;
+ sprite->coordOffsetEnabled = FALSE;
+ sprite->data[0] = r6;
+}
+
+void sub_807E5C0(struct Sprite *sprite)
+{
+ if (sprite->data[4] == 0)
+ {
+ sprite->data[2] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0];
+ sprite->data[3] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1];
+ sprite->pos1.x = sprite->data[2] >> 4;
+ sprite->pos1.y = sprite->data[3] >> 4;
+
+ if (sprite->data[5] != 0
+ && (sprite->pos1.x >= -8 && sprite->pos1.x <= 248)
+ && sprite->pos1.y >= -16 && sprite->pos1.y <= 176)
+ sprite->invisible = FALSE;
+ else
+ sprite->invisible = TRUE;
+
+ sprite->data[0]--;
+ if (sprite->data[0] == 0)
+ {
+ StartSpriteAnim(sprite, gWeatherPtr->unknown_6DC + 1);
+ sprite->data[4] = 1;
+ sprite->pos1.x -= gSpriteCoordOffsetX;
+ sprite->pos1.y -= gSpriteCoordOffsetY;
+ sprite->coordOffsetEnabled = TRUE;
+ }
+ }
+ else if (sprite->animEnded)
+ {
+ sprite->invisible = TRUE;
+ sub_807E4EC(sprite);
+ }
+}
+
+void sub_807E6C4(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sub_807E4EC(sprite);
+ sprite->callback = sub_807E5C0;
+ }
+ else
+ {
+ sprite->data[0]--;
+ }
+}
+
+void sub_807E6F0(struct Sprite *sprite, u16 b)
+{
+ u16 r8 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0];
+ u16 r6 = b / (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8);
+ u16 r4 = b % (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8);
+
+ while (--r6 != 0xFFFF)
+ sub_807E4EC(sprite);
+ if (r4 < r8)
+ {
+ while (--r4 != 0xFFFF)
+ sub_807E5C0(sprite);
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ sprite->data[0] = r4 - r8;
+ sprite->invisible = TRUE;
+ sprite->data[6] = 1;
+ }
+}
+
+extern const struct SpriteSheet sRainSpriteSheet; // defined below
+
+void LoadRainSpriteSheet(void)
+{
+ LoadSpriteSheet(&sRainSpriteSheet);
+}
+
+static const struct Coords16 sRainSpriteCoords[] =
+{
+ { 0, 0},
+ { 0, 160},
+ { 0, 64},
+ {144, 224},
+ {144, 128},
+ { 32, 32},
+ { 32, 192},
+ { 32, 96},
+ { 72, 128},
+ { 72, 32},
+ { 72, 192},
+ {216, 96},
+ {216, 0},
+ {104, 160},
+ {104, 64},
+ {104, 224},
+ {144, 0},
+ {144, 160},
+ {144, 64},
+ { 32, 224},
+ { 32, 128},
+ { 72, 32},
+ { 72, 192},
+ { 48, 96},
+};
+
+static const struct OamData gOamData_839AA68 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 2,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 2,
+ .affineParam = 0,
+};
+
+static const union AnimCmd gSpriteAnim_839AA70[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd gSpriteAnim_839AA78[] =
+{
+ ANIMCMD_FRAME(8, 3),
+ ANIMCMD_FRAME(32, 2),
+ ANIMCMD_FRAME(40, 2),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AA88[] =
+{
+ ANIMCMD_FRAME(8, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(24, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839AA98[] =
+{
+ gSpriteAnim_839AA70,
+ gSpriteAnim_839AA78,
+ gSpriteAnim_839AA88,
+};
+
+static const struct SpriteTemplate sRainSpriteTemplate =
+{
+ .tileTag = 4614,
+ .paletteTag = 4608,
+ .oam = &gOamData_839AA68,
+ .anims = gSpriteAnimTable_839AA98,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807E5C0,
+};
+
+
+const s16 gUnknown_0839AABC[][2] =
+{
+ {-104, 208},
+ {-160, 320},
+};
+
+const u16 gUnknown_0839AAC4[][2] =
+{
+ {18, 7},
+ {12, 10},
+};
+
+static const struct SpriteSheet sRainSpriteSheet = {gWeatherRainTiles, sizeof(gWeatherRainTiles), 0x1206};
+
+static const struct OamData gOamData_839AAD4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_839AADC[] =
+{
+ {gWeatherSnow1Tiles, sizeof(gWeatherSnow1Tiles)},
+ {gWeatherSnow2Tiles, sizeof(gWeatherSnow2Tiles)},
+};
+
+static const union AnimCmd gSpriteAnim_839AAEC[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AAF4[] =
+{
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839AAFC[] =
+{
+ gSpriteAnim_839AAEC,
+ gSpriteAnim_839AAF4,
+};
+
+void sub_807ED48(struct Sprite *);
+static const struct SpriteTemplate sSnowflakeSpriteTemplate =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 4608,
+ .oam = &gOamData_839AAD4,
+ .anims = gSpriteAnimTable_839AAFC,
+ .images = gSpriteImageTable_839AADC,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807ED48,
+};
+
+// unused data
+static const u16 unusedData_839AB1C[] = {0, 6, 6, 12, 18, 42, 300, 300};
+
+static const struct OamData gOamData_839AB2C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd gSpriteAnim_839AB34[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB3C[] =
+{
+ ANIMCMD_FRAME(32, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB44[] =
+{
+ ANIMCMD_FRAME(64, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB4C[] =
+{
+ ANIMCMD_FRAME(96, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB54[] =
+{
+ ANIMCMD_FRAME(128, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB5C[] =
+{
+ ANIMCMD_FRAME(160, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839AB64[] =
+{
+ gSpriteAnim_839AB34,
+ gSpriteAnim_839AB3C,
+ gSpriteAnim_839AB44,
+ gSpriteAnim_839AB4C,
+ gSpriteAnim_839AB54,
+ gSpriteAnim_839AB5C,
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_839AB7C[] =
+{
+ AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_839AB8C[] =
+{
+ gSpriteAffineAnim_839AB7C,
+};
+
+static void Fog1SpriteCallback(struct Sprite *);
+static const struct SpriteTemplate sFog1SpriteTemplate =
+{
+ .tileTag = 4609,
+ .paletteTag = 4608,
+ .oam = &gOamData_839AB2C,
+ .anims = gSpriteAnimTable_839AB64,
+ .images = NULL,
+ .affineAnims = gSpriteAffineAnimTable_839AB8C,
+ .callback = Fog1SpriteCallback,
+};
+
+bool8 CreateRainSprite(void)
+{
+ u8 spriteNum;
+ u8 spriteId;
+
+ if (gWeatherPtr->rainSpriteCount == 24)
+ return FALSE;
+
+ spriteNum = gWeatherPtr->rainSpriteCount;
+ spriteId = CreateSpriteAtEnd(&sRainSpriteTemplate,
+ sRainSpriteCoords[spriteNum].x, sRainSpriteCoords[spriteNum].y, 78);
+ if (spriteId != 64)
+ {
+ gSprites[spriteId].data[5] = 0;
+ gSprites[spriteId].data[1] = spriteNum * 145;
+ while (gSprites[spriteId].data[1] >= 600)
+ gSprites[spriteId].data[1] -= 600;
+ sub_807E4EC(&gSprites[spriteId]);
+ sub_807E6F0(&gSprites[spriteId], spriteNum * 9);
+ gSprites[spriteId].invisible = TRUE;
+ gWeatherPtr->sprites.s1.rainSprites[spriteNum] = &gSprites[spriteId];
+ }
+ else
+ {
+ gWeatherPtr->sprites.s1.rainSprites[spriteNum] = NULL;
+ }
+
+ if (++gWeatherPtr->rainSpriteCount == 24)
+ {
+ u16 i;
+
+ for (i = 0; i < 24; i++)
+ {
+ if (gWeatherPtr->sprites.s1.rainSprites[i] != NULL)
+ {
+ if (gWeatherPtr->sprites.s1.rainSprites[i]->data[6] == 0)
+ gWeatherPtr->sprites.s1.rainSprites[i]->callback = sub_807E5C0;
+ else
+ gWeatherPtr->sprites.s1.rainSprites[i]->callback = sub_807E6C4;
+ }
+ }
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 sub_807E8E8(void)
+{
+ if (gWeatherPtr->unknown_6D8 == gWeatherPtr->unknown_6D9)
+ return FALSE;
+
+ if (++gWeatherPtr->unknown_6D6 > gWeatherPtr->unknown_6DB)
+ {
+ gWeatherPtr->unknown_6D6 = 0;
+ if (gWeatherPtr->unknown_6D8 < gWeatherPtr->unknown_6D9)
+ {
+ gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8++]->data[5] = 1;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6D8--;
+ gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8]->data[5] = 0;
+ gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8]->invisible = TRUE;
+ }
+ }
+ return TRUE;
+}
+
+void DestroyRainSprites(void)
+{
+ u16 i;
+
+ for (i = 0; i < gWeatherPtr->rainSpriteCount; i++)
+ {
+ if (gWeatherPtr->sprites.s1.rainSprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s1.rainSprites[i]);
+ }
+ gWeatherPtr->rainSpriteCount = 0;
+ FreeSpriteTilesByTag(0x1206);
+}
+
+//------------------------------------------------------------------------------
+// Snow
+//------------------------------------------------------------------------------
+
+void Snow_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6E5 = 16;
+ gWeatherPtr->unknown_6E0 = 0;
+}
+
+void Snow_Main(void);
+void sub_807ED48(struct Sprite *);
+
+void Snow_InitAll(void)
+{
+ Snow_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ {
+ u16 i;
+
+ Snow_Main();
+ for (i = 0; i < gWeatherPtr->snowflakeSpriteCount; i++)
+ {
+ sub_807ED48(gWeatherPtr->sprites.s1.snowflakeSprites[i]);
+ }
+ }
+}
+
+u8 snowflakes_progress(void);
+
+void Snow_Main(void)
+{
+ if (gWeatherPtr->initStep == 0 && snowflakes_progress() == FALSE)
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+}
+
+bool8 Snow_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ gWeatherPtr->unknown_6E5 = 0;
+ gWeatherPtr->unknown_6E0 = 0;
+ gWeatherPtr->finishStep++;
+ // fall through
+ case 1:
+ if (snowflakes_progress() == FALSE)
+ {
+ gWeatherPtr->finishStep++;
+ return FALSE;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 CreateSnowflakeSprite(void);
+bool8 RemoveSnowflakeSprite(void);
+
+bool8 snowflakes_progress(void)
+{
+ if (gWeatherPtr->snowflakeSpriteCount == gWeatherPtr->unknown_6E5)
+ return FALSE;
+
+ gWeatherPtr->unknown_6E0++;
+ if (gWeatherPtr->unknown_6E0 > 36)
+ {
+ gWeatherPtr->unknown_6E0 = 0;
+ if (gWeatherPtr->snowflakeSpriteCount < gWeatherPtr->unknown_6E5)
+ CreateSnowflakeSprite();
+ else
+ RemoveSnowflakeSprite();
+ }
+ return (gWeatherPtr->snowflakeSpriteCount != gWeatherPtr->unknown_6E5);
+}
+
+void sub_807EC40(struct Sprite *);
+
+bool8 CreateSnowflakeSprite(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&sSnowflakeSpriteTemplate, 0, 0, 78);
+
+ if (spriteId == 64)
+ return FALSE;
+ gSprites[spriteId].data[4] = gWeatherPtr->snowflakeSpriteCount;
+ sub_807EC40(&gSprites[spriteId]);
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ gWeatherPtr->sprites.s1.snowflakeSprites[gWeatherPtr->snowflakeSpriteCount++] = &gSprites[spriteId];
+ return TRUE;
+}
+
+bool8 RemoveSnowflakeSprite(void)
+{
+ if (gWeatherPtr->snowflakeSpriteCount != 0)
+ {
+ DestroySprite(gWeatherPtr->sprites.s1.snowflakeSprites[--gWeatherPtr->snowflakeSpriteCount]);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_807EC40(struct Sprite *sprite)
+{
+ u16 r4 = ((sprite->data[4] * 5) & 7) * 30 + (Random() % 30);
+ u16 r6;
+
+ sprite->pos1.y = -3 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->pos1.x = r4 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+ sprite->data[0] = sprite->pos1.y * 128;
+ sprite->pos2.x = 0;
+ r6 = Random();
+ sprite->data[1] = (r6 & 3) * 5 + 64;
+ sprite->data[7] = (r6 & 3) * 5 + 64;
+ StartSpriteAnim(sprite, (r6 & 1) ? 0 : 1);
+ sprite->data[3] = 0;
+ sprite->data[2] = ((r6 & 3) == 0) ? 2 : 1;
+ sprite->data[6] = (r6 & 0x1F) + 210;
+ sprite->data[5] = 0;
+}
+
+void sub_807ECEC(struct Sprite *sprite)
+{
+ if (gWeatherPtr->unknown_6E2 > 18)
+ {
+ sprite->invisible = FALSE;
+ sprite->callback = sub_807ED48;
+ sprite->pos1.y = 0xFA - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->data[0] = sprite->pos1.y * 128;
+ gWeatherPtr->unknown_6E2 = 0;
+ }
+}
+
+void sub_807ED48(struct Sprite *sprite)
+{
+ s16 r3;
+ s16 r2;
+
+ sprite->data[0] += sprite->data[1];
+ sprite->pos1.y = sprite->data[0] >> 7;
+ sprite->data[3] = (sprite->data[3] + sprite->data[2]) & 0xFF;
+ sprite->pos2.x = gSineTable[sprite->data[3]] / 64;
+
+ r3 = (sprite->pos1.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX) & 0x1FF;
+ if (r3 & 0x100)
+ r3 = -0x100 | r3; // hmm... what is this?
+ if (r3 < -3)
+ sprite->pos1.x = 242 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+ else if (r3 > 242)
+ sprite->pos1.x = -3 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+
+ r2 = (sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY) & 0xFF;
+ if (r2 > 163 && r2 < 171)
+ {
+ sprite->pos1.y = 250 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->data[0] = sprite->pos1.y * 128;
+ sprite->data[5] = 0;
+ sprite->data[6] = 220;
+ }
+ else if (r2 > 242 && r2 < 250)
+ {
+ sprite->pos1.y = 163;
+ sprite->data[0] = sprite->pos1.y * 128;
+ sprite->data[5] = 0;
+ sprite->data[6] = 220;
+ sprite->invisible = TRUE;
+ sprite->callback = sub_807ECEC;
+ }
+
+ sprite->data[5]++;
+ if (sprite->data[5] == sprite->data[6])
+ {
+ sub_807EC40(sprite);
+ sprite->pos1.y = 250;
+ sprite->invisible = TRUE;
+ sprite->callback = sub_807ECEC;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Medium Rain
+//------------------------------------------------------------------------------
+
+void MedRain_InitVars(void)
+{
+ 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->weatherGfxLoaded = FALSE; // duplicate assignment
+ gWeatherPtr->unknown_6ED = 0;
+ SetRainStrengthFromSoundEffect(SE_T_AME);
+}
+
+void Rain_Main(void);
+
+void MedRain_InitAll(void)
+{
+ MedRain_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Rain_Main();
+}
+
+//------------------------------------------------------------------------------
+// Heavy Rain
+//------------------------------------------------------------------------------
+
+void HeavyRain_InitVars(void)
+{
+ 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->weatherGfxLoaded = FALSE; // duplicate assignment
+ SetRainStrengthFromSoundEffect(SE_T_OOAME);
+}
+
+void HeavyRain_InitAll(void)
+{
+ HeavyRain_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Rain_Main();
+}
+
+void UpdateThunderSound(void);
+void SetThunderCounter(u16);
+
+void Rain_Main(void)
+{
+ UpdateThunderSound();
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ LoadRainSpriteSheet();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (CreateRainSprite())
+ break;
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (sub_807E8E8())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ case 3:
+ if (gWeatherPtr->unknown_6C6 == 0)
+ break;
+ gWeatherPtr->initStep = 6;
+ break;
+ case 4:
+ gWeatherPtr->unknown_6EA = 1;
+ gWeatherPtr->unknown_6E6 = (Random() % 360) + 360;
+ gWeatherPtr->initStep++;
+ // fall through
+ case 5:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ gWeatherPtr->initStep++;
+ break;
+ case 6:
+ gWeatherPtr->unknown_6EA = 1;
+ gWeatherPtr->unknown_6EB = Random() % 2;
+ gWeatherPtr->initStep++;
+ break;
+ case 7:
+ gWeatherPtr->unknown_6EC = (Random() & 1) + 1;
+ gWeatherPtr->initStep++;
+ // fall through
+ case 8:
+ sub_807D5BC(19);
+ if (gWeatherPtr->unknown_6EB == 0 && gWeatherPtr->unknown_6EC == 1)
+ SetThunderCounter(20);
+ gWeatherPtr->unknown_6E6 = (Random() % 3) + 6;
+ gWeatherPtr->initStep++;
+ break;
+ case 9:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ sub_807D5BC(3);
+ gWeatherPtr->unknown_6EA = 1;
+ if (--gWeatherPtr->unknown_6EC != 0)
+ {
+ gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
+ gWeatherPtr->initStep = 10;
+ }
+ else if (gWeatherPtr->unknown_6EB == 0)
+ {
+ gWeatherPtr->initStep = 4;
+ }
+ else
+ {
+ gWeatherPtr->initStep = 11;
+ }
+ break;
+ case 10:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ gWeatherPtr->initStep = 8;
+ break;
+ case 11:
+ gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
+ gWeatherPtr->initStep++;
+ break;
+ case 12:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ SetThunderCounter(100);
+ sub_807D5BC(19);
+ // Why use "% 16" everywhere else and "& 0xF" here. So dumb.
+ gWeatherPtr->unknown_6E6 = (Random() & 0xF) + 30;
+ gWeatherPtr->initStep++;
+ break;
+ case 13:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ sub_807D5F0(19, 3, 5);
+ gWeatherPtr->initStep++;
+ break;
+ case 14:
+ if (gWeatherPtr->unknown_6C6 != 3)
+ break;
+ gWeatherPtr->unknown_6EA = 1;
+ gWeatherPtr->initStep = 4;
+ break;
+ }
+}
+
+bool8 Rain_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ gWeatherPtr->unknown_6EA = 0;
+ gWeatherPtr->finishStep++;
+ // fall through
+ case 1:
+ Rain_Main();
+ if (gWeatherPtr->unknown_6EA != 0)
+ {
+ if (gWeatherPtr->nextWeather == WEATHER_RAIN_LIGHT
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_MED
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_HEAVY)
+ return FALSE;
+ gWeatherPtr->unknown_6D9 = 0;
+ gWeatherPtr->finishStep++;
+ }
+ break;
+ case 2:
+ if (sub_807E8E8())
+ break;
+ DestroyRainSprites();
+ gWeatherPtr->unknown_6ED = 0;
+ gWeatherPtr->finishStep++;
+ return FALSE;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void SetThunderCounter(u16 max)
+{
+ if (gWeatherPtr->unknown_6ED == 0)
+ {
+ gWeatherPtr->thunderCounter = Random() % max;
+ gWeatherPtr->unknown_6ED = 1;
+ }
+}
+
+void UpdateThunderSound(void)
+{
+ if (gWeatherPtr->unknown_6ED == 1)
+ {
+ if (gWeatherPtr->thunderCounter == 0)
+ {
+ if (IsSEPlaying())
+ return;
+ if (Random() & 1)
+ PlaySE(SE_T_KAMI);
+ else
+ PlaySE(SE_T_KAMI2);
+ gWeatherPtr->unknown_6ED = 0;
+ }
+ else
+ {
+ gWeatherPtr->thunderCounter--;
+ }
+ }
+}
+
+//------------------------------------------------------------------------------
+// Fog 1
+//------------------------------------------------------------------------------
+
+void Fog1_Main(void);
+static void CreateFog1Sprites(void);
+static void DestroyFog1Sprites(void);
+
+void Fog1_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ if (gWeatherPtr->fog1SpritesCreated == 0)
+ {
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2 = 0;
+ gWeatherPtr->fog1ScrollPosX = 0;
+ Weather_SetBlendCoeffs(0, 16);
+ }
+}
+
+void Fog1_InitAll(void)
+{
+ Fog1_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Fog1_Main();
+}
+
+void Fog1_Main(void)
+{
+ gWeatherPtr->fog1ScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
+ if (++gWeatherPtr->unknown_6F0 > 3)
+ {
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2++;
+ }
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ CreateFog1Sprites();
+ if (gWeatherPtr->currWeather == WEATHER_FOG_1)
+ Weather_SetTargetBlendCoeffs(12, 8, 3);
+ else
+ Weather_SetTargetBlendCoeffs(4, 16, 0);
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (Weather_UpdateBlend())
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+ break;
+ }
+}
+
+bool8 Fog1_Finish(void)
+{
+ gWeatherPtr->fog1ScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
+ if (++gWeatherPtr->unknown_6F0 > 3)
+ {
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2++;
+ }
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 3);
+ gWeatherPtr->finishStep++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->finishStep++;
+ break;
+ case 2:
+ DestroyFog1Sprites();
+ gWeatherPtr->finishStep++;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+#define sprColumn data[0]
+
+static void Fog1SpriteCallback(struct Sprite *sprite)
+{
+ sprite->pos2.y = (u8)gSpriteCoordOffsetY;
+ sprite->pos1.x = gWeatherPtr->fog1ScrollPosX + 32 + sprite->sprColumn * 64;
+ if (sprite->pos1.x > 0x10F)
+ {
+ sprite->pos1.x = 480 + gWeatherPtr->fog1ScrollPosX - (4 - sprite->sprColumn) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}
+
+static void CreateFog1Sprites(void)
+{
+ u16 i;
+
+ if (!gWeatherPtr->fog1SpritesCreated)
+ {
+ struct SpriteSheet fog1SpriteSheet = {gWeatherFog1Tiles, sizeof(gWeatherFog1Tiles), 0x1201};
+
+ LoadSpriteSheet(&fog1SpriteSheet);
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sFog1SpriteTemplate, 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;
+ gWeatherPtr->sprites.s2.fog1Sprites[i] = sprite;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.fog1Sprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->fog1SpritesCreated = TRUE;
+ }
+}
+
+#undef sprColumn
+
+static void DestroyFog1Sprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->fog1SpritesCreated)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.fog1Sprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.fog1Sprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1201);
+ gWeatherPtr->fog1SpritesCreated = 0;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Volcanic ash
+//------------------------------------------------------------------------------
+
+void Ash_Main(void);
+void LoadAshSpriteSheet(void);
+void CreateAshSprites(void);
+void DestroyAshSprites(void);
+
+void Ash_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6FE = 20;
+ if (!gWeatherPtr->ashSpritesCreated)
+ {
+ Weather_SetBlendCoeffs(0, 16);
+ REG_BLDALPHA = BLDALPHA_BLEND(64, 63); // Those aren't even valid coefficients!
+ }
+}
+
+void Ash_InitAll(void)
+{
+ Ash_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Ash_Main();
+}
+
+void Ash_Main(void)
+{
+ gWeatherPtr->unknown_6FC = gSpriteCoordOffsetX & 0x1FF;
+ while (gWeatherPtr->unknown_6FC > 0xEF)
+ gWeatherPtr->unknown_6FC -= 0xF0;
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ LoadAshSpriteSheet();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (!gWeatherPtr->ashSpritesCreated)
+ CreateAshSprites();
+ Weather_SetTargetBlendCoeffs(16, 0, 1);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ default:
+ Weather_UpdateBlend();
+ break;
+ }
+}
+
+bool8 Ash_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 1);
+ gWeatherPtr->finishStep++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ DestroyAshSprites();
+ gWeatherPtr->finishStep++;
+ break;
+ case 2:
+ REG_BLDALPHA = 0;
+ gWeatherPtr->finishStep++;
+ return FALSE;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static const struct SpriteSheet sAshSpriteSheet = {gWeatherAshTiles, sizeof(gWeatherAshTiles), 0x1202};
+
+void LoadAshSpriteSheet(void)
+{
+ LoadSpriteSheet(&sAshSpriteSheet);
+}
+
+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 *);
+static const struct SpriteTemplate sAshSpriteTemplate =
+{
+ .tileTag = 4610,
+ .paletteTag = 4608,
+ .oam = &gOamData_839ABB8,
+ .anims = gSpriteAnimTable_839ABCC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807FAA8,
+};
+
+void CreateAshSprites(void)
+{
+ u8 i;
+
+ if (!gWeatherPtr->ashSpritesCreated)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sAshSpriteTemplate, 0, 0, 0x4E);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ sprite->data[1] = 0;
+ sprite->data[2] = (u8)(i % 5);
+ sprite->data[3] = (u8)(i / 5);
+ sprite->data[0] = sprite->data[3] * 64 + 32;
+ gWeatherPtr->sprites.s2.ashSprites[i] = sprite;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->ashSpritesCreated = TRUE;
+ }
+}
+
+void DestroyAshSprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->ashSpritesCreated)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.ashSprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1202);
+ gWeatherPtr->ashSpritesCreated = FALSE;
+ }
+}
+
+void sub_807FAA8(struct Sprite *sprite)
+{
+ sprite->data[1]++;
+ if (sprite->data[1] > 5)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ sprite->pos1.y = gSpriteCoordOffsetY + sprite->data[0];
+ sprite->pos1.x = gWeatherPtr->unknown_6FC + 32 + sprite->data[2] * 64;
+ if (sprite->pos1.x > 271)
+ {
+ sprite->pos1.x = gWeatherPtr->unknown_6FC + 0x1E0 - (4 - sprite->data[2]) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Fog 2
+//------------------------------------------------------------------------------
+
+void Fog2_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = 0;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2 = 1;
+ if (gWeatherPtr->fog2SpritesCreated == 0)
+ {
+ gWeatherPtr->unknown_71C = 0;
+ gWeatherPtr->unknown_71E = 0;
+ gWeatherPtr->unknown_720 = 0;
+ gWeatherPtr->unknown_722 = 0;
+ gWeatherPtr->unknown_718 = 0;
+ gWeatherPtr->unknown_71A = 0;
+ Weather_SetBlendCoeffs(0, 16);
+ }
+}
+
+void Fog2_Main(void);
+
+void Fog2_InitAll(void)
+{
+ Fog2_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Fog2_Main();
+}
+
+void sub_807FC9C(void);
+void CreateFog2Sprites(void);
+
+void Fog2_Main(void)
+{
+ sub_807FC9C();
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ CreateFog2Sprites();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ Weather_SetTargetBlendCoeffs(12, 8, 8);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ }
+}
+
+void DestroyFog2Sprites(void);
+
+bool8 Fog2_Finish(void)
+{
+ sub_807FC9C();
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 1);
+ gWeatherPtr->finishStep++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->finishStep++;
+ break;
+ case 2:
+ DestroyFog2Sprites();
+ gWeatherPtr->finishStep++;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_807FC9C(void)
+{
+ if (++gWeatherPtr->unknown_71C > 2)
+ {
+ gWeatherPtr->unknown_720++;
+ gWeatherPtr->unknown_71C = 0;
+ }
+
+ if (++gWeatherPtr->unknown_71E > 4)
+ {
+ gWeatherPtr->unknown_722++;
+ gWeatherPtr->unknown_71E = 0;
+ }
+
+ gWeatherPtr->unknown_718 = (gSpriteCoordOffsetX - gWeatherPtr->unknown_720) & 0xFF;
+ gWeatherPtr->unknown_71A = gSpriteCoordOffsetY + gWeatherPtr->unknown_722;
+}
+
+extern const struct SpriteTemplate sFog2SpriteTemplate; // defined below
+
+void CreateFog2Sprites(void)
+{
+ u16 i;
+
+ if (!gWeatherPtr->fog2SpritesCreated)
+ {
+ struct SpriteSheet fog2SpriteSheet = {gWeatherFog2Tiles, sizeof(gWeatherFog2Tiles), 0x1203};
+
+ LoadSpriteSheet(&fog2SpriteSheet);
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sFog2SpriteTemplate, 0, (i / 5) * 64, 0xFF);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ sprite->data[0] = i % 5;
+ sprite->data[1] = i / 5;
+ gWeatherPtr->sprites.s2.fog2Sprites[i] = sprite;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.fog2Sprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->fog2SpritesCreated = TRUE;
+ }
+}
+
+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 Fog2SpriteCallback(struct Sprite *);
+const struct SpriteTemplate sFog2SpriteTemplate =
+{
+ .tileTag = 4611,
+ .paletteTag = 4608,
+ .oam = &gOamData_839ABF0,
+ .anims = gSpriteAnimTable_839AC00,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = Fog2SpriteCallback,
+};
+
+void DestroyFog2Sprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->fog2SpritesCreated)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.fog2Sprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.fog2Sprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1203);
+ gWeatherPtr->fog2SpritesCreated = FALSE;
+ }
+}
+
+void Fog2SpriteCallback(struct Sprite *sprite)
+{
+ sprite->pos2.y = gWeatherPtr->unknown_71A;
+ sprite->pos1.x = gWeatherPtr->unknown_718 + 32 + sprite->data[0] * 64;
+ if (sprite->pos1.x > 271)
+ {
+ sprite->pos1.x = gWeatherPtr->unknown_718 + 0x1E0 - (4 - sprite->data[0]) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Sandstorm
+//------------------------------------------------------------------------------
+
+void Sandstorm_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = 0;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ if (gWeatherPtr->sandstormSprites1Created == 0)
+ {
+ gWeatherPtr->unknown_704 = gWeatherPtr->unknown_708 = 0;
+ gWeatherPtr->unknown_712 = 8;
+ gWeatherPtr->unknown_714 = 0;
+ // Dead code. How does the compiler not optimize this out?
+ if (gWeatherPtr->unknown_712 > 0x5F)
+ gWeatherPtr->unknown_712 = 0x80 - gWeatherPtr->unknown_712;
+ Weather_SetBlendCoeffs(0, 16);
+ }
+}
+
+void Sandstorm_Main(void);
+
+void Sandstorm_InitAll(void)
+{
+ Sandstorm_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Sandstorm_Main();
+}
+
+void sub_808002C(void);
+void sub_8080064(void);
+void CreateSandstormSprites_1(void);
+void CreateSandstormSprites_2(void);
+
+void Sandstorm_Main(void)
+{
+ sub_8080064();
+ sub_808002C();
+ if (gWeatherPtr->unknown_712 > 0x5F)
+ gWeatherPtr->unknown_712 = 32;
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ CreateSandstormSprites_1();
+ CreateSandstormSprites_2();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ Weather_SetTargetBlendCoeffs(16, 0, 0);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ }
+}
+
+void sub_80800E4(void);
+
+bool8 Sandstorm_Finish(void)
+{
+ sub_8080064();
+ sub_808002C();
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 0);
+ gWeatherPtr->finishStep++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->finishStep++;
+ break;
+ case 2:
+ sub_80800E4();
+ gWeatherPtr->finishStep++;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_808002C(void)
+{
+ if (gWeatherPtr->unknown_714++ > 4)
+ {
+ gWeatherPtr->unknown_712++;
+ gWeatherPtr->unknown_714 = 0;
+ }
+}
+
+void sub_8080064(void)
+{
+ gWeatherPtr->unknown_704 -= gSineTable[gWeatherPtr->unknown_712] * 4;
+ gWeatherPtr->unknown_708 -= gSineTable[gWeatherPtr->unknown_712];
+ gWeatherPtr->unknown_70E = (gSpriteCoordOffsetX + (gWeatherPtr->unknown_704 >> 8)) & 0xFF;
+ gWeatherPtr->unknown_710 = gSpriteCoordOffsetY + (gWeatherPtr->unknown_708 >> 8);
+}
+
+void sub_80800E4(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->sandstormSprites1Created)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.sandstormSprites1[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites1[i]);
+ }
+ gWeatherPtr->sandstormSprites1Created = FALSE;
+ FreeSpriteTilesByTag(0x1204);
+ }
+
+ if (gWeatherPtr->sandstormSprites2Created)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ if (gWeatherPtr->sprites.s2.sandstormSprites2[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites2[i]);
+ }
+ gWeatherPtr->sandstormSprites2Created = FALSE;
+ }
+}
+
+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 SandstormSpriteCallback1(struct Sprite *);
+const struct SpriteTemplate sSandstormSpriteTemplate =
+{
+ .tileTag = 4612,
+ .paletteTag = 4609,
+ .oam = &gOamData_839AC1C,
+ .anims = gSpriteAnimTable_839AC34,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SandstormSpriteCallback1,
+};
+
+static const struct SpriteSheet sSandstormSpriteSheet = {gWeatherSandstormTiles, sizeof(gWeatherSandstormTiles), 0x1204};
+
+void CreateSandstormSprites_1(void)
+{
+ u16 i;
+
+ if (!gWeatherPtr->sandstormSprites1Created)
+ {
+ LoadSpriteSheet(&sSandstormSpriteSheet);
+ sub_807D8C0(gUnknown_08397128);
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, 0, (i / 5) * 64, 1);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ gWeatherPtr->sprites.s2.sandstormSprites1[i] = &gSprites[spriteId];
+ gWeatherPtr->sprites.s2.sandstormSprites1[i]->data[0] = i % 5;
+ gWeatherPtr->sprites.s2.sandstormSprites1[i]->data[1] = i / 5;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.sandstormSprites1[i] = NULL;
+ }
+ }
+ gWeatherPtr->sandstormSprites1Created = TRUE;
+ }
+}
+
+const u16 gUnknown_0839AC5C[] = {0, 120, 80, 160, 40, 0};
+
+void SandstormSpriteCallback2(struct Sprite *);
+
+void CreateSandstormSprites_2(void)
+{
+ u16 i;
+
+ if (!gWeatherPtr->sandstormSprites2Created)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, i * 48 + 0x18, 0xD0, 1);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ gWeatherPtr->sprites.s2.sandstormSprites2[i] = &gSprites[spriteId];
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->oam.size = 2;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[1] = i * 51;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[0] = 8;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[2] = 0;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[4] = 0x6730;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[3] = gUnknown_0839AC5C[i];
+ StartSpriteAnim(gWeatherPtr->sprites.s2.sandstormSprites2[i], 1);
+ CalcCenterToCornerVec(gWeatherPtr->sprites.s2.sandstormSprites2[i], 0, 2, 0);
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->callback = SandstormSpriteCallback2;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.sandstormSprites2[i] = NULL;
+ }
+ gWeatherPtr->sandstormSprites2Created = TRUE;
+ }
+ }
+}
+
+void SandstormSpriteCallback1(struct Sprite *sprite)
+{
+ sprite->pos2.y = gWeatherPtr->unknown_710;
+ sprite->pos1.x = gWeatherPtr->unknown_70E + 32 + sprite->data[0] * 64;
+ if (sprite->pos1.x > 271)
+ {
+ sprite->pos1.x = gWeatherPtr->unknown_70E + 0x1E0 - (4 - sprite->data[0]) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}
+
+void SandstormSpriteCallback3(struct Sprite *);
+
+void SandstormSpriteCallback2(struct Sprite *sprite)
+{
+ if (--sprite->data[3] == -1)
+ sprite->callback = SandstormSpriteCallback3;
+}
+
+void SandstormSpriteCallback3(struct Sprite *sprite)
+{
+ u32 x;
+ u32 y;
+
+ if (--sprite->pos1.y < -48)
+ {
+ sprite->pos1.y = 208;
+ sprite->data[0] = 4;
+ }
+ x = sprite->data[0] * gSineTable[sprite->data[1]];
+ y = sprite->data[0] * gSineTable[sprite->data[1] + 64];
+ sprite->pos2.x = x >> 8;
+ sprite->pos2.y = y >> 8;
+ sprite->data[1] = (sprite->data[1] + 10) & 0xFF;
+ if (++sprite->data[2] > 8)
+ {
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Weather 11
+//------------------------------------------------------------------------------
+
+void Weather11_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+}
+
+void Weather11_InitAll(void)
+{
+ Weather11_InitVars();
+}
+
+void Weather11_Main(void)
+{
+}
+
+bool8 Weather11_Finish(void)
+{
+ return FALSE;
+}
+
+//------------------------------------------------------------------------------
+// Weather 14
+//------------------------------------------------------------------------------
+
+const u8 gUnknown_0839AC68[] = {40, 90, 60, 90, 2, 60, 40, 30};
+
+const struct SpriteSheet gWeatherBubbleSpriteSheet = {gWeatherBubbleTiles, sizeof(gWeatherBubbleTiles), 0x1205};
+
+void Bubbles_InitVars(void)
+{
+ Fog1_InitVars();
+ if (gWeatherPtr->unknown_72E == 0)
+ {
+ LoadSpriteSheet(&gWeatherBubbleSpriteSheet);
+ gWeatherPtr->unknown_728 = 0;
+ gWeatherPtr->unknown_726 = gUnknown_0839AC68[0];
+ gWeatherPtr->unknown_72A = 0;
+ gWeatherPtr->unknown_72C = 0;
+ }
+}
+
+void Bubbles_Main(void);
+
+void Bubbles_InitAll(void)
+{
+ Bubbles_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Bubbles_Main();
+}
+
+void sub_8080588(u16);
+
+void Bubbles_Main(void)
+{
+ Fog1_Main();
+ if (++gWeatherPtr->unknown_726 > gUnknown_0839AC68[gWeatherPtr->unknown_728])
+ {
+ gWeatherPtr->unknown_726 = 0;
+ if (++gWeatherPtr->unknown_728 > 7)
+ gWeatherPtr->unknown_728 = 0;
+ sub_8080588(gWeatherPtr->unknown_72A);
+ if (++gWeatherPtr->unknown_72A > 12)
+ gWeatherPtr->unknown_72A = 0;
+ }
+}
+
+void sub_8080610(void);
+
+bool8 Bubbles_Finish(void)
+{
+ if (!Fog1_Finish())
+ {
+ sub_8080610();
+ return FALSE;
+ }
+ return TRUE;
+}
+
+const s16 gUnknown_0839AC78[][2] =
+{
+ {120, 160},
+ {376, 160},
+ { 40, 140},
+ {296, 140},
+ {180, 130},
+ {436, 130},
+ { 60, 160},
+ {436, 160},
+ {220, 180},
+ {476, 180},
+ { 10, 90},
+ {266, 90},
+ {256, 160},
+};
+
+const union AnimCmd gSpriteAnim_839ACAC[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839ACB8[] =
+{
+ gSpriteAnim_839ACAC,
+};
+
+extern const struct OamData gOamData_837DF24;
+
+void unc_0807DAB4(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_839ACBC =
+{
+ .tileTag = 4613,
+ .paletteTag = 4608,
+ .oam = &gOamData_837DF24,
+ .anims = gSpriteAnimTable_839ACB8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = unc_0807DAB4,
+};
+
+void sub_8080588(u16 a)
+{
+ s16 x = gUnknown_0839AC78[a][0];
+ s16 y = gUnknown_0839AC78[a][1] - gSpriteCoordOffsetY;
+ u8 spriteId = CreateSpriteAtEnd(
+ &gSpriteTemplate_839ACBC,
+ x,
+ y,
+ 0);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = 0;
+ gSprites[spriteId].data[2] = 0;
+ gWeatherPtr->unknown_72C++;
+ }
+}
+
+void sub_8080610(void)
+{
+ u16 i;
+
+ for (i = 0; i < 64; i++)
+ {
+ if (gSprites[i].template == &gSpriteTemplate_839ACBC)
+ DestroySprite(&gSprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1205);
+}
+
+void unc_0807DAB4(struct Sprite *sprite)
+{
+ ++sprite->data[0];
+ if (++sprite->data[0] > 8) // double increment
+ {
+ sprite->data[0] = 0;
+ if (sprite->data[1] == 0)
+ {
+ if (++sprite->pos2.x > 4)
+ sprite->data[1] = 1;
+ }
+ else
+ {
+ if (--sprite->pos2.x <= 0)
+ sprite->data[1] = 0;
+ }
+ }
+ sprite->pos1.y -= 3;
+ if (++sprite->data[2] > 0x77)
+ DestroySprite(sprite);
+}
+
+//------------------------------------------------------------------------------
+
+u8 TranslateWeatherNum(u8);
+void UpdateRainCounter(u8, u8);
+
+void SetSav1Weather(u32 weather)
+{
+ u8 oldWeather = gSaveBlock1.weather;
+
+ gSaveBlock1.weather = TranslateWeatherNum(weather);
+ UpdateRainCounter(gSaveBlock1.weather, oldWeather);
+}
+
+u8 GetSav1Weather(void)
+{
+ return gSaveBlock1.weather;
+}
+
+void SetSav1WeatherFromCurrMapHeader(void)
+{
+ u8 oldWeather = gSaveBlock1.weather;
+
+ gSaveBlock1.weather = TranslateWeatherNum(gMapHeader.weather);
+ UpdateRainCounter(gSaveBlock1.weather, oldWeather);
+}
+
+void SetWeather(u32 weather)
+{
+ SetSav1Weather(weather);
+ DoWeatherEffect(GetSav1Weather());
+}
+
+void SetWeather_Unused(u32 weather)
+{
+ SetSav1Weather(weather);
+ sub_807C988(GetSav1Weather());
+}
+
+void DoCurrentWeather(void)
+{
+ DoWeatherEffect(GetSav1Weather());
+}
+
+void sub_8080750(void)
+{
+ sub_807C988(GetSav1Weather());
+}
+
+static const u8 sWeatherCycle1[] = {2, 3, 5, 3};
+static const u8 sWeatherCycle2[] = {2, 2, 3, 2};
+
+u8 TranslateWeatherNum(u8 weather)
+{
+ switch (weather)
+ {
+ case 0: return 0;
+ case 1: return 1;
+ case 2: return 2;
+ case 3: return 3;
+ case 4: return 4;
+ case 5: return 5;
+ case 6: return 6;
+ case 7: return 7;
+ case 8: return 8;
+ case 9: return 9;
+ case 10: return 10;
+ case 11: return 11;
+ case 12: return 12;
+ case 13: return 13;
+ case 14: return 14;
+ case 20: return sWeatherCycle1[gSaveBlock1.filler_2F];
+ case 21: return sWeatherCycle2[gSaveBlock1.filler_2F];
+ default: return 0;
+ }
+}
+
+void UpdateWeatherPerDay(u16 increment)
+{
+ u16 weatherStage = gSaveBlock1.filler_2F + increment;
+ weatherStage %= 4;
+ gSaveBlock1.filler_2F = weatherStage;
+}
+
+void UpdateRainCounter(u8 newWeather, u8 oldWeather)
+{
+ if (newWeather != oldWeather
+ && (newWeather == WEATHER_RAIN_LIGHT || newWeather == WEATHER_RAIN_MED))
+ IncrementGameStat(0x28);
+}
diff --git a/src/field/lottery_corner.c b/src/field/lottery_corner.c
index c2c25b9ac..5f0ce2907 100644
--- a/src/field/lottery_corner.c
+++ b/src/field/lottery_corner.c
@@ -2,7 +2,7 @@
#include "lottery_corner.h"
#include "event_data.h"
#include "items.h"
-#include "rng.h"
+#include "random.h"
#include "species.h"
#include "string_util.h"
#include "text.h"
diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c
index 33bc39648..a27c54df7 100644
--- a/src/field/mauville_man.c
+++ b/src/field/mauville_man.c
@@ -7,7 +7,7 @@
#include "m4a.h"
#include "menu.h"
#include "overworld.h"
-#include "rng.h"
+#include "random.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/field/overworld.c b/src/field/overworld.c
index 59aac5c33..ca59426fa 100644
--- a/src/field/overworld.c
+++ b/src/field/overworld.c
@@ -32,7 +32,7 @@
#include "new_game.h"
#include "palette.h"
#include "play_time.h"
-#include "rng.h"
+#include "random.h"
#include "roamer.h"
#include "rotating_gate.h"
#include "safari_zone.h"
@@ -602,7 +602,7 @@ void sub_80538F0(u8 mapGroup, u8 mapNum)
prev_quest_postbuffer_cursor_backup_reset();
sub_8082BD0(mapGroup, mapNum);
DoTimeBasedEvents();
- sub_80806E4();
+ SetSav1WeatherFromCurrMapHeader();
ChooseAmbientCrySpecies();
SetDefaultFlashLevel();
Overworld_ClearSavedMusic();
@@ -638,7 +638,7 @@ void sub_8053994(u32 a1)
sub_8082BD0(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum);
if (a1 != 1)
DoTimeBasedEvents();
- sub_80806E4();
+ SetSav1WeatherFromCurrMapHeader();
ChooseAmbientCrySpecies();
if (v2)
FlagClear(SYS_USE_FLASH);
@@ -1737,7 +1737,7 @@ void sub_8054D4C(u32 a1)
sub_805C7C4(0);
FieldEffectActiveListClear();
InitFieldMessageBox();
- sub_807C828();
+ StartWeather();
sub_8080750();
if (!a1)
SetUpFieldTasks();
diff --git a/src/field/pc_screen_effect.c b/src/field/pc_screen_effect.c
new file mode 100644
index 000000000..364fca0aa
--- /dev/null
+++ b/src/field/pc_screen_effect.c
@@ -0,0 +1,128 @@
+#include "global.h"
+#include "main.h"
+#include "palette.h"
+#include "sprite.h"
+
+struct UnkStruct
+{
+ /*0x00*/ u16 tileTag;
+ /*0x02*/ u16 paletteTag;
+ /*0x04*/ u16 unk04;
+ /*0x06*/ u16 unk06;
+ /*0x08*/ u16 unk08;
+ /*0x0A*/ u16 unk0A;
+ /*0x0C*/ s16 unk0C;
+ /*0x10*/ u32 selectedPalettes;
+};
+
+void sub_80C603C(void);
+void sub_80C6078(void);
+void sub_80C60CC(struct Sprite *);
+void sub_80C6130(struct Sprite *);
+void sub_80C61B0(IntrFunc);
+void ClearGpuRegBits(void);
+
+extern const struct OamData gOamData_83D18D8;
+
+extern const union AnimCmd *const gSpriteAnimTable_83D18E8[];
+
+extern const u16 gUnknownPal_083D18EC[16];
+
+extern const u8 gUnknownGfx_083D190C[128];
+
+extern struct UnkStruct *gUnknown_020387EC;
+
+const struct SpriteSheet gUnknown_083D1898 = { gUnknownGfx_083D190C, sizeof(gUnknownGfx_083D190C), 0 };
+
+const struct SpritePalette gUnknown_083D18A0 = { gUnknownPal_083D18EC, 0 };
+
+const struct SpriteTemplate gSpriteTemplate_83D18A8 =
+{
+ 0,
+ 0,
+ &gOamData_83D18D8,
+ gSpriteAnimTable_83D18E8,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_80C60CC,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83D18C0 =
+{
+ 0,
+ 0,
+ &gOamData_83D18D8,
+ gSpriteAnimTable_83D18E8,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_80C6130,
+};
+
+void sub_80C5CD4(struct UnkStruct *unkStruct)
+{
+ u16 i;
+
+ struct SpriteSheet sprSheet = gUnknown_083D1898;
+ struct SpritePalette sprPalette = gUnknown_083D18A0;
+ struct SpriteTemplate sprTemplate = gSpriteTemplate_83D18A8;
+
+ sprSheet.tag = unkStruct->tileTag;
+ sprTemplate.tileTag = unkStruct->tileTag;
+ sprPalette.tag = unkStruct->paletteTag;
+ sprTemplate.paletteTag = unkStruct->paletteTag;
+
+ LoadSpriteSheet(&sprSheet);
+ LoadSpritePalette(&sprPalette);
+
+ unkStruct->unk0C = 1;
+ unkStruct->unk0A = 0;
+ unkStruct->unk08 = 0;
+ unkStruct->selectedPalettes = ~(0x10000 << IndexOfSpritePaletteTag(unkStruct->paletteTag)) & 0xFFFF0000;
+
+ if (unkStruct->unk04 == 0)
+ unkStruct->unk04 = 16;
+
+ if (unkStruct->unk06 == 0)
+ unkStruct->unk06 = 20;
+
+ gUnknown_020387EC = unkStruct;
+
+ for (i = 0; i < 8; i++)
+ {
+ u8 spriteId = CreateSprite(&sprTemplate, 32 * i + 8, 80, 0);
+ if (spriteId == MAX_SPRITES)
+ break;
+ gSprites[spriteId].data[0] = (i < 4) ? -unkStruct->unk04 : unkStruct->unk04;
+ }
+
+ REG_BLDCNT = 191;
+ REG_BLDY = 16;
+}
+
+bool8 sub_80C5DCC(void)
+{
+ if (gUnknown_020387EC->unk08 == 0)
+ {
+ BlendPalettes(gUnknown_020387EC->selectedPalettes, 0x10, 0xFFFF);
+ sub_80C61B0(sub_80C603C);
+ gUnknown_020387EC->unk08++;
+ }
+
+ if (gUnknown_020387EC->unk0A < 8)
+ return FALSE;
+
+ gUnknown_020387EC->unk0C += gUnknown_020387EC->unk06;
+
+ if (gUnknown_020387EC->unk0C >= 80)
+ {
+ gUnknown_020387EC->unk0C = 80;
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ ClearGpuRegBits();
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
diff --git a/src/field/roamer.c b/src/field/roamer.c
index c45c87601..d8ea1ef52 100644
--- a/src/field/roamer.c
+++ b/src/field/roamer.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "roamer.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "species.h"
#ifdef SAPPHIRE
diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c
index 28584d4d0..e6305d9c4 100644
--- a/src/field/scrcmd.c
+++ b/src/field/scrcmd.c
@@ -30,7 +30,7 @@
#include "palette.h"
#include "party_menu.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "rtc.h"
#include "script.h"
@@ -692,7 +692,7 @@ bool8 ScrCmd_setweather(struct ScriptContext *ctx)
bool8 ScrCmd_resetweather(struct ScriptContext *ctx)
{
- sub_80806E4();
+ SetSav1WeatherFromCurrMapHeader();
return FALSE;
}
diff --git a/src/field/tv.c b/src/field/tv.c
index 29d012f28..e58adebc9 100644
--- a/src/field/tv.c
+++ b/src/field/tv.c
@@ -9,7 +9,7 @@
#include "field_message_box.h"
#include "field_camera.h"
#include "flags.h"
-#include "rng.h"
+#include "random.h"
#include "string_util.h"
#include "text.h"
#include "species.h"
@@ -30,7 +30,7 @@
#include "naming_screen.h"
#include "pokedex.h"
#include "region_map.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "rtc.h"
#include "script_menu.h"
diff --git a/src/field/wild_encounter.c b/src/field/wild_encounter.c
index 390898917..df0b12207 100644
--- a/src/field/wild_encounter.c
+++ b/src/field/wild_encounter.c
@@ -8,7 +8,7 @@
#include "map_constants.h"
#include "metatile_behavior.h"
#include "pokeblock.h"
-#include "rng.h"
+#include "random.h"
#include "roamer.h"
#include "overworld.h"
#include "safari_zone.h"
diff --git a/src/pokemon/pokedex.c b/src/pokemon/pokedex.c
index cd37c3a93..604085b28 100644
--- a/src/pokemon/pokedex.c
+++ b/src/pokemon/pokedex.c
@@ -14,7 +14,7 @@
#include "pokedex_area_screen.h"
#include "pokedex_cry_screen.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c
index 750a9892a..d44a8b61e 100644
--- a/src/pokemon/pokemon_1.c
+++ b/src/pokemon/pokemon_1.c
@@ -3,7 +3,7 @@
#include "items.h"
#include "main.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "species.h"
#include "sprite.h"
diff --git a/src/pokemon/pokemon_2.c b/src/pokemon/pokemon_2.c
index 68923a16e..cedcc2720 100644
--- a/src/pokemon/pokemon_2.c
+++ b/src/pokemon/pokemon_2.c
@@ -4,7 +4,7 @@
#include "event_data.h"
#include "main.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "rom_8077ABC.h"
#include "species.h"
#include "sprite.h"
diff --git a/src/pokemon/pokemon_3.c b/src/pokemon/pokemon_3.c
index a8e824b33..40165384d 100644
--- a/src/pokemon/pokemon_3.c
+++ b/src/pokemon/pokemon_3.c
@@ -10,7 +10,7 @@
#include "m4a.h"
#include "main.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "rom_8077ABC.h"
#include "rom_8094928.h"
diff --git a/src/scene/berry_blender.c b/src/scene/berry_blender.c
index 42c79bc99..91b5c10bc 100644
--- a/src/scene/berry_blender.c
+++ b/src/scene/berry_blender.c
@@ -15,7 +15,7 @@
#include "overworld.h"
#include "item.h"
#include "items.h"
-#include "rng.h"
+#include "random.h"
#include "save.h"
#include "menu_cursor.h"
#include "trig.h"
diff --git a/src/scene/contest_painting.c b/src/scene/contest_painting.c
index 2600076c3..442d8ec26 100644
--- a/src/scene/contest_painting.c
+++ b/src/scene/contest_painting.c
@@ -6,7 +6,7 @@
#include "main.h"
#include "menu.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "sprite.h"
#include "string_util.h"
#include "strings.h"
diff --git a/src/scene/credits.c b/src/scene/credits.c
index ccd4cebc6..fed1d993a 100644
--- a/src/scene/credits.c
+++ b/src/scene/credits.c
@@ -9,7 +9,7 @@
#include "menu.h"
#include "palette.h"
#include "pokedex.h"
-#include "rng.h"
+#include "random.h"
#include "songs.h"
#include "sound.h"
#include "species.h"
diff --git a/src/scene/egg_hatch.c b/src/scene/egg_hatch.c
index 49cced46a..3675b42cf 100644
--- a/src/scene/egg_hatch.c
+++ b/src/scene/egg_hatch.c
@@ -11,7 +11,7 @@
#include "overworld.h"
#include "palette.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/scene/evolution_graphics.c b/src/scene/evolution_graphics.c
index 66b506fb5..dc0e219c5 100644
--- a/src/scene/evolution_graphics.c
+++ b/src/scene/evolution_graphics.c
@@ -2,7 +2,7 @@
#include "evolution_graphics.h"
#include "sprite.h"
#include "trig.h"
-#include "rng.h"
+#include "random.h"
#include "decompress.h"
#include "task.h"
#include "sound.h"
diff --git a/src/scene/hall_of_fame.c b/src/scene/hall_of_fame.c
index a1de26c32..63aaf79c9 100644
--- a/src/scene/hall_of_fame.c
+++ b/src/scene/hall_of_fame.c
@@ -15,7 +15,7 @@
#include "m4a.h"
#include "data2.h"
#include "decompress.h"
-#include "rng.h"
+#include "random.h"
#include "trig.h"
#include "ewram.h"
diff --git a/src/scene/intro.c b/src/scene/intro.c
index b52fbb3a9..c713071e7 100644
--- a/src/scene/intro.c
+++ b/src/scene/intro.c
@@ -11,7 +11,7 @@
#include "main.h"
#include "new_game.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "save.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/scene/intro_credits_graphics.c b/src/scene/intro_credits_graphics.c
index a150e8dc9..bb80ef3b6 100755
--- a/src/scene/intro_credits_graphics.c
+++ b/src/scene/intro_credits_graphics.c
@@ -11,7 +11,7 @@
#include "main.h"
#include "new_game.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "save.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/scene/new_game.c b/src/scene/new_game.c
index b15282960..ee042a0de 100644
--- a/src/scene/new_game.c
+++ b/src/scene/new_game.c
@@ -18,7 +18,7 @@
#include "pokedex.h"
#include "pokemon_size_record.h"
#include "pokemon_storage_system.h"
-#include "rng.h"
+#include "random.h"
#include "roamer.h"
#include "overworld.h"
#include "rtc.h"
diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c
index 1462a985d..9b6265308 100644
--- a/src/script_pokemon_util_80C4BF0.c
+++ b/src/script_pokemon_util_80C4BF0.c
@@ -17,7 +17,7 @@
#include "menu.h"
#include "pokedex.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "script_pokemon_80C4.h"
#include "species.h"
diff --git a/sym_common.txt b/sym_common.txt
index b1d99f58b..e271074d4 100644
--- a/sym_common.txt
+++ b/sym_common.txt
@@ -105,7 +105,7 @@ gUnknown_0300434C: @ 300434C
.space 0x4
.include "pokemon/pokemon_1.o"
- .include "engine/rng.o"
+ .include "engine/random.o"
.include "scene/egg_hatch.o"
.include "engine/load_save.o"
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 09351240f..b3bf568ac 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -350,7 +350,7 @@ gPartyMenuType: @ 202E8FA
@ field_weather
.align 2
-gUnknown_0202F7E8: @ 202F7E8
+gWeather: @ 202F7E8
.space 0x200
gUnknown_0202F9E8: @ 202F9E8
diff --git a/tools/preproc/preproc.cpp b/tools/preproc/preproc.cpp
index 8320a2d27..c9c6042df 100644
--- a/tools/preproc/preproc.cpp
+++ b/tools/preproc/preproc.cpp
@@ -89,8 +89,8 @@ void PreprocAsmFile(std::string filename)
if (globalLabel.length() != 0)
{
- std::printf("\t.global %s\n", globalLabel.c_str());
- std::printf("%s:\n", globalLabel.c_str());
+ const char *s = globalLabel.c_str();
+ std::printf("%s: ; .global %s\n", s, s);
}
else
{