diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_script_commands.c | 2 | ||||
-rw-r--r-- | src/berry_fix_program.c | 238 | ||||
-rw-r--r-- | src/berry_tag_screen.c | 653 | ||||
-rwxr-xr-x | src/field_map_obj_helpers.c | 8 | ||||
-rwxr-xr-x | src/item_use.c | 165 | ||||
-rw-r--r-- | src/palette.c | 269 | ||||
-rw-r--r-- | src/pokemon_2.c | 16 | ||||
-rw-r--r-- | src/secret_base.c | 234 | ||||
-rw-r--r-- | src/sprite.c | 114 | ||||
-rw-r--r-- | src/start_menu.c | 5 |
10 files changed, 779 insertions, 925 deletions
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a751cf5e7..c6314082c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6220,7 +6220,7 @@ static u32 GetTrainerMoneyToGive(u16 trainerId) if (trainerId == SECRET_BASE_OPPONENT) { - moneyReward = 20 * gBattleResources->secretBase->partyLevels[0] * gBattleStruct->moneyMultiplier; + moneyReward = 20 * gBattleResources->secretBase->party.levels[0] * gBattleStruct->moneyMultiplier; } else { diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c index 7b968a221..542622e89 100644 --- a/src/berry_fix_program.c +++ b/src/berry_fix_program.c @@ -217,10 +217,9 @@ static void berry_fix_main(void) } } -#ifdef NONMATCHING static void berry_fix_gpu_set(void) { - s32 width; + s32 width, left; SetGpuReg(REG_OFFSET_BG0CNT, 0x0000); SetGpuReg(REG_OFFSET_BG1CNT, 0x0000); @@ -249,230 +248,27 @@ static void berry_fix_gpu_set(void) FillWindowPixelBuffer(3, 0); FillWindowPixelBuffer(0, 0xAA); -// This block is a meme among memes - width = (0x78 - GetStringWidth(0, sUnknown_08617E9B, 0)) / 2; - box_print(2, 0, width, 3, sUnknown_0861815B, -1, sUnknown_08617E9B); - width = (s32)(0x78 - GetStringWidth(0, sUnknown_08617E9B, 0)) / 2 + 0x78; - box_print(2, 0, width, 3, sUnknown_0861815B, -1, sUnknown_08617E8D); - width = (0x70 - GetStringWidth(0, sUnknown_08617E8D, 0)) / 2; - box_print(3, 0, width, 0, sUnknown_0861815B, -1, sUnknown_08617E8D); - width = (0xd0 - GetStringWidth(1, sUnknown_08617E78, 0)) / 2; - box_print(0, 1, width, 2, sUnknown_08618158, -1, sUnknown_08617E78); + width = GetStringWidth(0, sUnknown_08617E9B, 0); + left = (0x78 - width) / 2; + box_print(2, 0, left, 3, sUnknown_0861815B, TEXT_SPEED_FF, sUnknown_08617E9B); + + width = GetStringWidth(0, sUnknown_08617E8D, 0); + left = (0x78 - width) / 2 + 0x78; + box_print(2, 0, left, 3, sUnknown_0861815B, TEXT_SPEED_FF, sUnknown_08617E8D); + + width = GetStringWidth(0, sUnknown_08617E8D, 0); + left = (0x70 - width) / 2; + box_print(3, 0, left, 0, sUnknown_0861815B, TEXT_SPEED_FF, sUnknown_08617E8D); + + width = GetStringWidth(1, sUnknown_08617E78, 0); + left = (0xD0 - width) / 2; + box_print(0, 1, left, 2, sUnknown_08618158, TEXT_SPEED_FF, sUnknown_08617E78); CopyWindowToVram(2, 2); CopyWindowToVram(3, 2); CopyWindowToVram(0, 2); } -#else -__attribute__((naked)) static void berry_fix_gpu_set(void) -{ - asm(".syntax unified\n" - "\tpush {r4-r6,lr}\n" - "\tmov r6, r8\n" - "\tpush {r6}\n" - "\tsub sp, 0x10\n" - "\tmovs r0, 0x8\n" - "\tmovs r1, 0\n" - "\tbl SetGpuReg\n" - "\tmovs r0, 0xA\n" - "\tmovs r1, 0\n" - "\tbl SetGpuReg\n" - "\tmovs r0, 0x10\n" - "\tmovs r1, 0\n" - "\tbl SetGpuReg\n" - "\tmovs r0, 0x12\n" - "\tmovs r1, 0\n" - "\tbl SetGpuReg\n" - "\tmovs r0, 0x14\n" - "\tmovs r1, 0\n" - "\tbl SetGpuReg\n" - "\tmovs r0, 0x16\n" - "\tmovs r1, 0\n" - "\tbl SetGpuReg\n" - "\tmovs r0, 0x50\n" - "\tmovs r1, 0\n" - "\tbl SetGpuReg\n" - "\tmovs r1, 0\n" - "\tstr r1, [sp, 0xC]\n" - "\tldr r4, =0x040000d4\n" - "\tadd r0, sp, 0xC\n" - "\tstr r0, [r4]\n" - "\tmovs r0, 0xC0\n" - "\tlsls r0, 19\n" - "\tstr r0, [r4, 0x4]\n" - "\tldr r0, =0x85006000\n" - "\tstr r0, [r4, 0x8]\n" - "\tldr r0, [r4, 0x8]\n" - "\tstr r1, [sp, 0xC]\n" - "\tadd r0, sp, 0xC\n" - "\tstr r0, [r4]\n" - "\tmovs r0, 0xE0\n" - "\tlsls r0, 19\n" - "\tstr r0, [r4, 0x4]\n" - "\tldr r2, =0x85000100\n" - "\tstr r2, [r4, 0x8]\n" - "\tldr r0, [r4, 0x8]\n" - "\tstr r1, [sp, 0xC]\n" - "\tadd r0, sp, 0xC\n" - "\tstr r0, [r4]\n" - "\tmovs r0, 0xA0\n" - "\tlsls r0, 19\n" - "\tstr r0, [r4, 0x4]\n" - "\tstr r2, [r4, 0x8]\n" - "\tldr r0, [r4, 0x8]\n" - "\tmovs r0, 0\n" - "\tbl ResetBgsAndClearDma3BusyFlags\n" - "\tldr r1, =gUnknown_08618108\n" - "\tmovs r0, 0\n" - "\tmovs r2, 0x2\n" - "\tbl InitBgsFromTemplates\n" - "\tmovs r0, 0\n" - "\tmovs r1, 0\n" - "\tmovs r2, 0\n" - "\tbl ChangeBgX\n" - "\tmovs r0, 0\n" - "\tmovs r1, 0\n" - "\tmovs r2, 0\n" - "\tbl ChangeBgY\n" - "\tmovs r0, 0x1\n" - "\tmovs r1, 0\n" - "\tmovs r2, 0\n" - "\tbl ChangeBgX\n" - "\tmovs r0, 0x1\n" - "\tmovs r1, 0\n" - "\tmovs r2, 0\n" - "\tbl ChangeBgY\n" - "\tldr r0, =gUnknown_08618110\n" - "\tbl InitWindows\n" - "\tbl DeactivateAllTextPrinters\n" - "\tldr r0, =sUnknown_08618138\n" - "\tstr r0, [r4]\n" - "\tldr r0, =0x050001e0\n" - "\tstr r0, [r4, 0x4]\n" - "\tldr r0, =0x84000008\n" - "\tstr r0, [r4, 0x8]\n" - "\tldr r0, [r4, 0x8]\n" - "\tmovs r0, 0\n" - "\tmovs r1, 0x40\n" - "\tbl SetGpuReg\n" - "\tmovs r0, 0x2\n" - "\tmovs r1, 0\n" - "\tbl FillWindowPixelBuffer\n" - "\tmovs r0, 0x3\n" - "\tmovs r1, 0\n" - "\tbl FillWindowPixelBuffer\n" - "\tmovs r0, 0\n" - "\tmovs r1, 0xAA\n" - "\tbl FillWindowPixelBuffer\n" - "\tldr r5, =sUnknown_08617E9B\n" - "\tmovs r0, 0\n" - "\tadds r1, r5, 0\n" - "\tmovs r2, 0\n" - "\tbl GetStringWidth\n" - "\tadds r1, r0, 0\n" - "\tmovs r4, 0x78\n" - "\tsubs r0, r4, r1\n" - "\tlsrs r1, r0, 31\n" - "\tadds r0, r1\n" - "\tasrs r0, 1\n" - "\tlsls r2, r0, 24\n" - "\tlsrs r2, 24\n" - "\tldr r6, =sUnknown_0861815B\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tmov r8, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tstr r5, [sp, 0x8]\n" - "\tmovs r0, 0x2\n" - "\tmovs r1, 0\n" - "\tmovs r3, 0x3\n" - "\tbl box_print\n" - "\tldr r5, =sUnknown_08617E8D\n" - "\tmovs r0, 0\n" - "\tadds r1, r5, 0\n" - "\tmovs r2, 0\n" - "\tbl GetStringWidth\n" - "\tadds r1, r0, 0\n" - "\tsubs r4, r1\n" - "\tlsrs r0, r4, 31\n" - "\tadds r4, r0\n" - "\tasrs r4, 1\n" - "\tadds r0, r4, 0\n" - "\tadds r0, 0x78\n" - "\tlsls r2, r0, 24\n" - "\tlsrs r2, 24\n" - "\tstr r6, [sp]\n" - "\tmov r0, r8\n" - "\tstr r0, [sp, 0x4]\n" - "\tstr r5, [sp, 0x8]\n" - "\tmovs r0, 0x2\n" - "\tmovs r1, 0\n" - "\tmovs r3, 0x3\n" - "\tbl box_print\n" - "\tmovs r0, 0\n" - "\tadds r1, r5, 0\n" - "\tmovs r2, 0\n" - "\tbl GetStringWidth\n" - "\tadds r1, r0, 0\n" - "\tmovs r0, 0x70\n" - "\tsubs r0, r1\n" - "\tlsrs r1, r0, 31\n" - "\tadds r0, r1\n" - "\tasrs r0, 1\n" - "\tlsls r2, r0, 24\n" - "\tlsrs r2, 24\n" - "\tstr r6, [sp]\n" - "\tmov r0, r8\n" - "\tstr r0, [sp, 0x4]\n" - "\tstr r5, [sp, 0x8]\n" - "\tmovs r0, 0x3\n" - "\tmovs r1, 0\n" - "\tmovs r3, 0\n" - "\tbl box_print\n" - "\tldr r4, =sUnknown_08617E78\n" - "\tmovs r0, 0x1\n" - "\tadds r1, r4, 0\n" - "\tmovs r2, 0\n" - "\tbl GetStringWidth\n" - "\tadds r1, r0, 0\n" - "\tmovs r0, 0xD0\n" - "\tsubs r0, r1\n" - "\tlsrs r1, r0, 31\n" - "\tadds r0, r1\n" - "\tasrs r0, 1\n" - "\tlsls r2, r0, 24\n" - "\tlsrs r2, 24\n" - "\tldr r0, =sUnknown_08618158\n" - "\tstr r0, [sp]\n" - "\tmov r0, r8\n" - "\tstr r0, [sp, 0x4]\n" - "\tstr r4, [sp, 0x8]\n" - "\tmovs r0, 0\n" - "\tmovs r1, 0x1\n" - "\tmovs r3, 0x2\n" - "\tbl box_print\n" - "\tmovs r0, 0x2\n" - "\tmovs r1, 0x2\n" - "\tbl CopyWindowToVram\n" - "\tmovs r0, 0x3\n" - "\tmovs r1, 0x2\n" - "\tbl CopyWindowToVram\n" - "\tmovs r0, 0\n" - "\tmovs r1, 0x2\n" - "\tbl CopyWindowToVram\n" - "\tadd sp, 0x10\n" - "\tpop {r3}\n" - "\tmov r8, r3\n" - "\tpop {r4-r6}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.pool\n" - ".syntax divided"); -} -#endif - static int berry_fix_text_update(int checkval) { if (berry_fix_mb_manager->unk1 == checkval) @@ -522,7 +318,7 @@ static void berry_fix_text_print(int scene) ShowBg(1); } -static void berry_fix_bg_hide() +static void berry_fix_bg_hide(void) { HideBg(0); HideBg(1); diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c new file mode 100644 index 000000000..1e029bece --- /dev/null +++ b/src/berry_tag_screen.c @@ -0,0 +1,653 @@ +#include "global.h" +#include "berry_tag_screen.h" +#include "berry.h" +#include "decompress.h" +#include "field_map_obj.h" +#include "item_menu.h" +#include "constants/items.h" +#include "item.h" +#include "item_use.h" +#include "main.h" +#include "menu.h" +#include "text.h" +#include "window.h" +#include "task.h" +#include "menu_helpers.h" +#include "palette.h" +#include "overworld.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "bg.h" +#include "malloc.h" +#include "scanline_effect.h" +#include "gpu_regs.h" +#include "graphics.h" +#include "item_menu_icons.h" +#include "decompress.h" +#include "international_string_util.h" + +// There are 4 windows used in berry tag screen. +enum +{ + WIN_BERRY_NAME, + WIN_SIZE_FIRM, + WIN_DESC, + WIN_BERRY_TAG +}; + +struct BerryTagScreenStruct +{ + u16 tilemapBuffers[3][0x400]; + u16 berryId; + u8 berrySpriteId; + u8 flavorCircleIds[FLAVOR_COUNT]; + u16 gfxState; +}; + +// EWRAM vars +static EWRAM_DATA struct BerryTagScreenStruct *sBerryTag = NULL; + +// const rom data +static const struct BgTemplate sBackgroundTemplates[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 29, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 0, + .mapBaseIndex = 28, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + } +}; + +static const u16 sFontPalette[] = INCBIN_U16("graphics/interface/berry_tag_screen.gbapal"); + +static const struct TextColor sTextColors[] = +{ + {0, 2, 3}, + {15, 14, 13} +}; + +static const struct WindowTemplate sWindowTemplates[] = +{ + {0x01, 0x0b, 0x04, 0x08, 0x02, 0x0f, 0x0045}, // WIN_BERRY_NAME + {0x01, 0x0b, 0x07, 0x12, 0x04, 0x0f, 0x0055}, // WIN_SIZE_FIRM + {0x01, 0x04, 0x0e, 0x19, 0x04, 0x0f, 0x009d}, // WIN_DESC + {0x00, 0x02, 0x00, 0x08, 0x02, 0x0f, 0x0101}, // WIN_BERRY_TAG + DUMMY_WIN_TEMPLATE +}; + +static const u8 *const sBerryFirmnessStrings[] = +{ + gBerryFirmnessString_VerySoft, + gBerryFirmnessString_Soft, + gBerryFirmnessString_Hard, + gBerryFirmnessString_VeryHard, + gBerryFirmnessString_SuperHard +}; + +// this file's functions +static void CB2_InitBerryTagScreen(void); +static void HandleInitBackgrounds(void); +static void HandleInitWindows(void); +static void AddBerryTagTextToBg0(void); +static void PrintAllBerryData(void); +static void CreateBerrySprite(void); +static void CreateFlavorCircleSprites(void); +static void SetFlavorCirclesVisiblity(void); +static void PrintBerryNumberAndName(void); +static void PrintBerrySize(void); +static void PrintBerryFirmness(void); +static void PrintBerryDescription1(void); +static void PrintBerryDescription2(void); +static bool8 InitBerryTagScreen(void); +static bool8 LoadBerryTagGfx(void); +static void Task_HandleInput(u8 taskId); +static void Task_CloseBerryTagScreen(u8 taskId); +static void Task_DisplayAnotherBerry(u8 taskId); +static void TryChangeDisplayedBerry(u8 taskId, s8 toMove); +static void HandleBagCursorPositionChange(s8 toMove); + +// code +void DoBerryTagScreen(void) +{ + sBerryTag = AllocZeroed(sizeof(*sBerryTag)); + sBerryTag->berryId = ItemIdToBerryType(gSpecialVar_ItemId); + SetMainCallback2(CB2_InitBerryTagScreen); +} + +static void CB2_BerryTagScreen(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + do_scheduled_bg_tilemap_copies_to_vram(); + UpdatePaletteFade(); +} + +static void VblankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void CB2_InitBerryTagScreen(void) +{ + while (1) + { + if (sub_81221EC() == TRUE) + break; + if (InitBerryTagScreen() == TRUE) + break; + if (sub_81221AC() == TRUE) + break; + } +} + +static bool8 InitBerryTagScreen(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankHBlankCallbacksToNull(); + ResetVramOamAndBgCntRegs(); + clear_scheduled_bg_copies_to_vram(); + gMain.state++; + break; + case 1: + ScanlineEffect_Stop(); + gMain.state++; + break; + case 2: + ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = 1; + gMain.state++; + break; + case 3: + ResetSpriteData(); + gMain.state++; + break; + case 4: + FreeAllSpritePalettes(); + gMain.state++; + break; + case 5: + if (!sub_81221AC()) + ResetTasks(); + gMain.state++; + break; + case 6: + HandleInitBackgrounds(); + sBerryTag->gfxState = 0; + gMain.state++; + break; + case 7: + if (LoadBerryTagGfx()) + gMain.state++; + break; + case 8: + HandleInitWindows(); + gMain.state++; + break; + case 9: + AddBerryTagTextToBg0(); + gMain.state++; + break; + case 10: + PrintAllBerryData(); + gMain.state++; + break; + case 11: + CreateBerrySprite(); + gMain.state++; + break; + case 12: + CreateFlavorCircleSprites(); + SetFlavorCirclesVisiblity(); + gMain.state++; + break; + case 13: + CreateTask(Task_HandleInput, 0); + gMain.state++; + break; + case 14: + BlendPalettes(-1, 0x10, 0); + gMain.state++; + break; + case 15: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + gPaletteFade.bufferTransferDisabled = 0; + gMain.state++; + break; + default: // done + SetVBlankCallback(VblankCB); + SetMainCallback2(CB2_BerryTagScreen); + return TRUE; + } + + return FALSE; +} + +static void HandleInitBackgrounds(void) +{ + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, sBackgroundTemplates, ARRAY_COUNT(sBackgroundTemplates)); + SetBgTilemapBuffer(2, sBerryTag->tilemapBuffers[0]); + SetBgTilemapBuffer(3, sBerryTag->tilemapBuffers[1]); + ResetAllBgsCoordinates(); + schedule_bg_copy_tilemap_to_vram(2); + schedule_bg_copy_tilemap_to_vram(3); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); +} + +static bool8 LoadBerryTagGfx(void) +{ + u16 i; + + switch (sBerryTag->gfxState) + { + case 0: + reset_temp_tile_data_buffers(); + decompress_and_copy_tile_data_to_vram(2, gUnknown_08D9BB44, 0, 0, 0); + sBerryTag->gfxState++; + break; + case 1: + if (free_temp_tile_data_buffers_if_possible() != TRUE) + { + LZDecompressWram(gUnknown_08D9BF98, sBerryTag->tilemapBuffers[0]); + sBerryTag->gfxState++; + } + break; + case 2: + LZDecompressWram(gUnknown_08D9C13C, sBerryTag->tilemapBuffers[2]); + sBerryTag->gfxState++; + break; + case 3: + if (gSaveBlock2Ptr->playerGender == MALE) + { + for (i = 0; i < ARRAY_COUNT(sBerryTag->tilemapBuffers[1]); i++) + sBerryTag->tilemapBuffers[1][i] = 0x4042; + } + else + { + for (i = 0; i < ARRAY_COUNT(sBerryTag->tilemapBuffers[1]); i++) + sBerryTag->tilemapBuffers[1][i] = 0x5042; + } + sBerryTag->gfxState++; + break; + case 4: + LoadCompressedPalette(gUnknown_08D9BEF0, 0, 0xC0); + sBerryTag->gfxState++; + break; + case 5: + LoadCompressedObjectPic(&gUnknown_0857FDEC); + sBerryTag->gfxState++; + break; + default: + LoadCompressedObjectPalette(&gUnknown_0857FDF4); + return TRUE; // done + } + + return FALSE; +} + +static void HandleInitWindows(void) +{ + u16 i; + + InitWindows(sWindowTemplates); + DeactivateAllTextPrinters(); + LoadPalette(sFontPalette, 0xF0, 0x20); + for (i = 0; i < ARRAY_COUNT(sWindowTemplates) - 1; i++) + PutWindowTilemap(i); + schedule_bg_copy_tilemap_to_vram(0); + schedule_bg_copy_tilemap_to_vram(1); +} + +static void PrintTextInBerryTagScreen(u8 windowId, const u8 *text, u8 x, u8 y, s32 speed, u8 colorStructId) +{ + AddTextPrinterParameterized2(windowId, 1, x, y, 0, 0, &sTextColors[colorStructId], speed, text); +} + +static void AddBerryTagTextToBg0(void) +{ + memcpy(GetBgTilemapBuffer(0), sBerryTag->tilemapBuffers[2], sizeof(sBerryTag->tilemapBuffers[2])); + FillWindowPixelBuffer(WIN_BERRY_TAG, 0xFF); + PrintTextInBerryTagScreen(WIN_BERRY_TAG, gText_BerryTag, GetStringCenterAlignXOffset(1, gText_BerryTag, 0x40), 1, 0, 1); + PutWindowTilemap(WIN_BERRY_TAG); + schedule_bg_copy_tilemap_to_vram(0); +} + +static void PrintAllBerryData(void) +{ + PrintBerryNumberAndName(); + PrintBerrySize(); + PrintBerryFirmness(); + PrintBerryDescription1(); + PrintBerryDescription2(); +} + +static void PrintBerryNumberAndName(void) +{ + const struct Berry *berry = GetBerryInfo(sBerryTag->berryId); + ConvertIntToDecimalStringN(gStringVar1, sBerryTag->berryId, 2, 2); + StringCopy(gStringVar2, berry->name); + StringExpandPlaceholders(gStringVar4, gText_UnkF908Var1Var2); + PrintTextInBerryTagScreen(WIN_BERRY_NAME, gStringVar4, 0, 1, 0, 0); +} + +static void PrintBerrySize(void) +{ + const struct Berry *berry = GetBerryInfo(sBerryTag->berryId); + PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_SizeSlash, 0, 1, TEXT_SPEED_FF, NULL); + if (berry->size != 0) + { + u32 inches, fraction; + + inches = 1000 * berry->size / 254; + if (inches % 10 > 4) + inches += 10; + fraction = (inches % 100) / 10; + inches /= 100; + + ConvertIntToDecimalStringN(gStringVar1, inches, 0, 2); + ConvertIntToDecimalStringN(gStringVar2, fraction, 0, 2); + StringExpandPlaceholders(gStringVar4, gText_Var1DotVar2); + PrintTextOnWindow(WIN_SIZE_FIRM, 1, gStringVar4, 0x28, 1, 0, NULL); + } + else + { + PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_ThreeMarks, 0x28, 1, 0, NULL); + } +} + +static void PrintBerryFirmness(void) +{ + const struct Berry *berry = GetBerryInfo(sBerryTag->berryId); + PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_FirmSlash, 0, 0x11, TEXT_SPEED_FF, NULL); + if (berry->firmness != 0) + PrintTextOnWindow(WIN_SIZE_FIRM, 1, sBerryFirmnessStrings[berry->firmness - 1], 0x28, 0x11, 0, NULL); + else + PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_ThreeMarks, 0x28, 0x11, 0, NULL); +} + +static void PrintBerryDescription1(void) +{ + const struct Berry *berry = GetBerryInfo(sBerryTag->berryId); + PrintTextOnWindow(WIN_DESC, 1, berry->description1, 0, 1, 0, NULL); +} + +static void PrintBerryDescription2(void) +{ + const struct Berry *berry = GetBerryInfo(sBerryTag->berryId); + PrintTextOnWindow(WIN_DESC, 1, berry->description2, 0, 0x11, 0, NULL); +} + +static void CreateBerrySprite(void) +{ + sBerryTag->berrySpriteId = CreateBerryTagSprite(sBerryTag->berryId - 1, 56, 64); +} + +static void DestroyBerrySprite(void) +{ + DestroySprite(&gSprites[sBerryTag->berrySpriteId]); + FreeBerryTagSpritePalette(); +} + +static void CreateFlavorCircleSprites(void) +{ + sBerryTag->flavorCircleIds[FLAVOR_SPICY] = CreateBerryFlavorCircleSprite(64); + sBerryTag->flavorCircleIds[FLAVOR_DRY] = CreateBerryFlavorCircleSprite(104); + sBerryTag->flavorCircleIds[FLAVOR_SWEET] = CreateBerryFlavorCircleSprite(144); + sBerryTag->flavorCircleIds[FLAVOR_BITTER] = CreateBerryFlavorCircleSprite(184); + sBerryTag->flavorCircleIds[FLAVOR_SOUR] = CreateBerryFlavorCircleSprite(224); +} + +static void SetFlavorCirclesVisiblity(void) +{ + const struct Berry *berry = GetBerryInfo(sBerryTag->berryId); + + if (berry->spicy) + gSprites[sBerryTag->flavorCircleIds[FLAVOR_SPICY]].invisible = 0; + else + gSprites[sBerryTag->flavorCircleIds[FLAVOR_SPICY]].invisible = 1; + + if (berry->dry) + gSprites[sBerryTag->flavorCircleIds[FLAVOR_DRY]].invisible = 0; + else + gSprites[sBerryTag->flavorCircleIds[FLAVOR_DRY]].invisible = 1; + + if (berry->sweet) + gSprites[sBerryTag->flavorCircleIds[FLAVOR_SWEET]].invisible = 0; + else + gSprites[sBerryTag->flavorCircleIds[FLAVOR_SWEET]].invisible = 1; + + if (berry->bitter) + gSprites[sBerryTag->flavorCircleIds[FLAVOR_BITTER]].invisible = 0; + else + gSprites[sBerryTag->flavorCircleIds[FLAVOR_BITTER]].invisible = 1; + + if (berry->sour) + gSprites[sBerryTag->flavorCircleIds[FLAVOR_SOUR]].invisible = 0; + else + gSprites[sBerryTag->flavorCircleIds[FLAVOR_SOUR]].invisible = 1; +} + +static void DestroyFlavorCircleSprites(void) +{ + u16 i; + + for (i = 0; i < FLAVOR_COUNT; i++) + DestroySprite(&gSprites[sBerryTag->flavorCircleIds[i]]); +} + +static void PrepareToCloseBerryTagScreen(u8 taskId) +{ + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_CloseBerryTagScreen; +} + +static void Task_CloseBerryTagScreen(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyBerrySprite(); + DestroyFlavorCircleSprites(); + Free(sBerryTag); + FreeAllWindowBuffers(); + SetMainCallback2(bag_menu_mail_related); + DestroyTask(taskId); + } +} + +static void Task_HandleInput(u8 taskId) +{ + if (!gPaletteFade.active) + { + u16 arrowKeys = gMain.newAndRepeatedKeys & DPAD_ANY; + if (arrowKeys == DPAD_UP) + TryChangeDisplayedBerry(taskId, -1); + else if (arrowKeys == DPAD_DOWN) + TryChangeDisplayedBerry(taskId, 1); + else if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + PrepareToCloseBerryTagScreen(taskId); + } +} + +static void TryChangeDisplayedBerry(u8 taskId, s8 toMove) +{ + s16 *data = gTasks[taskId].data; + s16 currPocketPosition = gUnknown_0203CE58.unk12[3] + gUnknown_0203CE58.unk8[3]; + u32 newPocketPosition = currPocketPosition + toMove; + if (newPocketPosition < 46 && BagGetItemIdByPocketPosition(BAG_BERRIES, newPocketPosition) != 0) + { + if (toMove < 0) + data[1] = 2; + else + data[1] = 1; + + data[0] = 0; + PlaySE(SE_SELECT); + HandleBagCursorPositionChange(toMove); + gTasks[taskId].func = Task_DisplayAnotherBerry; + } +} + +static void HandleBagCursorPositionChange(s8 toMove) +{ + u16 *scrollPos = &gUnknown_0203CE58.unk12[3]; + u16 *cursorPos = &gUnknown_0203CE58.unk8[3]; + if (toMove > 0) + { + if (*cursorPos < 4 || BagGetItemIdByPocketPosition(BAG_BERRIES, *scrollPos + 8) == 0) + *cursorPos += toMove; + else + *scrollPos += toMove; + } + else + { + if (*cursorPos > 3 || *scrollPos == 0) + *cursorPos += toMove; + else + *scrollPos += toMove; + } + + sBerryTag->berryId = ItemIdToBerryType(BagGetItemIdByPocketPosition(BAG_BERRIES, *scrollPos + *cursorPos)); +} + +static void Task_DisplayAnotherBerry(u8 taskId) +{ + u16 i; + s16 posY; + s16 *data = gTasks[taskId].data; + data[0] += 0x10; + data[0] &= 0xFF; + + if (data[1] == 1) + { + switch (data[0]) + { + case 0x30: + FillWindowPixelBuffer(0, 0); + break; + case 0x40: + PrintBerryNumberAndName(); + break; + case 0x50: + DestroyBerrySprite(); + CreateBerrySprite(); + break; + case 0x60: + FillWindowPixelBuffer(1, 0); + break; + case 0x70: + PrintBerrySize(); + break; + case 0x80: + PrintBerryFirmness(); + break; + case 0x90: + SetFlavorCirclesVisiblity(); + break; + case 0xA0: + FillWindowPixelBuffer(2, 0); + break; + case 0xB0: + PrintBerryDescription1(); + break; + case 0xC0: + PrintBerryDescription2(); + break; + } + } + else + { + switch (data[0]) + { + case 0x30: + FillWindowPixelBuffer(2, 0); + break; + case 0x40: + PrintBerryDescription2(); + break; + case 0x50: + PrintBerryDescription1(); + break; + case 0x60: + SetFlavorCirclesVisiblity(); + break; + case 0x70: + FillWindowPixelBuffer(1, 0); + break; + case 0x80: + PrintBerryFirmness(); + break; + case 0x90: + PrintBerrySize(); + break; + case 0xA0: + DestroyBerrySprite(); + CreateBerrySprite(); + break; + case 0xB0: + FillWindowPixelBuffer(0, 0); + break; + case 0xC0: + PrintBerryNumberAndName(); + break; + } + } + + if (data[1] == 1) + posY = -data[0]; + else + posY = data[0]; + + gSprites[sBerryTag->berrySpriteId].pos2.y = posY; + for (i = 0; i < FLAVOR_COUNT; i++) + gSprites[sBerryTag->flavorCircleIds[i]].pos2.y = posY; + + ChangeBgY(1, 0x1000, data[1]); + ChangeBgY(2, 0x1000, data[1]); + + if (data[0] == 0) + gTasks[taskId].func = Task_HandleInput; +} diff --git a/src/field_map_obj_helpers.c b/src/field_map_obj_helpers.c index 1e0e9b66b..de26cb034 100755 --- a/src/field_map_obj_helpers.c +++ b/src/field_map_obj_helpers.c @@ -549,14 +549,14 @@ bool32 sub_8097E50(struct MapObject *mapObject, struct Sprite *sprite) { if (firstFreeSlot == 16 && gUnknown_020375B8[i] == 0) firstFreeSlot = i; - + if (gUnknown_020375B8[i] == mapObject->localId) { found = TRUE; break; } } - + if (!found && firstFreeSlot != 16) { gUnknown_020375B8[firstFreeSlot] = mapObject->localId; @@ -564,13 +564,13 @@ bool32 sub_8097E50(struct MapObject *mapObject, struct Sprite *sprite) ableToStore = TRUE; // the nonmatching problem is that ableToStore == TRUE isnt being merged with the above ableToStore = TRUE assignment. } } - + if (ableToStore == TRUE) { mapObject->mapobj_bit_12 = TRUE; mapObject->mapobj_bit_9 = TRUE; } - + sprite->data[2] = 1; return TRUE; } diff --git a/src/item_use.c b/src/item_use.c index 9cb2a4546..6f585ed8b 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -92,6 +92,7 @@ extern u8 gBankInMenu; extern u16 gBattlerPartyIndexes[]; extern void sub_81B89F0(void); extern u8 GetItemEffectType(u16); +extern struct MapConnection *sub_8088A8C(s16, s16); void MapPostLoadHook_UseItem(void); extern void sub_80AF6D4(void); @@ -379,12 +380,12 @@ bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId) newDistanceX = distanceX - x; distanceY = (u16)events->bgEvents[i].y + 7; newDistanceY = distanceY - y; - + if ((u16)(newDistanceX + 7) < 15 && (newDistanceY >= -5) && (newDistanceY < 6)) sub_80FD8E0(taskId, newDistanceX, newDistanceY); } } - + sub_80FD7C8(taskId); if (gTasks[taskId].data[2] == TRUE) return TRUE; @@ -453,8 +454,6 @@ bool8 sub_80FD730(struct MapConnection *connection, int x, int y) return sub_80FD6D4(mapHeader->events, localX, localY); } -// weird math -#ifdef NONMATCHING void sub_80FD7C8(u8 taskId) { s16 x, y; @@ -462,15 +461,18 @@ void sub_80FD7C8(u8 taskId) s16 width = gMapHeader.mapData->width + 7; s16 height = gMapHeader.mapData->height + 7; + s16 var1 = 7; + s16 var2 = 7; + PlayerGetDestCoords(&x, &y); for (curX = x - 7; curX <= x + 7; curX++) { for (curY = y - 5; curY <= y + 5; curY++) { - if (7 > curX + if (var1 > curX || curX >= width - || 7 > curY + || var2 > curY || curY >= height) { struct MapConnection *conn = sub_8088A8C(curX, curY); @@ -480,155 +482,6 @@ void sub_80FD7C8(u8 taskId) } } } -#else -__attribute__((naked)) -void sub_80FD7C8(u8 taskId) -{ - 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, 0x14\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x4]\n\ - ldr r0, =gMapHeader\n\ - ldr r1, [r0]\n\ - ldr r0, [r1]\n\ - adds r0, 0x7\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x8]\n\ - ldr r0, [r1, 0x4]\n\ - adds r0, 0x7\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0xC]\n\ - mov r4, sp\n\ - adds r4, 0x2\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl PlayerGetDestCoords\n\ - mov r0, sp\n\ - ldrh r0, [r0]\n\ - subs r0, 0x7\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - mov r1, sp\n\ - movs r2, 0\n\ - ldrsh r1, [r1, r2]\n\ - adds r1, 0x7\n\ - cmp r0, r1\n\ - bgt _080FD8CC\n\ -_080FD816:\n\ - mov r5, sp\n\ - ldrh r0, [r5, 0x2]\n\ - subs r0, 0x5\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - lsls r2, r4, 16\n\ - asrs r1, r2, 16\n\ - movs r6, 0x2\n\ - ldrsh r0, [r5, r6]\n\ - adds r0, 0x5\n\ - lsls r3, 16\n\ - mov r8, r3\n\ - cmp r1, r0\n\ - bgt _080FD8B6\n\ - movs r0, 0x7\n\ - str r0, [sp, 0x10]\n\ - mov r1, r8\n\ - asrs r1, 16\n\ - mov r9, r1\n\ - mov r10, r0\n\ -_080FD83E:\n\ - ldr r3, [sp, 0x10]\n\ - cmp r3, r9\n\ - bgt _080FD860\n\ - ldr r5, [sp, 0x8]\n\ - lsls r0, r5, 16\n\ - asrs r0, 16\n\ - cmp r9, r0\n\ - bge _080FD860\n\ - asrs r1, r2, 16\n\ - cmp r10, r1\n\ - bgt _080FD860\n\ - ldr r6, [sp, 0xC]\n\ - lsls r0, r6, 16\n\ - asrs r0, 16\n\ - lsls r7, r4, 16\n\ - cmp r1, r0\n\ - blt _080FD89E\n\ -_080FD860:\n\ - mov r0, r8\n\ - asrs r5, r0, 16\n\ - lsls r4, 16\n\ - asrs r6, r4, 16\n\ - adds r0, r5, 0\n\ - adds r1, r6, 0\n\ - bl sub_8088A8C\n\ - adds r7, r4, 0\n\ - cmp r0, 0\n\ - beq _080FD89E\n\ - adds r1, r5, 0\n\ - adds r2, r6, 0\n\ - bl sub_80FD730\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _080FD89E\n\ - mov r0, sp\n\ - ldrh r1, [r0]\n\ - subs r1, r5, r1\n\ - lsls r1, 16\n\ - asrs r1, 16\n\ - ldrh r2, [r0, 0x2]\n\ - subs r2, r6, r2\n\ - lsls r2, 16\n\ - asrs r2, 16\n\ - ldr r0, [sp, 0x4]\n\ - bl sub_80FD8E0\n\ -_080FD89E:\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - adds r0, r7, r1\n\ - lsrs r4, r0, 16\n\ - lsls r2, r4, 16\n\ - asrs r1, r2, 16\n\ - mov r3, sp\n\ - movs r5, 0x2\n\ - ldrsh r0, [r3, r5]\n\ - adds r0, 0x5\n\ - cmp r1, r0\n\ - ble _080FD83E\n\ -_080FD8B6:\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - add r1, r8\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - mov r0, sp\n\ - movs r6, 0\n\ - ldrsh r0, [r0, r6]\n\ - adds r0, 0x7\n\ - cmp r1, r0\n\ - ble _080FD816\n\ -_080FD8CC:\n\ - add sp, 0x14\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\ - .pool\n\ - .syntax divided\n"); -} -#endif void sub_80FD8E0(u8 taskId, s16 x, s16 y) { @@ -992,7 +845,7 @@ void ItemUseOutOfBattle_Repel(u8 taskId) void sub_80FE124(u8 taskId) { s16* data = gTasks[taskId].data; - + if (++data[8] > 7) { data[8] = 0; diff --git a/src/palette.c b/src/palette.c index cc2046b14..fd4ad32ad 100644 --- a/src/palette.c +++ b/src/palette.c @@ -840,289 +840,94 @@ void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) void TintPalette_GrayScale(u16 *palette, u16 count) { - int r; - int g; - int b; + s32 r, g, b, i; u32 gray; - int i; for (i = 0; i < count; i++) { - r = *palette & 0x1F; - g = (*palette >> 5) & 0x1F; + r = (*palette >> 0) & 0x1F; + g = (*palette >> 5) & 0x1F; b = (*palette >> 10) & 0x1F; - r = r * Q_8_8(0.2969); - r += g * Q_8_8(0.5899); - r += b * Q_8_8(0.1133); - - gray = r >> 8; + gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; - *palette++ = gray << 10 | gray << 5 | gray; + *palette++ = (gray << 10) | (gray << 5) | (gray << 0); } } void TintPalette_GrayScale2(u16 *palette, u16 count) { - int r; - int g; - int b; + s32 r, g, b, i; u32 gray; - int i; for (i = 0; i < count; i++) { - r = *palette & 0x1F; - g = (*palette >> 5) & 0x1F; + r = (*palette >> 0) & 0x1F; + g = (*palette >> 5) & 0x1F; b = (*palette >> 10) & 0x1F; - r = r * Q_8_8(0.2969); - r += g * Q_8_8(0.5899); - r += b * Q_8_8(0.1133); - - gray = r >> 8; + gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; if (gray > 0x1F) gray = 0x1F; gray = sRoundedDownGrayscaleMap[gray]; - *palette++ = gray << 10 | gray << 5 | gray; + *palette++ = (gray << 10) | (gray << 5) | (gray << 0); } } -#ifdef NONMATCHING void TintPalette_SepiaTone(u16 *palette, u16 count) { - int red; - int green; - int blue; + s32 r, g, b, i; u32 gray; - u32 sepia; - s8 r2; - s8 g2; - s8 b2; - - int i; + for (i = 0; i < count; i++) { - r = *palette & 0x1F; - g = (*palette >> 5) & 0x1F; + r = (*palette >> 0) & 0x1F; + g = (*palette >> 5) & 0x1F; b = (*palette >> 10) & 0x1F; - r *= 0x4C; - r += g * 0x97; - r += b * 0x1D; + gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; - gray = (s32)(r >> 8); + r = (u16)((Q_8_8(1.2) * gray)) >> 8; + g = (u16)((Q_8_8(1.0) * gray)) >> 8; + b = (u16)((Q_8_8(0.94) * gray)) >> 8; - sepia = (gray * 0x133); + if (r > 31) + r = 31; - r2 = (u16)sepia >> 8; - - g2 = gray; - - b2 = (gray * 15); - - if (r2 > 0x1F) - r2 = 0x1F; - - *palette++ = b2 << 10 | g2 << 5 | r2; + *palette++ = (b << 10) | (g << 5) | (r << 0); } } -#else -__attribute__((naked)) -void TintPalette_SepiaTone(u16 *palette, u16 count) -{ - asm("push {r4-r7,lr}\n\ - add r5, r0, #0\n\ - lsl r1, #16\n\ - lsr r1, #16\n\ - cmp r1, #0\n\ - beq _080A2BA2\n\ - mov r7, #0x1F\n\ - add r6, r1, #0\n\ -_080A2B50:\n\ - ldrh r0, [r5]\n\ - mov r1, #0x1F\n\ - and r1, r0\n\ - lsl r0, #16\n\ - lsr r2, r0, #21\n\ - and r2, r7\n\ - lsr r3, r0, #26\n\ - and r3, r7\n\ - mov r0, #0x4C\n\ - mul r1, r0\n\ - mov r0, #0x97\n\ - mul r0, r2\n\ - add r1, r0\n\ - lsl r0, r3, #3\n\ - sub r0, r3\n\ - lsl r0, #2\n\ - add r0, r3\n\ - add r1, r0\n\ - asr r1, #8\n\ - ldr r0, =0x00000133\n\ - mul r0, r1\n\ - lsl r0, #16\n\ - lsr r2, r0, #24\n\ - lsl r0, r1, #24\n\ - lsr r4, r0, #24\n\ - lsl r0, r1, #4\n\ - sub r0, r1\n\ - lsl r0, #20\n\ - lsr r3, r0, #24\n\ - cmp r2, #0x1F\n\ - ble _080A2B90\n\ - mov r2, #0x1F\n\ -_080A2B90:\n\ - lsl r0, r3, #10\n\ - lsl r1, r4, #5\n\ - orr r0, r1\n\ - orr r0, r2\n\ - strh r0, [r5]\n\ - add r5, #0x2\n\ - sub r6, #0x1\n\ - cmp r6, #0\n\ - bne _080A2B50\n\ -_080A2BA2:\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool"); -} -#endif // NONMATCHING -#ifdef NONMATCHING -void TintPalette_CustomTone(u16 *palette, u16 count, u16 a3, u16 a4, u16 a5) +void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone) { - s32 r; - s32 g; - s32 b; - s32 gray; - u8 r2; - u8 g2; - u8 b2; + s32 r, g, b, i; + u32 gray; - int i; for (i = 0; i < count; i++) { - r = *palette & 0x1F; - g = (*palette >> 5) & 0x1F; + r = (*palette >> 0) & 0x1F; + g = (*palette >> 5) & 0x1F; b = (*palette >> 10) & 0x1F; - r *= 0x4C; - r += g * 0x97; - r += b * 0x1D; - - gray = r >> 8; - - r2 = (u16)(gray * a3) >> 8; + gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; - g2 = (u16)(gray * a4) >> 8; + r = (u16)((rTone * gray)) >> 8; + g = (u16)((gTone * gray)) >> 8; + b = (u16)((bTone * gray)) >> 8; - b2 = (u16)(gray * a5) >> 8; + if (r > 31) + r = 31; + if (g > 31) + g = 31; + if (b > 31) + b = 31; - if (r2 > 0x1F) - r2 = 0x1F; - - if (g2 > 0x1F) - g2 = 0x1F; - - if (b2 > 0x1F) - b2 = 0x1F; - - *palette++ = b2 << 10 | g2 << 5 | r2; + *palette++ = (b << 10) | (g << 5) | (r << 0); } - return; -} -#else -__attribute__((naked)) -void TintPalette_CustomTone(u16 *palette, u16 count, u16 a3, u16 a4, u16 a5) -{ - asm("push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - add r5, r0, #0\n\ - ldr r0, [sp, #0x1C]\n\ - lsl r1, #16\n\ - lsr r1, #16\n\ - lsl r2, #16\n\ - lsr r2, #16\n\ - mov r9, r2\n\ - lsl r3, #16\n\ - lsr r3, #16\n\ - mov r8, r3\n\ - lsl r0, #16\n\ - lsr r0, #16\n\ - mov r12, r0\n\ - cmp r1, #0\n\ - beq _080A2C38\n\ - mov r7, #0x1F\n\ - add r6, r1, #0\n\ -_080A2BD6:\n\ - ldrh r0, [r5]\n\ - mov r1, #0x1F\n\ - and r1, r0\n\ - lsl r0, #16\n\ - lsr r2, r0, #21\n\ - and r2, r7\n\ - lsr r3, r0, #26\n\ - and r3, r7\n\ - mov r0, #0x4C\n\ - mul r1, r0\n\ - mov r0, #0x97\n\ - mul r0, r2\n\ - add r1, r0\n\ - lsl r0, r3, #3\n\ - sub r0, r3\n\ - lsl r0, #2\n\ - add r0, r3\n\ - add r1, r0\n\ - asr r1, #8\n\ - mov r0, r9\n\ - mul r0, r1\n\ - lsl r0, #16\n\ - lsr r4, r0, #24\n\ - mov r0, r8\n\ - mul r0, r1\n\ - lsl r0, #16\n\ - lsr r2, r0, #24\n\ - mov r0, r12\n\ - mul r0, r1\n\ - lsl r0, #16\n\ - lsr r3, r0, #24\n\ - cmp r4, #0x1F\n\ - ble _080A2C1A\n\ - mov r4, #0x1F\n\ -_080A2C1A:\n\ - cmp r2, #0x1F\n\ - ble _080A2C20\n\ - mov r2, #0x1F\n\ -_080A2C20:\n\ - cmp r3, #0x1F\n\ - ble _080A2C26\n\ - mov r3, #0x1F\n\ -_080A2C26:\n\ - lsl r0, r3, #10\n\ - lsl r1, r2, #5\n\ - orr r0, r1\n\ - orr r0, r4\n\ - strh r0, [r5]\n\ - add r5, #0x2\n\ - sub r6, #0x1\n\ - cmp r6, #0\n\ - bne _080A2BD6\n\ -_080A2C38:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0"); } -#endif void sub_80A2C44(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7) { diff --git a/src/pokemon_2.c b/src/pokemon_2.c index e484b21a4..730f245d7 100644 --- a/src/pokemon_2.c +++ b/src/pokemon_2.c @@ -1197,26 +1197,26 @@ void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord) for (i = 0; i < PARTY_SIZE; i++) { - if (gBattleResources->secretBase->partySpecies[i]) + if (gBattleResources->secretBase->party.species[i]) { CreateMon(&gEnemyParty[i], - gBattleResources->secretBase->partySpecies[i], - gBattleResources->secretBase->partyLevels[i], + gBattleResources->secretBase->party.species[i], + gBattleResources->secretBase->party.levels[i], 15, 1, - gBattleResources->secretBase->partyPersonality[i], + gBattleResources->secretBase->party.personality[i], 2, 0); - SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->partyHeldItems[i]); + SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->party.heldItems[i]); for (j = 0; j < 6; j++) - SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gBattleResources->secretBase->partyEVs[i]); + SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gBattleResources->secretBase->party.EVs[i]); for (j = 0; j < 4; j++) { - SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->partyMoves[i * 4 + j]); - SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->partyMoves[i * 4 + j]].pp); + SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->party.moves[i * 4 + j]); + SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->party.moves[i * 4 + j]].pp); } } } diff --git a/src/secret_base.c b/src/secret_base.c index 61c2511b7..bb92bc5a9 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -13,6 +13,7 @@ #include "menu_indicators.h" #include "constants/maps.h" #include "constants/songs.h" +#include "constants/species.h" #include "sound.h" #include "overworld.h" #include "fieldmap.h" @@ -711,237 +712,45 @@ u8 sub_80E98AC(struct Pokemon *pokemon) return evTotal / 6; } -#ifdef NONMATCHING -// This function is a meme void sub_80E9914(void) { - u32 zero; - u32 *personality; u16 partyIdx; u16 moveIdx; u16 sbPartyIdx; - u16 *species; - u16 *items; - u16 *moves; - u8 *levels; - u8 *evs; + struct SecretBaseParty *party; sbPartyIdx = 0; - personality = gSaveBlock1Ptr->secretBases[0].partyPersonality; + party = &gSaveBlock1Ptr->secretBases[0].party; if (gSaveBlock1Ptr->secretBases[0].secretBaseId != 0) { - partyIdx = 0; - moves = gSaveBlock1Ptr->secretBases[0].partyMoves; - species = gSaveBlock1Ptr->secretBases[0].partySpecies; - items = gSaveBlock1Ptr->secretBases[0].partyHeldItems; - levels = gSaveBlock1Ptr->secretBases[0].partyLevels; - evs = gSaveBlock1Ptr->secretBases[0].partyEVs; - zero = 0; - for (partyIdx = 0; partyIdx < PARTY_SIZE; partyIdx ++) + for (partyIdx = 0; partyIdx < PARTY_SIZE; partyIdx++) { - for (moveIdx = 0; moveIdx < 4; moveIdx ++) + for (moveIdx = 0; moveIdx < 4; moveIdx++) { - moves[partyIdx * 4 + moveIdx] = zero; + party->moves[partyIdx * 4 + moveIdx] = 0; } - species[partyIdx] = zero; - items[partyIdx] = zero; - levels[partyIdx] = zero; - personality[partyIdx] = zero; - evs[partyIdx] = zero; - if (GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&gPlayerParty[partyIdx], MON_DATA_IS_EGG)) + party->species[partyIdx] = 0; + party->heldItems[partyIdx] = 0; + party->levels[partyIdx] = 0; + party->personality[partyIdx] = 0; + party->EVs[partyIdx] = 0; + if (GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES) != SPECIES_NONE + && !GetMonData(&gPlayerParty[partyIdx], MON_DATA_IS_EGG)) { - for (moveIdx = 0; moveIdx < 4; moveIdx ++) + for (moveIdx = 0; moveIdx < 4; moveIdx++) { - moves[sbPartyIdx * 4 + moveIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_MOVE1 + moveIdx); + party->moves[sbPartyIdx * 4 + moveIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_MOVE1 + moveIdx); } - species[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES); - items[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_HELD_ITEM); - levels[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_LEVEL); - personality[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_PERSONALITY); - evs[sbPartyIdx] = sub_80E98AC(&gPlayerParty[partyIdx]); - sbPartyIdx ++; + party->species[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES); + party->heldItems[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_HELD_ITEM); + party->levels[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_LEVEL); + party->personality[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_PERSONALITY); + party->EVs[sbPartyIdx] = sub_80E98AC(&gPlayerParty[partyIdx]); + sbPartyIdx++; } } } } -#else -__attribute__((naked)) void sub_80E9914(void) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x24\n" - "\tmovs r0, 0\n" - "\tmov r10, r0\n" - "\tldr r0, =gSaveBlock1Ptr\n" - "\tldr r1, [r0]\n" - "\tldr r2, =0x00001ad0\n" - "\tadds r2, r1, r2\n" - "\tstr r2, [sp]\n" - "\tldr r3, =0x00001a9c\n" - "\tadds r0, r1, r3\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _080E993A\n" - "\tb _080E9A60\n" - "_080E993A:\n" - "\tmovs r6, 0\n" - "\tldr r7, =0x00001ae8\n" - "\tadds r7, r1, r7\n" - "\tstr r7, [sp, 0x14]\n" - "\tldr r0, =0x00001b18\n" - "\tadds r0, r1, r0\n" - "\tstr r0, [sp, 0xC]\n" - "\tldr r2, =0x00001b24\n" - "\tadds r2, r1, r2\n" - "\tstr r2, [sp, 0x10]\n" - "\tadds r3, 0x94\n" - "\tadds r3, r1, r3\n" - "\tstr r3, [sp, 0x18]\n" - "\tldr r7, =0x00001b36\n" - "\tadds r7, r1, r7\n" - "\tstr r7, [sp, 0x1C]\n" - "\tmov r9, r6\n" - "_080E995C:\n" - "\tmovs r4, 0\n" - "\tlsls r5, r6, 2\n" - "\tlsls r3, r6, 1\n" - "\tldr r0, =gPlayerParty\n" - "\tmov r8, r0\n" - "\tadds r1, r6, 0x1\n" - "\tstr r1, [sp, 0x4]\n" - "\tadds r2, r5, 0\n" - "\tldr r1, [sp, 0x14]\n" - "_080E996E:\n" - "\tadds r0, r2, r4\n" - "\tlsls r0, 1\n" - "\tadds r0, r1, r0\n" - "\tmov r7, r9\n" - "\tstrh r7, [r0]\n" - "\tadds r0, r4, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r4, r0, 16\n" - "\tcmp r4, 0x3\n" - "\tbls _080E996E\n" - "\tldr r1, [sp, 0xC]\n" - "\tadds r0, r1, r3\n" - "\tmov r2, r9\n" - "\tstrh r2, [r0]\n" - "\tldr r7, [sp, 0x10]\n" - "\tadds r0, r7, r3\n" - "\tstrh r2, [r0]\n" - "\tldr r1, [sp, 0x18]\n" - "\tadds r0, r1, r6\n" - "\tmov r2, r9\n" - "\tstrb r2, [r0]\n" - "\tldr r3, [sp]\n" - "\tadds r0, r3, r5\n" - "\tmov r7, r9\n" - "\tstr r7, [r0]\n" - "\tldr r1, [sp, 0x1C]\n" - "\tadds r0, r1, r6\n" - "\tstrb r7, [r0]\n" - "\tmovs r2, 0x64\n" - "\tadds r5, r6, 0\n" - "\tmuls r5, r2\n" - "\tmov r3, r8\n" - "\tadds r4, r5, r3\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0xB\n" - "\tbl GetMonData\n" - "\tcmp r0, 0\n" - "\tbeq _080E9A54\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0x2D\n" - "\tbl GetMonData\n" - "\tcmp r0, 0\n" - "\tbne _080E9A54\n" - "\tmovs r4, 0\n" - "\tmov r7, r10\n" - "\tlsls r7, 2\n" - "\tmov r8, r7\n" - "\tmov r0, r10\n" - "\tlsls r7, r0, 1\n" - "\tadds r0, 0x1\n" - "\tstr r0, [sp, 0x8]\n" - "\tldr r2, =gPlayerParty\n" - "_080E99DA:\n" - "\tadds r1, r4, 0\n" - "\tadds r1, 0xD\n" - "\tadds r0, r5, r2\n" - "\tstr r2, [sp, 0x20]\n" - "\tbl GetMonData\n" - "\tmov r3, r8\n" - "\tadds r1, r3, r4\n" - "\tlsls r1, 1\n" - "\tldr r3, [sp, 0x14]\n" - "\tadds r1, r3, r1\n" - "\tstrh r0, [r1]\n" - "\tadds r0, r4, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r4, r0, 16\n" - "\tldr r2, [sp, 0x20]\n" - "\tcmp r4, 0x3\n" - "\tbls _080E99DA\n" - "\tmovs r0, 0x64\n" - "\tadds r4, r6, 0\n" - "\tmuls r4, r0\n" - "\tldr r0, =gPlayerParty\n" - "\tadds r4, r0\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0xB\n" - "\tbl GetMonData\n" - "\tldr r2, [sp, 0xC]\n" - "\tadds r1, r2, r7\n" - "\tstrh r0, [r1]\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0xC\n" - "\tbl GetMonData\n" - "\tldr r3, [sp, 0x10]\n" - "\tadds r1, r3, r7\n" - "\tstrh r0, [r1]\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0x38\n" - "\tbl GetMonData\n" - "\tldr r1, [sp, 0x18]\n" - "\tadd r1, r10\n" - "\tstrb r0, [r1]\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0\n" - "\tbl GetMonData\n" - "\tldr r1, [sp]\n" - "\tadd r1, r8\n" - "\tstr r0, [r1]\n" - "\tadds r0, r4, 0\n" - "\tbl sub_80E98AC\n" - "\tldr r1, [sp, 0x1C]\n" - "\tadd r1, r10\n" - "\tstrb r0, [r1]\n" - "\tldr r7, [sp, 0x8]\n" - "\tlsls r0, r7, 16\n" - "\tlsrs r0, 16\n" - "\tmov r10, r0\n" - "_080E9A54:\n" - "\tldr r1, [sp, 0x4]\n" - "\tlsls r0, r1, 16\n" - "\tlsrs r6, r0, 16\n" - "\tcmp r6, 0x5\n" - "\tbhi _080E9A60\n" - "\tb _080E995C\n" - "_080E9A60:\n" - "\tadd sp, 0x24\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.pool"); -} -#endif void sub_80E9A90(void) { @@ -1357,7 +1166,6 @@ void sub_80EA354(void) gSpecialVar_Result = gSaveBlock1Ptr->secretBases[secretBaseRecordId].sbr_field_1_5; } - void sub_80EA3E4(u8 taskId) { s16 x; diff --git a/src/sprite.c b/src/sprite.c index 6d76b9854..8a4729b27 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -240,12 +240,26 @@ static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] = AffineAnimCmd_frame, }; -static const s32 sUnknown_082EC6F4[24] = +static const s32 sUnknown_082EC6F4[3][4][2] = { - 8, 8, 0x10, 0x10, 0x20, 0x20, - 0x40, 0x40, 0x10, 8, 0x20, 8, - 0x20, 0x10, 0x40, 0x20, 8, 0x10, - 8, 0x20, 0x10, 0x20, 0x20, 0x40, + { + {8, 8}, + {0x10, 0x10}, + {0x20, 0x20}, + {0x40, 0x40}, + }, + { + {0x10, 8}, + {0x20, 8}, + {0x20, 0x10}, + {0x40, 0x20}, + }, + { + {8, 0x10}, + {8, 0x20}, + {0x10, 0x20}, + {0x20, 0x40}, + }, }; static const struct OamDimensions sOamDimensions[3][4] = @@ -1207,106 +1221,26 @@ s32 sub_8007E28(s32 a0, s32 a1, s32 a2) return a2 - ((u32)(a2 * a1) / (u32)(a0) + var1); } -#ifdef NONMATCHING -void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2) +void obj_update_pos2(struct Sprite *sprite, s32 a1, s32 a2) { s32 var0, var1, var2; - u8 matrixNum = sprite->oam.matrixNum; + + u32 matrixNum = sprite->oam.matrixNum; if (a1 != 0x800) { - var0 = sUnknown_082EC6F4[sprite->oam.size * 8 + sprite->oam.shape * 32]; + var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][0]; var1 = var0 << 8; var2 = (var0 << 16) / gOamMatrices[matrixNum].a; sprite->pos2.x = sub_8007E28(var1, var2, a1); } if (a2 != 0x800) { - var0 = sUnknown_082EC6F4[4 + (sprite->oam.size * 8 + sprite->oam.shape * 32)]; + var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][1]; var1 = var0 << 8; var2 = (var0 << 16) / gOamMatrices[matrixNum].d; sprite->pos2.y = sub_8007E28(var1, var2, a2); } } -#else -__attribute__((naked)) -void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - adds r5, r0, 0\n\ - adds r6, r1, 0\n\ - mov r8, r2\n\ - ldrb r1, [r5, 0x3]\n\ - lsls r0, r1, 26\n\ - lsrs r7, r0, 27\n\ - movs r0, 0x80\n\ - lsls r0, 4\n\ - mov r9, r0\n\ - cmp r6, r9\n\ - beq _08007EA2\n\ - ldr r2, =sUnknown_082EC6F4\n\ - lsrs r1, 6\n\ - lsls r1, 3\n\ - ldrb r0, [r5, 0x1]\n\ - lsrs r0, 6\n\ - lsls r0, 5\n\ - adds r1, r0\n\ - adds r1, r2\n\ - ldr r0, [r1]\n\ - lsls r4, r0, 8\n\ - lsls r0, 16\n\ - ldr r2, =gOamMatrices\n\ - lsls r1, r7, 3\n\ - adds r1, r2\n\ - movs r2, 0\n\ - ldrsh r1, [r1, r2]\n\ - bl __divsi3\n\ - adds r1, r0, 0\n\ - adds r0, r4, 0\n\ - adds r2, r6, 0\n\ - bl sub_8007E28\n\ - strh r0, [r5, 0x24]\n\ -_08007EA2:\n\ - cmp r8, r9\n\ - beq _08007EDA\n\ - ldr r2, =sUnknown_082EC6F4\n\ - ldrb r1, [r5, 0x3]\n\ - lsrs r1, 6\n\ - lsls r1, 3\n\ - ldrb r0, [r5, 0x1]\n\ - lsrs r0, 6\n\ - lsls r0, 5\n\ - adds r1, r0\n\ - adds r2, 0x4\n\ - adds r1, r2\n\ - ldr r0, [r1]\n\ - lsls r4, r0, 8\n\ - lsls r0, 16\n\ - ldr r2, =gOamMatrices\n\ - lsls r1, r7, 3\n\ - adds r1, r2\n\ - movs r2, 0x6\n\ - ldrsh r1, [r1, r2]\n\ - bl __divsi3\n\ - adds r1, r0, 0\n\ - adds r0, r4, 0\n\ - mov r2, r8\n\ - bl sub_8007E28\n\ - strh r0, [r5, 0x26]\n\ -_08007EDA:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - .syntax divided"); -} -#endif // NONMATCHING void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip) { diff --git a/src/start_menu.c b/src/start_menu.c index a820cd992..cdabb0a56 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -62,6 +62,11 @@ EWRAM_DATA u8 sBattlePyramidFloorWindowId = 0; EWRAM_DATA u8 sStartMenuCursorPos = 0; EWRAM_DATA u8 sNumStartMenuActions = 0; EWRAM_DATA u8 sCurrentStartMenuActions[9] = {0}; +EWRAM_DATA u8 gUnknown_02037619[2] = {0}; +EWRAM_DATA bool8 (*gUnknown_0203761C)(void) = NULL; +EWRAM_DATA u8 gUnknown_02037620 = 0; +EWRAM_DATA u8 gUnknown_02037621 = 0; +EWRAM_DATA u8 gUnknown_02037622 = 0; // const rom data static const struct WindowTemplate gSafariBallsWindowTemplate = {0, 1, 1, 9, 4, 0xF, 8}; |