#include "global.h" #include "gflib.h" #include "data.h" #include "item.h" #include "mail_data.h" #include "pokemon_storage_system_internal.h" #include "pokemon_summary_screen.h" #include "strings.h" #include "constants/items.h" #include "constants/moves.h" static EWRAM_DATA struct Pokemon sMonBeingCarried = {}; static EWRAM_DATA s8 sBoxCursorArea = 0; static EWRAM_DATA s8 sBoxCursorPosition = 0; static EWRAM_DATA bool8 sIsMonBeingMoved = FALSE; static EWRAM_DATA u8 sMovingMonOrigBoxId = 0; static EWRAM_DATA u8 sMovingMonOrigBoxPos = 0; static EWRAM_DATA bool8 sCanOnlyMove = FALSE; static EWRAM_DATA u8 gUnknown_2039826 = 0; static void sub_80929B0(void); static bool8 MonPlaceChange_Move(void); static bool8 MonPlaceChange_Place(void); static bool8 MonPlaceChange_Shift(void); static bool8 sub_8092E00(void); static bool8 sub_8092E10(void); static bool8 sub_8092E20(void); static bool8 sub_8092E54(void); static void MoveMon(void); static void PlaceMon(void); static void SetMovedMonData(u8 boxId, u8 cursorPos); static void SetPlacedMonData(u8 boxId, u8 cursorPos); static void PurgeMonOrBoxMon(u8 boxId, u8 cursorPos); static void SetShiftedMonData(u8 boxId, u8 cursorPos); static void sub_8093A10(void); static void SetCursorMonData(void * cursorMon, u8 mode); static void sub_8093AAC(void); static u8 InBoxInput_Normal(void); static u8 InBoxInput_GrabbingMultiple(void); static u8 InBoxInput_MovingMultiple(void); static void AddBoxMenu(void); static bool8 sub_8094924(void); static bool8 sub_809494C(void); static bool8 sub_8094A0C(void); static void sub_8094AD8(void); static void sub_8094C84(void); static const u16 sHandCursorPalette[] = INCBIN_U16("graphics/interface/pss_unk_83D2BCC.gbapal"); static const u16 sHandCursorTiles[] = INCBIN_U16("graphics/interface/pss_unk_83D2BEC.4bpp"); static const u16 sHandCursorShadowTiles[] = INCBIN_U16("graphics/interface/pss_unk_83D33EC.4bpp"); void sub_80922C0(void) { if (gPSSData->boxOption != BOX_OPTION_DEPOSIT) sBoxCursorArea = CURSOR_AREA_IN_BOX; else sBoxCursorArea = CURSOR_AREA_IN_PARTY; sBoxCursorPosition = 0; sIsMonBeingMoved = FALSE; sMovingMonOrigBoxId = 0; sMovingMonOrigBoxPos = 0; sCanOnlyMove = FALSE; sub_8092B50(); sub_8094AD8(); gPSSData->field_CD6 = 1; gPSSData->inBoxMovingMode = 0; sub_8093A10(); } void sub_8092340(void) { sub_8094AD8(); sub_8093AAC(); gPSSData->field_CD6 = 1; gPSSData->inBoxMovingMode = 0; if (sIsMonBeingMoved) { gPSSData->movingMon = sMonBeingCarried; CreateMovingMonIcon(); } } static void sub_8092398(u8 cursorArea, u8 cursorPosition, u16 *x, u16 *y) { switch (cursorArea) { case CURSOR_AREA_IN_BOX: *x = (cursorPosition % IN_BOX_ROWS) * 24 + 100; *y = (cursorPosition / IN_BOX_ROWS) * 24 + 32; break; case CURSOR_AREA_IN_PARTY: if (cursorPosition == 0) { *x = 0x68; *y = 0x34; } else if (cursorPosition == PARTY_SIZE) { *x = 0x98; *y = 0x84; } else { *x = 0x98; *y = (cursorPosition - 1) * 24 + 4; } break; case CURSOR_AREA_BOX: *x = 0xa2; *y = 0x0c; break; case CURSOR_AREA_BUTTONS: *y = sIsMonBeingMoved ? 8 : 14; *x = cursorPosition * 0x58 + 0x78; break; case 4: *x = 0xa0; *y = 0x60; break; } } static u16 sub_8092458(void) { switch (sBoxCursorArea) { case CURSOR_AREA_IN_PARTY: return GetMonData(&gPlayerParty[sBoxCursorPosition], MON_DATA_SPECIES); case CURSOR_AREA_IN_BOX: return GetCurrentBoxMonData(sBoxCursorPosition, MON_DATA_SPECIES); default: return SPECIES_NONE; } } bool8 sub_80924A8(void) { s16 tmp; if (gPSSData->field_CD0 == 0) { if (gPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) return FALSE; else return sub_809610C(); } else if (--gPSSData->field_CD0 != 0) { gPSSData->field_CBC += gPSSData->field_CC4; gPSSData->field_CC0 += gPSSData->field_CC8; gPSSData->field_CB4->x = gPSSData->field_CBC >> 8; gPSSData->field_CB4->y = gPSSData->field_CC0 >> 8; if (gPSSData->field_CB4->x > 0x100) { tmp = gPSSData->field_CB4->x - 0x100; gPSSData->field_CB4->x = tmp + 0x40; } if (gPSSData->field_CB4->x < 0x40) { tmp = 0x40 - gPSSData->field_CB4->x; gPSSData->field_CB4->x = 0x100 - tmp; } if (gPSSData->field_CB4->y > 0xb0) { tmp = gPSSData->field_CB4->y - 0xb0; gPSSData->field_CB4->y = tmp - 0x10; } if (gPSSData->field_CB4->y < -0x10) { tmp = -0x10 - gPSSData->field_CB4->y; gPSSData->field_CB4->y = 0xb0 - tmp; } if (gPSSData->field_CD7 && --gPSSData->field_CD7 == 0) gPSSData->field_CB4->vFlip = (gPSSData->field_CB4->vFlip == FALSE); } else { gPSSData->field_CB4->x = gPSSData->field_CCC; gPSSData->field_CB4->y = gPSSData->field_CCE; sub_80929B0(); } return TRUE; } static void sub_8092604(u8 newCurosrArea, u8 newCursorPosition) { u16 x, y; sub_8092398(newCurosrArea, newCursorPosition, &x, &y); gPSSData->field_CD4 = newCurosrArea; gPSSData->field_CD5 = newCursorPosition; gPSSData->field_CCC = x; gPSSData->field_CCE = y; } static void sub_8092660(void) { int r7, r0; if (gPSSData->field_CD2 != 0 || gPSSData->field_CD3 != 0) gPSSData->field_CD0 = 12; else gPSSData->field_CD0 = 6; if (gPSSData->field_CD7) gPSSData->field_CD7 = gPSSData->field_CD0 >> 1; switch (gPSSData->field_CD2) { default: r7 = gPSSData->field_CCE - gPSSData->field_CB4->y; break; case -1: r7 = gPSSData->field_CCE - 0xc0 - gPSSData->field_CB4->y; break; case 1: r7 = gPSSData->field_CCE + 0xc0 - gPSSData->field_CB4->y; break; } switch (gPSSData->field_CD3) { default: r0 = gPSSData->field_CCC - gPSSData->field_CB4->x; break; case -1: r0 = gPSSData->field_CCC - 0xc0 - gPSSData->field_CB4->x; break; case 1: r0 = gPSSData->field_CCC + 0xc0 - gPSSData->field_CB4->x; break; } r7 <<= 8; r0 <<= 8; gPSSData->field_CC4 = r0 / gPSSData->field_CD0; gPSSData->field_CC8 = r7 / gPSSData->field_CD0; gPSSData->field_CBC = gPSSData->field_CB4->x << 8; gPSSData->field_CC0 = gPSSData->field_CB4->y << 8; } static void sub_80927E8(u8 newCurosrArea, u8 newCursorPosition) { sub_8092604(newCurosrArea, newCursorPosition); sub_8092660(); if (gPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) { if (gPSSData->inBoxMovingMode == 0 && !sIsMonBeingMoved) StartSpriteAnim(gPSSData->field_CB4, 1); } else { if (!IsActiveItemMoving()) StartSpriteAnim(gPSSData->field_CB4, 1); } if (gPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) { if (sBoxCursorArea == CURSOR_AREA_IN_BOX) sub_8095D44(CURSOR_AREA_IN_BOX, sBoxCursorPosition); else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) sub_8095D44(CURSOR_AREA_IN_PARTY, sBoxCursorPosition); if (newCurosrArea == CURSOR_AREA_IN_BOX) sub_8095C84(newCurosrArea, newCursorPosition); else if (newCurosrArea == CURSOR_AREA_IN_PARTY) sub_8095C84(newCurosrArea, newCursorPosition); } if (newCurosrArea == CURSOR_AREA_IN_PARTY && sBoxCursorArea != CURSOR_AREA_IN_PARTY) { gPSSData->field_CD6 = newCurosrArea; gPSSData->field_CB8->invisible = TRUE; } switch (newCurosrArea) { case CURSOR_AREA_IN_PARTY: case CURSOR_AREA_BOX: case CURSOR_AREA_BUTTONS: gPSSData->field_CB4->oam.priority = 1; gPSSData->field_CB8->invisible = TRUE; gPSSData->field_CB8->oam.priority = 1; break; case CURSOR_AREA_IN_BOX: if (gPSSData->inBoxMovingMode != 0) { gPSSData->field_CB4->oam.priority = 0; gPSSData->field_CB8->invisible = TRUE; } else { gPSSData->field_CB4->oam.priority = 2; if (sBoxCursorArea == CURSOR_AREA_IN_BOX && sIsMonBeingMoved) SetMovingMonPriority(2); } break; } } static void sub_80929B0(void) { sBoxCursorArea = gPSSData->field_CD4; sBoxCursorPosition = gPSSData->field_CD5; if (gPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) { if (gPSSData->inBoxMovingMode == 0 && !sIsMonBeingMoved) StartSpriteAnim(gPSSData->field_CB4, 1); } else { if (!IsActiveItemMoving()) StartSpriteAnim(gPSSData->field_CB4, 1); } sub_8093A10(); switch (sBoxCursorArea) { case CURSOR_AREA_BUTTONS: SetMovingMonPriority(1); break; case CURSOR_AREA_BOX: sub_80920FC(TRUE); break; case CURSOR_AREA_IN_PARTY: gPSSData->field_CB8->subpriority = 13; SetMovingMonPriority(1); break; case CURSOR_AREA_IN_BOX: if (gPSSData->inBoxMovingMode == 0) { gPSSData->field_CB4->oam.priority = 1; gPSSData->field_CB8->oam.priority = 2; gPSSData->field_CB8->subpriority = 21; gPSSData->field_CB8->invisible = FALSE; SetMovingMonPriority(2); } break; } } void sub_8092AE4(void) { u8 partyCount; if (!sIsMonBeingMoved) { partyCount = 0; } else { partyCount = CalculatePlayerPartyCount(); if (partyCount >= PARTY_SIZE) partyCount = PARTY_SIZE - 1; } if (gPSSData->field_CB4->vFlip) gPSSData->field_CD7 = 1; sub_80927E8(CURSOR_AREA_IN_PARTY, partyCount); } void sub_8092B3C(u8 cursorBoxPosition) { sub_80927E8(CURSOR_AREA_IN_BOX, cursorBoxPosition); } void sub_8092B50(void) { gUnknown_2039826 = 0; } void sub_8092B5C(void) { gUnknown_2039826 = sBoxCursorPosition; } u8 sub_8092B70(void) { return gUnknown_2039826; } void InitMonPlaceChange(u8 a0) { static bool8 (*const placeChangeFuncs[])(void) = { MonPlaceChange_Move, MonPlaceChange_Place, MonPlaceChange_Shift, }; gPSSData->monPlaceChangeFunc = placeChangeFuncs[a0]; gPSSData->monPlaceChangeState = 0; } void sub_8092BAC(bool8 arg0) { if (!arg0) gPSSData->monPlaceChangeFunc = sub_8092E00; else gPSSData->monPlaceChangeFunc = sub_8092E10; gPSSData->monPlaceChangeState = 0; } bool8 DoMonPlaceChange(void) { return gPSSData->monPlaceChangeFunc(); } static bool8 MonPlaceChange_Move(void) { switch (gPSSData->monPlaceChangeState) { case 0: if (sIsMonBeingMoved) return FALSE; StartSpriteAnim(gPSSData->field_CB4, 2); gPSSData->monPlaceChangeState++; break; case 1: if (!sub_8092E20()) { StartSpriteAnim(gPSSData->field_CB4, 3); MoveMon(); gPSSData->monPlaceChangeState++; } break; case 2: if (!sub_8092E54()) gPSSData->monPlaceChangeState++; break; case 3: return FALSE; } return TRUE; } static bool8 MonPlaceChange_Place(void) { switch (gPSSData->monPlaceChangeState) { case 0: if (!sub_8092E20()) { StartSpriteAnim(gPSSData->field_CB4, 2); PlaceMon(); gPSSData->monPlaceChangeState++; } break; case 1: if (!sub_8092E54()) { StartSpriteAnim(gPSSData->field_CB4, 0); gPSSData->monPlaceChangeState++; } break; case 2: return FALSE; } return TRUE; } static bool8 MonPlaceChange_Shift(void) { switch (gPSSData->monPlaceChangeState) { case 0: switch (sBoxCursorArea) { case CURSOR_AREA_IN_PARTY: gPSSData->field_D91 = TOTAL_BOXES_COUNT; break; case CURSOR_AREA_IN_BOX: gPSSData->field_D91 = StorageGetCurrentBox(); break; default: return FALSE; } StartSpriteAnim(gPSSData->field_CB4, 2); sub_8090E08(gPSSData->field_D91, sBoxCursorPosition); gPSSData->monPlaceChangeState++; break; case 1: if (!sub_8090E74()) { StartSpriteAnim(gPSSData->field_CB4, 3); SetShiftedMonData(gPSSData->field_D91, sBoxCursorPosition); gPSSData->monPlaceChangeState++; } break; case 2: return FALSE; } return TRUE; } static bool8 sub_8092E00(void) { return sub_8092E20(); } static bool8 sub_8092E10(void) { return sub_8092E54(); } static bool8 sub_8092E20(void) { switch (gPSSData->field_CB4->y2) { default: gPSSData->field_CB4->y2++; break; case 0: gPSSData->field_CB4->y2++; break; case 8: return FALSE; } return TRUE; } static bool8 sub_8092E54(void) { switch (gPSSData->field_CB4->y2) { case 0: return FALSE; default: gPSSData->field_CB4->y2--; break; } return TRUE; } static void MoveMon(void) { switch (sBoxCursorArea) { case CURSOR_AREA_IN_PARTY: SetMovedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition); sub_8090CC0(MODE_PARTY, sBoxCursorPosition); break; case CURSOR_AREA_IN_BOX: if (gPSSData->inBoxMovingMode == 0) { SetMovedMonData(StorageGetCurrentBox(), sBoxCursorPosition); sub_8090CC0(MODE_BOX, sBoxCursorPosition); } break; default: return; } sIsMonBeingMoved = TRUE; } static void PlaceMon(void) { u8 boxId; switch (sBoxCursorArea) { case CURSOR_AREA_IN_PARTY: SetPlacedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition); sub_8090D58(TOTAL_BOXES_COUNT, sBoxCursorPosition); break; case CURSOR_AREA_IN_BOX: boxId = StorageGetCurrentBox(); SetPlacedMonData(boxId, sBoxCursorPosition); sub_8090D58(boxId, sBoxCursorPosition); break; default: return; } sIsMonBeingMoved = FALSE; } void sub_8092F54(void) { sub_8093A10(); } static void SetMovedMonData(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) gPSSData->movingMon = gPlayerParty[sBoxCursorPosition]; else BoxMonAtToMon(boxId, position, &gPSSData->movingMon); PurgeMonOrBoxMon(boxId, position); sMovingMonOrigBoxId = boxId; sMovingMonOrigBoxPos = position; } static void SetPlacedMonData(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) { gPlayerParty[position] = gPSSData->movingMon; } else { BoxMonRestorePP(&gPSSData->movingMon.box); SetBoxMonAt(boxId, position, &gPSSData->movingMon.box); } } static void PurgeMonOrBoxMon(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) ZeroMonData(&gPlayerParty[position]); else ZeroBoxMonAt(boxId, position); } static void SetShiftedMonData(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) gPSSData->field_2108 = gPlayerParty[position]; else BoxMonAtToMon(boxId, position, &gPSSData->field_2108); SetPlacedMonData(boxId, position); gPSSData->movingMon = gPSSData->field_2108; SetCursorMonData(&gPSSData->movingMon, MODE_PARTY); sMovingMonOrigBoxId = boxId; sMovingMonOrigBoxPos = position; } bool8 TryStorePartyMonInBox(u8 boxId) { s16 boxPosition = GetFirstFreeBoxSpot(boxId); if (boxPosition == -1) return FALSE; if (sIsMonBeingMoved) { SetPlacedMonData(boxId, boxPosition); DestroyMovingMonIcon(); sIsMonBeingMoved = FALSE; } else { SetMovedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition); SetPlacedMonData(boxId, boxPosition); DestroyPartyMonIcon(sBoxCursorPosition); } if (boxId == StorageGetCurrentBox()) sub_80901EC(boxPosition); StartSpriteAnim(gPSSData->field_CB4, 1); return TRUE; } void sub_8093174(void) { StartSpriteAnim(gPSSData->field_CB4, 0); sub_8093A10(); } void sub_8093194(void) { u8 mode; if (sIsMonBeingMoved) mode = MODE_2; else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) mode = MODE_PARTY; else mode = MODE_BOX; sub_8090FC4(mode, sBoxCursorPosition); StringCopy(gPSSData->field_21E0, gPSSData->cursorMonNick); } bool8 sub_80931EC(void) { if (!sub_8091084()) { StartSpriteAnim(gPSSData->field_CB4, 0); return FALSE; } else { return TRUE; } } void ReleaseMon(void) { u8 boxId; sub_80910CC(); if (sIsMonBeingMoved) { sIsMonBeingMoved = FALSE; } else { if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) boxId = TOTAL_BOXES_COUNT; else boxId = StorageGetCurrentBox(); PurgeMonOrBoxMon(boxId, sBoxCursorPosition); } sub_8093A10(); } void sub_8093264(void) { if (sIsMonBeingMoved) StartSpriteAnim(gPSSData->field_CB4, 3); } void InitCanReleaseMonVars(void) { u16 knownIdx; if (sIsMonBeingMoved) { gPSSData->field_2108 = gPSSData->movingMon; gPSSData->field_2170 = -1; gPSSData->field_2171 = -1; } else { if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) { gPSSData->field_2108 = gPlayerParty[sBoxCursorPosition]; gPSSData->field_2170 = TOTAL_BOXES_COUNT; } else { BoxMonAtToMon(StorageGetCurrentBox(), sBoxCursorPosition, &gPSSData->field_2108); gPSSData->field_2170 = StorageGetCurrentBox(); } gPSSData->field_2171 = sBoxCursorPosition; } gPSSData->isSurfMon = FALSE; gPSSData->isDiveMon = FALSE; gPSSData->field_2176[0] = MOVE_SURF; gPSSData->field_2176[1] = MOVE_DIVE; gPSSData->field_2176[2] = MOVES_COUNT; knownIdx = GetMonData(&gPSSData->field_2108, MON_DATA_KNOWN_MOVES, (u8*)gPSSData->field_2176); gPSSData->isSurfMon = knownIdx & 1; gPSSData->isDiveMon = (knownIdx >> 1) & 1; if (gPSSData->isSurfMon || gPSSData->isDiveMon) { gPSSData->field_216D = 0; } else { gPSSData->field_216D = 1; gPSSData->field_216C = 1; } gPSSData->field_2172 = 0; } s8 RunCanReleaseMon(void) { u16 i; u16 knownMoves; if (gPSSData->field_216D) return gPSSData->field_216C; switch (gPSSData->field_2172) { case 0: for (i = 0; i < PARTY_SIZE; i++) { if (gPSSData->field_2170 != TOTAL_BOXES_COUNT || gPSSData->field_2171 != i) { knownMoves = GetMonData(gPlayerParty + i, MON_DATA_KNOWN_MOVES, (u8*)gPSSData->field_2176); if (knownMoves & 1) gPSSData->isSurfMon = FALSE; if (knownMoves & 2) gPSSData->isDiveMon = FALSE; } } if (!(gPSSData->isSurfMon || gPSSData->isDiveMon)) { gPSSData->field_216D = 1; gPSSData->field_216C = 1; } else { gPSSData->field_216E = 0; gPSSData->field_216F = 0; gPSSData->field_2172++; } break; case 1: for (i = 0; i < 5; i++) { knownMoves = GetAndCopyBoxMonDataAt(gPSSData->field_216E, gPSSData->field_216F, MON_DATA_KNOWN_MOVES, (u8*)gPSSData->field_2176); if (knownMoves != 0 && !(gPSSData->field_2170 == gPSSData->field_216E && gPSSData->field_2171 == gPSSData->field_216F)) { if (knownMoves & 1) gPSSData->isSurfMon = FALSE; if (knownMoves & 2) gPSSData->isDiveMon = FALSE; } if (++gPSSData->field_216F >= IN_BOX_COUNT) { gPSSData->field_216F = 0; if (++gPSSData->field_216E >= TOTAL_BOXES_COUNT) { gPSSData->field_216D = 1; gPSSData->field_216C = 0; break; } } } if (!(gPSSData->isSurfMon || gPSSData->isDiveMon)) { gPSSData->field_216D = 1; gPSSData->field_216C = 1; } break; } return -1; } void sub_8093630(void) { if (sIsMonBeingMoved) sMonBeingCarried = gPSSData->movingMon; } void sub_8093660(void) { if (sIsMonBeingMoved) { if (sMovingMonOrigBoxId == TOTAL_BOXES_COUNT) gPSSData->movingMon = sMonBeingCarried; else gPSSData->movingMon.box = sMonBeingCarried.box; } } void sub_80936B8(void) { if (sIsMonBeingMoved) { sub_8093630(); gPSSData->field_218C.mon = &sMonBeingCarried; gPSSData->field_2187 = 0; gPSSData->field_2186 = 0; gPSSData->summaryScreenMode = PSS_MODE_NORMAL; } else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) { gPSSData->field_218C.mon = gPlayerParty; gPSSData->field_2187 = sBoxCursorPosition; gPSSData->field_2186 = CountPartyMons() - 1; gPSSData->summaryScreenMode = PSS_MODE_NORMAL; } else { gPSSData->field_218C.box = GetBoxedMonPtr(StorageGetCurrentBox(), 0); gPSSData->field_2187 = sBoxCursorPosition; gPSSData->field_2186 = IN_BOX_COUNT - 1; gPSSData->summaryScreenMode = PSS_MODE_BOX; } } void sub_80937B4(void) { if (sIsMonBeingMoved) sub_8093660(); else sBoxCursorPosition = GetLastViewedMonIndex(); } // file boundary maybe? s16 CompactPartySlots(void) { s16 retVal = -1; u16 i, last; for (i = 0, last = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES); if (species != SPECIES_NONE) { if (i != last) gPlayerParty[last] = gPlayerParty[i]; last++; } else if (retVal == -1) { retVal = i; } } for (; last < PARTY_SIZE; last++) ZeroMonData(gPlayerParty + last); return retVal; } void SetMonMarkings(u8 markings) { gPSSData->cursorMonMarkings = markings; if (sIsMonBeingMoved) { SetMonData(&gPSSData->movingMon, MON_DATA_MARKINGS, &markings); } else { if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) SetMonData(gPlayerParty + sBoxCursorPosition, MON_DATA_MARKINGS, &markings); if (sBoxCursorArea == CURSOR_AREA_IN_BOX) SetCurrentBoxMonData(sBoxCursorPosition, MON_DATA_MARKINGS, &markings); } } bool8 CanMovePartyMon(void) { if (sBoxCursorArea == CURSOR_AREA_IN_PARTY && !sIsMonBeingMoved && CountPartyAliveNonEggMonsExcept(sBoxCursorPosition) == 0) return TRUE; else return FALSE; } bool8 CanShiftMon(void) { if (sIsMonBeingMoved) { if (sBoxCursorArea == CURSOR_AREA_IN_PARTY && CountPartyAliveNonEggMonsExcept(sBoxCursorPosition) == 0) { if (gPSSData->cursorMonIsEgg || GetMonData(&gPSSData->movingMon, MON_DATA_HP) == 0) return FALSE; } return TRUE; } return FALSE; } bool8 IsMonBeingMoved(void) { return sIsMonBeingMoved; } bool8 IsCursorOnBox(void) { return (sBoxCursorArea == CURSOR_AREA_BOX); } bool8 IsCursorOnCloseBox(void) { return (sBoxCursorArea == CURSOR_AREA_BUTTONS && sBoxCursorPosition == 1); } bool8 IsCursorInBox(void) { return (sBoxCursorArea == CURSOR_AREA_IN_BOX); } static void sub_8093A10(void) { gPSSData->setMosaic = (sIsMonBeingMoved == FALSE); if (!sIsMonBeingMoved) { switch (sBoxCursorArea) { case CURSOR_AREA_IN_PARTY: if (sBoxCursorPosition < PARTY_SIZE) { SetCursorMonData(&gPlayerParty[sBoxCursorPosition], MODE_PARTY); break; } // fallthrough case CURSOR_AREA_BUTTONS: case CURSOR_AREA_BOX: SetCursorMonData(NULL, MODE_2); break; case CURSOR_AREA_IN_BOX: SetCursorMonData(GetBoxedMonPtr(StorageGetCurrentBox(), sBoxCursorPosition), MODE_BOX); break; } } } static void sub_8093AAC(void) { if (sIsMonBeingMoved) SetCursorMonData(&sMonBeingCarried, MODE_PARTY); else sub_8093A10(); } static void SetCursorMonData(void *pokemon, u8 mode) { u8 *txtPtr; u16 gender; bool8 sanityIsBagEgg; gPSSData->cursorMonItem = 0; gender = MON_MALE; sanityIsBagEgg = FALSE; if (mode == MODE_PARTY) { struct Pokemon *mon = (struct Pokemon *)pokemon; gPSSData->cursorMonSpecies = GetMonData(mon, MON_DATA_SPECIES2); if (gPSSData->cursorMonSpecies != SPECIES_NONE) { sanityIsBagEgg = GetMonData(mon, MON_DATA_SANITY_IS_BAD_EGG); if (sanityIsBagEgg) gPSSData->cursorMonIsEgg = TRUE; else gPSSData->cursorMonIsEgg = GetMonData(mon, MON_DATA_IS_EGG); GetMonData(mon, MON_DATA_NICKNAME, gPSSData->cursorMonNick); StringGetEnd10(gPSSData->cursorMonNick); gPSSData->cursorMonLevel = GetMonData(mon, MON_DATA_LEVEL); gPSSData->cursorMonMarkings = GetMonData(mon, MON_DATA_MARKINGS); gPSSData->cursorMonPersonality = GetMonData(mon, MON_DATA_PERSONALITY); gPSSData->cursorMonPalette = GetMonFrontSpritePal(mon); gender = GetMonGender(mon); gPSSData->cursorMonItem = GetMonData(mon, MON_DATA_HELD_ITEM); } } else if (mode == MODE_BOX) { struct BoxPokemon *boxMon = (struct BoxPokemon *)pokemon; gPSSData->cursorMonSpecies = GetBoxMonData(pokemon, MON_DATA_SPECIES2); if (gPSSData->cursorMonSpecies != SPECIES_NONE) { u32 otId = GetBoxMonData(boxMon, MON_DATA_OT_ID); sanityIsBagEgg = GetBoxMonData(boxMon, MON_DATA_SANITY_IS_BAD_EGG); if (sanityIsBagEgg) gPSSData->cursorMonIsEgg = TRUE; else gPSSData->cursorMonIsEgg = GetBoxMonData(boxMon, MON_DATA_IS_EGG); GetBoxMonData(boxMon, MON_DATA_NICKNAME, gPSSData->cursorMonNick); StringGetEnd10(gPSSData->cursorMonNick); gPSSData->cursorMonLevel = GetLevelFromBoxMonExp(boxMon); gPSSData->cursorMonMarkings = GetBoxMonData(boxMon, MON_DATA_MARKINGS); gPSSData->cursorMonPersonality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY); gPSSData->cursorMonPalette = GetMonSpritePalFromSpeciesAndPersonality(gPSSData->cursorMonSpecies, otId, gPSSData->cursorMonPersonality); gender = GetGenderFromSpeciesAndPersonality(gPSSData->cursorMonSpecies, gPSSData->cursorMonPersonality); gPSSData->cursorMonItem = GetBoxMonData(boxMon, MON_DATA_HELD_ITEM); } } else { gPSSData->cursorMonSpecies = SPECIES_NONE; gPSSData->cursorMonItem = 0; } if (gPSSData->cursorMonSpecies == SPECIES_NONE) { StringFill(gPSSData->cursorMonNick, CHAR_SPACE, 5); StringFill(gPSSData->cursorMonTexts[0], CHAR_SPACE, 8); StringFill(gPSSData->cursorMonTexts[1], CHAR_SPACE, 8); StringFill(gPSSData->cursorMonTexts[2], CHAR_SPACE, 8); StringFill(gPSSData->cursorMonTexts[3], CHAR_SPACE, 8); } else if (gPSSData->cursorMonIsEgg) { if (sanityIsBagEgg) StringCopyPadded(gPSSData->cursorMonTexts[0], gPSSData->cursorMonNick, CHAR_SPACE, 5); else StringCopyPadded(gPSSData->cursorMonTexts[0], gText_EggNickname, CHAR_SPACE, 8); StringFill(gPSSData->cursorMonTexts[1], CHAR_SPACE, 8); StringFill(gPSSData->cursorMonTexts[2], CHAR_SPACE, 8); StringFill(gPSSData->cursorMonTexts[3], CHAR_SPACE, 8); } else { if (gPSSData->cursorMonSpecies == SPECIES_NIDORAN_F || gPSSData->cursorMonSpecies == SPECIES_NIDORAN_M) gender = MON_GENDERLESS; StringCopyPadded(gPSSData->cursorMonTexts[0], gPSSData->cursorMonNick, CHAR_SPACE, 5); txtPtr = gPSSData->cursorMonTexts[1]; *(txtPtr)++ = CHAR_SLASH; StringCopyPadded(txtPtr, gSpeciesNames[gPSSData->cursorMonSpecies], CHAR_SPACE, 5); txtPtr = gPSSData->cursorMonTexts[2]; *(txtPtr)++ = EXT_CTRL_CODE_BEGIN; *(txtPtr)++ = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW; switch (gender) { case MON_MALE: *(txtPtr)++ = TEXT_COLOR_RED; *(txtPtr)++ = TEXT_COLOR_WHITE; *(txtPtr)++ = TEXT_COLOR_LIGHT_RED; *(txtPtr)++ = CHAR_MALE; break; case MON_FEMALE: *(txtPtr)++ = TEXT_COLOR_GREEN; *(txtPtr)++ = TEXT_COLOR_WHITE; *(txtPtr)++ = TEXT_COLOR_LIGHT_GREEN; *(txtPtr)++ = CHAR_FEMALE; break; default: *(txtPtr)++ = TEXT_COLOR_DARK_GRAY; *(txtPtr)++ = TEXT_COLOR_WHITE; *(txtPtr)++ = TEXT_COLOR_LIGHT_GRAY; *(txtPtr)++ = CHAR_SPACE; break; } *(txtPtr++) = EXT_CTRL_CODE_BEGIN; *(txtPtr++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW; *(txtPtr++) = TEXT_COLOR_DARK_GRAY; *(txtPtr++) = TEXT_COLOR_WHITE; *(txtPtr++) = TEXT_COLOR_LIGHT_GRAY; *(txtPtr++) = CHAR_SPACE; *(txtPtr++) = CHAR_EXTRA_EMOJI; *(txtPtr++) = 5; // LV_2 txtPtr = ConvertIntToDecimalStringN(txtPtr, gPSSData->cursorMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3); txtPtr[0] = CHAR_SPACE; txtPtr[1] = EOS; if (gPSSData->cursorMonItem != 0) StringCopyPadded(gPSSData->cursorMonTexts[3], ItemId_GetName(gPSSData->cursorMonItem), CHAR_SPACE, 8); else StringFill(gPSSData->cursorMonTexts[3], CHAR_SPACE, 8); } } static u8 HandleInput_InBox(void) { switch (gPSSData->inBoxMovingMode) { case 0: default: return InBoxInput_Normal(); case 1: return InBoxInput_GrabbingMultiple(); case 2: return InBoxInput_MovingMultiple(); } } static u8 InBoxInput_Normal(void) { u8 retVal; s8 cursorArea; s8 cursorPosition; do { cursorArea = sBoxCursorArea; cursorPosition = sBoxCursorPosition; gPSSData->field_CD2 = 0; gPSSData->field_CD3 = 0; gPSSData->field_CD7 = 0; if (JOY_REPT(DPAD_UP)) { retVal = TRUE; if (sBoxCursorPosition >= IN_BOX_ROWS) { cursorPosition -= IN_BOX_ROWS; } else { cursorArea = CURSOR_AREA_BOX; cursorPosition = 0; } break; } else if (JOY_REPT(DPAD_DOWN)) { retVal = TRUE; cursorPosition += IN_BOX_ROWS; if (cursorPosition >= IN_BOX_COUNT) { cursorArea = CURSOR_AREA_BUTTONS; cursorPosition -= IN_BOX_COUNT; cursorPosition /= 3; gPSSData->field_CD2 = 1; gPSSData->field_CD7 = 1; } break; } else if (JOY_REPT(DPAD_LEFT)) { retVal = TRUE; if (sBoxCursorPosition % IN_BOX_ROWS != 0) { cursorPosition--; } else { gPSSData->field_CD3 = -1; cursorPosition += (IN_BOX_ROWS - 1); } break; } else if (JOY_REPT(DPAD_RIGHT)) { retVal = TRUE; if ((sBoxCursorPosition + 1) % IN_BOX_ROWS != 0) { cursorPosition++; } else { gPSSData->field_CD3 = 1; cursorPosition -= (IN_BOX_ROWS - 1); } break; } else if (JOY_NEW(START_BUTTON)) { retVal = TRUE; cursorArea = CURSOR_AREA_BOX; cursorPosition = 0; break; } if ((JOY_NEW(A_BUTTON)) && sub_8094924()) { if (!sCanOnlyMove) return 8; if (gPSSData->boxOption != BOX_OPTION_MOVE_MONS || sIsMonBeingMoved == TRUE) { switch (sub_8094E50(0)) { case PC_TEXT_STORE: return 11; case PC_TEXT_WITHDRAW: return 12; case PC_TEXT_MOVE: return 13; case PC_TEXT_SHIFT: return 14; case PC_TEXT_PLACE: return 15; case PC_TEXT_TAKE: return 16; case PC_TEXT_GIVE: return 17; case PC_TEXT_SWITCH: return 18; } } else { gPSSData->inBoxMovingMode = 1; return 20; } } if (JOY_NEW(B_BUTTON)) return 19; if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) { if (JOY_HELD(L_BUTTON)) return 10; if (JOY_HELD(R_BUTTON)) return 9; } if (JOY_NEW(SELECT_BUTTON)) { sub_8094C84(); return 0; } retVal = 0; } while (0); if (retVal) sub_80927E8(cursorArea, cursorPosition); return retVal; } static u8 InBoxInput_GrabbingMultiple(void) { if (JOY_HELD(A_BUTTON)) { if (JOY_REPT(DPAD_UP)) { if (sBoxCursorPosition / IN_BOX_ROWS != 0) { sub_80927E8(CURSOR_AREA_IN_BOX, sBoxCursorPosition - IN_BOX_ROWS); return 21; } else { return 24; } } else if (JOY_REPT(DPAD_DOWN)) { if (sBoxCursorPosition + IN_BOX_ROWS < IN_BOX_COUNT) { sub_80927E8(CURSOR_AREA_IN_BOX, sBoxCursorPosition + IN_BOX_ROWS); return 21; } else { return 24; } } else if (JOY_REPT(DPAD_LEFT)) { if (sBoxCursorPosition % IN_BOX_ROWS != 0) { sub_80927E8(CURSOR_AREA_IN_BOX, sBoxCursorPosition - 1); return 21; } else { return 24; } } else if (JOY_REPT(DPAD_RIGHT)) { if ((sBoxCursorPosition + 1) % IN_BOX_ROWS != 0) { sub_80927E8(CURSOR_AREA_IN_BOX, sBoxCursorPosition + 1); return 21; } else { return 24; } } else { return 0; } } else { if (sub_8095AA0() == sBoxCursorPosition) { gPSSData->inBoxMovingMode = 0; gPSSData->field_CB8->invisible = FALSE; return 22; } else { sIsMonBeingMoved = (gPSSData->cursorMonSpecies != SPECIES_NONE); gPSSData->inBoxMovingMode = 2; sMovingMonOrigBoxId = StorageGetCurrentBox(); return 23; } } } static u8 InBoxInput_MovingMultiple(void) { if (JOY_REPT(DPAD_UP)) { if (sub_8095474(0)) { sub_80927E8(CURSOR_AREA_IN_BOX, sBoxCursorPosition - IN_BOX_ROWS); return 25; } else { return 24; } } else if (JOY_REPT(DPAD_DOWN)) { if (sub_8095474(1)) { sub_80927E8(CURSOR_AREA_IN_BOX, sBoxCursorPosition + IN_BOX_ROWS); return 25; } else { return 24; } } else if (JOY_REPT(DPAD_LEFT)) { if (sub_8095474(2)) { sub_80927E8(CURSOR_AREA_IN_BOX, sBoxCursorPosition - 1); return 25; } else { return 10; } } else if (JOY_REPT(DPAD_RIGHT)) { if (sub_8095474(3)) { sub_80927E8(CURSOR_AREA_IN_BOX, sBoxCursorPosition + 1); return 25; } else { return 9; } } else if (JOY_NEW(A_BUTTON)) { if (sub_8095ABC()) { sIsMonBeingMoved = FALSE; gPSSData->inBoxMovingMode = 0; return 26; } else { return 24; } } else if (JOY_NEW(B_BUTTON)) { return 24; } else { if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) { if (JOY_HELD(L_BUTTON)) return 10; if (JOY_HELD(R_BUTTON)) return 9; } return 0; } } static u8 HandleInput_InParty(void) { u8 retVal; bool8 gotoBox; s8 cursorArea; s8 cursorPosition; do { cursorArea = sBoxCursorArea; cursorPosition = sBoxCursorPosition; gPSSData->field_CD3 = 0; gPSSData->field_CD2 = 0; gPSSData->field_CD7 = 0; gotoBox = FALSE; retVal = 0; if (JOY_REPT(DPAD_UP)) { if (--cursorPosition < 0) cursorPosition = PARTY_SIZE; if (cursorPosition != sBoxCursorPosition) retVal = 1; break; } else if (JOY_REPT(DPAD_DOWN)) { if (++cursorPosition > PARTY_SIZE) cursorPosition = 0; if (cursorPosition != sBoxCursorPosition) retVal = 1; break; } else if (JOY_REPT(DPAD_LEFT) && sBoxCursorPosition != 0) { retVal = 1; gPSSData->field_CD6 = sBoxCursorPosition; cursorPosition = 0; break; } else if (JOY_REPT(DPAD_RIGHT)) { if (sBoxCursorPosition == 0) { retVal = 1; cursorPosition = gPSSData->field_CD6; } else { retVal = 6; cursorArea = CURSOR_AREA_IN_BOX; cursorPosition = 0; } break; } if (JOY_NEW(A_BUTTON)) { if (sBoxCursorPosition == PARTY_SIZE) { if (gPSSData->boxOption == BOX_OPTION_DEPOSIT) return 4; gotoBox = TRUE; } else if (sub_8094924()) { if (!sCanOnlyMove) return 8; switch (sub_8094E50(0)) { case PC_TEXT_STORE: return 11; case PC_TEXT_WITHDRAW: return 12; case PC_TEXT_MOVE: return 13; case PC_TEXT_SHIFT: return 14; case PC_TEXT_PLACE: return 15; case PC_TEXT_TAKE: return 16; case PC_TEXT_GIVE: return 17; case PC_TEXT_SWITCH: return 18; } } } if (JOY_NEW(B_BUTTON)) { if (gPSSData->boxOption == BOX_OPTION_DEPOSIT) return 19; gotoBox = TRUE; } if (gotoBox) { retVal = 6; cursorArea = CURSOR_AREA_IN_BOX; cursorPosition = 0; } else if (JOY_NEW(SELECT_BUTTON)) { sub_8094C84(); return 0; } } while (0); if (retVal != 0) { if (retVal != 6) sub_80927E8(cursorArea, cursorPosition); } return retVal; } static u8 HandleInput_OnBox(void) { u8 retVal; s8 cursorArea; s8 cursorPosition; do { gPSSData->field_CD3 = 0; gPSSData->field_CD2 = 0; gPSSData->field_CD7 = 0; if (JOY_REPT(DPAD_UP)) { retVal = 1; cursorArea = CURSOR_AREA_BUTTONS; cursorPosition = 0; gPSSData->field_CD7 = 1; break; } else if (JOY_REPT(DPAD_DOWN)) { retVal = 1; cursorArea = CURSOR_AREA_IN_BOX; cursorPosition = 2; break; } if (JOY_HELD(DPAD_LEFT)) return 10; if (JOY_HELD(DPAD_RIGHT)) return 9; if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) { if (JOY_HELD(L_BUTTON)) return 10; if (JOY_HELD(R_BUTTON)) return 9; } if (JOY_NEW(A_BUTTON)) { sub_80920FC(FALSE); AddBoxMenu(); return 7; } if (JOY_NEW(B_BUTTON)) return 19; if (JOY_NEW(SELECT_BUTTON)) { sub_8094C84(); return 0; } retVal = 0; } while (0); if (retVal) { if (cursorArea != CURSOR_AREA_BOX) sub_80920FC(FALSE); sub_80927E8(cursorArea, cursorPosition); } return retVal; } static u8 HandleInput_OnButtons(void) { u8 retVal; s8 cursorArea; s8 cursorPosition; s8 prevPos; do { cursorArea = sBoxCursorArea; cursorPosition = sBoxCursorPosition; gPSSData->field_CD3 = 0; gPSSData->field_CD2 = 0; gPSSData->field_CD7 = 0; if (JOY_REPT(DPAD_UP)) { retVal = 1; cursorArea = CURSOR_AREA_IN_BOX; gPSSData->field_CD2 = -1; if (sBoxCursorPosition == 0) cursorPosition = IN_BOX_COUNT - 1 - 5; else cursorPosition = IN_BOX_COUNT - 1; gPSSData->field_CD7 = 1; break; } else if (JOY_REPT(DPAD_DOWN | START_BUTTON)) { retVal = 1; cursorArea = CURSOR_AREA_BOX; cursorPosition = 0; gPSSData->field_CD7 = 1; break; } if (JOY_REPT(DPAD_LEFT)) { retVal = 1; if (--cursorPosition < 0) cursorPosition = 1; break; } else if (JOY_REPT(DPAD_RIGHT)) { retVal = 1; if (++cursorPosition > 1) cursorPosition = 0; break; } if (JOY_NEW(A_BUTTON)) { return cursorPosition == 0 ? 5 : 4; } if (JOY_NEW(B_BUTTON)) return 19; if (JOY_NEW(SELECT_BUTTON)) { sub_8094C84(); return 0; } retVal = 0; } while (0); if (retVal != 0) sub_80927E8(cursorArea, cursorPosition); return retVal; } u8 HandleInput(void) { struct { u8 (*func)(void); s8 area; } static const inputFuncs[] = { {HandleInput_InBox, CURSOR_AREA_IN_BOX}, {HandleInput_InParty, CURSOR_AREA_IN_PARTY}, {HandleInput_OnBox, CURSOR_AREA_BOX}, {HandleInput_OnButtons, CURSOR_AREA_BUTTONS}, {NULL, 0}, }; u16 i = 0; while (inputFuncs[i].func != NULL) { if (inputFuncs[i].area == sBoxCursorArea) return inputFuncs[i].func(); i++; } return 0; } static void AddBoxMenu(void) { InitMenu(); SetMenuText(PC_TEXT_JUMP); SetMenuText(PC_TEXT_WALLPAPER); SetMenuText(PC_TEXT_NAME); SetMenuText(PC_TEXT_CANCEL); } static bool8 sub_8094924(void) { InitMenu(); if (gPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) return sub_809494C(); else return sub_8094A0C(); } static bool8 sub_809494C(void) { u16 var0 = sub_8092458(); switch (gPSSData->boxOption) { case BOX_OPTION_DEPOSIT: if (var0) SetMenuText(PC_TEXT_STORE); else return FALSE; break; case BOX_OPTION_WITHDRAW: if (var0) SetMenuText(PC_TEXT_WITHDRAW); else return FALSE; break; case BOX_OPTION_MOVE_MONS: if (sIsMonBeingMoved) { if (var0) SetMenuText(PC_TEXT_SHIFT); else SetMenuText(PC_TEXT_PLACE); } else { if (var0) SetMenuText(PC_TEXT_MOVE); else return FALSE; } break; case BOX_OPTION_MOVE_ITEMS: default: return FALSE; } SetMenuText(PC_TEXT_SUMMARY); if (gPSSData->boxOption == BOX_OPTION_MOVE_MONS) { if (!sBoxCursorArea) SetMenuText(PC_TEXT_WITHDRAW); else SetMenuText(PC_TEXT_STORE); } SetMenuText(PC_TEXT_MARK); SetMenuText(PC_TEXT_RELEASE); SetMenuText(PC_TEXT_CANCEL); return TRUE; } static bool8 sub_8094A0C(void) { if (gPSSData->cursorMonSpecies == SPECIES_EGG) return FALSE; if (!IsActiveItemMoving()) { if (gPSSData->cursorMonItem == ITEM_NONE) { if (gPSSData->cursorMonSpecies == SPECIES_NONE) return FALSE; SetMenuText(PC_TEXT_GIVE2); } else { if (!ItemIsMail(gPSSData->cursorMonItem)) { SetMenuText(PC_TEXT_TAKE); SetMenuText(PC_TEXT_BAG); } SetMenuText(PC_TEXT_INFO); } } else { if (gPSSData->cursorMonItem == ITEM_NONE) { if (gPSSData->cursorMonSpecies == SPECIES_NONE) return FALSE; SetMenuText(PC_TEXT_GIVE); } else { if (ItemIsMail(gPSSData->cursorMonItem) == TRUE) return FALSE; SetMenuText(PC_TEXT_SWITCH); } } SetMenuText(PC_TEXT_CANCEL); return TRUE; } static void sub_8094AB8(struct Sprite *sprite) { sprite->x = gPSSData->field_CB4->x; sprite->y = gPSSData->field_CB4->y + 20; } static void sub_8094AD8(void) { u16 x, y; u8 spriteId; u8 priority, subpriority; struct SpriteSheet spriteSheets[] = { {sHandCursorTiles, 0x800, TAG_TILE_0}, {sHandCursorShadowTiles, 0x80, TAG_TILE_1}, {} }; struct SpritePalette spritePalettes[] = { {sHandCursorPalette, TAG_PAL_DAC7}, {} }; static const struct OamData sOamData_857BA0C = { .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .priority = 1, }; static const struct OamData sOamData_857BA14 = { .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .priority = 1, }; static const union AnimCmd sSpriteAnim_857BA1C[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_FRAME(16, 30), ANIMCMD_JUMP(0) }; static const union AnimCmd sSpriteAnim_857BA28[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_857BA30[] = { ANIMCMD_FRAME(32, 5), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_857BA38[] = { ANIMCMD_FRAME(48, 5), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnimTable_857BA40[] = { sSpriteAnim_857BA1C, sSpriteAnim_857BA28, sSpriteAnim_857BA30, sSpriteAnim_857BA38 }; static const struct SpriteTemplate gSpriteTemplate_857BA50 = { .tileTag = TAG_TILE_0, .paletteTag = TAG_PAL_WAVEFORM, .oam = &sOamData_857BA0C, .anims = sSpriteAnimTable_857BA40, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const struct SpriteTemplate gSpriteTemplate_857BA68 = { .tileTag = TAG_TILE_1, .paletteTag = TAG_PAL_WAVEFORM, .oam = &sOamData_857BA14, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8094AB8, }; LoadSpriteSheets(spriteSheets); LoadSpritePalettes(spritePalettes); gPSSData->field_CD8[0] = IndexOfSpritePaletteTag(TAG_PAL_WAVEFORM); gPSSData->field_CD8[1] = IndexOfSpritePaletteTag(TAG_PAL_DAC7); sub_8092398(sBoxCursorArea, sBoxCursorPosition, &x, &y); spriteId = CreateSprite(&gSpriteTemplate_857BA50, x, y, 6); if (spriteId != MAX_SPRITES) { gPSSData->field_CB4 = &gSprites[spriteId]; gPSSData->field_CB4->oam.paletteNum = gPSSData->field_CD8[sCanOnlyMove]; gPSSData->field_CB4->oam.priority = 1; if (sIsMonBeingMoved) StartSpriteAnim(gPSSData->field_CB4, 3); } else { gPSSData->field_CB4 = NULL; } if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) { subpriority = 13; priority = 1; } else { subpriority = 21; priority = 2; } spriteId = CreateSprite(&gSpriteTemplate_857BA68, 0, 0, subpriority); if (spriteId != MAX_SPRITES) { gPSSData->field_CB8 = &gSprites[spriteId]; gPSSData->field_CB8->oam.priority = priority; if (sBoxCursorArea) gPSSData->field_CB8->invisible = 1; } else { gPSSData->field_CB8 = NULL; } } static void sub_8094C84(void) { sCanOnlyMove = !sCanOnlyMove; gPSSData->field_CB4->oam.paletteNum = gPSSData->field_CD8[sCanOnlyMove]; } u8 GetBoxCursorPosition(void) { return sBoxCursorPosition; } void sub_8094CD4(u8 *arg0, u8 *arg1) { if (sBoxCursorArea == CURSOR_AREA_IN_BOX) { *arg0 = sBoxCursorPosition % IN_BOX_ROWS; *arg1 = sBoxCursorPosition / IN_BOX_ROWS; } else { *arg0 = 0; *arg1 = 0; } } void sub_8094D14(u8 animNum) { StartSpriteAnim(gPSSData->field_CB4, animNum); } u8 sub_8094D34(void) { return sMovingMonOrigBoxId; } void sub_8094D40(void) { gPSSData->field_CB4->oam.priority = 1; } void sub_8094D60(void) { if (sBoxCursorArea == CURSOR_AREA_IN_BOX) sub_8095D44(CURSOR_AREA_IN_BOX, sBoxCursorPosition); } void sub_8094D84(void) { if (sBoxCursorArea == CURSOR_AREA_IN_BOX) sub_8095C84(CURSOR_AREA_IN_BOX, sBoxCursorPosition); }