summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/berry_blender.c1800
-rw-r--r--src/link.c5
2 files changed, 1586 insertions, 219 deletions
diff --git a/src/berry_blender.c b/src/berry_blender.c
index ce2f3db20..74b87b983 100644
--- a/src/berry_blender.c
+++ b/src/berry_blender.c
@@ -7,13 +7,19 @@
#include "menu.h"
#include "strings2.h"
#include "sound.h"
+#include "songs.h"
#include "berry.h"
#include "string_util.h"
#include "link.h"
#include "task.h"
#include "rom4.h"
+#include "item.h"
#include "items.h"
#include "rng.h"
+#include "save.h"
+#include "menu_cursor.h"
+#include "trig.h"
+#include "pokeblock.h"
//needed to match Blender_ControlHitPitch
struct MusicPlayerInfo
@@ -44,10 +50,20 @@ struct MusicPlayerInfo
// other files functions
void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch);
void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo);
+void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo);
void sub_80A6978(void);
u8 sub_80A7DEC(u8 berryId, u8 x, u8 y, bool8 animate);
+void sub_814A880(u8 a1, u8 a2);
+u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5);
+s8 sub_810CA00(void);
+bool8 sub_810CA34(struct Pokeblock *pokeblock);
+
+#define BLENDER_SCORE_BEST 0
+#define BLENDER_SCORE_GOOD 1
+#define BLENDER_SCORE_MISS 2
#define BLENDER_MAX_PLAYERS 4
+#define BLENDER_SCORES_NO 3
#define FLAVOUR_SPICY 0
#define FLAVOUR_DRY 1
@@ -69,55 +85,7 @@ struct BerryBlenderData
u8 field_1;
u8 field_2;
u8 field_3;
- u8 field_4;
- u8 field_5;
- u8 field_6;
- u8 field_7;
- u8 field_8;
- u8 field_9;
- u8 field_A;
- u8 field_B;
- u8 field_C;
- u8 field_D;
- u8 field_E;
- u8 field_F;
- u8 field_10;
- u8 field_11;
- u8 field_12;
- u8 field_13;
- u8 field_14;
- u8 field_15;
- u8 field_16;
- u8 field_17;
- u8 field_18;
- u8 field_19;
- u8 field_1A;
- u8 field_1B;
- u8 field_1C;
- u8 field_1D;
- u8 field_1E;
- u8 field_1F;
- u8 field_20;
- u8 field_21;
- u8 field_22;
- u8 field_23;
- u8 field_24;
- u8 field_25;
- u8 field_26;
- u8 field_27;
- u8 field_28;
- u8 field_29;
- u8 field_2A;
- u8 field_2B;
- u8 field_2C;
- u8 field_2D;
- u8 field_2E;
- u8 field_2F;
- u8 field_30;
- u8 field_31;
- u8 field_32;
- u8 field_33;
- u8 field_34;
+ struct Window field_4;
u8 field_35;
u8 field_36;
u8 field_37;
@@ -144,15 +112,11 @@ struct BerryBlenderData
u8 field_4C;
u8 field_4D;
u16 field_4E;
- u8 field_50;
- u8 field_51;
- u8 field_52;
- u8 field_53;
+ u8 scoreIconIDs[3];
u16 arrowPos;
s16 field_56;
- u8 field_58;
- u8 field_59;
- u16 field_5A;
+ s16 field_58;
+ u16 max_RPM;
u8 SyncArrowSpriteID[BLENDER_MAX_PLAYERS];
u8 SyncArrowSprite2ID[BLENDER_MAX_PLAYERS];
u8 field_64;
@@ -168,15 +132,13 @@ struct BerryBlenderData
u8 field_6E;
u8 field_6F;
u16 field_70[BLENDER_MAX_PLAYERS];
- u8 field_78;
- u8 field_79;
- u8 field_7A;
- u8 field_7B;
+ u16 field_78;
+ u16 field_7A;
u16 field_7C;
u8 field_7E;
u8 field_7F;
- u16 field_80[BLENDER_MAX_PLAYERS];
- u8 field_88;
+ u16 chosenItemID[BLENDER_MAX_PLAYERS];
+ u8 playersNo;
u8 field_89;
u8 field_8A;
u8 field_8B;
@@ -188,8 +150,7 @@ struct BerryBlenderData
u8 field_91;
u8 field_92;
u8 field_93;
- u8 field_94;
- u8 field_95;
+ u16 field_94;
u8 field_96;
u8 field_97;
u8 field_98;
@@ -197,67 +158,7 @@ struct BerryBlenderData
u16 field_9A[BLENDER_MAX_PLAYERS];
u16 field_A2[BLENDER_MAX_PLAYERS];
u8 field_AA;
- u8 field_AB;
- u8 field_AC;
- u8 field_AD;
- u8 field_AE;
- u8 field_AF;
- u8 field_B0;
- u8 field_B1;
- u8 field_B2;
- u8 field_B3;
- u8 field_B4;
- u8 field_B5;
- u8 field_B6;
- u8 field_B7;
- u8 field_B8;
- u8 field_B9;
- u8 field_BA;
- u8 field_BB;
- u8 field_BC;
- u8 field_BD;
- u8 field_BE;
- u8 field_BF;
- u8 field_C0;
- u8 field_C1;
- u8 field_C2;
- u8 field_C3;
- u8 field_C4;
- u8 field_C5;
- u8 field_C6;
- u8 field_C7;
- u8 field_C8;
- u8 field_C9;
- u8 field_CA;
- u8 field_CB;
- u8 field_CC;
- u8 field_CD;
- u8 field_CE;
- u8 field_CF;
- u8 field_D0;
- u8 field_D1;
- u8 field_D2;
- u8 field_D3;
- u8 field_D4;
- u8 field_D5;
- u8 field_D6;
- u8 field_D7;
- u8 field_D8;
- u8 field_D9;
- u8 field_DA;
- u8 field_DB;
- u8 field_DC;
- u8 field_DD;
- u8 field_DE;
- u8 field_DF;
- u8 field_E0;
- u8 field_E1;
- u8 field_E2;
- u8 field_E3;
- u8 field_E4;
- u8 field_E5;
- u8 field_E6;
- u8 field_E7;
+ u8 stringVar[61];
u8 field_E8;
u8 field_E9;
u8 field_EA;
@@ -326,8 +227,8 @@ struct BerryBlenderData
u8 field_129;
u8 field_12A;
u8 field_12B;
- u32 field_12C;
- s32 field_130;
+ u32 gameFrameTime;
+ s32 framesToWait;
u32 field_134;
u8 field_138;
u8 field_139;
@@ -342,31 +243,17 @@ struct BerryBlenderData
s16 field_146;
u8 field_148[3];
u8 field_14B;
- u16 field_14C[BLENDER_MAX_PLAYERS][3];
- u8 field_164;
- u8 field_165;
- u8 field_166;
- u8 field_167;
- u8 field_168;
- u8 field_169;
- u8 field_16A;
- u8 field_16B;
- u8 field_16C;
- u8 field_16D;
- u8 field_16E;
- u8 field_16F;
- u8 field_170;
- u8 field_171;
- u8 field_172;
- u8 field_173;
- u8 field_174;
- u8 field_175;
- u8 field_176;
- u8 field_177;
+ u16 scores[BLENDER_MAX_PLAYERS][3];
+ u8 playerPlaces[BLENDER_MAX_PLAYERS];
+ struct BgAffineDstData field_168;
u16 field_178;
u8 field_17A;
u8 field_17B;
struct BlenderBerry blendedBerries[BLENDER_MAX_PLAYERS];
+ u32 field_1BC;
+ u16 field_1C0;
+ u16 field_1C2;
+ u32 field_1C4;
};
extern struct BerryBlenderData* sBerryBlenderData;
@@ -384,11 +271,11 @@ void sub_804E884(u8 a0);
void sub_8051474(void);
void sub_804E9F8(void);
void sub_804F378(void);
-void sub_8051414(void*);
+void sub_8051414(struct BgAffineDstData *dest);
void sub_804F238(void);
void sub_80501FC(void);
bool8 sub_8051B8C(void);
-void sub_80516C4(u8 a0, u16 itemID);
+void Blender_SetBankBerryData(u8 bank, u16 itemID);
void sub_804F2A8(void);
void sub_804F81C(void);
void sub_805156C(void);
@@ -399,6 +286,14 @@ void sub_8051A3C(u16 a0);
void sub_8051B18(void);
void sub_805123C(void);
void sub_8050954(void);
+bool8 Blender_PrintBlendingRanking(void);
+bool8 Blender_PrintBlendingResults(void);
+void sub_80510E8(void);
+void sub_8050E30(void);
+void sub_805197C(u16 a0, u16 a1);
+void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst);
+void sub_8052BD0(u8 taskID);
+void sub_8052AF8(void);
void Blender_ControlHitPitch(void)
{
@@ -705,20 +600,20 @@ void sub_804E884(u8 a0)
break;
case 1:
gUnknown_03004834 = 1;
- sBerryBlenderData->field_88 = 2;
+ sBerryBlenderData->playersNo = 2;
StringCopy(gLinkPlayers[0].name, gSaveBlock2.playerName);
StringCopy(gLinkPlayers[1].name, gUnknown_082162B8[0]);
break;
case 2:
gUnknown_03004834 = 2;
- sBerryBlenderData->field_88 = 3;
+ sBerryBlenderData->playersNo = 3;
StringCopy(gLinkPlayers[0].name, gSaveBlock2.playerName);
StringCopy(gLinkPlayers[1].name, gUnknown_082162B8[0]);
StringCopy(gLinkPlayers[2].name, gUnknown_082162B8[1]);
break;
case 3:
gUnknown_03004834 = 3;
- sBerryBlenderData->field_88 = 4;
+ sBerryBlenderData->playersNo = 4;
StringCopy(gLinkPlayers[0].name, gSaveBlock2.playerName);
StringCopy(gLinkPlayers[1].name, gUnknown_082162B8[0]);
StringCopy(gLinkPlayers[2].name, gUnknown_082162B8[1]);
@@ -737,7 +632,7 @@ void sub_804E990(void)
sBerryBlenderData->field_134 = 0;
for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
{
- sBerryBlenderData->field_80[i] = 0;
+ sBerryBlenderData->chosenItemID[i] = 0;
}
sub_804E884(gSpecialVar_0x8004);
if (gSpecialVar_0x8004 == 0)
@@ -776,13 +671,13 @@ void sub_804E9F8(void)
sBerryBlenderData->field_70[i] = 0;
for (j = 0; j < 3; j++)
{
- sBerryBlenderData->field_14C[i][j] = 0;
+ sBerryBlenderData->scores[i][j] = 0;
}
}
sBerryBlenderData->field_7C = 0;
sBerryBlenderData->field_56 = 0;
sBerryBlenderData->arrowPos = 0;
- sBerryBlenderData->field_5A = 0;
+ sBerryBlenderData->max_RPM = 0;
sBerryBlenderData->field_1 = 0;
break;
case 1:
@@ -815,7 +710,7 @@ void sub_804E9F8(void)
MenuDrawTextWindow(0, 13, 29, 19);
MenuPrint(gOtherText_LinkStandby3, 1, 14);
sBerryBlenderData->field_0 = 8;
- sBerryBlenderData->field_130 = 0;
+ sBerryBlenderData->framesToWait = 0;
break;
case 8:
sBerryBlenderData->field_0++;
@@ -823,7 +718,7 @@ void sub_804E9F8(void)
Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gScriptItemId);
memcpy(gBlockSendBuffer, &sBerryBlenderData->blendedBerries[0], sizeof(struct BlenderBerry));
sub_80084A4();
- sBerryBlenderData->field_130 = 0;
+ sBerryBlenderData->framesToWait = 0;
break;
case 9:
if (sub_8007ECC())
@@ -835,7 +730,7 @@ void sub_804E9F8(void)
}
break;
case 10:
- if (++sBerryBlenderData->field_130 > 20)
+ if (++sBerryBlenderData->framesToWait > 20)
{
MenuZeroFillScreen();
if (GetBlockReceivedStatus() == sub_8008198())
@@ -843,7 +738,7 @@ void sub_804E9F8(void)
for (i = 0; i < GetLinkPlayerCount(); i++)
{
memcpy(&sBerryBlenderData->blendedBerries[i], &gBlockRecvBuffer[i][0], sizeof(struct BlenderBerry));
- sBerryBlenderData->field_80[i] = sBerryBlenderData->blendedBerries[i].itemID;
+ sBerryBlenderData->chosenItemID[i] = sBerryBlenderData->blendedBerries[i].itemID;
}
ResetBlockReceivedFlags();
sBerryBlenderData->field_0++;
@@ -851,30 +746,30 @@ void sub_804E9F8(void)
}
break;
case 11:
- sBerryBlenderData->field_88 = GetLinkPlayerCount();
+ sBerryBlenderData->playersNo = GetLinkPlayerCount();
for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
{
- if (sBerryBlenderData->field_13C == gUnknown_082162EC[sBerryBlenderData->field_88 - 2][i])
+ if (sBerryBlenderData->field_13C == gUnknown_082162EC[sBerryBlenderData->playersNo - 2][i])
{
- sub_804E7C0(sBerryBlenderData->field_80[sBerryBlenderData->field_13C], i);
+ sub_804E7C0(sBerryBlenderData->chosenItemID[sBerryBlenderData->field_13C], i);
break;
}
}
- sBerryBlenderData->field_130 = 0;
+ sBerryBlenderData->framesToWait = 0;
sBerryBlenderData->field_0++;
sBerryBlenderData->field_13C++;
break;
case 12:
- if (++sBerryBlenderData->field_130 > 60)
+ if (++sBerryBlenderData->framesToWait > 60)
{
- if (sBerryBlenderData->field_13C >= sBerryBlenderData->field_88)
+ if (sBerryBlenderData->field_13C >= sBerryBlenderData->playersNo)
{
sBerryBlenderData->field_0++;
- sBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[sBerryBlenderData->field_88 - 2]] - 22528;
+ sBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[sBerryBlenderData->playersNo - 2]] - 22528;
}
else
sBerryBlenderData->field_0--;
- sBerryBlenderData->field_130 = 0;
+ sBerryBlenderData->framesToWait = 0;
}
break;
case 13:
@@ -892,9 +787,9 @@ void sub_804E9F8(void)
{
sBerryBlenderData->field_0++;
sBerryBlenderData->field_142 = 256;
- sBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[sBerryBlenderData->field_88 - 2]];
+ sBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[sBerryBlenderData->playersNo - 2]];
REG_BG2CNT = 0x4882;
- sBerryBlenderData->field_130 = 0;
+ sBerryBlenderData->framesToWait = 0;
sub_804F238();
sub_804F2A8();
}
@@ -903,7 +798,7 @@ void sub_804E9F8(void)
case 15:
if (sub_8051B8C())
{
- sBerryBlenderData->field_130 = 0;
+ sBerryBlenderData->framesToWait = 0;
sBerryBlenderData->field_0++;
}
sub_8051414(&sBerryBlenderData->field_168);
@@ -928,7 +823,7 @@ void sub_804E9F8(void)
break;
case 21:
sBerryBlenderData->field_56 = 128;
- sBerryBlenderData->field_12C = 0;
+ sBerryBlenderData->gameFrameTime = 0;
SetMainCallback2(sub_80501FC);
if (GetCurrentMapMusic() != 403)
{
@@ -974,7 +869,7 @@ void sub_804F0F4(void)
sBerryBlenderData->field_4E = 0;
sBerryBlenderData->field_56 = 0;
sBerryBlenderData->arrowPos = 0;
- sBerryBlenderData->field_5A = 0;
+ sBerryBlenderData->max_RPM = 0;
sBerryBlenderData->field_144 = 0;
sBerryBlenderData->field_146 = 0;
sBerryBlenderData->field_0++;
@@ -1022,7 +917,7 @@ void sub_804F1BC(u16 itemID, u8 a1, struct BlenderBerry* berry)
}
for (i = 0; i < a1 - 1; i++)
{
- sub_80516C4(i + 1, gUnknown_082165BC[r4][i] + 133);
+ Blender_SetBankBerryData(i + 1, gUnknown_082165BC[r4][i] + 133);
}
}
@@ -1032,7 +927,7 @@ void sub_804F238(void)
for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
{
sBerryBlenderData->field_A2[i] = 0xFF;
- sBerryBlenderData->field_9A[i] = gUnknown_082162EC[sBerryBlenderData->field_88 - 2][i];
+ sBerryBlenderData->field_9A[i] = gUnknown_082162EC[sBerryBlenderData->playersNo - 2][i];
}
for (j = 0; j < BLENDER_MAX_PLAYERS; j++)
{
@@ -1075,15 +970,15 @@ void sub_804F378(void)
{
case 0:
sub_804F0F4();
- sub_80516C4(0, gScriptItemId);
+ Blender_SetBankBerryData(0, gScriptItemId);
Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gScriptItemId);
- sub_804F1BC(gScriptItemId, sBerryBlenderData->field_88, &sBerryBlenderData->blendedBerries[0]);
+ sub_804F1BC(gScriptItemId, sBerryBlenderData->playersNo, &sBerryBlenderData->blendedBerries[0]);
for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
{
sBerryBlenderData->field_70[i] = 0;
for (j = 0; j < 3; j++)
{
- sBerryBlenderData->field_14C[i][j] = 0;
+ sBerryBlenderData->scores[i][j] = 0;
}
}
sBerryBlenderData->field_7C = 0;
@@ -1107,10 +1002,10 @@ void sub_804F378(void)
case 3:
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
sBerryBlenderData->field_0++;
- sBerryBlenderData->field_130 = 0;
+ sBerryBlenderData->framesToWait = 0;
break;
case 4:
- if (++sBerryBlenderData->field_130 == 2)
+ if (++sBerryBlenderData->framesToWait == 2)
sub_804E4FC();
if (!gPaletteFade.active)
sBerryBlenderData->field_0 = 8;
@@ -1122,28 +1017,28 @@ void sub_804F378(void)
case 11:
for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
{
- u32 var = gUnknown_082162EC[sBerryBlenderData->field_88 - 2][i];
+ u32 var = gUnknown_082162EC[sBerryBlenderData->playersNo - 2][i];
if (sBerryBlenderData->field_13C == var)
{
- sub_804E7C0(sBerryBlenderData->field_80[sBerryBlenderData->field_13C], i);
+ sub_804E7C0(sBerryBlenderData->chosenItemID[sBerryBlenderData->field_13C], i);
break;
}
}
- sBerryBlenderData->field_130 = 0;
+ sBerryBlenderData->framesToWait = 0;
sBerryBlenderData->field_0++;
sBerryBlenderData->field_13C++;
break;
case 12:
- if (++sBerryBlenderData->field_130 > 60)
+ if (++sBerryBlenderData->framesToWait > 60)
{
- if (sBerryBlenderData->field_13C >= sBerryBlenderData->field_88)
+ if (sBerryBlenderData->field_13C >= sBerryBlenderData->playersNo)
{
- sBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[sBerryBlenderData->field_88 - 2]] - 22528;
+ sBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[sBerryBlenderData->playersNo - 2]] - 22528;
sBerryBlenderData->field_0++;
}
else
sBerryBlenderData->field_0--;
- sBerryBlenderData->field_130 = 0;
+ sBerryBlenderData->framesToWait = 0;
}
break;
case 13:
@@ -1160,9 +1055,9 @@ void sub_804F378(void)
{
sBerryBlenderData->field_0++;
sBerryBlenderData->field_142 = 256;
- sBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[sBerryBlenderData->field_88 - 2]];
+ sBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[sBerryBlenderData->playersNo - 2]];
REG_BG2CNT = 0x4882;
- sBerryBlenderData->field_130 = 0;
+ sBerryBlenderData->framesToWait = 0;
PlaySE(52);
sub_804F2A8();
}
@@ -1191,7 +1086,7 @@ void sub_804F378(void)
case 21:
sub_804F81C();
sBerryBlenderData->field_56 = 128;
- sBerryBlenderData->field_12C = 0;
+ sBerryBlenderData->gameFrameTime = 0;
sBerryBlenderData->field_14B = 0;
sBerryBlenderData->field_7E = 0;
SetMainCallback2(sub_80501FC);
@@ -1424,20 +1319,20 @@ void sub_804FD30(u16 a0)
{
case 0x4523:
if (sBerryBlenderData->field_56 < 1500)
- sBerryBlenderData->field_56 += (384 / gUnknown_082165DA[sBerryBlenderData->field_88]);
+ sBerryBlenderData->field_56 += (384 / gUnknown_082165DA[sBerryBlenderData->playersNo]);
else
{
- sBerryBlenderData->field_56 += (128 / gUnknown_082165DA[sBerryBlenderData->field_88]);
+ sBerryBlenderData->field_56 += (128 / gUnknown_082165DA[sBerryBlenderData->playersNo]);
sub_8051AC8(&sBerryBlenderData->field_144, (sBerryBlenderData->field_56 / 100) - 10);
sub_8051AC8(&sBerryBlenderData->field_146, (sBerryBlenderData->field_56 / 100) - 10);
}
break;
case 0x5432:
if (sBerryBlenderData->field_56 < 1500)
- sBerryBlenderData->field_56 += (256 / gUnknown_082165DA[sBerryBlenderData->field_88]);
+ sBerryBlenderData->field_56 += (256 / gUnknown_082165DA[sBerryBlenderData->playersNo]);
break;
case 0x2345:
- sBerryBlenderData->field_56 -= (256 / gUnknown_082165DA[sBerryBlenderData->field_88]);
+ sBerryBlenderData->field_56 -= (256 / gUnknown_082165DA[sBerryBlenderData->playersNo]);
if (sBerryBlenderData->field_56 < 128)
sBerryBlenderData->field_56 = 128;
break;
@@ -1462,7 +1357,7 @@ void sub_804FE70(void)
gRecvCmds[0][i] = 0x4444;
}
}
- for (i = 0; i < sBerryBlenderData->field_88; i++)
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
{
if (gRecvCmds[0][i] == 0x4444)
{
@@ -1474,23 +1369,23 @@ void sub_804FE70(void)
if (sBerryBlenderData->field_13E >= 1000)
sBerryBlenderData->field_13E = 1000;
sub_804FC48(0x4523, var);
- sBerryBlenderData->field_14C[i][0]++;
+ sBerryBlenderData->scores[i][BLENDER_SCORE_BEST]++;
}
else if (gRecvCmds[2][i] == 0x5432)
{
sub_804FD30(0x5432);
sBerryBlenderData->field_13E += (sBerryBlenderData->field_56 / 70);
sub_804FC48(0x5432, var);
- sBerryBlenderData->field_14C[i][1]++;
+ sBerryBlenderData->scores[i][BLENDER_SCORE_GOOD]++;
}
else if (gRecvCmds[2][i] == 0x2345)
{
sub_804FC48(0x2345, var);
sub_804FD30(0x2345);
- if (sBerryBlenderData->field_15 > 1000)
+ if (sBerryBlenderData->field_4.win_field_F > 1000)
sBerryBlenderData->field_13E = 1000;
- if (sBerryBlenderData->field_14C[i][2] < 999)
- sBerryBlenderData->field_14C[i][2]++;
+ if (sBerryBlenderData->scores[i][BLENDER_SCORE_MISS] < 999)
+ sBerryBlenderData->scores[i][BLENDER_SCORE_MISS]++;
}
if (gRecvCmds[2][i] == 0x2345 || gRecvCmds[2][i] == 0x4523 || gRecvCmds[2][i] == 0x5432)
{
@@ -1503,7 +1398,7 @@ void sub_804FE70(void)
}
if (gSpecialVar_0x8004 != 0)
{
- for (i = 0; i < sBerryBlenderData->field_88; i++)
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
{
gRecvCmds[0][i] = 0;
gRecvCmds[2][i] = 0;
@@ -1549,8 +1444,8 @@ void sub_80500A8(void)
void sub_80501FC(void)
{
sub_8051474();
- if (sBerryBlenderData->field_12C < 359940)
- sBerryBlenderData->field_12C++;
+ if (sBerryBlenderData->gameFrameTime < (99 * 60 * 60) + (59 * 60)) // game time can't be longer than 99 minutes and 59 seconds, can't print 3 digits
+ sBerryBlenderData->gameFrameTime++;
sub_80500A8();
SetLinkDebugValues((u16)(sBerryBlenderData->field_56), sBerryBlenderData->field_13E);
sub_804FE70();
@@ -1703,11 +1598,18 @@ extern u32 gUnknown_0300055C;
extern const u8 gUnknown_082165DF[];
-void sub_8050520(struct BlenderBerry* berries, u8* a1, u8 a2, u8* a3, u16 a4)
-{
- s32 i, j;
+#ifdef NONMATCHING
- s32 var5, var6;
+void sub_8050520(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 a2, u8* a3, u16 a4)
+{
+ s32 i;
+ s32 j;
+ s32 savedEntry;
+ s32 var3;
+ s32 var4;
+ s32 var6;
+ s32 var11;
+ u16 rand;
for (i = 0; i < 6; i++)
gUnknown_03000510[i] = 0;
@@ -1717,12 +1619,12 @@ void sub_8050520(struct BlenderBerry* berries, u8* a1, u8 a2, u8* a3, u16 a4)
gUnknown_03000510[j] += berries[i].flavours[j];
}
- var5 = gUnknown_03000510[0];
+ savedEntry = gUnknown_03000510[0];
gUnknown_03000510[0] -= gUnknown_03000510[1];
gUnknown_03000510[1] -= gUnknown_03000510[2];
gUnknown_03000510[2] -= gUnknown_03000510[3];
gUnknown_03000510[3] -= gUnknown_03000510[4];
- gUnknown_03000510[4] -= var5;
+ gUnknown_03000510[4] -= savedEntry;
var6 = 0;
for (i = 0; i < 6; i++)
@@ -1733,7 +1635,7 @@ void sub_8050520(struct BlenderBerry* berries, u8* a1, u8 a2, u8* a3, u16 a4)
var6++;
}
}
- for (i = 0; i < 6; i++)
+ for (i = 0; i < 5; i++)
{
if (gUnknown_03000510[i] > 0)
{
@@ -1743,18 +1645,18 @@ void sub_8050520(struct BlenderBerry* berries, u8* a1, u8 a2, u8* a3, u16 a4)
gUnknown_03000510[i] -= var6;
}
}
- for (i = 0; i < 6; i++)
+ for (i = 0; i < 5; i++)
{
gUnknown_03000530[i] = gUnknown_03000510[i];
}
- gUnknown_0300055C = ((a4 / 333) + 100);
+ var11 = a4 / 333 + 100;
+ gUnknown_0300055C = ((var11));
for (i = 0; i < 5; i++)
{
- s32 var4;
- s32 var3 = gUnknown_03000510[i];
- var3 = (((a4 / 333) + 100) * var3) / 10;
+ var3 = gUnknown_03000510[i];
+ var3 = ((var11) * var3) / 10;
var4 = var3 % 10;
var3 /= 10;
if (var4 > 4)
@@ -1767,11 +1669,11 @@ void sub_8050520(struct BlenderBerry* berries, u8* a1, u8 a2, u8* a3, u16 a4)
}
*a1 = sub_80502F8(berries, &gUnknown_03000510[0], a2, var6);
gUnknown_03000510[5] = (gUnknown_03000510[5] / a2) - a2;
- if (gUnknown_03000510[5] > 0)
+ if (gUnknown_03000510[5] < 0)
gUnknown_03000510[5] = 0;
if (*a1 == 12)
{
- u16 rand = Random() % 10;
+ rand = Random() % 10;
for (i = 0; i < 6; i++)
{
if ((gUnknown_082165DF[rand] >> i) & 1)
@@ -1796,3 +1698,1467 @@ void sub_8050520(struct BlenderBerry* berries, u8* a1, u8 a2, u8* a3, u16 a4)
a3[i] = gUnknown_03000510[i];
}
}
+
+#else
+__attribute__((naked))
+void sub_8050520(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 a2, u8* a3, u16 a4)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x10\n\
+ str r0, [sp]\n\
+ mov r8, r1\n\
+ str r3, [sp, 0x4]\n\
+ ldr r0, [sp, 0x30]\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ mov r9, r2\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x8]\n\
+ ldr r7, _080505DC @ =gUnknown_03000510\n\
+ adds r2, r7, 0\n\
+ movs r1, 0\n\
+ adds r0, r7, 0\n\
+ adds r0, 0xA\n\
+_0805054A:\n\
+ strh r1, [r0]\n\
+ subs r0, 0x2\n\
+ cmp r0, r2\n\
+ bge _0805054A\n\
+ movs r6, 0\n\
+ cmp r6, r9\n\
+ bge _08050580\n\
+ ldr r0, _080505DC @ =gUnknown_03000510\n\
+ mov r12, r0\n\
+ ldr r5, [sp]\n\
+ adds r5, 0x9\n\
+_08050560:\n\
+ movs r3, 0\n\
+ adds r4, r5, 0\n\
+ mov r2, r12\n\
+_08050566:\n\
+ adds r1, r4, r3\n\
+ ldrh r0, [r2]\n\
+ ldrb r1, [r1]\n\
+ adds r0, r1\n\
+ strh r0, [r2]\n\
+ adds r2, 0x2\n\
+ adds r3, 0x1\n\
+ cmp r3, 0x5\n\
+ ble _08050566\n\
+ adds r5, 0x10\n\
+ adds r6, 0x1\n\
+ cmp r6, r9\n\
+ blt _08050560\n\
+_08050580:\n\
+ movs r1, 0\n\
+ ldrsh r3, [r7, r1]\n\
+ ldrh r0, [r7]\n\
+ ldrh r1, [r7, 0x2]\n\
+ subs r0, r1\n\
+ strh r0, [r7]\n\
+ ldrh r0, [r7, 0x4]\n\
+ subs r1, r0\n\
+ strh r1, [r7, 0x2]\n\
+ ldrh r1, [r7, 0x6]\n\
+ subs r0, r1\n\
+ strh r0, [r7, 0x4]\n\
+ ldrh r0, [r7, 0x8]\n\
+ subs r1, r0\n\
+ strh r1, [r7, 0x6]\n\
+ subs r0, r3\n\
+ strh r0, [r7, 0x8]\n\
+ movs r3, 0\n\
+ movs r2, 0\n\
+ adds r1, r7, 0\n\
+ movs r6, 0x4\n\
+_080505AA:\n\
+ movs r4, 0\n\
+ ldrsh r0, [r1, r4]\n\
+ cmp r0, 0\n\
+ bge _080505B6\n\
+ strh r2, [r1]\n\
+ adds r3, 0x1\n\
+_080505B6:\n\
+ adds r1, 0x2\n\
+ subs r6, 0x1\n\
+ cmp r6, 0\n\
+ bge _080505AA\n\
+ lsls r0, r3, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ movs r4, 0\n\
+ ldr r1, _080505DC @ =gUnknown_03000510\n\
+ movs r6, 0x4\n\
+_080505CA:\n\
+ ldrh r2, [r1]\n\
+ movs r5, 0\n\
+ ldrsh r0, [r1, r5]\n\
+ cmp r0, 0\n\
+ ble _080505E4\n\
+ cmp r0, r3\n\
+ bge _080505E0\n\
+ strh r4, [r1]\n\
+ b _080505E4\n\
+ .align 2, 0\n\
+_080505DC: .4byte gUnknown_03000510\n\
+_080505E0:\n\
+ subs r0, r2, r3\n\
+ strh r0, [r1]\n\
+_080505E4:\n\
+ adds r1, 0x2\n\
+ subs r6, 0x1\n\
+ cmp r6, 0\n\
+ bge _080505CA\n\
+ ldr r1, _080506C4 @ =gUnknown_03000510\n\
+ ldr r2, _080506C8 @ =gUnknown_03000530\n\
+ movs r6, 0x4\n\
+_080505F2:\n\
+ movs r3, 0\n\
+ ldrsh r0, [r1, r3]\n\
+ stm r2!, {r0}\n\
+ adds r1, 0x2\n\
+ subs r6, 0x1\n\
+ cmp r6, 0\n\
+ bge _080505F2\n\
+ ldr r1, _080506CC @ =0x0000014d\n\
+ ldr r0, [sp, 0x8]\n\
+ bl __udivsi3\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ adds r3, r0, 0\n\
+ adds r3, 0x64\n\
+ ldr r4, _080506D0 @ =gUnknown_0300055C\n\
+ str r3, [r4]\n\
+ movs r6, 0x4\n\
+_08050616:\n\
+ movs r0, 0\n\
+ ldrsh r5, [r7, r0]\n\
+ adds r0, r5, 0\n\
+ muls r0, r3\n\
+ movs r1, 0xA\n\
+ str r3, [sp, 0xC]\n\
+ bl __divsi3\n\
+ adds r5, r0, 0\n\
+ movs r1, 0xA\n\
+ bl __modsi3\n\
+ adds r4, r0, 0\n\
+ adds r0, r5, 0\n\
+ movs r1, 0xA\n\
+ bl __divsi3\n\
+ adds r5, r0, 0\n\
+ ldr r3, [sp, 0xC]\n\
+ cmp r4, 0x4\n\
+ ble _08050642\n\
+ adds r5, 0x1\n\
+_08050642:\n\
+ strh r5, [r7]\n\
+ adds r7, 0x2\n\
+ subs r6, 0x1\n\
+ cmp r6, 0\n\
+ bge _08050616\n\
+ ldr r1, _080506C4 @ =gUnknown_03000510\n\
+ ldr r2, _080506D4 @ =gUnknown_03000548\n\
+ movs r6, 0x4\n\
+_08050652:\n\
+ movs r3, 0\n\
+ ldrsh r0, [r1, r3]\n\
+ stm r2!, {r0}\n\
+ adds r1, 0x2\n\
+ subs r6, 0x1\n\
+ cmp r6, 0\n\
+ bge _08050652\n\
+ ldr r4, _080506C4 @ =gUnknown_03000510\n\
+ ldr r0, [sp]\n\
+ adds r1, r4, 0\n\
+ mov r2, r9\n\
+ mov r3, r10\n\
+ bl sub_80502F8\n\
+ mov r5, r8\n\
+ strb r0, [r5]\n\
+ movs r1, 0xA\n\
+ ldrsh r0, [r4, r1]\n\
+ mov r1, r9\n\
+ bl __divsi3\n\
+ mov r3, r9\n\
+ subs r0, r3\n\
+ strh r0, [r4, 0xA]\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ bge _0805068C\n\
+ movs r0, 0\n\
+ strh r0, [r4, 0xA]\n\
+_0805068C:\n\
+ mov r5, r8\n\
+ ldrb r0, [r5]\n\
+ cmp r0, 0xC\n\
+ bne _080506E6\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0xA\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ movs r6, 0\n\
+ ldr r0, _080506D8 @ =gUnknown_082165DF\n\
+ adds r0, r3, r0\n\
+ ldrb r0, [r0]\n\
+ adds r1, r4, 0\n\
+ movs r4, 0x1\n\
+ movs r3, 0x2\n\
+_080506B4:\n\
+ adds r2, r0, 0\n\
+ asrs r2, r6\n\
+ ands r2, r4\n\
+ cmp r2, 0\n\
+ beq _080506DC\n\
+ strh r3, [r1]\n\
+ b _080506DE\n\
+ .align 2, 0\n\
+_080506C4: .4byte gUnknown_03000510\n\
+_080506C8: .4byte gUnknown_03000530\n\
+_080506CC: .4byte 0x0000014d\n\
+_080506D0: .4byte gUnknown_0300055C\n\
+_080506D4: .4byte gUnknown_03000548\n\
+_080506D8: .4byte gUnknown_082165DF\n\
+_080506DC:\n\
+ strh r2, [r1]\n\
+_080506DE:\n\
+ adds r1, 0x2\n\
+ adds r6, 0x1\n\
+ cmp r6, 0x4\n\
+ ble _080506B4\n\
+_080506E6:\n\
+ ldr r7, _08050740 @ =gUnknown_03000510\n\
+ movs r2, 0xFF\n\
+ adds r1, r7, 0\n\
+ movs r6, 0x5\n\
+_080506EE:\n\
+ movs r3, 0\n\
+ ldrsh r0, [r1, r3]\n\
+ cmp r0, 0xFF\n\
+ ble _080506F8\n\
+ strh r2, [r1]\n\
+_080506F8:\n\
+ adds r1, 0x2\n\
+ subs r6, 0x1\n\
+ cmp r6, 0\n\
+ bge _080506EE\n\
+ ldrh r0, [r7]\n\
+ mov r4, r8\n\
+ strb r0, [r4, 0x1]\n\
+ ldrh r0, [r7, 0x2]\n\
+ strb r0, [r4, 0x2]\n\
+ ldrh r0, [r7, 0x4]\n\
+ strb r0, [r4, 0x3]\n\
+ ldrh r0, [r7, 0x6]\n\
+ strb r0, [r4, 0x4]\n\
+ ldrh r0, [r7, 0x8]\n\
+ strb r0, [r4, 0x5]\n\
+ ldrh r0, [r7, 0xA]\n\
+ strb r0, [r4, 0x6]\n\
+ movs r6, 0\n\
+ adds r2, r7, 0\n\
+_0805071E:\n\
+ ldr r5, [sp, 0x4]\n\
+ adds r1, r5, r6\n\
+ ldrh r0, [r2]\n\
+ strb r0, [r1]\n\
+ adds r2, 0x2\n\
+ adds r6, 0x1\n\
+ cmp r6, 0x5\n\
+ ble _0805071E\n\
+ add sp, 0x10\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08050740: .4byte gUnknown_03000510\n\
+ .syntax divided");
+}
+
+#endif // NONMATCHING
+
+void sub_8050744(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 a2, u8* a3, u16 a4)
+{
+ sub_8050520(berries, pokeblock, a2, a3, a4); // what is the purpose of this function?
+}
+
+void sub_8050760(void)
+{
+ u32 frames = (u16)(sBerryBlenderData->gameFrameTime);
+ u32 max_RPM = (u16)(sBerryBlenderData->max_RPM);
+ s16 var = 0;
+
+ if (frames < 900)
+ var = 5;
+ else if ((u16)(frames - 900) < 600)
+ var = 4;
+ else if ((u16)(frames - 1500) < 600)
+ var = 3;
+ else if ((u16)(frames - 2100) < 900)
+ var = 2;
+ else if ((u16)(frames - 3300) < 300)
+ var = 1;
+ sub_8050508(var);
+
+ var = 0;
+ if (max_RPM <= 64)
+ {
+ if ((u16)(max_RPM - 50) < 50)
+ var = -1;
+ else if ((u16)(max_RPM - 100) < 50)
+ var = -2;
+ else if ((u16)(max_RPM - 150) < 50)
+ var = -3;
+ else if ((u16)(max_RPM - 200) < 50)
+ var = -4;
+ else if ((u16)(max_RPM - 250) < 50)
+ var = -5;
+ else if ((u16)(max_RPM - 350) < 50)
+ var = -6;
+ else if ((u16)(max_RPM - 400) < 50)
+ var = -7;
+ else if ((u16)(max_RPM - 500) < 50)
+ var = -8;
+ else if ((u16)(max_RPM - 550) < 50)
+ var = -9;
+ else if (max_RPM >= 600)
+ var = -10;
+ }
+ sub_80504F0(var);
+}
+
+void sub_80508D4(u8 value)
+{
+ sBerryBlenderData->field_AA = value;
+ sub_814A880(192, (sBerryBlenderData->field_AA * 16) + 72);
+}
+
+void sub_80508FC(void)
+{
+ sBerryBlenderData->field_AA = 0;
+ MenuDrawTextWindow(23, 8, 28, 13);
+ sub_814A5C0(0, -1, 12, 0x2D9F, 32);
+ MenuPrint(gOtherText_YesNoTerminating, 24, 9);
+ sub_80508D4(sBerryBlenderData->field_AA);
+}
+
+void sub_8050954(void)
+{
+ u8 i;
+ u8 multiplayerID; // unused
+
+ sub_8051474();
+ multiplayerID = GetMultiplayerId();
+ switch (sBerryBlenderData->field_6F)
+ {
+ case 1:
+ ClearLinkCallback();
+ m4aMPlayTempoControl(&gMPlay_BGM, 256);
+ for (i = 0; i < gSpecialVar_0x8004; i++)
+ {
+ DestroyTask(sBerryBlenderData->field_148[i]);
+ }
+ sBerryBlenderData->field_6F++;
+ break;
+ case 2:
+ sBerryBlenderData->field_56 -= 32;
+ if (sBerryBlenderData->field_56 <= 0)
+ {
+ sBerryBlenderData->field_56 = 0;
+ if (gReceivedRemoteLinkPlayers != 0)
+ sBerryBlenderData->field_6F++;
+ else
+ sBerryBlenderData->field_6F = 5;
+ sBerryBlenderData->field_0 = 0;
+ m4aMPlayStop(&gMPlay_SE2);
+ }
+ Blender_ControlHitPitch();
+ break;
+ case 3:
+ if (/*multiplayerID != 0*/ GetMultiplayerId() != 0)
+ sBerryBlenderData->field_6F++;
+ else if (sub_8007ECC())
+ {
+ sBerryBlenderData->field_1BC = sBerryBlenderData->gameFrameTime;
+ sBerryBlenderData->field_1C0 = sBerryBlenderData->max_RPM;
+ SendBlock(0, &sBerryBlenderData->field_1BC, 40);
+ sBerryBlenderData->field_6F++;
+ }
+ break;
+ case 4:
+ if (GetBlockReceivedStatus())
+ {
+ u32* ptr = ((u32*)(&gBlockRecvBuffer[0][0]));
+ sBerryBlenderData->max_RPM = gBlockRecvBuffer[0][2];
+ sBerryBlenderData->gameFrameTime = *ptr;
+ sBerryBlenderData->field_6F++;
+ ResetBlockReceivedFlags();
+ }
+ break;
+ case 5:
+ if (Blender_PrintBlendingRanking())
+ sBerryBlenderData->field_6F++;
+ break;
+ case 6:
+ if (Blender_PrintBlendingResults())
+ {
+ if (gUnknown_03004834 == 0)
+ IncrementGameStat(34);
+ else
+ IncrementGameStat(33);
+ sBerryBlenderData->field_6F++;
+ }
+ break;
+ case 7:
+ sBerryBlenderData->field_6F++;
+ MenuDrawTextWindow(0, 14, 29, 19);
+ MenuPrintMessage(gOtherText_BlendAnotherBerryPrompt, 1, 15);
+ break;
+ case 8:
+ if (MenuUpdateWindowText())
+ sBerryBlenderData->field_6F++;
+ break;
+ case 9:
+ sBerryBlenderData->field_AA = 0;
+ sub_80508FC();
+ sBerryBlenderData->field_6F++;
+ break;
+ case 10:
+ if (gMain.newKeys & DPAD_UP)
+ {
+ if (sBerryBlenderData->field_AA != 0)
+ PlaySE(SE_SELECT);
+ sub_80508D4(0);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ if (sBerryBlenderData->field_AA != 1)
+ PlaySE(SE_SELECT);
+ sub_80508D4(1);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sBerryBlenderData->field_6F++;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sBerryBlenderData->field_6F++;
+ sub_80508D4(1);
+ }
+ break;
+ case 11:
+ gSendCmd[0] = 0x2FFF;
+ if (sBerryBlenderData->field_AA == 0)
+ {
+ if (IsBagPocketNonEmpty(BAG_BERRIES) == FALSE) // is empty
+ {
+ sBerryBlenderData->field_7C = 2;
+ gSendCmd[1] = 0x9999;
+ }
+ else if (sub_810CA00() == -1)
+ {
+ sBerryBlenderData->field_7C = 3;
+ gSendCmd[1] = 0xAAAA;
+ }
+ else
+ {
+ sBerryBlenderData->field_7C = 0;
+ gSendCmd[1] = 0x7779;
+ }
+ sBerryBlenderData->field_6F++;
+ }
+ else
+ {
+ sBerryBlenderData->field_7C = 1;
+ gSendCmd[1] = 0x8888;
+ sBerryBlenderData->field_6F++;
+ }
+ break;
+ case 12:
+ if (gUnknown_03004834)
+ {
+ SetMainCallback2(sub_80510E8);
+ sBerryBlenderData->field_6F = 0;
+ sBerryBlenderData->field_0 = 0;
+ }
+ else
+ {
+ MenuPrintMessage(gOtherText_LinkStandby3, 1, 15);
+ sBerryBlenderData->field_6F++;
+ }
+ break;
+ case 13:
+ if (MenuUpdateWindowText())
+ {
+ SetMainCallback2(sub_8050E30);
+ sBerryBlenderData->field_6F = 0;
+ sBerryBlenderData->field_0 = 0;
+ }
+ break;
+ }
+ sub_8051B18();
+ sub_8051A3C(sBerryBlenderData->field_56);
+ sub_805123C();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+bool8 sub_8050CE8(void)
+{
+ switch (sBerryBlenderData->field_1C4)
+ {
+ case 0:
+ sub_80084A4();
+ sBerryBlenderData->field_1C4 = 1;
+ sBerryBlenderData->framesToWait = 0;
+ break;
+ case 1:
+ if (sub_8007ECC())
+ {
+ sBerryBlenderData->field_1C4++;
+ gSoftResetDisabled = TRUE;
+ }
+ break;
+ case 2:
+ sub_8125E2C();
+ sBerryBlenderData->field_1C4++;
+ sBerryBlenderData->framesToWait = 0;
+ break;
+ case 3:
+ if (++sBerryBlenderData->framesToWait == 10)
+ {
+ sub_80084A4();
+ sBerryBlenderData->field_1C4++;
+ }
+ break;
+ case 4:
+ if (sub_8007ECC())
+ {
+ if (sub_8125E6C())
+ sBerryBlenderData->field_1C4 = 5;
+ else
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->field_1C4 = 3;
+ }
+ }
+ break;
+ case 5:
+ sBerryBlenderData->field_1C4++;
+ sBerryBlenderData->framesToWait = 0;
+ break;
+ case 6:
+ if (++sBerryBlenderData->framesToWait > 5)
+ {
+ gSoftResetDisabled = FALSE;
+ return 1;
+ }
+ break;
+ }
+ return 0;
+}
+
+void sub_8050E30(void)
+{
+ switch (sBerryBlenderData->field_6F)
+ {
+ case 0:
+ if (sBerryBlenderData->field_70[0] == 0x2222)
+ sBerryBlenderData->field_6F = 5;
+ else if (sBerryBlenderData->field_70[0] == 0x1111)
+ {
+ if (sBerryBlenderData->field_78 == 0x9999)
+ sBerryBlenderData->field_6F = 2;
+ else if (sBerryBlenderData->field_78 == 0xAAAA)
+ sBerryBlenderData->field_6F = 1;
+ else
+ sBerryBlenderData->field_6F = 5;
+ }
+ break;
+ case 1:
+ sBerryBlenderData->field_6F = 3;
+ DestroyMenuCursor();
+ MenuZeroFillWindowRect(23, 8, 28, 13);
+ StringCopy(gStringVar4, gLinkPlayers[sBerryBlenderData->field_7A].name);
+ StringAppend(gStringVar4, gOtherText_OtherCaseIsFull);
+ MenuPrintMessage(gStringVar4, 1, 15);
+ break;
+ case 2:
+ sBerryBlenderData->field_6F++;
+ DestroyMenuCursor();
+ MenuZeroFillWindowRect(23, 8, 28, 13);
+ StringCopy(gStringVar4, gLinkPlayers[sBerryBlenderData->field_7A].name);
+ StringAppend(gStringVar4, gOtherText_NoBerriesForBlend);
+ MenuPrintMessage(gStringVar4, 1, 15);
+ break;
+ case 3:
+ if (MenuUpdateWindowText())
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->field_6F++;
+ }
+ break;
+ case 4:
+ if (++sBerryBlenderData->framesToWait > 60)
+ sBerryBlenderData->field_6F = 5;
+ break;
+ case 5:
+ MenuDrawTextWindow(0, 14, 29, 19);
+ MenuPrint(gMultiText_Saving, 2, 15);
+ sub_80084A4();
+ sBerryBlenderData->field_6F++;
+ break;
+ case 6:
+ if (sub_8007ECC())
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->field_6F++;
+ sBerryBlenderData->field_1C4 = 0;
+ }
+ break;
+ case 7:
+ if (sub_8050CE8())
+ {
+ PlaySE(SE_SAVE);
+ sBerryBlenderData->field_6F++;
+ }
+ break;
+ case 8:
+ sBerryBlenderData->field_6F++;
+ sub_80084A4();
+ break;
+ case 9:
+ if (sub_8007ECC())
+ {
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ sBerryBlenderData->field_6F++;
+ }
+ break;
+ case 10:
+ if (!gPaletteFade.active)
+ {
+ if (sBerryBlenderData->field_70[0] == 0x2222)
+ SetMainCallback2(sub_804E538);
+ else
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->field_6F++;
+ }
+ }
+ break;
+ case 11:
+ if (++sBerryBlenderData->framesToWait > 30)
+ {
+ sub_800832C();
+ sBerryBlenderData->field_6F++;
+ }
+ break;
+ case 12:
+ if (gReceivedRemoteLinkPlayers == 0)
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+ break;
+ }
+
+ sub_805123C();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_80510E8(void)
+{
+ switch (sBerryBlenderData->field_6F)
+ {
+ case 0:
+ if (sBerryBlenderData->field_7C < 2)
+ sBerryBlenderData->field_6F = 9;
+ if (sBerryBlenderData->field_7C == 2)
+ sBerryBlenderData->field_6F = 2;
+ if (sBerryBlenderData->field_7C == 3)
+ sBerryBlenderData->field_6F =1;
+ break;
+ case 1:
+ sBerryBlenderData->field_6F = 3;
+ DestroyMenuCursor();
+ MenuZeroFillWindowRect(23, 8, 28, 13);
+ MenuPrintMessage(gOtherText_CaseIsFull, 1, 15);
+ break;
+ case 2:
+ sBerryBlenderData->field_6F++;
+ DestroyMenuCursor();
+ MenuZeroFillWindowRect(23, 8, 28, 13);
+ MenuPrintMessage(gOtherText_OutOfBerries, 1, 15);
+ break;
+ case 3:
+ if (MenuUpdateWindowText())
+ sBerryBlenderData->field_6F = 9;
+ break;
+ case 9:
+ BeginFastPaletteFade(3);
+ sBerryBlenderData->field_6F++;
+ break;
+ case 10:
+ if (!gPaletteFade.active)
+ {
+ if (sBerryBlenderData->field_7C == 0)
+ SetMainCallback2(sub_804E538);
+ else
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+ }
+ break;
+ }
+
+ sub_805123C();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_805123C(void)
+{
+ if (gReceivedRemoteLinkPlayers)
+ {
+ if (gRecvCmds[0][0] == 0x2FFF)
+ {
+ if (gRecvCmds[1][0] == 0x1111)
+ {
+ switch (gRecvCmds[2][0])
+ {
+ case 0x8888:
+ sBerryBlenderData->field_78 = 0x8888;
+ sBerryBlenderData->field_7A = gRecvCmds[3][0];
+ break;
+ case 0x9999:
+ sBerryBlenderData->field_78 = 0x9999;
+ sBerryBlenderData->field_7A = gRecvCmds[3][0];
+ break;
+ case 0xAAAA:
+ sBerryBlenderData->field_78 = 0xAAAA;
+ sBerryBlenderData->field_7A = gRecvCmds[3][0];
+ break;
+ }
+ sBerryBlenderData->field_70[0] = 0x1111;
+ }
+ else if (gRecvCmds[1][0] == 0x2222)
+ sBerryBlenderData->field_70[0] = 0x2222;
+ }
+ if (GetMultiplayerId() == 0 && sBerryBlenderData->field_70[0] != 0x1111 && sBerryBlenderData->field_70[0] != 0x2222)
+ {
+ u8 i;
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ if (gRecvCmds[0][i] == 0x2FFF)
+ {
+ switch (gRecvCmds[1][i])
+ {
+ case 0x8888:
+ sBerryBlenderData->field_70[i] = 0x8888;
+ break;
+ case 0x7779:
+ sBerryBlenderData->field_70[i] = 0x7779;
+ break;
+ case 0x9999:
+ sBerryBlenderData->field_70[i] = 0x9999;
+ break;
+ case 0xAAAA:
+ sBerryBlenderData->field_70[i] = 0xAAAA;
+ break;
+ }
+ }
+ }
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ if (sBerryBlenderData->field_70[i] == 0)
+ break;
+ }
+ if (i == GetLinkPlayerCount())
+ {
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ if (sBerryBlenderData->field_70[i] != 0x7779)
+ break;
+ }
+ gSendCmd[0] = 0x2FFF;
+ if (i == GetLinkPlayerCount())
+ gSendCmd[1] = 0x2222;
+ else
+ {
+ gSendCmd[1] = 0x1111;
+ gSendCmd[2] = sBerryBlenderData->field_70[i];
+ gSendCmd[3] = i;
+ }
+ }
+ }
+ }
+}
+
+void sub_8051414(struct BgAffineDstData *dest)
+{
+ struct BgAffineSrcData affineSrc;
+ affineSrc.texX = 30720;
+ affineSrc.texY = 20480;
+ affineSrc.scrX = 120 - sBerryBlenderData->field_144;
+ affineSrc.scrY = 80 - sBerryBlenderData->field_146;
+ affineSrc.sx = sBerryBlenderData->field_142;
+ affineSrc.sy = sBerryBlenderData->field_142;
+ affineSrc.alpha = sBerryBlenderData->arrowPos;
+ BgAffineSet(&affineSrc, dest, 1);
+}
+
+void sub_8051474(void)
+{
+ sBerryBlenderData->field_58 = sBerryBlenderData->arrowPos;
+ sBerryBlenderData->arrowPos += sBerryBlenderData->field_56;
+ sub_8051414(&sBerryBlenderData->field_168);
+}
+
+void sub_80514A4(void)
+{
+ REG_BG2PA = sBerryBlenderData->field_168.pa;
+ REG_BG2PB = sBerryBlenderData->field_168.pb;
+ REG_BG2PC = sBerryBlenderData->field_168.pc;
+ REG_BG2PD = sBerryBlenderData->field_168.pd;
+ REG_BG2X = sBerryBlenderData->field_168.dx;
+ REG_BG2Y = sBerryBlenderData->field_168.dy;
+}
+
+void sub_80514F0(void)
+{
+ REG_BG1HOFS = sBerryBlenderData->field_144;
+ REG_BG1VOFS = sBerryBlenderData->field_146;
+ REG_BG0HOFS = sBerryBlenderData->field_144;
+ REG_BG0VOFS = sBerryBlenderData->field_146;
+}
+
+void sub_8051524(struct Sprite* sprite)
+{
+ sprite->data2 += sprite->data0;
+ sprite->data3 += sprite->data1;
+ sprite->pos2.x = sprite->data2 / 8;
+ sprite->pos2.y = sprite->data3 / 8;
+ if (sprite->animEnded)
+ DestroySprite(sprite);
+}
+
+extern const struct SpriteTemplate gSpriteTemplate_82164FC;
+
+void sub_805156C(void)
+{
+ s32 limit = (Random() % 2) + 1;
+ s32 i;
+
+ for (i = 0; i < limit; i++)
+ {
+ u16 rand;
+ s32 x, y;
+ u8 spriteID;
+
+ rand = sBerryBlenderData->arrowPos + (Random() % 20);
+
+ x = gSineTable[(rand & 0xFF) + 64] / 4;
+ y = gSineTable[(rand & 0xFF)] / 4;
+
+ spriteID = CreateSprite(&gSpriteTemplate_82164FC, x + 120, y + 80, 1);
+ gSprites[spriteID].data0 = 16 - (Random() % 32);
+ gSprites[spriteID].data1 = 16 - (Random() % 32);
+
+ gSprites[spriteID].callback = sub_8051524;
+ }
+}
+
+void sub_8051650(struct Sprite* sprite)
+{
+ sprite->data0++;
+ sprite->pos2.y = -(sprite->data0 / 3);
+ if (sprite->animEnded)
+ DestroySprite(sprite);
+}
+
+void sub_8051684(struct Sprite* sprite)
+{
+ sprite->data0++;
+ sprite->pos2.y = -(sprite->data0 * 2);
+ if (sprite->pos2.y < -12)
+ sprite->pos2.y = -12;
+ if (sprite->animEnded)
+ DestroySprite(sprite);
+}
+
+void Blender_SetBankBerryData(u8 bank, u16 itemID)
+{
+ sBerryBlenderData->chosenItemID[bank] = itemID;
+ Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[bank], itemID);
+}
+
+extern const u8* const gUnknown_08216284[];
+extern u8 byte_3002A68;
+
+void unref_sub_80516F8(u8 taskID)
+{
+ struct Task* task = &gTasks[taskID];
+ if (gReceivedRemoteLinkPlayers)
+ {
+ s32 i;
+ if (GetMultiplayerId() == 0)
+ {
+ if (++task->data[0] > 120)
+ task->data[0] = 0;
+ if (task->data[0] == 100)
+ {
+ ZeroFillWindowRect(&sBerryBlenderData->field_4, 0, 0, 16, 20);
+ MenuDrawTextWindow(4, 4, 10, 12);
+ for (i = 0; i < 3; i++)
+ {
+ if (gLinkPlayers[i + 1].trainerId != 0)
+ MenuPrint(gUnknown_08216284[i], 5, (2 * i) + 5);
+ MenuDrawTextWindow(0, 13, 29, 19);
+ MenuPrint(gOtherText_PressAToStart, 1, 15);
+ }
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ sub_8007E4C();
+ DestroyTask(taskID);
+ }
+ }
+ else
+ {
+ if (task->data[0] == 10)
+ MenuPrint(gOtherText_PleaseWait, 3, 10);
+ if (++task->data[0] > 120)
+ task->data[0] = 0;
+ if (byte_3002A68 > 4 && gReceivedRemoteLinkPlayers == 1)
+ DestroyTask(taskID);
+ }
+ }
+}
+
+extern const struct SpriteTemplate gSpriteTemplate_821657C;
+
+void sub_805181C(struct Sprite* sprite)
+{
+ switch (sprite->data0)
+ {
+ case 0:
+ sprite->data1 += 8;
+ if (sprite->data1 > 88)
+ {
+ sprite->data1 = 88;
+ sprite->data0++;
+ PlaySE(SE_KON);
+ }
+ break;
+ case 1:
+ sprite->data2 += 1;
+ if (sprite->data2 > 20)
+ {
+ sprite->data0++;
+ sprite->data2 = 0;
+ }
+ break;
+ case 2:
+ sprite->data1 += 4;
+ if (sprite->data1 > 176)
+ {
+ if (++sprite->data3 == 3)
+ {
+ DestroySprite(sprite);
+ CreateSprite(&gSpriteTemplate_821657C, 120, -20, 2);
+ }
+ else
+ {
+ sprite->data0 = 0;
+ sprite->data1 = -16;
+ StartSpriteAnim(sprite, sprite->data3);
+ }
+ }
+ break;
+ }
+ sprite->pos2.y = sprite->data1;
+}
+
+void sub_80518CC(struct Sprite* sprite)
+{
+ switch (sprite->data0)
+ {
+ case 0:
+ sprite->data1 += 8;
+ if (sprite->data1 > 92)
+ {
+ sprite->data1 = 92;
+ sprite->data0++;
+ PlaySE(SE_PIN);
+ }
+ break;
+ case 1:
+ sprite->data2 += 1;
+ if (sprite->data2 > 20)
+ sprite->data0++;
+ break;
+ case 2:
+ sprite->data1 += 4;
+ if (sprite->data1 > 176)
+ {
+ sBerryBlenderData->field_0++;
+ DestroySprite(sprite);
+ }
+ break;
+ }
+ sprite->pos2.y = sprite->data1;
+}
+
+void sub_805194C(u16 a0, u16 a1)
+{
+ if (sBerryBlenderData->field_140 < a0)
+ {
+ sBerryBlenderData->field_140 += 2;
+ sub_805197C(sBerryBlenderData->field_140, a1);
+ }
+}
+
+void sub_805197C(u16 a0, u16 a1)
+{
+ s32 var1, var2, var3, var4;
+ u16* vram;
+
+ vram = (u16*)(VRAM + 0x6000);
+ var1 = (a0 * 64) / a1;
+ var2 = var1 / 8;
+ for (var4 = 0; var4 < var2; var4++)
+ {
+ vram[11 + var4] = 0x81E9;
+ vram[43 + var4] = 0x81F9;
+ }
+ var3 = var1 % 8;
+ if (var3 != 0)
+ {
+ vram[11 + var4] = var3 - 32287;
+ vram[43 + var4] = var3 - 32271;
+ var4++;
+ }
+ for (; var4 < 8; var4++)
+ {
+ vram[11 + var4] = 33249;
+ vram[43 + var4] = 33249 + 16;
+ }
+}
+
+u32 sub_8051A1C(u16 a0)
+{
+ return 360000 * a0 / 0x10000;
+}
+
+void sub_8051A3C(u16 a0)
+{
+ u8 i;
+ u8 palAdders[5];
+
+ u32 var = sub_8051A1C(a0);
+ if (sBerryBlenderData->max_RPM < var)
+ sBerryBlenderData->max_RPM = var;
+ for (i = 0; i < 5; i++)
+ {
+ palAdders[i] = var % 10;
+ var /= 10;
+ }
+ *((u16*)(VRAM + 0x6458)) = palAdders[4] + 0x8172;
+ *((u16*)(VRAM + 0x645A)) = palAdders[3] + 0x8172;
+ *((u16*)(VRAM + 0x645C)) = palAdders[2] + 0x8172;
+ *((u16*)(VRAM + 0x6460)) = palAdders[1] + 0x8172;
+ *((u16*)(VRAM + 0x6462)) = palAdders[0] + 0x8172;
+}
+
+void sub_8051AC8(s16* a0, u16 a1)
+{
+ if (*a0 == 0)
+ *a0 = (Random() % a1) - (a1 / 2);
+}
+
+void sub_8051AF4(s16* a0)
+{
+ if (*a0 < 0 )
+ (*a0)++;
+ if (*a0 > 0 )
+ (*a0)--;
+}
+
+void sub_8051B18(void)
+{
+ sub_8051AF4(&sBerryBlenderData->field_144);
+ sub_8051AF4(&sBerryBlenderData->field_146);
+}
+
+void sub_8051B40(s16* a0, u16 a1)
+{
+ s32 var;
+ if (a1 < 10)
+ var = 16;
+ else
+ var = 8;
+ if (*a0 == 0)
+ *a0 = (Random() % var) - (var / 2);
+ else
+ {
+ if (*a0 < 0)
+ (*a0)++;
+ if (*a0 > 0)
+ (*a0)--;
+ }
+}
+
+bool8 sub_8051B8C(void)
+{
+ if (sBerryBlenderData->framesToWait == 0)
+ {
+ sBerryBlenderData->field_144 = 0;
+ sBerryBlenderData->field_146 = 0;
+ }
+ sBerryBlenderData->framesToWait++;
+ sub_8051B40(&sBerryBlenderData->field_144, sBerryBlenderData->framesToWait);
+ sub_8051B40(&sBerryBlenderData->field_146, sBerryBlenderData->framesToWait);
+ if (sBerryBlenderData->framesToWait == 20)
+ {
+ sBerryBlenderData->field_144 = 0;
+ sBerryBlenderData->field_146 = 0;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+void sub_8051C04(struct Sprite* sprite)
+{
+ sprite->pos2.x = -(sBerryBlenderData->field_144);
+ sprite->pos2.y = -(sBerryBlenderData->field_146);
+}
+
+void Blender_TrySettingRecord(void)
+{
+ if (gSaveBlock1.berryBlenderRecords[sBerryBlenderData->playersNo - 2] < sBerryBlenderData->max_RPM)
+ gSaveBlock1.berryBlenderRecords[sBerryBlenderData->playersNo - 2] = sBerryBlenderData->max_RPM;
+}
+
+extern const u8 gUnknown_082165E9[];
+extern const u8 gUnknown_082165EE[];
+
+bool8 Blender_PrintBlendingResults(void)
+{
+ u16 i;
+
+ struct Pokeblock pokeblock;
+ u8 vars2[8];
+ u8 text[2][10];
+ u16 berryIDs[4]; // unused
+
+ switch (sBerryBlenderData->field_0)
+ {
+ case 0:
+ sBerryBlenderData->field_0++;
+ sBerryBlenderData->framesToWait = 17;
+ break;
+ case 1:
+ sBerryBlenderData->framesToWait -= 10;
+ if (sBerryBlenderData->framesToWait < 0)
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->field_0++;
+ }
+ break;
+ case 2:
+ if (++sBerryBlenderData->framesToWait > 20)
+ {
+ for (i = 0; i < 3; i++)
+ DestroySprite(&gSprites[sBerryBlenderData->scoreIconIDs[i]]);
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->field_0++;
+ }
+ break;
+ case 3:
+ {
+ u8* textPtr;
+ u16 secondsPassed, minutes, seconds;
+
+ MenuDrawTextWindow(4, 2, 25, 17);
+ sub_8072BD8(gOtherText_ResultsOfBlending, 5, 3, 160);
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
+ {
+ u8 place = sBerryBlenderData->playerPlaces[i];
+ textPtr = text[0];
+
+ StringCopy(textPtr, sBerryBlenderData->blendedBerries[place].name);
+ ConvertInternationalString(textPtr, gLinkPlayers[place].language);
+ StringAppend(textPtr, gOtherText_Berry);
+ textPtr = sBerryBlenderData->stringVar;
+ textPtr = ConvertIntToDecimalString(textPtr, i + 1);
+ textPtr[0] = CHAR_SPACE;
+ textPtr[1] = CHAR_PERIOD;
+ textPtr[2] = CHAR_SPACE;
+ textPtr += 3;
+ textPtr = sub_8072C74(textPtr, gLinkPlayers[place].name, 88, 0);
+ sub_8072C74(textPtr, text[0], 157, 0);
+ MenuPrint(sBerryBlenderData->stringVar, 5, gUnknown_082165E9[sBerryBlenderData->playersNo] + (i * gUnknown_082165EE[sBerryBlenderData->playersNo]));
+ }
+ ConvertIntToDecimalStringN(text[0], sBerryBlenderData->max_RPM % 100, 2, 2);
+ textPtr = sBerryBlenderData->stringVar;
+ textPtr = StringCopy(textPtr, gOtherText_MaxSpeed);
+ textPtr = sub_8072C14(textPtr, sBerryBlenderData->max_RPM / 100, 121, 1);
+
+ textPtr[0] = CHAR_SPACE;
+ textPtr[1] = CHAR_PERIOD;
+ textPtr[2] = CHAR_SPACE;
+ textPtr += 3;
+
+ textPtr = sub_8072C74(textPtr, text[0], 142, 1);
+ StringCopy(textPtr, gOtherText_RPM);
+ MenuPrint(sBerryBlenderData->stringVar, 5, 13);
+
+ secondsPassed = sBerryBlenderData->gameFrameTime / 60;
+ seconds = secondsPassed % 60;
+ minutes = secondsPassed / 60;
+ ConvertIntToDecimalStringN(text[0], minutes, 2, 2);
+ ConvertIntToDecimalStringN(text[1], seconds, 2, 2);
+ textPtr = sBerryBlenderData->stringVar;
+ textPtr = StringCopy(textPtr, gOtherText_RequiredTime);
+
+ textPtr = sub_8072C74(textPtr, text[0], 102, 1);
+ textPtr = StringAppend(textPtr, gOtherText_Min);
+
+ textPtr = sub_8072C74(textPtr, text[1], 136, 1);
+ StringCopy(textPtr, gOtherText_Sec);
+
+ MenuPrint(sBerryBlenderData->stringVar, 5, 15);
+
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->field_0++;
+ }
+ break;
+ case 4:
+ if (gMain.newKeys & A_BUTTON)
+ sBerryBlenderData->field_0++;
+ break;
+ case 5:
+ MenuZeroFillScreen();
+ MenuDrawTextWindow(0, 14, 29, 19);
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ if (sBerryBlenderData->chosenItemID[i] != 0)
+ berryIDs[i] = sBerryBlenderData->chosenItemID[i] - 133;
+ }
+ sub_8050760();
+ sub_8050520(sBerryBlenderData->blendedBerries, &pokeblock, sBerryBlenderData->playersNo, vars2, sBerryBlenderData->max_RPM);
+ Blender_PrintMadePokeblockString(&pokeblock, sBerryBlenderData->stringVar);
+ CreateTask(sub_8052BD0, 6);
+ MenuPrintMessage(sBerryBlenderData->stringVar, 1, 15);
+ RemoveBagItem(gScriptItemId, 1);
+ sub_810CA34(&pokeblock);
+ sBerryBlenderData->field_0++;
+ break;
+ case 6:
+ if (MenuUpdateWindowText())
+ {
+ Blender_TrySettingRecord();
+ return 1;
+ }
+ break;
+ }
+ return 0;
+}
+
+extern const u8 gUnknown_08216249[];
+extern const u8 gUnknown_082162C8[];
+extern const u8 *const gPokeblockNames[];
+
+void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst)
+{
+ u8 text[12];
+ u8 flavourLvl, feel;
+
+ dst[0] = EOS;
+ StringCopy(dst, gPokeblockNames[pokeblock->color]);
+ StringAppend(dst, gOtherText_PokeBlockMade);
+ StringAppend(dst, gUnknown_082162C8);
+
+ flavourLvl = sub_810C9B0(pokeblock);
+ feel = sub_810C9E8(pokeblock);
+
+ StringAppend(dst, gOtherText_BlockLevelIs);
+ ConvertIntToDecimalStringN(text, flavourLvl, 0, 3);
+ StringAppend(dst, text);
+
+ StringAppend(dst, gOtherText_BlockFeelIs);
+ ConvertIntToDecimalStringN(text, feel, 0, 3);
+ StringAppend(dst, text);
+
+ StringAppend(dst, gOtherText_Period);
+ StringAppend(dst, gUnknown_08216249);
+}
+
+void Blender_SortBasedOnPoints(u8* places, u8 playersNum, u32* scores)
+{
+ s32 i, j;
+ for (i = 0; i < playersNum; i++)
+ {
+ for (j = 0; j < playersNum; j++)
+ {
+ if (scores[places[i]] > scores[places[j]])
+ {
+ u8 temp = places[i];
+ places[i] = places[j];
+ places[j] = temp;
+ }
+ }
+ }
+}
+
+void Blender_SortScores(void)
+{
+ u8 i;
+ u8 places[4];
+ u32 points[4];
+
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
+ places[i] = i;
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
+ {
+ points[i] = 1000000 * sBerryBlenderData->scores[i][BLENDER_SCORE_BEST];
+ points[i] += 1000 * sBerryBlenderData->scores[i][BLENDER_SCORE_GOOD];
+ points[i] += 1000 - sBerryBlenderData->scores[i][BLENDER_SCORE_MISS];
+ }
+ Blender_SortBasedOnPoints(places, sBerryBlenderData->playersNo, points);
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
+ sBerryBlenderData->playerPlaces[i] = places[i];
+}
+
+extern const u8 gUnknown_082165F3[];
+
+bool8 Blender_PrintBlendingRanking(void)
+{
+ u16 i;
+ switch (sBerryBlenderData->field_0)
+ {
+ case 0:
+ sBerryBlenderData->field_0++;
+ sBerryBlenderData->framesToWait = 255;
+ break;
+ case 1:
+ sBerryBlenderData->framesToWait -= 10;
+ if (sBerryBlenderData->framesToWait < 0)
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->field_0++;
+ }
+ break;
+ case 2:
+ if (++sBerryBlenderData->framesToWait > 20)
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->field_0++;
+ }
+ break;
+ case 3:
+ MenuDrawTextWindow(4, 2, 25, 17);
+ sub_8072BD8(gOtherText_Ranking, 5, 3, 160);
+
+ sBerryBlenderData->scoreIconIDs[BLENDER_SCORE_BEST] = CreateSprite(&gSpriteTemplate_821645C, 140, 52, 0);
+ gSprites[sBerryBlenderData->scoreIconIDs[BLENDER_SCORE_BEST]].callback = SpriteCallbackDummy;
+ StartSpriteAnim(&gSprites[sBerryBlenderData->scoreIconIDs[BLENDER_SCORE_BEST]], 3);
+
+ sBerryBlenderData->scoreIconIDs[BLENDER_SCORE_GOOD] = CreateSprite(&gSpriteTemplate_821645C, 164, 52, 0);
+ gSprites[sBerryBlenderData->scoreIconIDs[BLENDER_SCORE_GOOD]].callback = SpriteCallbackDummy;
+
+ sBerryBlenderData->scoreIconIDs[BLENDER_SCORE_MISS] = CreateSprite(&gSpriteTemplate_821645C, 188, 52, 0);
+ gSprites[sBerryBlenderData->scoreIconIDs[BLENDER_SCORE_MISS]].callback = SpriteCallbackDummy;
+ StartSpriteAnim(&gSprites[sBerryBlenderData->scoreIconIDs[BLENDER_SCORE_MISS]], 1);
+
+ Blender_SortScores();
+
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
+ {
+ u8 place = sBerryBlenderData->playerPlaces[i];
+ u8* txtPtr = sBerryBlenderData->stringVar;
+
+ txtPtr[0] = EXT_CTRL_CODE_BEGIN;
+ txtPtr[1] = 0x13;
+ txtPtr[2] = 4;
+ txtPtr += 3;
+
+ txtPtr = ConvertIntToDecimalString(txtPtr, i + 1);
+
+ txtPtr[0] = CHAR_SPACE;
+ txtPtr[1] = CHAR_PERIOD;
+ txtPtr[2] = CHAR_SPACE;
+ txtPtr += 3;
+
+ txtPtr = StringCopy(txtPtr, gLinkPlayers[place].name);
+
+ txtPtr = sub_8072C14(txtPtr, sBerryBlenderData->scores[place][BLENDER_SCORE_BEST], 108, 1);
+ txtPtr = sub_8072C14(txtPtr, sBerryBlenderData->scores[place][BLENDER_SCORE_GOOD], 132, 1);
+ txtPtr = sub_8072C14(txtPtr, sBerryBlenderData->scores[place][BLENDER_SCORE_MISS], 156, 1);
+
+ MenuPrint(sBerryBlenderData->stringVar, 5, i * gUnknown_082165F3[sBerryBlenderData->playersNo] + 8);
+ }
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->field_0++;
+ break;
+ case 4:
+ if (++sBerryBlenderData->framesToWait > 20)
+ sBerryBlenderData->field_0++;
+ break;
+ case 5:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sBerryBlenderData->field_0++;
+ }
+ break;
+ case 6:
+ sBerryBlenderData->field_0 = 0;
+ return 1;
+ }
+ return 0;
+}
+
+struct UnknownStruct
+{
+ s8 bytes[24];
+ s16 hword[2];
+};
+
+extern struct UnknownStruct gUnknown_03000560;
+
+void unref_sub_80524BC(void)
+{
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ SetVBlankCallback(VBlankCB1_BerryBlender);
+ SetUpWindowConfig(&gWindowConfig_81E6CE4);
+ InitMenuWindow(&gWindowConfig_81E6CE4);
+ SeedRng(gMain.vblankCounter1);
+ REG_DISPCNT = 0x1540;
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ gUnknown_03000560.hword[1] = 0x1F40;
+ gUnknown_03000560.bytes[16]++;
+ SetMainCallback2(sub_8052AF8);
+}
diff --git a/src/link.c b/src/link.c
index 5858ad8bf..850201ccb 100644
--- a/src/link.c
+++ b/src/link.c
@@ -2,7 +2,6 @@
#include "link.h"
#include "battle.h"
#include "berry.h"
-#include "berry_blender.h"
#include "hall_of_fame.h"
#include "item_use.h"
#include "main.h"
@@ -42,6 +41,8 @@ extern u16 gBattleTypeFlags;
extern u16 word_3004858;
+extern void Blender_SetBankBerryData(u8 bank, u16 itemID);
+
static void InitLinkTestBG(u8, u8, u8, u8);
void InitLinkTestBG_Unused(u8, u8, u8, u8);
void LinkTestScreen();
@@ -556,7 +557,7 @@ static void ProcessRecvCmds(u8 unusedParam)
sub_8007E24();
break;
case 0xAAAB:
- sub_80516C4(i, gRecvCmds[1][i]);
+ Blender_SetBankBerryData(i, gRecvCmds[1][i]);
break;
case 0xCCCC:
#if defined(ENGLISH)