diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_message.c | 4 | ||||
-rw-r--r-- | src/berry.c | 22 | ||||
-rw-r--r-- | src/berry_blender.c | 947 | ||||
-rw-r--r-- | src/decompress.c | 5 | ||||
-rw-r--r-- | src/m4a_4.c | 4 |
5 files changed, 950 insertions, 32 deletions
diff --git a/src/battle_message.c b/src/battle_message.c index 4bd6ca5b7..1f39d5397 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -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; } diff --git a/src/berry.c b/src/berry.c index 6d1fd17a1..0c1553463 100644 --- a/src/berry.c +++ b/src/berry.c @@ -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 BERRY’s 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) diff --git a/src/berry_blender.c b/src/berry_blender.c index 8e5a51845..f626fef91 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -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(); +} diff --git a/src/decompress.c b/src/decompress.c index 9210799ec..e2ae6ce83 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -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) diff --git a/src/m4a_4.c b/src/m4a_4.c index 99195ec00..e645fbef5 100644 --- a/src/m4a_4.c +++ b/src/m4a_4.c @@ -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; } |