summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_weather.s664
-rw-r--r--src/field_weather.c214
2 files changed, 209 insertions, 669 deletions
diff --git a/asm/field_weather.s b/asm/field_weather.s
index 3a0a70325..f01767efc 100644
--- a/asm/field_weather.s
+++ b/asm/field_weather.s
@@ -5,670 +5,6 @@
.text
- thumb_func_start sub_807E5C0
-sub_807E5C0: @ 807E5C0
- push {r4,r5,lr}
- adds r5, r0, 0
- movs r1, 0x36
- ldrsh r0, [r5, r1]
- cmp r0, 0
- bne _0807E69C
- ldr r3, _0807E634 @ =gUnknown_0839AABC
- ldr r4, _0807E638 @ =gUnknown_08396FC4
- ldr r2, [r4]
- ldr r0, _0807E63C @ =0x000006dc
- adds r2, r0
- ldrb r0, [r2]
- lsls r0, 2
- adds r0, r3
- ldrh r1, [r0]
- ldrh r0, [r5, 0x32]
- adds r1, r0
- strh r1, [r5, 0x32]
- ldrb r0, [r2]
- lsls r0, 2
- adds r3, 0x2
- adds r0, r3
- ldrh r0, [r0]
- ldrh r2, [r5, 0x34]
- adds r0, r2
- strh r0, [r5, 0x34]
- lsls r1, 16
- asrs r1, 20
- strh r1, [r5, 0x20]
- lsls r0, 16
- asrs r2, r0, 20
- strh r2, [r5, 0x22]
- movs r3, 0x38
- ldrsh r0, [r5, r3]
- adds r3, r4, 0
- cmp r0, 0
- beq _0807E640
- adds r0, r1, 0
- adds r0, 0x8
- lsls r0, 16
- movs r1, 0x80
- lsls r1, 17
- cmp r0, r1
- bhi _0807E640
- adds r1, r2, 0
- movs r0, 0x10
- negs r0, r0
- cmp r1, r0
- blt _0807E640
- cmp r1, 0xB0
- bgt _0807E640
- adds r0, r5, 0
- adds r0, 0x3E
- ldrb r2, [r0]
- movs r1, 0x5
- negs r1, r1
- ands r1, r2
- b _0807E64A
- .align 2, 0
-_0807E634: .4byte gUnknown_0839AABC
-_0807E638: .4byte gUnknown_08396FC4
-_0807E63C: .4byte 0x000006dc
-_0807E640:
- adds r0, r5, 0
- adds r0, 0x3E
- ldrb r1, [r0]
- movs r2, 0x4
- orrs r1, r2
-_0807E64A:
- strb r1, [r0]
- adds r4, r0, 0
- ldrh r0, [r5, 0x2E]
- subs r0, 0x1
- strh r0, [r5, 0x2E]
- lsls r0, 16
- cmp r0, 0
- bne _0807E6BC
- ldr r0, [r3]
- ldr r1, _0807E690 @ =0x000006dc
- adds r0, r1
- ldrb r1, [r0]
- adds r1, 0x1
- lsls r1, 24
- lsrs r1, 24
- adds r0, r5, 0
- bl StartSpriteAnim
- movs r0, 0x1
- strh r0, [r5, 0x36]
- ldr r1, _0807E694 @ =gSpriteCoordOffsetX
- ldrh r0, [r5, 0x20]
- ldrh r1, [r1]
- subs r0, r1
- strh r0, [r5, 0x20]
- ldr r1, _0807E698 @ =gSpriteCoordOffsetY
- ldrh r0, [r5, 0x22]
- ldrh r1, [r1]
- subs r0, r1
- strh r0, [r5, 0x22]
- ldrb r0, [r4]
- movs r1, 0x2
- orrs r0, r1
- strb r0, [r4]
- b _0807E6BC
- .align 2, 0
-_0807E690: .4byte 0x000006dc
-_0807E694: .4byte gSpriteCoordOffsetX
-_0807E698: .4byte gSpriteCoordOffsetY
-_0807E69C:
- adds r0, r5, 0
- adds r0, 0x3F
- ldrb r1, [r0]
- movs r0, 0x10
- ands r0, r1
- cmp r0, 0
- beq _0807E6BC
- adds r2, r5, 0
- adds r2, 0x3E
- ldrb r0, [r2]
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r2]
- adds r0, r5, 0
- bl sub_807E4EC
-_0807E6BC:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_807E5C0
-
- thumb_func_start sub_807E6C4
-sub_807E6C4: @ 807E6C4
- push {r4,lr}
- adds r4, r0, 0
- ldrh r1, [r4, 0x2E]
- movs r2, 0x2E
- ldrsh r0, [r4, r2]
- cmp r0, 0
- bne _0807E6E4
- adds r0, r4, 0
- bl sub_807E4EC
- ldr r0, _0807E6E0 @ =sub_807E5C0
- str r0, [r4, 0x1C]
- b _0807E6E8
- .align 2, 0
-_0807E6E0: .4byte sub_807E5C0
-_0807E6E4:
- subs r0, r1, 0x1
- strh r0, [r4, 0x2E]
-_0807E6E8:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_807E6C4
-
- thumb_func_start sub_807E6F0
-sub_807E6F0: @ 807E6F0
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- adds r7, r0, 0
- lsls r5, r1, 16
- lsrs r5, 16
- ldr r2, _0807E774 @ =gUnknown_0839AAC4
- ldr r0, _0807E778 @ =gUnknown_08396FC4
- ldr r0, [r0]
- ldr r1, _0807E77C @ =0x000006dc
- adds r0, r1
- ldrb r0, [r0]
- lsls r0, 2
- adds r1, r0, r2
- ldrh r1, [r1]
- mov r8, r1
- adds r2, 0x2
- adds r0, r2
- ldrh r4, [r0]
- add r4, r8
- adds r0, r5, 0
- adds r1, r4, 0
- bl __divsi3
- lsls r0, 16
- lsrs r6, r0, 16
- adds r0, r5, 0
- adds r1, r4, 0
- bl __modsi3
- lsls r0, 16
- lsrs r4, r0, 16
- subs r0, r6, 0x1
- lsls r0, 16
- lsrs r6, r0, 16
- ldr r0, _0807E780 @ =0x0000ffff
- cmp r6, r0
- beq _0807E74E
- adds r5, r0, 0
-_0807E73E:
- adds r0, r7, 0
- bl sub_807E4EC
- subs r0, r6, 0x1
- lsls r0, 16
- lsrs r6, r0, 16
- cmp r6, r5
- bne _0807E73E
-_0807E74E:
- cmp r4, r8
- bcs _0807E784
- subs r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- ldr r0, _0807E780 @ =0x0000ffff
- cmp r4, r0
- beq _0807E770
- adds r5, r0, 0
-_0807E760:
- adds r0, r7, 0
- bl sub_807E5C0
- subs r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r4, r5
- bne _0807E760
-_0807E770:
- movs r0, 0
- b _0807E798
- .align 2, 0
-_0807E774: .4byte gUnknown_0839AAC4
-_0807E778: .4byte gUnknown_08396FC4
-_0807E77C: .4byte 0x000006dc
-_0807E780: .4byte 0x0000ffff
-_0807E784:
- mov r1, r8
- subs r0, r4, r1
- strh r0, [r7, 0x2E]
- adds r2, r7, 0
- adds r2, 0x3E
- ldrb r0, [r2]
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r2]
- movs r0, 0x1
-_0807E798:
- strh r0, [r7, 0x3A]
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_807E6F0
-
- thumb_func_start sub_807E7A4
-sub_807E7A4: @ 807E7A4
- push {lr}
- ldr r0, _0807E7B0 @ =gUnknown_0839AACC
- bl LoadSpriteSheet
- pop {r0}
- bx r0
- .align 2, 0
-_0807E7B0: .4byte gUnknown_0839AACC
- thumb_func_end sub_807E7A4
-
- thumb_func_start sub_807E7B4
-sub_807E7B4: @ 807E7B4
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- ldr r0, _0807E860 @ =gUnknown_08396FC4
- ldr r4, [r0]
- ldr r0, _0807E864 @ =0x000006da
- adds r2, r4, r0
- ldrb r0, [r2]
- cmp r0, 0x18
- bne _0807E7CE
- b _0807E8D4
-_0807E7CE:
- ldrb r7, [r2]
- ldr r0, _0807E868 @ =gSpriteTemplate_839AAA4
- ldr r2, _0807E86C @ =gUnknown_0839AA08
- lsls r6, r7, 2
- adds r2, r6, r2
- movs r3, 0
- ldrsh r1, [r2, r3]
- movs r3, 0x2
- ldrsh r2, [r2, r3]
- movs r3, 0x4E
- bl CreateSpriteAtEnd
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x40
- beq _0807E87C
- ldr r3, _0807E870 @ =gSprites
- lsls r4, r5, 4
- adds r1, r4, r5
- lsls r1, 2
- adds r1, r3
- movs r0, 0
- strh r0, [r1, 0x38]
- lsls r2, r7, 3
- adds r0, r2, r7
- lsls r0, 4
- adds r0, r7
- strh r0, [r1, 0x30]
- lsls r0, 16
- asrs r0, 16
- ldr r1, _0807E874 @ =0x00000257
- mov r10, r6
- mov r9, r3
- mov r12, r4
- mov r8, r2
- cmp r0, r1
- ble _0807E832
- adds r2, r1, 0
-_0807E81A:
- adds r0, r4, r5
- lsls r0, 2
- ldr r6, _0807E870 @ =gSprites
- adds r0, r6
- ldr r3, _0807E878 @ =0xfffffda8
- ldrh r6, [r0, 0x30]
- adds r1, r3, r6
- strh r1, [r0, 0x30]
- lsls r1, 16
- asrs r1, 16
- cmp r1, r2
- bgt _0807E81A
-_0807E832:
- mov r0, r12
- adds r4, r0, r5
- lsls r4, 2
- add r4, r9
- adds r0, r4, 0
- bl sub_807E4EC
- mov r3, r8
- adds r1, r3, r7
- adds r0, r4, 0
- bl sub_807E6F0
- adds r2, r4, 0
- adds r2, 0x3E
- ldrb r0, [r2]
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r2]
- ldr r0, _0807E860 @ =gUnknown_08396FC4
- ldr r0, [r0]
- add r0, r10
- str r4, [r0]
- b _0807E882
- .align 2, 0
-_0807E860: .4byte gUnknown_08396FC4
-_0807E864: .4byte 0x000006da
-_0807E868: .4byte gSpriteTemplate_839AAA4
-_0807E86C: .4byte gUnknown_0839AA08
-_0807E870: .4byte gSprites
-_0807E874: .4byte 0x00000257
-_0807E878: .4byte 0xfffffda8
-_0807E87C:
- adds r1, r4, r6
- movs r0, 0
- str r0, [r1]
-_0807E882:
- ldr r0, _0807E8B8 @ =gUnknown_08396FC4
- ldr r2, [r0]
- ldr r6, _0807E8BC @ =0x000006da
- adds r1, r2, r6
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x18
- bne _0807E8D8
- movs r3, 0
- adds r1, r2, 0
- ldr r5, _0807E8C0 @ =sub_807E5C0
- ldr r4, _0807E8C4 @ =sub_807E6C4
-_0807E8A0:
- lsls r0, r3, 2
- adds r0, r1, r0
- ldr r2, [r0]
- cmp r2, 0
- beq _0807E8CA
- movs r6, 0x3A
- ldrsh r0, [r2, r6]
- cmp r0, 0
- bne _0807E8C8
- str r5, [r2, 0x1C]
- b _0807E8CA
- .align 2, 0
-_0807E8B8: .4byte gUnknown_08396FC4
-_0807E8BC: .4byte 0x000006da
-_0807E8C0: .4byte sub_807E5C0
-_0807E8C4: .4byte sub_807E6C4
-_0807E8C8:
- str r4, [r2, 0x1C]
-_0807E8CA:
- adds r0, r3, 0x1
- lsls r0, 16
- lsrs r3, r0, 16
- cmp r3, 0x17
- bls _0807E8A0
-_0807E8D4:
- movs r0, 0
- b _0807E8DA
-_0807E8D8:
- movs r0, 0x1
-_0807E8DA:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_807E7B4
-
- thumb_func_start sub_807E8E8
-sub_807E8E8: @ 807E8E8
- push {r4-r7,lr}
- ldr r0, _0807E904 @ =gUnknown_08396FC4
- ldr r3, [r0]
- movs r0, 0xDB
- lsls r0, 3
- adds r4, r3, r0
- ldr r1, _0807E908 @ =0x000006d9
- adds r5, r3, r1
- ldrb r0, [r4]
- ldrb r7, [r5]
- cmp r0, r7
- bne _0807E90C
- movs r0, 0
- b _0807E96E
- .align 2, 0
-_0807E904: .4byte gUnknown_08396FC4
-_0807E908: .4byte 0x000006d9
-_0807E90C:
- ldr r0, _0807E944 @ =0x000006d6
- adds r2, r3, r0
- ldrh r0, [r2]
- adds r0, 0x1
- movs r6, 0
- strh r0, [r2]
- ldr r7, _0807E948 @ =0x000006db
- adds r1, r3, r7
- lsls r0, 16
- lsrs r0, 16
- ldrb r1, [r1]
- cmp r0, r1
- bls _0807E96C
- strh r6, [r2]
- ldrb r0, [r4]
- adds r1, r0, 0
- ldrb r5, [r5]
- cmp r1, r5
- bcs _0807E94C
- adds r0, 0x1
- strb r0, [r4]
- lsls r0, r1, 2
- adds r0, r3, r0
- ldr r1, [r0]
- movs r0, 0x1
- strh r0, [r1, 0x38]
- b _0807E96C
- .align 2, 0
-_0807E944: .4byte 0x000006d6
-_0807E948: .4byte 0x000006db
-_0807E94C:
- subs r0, 0x1
- strb r0, [r4]
- ldrb r0, [r4]
- lsls r0, 2
- adds r0, r3, r0
- ldr r0, [r0]
- strh r6, [r0, 0x38]
- ldrb r0, [r4]
- lsls r0, 2
- adds r0, r3, r0
- ldr r1, [r0]
- adds r1, 0x3E
- ldrb r0, [r1]
- movs r2, 0x4
- orrs r0, r2
- strb r0, [r1]
-_0807E96C:
- movs r0, 0x1
-_0807E96E:
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_807E8E8
-
- thumb_func_start sub_807E974
-sub_807E974: @ 807E974
- push {r4-r7,lr}
- movs r4, 0
- ldr r0, _0807E9BC @ =gUnknown_08396FC4
- ldr r2, [r0]
- ldr r3, _0807E9C0 @ =0x000006da
- adds r1, r2, r3
- adds r7, r0, 0
- ldrb r1, [r1]
- cmp r4, r1
- bcs _0807E9A6
- adds r5, r2, 0
- adds r6, r5, r3
-_0807E98C:
- lsls r0, r4, 2
- adds r0, r5, r0
- ldr r0, [r0]
- cmp r0, 0
- beq _0807E99A
- bl DestroySprite
-_0807E99A:
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- ldrb r0, [r6]
- cmp r4, r0
- bcc _0807E98C
-_0807E9A6:
- ldr r0, [r7]
- ldr r1, _0807E9C0 @ =0x000006da
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
- ldr r0, _0807E9C4 @ =0x00001206
- bl FreeSpriteTilesByTag
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0807E9BC: .4byte gUnknown_08396FC4
-_0807E9C0: .4byte 0x000006da
-_0807E9C4: .4byte 0x00001206
- thumb_func_end sub_807E974
-
- thumb_func_start sub_807E9C8
-sub_807E9C8: @ 807E9C8
- push {r4,lr}
- ldr r0, _0807EA04 @ =gUnknown_08396FC4
- ldr r1, [r0]
- ldr r2, _0807EA08 @ =0x000006cc
- adds r0, r1, r2
- movs r2, 0
- movs r3, 0
- strh r3, [r0]
- ldr r4, _0807EA0C @ =0x000006d2
- adds r0, r1, r4
- strb r2, [r0]
- ldr r0, _0807EA10 @ =0x000006c1
- adds r2, r1, r0
- movs r0, 0x3
- strb r0, [r2]
- subs r4, 0x10
- adds r2, r1, r4
- movs r0, 0x14
- strb r0, [r2]
- ldr r0, _0807EA14 @ =0x000006e5
- adds r2, r1, r0
- movs r0, 0x10
- strb r0, [r2]
- movs r2, 0xDC
- lsls r2, 3
- adds r1, r2
- strh r3, [r1]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807EA04: .4byte gUnknown_08396FC4
-_0807EA08: .4byte 0x000006cc
-_0807EA0C: .4byte 0x000006d2
-_0807EA10: .4byte 0x000006c1
-_0807EA14: .4byte 0x000006e5
- thumb_func_end sub_807E9C8
-
- thumb_func_start sub_807EA18
-sub_807EA18: @ 807EA18
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- bl sub_807E9C8
- ldr r2, _0807EA78 @ =gUnknown_08396FC4
- ldr r1, [r2]
- ldr r3, _0807EA7C @ =0x000006d2
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r0, 0
- bne _0807EA6E
- mov r8, r2
- adds r7, r1, r3
-_0807EA34:
- bl snowflakes_progress2
- movs r4, 0
- mov r1, r8
- ldr r0, [r1]
- ldr r3, _0807EA80 @ =0x000006e4
- adds r0, r3
- ldrb r0, [r0]
- cmp r4, r0
- bcs _0807EA68
- ldr r0, _0807EA78 @ =gUnknown_08396FC4
- ldr r5, [r0]
- adds r6, r5, r3
-_0807EA4E:
- lsls r1, r4, 2
- adds r0, r5, 0
- adds r0, 0x60
- adds r0, r1
- ldr r0, [r0]
- bl sub_807ED48
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- ldrb r0, [r6]
- cmp r4, r0
- bcc _0807EA4E
-_0807EA68:
- ldrb r0, [r7]
- cmp r0, 0
- beq _0807EA34
-_0807EA6E:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0807EA78: .4byte gUnknown_08396FC4
-_0807EA7C: .4byte 0x000006d2
-_0807EA80: .4byte 0x000006e4
- thumb_func_end sub_807EA18
-
- thumb_func_start snowflakes_progress2
-snowflakes_progress2: @ 807EA84
- push {r4,r5,lr}
- ldr r0, _0807EAB4 @ =gUnknown_08396FC4
- ldr r5, [r0]
- ldr r0, _0807EAB8 @ =0x000006cc
- adds r4, r5, r0
- ldrh r0, [r4]
- cmp r0, 0
- bne _0807EAAC
- bl snowflakes_progress
- lsls r0, 24
- cmp r0, 0
- bne _0807EAAC
- ldr r0, _0807EABC @ =0x000006d2
- adds r1, r5, r0
- movs r0, 0x1
- strb r0, [r1]
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
-_0807EAAC:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807EAB4: .4byte gUnknown_08396FC4
-_0807EAB8: .4byte 0x000006cc
-_0807EABC: .4byte 0x000006d2
- thumb_func_end snowflakes_progress2
-
thumb_func_start sub_807EAC0
sub_807EAC0: @ 807EAC0
push {r4,lr}
diff --git a/src/field_weather.c b/src/field_weather.c
index fff4ac673..0027f2bc1 100644
--- a/src/field_weather.c
+++ b/src/field_weather.c
@@ -26,7 +26,8 @@ struct Struct2000000
struct Weather
{
- u8 filler_000[0x1F4];
+ 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];
@@ -61,9 +62,12 @@ struct Weather
u8 unknown_6DC;
u8 unknown_6DD;
u8 unknown_6DE;
- u8 filler_6DF[5];
+ u8 filler_6DF[1];
+ u16 unknown_6E0;
+ u8 filler_6E2[2];
u8 unknown_6E4;
- u8 filler_6E5[0xF];
+ u8 unknown_6E5;
+ u8 filler_6E6[0xE];
u8 unknown_6F4[6];
u8 unknown_6FA;
u8 unknown_6FB;
@@ -113,6 +117,8 @@ 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;
const u8 DroughtPaletteData_0[] = INCBIN_U8("graphics/weather/drought0.bin.lz");
const u8 DroughtPaletteData_1[] = INCBIN_U8("graphics/weather/drought1.bin.lz");
@@ -1437,7 +1443,8 @@ bool8 sub_807E460(void)
return FALSE;
}
-extern const struct Coords16 gUnknown_0839AAC4[];
+//extern const struct Coords16 gUnknown_0839AAC4[];
+extern const u16 gUnknown_0839AAC4[][2];
//extern const struct Coords16 gUnknown_0839AABC[];
extern const s16 gUnknown_0839AABC[][2];
@@ -1452,7 +1459,8 @@ void sub_807E4EC(struct Sprite *sprite)
sprite->data1 = 361;
randVal = sprite->data1 * 1103515245 + 12345;
sprite->data1 = ((randVal & 0x7FFF0000) >> 16) % 600;
- r6 = gUnknown_0839AAC4[gUnknown_08396FC4->unknown_6DC].x;
+
+ r6 = gUnknown_0839AAC4[gUnknown_08396FC4->unknown_6DC][0];
r4 = sprite->data1 % 30;
sprite->data2 = r4 * 8; // useless assignment
@@ -1468,8 +1476,204 @@ void sub_807E4EC(struct Sprite *sprite)
sprite->data2 -= gUnknown_0839AABC[gUnknown_08396FC4->unknown_6DC][0] * r6;
sprite->data3 -= gUnknown_0839AABC[gUnknown_08396FC4->unknown_6DC][1] * r6;
+
StartSpriteAnim(sprite, 0);
sprite->data4 = 0;
sprite->coordOffsetEnabled = FALSE;
sprite->data0 = r6;
}
+
+void sub_807E5C0(struct Sprite *sprite)
+{
+ if (sprite->data4 == 0)
+ {
+ sprite->data2 += gUnknown_0839AABC[gUnknown_08396FC4->unknown_6DC][0];
+ sprite->data3 += gUnknown_0839AABC[gUnknown_08396FC4->unknown_6DC][1];
+ sprite->pos1.x = sprite->data2 >> 4;
+ sprite->pos1.y = sprite->data3 >> 4;
+
+ if (sprite->data5 != 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->data0--;
+ if (sprite->data0 == 0)
+ {
+ StartSpriteAnim(sprite, gUnknown_08396FC4->unknown_6DC + 1);
+ sprite->data4 = 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->data0 == 0)
+ {
+ sub_807E4EC(sprite);
+ sprite->callback = sub_807E5C0;
+ }
+ else
+ {
+ sprite->data0--;
+ }
+}
+
+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->data6 = 0;
+ }
+ else
+ {
+ sprite->data0 = r4 - r8;
+ sprite->invisible = TRUE;
+ sprite->data6 = 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].data5 = 0;
+ gSprites[spriteId].data1 = r7 * 145;
+ while (gSprites[spriteId].data1 >= 600)
+ gSprites[spriteId].data1 -= 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]->data6 == 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++]->data5 = 1;
+ }
+ else
+ {
+ gUnknown_08396FC4->unknown_6D8--;
+ gUnknown_08396FC4->unknown_0[gUnknown_08396FC4->unknown_6D8]->data5 = 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() == 0)
+ {
+ gUnknown_08396FC4->unknown_6D2 = 1;
+ gUnknown_08396FC4->unknown_6CC++;
+ }
+}