diff options
Diffstat (limited to 'src/field/party_menu.c')
-rw-r--r-- | src/field/party_menu.c | 5507 |
1 files changed, 0 insertions, 5507 deletions
diff --git a/src/field/party_menu.c b/src/field/party_menu.c deleted file mode 100644 index f55ed669d..000000000 --- a/src/field/party_menu.c +++ /dev/null @@ -1,5507 +0,0 @@ -#include "global.h" -#include "party_menu.h" -#include "battle.h" -#include "battle_interface.h" -#include "battle_party_menu.h" -#include "choose_party.h" -#include "data2.h" -#include "decompress.h" -#include "event_data.h" -#include "evolution_scene.h" -#include "item.h" -#include "item_use.h" -#include "item_menu.h" -#include "constants/items.h" -#include "mail_data.h" -#include "main.h" -#include "menu.h" -#include "menu_helpers.h" -#include "constants/moves.h" -#include "palette.h" -#include "pokemon.h" -#include "pokemon_icon.h" -#include "pokemon_item_effect.h" -#include "pokemon_menu.h" -#include "pokemon_summary_screen.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "constants/songs.h" -#include "sound.h" -#include "constants/species.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "scanline_effect.h" -#include "util.h" -#include "script_pokemon_80F9.h" -#include "ewram.h" - -struct Coords8 -{ - u8 x; - u8 y; -}; - -struct PartyMenuWindowCoords -{ - u8 left; - u8 top; - u8 right; - u8 bottom; -}; - -struct PartyMonTextSettingsStruct -{ - u8 xOffset; - u8 yOffset; - const u16 *oamSettings; -}; - -struct PartyMenuHandlersStruct -{ - /*0x0*/TaskFunc menuHandler; - /*0x4*/bool8 (*menuSetup)(void); - /*0x8*/u8 initialPromptTextId; // element in PartyMenuPromptTexts -}; - -static void nullsub_12(u8 monIndex, struct Pokemon *pokemon); -static void TryPrintPartyMenuMonNickname(u8 monIndex, struct Pokemon *pokemon); -static void PartyMenuTryPrintHP(u8 monIndex, struct Pokemon *pokemon); -static void sub_806D05C(u8 taskId); -static void sub_806D15C(u8 taskId); -static void sub_806D198(u8 taskId); -static void sub_806E884(u8 taskId); -static void sub_8070D90(u8 taskId); -static void sub_806D5B8(u8 taskId); -static void sub_806D014(u8 taskId); -static void sub_806D118(u8 taskId); -static void CB2_InitPartyMenu(void); -static void ReDrawPartyMonBackgrounds(void); -static void sub_806BA94(s16 a, u16 b, u8 c, u8 d); -static void sub_806B9A4(s16 a, u16 b, u8 c); -static void sub_806CA18(u8 taskId, u8 b); -static void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed); -static void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed); -static void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed); -static void UpdateMonIconFrame_806DA0C(struct Sprite *sprite); -static void UpdateMonIconFrame_806DA38(struct Sprite *sprite); -static void UpdateMonIconFrame_806DA44(u8 taskId, u8 monIndex, u8 c); -static u8 sub_806CA00(u8 taskId); -static void SpriteCB_sub_806D37C(struct Sprite *sprite); -static u8 GetMonIconSpriteId(u8 taskId, u8 monIndex); -static void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite); -static void ItemUseMoveMenu_HandleMoveSelection(u8 taskId); -static void ItemUseMoveMenu_HandleCancel(u8 taskId); -static bool8 SetupDefaultPartyMenu(void); -static void sub_806B4A8(void); -static void VBlankCB_PartyMenu(void); -static bool8 LoadPartyMenuGraphics(u8 a); -static void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d); -static void sub_806BB9C(u8 a); -static void sub_806BBEC(u8 a); - -EWRAM_DATA u8 gUnknown_0202E8F4 = 0; -EWRAM_DATA u8 gUnknown_0202E8F5 = 0; -EWRAM_DATA u8 gUnknown_0202E8F6 = 0; -EWRAM_DATA u16 gUnknown_0202E8F8 = 0; -EWRAM_DATA u8 gPartyMenuType = 0; - -const u16 TMHMMoves[] = -{ - MOVE_FOCUS_PUNCH, - MOVE_DRAGON_CLAW, - MOVE_WATER_PULSE, - MOVE_CALM_MIND, - MOVE_ROAR, - MOVE_TOXIC, - MOVE_HAIL, - MOVE_BULK_UP, - MOVE_BULLET_SEED, - MOVE_HIDDEN_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_ICE_BEAM, - MOVE_BLIZZARD, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_GIGA_DRAIN, - MOVE_SAFEGUARD, - MOVE_FRUSTRATION, - MOVE_SOLAR_BEAM, - MOVE_IRON_TAIL, - MOVE_THUNDERBOLT, - MOVE_THUNDER, - MOVE_EARTHQUAKE, - MOVE_RETURN, - MOVE_DIG, - MOVE_PSYCHIC, - MOVE_SHADOW_BALL, - MOVE_BRICK_BREAK, - MOVE_DOUBLE_TEAM, - MOVE_REFLECT, - MOVE_SHOCK_WAVE, - MOVE_FLAMETHROWER, - MOVE_SLUDGE_BOMB, - MOVE_SANDSTORM, - MOVE_FIRE_BLAST, - MOVE_ROCK_TOMB, - MOVE_AERIAL_ACE, - MOVE_TORMENT, - MOVE_FACADE, - MOVE_SECRET_POWER, - MOVE_REST, - MOVE_ATTRACT, - MOVE_THIEF, - MOVE_STEEL_WING, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_OVERHEAT, - MOVE_CUT, - MOVE_FLY, - MOVE_SURF, - MOVE_STRENGTH, - MOVE_FLASH, - MOVE_ROCK_SMASH, - MOVE_WATERFALL, - MOVE_DIVE, -}; - -//FIXME -//const u8 *unrefTileBuffer = gTileBuffer; -asm(".4byte gTileBuffer\n"); - -static const u8 MenuGfx_HoldIcons[] = INCBIN_U8("graphics/interface/hold_icons.4bpp"); -static const u16 MenuPal_HoldIcons[] = INCBIN_U16("graphics/interface/hold_icons.gbapal"); - -static const struct SpriteSheet HeldItemsSpriteSheet = { - MenuGfx_HoldIcons, - sizeof MenuGfx_HoldIcons, - 0xd750 -}; - -static const struct SpritePalette HeldItemsPalette = { - MenuPal_HoldIcons, - 0xd750 -}; - -static const struct OamData gOamData_83765EC = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd gSpriteAnim_83765F4[] = { - ANIMCMD_FRAME(0, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83765FC[] = { - ANIMCMD_FRAME(1, 1), - ANIMCMD_END -}; - -static const union AnimCmd *const gSpriteAnimTable_8376604[] = { - gSpriteAnim_83765F4, - gSpriteAnim_83765FC, -}; - -static const struct SpriteTemplate gSpriteTemplate_837660C = { - 55120, - 55120, - &gOamData_83765EC, - gSpriteAnimTable_8376604, - NULL, - gDummySpriteAffineAnimTable, - SpriteCB_UpdateHeldItemIconPosition -}; - -// Texts that can be displayed in the bottom of the party menu. -static const u8 *const PartyMenuPromptTexts[] = { - OtherText_ChoosePoke, - OtherText_MovePokeTo, - OtherText_TeachWhat, - OtherText_UseWhat, - OtherText_GiveWhat, - OtherText_DoWhat, - OtherText_NothingToCut, - OtherText_CantSurf, - OtherText_AlreadySurfing, - OtherText_CantUseThatHere, - OtherText_RestoreWhatMove, - OtherText_BoostPP, - gOtherText_CancelWithTerminator, - OtherText_DoWhatWithItem, - OtherText_NoPokeForBattle, - OtherText_ChoosePoke2, - OtherText_NotEnoughHP, - OtherText_ThreePokeNeeded, - OtherText_PokeCantBeSame, - OtherText_NoIdenticalHoldItems, - OtherText_TeachWhichPoke, -}; - -static const struct Coords8 gUnknown_08376678[8][6] = { - {{16, 40}, {104, 18}, {104, 42}, {104, 66}, {104, 90}, {104, 114}}, // PARTY_MENU_TYPE_STANDARD - {{16, 24}, { 16, 80}, {104, 18}, {104, 50}, {104, 82}, {104, 114}}, // PARTY_MENU_TYPE_BATTLE - {{16, 24}, { 16, 80}, {104, 26}, {104, 50}, {104, 82}, {104, 106}}, // PARTY_MENU_TYPE_CONTEST - {{16, 24}, {104, 26}, {104, 50}, { 16, 80}, {104, 82}, {104, 106}}, // PARTY_MENU_TYPE_IN_GAME_TRADE - {{ 5, 4}, { 16, 1}, { 16, 4}, { 16, 7}, { 16, 10}, { 16, 13}}, // PARTY_MENU_TYPE_BATTLE_TOWER - {{ 5, 2}, { 5, 9}, { 16, 1}, { 16, 5}, { 16, 9}, { 16, 13}}, // PARTY_MENU_TYPE_LINK_MULTI_BATTLE - {{ 5, 2}, { 5, 9}, { 16, 2}, { 16, 5}, { 16, 9}, { 16, 12}}, // PARTY_MENU_TYPE_DAYCARE - {{ 5, 2}, { 16, 2}, { 16, 5}, { 5, 9}, { 16, 9}, { 16, 12}}, // PARTY_MENU_TYPE_MOVE_TUTOR -}; - -static const struct Coords8 gUnknown_08376738[12][6] = { - {{6, 5}, {17, 2}, {17, 5}, {17, 8}, {17, 11}, {17, 14}}, - {{6, 3}, { 6, 10}, {17, 2}, {17, 6}, {17, 10}, {17, 14}}, - {{6, 3}, { 6, 10}, {17, 3}, {17, 6}, {17, 10}, {17, 13}}, - {{6, 3}, {17, 3}, {17, 6}, { 6, 10}, {17, 10}, {17, 13}}, - {{3, 7}, {22, 2}, {22, 5}, {22, 8}, {22, 11}, {22, 14}}, - {{3, 5}, { 3, 12}, {22, 2}, {22, 6}, {22, 10}, {22, 14}}, - {{3, 5}, { 3, 12}, {22, 3}, {22, 6}, {22, 10}, {22, 13}}, - {{3, 5}, {22, 3}, {22, 6}, { 3, 12}, {22, 10}, {22, 13}}, - {{7, 7}, {26, 2}, {26, 5}, {26, 8}, {26, 11}, {26, 14}}, - {{7, 5}, { 7, 12}, {26, 2}, {26, 6}, {26, 10}, {26, 14}}, - {{7, 5}, { 7, 12}, {26, 3}, {26, 6}, {26, 10}, {26, 13}}, - {{7, 5}, {26, 3}, {26, 6}, { 7, 12}, {26, 10}, {26, 13}}, -}; - -static u16 *const gUnknown_08376858[4][6] = { - {(u16*)(BG_VRAM + 0xF1C8), (u16*)(BG_VRAM + 0xF0AE), (u16*)(BG_VRAM + 0xF16E), (u16*)(BG_VRAM + 0xF22E), (u16*)(BG_VRAM + 0xF2EE), (u16*)(BG_VRAM + 0xF3AE)}, // PARTY_MENU_STANDARD - {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF0AE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF3AE)}, // PARTY_MENU_LAYOUT_DOUBLE_BATTLE - {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF0EE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF36E)}, // PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE - {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF0EE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF36E)}, // PARTY_MENU_LAYOUT_MULTI_BATTLE -}; - -static const struct Coords8 gUnknown_083768B8[3][8] = { - {{8, 44}, {92, 22}, {92, 46}, {92, 70}, {92, 94}, {92, 118}, {196, 136}, {196, 152}}, // PARTY_MENU_LAYOUT_STANDARD - {{8, 28}, { 8, 84}, {92, 22}, {92, 54}, {92, 86}, {92, 118}, {196, 136}, {196, 152}}, // PARTY_MENU_LAYOUT_DOUBLE_BATTLE - {{8, 28}, { 8, 84}, {92, 30}, {92, 54}, {92, 86}, {92, 110}, {196, 136}, {196, 152}}, // PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE -}; - -static u16 *const gUnknown_08376918[2][PARTY_SIZE] = { - {(u16*)(BG_VRAM + 0xF1C6), (u16*)(BG_VRAM + 0xF06C), (u16*)(BG_VRAM + 0xF12C), (u16*)(BG_VRAM + 0xF1EC), (u16*)(BG_VRAM + 0xF2AC), (u16*)(BG_VRAM + 0xF36C)}, - {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF0AE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF3AE)}, -}; - -static const struct PartyMenuWindowCoords gUnknown_08376948[2][6] = { - {{2, 4, 10, 9}, {16, 1, 29, 3}, {16, 4, 29, 6}, {16, 7, 29, 9}, {16, 10, 29, 12}, {16, 13, 29, 15}}, - {{2, 2, 10, 7}, { 2, 9, 10, 14}, {16, 1, 29, 3}, {16, 5, 29, 7}, {16, 9, 29, 11}, {16, 13, 29, 15}}, -}; - -static const struct PartyMenuWindowCoords gUnknown_08376978[2][6] = { - {{2, 7, 10, 9}, {21, 1, 29, 3}, {21, 4, 29, 6}, {21, 7, 29, 9}, {21, 10, 29, 12}, {21, 13, 29, 15}}, - {{2, 2, 10, 7}, { 2, 9, 10, 14}, {16, 1, 29, 3}, {16, 5, 29, 7}, {16, 9, 29, 11}, {16, 13, 29, 15}}, -}; - -// This is actually a 2x6x2 array, but the code reads it as a flat array. -static const u8 gUnknown_083769A8[] = { - 0, 3, 11, 1, 11, 4, 11, 7, 11, 10, 11, 13, - 0, 1, 0, 8, 11, 1, 11, 5, 11, 9, 11, 13, // Double battle -}; - -// This is actually a 2x6x2 array, but the code reads it as a flat array. -//FIXME: sub_806B908() accesses this data via gUnknown_083769A8 (directly above this). This means these -// two arrays might be a struct, rather than separate arrays. -static const u8 gUnknown_083769C0[] = { - 0, 1, 0, 8, 11, 2, 11, 5, 11, 9, 11, 12, - 0, 1, 0, 8, 11, 2, 11, 5, 11, 9, 11, 12, // Double battle -}; - -static const u8 gUnknown_083769D8[] = { - 0x24,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x27, - 0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x37, - 0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x37, - 0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x37, - 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x47, - 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x47, - 0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57, -}; - -static const u8 gUnknown_08376A25[] = { - 0x50,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x53, - 0x60,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x63, - 0x70,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x73, -}; - -static const u8 gUnknown_08376A5E[] = { - 0x20,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x23, - 0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33, - 0x40,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x43, -}; - -static const u8 gUnusedData_08376A97[] = { - 0x0C,0x0D,0x0E,0x0F,0x00,0x01,0x02,0x03,0x04,0x05,0x0F, - 0x10,0x11,0x12,0x13,0x14,0x15,0x0F,0x06,0x05,0x01,0x07, - 0x08,0x09,0x0F,0x16,0x15,0x11,0x17,0x18,0x19,0x0F,0x09, - 0x0A,0x0B,0x05,0x0C,0x0F,0x0F,0x19,0x1A,0x1B,0x15,0x1C, - 0x0F,0x0F,0x0D,0x0B,0x05,0x0C,0x0F,0x0F,0x0F,0x1D,0x1B, - 0x15,0x1C,0x0F,0x0F,0x0F,0x06,0x05,0x0B,0x05,0x0C,0x0F, - 0x0F,0x16,0x15,0x1B,0x15,0x1C,0x0F,0x0F,0x0F,0x0F,0x20, - 0x0C,0x09,0x0F,0x0F,0x0F,0x1F,0x30,0x1C,0x19,0x0F,0x0F, - 0x0F,0x25,0x0F,0x22,0x24,0x0F,0x0F,0x0F,0x35,0x41,0x32, - 0x34,0x0F,0x0F,0x0F,0x26,0x0F,0x23,0x0E,0x0F,0x0F,0x0F, - 0x36,0x43,0x33,0x1E,0x0F,0x0F,0x27,0x28,0x29,0x03,0x2A, - 0x0F,0x0F,0x37,0x38,0x39,0x13,0x3A,0x0F,0x0F,0x27,0x28, - 0x29,0x03,0x04,0x05,0x0F,0x37,0x38,0x39,0x13,0x14,0x15, - 0x0F,0x2B,0x2C,0x02,0x28,0x29,0x2D,0x21,0x3B,0x3C,0x12, - 0x38,0x39,0x3D,0x31,0x2B,0x2C,0x02,0x28,0x29,0x08,0x09, - 0x3B,0x3C,0x12,0x38,0x39,0x18,0x19,0x2E,0x2F,0x2B,0x2C, - 0x02,0x27,0x2D,0x3E,0x3F,0x3B,0x3C,0x12,0x45,0x3D, -}; - -static const TaskFunc gUnknown_08376B54[] = { - ItemUseMoveMenu_HandleMoveSelection, - ItemUseMoveMenu_HandleCancel, -}; - -#define PartyMonOAMSettings(x, y, palette, shape, size, priority, tileOffset) \ - ((shape) << 14) | (y), \ - ((size) << 14) | (x), \ - ((palette) << 12) | ((priority) << 10) | (tileOffset) - -static const u16 PartyMonOAMSettings_LeftColumn[] = { - PartyMonOAMSettings(24, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 0), - PartyMonOAMSettings(56, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 4), - PartyMonOAMSettings(24, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 8), - PartyMonOAMSettings(56, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 12), - PartyMonOAMSettings(32, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 16), - PartyMonOAMSettings(37, 32, 15, ST_OAM_H_RECTANGLE, 1, 1, 24), - PartyMonOAMSettings(69, 32, 15, ST_OAM_H_RECTANGLE, 1, 1, 28), - 0xFFFF, -}; - -static const u16 PartyMonOAMSettings_RightColumn[] = { - PartyMonOAMSettings( 24, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 0), - PartyMonOAMSettings( 56, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 4), - PartyMonOAMSettings( 24, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 8), - PartyMonOAMSettings( 56, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 12), - PartyMonOAMSettings( 32, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 16), - PartyMonOAMSettings(101, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 24), - PartyMonOAMSettings(133, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 28), - 0xFFFF, -}; - -// Controls where and how the mons' text appears in the party menu screen (nickname, HP, and level). -static struct PartyMonTextSettingsStruct const PartyMonTextSettings[4][6] = { - { // PARTY_MENU_LAYOUT_STANDARD - { 1, 4, PartyMonOAMSettings_LeftColumn}, - {12, 1, PartyMonOAMSettings_RightColumn}, - {12, 4, PartyMonOAMSettings_RightColumn}, - {12, 7, PartyMonOAMSettings_RightColumn}, - {12, 10, PartyMonOAMSettings_RightColumn}, - {12, 13, PartyMonOAMSettings_RightColumn}, - }, - { // PARTY_MENU_LAYOUT_DOUBLE_BATTLE - { 1, 2, PartyMonOAMSettings_LeftColumn}, - { 1, 9, PartyMonOAMSettings_LeftColumn}, - {12, 1, PartyMonOAMSettings_RightColumn}, - {12, 5, PartyMonOAMSettings_RightColumn}, - {12, 9, PartyMonOAMSettings_RightColumn}, - {12, 13, PartyMonOAMSettings_RightColumn}, - }, - { // PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE - { 1, 2, PartyMonOAMSettings_LeftColumn}, - { 1, 9, PartyMonOAMSettings_LeftColumn}, - {12, 2, PartyMonOAMSettings_RightColumn}, - {12, 5, PartyMonOAMSettings_RightColumn}, - {12, 9, PartyMonOAMSettings_RightColumn}, - {12, 12, PartyMonOAMSettings_RightColumn}, - }, - { // PARTY_MENU_LAYOUT_MULTI_BATTLE - { 1, 2, PartyMonOAMSettings_LeftColumn}, - {12, 2, PartyMonOAMSettings_RightColumn}, - {12, 5, PartyMonOAMSettings_RightColumn}, - { 1, 9, PartyMonOAMSettings_LeftColumn}, - {12, 9, PartyMonOAMSettings_RightColumn}, - {12, 12, PartyMonOAMSettings_RightColumn}, - }, -}; - -static const struct PartyMenuHandlersStruct PartyMenuHandlers[] = { - {HandleDefaultPartyMenu, SetupDefaultPartyMenu, 0}, // PARTY_MENU_TYPE_STANDARD - {HandleBattlePartyMenu, SetUpBattlePartyMenu, 0}, // PARTY_MENU_TYPE_BATTLE - {HandleSelectPartyMenu, SetupContestPartyMenu, 0}, // PARTY_MENU_TYPE_CONTEST - {HandleSelectPartyMenu, SetupDefaultPartyMenu, 0}, // PARTY_MENU_TYPE_IN_GAME_TRADE - {HandleBattleTowerPartyMenu, SetupBattleTowerPartyMenu, 0}, // PARTY_MENU_TYPE_BATTLE_TOWER - {HandleLinkMultiBattlePartyMenu, SetupLinkMultiBattlePartyMenu, 0xFF}, // PARTY_MENU_TYPE_LINK_MULTI_BATTLE - {HandleDaycarePartyMenu, SetupDefaultPartyMenu, 0x0F}, // PARTY_MENU_TYPE_DAYCARE - {HandleMoveTutorPartyMenu, SetupMoveTutorPartyMenu, 0}, // PARTY_MENU_TYPE_MOVE_TUTOR -}; - -struct Unk201C000 -{ - /*0x00*/ struct Pokemon *pokemon; - /*0x04*/ u8 unk4; - /*0x05*/ u8 unk5; - /*0x06*/ u16 unk6; - /*0x08*/ u16 unk8; - /*0x0A*/ u8 pad_0A[2]; - /*0x0C*/ s32 unkC; - /*0x10*/ TaskFunc unk10; - /*0x14*/ TaskFunc unk14; -}; - -struct Unk201FE00 -{ - u8 unkE00; // not sure if this is an array or struct, or how big it is - u8 unkE01; - u8 unkE02; -}; - -extern u16 gBattleTypeFlags; -extern u8 gTileBuffer[]; -extern u8 gLastFieldPokeMenuOpened; -extern u8 gPlayerPartyCount; -extern s32 gBattleMoveDamage; -extern u16 gMoveToLearn; - -extern u16 gUnknown_08E9A300[]; -extern struct Coords8 const gUnknown_08376738[12][6]; -extern const u8 gUnknown_083769C0[]; -extern u8 gUnknown_02039460[]; -extern struct Window gUnknown_03004210; - -extern const u8 gPartyMenuMisc_Gfx[]; -extern const u8 gPartyMenuMisc_Tilemap[]; -extern const u8 gPartyMenuMisc_Pal[]; -extern const u8 gFontDefaultPalette[]; -extern const u8 gPartyMenuHpBar_Gfx[]; -extern const u8 gPartyMenuOrderText_Gfx[]; -extern const u8 gStatusGfx_Icons[]; -extern const u8 gStatusPal_Icons[]; - -#if ENGLISH -#define WINDOW_LEFT (3) -#define WINDOW_RIGHT (26) -#elif GERMAN -#define WINDOW_LEFT (0) -#define WINDOW_RIGHT (29) -#endif - -void CB2_PartyMenuMain(void) -{ - const struct PartyMonTextSettingsStruct *textSettings; - s32 i; - - AnimateSprites(); - BuildOamBuffer(); - - textSettings = PartyMonTextSettings[gPartyMenuType]; - for (i = 0; i < PARTY_SIZE; i++) - { - // Draw mon name, level, and hp sprites - DrawPartyMenuMonText( - textSettings->xOffset * 8, - textSettings->yOffset * 8, - textSettings->oamSettings, - 0, - (i << 5) | 0x200); - textSettings++; - } - - RunTasks(); - UpdatePaletteFade(); -} - -void VBlankCB_PartyMenu(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - ReDrawPartyMonBackgrounds(); -} - -void SetPartyMenuSettings(u8 menuType, u8 battleTypeFlags, TaskFunc menuHandlerFunc, u8 textId) -{ - if (battleTypeFlags != 0xFF) - { - gBattleTypeFlags = battleTypeFlags; - } - - ewram1B000.menuType = menuType; - ewram1B000.menuHandler = menuHandlerFunc; - ewram1B000.promptTextId = textId; -} - -void DoOpenPartyMenu(u8 menuType, u8 battleFlags, TaskFunc menuHandlerFunc, u8 textId) -{ - SetPartyMenuSettings(menuType, battleFlags, menuHandlerFunc, textId); - SetMainCallback2(CB2_InitPartyMenu); -} - -void OpenPartyMenu(u8 menuType, u8 battleFlags) -{ - DoOpenPartyMenu(menuType, battleFlags, PartyMenuHandlers[menuType].menuHandler, PartyMenuHandlers[menuType].initialPromptTextId); -} - -// This is a Task which is repeatedly called until it eventually returns TRUE when finished. -bool8 SetupDefaultPartyMenu(void) -{ - switch (ewram1B000_alt.setupState) - { - case 0: - if (ewram1B000_alt.monIndex < gPlayerPartyCount) { - TryCreatePartyMenuMonIcon(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex, &gPlayerParty[ewram1B000_alt.monIndex]); - ewram1B000_alt.monIndex++; - } else { - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.setupState++; - } - - break; - case 1: - LoadHeldItemIconGraphics(); - ewram1B000_alt.setupState++; - break; - case 2: - CreateHeldItemIcons_806DC34(ewram1B000_alt.menuHandlerTaskId); - ewram1B000_alt.setupState++; - break; - case 3: - if (sub_806BD58(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex) != 1) - { - ewram1B000_alt.monIndex++; - } - else - { - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.setupState++; - } - - break; - case 4: - PartyMenuPrintMonsLevelOrStatus(); - ewram1B000_alt.setupState++; - break; - case 5: - PrintPartyMenuMonNicknames(); - ewram1B000_alt.setupState++; - break; - case 6: - PartyMenuTryPrintMonsHP(); - ewram1B000_alt.setupState++; - break; - case 7: - nullsub_13(); - ewram1B000_alt.setupState++; - break; - case 8: - PartyMenuDrawHPBars(); - ewram1B000_alt.setupState++; - break; - case 9: - if (DrawPartyMonBackground(ewram1B000_alt.monIndex) == 1) - { - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.setupState = 0; - return TRUE; - } - else - { - ewram1B000_alt.monIndex++; - break; - } - } - - return FALSE; -} - -bool8 InitPartyMenu(void) -{ - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000); - DmaClear32(3, OAM, OAM_SIZE); - DmaClear16(3, PLTT, PLTT_SIZE); - - gPaletteFade.bufferTransferDisabled = 1; - gMain.state++; - break; - case 1: - ScanlineEffect_Stop(); - gMain.state++; - break; - case 2: - sub_806B4A8(); - ewram1B000_alt.setupState = 0; - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.unk268 = 0; - gMain.state++; - break; - case 3: - ResetSpriteData(); - gMain.state++; - break; - case 4: - if (ewram1B000.menuType != PARTY_MENU_TYPE_BATTLE && ewram1B000.menuType != PARTY_MENU_TYPE_LINK_MULTI_BATTLE) - { - ResetTasks(); - } - - gMain.state++; - break; - case 5: - FreeAllSpritePalettes(); - gMain.state++; - break; - case 6: - ewram1B000.menuHandlerTaskId = CreateTask(ewram1B000.menuHandler, 0); - gMain.state++; - break; - case 7: - Text_LoadWindowTemplate(&gWindowTemplate_81E6C90); - gMain.state++; - break; - case 8: - Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C90); - MultistepInitWindowTileData(&gUnknown_03004210, 1); - gMain.state++; - break; - case 9: - if (MultistepLoadFont()) - { - ewram1B000_alt.setupState = 1; - gMain.state++; - } - break; - case 10: - if (LoadPartyMenuGraphics(ewram1B000_alt.setupState) == TRUE) - { - ewram1B000_alt.setupState = 0; - gMain.state++; - } - else - { - ewram1B000_alt.setupState++; - } - break; - case 11: - sub_809D51C(); - gMain.state++; - break; - case 12: - if (PartyMenuHandlers[ewram1B000.menuType].menuSetup() == TRUE) - { - gMain.state++; - } - break; - case 13: - MultistepInitMenuWindowBegin(&gWindowTemplate_81E6CC8); - gMain.state++; - break; - case 14: - if (MultistepInitMenuWindowContinue()) - { - gMain.state++; - } - break; - case 15: - PrintPartyMenuPromptText(ewram1B000.promptTextId, 0); - gMain.state++; - break; - case 16: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - gPaletteFade.bufferTransferDisabled = 0; - gMain.state++; - break; - case 17: - SetVBlankCallback(VBlankCB_PartyMenu); - return TRUE; - } - - return FALSE; -} - -void CB2_InitPartyMenu(void) -{ - while (InitPartyMenu() != TRUE) - { - if (sub_80F9344() == TRUE) - { - return; - } - } - - if (ewram1B000.menuType != PARTY_MENU_TYPE_LINK_MULTI_BATTLE) - { - ChangePartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); - } - - SetMainCallback2(CB2_PartyMenuMain); -} - -void sub_806B4A8(void) -{ - SetHBlankCallback(NULL); - REG_DISPCNT = 8000; - REG_BG0CNT = 0x1E05; - REG_BG1CNT = 0x703; - REG_BG2CNT = 0xF08; - REG_BG3CNT = 0x602; - REG_BLDCNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG3VOFS = -1; -} - -bool8 IsLinkDoubleBattle() -{ - if ((gBattleTypeFlags & BATTLE_TYPE_LINK_DOUBLE) == BATTLE_TYPE_LINK_DOUBLE) - return TRUE; - else - return FALSE; -} - -// Draws the blue rectangular regions surrounding each of the party mons. -void ReDrawPartyMonBackgrounds(void) -{ - if (ewram1B000.unk261) - { - DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(BG_VRAM + 0x3000), 0x800); - - if (ewram1B000.unk261 == 2) - { - ewram1B000.unk261 = 0; - } - } -} - -bool8 DrawPartyMonBackground(u8 monIndex) -{ - const u8 *arr; - - if (!IsDoubleBattle()) - gPartyMenuType = PARTY_MENU_LAYOUT_STANDARD; - else if (IsLinkDoubleBattle() == TRUE) - gPartyMenuType = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; - else - gPartyMenuType = PARTY_MENU_LAYOUT_DOUBLE_BATTLE; - - arr = &gUnknown_083769A8[gPartyMenuType * 12]; - - switch (monIndex) - { - case 0: - memset(&gBGTilemapBuffers[2], 0, 0x800); - break; - case 1: - sub_806B9A4(arr[0], arr[1], 3); - sub_806BF24(&arr[0], 0, 3, 0); - break; - case 2: - if (!IsDoubleBattle()) { - if (gPlayerPartyCount > 1) { - sub_806BA94(arr[2], arr[3], 0, 3); - sub_806BF24(&arr[2], 1, 3, 0); - } else { - sub_806BA94(arr[2], arr[3], 1, 3); - } - } else if (IsLinkDoubleBattle() == TRUE) { - sub_806B9A4(arr[2], arr[3], 4); - sub_806BF24(&arr[2], 1, 4, 0); - } else { - sub_806B9A4(arr[2], arr[3], 3); - sub_806BF24(&arr[2], 1, 3, 0); - } - - break; - case 3: - if (!IsDoubleBattle()) { - if (gPlayerPartyCount > 2) { - sub_806BA94(arr[4], arr[5], 0, 3); - sub_806BF24(&arr[4], 2, 3, 0); - } else { - sub_806BA94(arr[4], arr[5], 1, 3); - } - } else if (IsLinkDoubleBattle() == TRUE) { - if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) { - sub_806BA94(arr[4], arr[5], 0, 3); - sub_806BF24(&arr[4], 2, 3, 0); - } else { - sub_806BA94(arr[4], arr[5], 1, 3); - } - } else if (gPlayerPartyCount > 2) { - sub_806BA94(arr[4], arr[5], 0, 3); - sub_806BF24(&arr[4], 2, 3, 0); - } else { - sub_806BA94(arr[4], arr[5], 1, 3); - } - - break; - case 4: - if (!IsDoubleBattle()) { - if (gPlayerPartyCount > 3) { - sub_806BA94(arr[6], arr[7], 0, 3); - sub_806BF24(&arr[6], 3, 3, 0); - } else { - sub_806BA94(arr[6], arr[7], 1, 3); - } - } else if (IsLinkDoubleBattle() == TRUE) { - if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) { - sub_806BA94(arr[6], arr[7], 0, 3); - sub_806BF24(&arr[6], 3, 3, 0); - } else { - sub_806BA94(arr[6], arr[7], 1, 3); - } - } else if (gPlayerPartyCount > 3) { - sub_806BA94(arr[6], arr[7], 0, 3); - sub_806BF24(&arr[6], 3, 3, 0); - } else { - sub_806BA94(arr[6], arr[7], 1, 3); - } - - break; - case 5: - if (!IsDoubleBattle()) { - if (gPlayerPartyCount > 4) { - sub_806BA94(arr[8], arr[9], 0, 3); - sub_806BF24(&arr[8], 4, 3, 0); - } else { - sub_806BA94(arr[8], arr[9], 1, 3); - } - } else if (IsLinkDoubleBattle() == TRUE) { - if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) { - sub_806BA94(arr[8], arr[9], 0, 4); - sub_806BF24(&arr[8], 4, 4, 0); - } else { - sub_806BA94(arr[8], arr[9], 1, 4); - } - } else if (gPlayerPartyCount > 4) { - sub_806BA94(arr[8], arr[9], 0, 3); - sub_806BF24(&arr[8], 4, 3, 0); - } else { - sub_806BA94(arr[8], arr[9], 1, 3); - } - - break; - case 6: - if (!IsDoubleBattle()) { - if (gPlayerPartyCount > 5) { - sub_806BA94(arr[10], arr[11], 0, 3); - sub_806BF24(&arr[10], 5, 3, 0); - } else { - sub_806BA94(arr[10], arr[11], 1, 3); - } - } else if (IsLinkDoubleBattle() == TRUE) { - if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) { - sub_806BA94(arr[10], arr[11], 0, 4); - sub_806BF24(&arr[10], 5, 4, 0); - } else { - sub_806BA94(arr[10], arr[11], 1, 4); - } - } else if (gPlayerPartyCount > 5) { - sub_806BA94(arr[10], arr[11], 0, 3); - sub_806BF24(&arr[10], 5, 3, 0); - } else { - sub_806BA94(arr[10], arr[11], 1, 3); - } - - break; - case 7: - if (ewram1B000.menuType == PARTY_MENU_TYPE_BATTLE_TOWER) { - sub_806BB9C(1); - } - - sub_806BBEC(1); - break; - case 8: - ewram1B000.unk261 = 2; - return TRUE; - } - - return FALSE; -} - -#ifdef NONMATCHING -void sub_806B908(void) -{ - memset(&gBGTilemapBuffers[2], 0, 0x800); - gPartyMenuType = PARTY_MENU_LAYOUT_MULTI_BATTLE; - sub_806B9A4(gUnknown_083769C0[12], gUnknown_083769C0[13], 3); - - if (GetMonData(&gPlayerParty[1], MON_DATA_SPECIES)) - sub_806BA94(gUnknown_083769C0[16], gUnknown_083769C0[17], 0, 3); - else - sub_806BA94(gUnknown_083769C0[16], gUnknown_083769C0[17], 1, 3); - - if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) - sub_806BA94(gUnknown_083769C0[18], gUnknown_083769C0[19], 0, 3); - else - sub_806BA94(gUnknown_083769C0[18], gUnknown_083769C0[19], 1, 3); - - ewram1B000.unk261 = 2; -} -#else -__attribute__((naked)) -void sub_806B908(void) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - ldr r0, _0806B948 @ =gBGTilemapBuffers + 0x1000\n\ - movs r2, 0x80\n\ - lsls r2, 4\n\ - movs r1, 0\n\ - bl memset\n\ - ldr r1, _0806B94C @ =gPartyMenuType\n\ - movs r0, 0x3\n\ - strb r0, [r1]\n\ - ldr r0, _0806B950 @ =gUnknown_083769A8\n\ - adds r4, r0, 0\n\ - adds r4, 0x24\n\ - ldr r5, _0806B954 @ =gPlayerParty + 1 * 0x64\n\ - ldrb r0, [r4]\n\ - ldrb r1, [r4, 0x1]\n\ - movs r2, 0x3\n\ - bl sub_806B9A4\n\ - adds r0, r5, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0806B958\n\ - ldrb r0, [r4, 0x4]\n\ - ldrb r1, [r4, 0x5]\n\ - movs r2, 0\n\ - movs r3, 0x3\n\ - bl sub_806BA94\n\ - b _0806B964\n\ - .align 2, 0\n\ -_0806B948: .4byte gBGTilemapBuffers + 0x1000\n\ -_0806B94C: .4byte gPartyMenuType\n\ -_0806B950: .4byte gUnknown_083769A8\n\ -_0806B954: .4byte gPlayerParty + 1 * 0x64\n\ -_0806B958:\n\ - ldrb r0, [r4, 0x4]\n\ - ldrb r1, [r4, 0x5]\n\ - movs r2, 0x1\n\ - movs r3, 0x3\n\ - bl sub_806BA94\n\ -_0806B964:\n\ - adds r0, r5, 0\n\ - adds r0, 0x64\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0806B980\n\ - ldrb r0, [r4, 0x6]\n\ - ldrb r1, [r4, 0x7]\n\ - movs r2, 0\n\ - movs r3, 0x3\n\ - bl sub_806BA94\n\ - b _0806B98C\n\ -_0806B980:\n\ - ldrb r0, [r4, 0x6]\n\ - ldrb r1, [r4, 0x7]\n\ - movs r2, 0x1\n\ - movs r3, 0x3\n\ - bl sub_806BA94\n\ -_0806B98C:\n\ - ldr r0, _0806B99C @ =gSharedMem + 0x1B000\n\ - ldr r1, _0806B9A0 @ =0x00000261\n\ - adds r0, r1\n\ - movs r1, 0x2\n\ - strb r1, [r0]\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806B99C: .4byte gSharedMem + 0x1B000\n\ -_0806B9A0: .4byte 0x00000261\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -void sub_806B9A4(s16 a, u16 b, u8 c) -{ - u8 i; - u16 var1 = b * 32; - - for (i = 0; i <= 6; i++) - { - u8 j = 0; - - if (a <= 0x1F) - { - for (; j <= 10 && a + j <= 0x1F; j++) - { - if (a + j >= 0) - { - gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = (c << 12) | gUnknown_083769D8[i * 11 + j]; - } - } - } - } -} - -void sub_806BA34(s16 a, u16 b) -{ - u8 i; - u16 var1 = b * 32; - - for (i = 0; i <= 6; i++) - { - u8 j = 0; - - if (a <= 0x1F) - { - for (; j <= 10 && a + j <= 0x1F; j++) - { - if (a + j >= 0) - { - gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = 0; - } - } - } - } -} - -void sub_806BA94(s16 a, u16 b, u8 c, u8 d) -{ - u8 i; - const u8 *arr; - u16 var1; - - arr = gUnknown_08376A5E; - if (c == 0) - { - arr = gUnknown_08376A25; - } - - var1 = b * 32; - - - for (i = 0; i < 3; i++) - { - u8 j = 0; - - if (a <= 0x1F) - { - while (j <= 0x12 && a + j <= 0x1F) - { - if (a + j >= 0) - { - gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = (d << 12) | arr[i * 19 + j]; - } - - j++; - } - } - } -} - -void sub_806BB3C(s16 a, u16 b) -{ - u8 i; - u16 var1 = (b * 32); - - for (i = 0; i < 3; i++) - { - u8 j = 0; - - if (a <= 0x1F) - { - for (; j <= 0x12 && a + j <= 0x1F; j++) - { - if (a + j >= 0) - { - gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = 0; - } - } - } - } -} - -void sub_806BB9C(u8 a) -{ - u8 i; - u16 arr[12] = { - 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - }; - u16 *vramPtr = (u16 *)(BG_VRAM + 0x3C30); - for (i = 0; i < PARTY_SIZE; i++) - { - vramPtr[i] = arr[i] + (a << 12); - vramPtr[i + 0x20] = arr[i + PARTY_SIZE] + (a << 12); - } -} - -void sub_806BBEC(u8 a) -{ - u8 i; - u16 arr[12] = { - 0x2A, 0x0B, 0x0C, 0x0D, 0x0E, 0x2F, - 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, - }; - u16 *vramPtr = (u16 *)(BG_VRAM + 0x3CB0); - for (i = 0; i < PARTY_SIZE; i++) - { - vramPtr[i] = arr[i] + (a << 12); - vramPtr[i + 0x20] = arr[i + PARTY_SIZE] + (a << 12); - } -} - -void sub_806BC3C(u8 monIndex, u8 b) -{ - u16 *vramPtr = gUnknown_08376918[IsDoubleBattle()][monIndex]; - u8 i; - u16 var1; - - for (i = 0, var1 = (b / 7) * 32; i <= PARTY_SIZE; i++) - { - u32 offset = i + var1; - vramPtr[i] = gUnknown_08E9A300[offset] + 0x10C; - vramPtr[i + 0x20] = gUnknown_08E9A300[offset + 0x20] + 0x10C; - } - - // Some dead code was likely optimized out, but the compiler still think r8 was used. - asm("":::"r8"); -} - -void unref_sub_806BCB8(u8 a) -{ - u8 i; - - for (i = 0; i < gPlayerPartyCount; i++) - { - sub_806BC3C(i, a); - } -} - -// This is ultimately unreferenced, since it's caller is unreferenced. -void sub_806BCE8() -{ - u8 i; - - for (i = 0; i < gPlayerPartyCount; i++) - { - if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) - { - u8 gender = GetMonGender(&gPlayerParty[i]); - switch (gender) - { - case MON_MALE: - sub_806BC3C(i, 0x54); - break; - case MON_FEMALE: - sub_806BC3C(i, 0x62); - break; - default: - sub_806BC3C(i, 0x46); - break; - } - } - else - { - sub_806BC3C(i, 0x46); - } - } -} - -u8 sub_806BD58(u8 taskId, u8 b) -{ - u8 spriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); - sub_806CA18(taskId, spriteId); - return 1; -} - -#ifdef NONMATCHING -u16 HandleDefaultPartyMenuInput(u8 taskId) -{ - s8 menuDirectionPressed = 0x0; - - switch (gMain.newAndRepeatedKeys) - { - case DPAD_UP: - menuDirectionPressed = -1; - break; - case DPAD_DOWN: - menuDirectionPressed = 1; - break; - case DPAD_LEFT: - menuDirectionPressed = -2; - break; - case DPAD_RIGHT: - menuDirectionPressed = 2; - break; - } - - if (menuDirectionPressed == 0) - { - u8 var1 = sub_80F92BC(); - switch (var1) - { - case 1: - menuDirectionPressed = -1; - break; - case 2: - menuDirectionPressed = 1; - break; - } - - if (menuDirectionPressed == 0) - { - if ((gMain.newKeys & A_BUTTON) && gSprites[sub_806CA00(taskId)].data[0] == 7) - { - // Selected "CANCEL" - return B_BUTTON; - } - else - { - return gMain.newKeys & (A_BUTTON | B_BUTTON); - } - } - } - - ChangePartyMenuSelection(taskId, menuDirectionPressed); - return gMain.newAndRepeatedKeys; -} -#else -__attribute__((naked)) -u16 HandleDefaultPartyMenuInput(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - movs r4, 0\n\ - ldr r0, _0806BD9C @ =gMain\n\ - ldrh r0, [r0, 0x30]\n\ - cmp r0, 0x20\n\ - beq _0806BDB2\n\ - cmp r0, 0x20\n\ - bgt _0806BDA0\n\ - cmp r0, 0x10\n\ - beq _0806BDB6\n\ - b _0806BDB8\n\ - .align 2, 0\n\ -_0806BD9C: .4byte gMain\n\ -_0806BDA0:\n\ - cmp r0, 0x40\n\ - beq _0806BDAA\n\ - cmp r0, 0x80\n\ - beq _0806BDAE\n\ - b _0806BDB8\n\ -_0806BDAA:\n\ - movs r4, 0xFF\n\ - b _0806BDB8\n\ -_0806BDAE:\n\ - movs r4, 0x1\n\ - b _0806BDB8\n\ -_0806BDB2:\n\ - movs r4, 0xFE\n\ - b _0806BDB8\n\ -_0806BDB6:\n\ - movs r4, 0x2\n\ -_0806BDB8:\n\ - lsls r0, r4, 24\n\ - cmp r0, 0\n\ - bne _0806BDDC\n\ - bl sub_80F92BC\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - beq _0806BDD0\n\ - cmp r0, 0x2\n\ - beq _0806BDD4\n\ - b _0806BDD6\n\ -_0806BDD0:\n\ - movs r4, 0xFF\n\ - b _0806BDD6\n\ -_0806BDD4:\n\ - movs r4, 0x1\n\ -_0806BDD6:\n\ - lsls r0, r4, 24\n\ - cmp r0, 0\n\ - beq _0806BDF0\n\ -_0806BDDC:\n\ - asrs r1, r0, 24\n\ - adds r0, r5, 0\n\ - bl ChangePartyMenuSelection\n\ - ldr r0, _0806BDEC @ =gMain\n\ - ldrh r0, [r0, 0x30]\n\ - b _0806BE2C\n\ - .align 2, 0\n\ -_0806BDEC: .4byte gMain\n\ -_0806BDF0:\n\ - ldr r0, _0806BE1C @ =gMain\n\ - ldrh r1, [r0, 0x2E]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0806BE24\n\ - ldr r4, _0806BE20 @ =gSprites\n\ - adds r0, r5, 0\n\ - bl sub_806CA00\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, r0, 4\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4\n\ - movs r2, 0x2E\n\ - ldrsh r0, [r1, r2]\n\ - cmp r0, 0x7\n\ - bne _0806BE24\n\ - movs r0, 0x2\n\ - b _0806BE2C\n\ - .align 2, 0\n\ -_0806BE1C: .4byte gMain\n\ -_0806BE20: .4byte gSprites\n\ -_0806BE24:\n\ - ldr r0, _0806BE34 @ =gMain\n\ - ldrh r1, [r0, 0x2E]\n\ - movs r0, 0x3\n\ - ands r0, r1\n\ -_0806BE2C:\n\ - pop {r4,r5}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_0806BE34: .4byte gMain\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -u16 HandleBattleTowerPartyMenuInput(u8 taskId) -{ - u8 menuDirectionPressed = 0x0; - - switch (gMain.newAndRepeatedKeys) - { - case DPAD_UP: - menuDirectionPressed = 0xFF; - break; - case DPAD_DOWN: - menuDirectionPressed = 0x1; - break; - case DPAD_LEFT: - menuDirectionPressed = 0xFE; - break; - case DPAD_RIGHT: - menuDirectionPressed = 0x2; - break; - } - - if (menuDirectionPressed == 0) - { - u8 var1 = sub_80F92BC(); - switch (var1) - { - case 1: - menuDirectionPressed = 0xFF; - break; - case 2: - menuDirectionPressed = 0x1; - break; - } - } - - if (gMain.newKeys & START_BUTTON) - { - SelectBattleTowerOKButton(taskId); - return START_BUTTON; - } - else - { - s8 signedMenuDirection = menuDirectionPressed; - if (signedMenuDirection) - { - ChangeBattleTowerPartyMenuSelection(taskId, signedMenuDirection); - return gMain.newAndRepeatedKeys; - } - else - { - if (gMain.newKeys & A_BUTTON) - { - if (gSprites[sub_806CA00(taskId)].data[0] == 7) - { - return B_BUTTON; - } - } - } - } - - return gMain.newKeys & (A_BUTTON | B_BUTTON); -} - -void task_pc_turn_off(const u8 *a, u8 b) -{ - if (a[0]) - sub_806BA94(a[0], a[1], 0, b); - else - sub_806B9A4(a[0], a[1], b); -} - -void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d) -{ - if (GetMonData(&gPlayerParty[monIndex], MON_DATA_SPECIES) && GetMonData(&gPlayerParty[monIndex], MON_DATA_HP) == 0) - c = PARTY_SIZE - 1; - - if (d == 1) - c += 4; - - task_pc_turn_off(a, c); -} - -void ChangePartyMenuSelection(u8 taskId, s8 directionPressed) -{ - bool8 isLinkDoubleBattle; - u8 spriteId = sub_806CA00(taskId); - u8 menuIndex = gSprites[spriteId].data[0]; - - UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); - - isLinkDoubleBattle = IsLinkDoubleBattle(); - if (isLinkDoubleBattle == 1) - { - if (menuIndex == 0 || menuIndex == 2 || menuIndex == 3) - sub_806BF24(&gUnknown_083769C0[menuIndex * 2], menuIndex, 3, 0); - if (menuIndex == 1 || menuIndex == 4 || menuIndex == 5) - sub_806BF24(&gUnknown_083769C0[menuIndex * 2], menuIndex, 4, 0); - if (menuIndex == 7) - sub_806BBEC(1); - - ChangeLinkDoubleBattlePartyMenuSelection(spriteId, menuIndex, directionPressed); - - if (gSprites[spriteId].data[0] == 0 || gSprites[spriteId].data[0] == 2 || gSprites[spriteId].data[0] == 3) - sub_806BF24(&gUnknown_083769C0[gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 3, 1); - if (gSprites[spriteId].data[0] == 1 || gSprites[spriteId].data[0] == 4 || gSprites[spriteId].data[0] == 5) - sub_806BF24(&gUnknown_083769C0[gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 4, 1); - if (gSprites[spriteId].data[0] == 7) - sub_806BBEC(2); - - ewram1B000.unk261 = 2; - - gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE][gSprites[spriteId].data[0]].x; - gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE][gSprites[spriteId].data[0]].y; - } - else - { - u8 isDoubleBattle = IsDoubleBattle(); - - if (menuIndex < PARTY_SIZE) - { - sub_806BF24(&gUnknown_083769A8[isDoubleBattle * 12 + menuIndex * 2], menuIndex, 3, 0); - } - else - { - sub_806BBEC(1); - } - - if (!isDoubleBattle) - { - ChangeDefaultPartyMenuSelection(spriteId, menuIndex, directionPressed); - } - else - { - ChangeDoubleBattlePartyMenuSelection(spriteId, menuIndex, directionPressed); - } - - if (gSprites[spriteId].data[0] < PARTY_SIZE) - { - sub_806BF24(&gUnknown_083769A8[isDoubleBattle * 12 + gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 3, 1); - } - else - { - sub_806BBEC(2); - } - - ewram1B000.unk261 = 2; - - gSprites[spriteId].pos1.x = gUnknown_083768B8[isDoubleBattle][gSprites[spriteId].data[0]].x; - gSprites[spriteId].pos1.y = gUnknown_083768B8[isDoubleBattle][gSprites[spriteId].data[0]].y; - } - - UpdateMonIconFrame_806DA44(taskId, gSprites[spriteId].data[0], 1); - - if (menuIndex != gSprites[spriteId].data[0]) - { - PlaySE(5); - } -} - -void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) -{ - u8 nextIndex; - s8 menuMovement = directionPressed + 2; - - switch (menuMovement) - { - case 2: // no movement - gSprites[spriteId].data[1] = 0; - break; - case 1: // moving up - if (menuIndex == 0) { - gSprites[spriteId].data[0] = 7; - } else if (menuIndex == 7) { - gSprites[spriteId].data[0] = gPlayerPartyCount - 1; - } else { - s8 diff = directionPressed; - gSprites[spriteId].data[0] += diff; - } - - gSprites[spriteId].data[1] = 0; - break; - case 3: // moving down - if (menuIndex == gPlayerPartyCount - 1) { - gSprites[spriteId].data[0] = 7; - } else if (menuIndex == 7) { - gSprites[spriteId].data[0] = 0; - } else { - s8 diff = directionPressed; - gSprites[spriteId].data[0] += diff; - } - - gSprites[spriteId].data[1] = 0; - break; - case 4: // moving right - if (gPlayerPartyCount > 1 && menuIndex == 0) - { - if (gSprites[spriteId].data[1] == 0) - gSprites[spriteId].data[1] = 1; - - gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; - } - break; - case 0: // moving left - // Only move the selection to the left side if one of the mons in the right-hand column are currently selected - nextIndex = menuIndex - 1; - if (nextIndex <= 4) { - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = menuIndex; - } - break; - } -} - -void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) -{ - u8 var1; - s8 menuMovement = directionPressed + 2; - - switch(menuMovement) - { - case 2: // no movement - gSprites[spriteId].data[1] = 0; - break; - case 3: // moving down - if (menuIndex == 7) { - gSprites[spriteId].data[0] = 0; - } else if (menuIndex == gPlayerPartyCount - 1) { - gSprites[spriteId].data[0] = 7; - } else { - s8 diff = directionPressed; - gSprites[spriteId].data[0] += diff; - } - - gSprites[spriteId].data[1] = 0; - break; - case 1: // moving up - if (menuIndex == 0) { - gSprites[spriteId].data[0] = 7; - } else if (menuIndex == 7) { - gSprites[spriteId].data[0] = gPlayerPartyCount - 1; - } else { - s8 diff = directionPressed; - gSprites[spriteId].data[0] += diff; - } - - gSprites[spriteId].data[1] = 0; - break; - case 4: // moving right - if (menuIndex == 0) { - if (gPlayerPartyCount > 2) { - u16 var1 = gSprites[spriteId].data[1] - 2; - if (var1 > 1) - gSprites[spriteId].data[0] = 2; - else - gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; - } - } - else if (menuIndex == 1) { - if (gPlayerPartyCount > 4) { - u16 var1 = gSprites[spriteId].data[1] - 4; - if (var1 <= 1) - gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; - else - gSprites[spriteId].data[0] = 4; - } - } - break; - case 0: // moving left - var1 = menuIndex - 2; - if (var1 <= 1) { - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = menuIndex; - } else { - u8 var2 = menuIndex - 4; - if (var2 <= 1) { - gSprites[spriteId].data[0] = 1; - gSprites[spriteId].data[1] = menuIndex; - } - } - break; - } -} - -#ifdef NONMATCHING -void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) -{ - s8 menuMovement; - u16 var1; - u8 var2; - - menuMovement = directionPressed + 2; - switch (menuMovement) - { - case 2: // no movement - gSprites[spriteId].data[1] = 0; - break; - case 3: // moving down - if (menuIndex == 7) { - gSprites[spriteId].data[0] = 0; - } else { - while (menuIndex != PARTY_SIZE - 1) { - menuIndex++; - if (GetMonData(&gPlayerParty[menuIndex], MON_DATA_SPECIES)) - { - gSprites[spriteId].data[0] = menuIndex; - gSprites[spriteId].data[1] = 0; - return; - } - } - - gSprites[spriteId].data[0] = 7; - } - - gSprites[spriteId].data[1] = 0; - break; - case 1: // moving up - while (menuIndex != 0) { - menuIndex--; - if (menuIndex != PARTY_SIZE && GetMonData(gPlayerParty[menuIndex], MON_DATA_SPECIES)) - { - gSprites[spriteId].data[0] = menuIndex; - gSprites[spriteId].data[1] = 0; - return; - } - } - - gSprites[spriteId].data[0] = 7; - gSprites[spriteId].data[1] = 0; - break; - case 4: // moving right - if (menuIndex == 0) { - var1 = gSprites[spriteId].data[1] - 2; - if (var1 > 1) { - if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) { - gSprites[spriteId].data[0] = 2; - } else if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) { - gSprites[spriteId].data[0] = 3; - } - } else { - gSprites[spriteId].data[0] = 1; - } - } else if (menuIndex == 1) { - var1 = gSprites[spriteId].data[1] - 4; - if (var1 <= 1) { - gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; - } else { - if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) { - gSprites[spriteId].data[0] = 4; - } else if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) { - gSprites[spriteId].data[0] = 5; - } - } - } - break; - case 0: // moving left - var2 = menuIndex - 2; - if (var2 <= 1) { - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = menuIndex; - } else { - var2 = menuIndex - 4; - if (var2 <= 1) { - gSprites[spriteId].data[0] = 1; - gSprites[spriteId].data[1] = menuIndex; - } - } - - break; - } -} - -#else -__attribute__((naked)) -void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - lsls r1, 24\n\ - lsrs r4, r1, 24\n\ - lsls r2, 24\n\ - movs r0, 0x80\n\ - lsls r0, 18\n\ - adds r2, r0\n\ - asrs r0, r2, 24\n\ - cmp r0, 0x4\n\ - bls _0806C4AA\n\ - b _0806C64E\n\ -_0806C4AA:\n\ - lsls r0, 2\n\ - ldr r1, _0806C4B4 @ =_0806C4B8\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0806C4B4: .4byte _0806C4B8\n\ - .align 2, 0\n\ -_0806C4B8:\n\ - .4byte _0806C618\n\ - .4byte _0806C524\n\ - .4byte _0806C4CC\n\ - .4byte _0806C4E0\n\ - .4byte _0806C57C\n\ -_0806C4CC:\n\ - ldr r0, _0806C4DC @ =gSprites\n\ - lsls r1, r5, 4\n\ - adds r1, r5\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - movs r0, 0\n\ - strh r0, [r1, 0x30]\n\ - b _0806C64E\n\ - .align 2, 0\n\ -_0806C4DC: .4byte gSprites\n\ -_0806C4E0:\n\ - cmp r4, 0x7\n\ - bne _0806C4FC\n\ - ldr r2, _0806C4F8 @ =gSprites\n\ - lsls r3, r5, 4\n\ - adds r0, r3, r5\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - movs r1, 0\n\ - strh r1, [r0, 0x2E]\n\ - adds r1, r2, 0\n\ - adds r6, r3, 0\n\ - b _0806C566\n\ - .align 2, 0\n\ -_0806C4F8: .4byte gSprites\n\ -_0806C4FC:\n\ - lsls r6, r5, 4\n\ - b _0806C518\n\ -_0806C500:\n\ - adds r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - movs r0, 0x64\n\ - muls r0, r4\n\ - ldr r1, _0806C520 @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _0806C528\n\ -_0806C518:\n\ - cmp r4, 0x5\n\ - bne _0806C500\n\ - b _0806C558\n\ - .align 2, 0\n\ -_0806C520: .4byte gPlayerParty\n\ -_0806C524:\n\ - lsls r6, r5, 4\n\ - b _0806C554\n\ -_0806C528:\n\ - ldr r1, _0806C534 @ =gSprites\n\ - adds r0, r6, r5\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - strh r4, [r0, 0x2E]\n\ - b _0806C566\n\ - .align 2, 0\n\ -_0806C534: .4byte gSprites\n\ -_0806C538:\n\ - subs r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0x6\n\ - beq _0806C554\n\ - movs r0, 0x64\n\ - muls r0, r4\n\ - ldr r1, _0806C574 @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _0806C528\n\ -_0806C554:\n\ - cmp r4, 0\n\ - bne _0806C538\n\ -_0806C558:\n\ - ldr r0, _0806C578 @ =gSprites\n\ - adds r1, r6, r5\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - movs r2, 0x7\n\ - strh r2, [r1, 0x2E]\n\ - adds r1, r0, 0\n\ -_0806C566:\n\ - adds r0, r6, r5\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - movs r1, 0\n\ - strh r1, [r0, 0x30]\n\ - b _0806C64E\n\ - .align 2, 0\n\ -_0806C574: .4byte gPlayerParty\n\ -_0806C578: .4byte gSprites\n\ -_0806C57C:\n\ - cmp r4, 0\n\ - bne _0806C5C8\n\ - ldr r0, _0806C5AC @ =gSprites\n\ - lsls r1, r5, 4\n\ - adds r1, r5\n\ - lsls r1, 2\n\ - adds r4, r1, r0\n\ - ldrh r1, [r4, 0x30]\n\ - subs r0, r1, 0x2\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x1\n\ - bls _0806C5E2\n\ - ldr r5, _0806C5B0 @ =gPlayerParty + 2 * 0x64\n\ - adds r0, r5, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0806C5B4\n\ - movs r0, 0x2\n\ - strh r0, [r4, 0x2E]\n\ - b _0806C64E\n\ - .align 2, 0\n\ -_0806C5AC: .4byte gSprites\n\ -_0806C5B0: .4byte gPlayerParty + 2 * 0x64\n\ -_0806C5B4:\n\ - adds r0, r5, 0\n\ - adds r0, 0x64\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0806C64E\n\ - movs r0, 0x3\n\ - strh r0, [r4, 0x2E]\n\ - b _0806C64E\n\ -_0806C5C8:\n\ - cmp r4, 0x1\n\ - bne _0806C64E\n\ - ldr r0, _0806C5E8 @ =gSprites\n\ - lsls r1, r5, 4\n\ - adds r1, r5\n\ - lsls r1, 2\n\ - adds r4, r1, r0\n\ - ldrh r1, [r4, 0x30]\n\ - subs r0, r1, 0x4\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x1\n\ - bhi _0806C5EC\n\ -_0806C5E2:\n\ - strh r1, [r4, 0x2E]\n\ - b _0806C64E\n\ - .align 2, 0\n\ -_0806C5E8: .4byte gSprites\n\ -_0806C5EC:\n\ - ldr r5, _0806C600 @ =gPlayerParty + 4 * 0x64\n\ - adds r0, r5, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0806C604\n\ - movs r0, 0x4\n\ - strh r0, [r4, 0x2E]\n\ - b _0806C64E\n\ - .align 2, 0\n\ -_0806C600: .4byte gPlayerParty + 4 * 0x64\n\ -_0806C604:\n\ - adds r0, r5, 0\n\ - adds r0, 0x64\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0806C64E\n\ - movs r0, 0x5\n\ - strh r0, [r4, 0x2E]\n\ - b _0806C64E\n\ -_0806C618:\n\ - subs r0, r4, 0x2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bhi _0806C634\n\ - ldr r0, _0806C630 @ =gSprites\n\ - lsls r1, r5, 4\n\ - adds r1, r5\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - movs r0, 0\n\ - b _0806C64A\n\ - .align 2, 0\n\ -_0806C630: .4byte gSprites\n\ -_0806C634:\n\ - subs r0, r4, 0x4\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bhi _0806C64E\n\ - ldr r0, _0806C654 @ =gSprites\n\ - lsls r1, r5, 4\n\ - adds r1, r5\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - movs r0, 0x1\n\ -_0806C64A:\n\ - strh r0, [r1, 0x2E]\n\ - strh r4, [r1, 0x30]\n\ -_0806C64E:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806C654: .4byte gSprites\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -void ChangeBattleTowerPartyMenuSelection(u8 taskId, s8 directionPressed) -{ - u16 newMenuIndex; - u8 newMenuIndex2; - u8 newMenuIndex3; - s8 menuMovement; - u8 spriteId = sub_806CA00(taskId); - u8 menuIndex = gSprites[spriteId].data[0]; - - UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); - - if (menuIndex < PARTY_SIZE) - { - sub_806BF24(&gUnknown_083769A8[menuIndex * 2], menuIndex, 3, 0); - } - else if (menuIndex == PARTY_SIZE) - { - sub_806BB9C(1); - } - else - { - sub_806BBEC(1); - } - - menuMovement = directionPressed + 2; - - switch (menuMovement) - { - case 2: // no movement - gSprites[spriteId].data[1] = 0; - break; - case 1: // moving up - if (menuIndex == 0) { - gSprites[spriteId].data[0] = 7; - } else if (menuIndex == PARTY_SIZE) { - gSprites[spriteId].data[0] = gPlayerPartyCount - 1; - } else { - gSprites[spriteId].data[0] += directionPressed; - } - - gSprites[spriteId].data[1] = 0; - break; - case 3: // moving down - if (menuIndex == gPlayerPartyCount - 1) { - gSprites[spriteId].data[0] = 6; - } else if (menuIndex == 7) { - gSprites[spriteId].data[0] = 0; - } else { - gSprites[spriteId].data[0] += directionPressed; - } - - gSprites[spriteId].data[1] = 0; - break; - case 4: // moving right - if (gPlayerPartyCount > 1 && menuIndex == 0) - { - if (gSprites[spriteId].data[1] == 0) { - gSprites[spriteId].data[1] = 1; - } - - gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; - } - break; - case 0: // moving left - newMenuIndex3 = menuIndex - 1; - if (newMenuIndex3 <= 4) - { - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = menuIndex; - } - break; - } - - gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][gSprites[spriteId].data[0]].x; - gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][gSprites[spriteId].data[0]].y; - - - newMenuIndex = gSprites[spriteId].data[0]; - if (gSprites[spriteId].data[0] < PARTY_SIZE) - { - sub_806BF24(&gUnknown_083769A8[gSprites[spriteId].data[0] * 2], newMenuIndex, 3, 1); - } - else if (gSprites[spriteId].data[0] == PARTY_SIZE) - { - sub_806BB9C(2); - } - else - { - sub_806BBEC(2); - } - - ewram1B000.unk261 = 2; - - newMenuIndex2 = gSprites[spriteId].data[0]; - UpdateMonIconFrame_806DA44(taskId, newMenuIndex2, 1); - - if (menuIndex != gSprites[spriteId].data[0]) - { - PlaySE(5); - } -} - -// Selects the "OK" button in the Battle Tower party menu. -void SelectBattleTowerOKButton(u8 taskId) -{ - u8 spriteId = sub_806CA00(taskId); - - u8 menuIndex = gSprites[spriteId].data[0]; - if (menuIndex != 6) - { - UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); - - if (menuIndex < PARTY_SIZE) - { - sub_806BF24(&gUnknown_083769A8[menuIndex * 2], menuIndex, 3, 0); - } - else - { - sub_806BBEC(1); - } - - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].data[0] = 6; - gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][6].x; - gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][6].y; - - sub_806BB9C(2); - - ewram1B000.unk261 = 2; - PlaySE(5); - } -} - -void sub_806C92C(u8 spriteId) -{ - u8 menuIndex1 = gSprites[spriteId].data[0]; - u8 menuIndex2 = gSprites[spriteId].data[1]; - - if (!IsDoubleBattle()) - { - if (menuIndex1 < 1) { - if (menuIndex2 < 1) { - menuIndex2 = 1; - } - } else { - if (menuIndex2 >= 1) { - menuIndex2 = 0; - } - } - } else { - if (menuIndex1 < 2) { - if (menuIndex2 < 2) { - menuIndex2 = 2; - } - } else { - if (menuIndex2 >= 2) { - menuIndex2 = 0; - } - } - } - - gSprites[spriteId].data[1] = menuIndex2; -} - -void sub_806C994(u8 taskId, u8 b) -{ - u8 spriteId = sub_806CA00(taskId); - - gSprites[spriteId].data[0] = b; - sub_806C92C(spriteId); -} - -void sub_806C9C4(u8 taskId, u8 spriteId) -{ - u8 spriteId2 = sub_806CA00(taskId); - - gSprites[spriteId].pos1.x = gSprites[spriteId2].pos1.x; - gSprites[spriteId].pos1.y = gSprites[spriteId2].pos1.y; - gSprites[spriteId].data[0] = gSprites[spriteId2].data[0]; -} - -u8 sub_806CA00(u8 taskId) -{ - return gTasks[taskId].data[3] >> 8; -} - -void sub_806CA18(u8 taskId, u8 b) -{ - u8 var1 = gTasks[taskId].data[3]; - gTasks[taskId].data[3] = var1 | (b << 8); -} - -u8 sub_806CA38(u8 taskId) -{ - u8 spriteId = sub_806CA00(taskId); - return gSprites[spriteId].data[0]; -} - -void SetupDefaultPartyMenuSwitchPokemon(u8 taskId) -{ - gTasks[taskId].func = TaskDummy; - ewram01000.unk0 = taskId; - - CreateTask(HandlePartyMenuSwitchPokemonInput, 0); - ewram01000.unk1 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); - - sub_806C9C4(taskId, ewram01000.unk1); - ewram01000.unk2 = sub_806CA00(taskId); - - PrintPartyMenuPromptText(ewram1B000_alt.unk272, 0); - - sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk1].data[0] * 2], gSprites[ewram01000.unk1].data[0], 6, 0); - ewram1B000.unk261 = 2; -} - -// Handles changing the the current mon selection when choosing mons to swap places. -void ChangePartyMenuSwitchPokemonSelection(u8 taskId, s16 menuDirectionPressed) -{ - struct Sprite *sprite1 = &gSprites[ewram01000.unk1]; - struct Sprite *sprite2 = &gSprites[ewram01000.unk2]; - - ChangePartyMenuSelection(taskId, menuDirectionPressed); - - if (sprite1->data[0] != sprite2->data[0]) - { - sub_806BF24(&gUnknown_083769A8[sprite1->data[0] * 2], sprite1->data[0], 6, 1); - } - else - { - sub_806BF24(&gUnknown_083769A8[sprite1->data[0] * 2], sprite1->data[0], 6, 0); - } -} - -void HandlePartyMenuSwitchPokemonInput(u8 taskId) -{ - switch (gMain.newAndRepeatedKeys) - { - case DPAD_UP: - ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, -1); - break; - case DPAD_DOWN: - ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, 1); - break; - case DPAD_LEFT: - ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, -2); - break; - case DPAD_RIGHT: - ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, 2); - break; - } - - if (gMain.newKeys & A_BUTTON) - { - PlaySE(5); - gTasks[taskId].func = ewram01000.unkC; - gTasks[taskId].func(taskId); - } - else if (gMain.newKeys == B_BUTTON) - { - PlaySE(5); - sub_806CD44(taskId); - } -} - -void sub_806CC2C(u8 taskId) -{ - DestroySprite(&gSprites[ewram01000.unk1]); - PrintPartyMenuPromptText(0, 0); - - ewram1B000.unk261 = 2; - SwitchTaskToFollowupFunc(ewram01000.unk0); - DestroyTask(taskId); -} - -void sub_806CC74(u8 taskId) -{ - sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk2].data[0] * 2], gSprites[ewram01000.unk2].data[0], 3, 1); - sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk1].data[0] * 2], gSprites[ewram01000.unk1].data[0], 3, 0); - sub_806CC2C(taskId); -} - -void sub_806CCE4() -{ - u8 monIndex1 = gSprites[ewram01000.unk1].data[0]; - u8 monIndex2 = gSprites[ewram01000.unk2].data[0]; - - if (monIndex1 <= 5) - { - sub_806BF24(&gUnknown_083769A8[monIndex1 * 2], monIndex1, 3, 0); - } - - if (monIndex2 <= 5) - { - sub_806BF24(&gUnknown_083769A8[monIndex2 * 2], monIndex2, 3, 1); - } -} - -void sub_806CD44(u8 taskId) -{ - sub_806CCE4(); - sub_806CC2C(taskId); -} - -void sub_806CD5C(u8 taskId) -{ - u8 monIndex1 = gSprites[ewram01000.unk1].data[0]; - u8 monIndex2 = gSprites[ewram01000.unk2].data[0]; - - if (monIndex1 == monIndex2 || monIndex1 == 7 || monIndex2 == 7) - { - sub_806CD44(taskId); - } - else - { - u8 var1; - - sub_806D5B8(monIndex1); - sub_806D5B8(monIndex2); - - if (monIndex1 > monIndex2) - { - ewram01000.unk5 = monIndex2; - ewram01000.unk6 = monIndex1; - } - else - { - ewram01000.unk5 = monIndex1; - ewram01000.unk6 = monIndex2; - } - - ewram01000.unk3 = GetMonIconSpriteId(ewram01000.unk0, ewram01000.unk5); - ewram01000.unk4 = GetMonIconSpriteId(ewram01000.unk0, ewram01000.unk6); - - var1 = ewram01000.unk5; - if (!var1) - { - gSprites[ewram01000.unk3].data[0] = -8; - gSprites[ewram01000.unk3].data[2] = -0xA8; - ewram01000.unk8 = var1; - ewram01000.unkA = 11; - - gTasks[taskId].func = sub_806D014; - ewram1B000.unk261 = 1; - } - else - { - gSprites[ewram01000.unk3].data[0] = 8; - gSprites[ewram01000.unk3].data[2] = 0xA8; - ewram01000.unk8 = 11; - ewram01000.unkA = 11; - - gTasks[taskId].func = sub_806D118; - ewram1B000.unk261 = 1; - } - - gSprites[ewram01000.unk3].callback = SpriteCB_sub_806D37C; - - gSprites[ewram01000.unk4].data[0] = 8; - gSprites[ewram01000.unk4].data[2] = 0xA8; - gSprites[ewram01000.unk4].callback = SpriteCB_sub_806D37C; - - gSprites[ewram01000.unk3].callback(&gSprites[ewram01000.unk3]); - gSprites[ewram01000.unk4].callback(&gSprites[ewram01000.unk4]); - } -} - -void SwapValues_s16(s16 *a, s16 *b) -{ - s16 temp = *a; - *a = *b; - *b = temp; -} - -#ifdef NONMATCHING -void sub_806CF04(void) -{ - SwapValues_s16(&gSprites[ewram01000.unk3].pos1.x, &gSprites[ewram01000.unk4].pos1.x); - SwapValues_s16(&gSprites[ewram01000.unk3].pos1.y, &gSprites[ewram01000.unk4].pos1.y); - SwapValues_s16(&gSprites[ewram01000.unk3].pos2.x, &gSprites[ewram01000.unk4].pos2.x); - SwapValues_s16(&gSprites[ewram01000.unk3].data[0], &gSprites[ewram01000.unk4].data[0]); - - gSprites[ewram01000.unk3].callback = SpriteCB_sub_806D37C; - gSprites[ewram01000.unk4].callback = SpriteCB_sub_806D37C; -} -#else -__attribute__((naked)) -void sub_806CF04(void) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - ldr r4, _0806CF94 @ =gSharedMem + 0x1000\n\ - ldrb r1, [r4, 0x3]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r5, _0806CF98 @ =gSprites + 0x20\n\ - adds r0, r5\n\ - ldrb r2, [r4, 0x4]\n\ - lsls r1, r2, 4\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - bl SwapValues_s16\n\ - ldrb r1, [r4, 0x3]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r3, r5, 0x2\n\ - adds r0, r3\n\ - ldrb r2, [r4, 0x4]\n\ - lsls r1, r2, 4\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r3\n\ - bl SwapValues_s16\n\ - ldrb r1, [r4, 0x3]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r3, r5, 0x4\n\ - adds r0, r3\n\ - ldrb r2, [r4, 0x4]\n\ - lsls r1, r2, 4\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r3\n\ - bl SwapValues_s16\n\ - ldrb r1, [r4, 0x3]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r3, r5, 0\n\ - adds r3, 0xE\n\ - adds r0, r3\n\ - ldrb r2, [r4, 0x4]\n\ - lsls r1, r2, 4\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r3\n\ - bl SwapValues_s16\n\ - ldrb r1, [r4, 0x3]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - subs r5, 0x4\n\ - adds r0, r5\n\ - ldr r2, _0806CF9C @ =SpriteCB_sub_806D37C\n\ - str r2, [r0]\n\ - ldrb r1, [r4, 0x4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - str r2, [r0]\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806CF94: .4byte gSharedMem + 0x1000\n\ -_0806CF98: .4byte gSprites + 0x20\n\ -_0806CF9C: .4byte SpriteCB_sub_806D37C\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -void sub_806CFA0(u8 taskId, u8 b) -{ - u8 var1 = ((ewram01000.unk6 - 1) * 3) + 1; - - sub_806BA34(ewram01000.unk8, 3); - sub_806BB3C(ewram01000.unkA, var1); - - if (!b) - { - ewram01000.unk8--; - ewram01000.unkA++; - } - else - { - ewram01000.unk8++; - ewram01000.unkA--; - } - - sub_806B9A4(ewram01000.unk8, 3, 10); - sub_806BA94(ewram01000.unkA, var1, 0, 10); -} - -void sub_806D014(u8 taskId) -{ - sub_806CFA0(taskId, 0); - - if (ewram01000.unk8 < -13 && ewram01000.unkA > 32) - { - sub_806CF04(); - gTasks[taskId].func = sub_806D05C; - } -} - -void sub_806D05C(u8 taskId) -{ - sub_806CFA0(taskId, 1); - - if (ewram01000.unk8 == 0 && ewram01000.unkA == 11) - { - gTasks[taskId].func = sub_806D198; - } -} - -void sub_806D098(u8 a, u8 b) -{ - u8 var1 = ((ewram01000.unk5 - 1) * 3) + 1; - u8 var2 = ((ewram01000.unk6 - 1) * 3) + 1; - - sub_806BB3C(ewram01000.unk8, var1); - sub_806BB3C(ewram01000.unkA, var2); - - if (!b) - { - ewram01000.unk8++; - ewram01000.unkA++; - } - else - { - ewram01000.unk8--; - ewram01000.unkA--; - } - - sub_806BA94(ewram01000.unk8, var1, 0, 10); - sub_806BA94(ewram01000.unkA, var2, 0, 10); -} - -void sub_806D118(u8 taskId) -{ - sub_806D098(taskId, 0); - - if (ewram01000.unk8 > 32 && ewram01000.unkA > 32) - { - sub_806CF04(); - gTasks[taskId].func = sub_806D15C; - } -} - -void sub_806D15C(u8 taskId) -{ - sub_806D098(taskId, 1); - - if (ewram01000.unk8 == 11 && ewram01000.unkA == 11) - { - gTasks[taskId].func = sub_806D198; - } -} - -void sub_806D198(u8 taskId) -{ - u8 spriteId; - - SetMonIconSpriteId(ewram01000.unk0, ewram01000.unk5, ewram01000.unk4); - SetMonIconSpriteId(ewram01000.unk0, ewram01000.unk6, ewram01000.unk3); - - gSprites[ewram01000.unk3].pos1.x = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk6].x; - gSprites[ewram01000.unk3].pos1.y = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk6].y; - gSprites[ewram01000.unk3].pos2.x = 0; - gSprites[ewram01000.unk3].pos2.y = 0; - gSprites[ewram01000.unk3].callback = UpdateMonIconFrame_806DA38; - - gSprites[ewram01000.unk4].pos1.x = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk5].x; - gSprites[ewram01000.unk4].pos1.y = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk5].y; - gSprites[ewram01000.unk4].pos2.x = 0; - gSprites[ewram01000.unk4].pos2.y = 0; - gSprites[ewram01000.unk4].callback = UpdateMonIconFrame_806DA38; - - spriteId = GetMonIconSpriteId(ewram01000.unk0, gSprites[ewram01000.unk2].data[0]); - gSprites[spriteId].callback = UpdateMonIconFrame_806DA0C; - - SwapPokemon(&gPlayerParty[ewram01000.unk5], &gPlayerParty[ewram01000.unk6]); - - PartyMenuPrintMonLevelOrStatus(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); - TryPrintPartyMenuMonNickname(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); - PartyMenuTryPrintHP(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); - nullsub_12(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); - - PartyMenuPrintMonLevelOrStatus(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); - TryPrintPartyMenuMonNickname(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); - PartyMenuTryPrintHP(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); - nullsub_12(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); - - PartyMenuDrawHPBars(); - sub_806CC74(taskId); -} - -void SpriteCB_sub_806D37C(struct Sprite *sprite) -{ - UpdateMonIconFrame(sprite); - - if (sprite->pos2.x == sprite->data[2]) - { - sprite->data[0] *= -1; - sprite->data[2] = 0; - sprite->callback = UpdateMonIconFrame_806DA38; - } - else - { - sprite->pos2.x += sprite->data[0]; - } -} - -void sub_806D3B4(u8 taskId, u16 species1, u16 species2) -{ - const u8 *var1 = gUnknown_083769C0; - - sub_806BA34(var1[2] + gTasks[taskId].data[0], var1[3]); - sub_806BB3C(var1[8] + gTasks[taskId].data[0], var1[9]); - sub_806BB3C(var1[10] + gTasks[taskId].data[0], var1[11]); - - gTasks[taskId].data[0]--; - - sub_806B9A4(var1[2] + gTasks[taskId].data[0], var1[3], 4); - - if (species1) - { - sub_806BA94(var1[8] + gTasks[taskId].data[0], var1[9], 0, 4); - } - else - { - sub_806BA94(var1[8] + gTasks[taskId].data[0], var1[9], 1, 4); - } - - if (species2) - { - sub_806BA94(var1[10] + gTasks[taskId].data[0], var1[11], 0, 4); - } - else - { - sub_806BA94(var1[10] + gTasks[taskId].data[0], var1[11], 1, 4); - } -} - -void sub_806D4AC(u8 taskId, u16 species, u8 c) -{ - if (species) - { - u8 monIndex = c + 3; - u8 spriteId = GetMonIconSpriteId(taskId, monIndex); - - gSprites[spriteId].data[0] = -8; - gSprites[spriteId].data[2] = gTasks[taskId].data[0] * -8; - gSprites[spriteId].callback = SpriteCB_sub_806D37C; - } -} - -void sub_806D50C(u8 taskId, u8 monIndex) -{ - gSprites[GetMonIconSpriteId(taskId, monIndex)].pos1.x += 0xF0; -} - -void PrintPartyMenuPromptText(u8 textId, u8 b) -{ - if (textId != 0xFF) - { - switch (b) - { - case 0: - Menu_DrawStdWindowFrame(0, 16, 23, 19); - break; - case 1: - Menu_DrawStdWindowFrame(0, 16, 19, 19); - break; - case 2: - Menu_DrawStdWindowFrame(0, 16, 22, 19); - break; - case 3: - Menu_DrawStdWindowFrame(0, 16, 18, 19); - break; - } - - Menu_PrintText(PartyMenuPromptTexts[textId], 1, 17); - } -} - -void sub_806D5A4(void) -{ - Menu_EraseWindowRect(0, 16, 29, 19); -} - -void sub_806D5B8(u8 monIndex) -{ - u32 var1; - u8 left = gUnknown_08376948[IsDoubleBattle()][monIndex].left; - u8 top = gUnknown_08376948[IsDoubleBattle()][monIndex].top; - u8 right = gUnknown_08376948[IsDoubleBattle()][monIndex].right; - u8 bottom = gUnknown_08376948[IsDoubleBattle()][monIndex].bottom; - - Text_EraseWindowRect(&gUnknown_03004210, left, top, right, bottom); - - var1 = 0; - CpuFastSet(&var1, OBJ_VRAM1 + monIndex * 0x400, 0x1000100); -} - -void sub_806D668(u8 monIndex) -{ - u32 var1; - u8 left = gUnknown_08376978[IsDoubleBattle()][monIndex].left; - u8 top = gUnknown_08376978[IsDoubleBattle()][monIndex].top; - u8 right = gUnknown_08376978[IsDoubleBattle()][monIndex].right; - u8 bottom = gUnknown_08376978[IsDoubleBattle()][monIndex].bottom; - - Text_EraseWindowRect(&gUnknown_03004210, left, top, right, bottom); - - var1 = 0; - CpuFastSet(&var1, OBJ_VRAM1 + 0x300 + monIndex * 0x400, 0x1000040); -} - -bool8 LoadPartyMenuGraphics(u8 a) -{ - u16 palette = 0x7FFF; - bool8 retVal = FALSE; - - if (a < 2) - { - LZDecompressVram(gPartyMenuMisc_Gfx, (void *)BG_VRAM); - } - - if (a == 2 || a == 0) - { - LZDecompressVram(gPartyMenuMisc_Tilemap, (void *)(BG_VRAM + 0x3800)); - } - - if (a == 3 || a == 0) - { - LoadCompressedPalette(gPartyMenuMisc_Pal, 0, 0x160); - } - - if (a == 4 || a == 0) - { - LoadPalette(&palette, 0, 2); - LoadPalette(gFontDefaultPalette, 0xF0, 0x20); - } - - if (a == 5 || a == 0) - { - LZDecompressVram(gPartyMenuHpBar_Gfx, (void *)(BG_VRAM + 0x6000)); - } - - if (a == 6 || a == 0) - { - LZDecompressVram(gPartyMenuOrderText_Gfx, (void *)(BG_VRAM + 0x6180)); - } - - if (a == 7 || a == 0) - { - LZDecompressVram(gStatusGfx_Icons, (void *)(BG_VRAM + 0x7180)); - } - - if (a == 8 || a == 0) - { - LoadCompressedPalette(gStatusPal_Icons, 0xB0, 0x20); - retVal = TRUE; - } - - return retVal; -} - -void SetMonIconAnimByHP(u8 spriteId, u16 currentHP, u16 maxHP) -{ - u8 hpBarLevel = GetHPBarLevel(currentHP, maxHP); - u8 animNum = 0; - - if (currentHP != maxHP) - { - if (hpBarLevel == 3) - { - animNum = 1; - } - else if (hpBarLevel == 2) - { - animNum = 2; - } - else if (hpBarLevel == 1) - { - animNum = 3; - } - else - { - animNum = 4; - } - } - - sub_809D824(&gSprites[spriteId], animNum); -} - -void SetMonIconAnim(u8 spriteId, struct Pokemon *pokemon) -{ - u16 currentHP = GetMonData(pokemon, MON_DATA_HP); - u16 maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); - - SetMonIconAnimByHP(spriteId, currentHP, maxHP); -} - -void CreatePartyMenuMonIcon(u8 taskId, u8 monIndex, u8 menuType, struct Pokemon *pokemon) -{ - u8 x = gUnknown_08376678[menuType][monIndex].x; - u8 y = gUnknown_08376678[menuType][monIndex].y; - - u16 species2 = GetMonData(pokemon, MON_DATA_SPECIES2); - u32 personality = GetMonData(pokemon, MON_DATA_PERSONALITY); - - u8 spriteId = CreateMonIcon(species2, sub_809D62C, x, y, 5, personality); - SetMonIconSpriteId(taskId, monIndex, spriteId); - SetMonIconAnim(spriteId, pokemon); -} - -void TryCreatePartyMenuMonIcon(u8 taskId, u8 monIndex, struct Pokemon *pokemon) -{ - if (GetMonData(pokemon, MON_DATA_SPECIES)) - { - bool8 isLinkDoubleBattle = IsLinkDoubleBattle(); - if (isLinkDoubleBattle == TRUE) - { - CreatePartyMenuMonIcon(taskId, monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); - } - else - { - CreatePartyMenuMonIcon(taskId, monIndex, IsDoubleBattle(), pokemon); - } - } -} - -void unref_sub_806D964(u8 taskId) -{ - u8 i; - for (i = 0; i < gPlayerPartyCount; i++) - { - TryCreatePartyMenuMonIcon(taskId, i, &gPlayerParty[i]); - } -} - -void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct UnknownPokemonStruct2 *pokemon) -{ - u8 x = gUnknown_08376678[menuType][monIndex].x; - u8 y = gUnknown_08376678[menuType][monIndex].y; - - u8 spriteId = CreateMonIcon(pokemon->species, sub_809D62C, x, y, 5, pokemon->personality); - SetMonIconSpriteId(taskId, monIndex, spriteId); - SetMonIconAnimByHP(spriteId, pokemon->hp, pokemon->maxhp); -} - -void UpdateMonIconFrame_806DA0C(struct Sprite *sprite) -{ - u8 var1; - - var1 = UpdateMonIconFrame(sprite); - if (var1) - { - if (var1 & 1) - { - sprite->pos2.y = -3; - } - else - { - sprite->pos2.y = 1; - } - } -} - -void UpdateMonIconFrame_806DA38(struct Sprite *sprite) -{ - UpdateMonIconFrame(sprite); -} - -void UpdateMonIconFrame_806DA44(u8 taskId, u8 monIndex, u8 c) -{ - u8 spriteId; - - if (monIndex < PARTY_SIZE) - { - spriteId = GetMonIconSpriteId(taskId, monIndex); - gSprites[spriteId].pos2.y = 0; - gSprites[spriteId].data[0] = 0; - - if (!c) - { - gSprites[spriteId].callback = UpdateMonIconFrame_806DA38; - } - else - { - gSprites[spriteId].callback = UpdateMonIconFrame_806DA0C; - } - } -} - -void LoadHeldItemIconGraphics(void) -{ - LoadSpriteSheet(&HeldItemsSpriteSheet); - LoadSpritePalette(&HeldItemsPalette); -} - -void SpriteCB_HeldItemIcon(struct Sprite *sprite) -{ - - u8 data7 = sprite->data[7]; - if (gSprites[data7].invisible) - { - sprite->invisible = 1; - } - else - { - sprite->invisible = 0; - sprite->pos1.x = gSprites[data7].pos1.x + gSprites[data7].pos2.x; - sprite->pos1.y = gSprites[data7].pos1.y + gSprites[data7].pos2.y; - } -} - -void CreateHeldItemIcon(u8 a, u8 b) -{ - u8 subPriority; - u8 spriteId; - - subPriority = gSprites[a].subpriority; - spriteId = CreateSprite(&gSpriteTemplate_837660C, 0xFA, 0xAA, subPriority - 1); - - gSprites[spriteId].pos2.x = 4; - gSprites[spriteId].pos2.y = 10; - gSprites[spriteId].callback = SpriteCB_HeldItemIcon; - gSprites[spriteId].data[7] = a; - - StartSpriteAnim(&gSprites[spriteId], b); - gSprites[spriteId].callback(&gSprites[spriteId]); -} - -void CreateHeldItemIcons(u8 *a, u8 *b, u8 c) -{ - u16 i; - u16 heldItem; - - switch (c) - { - case 0: - i = 0; - while (i < a[0]) - { - heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - if (heldItem) - { - CreateHeldItemIcon(b[i], ItemIsMail(heldItem)); - } - - i++; - } - break; - case 1: - i = 0; - while (i < a[1]) - { - heldItem = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM); - if (heldItem) - { - CreateHeldItemIcon(b[i + 6], ItemIsMail(heldItem)); - } - - i++; - } - break; - } -} - -void CreateHeldItemIcons_806DC34(u8 taskId) -{ - u8 i; - u8 monIconSpriteId; - u8 heldItemSpriteId; - - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) - { - monIconSpriteId = GetMonIconSpriteId(taskId, i); - heldItemSpriteId = CreateSprite(&gSpriteTemplate_837660C, 0xFA, 0xAA, 4); - - gSprites[heldItemSpriteId].pos2.x = 4; - gSprites[heldItemSpriteId].pos2.y = 10; - gSprites[heldItemSpriteId].data[7] = monIconSpriteId; - gSprites[monIconSpriteId].data[7] = heldItemSpriteId; - - SetHeldItemIconVisibility(taskId, i); - gSprites[heldItemSpriteId].callback(&gSprites[heldItemSpriteId]); - } - } -} - -#ifdef NONMATCHING -void CreateHeldItemIcon_806DCD4(u8 taskId, u8 monIndex, u16 item) -{ - u8 monIconSpriteId; - u8 heldItemSpriteId; - - monIconSpriteId = GetMonIconSpriteId(taskId, monIndex); - heldItemSpriteId = CreateSprite(gSpriteTemplate_837660C, 0xFA, 0xAA, 4); - - gSprites[heldItemSpriteId].pos2.x = 4; - gSprites[heldItemSpriteId].pos2.y = 10; - gSprites[heldItemSpriteId].data[7] = monIconSpriteId; - gSprites[monIconSpriteId].data[7] = heldItemSpriteId; - - if (!item) - { - gSprites[heldItemSpriteId].invisible = 1; - } - else - { - if (ItemIsMail(item)) - { - StartSpriteAnim(&gSprites[heldItemSpriteId], 1); - } - else - { - StartSpriteAnim(&gSprites[heldItemSpriteId], 0); - } - - gSprites[heldItemSpriteId].invisible = 0; - } - - gSprites[heldItemSpriteId].callback(&gSprites[heldItemSpriteId]); -} -#else -__attribute__((naked)) -void CreateHeldItemIcon_806DCD4(u8 taskId, u8 monIndex, u16 item) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - lsls r2, 16\n\ - lsrs r7, r2, 16\n\ - bl GetMonIconSpriteId\n\ - adds r4, r0, 0\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - ldr r0, _0806DD2C @ =gSpriteTemplate_837660C\n\ - movs r1, 0xFA\n\ - movs r2, 0xAA\n\ - movs r3, 0x4\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldr r1, _0806DD30 @ =gSprites\n\ - lsls r0, r6, 4\n\ - adds r0, r6\n\ - lsls r0, 2\n\ - adds r5, r0, r1\n\ - movs r0, 0x4\n\ - strh r0, [r5, 0x24]\n\ - movs r0, 0xA\n\ - strh r0, [r5, 0x26]\n\ - strh r4, [r5, 0x3C]\n\ - lsls r0, r4, 4\n\ - adds r0, r4\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - strh r6, [r0, 0x3C]\n\ - cmp r7, 0\n\ - bne _0806DD34\n\ - adds r0, r5, 0\n\ - adds r0, 0x3E\n\ - ldrb r1, [r0]\n\ - movs r2, 0x4\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _0806DD5C\n\ - .align 2, 0\n\ -_0806DD2C: .4byte gSpriteTemplate_837660C\n\ -_0806DD30: .4byte gSprites\n\ -_0806DD34:\n\ - adds r0, r7, 0\n\ - bl ItemIsMail\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0806DD46\n\ - adds r0, r5, 0\n\ - movs r1, 0x1\n\ - b _0806DD4A\n\ -_0806DD46:\n\ - adds r0, r5, 0\n\ - movs r1, 0\n\ -_0806DD4A:\n\ - bl StartSpriteAnim\n\ - adds r2, r5, 0\n\ - adds r2, 0x3E\n\ - ldrb r1, [r2]\n\ - movs r0, 0x5\n\ - negs r0, r0\n\ - ands r0, r1\n\ - strb r0, [r2]\n\ -_0806DD5C:\n\ - ldr r2, _0806DD78 @ =gSprites\n\ - lsls r0, r6, 4\n\ - adds r0, r6\n\ - lsls r0, 2\n\ - adds r1, r2, 0\n\ - adds r1, 0x1C\n\ - adds r1, r0, r1\n\ - adds r0, r2\n\ - ldr r1, [r1]\n\ - bl _call_via_r1\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806DD78: .4byte gSprites\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite) -{ - u8 spriteId = sprite->data[7]; - - sprite->pos1.x = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; - sprite->pos1.y = gSprites[spriteId].pos1.y; -} - -u8 GetMonIconSpriteId(u8 taskId, u8 monIndex) -{ - switch (monIndex) - { - case 1: - return gTasks[taskId].data[0]; - break; - case 2: - return gTasks[taskId].data[1] >> 8; - break; - case 3: - return gTasks[taskId].data[1]; - break; - case 4: - return gTasks[taskId].data[2] >> 8; - break; - case 5: - return gTasks[taskId].data[2]; - break; - case 0: - default: - return gTasks[taskId].data[0] >> 8; - break; - } -} - -void SetMonIconSpriteId(u8 taskId, u8 monIndex, u8 spriteId) -{ - switch (monIndex) - { - case 0: - gTasks[taskId].data[0] = (u8)gTasks[taskId].data[0] | (spriteId << 8); - break; - case 1: - gTasks[taskId].data[0] = (gTasks[taskId].data[0] & -0x100) | spriteId; - break; - case 2: - gTasks[taskId].data[1] = (u8)gTasks[taskId].data[1] | (spriteId << 8); - break; - case 3: - gTasks[taskId].data[1] = (gTasks[taskId].data[1] & -0x100) | spriteId; - break; - case 4: - gTasks[taskId].data[2] = (u8)gTasks[taskId].data[2] | (spriteId << 8); - break; - case 5: - gTasks[taskId].data[2] = (gTasks[taskId].data[2] & -0x100) | spriteId; - break; - } -} - -u16 GetMonHeldItemIconSpriteId(u8 taskId, u8 monIndex) -{ - u8 spriteId = GetMonIconSpriteId(taskId, monIndex); - u8 retVal = gSprites[spriteId].data[7]; - return retVal; -} - -#ifdef NONMATCHING -void SetHeldItemIconVisibility(u8 taskId, u8 monIndex) -{ - u8 spriteId; - u16 heldItem; - - spriteId = GetMonHeldItemIconSpriteId(taskId, monIndex); - if (!GetMonData(&gPlayerParty[monIndex], MON_DATA_HELD_ITEM)) - { - gSprites[spriteId].invisible = 1; - } - else - { - struct Sprite *sprite; - - heldItem = GetMonData(&gPlayerParty[monIndex], MON_DATA_HELD_ITEM); - sprite = &gSprites[spriteId]; - if (ItemIsMail(heldItem)) - { - StartSpriteAnim(sprite, 1); - } - else - { - StartSpriteAnim(sprite, 0); - } - - sprite->invisible = 0; - } -} -#else -__attribute__((naked)) -void SetHeldItemIconVisibility(u8 a, u8 monIndex) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - adds r4, r1, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - adds r1, r4, 0\n\ - bl GetMonHeldItemIconSpriteId\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - adds r6, r5, 0\n\ - movs r0, 0x64\n\ - adds r1, r4, 0\n\ - muls r1, r0\n\ - ldr r0, _0806DFA4 @ =gPlayerParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _0806DFAC\n\ - ldr r1, _0806DFA8 @ =gSprites\n\ - lsls r0, r5, 4\n\ - adds r0, r5\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - adds r0, 0x3E\n\ - ldrb r1, [r0]\n\ - movs r2, 0x4\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _0806DFF6\n\ - .align 2, 0\n\ -_0806DFA4: .4byte gPlayerParty\n\ -_0806DFA8: .4byte gSprites\n\ -_0806DFAC:\n\ - adds r0, r4, 0\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl ItemIsMail\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0806DFD8\n\ - lsls r4, r5, 4\n\ - adds r4, r5\n\ - lsls r4, 2\n\ - ldr r0, _0806DFD4 @ =gSprites\n\ - adds r4, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0x1\n\ - b _0806DFE6\n\ - .align 2, 0\n\ -_0806DFD4: .4byte gSprites\n\ -_0806DFD8:\n\ - lsls r4, r6, 4\n\ - adds r4, r6\n\ - lsls r4, 2\n\ - ldr r0, _0806DFFC @ =gSprites\n\ - adds r4, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0\n\ -_0806DFE6:\n\ - bl StartSpriteAnim\n\ - adds r4, 0x3E\n\ - ldrb r1, [r4]\n\ - movs r0, 0x5\n\ - negs r0, r0\n\ - ands r0, r1\n\ - strb r0, [r4]\n\ -_0806DFF6:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806DFFC: .4byte gSprites\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -void PartyMenuDoPrintMonNickname(u8 monIndex, int b, const u8 *nameBuffer) -{ - u32 var1 = 0; - CpuFastSet(&var1, gTileBuffer, 0x1000100); - Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gTileBuffer, nameBuffer); - CpuFastSet(gTileBuffer, OBJ_VRAM1 + (monIndex * 0x400), 128); -} - -void PrintPartyMenuMonNickname(u8 monIndex, u8 b, struct Pokemon *pokemon) -{ - u8 nameBuffer[12]; - GetMonNickname(pokemon, nameBuffer); - PartyMenuDoPrintMonNickname(monIndex, b, nameBuffer); -} - -void TryPrintPartyMenuMonNickname(u8 monIndex, struct Pokemon *pokemon) -{ - if (GetMonData(pokemon, MON_DATA_SPECIES)) - { - bool8 isLinkDoubleBattle = IsLinkDoubleBattle(); - if (isLinkDoubleBattle == TRUE) - { - PrintPartyMenuMonNickname(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); - } - else - { - PrintPartyMenuMonNickname(monIndex, IsDoubleBattle(), pokemon); - } - } -} - -void PrintPartyMenuMonNicknames(void) -{ - u8 i; - - for (i = 0; i < PARTY_SIZE; i++) - { - TryPrintPartyMenuMonNickname(i, &gPlayerParty[i]); - } -} - -u8 *GetMonNickname(struct Pokemon *pokemon, u8 *stringBuffer) -{ - GetMonData(pokemon, MON_DATA_NICKNAME, stringBuffer); - return StringGetEnd10(stringBuffer); -} - -void PartyMenuPutStatusTilemap(u8 monIndex, u8 menuLayout, u8 status) -{ - u8 i; - u8 x = gUnknown_08376738[menuLayout][monIndex].x - 1; - u8 y = gUnknown_08376738[menuLayout][monIndex].y + 1; - u16 *vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); - u8 var1 = status * 4; - - for (i = 0; i < 4; i++) - { - vramPtr[i] = (0x18C + var1 + i) | -0x5000; - } -} - -static void PartyMenuClearLevelStatusTilemap(u8 monIndex) -{ - bool8 isLinkDoubleBattle; - u8 menuLayout; - u8 x; - u8 y; - u16 *vramPtr; - u8 i; - - isLinkDoubleBattle = IsLinkDoubleBattle(); - if (isLinkDoubleBattle == TRUE) - { - menuLayout = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; - } - else - { - menuLayout = IsDoubleBattle(); - } - - x = gUnknown_08376738[menuLayout][monIndex].x - 1; - y = gUnknown_08376738[menuLayout][monIndex].y + 1; - - vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); - for (i = 0; i < 4; i++) - { - vramPtr[i] = 0; - } -} - -static void PartyMenuWriteTilemap(u8 a, u8 x, u8 y) -{ - u16 *vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); - *vramPtr = a + 0x10C; -} - -void PartyMenuDoPrintLevel(u8 monIndex, u8 menuLayout, u8 level) -{ - u8 *stringVar; - u32 var1; - u8 x = gUnknown_08376738[menuLayout][monIndex].x; - u8 y = gUnknown_08376738[menuLayout][monIndex].y; - - PartyMenuWriteTilemap(0x40, x - 1, y + 1); - - stringVar = gStringVar1; - stringVar[0] = 0xFC; - stringVar[1] = 0x12; - stringVar[2] = 0x8; - - ConvertIntToDecimalString(&stringVar[3], level); - - var1 = 0; - CpuFastSet(&var1, gUnknown_02039460, 0x1000020); - Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); - CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x200 + (monIndex * 0x400), 32); -} - -void PartyMenuPrintLevel(u8 monIndex, u8 menuLayout, struct Pokemon *pokemon) -{ - u16 level = GetMonData(pokemon, MON_DATA_LEVEL); - PartyMenuDoPrintLevel(monIndex, menuLayout, level); -} - -void PartyMenuPrintMonLevelOrStatus(u8 monIndex, struct Pokemon *pokemon) -{ - if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) - { - u8 statusAndPkrs; - bool8 isLinkDoubleBattle; - u8 menuLayout; - - statusAndPkrs = GetMonStatusAndPokerus(pokemon); - - isLinkDoubleBattle = IsLinkDoubleBattle(); - if (isLinkDoubleBattle == TRUE) - { - menuLayout = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; - } - else - { - menuLayout = IsDoubleBattle(); - } - - if (statusAndPkrs != 0 && statusAndPkrs != 6) - { - PartyMenuPutStatusTilemap(monIndex, menuLayout, statusAndPkrs - 1); - } - else - { - PartyMenuPrintLevel(monIndex, menuLayout, pokemon); - } - - PartyMenuPrintGenderIcon(monIndex, menuLayout, pokemon); - } -} - -void PartyMenuPrintMonsLevelOrStatus(void) -{ - u8 i; - - for (i = 0; i < PARTY_SIZE; i++) - { - PartyMenuPrintMonLevelOrStatus(i, &gPlayerParty[i]); - } -} - -void PartyMenuDoPrintGenderIcon(u16 species, u8 gender, u8 menuLayout, u8 monIndex, u8 *nickname) -{ - if (!ShouldHideGenderIcon(species, nickname)) - { - u8 x = gUnknown_08376738[menuLayout][monIndex].x + 3; - u8 y = gUnknown_08376738[menuLayout][monIndex].y + 1; - - switch (gender) - { - case MON_MALE: - PartyMenuWriteTilemap(0x42, x, y); - break; - case MON_FEMALE: - PartyMenuWriteTilemap(0x44, x, y); - break; - } - } -} - -void PartyMenuPrintGenderIcon(u8 monIndex, u8 menuLayout, struct Pokemon *pokemon) -{ - u16 species2; - u8 gender; - - GetMonNickname(pokemon, gStringVar1); - species2 = GetMonData(pokemon, MON_DATA_SPECIES2); - gender = GetMonGender(pokemon); - PartyMenuDoPrintGenderIcon(species2, gender, menuLayout, monIndex, gStringVar1); -} - -void PartyMenuDoPrintHP(u8 monIndex, u8 b, u16 currentHP, u16 maxHP) -{ - u32 *var; - register u8 *stringVar1 asm("r2") = gStringVar1; - register u8 *textPtr asm("r2") = sub_8072C14(stringVar1, currentHP, 15, 1); - textPtr[0] = CHAR_SLASH; - - sub_8072C14(++textPtr, maxHP, 35, 1); - var = 0; - - CpuFastSet(&var, gUnknown_02039460, 0x1000040); - Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); - CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x300 + (monIndex * 0x400), 64); -} - -void PartyMenuPrintHP(u8 monIndex, u8 b, struct Pokemon *pokemon) -{ - u16 currentHP; - u16 maxHP; - - currentHP = GetMonData(pokemon, MON_DATA_HP); - maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); - - PartyMenuDoPrintHP(monIndex, b, currentHP, maxHP); -} - -void PartyMenuTryPrintHP(u8 monIndex, struct Pokemon *pokemon) -{ - if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) - { - bool8 isLinkDoubleBattle = IsLinkDoubleBattle(); - if (isLinkDoubleBattle == TRUE) - { - PartyMenuPrintHP(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); - } - else - { - PartyMenuPrintHP(monIndex, IsDoubleBattle(), pokemon); - } - } -} - -void PartyMenuTryPrintMonsHP(void) -{ - u8 i; - - for (i = 0; i < PARTY_SIZE; i++) - { - PartyMenuTryPrintHP(i, &gPlayerParty[i]); - } -} - -void unref_sub_806E564(void) { } -void unref_sub_806E568(void) { } -void nullsub_12(u8 monIndex, struct Pokemon *pokemon) { } -void nullsub_13(void) { } - -void PartyMenuDoDrawHPBar(u8 monIndex, u8 menuLayout, u16 currentHP, u16 maxHP) -{ - u8 hpBarLevel; - u16 *vramPtr; - int var = -32768; - struct BattleInterfaceStruct1 battleInterface; - battleInterface.unk0 = maxHP; - battleInterface.unk4 = currentHP; - battleInterface.unk8 = 0; - - hpBarLevel = GetHPBarLevel(currentHP, maxHP); - if (hpBarLevel > 2) - { - battleInterface.unkC_0 = 4; - } - if (hpBarLevel == 2) - { - battleInterface.unkC_0 = 5; - } - if (hpBarLevel < 2) - { - battleInterface.unkC_0 = 6; - } - - battleInterface.unk10 = 0x100; - - vramPtr = gUnknown_08376858[menuLayout][monIndex]; - sub_80460C8(&battleInterface, &var, vramPtr, 0); - - vramPtr -= 2; - - vramPtr[0] = 0x3109; - vramPtr[1] = 0x310A; - vramPtr[8] = 0x310B; -} - -void PartyMenuDrawHPBar(u8 monIndex, u8 menuLayout, struct Pokemon *pokemon) -{ - u16 currentHP = GetMonData(pokemon, MON_DATA_HP); - u16 maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); - - PartyMenuDoDrawHPBar(monIndex, menuLayout, currentHP, maxHP); -} - -void PartyMenuTryDrawHPBar(u8 monIndex, struct Pokemon *pokemon) -{ - if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) - { - bool8 isDoubleBattle = IsLinkDoubleBattle(); - if (isDoubleBattle == TRUE) - { - PartyMenuDrawHPBar(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); - } - else - { - PartyMenuDrawHPBar(monIndex, IsDoubleBattle(), pokemon); - } - } -} - -void PartyMenuDrawHPBars(void) -{ - u8 i; - - for (i = 0; i < PARTY_SIZE; i++) - { - PartyMenuTryDrawHPBar(i, &gPlayerParty[i]); - } -} - -void SwapPokemon(struct Pokemon *a, struct Pokemon *b) -{ - struct Pokemon temp = *a; - *a = *b; - *b = temp; -} - -void SetPartyPopupMenuOffsets(u8 menuIndex, u8 *left, u8 *top, const struct PartyPopupMenu *menu) -{ - u8 bottomOffset = (2 * menu[menuIndex].numChoices) + 2; - u8 rightOffset = menu[menuIndex].width + 1; - - *left = 30 - rightOffset; - *top = 20 - bottomOffset; -} - -void ShowPartyPopupMenu(u8 menuIndex, const struct PartyPopupMenu *menu, const struct MenuAction2 *menuActions, u8 cursorPos) -{ - u8 left; - u8 top; - - SetPartyPopupMenuOffsets(menuIndex, &left, &top, menu); - sub_8089C50(left, top, menu[menuIndex].width, menu[menuIndex].numChoices, menuActions, menu[menuIndex].items); - - InitMenu(0, left + 1, top + 1, menu[menuIndex].numChoices, cursorPos, menu[menuIndex].width - 1); -} - -void ClosePartyPopupMenu(u8 index, const struct PartyPopupMenu *menu) -{ - u8 left; - u8 top; - - SetPartyPopupMenuOffsets(index, &left, &top, menu); - - Menu_EraseWindowRect(left, top, left + menu[index].width, menu[index].numChoices * 2 + top + 1); - Menu_DestroyCursor(); -} - -TaskFunc PartyMenuGetPopupMenuFunc(u8 menuIndex, const struct PartyPopupMenu *menus, const struct MenuAction2 *menuActions, u8 itemIndex) -{ - u8 action = menus[menuIndex].items[itemIndex]; - return menuActions[action].func; -} - -u8 sub_806E834(const u8 *message, u8 arg1) -{ - u8 taskId; - - gUnknown_0202E8F6 = 1; - - Menu_DrawStdWindowFrame(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - MenuPrintMessage(message, WINDOW_LEFT + 1, 15); - - taskId = CreateTask(sub_806E884, 1); - gTasks[taskId].data[0] = arg1; - - return taskId; -} - -static void sub_806E884(u8 taskId) -{ - if (Menu_UpdateWindowText()) - { - gUnknown_0202E8F6 = 0; - if (gTasks[taskId].data[0] == 0) - Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - DestroyTask(taskId); - } -} - -void sub_806E8D0(u8 taskId, u16 b, TaskFunc c) -{ - ewram1C000.unk10 = c; - ewram1C000.unk4 = taskId; - ewram1C000.unk5 = sub_806CA38(taskId); - ewram1C000.unk6 = b; - ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; -} - -bool8 PartyMenuUpdateMonHeldItem(struct Pokemon *pkmn, u16 item) -{ - u8 itemData[2]; - - if (ItemIsMail(item) == TRUE) - { - if (GiveMailToMon(pkmn, item) == 0xFF) - return TRUE; - gUnknown_0202E8F4 = 2; - } - else - { - gUnknown_0202E8F4 = 1; - } - - itemData[0] = item; - itemData[1] = item >> 8; - SetMonData(pkmn, MON_DATA_HELD_ITEM, itemData); - return FALSE; -} - -void PartyMenuTryGiveMonHeldItem(u8 taskId, u16 newItem, TaskFunc c) -{ - u16 currentItem; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, newItem, c); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - gUnknown_0202E8F4 = 0; - gUnknown_0202E8F8 = 0; - if (currentItem != 0) - { - if (ItemIsMail(currentItem) == TRUE) - { - sub_806E834(gOtherText_MailMustBeRemoved, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - else - { - GetMonNickname(ewram1C000.pokemon, gStringVar1); - CopyItemName(currentItem, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyHolding); - sub_806E834(gStringVar4, 1); - CreateTask(Task_ConfirmGiveHeldItem, 5); - if (ItemIsMail(newItem) == TRUE) - gUnknown_0202E8F8 = currentItem; - } - } - else - { - PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, newItem); - RemoveBagItem(newItem, 1); - if (ItemIsMail(newItem)) - { - gTasks[taskId].func = c; - } - else - { - DisplayGiveHeldItemMessage(ewram1C000.unk5, newItem, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - } -} - -void party_menu_link_mon_held_item_object(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } -} - -void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId) -{ - s8 selection = Menu_ProcessInputNoWrap_(); - - if (selection == 0) - { - u16 currentItem; - - Menu_EraseWindowRect(23, 8, 29, 13); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - RemoveBagItem(ewram1C000.unk6, 1); - if (AddBagItem(currentItem, 1) == TRUE) - { - PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, ewram1C000.unk6); - if (ItemIsMail(ewram1C000.unk6)) - { - DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 1); - } - else - { - CopyItemName(ewram1C000.unk6, gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_TakenAndReplaced); - sub_806E834(gStringVar4, 1); - } - } - else - { - sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); - AddBagItem(ewram1C000.unk6, 1); - } - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - Menu_EraseWindowRect(23, 8, 29, 13); - } - gTasks[taskId].func = party_menu_link_mon_held_item_object; -} - -void Task_ConfirmGiveHeldItem(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = PartyMenuTryGiveMonHeldItem_806EACC; - } -} - -void DisplayGiveHeldItemMessage(u8 a, u16 b, u8 c) -{ - GetMonNickname(&gPlayerParty[a], gStringVar1); - CopyItemName(b, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasGivenToHold); - sub_806E834(gStringVar4, c); -} - -void PartyMenuTryGiveMonMail(u8 taskId, TaskFunc func) -{ - u32 var1; - u16 currentItem; - struct MailStruct *mail; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, 0, func); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - gUnknown_0202E8F4 = 0; - var1 = ewram1FE00.unkE00 + 6; - mail = &gSaveBlock1.mail[var1 + ewram1FE00.unkE02]; - - if (currentItem != 0) - { - sub_806E834(gOtherText_PokeHoldingItemCantMail, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - else - { - GiveMailToMon2(ewram1C000.pokemon, mail); - ClearMailStruct(mail); - sub_806E834(gOtherText_MailTransferredMailbox, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } -} - -void PartyMenuTryGiveMonHeldItem_806ECE8(u8 taskId, TaskFunc func) -{ - u16 currentItem; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, 0, func); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - if (currentItem == 0) - { - StringExpandPlaceholders(gStringVar4, gOtherText_NotHoldingAnything); - sub_806E834(gStringVar4, 0); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - else - { - u8 itemData[2]; - - itemData[0] = 0; - itemData[1] = 0; - if (AddBagItem(currentItem, 1) == TRUE) - { - if (ItemIsMail(currentItem) == TRUE) - TakeMailFromMon(ewram1C000.pokemon); - DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 0); - SetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM, itemData); - } - else - { - sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); - } - CreateTask(party_menu_link_mon_held_item_object, 5); - } -} - -void DisplayTakeHeldItemMessage(u8 a, u16 b, u8 c) -{ - GetMonNickname(&gPlayerParty[a], gStringVar1); - CopyItemName(b, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_ReceivedTheThingFrom); - sub_806E834(gStringVar4, c); -} - -void DoTakeMail(u8 taskId, TaskFunc func) -{ - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, 0, func); - ewram1C000.unk6 = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - sub_806E834(gOtherText_SendRemovedMailPrompt, 1); - CreateTask(Task_ConfirmTakeHeldMail, 5); -} - -void Task_LoseMailMessage(u8 taskId) -{ - s8 selection = Menu_ProcessInputNoWrap_(); - - if (selection == 0) - { - if (AddBagItem(ewram1C000.unk6, 1) == TRUE) - { - TakeMailFromMon(ewram1C000.pokemon); - sub_806E834(gOtherText_MailTaken, 0); - } - else - { - sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); - } - Menu_EraseWindowRect(23, 8, 29, 13); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - Menu_EraseWindowRect(23, 8, 29, 13); - Menu_EraseWindowRect(0, 14, 29, 19); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } -} - -void Task_ConfirmLoseMailMessage(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = Task_LoseMailMessage; - } -} - -void Task_TakeHeldMail(u8 taskId) -{ - s8 selection = Menu_ProcessInputNoWrap_(); - - if (selection == 0) - { - Menu_EraseWindowRect(23, 8, 29, 13); - if (TakeMailFromMon2(ewram1C000.pokemon) != 0xFF) - sub_806E834(gOtherText_MailWasSent, 0); - else - sub_806E834(gOtherText_MailboxIsFull, 0); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - Menu_EraseWindowRect(23, 8, 29, 13); - sub_806E834(gOtherText_MailRemovedMessageLost, 1); - gTasks[taskId].func = Task_ConfirmLoseMailMessage; - } -} - -void Task_ConfirmTakeHeldMail(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = Task_TakeHeldMail; - } -} - -u16 ItemIdToBattleMoveId(u16 item) -{ - u16 machineNumber = item - ITEM_TM01_FOCUS_PUNCH; - return TMHMMoves[machineNumber]; -} - -bool8 pokemon_has_move(struct Pokemon *pkmn, u16 move) -{ - u8 i; - - for (i = 0; i < 4; i++) - { - if (GetMonData(pkmn, MON_DATA_MOVE1 + i) == move) - return TRUE; - } - return FALSE; -} - -void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func) -{ - PlaySE(SE_SELECT); - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, move, func); - CreateTask(Task_TeamMonTMMove, 5); -} - -void Task_TeamMonTMMove(u8 taskId) -{ - GetMonNickname(ewram1C000.pokemon, gStringVar1); - ewram1C000.unk8 = ItemIdToBattleMoveId(ewram1C000.unk6); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - ewram1B000.unk282 = 0; - if (pokemon_has_move(ewram1C000.pokemon, ewram1C000.unk8)) - { - StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyKnows); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (!CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) - { - StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (GiveMoveToMon(ewram1C000.pokemon, ewram1C000.unk8) != 0xFFFF) - { - Task_TeamMonTMMove2(taskId); - } - else - { - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = sub_806F358; - } - } - } -} - -void Task_TeamMonTMMove2(u8 taskId) -{ - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); - sub_806E834(gStringVar4, 1); - AdjustFriendship(ewram1C000.pokemon, 4); - if (ewram1B000.unk282 == 0 && ewram1C000.unk6 <= 0x152) - RemoveBagItem(ewram1C000.unk6, 1); - gTasks[taskId].func = Task_TeamMonTMMove3; -} - -void Task_TeamMonTMMove3(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - PlayFanfare(BGM_FANFA1); - gTasks[taskId].func = Task_TeamMonTMMove4; - } -} - -void Task_TeamMonTMMove4(u8 taskId) -{ - if (IsFanfareTaskInactive()) - { - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); - if (ewram1B000.unk282 == 1) - { - TeachMonMoveInPartyMenu(taskId); - } - else - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } - } - } -} - -void sub_806F2FC(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); - if (ewram1B000.unk282 == 1) - { - TeachMonMoveInPartyMenu(taskId); - } - else - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } - } -} - -void sub_806F358(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = sub_806F390; - } -} - -void sub_806F390(u8 taskId) -{ - s8 selection = Menu_ProcessInputNoWrap_(); - - if (selection == 0) - { - Menu_EraseWindowRect(23, 8, 29, 13); - sub_806E834(gOtherText_WhichMoveToForget2, 1); - gTasks[taskId].func = sub_806F44C; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - StopTryingToTeachMove_806F614(taskId); - } -} - -void sub_806F3FC(u8 taskId) -{ - if (!gPaletteFade.active) - { - ShowSelectMovePokemonSummaryScreen(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8); - DestroyTask(taskId); - } -} - -void sub_806F44C(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_806F3FC; - } -} - -void TaughtMove(u8 taskId) -{ - if (!gPaletteFade.active) - { - u8 moveIndex; - u16 r4; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, gSpecialVar_ItemId, sub_808B508); - moveIndex = sub_809FA30(); - r4 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + moveIndex); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[r4]); - StringExpandPlaceholders(gStringVar4, gOtherText_ForgetMove123_2); - sub_806E834(gStringVar4, 1); - CreateTask(TMMoveUpdateMoveSlot, 5); - } -} - -void TMMoveUpdateMoveSlot(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - RemoveMonPPBonus(ewram1C000.pokemon, sub_809FA30()); - SetMonMoveSlot(ewram1C000.pokemon, ewram1C000.unk8, sub_809FA30()); - Task_TeamMonTMMove2(taskId); - } -} - -void StopTryingToTeachMove_806F588(u8 taskId) -{ - if (!gPaletteFade.active) - { - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, gSpecialVar_ItemId, sub_808B508); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); - sub_806E834(gStringVar4, 1); - CreateTask(StopTryingToTeachMove_806F67C, 5); - } -} - -void StopTryingToTeachMove_806F614(u8 taskId) -{ - Menu_EraseWindowRect(23, 8, 29, 13); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = StopTryingToTeachMove_806F67C; -} - -void StopTryingToTeachMove_806F67C(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = StopTryingToTeachMove_806F6B4; - } -} - -void StopTryingToTeachMove_806F6B4(u8 taskId) -{ - s8 selection = Menu_ProcessInputNoWrap_(); - - if (selection == 0) - { - Menu_EraseWindowRect(23, 8, 29, 13); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_DidNotLearnMove2); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = sub_806F2FC; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - Menu_EraseWindowRect(23, 8, 29, 13); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = sub_806F358; - } -} - -bool8 IsHMMove(u16 move) -{ - u8 i; - - for (i = 0; i < NUM_HIDDEN_MACHINES; i++) - { - if (TMHMMoves[NUM_TECHNICAL_MACHINES + i] == move) - return TRUE; - } - - return FALSE; -} - -s16 sub_806F7E8(u8 taskId, struct BattleInterfaceStruct1 *b, s8 c) -{ - s16 *taskData; - u8 hpBarLevel; - void *vramPtr; - - taskData = gTasks[taskId].data; - - b->unk0 = taskData[10]; - b->unk4 = taskData[11]; - b->unk8 = taskData[12] * c; - b->unk10 = 0x100; - hpBarLevel = GetHPBarLevel(ewram1B000.unk282, b->unk0); - if (hpBarLevel > 2) - b->unkC_0 = 4; - if (hpBarLevel == 2) - b->unkC_0 = 5; - if (hpBarLevel < 2) - b->unkC_0 = 6; - vramPtr = gUnknown_08376858[IsDoubleBattle()][ewram1C000.unk5]; - return sub_80460C8(b, &ewram1C000.unkC, vramPtr, 0); -} - -void sub_806F8AC(u8 taskId) -{ - struct BattleInterfaceStruct1 sp0; - u16 sp14; - - ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, -1); - if (ewram1B000.unk282 == -1) - { - ewram1C000.unkC = 0; - if (-sp0.unk8 + sp0.unk4 > sp0.unk0) - sp14 = sp0.unk0 - sp0.unk4; - else - sp14 = -sp0.unk8; - gBattleMoveDamage = -sp14; - GetMonNickname(ewram1C000.pokemon, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, sp14, 0, 3); - if (gTasks[taskId].data[14] == 0) - StringExpandPlaceholders(gStringVar4, gOtherText_HPRestoredBy); - else - StringExpandPlaceholders(gStringVar4, gOtherText_RegainedHealth); - SetMonIconAnim(GetMonIconSpriteId(ewram1C000.unk4, ewram1C000.unk5), ewram1C000.pokemon); - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 7); - ewram1B000.unk261 = 2; - sub_806E834(gStringVar4, 1); - sp14 += sp0.unk4; - SetMonData(ewram1C000.pokemon, MON_DATA_HP, &sp14); - RemoveBagItem(ewram1C000.unk6, 1); - sub_8032638(); - gTasks[taskId].func = sub_806FB44; - } - else - { - PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); - } -} - -void sub_806FA18(u8 taskId) -{ - struct BattleInterfaceStruct1 sp0; - - ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, 1); - if (ewram1B000.unk282 == -1) - { - PlaySE(SE_KAIFUKU); - ewram1C000.unkC = 0; - gTasks[taskId].data[11] -= gTasks[taskId].data[12]; - SetMonData(ewram1C000.pokemon, MON_DATA_HP, &gTasks[taskId].data[11]); - SetMonIconAnim(GetMonIconSpriteId(ewram1C000.unk4, ewram01000.unk1), ewram1C000.pokemon); - ewram1C000.unk5 = gSprites[ewram01000.unk2].data[0]; - ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; - gTasks[taskId].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); - gTasks[taskId].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); - ewram1C000.unkC = -32768; - ewram1C000.unk14 = ewram1C000.unk10; - gTasks[taskId].func = sub_806F8AC; - ewram1B000.unk282 = gTasks[taskId].data[11]; - } - else - { - PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); - } -} - -void sub_806FB0C(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } -} - -void sub_806FB44(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk14; - DestroyTask(taskId); - } -} - -bool8 IsHPRecoveryItem(u16 item) -{ - const u8 *itemEffect; - - if (item == ITEM_ENIGMA_BERRY) - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - else - itemEffect = gItemEffectTable[item - ITEM_POTION]; - - if (itemEffect[4] & 4) - return TRUE; - else - return FALSE; -} - -void PartyMenuUpdateLevelOrStatus(struct Pokemon *pkmn, u8 monIndex) -{ - PartyMenuClearLevelStatusTilemap(monIndex); - PartyMenuPrintMonLevelOrStatus(monIndex, pkmn); -} - -void GetMedicineItemEffectMessage(u16 item) -{ - switch (GetItemEffectType(item)) - { - case 3: - StringExpandPlaceholders(gStringVar4, gOtherText_CuredPoisoning); - break; - case 4: - StringExpandPlaceholders(gStringVar4, gOtherText_WokeUp); - break; - case 5: - StringExpandPlaceholders(gStringVar4, gOtherText_BurnHealed); - break; - case 6: - StringExpandPlaceholders(gStringVar4, gOtherText_ThawedOut); - break; - case 7: - StringExpandPlaceholders(gStringVar4, gOtherText_CuredParalysis); - break; - case 8: - StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); - break; - case 9: - StringExpandPlaceholders(gStringVar4, gOtherText_GotOverLove); - break; - case 11: - StringExpandPlaceholders(gStringVar4, gOtherText_BecameHealthy); - break; - case 13: - StringCopy(gStringVar2, gOtherText_Hp2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 12: - StringCopy(gStringVar2, gOtherText_Attack); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 17: - StringCopy(gStringVar2, gOtherText_Defense); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 16: - StringCopy(gStringVar2, gOtherText_Speed); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 14: - StringCopy(gStringVar2, gOtherText_SpAtk2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 15: - StringCopy(gStringVar2, gOtherText_SpDef2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 19: - case 20: - StringExpandPlaceholders(gStringVar4, gOtherText_PPIncreased); - break; - case 21: - StringExpandPlaceholders(gStringVar4, gOtherText_PPRestored); - break; - default: - StringExpandPlaceholders(gStringVar4, gOtherText_WontHaveAnyEffect); - break; - } -} - -bool8 IsMedicineIneffective(struct Pokemon *pkmn, u16 item) -{ - if (GetItemEffectType(item) == 13 - && GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA) - return TRUE; - else - return FALSE; -} - -bool8 ExecuteTableBasedItemEffect__(u8 a, u16 b, u8 c) -{ - if (gMain.inBattle) - return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, sub_8094C20(a), c); - else - return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, a, c); -} - -void UseMedicine(u8 taskId, u16 item, TaskFunc func) -{ - u8 r7; - bool8 r9 = FALSE; - bool8 r0; - - gTasks[taskId].func = TaskDummy; - r7 = CreateTask(TaskDummy, 5); - sub_806E8D0(taskId, item, func); - if (!IsMedicineIneffective(ewram1C000.pokemon, item)) - { - r9 = IsHPRecoveryItem(item); - if (r9 == TRUE) - { - gTasks[r7].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); - gTasks[r7].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); - if (gTasks[r7].data[10] == gTasks[r7].data[11]) - { - r9 = FALSE; - gTasks[r7].data[10] = 0; - gTasks[r7].data[11] = 0; - } - } - r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, item, 0); - } - else - { - r0 = TRUE; - } - - if (r0) - { - gUnknown_0202E8F4 = 0; - PlaySE(SE_SELECT); - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - gTasks[r7].func = sub_806FB0C; - } - else - { - u8 statusAndPkrs; - - gUnknown_0202E8F4 = 1; - if (!IsBlueYellowRedFlute(item)) - PlaySE(SE_KAIFUKU); - else - PlaySE(SE_BIDORO); - statusAndPkrs = GetMonStatusAndPokerus(ewram1C000.pokemon); - if (statusAndPkrs == 6 || statusAndPkrs == 0) - PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); - if (r9 == TRUE) - { - gTasks[r7].data[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - gTasks[r7].data[11]; - ewram1C000.unkC = -32768; - if (gTasks[r7].data[11] == 0) - gTasks[r7].data[14] = 1; - else - gTasks[r7].data[14] = 0; - ewram1C000.unk14 = ewram1C000.unk10; - gTasks[r7].func = sub_806F8AC; - ewram1B000.unk282 = gTasks[r7].data[11]; - } - else - { - GetMonNickname(ewram1C000.pokemon, gStringVar1); - if (!IsBlueYellowRedFlute(item)) - RemoveBagItem(item, 1); - GetMedicineItemEffectMessage(item); - TryPrintPartyMenuMonNickname(ewram1C000.unk5, ewram1C000.pokemon); - sub_806E834(gStringVar4, 1); - gTasks[r7].func = sub_806FB0C; - } - } -} - -bool8 IsBlueYellowRedFlute(u16 item) -{ - if (item == 0x27 - || item == 0x29 - || item == 0x28) - return TRUE; - else - return FALSE; -} - -void sub_8070048(u8 taskId, u16 item, TaskFunc func) -{ - ewram1C000.unk10 = func; - ewram1C000.unk4 = taskId; - ewram1C000.unk6 = item; - ewram1C000.unk5 = 0; - ewram1C000.unk14 = sub_80701DC; - ewram1B000.unk27E = 0; - ewram1B000.unk280 = 0; - sub_8070088(taskId); -} - -void sub_8070088(u8 taskId) -{ - u8 taskId2; - - gTasks[taskId].func = TaskDummy; - if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) == 0) - { - gTasks[taskId].func = sub_80701DC; - } - else - { - s16 *taskData; - - taskId2 = CreateTask(TaskDummy, 5); - taskData = gTasks[taskId2].data; - ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; - taskData[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); - taskData[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); - if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, 0)) - { - DestroyTask(taskId2); - gTasks[taskId].func = sub_80701DC; - } - else - { - gUnknown_0202E8F4 = 1; - Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - PlaySE(SE_KAIFUKU); - PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 9); - ewram1B000.unk261 = 2; - taskData[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - taskData[11]; - taskData[14] = 1; - ewram1B000.unk27E = 1; - ewram1B000.unk280 = 1; - ewram1B000.unk282 = taskData[11]; - ewram1C000.unkC = -32768; - gTasks[taskId2].func = sub_806F8AC; - } - } -} - -void sub_80701DC(u8 taskId) -{ - if (ewram1B000.unk27E == 1) - { - AddBagItem(ewram1C000.unk6, 1); - if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) != 0) - { - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 3); - ewram1B000.unk261 = 2; - } - ewram1B000.unk27E = 0; - } - ewram1C000.unk5++; - if (ewram1C000.unk5 == 6) - { - gUnknown_0202E8F4 = 0; - if (ewram1B000.unk280 == 0) - { - gTasks[taskId].func = TaskDummy; - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - CreateTask(sub_806FB0C, 8); - } - else - { - RemoveBagItem(ewram1C000.unk6, 1); - gTasks[taskId].func = ewram1C000.unk10; - } - gLastFieldPokeMenuOpened = 0; - } - else - { - sub_8070088(taskId); - } -} - -void CreateItemUseMoveMenu(u8 partyMonIndex) -{ - u8 r6; - u8 i; - - r6 = 0; - Menu_DrawStdWindowFrame(19, 10, 29, 19); - for (i = 0; i < 4; i++) - { - u16 move = GetMonData(&gPlayerParty[partyMonIndex], MON_DATA_MOVE1 + i); - - Menu_PrintText(gMoveNames[move], 20, i * 2 + 11); - if (move != 0) - r6++; - } - InitMenu(0, 20, 11, r6, 0, 9); -} - -void Task_HandleItemUseMoveMenuInput(u8 taskId) -{ - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - } - else if (gMain.newKeys & A_BUTTON) - { - gUnknown_08376B54[0](taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_08376B54[1](taskId); - } -} - -void DoPPRecoveryItemEffect(u8 taskId, u16 item, TaskFunc c) -{ - const u8 *itemEffect; - u8 taskId2; - - if (item == ITEM_ENIGMA_BERRY) - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - else - itemEffect = gItemEffectTable[item - ITEM_POTION]; - gTasks[taskId].func = TaskDummy; - taskId2 = CreateTask(TaskDummy, 5); - sub_806E8D0(taskId, item, c); - if (!(itemEffect[4] & 0x10)) - { - gTasks[taskId2].data[11] = 0; - DoRecoverPP(taskId2); - } - else - { - PlaySE(SE_SELECT); - PrintPartyMenuPromptText(10, 3); - CreateItemUseMoveMenu(ewram1C000.unk5); - gTasks[taskId2].func = Task_HandleItemUseMoveMenuInput; - gMain.newKeys = 0; - } -} - -void ItemUseMoveMenu_HandleMoveSelection(u8 taskId) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(19, 10, 29, 19); - sub_806D5A4(); - gTasks[taskId].data[11] = Menu_GetCursorPos(); - DoRecoverPP(taskId); -} - -void ItemUseMoveMenu_HandleCancel(u8 taskId) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(19, 10, 29, 19); - if (gMain.inBattle) - gTasks[ewram1C000.unk4].func = HandleBattlePartyMenu; - else - gTasks[ewram1C000.unk4].func = sub_808B0C0; - PrintPartyMenuPromptText(3, 0); - DestroyTask(taskId); -} - -void DoRecoverPP(u8 taskId) -{ - u16 r5 = 0; - - if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, gTasks[taskId].data[11])) - { - gUnknown_0202E8F4 = r5; - PlaySE(SE_SELECT); - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - } - else - { - gUnknown_0202E8F4 = 1; - PlaySE(SE_KAIFUKU); - RemoveBagItem(ewram1C000.unk6, 1); - r5 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + gTasks[taskId].data[11]); - StringCopy(gStringVar1, gMoveNames[r5]); - GetMedicineItemEffectMessage(ewram1C000.unk6); - sub_806E834(gStringVar4, 1); - } - gTasks[taskId].func = sub_806FB0C; -} - -void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c) -{ - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, b, c); - PlaySE(SE_SELECT); - PrintPartyMenuPromptText(11, 3); - CreateItemUseMoveMenu(ewram1C000.unk5); - CreateTask(Task_HandleItemUseMoveMenuInput, 5); - gMain.newKeys = 0; -} - -static const u8 *const StatNames[] = { - gOtherText_HP, - gOtherText_Attack, - gOtherText_Defense, - gOtherText_SpAtk, - gOtherText_SpDef, - gOtherText_Speed, -}; - -static const u8 StatDataTypes[] = { - MON_DATA_MAX_HP, - MON_DATA_ATK, - MON_DATA_DEF, - MON_DATA_SPATK, - MON_DATA_SPDEF, - MON_DATA_SPEED, -}; -void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c) -{ - u8 i; - bool8 r0; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, b, c); - - if (GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL) != 100) - { - for (i = 0; i < 6; i++) - ewram1B000.statGrowths[i] = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); - r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, b, 0); - } - else - r0 = TRUE; - - if (r0) - { - gUnknown_0202E8F4 = 0; - PlaySE(SE_SELECT); - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - CreateTask(sub_806FB0C, 5); - } - else - { - u8 level; - - gUnknown_0202E8F4 = 1; - PlayFanfareByFanfareNum(0); - RedrawPokemonInfoInMenu(ewram1C000.unk5, ewram1C000.pokemon); - RemoveBagItem(b, 1); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - level = GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL); - ConvertIntToDecimalStringN(gStringVar2, level, 0, 3); - StringExpandPlaceholders(gStringVar4, gOtherText_ElevatedTo); - sub_806E834(gStringVar4, 1); - CreateTask(Task_RareCandy1, 5); - } -} - -void Task_RareCandy1(u8 taskId) -{ - if (WaitFanfare(0) && gUnknown_0202E8F6 == 0) - { - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - PlaySE(SE_SELECT); - PrintStatGrowthsInLevelUpWindow(taskId); - gTasks[taskId].func = Task_RareCandy2; - } - } -} - -void Task_RareCandy2(u8 taskId) -{ - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - PlaySE(SE_SELECT); - PrintNewStatsInLevelUpWindow(taskId); - gTasks[taskId].func = Task_RareCandy3; - } -} - -#if ENGLISH -void PrintStatGrowthsInLevelUpWindow(u8 taskId) -{ - u8 i; - - Menu_DrawStdWindowFrame(11, 0, 29, 7); - - for (i = 0; i < NUM_STATS; i++) - { - u8 x; - u8 y; - u32 stat; - - stat = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); - - ewram1B000.statGrowths[i + NUM_STATS] = stat; - ewram1B000.statGrowths[i] = stat - ewram1B000.statGrowths[i]; - - x = (i / 3) * 9 + 11; - y = ((i % 3) << 1) + 1; - - Menu_PrintTextPixelCoords(StatNames[i], (x + 1) * 8, y * 8, 1); - - if (i == 2) - Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); - else - Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); - - gStringVar1[0] = EXT_CTRL_CODE_BEGIN; - gStringVar1[1] = 0x14; - gStringVar1[2] = 0x06; - - ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[i], 1, 2); - - Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); - } -} -#elif GERMAN -__attribute__((naked)) -void PrintStatGrowthsInLevelUpWindow(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\ - movs r0, 0xB\n\ - movs r1, 0\n\ - movs r2, 0x1D\n\ - movs r3, 0x7\n\ - bl Menu_DrawStdWindowFrame\n\ - movs r7, 0\n\ - ldr r0, _0807092C @ =gStringVar1\n\ - mov r10, r0\n\ - movs r1, 0xFC\n\ - mov r9, r1\n\ - movs r2, 0x13\n\ - mov r8, r2\n\ -_0807086C:\n\ - ldr r1, _08070930 @ =gSharedMem + 0x1C000\n\ - ldr r0, [r1]\n\ - ldr r1, _08070934 @ =StatDataTypes\n\ - adds r1, r7, r1\n\ - ldrb r1, [r1]\n\ - bl GetMonData\n\ - adds r1, r7, 0x6\n\ - lsls r1, 1\n\ - ldr r2, _08070938 @ =gSharedMem + 0x1B264\n\ - adds r1, r2, r1\n\ - strh r0, [r1]\n\ - lsls r6, r7, 1\n\ - adds r6, r2, r6\n\ - ldrh r1, [r6]\n\ - subs r0, r1\n\ - strh r0, [r6]\n\ - adds r0, r7, 0\n\ - movs r1, 0x3\n\ - bl __udivsi3\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r4, r0, 3\n\ - adds r4, r0\n\ - adds r4, 0xB\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - adds r0, r7, 0\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - adds r5, r0, 0\n\ - lsls r5, 1\n\ - adds r5, 0x1\n\ - lsls r5, 24\n\ - lsrs r5, 24\n\ - ldr r1, _0807093C @ =StatNames\n\ - lsls r0, r7, 2\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - mov r0, r10\n\ - bl StringCopy\n\ - adds r2, r0, 0\n\ - mov r0, r9\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - mov r1, r8\n\ - strb r1, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0x2E\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - adds r0, r2, 0\n\ - ldr r1, _08070940 @ =gOtherText_TallPlusAndRightArrow\n\ - bl StringCopy\n\ - adds r2, r0, 0\n\ - mov r0, r9\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - mov r1, r8\n\ - strb r1, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0x34\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0\n\ - ldrsh r1, [r6, r0]\n\ - adds r0, r2, 0\n\ - movs r2, 0x1\n\ - movs r3, 0x2\n\ - bl ConvertIntToDecimalStringN\n\ - adds r4, 0x1\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - mov r0, r10\n\ - adds r1, r4, 0\n\ - adds r2, r5, 0\n\ - bl Menu_PrintText\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - cmp r7, 0x5\n\ - bls _0807086C\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\ - .align 2, 0\n\ -_0807092C: .4byte gStringVar1\n\ -_08070930: .4byte gSharedMem + 0x1C000\n\ -_08070934: .4byte StatDataTypes\n\ -_08070938: .4byte gSharedMem + 0x1B264\n\ -_0807093C: .4byte StatNames\n\ -_08070940: .4byte gOtherText_TallPlusAndRightArrow\n\ - .syntax divided\n"); -} -#endif - -void PrintNewStatsInLevelUpWindow(u8 taskId) -{ - u8 i; - - for (i = 0; i < NUM_STATS; i++) - { - u8 x; - u8 y; - u32 stat; - u32 newStatIndex; - - stat = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); - newStatIndex = i + 6; - ewram1B000.statGrowths[newStatIndex] = stat; - - x = ((i / 3) * 9) + 11; - y = ((i % 3) << 1) + 1; - - gStringVar1[0] = EXT_CTRL_CODE_BEGIN; - gStringVar1[1] = 0x14; - gStringVar1[2] = 0x06; - - ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[newStatIndex], 1, 3); - Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 6, y * 8, 0); - } -} - -void RedrawPokemonInfoInMenu(u8 monIndex, struct Pokemon *pokemon) -{ - u8 statusAndPkrs; - bool8 isDoubleBattle; - u16 currentHP; - u16 maxHP; - u8 icon; - - statusAndPkrs = GetMonStatusAndPokerus(pokemon); - if (statusAndPkrs == 0 || statusAndPkrs == 6) - { - PartyMenuUpdateLevelOrStatus(pokemon, monIndex); - } - - isDoubleBattle = IsDoubleBattle(); - - currentHP = GetMonData(pokemon, MON_DATA_HP); - maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); - - PartyMenuDoPrintHP(monIndex, isDoubleBattle, currentHP, maxHP); - PartyMenuTryDrawHPBar(monIndex, pokemon); - - icon = GetMonIconSpriteId(ewram1C000.unk4, monIndex); - SetMonIconAnim(icon, pokemon); - - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + monIndex * 2], 7); - ewram1B000.unk261 = 2; -} - -void Task_RareCandy3(u8 taskId) -{ - if (WaitFanfare(0)) - { - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - u16 learnedMove; - u16 evolutionSpecies; - - Menu_EraseWindowRect(11, 0, 29, 7); - - learnedMove = MonTryLearningNewMove(ewram1C000.pokemon, TRUE); - ewram1B000.unk282 = 1; - - switch (learnedMove) - { - case 0: - // No move is learned. - evolutionSpecies = GetEvolutionTargetSpecies(ewram1C000.pokemon, 0, 0); - if (evolutionSpecies != 0) - { - gCB2_AfterEvolution = sub_80A53F8; - BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5); - DestroyTask(taskId); - } - else - { - sub_8070D90(taskId); - } - break; - case 0xFFFF: - // Mon already knows 4 moves. - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); - - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - - ewram1C000.unk8 = gMoveToLearn; - gTasks[taskId].func = sub_806F358; - break; - case 0xFFFE: - // Move was already known by the mon. - gTasks[taskId].func = TeachMonMoveInPartyMenu; - break; - default: - // Mon automatically learned a move because it knew less than four moves. - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[learnedMove]); - - StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); - sub_806E834(gStringVar4, 1); - - gTasks[taskId].func = Task_TeamMonTMMove3; - break; - } - } - } -} - -void TeachMonMoveInPartyMenu(u8 taskId) -{ - u16 learnedMove; - u16 evolutionSpecies; - - learnedMove = MonTryLearningNewMove(ewram1C000.pokemon, FALSE); - switch (learnedMove) - { - case 0: - // No move is learned. - evolutionSpecies = GetEvolutionTargetSpecies(ewram1C000.pokemon, 0, 0); - if (evolutionSpecies != 0) - { - gCB2_AfterEvolution = sub_80A53F8; - BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5); - DestroyTask(taskId); - } - else - { - sub_8070D90(taskId); - } - break; - case 0xFFFF: - // Mon already knows 4 moves. - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); - - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - - ewram1C000.unk8 = gMoveToLearn; - gTasks[taskId].func = sub_806F358; - break; - case 0xFFFE: - // Move was already known by the mon. Go on the the next move to be learned. - TeachMonMoveInPartyMenu(taskId); - break; - default: - // Mon automatically learned a move because it knew less than four moves. - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[learnedMove]); - - StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); - sub_806E834(gStringVar4, 1); - - gTasks[taskId].func = Task_TeamMonTMMove3; - break; - } -} - -static void sub_8070D90(u8 taskId) -{ - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); -} - -void DoEvolutionStoneItemEffect(u8 taskId, u16 evolutionStoneItem, TaskFunc c) -{ - PlaySE(SE_SELECT); - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, evolutionStoneItem, c); - - gCB2_AfterEvolution = sub_80A53F8; - - if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, evolutionStoneItem, 0)) - { - gUnknown_0202E8F4 = 0; - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - - CreateTask(sub_806FB0C, 5); - } - else - { - RemoveBagItem(evolutionStoneItem, 1); - } -} - -#ifdef NONMATCHING -u8 GetItemEffectType(u16 item) -{ - const u8 *itemEffect; - register u8 itemEffect0 asm("r1"); - u8 mask; - - // Read the item's effect properties. - if (item == ITEM_ENIGMA_BERRY) - { - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - } - else - { - itemEffect = gItemEffectTable[item - ITEM_POTION]; - } - - itemEffect0 = itemEffect[0]; - mask = 0x3F; - - if ((itemEffect0 & mask) || itemEffect[1] || itemEffect[2] || (itemEffect[3] & 0x80)) - { - return 0; - } - else if (itemEffect0 & 0x40) - { - return 10; - } - else if (itemEffect[3] & 0x40) - { - return 1; - } - else if ((itemEffect[3] & mask) || (itemEffect0 >> 7)) - { - if ((itemEffect[3] & mask) == 0x20) - { - return 4; - } - else if ((itemEffect[3] & mask) == 0x10) - { - return 3; - } - else if ((itemEffect[3] & mask) == 0x8) - { - return 5; - } - else if ((itemEffect[3] & mask) == 0x4) - { - return 6; - } - else if ((itemEffect[3] & mask) == 0x2) - { - return 7; - } - else if ((itemEffect[3] & mask) == 0x1) - { - return 8; - } - else if ((itemEffect0 >> 7) != 0 && (itemEffect[3] & mask) == 0) - { - return 9; - } - else - { - return 11; - } - } - else if (itemEffect[4] & 0x44) - { - return 2; - } - else if (itemEffect[4] & 0x2) - { - return 12; - } - else if (itemEffect[4] & 0x1) - { - return 13; - } - else if (itemEffect[5] & 0x8) - { - return 14; - } - else if (itemEffect[5] & 0x4) - { - return 15; - } - else if (itemEffect[5] & 0x2) - { - return 16; - } - else if (itemEffect[5] & 0x1) - { - return 17; - } - else if (itemEffect[4] & 0x80) - { - return 18; - } - else if (itemEffect[4] & 0x20) - { - return 19; - } - else if (itemEffect[5] & 0x10) - { - return 20; - } - else if (itemEffect[4] & 0x18) - { - return 21; - } - else - { - return 22; - } -} -#else -__attribute__((naked)) -u8 GetItemEffectType(u16 item) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xAF\n\ - bne _08070E5C\n\ - ldr r4, _08070E58 @ =gSaveBlock1 + 0x3676\n\ - b _08070E66\n\ - .align 2, 0\n\ -_08070E58: .4byte gSaveBlock1 + 0x3676\n\ -_08070E5C:\n\ - ldr r1, _08070E8C @ =gItemEffectTable\n\ - subs r0, 0xD\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r4, [r0]\n\ -_08070E66:\n\ - ldrb r1, [r4]\n\ - movs r5, 0x3F\n\ - adds r0, r5, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08070E88\n\ - ldrb r0, [r4, 0x1]\n\ - cmp r0, 0\n\ - bne _08070E88\n\ - ldrb r0, [r4, 0x2]\n\ - cmp r0, 0\n\ - bne _08070E88\n\ - ldrb r3, [r4, 0x3]\n\ - movs r0, 0x80\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08070E90\n\ -_08070E88:\n\ - movs r0, 0\n\ - b _08070F8A\n\ - .align 2, 0\n\ -_08070E8C: .4byte gItemEffectTable\n\ -_08070E90:\n\ - movs r2, 0x40\n\ - adds r0, r2, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08070E9E\n\ - movs r0, 0xA\n\ - b _08070F8A\n\ -_08070E9E:\n\ - adds r0, r2, 0\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08070EAA\n\ - movs r0, 0x1\n\ - b _08070F8A\n\ -_08070EAA:\n\ - adds r2, r5, 0\n\ - ands r2, r3\n\ - cmp r2, 0\n\ - bne _08070EB8\n\ - lsrs r0, r1, 7\n\ - cmp r0, 0\n\ - beq _08070EFA\n\ -_08070EB8:\n\ - cmp r2, 0x20\n\ - bne _08070EC0\n\ - movs r0, 0x4\n\ - b _08070F8A\n\ -_08070EC0:\n\ - cmp r2, 0x10\n\ - bne _08070EC8\n\ - movs r0, 0x3\n\ - b _08070F8A\n\ -_08070EC8:\n\ - cmp r2, 0x8\n\ - bne _08070ED0\n\ - movs r0, 0x5\n\ - b _08070F8A\n\ -_08070ED0:\n\ - cmp r2, 0x4\n\ - bne _08070ED8\n\ - movs r0, 0x6\n\ - b _08070F8A\n\ -_08070ED8:\n\ - cmp r2, 0x2\n\ - bne _08070EE0\n\ - movs r0, 0x7\n\ - b _08070F8A\n\ -_08070EE0:\n\ - cmp r2, 0x1\n\ - bne _08070EE8\n\ - movs r0, 0x8\n\ - b _08070F8A\n\ -_08070EE8:\n\ - lsrs r0, r1, 7\n\ - cmp r0, 0\n\ - beq _08070EF6\n\ - cmp r2, 0\n\ - bne _08070EF6\n\ - movs r0, 0x9\n\ - b _08070F8A\n\ -_08070EF6:\n\ - movs r0, 0xB\n\ - b _08070F8A\n\ -_08070EFA:\n\ - ldrb r1, [r4, 0x4]\n\ - movs r0, 0x44\n\ - ands r0, r1\n\ - adds r2, r1, 0\n\ - cmp r0, 0\n\ - beq _08070F0A\n\ - movs r0, 0x2\n\ - b _08070F8A\n\ -_08070F0A:\n\ - movs r5, 0x2\n\ - adds r0, r5, 0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08070F18\n\ - movs r0, 0xC\n\ - b _08070F8A\n\ -_08070F18:\n\ - movs r3, 0x1\n\ - adds r0, r3, 0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08070F26\n\ - movs r0, 0xD\n\ - b _08070F8A\n\ -_08070F26:\n\ - ldrb r1, [r4, 0x5]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08070F34\n\ - movs r0, 0xE\n\ - b _08070F8A\n\ -_08070F34:\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08070F40\n\ - movs r0, 0xF\n\ - b _08070F8A\n\ -_08070F40:\n\ - adds r0, r5, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08070F4C\n\ - movs r0, 0x10\n\ - b _08070F8A\n\ -_08070F4C:\n\ - adds r0, r3, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08070F58\n\ - movs r0, 0x11\n\ - b _08070F8A\n\ -_08070F58:\n\ - movs r0, 0x80\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08070F64\n\ - movs r0, 0x12\n\ - b _08070F8A\n\ -_08070F64:\n\ - movs r0, 0x20\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08070F70\n\ - movs r0, 0x13\n\ - b _08070F8A\n\ -_08070F70:\n\ - movs r0, 0x10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08070F7C\n\ - movs r0, 0x14\n\ - b _08070F8A\n\ -_08070F7C:\n\ - movs r0, 0x18\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _08070F88\n\ - movs r0, 0x16\n\ - b _08070F8A\n\ -_08070F88:\n\ - movs r0, 0x15\n\ -_08070F8A:\n\ - pop {r4,r5}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -void unref_sub_8070F90(void) -{ - FlagSet(FLAG_SYS_POKEDEX_GET); - FlagSet(FLAG_SYS_POKEMON_GET); - FlagSet(FLAG_SYS_POKENAV_GET); -} |