Files
Pokemon-Firered/src/berry_crush.c
T
2020-03-03 12:24:18 -05:00

229 lines
5.8 KiB
C

#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;
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);
}
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;
}
}