sub_8023CAC

This commit is contained in:
jiangzhengwenjz
2019-12-17 15:20:38 +08:00
parent 50c48d7ef6
commit 67690df65f
2 changed files with 312 additions and 657 deletions

View File

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