summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/berry_crush.c228
-rw-r--r--src/berry_crush_2.c1480
-rw-r--r--src/berry_crush_3.c1824
-rw-r--r--src/digit_obj_util.c16
-rw-r--r--src/dodrio_berry_picking.c122
-rw-r--r--src/pokemon_jump_4.c2
6 files changed, 3665 insertions, 7 deletions
diff --git a/src/berry_crush.c b/src/berry_crush.c
new file mode 100644
index 000000000..e59cad21a
--- /dev/null
+++ b/src/berry_crush.c
@@ -0,0 +1,228 @@
+#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;
+
+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);
+}
+
+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/src/berry_crush_2.c b/src/berry_crush_2.c
new file mode 100644
index 000000000..e76f33988
--- /dev/null
+++ b/src/berry_crush_2.c
@@ -0,0 +1,1480 @@
+#include "global.h"
+#include "gflib.h"
+#include "berry.h"
+#include "berry_crush.h"
+#include "berry_powder.h"
+#include "item.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "math_util.h"
+#include "menu.h"
+#include "minigame_countdown.h"
+#include "new_menu_helpers.h"
+#include "overworld.h"
+#include "random.h"
+#include "save.h"
+#include "strings.h"
+#include "constants/songs.h"
+
+static u32 sub_814BBB8(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BC10(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BC74(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BD7C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BD9C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BDBC(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BE0C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BE64(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BE7C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BFD0(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814C118(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814C24C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814C850(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814C8F8(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814C990(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814CB20(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814CC0C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814CFA8(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D094(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D188(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D240(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D31C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D3A4(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D468(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D4C8(struct BerryCrushGame * berryCrushGame, u8 *params);
+void sub_814D4D8(struct BerryCrushGame * r4);
+void sub_814D5A4(u8 *r0, u32 r1, u32 r2, u32 r3, u32 r5);
+
+static const u8 gUnknown_846E2E0[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
+static const u8 gUnknown_846E2E8[] = {0x00, 0x01, 0x02, 0x03, 0x05, 0x00, 0x00, 0x00};
+
+static const s8 gUnknown_846E2F0[][7] = {
+ {0x04, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00},
+ {0x04, 0x02, 0x00, 0xff, 0x00, 0x00, 0x00},
+ {0x04, 0x02, 0x00, 0xfe, 0x00, 0x00, 0x00},
+ {0x06, 0x03, 0x01, 0xff, 0xfd, 0xff, 0x00},
+ {0x06, 0x04, 0x01, 0xfe, 0xfc, 0xfe, 0x00},
+};
+
+ALIGNED(4) const u8 gUnknown_846E314[][4] = {
+ {0x03, 0x02, 0x01, 0x00},
+ {0x03, 0x03, 0x01, 0x00},
+ {0x03, 0x03, 0x02, 0x00},
+ {0x03, 0x04, 0x02, 0x00},
+ {0x03, 0x05, 0x03, 0x00}
+};
+
+static const u8 *const gUnknown_846E328[] = {
+ gUnknown_841CE3C,
+ gUnknown_841CE78,
+ gUnknown_841CEA8,
+ gUnknown_841CF14,
+ gUnknown_841CF50,
+ gUnknown_841CF70,
+ gUnknown_841CFA0,
+ gUnknown_841CFD4,
+ gUnknown_841D008
+};
+
+static u32 (*const gUnknown_846E34C[])(struct BerryCrushGame * berryCrushGame, u8 *params) = {
+ NULL,
+ sub_814BBB8,
+ sub_814BC10,
+ sub_814BC74,
+ sub_814BD7C,
+ sub_814BD9C,
+ sub_814BDBC,
+ sub_814BE0C,
+ sub_814BE64,
+ sub_814BE7C,
+ sub_814BFD0,
+ sub_814C118,
+ sub_814C24C,
+ sub_814C850,
+ sub_814C8F8,
+ sub_814C990,
+ sub_814CB20,
+ sub_814CC0C,
+ sub_814CFA8,
+ sub_814D094,
+ sub_814D188,
+ sub_814D240,
+ sub_814D31C,
+ sub_814D3A4,
+ sub_814D468,
+ sub_814D4C8
+};
+
+static const u8 gUnknown_846E3B4[][4] = {
+ {0x02, 0x04, 0x06, 0x07},
+ {0x03, 0x05, 0x08, 0x0b},
+ {0x03, 0x07, 0x0b, 0x0f},
+ {0x04, 0x08, 0x0c, 0x11}
+};
+
+static const u8 gUnknown_846E3C4[] = {0x05, 0x07, 0x09, 0x0c};
+
+static const u8 gUnknown_846E3C8[] = {0x03, 0x07, 0x0F, 0x1F};
+
+void sub_814BB4C(u16 r5, u8 r4, u8 *r7)
+{
+ struct BerryCrushGame * r6 = sub_814B6F0();
+
+ if (r5 > 25)
+ r5 = 0;
+ switch (r4)
+ {
+ case 0:
+ if (r5 != 0)
+ gUnknown_846E34C[r5](r6, r7);
+ if (r6->unkE > 25)
+ r6->unkE = r4;
+ r6->unk4 = gUnknown_846E34C[r6->unkE];
+ break;
+ case 1:
+ r6->unk4 = gUnknown_846E34C[r5];
+ break;
+ }
+}
+
+static u32 sub_814BBB8(struct BerryCrushGame * r6, u8 *r1)
+{
+ u16 r4;
+ u32 r0;
+#ifndef NONMATCHING // fake match, nobody can write such code
+ register u32 r2 asm("r2");
+ register u32 r3 asm("r3");
+
+ r2 = r1[0];
+ r3 = r1[1];
+ r3 <<= 8;
+ r2 |= r3;
+ r3 = r1[2];
+ r3 <<= 16;
+ r2 |= r3;
+ r3 = r1[3];
+ r3 <<= 24;
+ r0 = r2;
+ r0 |= r3;
+#else
+ u32 r2;
+
+ r0 = T1_READ_32(r1);
+#endif
+ r2 = r1[9];
+ r1[0] = r2;
+ r4 = r1[8] << 8;
+ r2 = r1[7];
+ r4 |= r2;
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ BeginNormalPaletteFade(r0, r1[4], r1[5], r1[6], r4);
+ UpdatePaletteFade();
+ r6->unkE = 2;
+ return 0;
+}
+
+static u32 sub_814BC10(struct BerryCrushGame * r4, u8 *r5)
+{
+ switch (r4->unkC)
+ {
+ case 0:
+ if (UpdatePaletteFade())
+ return 0;
+ if(r5[0] != 0)
+ ++r4->unkC;
+ else
+ r4->unkC = 3;
+ return 0;
+ case 1:
+ LinkRfu_SetRfuFuncToSend6600();
+ ++r4->unkC;
+ return 0;
+ case 2:
+ if (IsLinkTaskFinished())
+ {
+ ++r4->unkC;
+ return 0;
+ }
+ return 0;
+ case 3:
+ sub_814BB4C(r4->unkF, 1, NULL);
+ r4->unkC = 0;
+ return 0;
+ default:
+ ++r4->unkC;
+ return 0;
+ }
+}
+
+static u32 sub_814BC74(struct BerryCrushGame * r7, u8 *r5)
+{
+ u16 r4 = r5[3];
+
+ r4 <<= 8;
+ r4 |= r5[2];
+ switch (r7->unkC)
+ {
+ case 0:
+ DrawDialogueFrame(0, 0);
+ if (r5[1] & 2)
+ {
+ StringExpandPlaceholders(gStringVar4, gUnknown_846E328[r5[0]]);
+ AddTextPrinterParameterized2(0, 2, gStringVar4, r7->unkB, 0, 2, 1, 3);
+ }
+ else
+ {
+ AddTextPrinterParameterized2(0, 2, gUnknown_846E328[r5[0]], r7->unkB, 0, 2, 1, 3);
+ }
+ CopyWindowToVram(0, 3);
+ break;
+ case 1:
+ if (!IsTextPrinterActive(0))
+ {
+ if (r4 == 0)
+ ++r7->unkC;
+ break;
+ }
+ return 0;
+ case 2:
+ if (!(r4 & gMain.newKeys))
+ return 0;
+ break;
+ case 3:
+ if (r5[1] & 1)
+ ClearDialogWindowAndFrame(0, TRUE);
+ sub_814BB4C(r7->unkE, 1, NULL);
+ r7->unkC = r5[4];
+ return 0;
+ }
+ ++r7->unkC;
+ return 0;
+}
+
+static u32 sub_814BD7C(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ if (sub_814D5C8() != 0)
+ sub_814BB4C(r4->unkE, 0, r4->unk36);
+ return 0;
+}
+
+static u32 sub_814BD9C(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ if (sub_814D888() != 0)
+ sub_814BB4C(r4->unkE, 0, r4->unk36);
+ return 0;
+}
+
+static u32 sub_814BDBC(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ switch (r4->unkC)
+ {
+ case 0:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 1:
+ if (IsLinkTaskFinished())
+ {
+ PlayNewMapMusic(MUS_SLOT);
+ sub_814BB4C(7, 1, NULL);
+ r4->unk12 = 3;
+ r4->unkC = 0;
+ }
+ return 0;
+ }
+ ++r4->unkC;
+ return 0;
+}
+
+static u32 sub_814BE0C(struct BerryCrushGame * r4, u8 *r5)
+{
+ switch (r4->unkC)
+ {
+ default:
+ ++r4->unkC;
+ break;
+ case 0:
+ sub_814D4D8(r4);
+ sub_814D5A4(r5, 0, 1, 0, 1);
+ r4->unkE = 7;
+ sub_814BB4C(3, 1, NULL);
+ break;
+ case 1:
+ r4->unkE = 8;
+ sub_814BB4C(5, 1, NULL);
+ r4->unkC = 2;
+ break;
+ }
+ return 0;
+}
+
+static u32 sub_814BE64(struct BerryCrushGame * r0, UNUSED u8 *r1)
+{
+ r0->unk4 = NULL;
+ SetMainCallback2(sub_814B8F0);
+ return 0;
+}
+
+static u32 sub_814BE7C(struct BerryCrushGame * r5, u8 *r2)
+{
+ u8 r3;
+
+ switch (r5->unkC)
+ {
+ case 0:
+ sub_814D5A4(r2, 1, 0, 0, 1);
+ r5->unkE = 9;
+ sub_814BB4C(3, 1, NULL);
+ return 0;
+ case 1:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 2:
+ if (!IsLinkTaskFinished())
+ return 0;
+ memset(r5->unk40.unk2, 0, sizeof(r5->unk40.unk2));
+ r5->unk40.unk2[0] = r5->unk68.as_four_players.others[r5->unk8].unk0;
+ SendBlock(0, r5->unk40.unk2, 2);
+ break;
+ case 3:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r5->unk10 = 0;
+ break;
+ case 4:
+ if (GetBlockReceivedStatus() != gUnknown_846E3C8[r5->unk9 - 2])
+ return 0;
+ for (r3 = 0; r3 < r5->unk9; ++r3)
+ {
+ r5->unk68.as_four_players.others[r3].unk0 = gBlockRecvBuffer[r3][0];
+ if (r5->unk68.as_four_players.others[r3].unk0 > 0xB0)
+ r5->unk68.as_four_players.others[r3].unk0 = 0;
+ r5->unk18 += gUnknown_83DFC9C[r5->unk68.as_four_players.others[r3].unk0].unk0;
+ r5->unk1C += gUnknown_83DFC9C[r5->unk68.as_four_players.others[r3].unk0].unk1;
+ }
+ r5->unk10 = 0;
+ ResetBlockReceivedFlags();
+ r5->unk20 = sub_80D8B68(r5->unk18 << 8, 0x2000);
+ break;
+ case 5:
+ ClearDialogWindowAndFrame(0, 1);
+ sub_814BB4C(10, 1, NULL);
+ r5->unk12 = 4;
+ r5->unkC = 0;
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814BFD0(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ switch (r4->unkC)
+ {
+ case 0:
+ sub_814DA24(r4, &r4->unk138);
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 1:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r4->unk138.unk0 = 0;
+ r4->unk138.unk1 = 0;
+ r4->unk138.unk2 = 0;
+ r4->unk138.unk3 = 0;
+ break;
+ case 2:
+ r4->unk138.unk38[r4->unk138.unk0]->callback = sub_814DB84;
+ r4->unk138.unk38[r4->unk138.unk0]->affineAnimPaused = FALSE;
+ PlaySE(SE_NAGERU);
+ break;
+ case 3:
+ if (r4->unk138.unk38[r4->unk138.unk0]->callback == sub_814DB84)
+ return 0;
+ r4->unk138.unk38[r4->unk138.unk0] = NULL;
+ ++r4->unk138.unk0;
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 4:
+ if (!IsLinkTaskFinished())
+ return 0;
+ if (r4->unk138.unk0 < r4->unk9)
+ {
+ r4->unkC = 2;
+ return 0;
+ }
+ r4->unk138.unk0 = 0;
+ break;
+ case 5:
+ sub_814DC24(r4, &r4->unk138);
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 6:
+ if (!IsLinkTaskFinished())
+ return 0;
+ PlaySE(SE_RU_HYUU);
+ sub_814BB4C(11, 1, NULL);
+ r4->unk12 = 5;
+ r4->unkC = 0;
+ return 0;
+ }
+ ++r4->unkC;
+ return 0;
+}
+
+static u32 sub_814C118(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ switch (r4->unkC)
+ {
+ case 0:
+ r4->unk2A += 4;
+ if (r4->unk2A < 0)
+ return 0;
+ r4->unk2A = 0;
+ r4->unk138.unk1 = 4;
+ r4->unk138.unk0 = 0;
+ r4->unk138.unk2 = gUnknown_846E2F0[r4->unk138.unk1][0];
+ PlaySE(SE_W070);
+ break;
+ case 1:
+ r4->unk2C = gUnknown_846E2F0[r4->unk138.unk1][r4->unk138.unk0];
+ SetGpuReg(REG_OFFSET_BG0VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG2VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG3VOFS, -r4->unk2C);
+ ++r4->unk138.unk0;
+ if (r4->unk138.unk0 < r4->unk138.unk2)
+ return 0;
+ if (r4->unk138.unk1 == 0)
+ break;
+ --r4->unk138.unk1;
+ r4->unk138.unk2 = gUnknown_846E2F0[r4->unk138.unk1][0];
+ r4->unk138.unk0 = 0;
+ return 0;
+ case 2:
+ r4->unk2C = 0;
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 3:
+ if (!IsLinkTaskFinished())
+ return 0;
+ sub_814BB4C(12, 1, NULL);
+ r4->unk12 = 6;
+ r4->unkC = 0;
+ return 0;
+ }
+ ++r4->unkC;
+ return 0;
+}
+
+static u32 sub_814C24C(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ switch (r4-> unkC)
+ {
+ case 1:
+ if (!IsLinkTaskFinished())
+ return 0;
+ StartMinigameCountdown(0x1000, 0x1000, 120, 80, 0);
+ break;
+ case 2:
+ if (IsMinigameCountdownRunning())
+ return 0;
+ // fallthrough
+ case 0:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 3:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r4->unk138.unk0 = 0;
+ r4->unk138.unk1 = 0;
+ r4->unk138.unk2 = 0;
+ r4->unk138.unk3 = 0;
+ r4->unk10 = 0;
+ if (r4->unk8 == 0)
+ sub_814BB4C(13, 1, NULL);
+ else
+ sub_814BB4C(14, 1, NULL);
+ r4->unk12 = 7;
+ r4->unkC = 0;
+ return 0;
+ }
+ ++r4->unkC;
+ return 0;
+}
+
+void sub_814C2FC(struct BerryCrushGame * r4)
+{
+ u8 r8 = 0;
+ u16 r3;
+ u16 *r2;
+ u8 r7 = 0;
+ s32 r2_ = 0;
+ s32 r0;
+
+ for (r7 = 0; r7 < r4->unk9; ++r7)
+ {
+ r2 = gRecvCmds[r7];
+ if ((r2[0] & 0xFF00) == 0x2F00
+ && r2[1] == 2)
+ {
+ if ((u8)r2[2] & 4)
+ {
+ r4->unk5C.unk02_3 |= gUnknown_846E2E0[r7];
+ r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][5] = 1;
+ ++r4->unk68.as_four_players.others[r7].unk4.as_hwords[3];
+ ++r8;
+ r3 = r4->unk28 - r4->unk68.as_four_players.others[r7].unk2;
+ if (r3 >= r4->unk68.as_four_players.others[r7].unk4.as_hwords[1] - 1
+ && r3 <= r4->unk68.as_four_players.others[r7].unk4.as_hwords[1] + 1)
+ {
+ ++r4->unk68.as_four_players.others[r7].unk4.as_hwords[0];
+ r4->unk68.as_four_players.others[r7].unk4.as_hwords[1] = r3;
+ if (r4->unk68.as_four_players.others[r7].unk4.as_hwords[0] > r4->unk68.as_four_players.others[r7].unk4.as_hwords[2])
+ r4->unk68.as_four_players.others[r7].unk4.as_hwords[2] = r4->unk68.as_four_players.others[r7].unk4.as_hwords[0];
+ }
+ else
+ {
+ r4->unk68.as_four_players.others[r7].unk4.as_hwords[0] = 0;
+ r4->unk68.as_four_players.others[r7].unk4.as_hwords[1] = r3;
+ }
+ r4->unk68.as_four_players.others[r7].unk2 = r4->unk28;
+ if (++r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][4] > 2)
+ r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][4] = 0;
+ }
+ else
+ {
+ r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][5] = 0;
+ }
+ }
+ }
+ if (r8 > 1)
+ {
+ for (r7 = 0; r7 < r4->unk9; ++r7)
+ {
+ if (r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][5] != 0)
+ {
+ r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][5] |= 2;
+ ++r4->unk68.as_four_players.others[r7].unk4.as_hwords[4];
+ }
+ }
+ }
+ if (r8 != 0)
+ {
+ r4->unk2E += r8;
+ r8 += gUnknown_846E2E8[r8 - 1];
+ r4->unk34 += r8;
+ r4->unk1A += r8;
+ r0 = r4->unk18;
+ r2_ = r4->unk1A;
+ if (r0 - r2_ > 0)
+ {
+ r2_ <<= 8;
+ r2_ = sub_80D8B68(r2_, r4->unk20);
+ r2_ >>= 8;
+ r4->unk24 = r2_;
+ }
+ else
+ {
+ r4->unk24 = 32;
+ r4->unk5C.unk02_0 = 1;
+ }
+ }
+}
+
+void sub_814C4B8(struct BerryCrushGame * r3)
+{
+ u8 r6 = 0;
+ u16 r1 = 0;
+ u8 r4 = 0;
+
+ for (r4 = 0; r4 < r3->unk9; ++r4)
+ {
+ if (r3->unk68.as_four_players.others[r4].unk4.as_2d_bytes[1][5] != 0)
+ {
+ ++r6;
+ r1 = r3->unk68.as_four_players.others[r4].unk4.as_2d_bytes[1][4] + 1;
+ if (r3->unk68.as_four_players.others[r4].unk4.as_2d_bytes[1][5] & 2)
+ r1 |= 4;
+ r1 <<= 3 * r4;
+ r3->unk5C.unk08 |= r1;
+ }
+ }
+ r3->unk5C.unk04 = r3->unk24;
+ if (r6 == 0)
+ {
+ if (r3->unk138.unk3 != 0)
+ ++r3->unk138.unk0;
+ else
+ goto SET_UNK5F_0;
+ }
+ else
+ {
+ if (r3->unk138.unk3 != 0)
+ {
+ if (r6 != r3->unk138.unk1)
+ {
+ r3->unk138.unk1 = r6 - 1;
+ r3->unk138.unk2 = gUnknown_846E314[r6 - 1][0];
+ }
+ else
+ {
+ ++r3->unk138.unk0;
+ }
+ }
+ else
+ {
+ r3->unk138.unk0 = 0;
+ r3->unk138.unk1 = r6 - 1;
+ r3->unk138.unk2 = gUnknown_846E314[r6 - 1][0];
+ r3->unk138.unk3 = 1;
+ }
+ }
+ if (r3->unk138.unk3 != 0)
+ {
+ if (r3->unk138.unk0 >= r3->unk138.unk2)
+ {
+ r3->unk138.unk0 = 0;
+ r3->unk138.unk1 = 0;
+ r3->unk138.unk2 = 0;
+ r3->unk138.unk3 = 0;
+ r1 = 0;
+ }
+ else
+ {
+ r1 = gUnknown_846E314[r3->unk138.unk1][r3->unk138.unk0 + 1];
+ }
+ r3->unk5C.unk03 = r1;
+ }
+ else
+ {
+ SET_UNK5F_0:
+ r3->unk5C.unk03 = 0;
+ }
+ r3->unk5C.unk06 = r3->unk26;
+}
+
+void sub_814C618(struct BerryCrushGame * r5)
+{
+ if (gMain.newKeys & A_BUTTON)
+ r5->unk5C.unk02_2 = 1;
+ if (gMain.heldKeys & A_BUTTON)
+ {
+ if (r5->unk68.as_four_players.others[r5->unk8].unk4.as_hwords[5] < r5->unk28)
+ ++r5->unk68.as_four_players.others[r5->unk8].unk4.as_hwords[5];
+ }
+ if (r5->unk8 != 0 && r5->unk5C.unk02_2 == 0)
+ return;
+ r5->unk5C.unk00 = 2;
+ if (r5->unk28 % 30 == 0)
+ {
+ if (r5->unk2E > gUnknown_846E3C4[r5->unk9 - 2])
+ {
+ ++r5->unk30;
+ r5->unk25_4 = 1;
+ }
+ else
+ {
+ r5->unk25_4 = 0;
+ }
+ r5->unk2E = 0;
+ ++r5->unk32;
+ }
+ if (r5->unk28 % 15 == 0)
+ {
+ if (r5->unk34 < gUnknown_846E3B4[r5->unk9 - 2][0])
+ r5->unk25_5 = 0;
+ else if (r5->unk34 < gUnknown_846E3B4[r5->unk9 - 2][1])
+ r5->unk25_5 = 1;
+ else if (r5->unk34 < gUnknown_846E3B4[r5->unk9 - 2][2])
+ r5->unk34 = 2; // typo since r5->unk34 will be reset?
+ else if (r5->unk34 < gUnknown_846E3B4[r5->unk9 - 2][3])
+ r5->unk34 = 3; // typo since r5->unk34 will be reset?
+ else
+ r5->unk25_5 = 4;
+ r5->unk34 = 0;
+ }
+ else
+ {
+ ++r5->unk10;
+ if (r5->unk10 > 60)
+ {
+ if (r5->unk10 > 70)
+ {
+ sub_80FBA44();
+ r5->unk10 = 0;
+ }
+ else if (r5->unk5C.unk02_3 == 0)
+ {
+ sub_80FBA44();
+ r5->unk10 = 0;
+ }
+ }
+
+ }
+ if (r5->unk28 >= 36000)
+ r5->unk5C.unk02_0 = 1;
+ r5->unk5C.unk02_1 = r5->unk25_4;
+ r5->unk5C.unk0A = r5->unk25_5;
+ memcpy(r5->unk40.unk2, &r5->unk5C, sizeof(r5->unk40.unk2));
+ RfuPrepareSend0x2f00(r5->unk40.unk2);
+}
+
+void sub_814C7BC(struct BerryCrushGame * r5)
+{
+ struct BerryCrushGame_4E * r4_;
+#ifndef NONMATCHING
+ register u32 r4 asm("r4");
+ register u32 r0 asm("r0");
+
+ for (r4 = 0; r4 < r5->unk9; r4 = (u8)r0)
+ {
+ r5->unk68.as_four_players.others[r4].unk4.as_2d_bytes[1][5] = 0;
+ r0 = r4 + 1;
+ }
+#else
+ u8 r4;
+
+ for (r4 = 0; r4 < r5->unk9; ++r4)
+ r5->unk68.as_four_players.others[r4].unk4.as_2d_bytes[1][5] = 0;
+#endif
+ if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00
+ || gRecvCmds[0][1] != 2)
+ {
+ r5->unk25_2 = 0;
+ }
+ else
+ {
+ r4_ = &r5->unk40.unkE;
+ memcpy(r4_, gRecvCmds, sizeof(struct BerryCrushGame_4E));
+ r5->unk2A = r4_->unk6;
+ r5->unk2C = r4_->unk5;
+ r5->unk28 = r4_->unk8;
+ sub_814DC5C(r5, &r5->unk138);
+ if (r4_->unk4_0)
+ r5->unk25_3 = 1;
+ }
+}
+
+static u32 sub_814C850(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ memset(&r4->unk5C, 0, sizeof(r4->unk5C));
+ memset(&r4->unk40.unkE, 0, sizeof(r4->unk40.unkE));
+ sub_814C7BC(r4);
+ SetGpuReg(REG_OFFSET_BG0VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG2VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG3VOFS, -r4->unk2C);
+ if (r4->unk25_3)
+ {
+ if (r4->unk28 >= 36000)
+ {
+ r4->unk28 = 36000;
+ sub_814BB4C(16, 1, NULL);
+ }
+ else
+ {
+ sub_814BB4C(15, 1, NULL);
+ }
+ r4->unk10 = 0;
+ r4->unkC = 0;
+ return 0;
+ }
+ else
+ {
+ ++r4->unk26;
+ sub_814C2FC(r4);
+ sub_814C4B8(r4);
+ sub_814C618(r4);
+ return 0;
+ }
+}
+
+static u32 sub_814C8F8(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ memset(&r4->unk5C, 0, sizeof(r4->unk5C));
+ memset(&r4->unk40.unkE, 0, sizeof(r4->unk40.unkE));
+ sub_814C7BC(r4);
+ SetGpuReg(REG_OFFSET_BG0VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG2VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG3VOFS, -r4->unk2C);
+ if (r4->unk25_3)
+ {
+ if (r4->unk28 >= 36000)
+ {
+ r4->unk28 = 36000;
+ sub_814BB4C(16, 1, NULL);
+ }
+ else
+ {
+ sub_814BB4C(15, 1, NULL);
+ }
+ r4->unk10 = 0;
+ r4->unkC = 0;
+ return 0;
+ }
+ else
+ {
+ sub_814C618(r4);
+ return 0;
+ }
+}
+
+static u32 sub_814C990(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ switch (r4->unkC)
+ {
+ case 0:
+ r4->unk12 = 8;
+ PlaySE(SE_W070);
+ BlendPalettes(0xFFFFFFFF, 8, RGB(31, 31, 0));
+ r4->unk138.unk0 = 2;
+ break;
+ case 1:
+ if (--r4->unk138.unk0 != 255)
+ return 0;
+ BlendPalettes(0xFFFFFFFF, 0, RGB(31, 31, 0));
+ r4->unk138.unk1 = 4;
+ r4->unk138.unk0 = 0;
+ r4->unk138.unk2 = gUnknown_846E2F0[r4->unk138.unk1][0];
+ break;
+ case 2:
+ r4->unk2C = gUnknown_846E2F0[r4->unk138.unk1][r4->unk138.unk0];
+ SetGpuReg(REG_OFFSET_BG0VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG2VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG3VOFS, -r4->unk2C);
+ if (++r4->unk138.unk0 < r4->unk138.unk2)
+ return 0;
+ if (r4->unk138.unk1 != 0)
+ {
+ --r4->unk138.unk1;
+ r4->unk138.unk2 = gUnknown_846E2F0[r4->unk138.unk1][0];
+ r4->unk138.unk0 = 0;
+ return 0;
+ }
+ break;
+ case 3:
+ r4->unk2C = 0;
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ break;
+ case 4:
+ if (!sub_814DE50(r4, &r4->unk138))
+ return 0;
+ LinkRfu_SetRfuFuncToSend6600();
+ r4->unk10 = 0;
+ break;
+ case 5:
+ if (!IsLinkTaskFinished())
+ return 0;
+ sub_814BB4C(17, 1, NULL);
+ r4->unk10 = 0;
+ r4->unkC = 0;
+ return 0;
+ }
+ ++r4->unkC;
+ return 0;
+}
+
+static u32 sub_814CB20(struct BerryCrushGame * r5, u8 *r6)
+{
+ switch (r5->unkC)
+ {
+ case 0:
+ r5->unk12 = 9;
+ PlaySE(SE_HAZURE);
+ BlendPalettes(0xFFFFFFFF, 8, RGB(31, 0, 0));
+ r5->unk138.unk0 = 4;
+ break;
+ case 1:
+ if (--r5->unk138.unk0 != 255)
+ return 0;
+ BlendPalettes(0xFFFFFFFF, 0, RGB(31, 0, 0));
+ r5->unk138.unk0 = 0;
+ break;
+ case 2:
+ if (!sub_814DE50(r5, &r5->unk138))
+ return 0;
+ LinkRfu_SetRfuFuncToSend6600();
+ r5->unk10 = 0;
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ break;
+ case 3:
+ if (!IsLinkTaskFinished())
+ return 0;
+ ConvertIntToDecimalStringN(gStringVar1, r5->unk1C, STR_CONV_MODE_LEFT_ALIGN, 6);
+ sub_814D5A4(r6, 7, 1, 0, 0);
+ r5->unkE = 19;
+ sub_814BB4C(3, 1, NULL);
+ r5->unk10 = 0;
+ r5->unkC = 0;
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814CC0C(struct BerryCrushGame * r7, UNUSED u8 *r1)
+{
+ u8 r8, r4_;
+ s32 r2;
+ s32 r4;
+ u8 r6; // ???
+
+ switch (r7->unkC)
+ {
+ case 0:
+ memset(r7->unk40.unk2, 0, 2 * sizeof(u16));
+ if (r7->unk68.as_four_players.others[r7->unk8].unk4.as_hwords[5] > r7->unk28)
+ r7->unk68.as_four_players.others[r7->unk8].unk4.as_hwords[5] = r7->unk28;
+ r7->unk40.unk2[0] = r7->unk68.as_four_players.others[r7->unk8].unk4.as_hwords[5];
+ SendBlock(0, r7->unk40.unk2, 2);
+ break;
+ case 1:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r7->unk10 = 0;
+ break;
+ case 2:
+ if (GetBlockReceivedStatus() != gUnknown_846E3C8[r7->unk9 - 2])
+ return 0;
+ for (r8 = 0; r8 < r7->unk9; ++r8)
+ r7->unk68.as_four_players.others[r8].unk4.as_hwords[5] = gBlockRecvBuffer[r8][0];
+ r7->unk10 = 0;
+ r7->unk40.unk2[0] = 0;
+ ResetBlockReceivedFlags();
+ if (r7->unk8 == 0)
+ r7->unkC = 3;
+ else
+ r7->unkC = 6;
+ return 0;
+ case 3:
+ memset(
+ &r7->unk68,
+ 0,
+ sizeof(struct BerryCrushGame_68_x_SubStruct)
+ );
+ r7->unk68.as_four_players.unk00.unk04 = r7->unk28;
+ r7->unk68.as_four_players.unk00.unk06 = r7->unk18 / (r7->unk28 / 60);
+ r2 = sub_80D8AE0(r7->unk30 << 8, 0x3200);
+ r2 = sub_80D8B68(r2, r7->unk32 << 8) + 0x3200;
+ r2 >>= 8;
+ r7->unk68.as_four_players.unk00.unk08 = r2 & 0x7F;
+ r2 <<= 8;
+ r2 = sub_80D8B68(r2, 0x6400);
+ r4 = (r7->unk1C * r7->unk9) << 8;
+ r4 = sub_80D8AE0(r4, r2);
+ r7->unk68.as_four_players.unk00.unk00 = r4 >> 8;
+ r7->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[0][7] = Random() % 3;
+ for (r6 = 0, r8 = 0; r8 < r7->unk9; ++r8)
+ {
+ r7->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[0][r8] = r8;
+ r7->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[1][r8] = r8;
+ r7->unk68.as_four_players.unk00.unk0C[0][r8] = r7->unk68.as_four_players.others[r8].unk4.as_hwords[3];
+ r7->unk68.as_four_players.unk00.unk0A += r7->unk68.as_four_players.unk00.unk0C[0][r8];
+ switch (r7->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[0][7])
+ {
+ case 0:
+ if (r7->unk68.as_four_players.others[r8].unk4.as_hwords[3] != 0)
+ {
+ r2 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[2];
+ r2 <<= 8;
+ r2 = sub_80D8AE0(r2, 0x6400);
+ r4 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[3];
+ r4 <<= 8;
+ r4 = sub_80D8B68(r2, r4);
+ }
+ else
+ {
+ r4 = 0;
+ }
+ break;
+ case 1:
+ if (r7->unk68.as_four_players.others[r8].unk4.as_hwords[3] != 0)
+ {
+ r2 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[4];
+ r2 <<= 8;
+ r2 = sub_80D8AE0(r2, 0x6400);
+ r4 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[3];
+ r4 <<= 8;
+ r4 = sub_80D8B68(r2, r4);
+ }
+ else
+ {
+ r4 = 0;
+ }
+ break;
+ case 2:
+ if (r7->unk68.as_four_players.others[r8].unk4.as_hwords[3] == 0)
+ {
+ r4 = 0;
+ }
+ else if (r7->unk68.as_four_players.others[r8].unk4.as_hwords[5] >= r7->unk28)
+ {
+ r4 = 0x6400;
+ }
+ else
+ {
+ r2 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[5];
+ r2 <<= 8;
+ r2 = sub_80D8AE0(r2, 0x6400);
+ r4 = r7->unk28;
+ r4 <<= 8;
+ r4 = sub_80D8B68(r2, r4);
+ }
+ break;
+ }
+ r4 >>= 4;
+ r7->unk68.as_four_players.unk00.unk0C[1][r8] = r4;
+ }
+ break;
+ case 4:
+ for (r6 = 0, r8 = 0; r8 < r7->unk9 - 1; ++r8)
+ {
+ for (r4_ = r7->unk9 - 1; r4_ > r8; --r4_)
+ {
+ u16 r0;
+ u8 r3;
+ u16 *sp00 = r7->unk68.as_four_players.unk00.unk0C[0];
+ u8 *sp04 = r7->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[0];
+ u8 *r10 = r7->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[1];
+ u16 *r9 = r7->unk68.as_four_players.unk00.unk0C[1];
+ s32 r12 = r4_ - 1;
+ u16 *p1 = sp00 + r12; // these have to be here
+ u16 *p2 = sp00 + r4_; // to swap operands. macro?
+
+ if (*p1 < *p2)
+ {
+ r0 = sp00[r4_];
+ sp00[r4_] = sp00[r12];
+ sp00[r12] = r0;
+ r3 = sp04[r4_];
+ sp04[r4_] = sp04[r12];
+ sp04[r12] = r3;
+ }
+ p1 = r9 + r12;
+ p2 = r9 + r4_;
+ if (*p1 < *p2)
+ {
+ r0 = r9[r4_];
+ r9[r4_] = r9[r12];
+ r9[r12] = r0;
+ r3 = r10[r4_];
+ r10[r4_] = r10[r12];
+ r10[r12] = r3;
+ }
+ }
+ }
+ SendBlock(
+ 0,
+ &r7->unk68,
+ sizeof(struct BerryCrushGame_68_x_SubStruct)
+ );
+ break;
+ case 5:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r7->unk10 = 0;
+ break;
+ case 6:
+ if (GetBlockReceivedStatus() != 1)
+ return 0;
+ memset(
+ &r7->unk68,
+ 0,
+ sizeof(struct BerryCrushGame_68_x_SubStruct)
+ );
+ memcpy(
+ &r7->unk68,
+ gBlockRecvBuffer,
+ sizeof(struct BerryCrushGame_68_x_SubStruct)
+ );
+ ResetBlockReceivedFlags();
+ r7->unk10 = 0;
+ break;
+ case 7:
+ sub_814B930();
+ sub_814BB4C(18, 1, NULL);
+ r7->unk12 = 11;
+ r7->unkC = 0;
+ r7->unk24 = 0;
+ return 0;
+ }
+ ++r7->unkC;
+ return 0;
+}
+
+static u32 sub_814CFA8(struct BerryCrushGame * r5, u8 *r6)
+{
+ switch (r5->unkC)
+ {
+ case 0:
+ if (!sub_814E644(r5, &r5->unk138))
+ return 0;
+ break;
+ case 1:
+ CopyBgTilemapBufferToVram(0);
+ r5->unk138.unk0 = 30;
+ break;
+ case 2:
+ if (r5->unk138.unk0 != 0)
+ {
+ --r5->unk138.unk0;
+ return 0;
+ }
+ if (!(gMain.newKeys & A_BUTTON))
+ return 0;
+ PlaySE(SE_SELECT);
+ sub_814E80C(r5);
+ break;
+ case 3:
+ if (r5->unk12 <= 12)
+ {
+ ++r5->unk12;
+ r5->unkC = 0;
+ return 0;
+ }
+ break;
+ case 4:
+ ConvertIntToDecimalStringN(gStringVar1, r5->unk1C, STR_CONV_MODE_LEFT_ALIGN, 6);
+ ConvertIntToDecimalStringN(gStringVar2, GetBerryPowder(), STR_CONV_MODE_LEFT_ALIGN, 6);
+ sub_814D5A4(r6, 2, 3, 0, 0);
+ r5->unkE = 19;
+ sub_814BB4C(3, 1, NULL);
+ r5->unkC = 0;
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814D094(struct BerryCrushGame * r5, u8 *r4)
+{
+ switch (r5->unkC)
+ {
+ case 0:
+ if (r5->unk28 >= 36000)
+ sub_814EB04(&r5->unk138);
+ sub_814D5A4(r4, 8, 0, 0, 1);
+ r5->unkE = 19;
+ sub_814BB4C(3, 1, NULL);
+ r5->unkC = 0;
+ return 0;
+ case 1:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 2:
+ if (!IsLinkTaskFinished())
+ return 0;
+ DrawDialogueFrame(0, 0);
+ AddTextPrinterParameterized2(0, 2, gText_SavingDontTurnOffThePower2, 0, 0, 2, 1, 3);
+ CopyWindowToVram(0, 3);
+ CreateTask(sub_80DA634, 0);
+ break;
+ case 3:
+ if (FuncIsActiveTask(sub_80DA634))
+ return 0;
+ break;
+ case 4:
+ sub_814BB4C(20, 1, NULL);
+ r5->unk12 = 15;
+ r5->unkC = 0;
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814D188(struct BerryCrushGame * r5, u8 *r6)
+{
+ s32 r4;
+#ifndef NONMATCHING
+ register s32 r0 asm("r0");
+#else
+ s32 r0;
+#endif
+
+ switch (r5->unkC)
+ {
+ case 0:
+ sub_814D5A4(r6, 4, 0, 0, 1);
+ r5->unkE = 20;
+ sub_814BB4C(3, 1, NULL);
+ r0 = 0;
+ r5->unkC = r0; // dunno what it's doing because it's already in case 0
+ return 0;
+ case 1:
+ DisplayYesNoMenuDefaultYes();
+ break;
+ case 2:
+ if ((r4 = Menu_ProcessInputNoWrapClearOnChoose()) != -2)
+ {
+ memset(r5->unk40.unk2, 0, sizeof(r5->unk40.unk2));
+ if (r4 == 0)
+ {
+ if (CheckHasAtLeastOneBerry())
+ r5->unk14 = 0;
+ else
+ r5->unk14 = 3;
+ }
+ else
+ {
+ r5->unk14 = 1;
+ }
+ ClearDialogWindowAndFrame(0, 1);
+ sub_814D5A4(r6, 8, 0, 0, 0);
+ r5->unkE = 21;
+ sub_814BB4C(3, 1, NULL);
+ r5->unkC = 0;
+ }
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814D240(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ u8 r5 = 0;
+
+ switch (r4->unkC)
+ {
+ case 0:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 1:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r4->unk40.unk2[0] = r4->unk14;
+ r4->unk40.unkE.unk0 = 0;
+ SendBlock(0, r4->unk40.unk2, sizeof(u16));
+ break;
+ case 2:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r4->unk10 = 0;
+ break;
+ case 3:
+ if (GetBlockReceivedStatus() != gUnknown_846E3C8[r4->unk9 - 2])
+ return 0;
+ for (; r5 < r4->unk9; ++r5)
+ r4->unk40.unkE.unk0 += gBlockRecvBuffer[r5][0];
+ if (r4->unk40.unkE.unk0 != 0)
+ sub_814BB4C(23, 1, NULL);
+ else
+ sub_814BB4C(22, 1, NULL);
+ ResetBlockReceivedFlags();
+ r4->unk40.unk2[0] = 0;
+ r4->unk40.unkE.unk0 = 0;
+ r4->unk10 = 0;
+ r4->unkC = 0;
+ return 0;
+ }
+ ++r4->unkC;
+ return 0;
+}
+
+static u32 sub_814D31C(struct BerryCrushGame * r5, UNUSED u8 *r1)
+{
+ switch (r5->unkC)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 1, 0, 0x10, RGB_BLACK);
+ UpdatePaletteFade();
+ break;
+ case 1:
+ if (UpdatePaletteFade())
+ return 0;
+ break;
+ case 2:
+ ClearDialogWindowAndFrame(0, 1);
+ sub_814DA04(r5);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
+ UpdatePaletteFade();
+ break;
+ case 3:
+ if (UpdatePaletteFade())
+ return 0;
+ sub_814BB4C(7, 1, NULL);
+ r5->unk12 = 3;
+ r5->unkC = 0;
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814D3A4(struct BerryCrushGame * r5, UNUSED u8 *r1)
+{
+ switch (r5->unkC)
+ {
+ case 0:
+ DrawDialogueFrame(0, 0);
+ if (r5->unk14 == 3)
+ AddTextPrinterParameterized2(0, 2, gUnknown_846E328[5], r5->unkB, 0, 2, 1, 3);
+ else
+ AddTextPrinterParameterized2(0, 2, gUnknown_846E328[6], r5->unkB, 0, 2, 1, 3);
+ CopyWindowToVram(0, 3);
+ break;
+ case 1:
+ if (IsTextPrinterActive(0))
+ return 0;
+ r5->unk138.unk0 = 120;
+ break;
+ case 2:
+ if (r5->unk138.unk0 != 0)
+ --r5->unk138.unk0;
+ else
+ {
+ sub_814BB4C(24, 1, NULL);
+ r5->unkC = 0;
+ }
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814D468(struct BerryCrushGame * r5, UNUSED u8 *r1)
+{
+ switch (r5->unkC)
+ {
+ case 0:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 1:
+ if (!IsLinkTaskFinished())
+ return 0;
+ Link_TryStartSend5FFF();
+ break;
+ case 2:
+ if (gReceivedRemoteLinkPlayers != 0)
+ return 0;
+ r5->unkE = 25;
+ sub_814BB4C(5, 1, NULL);
+ r5->unkC = 2; // ???
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814D4C8(UNUSED struct BerryCrushGame * r0, UNUSED u8 *r1)
+{
+ sub_814B6FC(NULL);
+ return 0;
+}
+
+void sub_814D4D8(struct BerryCrushGame * r4)
+{
+ u8 r5 = 0;
+
+ IncrementGameStat(GAME_STAT_BERRY_CRUSH_POINTS);
+ r4->unkD = 0;
+ r4->unk10 = 0;
+ r4->unk12 = 2;
+ r4->unk14 = 0;
+ r4->unk1C = 0;
+ r4->unk18 = 0;
+ r4->unk1A = 0;
+ r4->unk20 = 0;
+ r4->unk24 = 0;
+ r4->unk25_0 = 0;
+ r4->unk25_1 = 0;
+ r4->unk25_2 = 0;
+ r4->unk25_3 = 0;
+ r4->unk25_4 = 0;
+ r4->unk25_5 = 0;
+ r4->unk26 = 0;
+ r4->unk28 = 0;
+ r4->unk2E = 0;
+ r4->unk32 = -1;
+ r4->unk30 = 0;
+ r4->unk34 = 0;
+ for (; r5 < 5; ++r5) // why is it 5 instead of 4? fillerBC isn't sufficient for one player
+ {
+ r4->unk68.as_four_players.others[r5].unk0 = -1;
+ r4->unk68.as_four_players.others[r5].unk2 = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_hwords[0] = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_hwords[1] = 1;
+ r4->unk68.as_four_players.others[r5].unk4.as_hwords[2] = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_hwords[3] = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_hwords[4] = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_hwords[5] = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_2d_bytes[1][4] = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_2d_bytes[1][5] = 0;
+ }
+}
+
+#ifdef NONMATCHING
+void sub_814D564(u8 *r0, u32 r1, s32 r2, u32 r3, u32 r5, u32 r6, u32 r4)
+{
+ u8 sp[8];
+ u8 *p;
+
+ 1[(u32 *)sp] = r2;
+ 0[(u16 *)sp] = r4;
+ p = &sp[4];
+ r0[0] = p[0];
+ r0[1] = p[1];
+ r0[2] = p[2];
+ r0[3] = p[3];
+ r0[4] = r3;
+ r0[5] = r5;
+ r0[6] = r6;
+ r0[7] = sp[0];
+ r0[8] = sp[1];
+ r0[9] = r1;
+}
+#else
+NAKED
+void sub_814D564(u8 *r0, u32 r1, s32 r2, u32 r3, u32 r5, u32 r6, u32 r4)
+{
+ asm_unified("\n\
+ push {r4-r6,lr}\n\
+ sub sp, 0x8\n\
+ str r2, [sp, 0x4]\n\
+ ldr r5, [sp, 0x18]\n\
+ ldr r6, [sp, 0x1C]\n\
+ ldr r4, [sp, 0x20]\n\
+ mov r2, sp\n\
+ strh r4, [r2]\n\
+ add r4, sp, 0x4\n\
+ ldrb r2, [r4]\n\
+ strb r2, [r0]\n\
+ ldrb r2, [r4, 0x1]\n\
+ strb r2, [r0, 0x1]\n\
+ ldrb r2, [r4, 0x2]\n\
+ strb r2, [r0, 0x2]\n\
+ ldrb r2, [r4, 0x3]\n\
+ strb r2, [r0, 0x3]\n\
+ strb r3, [r0, 0x4]\n\
+ strb r5, [r0, 0x5]\n\
+ strb r6, [r0, 0x6]\n\
+ mov r2, sp\n\
+ ldrb r2, [r2]\n\
+ strb r2, [r0, 0x7]\n\
+ mov r2, sp\n\
+ ldrb r2, [r2, 0x1]\n\
+ strb r2, [r0, 0x8]\n\
+ strb r1, [r0, 0x9]\n\
+ add sp, 0x8\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0");
+}
+#endif
+
+void sub_814D5A4(u8 *r0, u32 r1, u32 r2, u32 r3, u32 r5)
+{
+ u8 sp[4];
+
+ 0[(u16 *)sp] = r3;
+ r0[0] = r1;
+ r0[1] = r2;
+ r0[2] = sp[0];
+ r0[3] = sp[1];
+ r0[4] = r5;
+}
diff --git a/src/berry_crush_3.c b/src/berry_crush_3.c
new file mode 100644
index 000000000..bcc32295d
--- /dev/null
+++ b/src/berry_crush_3.c
@@ -0,0 +1,1824 @@
+#include "global.h"
+#include "gflib.h"
+#include "battle_anim.h"
+#include "berry_crush.h"
+#include "decompress.h"
+#include "digit_obj_util.h"
+#include "dynamic_placeholder_text_util.h"
+#include "graphics.h"
+#include "item_menu_icons.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "math_util.h"
+#include "menu.h"
+#include "new_menu_helpers.h"
+#include "scanline_effect.h"
+#include "script.h"
+#include "strings.h"
+#include "text_window.h"
+#include "trig.h"
+#include "constants/items.h"
+#include "constants/songs.h"
+
+static void sub_814DEC0(struct BerryCrushGame_138 * arg0, u16 arg1);
+static void sub_814DF44(u8 windowId, u8 left, u8 colorId, const u8 *string);
+static void sub_814DFA4(struct BerryCrushGame * sp0C, u8 sp10, u8 sp14, u8 r3);
+static void sub_814E32C(struct BerryCrushGame * r8);
+static void Task_ShowBerryCrushRankings(u8 r4);
+static void sub_814EAD4(struct BerryCrushGame_138 * r4, u16 r1);
+static void sub_814EB38(struct BerryCrushGame * r5);
+static void sub_814EBB0(struct BerryCrushGame * r6);
+static void sub_814EC80(struct BerryCrushGame * r6);
+static void sub_814ECE0(struct BerryCrushGame * r6);
+static void sub_814EF10(struct BerryCrushGame * r5);
+static void sub_814EFD0(struct Sprite * sprite);
+static void sub_814EFFC(struct Sprite * sprite);
+static void sub_814F044(struct Sprite * sprite);
+static void sub_814F0D8(struct Sprite * sprite);
+
+static const struct BgTemplate gUnknown_846E3CC[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 15,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0x0000
+ }, {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 13,
+ .screenSize = 2,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0x0000
+ }, {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 12,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0x0000
+ }, {
+ .bg = 3,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 11,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0x0000
+ }
+};
+
+static const u8 sBerryCrushTextColorTable[][3] = {
+ {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_DARK_GREY,
+ TEXT_COLOR_LIGHT_GREY
+ }, {
+ TEXT_COLOR_TRANSPARENT,
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_DARK_GREY
+ }, {
+ TEXT_COLOR_TRANSPARENT,
+ TEXT_COLOR_LIGHT_GREY,
+ TEXT_COLOR_RED
+ }, {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_BLUE,
+ TEXT_COLOR_LIGHT_BLUE
+ }, {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_GREEN,
+ TEXT_COLOR_LIGHT_GREEN
+ }, {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_RED,
+ TEXT_COLOR_LIGHT_RED
+ }
+};
+
+static const struct WindowTemplate gUnknown_846E3F0 = {
+ .bg = 0,
+ .tilemapLeft = 3,
+ .tilemapTop = 4,
+ .width = 24,
+ .height = 13,
+ .paletteNum = 0xF,
+ .baseBlock = 0x001
+};
+
+static const struct WindowTemplate gUnknown_846E3F8[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 0,
+ .width = 9,
+ .height = 2,
+ .paletteNum = 0x8,
+ .baseBlock = 0x3ed
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 3,
+ .width = 9,
+ .height = 2,
+ .paletteNum = 0x8,
+ .baseBlock = 0x3db
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 6,
+ .width = 9,
+ .height = 2,
+ .paletteNum = 0x8,
+ .baseBlock = 0x3c9
+ }, {
+ .bg = 0,
+ .tilemapLeft = 21,
+ .tilemapTop = 3,
+ .width = 9,
+ .height = 2,
+ .paletteNum = 0x8,
+ .baseBlock = 0x3b7
+ }, {
+ .bg = 0,
+ .tilemapLeft = 21,
+ .tilemapTop = 6,
+ .width = 9,
+ .height = 2,
+ .paletteNum = 0x8,
+ .baseBlock = 0x3a5
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate gUnknown_846E428[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 4,
+ .tilemapTop = 2,
+ .width = 22,
+ .height = 16,
+ .paletteNum = 0xF,
+ .baseBlock = 0x001
+ }, {
+ .bg = 0,
+ .tilemapLeft = 4,
+ .tilemapTop = 2,
+ .width = 22,
+ .height = 16,
+ .paletteNum = 0xF,
+ .baseBlock = 0x001
+ }, {
+ .bg = 0,
+ .tilemapLeft = 3,
+ .tilemapTop = 2,
+ .width = 24,
+ .height = 16,
+ .paletteNum = 0xF,
+ .baseBlock = 0x001
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const u8 gUnknown_846E448[][4] = {
+ { 6, 8, 9, 11 },
+ { 12, 14, 15, 16}
+};
+
+static const u32 gUnknown_846E450[] = {
+ 50000000,
+ 25000000,
+ 12500000,
+ 6250000,
+ 3125000,
+ 1562500,
+ 781250,
+ 390625
+};
+
+static const u16 gUnknown_846E470[] = INCBIN_U16("graphics/link_games/unk_846E4D0.gbapal");
+static const u16 gUnknown_846E490[] = INCBIN_U16("graphics/link_games/unk_846E7FC.gbapal");
+static const u16 gUnknown_846E4B0[] = INCBIN_U16("graphics/link_games/unk_846ECC4.gbapal");
+
+static const u32 gUnknown_846E4D0[] = INCBIN_U32("graphics/link_games/unk_846E4D0.4bpp.lz");
+static const u32 gUnknown_846E7FC[] = INCBIN_U32("graphics/link_games/unk_846E7FC.4bpp.lz");
+static const u32 gUnknown_846EB78[] = INCBIN_U32("graphics/link_games/unk_846EB78.4bpp.lz");
+static const u32 gUnknown_846ECC4[] = INCBIN_U32("graphics/link_games/unk_846ECC4.4bpp.lz");
+
+static const u32 gBerryCrushGrinderTopTilemap[] = INCBIN_U32("graphics/link_games/unk_846ED90.bin.lz");
+static const u32 gBerryCrushContainerCapTilemap[] = INCBIN_U32("graphics/link_games/unk_846EEC0.bin.lz");
+static const u32 gBerryCrushBackgroundTilemap[] = INCBIN_U32("graphics/link_games/unk_846F058.bin.lz");
+
+static const u8 gUnknown_846F280[][5] = {
+ {1, 3},
+ {0, 1, 3},
+ {1, 3, 2, 4},
+ {0, 1, 3, 2, 4}
+};
+
+static const struct BerryCrushGame_138_C gUnknown_846F294[] = {
+ {0x00, 0x00, 0x00, 0x0000, 0xfff0, 0x0000, 0x0000},
+ {0x01, 0x00, 0x03, 0xffe4, 0xfffc, 0xffe8, 0x0010},
+ {0x02, 0x00, 0x06, 0xfff0, 0x0014, 0xfff8, 0x0010},
+ {0x03, 0x14, 0x03, 0x001c, 0xfffc, 0x0020, 0xfff8},
+ {0x04, 0x14, 0x06, 0x0010, 0x0014, 0x0010, 0xfff8}
+};
+
+static const s8 gUnknown_846F2D0[][2] = {
+ {0x00, 0x00},
+ {0xff, 0x00},
+ {0x01, 0x01}
+};
+
+static const s8 gUnknown_846F2D6[][2] = {
+ {0x00, 0x00},
+ {0xf0, 0xfc},
+ {0x10, 0xfc},
+ {0xf8, 0xfe},
+ {0x08, 0xfe},
+ {0xe8, 0xf8},
+ {0x18, 0xf8},
+ {0xe0, 0xf4},
+ {0x20, 0xf4},
+ {0xd8, 0xf0},
+ {0x28, 0xf0}
+};
+
+static const u16 gUnknown_846F2EC[] = {
+ 5, 6, 7, 8, 9
+};
+
+static const struct CompressedSpriteSheet gUnknown_846F2F8[] = {
+ {gUnknown_846E4D0, 0x0800, 1},
+ {gUnknown_846E7FC, 0x0e00, 2},
+ {gUnknown_846EB78, 0x0700, 3},
+ {gUnknown_846ECC4, 0x02c0, 4},
+ {}
+};
+
+static const struct SpritePalette gUnknown_846F320[] = {
+ {gUnknown_846E470, 1},
+ {gUnknown_846E490, 2},
+ {gUnknown_846E4B0, 4},
+ {}
+};
+
+static const union AnimCmd gUnknown_846F340[] = {
+ ANIMCMD_FRAME(0x00, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846F348[] = {
+ ANIMCMD_FRAME(0x00, 4),
+ ANIMCMD_FRAME(0x10, 4),
+ ANIMCMD_FRAME(0x20, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846F358[] = {
+ ANIMCMD_FRAME(0x30, 2),
+ ANIMCMD_FRAME(0x40, 2),
+ ANIMCMD_FRAME(0x50, 2),
+ ANIMCMD_FRAME(0x60, 2),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846F36C[] = {
+ ANIMCMD_FRAME(0x00, 2),
+ ANIMCMD_FRAME(0x04, 2),
+ ANIMCMD_FRAME(0x08, 2),
+ ANIMCMD_FRAME(0x0c, 2),
+ ANIMCMD_FRAME(0x10, 2),
+ ANIMCMD_FRAME(0x14, 2),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gUnknown_846F388[] = {
+ ANIMCMD_FRAME(0x18, 4),
+ ANIMCMD_FRAME(0x1c, 4),
+ ANIMCMD_FRAME(0x20, 4),
+ ANIMCMD_FRAME(0x24, 4),
+ ANIMCMD_FRAME(0x28, 4),
+ ANIMCMD_FRAME(0x2c, 4),
+ ANIMCMD_FRAME(0x30, 4),
+ ANIMCMD_FRAME(0x34, 4),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gUnknown_846F3AC[] = {
+ ANIMCMD_FRAME(0x14, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846F3B4[] = {
+ ANIMCMD_FRAME(0x00, 0),
+ ANIMCMD_END
+};
+
+static const union AffineAnimCmd gUnknown_846F3BC[] = {
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 2, 1),
+ AFFINEANIMCMD_JUMP(1)
+};
+
+static const union AffineAnimCmd gUnknown_846F3D4[] = {
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, -2, 1),
+ AFFINEANIMCMD_JUMP(1)
+};
+
+static const union AnimCmd *const gUnknown_846F3EC[] = {
+ gUnknown_846F340
+};
+
+static const union AnimCmd *const gUnknown_846F3F0[] = {
+ gUnknown_846F348,
+ gUnknown_846F358
+};
+
+static const union AnimCmd *const gUnknown_846F3F8[] = {
+ gUnknown_846F36C,
+ gUnknown_846F388
+};
+
+static const union AnimCmd *const gUnknown_846F400[] = {
+ gUnknown_846F3AC
+};
+
+static const union AnimCmd *const gUnknown_846F404[] = {
+ gUnknown_846F3B4
+};
+
+static const union AffineAnimCmd *const gUnknown_846F408[] = {
+ gUnknown_846F3BC,
+ gUnknown_846F3D4
+};
+
+
+static const struct SpriteTemplate gUnknown_846F410 = {
+ .tileTag = 1,
+ .paletteTag = 1,
+ .oam = &gOamData_AffineOff_ObjNormal_64x64,
+ .anims = gUnknown_846F3EC,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_846F428 = {
+ .tileTag = 2,
+ .paletteTag = 2,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gUnknown_846F3F0,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_814EFD0
+};
+
+static const struct SpriteTemplate gUnknown_846F440 = {
+ .tileTag = 3,
+ .paletteTag = 2,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gUnknown_846F3F8,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_846F458 = {
+ .tileTag = 4,
+ .paletteTag = 4,
+ .oam = &gOamData_AffineOff_ObjNormal_8x16,
+ .anims = gUnknown_846F400,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_846F470 = {
+ .tileTag = 5,
+ .paletteTag = 5,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x32,
+ .anims = gUnknown_846F404,
+ .affineAnims = gUnknown_846F408,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct DigitObjUtilTemplate gUnknown_846F488[] = {
+ {
+ .strConvMode = 1,
+ .shape = SPRITE_SHAPE(8x16),
+ .size = SPRITE_SIZE(8x16),
+ .priority = 0,
+ .oamCount = 2,
+ .xDelta = 8,
+ .x = 156,
+ .y = 0,
+ .spriteSheet = {.compressed = &gUnknown_846F2F8[3]},
+ .spritePal = &gUnknown_846F320[2],
+ }, {
+ .strConvMode = 0,
+ .shape = SPRITE_SHAPE(8x16),
+ .size = SPRITE_SIZE(8x16),
+ .priority = 0,
+ .oamCount = 2,
+ .xDelta = 8,
+ .x = 180,
+ .y = 0,
+ .spriteSheet = {.compressed = &gUnknown_846F2F8[3]},
+ .spritePal = &gUnknown_846F320[2],
+ }, {
+ .strConvMode = 0,
+ .shape = SPRITE_SHAPE(8x16),
+ .size = SPRITE_SIZE(8x16),
+ .priority = 0,
+ .oamCount = 2,
+ .xDelta = 8,
+ .x = 204,
+ .y = 0,
+ .spriteSheet = {.compressed = &gUnknown_846F2F8[3]},
+ .spritePal = &gUnknown_846F320[2],
+ }
+};
+
+static const u8 *const gUnknown_846F4B8[] = {
+ gText_SpaceTimes,
+ gText_XDotY,
+ gText_StrVar1Berry,
+ gText_NeatnessRankings,
+ gText_CooperativeRankings,
+ gText_PressingPowerRankings
+};
+
+int sub_814D5C8(void)
+{
+ struct BerryCrushGame * var0 = sub_814B6F0();
+ if (!var0)
+ return -1;
+
+ switch (var0->unkC)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ScanlineEffect_Stop();
+ ResetTempTileDataBuffers();
+ break;
+ case 1:
+ CpuFill16(0, (void *)OAM, OAM_SIZE);
+ gReservedSpritePaletteCount = 0;
+ DigitObjUtil_Init(3);
+ break;
+ case 2:
+ ResetPaletteFade();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ break;
+ case 3:
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_846E3CC, NELEMS(gUnknown_846E3CC));
+ SetBgTilemapBuffer(1, var0->unk1C0);
+ SetBgTilemapBuffer(2, var0->unk21C0);
+ SetBgTilemapBuffer(3, var0->unk31C0);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ break;
+ case 4:
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
+ FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 64);
+ FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 32);
+ FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32);
+ break;
+ case 5:
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ DecompressAndCopyTileDataToVram(1, gUnknown_8EAFFC0, 0, 0, 0);
+ break;
+ case 6:
+ if (FreeTempTileDataBuffersIfPossible())
+ return 0;
+
+ InitStandardTextBoxWindows();
+ ResetBg0();
+ sub_814EB38(var0);
+ sub_814EBB0(var0);
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ break;
+ case 7:
+ LoadPalette(gUnknown_8EAFEA0, 0, 0x180);
+ CopyToBgTilemapBuffer(1, gBerryCrushGrinderTopTilemap, 0, 0);
+ CopyToBgTilemapBuffer(2, gBerryCrushContainerCapTilemap, 0, 0);
+ CopyToBgTilemapBuffer(3, gBerryCrushBackgroundTilemap, 0, 0);
+ sub_814EC80(var0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ break;
+ case 8:
+ LoadWirelessStatusIndicatorSpriteGfx();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ sub_814ECE0(var0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, -gSpriteCoordOffsetY);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ break;
+ case 9:
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ sub_814B914();
+ var0->unkC = 0;
+ return 1;
+ }
+
+ var0->unkC++;
+ return 0;
+}
+
+int sub_814D888(void)
+{
+ struct BerryCrushGame * var0 = sub_814B6F0();
+ if (!var0)
+ return -1;
+
+ switch (var0->unkC)
+ {
+ case 0:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 1:
+ if (!IsLinkTaskFinished())
+ return 0;
+ // fall through. The original author forgot to use "break" here
+ // because this will call BeginNormalPaletteFade() twice.
+ case 2:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ UpdatePaletteFade();
+ break;
+ case 3:
+ if (UpdatePaletteFade())
+ return 0;
+ break;
+ case 4:
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
+ FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 32);
+ FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 32);
+ FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ break;
+ case 5:
+ FreeAllWindowBuffers();
+ HideBg(0);
+ UnsetBgTilemapBuffer(0);
+ HideBg(1);
+ UnsetBgTilemapBuffer(1);
+ HideBg(2);
+ UnsetBgTilemapBuffer(2);
+ HideBg(3);
+ UnsetBgTilemapBuffer(3);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ break;
+ case 6:
+ DestroyWirelessStatusIndicatorSprite();
+ sub_814EF10(var0);
+ DigitObjUtil_Teardown();
+ break;
+ case 7:
+ var0->unkC = 0;
+ return 1;
+ }
+
+ var0->unkC++;
+ return 0;
+}
+
+int sub_814D9CC(struct BerryCrushGame * arg0)
+{
+ gSpriteCoordOffsetY = arg0->unk2A + arg0->unk2C;
+ SetGpuReg(REG_OFFSET_BG1VOFS, -gSpriteCoordOffsetY);
+ if (arg0->unk12 == 7)
+ {
+ sub_814EAD4(&arg0->unk138, arg0->unk28);
+ }
+
+ return 0;
+}
+
+void sub_814DA04(struct BerryCrushGame * arg0)
+{
+ arg0->unk2A = -104;
+ arg0->unk2C = 0;
+ gSpriteCoordOffsetX = 0;
+ gSpriteCoordOffsetY = -104;
+}
+
+void sub_814DA24(struct BerryCrushGame * arg0, struct BerryCrushGame_138 * arg1)
+{
+ u8 i;
+ u8 spriteId;
+ s16 var0, var1;
+ s16 *data;
+ int var3;
+ s16 var5;
+ u32 var6;
+
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ spriteId = AddItemIconObjectWithCustomObjectTemplate(
+ &gUnknown_846F470,
+ gUnknown_846F2EC[i],
+ gUnknown_846F2EC[i],
+ arg0->unk68.as_four_players.others[i].unk0 + FIRST_BERRY_INDEX);
+ arg1->unk38[i] = &gSprites[spriteId];
+ arg1->unk38[i]->oam.priority = 3;
+ arg1->unk38[i]->affineAnimPaused = TRUE;
+ arg1->unk38[i]->pos1.x = arg1->unkC[i]->unk8 + 120;
+ arg1->unk38[i]->pos1.y = -16;
+ data = arg1->unk38[i]->data;
+ var5 = 512;
+ data[1] = var5;
+ data[2] = 32;
+ data[7] = 112;
+ var0 = arg1->unkC[i]->unkA - arg1->unkC[i]->unk8;
+ var3 = var0;
+ if (var0 < 0)
+ var3 += 3;
+
+ data[6] = var3 >> 2;
+ var0 *= 128;
+ var6 = var5 + 32;
+ var6 = var6 / 2;
+ var1 = sub_80D8B40(7, 0x3F80, var6);
+ data[0] = (u16)arg1->unk38[i]->pos1.x * 128;
+ data[3] = sub_80D8B40(7, var0, var1);
+ var1 = sub_80D8ABC(7, var1, 85);
+ data[4] = 0;
+ data[5] = sub_80D8B40(7, 0x3F80, var1);
+ data[7] |= 0x8000;
+ if (arg1->unkC[i]->unk8 < 0)
+ StartSpriteAffineAnim(arg1->unk38[i], 1);
+ }
+}
+
+void sub_814DB84(struct Sprite * sprite)
+{
+ s16 *data = sprite->data;
+
+ data[1] += data[2];
+ sprite->pos2.y += data[1] >> 8;
+ if (data[7] & 0x8000)
+ {
+ sprite->data[0] += data[3];
+ data[4] += data[5];
+ sprite->pos2.x = Sin(data[4] >> 7, data[6]);
+ if ((data[7] & 0x8000) && (data[4] >> 7) > 126)
+ {
+ sprite->pos2.x = 0;
+ data[7] &= 0x7FFF;
+ }
+ }
+
+ sprite->pos1.x = data[0] >> 7;
+ if (sprite->pos1.y + sprite->pos2.y >= (data[7] & 0x7FFF))
+ {
+ sprite->callback = SpriteCallbackDummy;
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ }
+}
+
+void sub_814DC24(struct BerryCrushGame * arg0, UNUSED struct BerryCrushGame_138 * arg1)
+{
+ u8 i;
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ FreeSpritePaletteByTag(gUnknown_846F2EC[i]);
+ FreeSpriteTilesByTag(gUnknown_846F2EC[i]);
+ }
+}
+
+void sub_814DC5C(struct BerryCrushGame * arg0, struct BerryCrushGame_138 * arg1)
+{
+ u8 sp4;
+ struct BerryCrushGame_4E * var4E;
+ u8 i;
+ u16 var, var2;
+
+ sp4 = 0;
+ var4E = &arg0->unk40.unkE;
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ var = var4E->unkA >> (i * 3);
+ var &= 7;
+ if (var)
+ {
+ sp4++;
+ if (var & 0x4)
+ StartSpriteAnim(arg1->unk24[i], 1);
+ else
+ StartSpriteAnim(arg1->unk24[i], 0);
+
+ arg1->unk24[i]->invisible = FALSE;
+ arg1->unk24[i]->animPaused = FALSE;
+ arg1->unk24[i]->pos2.x = gUnknown_846F2D0[(var % 4) - 1][0];
+ arg1->unk24[i]->pos2.y = gUnknown_846F2D0[(var % 4) - 1][1];
+ }
+ }
+
+ if (sp4 == 0)
+ {
+ arg0->unk25_2 = 0;
+ }
+ else
+ {
+ var = (u8)(arg0->unk28 % 3);
+ var2 = var;
+ for (i = 0; i < var4E->unkC * 2 + 3; i++)
+ {
+ if (arg1->unk4C[i]->invisible)
+ {
+ arg1->unk4C[i]->callback = sub_814F0D8;
+ arg1->unk4C[i]->pos1.x = gUnknown_846F2D6[i][0] + 120;
+ arg1->unk4C[i]->pos1.y = gUnknown_846F2D6[i][1] + 136 - (var * 4);
+ arg1->unk4C[i]->pos2.x = gUnknown_846F2D6[i][0] + (gUnknown_846F2D6[i][0] / (var2 * 4));
+ arg1->unk4C[i]->pos2.y = gUnknown_846F2D6[i][1];
+ if (var4E->unk4_1)
+ StartSpriteAnim(arg1->unk4C[i], 1);
+ else
+ StartSpriteAnim(arg1->unk4C[i], 0);
+
+ var++;
+ if (var > 3)
+ var = 0;
+ }
+ }
+
+ if (arg0->unk25_2)
+ {
+ arg0->unk25_2 = 0;
+ }
+ else
+ {
+ if (sp4 == 1)
+ PlaySE(SE_TOY_DANGO);
+ else
+ PlaySE(SE_TOY_KABE);
+
+ arg0->unk25_2 = 1;
+ }
+ }
+}
+
+bool32 sub_814DE50(struct BerryCrushGame * arg0, struct BerryCrushGame_138 * arg1)
+{
+ u8 i;
+
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ if (!arg1->unk24[i]->invisible)
+ return FALSE;
+ }
+
+ for (i = 0; i < 11; i++)
+ {
+ if (!arg1->unk4C[i]->invisible)
+ return FALSE;
+ }
+
+ if (arg0->unk2C != 0)
+ arg0->unk2C = 0;
+
+ return TRUE;
+}
+
+static void sub_814DEC0(struct BerryCrushGame_138 * arg0, u16 arg1)
+{
+ u8 i = 0;
+ u32 r7 = 0;
+ s16 r3 = 0;
+
+ arg0->unk4 = arg1 / 3600;
+ arg0->unk6 = (arg1 % 3600) / 60;
+ r3 = sub_80D8AA0((arg1 % 60) << 8, 4);
+
+ for (i = 0; i < 8; i++)
+ {
+ if ((r3 >> (7 - i)) & 1)
+ r7 += gUnknown_846E450[i];
+ }
+
+ arg0->unk8 = r7 / 1000000;
+}
+
+static void sub_814DF44(u8 windowId, u8 left, u8 colorId, const u8 *string)
+{
+ left = (left * 4) - (GetStringWidth(2, string, -1) / 2u);
+ AddTextPrinterParameterized3(windowId, 2, left, 0, sBerryCrushTextColorTable[colorId], 0, string);
+}
+
+#ifdef NONMATCHING
+static void sub_814DFA4(struct BerryCrushGame * sp0C, u8 sp10, u8 sp14, u8 sp18)
+{
+ u8 r8;
+ u8 sp1C;
+ u8 sp20;
+ u8 r2;
+ s32 r3;
+ u8 r7;
+ struct BerryCrushGame_68_x * sp24 = &sp0C->unk68.as_four_players;
+ for (r8 = 0, sp1C = 0, sp20 = 0; r8 < sp0C->unk9; r8++)
+ {
+ // sp10<<2 --> sp28
+ // &sp0C->unk138.unk82 --> sp2C
+ DynamicPlaceholderTextUtil_Reset();
+ switch (sp10)
+ {
+ case 0:
+ sp1C = sp0C->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[sp10][r8];
+ if (r8 != 0 && sp24->unk00.unk0C[sp10][r8] != sp24->unk00.unk0C[sp10][r8 - 1])
+ {
+ sp20 = r8;
+ }
+ ConvertIntToDecimalStringN(gStringVar1, sp24->unk00.unk0C[sp10][r8], STR_CONV_MODE_RIGHT_ALIGN, 4);
+ r7 = sp14 - GetStringWidth(2, gUnknown_846F4B8[sp10], -1) - 4;
+ AddTextPrinterParameterized3(sp0C->unk138.unk82, 2, r7, sp18 + 14 * r8, sBerryCrushTextColorTable[0], 0, gUnknown_846F4B8[sp10]);
+ AddTextPrinterParameterized3(sp0C->unk138.unk82, 2, r7 - 24, sp18 + 14 * r8, sBerryCrushTextColorTable[0], 0, gStringVar1);
+ break;
+ case 1:
+ sp1C = sp0C->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[sp10][r8];
+ if (r8 != 0 && sp24->unk00.unk0C[sp10][r8] != sp24->unk00.unk0C[sp10][r8 - 1])
+ {
+ sp20 = r8;
+ }
+ ConvertIntToDecimalStringN(gStringVar1, sp24->unk00.unk0C[sp10][r8], STR_CONV_MODE_LEFT_ALIGN, 3);
+ r3 = 0;
+ r7 = sp24->unk00.unk0C[sp10][r8] & 15;
+ for (r2 = 0; r2 < 4; r2++)
+ {
+ if ((r7 >> (3 - r2)) & 1)
+ r3 += gUnknown_846E450[r2];
+ }
+ r7 = r3 / 1000000;
+ ConvertIntToDecimalStringN(gStringVar2, r7, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringExpandPlaceholders(gStringVar4, gUnknown_846F4B8[sp10]);
+ r2 = sp14 - GetStringWidth(2, gStringVar4, 0) - 4;
+ AddTextPrinterParameterized3(sp0C->unk138.unk82, 2, r2, sp18 + 14 * r8, sBerryCrushTextColorTable[0], 0, gStringVar4);
+ break;
+ case 2:
+ sp1C = r8;
+ sp20 = r8;
+ r2 = sp0C->unk68.as_five_players.unk1C[r8].unk14[8];
+ if (r2 >= LAST_BERRY_INDEX - FIRST_BERRY_INDEX)
+ r2 = 0;
+ StringCopy(gStringVar1, gBerries[r2].name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_846F4B8[sp10]);
+ r2 = sp14 - GetStringWidth(2, gStringVar4, -1) - 4;
+ AddTextPrinterParameterized3(sp0C->unk138.unk82, 2, r2, sp18 + 14 * r8, sBerryCrushTextColorTable[0], 0, gStringVar4);
+ break;
+ }
+ if (sp1C == sp0C->unk8)
+ StringCopy(gStringVar3, gText_1_ClrLtGryShdwBlk_Dynamic0);
+ else
+ StringCopy(gStringVar3, gText_1_Dynamic0);
+ gStringVar3[0] = sp20 + CHAR_1;
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sp0C->unk68.as_five_players.unk1C[sp1C].unk14);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gStringVar3);
+ AddTextPrinterParameterized3(sp0C->unk138.unk82, 2, 4, sp18 + 14 * r8, sBerryCrushTextColorTable[0], 0, gStringVar4);
+ }
+}
+#else
+NAKED
+static void sub_814DFA4(struct BerryCrushGame * sp0C, u8 sp10, u8 sp14, u8 r3)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tsub sp, 0x38\n"
+ "\tstr r0, [sp, 0xC]\n"
+ "\tlsls r1, 24\n"
+ "\tlsrs r1, 24\n"
+ "\tstr r1, [sp, 0x10]\n"
+ "\tlsls r2, 24\n"
+ "\tlsrs r2, 24\n"
+ "\tstr r2, [sp, 0x14]\n"
+ "\tlsls r3, 24\n"
+ "\tlsrs r3, 24\n"
+ "\tstr r3, [sp, 0x18]\n"
+ "\tmovs r0, 0\n"
+ "\tmov r8, r0\n"
+ "\tmovs r1, 0\n"
+ "\tstr r1, [sp, 0x1C]\n"
+ "\tmovs r2, 0\n"
+ "\tstr r2, [sp, 0x20]\n"
+ "\tldr r4, [sp, 0xC]\n"
+ "\tadds r4, 0x68\n"
+ "\tstr r4, [sp, 0x24]\n"
+ "\tldr r0, [sp, 0xC]\n"
+ "\tldrb r0, [r0, 0x9]\n"
+ "\tcmp r8, r0\n"
+ "\tbcc _0814DFE0\n"
+ "\tb _0814E30C\n"
+ "_0814DFE0:\n"
+ "\tldr r1, [sp, 0x10]\n"
+ "\tlsls r1, 2\n"
+ "\tstr r1, [sp, 0x28]\n"
+ "\tmovs r4, 0xDD\n"
+ "\tlsls r4, 1\n"
+ "\tldr r2, [sp, 0xC]\n"
+ "\tadds r4, r2, r4\n"
+ "\tstr r4, [sp, 0x2C]\n"
+ "_0814DFF0:\n"
+ "\tbl DynamicPlaceholderTextUtil_Reset\n"
+ "\tldr r0, [sp, 0x10]\n"
+ "\tcmp r0, 0x1\n"
+ "\tbeq _0814E0E4\n"
+ "\tcmp r0, 0x1\n"
+ "\tbgt _0814E00A\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0814E01A\n"
+ "\tmov r1, r8\n"
+ "\tlsls r1, 3\n"
+ "\tmov r9, r1\n"
+ "\tb _0814E0C8\n"
+ "_0814E00A:\n"
+ "\tldr r0, [sp, 0x10]\n"
+ "\tcmp r0, 0x2\n"
+ "\tbne _0814E012\n"
+ "\tb _0814E200\n"
+ "_0814E012:\n"
+ "\tmov r1, r8\n"
+ "\tlsls r1, 3\n"
+ "\tmov r9, r1\n"
+ "\tb _0814E0C8\n"
+ "_0814E01A:\n"
+ "\tldr r0, [sp, 0x24]\n"
+ "\tadds r0, 0x20\n"
+ "\tadd r0, r8\n"
+ "\tldrb r0, [r0]\n"
+ "\tstr r0, [sp, 0x1C]\n"
+ "\tmov r0, r8\n"
+ "\tlsls r3, r0, 1\n"
+ "\tldr r2, [sp, 0x24]\n"
+ "\tadds r2, 0xC\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0814E048\n"
+ "\tadds r0, r2, r3\n"
+ "\tmov r1, r8\n"
+ "\tsubs r1, 0x1\n"
+ "\tlsls r1, 1\n"
+ "\tadds r1, r2, r1\n"
+ "\tldrh r0, [r0]\n"
+ "\tldrh r1, [r1]\n"
+ "\tcmp r0, r1\n"
+ "\tbeq _0814E048\n"
+ "\tmov r4, r8\n"
+ "\tadds r1, r4, 0\n"
+ "\tstr r1, [sp, 0x20]\n"
+ "_0814E048:\n"
+ "\tldr r1, [sp, 0x28]\n"
+ "\tldr r4, [sp, 0x10]\n"
+ "\tadds r0, r1, r4\n"
+ "\tlsls r0, 1\n"
+ "\tadds r0, r3, r0\n"
+ "\tadds r0, r2, r0\n"
+ "\tldrh r1, [r0]\n"
+ "\tldr r0, _0814E0D8 @ =gStringVar1\n"
+ "\tmovs r2, 0x1\n"
+ "\tmovs r3, 0x4\n"
+ "\tbl ConvertIntToDecimalStringN\n"
+ "\tldr r0, _0814E0DC @ =gUnknown_846F4B8\n"
+ "\tldr r1, [sp, 0x28]\n"
+ "\tadds r0, r1, r0\n"
+ "\tldr r5, [r0]\n"
+ "\tmovs r0, 0x2\n"
+ "\tadds r1, r5, 0\n"
+ "\tmovs r2, 0x1\n"
+ "\tnegs r2, r2\n"
+ "\tbl GetStringWidth\n"
+ "\tldr r2, [sp, 0x14]\n"
+ "\tsubs r0, r2, r0\n"
+ "\tsubs r0, 0x4\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r7, r0, 24\n"
+ "\tldr r4, [sp, 0x2C]\n"
+ "\tldrb r0, [r4]\n"
+ "\tmov r1, r8\n"
+ "\tlsls r6, r1, 3\n"
+ "\tsubs r4, r6, r1\n"
+ "\tlsls r4, 1\n"
+ "\tldr r2, [sp, 0x18]\n"
+ "\tadds r4, r2, r4\n"
+ "\tlsls r4, 24\n"
+ "\tlsrs r4, 24\n"
+ "\tldr r1, _0814E0E0 @ =sBerryCrushTextColorTable\n"
+ "\tstr r1, [sp]\n"
+ "\tmovs r2, 0\n"
+ "\tstr r2, [sp, 0x4]\n"
+ "\tstr r5, [sp, 0x8]\n"
+ "\tmovs r1, 0x2\n"
+ "\tadds r2, r7, 0\n"
+ "\tadds r3, r4, 0\n"
+ "\tbl AddTextPrinterParameterized3\n"
+ "\tldr r1, [sp, 0x2C]\n"
+ "\tldrb r0, [r1]\n"
+ "\tadds r2, r7, 0\n"
+ "\tsubs r2, 0x18\n"
+ "\tlsls r2, 24\n"
+ "\tlsrs r2, 24\n"
+ "\tldr r1, _0814E0E0 @ =sBerryCrushTextColorTable\n"
+ "\tstr r1, [sp]\n"
+ "\tmovs r1, 0\n"
+ "\tstr r1, [sp, 0x4]\n"
+ "\tldr r1, _0814E0D8 @ =gStringVar1\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tmovs r1, 0x2\n"
+ "\tadds r3, r4, 0\n"
+ "\tbl AddTextPrinterParameterized3\n"
+ "\tmov r9, r6\n"
+ "_0814E0C8:\n"
+ "\tldr r6, [sp, 0x20]\n"
+ "\tadds r6, 0xA2\n"
+ "\tldr r2, [sp, 0x1C]\n"
+ "\tlsls r5, r2, 5\n"
+ "\tmovs r4, 0x1\n"
+ "\tadd r4, r8\n"
+ "\tmov r10, r4\n"
+ "\tb _0814E27E\n"
+ "\t.align 2, 0\n"
+ "_0814E0D8: .4byte gStringVar1\n"
+ "_0814E0DC: .4byte gUnknown_846F4B8\n"
+ "_0814E0E0: .4byte sBerryCrushTextColorTable\n"
+ "_0814E0E4:\n"
+ "\tldr r0, [sp, 0x24]\n"
+ "\tadd r0, r8\n"
+ "\tadds r0, 0x28\n"
+ "\tldrb r0, [r0]\n"
+ "\tstr r0, [sp, 0x1C]\n"
+ "\tmov r0, r8\n"
+ "\tlsls r3, r0, 1\n"
+ "\tldr r2, [sp, 0x24]\n"
+ "\tadds r2, 0xC\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0814E116\n"
+ "\tadds r0, r3, 0\n"
+ "\tadds r0, 0xA\n"
+ "\tadds r0, r2, r0\n"
+ "\tmov r4, r8\n"
+ "\tlsls r1, r4, 1\n"
+ "\tadds r1, 0x8\n"
+ "\tadds r1, r2, r1\n"
+ "\tldrh r0, [r0]\n"
+ "\tldrh r1, [r1]\n"
+ "\tcmp r0, r1\n"
+ "\tbeq _0814E116\n"
+ "\tmov r1, r8\n"
+ "\tadds r0, r1, 0\n"
+ "\tstr r0, [sp, 0x20]\n"
+ "_0814E116:\n"
+ "\tldr r0, [sp, 0x28]\n"
+ "\tldr r1, [sp, 0x10]\n"
+ "\tadds r4, r0, r1\n"
+ "\tlsls r4, 1\n"
+ "\tadds r4, r3, r4\n"
+ "\tadds r4, r2, r4\n"
+ "\tldrh r1, [r4]\n"
+ "\tlsrs r1, 4\n"
+ "\tldr r0, _0814E1E4 @ =gStringVar1\n"
+ "\tmovs r2, 0x1\n"
+ "\tmovs r3, 0x3\n"
+ "\tbl ConvertIntToDecimalStringN\n"
+ "\tmovs r3, 0\n"
+ "\tldrb r0, [r4]\n"
+ "\tmovs r7, 0xF\n"
+ "\tands r7, r0\n"
+ "\tmovs r2, 0\n"
+ "\tldr r4, [sp, 0x10]\n"
+ "\tlsls r4, 2\n"
+ "\tstr r4, [sp, 0x34]\n"
+ "\tmov r0, r8\n"
+ "\tlsls r0, 3\n"
+ "\tmov r9, r0\n"
+ "\tldr r1, [sp, 0x14]\n"
+ "\tsubs r1, 0x4\n"
+ "\tstr r1, [sp, 0x30]\n"
+ "\tldr r6, [sp, 0x20]\n"
+ "\tadds r6, 0xA2\n"
+ "\tldr r4, [sp, 0x1C]\n"
+ "\tlsls r5, r4, 5\n"
+ "\tmovs r0, 0x1\n"
+ "\tadd r0, r8\n"
+ "\tmov r10, r0\n"
+ "\tmovs r1, 0x1\n"
+ "\tmov r12, r1\n"
+ "\tldr r4, _0814E1E8 @ =gUnknown_846E450\n"
+ "_0814E160:\n"
+ "\tmovs r0, 0x3\n"
+ "\tsubs r1, r0, r2\n"
+ "\tadds r0, r7, 0\n"
+ "\tasrs r0, r1\n"
+ "\tmov r1, r12\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0814E178\n"
+ "\tlsls r0, r2, 2\n"
+ "\tadds r0, r4\n"
+ "\tldr r0, [r0]\n"
+ "\tadds r3, r0\n"
+ "_0814E178:\n"
+ "\tadds r0, r2, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r2, r0, 24\n"
+ "\tcmp r2, 0x3\n"
+ "\tbls _0814E160\n"
+ "\tadds r0, r3, 0\n"
+ "\tldr r1, _0814E1EC @ =1000000\n"
+ "\tbl __udivsi3\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r7, r0, 24\n"
+ "\tldr r0, _0814E1F0 @ =gStringVar2\n"
+ "\tadds r1, r7, 0\n"
+ "\tmovs r2, 0x2\n"
+ "\tmovs r3, 0x2\n"
+ "\tbl ConvertIntToDecimalStringN\n"
+ "\tldr r0, _0814E1F4 @ =gUnknown_846F4B8\n"
+ "\tldr r2, [sp, 0x34]\n"
+ "\tadds r0, r2, r0\n"
+ "\tldr r1, [r0]\n"
+ "\tldr r0, _0814E1F8 @ =gStringVar4\n"
+ "\tbl StringExpandPlaceholders\n"
+ "\tmovs r0, 0x2\n"
+ "\tldr r1, _0814E1F8 @ =gStringVar4\n"
+ "\tmovs r2, 0\n"
+ "\tbl GetStringWidth\n"
+ "\tadds r2, r0, 0\n"
+ "\tldr r4, [sp, 0x30]\n"
+ "\tsubs r2, r4, r2\n"
+ "\tlsls r2, 24\n"
+ "\tlsrs r2, 24\n"
+ "\tldr r1, [sp, 0x2C]\n"
+ "\tldrb r0, [r1]\n"
+ "\tmov r4, r9\n"
+ "\tmov r1, r8\n"
+ "\tsubs r3, r4, r1\n"
+ "\tlsls r3, 1\n"
+ "\tldr r4, [sp, 0x18]\n"
+ "\tadds r3, r4, r3\n"
+ "\tlsls r3, 24\n"
+ "\tlsrs r3, 24\n"
+ "\tldr r1, _0814E1FC @ =sBerryCrushTextColorTable\n"
+ "\tstr r1, [sp]\n"
+ "\tmovs r4, 0\n"
+ "\tstr r4, [sp, 0x4]\n"
+ "\tldr r1, _0814E1F8 @ =gStringVar4\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tmovs r1, 0x2\n"
+ "\tbl AddTextPrinterParameterized3\n"
+ "\tb _0814E27E\n"
+ "\t.align 2, 0\n"
+ "_0814E1E4: .4byte gStringVar1\n"
+ "_0814E1E8: .4byte gUnknown_846E450\n"
+ "_0814E1EC: .4byte 1000000\n"
+ "_0814E1F0: .4byte gStringVar2\n"
+ "_0814E1F4: .4byte gUnknown_846F4B8\n"
+ "_0814E1F8: .4byte gStringVar4\n"
+ "_0814E1FC: .4byte sBerryCrushTextColorTable\n"
+ "_0814E200:\n"
+ "\tmov r2, r8\n"
+ "\tstr r2, [sp, 0x1C]\n"
+ "\tmov r0, r8\n"
+ "\tadds r4, r0, 0\n"
+ "\tstr r4, [sp, 0x20]\n"
+ "\tlsls r5, r0, 5\n"
+ "\tldr r1, [sp, 0xC]\n"
+ "\tadds r0, r1, r5\n"
+ "\tadds r0, 0xA4\n"
+ "\tldrb r2, [r0]\n"
+ "\tcmp r2, 0x2B\n"
+ "\tbls _0814E21A\n"
+ "\tmovs r2, 0\n"
+ "_0814E21A:\n"
+ "\tlsls r1, r2, 3\n"
+ "\tsubs r1, r2\n"
+ "\tlsls r1, 2\n"
+ "\tldr r0, _0814E294 @ =gBerries\n"
+ "\tadds r1, r0\n"
+ "\tldr r0, _0814E298 @ =gStringVar1\n"
+ "\tbl StringCopy\n"
+ "\tldr r0, _0814E29C @ =gUnknown_846F4B8\n"
+ "\tldr r1, [r0, 0x8]\n"
+ "\tldr r0, _0814E2A0 @ =gStringVar4\n"
+ "\tbl StringExpandPlaceholders\n"
+ "\tmovs r0, 0x2\n"
+ "\tldr r1, _0814E2A0 @ =gStringVar4\n"
+ "\tmovs r2, 0x1\n"
+ "\tnegs r2, r2\n"
+ "\tbl GetStringWidth\n"
+ "\tadds r2, r0, 0\n"
+ "\tldr r4, [sp, 0x14]\n"
+ "\tsubs r2, r4, r2\n"
+ "\tsubs r2, 0x4\n"
+ "\tlsls r2, 24\n"
+ "\tlsrs r2, 24\n"
+ "\tldr r1, [sp, 0x2C]\n"
+ "\tldrb r0, [r1]\n"
+ "\tmov r1, r8\n"
+ "\tlsls r4, r1, 3\n"
+ "\tsubs r3, r4, r1\n"
+ "\tlsls r3, 1\n"
+ "\tldr r1, [sp, 0x18]\n"
+ "\tadds r3, r1, r3\n"
+ "\tlsls r3, 24\n"
+ "\tlsrs r3, 24\n"
+ "\tldr r1, _0814E2A4 @ =sBerryCrushTextColorTable\n"
+ "\tstr r1, [sp]\n"
+ "\tmovs r1, 0\n"
+ "\tstr r1, [sp, 0x4]\n"
+ "\tldr r1, _0814E2A0 @ =gStringVar4\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tmovs r1, 0x2\n"
+ "\tbl AddTextPrinterParameterized3\n"
+ "\tmov r9, r4\n"
+ "\tmov r6, r8\n"
+ "\tadds r6, 0xA2\n"
+ "\tmovs r2, 0x1\n"
+ "\tadd r2, r8\n"
+ "\tmov r10, r2\n"
+ "_0814E27E:\n"
+ "\tldr r0, [sp, 0x1C]\n"
+ "\tldr r4, [sp, 0xC]\n"
+ "\tldrb r4, [r4, 0x8]\n"
+ "\tcmp r0, r4\n"
+ "\tbne _0814E2B0\n"
+ "\tldr r0, _0814E2A8 @ =gStringVar3\n"
+ "\tldr r1, _0814E2AC @ =gText_1_ClrLtGryShdwBlk_Dynamic0\n"
+ "\tbl StringCopy\n"
+ "\tb _0814E2B8\n"
+ "\t.align 2, 0\n"
+ "_0814E294: .4byte gBerries\n"
+ "_0814E298: .4byte gStringVar1\n"
+ "_0814E29C: .4byte gUnknown_846F4B8\n"
+ "_0814E2A0: .4byte gStringVar4\n"
+ "_0814E2A4: .4byte sBerryCrushTextColorTable\n"
+ "_0814E2A8: .4byte gStringVar3\n"
+ "_0814E2AC: .4byte gText_1_ClrLtGryShdwBlk_Dynamic0\n"
+ "_0814E2B0:\n"
+ "\tldr r0, _0814E31C @ =gStringVar3\n"
+ "\tldr r1, _0814E320 @ =gText_1_Dynamic0\n"
+ "\tbl StringCopy\n"
+ "_0814E2B8:\n"
+ "\tldr r4, _0814E31C @ =gStringVar3\n"
+ "\tstrb r6, [r4]\n"
+ "\tadds r1, r5, 0\n"
+ "\tadds r1, 0x98\n"
+ "\tldr r0, [sp, 0xC]\n"
+ "\tadds r1, r0, r1\n"
+ "\tmovs r0, 0\n"
+ "\tbl DynamicPlaceholderTextUtil_SetPlaceholderPtr\n"
+ "\tldr r0, _0814E324 @ =gStringVar4\n"
+ "\tadds r1, r4, 0\n"
+ "\tbl DynamicPlaceholderTextUtil_ExpandPlaceholders\n"
+ "\tldr r1, [sp, 0x2C]\n"
+ "\tldrb r0, [r1]\n"
+ "\tmov r2, r9\n"
+ "\tmov r4, r8\n"
+ "\tsubs r3, r2, r4\n"
+ "\tlsls r3, 1\n"
+ "\tldr r1, [sp, 0x18]\n"
+ "\tadds r3, r1, r3\n"
+ "\tlsls r3, 24\n"
+ "\tlsrs r3, 24\n"
+ "\tldr r2, _0814E328 @ =sBerryCrushTextColorTable\n"
+ "\tstr r2, [sp]\n"
+ "\tmovs r4, 0\n"
+ "\tstr r4, [sp, 0x4]\n"
+ "\tldr r1, _0814E324 @ =gStringVar4\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tmovs r1, 0x2\n"
+ "\tmovs r2, 0x4\n"
+ "\tbl AddTextPrinterParameterized3\n"
+ "\tmov r2, r10\n"
+ "\tlsls r0, r2, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tmov r8, r0\n"
+ "\tldr r4, [sp, 0xC]\n"
+ "\tldrb r4, [r4, 0x9]\n"
+ "\tcmp r8, r4\n"
+ "\tbcs _0814E30C\n"
+ "\tb _0814DFF0\n"
+ "_0814E30C:\n"
+ "\tadd sp, 0x38\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_0814E31C: .4byte gStringVar3\n"
+ "_0814E320: .4byte gText_1_Dynamic0\n"
+ "_0814E324: .4byte gStringVar4\n"
+ "_0814E328: .4byte sBerryCrushTextColorTable");
+}
+#endif
+
+static void sub_814E32C(struct BerryCrushGame * r8)
+{
+ u8 r10 = 0;
+ u8 r6 = 0;
+ u32 sp0C = 0;
+ union BerryCrushGame_68 *sp10 = &r8->unk68;
+ u8 r7 = GetWindowAttribute(r8->unk138.unk82, WINDOW_HEIGHT) * 8 - 42;
+
+ sub_814DEC0(&r8->unk138, sp10->as_four_players.unk00.unk04);
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, 2, r7, sBerryCrushTextColorTable[0], 0, gText_TimeColon);
+
+ r6 = 190 - (u8)GetStringWidth(2, gText_SpaceSec, 0);
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gText_SpaceSec);
+
+ r6 -= 32;
+ ConvertIntToDecimalStringN(gStringVar1, r8->unk138.unk6, STR_CONV_MODE_LEADING_ZEROS, 2);
+ ConvertIntToDecimalStringN(gStringVar2, r8->unk138.unk8, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringExpandPlaceholders(gStringVar4, gText_XDotY2);
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gStringVar4);
+
+ r6 -= (u8)GetStringWidth(2, gText_SpaceMin, 0) + 3;
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gText_SpaceMin);
+
+ r6 -= 9;
+ ConvertIntToDecimalStringN(gStringVar1, r8->unk138.unk4, STR_CONV_MODE_LEADING_ZEROS, 1);
+ StringExpandPlaceholders(gStringVar4, gText_StrVar1);
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gStringVar4);
+
+ r7 += 14;
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, 2, r7, sBerryCrushTextColorTable[0], 0, gText_PressingSpeed);
+
+ r6 = 190 - (u8)GetStringWidth(2, gText_TimesPerSec, 0);
+ AddTextPrinterParameterized3(r8->unk138.unk82, 3, r6, r7, sBerryCrushTextColorTable[0], 0, gText_TimesPerSec);
+
+ for (r10 = 0; r10 < 8; ++r10)
+ if (((u8)r8->unk16 >> (7 - r10)) & 1)
+ sp0C += *(r10 + gUnknown_846E450); // It's accessed in a different way here for unknown reason
+ ConvertIntToDecimalStringN(gStringVar1, r8->unk16 >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ ConvertIntToDecimalStringN(gStringVar2, sp0C / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringExpandPlaceholders(gStringVar4, gText_XDotY3);
+ r6 -= 38;
+ if (r8->unk25_1)
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[5], 0, gStringVar4);
+ else
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gStringVar4);
+
+ r7 += 14;
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, 2, r7, sBerryCrushTextColorTable[0], 0, gText_Silkiness);
+
+ ConvertIntToDecimalStringN(gStringVar1, sp10->as_four_players.unk00.unk08, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ StringExpandPlaceholders(gStringVar4, gText_Var1Percent);
+ r6 = 190 - (u8)GetStringWidth(2, gStringVar4, 0);
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gStringVar4);
+}
+
+bool32 sub_814E644(struct BerryCrushGame * r4, struct BerryCrushGame_138 * r6)
+{
+ u8 r5;
+ struct WindowTemplate template;
+
+ switch (r6->unk80)
+ {
+ case 0:
+ r5 = r4->unk9 - 2;
+ sub_814EB04(r6);
+ memcpy(&template, &gUnknown_846E428[r4->unk12 - 11], sizeof(struct WindowTemplate));
+ if (r4->unk12 == 13)
+ template.height = gUnknown_846E448[1][r5];
+ else
+ template.height = gUnknown_846E448[0][r5];
+ r6->unk82 = AddWindow(&template);
+ break;
+ case 1:
+ PutWindowTilemap(r6->unk82);
+ FillWindowPixelBuffer(r6->unk82, PIXEL_FILL(0));
+ break;
+ case 2:
+ TextWindow_SetStdFrame0_WithPal(r6->unk82, 0x21D, 0xD0);
+ DrawStdFrameWithCustomTileAndPalette(r6->unk82, 0, 541, 13);
+ break;
+ case 3:
+ r5 = r4->unk9 - 2;
+ switch (r4->unk12)
+ {
+ case 11:
+ sub_814DF44(r6->unk82, 22, 3, gText_PressesRankings);
+ sub_814DFA4(r4, 0, 0xB0, 8 * gUnknown_846E448[0][r5] - r4->unk9 * 14);
+ r6->unk80 = 5;
+ return FALSE;
+ case 12:
+ sub_814DF44(r6->unk82, 22, 4, gUnknown_846F4B8[r4->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[0][7] + 3]);
+ sub_814DFA4(r4, 1, 0xB0, 8 * gUnknown_846E448[0][r5] - r4->unk9 * 14);
+ r6->unk80 = 5;
+ return FALSE;
+ case 13:
+ sub_814DF44(r6->unk82, 24, 3, gText_CrushingResults);
+ sub_814DFA4(r4, 2, 0xC0, 0x10);
+ break;
+ }
+ break;
+ case 4:
+ sub_814E32C(r4);
+ break;
+ case 5:
+ CopyWindowToVram(r6->unk82, 3);
+ r6->unk80 = 0;
+ return TRUE;
+ }
+ ++r6->unk80;
+ return FALSE;
+}
+
+void sub_814E80C(struct BerryCrushGame * r4)
+{
+ ClearStdWindowAndFrameToTransparent(r4->unk138.unk82, 1);
+ RemoveWindow(r4->unk138.unk82);
+ sub_814EBB0(r4);
+}
+
+static void Task_ShowBerryCrushRankings(u8 taskId)
+{
+ u8 i = 0, j, xPos, yPos;
+ u32 score = 0;
+ s16 *data = gTasks[taskId].data;
+ u8 *str;
+
+ switch (data[0])
+ {
+ case 0:
+ data[1] = AddWindow(&gUnknown_846E3F0);
+ PutWindowTilemap(data[1]);
+ FillWindowPixelBuffer(data[1], PIXEL_FILL(0));
+ TextWindow_SetStdFrame0_WithPal(data[1], 0x21D, 0xD0);
+ DrawStdFrameWithCustomTileAndPalette(data[1], 0, 0x21D, 0xD);
+ break;
+ case 1:
+ xPos = 96 - GetStringWidth(2, gText_BerryCrush2, -1) / 2u;
+ AddTextPrinterParameterized3(
+ data[1],
+ 2,
+ xPos,
+ 2,
+ sBerryCrushTextColorTable[3],
+ 0,
+ gText_BerryCrush2
+ );
+ xPos = 96 - GetStringWidth(2, gText_PressingSpeedRankings, -1) / 2u;
+ AddTextPrinterParameterized3(
+ data[1],
+ 2,
+ xPos,
+ 18,
+ sBerryCrushTextColorTable[3],
+ 0,
+ gText_PressingSpeedRankings
+ );
+ yPos = 42;
+ for (i = 0; i < 4; ++i)
+ {
+ ConvertIntToDecimalStringN(gStringVar1, i + 2, STR_CONV_MODE_LEFT_ALIGN, 1);
+ StringExpandPlaceholders(gStringVar4, gText_Var1Players);
+ AddTextPrinterParameterized3(
+ data[1],
+ 2,
+ 4,
+ yPos,
+ sBerryCrushTextColorTable[0],
+ 0,
+ gStringVar4
+ );
+ for (j = 0; j < 8; ++j)
+ {
+ if (((data[i + 2] & 0xFF) >> (7 - j)) & 1)
+ score += gUnknown_846E450[j];
+ }
+ ConvertIntToDecimalStringN(gStringVar1, (u16)data[i + 2] >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ ConvertIntToDecimalStringN(gStringVar2, score / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2);
+ str = StringExpandPlaceholders(gStringVar4, gText_XDotY3);
+ *str++ = CHAR_SPACE;
+ StringCopy(str, gText_TimesPerSec);
+ xPos = 192 - (u8)GetStringWidth(3, gStringVar4, 0);
+ AddTextPrinterParameterized3(
+ data[1],
+ 3,
+ xPos,
+ yPos,
+ sBerryCrushTextColorTable[0],
+ 0,
+ gStringVar4
+ );
+ yPos += 14;
+ score = 0;
+ }
+ CopyWindowToVram(data[1], 3);
+ break;
+ case 2:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ break;
+ else
+ return;
+ case 3:
+ ClearStdWindowAndFrameToTransparent(data[1], 1);
+ ClearWindowTilemap(data[1]);
+ RemoveWindow(data[1]);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ ScriptContext2_Disable();
+ data[0] = 0;
+ return;
+ }
+ ++data[0];
+}
+
+void ShowBerryCrushRankings(void)
+{
+ u8 taskId;
+
+ ScriptContext2_Enable();
+ taskId = CreateTask(Task_ShowBerryCrushRankings, 0);
+ gTasks[taskId].data[2] = gSaveBlock2Ptr->berryCrush.berryCrushResults[0];
+ gTasks[taskId].data[3] = gSaveBlock2Ptr->berryCrush.berryCrushResults[1];
+ gTasks[taskId].data[4] = gSaveBlock2Ptr->berryCrush.berryCrushResults[2];
+ gTasks[taskId].data[5] = gSaveBlock2Ptr->berryCrush.berryCrushResults[3];
+}
+
+static void sub_814EAD4(struct BerryCrushGame_138 * r4, u16 r1)
+{
+ sub_814DEC0(r4, r1);
+ DigitObjUtil_PrintNumOn(0, r4->unk4);
+ DigitObjUtil_PrintNumOn(1, r4->unk6);
+ DigitObjUtil_PrintNumOn(2, r4->unk8);
+}
+
+void sub_814EB04(struct BerryCrushGame_138 * r0)
+{
+ r0->unk78[0]->invisible = TRUE;
+ r0->unk78[1]->invisible = TRUE;
+ DigitObjUtil_HideOrShow(2, 1);
+ DigitObjUtil_HideOrShow(1, 1);
+ DigitObjUtil_HideOrShow(0, 1);
+}
+
+static void sub_814EB38(struct BerryCrushGame * r5)
+{
+ u8 r6;
+
+ for (r6 = 0; r6 < r5->unk9; ++r6)
+ {
+ r5->unk138.unkC[r6] = &gUnknown_846F294[gUnknown_846F280[r5->unk9 - 2][r6]];
+ r5->unk138.unk83[r6] = AddWindow(&gUnknown_846E3F8[r5->unk138.unkC[r6]->unk0]);
+ PutWindowTilemap(r5->unk138.unk83[r6]);
+ FillWindowPixelBuffer(r5->unk138.unk83[r6], 0);
+ }
+}
+
+static void sub_814EBB0(struct BerryCrushGame * r6)
+{
+ u8 r7, r2;
+ u8 *r4;
+
+ for (r7 = 0; r7 < r6->unk9; ++r7)
+ {
+ PutWindowTilemap(r6->unk138.unk83[r7]);
+ if (r7 == r6->unk8)
+ {
+ AddTextPrinterParameterized4(
+ r6->unk138.unk83[r7],
+ 2,
+ 36 - GetStringWidth(2, PLAYER_UNK14(r6, r7), 0) / 2u,
+ 1,
+ 0,
+ 0,
+ sBerryCrushTextColorTable[1],
+ 0,
+ PLAYER_UNK14(r6, r7)
+ );
+ }
+ else
+ {
+ AddTextPrinterParameterized4(
+ r6->unk138.unk83[r7],
+ 2,
+ 36 - GetStringWidth(2, PLAYER_UNK14(r6, r7), 0) / 2u,
+ 1,
+ 0,
+ 0,
+ sBerryCrushTextColorTable[2],
+ 0,
+ PLAYER_UNK14(r6, r7)
+ );
+ }
+ CopyWindowToVram(r6->unk138.unk83[r7], 3);
+ }
+ CopyBgTilemapBufferToVram(0);
+}
+
+static void sub_814EC80(struct BerryCrushGame * r6)
+{
+ u8 r5 = 0;
+ const u32 *r0 = gUnknown_8EB0ADC;
+#ifndef NONMATCHING // r4, r5, r6 register roulette
+ register u8 *r4 asm("r4") = gDecompressionBuffer;
+ register u32 r0_ asm("r0");
+#else
+ u8 *r4 = gDecompressionBuffer;
+ u32 r0_;
+#endif
+
+ LZ77UnCompWram(r0, r4);
+ for (; r5 < r6->unk9; ++r5)
+ {
+ r0_ = r6->unk138.unkC[r5]->unk0;
+ CopyToBgTilemapBufferRect(
+ 3,
+ &r4[r0_ * 40],
+ r6->unk138.unkC[r5]->unk1,
+ r6->unk138.unkC[r5]->unk2,
+ 10,
+ 2
+ );
+ }
+ CopyBgTilemapBufferToVram(3);
+}
+
+static void sub_814ECE0(struct BerryCrushGame * r6)
+{
+ u8 r5 = 0;
+ u8 r2;
+
+ r6->unk2A = -104;
+ r6->unk2C = 0;
+ gSpriteCoordOffsetX = 0;
+ gSpriteCoordOffsetY = -104;
+ for (; r5 < 4; ++r5)
+ LoadCompressedSpriteSheet(&gUnknown_846F2F8[r5]);
+ LoadSpritePalettes(gUnknown_846F320);
+ r2 = CreateSprite(&gUnknown_846F410, 120, 88, 5);
+ r6->unk138.unk20 = &gSprites[r2];
+ r6->unk138.unk20->oam.priority = 3;
+ r6->unk138.unk20->coordOffsetEnabled = TRUE;
+ r6->unk138.unk20->animPaused = TRUE;
+ for (r5 = 0; r5 < r6->unk9; ++r5)
+ {
+ r2 = CreateSprite(
+ &gUnknown_846F428,
+ r6->unk138.unkC[r5]->unk4 + 120,
+ r6->unk138.unkC[r5]->unk6 + 32,
+ 0
+ );
+ r6->unk138.unk24[r5] = &gSprites[r2];
+ r6->unk138.unk24[r5]->oam.priority = 1;
+ r6->unk138.unk24[r5]->invisible = TRUE;
+ r6->unk138.unk24[r5]->coordOffsetEnabled = TRUE;
+ r6->unk138.unk24[r5]->animPaused = TRUE;
+ }
+ for (r5 = 0; r5 < NELEMS(r6->unk138.unk4C); ++r5)
+ {
+ r2 = CreateSprite(
+ &gUnknown_846F440,
+ gUnknown_846F2D6[r5][0] + 120,
+ gUnknown_846F2D6[r5][1] + 136,
+ 6
+ );
+ r6->unk138.unk4C[r5] = &gSprites[r2];
+ r6->unk138.unk4C[r5]->oam.priority = 3;
+ r6->unk138.unk4C[r5]->invisible = TRUE;
+ r6->unk138.unk4C[r5]->animPaused = TRUE;
+ r6->unk138.unk4C[r5]->data[0] = r5;
+ }
+ for (r5 = 0; r5 < NELEMS(r6->unk138.unk78); ++r5)
+ {
+ r2 = CreateSprite(
+ &gUnknown_846F458,
+ 24 * r5 + 176,
+ 8,
+ 0
+ );
+ r6->unk138.unk78[r5] = &gSprites[r2];
+ r6->unk138.unk78[r5]->oam.priority = 0;
+ r6->unk138.unk78[r5]->invisible = FALSE;
+ r6->unk138.unk78[r5]->animPaused = FALSE;
+ }
+ DigitObjUtil_CreatePrinter(0, 0, &gUnknown_846F488[0]);
+ DigitObjUtil_CreatePrinter(1, 0, &gUnknown_846F488[1]);
+ DigitObjUtil_CreatePrinter(2, 0, &gUnknown_846F488[2]);
+ if (r6->unk12 == 1)
+ sub_814EB04(&r6->unk138);
+}
+
+static void sub_814EF10(struct BerryCrushGame * r5)
+{
+ u8 r4 = 0;
+
+ FreeSpriteTilesByTag(4);
+ FreeSpriteTilesByTag(3);
+ FreeSpriteTilesByTag(2);
+ FreeSpriteTilesByTag(1);
+ FreeSpritePaletteByTag(4);
+ FreeSpritePaletteByTag(2);
+ FreeSpritePaletteByTag(1);
+ for (; r4 < NELEMS(r5->unk138.unk78); ++r4)
+ DestroySprite(r5->unk138.unk78[r4]);
+ DigitObjUtil_DeletePrinter(2);
+ DigitObjUtil_DeletePrinter(1);
+ DigitObjUtil_DeletePrinter(0);
+ for (r4 = 0; r4 < NELEMS(r5->unk138.unk4C); ++r4)
+ DestroySprite(r5->unk138.unk4C[r4]);
+ for (r4 = 0; r4 < r5->unk9; ++r4)
+ DestroySprite(r5->unk138.unk24[r4]);
+ if (r5->unk138.unk20->inUse)
+ DestroySprite(r5->unk138.unk20);
+}
+
+static void sub_814EFD0(struct Sprite * sprite)
+{
+ if (sprite->animEnded)
+ {
+ sprite->invisible = TRUE;
+ sprite->animPaused = TRUE;
+ }
+}
+
+static void sub_814EFFC(struct Sprite * sprite)
+{
+ u8 r1 = 0;
+ SpriteCallback r5 = SpriteCallbackDummy;
+
+ for (; r1 < NELEMS(sprite->data); ++r1)
+ sprite->data[r1] = 0;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->invisible = TRUE;
+ sprite->animPaused = TRUE;
+ sprite->callback = r5;
+}
+
+static void sub_814F044(struct Sprite * sprite)
+{
+ s16 *r4 = sprite->data;
+
+ r4[1] += r4[2];
+ sprite->pos2.y += r4[1] >> 8;
+ if (r4[7] & 0x8000)
+ {
+ sprite->data[0] += r4[3];
+ r4[4] += r4[5];
+ sprite->pos2.x = Sin(r4[4] >> 7, r4[6]);
+ if (r4[7] & 0x8000 && r4[4] >> 7 > 126)
+ {
+ sprite->pos2.x = 0;
+ r4[7] &= 0x7FFF;
+ }
+ }
+ sprite->pos1.x = r4[0] >> 7;
+ if (sprite->pos1.y + sprite->pos2.y > (r4[7] & 0x7FFF))
+ sprite->callback = sub_814EFFC;
+}
+
+static void sub_814F0D8(struct Sprite * sprite)
+{
+ s16 *r7 = sprite->data;
+ s16 r4, r5;
+ s32 r2;
+ u32 r8 = 0;
+
+ r2 = 640;
+ r7[1] = r2;
+ r7[2] = 32;
+ r7[7] = 168;
+ r4 = sprite->pos2.x * 128;
+ r5 = sub_80D8B40(7, (168 - sprite->pos1.y) << 7, (r2 + 32) >> 1);
+ sprite->data[0] = sprite->pos1.x << 7;
+ r7[3] = sub_80D8B40(7, r4, r5);
+ r2 = sub_80D8ABC(7, r5, 85);
+ r7[4] = r8;
+ r7[5] = sub_80D8B40(7, 0x3F80, r2);
+ r7[6] = sprite->pos2.x / 4;
+ r7[7] |= 0x8000;
+ sprite->pos2.y = r8;
+ sprite->pos2.x = r8;
+ sprite->callback = sub_814F044;
+ sprite->animPaused = FALSE;
+ sprite->invisible = FALSE;
+}
diff --git a/src/digit_obj_util.c b/src/digit_obj_util.c
index ed762c3c3..82af5dcab 100644
--- a/src/digit_obj_util.c
+++ b/src/digit_obj_util.c
@@ -65,6 +65,10 @@ static const u8 sTilesPerImage[4][4] =
}
};
+const u16 gUnknown_8479668[] = INCBIN_U16("graphics/misc/unk_8479688.gbapal");
+const u32 gUnknown_8479688[] = INCBIN_U32("graphics/misc/unk_8479688.4bpp.lz");
+const u32 gUnknown_8479748[] = INCBIN_U32("graphics/misc/unk_8479748.4bpp.lz");
+
// code
bool32 DigitObjUtil_Init(u32 count)
{
@@ -125,19 +129,19 @@ bool32 DigitObjUtil_CreatePrinter(u32 id, s32 num, const struct DigitObjUtilTemp
if (sOamWork->array[id].firstOamId == 0xFF)
return FALSE;
- sOamWork->array[id].tileStart = GetSpriteTileStartByTag(template->spriteSheet->tag);
+ sOamWork->array[id].tileStart = GetSpriteTileStartByTag(template->spriteSheet.uncompressed->tag);
if (sOamWork->array[id].tileStart == 0xFFFF)
{
- if (template->spriteSheet->size != 0)
+ if (template->spriteSheet.uncompressed->size != 0)
{
- sOamWork->array[id].tileStart = LoadSpriteSheet(template->spriteSheet);
+ sOamWork->array[id].tileStart = LoadSpriteSheet(template->spriteSheet.uncompressed);
}
else
{
struct CompressedSpriteSheet compObjectPic;
- compObjectPic = *(struct CompressedSpriteSheet*)(template->spriteSheet);
- compObjectPic.size = GetDecompressedDataSize(template->spriteSheet->data);
+ compObjectPic = *template->spriteSheet.compressed;
+ compObjectPic.size = GetDecompressedDataSize((const void *)template->spriteSheet.compressed->data);
sOamWork->array[id].tileStart = LoadCompressedSpriteSheet(&compObjectPic);
}
@@ -158,7 +162,7 @@ bool32 DigitObjUtil_CreatePrinter(u32 id, s32 num, const struct DigitObjUtilTemp
sOamWork->array[id].priority = template->priority;
sOamWork->array[id].xDelta = template->xDelta;
sOamWork->array[id].tilesPerImage = GetTilesPerImage(template->shape, template->size);
- sOamWork->array[id].tileTag = template->spriteSheet->tag;
+ sOamWork->array[id].tileTag = template->spriteSheet.uncompressed->tag;
sOamWork->array[id].palTag = template->spritePal->tag;
sOamWork->array[id].isActive = TRUE;
diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c
index 1860f1917..36dc3fdd2 100644
--- a/src/dodrio_berry_picking.c
+++ b/src/dodrio_berry_picking.c
@@ -32,6 +32,128 @@
/*static*/ void nullsub_98(void);
// const rom data
+
+// Large chunk of data
+/*static*/ const struct BgTemplate sUnknown_847565C_Unref_Dupe[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 12,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 14,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+};
+
+// Unknown unreferenced data, feel free to remove.
+/*static*/ const u32 sUnused_Unref_Dupe[] = {255, 0};
+
+/*static*/ const struct WindowTemplate sUnknown_8475674_Unref_Dupe[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 28,
+ .height = 3,
+ .paletteNum = 13,
+ .baseBlock = 0x13,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 6,
+ .width = 28,
+ .height = 13,
+ .paletteNum = 13,
+ .baseBlock = 0x67,
+ }
+};
+
+/*static*/ const struct WindowTemplate sUnknown_8475684_Unref_Dupe =
+{
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 6,
+ .width = 28,
+ .height = 7,
+ .paletteNum = 13,
+ .baseBlock = 0x67,
+};
+
+/*static*/ const struct WindowTemplate sUnknown_847568C_Unref_Dupe[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 8,
+ .width = 19,
+ .height = 3,
+ .paletteNum = 13,
+ .baseBlock = 0x13,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 7,
+ .width = 6,
+ .height = 4,
+ .paletteNum = 13,
+ .baseBlock = 0x4C,
+ }
+};
+
+/*static*/ const struct WindowTemplate sUnknown_847569C_Unref_Dupe =
+{
+ .bg = 0,
+ .tilemapLeft = 4,
+ .tilemapTop = 6,
+ .width = 22,
+ .height = 5,
+ .paletteNum = 13,
+ .baseBlock = 0x13,
+};
+
+/*static*/ const struct WindowTemplate sUnknown_84756A4_Unref_Dupe =
+{
+ .bg = 0,
+ .tilemapLeft = 5,
+ .tilemapTop = 8,
+ .width = 19,
+ .height = 3,
+ .paletteNum = 13,
+ .baseBlock = 0x13,
+};
+
/*static*/ const u8 sUnknown_8471F50[5][5][11] =
{
{
diff --git a/src/pokemon_jump_4.c b/src/pokemon_jump_4.c
index d1c049e7a..c125734a3 100644
--- a/src/pokemon_jump_4.c
+++ b/src/pokemon_jump_4.c
@@ -766,7 +766,7 @@ static void sub_814A9C8(void)
ptr->xDelta = 8;
ptr->x = 108;
ptr->y = 6;
- ptr->spriteSheet = (void*) &gUnknown_846D960;
+ ptr->spriteSheet.compressed = &gUnknown_846D960;
ptr->spritePal = &gUnknown_846D968;
DigitObjUtil_Init(2);