summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_weather.s1188
-rw-r--r--src/field_weather.c357
2 files changed, 352 insertions, 1193 deletions
diff --git a/asm/field_weather.s b/asm/field_weather.s
index f01767efc..4b28daca1 100644
--- a/asm/field_weather.s
+++ b/asm/field_weather.s
@@ -5,1194 +5,6 @@
.text
- thumb_func_start sub_807EAC0
-sub_807EAC0: @ 807EAC0
- push {r4,lr}
- ldr r0, _0807EAD8 @ =gUnknown_08396FC4
- ldr r2, [r0]
- ldr r0, _0807EADC @ =0x000006ce
- adds r3, r2, r0
- ldrh r1, [r3]
- cmp r1, 0
- beq _0807EAE0
- cmp r1, 0x1
- beq _0807EAF2
- movs r0, 0
- b _0807EB1E
- .align 2, 0
-_0807EAD8: .4byte gUnknown_08396FC4
-_0807EADC: .4byte 0x000006ce
-_0807EAE0:
- ldr r4, _0807EB10 @ =0x000006e5
- adds r0, r2, r4
- strb r1, [r0]
- subs r4, 0x5
- adds r0, r2, r4
- strh r1, [r0]
- ldrh r0, [r3]
- adds r0, 0x1
- strh r0, [r3]
-_0807EAF2:
- bl snowflakes_progress
- lsls r0, 24
- cmp r0, 0
- bne _0807EB1C
- ldr r0, _0807EB14 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r0, _0807EB18 @ =0x000006ce
- adds r1, r0
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- movs r0, 0
- b _0807EB1E
- .align 2, 0
-_0807EB10: .4byte 0x000006e5
-_0807EB14: .4byte gUnknown_08396FC4
-_0807EB18: .4byte 0x000006ce
-_0807EB1C:
- movs r0, 0x1
-_0807EB1E:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_807EAC0
-
- thumb_func_start snowflakes_progress
-snowflakes_progress: @ 807EB24
- push {r4,lr}
- ldr r0, _0807EB40 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r0, _0807EB44 @ =0x000006e4
- adds r3, r1, r0
- ldr r4, _0807EB48 @ =0x000006e5
- adds r2, r1, r4
- ldrb r0, [r3]
- ldrb r4, [r2]
- cmp r0, r4
- bne _0807EB4C
- movs r0, 0
- b _0807EB8E
- .align 2, 0
-_0807EB40: .4byte gUnknown_08396FC4
-_0807EB44: .4byte 0x000006e4
-_0807EB48: .4byte 0x000006e5
-_0807EB4C:
- movs r0, 0xDC
- lsls r0, 3
- adds r1, r0
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x24
- bls _0807EB76
- movs r0, 0
- strh r0, [r1]
- ldrb r0, [r3]
- ldrb r2, [r2]
- cmp r0, r2
- bcs _0807EB72
- bl snowflake_add
- b _0807EB76
-_0807EB72:
- bl snowflake_remove
-_0807EB76:
- ldr r0, _0807EB94 @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r2, _0807EB98 @ =0x000006e4
- adds r1, r0, r2
- ldr r4, _0807EB9C @ =0x000006e5
- adds r0, r4
- ldrb r1, [r1]
- ldrb r0, [r0]
- eors r1, r0
- negs r0, r1
- orrs r0, r1
- lsrs r0, 31
-_0807EB8E:
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_0807EB94: .4byte gUnknown_08396FC4
-_0807EB98: .4byte 0x000006e4
-_0807EB9C: .4byte 0x000006e5
- thumb_func_end snowflakes_progress
-
- thumb_func_start snowflake_add
-snowflake_add: @ 807EBA0
- push {r4-r6,lr}
- ldr r0, _0807EBF4 @ =gSpriteTemplate_839AB04
- movs r1, 0
- movs r2, 0
- movs r3, 0x4E
- bl CreateSpriteAtEnd
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x40
- beq _0807EC04
- ldr r0, _0807EBF8 @ =gSprites
- lsls r4, r1, 4
- adds r4, r1
- lsls r4, 2
- adds r4, r0
- ldr r0, _0807EBFC @ =gUnknown_08396FC4
- ldr r5, [r0]
- ldr r0, _0807EC00 @ =0x000006e4
- adds r6, r5, r0
- ldrb r0, [r6]
- strh r0, [r4, 0x36]
- adds r0, r4, 0
- bl sub_807EC40
- adds r2, r4, 0
- adds r2, 0x3E
- ldrb r0, [r2]
- movs r1, 0x2
- orrs r0, r1
- strb r0, [r2]
- ldrb r0, [r6]
- adds r1, r0, 0x1
- strb r1, [r6]
- lsls r0, 24
- lsrs r0, 22
- adds r5, 0x60
- adds r5, r0
- str r4, [r5]
- movs r0, 0x1
- b _0807EC06
- .align 2, 0
-_0807EBF4: .4byte gSpriteTemplate_839AB04
-_0807EBF8: .4byte gSprites
-_0807EBFC: .4byte gUnknown_08396FC4
-_0807EC00: .4byte 0x000006e4
-_0807EC04:
- movs r0, 0
-_0807EC06:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end snowflake_add
-
- thumb_func_start snowflake_remove
-snowflake_remove: @ 807EC0C
- push {lr}
- ldr r0, _0807EC20 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r0, _0807EC24 @ =0x000006e4
- adds r2, r1, r0
- ldrb r0, [r2]
- cmp r0, 0
- bne _0807EC28
- movs r0, 0
- b _0807EC3C
- .align 2, 0
-_0807EC20: .4byte gUnknown_08396FC4
-_0807EC24: .4byte 0x000006e4
-_0807EC28:
- subs r0, 0x1
- strb r0, [r2]
- lsls r0, 24
- lsrs r0, 22
- adds r1, 0x60
- adds r1, r0
- ldr r0, [r1]
- bl DestroySprite
- movs r0, 0x1
-_0807EC3C:
- pop {r1}
- bx r1
- thumb_func_end snowflake_remove
-
- thumb_func_start sub_807EC40
-sub_807EC40: @ 807EC40
- push {r4-r7,lr}
- adds r5, r0, 0
- bl Random
- movs r1, 0x36
- ldrsh r2, [r5, r1]
- lsls r1, r2, 2
- adds r1, r2
- movs r2, 0x7
- ands r1, r2
- lsls r4, r1, 4
- subs r4, r1
- lsls r4, 1
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x1E
- bl __umodsi3
- adds r4, r0
- lsls r4, 16
- lsrs r4, 16
- ldr r1, _0807ECE4 @ =gSpriteCoordOffsetY
- adds r0, r5, 0
- adds r0, 0x29
- ldrb r0, [r0]
- lsls r0, 24
- asrs r0, 24
- ldrh r1, [r1]
- adds r0, r1
- movs r2, 0x3
- negs r2, r2
- adds r1, r2, 0
- subs r1, r0
- movs r7, 0
- strh r1, [r5, 0x22]
- ldr r1, _0807ECE8 @ =gSpriteCoordOffsetX
- adds r0, r5, 0
- adds r0, 0x28
- ldrb r0, [r0]
- lsls r0, 24
- asrs r0, 24
- ldrh r1, [r1]
- adds r0, r1
- subs r4, r0
- strh r4, [r5, 0x20]
- movs r1, 0x22
- ldrsh r0, [r5, r1]
- lsls r0, 7
- strh r0, [r5, 0x2E]
- strh r7, [r5, 0x24]
- bl Random
- lsls r0, 16
- lsrs r0, 16
- adds r6, r0, 0
- movs r4, 0x3
- ands r4, r6
- lsls r0, r4, 2
- adds r0, r4
- adds r0, 0x40
- strh r0, [r5, 0x30]
- strh r0, [r5, 0x3C]
- movs r1, 0x1
- bics r1, r6
- adds r0, r5, 0
- bl StartSpriteAnim
- strh r7, [r5, 0x34]
- movs r0, 0x1
- cmp r4, 0
- bne _0807ECD0
- movs r0, 0x2
-_0807ECD0:
- strh r0, [r5, 0x32]
- movs r0, 0x1F
- ands r0, r6
- adds r0, 0xD2
- strh r0, [r5, 0x3A]
- strh r7, [r5, 0x38]
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0807ECE4: .4byte gSpriteCoordOffsetY
-_0807ECE8: .4byte gSpriteCoordOffsetX
- thumb_func_end sub_807EC40
-
- thumb_func_start sub_807ECEC
-sub_807ECEC: @ 807ECEC
- push {r4,lr}
- adds r3, r0, 0
- ldr r0, _0807ED38 @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r1, _0807ED3C @ =0x000006e2
- adds r4, r0, r1
- ldrh r0, [r4]
- cmp r0, 0x12
- bls _0807ED32
- adds r2, r3, 0
- adds r2, 0x3E
- ldrb r1, [r2]
- movs r0, 0x5
- negs r0, r0
- ands r0, r1
- strb r0, [r2]
- ldr r0, _0807ED40 @ =sub_807ED48
- str r0, [r3, 0x1C]
- ldr r1, _0807ED44 @ =gSpriteCoordOffsetY
- adds r0, r3, 0
- adds r0, 0x29
- ldrb r0, [r0]
- lsls r0, 24
- asrs r0, 24
- ldrh r1, [r1]
- adds r0, r1
- movs r1, 0xFA
- subs r1, r0
- movs r2, 0
- strh r1, [r3, 0x22]
- movs r1, 0x22
- ldrsh r0, [r3, r1]
- lsls r0, 7
- strh r0, [r3, 0x2E]
- strh r2, [r4]
-_0807ED32:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807ED38: .4byte gUnknown_08396FC4
-_0807ED3C: .4byte 0x000006e2
-_0807ED40: .4byte sub_807ED48
-_0807ED44: .4byte gSpriteCoordOffsetY
- thumb_func_end sub_807ECEC
-
- thumb_func_start sub_807ED48
-sub_807ED48: @ 807ED48
- push {r4,r5,lr}
- adds r4, r0, 0
- ldrh r0, [r4, 0x30]
- ldrh r1, [r4, 0x2E]
- adds r0, r1
- strh r0, [r4, 0x2E]
- lsls r0, 16
- asrs r0, 23
- strh r0, [r4, 0x22]
- ldrh r0, [r4, 0x32]
- ldrh r2, [r4, 0x34]
- adds r0, r2
- movs r1, 0xFF
- ands r0, r1
- strh r0, [r4, 0x34]
- ldr r1, _0807EDC0 @ =gSineTable
- movs r3, 0x34
- ldrsh r0, [r4, r3]
- lsls r0, 1
- adds r0, r1
- movs r1, 0
- ldrsh r0, [r0, r1]
- cmp r0, 0
- bge _0807ED7A
- adds r0, 0x3F
-_0807ED7A:
- asrs r0, 6
- strh r0, [r4, 0x24]
- adds r0, r4, 0
- adds r0, 0x28
- movs r5, 0
- ldrsb r5, [r0, r5]
- ldrh r0, [r4, 0x20]
- adds r0, r5
- ldr r1, _0807EDC4 @ =gSpriteCoordOffsetX
- ldrh r1, [r1]
- adds r3, r1, r0
- ldr r2, _0807EDC8 @ =0x000001ff
- adds r0, r2, 0
- ands r3, r0
- adds r2, r3, 0
- movs r0, 0x80
- lsls r0, 1
- ands r0, r2
- cmp r0, 0
- beq _0807EDAC
- ldr r3, _0807EDCC @ =0xffffff00
- adds r0, r3, 0
- orrs r2, r0
- lsls r0, r2, 16
- lsrs r3, r0, 16
-_0807EDAC:
- lsls r0, r3, 16
- asrs r0, 16
- movs r2, 0x3
- negs r2, r2
- cmp r0, r2
- bge _0807EDD0
- adds r1, r5
- movs r0, 0xF2
- subs r0, r1
- b _0807EDD8
- .align 2, 0
-_0807EDC0: .4byte gSineTable
-_0807EDC4: .4byte gSpriteCoordOffsetX
-_0807EDC8: .4byte 0x000001ff
-_0807EDCC: .4byte 0xffffff00
-_0807EDD0:
- cmp r0, 0xF2
- ble _0807EDDA
- adds r0, r1, r5
- subs r0, r2, r0
-_0807EDD8:
- strh r0, [r4, 0x20]
-_0807EDDA:
- adds r0, r4, 0
- adds r0, 0x29
- movs r3, 0
- ldrsb r3, [r0, r3]
- ldrh r0, [r4, 0x22]
- adds r0, r3
- ldr r1, _0807EE18 @ =gSpriteCoordOffsetY
- ldrh r1, [r1]
- adds r2, r1, r0
- movs r0, 0xFF
- ands r2, r0
- adds r0, r2, 0
- subs r0, 0xA4
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x6
- bhi _0807EE1C
- adds r1, r3
- movs r0, 0xFA
- subs r0, r1
- movs r1, 0
- strh r0, [r4, 0x22]
- movs r2, 0x22
- ldrsh r0, [r4, r2]
- lsls r0, 7
- strh r0, [r4, 0x2E]
- strh r1, [r4, 0x38]
- movs r0, 0xDC
- strh r0, [r4, 0x3A]
- b _0807EE48
- .align 2, 0
-_0807EE18: .4byte gSpriteCoordOffsetY
-_0807EE1C:
- adds r0, r2, 0
- subs r0, 0xF3
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x6
- bhi _0807EE48
- movs r1, 0
- movs r0, 0xA3
- strh r0, [r4, 0x22]
- lsls r0, 7
- strh r0, [r4, 0x2E]
- strh r1, [r4, 0x38]
- movs r0, 0xDC
- strh r0, [r4, 0x3A]
- adds r2, r4, 0
- adds r2, 0x3E
- ldrb r0, [r2]
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r2]
- ldr r0, _0807EE7C @ =sub_807ECEC
- str r0, [r4, 0x1C]
-_0807EE48:
- ldrh r0, [r4, 0x38]
- adds r0, 0x1
- strh r0, [r4, 0x38]
- lsls r0, 16
- asrs r0, 16
- movs r3, 0x3A
- ldrsh r1, [r4, r3]
- cmp r0, r1
- bne _0807EE74
- adds r0, r4, 0
- bl sub_807EC40
- movs r0, 0xFA
- strh r0, [r4, 0x22]
- adds r2, r4, 0
- adds r2, 0x3E
- ldrb r0, [r2]
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r2]
- ldr r0, _0807EE7C @ =sub_807ECEC
- str r0, [r4, 0x1C]
-_0807EE74:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807EE7C: .4byte sub_807ECEC
- thumb_func_end sub_807ED48
-
- thumb_func_start sub_807EE80
-sub_807EE80: @ 807EE80
- push {r4,r5,lr}
- ldr r0, _0807EED8 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _0807EEDC @ =0x000006cc
- adds r0, r1, r2
- movs r3, 0
- movs r2, 0
- strh r2, [r0]
- ldr r5, _0807EEE0 @ =0x000006d2
- adds r4, r1, r5
- strb r3, [r4]
- adds r5, 0x4
- adds r0, r1, r5
- strh r2, [r0]
- ldr r0, _0807EEE4 @ =0x000006db
- adds r2, r1, r0
- movs r0, 0x4
- strb r0, [r2]
- ldr r2, _0807EEE8 @ =0x000006dc
- adds r0, r1, r2
- strb r3, [r0]
- adds r5, 0x3
- adds r2, r1, r5
- movs r0, 0x10
- strb r0, [r2]
- ldr r0, _0807EEEC @ =0x000006c1
- adds r2, r1, r0
- movs r0, 0x3
- strb r0, [r2]
- subs r5, 0x17
- adds r2, r1, r5
- movs r0, 0x14
- strb r0, [r2]
- strb r3, [r4]
- ldr r0, _0807EEF0 @ =0x000006ed
- adds r1, r0
- strb r3, [r1]
- movs r0, 0x51
- bl sub_807DD5C
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807EED8: .4byte gUnknown_08396FC4
-_0807EEDC: .4byte 0x000006cc
-_0807EEE0: .4byte 0x000006d2
-_0807EEE4: .4byte 0x000006db
-_0807EEE8: .4byte 0x000006dc
-_0807EEEC: .4byte 0x000006c1
-_0807EEF0: .4byte 0x000006ed
- thumb_func_end sub_807EE80
-
- thumb_func_start sub_807EEF4
-sub_807EEF4: @ 807EEF4
- push {r4,lr}
- bl sub_807EE80
- ldr r0, _0807EF1C @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _0807EF20 @ =0x000006d2
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807EF14
- adds r4, r1, r2
-_0807EF0A:
- bl sub_807EFC0
- ldrb r0, [r4]
- cmp r0, 0
- beq _0807EF0A
-_0807EF14:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807EF1C: .4byte gUnknown_08396FC4
-_0807EF20: .4byte 0x000006d2
- thumb_func_end sub_807EEF4
-
- thumb_func_start sub_807EF24
-sub_807EF24: @ 807EF24
- push {r4,r5,lr}
- ldr r0, _0807EF78 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _0807EF7C @ =0x000006cc
- adds r0, r1, r2
- movs r4, 0
- movs r2, 0
- strh r2, [r0]
- ldr r5, _0807EF80 @ =0x000006d2
- adds r3, r1, r5
- strb r4, [r3]
- adds r5, 0x4
- adds r0, r1, r5
- strh r2, [r0]
- ldr r0, _0807EF84 @ =0x000006db
- adds r2, r1, r0
- movs r0, 0x4
- strb r0, [r2]
- adds r5, 0x6
- adds r2, r1, r5
- movs r0, 0x1
- strb r0, [r2]
- ldr r0, _0807EF88 @ =0x000006d9
- adds r2, r1, r0
- movs r0, 0x18
- strb r0, [r2]
- subs r5, 0x1B
- adds r2, r1, r5
- movs r0, 0x3
- strb r0, [r2]
- ldr r0, _0807EF8C @ =0x000006c2
- adds r1, r0
- movs r0, 0x14
- strb r0, [r1]
- strb r4, [r3]
- movs r0, 0x53
- bl sub_807DD5C
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807EF78: .4byte gUnknown_08396FC4
-_0807EF7C: .4byte 0x000006cc
-_0807EF80: .4byte 0x000006d2
-_0807EF84: .4byte 0x000006db
-_0807EF88: .4byte 0x000006d9
-_0807EF8C: .4byte 0x000006c2
- thumb_func_end sub_807EF24
-
- thumb_func_start sub_807EF90
-sub_807EF90: @ 807EF90
- push {r4,lr}
- bl sub_807EF24
- ldr r0, _0807EFB8 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _0807EFBC @ =0x000006d2
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807EFB0
- adds r4, r1, r2
-_0807EFA6:
- bl sub_807EFC0
- ldrb r0, [r4]
- cmp r0, 0
- beq _0807EFA6
-_0807EFB0:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807EFB8: .4byte gUnknown_08396FC4
-_0807EFBC: .4byte 0x000006d2
- thumb_func_end sub_807EF90
-
- thumb_func_start sub_807EFC0
-sub_807EFC0: @ 807EFC0
- push {r4,r5,lr}
- bl sub_807F434
- ldr r0, _0807EFE0 @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r1, _0807EFE4 @ =0x000006cc
- adds r0, r1
- ldrh r0, [r0]
- cmp r0, 0xE
- bls _0807EFD6
- b _0807F336
-_0807EFD6:
- lsls r0, 2
- ldr r1, _0807EFE8 @ =_0807EFEC
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0807EFE0: .4byte gUnknown_08396FC4
-_0807EFE4: .4byte 0x000006cc
-_0807EFE8: .4byte _0807EFEC
- .align 2, 0
-_0807EFEC:
- .4byte _0807F028
- .4byte _0807F044
- .4byte _0807F068
- .4byte _0807F098
- .4byte _0807F0BC
- .4byte _0807F0EC
- .4byte _0807F11C
- .4byte _0807F148
- .4byte _0807F166
- .4byte _0807F1C4
- .4byte _0807F248
- .4byte _0807F270
- .4byte _0807F2A0
- .4byte _0807F2E4
- .4byte _0807F318
-_0807F028:
- bl sub_807E7A4
- ldr r0, _0807F03C @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _0807F040 @ =0x000006cc
- adds r1, r2
- ldrh r0, [r1]
- adds r0, 0x1
- b _0807F334
- .align 2, 0
-_0807F03C: .4byte gUnknown_08396FC4
-_0807F040: .4byte 0x000006cc
-_0807F044:
- bl sub_807E7B4
- lsls r0, 24
- cmp r0, 0
- beq _0807F050
- b _0807F336
-_0807F050:
- ldr r0, _0807F060 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r3, _0807F064 @ =0x000006cc
- adds r1, r3
- ldrh r0, [r1]
- adds r0, 0x1
- b _0807F334
- .align 2, 0
-_0807F060: .4byte gUnknown_08396FC4
-_0807F064: .4byte 0x000006cc
-_0807F068:
- bl sub_807E8E8
- lsls r0, 24
- cmp r0, 0
- beq _0807F074
- b _0807F336
-_0807F074:
- ldr r0, _0807F08C @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r0, _0807F090 @ =0x000006d2
- adds r2, r1, r0
- movs r0, 0x1
- strb r0, [r2]
- ldr r2, _0807F094 @ =0x000006cc
- adds r1, r2
- ldrh r0, [r1]
- adds r0, 0x1
- b _0807F334
- .align 2, 0
-_0807F08C: .4byte gUnknown_08396FC4
-_0807F090: .4byte 0x000006d2
-_0807F094: .4byte 0x000006cc
-_0807F098:
- ldr r0, _0807F0B0 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r3, _0807F0B4 @ =0x000006c6
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807F0A8
- b _0807F336
-_0807F0A8:
- ldr r0, _0807F0B8 @ =0x000006cc
- adds r1, r0
- movs r0, 0x6
- b _0807F334
- .align 2, 0
-_0807F0B0: .4byte gUnknown_08396FC4
-_0807F0B4: .4byte 0x000006c6
-_0807F0B8: .4byte 0x000006cc
-_0807F0BC:
- ldr r0, _0807F10C @ =gUnknown_08396FC4
- ldr r4, [r0]
- ldr r2, _0807F110 @ =0x000006ea
- adds r1, r4, r2
- movs r0, 0x1
- strb r0, [r1]
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r5, 0xB4
- lsls r5, 1
- adds r1, r5, 0
- bl __umodsi3
- adds r0, r5
- ldr r3, _0807F114 @ =0x000006e6
- adds r1, r4, r3
- strh r0, [r1]
- ldr r0, _0807F118 @ =0x000006cc
- adds r4, r0
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
-_0807F0EC:
- ldr r0, _0807F10C @ =gUnknown_08396FC4
- ldr r2, [r0]
- ldr r3, _0807F114 @ =0x000006e6
- adds r1, r2, r3
- ldrh r0, [r1]
- subs r0, 0x1
- strh r0, [r1]
- lsls r0, 16
- cmp r0, 0
- beq _0807F102
- b _0807F336
-_0807F102:
- ldr r0, _0807F118 @ =0x000006cc
- adds r1, r2, r0
- ldrh r0, [r1]
- adds r0, 0x1
- b _0807F334
- .align 2, 0
-_0807F10C: .4byte gUnknown_08396FC4
-_0807F110: .4byte 0x000006ea
-_0807F114: .4byte 0x000006e6
-_0807F118: .4byte 0x000006cc
-_0807F11C:
- ldr r0, _0807F13C @ =gUnknown_08396FC4
- ldr r4, [r0]
- ldr r1, _0807F140 @ =0x000006ea
- adds r0, r4, r1
- movs r5, 0x1
- strb r5, [r0]
- bl Random
- lsls r0, 16
- lsrs r0, 16
- ands r0, r5
- ldr r2, _0807F144 @ =0x000006eb
- adds r1, r4, r2
- strb r0, [r1]
- b _0807F1A4
- .align 2, 0
-_0807F13C: .4byte gUnknown_08396FC4
-_0807F140: .4byte 0x000006ea
-_0807F144: .4byte 0x000006eb
-_0807F148:
- bl Random
- ldr r1, _0807F1B0 @ =gUnknown_08396FC4
- ldr r2, [r1]
- movs r1, 0x1
- ands r1, r0
- adds r1, 0x1
- ldr r3, _0807F1B4 @ =0x000006ec
- adds r0, r2, r3
- strb r1, [r0]
- ldr r0, _0807F1B8 @ =0x000006cc
- adds r2, r0
- ldrh r0, [r2]
- adds r0, 0x1
- strh r0, [r2]
-_0807F166:
- movs r0, 0x13
- bl sub_807D5BC
- ldr r0, _0807F1B0 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _0807F1BC @ =0x000006eb
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807F18A
- ldr r3, _0807F1B4 @ =0x000006ec
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _0807F18A
- movs r0, 0x14
- bl sub_807F3F8
-_0807F18A:
- bl Random
- ldr r1, _0807F1B0 @ =gUnknown_08396FC4
- ldr r4, [r1]
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x3
- bl __umodsi3
- adds r0, 0x6
- ldr r2, _0807F1C0 @ =0x000006e6
- adds r1, r4, r2
- strh r0, [r1]
-_0807F1A4:
- ldr r3, _0807F1B8 @ =0x000006cc
- adds r4, r3
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- b _0807F336
- .align 2, 0
-_0807F1B0: .4byte gUnknown_08396FC4
-_0807F1B4: .4byte 0x000006ec
-_0807F1B8: .4byte 0x000006cc
-_0807F1BC: .4byte 0x000006eb
-_0807F1C0: .4byte 0x000006e6
-_0807F1C4:
- ldr r0, _0807F210 @ =gUnknown_08396FC4
- ldr r4, [r0]
- ldr r0, _0807F214 @ =0x000006e6
- adds r5, r4, r0
- ldrh r0, [r5]
- subs r0, 0x1
- strh r0, [r5]
- lsls r0, 16
- cmp r0, 0
- beq _0807F1DA
- b _0807F336
-_0807F1DA:
- movs r0, 0x3
- bl sub_807D5BC
- ldr r2, _0807F218 @ =0x000006ea
- adds r1, r4, r2
- movs r0, 0x1
- strb r0, [r1]
- ldr r3, _0807F21C @ =0x000006ec
- adds r1, r4, r3
- ldrb r0, [r1]
- subs r0, 0x1
- strb r0, [r1]
- lsls r0, 24
- cmp r0, 0
- beq _0807F224
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0xF
- ands r0, r1
- adds r0, 0x3C
- strh r0, [r5]
- ldr r0, _0807F220 @ =0x000006cc
- adds r1, r4, r0
- movs r0, 0xA
- b _0807F334
- .align 2, 0
-_0807F210: .4byte gUnknown_08396FC4
-_0807F214: .4byte 0x000006e6
-_0807F218: .4byte 0x000006ea
-_0807F21C: .4byte 0x000006ec
-_0807F220: .4byte 0x000006cc
-_0807F224:
- ldr r1, _0807F234 @ =0x000006eb
- adds r0, r4, r1
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807F23C
- ldr r2, _0807F238 @ =0x000006cc
- adds r1, r4, r2
- b _0807F332
- .align 2, 0
-_0807F234: .4byte 0x000006eb
-_0807F238: .4byte 0x000006cc
-_0807F23C:
- ldr r3, _0807F244 @ =0x000006cc
- adds r1, r4, r3
- movs r0, 0xB
- b _0807F334
- .align 2, 0
-_0807F244: .4byte 0x000006cc
-_0807F248:
- ldr r0, _0807F264 @ =gUnknown_08396FC4
- ldr r2, [r0]
- ldr r0, _0807F268 @ =0x000006e6
- adds r1, r2, r0
- ldrh r0, [r1]
- subs r0, 0x1
- strh r0, [r1]
- lsls r0, 16
- cmp r0, 0
- bne _0807F336
- ldr r3, _0807F26C @ =0x000006cc
- adds r1, r2, r3
- movs r0, 0x8
- b _0807F334
- .align 2, 0
-_0807F264: .4byte gUnknown_08396FC4
-_0807F268: .4byte 0x000006e6
-_0807F26C: .4byte 0x000006cc
-_0807F270:
- bl Random
- ldr r1, _0807F294 @ =gUnknown_08396FC4
- ldr r2, [r1]
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0xF
- ands r0, r1
- adds r0, 0x3C
- ldr r3, _0807F298 @ =0x000006e6
- adds r1, r2, r3
- strh r0, [r1]
- ldr r0, _0807F29C @ =0x000006cc
- adds r2, r0
- ldrh r0, [r2]
- adds r0, 0x1
- strh r0, [r2]
- b _0807F336
- .align 2, 0
-_0807F294: .4byte gUnknown_08396FC4
-_0807F298: .4byte 0x000006e6
-_0807F29C: .4byte 0x000006cc
-_0807F2A0:
- ldr r0, _0807F2D8 @ =gUnknown_08396FC4
- ldr r5, [r0]
- ldr r1, _0807F2DC @ =0x000006e6
- adds r4, r5, r1
- ldrh r0, [r4]
- subs r0, 0x1
- strh r0, [r4]
- lsls r0, 16
- cmp r0, 0
- bne _0807F336
- movs r0, 0x64
- bl sub_807F3F8
- movs r0, 0x13
- bl sub_807D5BC
- bl Random
- movs r1, 0xF
- ands r1, r0
- adds r1, 0x1E
- strh r1, [r4]
- ldr r2, _0807F2E0 @ =0x000006cc
- adds r1, r5, r2
- ldrh r0, [r1]
- adds r0, 0x1
- b _0807F334
- .align 2, 0
-_0807F2D8: .4byte gUnknown_08396FC4
-_0807F2DC: .4byte 0x000006e6
-_0807F2E0: .4byte 0x000006cc
-_0807F2E4:
- ldr r0, _0807F30C @ =gUnknown_08396FC4
- ldr r4, [r0]
- ldr r3, _0807F310 @ =0x000006e6
- adds r1, r4, r3
- ldrh r0, [r1]
- subs r0, 0x1
- strh r0, [r1]
- lsls r0, 16
- cmp r0, 0
- bne _0807F336
- movs r0, 0x13
- movs r1, 0x3
- movs r2, 0x5
- bl sub_807D5F0
- ldr r0, _0807F314 @ =0x000006cc
- adds r1, r4, r0
- ldrh r0, [r1]
- adds r0, 0x1
- b _0807F334
- .align 2, 0
-_0807F30C: .4byte gUnknown_08396FC4
-_0807F310: .4byte 0x000006e6
-_0807F314: .4byte 0x000006cc
-_0807F318:
- ldr r0, _0807F33C @ =gUnknown_08396FC4
- ldr r2, [r0]
- ldr r1, _0807F340 @ =0x000006c6
- adds r0, r2, r1
- ldrb r0, [r0]
- cmp r0, 0x3
- bne _0807F336
- ldr r3, _0807F344 @ =0x000006ea
- adds r1, r2, r3
- movs r0, 0x1
- strb r0, [r1]
- ldr r0, _0807F348 @ =0x000006cc
- adds r1, r2, r0
-_0807F332:
- movs r0, 0x4
-_0807F334:
- strh r0, [r1]
-_0807F336:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807F33C: .4byte gUnknown_08396FC4
-_0807F340: .4byte 0x000006c6
-_0807F344: .4byte 0x000006ea
-_0807F348: .4byte 0x000006cc
- thumb_func_end sub_807EFC0
-
- thumb_func_start sub_807F34C
-sub_807F34C: @ 807F34C
- push {r4-r6,lr}
- ldr r0, _0807F368 @ =gUnknown_08396FC4
- ldr r6, [r0]
- ldr r0, _0807F36C @ =0x000006ce
- adds r5, r6, r0
- ldrh r1, [r5]
- cmp r1, 0x1
- beq _0807F382
- cmp r1, 0x1
- bgt _0807F370
- cmp r1, 0
- beq _0807F376
- b _0807F3E8
- .align 2, 0
-_0807F368: .4byte gUnknown_08396FC4
-_0807F36C: .4byte 0x000006ce
-_0807F370:
- cmp r1, 0x2
- beq _0807F3CC
- b _0807F3E8
-_0807F376:
- ldr r2, _0807F3BC @ =0x000006ea
- adds r0, r6, r2
- strb r1, [r0]
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
-_0807F382:
- bl sub_807EFC0
- ldr r0, _0807F3C0 @ =gUnknown_08396FC4
- ldr r2, [r0]
- ldr r1, _0807F3BC @ =0x000006ea
- adds r0, r2, r1
- ldrb r0, [r0]
- cmp r0, 0
- beq _0807F3F0
- subs r1, 0x19
- adds r0, r2, r1
- ldrb r0, [r0]
- cmp r0, 0x3
- beq _0807F3E8
- cmp r0, 0x5
- beq _0807F3E8
- cmp r0, 0xD
- beq _0807F3E8
- ldr r0, _0807F3C4 @ =0x000006d9
- adds r1, r2, r0
- movs r0, 0
- strb r0, [r1]
- ldr r0, _0807F3C8 @ =0x000006ce
- adds r1, r2, r0
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- b _0807F3F0
- .align 2, 0
-_0807F3BC: .4byte 0x000006ea
-_0807F3C0: .4byte gUnknown_08396FC4
-_0807F3C4: .4byte 0x000006d9
-_0807F3C8: .4byte 0x000006ce
-_0807F3CC:
- bl sub_807E8E8
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0
- bne _0807F3F0
- bl sub_807E974
- ldr r1, _0807F3EC @ =0x000006ed
- adds r0, r6, r1
- strb r4, [r0]
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
-_0807F3E8:
- movs r0, 0
- b _0807F3F2
- .align 2, 0
-_0807F3EC: .4byte 0x000006ed
-_0807F3F0:
- movs r0, 0x1
-_0807F3F2:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_807F34C
-
- thumb_func_start sub_807F3F8
-sub_807F3F8: @ 807F3F8
- push {r4-r6,lr}
- lsls r0, 16
- lsrs r6, r0, 16
- ldr r0, _0807F42C @ =gUnknown_08396FC4
- ldr r4, [r0]
- ldr r0, _0807F430 @ =0x000006ed
- adds r5, r4, r0
- ldrb r0, [r5]
- cmp r0, 0
- bne _0807F426
- bl Random
- lsls r0, 16
- lsrs r0, 16
- adds r1, r6, 0
- bl __umodsi3
- movs r2, 0xDD
- lsls r2, 3
- adds r1, r4, r2
- strh r0, [r1]
- movs r0, 0x1
- strb r0, [r5]
-_0807F426:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0807F42C: .4byte gUnknown_08396FC4
-_0807F430: .4byte 0x000006ed
- thumb_func_end sub_807F3F8
-
thumb_func_start sub_807F434
sub_807F434: @ 807F434
push {r4,lr}
diff --git a/src/field_weather.c b/src/field_weather.c
index 0027f2bc1..08eee454c 100644
--- a/src/field_weather.c
+++ b/src/field_weather.c
@@ -3,6 +3,7 @@
#include "field_map_obj.h"
#include "field_weather.h"
#include "palette.h"
+#include "rng.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
@@ -64,10 +65,16 @@ struct Weather
u8 unknown_6DE;
u8 filler_6DF[1];
u16 unknown_6E0;
- u8 filler_6E2[2];
+ u16 unknown_6E2;
u8 unknown_6E4;
u8 unknown_6E5;
- u8 filler_6E6[0xE];
+ u16 unknown_6E6;
+ u16 unknown_6E8;
+ u8 unknown_6EA;
+ u8 unknown_6EB;
+ u8 unknown_6EC;
+ u8 unknown_6ED;
+ u8 filler_6EE[0xF4-0xEE];
u8 unknown_6F4[6];
u8 unknown_6FA;
u8 unknown_6FB;
@@ -111,7 +118,11 @@ extern u8 (*gUnknown_08396FC8[][4])(void);
extern u8 (*gUnknown_083970B8[])(void);
extern 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[];
@@ -119,6 +130,7 @@ extern const u16 gUnknown_08397108[];
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");
@@ -1402,7 +1414,7 @@ void sub_807E400(void)
gUnknown_08396FC4->unknown_6CC++;
break;
case 2:
- if (sub_807E8E8() == 0)
+ if (sub_807E8E8() == FALSE)
{
gUnknown_08396FC4->unknown_6D2 = 1;
gUnknown_08396FC4->unknown_6CC++;
@@ -1432,7 +1444,7 @@ bool8 sub_807E460(void)
}
// fall through
case 1:
- if (sub_807E8E8() == 0)
+ if (sub_807E8E8() == FALSE)
{
sub_807E974();
gUnknown_08396FC4->unknown_6CE++;
@@ -1671,9 +1683,344 @@ u8 snowflakes_progress(void);
void snowflakes_progress2(void)
{
- if (gUnknown_08396FC4->unknown_6CC == 0 && snowflakes_progress() == 0)
+ 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].data4 = 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->data4 * 5) & 7) * 30 + (Random() % 30);
+ u16 r6;
+
+ sprite->pos1.y = -3 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->pos1.x = r4 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+ sprite->data0 = sprite->pos1.y * 128;
+ sprite->pos2.x = 0;
+ r6 = Random();
+ sprite->data1 = (r6 & 3) * 5 + 64;
+ sprite->data7 = (r6 & 3) * 5 + 64;
+ StartSpriteAnim(sprite, (r6 & 1) ? 0 : 1);
+ sprite->data3 = 0;
+ sprite->data2 = ((r6 & 3) == 0) ? 2 : 1;
+ sprite->data6 = (r6 & 0x1F) + 210;
+ sprite->data5 = 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->data0 = sprite->pos1.y * 128;
+ gUnknown_08396FC4->unknown_6E2 = 0;
+ }
+}
+
+void sub_807ED48(struct Sprite *sprite)
+{
+ s16 r3;
+ s16 r2;
+
+ sprite->data0 += sprite->data1;
+ sprite->pos1.y = sprite->data0 >> 7;
+ sprite->data3 = (sprite->data3 + sprite->data2) & 0xFF;
+ sprite->pos2.x = gSineTable[sprite->data3] / 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->data0 = sprite->pos1.y * 128;
+ sprite->data5 = 0;
+ sprite->data6 = 220;
+ }
+ else if (r2 > 242 && r2 < 250)
+ {
+ sprite->pos1.y = 163;
+ sprite->data0 = sprite->pos1.y * 128;
+ sprite->data5 = 0;
+ sprite->data6 = 220;
+ sprite->invisible = TRUE;
+ sprite->callback = sub_807ECEC;
+ }
+
+ sprite->data5++;
+ if (sprite->data5 == sprite->data6)
+ {
+ 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;
}
}