start working on berry blender

This commit is contained in:
DizzyEggg
2017-11-18 16:11:34 +01:00
parent 3883c39991
commit 8fd3081306
37 changed files with 1229 additions and 1870 deletions

View File

@@ -59,7 +59,7 @@ extern const u8* GetTrainer2LoseText(void); // battle_setup
extern void GetFrontierTrainerName(u8 *dst, u16 trainerId);
extern s32 GetStringCenterAlignXOffsetWithLetterSpacing(u8 fontId, const u8 *str, s32 totalWidth, s16 letterSpacing);
extern u8 sub_8185FC4(void);
extern u8 sav2_get_text_speed(void);
extern u8 GetPlayerTextSpeed(void);
// this file's functions
static void sub_814F8F8(u8 *textPtr);
@@ -2266,7 +2266,7 @@ void BattleHandleAddTextPrinter(const u8 *text, u8 arg1)
else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
speed = sRecordedBattleTextSpeeds[sub_8185FC4()];
else
speed = sav2_get_text_speed();
speed = GetPlayerTextSpeed();
gTextFlags.flag_0 = 1;
}

View File

@@ -18,12 +18,6 @@ extern u16 gSpecialVar_ItemId;
extern const u8 BerryTreeScript[];
#define BERRY_NAME_LENGTH 6
#define FIRST_BERRY ITEM_CHERI_BERRY
#define LAST_BERRY ITEM_ENIGMA_BERRY
static const u8 sBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers.");
static const u8 sBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy.");
static const u8 sBerryDescriptionPart1_Chesto[] = _("The BERRYs thick skin and fruit are");
@@ -1062,28 +1056,28 @@ u8 GetStageByBerryTreeId(u8 id)
u8 ItemIdToBerryType(u16 item)
{
u16 berry = item - FIRST_BERRY;
u16 berry = item - FIRST_BERRY_INDEX;
if (berry > LAST_BERRY - FIRST_BERRY)
if (berry > LAST_BERRY_INDEX - FIRST_BERRY_INDEX)
return 1;
else
return item - FIRST_BERRY + 1;
return ITEM_TO_BERRY(item);
}
u16 BerryTypeToItemId(u16 berry)
{
u16 item = berry - 1;
if (item > LAST_BERRY - FIRST_BERRY)
return FIRST_BERRY;
if (item > LAST_BERRY_INDEX - FIRST_BERRY_INDEX)
return FIRST_BERRY_INDEX;
else
return berry + FIRST_BERRY - 1;
return berry + FIRST_BERRY_INDEX - 1;
}
void GetBerryNameByBerryType(u8 berry, u8 *string)
{
memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_LENGTH);
string[BERRY_NAME_LENGTH] = EOS;
memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_COUNT - 1);
string[BERRY_NAME_COUNT - 1] = EOS;
}
void GetBerryCountStringByBerryType(u8 berry, u8* dest, u32 berryCount)

View File

@@ -3,15 +3,370 @@
#include "window.h"
#include "task.h"
#include "sprite.h"
#include "sound.h"
#include "songs.h"
#include "m4a.h"
#include "bg.h"
#include "palette.h"
#include "decompress.h"
#include "malloc.h"
#include "gpu_regs.h"
#include "text.h"
#include "event_data.h"
#include "main.h"
#include "link.h"
#include "new_menu_helpers.h"
#include "item_menu_icons.h"
#include "berry.h"
#include "items.h"
#include "string_util.h"
// Static type declarations
#define BLENDER_SCORE_BEST 0
#define BLENDER_SCORE_GOOD 1
#define BLENDER_SCORE_MISS 2
// Static RAM declarations
IWRAM_DATA void *berry_blender_c_unused_03000de4;
IWRAM_DATA s16 gUnknown_03000DE8[8];
IWRAM_DATA s16 gUnknown_03000DF8[6];
IWRAM_DATA s16 gUnknown_03000E04;
IWRAM_DATA s16 gUnknown_03000E06;
#define BLENDER_MAX_PLAYERS 4
#define BLENDER_SCORES_NO 3
struct BlenderBerry
{
u16 itemId;
u8 name[BERRY_NAME_COUNT];
u8 flavours[FLAVOUR_COUNT];
u8 smoothness;
};
struct BerryBlenderData
{
u8 mainState;
u8 loadGfxState;
u8 field_02;
u8 field_03;
u8 field_04;
u8 field_05;
u8 field_06;
u8 field_07;
u8 field_08;
u8 field_09;
u8 field_0A;
u8 field_0B;
u8 field_0C;
u8 field_0D;
u8 field_0E;
u8 field_0F;
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;
u8 field_35;
u8 field_36;
u8 field_37;
u8 field_38;
u8 field_39;
u8 field_3A;
u8 field_3B;
u8 field_3C;
u8 field_3D;
u8 field_3E;
u8 field_3F;
u8 field_40;
u8 field_41;
u8 field_42;
u8 field_43;
u8 field_44;
u8 field_45;
u8 field_46;
u8 field_47;
u8 field_48;
u8 field_49;
u16 arrowPos;
s16 field_4C;
s16 field_4E;
u8 syncArrowSpriteIds[BLENDER_MAX_PLAYERS];
u8 syncArrowSprite2Ids[BLENDER_MAX_PLAYERS];
u8 field_58;
u8 field_59;
u8 field_5A;
u8 field_5B;
u8 field_5C;
u8 field_5D;
u8 field_5E;
u8 field_5F;
u8 field_60;
u8 field_61;
u8 field_62;
u8 field_63;
u16 field_64[BLENDER_MAX_PLAYERS];
u8 field_6C;
u8 field_6D;
u8 field_6E;
u8 field_6F;
u16 field_70;
u8 field_72;
u8 field_73;
u16 chosenItemId[BLENDER_MAX_PLAYERS];
u8 playersNo;
u8 field_7D;
u8 field_7E;
u8 field_7F;
u8 field_80;
u8 field_81;
u8 field_82;
u8 field_83;
u8 field_84;
u8 field_85;
u8 field_86;
u8 field_87;
u8 field_88;
u8 field_89;
u8 field_8A;
u8 field_8B;
u8 field_8C;
u8 field_8D;
u8 field_8E;
u8 field_8F;
u8 field_90;
u8 field_91;
u8 field_92;
u8 field_93;
u8 field_94;
u8 field_95;
u8 field_96;
u8 field_97;
u8 field_98;
u8 field_99;
u8 field_9A;
u8 field_9B;
u8 field_9C;
u8 field_9D;
u8 field_9E;
u8 field_9F;
u8 field_A0;
u8 field_A1;
u8 field_A2;
u8 field_A3;
u8 field_A4;
u8 field_A5;
u8 field_A6;
u8 field_A7;
u8 field_A8;
u8 field_A9;
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 field_E8;
u8 field_E9;
u8 field_EA;
u8 field_EB;
u8 field_EC;
u8 field_ED;
u8 field_EE;
u8 field_EF;
u8 field_F0;
u8 field_F1;
u8 field_F2;
u8 field_F3;
u8 field_F4;
u8 field_F5;
u8 field_F6;
u8 field_F7;
u8 field_F8;
u8 field_F9;
u8 field_FA;
u8 field_FB;
u8 field_FC;
u8 field_FD;
u8 field_FE;
u8 field_FF;
u8 field_100;
u8 field_101;
u8 field_102;
u8 field_103;
u32 gameFrameTime;
s32 framesToWait;
u32 field_10C;
u8 field_110;
u8 field_111;
u8 field_112;
u8 field_113;
u8 field_114;
u8 field_115;
u16 field_116;
u16 field_118;
u16 field_11A;
s16 field_11C;
s16 field_11E;
u8 field_120;
u8 field_121;
u8 field_122;
u8 field_123;
u16 scores[BLENDER_MAX_PLAYERS][BLENDER_SCORES_NO];
u8 field_13C;
u8 field_13D;
u8 field_13E;
u8 field_13F;
struct BgAffineSrcData bgAffineSrc;
u16 field_154;
u8 field_156;
u8 field_157;
struct BlenderBerry blendedBerries[BLENDER_MAX_PLAYERS];
u8 field_198;
u8 field_199;
u8 field_19A;
u8 field_19B;
u8 field_19C;
u8 field_19D;
u8 field_19E;
u8 field_19F;
u8 field_1A0;
u8 field_1A1;
u8 field_1A2;
u8 field_1A3;
u8 field_1A4;
u8 field_1A5;
u8 field_1A6;
u8 field_1A7;
u8 field_1A8;
u8 field_1A9;
u8 field_1AA;
u8 field_1AB;
u8 field_1AC;
u8 field_1AD;
u8 field_1AE;
u8 field_1AF;
u8 field_1B0;
u8 field_1B1;
u8 field_1B2;
u8 field_1B3;
u8 field_1B4;
u8 field_1B5;
u8 field_1B6;
u8 field_1B7;
u8 tilemapBuffers[2][0x800];
s16 textState;
void *tilesBuffer;
u8 field_11C0[0x20];
};
extern struct MusicPlayerInfo gMPlay_SE2;
extern struct MusicPlayerInfo gMPlay_BGM;
extern u16 gSpecialVar_ItemId;
extern u8 gInGameOpponentsNo;
// graphics
extern const u8 gBerryBlenderArrowTiles[];
@@ -22,6 +377,20 @@ extern const u8 gBerryBlenderCountdownNumbersTiles[];
extern const u16 gBerryBlenderMiscPalette[];
extern const u16 gBerryBlenderArrowPalette[];
// text
extern const u8 gText_BerryBlenderStart[];
extern void sub_81978B0(u16);
extern void sub_800A418(void);
extern u8 sub_800A9D8(void);
extern bool8 sub_800A4D8(u8);
extern void sub_8197DF8(u8 windowId, bool8 copyToVram);
extern void sub_809882C(u8, u16, u8);
extern void copy_textbox_border_tile_patterns_to_vram(u8, u16, u8);
extern void sub_81AABF0(void (*callback)(void));
// this file's functions
void BerryBlender_SetGpuRegs(void);
void sub_8080EA4(u8 taskId);
void sub_8080FD0(u8 taskId);
void sub_80810F8(u8 taskId);
@@ -29,8 +398,30 @@ void sub_80833F8(struct Sprite *sprite);
void sub_8082F68(struct Sprite *sprite);
void sub_8083010(struct Sprite *sprite);
void sub_80830C0(struct Sprite *sprite);
void Blender_SetPlayerNamesLocal(u8 opponentsNum);
void sub_807FAC8(void);
void sub_8082D28(void);
bool32 Blender_PrintText(s16 *textState, const u8 *string, u8 textSpeed);
void sub_807FFA4(void);
void sub_8080018(void);
void sub_80808D4(void);
void Blender_DummiedOutFunc(s16 a0, s16 a1);
void sub_8081898(void);
void sub_8082CB4(struct BgAffineSrcData *bgAffineSrc);
bool8 sub_8083380(void);
void sub_808074C(void);
void sub_80807BC(void);
void sub_8080588(void);
extern struct BerryBlenderData *sBerryBlenderData;
// Static RAM declarations
IWRAM_DATA void *berry_blender_c_unused_03000de4;
IWRAM_DATA s16 gUnknown_03000DE8[8];
IWRAM_DATA s16 gUnknown_03000DF8[6];
IWRAM_DATA s16 gUnknown_03000E04;
IWRAM_DATA s16 gUnknown_03000E06;
// .rodata
// TODO: make those static once the file is decompiled
const u16 sBlenderCenterPal[] = INCBIN_U16("graphics/berry_blender/center.gbapal");
const u8 sBlenderCenterMap[] = INCBIN_U8("graphics/berry_blender/center_map.bin");
@@ -67,6 +458,16 @@ const u8* const sBlenderOpponentsNames[] =
sText_Miss
};
enum
{
BLENDER_MISTER,
BLENDER_LADDIE,
BLENDER_LASSIE,
BLENDER_MASTER,
BLENDER_DUDE,
BLENDER_MISS
};
static const u8 sText_PressAToStart[] = _("Press the A Button to start.");
static const u8 sText_PleaseWaitAWhile[] = _("Please wait a while.");
const u8 sText_CommunicationStandby[] = _("Communication standby…");
@@ -91,7 +492,7 @@ const u8 sText_TheLevelIs[] = _("The level is ");
const u8 sText_TheFeelIs[] = _(", and the feel is ");
const u8 sText_Dot2[] = _(".");
const struct BgTemplate gUnknown_08339974[3] =
const struct BgTemplate sBerryBlenderBgTemplates[3] =
{
{
.bg = 0,
@@ -122,7 +523,7 @@ const struct BgTemplate gUnknown_08339974[3] =
}
};
const struct WindowTemplate gUnknown_08339980[] =
static const struct WindowTemplate sBerryBlender_WindowTemplates[] =
{
{0, 1, 6, 7, 2, 0xE, 0x28},
{0, 0x16, 6, 7, 2, 0xE, 0x36},
@@ -143,7 +544,7 @@ const s8 gUnknown_083399C0[][2] =
{-1, -1}, {1, -1}, {-1, 1}, {1, 1}
};
const u8 sBlenderSyncArrowsPos[][2] =
const u8 sBlenderSyncArrowsPos[BLENDER_MAX_PLAYERS][2] =
{
{72, 32}, {168, 32}, {72, 128}, {168, 128}
};
@@ -594,4 +995,528 @@ static const u8 gUnknown_08339CD2[] =
const struct WindowTemplate gUnknown_08339D14[] = {0, 6, 4, 0x12, 0xB, 0xF, 8};
// .text
// code
void Blender_ControlHitPitch(void)
{
m4aMPlayPitchControl(&gMPlay_SE2, 0xFFFF, 2 * (sBerryBlenderData->field_4C - 128));
}
void VBlankCB0_BerryBlender(void)
{
BerryBlender_SetGpuRegs();
SetBgAffine(2, sBerryBlenderData->bgAffineSrc.texX, sBerryBlenderData->bgAffineSrc.texY,
sBerryBlenderData->bgAffineSrc.scrX, sBerryBlenderData->bgAffineSrc.scrY,
sBerryBlenderData->bgAffineSrc.sx, sBerryBlenderData->bgAffineSrc.sy,
sBerryBlenderData->bgAffineSrc.alpha);
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
extern const u8 sBlenderCenterGfx[];
extern const u8 gUnknown_08D91DB8[];
extern const u8 gUnknown_08D927EC[];
bool8 LoadBerryBlenderGfx(void)
{
switch (sBerryBlenderData->loadGfxState)
{
case 0:
sBerryBlenderData->tilesBuffer = AllocZeroed(sub_8034974(sBlenderCenterGfx) + 100);
LZDecompressWram(sBlenderCenterGfx, sBerryBlenderData->tilesBuffer);
sBerryBlenderData->loadGfxState++;
break;
case 1:
CopyToBgTilemapBuffer(2, sBlenderCenterMap, 0x400, 0);
CopyBgTilemapBufferToVram(2);
LoadPalette(sBlenderCenterPal, 0, 0x100);
sBerryBlenderData->loadGfxState++;
break;
case 2:
LoadBgTiles(2, sBerryBlenderData->tilesBuffer, sub_8034974(sBlenderCenterGfx), 0);
sBerryBlenderData->loadGfxState++;
break;
case 3:
LZDecompressWram(gUnknown_08D91DB8, sBerryBlenderData->tilesBuffer);
sBerryBlenderData->loadGfxState++;
break;
case 4:
LoadBgTiles(1, sBerryBlenderData->tilesBuffer, sub_8034974(gUnknown_08D91DB8), 0);
sBerryBlenderData->loadGfxState++;
break;
case 5:
LZDecompressWram(gUnknown_08D927EC, sBerryBlenderData->tilesBuffer);
sBerryBlenderData->loadGfxState++;
break;
case 6:
CopyToBgTilemapBuffer(1, sBerryBlenderData->tilesBuffer, sub_8034974(gUnknown_08D927EC), 0);
CopyBgTilemapBufferToVram(1);
sBerryBlenderData->loadGfxState++;
break;
case 7:
LoadPalette(sBlenderOuterPal, 0x80, 0x20);
sBerryBlenderData->loadGfxState++;
break;
case 8:
LoadSpriteSheet(&sSpriteSheet_BlenderArrow);
LoadSpriteSheet(&gUnknown_08339BD8);
LoadSpriteSheet(&gUnknown_08339B38);
sBerryBlenderData->loadGfxState++;
break;
case 9:
LoadSpriteSheet(&gUnknown_08339C24);
LoadSpriteSheet(&gUnknown_08339C58);
LoadSpritePalette(&sSpritePal_BlenderArrow);
LoadSpritePalette(&sSpritePal_BlenderMisc);
Free(sBerryBlenderData->tilesBuffer);
sBerryBlenderData->loadGfxState = 0;
return TRUE;
}
return FALSE;
}
void sub_807F9D0(void)
{
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x1E, 0x14);
CopyBgTilemapBufferToVram(0);
ShowBg(0);
ShowBg(1);
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
ChangeBgX(1, 0, 0);
ChangeBgY(1, 0, 0);
}
void InitBerryBlenderWindows(void)
{
if (InitWindows(sBerryBlender_WindowTemplates))
{
s32 i;
DeactivateAllTextPrinters();
for (i = 0; i < 5; i++)
FillWindowPixelBuffer(i, 0);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x1E, 0x14);
sub_81978B0(0xE0);
}
}
void DoBerryBlending(void)
{
if (sBerryBlenderData == NULL)
sBerryBlenderData = AllocZeroed(sizeof(*sBerryBlenderData));
sBerryBlenderData->field_63 = 0;
sBerryBlenderData->mainState = 0;
sBerryBlenderData->field_63 = 0;
Blender_SetPlayerNamesLocal(gSpecialVar_0x8004);
SetMainCallback2(sub_807FAC8);
}
void sub_807FAC8(void)
{
s32 i;
switch (sBerryBlenderData->mainState)
{
case 0:
SetGpuReg(REG_OFFSET_DISPCNT, 0);
ResetSpriteData();
FreeAllSpritePalettes();
SetVBlankCallback(NULL);
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(1, sBerryBlenderBgTemplates, ARRAY_COUNT(sBerryBlenderBgTemplates));
SetBgTilemapBuffer(1, sBerryBlenderData->tilemapBuffers[0]);
SetBgTilemapBuffer(2, sBerryBlenderData->tilemapBuffers[1]);
sub_809882C(0, 1, 0xD0);
copy_textbox_border_tile_patterns_to_vram(0, 0x14, 0xF0);
InitBerryBlenderWindows();
sBerryBlenderData->mainState++;
sBerryBlenderData->field_118 = 0;
sBerryBlenderData->field_116 = 0;
sBerryBlenderData->field_11A = 0x50;
sBerryBlenderData->field_11C = 0;
sBerryBlenderData->field_11E = 0;
sBerryBlenderData->loadGfxState = 0;
sub_8082D28();
break;
case 1:
if (LoadBerryBlenderGfx())
{
for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
{
sBerryBlenderData->syncArrowSpriteIds[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1);
StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSpriteIds[i]], i + 8);
}
if (gReceivedRemoteLinkPlayers != 0 && gLinkVSyncDisabled)
{
sub_800E0E8();
sub_800DFB4(0, 0);
}
SetVBlankCallback(VBlankCB0_BerryBlender);
sBerryBlenderData->mainState++;
}
break;
case 2:
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
sub_8082D28();
sBerryBlenderData->mainState++;
break;
case 3:
sub_807F9D0();
if (!gPaletteFade.active)
sBerryBlenderData->mainState++;
break;
case 4:
if (Blender_PrintText(&sBerryBlenderData->textState, gText_BerryBlenderStart, GetPlayerTextSpeed()))
sBerryBlenderData->mainState++;
break;
case 5:
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
sBerryBlenderData->mainState++;
break;
case 6:
if (!gPaletteFade.active)
{
FreeAllWindowBuffers();
UnsetBgTilemapBuffer(2);
UnsetBgTilemapBuffer(1);
SetVBlankCallback(NULL);
sub_81AABF0(sub_807FFA4);
sBerryBlenderData->mainState = 0;
}
break;
}
AnimateSprites();
BuildOamBuffer();
RunTextPrinters();
UpdatePaletteFade();
}
void sub_807FD08(struct Sprite* sprite)
{
sprite->data1 += sprite->data6;
sprite->data2 -= sprite->data4;
sprite->data2 += sprite->data7;
sprite->data0 += sprite->data7;
sprite->data4--;
if (sprite->data0 < sprite->data2)
{
sprite->data3 = sprite->data4 = sprite->data3 - 1;
if (++sprite->data5 > 3)
DestroySprite(sprite);
else
PlaySE(SE_TB_KARA);
}
sprite->pos1.x = sprite->data1;
sprite->pos1.y = sprite->data2;
}
void sub_807FD64(struct Sprite* sprite, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6)
{
sprite->data0 = a3;
sprite->data1 = a2;
sprite->data2 = a3;
sprite->data3 = a4;
sprite->data4 = 10;
sprite->data5 = 0;
sprite->data6 = a5;
sprite->data7 = a6;
sprite->callback = sub_807FD08;
}
void sub_807FD90(u16 a0, u8 a1)
{
u8 spriteId = sub_80D511C(a0 + 123, 0, 80, a1 & 1);
sub_807FD64(&gSprites[spriteId], gUnknown_08339C78[a1][0], gUnknown_08339C78[a1][1], gUnknown_08339C78[a1][2], gUnknown_08339C78[a1][3], gUnknown_08339C78[a1][4]);
}
void Blender_CopyBerryData(struct BlenderBerry* berry, u16 itemId)
{
const struct Berry *berryInfo = GetBerryInfo(ITEM_TO_BERRY(itemId));
berry->itemId = itemId;
StringCopy(berry->name, berryInfo->name);
berry->flavours[FLAVOUR_SPICY] = berryInfo->spicy;
berry->flavours[FLAVOUR_DRY] = berryInfo->dry;
berry->flavours[FLAVOUR_SWEET] = berryInfo->sweet;
berry->flavours[FLAVOUR_BITTER] = berryInfo->bitter;
berry->flavours[FLAVOUR_SOUR] = berryInfo->sour;
berry->smoothness = berryInfo->smoothness;
}
void Blender_SetPlayerNamesLocal(u8 opponentsNum)
{
switch (opponentsNum)
{
case 0:
gInGameOpponentsNo = 0;
break;
case 1:
gInGameOpponentsNo = 1;
sBerryBlenderData->playersNo = 2;
StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName);
if (!FlagGet(FLAG_340))
StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_MASTER]);
else
StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_MISTER]);
gLinkPlayers[0].language = GAME_LANGUAGE;
gLinkPlayers[1].language = GAME_LANGUAGE;
break;
case 2:
gInGameOpponentsNo = 2;
sBerryBlenderData->playersNo = 3;
StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName);
StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_DUDE]);
StringCopy(gLinkPlayers[2].name, sBlenderOpponentsNames[BLENDER_LASSIE]);
gLinkPlayers[0].language = GAME_LANGUAGE;
gLinkPlayers[1].language = GAME_LANGUAGE;
gLinkPlayers[2].language = GAME_LANGUAGE;
break;
case 3:
gInGameOpponentsNo = 3;
sBerryBlenderData->playersNo = 4;
StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName);
StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_MISS]);
StringCopy(gLinkPlayers[2].name, sBlenderOpponentsNames[BLENDER_LADDIE]);
StringCopy(gLinkPlayers[3].name, sBlenderOpponentsNames[BLENDER_LASSIE]);
gLinkPlayers[0].language = GAME_LANGUAGE;
gLinkPlayers[1].language = GAME_LANGUAGE;
gLinkPlayers[2].language = GAME_LANGUAGE;
gLinkPlayers[3].language = GAME_LANGUAGE;
break;
}
}
void sub_807FFA4(void)
{
s32 i;
SetGpuReg(REG_OFFSET_DISPCNT, 0);
if (sBerryBlenderData == NULL)
sBerryBlenderData = AllocZeroed(sizeof(*sBerryBlenderData));
sBerryBlenderData->mainState = 0;
sBerryBlenderData->field_10C = 0;
for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
sBerryBlenderData->chosenItemId[i] = ITEM_NONE;
Blender_SetPlayerNamesLocal(gSpecialVar_0x8004);
if (gSpecialVar_0x8004 == 0)
SetMainCallback2(sub_8080018);
else
SetMainCallback2(sub_80808D4);
}
void sub_8080018(void)
{
s32 i, j;
switch (sBerryBlenderData->mainState)
{
case 0:
sub_8080588();
gLinkType = 0x4422;
sBerryBlenderData->field_72 = 0;
for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
{
sBerryBlenderData->field_64[i] = 0;
for (j = 0; j < 3; j++)
{
sBerryBlenderData->scores[i][j] = 0;
}
}
sBerryBlenderData->field_70 = 0;
sBerryBlenderData->field_4E = 0;
sBerryBlenderData->loadGfxState = 0;
sBerryBlenderData->mainState++;
break;
case 1:
if (LoadBerryBlenderGfx())
{
sBerryBlenderData->mainState++;
sub_8082D28();
}
break;
case 2:
for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
{
sBerryBlenderData->syncArrowSprite2Ids[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1);
StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSprite2Ids[i]], i + 8);
}
if (gReceivedRemoteLinkPlayers != 0 && gLinkVSyncDisabled)
{
sub_800E0E8();
sub_800DFB4(0, 0);
}
sBerryBlenderData->mainState++;
break;
case 3:
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
sBerryBlenderData->mainState++;
break;
case 4:
sub_807F9D0();
if (!gPaletteFade.active)
{
sBerryBlenderData->mainState++;
}
break;
case 5:
Blender_PrintText(&sBerryBlenderData->textState, sText_CommunicationStandby, 0);
sBerryBlenderData->mainState = 8;
sBerryBlenderData->framesToWait = 0;
break;
case 8:
sBerryBlenderData->mainState++;
sBerryBlenderData->field_114 = 0;
Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId);
memcpy(gBlockSendBuffer, &sBerryBlenderData->blendedBerries[0], sizeof(struct BlenderBerry));
sub_800ADF8();
sBerryBlenderData->framesToWait = 0;
break;
case 9:
if (sub_800A520())
{
ResetBlockReceivedFlags();
if (GetMultiplayerId() == 0)
sub_800A4D8(4);
sBerryBlenderData->mainState++;
}
break;
case 10:
if (++sBerryBlenderData->framesToWait > 20)
{
sub_8197DF8(4, TRUE);
if (GetBlockReceivedStatus() == sub_800A9D8())
{
for (i = 0; i < GetLinkPlayerCount(); i++)
{
memcpy(&sBerryBlenderData->blendedBerries[i], &gBlockRecvBuffer[i][0], sizeof(struct BlenderBerry));
sBerryBlenderData->chosenItemId[i] = sBerryBlenderData->blendedBerries[i].itemId;
}
ResetBlockReceivedFlags();
sBerryBlenderData->mainState++;
}
}
break;
case 11:
sBerryBlenderData->playersNo = GetLinkPlayerCount();
for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
{
if (sBerryBlenderData->field_114 == gUnknown_083399D0[sBerryBlenderData->playersNo - 2][i])
{
sub_807FD90(sBerryBlenderData->chosenItemId[sBerryBlenderData->field_114], i);
break;
}
}
sBerryBlenderData->framesToWait = 0;
sBerryBlenderData->mainState++;
sBerryBlenderData->field_114++;
break;
case 12:
if (++sBerryBlenderData->framesToWait > 60)
{
if (sBerryBlenderData->field_114 >= sBerryBlenderData->playersNo)
{
sBerryBlenderData->mainState++;
sBerryBlenderData->arrowPos = gUnknown_083399DC[gUnknown_083399E4[sBerryBlenderData->playersNo - 2]] - 22528;
}
else
{
sBerryBlenderData->mainState--;
}
sBerryBlenderData->framesToWait = 0;
}
break;
case 13:
if (sub_800A520())
{
sBerryBlenderData->mainState++;
sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
PlaySE(SE_RU_HYUU);
ShowBg(2);
}
break;
case 14:
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
sBerryBlenderData->arrowPos += 0x200;
sBerryBlenderData->field_11A += 4;
if (sBerryBlenderData->field_11A > 255)
{
SetGpuRegBits(REG_OFFSET_BG2CNT, 2);
sBerryBlenderData->mainState++;
sBerryBlenderData->field_11A = 256;
sBerryBlenderData->arrowPos = gUnknown_083399DC[gUnknown_083399E4[sBerryBlenderData->playersNo - 2]];
sBerryBlenderData->framesToWait = 0;
PlaySE(SE_TRACK_DOOR);
sub_808074C();
sub_80807BC();
}
sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
break;
case 15:
if (sub_8083380())
{
sBerryBlenderData->framesToWait = 0;
sBerryBlenderData->mainState++;
}
sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
break;
case 16:
CreateSprite(&gUnknown_08339C2C, 120, -16, 3);
sBerryBlenderData->mainState++;
break;
case 18:
sBerryBlenderData->mainState++;
break;
case 19:
sub_800ADF8();
sBerryBlenderData->mainState++;
break;
case 20:
if (sub_800A520())
{
sub_800A418();
sBerryBlenderData->mainState++;
}
break;
case 21:
sBerryBlenderData->field_4C = 128;
sBerryBlenderData->gameFrameTime = 0;
SetMainCallback2(sub_8081898);
if (GetCurrentMapMusic() != BGM_CYCLING)
{
sBerryBlenderData->field_154 = GetCurrentMapMusic();
}
PlayBGM(BGM_CYCLING);
break;
}
Blender_DummiedOutFunc(sBerryBlenderData->field_11C, sBerryBlenderData->field_11E);
RunTasks();
AnimateSprites();
BuildOamBuffer();
RunTextPrinters();
UpdatePaletteFade();
}

View File

@@ -459,10 +459,9 @@ _08034964:\n\
.syntax divided");
}
u32 sub_8034974(void* ptr)
u32 sub_8034974(const u8 *ptr)
{
u8* ptr_ = (u8*)(ptr);
return (ptr_[3] << 16) | (ptr_[2] << 8) | (ptr_[1]);
return (ptr[3] << 16) | (ptr[2] << 8) | (ptr[1]);
}
bool8 LoadCompressedObjectPicUsingHeap(const struct CompressedSpriteSheet* src)

View File

@@ -45,7 +45,7 @@ void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16
mplayInfo->ident = ID_NUMBER;
}
void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 pitch)
void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch)
{
s32 i;
u32 bit;
@@ -66,7 +66,7 @@ void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16
{
if (track->flags & MPT_FLG_EXIST)
{
track->keyShiftX = (s16)pitch >> 8;
track->keyShiftX = pitch >> 8;
track->pitX = pitch;
track->flags |= MPT_FLG_PITCHG;
}