diff options
Diffstat (limited to 'src/berry_crush.c')
-rwxr-xr-x | src/berry_crush.c | 401 |
1 files changed, 180 insertions, 221 deletions
diff --git a/src/berry_crush.c b/src/berry_crush.c index a67d1548e..d753e603c 100755 --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -193,7 +193,7 @@ static void sub_8020F88(void); static void sub_8020FA0(u8); void sub_8020FC4(struct BerryCrushGame *); void sub_8022BEC(u16, u8, u8 *); -void sub_8024604(u8 *, u32, s32, u32, u32, u32, u32); +static void BerryCrush_SetPaletteFadeParams(u8 *, bool8, u32, s8, u8, u8, u16); static int sub_8021450(struct BerryCrushGame *); void sub_8022588(struct BerryCrushGame *); void sub_8022600(struct BerryCrushGame *); @@ -206,7 +206,7 @@ void sub_8022554(struct BerryCrushGame_138 *r0); void sub_8024578(struct BerryCrushGame *); void sub_8024644(u8 *, u32, u32, u32, u32); static void sub_8022A20(struct Sprite *sprite); -static u32 sub_8022C58(struct BerryCrushGame *r6, u8 *r1); +static u32 BerryCrushCommand_BeginNormalPaletteFade(struct BerryCrushGame *r6, u8 *r1); static u32 sub_8022CB0(struct BerryCrushGame *r4, u8 *r5); static u32 sub_8022D14(struct BerryCrushGame *r7, u8 *r5); static u32 sub_8022E1C(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1); @@ -322,7 +322,7 @@ static const u8 sBerryCrushTextColorTable[][3] = }; -static const struct WindowTemplate gUnknown_082F32EC = +static const struct WindowTemplate sWindowTemplate_BerryCrushRankings = { .bg = 0, .tilemapLeft = 3, @@ -421,7 +421,7 @@ static const u8 gUnknown_082F3344[][4] = {12, 14, 15, 16}, }; -static const u32 gUnknown_082F334C[] = +static const u32 sPressingSpeedConversionTable[] = { 50000000 / (1 << 0), 50000000 / (1 << 1), @@ -767,7 +767,7 @@ static const u8 *const gUnknown_082F43B4[] = static u32 (*const gUnknown_082F43CC[])(struct BerryCrushGame *, u8 *) = { NULL, - sub_8022C58, + BerryCrushCommand_BeginNormalPaletteFade, sub_8022CB0, sub_8022D14, sub_8022E1C, @@ -825,14 +825,14 @@ u32 sub_8020C0C(MainCallback callback) if (callback == CB2_ReturnToField) { gTextFlags.autoScroll = TRUE; - PlayNewMapMusic(MUS_POKECEN); + PlayNewMapMusic(MUS_POKE_CENTER); SetMainCallback1(CB1_Overworld); } return 0; } -void sub_8020C70(MainCallback callback) +void StartBerryCrush(MainCallback callback) { u8 playerCount = 0; u8 multiplayerId; @@ -842,7 +842,7 @@ void sub_8020C70(MainCallback callback) SetMainCallback2(callback); Rfu.unk_10 = 0; Rfu.unk_12 = 0; - Rfu.unk_ee = 1; + Rfu.errorState = 1; return; } @@ -853,7 +853,7 @@ void sub_8020C70(MainCallback callback) SetMainCallback2(callback); Rfu.unk_10 = 0; Rfu.unk_12 = 0; - Rfu.unk_ee = 1; + Rfu.errorState = 1; return; } @@ -863,7 +863,7 @@ void sub_8020C70(MainCallback callback) SetMainCallback2(callback); Rfu.unk_10 = 0; Rfu.unk_12 = 0; - Rfu.unk_ee = 1; + Rfu.errorState = 1; return; } @@ -874,7 +874,7 @@ void sub_8020C70(MainCallback callback) gUnknown_02022C90->unk12 = 1; gUnknown_02022C90->unkE = 1; gUnknown_02022C90->unkF = 6; - sub_8024604(gUnknown_02022C90->unk36, 1, -1, 0, 16, 0, 0); + BerryCrush_SetPaletteFadeParams(gUnknown_02022C90->unk36, 1, -1, 0, 16, 0, 0); sub_8022BEC(4, 1, gUnknown_02022C90->unk36); SetMainCallback2(sub_8020F88); gUnknown_02022C90->unkA = CreateTask(sub_8020FA0, 8); @@ -891,7 +891,7 @@ static void sub_8020D8C(void) 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); + BerryCrush_SetPaletteFadeParams(gUnknown_02022C90->unk36, 0, -1, 0, 16, 0, 0); sub_8022BEC(4, 1, gUnknown_02022C90->unk36); gUnknown_02022C90->unkA = CreateTask(sub_8020FA0, 8); SetMainCallback2(sub_8020F88); @@ -900,7 +900,7 @@ static void sub_8020D8C(void) void sub_8020E1C(void) { DestroyTask(gUnknown_02022C90->unkA); - ChooseBerrySetCallback(sub_8020D8C); + ChooseBerryForMachine(sub_8020D8C); } static void sub_8020E3C(void) @@ -918,11 +918,11 @@ void sub_8020E58(void) u32 var0, var1; var0 = gUnknown_02022C90->unk68.as_four_players.unk00.unk04; - var0 <<= 8; - var0 = sub_81515FC(var0, 60 << 8); + var0 = Q_24_8(var0); + var0 = MathUtil_Div32(var0, Q_24_8(60)); var1 = gUnknown_02022C90->unk68.as_four_players.unk00.unk0A; - var1 <<= 8; - var1 = sub_81515FC(var1, var0) & 0xFFFF; + var1 = Q_24_8(var1); + var1 = MathUtil_Div32(var1, var0) & 0xFFFF; gUnknown_02022C90->unk16 = var1; switch (gUnknown_02022C90->unk9) { @@ -1031,7 +1031,7 @@ int sub_802104C(void) SetHBlankCallback(NULL); SetGpuReg(REG_OFFSET_DISPCNT, 0); ScanlineEffect_Stop(); - reset_temp_tile_data_buffers(); + ResetTempTileDataBuffers(); break; case 1: CpuFill16(0, (void *)OAM, OAM_SIZE); @@ -1069,14 +1069,14 @@ int sub_802104C(void) CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); - decompress_and_copy_tile_data_to_vram(1, gUnknown_08DE34B8, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, gUnknown_08DE34B8, 0, 0, 0); break; case 6: - if (free_temp_tile_data_buffers_if_possible()) + if (FreeTempTileDataBuffersIfPossible()) return 0; InitStandardTextBoxWindows(); - sub_8197200(); + InitTextBoxGfxAndPrinters(); sub_8022588(var0); sub_8022600(var0); gPaletteFade.bufferTransferDisabled = TRUE; @@ -1125,7 +1125,7 @@ int sub_802130C(void) switch (var0->unkC) { case 0: - sub_8010434(); + Rfu_SetLinkStandbyCallback(); break; case 1: if (!IsLinkTaskFinished()) @@ -1232,12 +1232,12 @@ void sub_80214A8(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1) var0 *= 128; var6 = var5 + 32; var6 = var6 / 2; - var1 = sub_81515D4(7, 0x3F80, var6); + var1 = MathUtil_Div16Shift(7, Q_8_8(63.5), var6); data[0] = (u16)arg1->unk38[i]->pos1.x * 128; - data[3] = sub_81515D4(7, var0, var1); - var1 = sub_8151550(7, var1, 85); + data[3] = MathUtil_Div16Shift(7, var0, var1); + var1 = MathUtil_Mul16Shift(7, var1, 85); data[4] = 0; - data[5] = sub_81515D4(7, 0x3F80, var1); + data[5] = MathUtil_Div16Shift(7, Q_8_8(63.5), var1); data[7] |= 0x8000; if (arg1->unkC[i]->unk8 < 0) StartSpriteAffineAnim(arg1->unk38[i], 1); @@ -1344,9 +1344,9 @@ void sub_80216E0(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1) else { if (sp4 == 1) - PlaySE(SE_TOY_DANGO); + PlaySE(SE_MUD_BALL); else - PlaySE(SE_TOY_KABE); + PlaySE(SE_BREAKABLE_DOOR); arg0->unk25_2 = 1; } @@ -1383,12 +1383,12 @@ void sub_8021944(struct BerryCrushGame_138 *arg0, u16 arg1) arg0->unk4 = arg1 / 3600; arg0->unk6 = (arg1 % 3600) / 60; - r3 = sub_8151534((arg1 % 60) << 8, 4); + r3 = MathUtil_Mul16(Q_8_8(arg1 % 60), 4); for (i = 0; i < 8; i++) { if ((r3 >> (7 - i)) & 1) - r7 += gUnknown_082F334C[i]; + r7 += sPressingSpeedConversionTable[i]; } arg0->unk8 = r7 / 1000000; @@ -1442,7 +1442,7 @@ void sub_8021A28(struct BerryCrushGame * sp0C, u8 sp10, u8 sp14, u8 sp18) r7 = sp24->as_four_players.unk00.unk0C[sp10][r8] & 15; for (r2 = 0; r2 < 4; ++r2) if ((r7 >> (3 - r2)) & 1) - r3 += gUnknown_082F334C[r2]; + r3 += sPressingSpeedConversionTable[r2]; r7 = r3 / 1000000u; ConvertIntToDecimalStringN(gStringVar2, r7, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gUnknown_082F43B4[sp10]); @@ -1499,7 +1499,7 @@ void sub_8021D34(struct BerryCrushGame *r8) AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gText_TimesPerSec); for (; r10 < 8; ++r10) if (((u8)r8->unk16 >> (7 - r10)) & 1) - sp0C += *(r10 + gUnknown_082F334C); // It's accessed in a different way here for unknown reason + sp0C += *(r10 + sPressingSpeedConversionTable); // 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); @@ -1580,93 +1580,89 @@ void sub_802222C(struct BerryCrushGame *r4) sub_8022600(r4); } -void sub_8022250(u8 r4) +static void Task_ShowBerryCrushRankings(u8 taskId) { - u8 r9 = 0, r2, r7, r10; - u32 sp0C = 0; - s16 *r6 = gTasks[r4].data; - const u8 *r10_; // turn r5/sl register swap into r8/sl + u8 i = 0, j, xPos, yPos; + u32 score = 0; + s16 *data = gTasks[taskId].data; + u8 *str; - switch (r6[0]) + switch (data[0]) { case 0: - r6[1] = AddWindow(&gUnknown_082F32EC); - PutWindowTilemap((u8)r6[1]); - FillWindowPixelBuffer((u8)r6[1], PIXEL_FILL(0)); - LoadUserWindowBorderGfx_((u8)r6[1], 541, 208); - DrawStdFrameWithCustomTileAndPalette((u8)r6[1], 0, 541, 13); + data[1] = AddWindow(&sWindowTemplate_BerryCrushRankings); + PutWindowTilemap(data[1]); + FillWindowPixelBuffer(data[1], PIXEL_FILL(0)); + LoadUserWindowBorderGfx_(data[1], 541, 208); + DrawStdFrameWithCustomTileAndPalette(data[1], 0, 541, 13); break; case 1: - r10_ = gText_BerryCrush2; - ++r10_; --r10_; // swap sb/sl - #ifndef NONMATCHING - asm("":::"r8"); // turn r8/sl register swap into sb/sl - #endif - r7 = 96 - GetStringWidth(1, r10_, -1) / 2u; + xPos = 96 - GetStringWidth(1, gText_BerryCrush2, -1) / 2u; AddTextPrinterParameterized3( - (u8)r6[1], + data[1], 1, - r7, + xPos, 1, sBerryCrushTextColorTable[3], 0, - r10_ + gText_BerryCrush2 ); - r10_ = gText_PressingSpeedRankings; - r7 = 96 - GetStringWidth(1, r10_, -1) / 2u; + xPos = 96 - GetStringWidth(1, gText_PressingSpeedRankings, -1) / 2u; AddTextPrinterParameterized3( - (u8)r6[1], + data[1], 1, - r7, + xPos, 17, sBerryCrushTextColorTable[3], 0, - r10_ + gText_PressingSpeedRankings ); - r10 = 41; - for (; r9 < 4; ++r9) + yPos = 41; + for (i = 0; i < 4; ++i) { - ConvertIntToDecimalStringN(gStringVar1, r9 + 2, STR_CONV_MODE_LEFT_ALIGN, 1); + ConvertIntToDecimalStringN(gStringVar1, i + 2, STR_CONV_MODE_LEFT_ALIGN, 1); StringExpandPlaceholders(gStringVar4, gText_Var1Players); AddTextPrinterParameterized3( - (u8)r6[1], + data[1], 1, 0, - r10, + yPos, sBerryCrushTextColorTable[0], 0, gStringVar4 ); - r7 = 192 - (u8)GetStringWidth(1, gText_TimesPerSec, -1); + xPos = 192 - (u8)GetStringWidth(1, gText_TimesPerSec, -1); AddTextPrinterParameterized3( - (u8)r6[1], + data[1], 1, - r7, - r10, + xPos, + yPos, sBerryCrushTextColorTable[0], 0, gText_TimesPerSec ); - for (r2 = 0; r2 < 8; ++r2) - if (((u8)r6[r9 + 2] >> (7 - r2)) & 1) - sp0C += gUnknown_082F334C[r2]; - ConvertIntToDecimalStringN(gStringVar1, (u16)r6[r9 + 2] >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3); - ConvertIntToDecimalStringN(gStringVar2, sp0C / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2); + for (j = 0; j < 8; ++j) + { + if (((data[i + 2] & 0xFF) >> (7 - j)) & 1) + score += sPressingSpeedConversionTable[j]; + } + ConvertIntToDecimalStringN(gStringVar1, (u16)data[i + 2] >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar2, score / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_XDotY3); - r7 -= GetStringWidth(1, gStringVar4, -1); + xPos -= GetStringWidth(1, gStringVar4, -1); AddTextPrinterParameterized3( - (u8)r6[1], + data[1], 1, - r7, - r10, + xPos, + yPos, sBerryCrushTextColorTable[0], 0, gStringVar4 ); - r10 += 16; - sp0C = 0; + yPos += 16; + score = 0; } - CopyWindowToVram((u8)r6[1], 3); + CopyWindowToVram(data[1], 3); break; case 2: if (gMain.newKeys & (A_BUTTON | B_BUTTON)) @@ -1674,16 +1670,16 @@ void sub_8022250(u8 r4) else return; case 3: - ClearStdWindowAndFrameToTransparent((u8)r6[1], 1); - ClearWindowTilemap((u8)r6[1]); - RemoveWindow((u8)r6[1]); - DestroyTask(r4); + ClearStdWindowAndFrameToTransparent(data[1], 1); + ClearWindowTilemap(data[1]); + RemoveWindow(data[1]); + DestroyTask(taskId); EnableBothScriptContexts(); ScriptContext2_Disable(); - r6[0] = 0; + data[0] = 0; return; } - ++r6[0]; + ++data[0]; } void ShowBerryCrushRankings(void) @@ -1691,7 +1687,7 @@ void ShowBerryCrushRankings(void) u8 taskId; ScriptContext2_Enable(); - taskId = CreateTask(sub_8022250, 0); + 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]; @@ -1943,12 +1939,12 @@ void sub_8022B28(struct Sprite *sprite) r7[2] = 32; r7[7] = 168; r4 = sprite->pos2.x * 128; - r5 = sub_81515D4(7, (168 - sprite->pos1.y) << 7, (r2 + 32) >> 1); + r5 = MathUtil_Div16Shift(7, (168 - sprite->pos1.y) << 7, (r2 + 32) >> 1); sprite->data[0] = sprite->pos1.x << 7; - r7[3] = sub_81515D4(7, r4, r5); - r2 = sub_8151550(7, r5, 85); + r7[3] = MathUtil_Div16Shift(7, r4, r5); + r2 = MathUtil_Mul16Shift(7, r5, 85); r7[4] = r8; - r7[5] = sub_81515D4(7, 0x3F80, r2); + r7[5] = MathUtil_Div16Shift(7, Q_8_8(63.5), r2); r7[6] = sprite->pos2.x / 4; r7[7] |= 0x8000; sprite->pos2.y = r8; @@ -1979,39 +1975,42 @@ void sub_8022BEC(u16 r5, u8 r4, u8 *r7) } } -static u32 sub_8022C58(struct BerryCrushGame *r6, u8 *r1) +static u32 BerryCrushCommand_BeginNormalPaletteFade(struct BerryCrushGame *game, u8 *params) { - u16 r4; - u32 r0; -#ifndef NONMATCHING // fake match, nobody can write such code - register u32 r2 asm("r2"); - register u32 r3 asm("r3"); + // params points to packed values: + // bytes 0-3: selectedPals (bitfield) + // byte 4: delay + // byte 5: startY + // byte 6: stopY + // bytes 7-8: fade color + // byte 9: if TRUE, communicate on fade complete - 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; + u16 color; + u32 selectedPals; + selectedPals = ({ +#ifndef NONMATCHING + register u32 value asm("r2"); + register u32 b asm("r3"); #else - u32 r2; + u32 value; + u32 b; +#endif //NONMATCHING + value = params[0] << 0; + value |= (b = params[1] << 8); + value |= (b = params[2] << 16); + value |= (b = params[3] << 24); + value; + }); + + params[0] = params[9]; + + color = params[8] << 8; + color |= params[7] << 0; - 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); + BeginNormalPaletteFade(selectedPals, params[4], params[5], params[6], color); UpdatePaletteFade(); - r6->unkE = 2; + game->unkE = 2; return 0; } @@ -2028,7 +2027,7 @@ static u32 sub_8022CB0(struct BerryCrushGame *r4, u8 *r5) r4->unkC = 3; return 0; case 1: - sub_8010434(); + Rfu_SetLinkStandbyCallback(); ++r4->unkC; return 0; case 2: @@ -2111,12 +2110,12 @@ static u32 sub_8022E5C(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1 switch (r4->unkC) { case 0: - sub_8010434(); + Rfu_SetLinkStandbyCallback(); break; case 1: if (IsLinkTaskFinished()) { - PlayNewMapMusic(MUS_RG_SLOT); + PlayNewMapMusic(MUS_RG_GAME_CORNER); sub_8022BEC(7, 1, NULL); r4->unk12 = 3; r4->unkC = 0; @@ -2168,7 +2167,7 @@ static u32 sub_8022F1C(struct BerryCrushGame *r5, u8 *r2) sub_8022BEC(3, 1, NULL); return 0; case 1: - sub_8010434(); + Rfu_SetLinkStandbyCallback(); break; case 2: if (!IsLinkTaskFinished()) @@ -2195,7 +2194,7 @@ static u32 sub_8022F1C(struct BerryCrushGame *r5, u8 *r2) } r5->unk10 = 0; ResetBlockReceivedFlags(); - r5->unk20 = sub_81515FC(r5->unk18 << 8, 0x2000); + r5->unk20 = MathUtil_Div32(Q_24_8(r5->unk18), Q_24_8(32)); break; case 5: ClearDialogWindowAndFrame(0, 1); @@ -2214,7 +2213,7 @@ static u32 sub_8023070(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r { case 0: sub_80214A8(r4, &r4->unk138); - sub_8010434(); + Rfu_SetLinkStandbyCallback(); break; case 1: if (!IsLinkTaskFinished()) @@ -2227,14 +2226,14 @@ static u32 sub_8023070(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r case 2: r4->unk138.unk38[r4->unk138.unk0]->callback = sub_8021608; r4->unk138.unk38[r4->unk138.unk0]->affineAnimPaused = FALSE; - PlaySE(SE_NAGERU); + PlaySE(SE_BALL_THROW); break; case 3: if (r4->unk138.unk38[r4->unk138.unk0]->callback == sub_8021608) return 0; r4->unk138.unk38[r4->unk138.unk0] = NULL; ++r4->unk138.unk0; - sub_8010434(); + Rfu_SetLinkStandbyCallback(); break; case 4: if (!IsLinkTaskFinished()) @@ -2248,12 +2247,12 @@ static u32 sub_8023070(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r break; case 5: sub_80216A8(r4, &r4->unk138); - sub_8010434(); + Rfu_SetLinkStandbyCallback(); break; case 6: if (!IsLinkTaskFinished()) return 0; - PlaySE(SE_RU_HYUU); + PlaySE(SE_FALL); sub_8022BEC(11, 1, NULL); r4->unk12 = 5; r4->unkC = 0; @@ -2275,7 +2274,7 @@ static u32 sub_80231B8(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r r4->unk138.unk1 = 4; r4->unk138.unk0 = 0; r4->unk138.unk2 = gUnknown_082F326C[r4->unk138.unk1][0]; - PlaySE(SE_W070); + PlaySE(SE_M_STRENGTH); break; case 1: r4->unk2C = gUnknown_082F326C[r4->unk138.unk1][r4->unk138.unk0]; @@ -2296,7 +2295,7 @@ static u32 sub_80231B8(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); - sub_8010434(); + Rfu_SetLinkStandbyCallback(); break; case 3: if (!IsLinkTaskFinished()) @@ -2324,7 +2323,7 @@ static u32 sub_80232EC(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r return 0; // fallthrough case 0: - sub_8010434(); + Rfu_SetLinkStandbyCallback(); break; case 3: if (!IsLinkTaskFinished()) @@ -2358,7 +2357,7 @@ void sub_802339C(struct BerryCrushGame *r4) for (r7 = 0; r7 < r4->unk9; ++r7) { r2 = gRecvCmds[r7]; - if ((r2[0] & 0xFF00) == 0x2F00 + if ((r2[0] & 0xFF00) == RFUCMD_SEND_PACKET && r2[1] == 2) { if ((u8)r2[2] & 4) @@ -2412,9 +2411,9 @@ void sub_802339C(struct BerryCrushGame *r4) r2_ = r4->unk1A; if (r0 - r2_ > 0) { - r2_ <<= 8; - r2_ = sub_81515FC(r2_, r4->unk20); - r2_ >>= 8; + r2_ = Q_24_8(r2_); + r2_ = MathUtil_Div32(r2_, r4->unk20); + r2_ = Q_24_8_TO_INT(r2_); r4->unk24 = r2_; } else @@ -2560,7 +2559,7 @@ void sub_80236B8(struct BerryCrushGame *r5) r5->unk5C.unk02_1 = r5->unk25_4; r5->unk5C.unk0A = r5->unk25_5; memcpy(r5->unk40.unk2, &r5->unk5C, sizeof(r5->unk40.unk2)); - sub_800FE50(r5->unk40.unk2); + Rfu_SendPacket(r5->unk40.unk2); } void sub_802385C(struct BerryCrushGame *r5) @@ -2581,7 +2580,7 @@ void sub_802385C(struct BerryCrushGame *r5) 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 + if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET || gRecvCmds[0][1] != 2) { r5->unk25_2 = 0; @@ -2668,7 +2667,7 @@ static u32 sub_8023A30(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1 { case 0: r4->unk12 = 8; - PlaySE(SE_W070); + PlaySE(SE_M_STRENGTH); BlendPalettes(0xFFFFFFFF, 8, RGB(31, 31, 0)); r4->unk138.unk0 = 2; break; @@ -2704,7 +2703,7 @@ static u32 sub_8023A30(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1 case 4: if (!sub_80218D4(r4, &r4->unk138)) return 0; - sub_8010434(); + Rfu_SetLinkStandbyCallback(); r4->unk10 = 0; break; case 5: @@ -2725,7 +2724,7 @@ static u32 sub_8023BC0(struct BerryCrushGame *r5, u8 *r6) { case 0: r5->unk12 = 9; - PlaySE(SE_HAZURE); + PlaySE(SE_FAILURE); BlendPalettes(0xFFFFFFFF, 8, RGB(31, 0, 0)); r5->unk138.unk0 = 4; break; @@ -2738,7 +2737,7 @@ static u32 sub_8023BC0(struct BerryCrushGame *r5, u8 *r6) case 2: if (!sub_80218D4(r5, &r5->unk138)) return 0; - sub_8010434(); + Rfu_SetLinkStandbyCallback(); r5->unk10 = 0; SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); @@ -2801,14 +2800,14 @@ static u32 sub_8023CAC(struct BerryCrushGame *r7, __attribute__((unused)) u8 *r1 ); 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; + r2 = MathUtil_Mul32(Q_24_8(r7->unk30), Q_24_8(50)); + r2 = MathUtil_Div32(r2, Q_24_8(r7->unk32)) + Q_24_8(50); + r2 = Q_24_8_TO_INT(r2); 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); + r2 = Q_24_8(r2); + r2 = MathUtil_Div32(r2, Q_24_8(100)); + r4 = Q_24_8(r7->unk1C * r7->unk9); + r4 = MathUtil_Mul32(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) @@ -2823,11 +2822,11 @@ static u32 sub_8023CAC(struct BerryCrushGame *r7, __attribute__((unused)) u8 *r1 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); + r2 = Q_24_8(r2); + r2 = MathUtil_Mul32(r2, Q_24_8(100)); r4 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[3]; - r4 <<= 8; - r4 = sub_81515FC(r2, r4); + r4 = Q_24_8(r4); + r4 = MathUtil_Div32(r2, r4); } else { @@ -2838,11 +2837,11 @@ static u32 sub_8023CAC(struct BerryCrushGame *r7, __attribute__((unused)) u8 *r1 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); + r2 = Q_24_8(r2); + r2 = MathUtil_Mul32(r2, Q_24_8(100)); r4 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[3]; - r4 <<= 8; - r4 = sub_81515FC(r2, r4); + r4 = Q_24_8(r4); + r4 = MathUtil_Div32(r2, r4); } else { @@ -2861,11 +2860,11 @@ static u32 sub_8023CAC(struct BerryCrushGame *r7, __attribute__((unused)) u8 *r1 else { r2 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[5]; - r2 <<= 8; - r2 = sub_8151574(r2, 0x6400); + r2 = Q_24_8(r2); + r2 = MathUtil_Mul32(r2, Q_24_8(100)); r4 = r7->unk28; - r4 <<= 8; - r4 = sub_81515FC(r2, r4); + r4 = Q_24_8(r4); + r4 = MathUtil_Div32(r2, r4); } break; } @@ -3006,7 +3005,7 @@ static u32 sub_8024134(struct BerryCrushGame *r5, u8 *r4) r5->unkC = 0; return 0; case 1: - sub_8010434(); + Rfu_SetLinkStandbyCallback(); break; case 2: if (!IsLinkTaskFinished()) @@ -3014,10 +3013,10 @@ static u32 sub_8024134(struct BerryCrushGame *r5, u8 *r4) DrawDialogueFrame(0, 0); AddTextPrinterParameterized2(0, 1, gText_SavingDontTurnOffPower, 0, 0, 2, 1, 3); CopyWindowToVram(0, 3); - CreateTask(sub_8153688, 0); + CreateTask(Task_LinkSave, 0); break; case 3: - if (FuncIsActiveTask(sub_8153688)) + if (FuncIsActiveTask(Task_LinkSave)) return 0; break; case 4: @@ -3085,7 +3084,7 @@ static u32 sub_80242E0(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1 switch (r4->unkC) { case 0: - sub_8010434(); + Rfu_SetLinkStandbyCallback(); break; case 1: if (!IsLinkTaskFinished()) @@ -3185,12 +3184,12 @@ static u32 sub_8024508(struct BerryCrushGame *r5, __attribute__((unused)) u8 *r1 switch (r5->unkC) { case 0: - sub_8010434(); + Rfu_SetLinkStandbyCallback(); break; case 1: if (!IsLinkTaskFinished()) return 0; - sub_800AC34(); + SetCloseLinkCallback(); break; case 2: if (gReceivedRemoteLinkPlayers != 0) @@ -3210,6 +3209,11 @@ static u32 sub_8024568(__attribute__((unused)) struct BerryCrushGame *r0, __attr return 0; } +#if MODERN +// TODO remove this as soon as the code below is understood +// add a UBFIX if required (code buggy?) +__attribute__((optimize("no-aggressive-loop-optimizations"))) +#endif void sub_8024578(struct BerryCrushGame *r4) { u8 r5 = 0; @@ -3251,68 +3255,23 @@ void sub_8024578(struct BerryCrushGame *r4) } } -#ifdef NONMATCHING -void sub_8024604(u8 *r0, u32 r1, s32 r2, u32 r3, u32 r5, u32 r6, u32 r4) +static void BerryCrush_SetPaletteFadeParams(u8 *params, bool8 communicateAfter, u32 selectedPals, s8 delay, u8 startY, u8 targetY, u16 palette) { - 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; + params[0] = ((u8 *)&selectedPals)[0]; + params[1] = ((u8 *)&selectedPals)[1]; + params[2] = ((u8 *)&selectedPals)[2]; + params[3] = ((u8 *)&selectedPals)[3]; + params[4] = delay; + params[5] = startY; + params[6] = targetY; + params[7] = ((u8 *)&palette)[0]; + params[8] = ((u8 *)&palette)[1]; + params[9] = communicateAfter; } -#else -NAKED -void sub_8024604(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_8024644(u8 *r0, u32 r1, u32 r2, u32 r3, u32 r5) { - u8 sp[4]; + u8 sp[2]; 0[(u16 *)sp] = r3; r0[0] = r1; |