summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-12-17 15:20:38 +0800
committerjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-12-17 23:12:01 +0800
commit67690df65f8e85f590a146d5ec237d849690bb46 (patch)
tree82d8fe3d8167971cdc54725e79996de7bcc06d80 /src
parent50c48d7ef63ffdb40e3019d25396baedef98a9dc (diff)
sub_8023CAC
Diffstat (limited to 'src')
-rwxr-xr-xsrc/berry_crush.c392
1 files changed, 312 insertions, 80 deletions
diff --git a/src/berry_crush.c b/src/berry_crush.c
index fb1e5c7a0..1764d7573 100755
--- a/src/berry_crush.c
+++ b/src/berry_crush.c
@@ -19,6 +19,7 @@
#include "overworld.h"
#include "palette.h"
#include "pokemon_jump.h"
+#include "random.h"
#include "rom_8034C54.h"
#include "scanline_effect.h"
#include "script.h"
@@ -41,24 +42,12 @@ struct BerryCrushGame_Player
u16 unk2;
union
{
- u8 as_bytes[16];
+ u8 as_2d_bytes[2][8];
u16 as_hwords[8];
} unk4;
u8 unk14[12];
};
-struct BerryCrushGame_PlayersSeparate
-{
- struct BerryCrushGame_Player player;
- struct BerryCrushGame_Player others[4];
-};
-
-typedef union BerryCrushGame_Players
-{
- struct BerryCrushGame_Player players[5];
- struct BerryCrushGame_PlayersSeparate separate;
-} BerryCrushGame_Players;
-
struct __attribute__((packed, aligned(2))) BerryCrushGame_4E
{
u8 filler0[0x4];
@@ -78,7 +67,7 @@ struct __attribute__((packed)) BerryCrushGame_40
struct BerryCrushGame_4E unkE;
};
-struct __attribute__((packed, aligned(2))) BerryCrushGame_5C
+struct BerryCrushGame_5C
{
u16 unk00;
u8 unk02_0:1;
@@ -92,16 +81,30 @@ struct __attribute__((packed, aligned(2))) BerryCrushGame_5C
u16 unk0A;
};
-struct BerryCrushGame_68
+union BerryCrushGame_68
{
- int unk00;
- u16 unk04;
- u8 filler06[2];
- u16 unk08;
- u16 unk0A;
- u16 unk0C[8]; // TODO: Resolve the type of the field.
- BerryCrushGame_Players unk1C;
- u8 fillerBC[20];
+ struct BerryCrushGame_68_x
+ {
+ struct BerryCrushGame_68_x_SubStruct
+ {
+ s32 unk00;
+ u16 unk04;
+ s16 unk06;
+ u16 unk08;
+ u16 unk0A;
+ u16 unk0C[2][5];
+ u8 filler20[16];
+ } unk00;
+ u8 unk30[12];
+ struct BerryCrushGame_Player others[4];
+ u8 fillerBC[20];
+ } as_four_players;
+ struct BerryCrushGame_68_y
+ {
+ u8 filler00[28];
+ struct BerryCrushGame_Player unk1C[5];
+ u8 fillerBC[20];
+ } as_five_players;
};
struct BerryCrushGame_138_C
@@ -169,13 +172,13 @@ struct BerryCrushGame
s16 unk2A;
s16 unk2C;
s16 unk2E;
- u16 unk30;
- u16 unk32;
+ s16 unk30;
+ s16 unk32;
s16 unk34;
u8 unk36[0xA];
struct BerryCrushGame_40 unk40;
struct BerryCrushGame_5C unk5C;
- struct BerryCrushGame_68 unk68;
+ union BerryCrushGame_68 unk68;
struct BerryCrushGame_138 unk138;
u8 unk1C0[0x1000];
u8 unk11C0[0x1000];
@@ -343,7 +346,7 @@ static void sub_8020D8C(void)
else
RemoveBagItem(gSpecialVar_ItemId, 1);
- gUnknown_02022C90->unk68.unk1C.separate.others[gUnknown_02022C90->unk8].unk0 = gSpecialVar_ItemId - FIRST_BERRY_INDEX;
+ gUnknown_02022C90->unk68.as_four_players.others[gUnknown_02022C90->unk8].unk0 = gSpecialVar_ItemId - FIRST_BERRY_INDEX;
gUnknown_02022C90->unkE = 1;
gUnknown_02022C90->unkF = 9;
sub_8024604(gUnknown_02022C90->unk36, 0, -1, 0, 16, 0, 0);
@@ -372,10 +375,10 @@ void sub_8020E58(void)
{
u32 var0, var1;
- var0 = gUnknown_02022C90->unk68.unk04;
+ var0 = gUnknown_02022C90->unk68.as_four_players.unk00.unk04;
var0 <<= 8;
var0 = sub_81515FC(var0, 60 << 8);
- var1 = gUnknown_02022C90->unk68.unk0A;
+ var1 = gUnknown_02022C90->unk68.as_four_players.unk00.unk0A;
var1 <<= 8;
var1 = sub_81515FC(var1, var0) & 0xFFFF;
gUnknown_02022C90->unk16 = var1;
@@ -411,7 +414,7 @@ void sub_8020E58(void)
break;
}
- gUnknown_02022C90->unk1C = gUnknown_02022C90->unk68.unk00;
+ gUnknown_02022C90->unk1C = gUnknown_02022C90->unk68.as_four_players.unk00.unk00;
if (GiveBerryPowder(gUnknown_02022C90->unk1C))
return;
@@ -444,8 +447,7 @@ static void sub_8020FA0(u8 taskId)
#define PLAYER_UNK14(game, i) \
((u8 *)(game) \
+ offsetof(struct BerryCrushGame, unk68) \
- + offsetof(struct BerryCrushGame_68, unk1C) \
- + offsetof(struct BerryCrushGame_Player, unk14) \
+ + offsetof(struct BerryCrushGame_68_x, unk30) \
+ sizeof(struct BerryCrushGame_Player) * (i))
void sub_8020FC4(struct BerryCrushGame *arg0)
@@ -457,7 +459,7 @@ void sub_8020FC4(struct BerryCrushGame *arg0)
for (; i < 5; i++)
{
memset(PLAYER_UNK14(arg0, i), 1, PLAYER_NAME_LENGTH);
- arg0->unk68.unk1C.players[i].unk14[PLAYER_NAME_LENGTH] = EOS;
+ arg0->unk68.as_five_players.unk1C[i].unk14[PLAYER_NAME_LENGTH] = EOS;
}
switch (gSaveBlock2Ptr->optionsTextSpeed)
@@ -668,7 +670,7 @@ void sub_80214A8(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1)
&gUnknown_082F436C,
gUnknown_082F41E8[i],
gUnknown_082F41E8[i],
- arg0->unk68.unk1C.separate.others[i].unk0 + 133);
+ arg0->unk68.as_four_players.others[i].unk0 + 133);
arg1->unk38[i] = &gSprites[spriteId];
arg1->unk38[i]->oam.priority = 3;
arg1->unk38[i]->affineAnimPaused = 1;
@@ -863,7 +865,7 @@ void sub_8021A28(struct BerryCrushGame *sp0C, u8 sp10, u8 sp14, u8 r3)
u8 i, j;
u8 sp18 = 0;
u8 sp1C = 0;
- struct BerryCrushGame_68 *sp20 = &sp0C->unk68;
+ union BerryCrushGame_68 *sp20 = &sp0C->unk68;
u32 xOffset;
u32 r8, r9, r4, r7, r3_;
u8 r10, r2;
@@ -887,16 +889,16 @@ void sub_8021A28(struct BerryCrushGame *sp0C, u8 sp10, u8 sp14, u8 r3)
r10 = r6;
r9 = sp1C + 0xA2;
r8 = sp18;
- r6 += 14; // should be tail merged, but not
+ r6 += 14;
++i;
break;
case 0:
- sp18 = sp20->unk1C.separate.player.unk4.as_bytes[i];
- if (i != 0 && sp20->unk0C[i] != sp20->unk0C[i - 1])
+ sp18 = sp20->as_five_players.unk1C[0].unk4.as_2d_bytes[0][i];
+ if (i != 0 && sp20->as_four_players.unk00.unk0C[0][i] != sp20->as_four_players.unk00.unk0C[0][i - 1])
sp1C = i;
ConvertIntToDecimalStringN(
gStringVar4,
- sp20->unk0C[5 * sp10 + i], // ~ line 145. 2 * i was stored in temp variable
+ sp20->as_four_players.unk00.unk0C[sp10][i],
1,
4
);
@@ -909,17 +911,17 @@ void sub_8021A28(struct BerryCrushGame *sp0C, u8 sp10, u8 sp14, u8 r3)
++i;
break;
case 1:
- sp18 = sp20->unk1C.separate.player.unk4.as_bytes[i + 8];
- if (i != 0 && sp20->unk0C[i + 5] != sp20->unk0C[i + 4]) // damn, access to unk0C is weird again
+ sp18 = sp20->as_five_players.unk1C[0].unk4.as_2d_bytes[1][i];
+ if (i != 0 && sp20->as_four_players.unk00.unk0C[1][i] != sp20->as_four_players.unk00.unk0C[1][i - 1])
sp1C = i;
ConvertIntToDecimalStringN(
gStringVar1,
- sp20->unk0C[5 * sp10 + i] >> 4,
+ sp20->as_four_players.unk00.unk0C[sp10][i] >> 4,
1,
3
);
j = 0;
- r3_ = 15 & (u8)sp20->unk0C[5 * sp10 + i];
+ r3_ = 15 & (u8)sp20->as_four_players.unk00.unk0C[sp10][i];
r4 = sp14 - 4;
r10 = r6;
r9 = sp1C + 0xA2;
@@ -940,7 +942,7 @@ void sub_8021A28(struct BerryCrushGame *sp0C, u8 sp10, u8 sp14, u8 r3)
case 2:
sp18 = i;
sp1C = i;
- r2 = sp0C->unk68.unk1C.separate.others[i].unk0;
+ r2 = sp0C->unk68.as_four_players.others[i].unk0;
if (r2 > 43)
r2 = 0;
StringCopy(gStringVar1,gBerries[r2].name);
@@ -1351,10 +1353,10 @@ void sub_8021D34(struct BerryCrushGame *r8)
u8 r10 = 0;
u8 r6 = 0;
u32 sp0C = 0;
- struct BerryCrushGame_68 *sp10 = &r8->unk68;
+ union BerryCrushGame_68 *sp10 = &r8->unk68;
u8 r7 = GetWindowAttribute(r8->unk138.unk82, WINDOW_HEIGHT) * 8 - 42;
- sub_8021944(&r8->unk138, sp10->unk04);
+ sub_8021944(&r8->unk138, sp10->as_four_players.unk00.unk04);
AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColors1[0], 0, gText_TimeColon);
r6 = 176 - (u8)GetStringWidth(2, gText_SpaceSec, -1);
AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColors1[0], 0, gText_SpaceSec);
@@ -1386,7 +1388,7 @@ void sub_8021D34(struct BerryCrushGame *r8)
AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColors1[0], 0, gStringVar4);
r7 += 14;
AddTextPrinterParameterized3(r8->unk138.unk82, 2, 0, r7, sBerryCrushTextColors1[0], 0, gText_Silkiness);
- ConvertIntToDecimalStringN(gStringVar1, sp10->unk08, 1, 3);
+ ConvertIntToDecimalStringN(gStringVar1, sp10->as_four_players.unk00.unk08, 1, 3);
StringExpandPlaceholders(gStringVar4, gText_Var1Percent);
r6 = 176 - (u8)GetStringWidth(2, gStringVar4, -1);
AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColors1[0], 0, gStringVar4);
@@ -1427,7 +1429,7 @@ bool32 sub_8022070(struct BerryCrushGame *r4, struct BerryCrushGame_138 *r6)
r6->unk80 = 5;
return FALSE;
case 12:
- sub_80219C8(r6->unk82, 20, 4, gUnknown_082F43B4[r4->unk68.unk1C.separate.player.unk4.as_bytes[7] + 3]);
+ sub_80219C8(r6->unk82, 20, 4, gUnknown_082F43B4[r4->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[0][7] + 3]);
sub_8021A28(r4, 1, 0xA0, 8 * gUnknown_082F3344[0][r5]);
r6->unk80 = 5;
return FALSE;
@@ -1474,7 +1476,7 @@ void sub_8022250(u8 r4)
break;
case 1:
r10_ = gText_BerryCrush2;
- ++r10_; --r10_; // swap r9/sl
+ ++r10_; --r10_; // swap sb/sl
#ifndef NONMATCHING
asm("":::"r8"); // turn r8/sl register swap into sb/sl
#endif
@@ -2050,7 +2052,7 @@ u32 sub_8022F1C(struct BerryCrushGame *r5, u8 *r2)
if (!IsLinkTaskFinished())
return 0;
memset(r5->unk40.unk2, 0, sizeof(r5->unk40.unk2));
- r5->unk40.unk2[0] = r5->unk68.unk1C.separate.others[r5->unk8].unk0;
+ r5->unk40.unk2[0] = r5->unk68.as_four_players.others[r5->unk8].unk0;
SendBlock(0, r5->unk40.unk2, 2);
break;
case 3:
@@ -2063,11 +2065,11 @@ u32 sub_8022F1C(struct BerryCrushGame *r5, u8 *r2)
return 0;
for (r3 = 0; r3 < r5->unk9; ++r3)
{
- r5->unk68.unk1C.separate.others[r3].unk0 = gBlockRecvBuffer[r3][0];
- if (r5->unk68.unk1C.separate.others[r3].unk0 > 0xB0)
- r5->unk68.unk1C.separate.others[r3].unk0 = 0;
- r5->unk18 += gUnknown_0858AB24[r5->unk68.unk1C.separate.others[r3].unk0].unk0;
- r5->unk1C += gUnknown_0858AB24[r5->unk68.unk1C.separate.others[r3].unk0].unk1;
+ 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_0858AB24[r5->unk68.as_four_players.others[r3].unk0].unk0;
+ r5->unk1C += gUnknown_0858AB24[r5->unk68.as_four_players.others[r3].unk0].unk1;
}
r5->unk10 = 0;
ResetBlockReceivedFlags();
@@ -2240,30 +2242,30 @@ void sub_802339C(struct BerryCrushGame *r4)
if ((u8)r2[2] & 4)
{
r4->unk5C.unk02_3 |= gUnknown_082F325C[r7];
- r4->unk68.unk1C.separate.others[r7].unk4.as_bytes[13] = 1;
- ++r4->unk68.unk1C.separate.others[r7].unk4.as_hwords[3];
+ 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.unk1C.separate.others[r7].unk2;
- if (r3 >= r4->unk68.unk1C.separate.others[r7].unk4.as_hwords[1] - 1
- && r3 <= r4->unk68.unk1C.separate.others[r7].unk4.as_hwords[1] + 1)
+ 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.unk1C.separate.others[r7].unk4.as_hwords[0];
- r4->unk68.unk1C.separate.others[r7].unk4.as_hwords[1] = r3;
- if (r4->unk68.unk1C.separate.others[r7].unk4.as_hwords[0] > r4->unk68.unk1C.separate.others[r7].unk4.as_hwords[2])
- r4->unk68.unk1C.separate.others[r7].unk4.as_hwords[2] = r4->unk68.unk1C.separate.others[r7].unk4.as_hwords[0];
+ ++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.unk1C.separate.others[r7].unk4.as_hwords[0] = 0;
- r4->unk68.unk1C.separate.others[r7].unk4.as_hwords[1] = r3;
+ 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.unk1C.separate.others[r7].unk2 = r4->unk28;
- if (++r4->unk68.unk1C.separate.others[r7].unk4.as_bytes[12] > 2)
- r4->unk68.unk1C.separate.others[r7].unk4.as_bytes[12] = 0;
+ 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.unk1C.separate.others[r7].unk4.as_bytes[13] = 0;
+ r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][5] = 0;
}
}
}
@@ -2271,10 +2273,10 @@ void sub_802339C(struct BerryCrushGame *r4)
{
for (r7 = 0; r7 < r4->unk9; ++r7)
{
- if (r4->unk68.unk1C.separate.others[r7].unk4.as_bytes[13] != 0)
+ if (r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][5] != 0)
{
- r4->unk68.unk1C.separate.others[r7].unk4.as_bytes[13] |= 2;
- ++r4->unk68.unk1C.separate.others[r7].unk4.as_hwords[4];
+ 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];
}
}
}
@@ -2309,11 +2311,11 @@ void sub_8023558(struct BerryCrushGame *r3)
for (r4 = 0; r4 < r3->unk9; ++r4)
{
- if (r3->unk68.unk1C.separate.others[r4].unk4.as_bytes[13] != 0)
+ if (r3->unk68.as_four_players.others[r4].unk4.as_2d_bytes[1][5] != 0)
{
++r6;
- r1 = r3->unk68.unk1C.separate.others[r4].unk4.as_bytes[12] + 1;
- if (r3->unk68.unk1C.separate.others[r4].unk4.as_bytes[13] & 2)
+ 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;
@@ -2379,8 +2381,8 @@ void sub_80236B8(struct BerryCrushGame *r5)
r5->unk5C.unk02_2 = 1;
if (gMain.heldKeys & A_BUTTON)
{
- if (r5->unk68.unk1C.separate.others[r5->unk8].unk4.as_hwords[5] < r5->unk28)
- ++r5->unk68.unk1C.separate.others[r5->unk8].unk4.as_hwords[5];
+ 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;
@@ -2448,14 +2450,14 @@ void sub_802385C(struct BerryCrushGame *r5)
for (r4 = 0; r4 < r5->unk9; r4 = (u8)r0)
{
- r5->unk68.unk1C.separate.others[r4].unk4.as_bytes[13] = 0;
+ 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.unk1C.separate.others[r4].unk4.as_bytes[13] = 0;
+ 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)
@@ -2594,3 +2596,233 @@ u32 sub_8023A30(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1)
++r4->unkC;
return 0;
}
+
+u32 sub_8023BC0(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_80218D4(r5, &r5->unk138))
+ return 0;
+ sub_8010434();
+ 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, 0, 6);
+ sub_8024644(r6, 7, 1, 0, 0);
+ r5->unkE = 19;
+ sub_8022BEC(3, 1, NULL);
+ r5->unk10 = 0;
+ r5->unkC = 0;
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+u32 sub_8023CAC(struct BerryCrushGame *r7, __attribute__((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_082F4448[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_8151574(r7->unk30 << 8, 0x3200);
+ r2 = sub_81515FC(r2, r7->unk32 << 8) + 0x3200;
+ r2 >>= 8;
+ r7->unk68.as_four_players.unk00.unk08 = r2 & 0x7F;
+ r2 <<= 8;
+ r2 = sub_81515FC(r2, 0x6400);
+ r4 = (r7->unk1C * r7->unk9) << 8;
+ r4 = sub_8151574(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_8151574(r2, 0x6400);
+ r4 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[3];
+ r4 <<= 8;
+ r4 = sub_81515FC(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_8151574(r2, 0x6400);
+ r4 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[3];
+ r4 <<= 8;
+ r4 = sub_81515FC(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_8151574(r2, 0x6400);
+ r4 = r7->unk28;
+ r4 <<= 8;
+ r4 = sub_81515FC(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_8020E58();
+ sub_8022BEC(18, 1, NULL);
+ r7->unk12 = 11;
+ r7->unkC = 0;
+ r7->unk24 = 0;
+ return 0;
+ }
+ ++r7->unkC;
+ return 0;
+}