summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-03-02 16:57:00 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2020-03-02 16:57:00 -0500
commitf77b0feba6f1152216eba3b2c1edf63ba76c5a80 (patch)
tree73694784d546672b4343fe45ac379b5091294e76
parent1261a414cdc46e9e9a63dd72a7e869fd0cd81a03 (diff)
Port berry_crush.c part 1 from Emerald
-rw-r--r--asm/berry_crush.s580
-rw-r--r--asm/overworld.s30
-rw-r--r--include/berry_crush.h159
-rw-r--r--include/math_util.h1
-rw-r--r--include/overworld.h2
-rw-r--r--ld_script.txt2
-rw-r--r--src/berry_crush.c235
-rw-r--r--sym_ewram.txt6
8 files changed, 416 insertions, 599 deletions
diff --git a/asm/berry_crush.s b/asm/berry_crush.s
deleted file mode 100644
index 728e87128..000000000
--- a/asm/berry_crush.s
+++ /dev/null
@@ -1,580 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_814B6F0
-sub_814B6F0: @ 814B6F0
- ldr r0, _0814B6F8 @ =gUnknown_203F3DC
- ldr r0, [r0]
- bx lr
- .align 2, 0
-_0814B6F8: .4byte gUnknown_203F3DC
- thumb_func_end sub_814B6F0
-
- thumb_func_start sub_814B6FC
-sub_814B6FC: @ 814B6FC
- push {r4,r5,lr}
- adds r4, r0, 0
- ldr r5, _0814B70C @ =gUnknown_203F3DC
- ldr r0, [r5]
- cmp r0, 0
- bne _0814B710
- movs r0, 0x2
- b _0814B740
- .align 2, 0
-_0814B70C: .4byte gUnknown_203F3DC
-_0814B710:
- cmp r4, 0
- bne _0814B716
- ldr r4, [r0]
-_0814B716:
- ldrb r0, [r0, 0xA]
- bl DestroyTask
- ldr r0, [r5]
- bl Free
- movs r0, 0
- str r0, [r5]
- adds r0, r4, 0
- bl SetMainCallback2
- ldr r0, _0814B748 @ =CB2_ReturnToField
- cmp r4, r0
- bne _0814B73E
- ldr r0, _0814B74C @ =0x0000012f
- bl PlayNewMapMusic
- ldr r0, _0814B750 @ =sub_8056534
- bl SetMainCallback1
-_0814B73E:
- movs r0, 0
-_0814B740:
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_0814B748: .4byte CB2_ReturnToField
-_0814B74C: .4byte 0x0000012f
-_0814B750: .4byte sub_8056534
- thumb_func_end sub_814B6FC
-
- thumb_func_start StartBerryCrush
-StartBerryCrush: @ 814B754
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0xC
- adds r4, r0, 0
- movs r0, 0
- mov r8, r0
- ldr r0, _0814B784 @ =gReceivedRemoteLinkPlayers
- ldrb r0, [r0]
- cmp r0, 0
- beq _0814B772
- ldr r0, _0814B788 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- bne _0814B790
-_0814B772:
- adds r0, r4, 0
- bl SetMainCallback2
- ldr r0, _0814B78C @ =Rfu
- mov r1, r8
- strh r1, [r0, 0x10]
- strh r1, [r0, 0x12]
- b _0814B7DC
- .align 2, 0
-_0814B784: .4byte gReceivedRemoteLinkPlayers
-_0814B788: .4byte gWirelessCommType
-_0814B78C: .4byte Rfu
-_0814B790:
- bl GetLinkPlayerCount
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- bl GetMultiplayerId
- lsls r0, 24
- lsrs r7, r0, 24
- mov r0, r8
- cmp r0, 0x1
- bls _0814B7AC
- cmp r7, r8
- bcc _0814B7C0
-_0814B7AC:
- adds r0, r4, 0
- bl SetMainCallback2
- ldr r0, _0814B7BC @ =Rfu
- movs r1, 0
- strh r1, [r0, 0x10]
- strh r1, [r0, 0x12]
- b _0814B7DC
- .align 2, 0
-_0814B7BC: .4byte Rfu
-_0814B7C0:
- ldr r6, _0814B7E8 @ =gUnknown_203F3DC
- ldr r0, _0814B7EC @ =0x000041c0
- bl AllocZeroed
- adds r5, r0, 0
- str r5, [r6]
- cmp r5, 0
- bne _0814B7F4
- adds r0, r4, 0
- bl SetMainCallback2
- ldr r0, _0814B7F0 @ =Rfu
- strh r5, [r0, 0x10]
- strh r5, [r0, 0x12]
-_0814B7DC:
- adds r0, 0xEE
- ldrb r1, [r0]
- movs r1, 0x1
- strb r1, [r0]
- b _0814B84C
- .align 2, 0
-_0814B7E8: .4byte gUnknown_203F3DC
-_0814B7EC: .4byte 0x000041c0
-_0814B7F0: .4byte Rfu
-_0814B7F4:
- str r4, [r5]
- movs r4, 0
- strb r7, [r5, 0x8]
- ldr r0, [r6]
- mov r1, r8
- strb r1, [r0, 0x9]
- ldr r0, [r6]
- bl sub_814BABC
- ldr r1, [r6]
- movs r2, 0x1
- movs r0, 0x1
- strh r0, [r1, 0x12]
- strb r2, [r1, 0xE]
- ldr r1, [r6]
- movs r0, 0x6
- strb r0, [r1, 0xF]
- ldr r0, [r6]
- adds r0, 0x36
- movs r2, 0x1
- negs r2, r2
- movs r1, 0x10
- str r1, [sp]
- str r4, [sp, 0x4]
- str r4, [sp, 0x8]
- movs r1, 0x1
- movs r3, 0
- bl sub_814D564
- ldr r2, [r6]
- adds r2, 0x36
- movs r0, 0x4
- movs r1, 0x1
- bl sub_814BB4C
- ldr r0, _0814B858 @ =sub_814BA80
- bl SetMainCallback2
- ldr r0, _0814B85C @ =sub_814BA98
- movs r1, 0x8
- bl CreateTask
- ldr r1, [r6]
- strb r0, [r1, 0xA]
-_0814B84C:
- add sp, 0xC
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0814B858: .4byte sub_814BA80
-_0814B85C: .4byte sub_814BA98
- thumb_func_end StartBerryCrush
-
- thumb_func_start sub_814B860
-sub_814B860: @ 814B860
- push {r4,lr}
- sub sp, 0xC
- ldr r1, _0814B878 @ =gSpecialVar_ItemId
- ldrh r0, [r1]
- subs r0, 0x85
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x2B
- bls _0814B87C
- movs r0, 0x85
- strh r0, [r1]
- b _0814B884
- .align 2, 0
-_0814B878: .4byte gSpecialVar_ItemId
-_0814B87C:
- ldrh r0, [r1]
- movs r1, 0x1
- bl RemoveBagItem
-_0814B884:
- ldr r4, _0814B8E0 @ =gUnknown_203F3DC
- ldr r2, [r4]
- ldrb r0, [r2, 0x8]
- lsls r0, 5
- adds r0, r2, r0
- ldr r1, _0814B8E4 @ =gSpecialVar_ItemId
- ldrh r1, [r1]
- subs r1, 0x85
- adds r0, 0xA4
- movs r3, 0
- strh r1, [r0]
- movs r0, 0x1
- strb r0, [r2, 0xE]
- ldr r1, [r4]
- movs r0, 0x9
- strb r0, [r1, 0xF]
- ldr r0, [r4]
- adds r0, 0x36
- movs r2, 0x1
- negs r2, r2
- movs r1, 0x10
- str r1, [sp]
- str r3, [sp, 0x4]
- str r3, [sp, 0x8]
- movs r1, 0
- bl sub_814D564
- ldr r2, [r4]
- adds r2, 0x36
- movs r0, 0x4
- movs r1, 0x1
- bl sub_814BB4C
- ldr r0, _0814B8E8 @ =sub_814BA98
- movs r1, 0x8
- bl CreateTask
- ldr r1, [r4]
- strb r0, [r1, 0xA]
- ldr r0, _0814B8EC @ =sub_814BA80
- bl SetMainCallback2
- add sp, 0xC
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0814B8E0: .4byte gUnknown_203F3DC
-_0814B8E4: .4byte gSpecialVar_ItemId
-_0814B8E8: .4byte sub_814BA98
-_0814B8EC: .4byte sub_814BA80
- thumb_func_end sub_814B860
-
- thumb_func_start sub_814B8F0
-sub_814B8F0: @ 814B8F0
- push {lr}
- ldr r0, _0814B90C @ =gUnknown_203F3DC
- ldr r0, [r0]
- ldrb r0, [r0, 0xA]
- bl DestroyTask
- ldr r1, _0814B910 @ =sub_814B860
- movs r0, 0x5
- movs r2, 0
- bl InitBerryPouch
- pop {r0}
- bx r0
- .align 2, 0
-_0814B90C: .4byte gUnknown_203F3DC
-_0814B910: .4byte sub_814B860
- thumb_func_end sub_814B8F0
-
- thumb_func_start sub_814B914
-sub_814B914: @ 814B914
- push {lr}
- ldr r0, _0814B920 @ =sub_814BA6C
- bl SetVBlankCallback
- pop {r0}
- bx r0
- .align 2, 0
-_0814B920: .4byte sub_814BA6C
- thumb_func_end sub_814B914
-
- thumb_func_start sub_814B924
-sub_814B924: @ 814B924
- push {lr}
- movs r0, 0
- bl SetVBlankCallback
- pop {r0}
- bx r0
- thumb_func_end sub_814B924
-
- thumb_func_start sub_814B930
-sub_814B930: @ 814B930
- push {r4,r5,lr}
- ldr r4, _0814B974 @ =gUnknown_203F3DC
- ldr r0, [r4]
- adds r0, 0x6C
- ldrh r2, [r0]
- lsls r2, 8
- movs r1, 0xF0
- lsls r1, 6
- adds r0, r2, 0
- bl sub_80D8B68
- adds r2, r0, 0
- ldr r0, [r4]
- adds r0, 0x72
- ldrh r3, [r0]
- lsls r3, 8
- adds r0, r3, 0
- adds r1, r2, 0
- bl sub_80D8B68
- adds r3, r0, 0
- ldr r0, _0814B978 @ =0x0000ffff
- ands r3, r0
- ldr r2, [r4]
- strh r3, [r2, 0x16]
- ldrb r0, [r2, 0x9]
- cmp r0, 0x3
- beq _0814B9B4
- cmp r0, 0x3
- bgt _0814B97C
- cmp r0, 0x2
- beq _0814B986
- b _0814BA3C
- .align 2, 0
-_0814B974: .4byte gUnknown_203F3DC
-_0814B978: .4byte 0x0000ffff
-_0814B97C:
- cmp r0, 0x4
- beq _0814B9E4
- cmp r0, 0x5
- beq _0814BA14
- b _0814BA3C
-_0814B986:
- ldr r5, _0814B9B0 @ =gSaveBlock2Ptr
- ldr r1, [r5]
- movs r0, 0xAF
- lsls r0, 4
- adds r1, r0
- lsls r0, r3, 16
- lsrs r0, 16
- ldrh r1, [r1]
- cmp r0, r1
- bls _0814BA3C
- adds r2, 0x25
- ldrb r0, [r2]
- movs r1, 0x2
- orrs r0, r1
- strb r0, [r2]
- ldr r0, [r5]
- ldr r1, [r4]
- ldrh r1, [r1, 0x16]
- movs r2, 0xAF
- lsls r2, 4
- b _0814BA38
- .align 2, 0
-_0814B9B0: .4byte gSaveBlock2Ptr
-_0814B9B4:
- ldr r5, _0814B9DC @ =gSaveBlock2Ptr
- ldr r1, [r5]
- ldr r0, _0814B9E0 @ =0x00000af2
- adds r1, r0
- lsls r0, r3, 16
- lsrs r0, 16
- ldrh r1, [r1]
- cmp r0, r1
- bls _0814BA3C
- adds r2, 0x25
- ldrb r0, [r2]
- movs r1, 0x2
- orrs r0, r1
- strb r0, [r2]
- ldr r0, [r5]
- ldr r1, [r4]
- ldrh r1, [r1, 0x16]
- ldr r2, _0814B9E0 @ =0x00000af2
- b _0814BA38
- .align 2, 0
-_0814B9DC: .4byte gSaveBlock2Ptr
-_0814B9E0: .4byte 0x00000af2
-_0814B9E4:
- ldr r5, _0814BA0C @ =gSaveBlock2Ptr
- ldr r1, [r5]
- ldr r0, _0814BA10 @ =0x00000af4
- adds r1, r0
- lsls r0, r3, 16
- lsrs r0, 16
- ldrh r1, [r1]
- cmp r0, r1
- bls _0814BA3C
- adds r2, 0x25
- ldrb r0, [r2]
- movs r1, 0x2
- orrs r0, r1
- strb r0, [r2]
- ldr r0, [r5]
- ldr r1, [r4]
- ldrh r1, [r1, 0x16]
- ldr r2, _0814BA10 @ =0x00000af4
- b _0814BA38
- .align 2, 0
-_0814BA0C: .4byte gSaveBlock2Ptr
-_0814BA10: .4byte 0x00000af4
-_0814BA14:
- ldr r5, _0814BA60 @ =gSaveBlock2Ptr
- ldr r1, [r5]
- ldr r0, _0814BA64 @ =0x00000af6
- adds r1, r0
- lsls r0, r3, 16
- lsrs r0, 16
- ldrh r1, [r1]
- cmp r0, r1
- bls _0814BA3C
- adds r2, 0x25
- ldrb r0, [r2]
- movs r1, 0x2
- orrs r0, r1
- strb r0, [r2]
- ldr r0, [r5]
- ldr r1, [r4]
- ldrh r1, [r1, 0x16]
- ldr r2, _0814BA64 @ =0x00000af6
-_0814BA38:
- adds r0, r2
- strh r1, [r0]
-_0814BA3C:
- ldr r4, _0814BA68 @ =gUnknown_203F3DC
- ldr r1, [r4]
- ldr r0, [r1, 0x68]
- str r0, [r1, 0x1C]
- bl GiveBerryPowder
- lsls r0, 24
- cmp r0, 0
- bne _0814BA5A
- ldr r0, [r4]
- adds r0, 0x25
- ldrb r1, [r0]
- movs r2, 0x1
- orrs r1, r2
- strb r1, [r0]
-_0814BA5A:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0814BA60: .4byte gSaveBlock2Ptr
-_0814BA64: .4byte 0x00000af6
-_0814BA68: .4byte gUnknown_203F3DC
- thumb_func_end sub_814B930
-
- thumb_func_start sub_814BA6C
-sub_814BA6C: @ 814BA6C
- push {lr}
- bl TransferPlttBuffer
- bl LoadOam
- bl ProcessSpriteCopyRequests
- pop {r0}
- bx r0
- thumb_func_end sub_814BA6C
-
- thumb_func_start sub_814BA80
-sub_814BA80: @ 814BA80
- push {lr}
- bl RunTasks
- bl RunTextPrinters
- bl AnimateSprites
- bl BuildOamBuffer
- pop {r0}
- bx r0
- thumb_func_end sub_814BA80
-
- thumb_func_start sub_814BA98
-sub_814BA98: @ 814BA98
- push {r4,lr}
- ldr r4, _0814BAB8 @ =gUnknown_203F3DC
- ldr r0, [r4]
- ldr r2, [r0, 0x4]
- cmp r2, 0
- beq _0814BAAC
- adds r1, r0, 0
- adds r1, 0x36
- bl _call_via_r2
-_0814BAAC:
- ldr r0, [r4]
- bl sub_814D9CC
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0814BAB8: .4byte gUnknown_203F3DC
- thumb_func_end sub_814BA98
-
- thumb_func_start sub_814BABC
-sub_814BABC: @ 814BABC
- push {r4-r6,lr}
- adds r6, r0, 0
- movs r5, 0
- b _0814BAE8
-_0814BAC4:
- lsls r4, r5, 5
- adds r0, r4, 0
- adds r0, 0x98
- adds r0, r6, r0
- lsls r1, r5, 3
- subs r1, r5
- lsls r1, 2
- ldr r2, _0814BB2C @ =gLinkPlayers + 8
- adds r1, r2
- bl StringCopy
- adds r4, r6, r4
- adds r4, 0x9F
- movs r0, 0xFF
- strb r0, [r4]
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
-_0814BAE8:
- ldrb r0, [r6, 0x9]
- cmp r5, r0
- bcc _0814BAC4
- cmp r5, 0x4
- bhi _0814BB14
-_0814BAF2:
- lsls r4, r5, 5
- adds r0, r4, 0
- adds r0, 0x98
- adds r0, r6, r0
- movs r1, 0x1
- movs r2, 0x7
- bl memset
- adds r4, r6, r4
- adds r4, 0x9F
- movs r0, 0xFF
- strb r0, [r4]
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x4
- bls _0814BAF2
-_0814BB14:
- ldr r0, _0814BB30 @ =gSaveBlock2Ptr
- ldr r0, [r0]
- ldrb r0, [r0, 0x14]
- lsls r0, 29
- lsrs r0, 29
- cmp r0, 0x1
- beq _0814BB3E
- cmp r0, 0x1
- bgt _0814BB34
- cmp r0, 0
- beq _0814BB3A
- b _0814BB46
- .align 2, 0
-_0814BB2C: .4byte gLinkPlayers + 8
-_0814BB30: .4byte gSaveBlock2Ptr
-_0814BB34:
- cmp r0, 0x2
- beq _0814BB42
- b _0814BB46
-_0814BB3A:
- movs r0, 0x8
- b _0814BB44
-_0814BB3E:
- movs r0, 0x4
- b _0814BB44
-_0814BB42:
- movs r0, 0x1
-_0814BB44:
- strb r0, [r6, 0xB]
-_0814BB46:
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_814BABC
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/overworld.s b/asm/overworld.s
index 7fd5470dd..6b7744e52 100644
--- a/asm/overworld.s
+++ b/asm/overworld.s
@@ -3347,8 +3347,8 @@ _08056522:
_08056530: .4byte gUnknown_3005E90
thumb_func_end sub_80564C8
- thumb_func_start sub_8056534
-sub_8056534: @ 8056534
+ thumb_func_start CB1_Overworld
+CB1_Overworld: @ 8056534
push {r4,lr}
ldr r4, _0805655C @ =gMain
ldr r1, [r4, 0x4]
@@ -3379,7 +3379,7 @@ _08056570:
pop {r4}
pop {r0}
bx r0
- thumb_func_end sub_8056534
+ thumb_func_end CB1_Overworld
thumb_func_start sub_8056578
sub_8056578: @ 8056578
@@ -3507,7 +3507,7 @@ CB2_NewGame: @ 8056644
ldr r0, _08056698 @ =gMain + 0x438
bl do_load_map_stuff_loop
bl SetFieldVBlankCallback
- ldr r0, _0805669C @ =sub_8056534
+ ldr r0, _0805669C @ =CB1_Overworld
bl SetMainCallback1
ldr r0, _080566A0 @ =sub_80565B4
bl SetMainCallback2
@@ -3518,7 +3518,7 @@ _0805668C: .4byte gFieldCallback
_08056690: .4byte sub_807DF7C
_08056694: .4byte gFieldCallback2
_08056698: .4byte gMain + 0x438
-_0805669C: .4byte sub_8056534
+_0805669C: .4byte CB1_Overworld
_080566A0: .4byte sub_80565B4
thumb_func_end CB2_NewGame
@@ -3555,7 +3555,7 @@ CB2_WhiteOut: @ 80566A4
bl do_load_map_stuff_loop
bl sub_8112364
bl SetFieldVBlankCallback
- ldr r0, _08056714 @ =sub_8056534
+ ldr r0, _08056714 @ =CB1_Overworld
bl SetMainCallback1
ldr r0, _08056718 @ =sub_80565B4
bl SetMainCallback2
@@ -3567,7 +3567,7 @@ _08056702:
_08056708: .4byte gMain
_0805670C: .4byte gFieldCallback
_08056710: .4byte sub_807F5F0
-_08056714: .4byte sub_8056534
+_08056714: .4byte CB1_Overworld
_08056718: .4byte sub_80565B4
thumb_func_end CB2_WhiteOut
@@ -3608,7 +3608,7 @@ sub_805674C: @ 805674C
_08056768: .4byte gMain + 0x438
_0805676C:
bl SetFieldVBlankCallback
- ldr r0, _08056780 @ =sub_8056534
+ ldr r0, _08056780 @ =CB1_Overworld
bl SetMainCallback1
ldr r0, _08056784 @ =sub_80565B4
bl SetMainCallback2
@@ -3616,7 +3616,7 @@ _0805677C:
pop {r0}
bx r0
.align 2, 0
-_08056780: .4byte sub_8056534
+_08056780: .4byte CB1_Overworld
_08056784: .4byte sub_80565B4
thumb_func_end sub_805674C
@@ -3870,7 +3870,7 @@ _0805699C:
ldr r0, _080569B0 @ =gFieldCallback
ldr r1, _080569B4 @ =sub_8056918
str r1, [r0]
- ldr r0, _080569B8 @ =sub_8056534
+ ldr r0, _080569B8 @ =CB1_Overworld
bl SetMainCallback1
bl CB2_ReturnToField
_080569AC:
@@ -3879,7 +3879,7 @@ _080569AC:
.align 2, 0
_080569B0: .4byte gFieldCallback
_080569B4: .4byte sub_8056918
-_080569B8: .4byte sub_8056534
+_080569B8: .4byte CB1_Overworld
thumb_func_end CB2_ContinueSavedGame
thumb_func_start FieldClearVBlankHBlankCallbacks
@@ -4963,7 +4963,7 @@ sub_80572D8: @ 80572D8
ldr r0, _080572F4 @ =gMain + 0x438
bl sub_8057300
bl SetFieldVBlankCallback
- ldr r0, _080572F8 @ =sub_8056534
+ ldr r0, _080572F8 @ =CB1_Overworld
bl SetMainCallback1
ldr r0, _080572FC @ =sub_80565B4
bl SetMainCallback2
@@ -4971,7 +4971,7 @@ sub_80572D8: @ 80572D8
bx r0
.align 2, 0
_080572F4: .4byte gMain + 0x438
-_080572F8: .4byte sub_8056534
+_080572F8: .4byte CB1_Overworld
_080572FC: .4byte sub_80565B4
thumb_func_end sub_80572D8
@@ -5148,14 +5148,14 @@ _08057484: .4byte gUnknown_2036E28
_08057488: .4byte gUnknown_2031DE0
_0805748C: .4byte CB2_LoadMap
_08057490:
- ldr r0, _080574A0 @ =sub_8056534
+ ldr r0, _080574A0 @ =CB1_Overworld
bl SetMainCallback1
bl CB2_ReturnToField
_0805749A:
pop {r0}
bx r0
.align 2, 0
-_080574A0: .4byte sub_8056534
+_080574A0: .4byte CB1_Overworld
thumb_func_end sub_8057430
thumb_func_start Overworld_CreditsMainCB
diff --git a/include/berry_crush.h b/include/berry_crush.h
index e8e9c216f..864d9b9d3 100644
--- a/include/berry_crush.h
+++ b/include/berry_crush.h
@@ -1,6 +1,165 @@
#ifndef GUARD_BERRY_CRUSH_H
#define GUARD_BERRY_CRUSH_H
+struct BerryCrushGame_Player
+{
+ u16 unk0;
+ u16 unk2;
+ union
+ {
+ u8 as_2d_bytes[2][8];
+ u16 as_hwords[8];
+ } unk4;
+ u8 unk14[12];
+};
+
+struct __attribute__((packed, aligned(2))) BerryCrushGame_4E
+{
+ u16 unk0;
+ u16 filler2;
+ u8 unk4_0:1;
+ u8 unk4_1:1;
+ s8 unk5;
+ u16 unk6;
+ u16 unk8;
+ u16 unkA;
+ u16 unkC;
+};
+
+struct __attribute__((packed)) BerryCrushGame_40
+{
+ u8 unk0[2];
+ u16 unk2[6];
+ struct BerryCrushGame_4E unkE;
+};
+
+struct BerryCrushGame_5C
+{
+ u16 unk00;
+ u8 unk02_0:1;
+ u8 unk02_1:1;
+ u8 unk02_2:1;
+ u8 unk02_3:5;
+ u8 unk03;
+ u16 unk04;
+ u16 unk06;
+ u16 unk08;
+ u16 unk0A;
+};
+
+union BerryCrushGame_68
+{
+ struct BerryCrushGame_68_x
+ {
+ struct BerryCrushGame_68_x_SubStruct
+ {
+ s32 unk00;
+ u16 unk04;
+ s16 unk06;
+ u16 unk08;
+ u16 unk0A;
+ u16 unk0C[2][5];
+ u8 filler20[16];
+ } unk00;
+ u8 unk30[12];
+ struct BerryCrushGame_Player others[4];
+ u8 fillerBC[20];
+ } as_four_players;
+ struct BerryCrushGame_68_y
+ {
+ u8 filler00[28];
+ struct BerryCrushGame_Player unk1C[5];
+ u8 fillerBC[20];
+ } as_five_players;
+};
+
+struct BerryCrushGame_138_C
+{
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ s16 unk4;
+ s16 unk6;
+ s16 unk8;
+ s16 unkA;
+};
+
+struct BerryCrushGame_138
+{
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ s16 unk4;
+ s16 unk6;
+ s16 unk8;
+ const struct BerryCrushGame_138_C *unkC[5];
+ struct Sprite *unk20;
+ struct Sprite *unk24[5];
+ struct Sprite *unk38[5];
+ struct Sprite *unk4C[11];
+ struct Sprite *unk78[2];
+ u8 unk80;
+ u8 filler81;
+ u8 unk82;
+ u8 unk83[5];
+};
+
+struct BerryCrushGame
+{
+ MainCallback unk0;
+ u32 (* unk4)(struct BerryCrushGame *, u8 *);
+ u8 unk8;
+ u8 unk9;
+ u8 unkA;
+ u8 unkB;
+ u8 unkC;
+ u8 unkD;
+ u8 unkE;
+ u8 unkF;
+ u16 unk10;
+ u16 unk12;
+ u16 unk14;
+ u16 unk16;
+ s16 unk18;
+ s16 unk1A;
+ int unk1C;
+ s32 unk20;
+ u8 unk24;
+ u8 unk25_0:1;
+ u8 unk25_1:1;
+ u8 unk25_2:1;
+ u8 unk25_3:1;
+ u8 unk25_4:1;
+ u8 unk25_5:3;
+ u16 unk26;
+ u16 unk28;
+ s16 unk2A;
+ s16 unk2C;
+ s16 unk2E;
+ s16 unk30;
+ s16 unk32;
+ s16 unk34;
+ u8 unk36[0xA];
+ struct BerryCrushGame_40 unk40;
+ struct BerryCrushGame_5C unk5C;
+ union BerryCrushGame_68 unk68;
+ struct BerryCrushGame_138 unk138;
+ u8 unk1C0[0x1000];
+ u8 unk11C0[0x1000];
+ u8 unk21C0[0x1000];
+ u8 unk31C0[0x1000];
+};
+
void StartBerryCrush(MainCallback callback);
+u32 sub_814B6FC(MainCallback callback);
+void sub_814B8F0(void);
+void sub_814B914(void);
+void sub_814B924(void);
+void sub_814B930(void);
+void sub_814BABC(struct BerryCrushGame *arg0);
+void sub_814BB4C(u16, u8, u8 *);
+void sub_814D564(u8 *, u32, s32, u32, u32, u32, u32);
+void sub_814D9CC(struct BerryCrushGame *arg0);
#endif //GUARD_BERRY_CRUSH_H
diff --git a/include/math_util.h b/include/math_util.h
index 473be5d45..7a81ee7e3 100644
--- a/include/math_util.h
+++ b/include/math_util.h
@@ -3,5 +3,6 @@
s16 sub_80D8B90(s16 y);
s16 sub_80D8AA0(s16 x, s16 y);
+s32 sub_80D8B68(s32 x, s32 y);
#endif //GUARD_MATH_UTIL_H
diff --git a/include/overworld.h b/include/overworld.h
index 1775a6896..a67c7cd88 100644
--- a/include/overworld.h
+++ b/include/overworld.h
@@ -189,6 +189,8 @@ void sub_8057F34(void);
u32 sub_8057EC0(void);
void sub_8057F70(void);
void sub_8057F48(void);
+void SetMainCallback1(MainCallback cb);
+void CB1_Overworld(void);
extern u16 gHeldKeyCodeToSend;
diff --git a/ld_script.txt b/ld_script.txt
index 65666ddc0..1f819d6c7 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -279,7 +279,7 @@ SECTIONS {
src/pokemon_jump_4.o(.text);
src/pokemon_jump_5.o(.text);
src/pokemon_jump_6.o(.text);
- asm/berry_crush.o(.text);
+ src/berry_crush.o(.text);
asm/berry_crush_2.o(.text);
asm/berry_crush_3.o(.text);
src/wireless_communication_status_screen.o(.text);
diff --git a/src/berry_crush.c b/src/berry_crush.c
new file mode 100644
index 000000000..b1a484a24
--- /dev/null
+++ b/src/berry_crush.c
@@ -0,0 +1,235 @@
+#include "global.h"
+#include "gflib.h"
+#include "berry_crush.h"
+#include "berry_pouch.h"
+#include "berry_powder.h"
+#include "item.h"
+#include "item_menu.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "math_util.h"
+#include "overworld.h"
+#include "task.h"
+#include "constants/songs.h"
+#include "constants/items.h"
+
+static EWRAM_DATA struct BerryCrushGame *gUnknown_203F3DC = NULL;
+
+struct BerryCrushGame *sub_814B6F0(void);
+static void sub_814B860(void);
+static void sub_814BA6C(void);
+static void sub_814BA80(void);
+static void sub_814BA98(u8 taskId);
+
+struct BerryCrushGame *sub_814B6F0(void)
+{
+ return gUnknown_203F3DC;
+}
+
+u32 sub_814B6FC(MainCallback callback)
+{
+ if (!gUnknown_203F3DC)
+ return 2;
+
+ if (!callback)
+ callback = gUnknown_203F3DC->unk0;
+
+ DestroyTask(gUnknown_203F3DC->unkA);
+ FREE_AND_SET_NULL(gUnknown_203F3DC);
+ SetMainCallback2(callback);
+ if (callback == CB2_ReturnToField)
+ {
+ PlayNewMapMusic(MUS_POKECEN);
+ SetMainCallback1(CB1_Overworld);
+ }
+
+ return 0;
+}
+
+void StartBerryCrush(MainCallback callback)
+{
+ u8 playerCount = 0;
+ u8 multiplayerId;
+
+ if (!gReceivedRemoteLinkPlayers || gWirelessCommType == 0)
+ {
+ SetMainCallback2(callback);
+ Rfu.linkman_param[0] = 0;
+ Rfu.linkman_param[1] = 0;
+ Rfu.errorState = 1;
+ return;
+ }
+
+ playerCount = GetLinkPlayerCount();
+ multiplayerId = GetMultiplayerId();
+ if (playerCount < 2 || multiplayerId >= playerCount)
+ {
+ SetMainCallback2(callback);
+ Rfu.linkman_param[0] = 0;
+ Rfu.linkman_param[1] = 0;
+ Rfu.errorState = 1;
+ return;
+ }
+
+ gUnknown_203F3DC = AllocZeroed(sizeof(*gUnknown_203F3DC));
+ if (!gUnknown_203F3DC)
+ {
+ SetMainCallback2(callback);
+ Rfu.linkman_param[0] = 0;
+ Rfu.linkman_param[1] = 0;
+ Rfu.errorState = 1;
+ return;
+ }
+
+ gUnknown_203F3DC->unk0 = callback;
+ gUnknown_203F3DC->unk8 = multiplayerId;
+ gUnknown_203F3DC->unk9 = playerCount;
+ sub_814BABC(gUnknown_203F3DC);
+ gUnknown_203F3DC->unk12 = 1;
+ gUnknown_203F3DC->unkE = 1;
+ gUnknown_203F3DC->unkF = 6;
+ sub_814D564(gUnknown_203F3DC->unk36, 1, -1, 0, 16, 0, 0);
+ sub_814BB4C(4, 1, gUnknown_203F3DC->unk36);
+ SetMainCallback2(sub_814BA80);
+ gUnknown_203F3DC->unkA = CreateTask(sub_814BA98, 8);
+}
+
+static void sub_814B860(void)
+{
+ if (gSpecialVar_ItemId < FIRST_BERRY_INDEX || gSpecialVar_ItemId > LAST_BERRY_INDEX + 1)
+ gSpecialVar_ItemId = ITEM_CHERI_BERRY;
+ else
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+
+ gUnknown_203F3DC->unk68.as_four_players.others[gUnknown_203F3DC->unk8].unk0 = gSpecialVar_ItemId - FIRST_BERRY_INDEX;
+ gUnknown_203F3DC->unkE = 1;
+ gUnknown_203F3DC->unkF = 9;
+ sub_814D564(gUnknown_203F3DC->unk36, 0, -1, 0, 16, 0, 0);
+ sub_814BB4C(4, 1, gUnknown_203F3DC->unk36);
+ gUnknown_203F3DC->unkA = CreateTask(sub_814BA98, 8);
+ SetMainCallback2(sub_814BA80);
+}
+
+void sub_814B8F0(void)
+{
+ DestroyTask(gUnknown_203F3DC->unkA);
+ InitBerryPouch(BERRYPOUCH_FROMBERRYCRUSH, sub_814B860, FALSE);
+}
+
+void sub_814B914(void)
+{
+ SetVBlankCallback(sub_814BA6C);
+}
+
+void sub_814B924(void)
+{
+ SetVBlankCallback(NULL);
+}
+
+void sub_814B930(void)
+{
+ u32 var0, var1;
+
+ var0 = gUnknown_203F3DC->unk68.as_four_players.unk00.unk04;
+ var0 <<= 8;
+ var0 = sub_80D8B68(var0, 60 << 8);
+ var1 = gUnknown_203F3DC->unk68.as_four_players.unk00.unk0A;
+ var1 <<= 8;
+ var1 = sub_80D8B68(var1, var0) & 0xFFFF;
+ gUnknown_203F3DC->unk16 = var1;
+ switch (gUnknown_203F3DC->unk9)
+ {
+ case 2:
+ if (gUnknown_203F3DC->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[0])
+ {
+ gUnknown_203F3DC->unk25_1 = 1;
+ gSaveBlock2Ptr->berryCrush.berryCrushResults[0] = gUnknown_203F3DC->unk16;
+ }
+ break;
+ case 3:
+ if (gUnknown_203F3DC->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[1])
+ {
+ gUnknown_203F3DC->unk25_1 = 1;
+ gSaveBlock2Ptr->berryCrush.berryCrushResults[1] = gUnknown_203F3DC->unk16;
+ }
+ break;
+ case 4:
+ if (gUnknown_203F3DC->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[2])
+ {
+ gUnknown_203F3DC->unk25_1 = 1;
+ gSaveBlock2Ptr->berryCrush.berryCrushResults[2] = gUnknown_203F3DC->unk16;
+ }
+ break;
+ case 5:
+ if (gUnknown_203F3DC->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[3])
+ {
+ gUnknown_203F3DC->unk25_1 = 1;
+ gSaveBlock2Ptr->berryCrush.berryCrushResults[3] = gUnknown_203F3DC->unk16;
+ }
+ break;
+ }
+
+ gUnknown_203F3DC->unk1C = gUnknown_203F3DC->unk68.as_four_players.unk00.unk00;
+ if (GiveBerryPowder(gUnknown_203F3DC->unk1C))
+ return;
+
+ gUnknown_203F3DC->unk25_0 = 1;
+}
+
+static void sub_814BA6C(void)
+{
+ TransferPlttBuffer();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+}
+
+static void sub_814BA80(void)
+{
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+static void sub_814BA98(u8 taskId)
+{
+ if (gUnknown_203F3DC->unk4)
+ gUnknown_203F3DC->unk4(gUnknown_203F3DC, gUnknown_203F3DC->unk36);
+
+ sub_814D9CC(gUnknown_203F3DC);
+}
+
+#define PLAYER_UNK14(game, i) \
+ ((u8 *)(game) \
+ + offsetof(struct BerryCrushGame, unk68) \
+ + offsetof(struct BerryCrushGame_68_x, unk30) \
+ + sizeof(struct BerryCrushGame_Player) * (i))
+
+void sub_814BABC(struct BerryCrushGame *arg0)
+{
+ u8 i;
+
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ StringCopy(PLAYER_UNK14(arg0, i), gLinkPlayers[i].name);
+ arg0->unk68.as_five_players.unk1C[i].unk14[PLAYER_NAME_LENGTH] = EOS;
+ }
+ for (; i < 5; i++)
+ {
+ memset(PLAYER_UNK14(arg0, i), 1, PLAYER_NAME_LENGTH);
+ arg0->unk68.as_five_players.unk1C[i].unk14[PLAYER_NAME_LENGTH] = EOS;
+ }
+
+ switch (gSaveBlock2Ptr->optionsTextSpeed)
+ {
+ case OPTIONS_TEXT_SPEED_SLOW:
+ arg0->unkB = 8;
+ break;
+ case OPTIONS_TEXT_SPEED_MID:
+ arg0->unkB = 4;
+ break;
+ case OPTIONS_TEXT_SPEED_FAST:
+ arg0->unkB = 1;
+ break;
+ }
+}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index af88aba94..d4a46e69d 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -447,10 +447,10 @@ gUnknown_203B170: @ 203B170
.include "src/pokemon_jump_2.o"
.align 2
.include "src/pokemon_jump_4.o"
+ .align 2
+ .include "src/berry_crush.o"
-gUnknown_203F3DC: @ 203F3DC
- .space 0x4
-
+ .align 2
gUnknown_203F3E0: @ 203F3E0
.space 0x4