summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-03-02 16:57:00 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2020-03-02 16:57:00 -0500
commitf77b0feba6f1152216eba3b2c1edf63ba76c5a80 (patch)
tree73694784d546672b4343fe45ac379b5091294e76 /src
parent1261a414cdc46e9e9a63dd72a7e869fd0cd81a03 (diff)
Port berry_crush.c part 1 from Emerald
Diffstat (limited to 'src')
-rw-r--r--src/berry_crush.c235
1 files changed, 235 insertions, 0 deletions
diff --git a/src/berry_crush.c b/src/berry_crush.c
new file mode 100644
index 000000000..b1a484a24
--- /dev/null
+++ b/src/berry_crush.c
@@ -0,0 +1,235 @@
+#include "global.h"
+#include "gflib.h"
+#include "berry_crush.h"
+#include "berry_pouch.h"
+#include "berry_powder.h"
+#include "item.h"
+#include "item_menu.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "math_util.h"
+#include "overworld.h"
+#include "task.h"
+#include "constants/songs.h"
+#include "constants/items.h"
+
+static EWRAM_DATA struct BerryCrushGame *gUnknown_203F3DC = NULL;
+
+struct BerryCrushGame *sub_814B6F0(void);
+static void sub_814B860(void);
+static void sub_814BA6C(void);
+static void sub_814BA80(void);
+static void sub_814BA98(u8 taskId);
+
+struct BerryCrushGame *sub_814B6F0(void)
+{
+ return gUnknown_203F3DC;
+}
+
+u32 sub_814B6FC(MainCallback callback)
+{
+ if (!gUnknown_203F3DC)
+ return 2;
+
+ if (!callback)
+ callback = gUnknown_203F3DC->unk0;
+
+ DestroyTask(gUnknown_203F3DC->unkA);
+ FREE_AND_SET_NULL(gUnknown_203F3DC);
+ SetMainCallback2(callback);
+ if (callback == CB2_ReturnToField)
+ {
+ PlayNewMapMusic(MUS_POKECEN);
+ SetMainCallback1(CB1_Overworld);
+ }
+
+ return 0;
+}
+
+void StartBerryCrush(MainCallback callback)
+{
+ u8 playerCount = 0;
+ u8 multiplayerId;
+
+ if (!gReceivedRemoteLinkPlayers || gWirelessCommType == 0)
+ {
+ SetMainCallback2(callback);
+ Rfu.linkman_param[0] = 0;
+ Rfu.linkman_param[1] = 0;
+ Rfu.errorState = 1;
+ return;
+ }
+
+ playerCount = GetLinkPlayerCount();
+ multiplayerId = GetMultiplayerId();
+ if (playerCount < 2 || multiplayerId >= playerCount)
+ {
+ SetMainCallback2(callback);
+ Rfu.linkman_param[0] = 0;
+ Rfu.linkman_param[1] = 0;
+ Rfu.errorState = 1;
+ return;
+ }
+
+ gUnknown_203F3DC = AllocZeroed(sizeof(*gUnknown_203F3DC));
+ if (!gUnknown_203F3DC)
+ {
+ SetMainCallback2(callback);
+ Rfu.linkman_param[0] = 0;
+ Rfu.linkman_param[1] = 0;
+ Rfu.errorState = 1;
+ return;
+ }
+
+ gUnknown_203F3DC->unk0 = callback;
+ gUnknown_203F3DC->unk8 = multiplayerId;
+ gUnknown_203F3DC->unk9 = playerCount;
+ sub_814BABC(gUnknown_203F3DC);
+ gUnknown_203F3DC->unk12 = 1;
+ gUnknown_203F3DC->unkE = 1;
+ gUnknown_203F3DC->unkF = 6;
+ sub_814D564(gUnknown_203F3DC->unk36, 1, -1, 0, 16, 0, 0);
+ sub_814BB4C(4, 1, gUnknown_203F3DC->unk36);
+ SetMainCallback2(sub_814BA80);
+ gUnknown_203F3DC->unkA = CreateTask(sub_814BA98, 8);
+}
+
+static void sub_814B860(void)
+{
+ if (gSpecialVar_ItemId < FIRST_BERRY_INDEX || gSpecialVar_ItemId > LAST_BERRY_INDEX + 1)
+ gSpecialVar_ItemId = ITEM_CHERI_BERRY;
+ else
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+
+ gUnknown_203F3DC->unk68.as_four_players.others[gUnknown_203F3DC->unk8].unk0 = gSpecialVar_ItemId - FIRST_BERRY_INDEX;
+ gUnknown_203F3DC->unkE = 1;
+ gUnknown_203F3DC->unkF = 9;
+ sub_814D564(gUnknown_203F3DC->unk36, 0, -1, 0, 16, 0, 0);
+ sub_814BB4C(4, 1, gUnknown_203F3DC->unk36);
+ gUnknown_203F3DC->unkA = CreateTask(sub_814BA98, 8);
+ SetMainCallback2(sub_814BA80);
+}
+
+void sub_814B8F0(void)
+{
+ DestroyTask(gUnknown_203F3DC->unkA);
+ InitBerryPouch(BERRYPOUCH_FROMBERRYCRUSH, sub_814B860, FALSE);
+}
+
+void sub_814B914(void)
+{
+ SetVBlankCallback(sub_814BA6C);
+}
+
+void sub_814B924(void)
+{
+ SetVBlankCallback(NULL);
+}
+
+void sub_814B930(void)
+{
+ u32 var0, var1;
+
+ var0 = gUnknown_203F3DC->unk68.as_four_players.unk00.unk04;
+ var0 <<= 8;
+ var0 = sub_80D8B68(var0, 60 << 8);
+ var1 = gUnknown_203F3DC->unk68.as_four_players.unk00.unk0A;
+ var1 <<= 8;
+ var1 = sub_80D8B68(var1, var0) & 0xFFFF;
+ gUnknown_203F3DC->unk16 = var1;
+ switch (gUnknown_203F3DC->unk9)
+ {
+ case 2:
+ if (gUnknown_203F3DC->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[0])
+ {
+ gUnknown_203F3DC->unk25_1 = 1;
+ gSaveBlock2Ptr->berryCrush.berryCrushResults[0] = gUnknown_203F3DC->unk16;
+ }
+ break;
+ case 3:
+ if (gUnknown_203F3DC->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[1])
+ {
+ gUnknown_203F3DC->unk25_1 = 1;
+ gSaveBlock2Ptr->berryCrush.berryCrushResults[1] = gUnknown_203F3DC->unk16;
+ }
+ break;
+ case 4:
+ if (gUnknown_203F3DC->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[2])
+ {
+ gUnknown_203F3DC->unk25_1 = 1;
+ gSaveBlock2Ptr->berryCrush.berryCrushResults[2] = gUnknown_203F3DC->unk16;
+ }
+ break;
+ case 5:
+ if (gUnknown_203F3DC->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[3])
+ {
+ gUnknown_203F3DC->unk25_1 = 1;
+ gSaveBlock2Ptr->berryCrush.berryCrushResults[3] = gUnknown_203F3DC->unk16;
+ }
+ break;
+ }
+
+ gUnknown_203F3DC->unk1C = gUnknown_203F3DC->unk68.as_four_players.unk00.unk00;
+ if (GiveBerryPowder(gUnknown_203F3DC->unk1C))
+ return;
+
+ gUnknown_203F3DC->unk25_0 = 1;
+}
+
+static void sub_814BA6C(void)
+{
+ TransferPlttBuffer();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+}
+
+static void sub_814BA80(void)
+{
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+static void sub_814BA98(u8 taskId)
+{
+ if (gUnknown_203F3DC->unk4)
+ gUnknown_203F3DC->unk4(gUnknown_203F3DC, gUnknown_203F3DC->unk36);
+
+ sub_814D9CC(gUnknown_203F3DC);
+}
+
+#define PLAYER_UNK14(game, i) \
+ ((u8 *)(game) \
+ + offsetof(struct BerryCrushGame, unk68) \
+ + offsetof(struct BerryCrushGame_68_x, unk30) \
+ + sizeof(struct BerryCrushGame_Player) * (i))
+
+void sub_814BABC(struct BerryCrushGame *arg0)
+{
+ u8 i;
+
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ StringCopy(PLAYER_UNK14(arg0, i), gLinkPlayers[i].name);
+ arg0->unk68.as_five_players.unk1C[i].unk14[PLAYER_NAME_LENGTH] = EOS;
+ }
+ for (; i < 5; i++)
+ {
+ memset(PLAYER_UNK14(arg0, i), 1, PLAYER_NAME_LENGTH);
+ arg0->unk68.as_five_players.unk1C[i].unk14[PLAYER_NAME_LENGTH] = EOS;
+ }
+
+ switch (gSaveBlock2Ptr->optionsTextSpeed)
+ {
+ case OPTIONS_TEXT_SPEED_SLOW:
+ arg0->unkB = 8;
+ break;
+ case OPTIONS_TEXT_SPEED_MID:
+ arg0->unkB = 4;
+ break;
+ case OPTIONS_TEXT_SPEED_FAST:
+ arg0->unkB = 1;
+ break;
+ }
+}