Files
Pokemon-Firered/src/berry_crush_2.c
T
2020-03-03 15:42:14 -05:00

1481 lines
39 KiB
C

#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;
}