diff options
Diffstat (limited to 'src/battle')
33 files changed, 5 insertions, 68499 deletions
diff --git a/src/battle/anim/roots.c b/src/battle/anim/roots.c index e2dd4a2af..e0cc441aa 100644 --- a/src/battle/anim/roots.c +++ b/src/battle/anim/roots.c @@ -6,7 +6,11 @@ extern s16 gBattleAnimArgs[]; extern u8 gBattleAnimAttacker; extern u8 gBattleAnimTarget; -extern s16 gUnknown_03000728[]; + +IWRAM_DATA u32 filler_03000724; +IWRAM_DATA u16 gUnknown_03000728[4]; +IWRAM_DATA u16 gUnknown_03000730[6]; +IWRAM_DATA u32 filler_0300073c; void sub_80CB59C(struct Sprite* sprite); void sub_80CB620(struct Sprite *sprite); diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c deleted file mode 100644 index fa941ffeb..000000000 --- a/src/battle/battle_2.c +++ /dev/null @@ -1,5579 +0,0 @@ -#include "global.h" -#include "constants/abilities.h" -#include "constants/battle_move_effects.h" -#include "constants/hold_effects.h" -#include "constants/items.h" -#include "constants/moves.h" -#include "constants/songs.h" -#include "constants/species.h" -#include "gba/flash_internal.h" -#include "battle.h" -#include "battle_ai.h" -#include "battle_interface.h" -#include "battle_message.h" -#include "battle_setup.h" -#include "battle_util.h" -#include "data2.h" -#include "decompress.h" -#include "event_data.h" -#include "evolution_scene.h" -#include "item.h" -#include "item_menu.h" -#include "link.h" -#include "main.h" -#include "m4a.h" -#include "name_string_util.h" -#include "overworld.h" -#include "palette.h" -#include "party_menu.h" -#include "pokeball.h" -#include "pokeblock.h" -#include "pokedex.h" -#include "pokemon.h" -#include "random.h" -#include "roamer.h" -#include "rom3.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "safari_zone.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "trainer.h" -#include "trig.h" -#include "tv.h" -#include "scanline_effect.h" -#include "util.h" -#include "ewram.h" - -struct UnknownStruct7 -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; -}; - -struct UnknownStruct8 -{ - u8 unk0[7]; - u8 unk7; - u8 unk8[18]; - u8 unk1A; -}; - -extern void sub_802BBD4(); - -extern struct SpriteTemplate gUnknown_02024E8C; -extern const u8 Str_821F7B8[]; -extern u8 gUnknown_02023A14_50; -extern const u16 gBattleTextboxPalette[]; -extern const struct MonCoords gCastformFrontSpriteCoords[]; -extern const u8 Str_821F7EA[]; -extern const u8 gUnknown_Debug_821F7F3[]; -extern const u8 BattleText_YesNo[]; -extern u8 gStatStageRatios[][2]; -extern u8 gActionsByTurnOrder[4]; -extern struct UnknownPokemonStruct2 gMultiPartnerParty[]; -extern u8 gBattleBufferB[][0x200]; -extern u8 gActiveBattler; -extern u32 gBattleExecBuffer; -extern u8 gBattlersCount; -extern u16 gBattlerPartyIndexes[]; -extern u8 gCurrentActionFuncId; -extern u8 gBanksByTurnOrder[]; -extern u8 gBankSpriteIds[]; -extern u16 gCurrentMove; // This is mis-named. It is a species, not a move ID. -extern u8 gLastUsedAbility; -extern u8 gStringBank; -extern u8 gAbsentBattlerFlags; -extern u8 gMultiHitCounter; -extern u8 gActionForBanks[]; -extern u16 gUnknown_02024C2C[]; -extern u16 gLastUsedMove[]; -extern u16 gLastLandedMoves[]; -extern u16 gLastHitByType[]; -extern u16 gUnknown_02024C4C[]; -extern u16 gLockedMoves[]; -extern u16 gChosenMovesByBanks[]; -extern u32 gHitMarker; -extern u8 gUnknown_02024C70[]; -extern u16 gSideAffecting[]; -extern u32 gStatuses3[]; -//extern u8 gDisableStructs[][0x1C]; -extern u16 gPauseCounterBattle; -extern u16 gPaydayMoney; -extern u16 gRandomTurnNumber; -extern u8 gBattleCommunication[]; -extern u8 gUnknown_02024D1F[]; // I don't actually know what type this is. -extern u8 gBattleOutcome; -extern u16 gUnknown_02024DE8; -extern u8 gActionSelectionCursor[]; -extern u8 gMoveSelectionCursor[]; -extern u8 gUnknown_02038470[]; -extern struct Window gUnknown_030041D0; -extern struct Window gUnknown_03004210; -extern struct Window gUnknown_03004250; -extern u32 gUnknown_03004284; -extern MainCallback gPreBattleCallback1; -extern void (*gBattleMainFunc)(void); -extern u8 gLeveledUpInBattle; -extern void (*gBattleBankFunc[])(void); -extern u8 gHealthboxIDs[]; -extern u16 gBattleTypeFlags; -extern s8 gBattleTerrain; // I'm not sure if this is supposed to be s8 or u8. Regardless, it must have the same type as the return value of BattleSetup_GetTerrain. -extern u8 gReservedSpritePaletteCount; -extern u16 gTrainerBattleOpponent; -extern struct BattleEnigmaBerry gEnigmaBerries[]; -extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2]; -extern u8 gBattleMonForms[]; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u16 gBattleWeather; -extern s32 gBattleMoveDamage; -extern struct BattlePokemon gBattleMons[]; -extern u8 gMoveResultFlags; -extern u8 BattleScript_FocusPunchSetUp[]; -extern u16 gDynamicBasePower; -extern u8 gCurrentTurnActionNumber; -extern void (* const gUnknown_081FA640[])(void); -extern void (* const gUnknown_081FA678[])(void); -extern u8* gBattlescriptCurrInstr; -extern u8 BattleScript_LinkBattleWonOrLost[]; -extern u8 BattleScript_PayDayMoneyAndPickUpItems[]; -extern u8 gUnknown_081D8E0D[]; -extern u8 BattleScript_LocalTrainerBattleWon[]; -extern u8 BattleScript_LocalBattleLost[]; -extern u8 BattleScript_GotAwaySafely[]; -extern u8 BattleScript_SmokeBallEscape[]; -extern u8 BattleScript_RanAwayUsingMonAbility[]; -extern u8 BattleScript_WildMonFled[]; -extern u8 BattleScript_ActionSwitch[]; -extern u8 BattleScript_PrintFailedToRunString[]; -extern const BattleCmdFunc gBattleScriptingCommandsTable[]; -extern u8 gCritMultiplier; -extern u8 gCurrMovePos; -extern u8 gUnknown_02024BE5; -extern u16 gChosenMove; -extern u8* gBattleScriptsForMoveEffects[]; -extern u16 gLastUsedItem; -extern u8 * const gBattlescriptsForBallThrow[]; -extern u8 * const gBattlescriptsForRunningByItem[]; -extern u8 * const gBattlescriptsForUsingItem[]; -extern u8 * const gBattlescriptsForSafariActions[]; -extern u8 gBattleTextBuff2[]; -extern u8 gNumSafariBalls; -extern u8 gUnknown_081FA70C[][3]; -extern u8 gUnknown_081FA71B[]; -extern u8 gUnknown_081FA71F[]; - -void sub_8010824(void); -static void BattlePrepIntroSlide(void); -void CheckFocusPunch_ClearVarsBeforeTurnStarts(void); -void SetActionsAndBanksTurnOrder(void); -static void TurnValuesCleanUp(u8); -void SpecialStatusesClear(void); -static void RunTurnActionsFunctions(void); -void HandleEndTurn_FinishBattle(); -static void FreeResetData_ReturnToOvOrDoEvolutions(void); -void TryEvolvePokemon(void); -static void ReturnFromBattleToOverworld(void); -static void WaitForEvoSceneToFinish(void); - -void sub_800E7C4(void) -{ - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - sub_800B858(); - SetMainCallback2(sub_800F104); - gBattleCommunication[0] = 0; - } - else - { - InitBattle(); - } -} - -void InitBattle(void) -{ - s32 i; - - SetHBlankCallback(NULL); - SetVBlankCallback(NULL); - - CpuFill32(0, (void *)VRAM, VRAM_SIZE); - - REG_MOSAIC = 0; - REG_WIN0H = 0xF0; - REG_WIN0V = 0x5051; - REG_WININ = 0; - REG_WINOUT = 0; - gBattle_WIN0H = 0xF0; - gBattle_WIN0V = 0x5051; - ScanlineEffect_Clear(); - - for (i = 0; i < 80; i++) - { - gScanlineEffectRegBuffers[0][i] = 0xF0; - gScanlineEffectRegBuffers[1][i] = 0xF0; - } - for (i = 80; i < 160; i++) - { - asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter - gScanlineEffectRegBuffers[0][i] = 0xFF10; - gScanlineEffectRegBuffers[1][i] = 0xFF10; - } - //ScanlineEffect_SetParams(gUnknown_081F9674.unk0, gUnknown_081F9674.unk4, gUnknown_081F9674.unk8); - ScanlineEffect_SetParams(gUnknown_081F9674); - Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); - ResetPaletteFade(); - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - gBattle_BG3_X = 0; - gBattle_BG3_Y = 0; - -#if DEBUG - if (!(gUnknown_02023A14_50 & 8)) - gBattleTerrain = BattleSetup_GetTerrain(); -#else - gBattleTerrain = BattleSetup_GetTerrain(); -#endif - - Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); - Text_InitWindowWithTemplate(&gUnknown_030041D0, &gWindowTemplate_81E71D0); - Text_InitWindowWithTemplate(&gUnknown_03004250, &gWindowTemplate_81E71EC); - sub_800D6D4(); - LoadBattleTextboxAndBackground(); - ResetSpriteData(); - ResetTasks(); - LoadBattleEntryBackground(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 4; - SetVBlankCallback(sub_800FCFC); - setup_poochyena_battle(); - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - SetMainCallback2(sub_800F298); - else - SetMainCallback2(sub_800EC9C); - if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) -#if DEBUG - && !(gUnknown_02023A14_50 & 8) -#endif - ) - { - CreateNPCTrainerParty(gEnemyParty, gTrainerBattleOpponent); - SetWildMonHeldItem(); - } - gMain.inBattle = TRUE; - for (i = 0; i < PARTY_SIZE; i++) - AdjustFriendship(&gPlayerParty[i], FRIENDSHIP_EVENT_LEAGUE_BATTLE); - gBattleCommunication[0] = 0; -} - -void sub_800E9EC(void) -{ - u16 r6 = 0; - u16 species; - u16 hp; - u32 status; - s32 i; - - for (i = 0; i < PARTY_SIZE; i++) - { - species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - - if (species == 0) - continue; - if (species != SPECIES_EGG && hp != 0 && status == 0) - r6 |= 1 << i * 2; - - if (species == 0) - continue; - if (hp != 0 && (species == SPECIES_EGG || status != 0)) - r6 |= 2 << i * 2; - - if (species == 0) - continue; - if (species != SPECIES_EGG && hp == 0) - r6 |= 3 << i * 2; - } - gBattleStruct->unk2 = r6; - gBattleStruct->unk3 = r6 >> 8; -} - -void sub_800EAAC(void) -{ - s32 i; - struct UnknownStruct8 *_ewram4 = &ewram4; - - for (i = 0; i < 7; i++) - _ewram4->unk0[i] = gSaveBlock1.enigmaBerry.berry.name[i]; - for (i = 0; i < 18; i++) - _ewram4->unk8[i] = gSaveBlock1.enigmaBerry.itemEffect[i]; - _ewram4->unk7 = gSaveBlock1.enigmaBerry.holdEffect; - _ewram4->unk1A = gSaveBlock1.enigmaBerry.holdEffectParam; -} - -void sub_800EB08(void) -{ - s32 i; - s32 j; - - if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) - { - for (i = 0; i < 7; i++) - { - gEnigmaBerries[0].name[i] = gSaveBlock1.enigmaBerry.berry.name[i]; - gEnigmaBerries[2].name[i] = gSaveBlock1.enigmaBerry.berry.name[i]; - } - for (i = 0; i < 18; i++) - { - gEnigmaBerries[0].itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i]; - gEnigmaBerries[2].itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i]; - } - gEnigmaBerries[0].holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - gEnigmaBerries[2].holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - gEnigmaBerries[0].holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam; - gEnigmaBerries[2].holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam; - } - else - { - s32 numPlayers; - struct BattleEnigmaBerry *src; - u8 r4; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - numPlayers = 4; - else - numPlayers = 2; - for (i = 0; i < numPlayers; i++) - { - src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2); - r4 = gLinkPlayers[i].lp_field_18; - - for (j = 0; j < 7; j++) - gEnigmaBerries[r4].name[j] = src->name[j]; - for (j = 0; j < 18; j++) - gEnigmaBerries[r4].itemEffect[j] = src->itemEffect[j]; - gEnigmaBerries[r4].holdEffect = src->holdEffect; - gEnigmaBerries[r4].holdEffectParam = src->holdEffectParam; - } - } -} - -void shedinja_something(struct Pokemon *pkmn) -{ - u8 nickname[POKEMON_NAME_LENGTH + 1]; - u8 language = 1; - - if (GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA - && GetMonData(pkmn, MON_DATA_LANGUAGE) != language) - { - GetMonData(pkmn, MON_DATA_NICKNAME, nickname); - if (StringCompareWithoutExtCtrlCodes(nickname, gUnknown_081F96C8) == 0) - SetMonData(pkmn, MON_DATA_LANGUAGE, &language); - } -} - -void sub_800EC9C(void) -{ - u8 playerId; - u8 enemyId; - s32 id; - - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - playerId = GetMultiplayerId(); - ewram160CB = playerId; - enemyId = playerId ^ 1; - - switch (gBattleCommunication[0]) - { - case 0: - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - if (gReceivedRemoteLinkPlayers != 0 && IsLinkTaskFinished()) - { - gBattleStruct->unk0 = 1; - gBattleStruct->unk1 = 1; - sub_800E9EC(); - sub_800EAAC(); -#if DEBUG - if (gUnknown_02023A14_50 & 8) - { - for (id = 0; id < 2; id++) // Why < 2 here? - { - gLinkPlayers[id].lp_field_18 = id; - gLinkPlayers[id].linkType = 0x2211; - } - } -#endif - SendBlock(bitmask_all_link_players_but_self(), gBattleStruct, 32); - gBattleCommunication[0] = 1; - } - } - else - { - gBattleTypeFlags |= BATTLE_TYPE_WILD; - gBattleCommunication[0] = 8; - sub_800EB08(); - } - break; - case 1: - if ((GetBlockReceivedStatus() & 3) == 3) - { - u8 taskId; - - ResetBlockReceivedFlags(); - id = 0; - if (gBlockRecvBuffer[0][0] == 0x100) - { - if (playerId == 0) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - id++; - } - if (id == 0) - { - if (gBlockRecvBuffer[0][0] == gBlockRecvBuffer[1][0]) - { - if (playerId == 0) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - id++; - } - if (id == 0) - { - while (id < 2) - { - if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId) - break; - id++; - } - if (id == 2) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - } - } - sub_800EB08(); - taskId = CreateTask(sub_800DE30, 0); - gTasks[taskId].data[1] = 0x10E; - gTasks[taskId].data[2] = 0x5A; - gTasks[taskId].data[5] = 0; - gTasks[taskId].data[3] = gBattleStruct->unk2 | (gBattleStruct->unk3 << 8); - gTasks[taskId].data[4] = gBlockRecvBuffer[enemyId][1]; - gBattleCommunication[0]++; - } - break; - case 2: - if (IsLinkTaskFinished()) - { - SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(*gPlayerParty) * 2); - gBattleCommunication[0]++; - } - break; - case 3: - if ((GetBlockReceivedStatus() & 3) == 3) - { - ResetBlockReceivedFlags(); - memcpy(gEnemyParty, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2); - gBattleCommunication[0]++; - } - break; - case 4: - if (IsLinkTaskFinished()) - { - SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(*gPlayerParty) * 2); - gBattleCommunication[0]++; - } - break; - case 5: - if ((GetBlockReceivedStatus() & 3) == 3) - { - ResetBlockReceivedFlags(); - memcpy(gEnemyParty + 2, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2); - gBattleCommunication[0]++; - } - break; - case 6: - if (IsLinkTaskFinished()) - { - SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(*gPlayerParty) * 2); - gBattleCommunication[0]++; - } - break; - case 7: - if ((GetBlockReceivedStatus() & 3) == 3) - { - ResetBlockReceivedFlags(); - memcpy(gEnemyParty + 4, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2); - shedinja_something(&gEnemyParty[0]); - shedinja_something(&gEnemyParty[1]); - shedinja_something(&gEnemyParty[2]); - shedinja_something(&gEnemyParty[3]); - shedinja_something(&gEnemyParty[4]); - shedinja_something(&gEnemyParty[5]); - gBattleCommunication[0]++; - } - break; - case 8: - sub_800B950(); - gBattleCommunication[0]++; - gBattleCommunication[1] = 0; - gBattleCommunication[2] = 0; - break; - case 9: - if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) - { - gPreBattleCallback1 = gMain.callback1; - gMain.callback1 = sub_8010824; - SetMainCallback2(BattleMainCB2); - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - gTrainerBattleOpponent = LINK_BATTLE_OPPONENT; - gBattleTypeFlags |= BATTLE_TYPE_20; - } - } - break; - } -} - -void sub_800F02C(void) -{ - s32 i; - - for (i = 0; i < 3; i++) - { - u8 *nickname = gMultiPartnerParty[i].nickname; - - gMultiPartnerParty[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES); - gMultiPartnerParty[i].heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nickname); - gMultiPartnerParty[i].level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); - gMultiPartnerParty[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - gMultiPartnerParty[i].maxhp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); - gMultiPartnerParty[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - gMultiPartnerParty[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); - gMultiPartnerParty[i].gender = GetMonGender(&gPlayerParty[i]); - Text_StripExtCtrlCodes(nickname); - gMultiPartnerParty[i].language = GetMonData(&gPlayerParty[i], MON_DATA_LANGUAGE); - if (gMultiPartnerParty[i].language != 1) - PadNameString(nickname, 0); - } - memcpy(gSharedMem, gMultiPartnerParty, 0x60); -} - -void sub_800F104(void) -{ - u8 playerId; - MainCallback *pSavedCallback; - u16 *pSavedBattleTypeFlags; - s32 i; - - playerId = GetMultiplayerId(); - ewram160CB = playerId; - // Seriously, Game Freak? - pSavedCallback = ewram160C4_Callback; - pSavedBattleTypeFlags = ewram160C2_Flags; - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - - switch (gBattleCommunication[0]) - { - case 0: - if (gReceivedRemoteLinkPlayers != 0) - { -#if DEBUG - if (gUnknown_02023A14_50 & 8) - { - for (i = 0; i < 4; i++) - { - gLinkPlayers[i].lp_field_18 = i; - gLinkPlayers[i].linkType = 0x2211; - } - } -#endif - if (IsLinkTaskFinished()) - { - sub_800F02C(); - SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x60); - gBattleCommunication[0]++; - } - } - break; - case 1: - if ((GetBlockReceivedStatus() & 0xF) == 0xF) - { - //s32 i; - - ResetBlockReceivedFlags(); - for (i = 0; i < 4; i++) - { - if (i != playerId) - { - if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) - || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) - memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], 0x60); - } - } - gBattleCommunication[0]++; - *pSavedCallback = gMain.savedCallback; - *pSavedBattleTypeFlags = gBattleTypeFlags; - gMain.savedCallback = sub_800F104; - OpenPartyMenu(PARTY_MENU_TYPE_LINK_MULTI_BATTLE, 0); - } - break; - case 2: - if (!gPaletteFade.active) - { - gBattleCommunication[0] = 3; - sub_800832C(); - } - break; - case 3: - if (gReceivedRemoteLinkPlayers == 0) - { - gBattleTypeFlags = *pSavedBattleTypeFlags; - gMain.savedCallback = *pSavedCallback; - SetMainCallback2(InitBattle); - } - break; - } -} - -void sub_800F298(void) -{ - u8 playerId; - s32 id; - - playerId = GetMultiplayerId(); - ewram160CB = playerId; - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - switch (gBattleCommunication[0]) - { - case 0: - if (gReceivedRemoteLinkPlayers != 0) - { -#if DEBUG - if (gUnknown_02023A14_50 & 8) - { - for (id = 0; id < 4; id++) - { - gLinkPlayers[id].lp_field_18 = id; - gLinkPlayers[id].linkType = 0x2211; - } - } -#endif - if (IsLinkTaskFinished()) - { - gBattleStruct->unk0 = 1; - gBattleStruct->unk1 = 1; - sub_800E9EC(); - sub_800EAAC(); - SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x20); - gBattleCommunication[0]++; - } - } - break; - case 1: - if ((GetBlockReceivedStatus() & 0xF) == 0xF) - { - u8 taskId; - - ResetBlockReceivedFlags(); - id = 0; - if (gBlockRecvBuffer[0][0] == 0x100) - { - if (playerId == 0) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - id++; - } - if (id == 0) - { - s32 i; - - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0]) - break; - } - if (i == MAX_LINK_PLAYERS) - { - if (playerId == 0) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - id++; - } - if (id == 0) - { - while (id < MAX_LINK_PLAYERS) - { - if (gBlockRecvBuffer[id][0] == 0x0101 && id != playerId) - if (id < playerId) - break; - if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId) - break; - id++; - } - if (id == MAX_LINK_PLAYERS) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - } - } - sub_800EB08(); - memcpy(ewram1D000, gPlayerParty, sizeof(struct Pokemon) * 3); - taskId = CreateTask(sub_800DE30, 0); - gTasks[taskId].data[1] = 0x10E; - gTasks[taskId].data[2] = 0x5A; - gTasks[taskId].data[5] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = 0; - for (id = 0; id < MAX_LINK_PLAYERS; id++) - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F; - break; - case 1: - gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F; - break; - case 2: - gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; - break; - case 3: - gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; - break; - } - } - ZeroPlayerPartyMons(); - ZeroEnemyPartyMons(); - gBattleCommunication[0]++; - // fallthrough - case 2: - if (IsLinkTaskFinished()) - { - SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2); - gBattleCommunication[0]++; - } - } - break; - case 3: - if ((GetBlockReceivedStatus() & 0xF) == 0xF) - { - ResetBlockReceivedFlags(); - for (id = 0; id < MAX_LINK_PLAYERS; id++) - { - if (id == playerId) - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - case 1: - case 2: - memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - } - } - else - { - if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) - || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - case 1: - case 2: - memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - } - } - else - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - case 1: - case 2: - memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - } - } - } - } - gBattleCommunication[0]++; - } - break; - case 4: - if (IsLinkTaskFinished()) - { - SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon)); - gBattleCommunication[0]++; - } - break; - case 5: - if ((GetBlockReceivedStatus() & 0xF) == 0xF) - { - ResetBlockReceivedFlags(); - for (id = 0; id < MAX_LINK_PLAYERS; id++) - { - if (id == playerId) - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - case 1: - case 2: - memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - } - } - else - { - if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) - || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - case 1: - case 2: - memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - } - } - else - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - case 1: - case 2: - memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - } - } - } - } - - shedinja_something(&gPlayerParty[0]); - shedinja_something(&gPlayerParty[1]); - shedinja_something(&gPlayerParty[2]); - shedinja_something(&gPlayerParty[3]); - shedinja_something(&gPlayerParty[4]); - shedinja_something(&gPlayerParty[5]); - - shedinja_something(&gEnemyParty[0]); - shedinja_something(&gEnemyParty[1]); - shedinja_something(&gEnemyParty[2]); - shedinja_something(&gEnemyParty[3]); - shedinja_something(&gEnemyParty[4]); - shedinja_something(&gEnemyParty[5]); - - gBattleCommunication[0]++; - } - break; - case 6: - sub_800B950(); - gBattleCommunication[0]++; - gBattleCommunication[1] = 0; - gBattleCommunication[2] = 0; - break; - case 7: - if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) - { - gPreBattleCallback1 = gMain.callback1; - gMain.callback1 = sub_8010824; - SetMainCallback2(BattleMainCB2); - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - gTrainerBattleOpponent = 0x800; - gBattleTypeFlags |= BATTLE_TYPE_20; - } - } - break; - } -} - -void BattleMainCB2(void) -{ - AnimateSprites(); - BuildOamBuffer(); - -#if DEBUG - if ((gMain.heldKeys & (R_BUTTON | SELECT_BUTTON)) == ((R_BUTTON | SELECT_BUTTON))) - { - gSpecialVar_Result = gBattleOutcome = 1; - gMain.inBattle = FALSE; - gScanlineEffect.state = 3; - gMain.callback1 = gPreBattleCallback1; - ZeroEnemyPartyMons(); - m4aSongNumStop(0x5A); - if (gBattleTypeFlags & 2) - SetMainCallback2(sub_805465C); - else - SetMainCallback2(gMain.savedCallback); - } - if (gBattleTypeFlags & 2) - { - debug_sub_8008264((gBattleTypeFlags >> 2) % 2, 1, 1, 1, 1); - debug_sub_8008264((gBattleTypeFlags >> 2) % 2, 1, 21, 1, 1); - debug_sub_8008264((gBattleTypeFlags >> 2) % 2, 1, 41, 1, 1); - } -#endif - - Text_UpdateWindowInBattle(&gUnknown_03004210); - UpdatePaletteFade(); - RunTasks(); -} - -void sub_800F828(struct Sprite *sprite) -{ - sprite->data[0] = 0; - sprite->callback = sub_800F838; -} - -void sub_800F838(struct Sprite *sprite) -{ - u16 *arr = (u16 *)gSharedMem; - - switch (sprite->data[0]) - { - case 0: - sprite->data[0]++; - sprite->data[1] = 0; - sprite->data[2] = 0x281; - sprite->data[3] = 0; - sprite->data[4] = 1; - // fall through - case 1: - sprite->data[4]--; - if (sprite->data[4] == 0) - { - s32 i; - s32 r2; - s32 r0; - - sprite->data[4] = 2; - r2 = sprite->data[1] + sprite->data[3] * 32; - r0 = sprite->data[2] - sprite->data[3] * 32; - for (i = 0; i < 29; i += 2) - { - arr[r2 + i] = 0x3D; - arr[r0 + i] = 0x3D; - } - sprite->data[3]++; - if (sprite->data[3] == 21) - { - sprite->data[0]++; - sprite->data[1] = 32; - } - } - break; - case 2: - sprite->data[1]--; - if (sprite->data[1] == 20) - SetMainCallback2(sub_800E7C4); - break; - } -} - -u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) -{ - u32 nameHash = 0; - s32 i; - - if (trainerNum == 0x400) - return 0; - - if ((gBattleTypeFlags & 0x908) == 8) - { - ZeroEnemyPartyMons(); - for (i = 0; i < gTrainers[trainerNum].partySize; i++) - { - u32 personalityValue; - s32 j; - u8 fixedIV; - - if (gTrainers[trainerNum].doubleBattle == TRUE) - personalityValue = 0x80; - else if (gTrainers[trainerNum].encounterMusic_gender & 0x80) - personalityValue = 0x78; - else - personalityValue = 0x88; - - for (j = 0; gTrainers[trainerNum].trainerName[j] != 0xFF; j++) - nameHash += gTrainers[trainerNum].trainerName[j]; - - switch (gTrainers[trainerNum].partyFlags) - { - case 0: - { - const struct TrainerMonNoItemDefaultMoves *partyData = gTrainers[trainerNum].party.NoItemDefaultMoves; - - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) - nameHash += gSpeciesNames[partyData[i].species][j]; - personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); - break; - } - case F_TRAINER_PARTY_CUSTOM_MOVESET: - { - const struct TrainerMonNoItemCustomMoves *partyData = gTrainers[trainerNum].party.NoItemCustomMoves; - - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) - nameHash += gSpeciesNames[partyData[i].species][j]; - personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); - - for (j = 0; j < 4; j++) - { - SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); - SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); - } - break; - } - case F_TRAINER_PARTY_HELD_ITEM: - { - const struct TrainerMonItemDefaultMoves *partyData = gTrainers[trainerNum].party.ItemDefaultMoves; - - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) - nameHash += gSpeciesNames[partyData[i].species][j]; - personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); - - SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); - break; - } - case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM: - { - const struct TrainerMonItemCustomMoves *partyData = gTrainers[trainerNum].party.ItemCustomMoves; - - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) - nameHash += gSpeciesNames[partyData[i].species][j]; - personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); - - SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); - for (j = 0; j < 4; j++) - { - SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); - SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); - } - break; - } - } - } - gBattleTypeFlags |= gTrainers[trainerNum].doubleBattle; - } - return gTrainers[trainerNum].partySize; -} - -void sub_800FCD4(void) -{ - if (REG_VCOUNT < 0xA0 && REG_VCOUNT >= 0x6F ) - REG_BG0CNT = 0x9800; -} - -void sub_800FCFC(void) -{ - Random(); // unused return value - REG_BG0HOFS = gBattle_BG0_X; - REG_BG0VOFS = gBattle_BG0_Y; - REG_BG1HOFS = gBattle_BG1_X; - REG_BG1VOFS = gBattle_BG1_Y; - REG_BG2HOFS = gBattle_BG2_X; - REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gBattle_BG3_X; - REG_BG3VOFS = gBattle_BG3_Y; - REG_WIN0H = gBattle_WIN0H; - REG_WIN0V = gBattle_WIN0V; - REG_WIN1H = gBattle_WIN1H; - REG_WIN1V = gBattle_WIN1V; - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - ScanlineEffect_InitHBlankDmaTransfer(); -} - -void nullsub_36(struct Sprite *sprite) -{ -} - -void sub_800FDB0(struct Sprite *sprite) -{ - if (sprite->data[0] != 0) - sprite->pos1.x = sprite->data[1] + ((sprite->data[2] & 0xFF00) >> 8); - else - sprite->pos1.x = sprite->data[1] - ((sprite->data[2] & 0xFF00) >> 8); - sprite->data[2] += 0x180; - if (sprite->affineAnimEnded) - { - FreeSpriteTilesByTag(0x2710); - FreeSpritePaletteByTag(0x2710); - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - } -} - -void sub_800FE20(struct Sprite *sprite) -{ - StartSpriteAffineAnim(sprite, 1); - sprite->callback = sub_800FDB0; - PlaySE(SE_BT_START); -} - -void sub_800FE40(u8 taskId) -{ - struct Pokemon *sp4 = NULL; - struct Pokemon *sp8 = NULL; - u8 r2 = ewram160CB; - u32 r7; - s32 i; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - switch (gLinkPlayers[r2].lp_field_18) - { - case 0: - case 2: - sp4 = gPlayerParty; - sp8 = gEnemyParty; - break; - case 1: - case 3: - sp4 = gEnemyParty; - sp8 = gPlayerParty; - break; - } - } - else - { - sp4 = gPlayerParty; - sp8 = gEnemyParty; - } - - r7 = 0; - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&sp4[i], MON_DATA_SPECIES2); - u16 hp = GetMonData(&sp4[i], MON_DATA_HP); - u32 status = GetMonData(&sp4[i], MON_DATA_STATUS); - - if (species == 0) - continue; - if (species != SPECIES_EGG && hp != 0 && status == 0) - r7 |= 1 << i * 2; - - if (species == 0) - continue; - if (hp != 0 && (species == SPECIES_EGG || status != 0)) - r7 |= 2 << i * 2; - - if (species == 0) - continue; - if (species != SPECIES_EGG && hp == 0) - r7 |= 3 << i * 2; - } - gTasks[taskId].data[3] = r7; - - r7 = 0; - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&sp8[i], MON_DATA_SPECIES2); - u16 hp = GetMonData(&sp8[i], MON_DATA_HP); - u32 status = GetMonData(&sp8[i], MON_DATA_STATUS); - - if (species == 0) - continue; - if (species != SPECIES_EGG && hp != 0 && status == 0) - r7 |= 1 << i * 2; - - if (species == 0) - continue; - if (hp != 0 && (species == SPECIES_EGG || status != 0)) - r7 |= 2 << i * 2; - - if (species == 0) - continue; - if (species != SPECIES_EGG && hp == 0) - r7 |= 3 << i * 2; - } - gTasks[taskId].data[4] = r7; -} - -void c2_8011A1C(void) -{ - s32 i; - u8 taskId; - - SetHBlankCallback(NULL); - SetVBlankCallback(NULL); - CpuFill32(0, (void *)VRAM, VRAM_SIZE); - REG_MOSAIC = 0; - REG_WIN0H = 0xF0; - REG_WIN0V = 0x5051; - REG_WININ = 0; - REG_WINOUT = 0; - gBattle_WIN0H = 0xF0; - gBattle_WIN0V = 0x5051; - ScanlineEffect_Clear(); - - for (i = 0; i < 80; i++) - { - gScanlineEffectRegBuffers[0][i] = 0xF0; - gScanlineEffectRegBuffers[1][i] = 0xF0; - } - for (i = 80; i < 160; i++) - { - asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter - gScanlineEffectRegBuffers[0][i] = 0xFF10; - gScanlineEffectRegBuffers[1][i] = 0xFF10; - } - Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); - ResetPaletteFade(); - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - gBattle_BG3_X = 0; - gBattle_BG3_Y = 0; - - Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); - Text_InitWindowWithTemplate(&gUnknown_030041D0, &gWindowTemplate_81E71D0); - Text_InitWindowWithTemplate(&gUnknown_03004250, &gWindowTemplate_81E71EC); - sub_800D6D4(); - LoadCompressedPalette(gBattleTextboxPalette, 0, 64); - ApplyPlayerChosenFrameToBattleMenu(); - ResetSpriteData(); - ResetTasks(); - LoadBattleEntryBackground(); - REG_WINOUT = 0x37; - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 4; - SetVBlankCallback(sub_800FCFC); - taskId = CreateTask(sub_800DE30, 0); - gTasks[taskId].data[1] = 0x10E; - gTasks[taskId].data[2] = 0x5A; - gTasks[taskId].data[5] = 1; - sub_800FE40(taskId); - SetMainCallback2(sub_80101B8); - gBattleCommunication[0] = 0; -} - -void sub_80101B8(void) -{ - c2_081284E0(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - RunTasks(); -} - -void c2_081284E0(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - gBattleCommunication[1] = 0xFF; - gBattleCommunication[0]++; - break; - case 1: - gBattleCommunication[1]--; - if (gBattleCommunication[1] == 0) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); - gBattleCommunication[0]++; - } - break; - case 2: - if (!gPaletteFade.active) - SetMainCallback2(gMain.savedCallback); - break; - } -} - -#if DEBUG - -extern u8 gUnknown_Debug_2023B62[]; -extern const u8 Str_821F7BD[]; -extern const u8 Str_821F7DA[]; - -void debug_sub_8010818(void); -void debug_sub_80108B8(void); -void debug_sub_8010CAC(void); -void debug_sub_8011498(void); -void debug_sub_801174C(void); -void debug_sub_8011D40(void); -void debug_sub_8011E5C(void); -void debug_sub_8011E74(void); -void debug_sub_8011EA0(u8); -void debug_sub_8012294(void); -void debug_sub_80123D8(u8); -void debug_sub_8012540(void); -void debug_nullsub_3(void); -void debug_sub_80125A0(void); -void debug_sub_80125E4(void); -void debug_sub_8012628(void); -void debug_sub_8012658(void); -void debug_sub_8012688(void); -void debug_sub_8012878(void); -void debug_sub_8012D10(u8); -u32 debug_sub_8013294(u8, void *, u32); -void debug_sub_80132C8(u8, void *, u32); - -extern s16 gUnknown_Debug_2023A76[][35]; -extern s16 gUnknown_Debug_2023B02[][6][4]; -extern u8 gUnknown_Debug_03004360; -extern struct Window gUnknown_Debug_03004370; -extern u8 gUnknown_Debug_030043A0; -extern u8 gUnknown_Debug_030043A4; -extern u8 gUnknown_Debug_030043A8; -extern u8 gBattleBuffersTransferData[]; - -extern const u16 gUnknown_Debug_821F424[][5]; -extern const u16 gUnknown_Debug_821F56C[][5]; -extern const u32 gUnknown_Debug_821F798[][4]; - -extern const u8 gUnusedOldCharmap_Gfx_lz[]; -extern const u8 gUnusedOldCharmap_Tilemap_lz[]; -extern const u8 gUnusedOldCharmap_Pal_lz[]; - -void debug_sub_8010800(void) -{ - debug_sub_8010818(); - debug_sub_80108B8(); - *(u32 *)(gBattleBuffersTransferData + 0x100) = 0; -} - -void debug_sub_8010818(void) -{ - s32 i; - - gUnknown_Debug_2023A76[0][0] = 0x115; - gUnknown_Debug_2023A76[1][0] = 0x115; - for (i = 1; i < 31; i++) - { - gUnknown_Debug_2023A76[0][i] = gUnknown_Debug_821F424[i][4]; - gUnknown_Debug_2023A76[1][i] = gUnknown_Debug_821F424[i][4]; - } - - for (i = 0; i < 6; i++) - { - for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++) - { - gUnknown_Debug_2023B02[0][i][gUnknown_Debug_030043A8] = gUnknown_Debug_821F56C[gUnknown_Debug_030043A8][0]; - gUnknown_Debug_2023B02[1][i][gUnknown_Debug_030043A8] = gUnknown_Debug_821F56C[gUnknown_Debug_030043A8][0]; - } - } -} - -void debug_sub_80108B8(void) -{ - s32 i; - - m4aSoundVSyncOff(); - SetHBlankCallback(NULL); - SetVBlankCallback(NULL); - DmaFill32(3, 0, (void *)VRAM, VRAM_SIZE); - REG_IE = 1; - REG_DISPCNT = 0x1340; - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - gBattle_BG3_X = 0; - gBattle_BG3_Y = 0; - REG_BG0CNT = 0x1F09; - REG_BG1CNT = 0x4801; - REG_BLDCNT = 0; - REG_BLDY = 0; - LZDecompressVram(gUnusedOldCharmap_Gfx_lz, (void *)VRAM); - LZDecompressWram(gUnusedOldCharmap_Tilemap_lz, gSharedMem); - LZDecompressVram(gUnusedOldCharmap_Pal_lz, (void *)PLTT); - LZDecompressVram(gUnusedOldCharmap_Pal_lz, (void *)(PLTT + 0x1E0)); - m4aSoundVSyncOn(); - SetVBlankCallback(debug_sub_8011D40); - SetMainCallback2(debug_sub_8010CAC); - ResetTasks(); - ResetSpriteData(); - ScanlineEffect_Stop(); - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - Text_InitWindowWithTemplate(&gUnknown_Debug_03004370, &gWindowTemplate_81E6C3C); - gUnknown_Debug_03004360 = 0; - gUnknown_Debug_030043A0 = 0; - gUnknown_Debug_030043A4 = 0; - for (i = 0; i < 31; i++) - debug_sub_8011EA0(i); - for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++) - debug_sub_8012294(); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - debug_sub_8012540(); - debug_nullsub_3(); - gUnknown_Debug_030043A8 = 0; - debug_sub_80125A0(); - if (gUnknown_Debug_2023A76[0][0x22] == 8) - { - debug_sub_801174C(); - } - else - { - for (i = 0; i < 8; i++) - gSharedMem[0x160B4 + i] = 0; - } -} - -void debug_sub_8010A7C(u8 a, u8 b) -{ - s32 i; - - for (i = 0; i < b; i++) - gBattleTextBuff1[i] = a; - gBattleTextBuff1[i] = EOS; -} - -void debug_sub_8010AAC(u8 a) -{ - switch (gBaseStats[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5]].genderRatio) - { - case 0: - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 2; - break; - case 0xFE: - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 3; - break; - case 0xFF: - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 4; - break; - default: - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] &= 1; - if (a != 0) - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] ^= 1; - else - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 0; - break; - } -} - -// gUnknown_Debug_2023A76 2D array -void debug_sub_8010B80(u8 a) -{ - s8 r12 = 0; - s8 r7 = gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]; - - while (r7 >= 10) - { - r7 -= 10; - r12++; - } - - if (a & 2) - { - if (a & 1) - r12++; - else - r12--; - if (r12 < 0) - r12 = 9; - if (r12 > 9) - r12 = 0; - } - else - { - if (a & 1) - r7++; - else - r7--; - if (r7 < 1) - r7 = 9; - if (r7 > 9) - r7 = 1; - } - gUnknown_Debug_2023A76[gUnknown_Debug_03004360 ^ 1][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5] - = gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5] - = r12 * 10 + r7; -} - -void debug_sub_8010CAC(void) -{ - s32 r5; - - if (gMain.heldKeysRaw == (L_BUTTON | SELECT_BUTTON)) - DoSoftReset(); - if (gMain.newKeysRaw == SELECT_BUTTON) - { - if (gUnknown_Debug_030043A4 < 6) - { - gUnknown_Debug_030043A8 = 0; - debug_sub_8012628(); - SetMainCallback2(debug_sub_8011498); - } - if (gUnknown_Debug_030043A0 == 0 && gUnknown_Debug_030043A4 == 6) - { - gMain.savedCallback = debug_sub_80108B8; - CreateMon( - &gPlayerParty[0], - gUnknown_Debug_2023A76[0][0 * 5 + 0], - gUnknown_Debug_2023A76[0][0 * 5 + 1], - 32, - 0, 0, 0, 0); - for (r5 = 0; r5 < 4; r5++) - { - SetMonData(&gPlayerParty[0], MON_DATA_MOVE1 + r5, &gUnknown_Debug_2023B02[0][0][r5]); - SetMonData(&gPlayerParty[0], MON_DATA_PP1 + r5, &gBattleMoves[gUnknown_Debug_2023B02[0][0][r5]].pp); - } - switch (gUnknown_Debug_2023A76[0][6 * 5 + 0]) - { - case 1: - gCB2_AfterEvolution = debug_sub_80108B8; - EvolutionScene(&gPlayerParty[0], gUnknown_Debug_2023A76[0][1 * 5 + 0], 1, 0); - break; - case 2: - debug_sub_8012688(); - break; - } - } - if (gUnknown_Debug_030043A0 == 1 && gUnknown_Debug_030043A4 == 6) - { - // This is really weird - r5 = (gSaveBlock2.optionsBattleSceneOff | (gSaveBlock2.optionsSound << 1)); - r5++; - if (r5 == 4) - r5 = 0; - gSaveBlock2.optionsBattleSceneOff = (r5 & 1); - gSaveBlock2.optionsSound = (r5 & 2) >> 1; - SetPokemonCryStereo(gSaveBlock2.optionsSound); - debug_nullsub_3(); - } - } - if (gMain.newKeysRaw == START_BUTTON) - debug_sub_801174C(); - if (gMain.newKeysRaw == DPAD_UP) - { - debug_sub_80125E4(); - if (gUnknown_Debug_030043A4 != 0) - gUnknown_Debug_030043A4--; - else - gUnknown_Debug_030043A4 = 6; - debug_sub_8011E74(); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - debug_sub_80125A0(); - } - if (gMain.newKeysRaw == DPAD_DOWN) - { - debug_sub_80125E4(); - if (gUnknown_Debug_030043A4 == 6) - gUnknown_Debug_030043A4 = 0; - else - gUnknown_Debug_030043A4++; - debug_sub_8011E74(); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - debug_sub_80125A0(); - } - if (gMain.newKeysRaw == DPAD_LEFT) - { - debug_sub_80125E4(); - if (gUnknown_Debug_030043A0 != 0) - { - gUnknown_Debug_030043A0--; - } - else - { - if (gUnknown_Debug_03004360 != 0) - { - gUnknown_Debug_03004360 = 0; - gUnknown_Debug_030043A0 = 4; - gBattle_BG1_X = 0; - debug_sub_8011E5C(); - debug_sub_8011E74(); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - } - } - debug_sub_80125A0(); - } - if (gMain.newKeysRaw == DPAD_RIGHT) - { - debug_sub_80125E4(); - if (gUnknown_Debug_030043A0 != 4) - { - gUnknown_Debug_030043A0++; - } - else - { - if (gUnknown_Debug_03004360 == 0) - { - gUnknown_Debug_03004360 = 1; - gUnknown_Debug_030043A0 = 0; - gBattle_BG1_X = 0x100; - debug_sub_8011E5C(); - debug_sub_8011E74(); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - } - } - debug_sub_80125A0(); - } - if (gMain.newAndRepeatedKeys & B_BUTTON) - { - switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5) - { - case 31: - debug_sub_8010818(); - debug_sub_8011E5C(); - debug_sub_8011E74(); - debug_sub_8012540(); - debug_nullsub_3(); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - break; - case 32: - debug_sub_80132C8(31, gUnknown_Debug_2023A76, 0xEC); - debug_sub_8011E5C(); - debug_sub_8011E74(); - debug_sub_8012540(); - debug_nullsub_3(); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - break; - case 33: - debug_sub_8013294(31, gUnknown_Debug_2023A76, 0xEC); - break; - case 34: - if (gUnknown_Debug_2023A76[0][6 * 5 + 4] != 0) - { - gUnknown_Debug_2023A76[0][6 * 5 + 4]--; - gUnknown_Debug_2023A76[1][6 * 5 + 4]--; - } - else - { - gUnknown_Debug_2023A76[0][6 * 5 + 4] = 8; - gUnknown_Debug_2023A76[1][6 * 5 + 4] = 8; - } - debug_sub_8012540(); - break; - case 30: - debug_sub_8010B80(0); - debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); - break; - default: - if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) - { - debug_sub_8010AAC(1); - } - else - { - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]--; - if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]) - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; - } - if (gUnknown_Debug_030043A0 == 0) - { - debug_sub_8010AAC(0); - debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); - } - debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - break; - } - } - if (gMain.newAndRepeatedKeys & A_BUTTON) - { - switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5) - { - case 31: - debug_sub_8010818(); - debug_sub_8011E5C(); - debug_sub_8011E74(); - debug_sub_8012540(); - debug_nullsub_3(); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - break; - case 32: - debug_sub_80132C8(31, gUnknown_Debug_2023A76, 0xEC); - debug_sub_8011E5C(); - debug_sub_8011E74(); - debug_sub_8012540(); - debug_nullsub_3(); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - break; - case 33: - debug_sub_8013294(31, gUnknown_Debug_2023A76, 0xEC); - break; - case 34: - if (gUnknown_Debug_2023A76[0][6 * 5 + 4] < 8) - { - gUnknown_Debug_2023A76[0][6 * 5 + 4]++; - gUnknown_Debug_2023A76[1][6 * 5 + 4]++; - } - else - { - gUnknown_Debug_2023A76[0][6 * 5 + 4] = 0; - gUnknown_Debug_2023A76[1][6 * 5 + 4] = 0; - } - debug_sub_8012540(); - break; - case 30: - debug_sub_8010B80(1); - debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); - break; - default: - if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) - { - debug_sub_8010AAC(1); - } - else - { - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]++; - if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]) - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]; - } - if (gUnknown_Debug_030043A0 == 0) - { - debug_sub_8010AAC(0); - debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); - } - debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - break; - } - } - if (gMain.newAndRepeatedKeys & L_BUTTON) - { - if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) - { - debug_sub_8010AAC(1); - } - else - { - if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30) - { - debug_sub_8010B80(2); - } - else - { - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= 10; - while (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]) - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; - } - } - if (gUnknown_Debug_030043A0 == 0) - { - debug_sub_8010AAC(0); - debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); - } - debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - } - if (gMain.newAndRepeatedKeys & R_BUTTON) - { - if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) - { - debug_sub_8010AAC(1); - } - else - { - if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30) - { - debug_sub_8010B80(3); - } - else - { - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += 10; - while (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]) - gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; - } - } - if (gUnknown_Debug_030043A0 == 0) - { - debug_sub_8010AAC(0); - debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); - } - debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); - debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); - } - AnimateSprites(); - BuildOamBuffer(); -} - -extern u16 gUnknown_Debug_821F564[][5]; - -void debug_sub_8011498(void) -{ - u8 r9 = gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5; - - if (gMain.heldKeysRaw == (L_BUTTON | SELECT_BUTTON)) - DoSoftReset(); - if (gMain.newKeysRaw == SELECT_BUTTON) - { - debug_sub_8012658(); - SetMainCallback2(debug_sub_8010CAC); - } - if (gMain.newKeysRaw == START_BUTTON) - debug_sub_801174C(); - if (gMain.newKeysRaw == DPAD_UP || gMain.newKeysRaw == DPAD_DOWN) - { - debug_sub_8012658(); - gUnknown_Debug_030043A8 ^= 2; - debug_sub_8012628(); - } - if (gMain.newKeysRaw == DPAD_LEFT || gMain.newKeysRaw == DPAD_RIGHT) - { - debug_sub_8012658(); - gUnknown_Debug_030043A8 ^= 1; - debug_sub_8012628(); - } - if (gMain.newAndRepeatedKeys & B_BUTTON) - { - gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8]--; - if (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] < gUnknown_Debug_821F564[gUnknown_Debug_030043A8][4]) - gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] = gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3]; - debug_sub_8012294(); - } - if (gMain.newAndRepeatedKeys & A_BUTTON) - { - gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8]++; - if (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] > gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3]) - gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] = gUnknown_Debug_821F564[gUnknown_Debug_030043A8][4]; - debug_sub_8012294(); - } - if (gMain.newAndRepeatedKeys & L_BUTTON) - { - gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] -= 10; - while (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] < gUnknown_Debug_821F564[gUnknown_Debug_030043A8][4]) - gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] += gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3]; - debug_sub_8012294(); - } - if (gMain.newAndRepeatedKeys & R_BUTTON) - { - gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] += 10; - while (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] > gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3]) - gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] -= gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3]; - debug_sub_8012294(); - } - AnimateSprites(); - BuildOamBuffer(); -} - -extern const u16 gUnknown_Debug_821F598[]; -extern const u8 str_821F631[][6]; -extern const u8 Str_821F649[]; -extern const struct Pokeblock gUnknown_Debug_821F5AC[]; - -extern u8 gUnknown_020297ED; - -extern void debug_sub_800D684(void); - -void debug_sub_801174C(void) -{ - u8 r9 = 0; - u8 r6; - s32 i; - s32 spC; - u16 sp10; - - gUnknown_020297ED = 1; - r6 = Random() % 4; - StringCopy(gSaveBlock2.playerName, str_821F631[r6]); - gSaveBlock2.playerGender = r6 >> 1; - ZeroPlayerPartyMons(); - ZeroEnemyPartyMons(); - i = gUnknown_Debug_2023A76[0][30]; - spC = 0; - if (i >= 10) - { - spC = 0; - while (i >= 10) - { - i -= 10; - spC++; - } - } - gBattleTypeFlags = gUnknown_Debug_821F598[i - 1]; - gUnknown_02023A14_50 = 8; - gBattleTerrain = spC; - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - EnterSafariMode(); - if (gUnknown_Debug_2023A76[0][30] >= 2 && gUnknown_Debug_2023A76[0][30] <= 4) - gTrainerBattleOpponent = (Random() & 7) + 1; - - gPlayerPartyCount = 0; - for (i = 0; i < 30; i += 5) - { - if (gUnknown_Debug_2023A76[0][i] != 0) - { - switch (gUnknown_Debug_2023A76[0][i + 4]) - { - case 0: - case 2: - r6 = 0; - break; - case 1: - case 3: - r6 = 0xFE; - break; - default: - r6 = 0xFF; - break; - } - if (gUnknown_Debug_2023A76[0][i] == 0xC9 && i + 5 < 30) - r9 = gUnknown_Debug_2023A76[0][i + 7]; - else - r9 = 0; - CreateMonWithGenderNatureLetter( - &gEnemyParty[i / 5], - gUnknown_Debug_2023A76[0][i], - gUnknown_Debug_2023A76[0][i + 1], - 0, - r6, - 0, - r9); - } - SetMonData(&gEnemyParty[i / 5], MON_DATA_HELD_ITEM, &gUnknown_Debug_2023A76[0][i + 2]); - sp10 = gUnknown_Debug_2023A76[0][i + 2] - 1; - if (sp10 <= 11) - SetMonData(&gEnemyParty[i / 5], MON_DATA_POKEBALL, &gUnknown_Debug_2023A76[0][i + 2]); - if (gUnknown_Debug_2023A76[0][i + 3] != 0 && gUnknown_Debug_2023A76[0][i + 3] != 3) - { - if (gUnknown_Debug_2023A76[0][i + 3] <= 2) - spC = gUnknown_Debug_2023A76[0][i + 3] - 1; - else - spC = gUnknown_Debug_2023A76[0][i + 3] - 4; - SetMonData(&gEnemyParty[i / 5], MON_DATA_ALT_ABILITY, &spC); - } - - if (gUnknown_Debug_2023A76[1][i] != 0) - { - switch (gUnknown_Debug_2023A76[1][i + 4]) - { - case 0: - case 2: - r6 = 0; - break; - case 1: - case 3: - r6 = 0xFE; - break; - default: - r6 = 0xFF; - break; - } - if (gUnknown_Debug_2023A76[1][i] == 0xC9 && i + 5 < 30) - r9 = gUnknown_Debug_2023A76[1][i + 7]; - else - r9 = 0; - CreateMonWithGenderNatureLetter( - &gPlayerParty[i / 5], - gUnknown_Debug_2023A76[1][i], - gUnknown_Debug_2023A76[1][i + 1], - 0, - r6, - 0, - r9); - gPlayerPartyCount++; - } - SetMonData(&gPlayerParty[i / 5], MON_DATA_HELD_ITEM, &gUnknown_Debug_2023A76[1][i + 2]); - sp10 = gUnknown_Debug_2023A76[0][i + 2] - 1; - if (sp10 <= 11) - SetMonData(&gPlayerParty[i / 5], MON_DATA_POKEBALL, &gUnknown_Debug_2023A76[1][i + 2]); - if (gUnknown_Debug_2023A76[1][i + 3] != 0 && gUnknown_Debug_2023A76[1][i + 3] != 3) - { - if (gUnknown_Debug_2023A76[1][i + 3] <= 2) - spC = gUnknown_Debug_2023A76[1][i + 3] - 1; - else - spC = gUnknown_Debug_2023A76[1][i + 3] - 4; - SetMonData(&gPlayerParty[i / 5], MON_DATA_ALT_ABILITY, &spC); - } - if (gUnknown_Debug_2023A76[1][i + 3] > 2) - { - SetMonData(&gPlayerParty[i / 5], MON_DATA_OT_NAME, Str_821F649); - gUnknown_02023A14_50 |= 0x40; - } - } - - for (spC = 0; spC < 6; spC++) - { - for (i = 0; i < 4; i++) - { - SetMonData(&gEnemyParty[spC], MON_DATA_MOVE1 + i, &gUnknown_Debug_2023B02[0][spC][i]); - SetMonData(&gEnemyParty[spC], MON_DATA_PP1 + i, &gBattleMoves[gUnknown_Debug_2023B02[0][spC][i]].pp); - SetMonData(&gPlayerParty[spC], MON_DATA_MOVE1 + i, &gUnknown_Debug_2023B02[1][spC][i]); - SetMonData(&gPlayerParty[spC], MON_DATA_PP1 + i, &gBattleMoves[gUnknown_Debug_2023B02[1][spC][i]].pp); - } - } - - if (gUnknown_Debug_2023A76[0][0x22] == 8) - { - gUnknown_02023A14_50 |= 0x80; - sub_80408BC(); - } - else if (gUnknown_Debug_2023A76[0][0x22] == 7) - { - gUnknown_02023A14_50 |= 0x20; - sub_80408BC(); - } - else if (gUnknown_Debug_2023A76[0][0x22] == 6) - { - gUnknown_02023A14_50 |= 0x10; - if (gUnknown_Debug_2023A76[0][2] > 5) - gSharedMem[0x160A3] = gUnknown_Debug_2023A76[0][2] - 2; - else - gSharedMem[0x160A3] = gUnknown_Debug_2023A76[0][2]; - sub_80408BC(); - } - else if (gUnknown_Debug_2023A76[0][0x22] == 5) - { - gUnknown_02023A14_50 |= 0x21; - sub_80408BC(); - } - else - { - if (!(gUnknown_Debug_2023A76[0][0x22] & 1)) - sub_80408BC(); - if (gUnknown_Debug_2023A76[0][0x22] & 2) - gUnknown_02023A14_50 |= 4; - if (gUnknown_Debug_2023A76[0][0x22] & 4) - gUnknown_02023A14_50 |= 6; - } - - gMain.savedCallback = debug_sub_80108B8; - SetMainCallback2(debug_sub_800D684); - - ClearBag(); - - AddBagItem(ITEM_MASTER_BALL, 10); - AddBagItem(ITEM_ULTRA_BALL, 10); - AddBagItem(ITEM_GREAT_BALL, 10); - AddBagItem(ITEM_POKE_BALL, 10); - AddBagItem(ITEM_SAFARI_BALL, 10); - AddBagItem(ITEM_NET_BALL, 10); - AddBagItem(ITEM_DIVE_BALL, 10); - AddBagItem(ITEM_NEST_BALL, 10); - AddBagItem(ITEM_REPEAT_BALL, 10); - AddBagItem(ITEM_TIMER_BALL, 10); - AddBagItem(ITEM_LUXURY_BALL, 10); - AddBagItem(ITEM_PREMIER_BALL, 10); - - AddBagItem(ITEM_FULL_RESTORE, 99); - AddBagItem(ITEM_MAX_POTION, 99); - AddBagItem(ITEM_MAX_REVIVE, 99); - AddBagItem(ITEM_ETHER, 99); - AddBagItem(ITEM_MAX_ETHER, 99); - AddBagItem(ITEM_MAX_ELIXIR, 99); - - AddBagItem(ITEM_GUARD_SPEC, 99); - AddBagItem(ITEM_DIRE_HIT, 99); - AddBagItem(ITEM_X_ATTACK, 99); - AddBagItem(ITEM_X_DEFEND, 99); - AddBagItem(ITEM_X_SPEED, 99); - AddBagItem(ITEM_X_ACCURACY, 99); - // hmm... no X Special? Why do we need Poke Doll? - AddBagItem(ITEM_POKE_DOLL, 99); - - for (i = 0; i < 15; i++) - GivePokeblock(&gUnknown_Debug_821F5AC[i]); -} - -void debug_sub_8011D40(void) -{ - DmaCopy16(3, gSharedMem, (void *)(VRAM + 0x4000), 0x1000); - REG_BG0HOFS = gBattle_BG0_X; - REG_BG0VOFS = gBattle_BG0_Y; - REG_BG1HOFS = gBattle_BG1_X; - REG_BG1VOFS = gBattle_BG1_Y; - REG_BG2HOFS = gBattle_BG2_X; - REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gBattle_BG3_X; - REG_BG3VOFS = gBattle_BG3_Y; - LoadOam(); - ProcessSpriteCopyRequests(); -} - -void debug_nullsub_45() -{ -} - -void debug_sub_8011DD4(void) -{ - REG_BG0CNT = 0x9803; - - REG_BG0HOFS = gBattle_BG0_X; - REG_BG0VOFS = gBattle_BG0_Y; - - REG_BG1HOFS = gBattle_BG1_X; - REG_BG1VOFS = gBattle_BG1_Y; - - REG_BG2HOFS = gBattle_BG2_X; - REG_BG2VOFS = gBattle_BG2_Y; - - REG_BG3HOFS = gBattle_BG3_X; - REG_BG3VOFS = gBattle_BG3_Y; - - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - ScanlineEffect_InitHBlankDmaTransfer(); -} - -void debug_sub_8011E5C(void) -{ - s32 i; - - for (i = 0; i < 31; i++) - debug_sub_8011EA0(i); -} - -extern u8 gUnknown_Debug_030043A8; - -void debug_sub_8011E74(void) -{ - u8 r5 = gUnknown_Debug_030043A8; - - for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++) - debug_sub_8012294(); - - gUnknown_Debug_030043A8 = r5; -} - -extern const u8 Str_821F624[]; - -void debug_sub_8011EA0(u8 a) -{ - u32 length; - - switch (a) - { - case 0: - case 5: - case 10: - case 15: - case 20: - case 25: - debug_sub_8010A7C(0, 20); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F424[a][0], - gUnknown_Debug_821F424[a][1], - gUnknown_Debug_821F424[a][2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - 422, - gUnknown_Debug_03004360 * 32 + 25, - 0); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - gBattleTextBuff1[0] = EOS; - StringAppend(gBattleTextBuff1, gSpeciesNames[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]]); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F424[a][0], - gUnknown_Debug_821F424[a][1], - gUnknown_Debug_821F424[a][2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - break; - case 1: - case 6: - case 11: - case 16: - case 21: - case 26: - case 30: - ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F424[a][0], - gUnknown_Debug_821F424[a][1], - gUnknown_Debug_821F424[a][2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - break; - case 2: - case 7: - case 12: - case 17: - case 22: - case 27: - debug_sub_8010A7C(0, 24); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F424[a][0], - gUnknown_Debug_821F424[a][1], - gUnknown_Debug_821F424[a][2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - 422, - gUnknown_Debug_03004360 * 32 + 25, - 0); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - gBattleTextBuff1[0] = EOS; - if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a] != 0) - StringAppend(gBattleTextBuff1, ItemId_GetName(gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a])); - else - StringAppend(gBattleTextBuff1, Str_821F624); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F424[a][0], - gUnknown_Debug_821F424[a][1], - gUnknown_Debug_821F424[a][2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - break; - case 4: - case 9: - case 14: - case 19: - case 24: - case 29: - debug_sub_8010A7C(0, 4); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F424[a][0], - gUnknown_Debug_821F424[a][1], - gUnknown_Debug_821F424[a][2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - length = 0; - switch (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]) - { - case 0: - gBattleTextBuff1[0] = CHAR_MALE; - length = 1; - break; - case 1: - gBattleTextBuff1[0] = CHAR_FEMALE; - length = 1; - break; - case 2: - gBattleTextBuff1[0] = CHAR_MALE; - gBattleTextBuff1[1] = CHAR_MALE; - length = 2; - break; - case 3: - gBattleTextBuff1[0] = CHAR_FEMALE; - gBattleTextBuff1[1] = CHAR_FEMALE; - length = 2; - break; - default: - gBattleTextBuff1[length] = CHAR_QUESTION_MARK; - length++; - break; - } - gBattleTextBuff1[length] = EOS; - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F424[a][0], - gUnknown_Debug_821F424[a][1], - gUnknown_Debug_821F424[a][2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - break; - case 3: - case 8: - case 13: - case 18: - case 23: - case 28: - default: - ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 1); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F424[a][0], - gUnknown_Debug_821F424[a][1], - gUnknown_Debug_821F424[a][2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - break; - case 31: - case 32: - case 33: - case 34: - break; - } -} - -void debug_sub_8012294(void) -{ - u8 r5 = gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5; - - if (r5 < 30) - { - debug_sub_8010A7C(0, 24); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F564[gUnknown_Debug_030043A8][0], - gUnknown_Debug_821F564[gUnknown_Debug_030043A8][1], - gUnknown_Debug_821F564[gUnknown_Debug_030043A8][2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r5 / 5][gUnknown_Debug_030043A8], 2, 3); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - 422, - gUnknown_Debug_03004360 * 32 + 25, - 0); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - gBattleTextBuff1[0] = EOS; - StringAppend(gBattleTextBuff1, gMoveNames[gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r5 / 5][gUnknown_Debug_030043A8]]); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F564[gUnknown_Debug_030043A8][0], - gUnknown_Debug_821F564[gUnknown_Debug_030043A8][1], - gUnknown_Debug_821F564[gUnknown_Debug_030043A8][2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - } -} - -extern const u16 gUnknown_Debug_821F58C[]; - -void debug_sub_80123D8(u8 a) -{ - if (a < 30) - { - debug_sub_8010A7C(0, 18); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F58C[0], - gUnknown_Debug_821F58C[1], - gUnknown_Debug_821F58C[2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - StringCopy(gBattleTextBuff1, gAbilityNames[gBaseStats[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]].ability1]); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F58C[0], - gUnknown_Debug_821F58C[1], - gUnknown_Debug_821F58C[2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - debug_sub_8010A7C(0, 18); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F58C[3], - gUnknown_Debug_821F58C[4], - gUnknown_Debug_821F58C[5]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - StringCopy(gBattleTextBuff1, gAbilityNames[gBaseStats[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]].ability2]); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F58C[3], - gUnknown_Debug_821F58C[4], - gUnknown_Debug_821F58C[5]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - } - else - { - StringCopy(gBattleTextBuff1, gAbilityNames[0]); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F58C[0], - gUnknown_Debug_821F58C[1], - gUnknown_Debug_821F58C[2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F58C[3], - gUnknown_Debug_821F58C[4], - gUnknown_Debug_821F58C[5]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); - } -} - -void debug_sub_8012540(void) -{ - ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[0][0x22], 0, 1); - Text_InitWindow( - &gUnknown_Debug_03004370, - gBattleTextBuff1, - gUnknown_Debug_821F424[31][0], - gUnknown_Debug_821F424[31][1], - gUnknown_Debug_821F424[31][2]); - Text_PrintWindow8002F44(&gUnknown_Debug_03004370); -} - -void debug_nullsub_3(void) -{ -} - -extern const u32 gUnknown_Debug_821F680[][0x23]; - -void debug_sub_80125A0(void) -{ - gSharedMem[gUnknown_Debug_821F680[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]] = 0x6D; -} - -void debug_sub_80125E4(void) -{ - gSharedMem[gUnknown_Debug_821F680[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]] = 0x81; -} - -void debug_sub_8012628(void) -{ - gSharedMem[gUnknown_Debug_821F798[gUnknown_Debug_03004360][gUnknown_Debug_030043A8]] = 0x6D; -} - -void debug_sub_8012658(void) -{ - gSharedMem[gUnknown_Debug_821F798[gUnknown_Debug_03004360][gUnknown_Debug_030043A8]] = 0x81; -} - -void debug_sub_8012688(void) -{ - s32 i; - u8 spriteId; - u8 taskId; - - for (i = 0; i < 411; i++) - gUnknown_Debug_2023B62[i] = 0; - SetHBlankCallback(NULL); - SetVBlankCallback(NULL); - DmaFill32(3, 0, (void *)VRAM, VRAM_SIZE); - REG_MOSAIC = 0; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_WININ = 0; - REG_WINOUT = 0; - Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); - ResetPaletteFade(); - gBattle_BG0_X = 0; - gBattle_BG0_Y = DISPLAY_HEIGHT; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - gBattle_BG3_X = 0; - gBattle_BG3_Y = 0; - gBattleTerrain = 9; - sub_800D6D4(); - LoadBattleTextboxAndBackground(); - ResetSpriteData(); - ResetTasks(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 4; - gCurrentMove = 1; - Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); - DecompressPicFromTable_2( - &gMonFrontPicTable[gCurrentMove], - gMonFrontPicCoords[gCurrentMove].coords, - gMonFrontPicCoords[gCurrentMove].y_offset, - (void *)EWRAM, - gUnknown_081FAF4C[1], - gCurrentMove); - LoadCompressedPalette(gMonPaletteTable[gCurrentMove].data, 272, 32); - GetMonSpriteTemplate_803C56C(gCurrentMove, 1); - spriteId = CreateSprite(&gUnknown_02024E8C, 176, 40 + gMonFrontPicCoords[gCurrentMove].y_offset, 40); - gSprites[spriteId].callback = nullsub_37; - gSprites[spriteId].oam.paletteNum = 1; - REG_DISPCNT = 0x1F40; - SetHBlankCallback(debug_nullsub_45); - SetVBlankCallback(debug_sub_8011DD4); - m4aMPlayAllStop(); - taskId = CreateTask(debug_sub_8012D10, 0); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = spriteId; - SetMainCallback2(debug_sub_8012878); -} - -void debug_sub_8012878(void) -{ - AnimateSprites(); - BuildOamBuffer(); - Text_UpdateWindowInBattle(&gUnknown_03004210); - UpdatePaletteFade(); - RunTasks(); - if (gMain.heldKeys == (SELECT_BUTTON | R_BUTTON)) - SetMainCallback2(debug_sub_80108B8); -} - -void debug_sub_80128B4(void) -{ - debug_sub_8010A7C(0, 9); - Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35); - Text_PrintWindow8002F44(&gUnknown_03004210); - ConvertIntToDecimalStringN(gBattleTextBuff1, gCurrentMove, 2, 3); - gBattleTextBuff1[3] = CHAR_SPACE; - gBattleTextBuff1[4] = EOS; - StringAppend(gBattleTextBuff1, gSpeciesNames[gCurrentMove]); - Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35); - Text_PrintWindow8002F44(&gUnknown_03004210); -} - -void debug_sub_8012938(u8 taskId) -{ - debug_sub_8010A7C(0, 7); - Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 162, 2, 37); - Text_PrintWindow8002F44(&gUnknown_03004210); - StringCopy(gBattleTextBuff1, Str_821F7B8); - ConvertIntToDecimalStringN(gBattleTextBuff1 + 4, gUnknown_Debug_2023B62[gCurrentMove - 1], 2, 3); - Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 162, 2, 37); - Text_PrintWindow8002F44(&gUnknown_03004210); - gSprites[gTasks[taskId].data[1]].pos2.y = -gUnknown_Debug_2023B62[gCurrentMove - 1]; -} - -void debug_sub_80129F8(u8 taskId) -{ - DecompressPicFromTable_2( - &gMonFrontPicTable[gCurrentMove], - gMonFrontPicCoords[gCurrentMove].coords, - gMonFrontPicCoords[gCurrentMove].y_offset, - (void *)EWRAM, - gUnknown_081FAF4C[1], - gCurrentMove); - LoadCompressedPalette(gMonPaletteTable[gCurrentMove].data, 272, 32); - gSprites[gTasks[taskId].data[1]].pos1.y = gMonFrontPicCoords[gCurrentMove].y_offset + 40; - gSprites[gTasks[taskId].data[1]].pos2.y = -gUnknown_Debug_2023B62[gCurrentMove - 1]; - StartSpriteAnim(&gSprites[gTasks[taskId].data[1]], 0); -} - -void debug_sub_8012AC0(s8 a, u8 taskId) -{ - do - { - gCurrentMove += a; - if (gCurrentMove == 0) - gCurrentMove = 411; - if (gCurrentMove == 411) - gCurrentMove = 1; - } while (gBaseStats[gCurrentMove].type1 != 2 && gBaseStats[gCurrentMove].type2 != 2); - debug_sub_80128B4(); - debug_sub_8012938(taskId); - debug_sub_80129F8(taskId); -} - -void debug_sub_8012B2C(u8 a) -{ - *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 0) * 0x20) = 1; - *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 2) * 0x20) = 2; -} - -void debug_sub_8012B4C(u8 a) -{ - *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 0) * 0x20) = 0x1016; - *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 2) * 0x20) = 0x1016; -} - -void debug_sub_8012B70(u8 taskId, u8 b) -{ - if (b != 0) - { - sub_802BBD4(24, 28, 29, 33, 1); - debug_sub_80128B4(); - debug_sub_8012938(taskId); - debug_sub_80129F8(taskId); - gTasks[taskId].data[0] = 1; - } - else - { - sub_802BBD4(24, 28, 29, 33, 0); - gTasks[taskId].data[0] = 2; - Text_InitWindow(&gUnknown_03004210, Str_821F7DA, 656, 26, 29); - Text_PrintWindow8002F44(&gUnknown_03004210); - gTasks[taskId].data[3] = 0; - debug_sub_8012B2C(0); - } -} - -void debug_sub_8012C08(u8 taskId, u8 b) -{ - debug_sub_8010A7C(0, 9); - Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35); - Text_PrintWindow8002F44(&gUnknown_03004210); - debug_sub_8010A7C(0, 7); - Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 162, 2, 37); - Text_PrintWindow8002F44(&gUnknown_03004210); - sub_802BBD4(24, 28, 29, 33, 0); - if (b != 0) - { - gTasks[taskId].data[0] = 4; - Text_InitWindow(&gUnknown_03004210, gUnknown_Debug_821F7F3, 144, 2, 35); - } - else - { - gTasks[taskId].data[0] = 3; - Text_InitWindow(&gUnknown_03004210, Str_821F7EA, 144, 2, 35); - } - Text_PrintWindow8002F44(&gUnknown_03004210); - Text_InitWindow(&gUnknown_03004210, BattleText_YesNo, 656, 26, 29); - Text_PrintWindow8002F44(&gUnknown_03004210); - gTasks[taskId].data[3] = 1; - debug_sub_8012B2C(1); -} - -void debug_sub_8012D10(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - debug_sub_80128B4(); - debug_sub_8012938(taskId); - Text_InitWindow(&gUnknown_03004210, Str_821F7BD, 400, 19, 35); - Text_PrintWindow8002F44(&gUnknown_03004210); - gTasks[taskId].data[0]++; - sub_802E3E4(gTasks[taskId].data[2], 0); - break; - case 1: - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - nullsub_8(gTasks[taskId].data[2]); - gTasks[taskId].data[2] &= ~2; - sub_802E3E4(gTasks[taskId].data[2], 0); - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - nullsub_8(gTasks[taskId].data[2]); - gTasks[taskId].data[2] |= 2; - sub_802E3E4(gTasks[taskId].data[2], 0); - } - else if (gMain.newKeys & DPAD_LEFT) - { - PlaySE(SE_SELECT); - nullsub_8(gTasks[taskId].data[2]); - gTasks[taskId].data[2] &= ~1; - sub_802E3E4(gTasks[taskId].data[2], 0); - } - else if (gMain.newKeys & DPAD_RIGHT) - { - PlaySE(SE_SELECT); - nullsub_8(gTasks[taskId].data[2]); - gTasks[taskId].data[2] |= 1; - sub_802E3E4(gTasks[taskId].data[2], 0); - } - else if (gMain.newAndRepeatedKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - switch (gTasks[taskId].data[2]) - { - case 0: - if (gUnknown_Debug_2023B62[gCurrentMove - 1] < 64) - { - gUnknown_Debug_2023B62[gCurrentMove - 1] += 1; - debug_sub_8012938(taskId); - } - break; - case 1: - debug_sub_8012AC0(1, taskId); - break; - case 2: - if (gCurrentMove < 411) - gCurrentMove++; - else - gCurrentMove = 1; - debug_sub_80128B4(); - debug_sub_8012938(taskId); - debug_sub_80129F8(taskId); - break; - case 3: - debug_sub_8012B70(taskId, 0); - break; - } - } - else if (gMain.newAndRepeatedKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - switch (gTasks[taskId].data[2]) - { - case 0: - if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 0) - { - gUnknown_Debug_2023B62[gCurrentMove - 1] -= 1; - debug_sub_8012938(taskId); - } - break; - case 1: - debug_sub_8012AC0(-1, taskId); - break; - case 2: - if (gCurrentMove > 1) - gCurrentMove--; - else - gCurrentMove = 411; - debug_sub_80128B4(); - debug_sub_8012938(taskId); - debug_sub_80129F8(taskId); - break; - case 3: - debug_sub_8012B70(taskId, 0); - break; - } - } - else if (gMain.newAndRepeatedKeys & R_BUTTON) - { - PlaySE(SE_SELECT); - switch (gTasks[taskId].data[2]) - { - case 0: - if (gUnknown_Debug_2023B62[gCurrentMove - 1] < 64) - { - gUnknown_Debug_2023B62[gCurrentMove - 1] += 8; - if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 64) - gUnknown_Debug_2023B62[gCurrentMove - 1] = 64; - debug_sub_8012938(taskId); - } - break; - case 1: - debug_sub_8012AC0(1, taskId); - break; - case 2: - if (gCurrentMove + 10 < 412) - gCurrentMove += 10; - else - gCurrentMove -= 400; - debug_sub_80128B4(); - debug_sub_8012938(taskId); - debug_sub_80129F8(taskId); - break; - case 3: - debug_sub_8012B70(taskId, 0); - break; - } - } - else if (gMain.newAndRepeatedKeys & L_BUTTON) - { - PlaySE(SE_SELECT); - switch (gTasks[taskId].data[2]) - { - case 0: - if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 0) - { - if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 8) - gUnknown_Debug_2023B62[gCurrentMove - 1] -= 8; - else - gUnknown_Debug_2023B62[gCurrentMove - 1] = 0; - debug_sub_8012938(taskId); - } - break; - case 1: - debug_sub_8012AC0(-1, taskId); - break; - case 2: - if (gCurrentMove - 10 > 1) - gCurrentMove -= 10; - else - gCurrentMove += 400; - debug_sub_80128B4(); - debug_sub_8012938(taskId); - debug_sub_80129F8(taskId); - break; - case 3: - debug_sub_8012B70(taskId, 0); - break; - } - } - break; - case 2: - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - debug_sub_8012B4C(gTasks[taskId].data[3]); - gTasks[taskId].data[3] = 0; - debug_sub_8012B2C(0); - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - debug_sub_8012B4C(gTasks[taskId].data[3]); - gTasks[taskId].data[3] = 1; - debug_sub_8012B2C(1); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - debug_sub_8012C08(taskId, gTasks[taskId].data[3]); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - asm(""); - debug_sub_8012B70(taskId, 1); - } - return; - case 3: - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - debug_sub_8012B4C(gTasks[taskId].data[3]); - gTasks[taskId].data[3] = 0; - debug_sub_8012B2C(0); - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - debug_sub_8012B4C(gTasks[taskId].data[3]); - gTasks[taskId].data[3] = 1; - debug_sub_8012B2C(1); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gTasks[taskId].data[3] == 0) - debug_sub_80132C8(31, gUnknown_Debug_2023B62, 411); - debug_sub_8012B70(taskId, 1); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - debug_sub_8012B70(taskId, 1); - } - break; - case 4: - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - debug_sub_8012B4C(gTasks[taskId].data[3]); - gTasks[taskId].data[3] = 0; - debug_sub_8012B2C(0); - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - debug_sub_8012B4C(gTasks[taskId].data[3]); - gTasks[taskId].data[3] = 1; - debug_sub_8012B2C(1); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gTasks[taskId].data[3] == 0) - debug_sub_8013294(31, gUnknown_Debug_2023B62, 411); - debug_sub_8012B70(taskId, 1); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - debug_sub_8012B70(taskId, 1); - } - break; - } -} - -u8 debug_sub_8013240(void) -{ - if (IdentifyFlash() == 0) - return 0; - else - return 1; -} - -u32 debug_sub_8013258(u16 sectorNum, u8 *data, u32 size) -{ - while (1) - { - if (ProgramFlashSectorAndVerify(sectorNum, data) != 0) - return 0; - if (size <= 0x1000) - break; - size -= 0x1000; - data += 0x1000; - sectorNum++; - } - return 1; -} - -u32 debug_sub_8013294(u8 sectorNum, void *data, u32 size) -{ - u32 result; - - if (debug_sub_8013240() != 0) - return 0; - m4aSoundVSyncOff(); - result = debug_sub_8013258(sectorNum, data, size); - m4aSoundVSyncOn(); - return result; -} - -void debug_sub_80132C8(u8 a, void *b, u32 c) -{ - if (debug_sub_8013240() == 0) - ReadFlash(a, 0, b, c); -} -#endif - -void oac_poke_opponent(struct Sprite *sprite) -{ - sprite->callback = sub_8010278; - StartSpriteAnimIfDifferent(sprite, 0); - BeginNormalPaletteFade(0x00020000, 0, 10, 10, RGB(15, 15, 15)); -} - -void sub_8010278(struct Sprite *sprite) -{ - if ((gUnknown_02024DE8 & 1) == 0) - { - sprite->pos2.x += 2; - if (sprite->pos2.x == 0) - { - sprite->callback = sub_80102AC; - PlayCry1(sprite->data[2], 25); - } - } -} - -void sub_80102AC(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - sub_804777C(sprite->data[0]); - sub_8043DFC(gHealthboxIDs[sprite->data[0]]); - sprite->callback = nullsub_37; - StartSpriteAnimIfDifferent(sprite, 0); - BeginNormalPaletteFade(0x00020000, 0, 10, 0, RGB(15, 15, 15)); - } -} - -void nullsub_37(struct Sprite *sprite) -{ -} - -void unref_sub_801030C(struct Sprite *sprite) -{ - sprite->data[3] = 6; - sprite->data[4] = 1; - sprite->callback = sub_8010320; -} - -void sub_8010320(struct Sprite *sprite) -{ - sprite->data[4]--; - if (sprite->data[4] == 0) - { - sprite->data[4] = 8; - sprite->invisible ^= 1; - sprite->data[3]--; - if (sprite->data[3] == 0) - { - sprite->invisible = FALSE; - sprite->callback = nullsub_37; - gUnknown_03004284 = 0; - } - } -} - -void sub_8010384(struct Sprite *sprite) -{ - u8 r6 = sprite->data[0]; - u16 species; - u8 yOffset; - - if (ewram17800[r6].transformedSpecies != 0) - species = ewram17800[r6].transformedSpecies; - else - species = sprite->data[2]; - - GetMonData(&gEnemyParty[gBattlerPartyIndexes[r6]], MON_DATA_PERSONALITY); // Unused return value - - if (species == SPECIES_UNOWN) - { - u32 personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[r6]], MON_DATA_PERSONALITY); - u16 unownForm = ((((personalityValue & 0x3000000) >> 18) | ((personalityValue & 0x30000) >> 12) | ((personalityValue & 0x300) >> 6) | (personalityValue & 3)) % 0x1C); - u16 unownSpecies; - - if (unownForm == 0) - unownSpecies = SPECIES_UNOWN; // Use the A Unown form - else - unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters - - yOffset = gMonFrontPicCoords[unownSpecies].y_offset; - } - else if (species == SPECIES_CASTFORM) - { - yOffset = gCastformFrontSpriteCoords[gBattleMonForms[r6]].y_offset; - } - else if (species > NUM_SPECIES) - { - yOffset = gMonFrontPicCoords[SPECIES_NONE].y_offset; - } - else - { - yOffset = gMonFrontPicCoords[species].y_offset; - } - - sprite->data[3] = 8 - yOffset / 8; - sprite->data[4] = 1; - sprite->callback = sub_8010494; -} - -void sub_8010494(struct Sprite *sprite) -{ - s32 i; - u8 *dst; - - sprite->data[4]--; - if (sprite->data[4] == 0) - { - sprite->data[4] = 2; - sprite->pos2.y += 8; - sprite->data[3]--; - if (sprite->data[3] < 0) - { - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - } - else - { - // this should use a MEMSET_ALT, but *(dst++) wont match with it. - dst = (u8 *)gUnknown_081FAF4C[GetBattlerPosition(sprite->data[0])] + (gBattleMonForms[sprite->data[0]] << 11) + (sprite->data[3] << 8); - for (i = 0; i < 0x100; i++) - *(dst++) = 0; - StartSpriteAnim(sprite, gBattleMonForms[sprite->data[0]]); - } - } -} - -void sub_8010520(struct Sprite *sprite) -{ - sprite->data[3] = 8; - sprite->data[4] = sprite->invisible; - sprite->callback = sub_801053C; -} - -void sub_801053C(struct Sprite *sprite) -{ - sprite->data[3]--; - if (sprite->data[3] == 0) - { - sprite->invisible ^= 1; - sprite->data[3] = 8; - } -} - -void sub_8010574(struct Sprite *sprite) -{ - sprite->invisible = sprite->data[4]; - sprite->data[4] = FALSE; - sprite->callback = nullsub_37; -} - -void sub_80105A0(struct Sprite *sprite) -{ - sprite->callback = oac_poke_ally_; -} - -void oac_poke_ally_(struct Sprite *sprite) -{ - if ((gUnknown_02024DE8 & 1) == 0) - { - sprite->pos2.x -= 2; - if (sprite->pos2.x == 0) - { - sprite->callback = nullsub_86; - sprite->data[1] = 0; - } - } -} - -void sub_80105DC(struct Sprite *sprite) -{ - sprite->callback = nullsub_86; -} - -void nullsub_86(struct Sprite *sprite) -{ -} - -void sub_80105EC(struct Sprite *sprite) -{ - if ((gUnknown_02024DE8 & 1) == 0) - { - sprite->pos2.x += sprite->data[1]; - sprite->pos2.y += sprite->data[2]; - } -} - -void dp11b_obj_instanciate(u8 bank, u8 b, s8 c, s8 d) -{ - u8 spriteId; - u8 objectID; - - if (b) - { - if (ewram17810[bank].unk0_1) - return; - } - else - { - if (ewram17810[bank].unk0_2) - return; - } - - spriteId = CreateInvisibleSpriteWithCallback(objc_dp11b_pingpong); - if (b == TRUE) - { - objectID = gHealthboxIDs[bank]; - ewram17810[bank].unk2 = spriteId; - ewram17810[bank].unk0_1 = 1; - gSprites[spriteId].data[0] = 0x80; - } - else - { - objectID = gBankSpriteIds[bank]; - ewram17810[bank].unk3 = spriteId; - ewram17810[bank].unk0_2 = 1; - gSprites[spriteId].data[0] = 0xC0; - } - gSprites[spriteId].data[1] = c; - gSprites[spriteId].data[2] = d; - gSprites[spriteId].data[3] = objectID; - gSprites[spriteId].data[4] = b; - gSprites[objectID].pos2.x = 0; - gSprites[objectID].pos2.y = 0; -} - -void dp11b_obj_free(u8 a, u8 b) -{ - u8 r4; - - if (b == TRUE) - { - if (!ewram17810[a].unk0_1) - return; - r4 = gSprites[ewram17810[a].unk2].data[3]; - DestroySprite(&gSprites[ewram17810[a].unk2]); - ewram17810[a].unk0_1 = 0; - } - else - { - if (!ewram17810[a].unk0_2) - return; - r4 = gSprites[ewram17810[a].unk3].data[3]; - DestroySprite(&gSprites[ewram17810[a].unk3]); - ewram17810[a].unk0_2 = 0; - } - gSprites[r4].pos2.x = 0; - gSprites[r4].pos2.y = 0; -} - -void objc_dp11b_pingpong(struct Sprite *sprite) -{ - u8 spriteId = sprite->data[3]; - s32 var; - - if (sprite->data[4] == 1) - var = sprite->data[0]; - else - var = sprite->data[0]; - - gSprites[spriteId].pos2.y = Sin(var, sprite->data[2]) + sprite->data[2]; - sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF; -} - -void nullsub_41(void) -{ -} - -void sub_8010800(void) -{ - sub_8010874(); - gBattleCommunication[1] = 0; - gBattleMainFunc = bc_8012FAC; -} - -#if DEBUG -void debug_sub_80138CC(void) -{ - if (GetBattlerSide(gActiveBattler) == 0) - { - switch (gSharedMem[0x160FD]) - { - case 0: - if (gBattleBankFunc[gActiveBattler] == sub_802C098) - gSharedMem[0x160FD]++; - break; - case 1: - gMain.heldKeys = A_BUTTON; - gMain.newKeys = A_BUTTON; - gSharedMem[0x160FD]++; - gSharedMem[0x160FE] = 0x80; - break; - case 2: - gSharedMem[0x160FE]--; - if (gSharedMem[0x160FE] == 0) - { - gMain.heldKeys = A_BUTTON; - gMain.newKeys = A_BUTTON; - gSharedMem[0x160FD]++; - gSharedMem[0x160FE] = 0x80; - } - break; - case 3: - gSharedMem[0x160FE]--; - if (gSharedMem[0x160FE] == 0) - { - gMain.heldKeys = A_BUTTON; - gMain.newKeys = A_BUTTON; - gSharedMem[0x160FD]++; - } - break; - case 4: - gSharedMem[0x160FD] = 0; - break; - } - } -} -#endif - -void sub_8010824(void) -{ -#if DEBUG - if (gUnknown_02023A14_50 & 0x80) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - debug_sub_80138CC(); - gBattleMainFunc(); - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - gBattleBankFunc[gActiveBattler](); - } - else -#endif - { - gBattleMainFunc(); - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - gBattleBankFunc[gActiveBattler](); - } -} - -void sub_8010874(void) -{ - s32 i; - u32 j; - u8 *r4; - - TurnValuesCleanUp(0); - SpecialStatusesClear(); - - for (i = 0; i < 4; i++) - { - gStatuses3[i] = 0; - - MEMSET_ALT(&gDisableStructs[i], 0, 0x1C, j, r4); - gDisableStructs[i].isFirstTurn= 2; - gUnknown_02024C70[i] = 0; - gLastUsedMove[i] = 0; - gLastLandedMoves[i] = 0; - gLastHitByType[i] = 0; - gUnknown_02024C4C[i] = 0; - gLastHitBy[i] = 0xFF; - gLockedMoves[i] = 0; - gUnknown_02024C2C[i] = 0; - eFlashFireArr.arr[i] = 0; - } - - for (i = 0; i < 2; i++) - { - gSideAffecting[i] = 0; - MEMSET_ALT(&gSideTimers[i], 0, 12, j, r4); - } - - gBankAttacker = 0; - gBankTarget = 0; - gBattleWeather = 0; - - MEMSET_ALT(&gWishFutureKnock, 0, 0x2C, i, r4); - - gHitMarker = 0; - if ((gBattleTypeFlags & BATTLE_TYPE_LINK) == 0 && gSaveBlock2.optionsBattleSceneOff == TRUE) - gHitMarker = HITMARKER_NO_ANIMATIONS; - ewram16084 = gSaveBlock2.optionsBattleStyle; - gMultiHitCounter = 0; - gBattleOutcome = 0; - gBattleExecBuffer = 0; - gPaydayMoney = 0; - ewram17130 = 0; - ewram17160 = 0; - for (i = 0; i < 8; i++) - gBattleCommunication[i] = 0; - gPauseCounterBattle = 0; - gBattleMoveDamage = 0; - gUnknown_02024DE8 = 0; - ewram16002 = 0; - ewram160A1 = 0; - gLeveledUpInBattle = 0; - gAbsentBattlerFlags = 0; - ewram16078 = 0; - ewram16086 = 0; - ewram16087 = 0; - ewram16089 = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275; - ewram16088 = 3; - ewram1601B = 0; - ewram16056 = 1; - - for (i = 0; i < 8; i++) - { - ewram160ACarr(i) = 0; - ewram160CCarr(i) = 0; - ewram160E8arr(i) = 0; - ewram160F0arr(i) = 0; - ewram16100arr(i) = 0; - ewram16108arr(i) = 0; - } - - ewram160C8 = 6; - ewram160C9 = 6; - ewram16113 = 0; - for (i = 0; i < 11; i++) - gBattleResults.usedBalls[i] = 0; - gBattleResults.battleTurnCounter = 0; - gBattleResults.playerFaintCounter = 0; - gBattleResults.opponentFaintCounter = 0; - gBattleResults.unk2 = 0; - gBattleResults.unk3 = 0; - gBattleResults.unk4 = 0; - gBattleResults.unk5_0 = 0; - gBattleResults.unk5_1 = 0; - gBattleResults.lastOpponentSpecies = 0; - gBattleResults.lastUsedMove = 0; - gBattleResults.opponentMove = 0; - gBattleResults.poke1Species = 0; - gBattleResults.opponentSpecies = 0; - gBattleResults.caughtPoke = 0; - for (i = 0; i < 10; i++) - { - gBattleResults.pokeString1[i] = 0; - gBattleResults.pokeString2[i] = 0; - gBattleResults.caughtNick[i] = 0; - } -#if DEBUG - gSharedMem[0x1609E] = 0; - gSharedMem[0x1609F] = 0; -#endif -} - -void SwitchInClearSetData(void) -{ - struct DisableStruct sp0 = gDisableStructs[gActiveBattler]; - s32 i; - u8 *ptr; - - if (gBattleMoves[gCurrentMove].effect != EFFECT_BATON_PASS) - { - for (i = 0; i < 8; i++) - gBattleMons[gActiveBattler].statStages[i] = 6; - for (i = 0; i < gBattlersCount; i++) - { - if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].bankPreventingEscape == gActiveBattler) - gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; - if ((gStatuses3[i] & STATUS3_ALWAYS_HITS) && gDisableStructs[i].bankWithSureHit == gActiveBattler) - { - gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; - gDisableStructs[i].bankWithSureHit = 0; - } - } - } - if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) - { - gBattleMons[gActiveBattler].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED); - gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BANK | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT); - - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerSide(gActiveBattler) != GetBattlerSide(i) - && (gStatuses3[i] & STATUS3_ALWAYS_HITS) != 0 - && (gDisableStructs[i].bankWithSureHit == gActiveBattler)) - { - gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; - gStatuses3[i] |= 0x10; - } - } - } - else - { - gBattleMons[gActiveBattler].status2 = 0; - gStatuses3[gActiveBattler] = 0; - } - - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].status2 & (gBitTable[gActiveBattler] << 16)) - gBattleMons[i].status2 &= ~(gBitTable[gActiveBattler] << 16); - if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && ewram16020arr(i) == gActiveBattler) - gBattleMons[i].status2 &= ~STATUS2_WRAPPED; - } - - gActionSelectionCursor[gActiveBattler] = 0; - gMoveSelectionCursor[gActiveBattler] = 0; - - MEMSET_ALT(&gDisableStructs[gActiveBattler], 0, 0x1C, i, ptr); - - if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) - { - gDisableStructs[gActiveBattler].substituteHP = sp0.substituteHP; - gDisableStructs[gActiveBattler].bankWithSureHit = sp0.bankWithSureHit; - gDisableStructs[gActiveBattler].perishSongTimer1 = sp0.perishSongTimer1; - gDisableStructs[gActiveBattler].perishSongTimer2 = sp0.perishSongTimer2; - } - - gDisableStructs[gActiveBattler].isFirstTurn= 2; - gLastUsedMove[gActiveBattler] = 0; - gLastLandedMoves[gActiveBattler] = 0; - gLastHitByType[gActiveBattler] = 0; - gUnknown_02024C4C[gActiveBattler] = 0; - gUnknown_02024C2C[gActiveBattler] = 0; - gLastHitBy[gActiveBattler] = 0xFF; - - ewram160ACarr2(0, gActiveBattler) = 0; - ewram160ACarr2(1, gActiveBattler) = 0; - ewram16100arr2(0, gActiveBattler) = 0; - ewram16100arr2(1, gActiveBattler) = 0; - ewram16100arr2(2, gActiveBattler) = 0; - ewram16100arr2(3, gActiveBattler) = 0; - ewram160E8arr2(0, gActiveBattler) = 0; - ewram160E8arr2(1, gActiveBattler) = 0; - - eFlashFireArr.arr[gActiveBattler] = 0; - - gCurrentMove = 0; -} - -void UndoEffectsAfterFainting(void) -{ - s32 i; - u8 *ptr; - - for (i = 0; i < 8; i++) - gBattleMons[gActiveBattler].statStages[i] = 6; - gBattleMons[gActiveBattler].status2 = 0; - gStatuses3[gActiveBattler] = 0; - for (i = 0; i < gBattlersCount; i++) - { - if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].bankPreventingEscape == gActiveBattler) - gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; - if (gBattleMons[i].status2 & (gBitTable[gActiveBattler] << 16)) - gBattleMons[i].status2 &= ~(gBitTable[gActiveBattler] << 16); - if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && ewram16020arr(i) == gActiveBattler) - gBattleMons[i].status2 &= ~STATUS2_WRAPPED; - } - gActionSelectionCursor[gActiveBattler] = 0; - gMoveSelectionCursor[gActiveBattler] = 0; - - MEMSET_ALT(&gDisableStructs[gActiveBattler], 0, 0x1C, i, ptr); - gProtectStructs[gActiveBattler].protected = 0; - gProtectStructs[gActiveBattler].endured = 0; - gProtectStructs[gActiveBattler].onlyStruggle = 0; - gProtectStructs[gActiveBattler].helpingHand = 0; - gProtectStructs[gActiveBattler].bounceMove = 0; - gProtectStructs[gActiveBattler].stealMove = 0; - gProtectStructs[gActiveBattler].flag0Unknown = 0; - gProtectStructs[gActiveBattler].prlzImmobility = 0; - gProtectStructs[gActiveBattler].confusionSelfDmg = 0; - gProtectStructs[gActiveBattler].notEffective = 0; - gProtectStructs[gActiveBattler].chargingTurn = 0; - gProtectStructs[gActiveBattler].fleeFlag = 0; - gProtectStructs[gActiveBattler].usedImprisionedMove = 0; - gProtectStructs[gActiveBattler].loveImmobility = 0; - gProtectStructs[gActiveBattler].usedDisabledMove = 0; - gProtectStructs[gActiveBattler].usedTauntedMove = 0; - gProtectStructs[gActiveBattler].flag2Unknown = 0; - gProtectStructs[gActiveBattler].flinchImmobility = 0; - gProtectStructs[gActiveBattler].notFirstStrike = 0; - - gDisableStructs[gActiveBattler].isFirstTurn= 2; - gLastUsedMove[gActiveBattler] = 0; - gLastLandedMoves[gActiveBattler] = 0; - gLastHitByType[gActiveBattler] = 0; - gUnknown_02024C4C[gActiveBattler] = 0; - gUnknown_02024C2C[gActiveBattler] = 0; - gLastHitBy[gActiveBattler] = 0xFF; - - ewram160E8arr2(0, gActiveBattler) = 0; - ewram160E8arr2(1, gActiveBattler) = 0; - ewram160ACarr2(0, gActiveBattler) = 0; - ewram160ACarr2(1, gActiveBattler) = 0; - ewram16100arr2(0, gActiveBattler) = 0; - ewram16100arr2(1, gActiveBattler) = 0; - ewram16100arr2(2, gActiveBattler) = 0; - ewram16100arr2(3, gActiveBattler) = 0; - - eFlashFireArr.arr[gActiveBattler] = 0; - - gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; - gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; -} - -void bc_8012FAC(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - gActiveBattler = gBattleCommunication[1]; - EmitGetAttributes(0, 0, 0); - MarkBufferBankForExecution(gActiveBattler); - gBattleCommunication[0]++; - break; - case 1: - if (gBattleExecBuffer == 0) - { - gBattleCommunication[1]++; - if (gBattleCommunication[1] == gBattlersCount) - gBattleMainFunc = BattlePrepIntroSlide; - else - gBattleCommunication[0] = 0; - } - break; - } -} - -static void BattlePrepIntroSlide(void) -{ - if (gBattleExecBuffer == 0) - { - gActiveBattler = GetBattlerAtPosition(0); - EmitIntroSlide(0, gBattleTerrain); - MarkBufferBankForExecution(gActiveBattler); - gBattleMainFunc = sub_8011384; - gBattleCommunication[0] = 0; - gBattleCommunication[1] = 0; - } -} - -void sub_8011384(void) -{ - u8 *ptr; - s32 i; - - if (gBattleExecBuffer == 0) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) - && GetBattlerSide(gActiveBattler) == 0) - { - MEMSET_ALT(&gBattleMons[gActiveBattler], 0, 0x58, i, ptr); - } - else - { - u8 r0; - - MEMSET_ALT(&gBattleMons[gActiveBattler], gBattleBufferB[gActiveBattler][4 + i], 0x58, i, ptr); - gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; - gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; - gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].altAbility); - r0 = GetBattlerSide(gActiveBattler); - ewram160BC[r0] = gBattleMons[gActiveBattler].hp; - for (i = 0; i < 8; i++) - gBattleMons[gActiveBattler].statStages[i] = 6; - gBattleMons[gActiveBattler].status2 = 0; - } - - if (GetBattlerPosition(gActiveBattler) == 0) - { - EmitTrainerThrow(0); - MarkBufferBankForExecution(gActiveBattler); - } - - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - if (GetBattlerPosition(gActiveBattler) == 1) - { - EmitTrainerThrow(0); - MarkBufferBankForExecution(gActiveBattler); - } - if (GetBattlerSide(gActiveBattler) == 1 - && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), 2); - } - else - { - if (GetBattlerSide(gActiveBattler) == 1 - && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) - { - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), 2); - EmitLoadPokeSprite(0); - MarkBufferBankForExecution(gActiveBattler); - } - } - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (GetBattlerPosition(gActiveBattler) == 2 - || GetBattlerPosition(gActiveBattler) == 3) - { - EmitTrainerThrow(0); - MarkBufferBankForExecution(gActiveBattler); - } - } - } - gBattleMainFunc = bc_801333C; - } -} - -void bc_801333C(void) -{ - s32 i; - - if (gBattleExecBuffer == 0) - { - struct HpAndStatus hpStatus[6]; - - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - for (i = 0; i < 6; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == 0 - || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatus[i].hp = 0xFFFF; - hpStatus[i].status = 0; - } - else - { - hpStatus[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP); - hpStatus[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); - } - } - gActiveBattler = GetBattlerAtPosition(1); - EmitDrawPartyStatusSummary(0, hpStatus, 0x80); - MarkBufferBankForExecution(gActiveBattler); - - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0 - || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatus[i].hp = 0xFFFF; - hpStatus[i].status = 0; - } - else - { - hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - } - } - gActiveBattler = GetBattlerAtPosition(0); - EmitDrawPartyStatusSummary(0, hpStatus, 0x80); - MarkBufferBankForExecution(gActiveBattler); - - gBattleMainFunc = bc_battle_begin_message; - } - else - { - // The array gets set here, but nothing is ever done with it. - // Likely unfinished code. - - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0 - || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatus[i].hp = 0xFFFF; - hpStatus[i].status = 0; - } - else - { - hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - } - } - - gBattleMainFunc = bc_8013568; - } - } -} - -void bc_battle_begin_message(void) -{ - if (gBattleExecBuffer == 0) - { - gActiveBattler = GetBattlerAtPosition(1); - PrepareStringBattle(0, gActiveBattler); - gBattleMainFunc = sub_8011800; - } -} - -void bc_8013568(void) -{ - if (gBattleExecBuffer == 0) - { - gBattleMainFunc = sub_8011970; - PrepareStringBattle(0, 0); - } -} - -void sub_8011800(void) -{ - if (gBattleExecBuffer == 0) - { - PrepareStringBattle(1, GetBattlerAtPosition(1)); - gBattleMainFunc = sub_8011834; - } -} - -void sub_8011834(void) -{ - if (gBattleExecBuffer == 0) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (GetBattlerPosition(gActiveBattler) == 1) - { - EmitTrainerBallThrow(0); - MarkBufferBankForExecution(gActiveBattler); - } - if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) - && GetBattlerPosition(gActiveBattler) == 3) - { - EmitTrainerBallThrow(0); - MarkBufferBankForExecution(gActiveBattler); - } - } - gBattleMainFunc = bc_801362C; - } -} - -void bc_801362C(void) -{ - if (gBattleExecBuffer == 0) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (GetBattlerSide(gActiveBattler) == 1 - && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), 2); - } - gBattleMainFunc = sub_8011970; - } -} - -void unref_sub_8011950(void) -{ - if (gBattleExecBuffer == 0) - gBattleMainFunc = sub_8011970; -} - -void sub_8011970(void) -{ - if (gBattleExecBuffer == 0) - { - if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) - PrepareStringBattle(1, GetBattlerAtPosition(0)); - gBattleMainFunc = sub_80119B4; - } -} - -void sub_80119B4(void) -{ - if (gBattleExecBuffer == 0) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (GetBattlerPosition(gActiveBattler) == 0) - { - EmitTrainerBallThrow(0); - MarkBufferBankForExecution(gActiveBattler); - } - if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) - && GetBattlerPosition(gActiveBattler) == 2) - { - EmitTrainerBallThrow(0); - MarkBufferBankForExecution(gActiveBattler); - } - } - ewram16058 = 0; - ewram160F9 = 0; - ewram160E6 = 0; - gBattleMainFunc = BattleBeginFirstTurn; - } -} - -void unref_sub_8011A68(void) -{ - if (gBattleExecBuffer == 0) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (GetBattlerSide(gActiveBattler) == 0) - { - EmitSendOutPoke(0, gBattlerPartyIndexes[gActiveBattler], 0); - MarkBufferBankForExecution(gActiveBattler); - } - } - ewram16058 = 0; - ewram160F9 = 0; - ewram160E6 = 0; - gBattleMainFunc = BattleBeginFirstTurn; - } -} - -void BattleBeginFirstTurn(void) -{ - s32 i; - s32 j; - u8 r9 = 0; - - if (gBattleExecBuffer == 0) - { - if (ewram16058 == 0) - { - for (i = 0; i < gBattlersCount; i++) - gBanksByTurnOrder[i] = i; - for (i = 0; i < gBattlersCount - 1; i++) - { - for (j = i + 1; j < gBattlersCount; j++) - { - if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 1) != 0) - SwapTurnOrder(i, j); - } - } - } - if (ewram160E6 == 0 && AbilityBattleEffects(0, 0, 0, 0xFF, 0) != 0) - { - ewram160E6 = 1; - return; - } - while (ewram16058 < gBattlersCount) - { - if (AbilityBattleEffects(0, gBanksByTurnOrder[ewram16058], 0, 0, 0) != 0) - r9++; - ewram16058++; - if (r9 != 0) - return; - } - if (AbilityBattleEffects(9, 0, 0, 0, 0) != 0) - return; - if (AbilityBattleEffects(11, 0, 0, 0, 0) != 0) - return; - while (ewram160F9 < gBattlersCount) - { - if (ItemBattleEffects(0, gBanksByTurnOrder[ewram160F9], 0) != 0) - r9++; - ewram160F9++; - if (r9 != 0) - return; - } - // Absolutely pointless for-loop that somehow doesn't get optimized out - for (i = 0; i < gBattlersCount; i++) - ; - for (i = 0; i < 4; i++) - { - ewram16068arr(i) = 6; - gActionForBanks[i] = 0xFF; - gChosenMovesByBanks[i] = 0; - } - TurnValuesCleanUp(0); - SpecialStatusesClear(); - ewram160A6 = gAbsentBattlerFlags; - gBattleMainFunc = sub_8012324; - ResetSentPokesToOpponentValue(); - for (i = 0; i < 8; i++) - gBattleCommunication[i] = 0; - for (i = 0; i < gBattlersCount; i++) - gBattleMons[i].status2 &= ~8; - ewram16000 = 0; - ewram16001 = 0; - ewram16110 = 0; - ewram16111 = 0; - ewram1600C = 0; - ewram16059 = 0; - ewram1600E = 0; - gMoveResultFlags = 0; - gRandomTurnNumber = Random(); - } -} - -void bc_8013B1C(void) -{ - s32 i; - - if (gBattleExecBuffer == 0) - { - gBattleMainFunc = BattleTurnPassed; - for (i = 0; i < 8; i++) - gBattleCommunication[i] = 0; - for (i = 0; i < gBattlersCount; i++) - { - gBattleMons[i].status2 &= ~8; - if ((gBattleMons[i].status1 & 7) && (gBattleMons[i].status2 & 0x1000)) - CancelMultiTurnMoves(i); - } - ewram16000 = 0; - ewram16001 = 0; - ewram16110 = 0; - ewram16111 = 0; - ewram1600E = 0; - gMoveResultFlags = 0; - } -} - -void BattleTurnPassed(void) -{ - s32 i; - - TurnValuesCleanUp(1); - if (gBattleOutcome == 0) - { - if (UpdateTurnCounters() != 0) - return; - if (TurnBasedEffects() != 0) - return; - } - if (HandleFaintedMonActions() != 0) - return; - ewram16059 = 0; - if (HandleWishPerishSongOnTurnEnd() != 0) - return; - TurnValuesCleanUp(0); - gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; - gHitMarker &= ~0x80000; - gHitMarker &= ~0x400000; - gHitMarker &= ~0x100000; - ewram16002 = 0; - ewram160A1 = 0; - ewram1600C = 0; - gBattleMoveDamage = 0; - gMoveResultFlags = 0; - for (i = 0; i < 5; i++) - gBattleCommunication[i] = 0; - if (gBattleOutcome != 0) - { - gCurrentActionFuncId = 12; - gBattleMainFunc = RunTurnActionsFunctions; - return; - } - if (gBattleResults.battleTurnCounter < 0xFF) - gBattleResults.battleTurnCounter++; - for (i = 0; i < gBattlersCount; i++) - { - gActionForBanks[i] = 0xFF; - gChosenMovesByBanks[i] = 0; - } - for (i = 0; i < 4; i++) - ewram16068arr(i) = 6; - ewram160A6 = gAbsentBattlerFlags; - gBattleMainFunc = sub_8012324; - gRandomTurnNumber = Random(); -} - -u8 CanRunFromBattle(void) -{ - u8 r2; - u8 r6; - s32 i; - - if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY) - r2 = gEnigmaBerries[gActiveBattler].holdEffect; - else - r2 = ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item); - gStringBank = gActiveBattler; - if (r2 == HOLD_EFFECT_CAN_ALWAYS_RUN) - return 0; - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - return 0; - if (gBattleMons[gActiveBattler].ability == ABILITY_RUN_AWAY) - return 0; - r6 = GetBattlerSide(gActiveBattler); - for (i = 0; i < gBattlersCount; i++) - { - if (r6 != GetBattlerSide(i) - && gBattleMons[i].ability == ABILITY_SHADOW_TAG) - { - ewram16003 = i; - gLastUsedAbility = gBattleMons[i].ability; - gBattleCommunication[5] = 2; - return 2; - } - if (r6 != GetBattlerSide(i) - && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE - && gBattleMons[gActiveBattler].type1 != 2 - && gBattleMons[gActiveBattler].type2 != 2 - && gBattleMons[i].ability == ABILITY_ARENA_TRAP) - { - ewram16003 = i; - gLastUsedAbility = gBattleMons[i].ability; - gBattleCommunication[5] = 2; - return 2; - } - } - i = AbilityBattleEffects(15, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0); - if (i != 0 && (gBattleMons[gActiveBattler].type1 == 8 || gBattleMons[gActiveBattler].type2 == 8)) - { - ewram16003 = i - 1; - gLastUsedAbility = gBattleMons[i - 1].ability; - gBattleCommunication[5] = 2; - return 2; - } - if ((gBattleMons[gActiveBattler].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) || (gStatuses3[gActiveBattler] & STATUS3_ROOTED)) - { - gBattleCommunication[5] = 0; - return 1; - } - if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) - { - gBattleCommunication[5] = 1; - return 1; - } - return 0; -} - -void sub_8012258(u8 a) -{ - s32 i; - u8 r4; - u8 r1; - - for (i = 0; i < 3; i++) - gUnknown_02038470[i] = ewram1606Carr(i, a); - r4 = pokemon_order_func(gBattlerPartyIndexes[a]); - r1 = pokemon_order_func(ewram16068arr(a)); - sub_8094C98(r4, r1); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - for (i = 0; i < 3; i++) - { - ewram1606Carr(i, a) = gUnknown_02038470[i]; - ewram1606Carr(i, (a ^ 2)) = gUnknown_02038470[i]; - } - } - else - { - for (i = 0; i < 3; i++) - { - ewram1606Carr(i, a) = gUnknown_02038470[i]; - } - } -} - -enum -{ - STATE_BEFORE_ACTION_CHOSEN, - STATE_WAIT_ACTION_CHOSEN, - STATE_WAIT_ACTION_CASE_CHOSEN, - STATE_WAIT_ACTION_CONFIRMED_STANDBY, - STATE_WAIT_ACTION_CONFIRMED, - STATE_SELECTION_SCRIPT, - STATE_WAIT_SET_BEFORE_ACTION, - STATE_SELECTION_SCRIPT_MAY_RUN -}; - -extern u8 * gSelectionBattleScripts[]; -extern u8 BattleScript_ActionSelectionItemsCantBeUsed[]; -extern u8 BattleScript_PrintFullBox[]; -extern u8 BattleScript_PrintCantRunFromTrainer[]; -extern u8 BattleScript_PrintCantEscapeFromBattle[]; - -void sub_8012324(void) -{ - u8 position; - s32 i; - - gBattleCommunication[4] = 0; - // inverted loop - //_0801234C - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - position = GetBattlerPosition(gActiveBattler); - switch (gBattleCommunication[gActiveBattler]) - { - case STATE_BEFORE_ACTION_CHOSEN: - ewram16068arr(gActiveBattler) = 6; - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) - && (position & BIT_FLANK) != B_FLANK_LEFT - && !(ewram160A6 & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(position))]) - && gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(position))] != STATE_WAIT_ACTION_CONFIRMED) - break; - //_080123F8 - if (ewram160A6 & gBitTable[gActiveBattler]) - { - gActionForBanks[gActiveBattler] = 13; - if (!(gBattleTypeFlags & 0x40)) - gBattleCommunication[gActiveBattler] = 4; - //_08012454 - else - gBattleCommunication[gActiveBattler] = 3; - break; - } - //_08012468 - if ((gBattleMons[gActiveBattler].status2 & 0x1000) - || (gBattleMons[gActiveBattler].status2 & 0x400000)) - { - gActionForBanks[gActiveBattler] = 0; - gBattleCommunication[gActiveBattler] = 3; - } - else - { - Emitcmd18(0, gActionForBanks[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8)); - MarkBufferBankForExecution(gActiveBattler); - gBattleCommunication[gActiveBattler]++; - } - break; - case STATE_WAIT_ACTION_CHOSEN: - if (!(gBattleExecBuffer & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) - { - gActionForBanks[gActiveBattler] = gBattleBufferB[gActiveBattler][1]; - switch (gBattleBufferB[gActiveBattler][1]) - { - case B_ACTION_USE_MOVE: - if (AreAllMovesUnusable()) - { - gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; - ewram16060(gActiveBattler) = FALSE; - ewram16094arr(gActiveBattler) = STATE_WAIT_ACTION_CONFIRMED_STANDBY; - ewram16010arr(gActiveBattler) = gBattleBufferB[gActiveBattler][3]; - return; - } - else if (gDisableStructs[gActiveBattler].encoredMove != 0) - { - gChosenMovesByBanks[gActiveBattler] = gDisableStructs[gActiveBattler].encoredMove; - gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; - return; - } - else - { - struct ChooseMoveStruct { - u16 moves[4]; - u8 currentPp[4]; - u8 maxPp[4]; - u16 species; - u8 monType1; - u8 monType2; - } moveInfo; - - moveInfo.species = gBattleMons[gActiveBattler].species; - moveInfo.monType1 = gBattleMons[gActiveBattler].type1; - moveInfo.monType2 = gBattleMons[gActiveBattler].type2; - - for (i = 0; i < 4; i++) - { - moveInfo.moves[i] = gBattleMons[gActiveBattler].moves[i]; - moveInfo.currentPp[i] = gBattleMons[gActiveBattler].pp[i]; - moveInfo.maxPp[i] = CalculatePPWithBonus( - gBattleMons[gActiveBattler].moves[i], - gBattleMons[gActiveBattler].ppBonuses, - i); - } - - Emitcmd20(0, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0, FALSE, (u8 *)&moveInfo); - MarkBufferBankForExecution(gActiveBattler); - } - break; - case B_ACTION_USE_ITEM: - if (gBattleTypeFlags & (BATTLE_TYPE_LINK - | BATTLE_TYPE_BATTLE_TOWER - | BATTLE_TYPE_EREADER_TRAINER)) - { - gSelectionBattleScripts[gActiveBattler] = BattleScript_ActionSelectionItemsCantBeUsed; - gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; - ewram16060(gActiveBattler) = FALSE; - ewram16094arr(gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN; - return; - } - else - { - EmitOpenBag(0, &ewram1606Carr(0, gActiveBattler)); - MarkBufferBankForExecution(gActiveBattler); - } - break; - case B_ACTION_SWITCH: - ewram16064arr(gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; - if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION) - || gStatuses3[gActiveBattler] & STATUS3_ROOTED) - { - EmitChoosePokemon(0, 2, 6, ABILITY_NONE, &ewram1606Carr(0, gActiveBattler)); - } - else if ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_SHADOW_TAG)) - || ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_ARENA_TRAP)) - && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING) - && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE) - || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0)) - && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL))) - { - EmitChoosePokemon(0, ((i - 1) << 4) | PARTY_ABILITY_PREVENTS, 6, gLastUsedAbility, &ewram1606Carr(0, gActiveBattler)); - } - else - { - if (gActiveBattler == 2 && gActionForBanks[0] == B_ACTION_SWITCH) - EmitChoosePokemon(0, PARTY_CHOOSE_MON, ewram16068arr(0), ABILITY_NONE, &ewram1606Carr(0, gActiveBattler)); - else if (gActiveBattler == 3 && gActionForBanks[1] == B_ACTION_SWITCH) - EmitChoosePokemon(0, PARTY_CHOOSE_MON, ewram16068arr(1), ABILITY_NONE, &ewram1606Carr(0, gActiveBattler)); - else - EmitChoosePokemon(0, PARTY_CHOOSE_MON, 6, ABILITY_NONE, &ewram1606Carr(0, gActiveBattler)); - } - MarkBufferBankForExecution(gActiveBattler); - break; - case B_ACTION_SAFARI_BALL: - if (PlayerPartyAndPokemonStorageFull()) - { - gSelectionBattleScripts[gActiveBattler] = BattleScript_PrintFullBox; - gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; - ewram16060(gActiveBattler) = FALSE; - ewram16094arr(gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN; - return; - } - break; - case B_ACTION_SAFARI_POKEBLOCK: - EmitOpenBag(0, &ewram1606Carr(0, gActiveBattler)); - MarkBufferBankForExecution(gActiveBattler); - break; - case B_ACTION_CANCEL_PARTNER: - gBattleCommunication[gActiveBattler] = STATE_WAIT_SET_BEFORE_ACTION; - gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))] = STATE_BEFORE_ACTION_CHOSEN; - Emitcmd50(0); - MarkBufferBankForExecution(gActiveBattler); - return; - } - - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER - && !(gBattleTypeFlags & (BATTLE_TYPE_LINK)) - && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN) - { - BattleScriptExecute(BattleScript_PrintCantRunFromTrainer); - gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; - } - else if (CanRunFromBattle() - && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN) - { - gSelectionBattleScripts[gActiveBattler] = BattleScript_PrintCantEscapeFromBattle; - gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; - ewram16060(gActiveBattler) = FALSE; - ewram16094arr(gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN; - return; - } - else - { - gBattleCommunication[gActiveBattler]++; - } - } - break; - case STATE_WAIT_ACTION_CASE_CHOSEN: - if (!(gBattleExecBuffer & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) - { - switch (gActionForBanks[gActiveBattler]) - { - case B_ACTION_USE_MOVE: - switch (gBattleBufferB[gActiveBattler][1]) - { - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - gActionForBanks[gActiveBattler] = gBattleBufferB[gActiveBattler][1]; - return; - default: - if ((gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8)) == 0xFFFF) - { - gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; - } - else if (TrySetCantSelectMoveBattleScript()) - { - gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; - ewram16060(gActiveBattler) = FALSE; - gBattleBufferB[gActiveBattler][1] = 0; - ewram16094arr(gActiveBattler) = STATE_WAIT_ACTION_CHOSEN; - return; - } - else - { - ewram1608Carr(gActiveBattler) = gBattleBufferB[gActiveBattler][2]; - gChosenMovesByBanks[gActiveBattler] = gBattleMons[gActiveBattler].moves[ewram1608Carr(gActiveBattler)]; - ewram16010arr(gActiveBattler) = gBattleBufferB[gActiveBattler][3]; - gBattleCommunication[gActiveBattler]++; - } - break; - } - break; - case B_ACTION_USE_ITEM: - if ((gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)) == 0) - { - gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; - } - else - { - gLastUsedItem = (gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)); - gBattleCommunication[gActiveBattler]++; - } - break; - case B_ACTION_SWITCH: - if (gBattleBufferB[gActiveBattler][1] == PARTY_SIZE) - { - gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; - } - else - { - ewram16068arr(gActiveBattler) = gBattleBufferB[gActiveBattler][1]; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - ewram1606Carr(0, gActiveBattler) &= 0xF; - ewram1606Carr(0, gActiveBattler) |= (gBattleBufferB[gActiveBattler][2] & 0xF0); - ewram1606Carr(1, gActiveBattler) = gBattleBufferB[gActiveBattler][3]; - - ewram1606Carr(0, (gActiveBattler ^ BIT_FLANK)) &= (0xF0); - ewram1606Carr(0, (gActiveBattler ^ BIT_FLANK)) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4; - ewram1606Carr(2, (gActiveBattler ^ BIT_FLANK)) = gBattleBufferB[gActiveBattler][3]; - } - gBattleCommunication[gActiveBattler]++; - } - break; - case B_ACTION_RUN: - gHitMarker |= HITMARKER_RUN; - gBattleCommunication[gActiveBattler]++; - break; - case B_ACTION_SAFARI_WATCH_CAREFULLY: - gBattleCommunication[gActiveBattler]++; - break; - case B_ACTION_SAFARI_BALL: - gBattleCommunication[gActiveBattler]++; - break; - case B_ACTION_SAFARI_POKEBLOCK: - if ((gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)) != 0) - { - gBattleCommunication[gActiveBattler]++; - } - else - { - gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; - } - break; - case B_ACTION_SAFARI_GO_NEAR: - gBattleCommunication[gActiveBattler]++; - break; - case B_ACTION_SAFARI_RUN: - gHitMarker |= HITMARKER_RUN; - gBattleCommunication[gActiveBattler]++; - break; - case B_ACTION_WALLY_THROW: - gBattleCommunication[gActiveBattler]++; - break; - } - } - break; - case STATE_WAIT_ACTION_CONFIRMED_STANDBY: - if (!(gBattleExecBuffer & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) - { - if (((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_DOUBLE)) != BATTLE_TYPE_DOUBLE) - || (position & BIT_FLANK) != B_FLANK_LEFT - || (ewram160A6 & gBitTable[GetBattlerAtPosition(position ^ BIT_FLANK)])) - { - EmitLinkStandbyMsg(0, 0); - } - else - { - EmitLinkStandbyMsg(0, 1); - } - MarkBufferBankForExecution(gActiveBattler); - gBattleCommunication[gActiveBattler]++; - } - break; - case STATE_WAIT_ACTION_CONFIRMED: - if (!(gBattleExecBuffer & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) - { - gBattleCommunication[ACTIONS_CONFIRMED_COUNT]++; - } - break; - case STATE_SELECTION_SCRIPT: - if (ewram16060(gActiveBattler)) - { - gBattleCommunication[gActiveBattler] = ewram16094arr(gActiveBattler); - } - else - { - gBankAttacker = gActiveBattler; - gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBattler]; - if (!(gBattleExecBuffer & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) - { - gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); - } - gSelectionBattleScripts[gActiveBattler] = gBattlescriptCurrInstr; - } - break; - case STATE_WAIT_SET_BEFORE_ACTION: - if (!(gBattleExecBuffer & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) - { - gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; - } - break; - } - } - - // Check if everyone chose actions. - if (gBattleCommunication[ACTIONS_CONFIRMED_COUNT] == gBattlersCount) - { - gBattleMainFunc = SetActionsAndBanksTurnOrder; - } -} - -void SwapTurnOrder(u8 a, u8 b) -{ - int temp; - - temp = gActionsByTurnOrder[a]; - gActionsByTurnOrder[a] = gActionsByTurnOrder[b]; - gActionsByTurnOrder[b] = temp; - - temp = gBanksByTurnOrder[a]; - gBanksByTurnOrder[a] = gBanksByTurnOrder[b]; - gBanksByTurnOrder[b] = temp; -} - -// Determines which of the two given mons will strike first in a battle. -// Returns: -// 0 = first mon moves first -// 1 = second mon moves first -// 2 = second mon moves first because it won a 50/50 roll -u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreMovePriorities) -{ - int bank1SpeedMultiplier, bank2SpeedMultiplier; - u32 bank1AdjustedSpeed, bank2AdjustedSpeed; - u8 heldItemEffect; - u8 heldItemEffectParam; - u16 bank1Move; - u16 bank2Move; - u8 strikesFirst = 0; - - // Check for abilities that boost speed in weather. - if (WEATHER_HAS_EFFECT) - { - if ((gBattleMons[bank1].ability == ABILITY_SWIFT_SWIM && (gBattleWeather & WEATHER_RAIN_ANY)) - || (gBattleMons[bank1].ability == ABILITY_CHLOROPHYLL && (gBattleWeather & WEATHER_SUN_ANY))) - bank1SpeedMultiplier = 2; - else - bank1SpeedMultiplier = 1; - - if ((gBattleMons[bank2].ability == ABILITY_SWIFT_SWIM && (gBattleWeather & WEATHER_RAIN_ANY)) - || (gBattleMons[bank2].ability == ABILITY_CHLOROPHYLL && (gBattleWeather & WEATHER_SUN_ANY))) - bank2SpeedMultiplier = 2; - else - bank2SpeedMultiplier = 1; - } - else - { - bank1SpeedMultiplier = 1; - bank2SpeedMultiplier = 1; - } - - // Calculate adjusted speed for first mon. - bank1AdjustedSpeed = (gBattleMons[bank1].speed * bank1SpeedMultiplier) - * gStatStageRatios[gBattleMons[bank1].statStages[STAT_STAGE_SPEED]][0] / gStatStageRatios[gBattleMons[bank1].statStages[STAT_STAGE_SPEED]][1]; - - if (gBattleMons[bank1].item == ITEM_ENIGMA_BERRY) - { - heldItemEffect = gEnigmaBerries[bank1].holdEffect; - heldItemEffectParam = gEnigmaBerries[bank1].holdEffectParam; - } - else - { - heldItemEffect = ItemId_GetHoldEffect(gBattleMons[bank1].item); - heldItemEffectParam = ItemId_GetHoldEffectParam(gBattleMons[bank1].item); - } - - // Only give badge speed boost to the player's mon. - if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && FlagGet(FLAG_BADGE03_GET) && GetBattlerSide(bank1) == 0) - bank1AdjustedSpeed = (bank1AdjustedSpeed * 110) / 100; - - if (heldItemEffect == HOLD_EFFECT_MACHO_BRACE) - bank1AdjustedSpeed /= 2; - - if (gBattleMons[bank1].status1 & STATUS_PARALYSIS) - bank1AdjustedSpeed /= 4; - - if (heldItemEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (heldItemEffectParam * 0xFFFF) / 100) - bank1AdjustedSpeed = UINT_MAX; - - // Calculate adjusted speed for second mon. - bank2AdjustedSpeed = gBattleMons[bank2].speed * bank2SpeedMultiplier - * gStatStageRatios[gBattleMons[bank2].statStages[STAT_STAGE_SPEED]][0] / gStatStageRatios[gBattleMons[bank2].statStages[STAT_STAGE_SPEED]][1]; - - if (gBattleMons[bank2].item == ITEM_ENIGMA_BERRY) - { - heldItemEffect = gEnigmaBerries[bank2].holdEffect; - heldItemEffectParam = gEnigmaBerries[bank2].holdEffectParam; - } - else - { - heldItemEffect = ItemId_GetHoldEffect(gBattleMons[bank2].item); - heldItemEffectParam = ItemId_GetHoldEffectParam(gBattleMons[bank2].item); - } - - // Only give badge speed boost to the player's mon. - if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && FlagGet(FLAG_BADGE03_GET) && GetBattlerSide(bank2) == 0) - { - bank2AdjustedSpeed = (bank2AdjustedSpeed * 110) / 100; - } - - if (heldItemEffect == HOLD_EFFECT_MACHO_BRACE) - bank2AdjustedSpeed /= 2; - - if (gBattleMons[bank2].status1 & STATUS_PARALYSIS) - bank2AdjustedSpeed /= 4; - - if (heldItemEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (heldItemEffectParam * 0xFFFF) / 100) - bank2AdjustedSpeed = UINT_MAX; - - if (ignoreMovePriorities) - { - bank1Move = MOVE_NONE; - bank2Move = MOVE_NONE; - } - else - { - if (gActionForBanks[bank1] == 0) - { - if (gProtectStructs[bank1].onlyStruggle) - bank1Move = MOVE_STRUGGLE; - else - bank1Move = gBattleMons[bank1].moves[ewram1608Carr(bank1)]; - } - else - bank1Move = MOVE_NONE; - - if (gActionForBanks[bank2] == 0) - { - if (gProtectStructs[bank2].onlyStruggle) - bank2Move = MOVE_STRUGGLE; - else - bank2Move = gBattleMons[bank2].moves[ewram1608Carr(bank2)]; - } - else - bank2Move = MOVE_NONE; - } - - if (gBattleMoves[bank1Move].priority != 0 || gBattleMoves[bank2Move].priority != 0) - { - if (gBattleMoves[bank1Move].priority == gBattleMoves[bank2Move].priority) - { - if (bank1AdjustedSpeed == bank2AdjustedSpeed && (Random() & 1)) - strikesFirst = 2; - else if (bank1AdjustedSpeed < bank2AdjustedSpeed) - strikesFirst = 1; - } - else if (gBattleMoves[bank1Move].priority < gBattleMoves[bank2Move].priority) - strikesFirst = 1; - } - else - { - if (bank1AdjustedSpeed == bank2AdjustedSpeed && (Random() & 1)) - strikesFirst = 2; - else if (bank1AdjustedSpeed < bank2AdjustedSpeed) - strikesFirst = 1; - } - - return strikesFirst; -} - -void SetActionsAndBanksTurnOrder(void) -{ - s32 var = 0; - s32 i, j; - - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - gActionsByTurnOrder[var] = gActionForBanks[gActiveBattler]; - gBanksByTurnOrder[var] = gActiveBattler; - var++; - } - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (gActionForBanks[gActiveBattler] == ACTION_RUN) - { - var = 5; - break; - } - } - } - else - { - if (gActionForBanks[0] == ACTION_RUN) - { - gActiveBattler = 0; - var = 5; - } - } - - if (var == 5) - { - gActionsByTurnOrder[0] = gActionForBanks[gActiveBattler]; - gBanksByTurnOrder[0] = gActiveBattler; - var = 1; - for (i = 0; i < gBattlersCount; i++) - { - if (i != gActiveBattler) - { - gActionsByTurnOrder[var] = gActionForBanks[i]; - gBanksByTurnOrder[var] = i; - var++; - } - } - gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; - eFocusPunchBattler = 0; - return; - } - else - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (gActionForBanks[gActiveBattler] == ACTION_USE_ITEM || gActionForBanks[gActiveBattler] == ACTION_SWITCH) - { - gActionsByTurnOrder[var] = gActionForBanks[gActiveBattler]; - gBanksByTurnOrder[var] = gActiveBattler; - var++; - } - } - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (gActionForBanks[gActiveBattler] != ACTION_USE_ITEM && gActionForBanks[gActiveBattler] != ACTION_SWITCH) - { - gActionsByTurnOrder[var] = gActionForBanks[gActiveBattler]; - gBanksByTurnOrder[var] = gActiveBattler; - var++; - } - } - for (i = 0; i < gBattlersCount - 1; i++) - { - for (j = i + 1; j < gBattlersCount; j++) - { - u8 bank1 = gBanksByTurnOrder[i]; - u8 bank2 = gBanksByTurnOrder[j]; - if (gActionsByTurnOrder[i] != ACTION_USE_ITEM - && gActionsByTurnOrder[j] != ACTION_USE_ITEM - && gActionsByTurnOrder[i] != ACTION_SWITCH - && gActionsByTurnOrder[j] != ACTION_SWITCH) - { - if (GetWhoStrikesFirst(bank1, bank2, FALSE)) - SwapTurnOrder(i, j); - } - } - } - } - } - - gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; - eFocusPunchBattler = 0; -} - -static void TurnValuesCleanUp(bool8 var0) -{ - s32 i; - u8 *dataPtr; - - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (var0) - { - gProtectStructs[gActiveBattler].protected = 0; - gProtectStructs[gActiveBattler].endured = 0; - } - else - { - dataPtr = (u8*)(&gProtectStructs[gActiveBattler]); - for (i = 0; i < sizeof(struct ProtectStruct); i++) - dataPtr[i] = 0; - - if (gDisableStructs[gActiveBattler].isFirstTurn) - gDisableStructs[gActiveBattler].isFirstTurn--; - - if (gDisableStructs[gActiveBattler].rechargeCounter) - { - gDisableStructs[gActiveBattler].rechargeCounter--; - if (gDisableStructs[gActiveBattler].rechargeCounter == 0) - gBattleMons[gActiveBattler].status2 &= ~(STATUS2_RECHARGE); - } - } - - if (gDisableStructs[gActiveBattler].substituteHP == 0) - gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE); - } - - gSideTimers[0].followmeTimer = 0; - gSideTimers[1].followmeTimer = 0; -} - -void SpecialStatusesClear(void) -{ - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - s32 i; - u8 *dataPtr = (u8*)(&gSpecialStatuses[gActiveBattler]); - - for (i = 0; i < sizeof(struct SpecialStatus); i++) - dataPtr[i] = 0; - } -} - -void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) -{ - if (!(gHitMarker & HITMARKER_RUN)) - { - while (eFocusPunchBattler < gBattlersCount) - { - gActiveBattler = gBankAttacker = eFocusPunchBattler; - eFocusPunchBattler++; - if (gChosenMovesByBanks[gActiveBattler] == MOVE_FOCUS_PUNCH - && !(gBattleMons[gActiveBattler].status1 & STATUS_SLEEP) - && !(gDisableStructs[gBankAttacker].truantCounter) - && !(gProtectStructs[gActiveBattler].onlyStruggle)) - { - BattleScriptExecute(BattleScript_FocusPunchSetUp); - return; - } - } - } - - TryClearRageStatuses(); - gCurrentTurnActionNumber = 0; - { - // something stupid needed to match - u8 zero; - gCurrentActionFuncId = gActionsByTurnOrder[(zero = 0)]; - } - - gDynamicBasePower = 0; - gBattleStruct->dynamicMoveType = 0; - gBattleMainFunc = RunTurnActionsFunctions; - gBattleCommunication[3] = 0; - gBattleCommunication[4] = 0; - eMultihitMoveEffect = 0; - ewram17130 = 0; -} - -static void RunTurnActionsFunctions(void) -{ - if (gBattleOutcome != 0) - gCurrentActionFuncId = 12; - - gBattleStruct->unk16057 = gCurrentTurnActionNumber; - gUnknown_081FA640[gCurrentActionFuncId](); - - if (gCurrentTurnActionNumber >= gBattlersCount) // everyone did their actions, turn finished - { - gHitMarker &= ~(HITMARKER_x100000); - gBattleMainFunc = gUnknown_081FA678[gBattleOutcome & 0x7F]; - } - else - { - if (gBattleStruct->unk16057 != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another bank - { - gHitMarker &= ~(HITMARKER_NO_ATTACKSTRING); - gHitMarker &= ~(HITMARKER_UNABLE_TO_USE_MOVE); - } - } -} - -void HandleEndTurn_BattleWon(void) -{ - gCurrentActionFuncId = 0; - - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - gBattleTextBuff1[0] = gBattleOutcome; - gBankAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost; - gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN); - } - else if (gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) - { - gBattlescriptCurrInstr = gUnknown_081D8E0D; - } - else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & BATTLE_TYPE_LINK)) - { - BattleStopLowHpSound(); - gBattlescriptCurrInstr = BattleScript_LocalTrainerBattleWon; - - switch (gTrainers[gTrainerBattleOpponent].trainerClass) - { - case TRAINER_CLASS_ELITE_FOUR: - case TRAINER_CLASS_CHAMPION: - PlayBGM(MUS_KACHI5); - break; - case TRAINER_CLASS_TEAM_AQUA: - case TRAINER_CLASS_TEAM_MAGMA: - case TRAINER_CLASS_AQUA_ADMIN: - case TRAINER_CLASS_AQUA_LEADER: - case TRAINER_CLASS_MAGMA_ADMIN: - case TRAINER_CLASS_MAGMA_LEADER: - PlayBGM(MUS_KACHI4); - break; - case TRAINER_CLASS_LEADER: - PlayBGM(MUS_KACHI3); - break; - default: - PlayBGM(MUS_KACHI1); - break; - } - } - else - { - gBattlescriptCurrInstr = BattleScript_PayDayMoneyAndPickUpItems; - } - - gBattleMainFunc = HandleEndTurn_FinishBattle; -} - -void HandleEndTurn_BattleLost(void) -{ - gCurrentActionFuncId = 0; - - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - gBattleTextBuff1[0] = gBattleOutcome; - gBankAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost; - gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN); - } - else - { - gBattlescriptCurrInstr = BattleScript_LocalBattleLost; - } - - gBattleMainFunc = HandleEndTurn_FinishBattle; -} - -void HandleEndTurn_RanFromBattle(void) -{ - gCurrentActionFuncId = 0; - - switch (gProtectStructs[gBankAttacker].fleeFlag) - { - default: - gBattlescriptCurrInstr = BattleScript_GotAwaySafely; - break; - case 1: - gBattlescriptCurrInstr = BattleScript_SmokeBallEscape; - break; - case 2: - gBattlescriptCurrInstr = BattleScript_RanAwayUsingMonAbility; - break; - } - - gBattleMainFunc = HandleEndTurn_FinishBattle; -} - -void HandleEndTurn_MonFled(void) -{ - gCurrentActionFuncId = 0; - - PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, gBattlerPartyIndexes[gBankAttacker]); - gBattlescriptCurrInstr = BattleScript_WildMonFled; - - gBattleMainFunc = HandleEndTurn_FinishBattle; -} - -void HandleEndTurn_FinishBattle(void) -{ - if (gCurrentActionFuncId == 0xB || gCurrentActionFuncId == 0xC) - { - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK - | BATTLE_TYPE_FIRST_BATTLE - | BATTLE_TYPE_SAFARI - | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_WALLY_TUTORIAL - | BATTLE_TYPE_BATTLE_TOWER))) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) - { - if (gBattleResults.poke1Species == SPECIES_NONE) - { - gBattleResults.poke1Species = gBattleMons[gActiveBattler].species; - StringCopy(gBattleResults.pokeString1, gBattleMons[gActiveBattler].nickname); - } - else - { - gBattleResults.opponentSpecies = gBattleMons[gActiveBattler].species; - StringCopy(gBattleResults.pokeString2, gBattleMons[gActiveBattler].nickname); - } - } - } - PutPokemonTodayCaughtOnAir(); - } - - BeginFastPaletteFade(3); - FadeOutMapMusic(5); - gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions; - gCB2_AfterEvolution = BattleMainCB2; - } - else - { - if (gBattleExecBuffer == 0) - gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); - } -} - -static void FreeResetData_ReturnToOvOrDoEvolutions(void) -{ - if (!gPaletteFade.active) - { - ResetSpriteData(); - if (gLeveledUpInBattle == 0 || gBattleOutcome != BATTLE_WON) - { - gBattleMainFunc = ReturnFromBattleToOverworld; - return; - } - else - { - gBattleMainFunc = TryEvolvePokemon; - } - } -} - -void TryEvolvePokemon(void) -{ - s32 i; - - while (gLeveledUpInBattle != 0) - { - for (i = 0; i < 6; i++) - { - if (gLeveledUpInBattle & gBitTable[i]) - { - u16 species; - u8 levelUpBits = gLeveledUpInBattle; - - levelUpBits &= ~(gBitTable[i]); - gLeveledUpInBattle = levelUpBits; - - species = GetEvolutionTargetSpecies(&gPlayerParty[i], 0, levelUpBits); - if (species != SPECIES_NONE) - { - gBattleMainFunc = WaitForEvoSceneToFinish; - EvolutionScene(&gPlayerParty[i], species, 0x81, i); - return; - } - } - } - } - - gBattleMainFunc = ReturnFromBattleToOverworld; -} - -static void WaitForEvoSceneToFinish(void) -{ - if (gMain.callback2 == BattleMainCB2) - gBattleMainFunc = TryEvolvePokemon; -} - -static void ReturnFromBattleToOverworld(void) -{ - if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) - { - RandomlyGivePartyPokerus(gPlayerParty); - PartySpreadPokerus(gPlayerParty); - } - - if (gBattleTypeFlags & BATTLE_TYPE_LINK && gReceivedRemoteLinkPlayers != 0) - return; - - gSpecialVar_Result = gBattleOutcome; - gMain.inBattle = 0; - gMain.callback1 = gPreBattleCallback1; - - if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) - { - UpdateRoamerHPStatus(&gEnemyParty[0]); - if (gBattleOutcome == BATTLE_WON || gBattleOutcome == BATTLE_CAUGHT) - SetRoamerInactive(); - } - - m4aSongNumStop(0x5A); - SetMainCallback2(gMain.savedCallback); -} - -void RunBattleScriptCommands_PopCallbacksStack(void) -{ - if (gCurrentActionFuncId == 0xB || gCurrentActionFuncId == 0xC) - { - if (B_FUNCTION_STACK->size != 0) - B_FUNCTION_STACK->size--; - gBattleMainFunc = B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size]; - } - else - { - if (gBattleExecBuffer == 0) - gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); - } -} - -void RunBattleScriptCommands(void) -{ - if (gBattleExecBuffer == 0) - gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); -} - -void HandleAction_UseMove(void) -{ - u8 side; - u8 var = 4; - - gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; - - if (ewram160A6 & gBitTable[gBankAttacker]) - { - gCurrentActionFuncId = ACTION_FINISHED; - return; - } - - gCritMultiplier = 1; - eDmgMultiplier = 1; - ewram160E7 = 0; - gMoveResultFlags = 0; - gMultiHitCounter = 0; - gBattleCommunication[6] = 0; - gCurrMovePos = gUnknown_02024BE5 = ewram1608Carr(gBankAttacker); - - // choose move - if (gProtectStructs[gBankAttacker].onlyStruggle) - { - gProtectStructs[gBankAttacker].onlyStruggle = 0; - gCurrentMove = gChosenMove = MOVE_STRUGGLE; - gHitMarker |= HITMARKER_NO_PPDEDUCT; - ewram16010arr(gBankAttacker) = GetMoveTarget(MOVE_STRUGGLE, 0); - } - else if (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBankAttacker].status2 & STATUS2_RECHARGE) - { - gCurrentMove = gChosenMove = gLockedMoves[gBankAttacker]; - } - // encore forces you to use the same move - else if (gDisableStructs[gBankAttacker].encoredMove != MOVE_NONE - && gDisableStructs[gBankAttacker].encoredMove == gBattleMons[gBankAttacker].moves[gDisableStructs[gBankAttacker].encoredMovePos]) - { - gCurrentMove = gChosenMove = gDisableStructs[gBankAttacker].encoredMove; - gCurrMovePos = gUnknown_02024BE5 = gDisableStructs[gBankAttacker].encoredMovePos; - ewram16010arr(gBankAttacker) = GetMoveTarget(gCurrentMove, 0); - } - // check if the encored move wasn't overwritten - else if (gDisableStructs[gBankAttacker].encoredMove != MOVE_NONE - && gDisableStructs[gBankAttacker].encoredMove != gBattleMons[gBankAttacker].moves[gDisableStructs[gBankAttacker].encoredMovePos]) - { - gCurrMovePos = gUnknown_02024BE5 = gDisableStructs[gBankAttacker].encoredMovePos; - gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; - gDisableStructs[gBankAttacker].encoredMove = MOVE_NONE; - gDisableStructs[gBankAttacker].encoredMovePos = 0; - gDisableStructs[gBankAttacker].encoreTimer1 = 0; - ewram16010arr(gBankAttacker) = GetMoveTarget(gCurrentMove, 0); - } - else if (gBattleMons[gBankAttacker].moves[gCurrMovePos] != gChosenMovesByBanks[gBankAttacker]) - { - gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; - ewram16010arr(gBankAttacker) = GetMoveTarget(gCurrentMove, 0); - } - else - { - gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; - } - - if (GetBattlerSide(gBankAttacker) == B_SIDE_PLAYER) - gBattleResults.lastUsedMove = gCurrentMove; - else - gBattleResults.opponentMove = gCurrentMove; - - // choose target - side = GetBattlerSide(gBankAttacker) ^ BIT_SIDE; - if (gSideTimers[side].followmeTimer != 0 - && gBattleMoves[gCurrentMove].target == MOVE_TARGET_SELECTED - && GetBattlerSide(gBankAttacker) != GetBattlerSide(gSideTimers[side].followmeTarget) - && gBattleMons[gSideTimers[side].followmeTarget].hp != 0) - { - gBankTarget = gSideTimers[side].followmeTarget; - } - else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - && gSideTimers[side].followmeTimer == 0 - && (gBattleMoves[gCurrentMove].power != 0 - || gBattleMoves[gCurrentMove].target != MOVE_TARGET_x10) - && gBattleMons[ewram16010arr(gBankAttacker)].ability != ABILITY_LIGHTNING_ROD - && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) - { - side = GetBattlerSide(gBankAttacker); - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (side != GetBattlerSide(gActiveBattler) - && ewram16010arr(gBankAttacker) != gActiveBattler - && gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD - && BankGetTurnOrder(gActiveBattler) < var) - { - var = BankGetTurnOrder(gActiveBattler); - } - } - if (var == 4) - { - if (gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM) - { - if (GetBattlerSide(gBankAttacker) == B_SIDE_PLAYER) - { - if (Random() & 1) - gBankTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - else - gBankTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); - } - else - { - if (Random() & 1) - gBankTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - else - gBankTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); - } - } - else - { - gBankTarget = ewram16010arr(gBankAttacker); - } - - if (gAbsentBattlerFlags & gBitTable[gBankTarget]) - { - if (GetBattlerSide(gBankAttacker) != GetBattlerSide(gBankTarget)) - { - gBankTarget = GetBattlerAtPosition(GetBattlerPosition(gBankTarget) ^ BIT_FLANK); - } - else - { - gBankTarget = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ BIT_SIDE); - if (gAbsentBattlerFlags & gBitTable[gBankTarget]) - gBankTarget = GetBattlerAtPosition(GetBattlerPosition(gBankTarget) ^ BIT_FLANK); - } - } - } - else - { - gActiveBattler = gBanksByTurnOrder[var]; - RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); - gSpecialStatuses[gActiveBattler].lightningRodRedirected = 1; - gBankTarget = gActiveBattler; - } - } - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM) - { - if (GetBattlerSide(gBankAttacker) == B_SIDE_PLAYER) - { - if (Random() & 1) - gBankTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - else - gBankTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); - } - else - { - if (Random() & 1) - gBankTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - else - gBankTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); - } - - if (gAbsentBattlerFlags & gBitTable[gBankTarget] - && GetBattlerSide(gBankAttacker) != GetBattlerSide(gBankTarget)) - { - gBankTarget = GetBattlerAtPosition(GetBattlerPosition(gBankTarget) ^ BIT_FLANK); - } - } - else - { - gBankTarget = ewram16010arr(gBankAttacker); - if (gAbsentBattlerFlags & gBitTable[gBankTarget]) - { - if (GetBattlerSide(gBankAttacker) != GetBattlerSide(gBankTarget)) - { - gBankTarget = GetBattlerAtPosition(GetBattlerPosition(gBankTarget) ^ BIT_FLANK); - } - else - { - gBankTarget = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ BIT_SIDE); - if (gAbsentBattlerFlags & gBitTable[gBankTarget]) - gBankTarget = GetBattlerAtPosition(GetBattlerPosition(gBankTarget) ^ BIT_FLANK); - } - } - } - - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; -} - -void HandleAction_Switch(void) -{ - gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gActionSelectionCursor[gBankAttacker] = 0; - gMoveSelectionCursor[gBankAttacker] = 0; - - PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, ewram16064arr(gBankAttacker)) - - ewram16003 = gBankAttacker; - gBattlescriptCurrInstr = BattleScript_ActionSwitch; - gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; - - if (gBattleResults.unk2 < 255) - gBattleResults.unk2++; -} - -void HandleAction_UseItem(void) -{ - gBankAttacker = gBankTarget = gBanksByTurnOrder[gCurrentTurnActionNumber]; - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gDisableStructs[gBankAttacker].furyCutterCounter = 0; - gLastUsedItem = gBattleBufferB[gBankAttacker][1] | (gBattleBufferB[gBankAttacker][2] << 8); - - if (gLastUsedItem <= ITEM_PREMIER_BALL) // is ball - { - gBattlescriptCurrInstr = gBattlescriptsForBallThrow[gLastUsedItem]; - } - else if (gLastUsedItem == ITEM_POKE_DOLL || gLastUsedItem == ITEM_FLUFFY_TAIL) - { - gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[0]; - } - else if (GetBattlerSide(gBankAttacker) == B_SIDE_PLAYER) - { - gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0]; - } - else - { - - switch (ewram160D8((ewram16003 = gBankAttacker))) - { - case AI_ITEM_FULL_RESTORE: - case AI_ITEM_HEAL_HP: - break; - case AI_ITEM_CURE_CONDITION: - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (ewram160DA(gBankAttacker) & 1) - { - if (ewram160DA(gBankAttacker) & 0x3E) - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - } - else - { - while (!(ewram160DA(gBankAttacker) & 1)) - { - ewram160DA(gBankAttacker) >>= 1; - gBattleCommunication[MULTISTRING_CHOOSER]++; - } - } - break; - case AI_ITEM_X_STAT: - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - if (ewram160DA(gBankAttacker) & 0x80) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - } - else - { - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK) - PREPARE_STRING_BUFFER(gBattleTextBuff2, 0xD2) - - while (!(ewram160DA(gBankAttacker) & 1)) - { - ewram160DA(gBankAttacker) >>= 1; - gBattleTextBuff1[2]++; - } - - ewram160A4 = gBattleTextBuff1[2] + 14; - ewram160A5 = 0; - } - break; - case AI_ITEM_GUARD_SPECS: - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - break; - } - - gBattlescriptCurrInstr = gBattlescriptsForUsingItem[ewram160D8(gBankAttacker)]; - } - gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; -} - -bool8 TryRunFromBattle(u8 bank) -{ - bool8 effect = FALSE; - u8 holdEffect; - u8 speedVar; - - if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY) - holdEffect = gEnigmaBerries[bank].holdEffect; - else - holdEffect = ItemId_GetHoldEffect(gBattleMons[bank].item); - - gStringBank = bank; - - if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN) - { - gLastUsedItem = gBattleMons[bank].item ; - gProtectStructs[bank].fleeFlag = 1; - effect++; - } - else if (gBattleMons[bank].ability == ABILITY_RUN_AWAY) - { - gLastUsedAbility = ABILITY_RUN_AWAY; - gProtectStructs[bank].fleeFlag = 2; - effect++; - } - else - { - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - if (gBattleMons[bank].speed < gBattleMons[bank ^ BIT_SIDE].speed) - { - speedVar = (gBattleMons[bank].speed * 128) / (gBattleMons[bank ^ BIT_SIDE].speed) + (ewram16078 * 30); - if (speedVar > (Random() & 0xFF)) - effect++; - } - else // same speed or faster - { - effect++; - } - } - - ewram16078++; - } - - if (effect) - { - gCurrentTurnActionNumber = gBattlersCount; - gBattleOutcome = BATTLE_RAN; - } - - return effect; -} - -void HandleAction_Run(void) -{ - gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; - - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - gCurrentTurnActionNumber = gBattlersCount; - - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) - { - if (gActionForBanks[gActiveBattler] == ACTION_RUN) - gBattleOutcome |= BATTLE_LOST; - } - else - { - if (gActionForBanks[gActiveBattler] == ACTION_RUN) - gBattleOutcome |= BATTLE_WON; - } - } - - gBattleOutcome |= OUTCOME_LINK_BATTLE_RUN; - } - else - { - if (GetBattlerSide(gBankAttacker) == B_SIDE_PLAYER) - { - if (!TryRunFromBattle(gBankAttacker)) // failed to run away - { - gBattleMons[gBankAttacker].status2 &= ~STATUS2_DESTINY_BOND; - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; - gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; - } - } - else - { - if (gBattleMons[gBankAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; - gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; - } - else - { - gCurrentTurnActionNumber = gBattlersCount; - gBattleOutcome = BATTLE_POKE_FLED; - } - } - } -} - -void HandleAction_WatchesCarefully(void) -{ - gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gBattlescriptCurrInstr = gBattlescriptsForSafariActions[0]; - gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; -} - -void HandleAction_SafariZoneBallThrow(void) -{ - gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gNumSafariBalls--; - gLastUsedItem = ITEM_SAFARI_BALL; - gBattlescriptCurrInstr = gBattlescriptsForBallThrow[ITEM_SAFARI_BALL]; - gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; -} - -void HandleAction_ThrowPokeblock(void) -{ - gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = gBattleBufferB[gBankAttacker][1] - 1; - gLastUsedItem = gBattleBufferB[gBankAttacker][2]; - - if (ewram16087 < 3) - ewram16087++; - if (ewram16088 > 1) - { - if (ewram16088 < gUnknown_081FA70C[ewram16087][gBattleCommunication[MULTISTRING_CHOOSER]]) - ewram16088 = 1; - else - ewram16088 -= gUnknown_081FA70C[ewram16087][gBattleCommunication[MULTISTRING_CHOOSER]]; - } - - gBattlescriptCurrInstr = gBattlescriptsForSafariActions[2]; - gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; -} - -void HandleAction_GoNear(void) -{ - gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - - ewram16089 += gUnknown_081FA71B[ewram16086]; - if (ewram16089 > 20) - ewram16089 = 20; - - ewram16088 += gUnknown_081FA71F[ewram16086]; - if (ewram16088 > 20) - ewram16088 = 20; - - if (ewram16086 < 3) - { - ewram16086++; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - gBattlescriptCurrInstr = gBattlescriptsForSafariActions[1]; - gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; -} - -void HandleAction_SafriZoneRun(void) -{ - gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; - PlaySE(SE_NIGERU); - gCurrentTurnActionNumber = gBattlersCount; - gBattleOutcome = BATTLE_RAN; -} - -void HandleAction_Action9(void) -{ - gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - - PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, gBattlerPartyIndexes[gBankAttacker]) - - gBattlescriptCurrInstr = gBattlescriptsForSafariActions[3]; - gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; - gActionsByTurnOrder[1] = ACTION_FINISHED; -} - -void HandleAction_Action11(void) -{ - if (!HandleFaintedMonActions()) - { - ewram16059 = 0; - gCurrentActionFuncId = ACTION_FINISHED; - } -} - -void HandleAction_NothingIsFainted(void) -{ - gCurrentTurnActionNumber++; - gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; - gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR - | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_x100000 - | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT - | HITMARKER_x8000000 | HITMARKER_x4000000); -} - -void HandleAction_ActionFinished(void) -{ - gCurrentTurnActionNumber++; - gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; - SpecialStatusesClear(); - gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR - | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_x100000 - | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT - | HITMARKER_x8000000 | HITMARKER_x4000000); - - gBattleMoveDamage = 0; - ewram16002 = 0; - ewram160A1 = 0; - gLastLandedMoves[gBankAttacker] = 0; - gLastHitByType[gBankAttacker] = 0; - eDynamicMoveType = 0; - gDynamicBasePower = 0; - ewram1600C = 0; - gBattleCommunication[3] = 0; - gBattleCommunication[4] = 0; - eMultihitMoveEffect = 0; - ewram17130 = 0; -} diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c deleted file mode 100644 index dab6ce1f0..000000000 --- a/src/battle/battle_4.c +++ /dev/null @@ -1,14789 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_message.h" -#include "battle_string_ids.h" -#include "battle_script_commands.h" -#include "battle_util.h" -#include "constants/battle_move_effects.h" -#include "constants/moves.h" -#include "constants/abilities.h" -#include "item.h" -#include "constants/items.h" -#include "data2.h" -#include "constants/hold_effects.h" -#include "random.h" -#include "rom3.h" -#include "constants/species.h" -#include "pokemon.h" -#include "text.h" -#include "palette.h" -#include "main.h" -#include "constants/songs.h" -#include "sound.h" -#include "task.h" -#include "decompress.h" -#include "pokemon_summary_screen.h" -#include "naming_screen.h" -#include "ewram.h" -#include "util.h" - -// TODO: put this into battle_controllers.h - -#define RET_VALUE_LEVELLED_UP 11 - -enum -{ - CONTROLLER_GETMONDATA, - CONTROLLER_GETRAWMONDATA, - CONTROLLER_SETMONDATA, - CONTROLLER_SETRAWMONDATA, - CONTROLLER_LOADMONSPRITE, - CONTROLLER_SWITCHINANIM, - CONTROLLER_RETURNMONTOBALL, - CONTROLLER_DRAWTRAINERPIC, - CONTROLLER_TRAINERSLIDE, - CONTROLLER_TRAINERSLIDEBACK, - CONTROLLER_FAINTANIMATION, - CONTROLLER_PALETTEFADE, - CONTROLLER_SUCCESSBALLTHROWANIM, - CONTROLLER_BALLTHROWANIM, - CONTROLLER_PAUSE, - CONTROLLER_MOVEANIMATION, - CONTROLLER_PRINTSTRING, - CONTROLLER_PRINTSTRINGPLAYERONLY, - CONTROLLER_CHOOSEACTION, - CONTROLLER_UNKNOWNYESNOBOX, - CONTROLLER_CHOOSEMOVE, - CONTROLLER_OPENBAG, - CONTROLLER_CHOOSEPOKEMON, - CONTROLLER_23, - CONTROLLER_HEALTHBARUPDATE, - CONTROLLER_EXPUPDATE, - CONTROLLER_STATUSICONUPDATE, - CONTROLLER_STATUSANIMATION, - CONTROLLER_STATUSXOR, - CONTROLLER_DATATRANSFER, - CONTROLLER_DMA3TRANSFER, - CONTROLLER_31, - CONTROLLER_32, - CONTROLLER_TWORETURNVALUES, - CONTROLLER_CHOSENMONRETURNVALUE, - CONTROLLER_ONERETURNVALUE, - CONTROLLER_ONERETURNVALUE_DUPLICATE, - CONTROLLER_37, - CONTROLLER_38, - CONTROLLER_39, - CONTROLLER_40, - CONTROLLER_HITANIMATION, - CONTROLLER_42, - CONTROLLER_EFFECTIVENESSSOUND, - CONTROLLER_PLAYFANFAREORBGM, - CONTROLLER_FAINTINGCRY, - CONTROLLER_INTROSLIDE, - CONTROLLER_INTROTRAINERBALLTHROW, - CONTROLLER_DRAWPARTYSTATUSSUMMARY, - CONTROLLER_49, - CONTROLLER_50, - CONTROLLER_SPRITEINVISIBILITY, - CONTROLLER_BATTLEANIMATION, - CONTROLLER_LINKSTANDBYMSG, - CONTROLLER_RESETACTIONMOVESELECTION, - CONTROLLER_55, - /*new controllers should go here*/ - CONTROLLER_TERMINATOR_NOP, - CONTROLLER_CMDS_COUNT -}; - -//extern needed variables -extern u8 gUnknown_02023A14_50; -extern u8 gCritMultiplier; -extern s32 gBattleMoveDamage; -extern u32 gStatuses3[MAX_BATTLERS_COUNT]; -extern u16 gBattleTypeFlags; -extern const struct BaseStats gBaseStats[]; -extern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT]; -extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT]; -extern u8 gActiveBattler; -extern u32 gBattleExecBuffer; -extern u8 gBattlersCount; -extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT]; -extern u8 gBanksByTurnOrder[MAX_BATTLERS_COUNT]; -extern u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT]; -extern u16 gCurrentMove; -extern u8 gLastUsedAbility; -extern u16 gBattleWeather; -extern u8 gStringBank; -extern u8 gEffectBank; -extern u8 gAbsentBattlerFlags; -extern u8 gMultiHitCounter; -extern u16 gLastUsedMove[4]; -extern u16 gLockedMoves[4]; -extern u16 gChosenMovesByBanks[4]; -extern u16 gSideAffecting[2]; -extern u16 gPauseCounterBattle; -extern u16 gPaydayMoney; -extern u16 gRandomTurnNumber; -extern u8 gBattleOutcome; -extern u8 gBattleTerrain; -extern u16 gTrainerBattleOpponent; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern const u8* gBattlescriptCurrInstr; -extern u8 gCurrMovePos; -extern u8 gCurrentActionFuncId; -extern u32 gHitMarker; -extern u8 gMoveResultFlags; -extern u8 gBattleCommunication[]; -extern u16 gLastLandedMoves[4]; -extern u16 gLastHitByType[4]; -extern u8 gStringBank; -extern u16 gDynamicBasePower; -extern const u8 gTypeEffectiveness[]; -extern u16 gLastUsedItem; -extern u16 gBattleMovePower; -extern s32 gHpDealt; -extern s32 gTakenDmg[MAX_BATTLERS_COUNT]; -extern u8 gTakenDmgBanks[MAX_BATTLERS_COUNT]; -extern const u16 gMissStringIds[]; -extern u8 gSentPokesToOpponent[2]; -extern u8 gBank1; -extern u16 gExpShareExp; -extern u8 gBattleTextBuff1[]; -extern u8 gBattleTextBuff2[]; -extern u8 gBattleTextBuff3[]; -extern u8 gLeveledUpInBattle; -extern void (*gBattleMainFunc)(void); -extern struct Window gUnknown_03004210; -extern const u8 BattleText_YesNo[]; -extern u8 gPlayerPartyCount; -extern u16 gMoveToLearn; //move to learn -extern const u8 gTrainerMoney[]; -extern u16 gRandomMove; -extern u8* gBattleScriptsForMoveEffects[]; -extern u16 gChosenMove; //last used move in battle -extern u8 gBankInMenu; -extern u8 gActionForBanks[4]; -extern u16 gUnknown_02024C2C[4]; //last used moves 2, used by sketch -extern u16 gUnknown_02024C4C[4]; //last used moves by banks, another one -extern u8 gCurrentTurnActionNumber; -extern u16 gTrappingMoves[]; - -extern u8 BattleScript_MoveEffectSleep[]; -extern u8 BattleScript_MoveEffectPoison[]; -extern u8 BattleScript_MoveEffectBurn[]; -extern u8 BattleScript_MoveEffectFreeze[]; -extern u8 BattleScript_MoveEffectParalysis[]; -extern u8 BattleScript_MoveEffectToxic[]; -extern u8 BattleScript_MoveEffectConfusion[]; -extern u8 BattleScript_MoveEffectUproar[]; -extern u8 BattleScript_MoveEffectWrap[]; -extern u8 BattleScript_MoveEffectPayDay[]; -extern u8 BattleScript_MoveEffectRecoil33[]; - -//extern functions -u8 AtkCanceller_UnableToUseMove(void); -void PressurePPLose(u8 bank_atk, u8 bank_def, u16 move); -void CancelMultiTurnMoves(u8 bank); -void BattleScriptPush(const u8* BS_ptr); -void BattleScriptPushCursor(void); -void RecordAbilityBattle(u8 bank, u8 ability); -void RecordItemBattle(u8 bank, u8 holdEffect); -static bool8 IsTwoTurnsMove(u16 move); -static void TrySetDestinyBondToHappen(void); -static void CheckWonderGuardAndLevitate(void); -u8 GetBattlerPosition(u8 bank); -u8 GetBattlerSide(u8 bank); -u8 GetBattleBank(u8 bankValue); -s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 bank_atk, u8 bank_def); -static u8 AttacksThisTurn(u8 bank, u16 move); //Note: returns 1 if it's a charging turn, otherwise 2 -void UndoEffectsAfterFainting(void); -void BattleStopLowHpSound(void); -void PlayBGM(u16 songID); -void MonGainEVs(struct Pokemon*, u16 defeatedSpecies); -extern u8 gBattleBufferB[4][0x200]; -void HandleLowHpMusicChange(struct Pokemon*, u8 bank); -bool8 IsTradedMon(struct Pokemon*); -void BattleScriptPop(void); -void SwitchInClearSetData(void); -u8* ConvertIntToDecimalStringN(u8*, s32, u8, u8); -u8 GetSetPokedexFlag(u16 nationalNum, u8 caseID); -u16 SpeciesToNationalPokedexNum(u16 species); -u8 sub_803FC34(u8 bank); -u16 sub_803FBFC(u8 a); -u8 GetBattlerAtPosition(u8 ID); -void sub_8012258(u8); -//MonTryLearningNewMove teach poke a move -u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move); -void IncrementGameStat(u8 index); -u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale); -u16 GetPokedexHeightWeight(u16 national_num, u8 heightweight); -u8 MenuCursor_Create814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5); -void DestroyMenuCursor(void); -void sub_802BC6C(void); -u8 sub_809FA30(void); -bool32 IsHMMove2(u16 move); -void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0); -void nullsub_6(void); -void ReshowBattleScreenAfterMenu(void); -void BattleMainCB2(void); -void AddMoney(u32* moneySaveblock, u32 to_give); -u8 CountAliveMons(u8 caseID); -void PokemonUseItemEffects(struct Pokemon*, u16 item, u8 partyID, u8 r3, u8 sp); -u8 CanRunFromBattle(void); -u8 GetMoveTarget(u16 move, u8 targetbyte); //get target of move -u8 CastformDataTypeChange(u8 bank); -u8 Overworld_GetMapTypeOfSaveblockLocation(void); -u8 CalculatePlayerPartyCount(void); -u16 Sqrt(u32 num); -u8 sub_809070C(u16 nationalNum, u32 TiD, u32 PiD); //task prepare poke dex display -void MenuCursor_SetPos814A880(u8 a1, u8 a2); -u8 CheckMoveLimitations(u8 bank, u8 unusable_moves, u8 flags); -bool8 IsLinkDoubleBattle(void); -void sub_8094B6C(u8 bank, u8 partyID, u8 r2); - -//extern BattleScripts -extern u8 BattleScript_MoveEnd[]; -extern u8 BattleScript_NoPPForMove[]; -extern u8 BattleScript_MagicCoatBounce[]; -extern u8 BattleScript_TookAttack[]; -extern u8 BattleScript_SnatchedMove[]; -extern u8 BattleScript_Pausex20[]; -extern u8 BattleScript_SubstituteFade[]; -extern u8 BattleScript_HangedOnMsg[]; -extern u8 BattleScript_OneHitKOMsg[]; -extern u8 BattleScript_EnduredMsg[]; -extern u8 BattleScript_PSNPrevention[]; -extern u8 BattleScript_BRNPrevention[]; -extern u8 BattleScript_PRLZPrevention[]; -extern u8 BattleScript_FlinchPrevention[]; -extern u8 BattleScript_StatUp[]; -extern u8 BattleScript_StatDown[]; -extern u8 BattleScript_NoItemSteal[]; -extern u8 BattleScript_ItemSteal[]; -extern u8 BattleScript_RapidSpinAway[]; -extern u8 BattleScript_TargetPRLZHeal[]; -extern u8 BattleScript_KnockedOff[]; -extern u8 BattleScript_LevelUp[]; -extern u8 BattleScript_WrapFree[]; -extern u8 BattleScript_LeechSeedFree[]; -extern u8 BattleScript_SpikesFree[]; -extern u8 BattleScript_ButItFailed[]; -extern u8 BattleScript_ObliviousPreventsAttraction[]; -extern u8 BattleScript_MistProtected[]; -extern u8 BattleScript_AbilityNoStatLoss[]; -extern u8 BattleScript_AbilityNoSpecificStatLoss[]; -extern u8 BattleScript_TrainerBallBlock[]; -extern u8 BattleScript_WallyBallThrow[]; -extern u8 BattleScript_SuccessBallThrow[]; -extern u8 BattleScript_ShakeBallThrow[]; -extern u8 BattleScript_AllStatsUp[]; -extern u8 BattleScript_AtkDefDown[]; -extern u8 BattleScript_SAtkDown2[]; - -extern u8 BattleScript_SpikesOnTarget[]; //spikes1 -extern u8 BattleScript_SpikesOnAttacker[]; //spikes2 -extern u8 BattleScript_SpikesOngBank1[]; //spikes3 -extern u8 BattleScript_HitFromCritCalc[]; //present dmg -extern u8 BattleScript_AlreadyAtFullHp[]; //present full hp -extern u8 BattleScript_PresentHealTarget[]; //present hp heal -extern u8 BattleScript_MoveMissedPause[]; -extern u8 BattleScript_CastformChange[]; -extern u8 BattleScript_DampStopsExplosion[]; -extern u8 BattleScript_SuccessForceOut[]; //bs random switchout -extern u8 BattleScript_PrintPayDayMoneyString[]; //bs payday money give -extern u8 BattleScript_FaintAttacker[]; -extern u8 BattleScript_FaintTarget[]; -extern u8 BattleScript_DestinyBondTakesLife[]; -extern u8 BattleScript_SelectingImprisionedMoveInPalace[]; - -// read via orr -#define BSScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) -#define BSScriptRead16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) -#define BSScriptReadPtr(ptr) ((void *)BSScriptRead32(ptr)) - -// read via add -#define BS2ScriptRead32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) -#define BS2ScriptRead16(ptr) ((ptr)[0] + ((ptr)[1] << 8)) -#define BS2ScriptReadPtr(ptr) ((void *)BS2ScriptRead32(ptr)) - -#define TARGET_PROTECT_AFFECTED ((gProtectStructs[gBankTarget].protected && gBattleMoves[gCurrentMove].flags & F_AFFECTED_BY_PROTECT)) - -//array entries for battle communication -#define MOVE_EFFECT_BYTE 0x3 -#define MULTISTRING_CHOOSER 0x5 -#define MSG_DISPLAY 0x7 - -#define TARGET_SELECTED 0x0 -#define TARGET_DEPENDS 0x1 -#define TARGET_BOTH 0x8 -#define TARGET_FOES_AND_ALLY 0x20 -#define TARGET_OPPONENTS_FIELD 0x40 - -#define TYPE_FORESIGHT 0xFE -#define TYPE_ENDTABLE 0xFF - -#define CMP_EQUAL 0x0 -#define CMP_NOT_EQUAL 0x1 -#define CMP_GREATER_THAN 0x2 -#define CMP_LESS_THAN 0x3 -#define CMP_COMMON_BITS 0x4 -#define CMP_NO_COMMON_BITS 0x5 - -#define uBYTE0_16(value)(( (u8) (((u16)(value) & (0x000000FF)) >> 0x00))) -#define uBYTE1_16(value)(( (u8) (((u16)(value) & (0x0000FF00)) >> 0x08))) - -#define uBYTE0_32(value)(( (u8) (((u32)(value) & (0x000000FF)) >> 0x00))) -#define uBYTE1_32(value)(( (u8) (((u32)(value) & (0x0000FF00)) >> 0x08))) -#define uBYTE2_32(value)(( (u8) (((u32)(value) & (0x00FF0000)) >> 0x10))) -#define uBYTE3_32(value)(( (u8) (((u32)(value) & (0xFF000000)) >> 0x18))) - -#define sBYTE0_16(value)(( (u8) (((s16)(value) & (0x000000FF)) >> 0x00))) -#define sBYTE1_16(value)(( (u8) (((s16)(value) & (0x0000FF00)) >> 0x08))) - -#define sBYTE0_32(value)(( (u8) (((s32)(value) & (0x000000FF)) >> 0x00))) -#define sBYTE1_32(value)(( (u8) (((s32)(value) & (0x0000FF00)) >> 0x08))) -#define sBYTE2_32(value)(( (u8) (((s32)(value) & (0x00FF0000)) >> 0x10))) -#define sBYTE3_32(value)(( (u8) (((s32)(value) & (0xFF000000)) >> 0x18))) - -#define RecordAbilitySetField6(ability, fieldValue) \ -(gLastUsedAbility = ability, gBattleCommunication[6] = fieldValue, RecordAbilityBattle(gBankTarget, ability)) - -#define TARGET_TURN_DAMAGED (((gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special))) - -#define HP_ON_SWITCHOUT (((u16*)(ewram_addr + 0x160BC))) - -static void atk00_attackcanceler(void); -static void atk01_accuracycheck(void); -static void atk02_attackstring(void); -static void atk03_ppreduce(void); -static void atk04_critcalc(void); -static void atk05_damagecalc(void); -static void atk06_typecalc(void); -static void atk07_adjustnormaldamage(void); -static void atk08_adjustnormaldamage2(void); -static void atk09_attackanimation(void); -static void atk0A_waitanimation(void); -static void atk0B_healthbarupdate(void); -static void atk0C_datahpupdate(void); -static void atk0D_critmessage(void); -static void atk0E_effectivenesssound(void); -static void atk0F_resultmessage(void); -static void atk10_printstring(void); -static void atk11_printselectionstring(void); -static void atk12_waitmessage(void); -static void atk13_printfromtable(void); -static void atk14_printselectionstringfromtable(void); -static void atk15_seteffectwithchance(void); -static void atk16_seteffectprimary(void); -static void atk17_seteffectsecondary(void); -static void atk18_clearstatusfromeffect(void); -static void atk19_tryfaintmon(void); -static void atk1A_dofaintanimation(void); -static void atk1B_cleareffectsonfaint(void); -static void atk1C_jumpifstatus(void); -static void atk1D_jumpifstatus2(void); -static void atk1E_jumpifability(void); -static void atk1F_jumpifsideaffecting(void); -static void atk20_jumpifstat(void); -static void atk21_jumpifstatus3condition(void); -static void atk22_jumpiftype(void); -static void atk23_getexp(void); -static void atk24(void); -static void atk25_movevaluescleanup(void); -static void atk26_setmultihit(void); -static void atk27_decrementmultihit(void); -static void atk28_goto(void); -static void atk29_jumpifbyte(void); -static void atk2A_jumpifhalfword(void); -static void atk2B_jumpifword(void); -static void atk2C_jumpifarrayequal(void); -static void atk2D_jumpifarraynotequal(void); -static void atk2E_setbyte(void); -static void atk2F_addbyte(void); -static void atk30_subbyte(void); -static void atk31_copyarray(void); -static void atk32_copyarraywithindex(void); -static void atk33_orbyte(void); -static void atk34_orhalfword(void); -static void atk35_orword(void); -static void atk36_bicbyte(void); -static void atk37_bichalfword(void); -static void atk38_bicword(void); -static void atk39_pause(void); -static void atk3A_waitstate(void); -static void atk3B_healthbar_update(void); -static void atk3C_return(void); -static void atk3D_end(void); -static void atk3E_end2(void); -static void atk3F_end3(void); -static void atk40_jumpifaffectedbyprotect(void); -static void atk41_call(void); -static void atk42_jumpiftype2(void); -static void atk43_jumpifabilitypresent(void); -static void atk44_endselectionscript(void); -static void atk45_playanimation(void); -static void atk46_playanimation2(void); -static void atk47_setgraphicalstatchangevalues(void); -static void atk48_playstatchangeanimation(void); -void atk49_moveend(void); -static void atk4A_typecalc2(void); -static void atk4B_returnatktoball(void); -static void atk4C_getswitchedmondata(void); -static void atk4D_switchindataupdate(void); -static void atk4E_switchinanim(void); -static void atk4F_jumpifcantswitch(void); -static void atk50_openpartyscreen(void); -static void atk51_switchhandleorder(void); -static void atk52_switchineffects(void); -static void atk53_trainerslidein(void); -static void atk54_playse(void); -static void atk55_fanfare(void); -static void atk56_playfaintcry(void); -static void atk57(void); -static void atk58_returntoball(void); -void atk59_handlelearnnewmove(void); -static void atk5A_yesnoboxlearnmove(void); -static void atk5B_yesnoboxstoplearningmove(void); -static void atk5C_hitanimation(void); -static void atk5D_getmoneyreward(void); -static void atk5E_8025A70(void); -static void atk5F_8025B24(void); -static void atk60_incrementgamestat(void); -static void atk61_drawpartystatussummary(void); -static void atk62_08025C6C(void); -static void atk63_jumptorandomattack(void); -static void atk64_statusanimation(void); -static void atk65_status2animation(void); -static void atk66_chosenstatusanimation(void); -static void atk67_yesnobox(void); -static void atk68_cancelallactions(void); -static void atk69_adjustsetdamage(void); -void atk6A_removeitem(void); -static void atk6B_atknameinbuff1(void); -static void atk6C_drawlvlupbox(void); -static void atk6D_resetsentmonsvalue(void); -static void atk6E_setatktoplayer0(void); -static void atk6F_makevisible(void); -static void atk70_recordlastability(void); -static void atk71_buffermovetolearn(void); -static void atk72_jumpifplayerran(void); -static void atk73_hpthresholds(void); -static void atk74_hpthresholds2(void); -static void atk75_useitemonopponent(void); -static void atk76_various(void); -static void atk77_setprotectlike(void); -static void atk78_faintifabilitynotdamp(void); -static void atk79_setatkhptozero(void); -static void atk7A_jumpifnexttargetvalid(void); -static void atk7B_tryhealhalfhealth(void); -static void atk7C_trymirrormove(void); -static void atk7D_setrain(void); -static void atk7E_setreflect(void); -static void atk7F_setseeded(void); -static void atk80_manipulatedamage(void); -static void atk81_trysetrest(void); -static void atk82_jumpifnotfirstturn(void); -static void atk83_nop(void); -static void atk84_jumpifcantmakeasleep(void); -static void atk85_stockpile(void); -static void atk86_stockpiletobasedamage(void); -static void atk87_stockpiletohpheal(void); -static void atk88_negativedamage(void); -static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr); -static void atk89_statbuffchange(void); -static void atk8A_normalisebuffs(void); -static void atk8B_setbide(void); -static void atk8C_confuseifrepeatingattackends(void); -static void atk8D_setmultihitcounter(void); -static void atk8E_initmultihitstring(void); -static void atk8F_forcerandomswitch(void); -static void atk90_tryconversiontypechange(void); -static void atk91_givepaydaymoney(void); -static void atk92_setlightscreen(void); -static void atk93_tryKO(void); -static void atk94_damagetohalftargethp(void); -static void atk95_setsandstorm(void); -static void atk96_weatherdamage(void); -static void atk97_tryinfatuating(void); -static void atk98_updatestatusicon(void); -static void atk99_setmist(void); -static void atk9A_setfocusenergy(void); -static void atk9B_transformdataexecution(void); -static void atk9C_setsubstitute(void); -static void atk9D_mimicattackcopy(void); -static void atk9E_metronome(void); -static void atk9F_dmgtolevel(void); -static void atkA0_psywavedamageeffect(void); -static void atkA1_counterdamagecalculator(void); -static void atkA2_mirrorcoatdamagecalculator(void); -static void atkA3_disablelastusedattack(void); -static void atkA4_trysetencore(void); -static void atkA5_painsplitdmgcalc(void); -static void atkA6_settypetorandomresistance(void); -static void atkA7_setalwayshitflag(void); -static void atkA8_copymovepermanently(void); -static void atkA9_trychoosesleeptalkmove(void); -static void atkAA_setdestinybond(void); -static void atkAB_trysetdestinybondtohappen(void); -static void atkAC_remaininghptopower(void); -static void atkAD_tryspiteppreduce(void); -static void atkAE_healpartystatus(void); -static void atkAF_cursetarget(void); -static void atkB0_trysetspikes(void); -static void atkB1_setforesight(void); -static void atkB2_trysetperishsong(void); -static void atkB3_rolloutdamagecalculation(void); -static void atkB4_jumpifconfusedandstatmaxed(void); -static void atkB5_furycuttercalc(void); -static void atkB6_happinesstodamagecalculation(void); -static void atkB7_presentdamagecalculation(void); -static void atkB8_setsafeguard(void); -static void atkB9_magnitudedamagecalculation(void); -static void atkBA_jumpifnopursuitswitchdmg(void); -static void atkBB_setsunny(void); -static void atkBC_maxattackhalvehp(void); -static void atkBD_copyfoestats(void); -static void atkBE_rapidspinfree(void); -static void atkBF_setdefensecurlbit(void); -static void atkC0_recoverbasedonsunlight(void); -static void atkC1_hiddenpowercalc(void); -static void atkC2_selectfirstvalidtarget(void); -static void atkC3_trysetfutureattack(void); -static void atkC4_trydobeatup(void); -static void atkC5_setsemiinvulnerablebit(void); -static void atkC6_clearsemiinvulnerablebit(void); -static void atkC7_setminimize(void); -static void atkC8_sethail(void); -static void atkC9_jumpifattackandspecialattackcannotfall(void); -static void atkCA_setforcedtarget(void); -static void atkCB_setcharge(void); -static void atkCC_callterrainattack(void); -static void atkCD_cureifburnedparalysedorpoisoned(void); -static void atkCE_settorment(void); -static void atkCF_jumpifnodamage(void); -static void atkD0_settaunt(void); -static void atkD1_trysethelpinghand(void); -static void atkD2_tryswapitems(void); -static void atkD3_trycopyability(void); -static void atkD4_trywish(void); -static void atkD5_trysetroots(void); -static void atkD6_doubledamagedealtifdamaged(void); -static void atkD7_setyawn(void); -static void atkD8_setdamagetohealthdifference(void); -static void atkD9_scaledamagebyhealthratio(void); -static void atkDA_tryswapabilities(void); -static void atkDB_tryimprision(void); -static void atkDC_trysetgrudge(void); -static void atkDD_weightdamagecalculation(void); -static void atkDE_asistattackselect(void); -static void atkDF_trysetmagiccoat(void); -static void atkE0_trysetsnatch(void); -static void atkE1_trygetintimidatetarget(void); -static void atkE2_switchoutabilities(void); -static void atkE3_jumpifhasnohp(void); -static void atkE4_getsecretpowereffect(void); -static void atkE5_pickup(void); -static void atkE6_docastformchangeanimation(void); -static void atkE7_trycastformdatachange(void); -static void atkE8_settypebasedhalvers(void); -static void atkE9_setweatherballtype(void); -static void atkEA_tryrecycleitem(void); -static void atkEB_settypetoterrain(void); -static void atkEC_pursuitrelated(void); -static void atkED_snatchsetbanks(void); -static void atkEE_removelightscreenreflect(void); -void atkEF_handleballthrow(void); -static void atkF0_givecaughtmon(void); -static void atkF1_trysetcaughtmondexflags(void); -static void atkF2_displaydexinfo(void); -static void atkF3_trygivecaughtmonnick(void); -static void atkF4_subattackerhpbydmg(void); -static void atkF5_removeattackerstatus1(void); -static void atkF6_finishaction(void); -static void atkF7_finishturn(void); - -void (* const gBattleScriptingCommandsTable[])(void) = -{ - atk00_attackcanceler, - atk01_accuracycheck, - atk02_attackstring, - atk03_ppreduce, - atk04_critcalc, - atk05_damagecalc, - atk06_typecalc, - atk07_adjustnormaldamage, - atk08_adjustnormaldamage2, - atk09_attackanimation, - atk0A_waitanimation, - atk0B_healthbarupdate, - atk0C_datahpupdate, - atk0D_critmessage, - atk0E_effectivenesssound, - atk0F_resultmessage, - atk10_printstring, - atk11_printselectionstring, - atk12_waitmessage, - atk13_printfromtable, - atk14_printselectionstringfromtable, - atk15_seteffectwithchance, - atk16_seteffectprimary, - atk17_seteffectsecondary, - atk18_clearstatusfromeffect, - atk19_tryfaintmon, - atk1A_dofaintanimation, - atk1B_cleareffectsonfaint, - atk1C_jumpifstatus, - atk1D_jumpifstatus2, - atk1E_jumpifability, - atk1F_jumpifsideaffecting, - atk20_jumpifstat, - atk21_jumpifstatus3condition, - atk22_jumpiftype, - atk23_getexp, - atk24, - atk25_movevaluescleanup, - atk26_setmultihit, - atk27_decrementmultihit, - atk28_goto, - atk29_jumpifbyte, - atk2A_jumpifhalfword, - atk2B_jumpifword, - atk2C_jumpifarrayequal, - atk2D_jumpifarraynotequal, - atk2E_setbyte, - atk2F_addbyte, - atk30_subbyte, - atk31_copyarray, - atk32_copyarraywithindex, - atk33_orbyte, - atk34_orhalfword, - atk35_orword, - atk36_bicbyte, - atk37_bichalfword, - atk38_bicword, - atk39_pause, - atk3A_waitstate, - atk3B_healthbar_update, - atk3C_return, - atk3D_end, - atk3E_end2, - atk3F_end3, - atk40_jumpifaffectedbyprotect, - atk41_call, - atk42_jumpiftype2, - atk43_jumpifabilitypresent, - atk44_endselectionscript, - atk45_playanimation, - atk46_playanimation2, - atk47_setgraphicalstatchangevalues, - atk48_playstatchangeanimation, - atk49_moveend, - atk4A_typecalc2, - atk4B_returnatktoball, - atk4C_getswitchedmondata, - atk4D_switchindataupdate, - atk4E_switchinanim, - atk4F_jumpifcantswitch, - atk50_openpartyscreen, - atk51_switchhandleorder, - atk52_switchineffects, - atk53_trainerslidein, - atk54_playse, - atk55_fanfare, - atk56_playfaintcry, - atk57, - atk58_returntoball, - atk59_handlelearnnewmove, - atk5A_yesnoboxlearnmove, - atk5B_yesnoboxstoplearningmove, - atk5C_hitanimation, - atk5D_getmoneyreward, - atk5E_8025A70, - atk5F_8025B24, - atk60_incrementgamestat, - atk61_drawpartystatussummary, - atk62_08025C6C, - atk63_jumptorandomattack, - atk64_statusanimation, - atk65_status2animation, - atk66_chosenstatusanimation, - atk67_yesnobox, - atk68_cancelallactions, - atk69_adjustsetdamage, - atk6A_removeitem, - atk6B_atknameinbuff1, - atk6C_drawlvlupbox, - atk6D_resetsentmonsvalue, - atk6E_setatktoplayer0, - atk6F_makevisible, - atk70_recordlastability, - atk71_buffermovetolearn, - atk72_jumpifplayerran, - atk73_hpthresholds, - atk74_hpthresholds2, - atk75_useitemonopponent, - atk76_various, - atk77_setprotectlike, - atk78_faintifabilitynotdamp, - atk79_setatkhptozero, - atk7A_jumpifnexttargetvalid, - atk7B_tryhealhalfhealth, - atk7C_trymirrormove, - atk7D_setrain, - atk7E_setreflect, - atk7F_setseeded, - atk80_manipulatedamage, - atk81_trysetrest, - atk82_jumpifnotfirstturn, - atk83_nop, - atk84_jumpifcantmakeasleep, - atk85_stockpile, - atk86_stockpiletobasedamage, - atk87_stockpiletohpheal, - atk88_negativedamage, - atk89_statbuffchange, - atk8A_normalisebuffs, - atk8B_setbide, - atk8C_confuseifrepeatingattackends, - atk8D_setmultihitcounter, - atk8E_initmultihitstring, - atk8F_forcerandomswitch, - atk90_tryconversiontypechange, - atk91_givepaydaymoney, - atk92_setlightscreen, - atk93_tryKO, - atk94_damagetohalftargethp, - atk95_setsandstorm, - atk96_weatherdamage, - atk97_tryinfatuating, - atk98_updatestatusicon, - atk99_setmist, - atk9A_setfocusenergy, - atk9B_transformdataexecution, - atk9C_setsubstitute, - atk9D_mimicattackcopy, - atk9E_metronome, - atk9F_dmgtolevel, - atkA0_psywavedamageeffect, - atkA1_counterdamagecalculator, - atkA2_mirrorcoatdamagecalculator, - atkA3_disablelastusedattack, - atkA4_trysetencore, - atkA5_painsplitdmgcalc, - atkA6_settypetorandomresistance, - atkA7_setalwayshitflag, - atkA8_copymovepermanently, - atkA9_trychoosesleeptalkmove, - atkAA_setdestinybond, - atkAB_trysetdestinybondtohappen, - atkAC_remaininghptopower, - atkAD_tryspiteppreduce, - atkAE_healpartystatus, - atkAF_cursetarget, - atkB0_trysetspikes, - atkB1_setforesight, - atkB2_trysetperishsong, - atkB3_rolloutdamagecalculation, - atkB4_jumpifconfusedandstatmaxed, - atkB5_furycuttercalc, - atkB6_happinesstodamagecalculation, - atkB7_presentdamagecalculation, - atkB8_setsafeguard, - atkB9_magnitudedamagecalculation, - atkBA_jumpifnopursuitswitchdmg, - atkBB_setsunny, - atkBC_maxattackhalvehp, - atkBD_copyfoestats, - atkBE_rapidspinfree, - atkBF_setdefensecurlbit, - atkC0_recoverbasedonsunlight, - atkC1_hiddenpowercalc, - atkC2_selectfirstvalidtarget, - atkC3_trysetfutureattack, - atkC4_trydobeatup, - atkC5_setsemiinvulnerablebit, - atkC6_clearsemiinvulnerablebit, - atkC7_setminimize, - atkC8_sethail, - atkC9_jumpifattackandspecialattackcannotfall, - atkCA_setforcedtarget, - atkCB_setcharge, - atkCC_callterrainattack, - atkCD_cureifburnedparalysedorpoisoned, - atkCE_settorment, - atkCF_jumpifnodamage, - atkD0_settaunt, - atkD1_trysethelpinghand, - atkD2_tryswapitems, - atkD3_trycopyability, - atkD4_trywish, - atkD5_trysetroots, - atkD6_doubledamagedealtifdamaged, - atkD7_setyawn, - atkD8_setdamagetohealthdifference, - atkD9_scaledamagebyhealthratio, - atkDA_tryswapabilities, - atkDB_tryimprision, - atkDC_trysetgrudge, - atkDD_weightdamagecalculation, - atkDE_asistattackselect, - atkDF_trysetmagiccoat, - atkE0_trysetsnatch, - atkE1_trygetintimidatetarget, - atkE2_switchoutabilities, - atkE3_jumpifhasnohp, - atkE4_getsecretpowereffect, - atkE5_pickup, - atkE6_docastformchangeanimation, - atkE7_trycastformdatachange, - atkE8_settypebasedhalvers, - atkE9_setweatherballtype, - atkEA_tryrecycleitem, - atkEB_settypetoterrain, - atkEC_pursuitrelated, - atkED_snatchsetbanks, - atkEE_removelightscreenreflect, - atkEF_handleballthrow, - atkF0_givecaughtmon, - atkF1_trysetcaughtmondexflags, - atkF2_displaydexinfo, - atkF3_trygivecaughtmonnick, - atkF4_subattackerhpbydmg, - atkF5_removeattackerstatus1, - atkF6_finishaction, - atkF7_finishturn, -}; - -struct StatFractions -{ - u8 dividend; - u8 divisor; -}; - -static const struct StatFractions gAccuracyStageRatios[] = -{ - { 33, 100}, // -6 - { 36, 100}, // -5 - { 43, 100}, // -4 - { 50, 100}, // -3 - { 60, 100}, // -2 - { 75, 100}, // -1 - { 1, 1}, // 0 - {133, 100}, // +1 - {166, 100}, // +2 - { 2, 1}, // +3 - {233, 100}, // +4 - {133, 50}, // +5 - { 3, 1}, // +6 -}; - -// The chance is 1/N for each stage. -static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2}; - -static const u32 sStatusFlagsForMoveEffects[] = -{ - 0x00000000, - STATUS_SLEEP, - STATUS_POISON, - STATUS_BURN, - STATUS_FREEZE, - STATUS_PARALYSIS, - STATUS_TOXIC_POISON, - STATUS2_CONFUSION, - STATUS2_FLINCHED, - 0x00000000, - STATUS2_UPROAR, - 0x00000000, - STATUS2_MULTIPLETURNS, - STATUS2_WRAPPED, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - STATUS2_RECHARGE, - 0x00000000, - 0x00000000, - STATUS2_ESCAPE_PREVENTION, - STATUS2_NIGHTMARE, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - STATUS2_LOCK_CONFUSE, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000 -}; - -u8* const gMoveEffectBS_Ptrs[] = -{ - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectPoison, - BattleScript_MoveEffectBurn, - BattleScript_MoveEffectFreeze, - BattleScript_MoveEffectParalysis, - BattleScript_MoveEffectToxic, - BattleScript_MoveEffectConfusion, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectUproar, - BattleScript_MoveEffectPayDay, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectWrap, - BattleScript_MoveEffectRecoil33, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectRecoil33 -}; - -const u8 sUnreferencedBitMask1[] = {0, 1, 3, 7, 0xF, 0x1F, 0x3F}; - -const u8 gLevelUpStatBoxStats[] = -{ - MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK, - MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPEED -}; - -static const u16 sProtectSuccessRates[] = {0xFFFF, 0x7FFF, 0x3FFF, 0x1FFF}; - -#define MIMIC_FORBIDDEN_END 0xFFFE -#define METRONOME_FORBIDDEN_END 0xFFFF -#define ASSIST_FORBIDDEN_END 0xFFFF - -static const u16 sMovesForbiddenToCopy[] = -{ - MOVE_METRONOME, - MOVE_STRUGGLE, - MOVE_SKETCH, - MOVE_MIMIC, - MIMIC_FORBIDDEN_END, - MOVE_COUNTER, - MOVE_MIRROR_COAT, - MOVE_PROTECT, - MOVE_DETECT, - MOVE_ENDURE, - MOVE_DESTINY_BOND, - MOVE_SLEEP_TALK, - MOVE_THIEF, - MOVE_FOLLOW_ME, - MOVE_SNATCH, - MOVE_HELPING_HAND, - MOVE_COVET, - MOVE_TRICK, - MOVE_FOCUS_PUNCH, - METRONOME_FORBIDDEN_END -}; - -static const u8 sFlailHpScaleToPowerTable[] = //reversal+flail HP thresholds to power -{ - 1, 200, - 4, 150, - 9, 100, - 16, 80, - 32, 40, - 48, 20 -}; - -static const u16 sNaturePowerMoves[] = -{ - MOVE_STUN_SPORE, - MOVE_RAZOR_LEAF, - MOVE_EARTHQUAKE, - MOVE_HYDRO_PUMP, - MOVE_SURF, - MOVE_BUBBLE_BEAM, - MOVE_ROCK_SLIDE, - MOVE_SHADOW_BALL, - MOVE_SWIFT, - MOVE_SWIFT -}; - -// weight-based damage table for Low Kick -// format: min. weight (hectograms), base power -static const u16 sWeightToDamageTable[] = -{ - 100, 20, - 250, 40, - 500, 60, - 1000, 80, - 2000, 100, - 0xFFFF, 0xFFFF -}; - -static const u16 sPickupItems[] = -{ - ITEM_SUPER_POTION, 30, - ITEM_FULL_HEAL, 40, - ITEM_ULTRA_BALL, 50, - ITEM_RARE_CANDY, 60, - ITEM_FULL_RESTORE, 70, - ITEM_REVIVE, 80, - ITEM_NUGGET, 90, - ITEM_PROTEIN, 95, - ITEM_PP_UP, 99, - ITEM_KINGS_ROCK, 1 -}; - -static const u8 sTerrainToType[] = -{ - TYPE_GRASS, // tall grass - TYPE_GRASS, // long grass - TYPE_GROUND, // sand - TYPE_WATER, // underwater - TYPE_WATER, // water - TYPE_WATER, // pond water - TYPE_ROCK, // rock - TYPE_ROCK, // cave - TYPE_NORMAL, // building - TYPE_NORMAL, // plain -}; - -static const u8 sBallCatchBonuses[] = -{ - 20, 15, 10, 15 // Ultra, Great, Poke, Safari -}; - -static void atk00_attackcanceler(void) -{ - s32 i; - - if (gBattleOutcome != 0) - { - gCurrentActionFuncId = ACTION_FINISHED; - return; - } - if (gBattleMons[gBankAttacker].hp == 0 && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) - { - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gBattlescriptCurrInstr = BattleScript_MoveEnd; - return; - } - if (AtkCanceller_UnableToUseMove()) - return; - if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBankTarget, 0, 0, 0)) - return; - if (!gBattleMons[gBankAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & 0x800200) - && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) - { - gBattlescriptCurrInstr = BattleScript_NoPPForMove; - gMoveResultFlags |= MOVE_RESULT_MISSED; - return; - } - - gHitMarker &= ~(HITMARKER_x800000); - - if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) - { - i = IsMonDisobedient(); // why use the 'i' variable...? - switch (i) - { - case 0: - break; - case 2: - gHitMarker |= HITMARKER_OBEYS; - return; - default: - gMoveResultFlags |= MOVE_RESULT_MISSED; - return; - } - } - - gHitMarker |= HITMARKER_OBEYS; - - if (gProtectStructs[gBankTarget].bounceMove && gBattleMoves[gCurrentMove].flags & F_AFFECTED_BY_MAGIC_COAT) - { - PressurePPLose(gBankAttacker, gBankTarget, MOVE_MAGIC_COAT); - gProtectStructs[gBankTarget].bounceMove = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; - return; - } - - for (i = 0; i < gBattlersCount; i++) - { - if ((gProtectStructs[gBanksByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & F_AFFECTED_BY_SNATCH) - { - PressurePPLose(gBankAttacker, gBanksByTurnOrder[i], MOVE_SNATCH); - gProtectStructs[gBanksByTurnOrder[i]].stealMove = 0; - gBattleStruct->scriptingActive = gBanksByTurnOrder[i]; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SnatchedMove; - return; - } - } - - if (gSpecialStatuses[gBankTarget].lightningRodRedirected) - { - gSpecialStatuses[gBankTarget].lightningRodRedirected = 0; - gLastUsedAbility = ABILITY_LIGHTNING_ROD; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TookAttack; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else if (TARGET_PROTECT_AFFECTED - && (gCurrentMove != MOVE_CURSE || (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST)) - && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)))) - { - CancelMultiTurnMoves(gBankAttacker); - gMoveResultFlags |= MOVE_RESULT_MISSED; - gLastLandedMoves[gBankTarget] = 0; - gLastHitByType[gBankTarget] = 0; - gBattleCommunication[6] = 1; - gBattlescriptCurrInstr++; - } - else - { - gBattlescriptCurrInstr++; - } -} - -static void JumpIfMoveFailed(u8 adder, u16 move) -{ - const u8 *BS_ptr = gBattlescriptCurrInstr + adder; - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - { - gLastLandedMoves[gBankTarget] = 0; - gLastHitByType[gBankTarget] = 0; - BS_ptr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - TrySetDestinyBondToHappen(); - if (AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBankTarget, 0, 0, move)) - return; - } - gBattlescriptCurrInstr = BS_ptr; -} - -static void atk40_jumpifaffectedbyprotect(void) -{ - if (TARGET_PROTECT_AFFECTED) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(5, 0); - gBattleCommunication[6] = 1; - } - else - { - gBattlescriptCurrInstr += 5; - } -} - -static bool8 JumpIfMoveAffectedByProtect(u16 move) -{ - bool8 affected = FALSE; - if (TARGET_PROTECT_AFFECTED) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(7, move); - gBattleCommunication[6] = 1; - affected = TRUE; - } - return affected; -} - -static bool8 AccuracyCalcHelper(u16 move) -{ - if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker) - { - JumpIfMoveFailed(7, move); - return TRUE; - } - - if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBankTarget] & STATUS3_ON_AIR) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(7, move); - return TRUE; - } - - gHitMarker &= ~HITMARKER_IGNORE_ON_AIR; - - if (!(gHitMarker & HITMARKER_IGNORE_UNDERGROUND) && gStatuses3[gBankTarget] & STATUS3_UNDERGROUND) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(7, move); - return TRUE; - } - - gHitMarker &= ~HITMARKER_IGNORE_UNDERGROUND; - - if (!(gHitMarker & HITMARKER_IGNORE_UNDERWATER) && gStatuses3[gBankTarget] & STATUS3_UNDERWATER) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(7, move); - return TRUE; - } - - gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER; - - if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && gBattleMoves[move].effect == EFFECT_THUNDER) - || (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW)) - { - JumpIfMoveFailed(7, move); - return TRUE; - } - - return FALSE; -} - -static void atk01_accuracycheck(void) -{ - u16 move = T2_READ_16(gBattlescriptCurrInstr + 5); - - if (move == 0xFFFE || move == 0xFFFF) - { - if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && move == 0xFFFF && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker) - gBattlescriptCurrInstr += 7; - else if (gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else if (!JumpIfMoveAffectedByProtect(0)) - gBattlescriptCurrInstr += 7; - } - else - { - u8 type, moveAcc, holdEffect, quality; - s8 buff; - u16 calc; - - if (move == 0) - move = gCurrentMove; - - GET_MOVE_TYPE(move, type); - - if (JumpIfMoveAffectedByProtect(move)) - return; - if (AccuracyCalcHelper(move)) - return; - - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) - { - u8 acc = gBattleMons[gBankAttacker].statStages[STAT_STAGE_ACC]; - buff = acc; - } - else - { - u8 acc = gBattleMons[gBankAttacker].statStages[STAT_STAGE_ACC]; - buff = acc + 6 - gBattleMons[gBankTarget].statStages[STAT_STAGE_EVASION]; - } - - if (buff < 0) - buff = 0; - if (buff > 0xC) - buff = 0xC; - - moveAcc = gBattleMoves[move].accuracy; - // check Thunder on sunny weather - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && gBattleMoves[move].effect == EFFECT_THUNDER) - moveAcc = 50; - - calc = gAccuracyStageRatios[buff].dividend * moveAcc; - calc /= gAccuracyStageRatios[buff].divisor; - - if (gBattleMons[gBankAttacker].ability == ABILITY_COMPOUND_EYES) - calc = (calc * 130) / 100; // 1.3 compound eyes boost - if (WEATHER_HAS_EFFECT && gBattleMons[gBankTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & WEATHER_SANDSTORM_ANY) - calc = (calc * 80) / 100; // 1.2 sand veil loss; - if (gBattleMons[gBankAttacker].ability == ABILITY_HUSTLE && type < 9) - calc = (calc * 80) / 100; // 1.2 hustle loss; - - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - { - holdEffect = gEnigmaBerries[gBankTarget].holdEffect; - quality = gEnigmaBerries[gBankTarget].holdEffectParam; - } - else - { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (holdEffect == HOLD_EFFECT_EVASION_UP) - calc = (calc * (100 - quality)) / 100; - - // final calculation - if ((Random() % 100 + 1) > calc) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && - (gBattleMoves[move].target == 0x8 || gBattleMoves[move].target == 0x20)) - gBattleCommunication[6] = 2; - else - gBattleCommunication[6] = 0; - CheckWonderGuardAndLevitate(); - } - JumpIfMoveFailed(7, move); - } -} - -static void atk02_attackstring(void) -{ - if (gBattleExecBuffer) - return; - if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED))) - { - PrepareStringBattle(4, gBankAttacker); - gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; - } - gBattlescriptCurrInstr++; - gBattleCommunication[MSG_DISPLAY] = 0; -} - -static void atk03_ppreduce(void) -{ - s32 ppToDeduct = 1; - - if (gBattleExecBuffer) - return; - - if (!gSpecialStatuses[gBankAttacker].flag20) - { - switch (gBattleMoves[gCurrentMove].target) - { - case TARGET_FOES_AND_ALLY: - ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBankAttacker, ABILITY_PRESSURE, 0, 0); - break; - case TARGET_BOTH: - case TARGET_OPPONENTS_FIELD: - ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIZE, gBankAttacker, ABILITY_PRESSURE, 0, 0); - break; - default: - if (gBankAttacker != gBankTarget && gBattleMons[gBankTarget].ability == ABILITY_PRESSURE) - ppToDeduct++; - break; - } - } - - if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBankAttacker].pp[gCurrMovePos]) - { - gProtectStructs[gBankAttacker].notFirstStrike = 1; - - if (gBattleMons[gBankAttacker].pp[gCurrMovePos] > ppToDeduct) - gBattleMons[gBankAttacker].pp[gCurrMovePos] -= ppToDeduct; - else - gBattleMons[gBankAttacker].pp[gCurrMovePos] = 0; - - if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED) - && !((gDisableStructs[gBankAttacker].unk18_b) & gBitTable[gCurrMovePos])) - { - gActiveBattler = gBankAttacker; - EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBankAttacker].pp[gCurrMovePos]); - MarkBufferBankForExecution(gBankAttacker); - } - } - - gHitMarker &= ~(HITMARKER_NO_PPDEDUCT); - gBattlescriptCurrInstr++; -} - -static void atk04_critcalc(void) -{ - u8 holdEffect; - u16 item, critChance; - - item = gBattleMons[gBankAttacker].item; - - if (item == ITEM_ENIGMA_BERRY) - holdEffect = gEnigmaBerries[gBankAttacker].holdEffect; - else - holdEffect = ItemId_GetHoldEffect(item); - - gStringBank = gBankAttacker; - - critChance = 2 * ((gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0) - + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL) - + (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK) - + (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK) - + (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL) - + (holdEffect == HOLD_EFFECT_SCOPE_LENS) - + 2 * (holdEffect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBankAttacker].species == SPECIES_CHANSEY) - + 2 * (holdEffect == HOLD_EFFECT_STICK && gBattleMons[gBankAttacker].species == SPECIES_FARFETCHD); - - if (critChance > 4) - critChance = 4; - - if ((gBattleMons[gBankTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBankTarget].ability != ABILITY_SHELL_ARMOR) - && !(gStatuses3[gBankAttacker] & STATUS3_CANT_SCORE_A_CRIT) - && !(gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) - && !(Random() % sCriticalHitChance[critChance])) - gCritMultiplier = 2; - else - gCritMultiplier = 1; - - gBattlescriptCurrInstr++; -} - -static void atk05_damagecalc(void) -{ - u16 side_hword = gSideAffecting[GetBattlerPosition(gBankTarget) & 1]; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, - side_hword, gDynamicBasePower, - gBattleStruct->dynamicMoveType, gBankAttacker, gBankTarget); - gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleStruct->dmgMultiplier; - - if (gStatuses3[gBankAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) - gBattleMoveDamage *= 2; - if (gProtectStructs[gBankAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - - gBattlescriptCurrInstr++; -} - -void AI_CalcDmg(u8 BankAtk, u8 BankDef) -{ - u16 side_hword = gSideAffecting[GetBattlerPosition(BankDef) & 1]; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[BankAtk], &gBattleMons[BankDef], gCurrentMove, - side_hword, gDynamicBasePower, - gBattleStruct->dynamicMoveType, BankAtk, BankDef); - gDynamicBasePower = 0; - gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleStruct->dmgMultiplier; - - if (gStatuses3[BankAtk] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) - gBattleMoveDamage *= 2; - if (gProtectStructs[BankAtk].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; -} - -static void ModulateDmgByType(u8 multiplier) -{ - gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; - if (gBattleMoveDamage == 0 && multiplier != 0) - gBattleMoveDamage = 1; - - switch (multiplier) - { - case 0: //no effect - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - break; - case 5: //not very effecting - if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) - gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - else - gMoveResultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - } - break; - case 20: //super effective - if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) - gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - else - gMoveResultFlags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - break; - } -} - -static void atk06_typecalc(void) -{ - int i = 0; - u8 move_type; - if (gCurrentMove != MOVE_STRUGGLE) - { - if (gBattleStruct->dynamicMoveType) - move_type = gBattleStruct->dynamicMoveType & 0x3F; - else - move_type = gBattleMoves[gCurrentMove].type; - - //check stab - if (gBattleMons[gBankAttacker].type1 == move_type || gBattleMons[gBankAttacker].type2 == move_type) - { - gBattleMoveDamage = gBattleMoveDamage * 15; - gBattleMoveDamage = gBattleMoveDamage / 10; - } - - if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); - gLastLandedMoves[gBankTarget] = 0; - gLastHitByType[gBankTarget] = 0; - gBattleCommunication[6] = move_type; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } - - else if (gTypeEffectiveness[i] == move_type) - { - //check type1 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) - ModulateDmgByType(gTypeEffectiveness[i + 2]); - //check type2 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && - gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2) - ModulateDmgByType(gTypeEffectiveness[i + 2]); - } - i += 3; - } - } - - if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 - && (!(gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) || ((gMoveResultFlags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) - && gBattleMoves[gCurrentMove].power) - { - gLastUsedAbility = ABILITY_WONDER_GUARD; - gMoveResultFlags |= MOVE_RESULT_MISSED; - gLastLandedMoves[gBankTarget] = 0; - gLastHitByType[gBankTarget] = 0; - gBattleCommunication[6] = 3; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) - gProtectStructs[gBankAttacker].notEffective = 1; - } - gBattlescriptCurrInstr++; -} -static void CheckWonderGuardAndLevitate(void) -{ - u8 flags = 0; - int i = 0; - u8 move_type; - - if (gCurrentMove == MOVE_STRUGGLE || !gBattleMoves[gCurrentMove].power) - return; - - if (gBattleStruct->dynamicMoveType) - move_type = gBattleStruct->dynamicMoveType & 0x3F; - else - move_type = gBattleMoves[gCurrentMove].type; - - if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - RecordAbilitySetField6(ABILITY_LEVITATE, move_type); - return; - } - - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } - - if (gTypeEffectiveness[i] == move_type) - { - //check no effect - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 0) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - gProtectStructs[gBankAttacker].notEffective = 1; - } - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && - gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && - gTypeEffectiveness[i + 2] == 0) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - gProtectStructs[gBankAttacker].notEffective = 1; - } - - //check super effective - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 20) - flags |= 1; - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 - && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 - && gTypeEffectiveness[i + 2] == 20) - flags |= 1; - - //check not very effective - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 5) - flags |= 2; - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 - && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 - && gTypeEffectiveness[i + 2] == 5) - flags |= 2; - } - i += 3; - } - - if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2) - { - if (((flags & 2) || !(flags & 1)) && gBattleMoves[gCurrentMove].power) - { - RecordAbilitySetField6(ABILITY_WONDER_GUARD, 3); - } - } -} - -static void ModulateDmgByType2(u8 multiplier, u16 move, u8* flags) //a literal copy of the ModulateDmgbyType1 with different args... -{ - gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; - if (gBattleMoveDamage == 0 && multiplier != 0) - gBattleMoveDamage = 1; - - switch (multiplier) - { - case 0: //no effect - *flags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - break; - case 5: //not very effecting - if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT)) - { - if (*flags & MOVE_RESULT_SUPER_EFFECTIVE) - *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - else - *flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - } - break; - case 20: //super effective - if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT)) - { - if (*flags & MOVE_RESULT_NOT_VERY_EFFECTIVE) - *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - else - *flags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - break; - } -} - -u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) -{ - int i = 0; - u8 flags = 0; - u8 move_type; - - if (move == MOVE_STRUGGLE) - return 0; - - move_type = gBattleMoves[move].type; - - //check stab - if (gBattleMons[bank_atk].type1 == move_type || gBattleMons[bank_atk].type2 == move_type) - { - gBattleMoveDamage = gBattleMoveDamage * 15; - gBattleMoveDamage = gBattleMoveDamage / 10; - } - - if (gBattleMons[bank_def].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - flags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); - } - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[bank_def].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } - - else if (gTypeEffectiveness[i] == move_type) - { - //check type1 - if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type1) - ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); - //check type2 - if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type2 && - gBattleMons[gBankTarget /* what the christ */].type1 != gBattleMons[bank_def].type2) - ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); - } - i += 3; - } - } - - if (gBattleMons[bank_def].ability == ABILITY_WONDER_GUARD && !(flags & MOVE_RESULT_MISSED) && - AttacksThisTurn(bank_atk, move) == 2 && - (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) && - gBattleMoves[move].power) - { - flags |= MOVE_RESULT_MISSED; - } - return flags; -} - -u8 AI_TypeCalc(u16 move, u16 species, u8 ability) -{ - int i = 0; - u8 flags = 0; - u8 type1 = gBaseStats[species].type1, type2 = gBaseStats[species].type2, move_type; - - if (move == MOVE_STRUGGLE) - return 0; - - move_type = gBattleMoves[move].type; - - if (ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - flags = MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE; - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - i += 3; - continue; - } - if (gTypeEffectiveness[i] == move_type) - { - //check type1 - if (gTypeEffectiveness[i + 1] == type1) - ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); - //check type2 - if (gTypeEffectiveness[i + 1] == type2 && gBattleMons[gBankTarget].type1 != type2) //gf you morons, you should check if (type1 != type2)... - ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); - } - i += 3; - } - } - if (ability == ABILITY_WONDER_GUARD - && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) - && gBattleMoves[move].power) - flags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - return flags; -} - -// Multiplies the damage by a random factor between 85% to 100% inclusive -static inline void ApplyRandomDmgMultiplier(void) -{ - u16 rand = Random(); - u16 randPercent = 100 - (rand % 16); - - if (gBattleMoveDamage != 0) - { - gBattleMoveDamage *= randPercent; - gBattleMoveDamage /= 100; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } -} - -void Unused_ApplyRandomDmgMultiplier(void) -{ - ApplyRandomDmgMultiplier(); -} - -static void atk07_adjustnormaldamage(void) -{ - u8 hold_effect, quality; - ApplyRandomDmgMultiplier(); - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - { - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - } - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) - { - RecordItemBattle(gBankTarget, hold_effect); - gSpecialStatuses[gBankTarget].focusBanded = 1; - } - if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE) - goto END; - if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBankTarget].endured - && !gSpecialStatuses[gBankTarget].focusBanded) - goto END; - - if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) - goto END; - - gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1; - - if (gProtectStructs[gBankTarget].endured) - { - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; - goto END; - } - if (gSpecialStatuses[gBankTarget].focusBanded) - { - gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; - gLastUsedItem = gBattleMons[gBankTarget].item; - } - - END: - gBattlescriptCurrInstr++; -} - -static void atk08_adjustnormaldamage2(void) //literally the same as 0x7 except it doesn't check for false swipe move effect... -{ - u8 hold_effect, quality; - ApplyRandomDmgMultiplier(); - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - { - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - } - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) - { - RecordItemBattle(gBankTarget, hold_effect); - gSpecialStatuses[gBankTarget].focusBanded = 1; - } - if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE) - goto END; - if (!gProtectStructs[gBankTarget].endured - && !gSpecialStatuses[gBankTarget].focusBanded) - goto END; - - if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) - goto END; - - gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1; - - if (gProtectStructs[gBankTarget].endured) - { - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; - goto END; - } - if (gSpecialStatuses[gBankTarget].focusBanded) - { - gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; - gLastUsedItem = gBattleMons[gBankTarget].item; - } - - END: - gBattlescriptCurrInstr++; -} - -static void atk09_attackanimation(void) -{ - if (gBattleExecBuffer) - return; - - if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_Pausex20; - gBattleStruct->animTurn += 1; - gBattleStruct->animTargetsHit += 1; - } - else - { - if ((gBattleMoves[gCurrentMove].target & TARGET_BOTH || gBattleMoves[gCurrentMove].target & TARGET_FOES_AND_ALLY || gBattleMoves[gCurrentMove].target & TARGET_DEPENDS) && gBattleStruct->animTargetsHit) - { - gBattlescriptCurrInstr++; - return; - } - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gActiveBattler = gBankAttacker; - - EmitMoveAnimation(0, gCurrentMove, gBattleStruct->animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBankAttacker].friendship, &gDisableStructs[gBankAttacker]); - gBattleStruct->animTurn += 1; - gBattleStruct->animTargetsHit += 1; - MarkBufferBankForExecution(gBankAttacker); - gBattlescriptCurrInstr++; - } - else - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_Pausex20; - } - } -} - -static void atk0A_waitanimation(void) -{ - if (gBattleExecBuffer == 0) - gBattlescriptCurrInstr++; -} - -static void atk0B_healthbarupdate(void) -{ - if (gBattleExecBuffer) - return; - - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - - if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) - { - PrepareStringBattle(0x80, gActiveBattler); - } - else - { - // Emerald - /* - s16 healthValue; - - s32 currDmg = gBattleMoveDamage; - s32 maxPossibleDmgValue = 10000; // not present in R/S, ensures that huge damage values don't change sign - - if (currDmg <= maxPossibleDmgValue) - healthValue = currDmg; - else - healthValue = maxPossibleDmgValue; - - EmitHealthBarUpdate(0, healthValue); - */ - - EmitHealthBarUpdate(0, gBattleMoveDamage); - MarkBufferBankForExecution(gActiveBattler); - - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleMoveDamage > 0) - gBattleResults.unk5_0 = 1; - } - } - - gBattlescriptCurrInstr += 2; -} - -static void atk0C_datahpupdate(void) -{ - u32 moveType; - - if (gBattleExecBuffer) - return; - - if (gBattleStruct->dynamicMoveType == 0) - moveType = gBattleMoves[gCurrentMove].type; - else if (!(gBattleStruct->dynamicMoveType & 0x40)) - moveType = gBattleStruct->dynamicMoveType & 0x3F; - else - moveType = gBattleMoves[gCurrentMove].type; - - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) - { - if (gDisableStructs[gActiveBattler].substituteHP >= gBattleMoveDamage) - { - if (gSpecialStatuses[gActiveBattler].moveturnLostHP == 0) - gSpecialStatuses[gActiveBattler].moveturnLostHP = gBattleMoveDamage; - gDisableStructs[gActiveBattler].substituteHP -= gBattleMoveDamage; - gHpDealt = gBattleMoveDamage; - } - else - { - if (gSpecialStatuses[gActiveBattler].moveturnLostHP == 0) - gSpecialStatuses[gActiveBattler].moveturnLostHP = gDisableStructs[gActiveBattler].substituteHP; - gHpDealt = gDisableStructs[gActiveBattler].substituteHP; - gDisableStructs[gActiveBattler].substituteHP = 0; - } - // check substitute fading - if (gDisableStructs[gActiveBattler].substituteHP == 0) - { - gBattlescriptCurrInstr += 2; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SubstituteFade; - return; - } - } - else - { - gHitMarker &= ~(HITMARKER_IGNORE_SUBSTITUTE); - if (gBattleMoveDamage < 0) // hp goes up - { - gBattleMons[gActiveBattler].hp -= gBattleMoveDamage; - if (gBattleMons[gActiveBattler].hp > gBattleMons[gActiveBattler].maxHP) - gBattleMons[gActiveBattler].hp = gBattleMons[gActiveBattler].maxHP; - - } - else // hp goes down - { - if (gHitMarker & HITMARKER_x20) - { - gHitMarker &= ~(HITMARKER_x20); - } - else - { - gTakenDmg[gActiveBattler] += gBattleMoveDamage; - if (gBattlescriptCurrInstr[1] == BS_GET_TARGET) - gTakenDmgBanks[gActiveBattler] = gBankAttacker; - else - gTakenDmgBanks[gActiveBattler] = gBankTarget; - } - - if (gBattleMons[gActiveBattler].hp > gBattleMoveDamage) - { - gBattleMons[gActiveBattler].hp -= gBattleMoveDamage; - gHpDealt = gBattleMoveDamage; - } - else - { - gHpDealt = gBattleMons[gActiveBattler].hp; - gBattleMons[gActiveBattler].hp = 0; - } - - if (!gSpecialStatuses[gActiveBattler].moveturnLostHP && !(gHitMarker & HITMARKER_x100000)) - gSpecialStatuses[gActiveBattler].moveturnLostHP = gHpDealt; - - if (TYPE_IS_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT) - { - gProtectStructs[gActiveBattler].physicalDmg = gHpDealt; - gSpecialStatuses[gActiveBattler].moveturnLostHP_physical = gHpDealt; - if (gBattlescriptCurrInstr[1] == BS_GET_TARGET) - { - gProtectStructs[gActiveBattler].physicalBank = gBankAttacker; - gSpecialStatuses[gActiveBattler].moveturnPhysicalBank = gBankAttacker; - } - else - { - gProtectStructs[gActiveBattler].physicalBank = gBankTarget; - gSpecialStatuses[gActiveBattler].moveturnPhysicalBank = gBankTarget; - } - } - else if (!TYPE_IS_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000)) - { - gProtectStructs[gActiveBattler].specialDmg = gHpDealt; - gSpecialStatuses[gActiveBattler].moveturnLostHP_special = gHpDealt; - if (gBattlescriptCurrInstr[1] == BS_GET_TARGET) - { - gProtectStructs[gActiveBattler].specialBank = gBankAttacker; - gSpecialStatuses[gActiveBattler].moveturnSpecialBank = gBankAttacker; - } - else - { - gProtectStructs[gActiveBattler].specialBank = gBankTarget; - gSpecialStatuses[gActiveBattler].moveturnSpecialBank = gBankTarget; - } - } - } - gHitMarker &= ~(HITMARKER_x100000); - EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBattler].hp); - MarkBufferBankForExecution(gActiveBattler); - } - } - else - { - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - if (gSpecialStatuses[gActiveBattler].moveturnLostHP == 0) - gSpecialStatuses[gActiveBattler].moveturnLostHP = 0xFFFF; - } - gBattlescriptCurrInstr += 2; -} - -static void atk0D_critmessage(void) -{ - if (gBattleExecBuffer == 0) - { - if (gCritMultiplier == 2 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - PrepareStringBattle(0xD9, gBankAttacker); - gBattleCommunication[MSG_DISPLAY] = 1; - } - gBattlescriptCurrInstr++; - } -} - -static void atk0E_effectivenesssound(void) -{ - if (gBattleExecBuffer) - return; - - gActiveBattler = gBankTarget; - if (!(gMoveResultFlags & MOVE_RESULT_MISSED)) - { - u8 flag = ~MOVE_RESULT_MISSED; - switch (gMoveResultFlags & flag) - { - case MOVE_RESULT_SUPER_EFFECTIVE: - EmitEffectivenessSound(0, 14); - MarkBufferBankForExecution(gActiveBattler); - break; - case MOVE_RESULT_NOT_VERY_EFFECTIVE: - EmitEffectivenessSound(0, 12); - MarkBufferBankForExecution(gActiveBattler); - break; - case MOVE_RESULT_DOESNT_AFFECT_FOE: - case MOVE_RESULT_FAILED: - break; - case MOVE_RESULT_FOE_ENDURED: - case MOVE_RESULT_ONE_HIT_KO: - case MOVE_RESULT_FOE_HUNG_ON: - default: - if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) - { - EmitEffectivenessSound(0, 14); - MarkBufferBankForExecution(gActiveBattler); - } - else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) - { - EmitEffectivenessSound(0, 12); - MarkBufferBankForExecution(gActiveBattler); - } - else if (!(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED))) - { - EmitEffectivenessSound(0, 13); - MarkBufferBankForExecution(gActiveBattler); - } - break; - } - } - gBattlescriptCurrInstr++; -} - -static void atk0F_resultmessage(void) -{ - u32 stringId = 0; - - if (gBattleExecBuffer) - return; - - if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[6] > 2)) - { - stringId = gMissStringIds[gBattleCommunication[6]]; - gBattleCommunication[MSG_DISPLAY] = 1; - } - else - { - gBattleCommunication[MSG_DISPLAY] = 1; - switch (gMoveResultFlags & (u8)(~(MOVE_RESULT_MISSED))) - { - case MOVE_RESULT_SUPER_EFFECTIVE: - stringId = STRINGID_SUPEREFFECTIVE; - break; - case MOVE_RESULT_NOT_VERY_EFFECTIVE: - stringId = STRINGID_NOTVERYEFFECTIVE; - break; - case MOVE_RESULT_ONE_HIT_KO: - stringId = STRINGID_ONEHITKO; - break; - case MOVE_RESULT_FOE_ENDURED: - stringId = STRINGID_PKMNENDUREDHIT; - break; - case MOVE_RESULT_FAILED: - stringId = STRINGID_BUTITFAILED; - break; - case MOVE_RESULT_DOESNT_AFFECT_FOE: - stringId = STRINGID_ITDOESNTAFFECT; - break; - case MOVE_RESULT_FOE_HUNG_ON: - gLastUsedItem = gBattleMons[gBankTarget].item; - gStringBank = gBankTarget; - gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; - return; - default: - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) - { - stringId = STRINGID_ITDOESNTAFFECT; - } - else if (gMoveResultFlags & MOVE_RESULT_ONE_HIT_KO) - { - gMoveResultFlags &= ~(MOVE_RESULT_ONE_HIT_KO); - gMoveResultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE); - gMoveResultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; - return; - } - else if (gMoveResultFlags & MOVE_RESULT_FOE_ENDURED) - { - gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EnduredMsg; - return; - } - else if (gMoveResultFlags & MOVE_RESULT_FOE_HUNG_ON) - { - gLastUsedItem = gBattleMons[gBankTarget].item; - gStringBank = gBankTarget; - gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; - return; - } - else if (gMoveResultFlags & MOVE_RESULT_FAILED) - { - stringId = STRINGID_BUTITFAILED; - } - else - { - gBattleCommunication[MSG_DISPLAY] = 0; - } - } - } - - if (stringId) - PrepareStringBattle(stringId, gBankAttacker); - - gBattlescriptCurrInstr++; -} - -static void atk10_printstring(void) -{ - if (gBattleExecBuffer == 0) - { - u16 var = T2_READ_16(gBattlescriptCurrInstr + 1); - PrepareStringBattle(var, gBankAttacker); - gBattlescriptCurrInstr += 3; - gBattleCommunication[MSG_DISPLAY] = 1; - } -} - -static void atk11_printselectionstring(void) -{ - gActiveBattler = gBankAttacker; - EmitPrintStringPlayerOnly(0, T2_READ_16(gBattlescriptCurrInstr + 1)); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 3; - gBattleCommunication[MSG_DISPLAY] = 1; -} - -static void atk12_waitmessage(void) -{ - if (gBattleExecBuffer == 0) - { - if (!gBattleCommunication[MSG_DISPLAY]) - { - gBattlescriptCurrInstr += 3; - } - else - { - u16 to_wait = T2_READ_16(gBattlescriptCurrInstr + 1); - if (++gPauseCounterBattle >= to_wait) - { - gPauseCounterBattle = 0; - gBattlescriptCurrInstr += 3; - gBattleCommunication[MSG_DISPLAY] = 0; - } - } - } -} - -static void atk13_printfromtable(void) -{ - if (gBattleExecBuffer == 0) - { - u16 *ptr = (u16 *)T1_READ_PTR(gBattlescriptCurrInstr + 1); - ptr += gBattleCommunication[MULTISTRING_CHOOSER]; - PrepareStringBattle(*(u16*)ptr, gBankAttacker); - gBattlescriptCurrInstr += 5; - gBattleCommunication[MSG_DISPLAY] = 1; - } -} - -static void atk14_printselectionstringfromtable(void) -{ - if (gBattleExecBuffer == 0) - { - u16 *ptr = (u16 *)T1_READ_PTR(gBattlescriptCurrInstr + 1); // FIXME - ptr += gBattleCommunication[MULTISTRING_CHOOSER]; - gActiveBattler = gBankAttacker; - EmitPrintStringPlayerOnly(0, *(u16*)ptr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 5; - gBattleCommunication[MSG_DISPLAY] = 1; - } -} - -u8 BankGetTurnOrder(u8 bank) -{ - int i; - for (i = 0; i < gBattlersCount; i++) - { - if (gBanksByTurnOrder[i] == bank) - break; - } - return i; -} - -//Someone please decompile this monstrosity below... -#ifdef NONMATCHING -void SetMoveEffect(bool8 primary, u8 certainArg) -{ - #define EffectAffectsUser 0x40 - register u8 certain asm("r5") = certainArg; - register bool32 StatusChanged asm("r10") = 0; - register int AffectsUser asm("r6") = 0; //0x40 otherwise - bool32 NoSunCanFreeze = 1; - - if (gBattleCommunication[MOVE_EFFECT_BYTE] & EffectAffectsUser) - { - gEffectBank = gBankAttacker; //bank that effects get applied on - gBattleCommunication[MOVE_EFFECT_BYTE] &= ~(EffectAffectsUser); - AffectsUser = EffectAffectsUser; - gBattleStruct->scriptingActive = gBankTarget; //theoretically the attacker - } - else - { - gEffectBank = gBankTarget; - gBattleStruct->scriptingActive = gBankAttacker; - } - - if (gBattleMons[gEffectBank].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && - !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) - {gBattlescriptCurrInstr++; return;} - - if (gSideAffecting[GetBattlerPosition(gEffectBank) & 1] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && - !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7) - {gBattlescriptCurrInstr++; return;} - - //make sure at least ONE HP except payday and thief - if (gBattleMons[gEffectBank].hp == 0 && gBattleCommunication[MOVE_EFFECT_BYTE] != 0xB && gBattleCommunication[MOVE_EFFECT_BYTE] != 0x1F) - {gBattlescriptCurrInstr++; return;} - - if (gBattleMons[gEffectBank].status2 & STATUS2_SUBSTITUTE && AffectsUser != EffectAffectsUser) - {gBattlescriptCurrInstr++; return;} - - if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) //status change - { - switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) - { - case STATUS_SLEEP: - //check active uproar - if (gBattleMons[gEffectBank].ability != ABILITY_SOUNDPROOF) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount && !(gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR); gActiveBattler++) {} - } - else - gActiveBattler = gBattlersCount; - if (gBattleMons[gEffectBank].status1) {break;} - if (gActiveBattler != gBattlersCount) {break;} //nice way of checking uproar... - if (gBattleMons[gEffectBank].ability == ABILITY_VITAL_SPIRIT) {break;} - if (gBattleMons[gEffectBank].ability == ABILITY_INSOMNIA) {break;} - - CancelMultiTurnMoves(gEffectBank); - StatusChanged = 1; - break; - case STATUS_POISON: - if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) - { - gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); - BattleScriptPush(gBattlescriptCurrInstr + 1); - //_0801E664: - gBattlescriptCurrInstr = BattleScript_PSNPrevention; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - return; - } - else - {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} - } - if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) - && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_PSNPrevention; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - return; - } - if (gBattleMons[gEffectBank].type1 == TYPE_POISON) {break;} - if (gBattleMons[gEffectBank].type2 == TYPE_POISON) {break;} - if (gBattleMons[gEffectBank].type1 == TYPE_STEEL) {break;} - if (gBattleMons[gEffectBank].type2 == TYPE_STEEL) {break;} - if (gBattleMons[gEffectBank].status1) {break;} - if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;} - - StatusChanged = 1; - break; - case STATUS_BURN: - if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL && (primary == 1 || certain == 0x80)) - { - gLastUsedAbility = ABILITY_WATER_VEIL; - RecordAbilityBattle(gEffectBank, ABILITY_WATER_VEIL); - BattleScriptPush(gBattlescriptCurrInstr + 1); - //_0801E664: - gBattlescriptCurrInstr = BattleScript_BRNPrevention; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - return; - } - else - {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} - } - if ((gBattleMons[gEffectBank].type1 == TYPE_FIRE || gBattleMons[gEffectBank].type2 == TYPE_FIRE) - && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_BRNPrevention; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - return; - } - if (gBattleMons[gEffectBank].type1 == TYPE_FIRE) {break;} - if (gBattleMons[gEffectBank].type2 == TYPE_FIRE) {break;} - if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL) {break;} - if (gBattleMons[gEffectBank].status1 == 0) {break;} - StatusChanged = 1; - break; - case STATUS_FREEZE: - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) {NoSunCanFreeze = 0;} - if (gBattleMons[gEffectBank].type1 == TYPE_ICE) {break;} - if (gBattleMons[gEffectBank].type2 == TYPE_ICE) {break;} - if (gBattleMons[gEffectBank].status1) {break;} - if (NoSunCanFreeze == 0) {break;} - if (gBattleMons[gEffectBank].ability == ABILITY_MAGMA_ARMOR) {break;} - - CancelMultiTurnMoves(gEffectBank); - StatusChanged = 1; - break; - case STATUS_PARALYSIS: - if (gBattleMons[gEffectBank].ability == ABILITY_LIMBER) - { - if ((primary == 1 || certain == 0x80)) - { - gLastUsedAbility = ABILITY_LIMBER; - RecordAbilityBattle(gEffectBank, ABILITY_LIMBER); - BattleScriptPush(gBattlescriptCurrInstr + 1); - //_0801E664: - gBattlescriptCurrInstr = BattleScript_PRLZPrevention; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - return; - } - else - {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} - } - else {break;} - } - if (gBattleMons[gEffectBank].status1) {break;} - StatusChanged = 1; - break; - case STATUS_TOXIC_POISON: - if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) - { - gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); - BattleScriptPush(gBattlescriptCurrInstr + 1); - //_0801E664: - gBattlescriptCurrInstr = BattleScript_PSNPrevention; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - return; - } - else - {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} - } - if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) - && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_PSNPrevention; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - return; - } - if (gBattleMons[gEffectBank].status1) {break;} - if (gBattleMons[gEffectBank].type1 != TYPE_POISON && - gBattleMons[gEffectBank].type2 != TYPE_POISON && - gBattleMons[gEffectBank].type1 != TYPE_STEEL && - gBattleMons[gEffectBank].type2 != TYPE_STEEL) - { - if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;} - gBattleMons[gEffectBank].status1 &= ~(0x9); //This gets (correctly) optimized out... - StatusChanged = 1; - break; - } - else - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - break; - } - if (StatusChanged == 1) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - if (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS_SLEEP) - gBattleMons[gEffectBank].status1 |= ((Random() & 3) + 2); - else - gBattleMons[gEffectBank].status1 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gActiveBattler = gEffectBank; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status1); - MarkBufferBankForExecution(gActiveBattler); - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - } - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (gBattleCommunication[MOVE_EFFECT_BYTE] == 2 || gBattleCommunication[MOVE_EFFECT_BYTE] == 6 || gBattleCommunication[MOVE_EFFECT_BYTE] == 5 || gBattleCommunication[MOVE_EFFECT_BYTE] == 3) - { - gBattleStruct->synchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; - gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; - } - return; - } - else if (StatusChanged == 0) - {gBattlescriptCurrInstr++; return;} - } - else - { - if (gBattleMons[gEffectBank].status2 & sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) - { - gBattlescriptCurrInstr++; - return; - } - switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) - { - case 7: //confusion - if (gBattleMons[gEffectBank].ability == ABILITY_OWN_TEMPO) - {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gEffectBank].status2 & STATUS2_CONFUSION) - {gBattlescriptCurrInstr++; return;} - gBattleMons[gEffectBank].status2 |= (((Random()) % 0x4)) + 2; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 8: //flinch - if (gBattleMons[gEffectBank].ability == ABILITY_INNER_FOCUS) - { - if (primary == 1 || certain == 0x80) - { - gLastUsedAbility = ABILITY_INNER_FOCUS; - RecordAbilityBattle(gEffectBank, ABILITY_INNER_FOCUS); - gBattlescriptCurrInstr = BattleScript_FlinchPrevention; - return; - } - else - {gBattlescriptCurrInstr++; return;} - } - else - { - if (BankGetTurnOrder(gEffectBank) > gCurrentTurnActionNumber) - gBattleMons[gEffectBank].status2 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattlescriptCurrInstr++; return; - } - break; - case 10: //uproar - if (gBattleMons[gEffectBank].status2 & STATUS2_UPROAR) - {gBattlescriptCurrInstr++; return;} - gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBank] = gCurrentMove; - gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 11: //pay day - if (!(GetBattlerPosition(gBankAttacker) & 1)) - { - u16 PayDay = gPaydayMoney; - gPaydayMoney += (gBattleMons[gBankAttacker].level * 5); - if (PayDay > gPaydayMoney) - gPaydayMoney = 0xFFFF; - } - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 9: //tri attack - if (gBattleMons[gEffectBank].status1) - {gBattlescriptCurrInstr++; return;} - gBattleCommunication[MOVE_EFFECT_BYTE] = Random() % 3 + 3; - SetMoveEffect(0, 0); - break; - case 12: //charging move - gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBank] = gCurrentMove; - gProtectStructs[gEffectBank].chargingTurn = 1; - gBattlescriptCurrInstr++; - break; - case 13: //wrap - if (gBattleMons[gEffectBank].status2 & STATUS2_WRAPPED) - {gBattlescriptCurrInstr++; return;} - gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 0xD; - gBattleStruct->wrappedMove[gEffectBank*2] = (u8)gCurrentMove; - (1 + gBattleStruct->wrappedMove)[gEffectBank*2] = gCurrentMove >> 8; //don't ask. - gBattleStruct->wrappedBy[gEffectBank] = gBankAttacker; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - while (gBattleCommunication[MULTISTRING_CHOOSER] <= 4 - && gCurrentMove != gTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]]) - gBattleCommunication[MULTISTRING_CHOOSER]++; - break; - case 14: //25% recoil - gBattleMoveDamage = (gHpDealt) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 15 ... 21: //stat + 1 - if (ChangeStatBuffs(0x10, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xF2, certain, 0)) {gBattlescriptCurrInstr++;} - else - { - gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; //TODO: the arg ptr is wrong by one - gBattleStruct->animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatUp; - } - break; - case 22 ... 28: //stat - 1 - if (ChangeStatBuffs(~(0x6f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xEB, certain, 0)) {gBattlescriptCurrInstr++;} //TODO: negation doesnt work correctly - else - { - gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; - gBattleStruct->animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatDown; - } - break; - case 39 ... 45: //stat + 2 - if (ChangeStatBuffs(0x20, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xDA, certain, 0)) {gBattlescriptCurrInstr++;} - else - { - gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; - gBattleStruct->animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatUp; - } - break; - case 46 ... 52: //stat - 2 - if (ChangeStatBuffs(~(0x5f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xD3, certain, 0)) {gBattlescriptCurrInstr++;} - else - { - gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; - gBattleStruct->animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatDown; - } - break; - case 29: //recharge - gBattleMons[gEffectBank].status2 |= STATUS2_RECHARGE; - gDisableStructs[gEffectBank].rechargeCounter = 2; - gLockedMoves[gEffectBank] = gCurrentMove; - gBattlescriptCurrInstr++; - break; - case 30: //rage - gBattleMons[gBankAttacker].status2 |= STATUS2_RAGE; - gBattlescriptCurrInstr++; - break; - case 31: //item steal - { - u8 side = GetBattlerSide(gBankAttacker); - if (GetBattlerSide(gBankAttacker) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400) - {gBattlescriptCurrInstr++; return;} - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400 && (gWishFutureKnock.knockedOffPokes[side] & gBitTable[gBattlerPartyIndexes[gBankAttacker]])) - {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].item && gBattleMons[gBankTarget].ability == ABILITY_STICKY_HOLD) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_NoItemSteal; - gLastUsedAbility = gBattleMons[gBankTarget].ability; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - return; - } - if (gBattleMons[gBankAttacker].item) - {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].item == 0) - {gBattlescriptCurrInstr++; return;} - - gLastUsedItem = gBattleMons[gBankTarget].item; - USED_HELD_ITEM(bank) = gLastUsedItem; - gBattleMons[gBankTarget].item = 0; - - gActiveBattler = gBankAttacker; - EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); - MarkBufferBankForExecution(gBankAttacker); - - gActiveBattler = gBankTarget; - EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item); - MarkBufferBankForExecution(gBankTarget); - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_ItemSteal; - - CHOICED_MOVE(gBankTarget) = 0; - } - break; - case 32: //escape prevention - gBattleMons[gBankTarget].status2 |= STATUS2_RECHARGE; - gDisableStructs[gBankTarget].bankPreventingEscape = gBankAttacker; - gBattlescriptCurrInstr++; - break; - case 33: //nightmare - gBattleMons[gBankTarget].status2 |= STATUS2_NIGHTMARE; - gBattlescriptCurrInstr++; - break; - case 34: //ancientpower - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_AllStatsUp; - return; - case 35: //break free rapidspin - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_RapidSpinAway; - return; - case 36: //paralysis removal - if (gBattleMons[gBankTarget].status1 & STATUS_PARALYSIS) - { - gBattleMons[gBankTarget].status1 &= ~(STATUS_PARALYSIS); - gActiveBattler = gBankTarget; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); - MarkBufferBankForExecution(gActiveBattler); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; - } - else - {gBattlescriptCurrInstr++; return;} - break; - case 37: //superpower - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_AtkDefDown; - return; - case 38: //33% recoil - gBattleMoveDamage = gHpDealt / 3; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 53: //thrash - if (!(gBattleMons[gEffectBank].status2 & STATUS2_LOCK_CONFUSE)) - { - gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBank] = gCurrentMove; - gBattleMons[gEffectBank].status2 |= (((Random() & 1) + 2) << 0xA); - } - else - {gBattlescriptCurrInstr++; return;} - break; - case 54: //knock off - if (gBattleMons[gEffectBank].ability == ABILITY_STICKY_HOLD) - { - if (gBattleMons[gEffectBank].item == 0) - {gBattlescriptCurrInstr++; return;} - gLastUsedAbility = ABILITY_STICKY_HOLD; - gBattlescriptCurrInstr = BattleScript_NoItemSteal; - RecordAbilityBattle(gEffectBank, ABILITY_STICKY_HOLD); - return; - } - if (gBattleMons[gEffectBank].item == 0) - {gBattlescriptCurrInstr++; return;} - else - { - u8 side = GetBattlerSide(gEffectBank); - gLastUsedItem = gBattleMons[gEffectBank].item; - gBattleMons[gEffectBank].item = 0; - gWishFutureKnock.knockedOffPokes[side] |= gBitTable[gBattlerPartyIndexes[gEffectBank]]; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_KnockedOff; - - CHOICED_MOVE(gEffectBank) = 0; - } - break; - case 59: //overheat - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_SAtkDown2; - return; - } - } -} -#else -NAKED -void SetMoveEffect(bool8 primary, u8 certainArg) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - lsls r1, 24\n\ - lsrs r5, r1, 24\n\ - movs r0, 0\n\ - mov r10, r0\n\ - movs r6, 0\n\ - movs r1, 0x1\n\ - str r1, [sp, 0x4]\n\ - ldr r1, _0801E430 @ =gBattleCommunication\n\ - ldrb r3, [r1, 0x3]\n\ - movs r0, 0x40\n\ - ands r0, r3\n\ - adds r7, r1, 0\n\ - cmp r0, 0\n\ - beq _0801E444\n\ - ldr r2, _0801E434 @ =gEffectBank\n\ - ldr r0, _0801E438 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - strb r0, [r2]\n\ - movs r0, 0xBF\n\ - ands r0, r3\n\ - strb r0, [r7, 0x3]\n\ - movs r6, 0x40\n\ - ldr r0, _0801E43C @ =gSharedMem\n\ - ldr r1, _0801E440 @ =gBankTarget\n\ - b _0801E450\n\ - .align 2, 0\n\ -_0801E430: .4byte gBattleCommunication\n\ -_0801E434: .4byte gEffectBank\n\ -_0801E438: .4byte gBankAttacker\n\ -_0801E43C: .4byte gSharedMem\n\ -_0801E440: .4byte gBankTarget\n\ -_0801E444:\n\ - ldr r2, _0801E538 @ =gEffectBank\n\ - ldr r0, _0801E53C @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - strb r0, [r2]\n\ - ldr r0, _0801E540 @ =gSharedMem\n\ - ldr r1, _0801E544 @ =gBankAttacker\n\ -_0801E450:\n\ - ldrb r1, [r1]\n\ - ldr r3, _0801E548 @ =0x00016003\n\ - adds r0, r3\n\ - strb r1, [r0]\n\ - mov r8, r2\n\ - ldr r2, _0801E54C @ =gBattleMons\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r2\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x13\n\ - bne _0801E48A\n\ - ldr r0, _0801E550 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801E48A\n\ - cmp r4, 0\n\ - bne _0801E48A\n\ - ldrb r0, [r7, 0x3]\n\ - cmp r0, 0x9\n\ - bhi _0801E48A\n\ - bl _0801F5DC\n\ -_0801E48A:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - bl GetBattlerPosition\n\ - ldr r2, _0801E554 @ =gSideAffecting\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - lsls r1, 1\n\ - adds r1, r2\n\ - ldrh r1, [r1]\n\ - movs r0, 0x20\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E4C4\n\ - ldr r0, _0801E550 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801E4C4\n\ - cmp r4, 0\n\ - bne _0801E4C4\n\ - ldr r0, _0801E558 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - cmp r0, 0x7\n\ - bhi _0801E4C4\n\ - bl _0801F5DC\n\ -_0801E4C4:\n\ - ldr r3, _0801E54C @ =gBattleMons\n\ - ldr r2, _0801E538 @ =gEffectBank\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r3\n\ - ldrh r0, [r0, 0x28]\n\ - mov r8, r2\n\ - mov r9, r3\n\ - cmp r0, 0\n\ - bne _0801E4EA\n\ - ldr r0, _0801E558 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - cmp r0, 0xB\n\ - beq _0801E4EA\n\ - cmp r0, 0x1F\n\ - beq _0801E4EA\n\ - bl _0801F5DC\n\ -_0801E4EA:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - mov r1, r9\n\ - adds r1, 0x50\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 17\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E50C\n\ - cmp r6, 0x40\n\ - beq _0801E50C\n\ - bl _0801F5DC\n\ -_0801E50C:\n\ - ldr r0, _0801E558 @ =gBattleCommunication\n\ - ldrb r1, [r0, 0x3]\n\ - adds r7, r0, 0\n\ - cmp r1, 0x6\n\ - bls _0801E518\n\ - b _0801EB4A\n\ -_0801E518:\n\ - ldr r1, _0801E55C @ =sStatusFlagsForMoveEffects\n\ - ldrb r0, [r7, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - cmp r0, 0x10\n\ - bne _0801E528\n\ - b _0801E714\n\ -_0801E528:\n\ - cmp r0, 0x10\n\ - bhi _0801E560\n\ - cmp r0, 0x7\n\ - beq _0801E57A\n\ - cmp r0, 0x8\n\ - bne _0801E536\n\ - b _0801E630\n\ -_0801E536:\n\ - b _0801EA14\n\ - .align 2, 0\n\ -_0801E538: .4byte gEffectBank\n\ -_0801E53C: .4byte gBankTarget\n\ -_0801E540: .4byte gSharedMem\n\ -_0801E544: .4byte gBankAttacker\n\ -_0801E548: .4byte 0x00016003\n\ -_0801E54C: .4byte gBattleMons\n\ -_0801E550: .4byte gHitMarker\n\ -_0801E554: .4byte gSideAffecting\n\ -_0801E558: .4byte gBattleCommunication\n\ -_0801E55C: .4byte sStatusFlagsForMoveEffects\n\ -_0801E560:\n\ - cmp r0, 0x40\n\ - bne _0801E566\n\ - b _0801E888\n\ -_0801E566:\n\ - cmp r0, 0x40\n\ - bhi _0801E572\n\ - cmp r0, 0x20\n\ - bne _0801E570\n\ - b _0801E7EA\n\ -_0801E570:\n\ - b _0801EA14\n\ -_0801E572:\n\ - cmp r0, 0x80\n\ - bne _0801E578\n\ - b _0801E8E4\n\ -_0801E578:\n\ - b _0801EA14\n\ -_0801E57A:\n\ - mov r3, r8\n\ - ldrb r1, [r3]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x2B\n\ - beq _0801E5DC\n\ - ldr r0, _0801E5D4 @ =gActiveBattler\n\ - movs r1, 0\n\ - strb r1, [r0]\n\ - ldr r1, _0801E5D8 @ =gBattlersCount\n\ - ldrb r3, [r1]\n\ - adds r7, r0, 0\n\ - mov r12, r1\n\ - cmp r3, 0\n\ - beq _0801E5E8\n\ - mov r4, r9\n\ - ldr r0, [r4, 0x50]\n\ - movs r1, 0x70\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801E5E8\n\ - adds r1, r7, 0\n\ - mov r6, r9\n\ - adds r6, 0x50\n\ - movs r5, 0x58\n\ - movs r4, 0x70\n\ -_0801E5B4:\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, r3\n\ - bcs _0801E5E8\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - beq _0801E5B4\n\ - b _0801E5E8\n\ - .align 2, 0\n\ -_0801E5D4: .4byte gActiveBattler\n\ -_0801E5D8: .4byte gBattlersCount\n\ -_0801E5DC:\n\ - ldr r0, _0801E628 @ =gActiveBattler\n\ - ldr r2, _0801E62C @ =gBattlersCount\n\ - ldrb r1, [r2]\n\ - strb r1, [r0]\n\ - adds r7, r0, 0\n\ - mov r12, r2\n\ -_0801E5E8:\n\ - mov r0, r8\n\ - ldrb r2, [r0]\n\ - movs r0, 0x58\n\ - adds r1, r2, 0\n\ - muls r1, r0\n\ - mov r0, r9\n\ - adds r0, 0x4C\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E600\n\ - b _0801EA14\n\ -_0801E600:\n\ - ldrb r0, [r7]\n\ - mov r3, r12\n\ - ldrb r3, [r3]\n\ - cmp r0, r3\n\ - beq _0801E60C\n\ - b _0801EA14\n\ -_0801E60C:\n\ - mov r4, r9\n\ - adds r0, r1, r4\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x48\n\ - bne _0801E61A\n\ - b _0801EA14\n\ -_0801E61A:\n\ - cmp r0, 0xF\n\ - bne _0801E620\n\ - b _0801EA14\n\ -_0801E620:\n\ - adds r0, r2, 0\n\ - bl CancelMultiTurnMoves\n\ - b _0801EA04\n\ - .align 2, 0\n\ -_0801E628: .4byte gActiveBattler\n\ -_0801E62C: .4byte gBattlersCount\n\ -_0801E630:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - cmp r1, 0x11\n\ - bne _0801E688\n\ - cmp r4, 0x1\n\ - beq _0801E64A\n\ - cmp r5, 0x80\n\ - bne _0801E688\n\ -_0801E64A:\n\ - ldr r0, _0801E678 @ =gLastUsedAbility\n\ - strb r1, [r0]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r1, 0x11\n\ - bl RecordAbilityBattle\n\ - ldr r4, _0801E67C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801E680 @ =BattleScript_PSNPrevention\n\ -_0801E664:\n\ - str r0, [r4]\n\ - ldr r2, _0801E684 @ =gHitMarker\n\ - ldr r1, [r2]\n\ - movs r0, 0x80\n\ - lsls r0, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E676\n\ - b _0801E928\n\ -_0801E676:\n\ - b _0801E94C\n\ - .align 2, 0\n\ -_0801E678: .4byte gLastUsedAbility\n\ -_0801E67C: .4byte gBattlescriptCurrInstr\n\ -_0801E680: .4byte BattleScript_PSNPrevention\n\ -_0801E684: .4byte gHitMarker\n\ -_0801E688:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - movs r1, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r1, r0, 0\n\ - adds r1, 0x21\n\ - ldrb r1, [r1]\n\ - cmp r1, 0x3\n\ - beq _0801E6AC\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3\n\ - beq _0801E6AC\n\ - cmp r1, 0x8\n\ - beq _0801E6AC\n\ - cmp r0, 0x8\n\ - bne _0801E6C6\n\ -_0801E6AC:\n\ - ldr r0, _0801E710 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E6C6\n\ - cmp r4, 0x1\n\ - bne _0801E6C0\n\ - b _0801E98C\n\ -_0801E6C0:\n\ - cmp r5, 0x80\n\ - bne _0801E6C6\n\ - b _0801E98C\n\ -_0801E6C6:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - mov r4, r9\n\ - adds r3, r1, r4\n\ - adds r0, r3, 0\n\ - adds r0, 0x21\n\ - ldrb r4, [r0]\n\ - cmp r4, 0x3\n\ - bne _0801E6DE\n\ - b _0801EA14\n\ -_0801E6DE:\n\ - adds r0, 0x1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3\n\ - bne _0801E6E8\n\ - b _0801EA14\n\ -_0801E6E8:\n\ - cmp r4, 0x8\n\ - bne _0801E6EE\n\ - b _0801EA14\n\ -_0801E6EE:\n\ - cmp r0, 0x8\n\ - bne _0801E6F4\n\ - b _0801EA14\n\ -_0801E6F4:\n\ - mov r0, r9\n\ - adds r0, 0x4C\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E702\n\ - b _0801EA14\n\ -_0801E702:\n\ - adds r0, r3, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x11\n\ - bne _0801E70E\n\ - b _0801EA14\n\ -_0801E70E:\n\ - b _0801EA04\n\ - .align 2, 0\n\ -_0801E710: .4byte gHitMarker\n\ -_0801E714:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - cmp r1, 0x29\n\ - bne _0801E758\n\ - cmp r4, 0x1\n\ - beq _0801E72E\n\ - cmp r5, 0x80\n\ - bne _0801E758\n\ -_0801E72E:\n\ - ldr r0, _0801E74C @ =gLastUsedAbility\n\ - strb r1, [r0]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r1, 0x29\n\ - bl RecordAbilityBattle\n\ - ldr r4, _0801E750 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801E754 @ =BattleScript_BRNPrevention\n\ - b _0801E664\n\ - .align 2, 0\n\ -_0801E74C: .4byte gLastUsedAbility\n\ -_0801E750: .4byte gBattlescriptCurrInstr\n\ -_0801E754: .4byte BattleScript_BRNPrevention\n\ -_0801E758:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - mov r2, r9\n\ - adds r1, r0, r2\n\ - adds r0, r1, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xA\n\ - beq _0801E778\n\ - adds r0, r1, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xA\n\ - bne _0801E7A8\n\ -_0801E778:\n\ - ldr r0, _0801E79C @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E7A8\n\ - cmp r4, 0x1\n\ - beq _0801E78E\n\ - cmp r5, 0x80\n\ - bne _0801E7A8\n\ -_0801E78E:\n\ - ldr r4, _0801E7A0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801E7A4 @ =BattleScript_BRNPrevention\n\ - b _0801E998\n\ - .align 2, 0\n\ -_0801E79C: .4byte gHitMarker\n\ -_0801E7A0: .4byte gBattlescriptCurrInstr\n\ -_0801E7A4: .4byte BattleScript_BRNPrevention\n\ -_0801E7A8:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r1, 0x58\n\ - adds r2, r0, 0\n\ - muls r2, r1\n\ - mov r4, r9\n\ - adds r1, r2, r4\n\ - adds r0, r1, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xA\n\ - bne _0801E7C2\n\ - b _0801EA14\n\ -_0801E7C2:\n\ - adds r0, r1, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xA\n\ - bne _0801E7CE\n\ - b _0801EA14\n\ -_0801E7CE:\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x29\n\ - bne _0801E7DA\n\ - b _0801EA14\n\ -_0801E7DA:\n\ - mov r0, r9\n\ - adds r0, 0x4C\n\ - adds r0, r2, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E7E8\n\ - b _0801EA14\n\ -_0801E7E8:\n\ - b _0801EA04\n\ -_0801E7EA:\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0x13\n\ - movs r1, 0\n\ - movs r2, 0xD\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - bne _0801E826\n\ - str r0, [sp]\n\ - movs r0, 0x13\n\ - movs r1, 0\n\ - movs r2, 0x4D\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0801E826\n\ - ldr r0, _0801E87C @ =gBattleWeather\n\ - ldrh r1, [r0]\n\ - movs r0, 0x60\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E826\n\ - movs r1, 0\n\ - str r1, [sp, 0x4]\n\ -_0801E826:\n\ - ldr r4, _0801E880 @ =gBattleMons\n\ - ldr r0, _0801E884 @ =gEffectBank\n\ - ldrb r3, [r0]\n\ - movs r0, 0x58\n\ - adds r2, r3, 0\n\ - muls r2, r0\n\ - adds r1, r2, r4\n\ - adds r0, r1, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xF\n\ - bne _0801E840\n\ - b _0801EA14\n\ -_0801E840:\n\ - adds r0, r1, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xF\n\ - bne _0801E84C\n\ - b _0801EA14\n\ -_0801E84C:\n\ - adds r0, r4, 0\n\ - adds r0, 0x4C\n\ - adds r0, r2, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E85A\n\ - b _0801EA14\n\ -_0801E85A:\n\ - ldr r2, [sp, 0x4]\n\ - cmp r2, 0\n\ - bne _0801E862\n\ - b _0801EA14\n\ -_0801E862:\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x28\n\ - bne _0801E86E\n\ - b _0801EA14\n\ -_0801E86E:\n\ - adds r0, r3, 0\n\ - bl CancelMultiTurnMoves\n\ - movs r3, 0x1\n\ - mov r10, r3\n\ - b _0801EA14\n\ - .align 2, 0\n\ -_0801E87C: .4byte gBattleWeather\n\ -_0801E880: .4byte gBattleMons\n\ -_0801E884: .4byte gEffectBank\n\ -_0801E888:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - mov r2, r9\n\ - adds r0, r1, r2\n\ - adds r0, 0x20\n\ - ldrb r2, [r0]\n\ - cmp r2, 0x7\n\ - bne _0801E8D0\n\ - cmp r4, 0x1\n\ - beq _0801E8A6\n\ - cmp r5, 0x80\n\ - beq _0801E8A6\n\ - b _0801EA14\n\ -_0801E8A6:\n\ - ldr r0, _0801E8C4 @ =gLastUsedAbility\n\ - strb r2, [r0]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r1, 0x7\n\ - bl RecordAbilityBattle\n\ - ldr r4, _0801E8C8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801E8CC @ =BattleScript_PRLZPrevention\n\ - b _0801E664\n\ - .align 2, 0\n\ -_0801E8C4: .4byte gLastUsedAbility\n\ -_0801E8C8: .4byte gBattlescriptCurrInstr\n\ -_0801E8CC: .4byte BattleScript_PRLZPrevention\n\ -_0801E8D0:\n\ - mov r0, r9\n\ - adds r0, 0x4C\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E8DE\n\ - b _0801EA14\n\ -_0801E8DE:\n\ - movs r4, 0x1\n\ - mov r10, r4\n\ - b _0801EA14\n\ -_0801E8E4:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - cmp r1, 0x11\n\ - bne _0801E952\n\ - cmp r4, 0x1\n\ - beq _0801E8FE\n\ - cmp r5, 0x80\n\ - bne _0801E952\n\ -_0801E8FE:\n\ - ldr r0, _0801E938 @ =gLastUsedAbility\n\ - strb r1, [r0]\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - movs r1, 0x11\n\ - bl RecordAbilityBattle\n\ - ldr r4, _0801E93C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801E940 @ =BattleScript_PSNPrevention\n\ - str r0, [r4]\n\ - ldr r2, _0801E944 @ =gHitMarker\n\ - ldr r1, [r2]\n\ - movs r0, 0x80\n\ - lsls r0, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E94C\n\ -_0801E928:\n\ - movs r0, 0x1\n\ - strb r0, [r7, 0x5]\n\ - ldr r0, _0801E948 @ =0xffffdfff\n\ - ands r1, r0\n\ - str r1, [r2]\n\ - bl _0801F5FA\n\ - .align 2, 0\n\ -_0801E938: .4byte gLastUsedAbility\n\ -_0801E93C: .4byte gBattlescriptCurrInstr\n\ -_0801E940: .4byte BattleScript_PSNPrevention\n\ -_0801E944: .4byte gHitMarker\n\ -_0801E948: .4byte 0xffffdfff\n\ -_0801E94C:\n\ - strb r0, [r7, 0x5]\n\ - bl _0801F5FA\n\ -_0801E952:\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - movs r1, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r1, r0, 0\n\ - adds r1, 0x21\n\ - ldrb r1, [r1]\n\ - cmp r1, 0x3\n\ - beq _0801E976\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3\n\ - beq _0801E976\n\ - cmp r1, 0x8\n\ - beq _0801E976\n\ - cmp r0, 0x8\n\ - bne _0801E9B4\n\ -_0801E976:\n\ - ldr r0, _0801E9A4 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E9B4\n\ - cmp r4, 0x1\n\ - beq _0801E98C\n\ - cmp r5, 0x80\n\ - bne _0801E9B4\n\ -_0801E98C:\n\ - ldr r4, _0801E9A8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801E9AC @ =BattleScript_PSNPrevention\n\ -_0801E998:\n\ - str r0, [r4]\n\ - ldr r1, _0801E9B0 @ =gBattleCommunication\n\ - movs r0, 0x2\n\ - strb r0, [r1, 0x5]\n\ - bl _0801F5FA\n\ - .align 2, 0\n\ -_0801E9A4: .4byte gHitMarker\n\ -_0801E9A8: .4byte gBattlescriptCurrInstr\n\ -_0801E9AC: .4byte BattleScript_PSNPrevention\n\ -_0801E9B0: .4byte gBattleCommunication\n\ -_0801E9B4:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r6, 0x58\n\ - muls r0, r6\n\ - mov r2, r9\n\ - adds r2, 0x4C\n\ - adds r5, r0, r2\n\ - ldr r4, [r5]\n\ - cmp r4, 0\n\ - bne _0801EA14\n\ - mov r3, r9\n\ - adds r1, r0, r3\n\ - adds r0, r1, 0\n\ - adds r0, 0x21\n\ - ldrb r3, [r0]\n\ - cmp r3, 0x3\n\ - beq _0801EA0A\n\ - adds r0, 0x1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3\n\ - beq _0801EA0A\n\ - cmp r3, 0x8\n\ - beq _0801EA0A\n\ - cmp r0, 0x8\n\ - beq _0801EA0A\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x11\n\ - beq _0801EA14\n\ - mov r4, r8\n\ - ldrb r0, [r4]\n\ - adds r1, r0, 0\n\ - muls r1, r6\n\ - adds r1, r2\n\ - ldr r0, [r1]\n\ - movs r2, 0x9\n\ - negs r2, r2\n\ - ands r0, r2\n\ - str r0, [r1]\n\ -_0801EA04:\n\ - movs r0, 0x1\n\ - mov r10, r0\n\ - b _0801EA14\n\ -_0801EA0A:\n\ - ldr r0, _0801EA58 @ =gMoveResultFlags\n\ - ldrb r1, [r0]\n\ - movs r2, 0x8\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_0801EA14:\n\ - mov r1, r10\n\ - cmp r1, 0x1\n\ - beq _0801EA1C\n\ - b _0801EB3C\n\ -_0801EA1C:\n\ - ldr r0, _0801EA5C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801EA60 @ =sStatusFlagsForMoveEffects\n\ - ldr r0, _0801EA64 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r3, [r0]\n\ - cmp r3, 0x7\n\ - bne _0801EA70\n\ - bl Random\n\ - ldr r2, _0801EA68 @ =gBattleMons\n\ - ldr r1, _0801EA6C @ =gEffectBank\n\ - ldrb r3, [r1]\n\ - movs r1, 0x58\n\ - muls r3, r1\n\ - adds r2, 0x4C\n\ - adds r3, r2\n\ - movs r1, 0x3\n\ - ands r1, r0\n\ - adds r1, 0x2\n\ - ldr r0, [r3]\n\ - orrs r0, r1\n\ - str r0, [r3]\n\ - b _0801EA84\n\ - .align 2, 0\n\ -_0801EA58: .4byte gMoveResultFlags\n\ -_0801EA5C: .4byte gBattlescriptCurrInstr\n\ -_0801EA60: .4byte sStatusFlagsForMoveEffects\n\ -_0801EA64: .4byte gBattleCommunication\n\ -_0801EA68: .4byte gBattleMons\n\ -_0801EA6C: .4byte gEffectBank\n\ -_0801EA70:\n\ - ldr r2, _0801EAD4 @ =gBattleMons\n\ - ldr r0, _0801EAD8 @ =gEffectBank\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - adds r2, 0x4C\n\ - adds r1, r2\n\ - ldr r0, [r1]\n\ - orrs r0, r3\n\ - str r0, [r1]\n\ -_0801EA84:\n\ - ldr r2, _0801EADC @ =gBattlescriptCurrInstr\n\ - ldr r1, _0801EAE0 @ =gMoveEffectBS_Ptrs\n\ - ldr r5, _0801EAE4 @ =gBattleCommunication\n\ - ldrb r0, [r5, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - str r0, [r2]\n\ - ldr r4, _0801EAE8 @ =gActiveBattler\n\ - ldr r1, _0801EAD8 @ =gEffectBank\n\ - ldrb r0, [r1]\n\ - strb r0, [r4]\n\ - ldrb r1, [r1]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - ldr r1, _0801EAEC @ =gBattleMons+0x4C @ gBattleMons.status1\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x28\n\ - movs r2, 0\n\ - movs r3, 0x4\n\ - bl EmitSetMonData\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r2, _0801EAF0 @ =gHitMarker\n\ - ldr r1, [r2]\n\ - movs r0, 0x80\n\ - lsls r0, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801EAF8\n\ - movs r0, 0x1\n\ - strb r0, [r5, 0x5]\n\ - ldr r0, _0801EAF4 @ =0xffffdfff\n\ - ands r1, r0\n\ - str r1, [r2]\n\ - b _0801EAFA\n\ - .align 2, 0\n\ -_0801EAD4: .4byte gBattleMons\n\ -_0801EAD8: .4byte gEffectBank\n\ -_0801EADC: .4byte gBattlescriptCurrInstr\n\ -_0801EAE0: .4byte gMoveEffectBS_Ptrs\n\ -_0801EAE4: .4byte gBattleCommunication\n\ -_0801EAE8: .4byte gActiveBattler\n\ -_0801EAEC: .4byte gBattleMons+0x4C @ gBattleMons.status1\n\ -_0801EAF0: .4byte gHitMarker\n\ -_0801EAF4: .4byte 0xffffdfff\n\ -_0801EAF8:\n\ - strb r0, [r5, 0x5]\n\ -_0801EAFA:\n\ - ldr r0, _0801EB2C @ =gBattleCommunication\n\ - ldrb r2, [r0, 0x3]\n\ - adds r7, r0, 0\n\ - cmp r2, 0x2\n\ - beq _0801EB14\n\ - cmp r2, 0x6\n\ - beq _0801EB14\n\ - cmp r2, 0x5\n\ - beq _0801EB14\n\ - cmp r2, 0x3\n\ - beq _0801EB14\n\ - bl _0801F5FA\n\ -_0801EB14:\n\ - ldr r0, _0801EB30 @ =gSharedMem\n\ - ldrb r1, [r7, 0x3]\n\ - ldr r2, _0801EB34 @ =0x000160ca\n\ - adds r0, r2\n\ - strb r1, [r0]\n\ - ldr r2, _0801EB38 @ =gHitMarker\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 7\n\ - bl _0801F4F2\n\ - .align 2, 0\n\ -_0801EB2C: .4byte gBattleCommunication\n\ -_0801EB30: .4byte gSharedMem\n\ -_0801EB34: .4byte 0x000160ca\n\ -_0801EB38: .4byte gHitMarker\n\ -_0801EB3C:\n\ - mov r3, r10\n\ - cmp r3, 0\n\ - beq _0801EB46\n\ - bl _0801F5FA\n\ -_0801EB46:\n\ - bl _0801F5DC\n\ -_0801EB4A:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r1, r0\n\ - ldr r2, _0801EB84 @ =sStatusFlagsForMoveEffects\n\ - ldrb r3, [r7, 0x3]\n\ - lsls r0, r3, 2\n\ - adds r0, r2\n\ - ldr r1, [r1]\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _0801EB6E\n\ - bl _0801F5DC\n\ -_0801EB6E:\n\ - subs r0, r3, 0x7\n\ - cmp r0, 0x34\n\ - bls _0801EB78\n\ - bl _0801F5FA\n\ -_0801EB78:\n\ - lsls r0, 2\n\ - ldr r1, _0801EB88 @ =_0801EB8C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0801EB84: .4byte sStatusFlagsForMoveEffects\n\ -_0801EB88: .4byte _0801EB8C\n\ - .align 2, 0\n\ -_0801EB8C:\n\ - .4byte _0801EC60\n\ - .4byte _0801ECD4\n\ - .4byte _0801EE4C\n\ - .4byte _0801ED60\n\ - .4byte _0801EDDC\n\ - .4byte _0801EE84\n\ - .4byte _0801EECC\n\ - .4byte _0801EFA8\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F13C\n\ - .4byte _0801F184\n\ - .4byte _0801F1A4\n\ - .4byte _0801F364\n\ - .4byte _0801F3A0\n\ - .4byte _0801F3BC\n\ - .4byte _0801F3D4\n\ - .4byte _0801F3EC\n\ - .4byte _0801F44C\n\ - .4byte _0801F464\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F4A8\n\ - .4byte _0801F500\n\ - .4byte _0801F5FA\n\ - .4byte _0801F5FA\n\ - .4byte _0801F5FA\n\ - .4byte _0801F5FA\n\ - .4byte _0801F5EC\n\ -_0801EC60:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - movs r5, 0x58\n\ - adds r1, r0, 0\n\ - muls r1, r5\n\ - mov r2, r9\n\ - adds r0, r1, r2\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x14\n\ - bne _0801EC7A\n\ - bl _0801F5DC\n\ -_0801EC7A:\n\ - mov r4, r9\n\ - adds r4, 0x50\n\ - adds r0, r1, r4\n\ - ldr r0, [r0]\n\ - movs r1, 0x7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801EC8E\n\ - bl _0801F5DC\n\ -_0801EC8E:\n\ - bl Random\n\ - mov r3, r8\n\ - ldrb r1, [r3]\n\ - adds r2, r1, 0\n\ - muls r2, r5\n\ - adds r2, r4\n\ - lsls r0, 16\n\ - movs r1, 0xC0\n\ - lsls r1, 10\n\ - ands r1, r0\n\ - lsrs r1, 16\n\ - adds r1, 0x2\n\ - ldr r0, [r2]\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r4, _0801ECC8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801ECCC @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801ECD0 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - bl _0801F5F8\n\ - .align 2, 0\n\ -_0801ECC8: .4byte gBattlescriptCurrInstr\n\ -_0801ECCC: .4byte gMoveEffectBS_Ptrs\n\ -_0801ECD0: .4byte gBattleCommunication\n\ -_0801ECD4:\n\ - mov r0, r8\n\ - ldrb r2, [r0]\n\ - movs r6, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r6\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - cmp r1, 0x27\n\ - bne _0801ED18\n\ - cmp r4, 0x1\n\ - beq _0801ECF4\n\ - cmp r5, 0x80\n\ - beq _0801ECF4\n\ - bl _0801F5DC\n\ -_0801ECF4:\n\ - ldr r0, _0801ED0C @ =gLastUsedAbility\n\ - strb r1, [r0]\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - movs r1, 0x27\n\ - bl RecordAbilityBattle\n\ - ldr r1, _0801ED10 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0801ED14 @ =BattleScript_FlinchPrevention\n\ - str r0, [r1]\n\ - bl _0801F5FA\n\ - .align 2, 0\n\ -_0801ED0C: .4byte gLastUsedAbility\n\ -_0801ED10: .4byte gBattlescriptCurrInstr\n\ -_0801ED14: .4byte BattleScript_FlinchPrevention\n\ -_0801ED18:\n\ - adds r0, r2, 0\n\ - bl BankGetTurnOrder\n\ - ldr r1, _0801ED54 @ =gCurrentTurnActionNumber\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bhi _0801ED2E\n\ - bl _0801F5DC\n\ -_0801ED2E:\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - adds r2, r0, 0\n\ - muls r2, r6\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r1, _0801ED58 @ =sStatusFlagsForMoveEffects\n\ - ldr r0, _0801ED5C @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r1, [r2]\n\ - ldr r0, [r0]\n\ - orrs r1, r0\n\ - str r1, [r2]\n\ - bl _0801F5DC\n\ - .align 2, 0\n\ -_0801ED54: .4byte gCurrentTurnActionNumber\n\ -_0801ED58: .4byte sStatusFlagsForMoveEffects\n\ -_0801ED5C: .4byte gBattleCommunication\n\ -_0801ED60:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r5, 0x58\n\ - muls r0, r5\n\ - mov r4, r9\n\ - adds r4, 0x50\n\ - adds r2, r0, r4\n\ - ldr r1, [r2]\n\ - movs r0, 0x70\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801ED7C\n\ - bl _0801F5DC\n\ -_0801ED7C:\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - orrs r1, r0\n\ - str r1, [r2]\n\ - ldr r1, _0801EDC8 @ =gLockedMoves\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldr r1, _0801EDCC @ =gCurrentMove\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ - bl Random\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - adds r2, r1, 0\n\ - muls r2, r5\n\ - adds r2, r4\n\ - movs r1, 0x3\n\ - ands r1, r0\n\ - adds r1, 0x2\n\ - lsls r1, 4\n\ - ldr r0, [r2]\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r4, _0801EDD0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801EDD4 @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801EDD8 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - bl _0801F5F8\n\ - .align 2, 0\n\ -_0801EDC8: .4byte gLockedMoves\n\ -_0801EDCC: .4byte gCurrentMove\n\ -_0801EDD0: .4byte gBattlescriptCurrInstr\n\ -_0801EDD4: .4byte gMoveEffectBS_Ptrs\n\ -_0801EDD8: .4byte gBattleCommunication\n\ -_0801EDDC:\n\ - ldr r5, _0801EE30 @ =gBankAttacker\n\ - ldrb r0, [r5]\n\ - bl GetBattlerPosition\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _0801EE14\n\ - ldr r4, _0801EE34 @ =gPaydayMoney\n\ - ldrh r3, [r4]\n\ - ldr r2, _0801EE38 @ =gBattleMons\n\ - ldrb r1, [r5]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r2\n\ - adds r0, 0x2A\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - adds r0, r3, r0\n\ - strh r0, [r4]\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r3, r0\n\ - bls _0801EE14\n\ - ldr r3, _0801EE3C @ =0x0000ffff\n\ - adds r0, r3, 0\n\ - strh r0, [r4]\n\ -_0801EE14:\n\ - ldr r4, _0801EE40 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801EE44 @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801EE48 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - bl _0801F5F8\n\ - .align 2, 0\n\ -_0801EE30: .4byte gBankAttacker\n\ -_0801EE34: .4byte gPaydayMoney\n\ -_0801EE38: .4byte gBattleMons\n\ -_0801EE3C: .4byte 0x0000ffff\n\ -_0801EE40: .4byte gBattlescriptCurrInstr\n\ -_0801EE44: .4byte gMoveEffectBS_Ptrs\n\ -_0801EE48: .4byte gBattleCommunication\n\ -_0801EE4C:\n\ - mov r4, r8\n\ - ldrb r1, [r4]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - mov r1, r9\n\ - adds r1, 0x4C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801EE62\n\ - b _0801F5DC\n\ -_0801EE62:\n\ - bl Random\n\ - ldr r4, _0801EE80 @ =gBattleCommunication\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - adds r0, 0x3\n\ - strb r0, [r4, 0x3]\n\ - movs r0, 0\n\ - movs r1, 0\n\ - bl SetMoveEffect\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801EE80: .4byte gBattleCommunication\n\ -_0801EE84:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 5\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r1, _0801EEC0 @ =gLockedMoves\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldr r1, _0801EEC4 @ =gCurrentMove\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ - ldr r0, _0801EEC8 @ =gProtectStructs\n\ - ldrb r1, [r2]\n\ - lsls r1, 4\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - movs r2, 0x4\n\ - orrs r0, r2\n\ - strb r0, [r1, 0x1]\n\ - b _0801F5DC\n\ - .align 2, 0\n\ -_0801EEC0: .4byte gLockedMoves\n\ -_0801EEC4: .4byte gCurrentMove\n\ -_0801EEC8: .4byte gProtectStructs\n\ -_0801EECC:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r6, 0x58\n\ - muls r0, r6\n\ - mov r4, r9\n\ - adds r4, 0x50\n\ - adds r0, r4\n\ - ldr r5, [r0]\n\ - movs r0, 0xE0\n\ - lsls r0, 8\n\ - ands r5, r0\n\ - cmp r5, 0\n\ - beq _0801EEE8\n\ - b _0801F5DC\n\ -_0801EEE8:\n\ - bl Random\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - adds r2, r1, 0\n\ - muls r2, r6\n\ - adds r2, r4\n\ - movs r1, 0x3\n\ - ands r1, r0\n\ - adds r1, 0x3\n\ - lsls r1, 13\n\ - ldr r0, [r2]\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r2, _0801EF80 @ =gSharedMem\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - ldr r4, _0801EF84 @ =0x00016004\n\ - adds r0, r4\n\ - adds r0, r2\n\ - ldr r6, _0801EF88 @ =gCurrentMove\n\ - ldrh r1, [r6]\n\ - strb r1, [r0]\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - ldr r1, _0801EF8C @ =0x00016005\n\ - adds r0, r1\n\ - adds r0, r2\n\ - ldrh r1, [r6]\n\ - lsrs r1, 8\n\ - strb r1, [r0]\n\ - ldrb r0, [r3]\n\ - ldr r3, _0801EF90 @ =0x00016020\n\ - adds r0, r3\n\ - adds r0, r2\n\ - ldr r1, _0801EF94 @ =gBankAttacker\n\ - ldrb r1, [r1]\n\ - strb r1, [r0]\n\ - ldr r4, _0801EF98 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801EF9C @ =gMoveEffectBS_Ptrs\n\ - ldr r2, _0801EFA0 @ =gBattleCommunication\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - str r0, [r4]\n\ - strb r5, [r2, 0x5]\n\ - ldr r1, _0801EFA4 @ =gTrappingMoves\n\ - ldrh r0, [r1]\n\ - ldrh r4, [r6]\n\ - cmp r0, r4\n\ - bne _0801EF5C\n\ - b _0801F5FA\n\ -_0801EF5C:\n\ - adds r3, r1, 0\n\ - adds r1, r6, 0\n\ -_0801EF60:\n\ - ldrb r0, [r2, 0x5]\n\ - adds r0, 0x1\n\ - strb r0, [r2, 0x5]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x4\n\ - bls _0801EF70\n\ - b _0801F5FA\n\ -_0801EF70:\n\ - ldrb r0, [r2, 0x5]\n\ - lsls r0, 1\n\ - adds r0, r3\n\ - ldrh r0, [r0]\n\ - ldrh r4, [r1]\n\ - cmp r0, r4\n\ - bne _0801EF60\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801EF80: .4byte gSharedMem\n\ -_0801EF84: .4byte 0x00016004\n\ -_0801EF88: .4byte gCurrentMove\n\ -_0801EF8C: .4byte 0x00016005\n\ -_0801EF90: .4byte 0x00016020\n\ -_0801EF94: .4byte gBankAttacker\n\ -_0801EF98: .4byte gBattlescriptCurrInstr\n\ -_0801EF9C: .4byte gMoveEffectBS_Ptrs\n\ -_0801EFA0: .4byte gBattleCommunication\n\ -_0801EFA4: .4byte gTrappingMoves\n\ -_0801EFA8:\n\ - ldr r1, _0801EFD8 @ =gBattleMoveDamage\n\ - ldr r0, _0801EFDC @ =gHpDealt\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bge _0801EFB4\n\ - adds r0, 0x3\n\ -_0801EFB4:\n\ - asrs r0, 2\n\ - str r0, [r1]\n\ - cmp r0, 0\n\ - bne _0801EFC0\n\ - movs r0, 0x1\n\ - str r0, [r1]\n\ -_0801EFC0:\n\ - ldr r4, _0801EFE0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801EFE4 @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801EFE8 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801EFD8: .4byte gBattleMoveDamage\n\ -_0801EFDC: .4byte gHpDealt\n\ -_0801EFE0: .4byte gBattlescriptCurrInstr\n\ -_0801EFE4: .4byte gMoveEffectBS_Ptrs\n\ -_0801EFE8: .4byte gBattleCommunication\n\ -_0801EFEC:\n\ - ldrb r1, [r7, 0x3]\n\ - adds r1, 0xF2\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - movs r0, 0x10\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl ChangeStatBuffs\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0\n\ - beq _0801F008\n\ - b _0801F5DC\n\ -_0801F008:\n\ - ldr r2, _0801F02C @ =gSharedMem\n\ - ldrb r1, [r7, 0x3]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - ldr r4, _0801F030 @ =0x000160a4\n\ - adds r1, r2, r4\n\ - strb r0, [r1]\n\ - ldr r0, _0801F034 @ =0x000160a5\n\ - adds r2, r0\n\ - strb r3, [r2]\n\ - ldr r4, _0801F038 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F03C @ =BattleScript_StatUp\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F02C: .4byte gSharedMem\n\ -_0801F030: .4byte 0x000160a4\n\ -_0801F034: .4byte 0x000160a5\n\ -_0801F038: .4byte gBattlescriptCurrInstr\n\ -_0801F03C: .4byte BattleScript_StatUp\n\ -_0801F040:\n\ - movs r0, 0x70\n\ - negs r0, r0\n\ - ldrb r1, [r7, 0x3]\n\ - adds r1, 0xEB\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl ChangeStatBuffs\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0\n\ - beq _0801F05E\n\ - b _0801F5DC\n\ -_0801F05E:\n\ - ldr r2, _0801F080 @ =gSharedMem\n\ - ldrb r1, [r7, 0x3]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - ldr r4, _0801F084 @ =0x000160a4\n\ - adds r1, r2, r4\n\ - strb r0, [r1]\n\ - ldr r0, _0801F088 @ =0x000160a5\n\ - adds r2, r0\n\ - strb r3, [r2]\n\ - ldr r4, _0801F08C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F090 @ =BattleScript_StatDown\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F080: .4byte gSharedMem\n\ -_0801F084: .4byte 0x000160a4\n\ -_0801F088: .4byte 0x000160a5\n\ -_0801F08C: .4byte gBattlescriptCurrInstr\n\ -_0801F090: .4byte BattleScript_StatDown\n\ -_0801F094:\n\ - ldrb r1, [r7, 0x3]\n\ - adds r1, 0xDA\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - movs r0, 0x20\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl ChangeStatBuffs\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0\n\ - beq _0801F0B0\n\ - b _0801F5DC\n\ -_0801F0B0:\n\ - ldr r2, _0801F0D4 @ =gSharedMem\n\ - ldrb r1, [r7, 0x3]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - ldr r4, _0801F0D8 @ =0x000160a4\n\ - adds r1, r2, r4\n\ - strb r0, [r1]\n\ - ldr r0, _0801F0DC @ =0x000160a5\n\ - adds r2, r0\n\ - strb r3, [r2]\n\ - ldr r4, _0801F0E0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F0E4 @ =BattleScript_StatUp\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F0D4: .4byte gSharedMem\n\ -_0801F0D8: .4byte 0x000160a4\n\ -_0801F0DC: .4byte 0x000160a5\n\ -_0801F0E0: .4byte gBattlescriptCurrInstr\n\ -_0801F0E4: .4byte BattleScript_StatUp\n\ -_0801F0E8:\n\ - movs r0, 0x60\n\ - negs r0, r0\n\ - ldrb r1, [r7, 0x3]\n\ - adds r1, 0xD3\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl ChangeStatBuffs\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0\n\ - beq _0801F106\n\ - b _0801F5DC\n\ -_0801F106:\n\ - ldr r2, _0801F128 @ =gSharedMem\n\ - ldrb r1, [r7, 0x3]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - ldr r4, _0801F12C @ =0x000160a4\n\ - adds r1, r2, r4\n\ - strb r0, [r1]\n\ - ldr r0, _0801F130 @ =0x000160a5\n\ - adds r2, r0\n\ - strb r3, [r2]\n\ - ldr r4, _0801F134 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F138 @ =BattleScript_StatDown\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F128: .4byte gSharedMem\n\ -_0801F12C: .4byte 0x000160a4\n\ -_0801F130: .4byte 0x000160a5\n\ -_0801F134: .4byte gBattlescriptCurrInstr\n\ -_0801F138: .4byte BattleScript_StatDown\n\ -_0801F13C:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 15\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r2, _0801F178 @ =gDisableStructs\n\ - mov r3, r8\n\ - ldrb r1, [r3]\n\ - lsls r0, r1, 3\n\ - subs r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - movs r1, 0x2\n\ - strb r1, [r0, 0x19]\n\ - ldr r1, _0801F17C @ =gLockedMoves\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldr r1, _0801F180 @ =gCurrentMove\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ - b _0801F5DC\n\ - .align 2, 0\n\ -_0801F178: .4byte gDisableStructs\n\ -_0801F17C: .4byte gLockedMoves\n\ -_0801F180: .4byte gCurrentMove\n\ -_0801F184:\n\ - ldr r0, _0801F1A0 @ =gBankAttacker\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 16\n\ -_0801F19A:\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - b _0801F5DC\n\ - .align 2, 0\n\ -_0801F1A0: .4byte gBankAttacker\n\ -_0801F1A4:\n\ - ldr r4, _0801F254 @ =gBankAttacker\n\ - ldrb r0, [r4]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldrb r0, [r4]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _0801F1D8\n\ - ldr r0, _0801F258 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0801F25C @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801F214\n\ - ldr r0, _0801F260 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0801F1D8\n\ - b _0801F5DC\n\ -_0801F1D8:\n\ - ldr r0, _0801F258 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0801F25C @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801F214\n\ - ldr r0, _0801F260 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0801F214\n\ - ldr r0, _0801F264 @ =gWishFutureKnock\n\ - adds r0, 0x29\n\ - adds r0, r6, r0\n\ - ldrb r1, [r0]\n\ - ldr r3, _0801F268 @ =gBitTable\n\ - ldr r2, _0801F26C @ =gBattlerPartyIndexes\n\ - ldr r0, _0801F254 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _0801F214\n\ - b _0801F5DC\n\ -_0801F214:\n\ - ldr r2, _0801F270 @ =gBattleMons\n\ - ldr r1, _0801F274 @ =gBankTarget\n\ - ldrb r0, [r1]\n\ - movs r3, 0x58\n\ - muls r0, r3\n\ - adds r4, r0, r2\n\ - ldrh r0, [r4, 0x2E]\n\ - adds r7, r1, 0\n\ - mov r9, r2\n\ - cmp r0, 0\n\ - beq _0801F284\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3C\n\ - bne _0801F284\n\ - ldr r1, _0801F278 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0801F27C @ =BattleScript_NoItemSteal\n\ - str r0, [r1]\n\ - ldr r1, _0801F280 @ =gLastUsedAbility\n\ - ldrb r0, [r7]\n\ - muls r0, r3\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r0, [r7]\n\ - ldrb r1, [r1]\n\ - bl RecordAbilityBattle\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F254: .4byte gBankAttacker\n\ -_0801F258: .4byte gBattleTypeFlags\n\ -_0801F25C: .4byte 0x00000902\n\ -_0801F260: .4byte gTrainerBattleOpponent\n\ -_0801F264: .4byte gWishFutureKnock\n\ -_0801F268: .4byte gBitTable\n\ -_0801F26C: .4byte gBattlerPartyIndexes\n\ -_0801F270: .4byte gBattleMons\n\ -_0801F274: .4byte gBankTarget\n\ -_0801F278: .4byte gBattlescriptCurrInstr\n\ -_0801F27C: .4byte BattleScript_NoItemSteal\n\ -_0801F280: .4byte gLastUsedAbility\n\ -_0801F284:\n\ - ldr r4, _0801F340 @ =gBankAttacker\n\ - mov r10, r4\n\ - ldrb r1, [r4]\n\ - movs r0, 0x58\n\ - mov r8, r0\n\ - mov r0, r8\n\ - muls r0, r1\n\ - add r0, r9\n\ - ldrh r3, [r0, 0x2E]\n\ - cmp r3, 0\n\ - beq _0801F29C\n\ - b _0801F5DC\n\ -_0801F29C:\n\ - ldrb r0, [r7]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - add r0, r9\n\ - ldrh r2, [r0, 0x2E]\n\ - adds r0, r2, 0\n\ - cmp r0, 0xAF\n\ - bne _0801F2B0\n\ - b _0801F5DC\n\ -_0801F2B0:\n\ - cmp r0, 0\n\ - bne _0801F2B6\n\ - b _0801F5DC\n\ -_0801F2B6:\n\ - lsls r0, r1, 1\n\ - ldr r5, _0801F344 @ =gSharedMem + 0x160F0\n\ - adds r0, r5\n\ - ldr r1, _0801F348 @ =gLastUsedItem\n\ - strh r2, [r0]\n\ - strh r2, [r1]\n\ - ldrb r0, [r7]\n\ - mov r4, r8\n\ - muls r4, r0\n\ - adds r0, r4, 0\n\ - add r0, r9\n\ - movs r6, 0\n\ - strh r3, [r0, 0x2E]\n\ - ldr r4, _0801F34C @ =gActiveBattler\n\ - mov r2, r10\n\ - ldrb r0, [r2]\n\ - strb r0, [r4]\n\ - str r1, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - movs r3, 0x2\n\ - bl EmitSetMonData\n\ - mov r3, r10\n\ - ldrb r0, [r3]\n\ - bl MarkBufferBankForExecution\n\ - ldrb r0, [r7]\n\ - strb r0, [r4]\n\ - ldrb r0, [r7]\n\ - mov r4, r8\n\ - muls r4, r0\n\ - adds r0, r4, 0\n\ - mov r1, r9\n\ - adds r1, 0x2E\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - movs r3, 0x2\n\ - bl EmitSetMonData\n\ - ldrb r0, [r7]\n\ - bl MarkBufferBankForExecution\n\ - ldr r4, _0801F350 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F354 @ =BattleScript_ItemSteal\n\ - str r0, [r4]\n\ - ldr r0, _0801F358 @ =0xfffe9f10\n\ - adds r5, r0\n\ - ldrb r0, [r7]\n\ - lsls r0, 1\n\ - ldr r1, _0801F35C @ =0x000160e8\n\ - adds r0, r1\n\ - adds r0, r5\n\ - strb r6, [r0]\n\ - ldrb r0, [r7]\n\ - lsls r0, 1\n\ - ldr r2, _0801F360 @ =0x000160e9\n\ - adds r0, r2\n\ - adds r0, r5\n\ - strb r6, [r0]\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F340: .4byte gBankAttacker\n\ -_0801F344: .4byte gSharedMem + 0x160F0\n\ -_0801F348: .4byte gLastUsedItem\n\ -_0801F34C: .4byte gActiveBattler\n\ -_0801F350: .4byte gBattlescriptCurrInstr\n\ -_0801F354: .4byte BattleScript_ItemSteal\n\ -_0801F358: .4byte 0xfffe9f10\n\ -_0801F35C: .4byte 0x000160e8\n\ -_0801F360: .4byte 0x000160e9\n\ -_0801F364:\n\ - ldr r3, _0801F394 @ =gBankTarget\n\ - ldrb r1, [r3]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 19\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r2, _0801F398 @ =gDisableStructs\n\ - ldrb r1, [r3]\n\ - lsls r0, r1, 3\n\ - subs r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldr r1, _0801F39C @ =gBankAttacker\n\ - ldrb r1, [r1]\n\ - strb r1, [r0, 0x14]\n\ - b _0801F5DC\n\ - .align 2, 0\n\ -_0801F394: .4byte gBankTarget\n\ -_0801F398: .4byte gDisableStructs\n\ -_0801F39C: .4byte gBankAttacker\n\ -_0801F3A0:\n\ - ldr r0, _0801F3B8 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 20\n\ - b _0801F19A\n\ - .align 2, 0\n\ -_0801F3B8: .4byte gBankTarget\n\ -_0801F3BC:\n\ - ldr r4, _0801F3CC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F3D0 @ =BattleScript_AllStatsUp\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F3CC: .4byte gBattlescriptCurrInstr\n\ -_0801F3D0: .4byte BattleScript_AllStatsUp\n\ -_0801F3D4:\n\ - ldr r4, _0801F3E4 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F3E8 @ =BattleScript_RapidSpinAway\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F3E4: .4byte gBattlescriptCurrInstr\n\ -_0801F3E8: .4byte BattleScript_RapidSpinAway\n\ -_0801F3EC:\n\ - ldr r6, _0801F43C @ =gBankTarget\n\ - ldrb r0, [r6]\n\ - movs r2, 0x58\n\ - muls r0, r2\n\ - mov r1, r9\n\ - adds r1, 0x4C\n\ - adds r5, r0, r1\n\ - ldr r4, [r5]\n\ - movs r0, 0x40\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - bne _0801F406\n\ - b _0801F5DC\n\ -_0801F406:\n\ - movs r0, 0x41\n\ - negs r0, r0\n\ - ands r4, r0\n\ - str r4, [r5]\n\ - ldr r4, _0801F440 @ =gActiveBattler\n\ - ldrb r0, [r6]\n\ - strb r0, [r4]\n\ - ldrb r0, [r4]\n\ - muls r0, r2\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x28\n\ - movs r2, 0\n\ - movs r3, 0x4\n\ - bl EmitSetMonData\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r4, _0801F444 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F448 @ =BattleScript_TargetPRLZHeal\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F43C: .4byte gBankTarget\n\ -_0801F440: .4byte gActiveBattler\n\ -_0801F444: .4byte gBattlescriptCurrInstr\n\ -_0801F448: .4byte BattleScript_TargetPRLZHeal\n\ -_0801F44C:\n\ - ldr r4, _0801F45C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F460 @ =BattleScript_AtkDefDown\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F45C: .4byte gBattlescriptCurrInstr\n\ -_0801F460: .4byte BattleScript_AtkDefDown\n\ -_0801F464:\n\ - ldr r4, _0801F494 @ =gBattleMoveDamage\n\ - ldr r0, _0801F498 @ =gHpDealt\n\ - ldr r0, [r0]\n\ - movs r1, 0x3\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - cmp r0, 0\n\ - bne _0801F47A\n\ - movs r0, 0x1\n\ - str r0, [r4]\n\ -_0801F47A:\n\ - ldr r4, _0801F49C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801F4A0 @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801F4A4 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F494: .4byte gBattleMoveDamage\n\ -_0801F498: .4byte gHpDealt\n\ -_0801F49C: .4byte gBattlescriptCurrInstr\n\ -_0801F4A0: .4byte gMoveEffectBS_Ptrs\n\ -_0801F4A4: .4byte gBattleCommunication\n\ -_0801F4A8:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r5, 0x58\n\ - muls r0, r5\n\ - mov r4, r9\n\ - adds r4, 0x50\n\ - adds r2, r0, r4\n\ - ldr r1, [r2]\n\ - movs r0, 0xC0\n\ - lsls r0, 4\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801F4C4\n\ - b _0801F5DC\n\ -_0801F4C4:\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - orrs r1, r0\n\ - str r1, [r2]\n\ - ldr r1, _0801F4F8 @ =gLockedMoves\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldr r1, _0801F4FC @ =gCurrentMove\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ - bl Random\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - adds r2, r1, 0\n\ - muls r2, r5\n\ - adds r2, r4\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - adds r1, 0x2\n\ - lsls r1, 10\n\ - ldr r0, [r2]\n\ -_0801F4F2:\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F4F8: .4byte gLockedMoves\n\ -_0801F4FC: .4byte gCurrentMove\n\ -_0801F500:\n\ - mov r5, r8\n\ - ldrb r3, [r5]\n\ - movs r4, 0x58\n\ - adds r0, r3, 0\n\ - muls r0, r4\n\ - mov r2, r9\n\ - adds r1, r0, r2\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r2, [r0]\n\ - cmp r2, 0x3C\n\ - bne _0801F540\n\ - ldrh r0, [r1, 0x2E]\n\ - cmp r0, 0\n\ - beq _0801F5DC\n\ - ldr r0, _0801F534 @ =gLastUsedAbility\n\ - strb r2, [r0]\n\ - ldr r1, _0801F538 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0801F53C @ =BattleScript_NoItemSteal\n\ - str r0, [r1]\n\ - ldrb r0, [r5]\n\ - movs r1, 0x3C\n\ - bl RecordAbilityBattle\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F534: .4byte gLastUsedAbility\n\ -_0801F538: .4byte gBattlescriptCurrInstr\n\ -_0801F53C: .4byte BattleScript_NoItemSteal\n\ -_0801F540:\n\ - ldrh r0, [r1, 0x2E]\n\ - cmp r0, 0\n\ - beq _0801F5DC\n\ - adds r0, r3, 0\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldr r1, _0801F5B8 @ =gLastUsedItem\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - muls r0, r4\n\ - add r0, r9\n\ - ldrh r0, [r0, 0x2E]\n\ - strh r0, [r1]\n\ - ldrb r0, [r3]\n\ - muls r0, r4\n\ - add r0, r9\n\ - movs r5, 0\n\ - movs r1, 0\n\ - strh r1, [r0, 0x2E]\n\ - ldr r2, _0801F5BC @ =gWishFutureKnock\n\ - adds r2, 0x29\n\ - adds r2, r6, r2\n\ - ldr r3, _0801F5C0 @ =gBitTable\n\ - ldr r1, _0801F5C4 @ =gBattlerPartyIndexes\n\ - mov r4, r8\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r4, _0801F5C8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F5CC @ =BattleScript_KnockedOff\n\ - str r0, [r4]\n\ - ldr r1, _0801F5D0 @ =gSharedMem\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - ldr r3, _0801F5D4 @ =0x000160e8\n\ - adds r0, r3\n\ - adds r0, r1\n\ - strb r5, [r0]\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - ldr r4, _0801F5D8 @ =0x000160e9\n\ - adds r0, r4\n\ - adds r0, r1\n\ - strb r5, [r0]\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F5B8: .4byte gLastUsedItem\n\ -_0801F5BC: .4byte gWishFutureKnock\n\ -_0801F5C0: .4byte gBitTable\n\ -_0801F5C4: .4byte gBattlerPartyIndexes\n\ -_0801F5C8: .4byte gBattlescriptCurrInstr\n\ -_0801F5CC: .4byte BattleScript_KnockedOff\n\ -_0801F5D0: .4byte gSharedMem\n\ -_0801F5D4: .4byte 0x000160e8\n\ -_0801F5D8: .4byte 0x000160e9\n\ -_0801F5DC:\n\ - ldr r1, _0801F5E8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x1\n\ - str r0, [r1]\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F5E8: .4byte gBattlescriptCurrInstr\n\ -_0801F5EC:\n\ - ldr r4, _0801F60C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F610 @ =BattleScript_SAtkDown2\n\ -_0801F5F8:\n\ - str r0, [r4]\n\ -_0801F5FA:\n\ - add sp, 0x8\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\ -_0801F60C: .4byte gBattlescriptCurrInstr\n\ -_0801F610: .4byte BattleScript_SAtkDown2\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -static void atk15_seteffectwithchance(void) -{ - u32 PercentChance; - - if (gBattleMons[gBankAttacker].ability == ABILITY_SERENE_GRACE) - PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance * 2; - else - PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance; - - if (DEBUG && (gUnknown_02023A14_50 & 4) - && !(gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - SetMoveEffect(0, 0); - } - else if ((gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gBattleCommunication[MOVE_EFFECT_BYTE] &= 0x7F; - SetMoveEffect(0, 0x80); - } - else if (Random() % 100 <= PercentChance && gBattleCommunication[MOVE_EFFECT_BYTE] != 0 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - if (PercentChance >= 100) - SetMoveEffect(0, 0x80); - else - SetMoveEffect(0, 0); - } - else - { - gBattlescriptCurrInstr++; - } - - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - gBattleStruct->unk16112 = 0; -} - -static void atk16_seteffectprimary(void) -{ - SetMoveEffect(1, 0); -} - -static void atk17_seteffectsecondary(void) -{ - SetMoveEffect(0, 0); -} - -static void atk18_clearstatusfromeffect(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) - gBattleMons[gActiveBattler].status1 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); - else - gBattleMons[gActiveBattler].status2 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); - - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - gBattlescriptCurrInstr += 2; - gBattleStruct->unk16112 = 0; -} - -static void atk19_tryfaintmon(void) -{ - u8 *r4; - - if (gBattlescriptCurrInstr[2] != 0) - { - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) - { - r4 = T1_READ_PTR(gBattlescriptCurrInstr + 3); - - BattleScriptPop(); - gBattlescriptCurrInstr = r4; - gSideAffecting[GetBattlerSide(gActiveBattler)] &= ~SIDE_STATUS_SPIKES_DAMAGED; - } - else - { - gBattlescriptCurrInstr += 7; - } - } - else - { - u8 bank; - - if (gBattlescriptCurrInstr[1] == 1) - { - gActiveBattler = gBankAttacker; - bank = gBankTarget; - r4 = BattleScript_FaintAttacker; - } - else - { - gActiveBattler = gBankTarget; - bank = gBankAttacker; - r4 = BattleScript_FaintTarget; - } - if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler]) - && gBattleMons[gActiveBattler].hp == 0) - { - ewram160ACarr2(0, bank) = 0; - ewram160ACarr2(1, bank) = 0; - ewram16100arr2(0, bank) = 0; - ewram16100arr2(1, bank) = 0; - ewram16100arr2(2, bank) = 0; - ewram16100arr2(3, bank) = 0; - - gHitMarker |= HITMARKER_FAINTED(gActiveBattler); - BattleScriptPush(gBattlescriptCurrInstr + 7); - gBattlescriptCurrInstr = r4; - if (GetBattlerSide(gActiveBattler) == 0) - { - gHitMarker |= HITMARKER_x400000; - if (gBattleResults.playerFaintCounter < 0xFF) - gBattleResults.playerFaintCounter++; - if (gBattleMons[bank].level > gBattleMons[gActiveBattler].level) - { - if (gBattleMons[bank].level - gBattleMons[gActiveBattler].level > 29) - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], FRIENDSHIP_EVENT_FAINT_LARGE); - else - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], FRIENDSHIP_EVENT_FAINT_SMALL); - } - } - else - { - if (gBattleResults.opponentFaintCounter < 0xFF) - gBattleResults.opponentFaintCounter++; - gBattleResults.lastOpponentSpecies = gBattleMons[gActiveBattler].species; - } - if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBankAttacker].hp != 0) - { - BattleScriptPush(gBattlescriptCurrInstr); - gBattleMoveDamage = gBattleMons[bank].hp; - gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife; - } - if ((gStatuses3[gBankTarget] & STATUS3_GRUDGE) - && !(gHitMarker & HITMARKER_GRUDGE) - && GetBattlerSide(gBankAttacker) != GetBattlerSide(gBankTarget) - && gBattleMons[gBankAttacker].hp != 0 - && gCurrentMove != MOVE_STRUGGLE) - { - u8 moveIndex = ewram1608Carr(gBankAttacker); - - gBattleMons[gBankAttacker].pp[moveIndex] = 0; - BattleScriptPush(gBattlescriptCurrInstr); - gBattlescriptCurrInstr = BattleScript_SelectingImprisionedMoveInPalace; - gActiveBattler = gBankAttacker; - EmitSetMonData(0, moveIndex + 9, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]); - MarkBufferBankForExecution(gActiveBattler); - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gBattleMons[gBankAttacker].moves[moveIndex]; - gBattleTextBuff1[3] = gBattleMons[gBankAttacker].moves[moveIndex] >> 8; - gBattleTextBuff1[4] = EOS; - } - } - else - { - gBattlescriptCurrInstr += 7; - } - } -} - -static void atk1A_dofaintanimation(void) -{ - if (gBattleExecBuffer == 0) - { - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - Emitcmd10(0); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; - } -} - -static void atk1B_cleareffectsonfaint(void) -{ - //Clears things like attraction or trapping to other banks - if (gBattleExecBuffer == 0) - { - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - gBattleMons[gActiveBattler].status1 = 0; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - UndoEffectsAfterFainting(); - gBattlescriptCurrInstr += 2; - } -} - -static void atk1C_jumpifstatus(void) -{ - u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2); - void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 6); - if (gBattleMons[bank].status1 & flags && gBattleMons[bank].hp) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 10; -} - -static void atk1D_jumpifstatus2(void) -{ - u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2); - void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 6); - if (gBattleMons[bank].status2 & flags && gBattleMons[bank].hp) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 10; -} - -static void atk1E_jumpifability(void) -{ - u8 bank; - u8 ability = T2_READ_8(gBattlescriptCurrInstr + 2); - void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 3); - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 8) - { - bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_BANK_SIDE, gBankAttacker, ability, 0, 0); - if (bank) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = jump_loc; - RecordAbilityBattle(bank -1, gLastUsedAbility); - ewram160F8 = bank - 1; - } - else - gBattlescriptCurrInstr += 7; - } - else if (T2_READ_8(gBattlescriptCurrInstr + 1) == 9) - { - bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBankAttacker, ability, 0, 0); - if (bank) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = jump_loc; - RecordAbilityBattle(bank - 1, gLastUsedAbility); - ewram160F8 = bank - 1; - } - else - gBattlescriptCurrInstr += 7; - } - else - { - bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (gBattleMons[bank].ability == ability) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = jump_loc; - RecordAbilityBattle(bank, gLastUsedAbility); - ewram160F8 = bank; - } - else - gBattlescriptCurrInstr += 7; - } -} - -static void atk1F_jumpifsideaffecting(void) -{ - u8 side; - u16 flags; - void* jump_loc; - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 1) - side = GetBattlerPosition(gBankAttacker) & 1; - else - side = GetBattlerPosition(gBankTarget) & 1; - - flags = T2_READ_16(gBattlescriptCurrInstr + 2); - jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 4); - - if (gSideAffecting[side] & flags) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 8; -} - -static void atk20_jumpifstat(void) -{ - u8 ret = 0; - u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - u8 value = gBattleMons[bank].statStages[T2_READ_8(gBattlescriptCurrInstr + 3)]; - switch (T2_READ_8(gBattlescriptCurrInstr + 2)) - { - case CMP_EQUAL: - if (value == T2_READ_8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_NOT_EQUAL: - if (value != T2_READ_8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_GREATER_THAN: - if (value > T2_READ_8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_LESS_THAN: - if (value < T2_READ_8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_COMMON_BITS: - if (value & T2_READ_8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_NO_COMMON_BITS: - if (!(value & T2_READ_8(gBattlescriptCurrInstr + 4))) - ret++; - break; - } - if (ret) - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 5); - else - gBattlescriptCurrInstr += 9; -} - -static void atk21_jumpifstatus3condition(void) -{ - u32 flags; - void* jump_loc; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - flags = T2_READ_32(gBattlescriptCurrInstr + 2); - jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 7); - if (T2_READ_8(gBattlescriptCurrInstr + 6)) - { - if ((gStatuses3[gActiveBattler] & flags) != 0) - gBattlescriptCurrInstr += 11; - else - gBattlescriptCurrInstr = jump_loc; - } - else - { - if ((gStatuses3[gActiveBattler] & flags) != 0) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 11; - } -} - -static void atk22_jumpiftype(void) //u8 bank, u8 type, *ptr -{ - u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - u8 type = T2_READ_8(gBattlescriptCurrInstr + 2); - void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 3); - - if (gBattleMons[bank].type1 == type || gBattleMons[bank].type2 == type) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 7; -} - -static void atk23_getexp(void) -{ - u16 item; - s32 i; // also used as stringId - u8 holdEffect; - s32 sentIn; - - s32 viaExpShare = 0; - u16* exp = &gBattleStruct->exp; - - gBank1 = GetBattleBank(gBattlescriptCurrInstr[1]); - sentIn = gSentPokesToOpponent[(gBank1 & 2) >> 1]; - - switch (gBattleStruct->getexpStateTracker) - { - case 0: // check if should receive exp at all - if (GetBattlerSide(gBank1) != B_SIDE_OPPONENT || (gBattleTypeFlags & - (BATTLE_TYPE_LINK - | BATTLE_TYPE_SAFARI - | BATTLE_TYPE_BATTLE_TOWER - | BATTLE_TYPE_EREADER_TRAINER))) - { - gBattleStruct->getexpStateTracker = 6; // goto last case - } - else - { - gBattleStruct->getexpStateTracker++; - gBattleStruct->unk16113 |= gBitTable[gBattlerPartyIndexes[gBank1]]; - } - break; - case 1: // calculate experience points to redistribute - { - u16 calculatedExp; - s32 viaSentIn; - - for (viaSentIn = 0, i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) - continue; - if (gBitTable[i] & sentIn) - viaSentIn++; - - item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - - if (item == ITEM_ENIGMA_BERRY) - holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - else - holdEffect = ItemId_GetHoldEffect(item); - - if (holdEffect == HOLD_EFFECT_EXP_SHARE) - viaExpShare++; - } - - calculatedExp = gBaseStats[gBattleMons[gBank1].species].expYield * gBattleMons[gBank1].level / 7; - - if (viaExpShare) // at least one mon is getting exp via exp share - { - *exp = calculatedExp / 2 / viaSentIn; - if (*exp == 0) - *exp = 1; - - gExpShareExp = calculatedExp / 2 / viaExpShare; - if (gExpShareExp == 0) - gExpShareExp = 1; - } - else - { - *exp = calculatedExp / viaSentIn; - if (*exp == 0) - *exp = 1; - gExpShareExp = 0; - } - - gBattleStruct->getexpStateTracker++; - gBattleStruct->expGetterID = 0; - gBattleStruct->sentInPokes = sentIn; - } - // fall through - case 2: // set exp value to the poke in expgetter_id and print message - if (gBattleExecBuffer == 0) - { - item = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HELD_ITEM); - - if (item == ITEM_ENIGMA_BERRY) - holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - else - holdEffect = ItemId_GetHoldEffect(item); - - if (holdEffect != HOLD_EFFECT_EXP_SHARE && !(gBattleStruct->sentInPokes & 1)) - { - gBattleStruct->sentInPokes >>= 1; - gBattleStruct->getexpStateTracker = 5; - gBattleMoveDamage = 0; // used for exp - } - else if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL) == 100) - { - gBattleStruct->sentInPokes >>= 1; - gBattleStruct->getexpStateTracker = 5; - gBattleMoveDamage = 0; // used for exp - } - else - { - // music change in wild battle after fainting a poke - if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !gBattleStruct->wildVictorySong) - { - BattleStopLowHpSound(); - PlayBGM(0x161); - gBattleStruct->wildVictorySong++; - } - - if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP)) - { - if (gBattleStruct->sentInPokes & 1) - gBattleMoveDamage = *exp; - else - gBattleMoveDamage = 0; - - if (holdEffect == HOLD_EFFECT_EXP_SHARE) - gBattleMoveDamage += gExpShareExp; - if (holdEffect == HOLD_EFFECT_LUCKY_EGG) - gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - - if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterID])) - { - gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - i = 0x14A; - } - else - { - i = 0x149; - } - - // get exp getter bank - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - if (!(gBattlerPartyIndexes[2] != gBattleStruct->expGetterID) && !(gAbsentBattlerFlags & gBitTable[2])) - gBattleStruct->expGetterBank = 2; - else - { - if (!(gAbsentBattlerFlags & gBitTable[0])) - gBattleStruct->expGetterBank = 0; - else - gBattleStruct->expGetterBank = 2; - } - } - else - gBattleStruct->expGetterBank = 0; - - PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattleStruct->expGetterBank, gBattleStruct->expGetterID) - - // buffer 'gained' or 'gained a boosted' - PREPARE_STRING_BUFFER(gBattleTextBuff2, i) - - PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff3, 5, gBattleMoveDamage) - - PrepareStringBattle(STRINGID_PKMNGAINEDEXP, gBattleStruct->expGetterBank); - MonGainEVs(&gPlayerParty[gBattleStruct->expGetterID], gBattleMons[gBank1].species); - } - gBattleStruct->sentInPokes >>= 1; - gBattleStruct->getexpStateTracker++; - } - } - break; - case 3: // Set stats and give exp - if (gBattleExecBuffer == 0) - { - gBattleBufferB[gBattleStruct->expGetterBank][0] = 0; - if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL) != 100) - { - gBattleResources_statsBeforeLvlUp->hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP); - gBattleResources_statsBeforeLvlUp->atk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK); - gBattleResources_statsBeforeLvlUp->def = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF); - gBattleResources_statsBeforeLvlUp->spd = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); - gBattleResources_statsBeforeLvlUp->spAtk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK); - gBattleResources_statsBeforeLvlUp->spDef = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF); - - gActiveBattler = gBattleStruct->expGetterBank; - - EmitExpBarUpdate(0, gBattleStruct->expGetterID, gBattleMoveDamage); - MarkBufferBankForExecution(gActiveBattler); - } - gBattleStruct->getexpStateTracker++; - } - break; - case 4: // lvl up if necessary - if (gBattleExecBuffer == 0) - { - gActiveBattler = gBattleStruct->expGetterBank; - if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES - && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELLED_UP) - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterID) - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - - PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattleStruct->expGetterID) - - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL)) - - BattleScriptPushCursor(); - gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterID]; - gBattlescriptCurrInstr = BattleScript_LevelUp; - gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8)); - AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterID], FRIENDSHIP_EVENT_GROW_LEVEL); - - // update battle mon structure after level up - if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterID && gBattleMons[0].hp) - { - gBattleMons[0].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL); - gBattleMons[0].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP); - gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP); - gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK); - gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF); - // Why is this duplicated? - gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); - gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); - gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK); - gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF); - } - // What is else if? - if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterID && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL); - gBattleMons[2].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP); - gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP); - gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK); - gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF); - // Duplicated again, but this time there's no Sp Defense - gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); - gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); - gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK); - } - } - else - { - gBattleMoveDamage = 0; - } - gBattleStruct->getexpStateTracker = 5; - } - break; - case 5: // looper increment - if (gBattleMoveDamage) // there is exp to give, goto case 3 that gives exp - gBattleStruct->getexpStateTracker = 3; - else - { - gBattleStruct->expGetterID++; - if (gBattleStruct->expGetterID <= 5) - gBattleStruct->getexpStateTracker = 2; // loop again - else - gBattleStruct->getexpStateTracker = 6; // we're done - } - break; - case 6: // increment instruction - if (gBattleExecBuffer == 0) - { - // not sure why gf clears the item and ability here - gBattleMons[gBank1].item = 0; - gBattleMons[gBank1].ability = 0; - gBattlescriptCurrInstr += 2; - } - break; - } -} - -#ifdef NONMATCHING -static void atk24(void) -{ - u16 HP_count = 0; - int i; - if (gBattleExecBuffer) {return;} - - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) - HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); - } - - if (HP_count == 0) - gBattleOutcome |= BATTLE_LOST; - - for (HP_count = 0, i = 0; i < 6; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)) - HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP); - } - - if (!HP_count) - gBattleOutcome |= BATTLE_WON; - - if (!gBattleOutcome && (gBattleTypeFlags & BATTLE_TYPE_LINK)) - { - register int found1 asm("r2"); - register int found2 asm("r4"); - - //I can't for the love of god decompile that part - - for (found1 = 0, i = 0; i < gBattlersCount; i += 2) - { - if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40) - found1++; - } - - for (found2 = 0, i = 1; i < gBattlersCount; i += 2) - { - if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40) - found2++; - } - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (found2 + found1 > 1) - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; - } - else - { - if (found2 != 0 && found1 != 0) - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; - } - } - else - gBattlescriptCurrInstr += 5; - -} -#else -NAKED -static void atk24(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - movs r6, 0\n\ - ldr r0, _08020AF0 @ =gBattleExecBuffer\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _080209C6\n\ - b _08020B46\n\ -_080209C6:\n\ - movs r5, 0\n\ -_080209C8:\n\ - movs r0, 0x64\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, _08020AF4 @ =gPlayerParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _080209F8\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _080209F8\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - adds r0, r6, r0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ -_080209F8:\n\ - adds r5, 0x1\n\ - cmp r5, 0x5\n\ - ble _080209C8\n\ - cmp r6, 0\n\ - bne _08020A0C\n\ - ldr r0, _08020AF8 @ =gBattleOutcome\n\ - ldrb r1, [r0]\n\ - movs r2, 0x2\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_08020A0C:\n\ - movs r6, 0\n\ - movs r5, 0\n\ -_08020A10:\n\ - movs r0, 0x64\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, _08020AFC @ =gEnemyParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08020A40\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _08020A40\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - adds r0, r6, r0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ -_08020A40:\n\ - adds r5, 0x1\n\ - cmp r5, 0x5\n\ - ble _08020A10\n\ - ldr r2, _08020AF8 @ =gBattleOutcome\n\ - cmp r6, 0\n\ - bne _08020A54\n\ - ldrb r0, [r2]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ -_08020A54:\n\ - ldrb r0, [r2]\n\ - cmp r0, 0\n\ - bne _08020B3E\n\ - ldr r2, _08020B00 @ =gBattleTypeFlags\n\ - ldrh r1, [r2]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - mov r8, r2\n\ - cmp r0, 0\n\ - beq _08020B3E\n\ - movs r2, 0\n\ - movs r5, 0\n\ - ldr r0, _08020B04 @ =gBattlersCount\n\ - ldrb r3, [r0]\n\ - mov r12, r0\n\ - ldr r7, _08020B08 @ =gBattlescriptCurrInstr\n\ - cmp r2, r3\n\ - bge _08020AA0\n\ - ldr r0, _08020B0C @ =gHitMarker\n\ - movs r1, 0x80\n\ - lsls r1, 21\n\ - ldr r6, [r0]\n\ - adds r4, r3, 0\n\ - ldr r3, _08020B10 @ =gSpecialStatuses\n\ -_08020A84:\n\ - adds r0, r1, 0\n\ - lsls r0, r5\n\ - ands r0, r6\n\ - cmp r0, 0\n\ - beq _08020A98\n\ - ldrb r0, [r3]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08020A98\n\ - adds r2, 0x1\n\ -_08020A98:\n\ - adds r3, 0x28\n\ - adds r5, 0x2\n\ - cmp r5, r4\n\ - blt _08020A84\n\ -_08020AA0:\n\ - movs r4, 0\n\ - movs r5, 0x1\n\ - mov r0, r12\n\ - ldrb r3, [r0]\n\ - cmp r5, r3\n\ - bge _08020ADA\n\ - ldr r0, _08020B0C @ =gHitMarker\n\ - movs r1, 0x80\n\ - lsls r1, 21\n\ - mov r12, r1\n\ - ldr r1, [r0]\n\ - ldr r0, _08020B10 @ =gSpecialStatuses\n\ - adds r6, r3, 0\n\ - adds r3, r0, 0\n\ - adds r3, 0x14\n\ -_08020ABE:\n\ - mov r0, r12\n\ - lsls r0, r5\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08020AD2\n\ - ldrb r0, [r3]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08020AD2\n\ - adds r4, 0x1\n\ -_08020AD2:\n\ - adds r3, 0x28\n\ - adds r5, 0x2\n\ - cmp r5, r6\n\ - blt _08020ABE\n\ -_08020ADA:\n\ - mov r0, r8\n\ - ldrh r1, [r0]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08020B14\n\ - adds r0, r4, r2\n\ - cmp r0, 0x1\n\ - bgt _08020B1C\n\ - b _08020B36\n\ - .align 2, 0\n\ -_08020AF0: .4byte gBattleExecBuffer\n\ -_08020AF4: .4byte gPlayerParty\n\ -_08020AF8: .4byte gBattleOutcome\n\ -_08020AFC: .4byte gEnemyParty\n\ -_08020B00: .4byte gBattleTypeFlags\n\ -_08020B04: .4byte gBattlersCount\n\ -_08020B08: .4byte gBattlescriptCurrInstr\n\ -_08020B0C: .4byte gHitMarker\n\ -_08020B10: .4byte gSpecialStatuses\n\ -_08020B14:\n\ - cmp r4, 0\n\ - beq _08020B36\n\ - cmp r2, 0\n\ - beq _08020B36\n\ -_08020B1C:\n\ - ldr r2, [r7]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - adds r1, r0\n\ - str r1, [r7]\n\ - b _08020B46\n\ -_08020B36:\n\ - ldr r0, [r7]\n\ - adds r0, 0x5\n\ - str r0, [r7]\n\ - b _08020B46\n\ -_08020B3E:\n\ - ldr r1, _08020B50 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ -_08020B46:\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08020B50: .4byte gBattlescriptCurrInstr\n\ - .syntax divided\n"); -} -#endif - -static void MoveValuesCleanUp(void) -{ - gMoveResultFlags = 0; - gBattleStruct->dmgMultiplier = 1; - gCritMultiplier = 1; - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - gBattleCommunication[6] = 0; - gHitMarker &= ~(HITMARKER_DESTINYBOND); - gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); -} - -static void atk25_movevaluescleanup(void) -{ - MoveValuesCleanUp(); - gBattlescriptCurrInstr += 1; -} - -static void atk26_setmultihit(void) -{ - gMultiHitCounter = T2_READ_8(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr += 2; -} - -static void atk27_decrementmultihit(void) -{ - if (--gMultiHitCounter == 0) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atk28_goto(void) -{ - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atk29_jumpifbyte(void) -{ - u8 caseID = T2_READ_8(gBattlescriptCurrInstr + 1); - u8* ptr = T2_READ_PTR(gBattlescriptCurrInstr + 2); - u8 value = T2_READ_8(gBattlescriptCurrInstr + 6); - u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 7); - gBattlescriptCurrInstr += 11; - switch (caseID) - { - case CMP_EQUAL: - if (*ptr == value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NOT_EQUAL: - if (*ptr != value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_GREATER_THAN: - if (*ptr > value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_LESS_THAN: - if (*ptr < value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_COMMON_BITS: - if (*ptr & value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NO_COMMON_BITS: - if (!(*ptr & value)) - gBattlescriptCurrInstr = jump_loc; - break; - } -} - -static void atk2A_jumpifhalfword(void) -{ - u8 caseID = T2_READ_8(gBattlescriptCurrInstr + 1); - u16* ptr = T2_READ_PTR(gBattlescriptCurrInstr + 2); - u16 value = T2_READ_16(gBattlescriptCurrInstr + 6); - u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 8); - gBattlescriptCurrInstr += 12; - switch (caseID) - { - case CMP_EQUAL: - if (*ptr == value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NOT_EQUAL: - if (*ptr != value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_GREATER_THAN: - if (*ptr > value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_LESS_THAN: - if (*ptr < value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_COMMON_BITS: - if (*ptr & value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NO_COMMON_BITS: - if (!(*ptr & value)) - gBattlescriptCurrInstr = jump_loc; - break; - } -} - -// Strange that there's an instance of T1_READ_32 in what seems to be a T2 function. see global.h for the distinction. -static void atk2B_jumpifword(void) -{ - u8 caseID = T2_READ_8(gBattlescriptCurrInstr + 1); - u32* ptr = T2_READ_PTR(gBattlescriptCurrInstr + 2); - u32 value = T1_READ_32(gBattlescriptCurrInstr + 6); - u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 10); - gBattlescriptCurrInstr += 14; - switch (caseID) - { - case CMP_EQUAL: - if (*ptr == value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NOT_EQUAL: - if (*ptr != value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_GREATER_THAN: - if (*ptr > value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_LESS_THAN: - if (*ptr < value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_COMMON_BITS: - if (*ptr & value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NO_COMMON_BITS: - if (!(*ptr & value)) - gBattlescriptCurrInstr = jump_loc; - break; - } -} - -static void atk2C_jumpifarrayequal(void) -{ - //Mem1, Mem2, Size, Jump Loc - u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); - u32 size = T2_READ_8(gBattlescriptCurrInstr + 9); - u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 10); - - u8 i; - for (i = 0; i < size; i++) - { - if (*mem1 != *mem2) - { - gBattlescriptCurrInstr += 14; - break; - } - mem1++, mem2++; - } - - if (i == size) - gBattlescriptCurrInstr = jump_loc; -} - -static void atk2D_jumpifarraynotequal(void) -{ - //Mem1, Mem2, Size, Jump Loc - u8 equal_bytes = 0; - u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); - u32 size = T2_READ_8(gBattlescriptCurrInstr + 9); - u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 10); - - u8 i; - for (i = 0; i < size; i++) - { - if (*mem1 == *mem2) - { - equal_bytes++; - } - mem1++, mem2++; - } - - if (equal_bytes != size) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 14; -} - -static void atk2E_setbyte(void) -{ - u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - *mem = T2_READ_8(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr += 6; -} - -static void atk2F_addbyte(void) -{ - u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - *mem += T2_READ_8(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr += 6; -} - -static void atk30_subbyte(void) -{ - u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - *mem -= T2_READ_8(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr += 6; -} - -static void atk31_copyarray(void) -{ - u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); - s32 size = T2_READ_8(gBattlescriptCurrInstr + 9); - - s32 i; - for (i = 0; i < size; i++) - { - mem1[i] = mem2[i]; - } - - gBattlescriptCurrInstr += 10; -} - -static void atk32_copyarraywithindex(void) -{ - u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); - u8* index = T2_READ_PTR(gBattlescriptCurrInstr + 9); - s32 size = T2_READ_8(gBattlescriptCurrInstr + 13); - - s32 i; - for (i = 0; i < size; i++) - { - mem1[i] = mem2[i + *index]; - } - - gBattlescriptCurrInstr += 14; -} - -static void atk33_orbyte(void) -{ - u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - *mem |= T2_READ_8(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr += 6; -} - -static void atk34_orhalfword(void) -{ - u16* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u16 val = T2_READ_16(gBattlescriptCurrInstr + 5); - - *mem |= val; - gBattlescriptCurrInstr += 7; -} - -static void atk35_orword(void) -{ - u32* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u32 val = T2_READ_32(gBattlescriptCurrInstr + 5); - - *mem |= val; - gBattlescriptCurrInstr += 9; -} - -static void atk36_bicbyte(void) -{ - u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - *mem &= ~(T2_READ_8(gBattlescriptCurrInstr + 5)); - gBattlescriptCurrInstr += 6; -} - -static void atk37_bichalfword(void) -{ - u16* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u16 val = T2_READ_16(gBattlescriptCurrInstr + 5); - - *mem &= ~val; - gBattlescriptCurrInstr += 7; -} - -static void atk38_bicword(void) -{ - u32* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u32 val = T2_READ_32(gBattlescriptCurrInstr + 5); - - *mem &= ~val; - gBattlescriptCurrInstr += 9; -} - -static void atk39_pause(void) -{ - if (gBattleExecBuffer == 0) - { - u16 value = T2_READ_16(gBattlescriptCurrInstr + 1); - if (++gPauseCounterBattle >= value) - { - gPauseCounterBattle = 0; - gBattlescriptCurrInstr += 3; - } - } -} - -static void atk3A_waitstate(void) -{ - if (gBattleExecBuffer == 0) - gBattlescriptCurrInstr++; -} - -static void atk3B_healthbar_update(void) -{ - if (!T2_READ_8(gBattlescriptCurrInstr + 1)) - gActiveBattler = gBankTarget; - else - gActiveBattler = gBankAttacker; - - EmitHealthBarUpdate(0, gBattleMoveDamage); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk3C_return(void) -{ - BattleScriptPop(); -} - -static void atk3D_end(void) -{ - gMoveResultFlags = 0; - gActiveBattler = 0; - gCurrentActionFuncId = 0xB; -} - -static void atk3E_end2(void) -{ - //not much difference between this and 3D. It's more apparent in Emerald - gActiveBattler = 0; - gCurrentActionFuncId = 0xB; -} - -static void atk3F_end3(void) //pops the main function stack -{ - BattleScriptPop(); - if (B_FUNCTION_STACK->size) - B_FUNCTION_STACK->size--; - gBattleMainFunc = B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size]; -} - -static void atk41_call(void) -{ - BattleScriptPush(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atk42_jumpiftype2(void) //u8 bank, u8 type, *ptr -{ - u8 bank = GetBattleBank(T1_READ_8(gBattlescriptCurrInstr + 1)); - - if (T1_READ_8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type1 || T1_READ_8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type2) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - else - gBattlescriptCurrInstr += 7; -} - -static void atk43_jumpifabilitypresent(void) -{ - if (AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, T2_READ_8(gBattlescriptCurrInstr + 1), 0, 0)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; -} - -static void atk44_endselectionscript(void) -{ - ewram16060(gBankAttacker) = 1; -} - -static void atk45_playanimation(void) -{ - const u16* argumentPtr; - - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - argumentPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3); - - if (gBattlescriptCurrInstr[2] == B_ANIM_STATS_CHANGE - || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE - || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE) - { - EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 7; - } - else if (gHitMarker & HITMARKER_NO_ANIMATIONS) - { - BattleScriptPush(gBattlescriptCurrInstr + 7); - gBattlescriptCurrInstr = BattleScript_Pausex20; - } - else if (gBattlescriptCurrInstr[2] == B_ANIM_RAIN_CONTINUES - || gBattlescriptCurrInstr[2] == B_ANIM_SUN_CONTINUES - || gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES - || gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES) - { - EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 7; - } - else if (gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) - { - gBattlescriptCurrInstr += 7; - } - else - { - EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 7; - } -} - -static void atk46_playanimation2(void) // animation Id is stored in the first pointer -{ - const u16* argumentPtr; - const u8* animationIdPtr; - - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - animationIdPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); - argumentPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6); - - if (*animationIdPtr == B_ANIM_STATS_CHANGE - || *animationIdPtr == B_ANIM_SNATCH_MOVE - || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE) - { - EmitBattleAnimation(0, *animationIdPtr, *argumentPtr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 10; - } - else if (gHitMarker & HITMARKER_NO_ANIMATIONS) - { - gBattlescriptCurrInstr += 10; - } - else if (*animationIdPtr == B_ANIM_RAIN_CONTINUES - || *animationIdPtr == B_ANIM_SUN_CONTINUES - || *animationIdPtr == B_ANIM_SANDSTORM_CONTINUES - || *animationIdPtr == B_ANIM_HAIL_CONTINUES) - { - EmitBattleAnimation(0, *animationIdPtr, *argumentPtr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 10; - } - else if (gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) - { - gBattlescriptCurrInstr += 10; - } - else - { - EmitBattleAnimation(0, *animationIdPtr, *argumentPtr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 10; - } -} - -static void atk47_setgraphicalstatchangevalues(void) -{ - u8 to_add = 0; - switch (gBattleStruct->statChanger & 0xF0) - { - case 0x10: //+1 - to_add = 0xF; - break; - case 0x20: //+2 - to_add = 0x27; - break; - case 0x90: //-1 - to_add = 0x16; - break; - case 0xA0: //-2 - to_add = 0x2E; - break; - } - gBattleStruct->animArg1 = (gBattleStruct->statChanger & 0xF) + to_add - 1; - gBattleStruct->animArg2 = 0; - gBattlescriptCurrInstr++; -} - -#ifdef NONMATCHING -static void atk48_playstatchangeanimation(void) -{ - int curr_stat = 0; - u16 stat_animID = 0; - int changeable_stats = 0; - u32 stats_to_check; - u8 arg3; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - stats_to_check = T2_READ_8(gBattlescriptCurrInstr + 2); - arg3 = T2_READ_8(gBattlescriptCurrInstr + 3); - if (arg3 & 1) - { - u16 r1 = 0x15; - if (arg3 & 0x2) - r1 = 0x2D; - while (stats_to_check != 0) - { - if (!(stats_to_check & 1)) - continue; - if (!(T2_READ_8(gBattlescriptCurrInstr + 3))) - { - u8 ability; - if (gSideTimers[GetBattlerPosition(gActiveBattler) & 1].mistTimer) - continue; - ability = gBattleMons[gActiveBattler].ability; - if (ability == ABILITY_CLEAR_BODY || ability == ABILITY_WHITE_SMOKE || (ability == ABILITY_KEEN_EYE && curr_stat == 6) || (ability == ABILITY_HYPER_CUTTER && curr_stat == 1)) - continue; - } - if (gBattleMons[gActiveBattler].statStages[curr_stat] > 0) - { - stat_animID = r1; - changeable_stats++; - } - - stats_to_check >>= 1; - r1 += 1; - curr_stat++; - } - if (changeable_stats > 1 && T2_READ_8(gBattlescriptCurrInstr + 3) & 2) - stat_animID = 0x39; - else - stat_animID = 0x3A; - } - else - { - u16 r1 = 0x15; - if (arg3 & 0x2) - r1 = 0x2D; - while (stats_to_check != 0) - { - if (!(stats_to_check & 1)) - continue; - if (gBattleMons[gActiveBattler].statStages[curr_stat] < 0xB) - { - stat_animID = r1; - changeable_stats++; - } - - stats_to_check >>= 1; - r1 += 1; - curr_stat++; - } - if (changeable_stats > 1 && T2_READ_8(gBattlescriptCurrInstr + 3) & 2) - stat_animID = 0x37; - else - stat_animID = 0x38; - } - if ((T2_READ_8(gBattlescriptCurrInstr + 3) & 2 && changeable_stats <= 1) - || changeable_stats == 0 || gBattleStruct->filler2[0] != 0) - gBattlescriptCurrInstr += 4; - else - { - EmitBattleAnimation(0, 1, stat_animID); - MarkBufferBankForExecution(gActiveBattler); - if ((T2_READ_8(gBattlescriptCurrInstr + 3) & 4) && changeable_stats > 1) - gBattleStruct->filler2[0] = 1; - gBattlescriptCurrInstr += 4; - } -} - -#else -NAKED -static void atk48_playstatchangeanimation(void) -{ - asm(".syntax unified\n\ -push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - movs r7, 0\n\ - movs r0, 0\n\ - mov r8, r0\n\ - movs r3, 0\n\ - ldr r5, _08021670 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r5]\n\ - ldrb r0, [r0, 0x1]\n\ - str r3, [sp]\n\ - bl GetBattleBank\n\ - ldr r2, _08021674 @ =gActiveBattler\n\ - strb r0, [r2]\n\ - ldr r0, [r5]\n\ - ldrb r4, [r0, 0x2]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - ldr r3, [sp]\n\ - cmp r0, 0\n\ - beq _08021710\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - movs r1, 0x15\n\ - cmp r0, 0\n\ - beq _0802163C\n\ - movs r1, 0x2D\n\ -_0802163C:\n\ - cmp r4, 0\n\ - beq _080216E4\n\ - movs r0, 0x1\n\ - mov r10, r0\n\ - ldr r0, _08021678 @ =gBattleMons+0x18 @ gBattleMons.statStages\n\ - mov r9, r0\n\ - lsls r5, r1, 16\n\ -_0802164A:\n\ - adds r0, r4, 0\n\ - mov r1, r10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080216D6\n\ - ldr r0, _08021670 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802167C\n\ - ldr r0, _08021674 @ =gActiveBattler\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r7, r0\n\ - b _080216C4\n\ - .align 2, 0\n\ -_08021670: .4byte gBattlescriptCurrInstr\n\ -_08021674: .4byte gActiveBattler\n\ -_08021678: .4byte gBattleMons+0x18 @ gBattleMons.statStages\n\ -_0802167C:\n\ - ldr r6, _08021700 @ =gActiveBattler\n\ - ldrb r0, [r6]\n\ - str r3, [sp]\n\ - bl GetBattlerPosition\n\ - mov r1, r10\n\ - ands r1, r0\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _08021704 @ =gSideTimers\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - ldr r3, [sp]\n\ - cmp r0, 0\n\ - bne _080216D6\n\ - ldr r0, _08021708 @ =gBattleMons\n\ - ldrb r2, [r6]\n\ - movs r1, 0x58\n\ - muls r2, r1\n\ - adds r0, r2, r0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1D\n\ - beq _080216D6\n\ - cmp r0, 0x49\n\ - beq _080216D6\n\ - cmp r0, 0x33\n\ - bne _080216BA\n\ - cmp r7, 0x6\n\ - beq _080216D6\n\ -_080216BA:\n\ - cmp r0, 0x34\n\ - bne _080216C2\n\ - cmp r7, 0x1\n\ - beq _080216D6\n\ -_080216C2:\n\ - adds r0, r7, r2\n\ -_080216C4:\n\ - add r0, r9\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0\n\ - ble _080216D6\n\ - lsrs r0, r5, 16\n\ - mov r8, r0\n\ - adds r3, 0x1\n\ -_080216D6:\n\ - lsrs r4, 1\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - adds r5, r1\n\ - adds r7, 0x1\n\ - cmp r4, 0\n\ - bne _0802164A\n\ -_080216E4:\n\ - ldr r0, _0802170C @ =gBattlescriptCurrInstr\n\ - mov r9, r0\n\ - cmp r3, 0x1\n\ - ble _08021772\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - movs r1, 0x39\n\ - mov r8, r1\n\ - cmp r0, 0\n\ - beq _08021772\n\ - movs r0, 0x3A\n\ - b _08021770\n\ - .align 2, 0\n\ -_08021700: .4byte gActiveBattler\n\ -_08021704: .4byte gSideTimers\n\ -_08021708: .4byte gBattleMons\n\ -_0802170C: .4byte gBattlescriptCurrInstr\n\ -_08021710:\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - movs r1, 0xE\n\ - cmp r0, 0\n\ - beq _0802171C\n\ - movs r1, 0x26\n\ -_0802171C:\n\ - mov r9, r5\n\ - cmp r4, 0\n\ - beq _08021758\n\ - ldr r6, _0802178C @ =gBattleMons+0x18 @ gBattleMons.statStages\n\ - adds r5, r2, 0\n\ - lsls r2, r1, 16\n\ -_08021728:\n\ - movs r0, 0x1\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - beq _0802174A\n\ - ldrb r1, [r5]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r7, r0\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0xB\n\ - bgt _0802174A\n\ - lsrs r1, r2, 16\n\ - mov r8, r1\n\ - adds r3, 0x1\n\ -_0802174A:\n\ - lsrs r4, 1\n\ - movs r0, 0x80\n\ - lsls r0, 9\n\ - adds r2, r0\n\ - adds r7, 0x1\n\ - cmp r4, 0\n\ - bne _08021728\n\ -_08021758:\n\ - cmp r3, 0x1\n\ - ble _08021772\n\ - mov r1, r9\n\ - ldr r0, [r1]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - movs r1, 0x37\n\ - mov r8, r1\n\ - cmp r0, 0\n\ - beq _08021772\n\ - movs r0, 0x38\n\ -_08021770:\n\ - mov r8, r0\n\ -_08021772:\n\ - mov r1, r9\n\ - ldr r2, [r1]\n\ - ldrb r1, [r2, 0x3]\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021790\n\ - cmp r3, 0x1\n\ - bgt _08021790\n\ - adds r0, r2, 0x4\n\ - mov r1, r9\n\ - b _080217E6\n\ - .align 2, 0\n\ -_0802178C: .4byte gBattleMons+0x18 @ gBattleMons.statStages\n\ -_08021790:\n\ - cmp r3, 0\n\ - beq _080217E0\n\ - ldr r0, _080217D0 @ =gSharedMem\n\ - ldr r1, _080217D4 @ =0x000160dc\n\ - adds r4, r0, r1\n\ - ldrb r0, [r4]\n\ - cmp r0, 0\n\ - bne _080217E0\n\ - movs r0, 0\n\ - movs r1, 0x1\n\ - mov r2, r8\n\ - str r3, [sp]\n\ - bl EmitBattleAnimation\n\ - ldr r0, _080217D8 @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, _080217DC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - ldr r3, [sp]\n\ - cmp r0, 0\n\ - beq _080217CC\n\ - cmp r3, 0x1\n\ - ble _080217CC\n\ - movs r0, 0x1\n\ - strb r0, [r4]\n\ -_080217CC:\n\ - ldr r1, _080217DC @ =gBattlescriptCurrInstr\n\ - b _080217E2\n\ - .align 2, 0\n\ -_080217D0: .4byte gSharedMem\n\ -_080217D4: .4byte 0x000160dc\n\ -_080217D8: .4byte gActiveBattler\n\ -_080217DC: .4byte gBattlescriptCurrInstr\n\ -_080217E0:\n\ - mov r1, r9\n\ -_080217E2:\n\ - ldr r0, [r1]\n\ - adds r0, 0x4\n\ -_080217E6:\n\ - str r0, [r1]\n\ - add sp, 0x4\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\ - .syntax divided"); -} - -#endif // NONMATCHING - -#define BattleScript_FlushMessageBox gUnknown_081D9B2D - -extern u8 BattleScript_RageIsBuilding[]; -extern u8 BattleScript_DefrostedViaFireMove[]; -extern u8 BattleScript_FlushMessageBox[]; - -// atk49, moveend cases -#define ATK49_RAGE 0 -#define ATK49_DEFROST 1 -#define ATK49_SYNCHRONIZE_TARGET 2 -#define ATK49_MOVE_END_ABILITIES 3 -#define ATK49_STATUS_IMMUNITY_ABILITIES 4 -#define ATK49_SYNCHRONIZE_ATTACKER 5 -#define ATK49_CHOICE_MOVE 6 -#define ATK49_CHANGED_ITEMS 7 -#define ATK49_ATTACKER_INVISIBLE 8 -#define ATK49_ATTACKER_VISIBLE 9 -#define ATK49_TARGET_VISIBLE 10 -#define ATK49_ITEM_EFFECTS_ALL 11 -#define ATK49_KINGSROCK_SHELLBELL 12 -#define ATK49_SUBSTITUTE 13 -#define ATK49_UPDATE_LAST_MOVES 14 -#define ATK49_MIRROR_MOVE 15 -#define ATK49_NEXT_TARGET 16 -#define ATK49_COUNT 17 - -void atk49_moveend(void) -{ - int i; - bool32 effect = FALSE; - u16 moveType; - u8 holdEffectAtk; - u16 *choicedMoveAtk; - u8 arg1, arg2; - - arg1 = T2_READ_8(gBattlescriptCurrInstr + 1); - arg2 = T2_READ_8(gBattlescriptCurrInstr + 2); - - if (gBattleMons[gBankAttacker].item == ITEM_ENIGMA_BERRY) - holdEffectAtk = gEnigmaBerries[gBankAttacker].holdEffect; - else - holdEffectAtk = ItemId_GetHoldEffect(gBattleMons[gBankAttacker].item); - - choicedMoveAtk = &((u16*)(gSharedMem + 0x160E8))[gBankAttacker]; - GET_MOVE_TYPE(gCurrentMove, moveType); - - do - { - switch (gBattleStruct->cmd49StateTracker) - { - case ATK49_RAGE: // rage check - if (gBattleMons[gBankTarget].status2 & STATUS2_RAGE - && gBattleMons[gBankTarget].hp != 0 && gBankAttacker != gBankTarget - && GetBattlerSide(gBankAttacker) != GetBattlerSide(gBankTarget) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && (gProtectStructs[gBankTarget].physicalDmg != 0 || gProtectStructs[gBankTarget].specialDmg != 0) - && gBattleMoves[gCurrentMove].power && gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] <= 0xB) - { - gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK]++; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RageIsBuilding; - effect = TRUE; - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_DEFROST: // defrosting check - if (gBattleMons[gBankTarget].status1 & STATUS_FREEZE - && gBattleMons[gBankTarget].hp && gBankAttacker != gBankTarget - && gSpecialStatuses[gBankTarget].moveturnLostHP_special - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && moveType == TYPE_FIRE) - { - gBattleMons[gBankTarget].status1 &= ~(STATUS_FREEZE); - gActiveBattler = gBankTarget; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); - MarkBufferBankForExecution(gActiveBattler); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; - effect = TRUE; - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_SYNCHRONIZE_TARGET: // target synchronize - if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBankTarget, 0, 0, 0)) - effect = TRUE; - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_MOVE_END_ABILITIES: // Such as abilities activating on contact(Poison Spore, Rough Skin, etc.). - if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END, gBankTarget, 0, 0, 0)) - effect = TRUE; - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_STATUS_IMMUNITY_ABILITIES: //status immunities - if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0)) - effect = TRUE; //it loops through 4 banks, so we increment after its done with all banks - else - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_SYNCHRONIZE_ATTACKER: //attacker synchronize - if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBankAttacker, 0, 0, 0)) - effect = TRUE; - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_CHOICE_MOVE: //update choice band move - if (!(gHitMarker & HITMARKER_OBEYS) || holdEffectAtk != HOLD_EFFECT_CHOICE_BAND - || gChosenMove == MOVE_STRUGGLE || (*choicedMoveAtk != 0 && *choicedMoveAtk != 0xFFFF)) - goto LOOP; - if (gChosenMove == MOVE_BATON_PASS && !(gMoveResultFlags & MOVE_RESULT_FAILED)) - { - gBattleStruct->cmd49StateTracker++; - break; - } - *choicedMoveAtk = gChosenMove; - LOOP: - { - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankAttacker].moves[i] == *choicedMoveAtk) - break; - } - if (i == 4) - *choicedMoveAtk = 0; - gBattleStruct->cmd49StateTracker++; - } - break; - case ATK49_CHANGED_ITEMS: // changed held items - for (i = 0; i < gBattlersCount; i++) - { - #define CHANGED_ITEM ((u16 *)(gSharedMem + 0x160F0)) - if (CHANGED_ITEM[i] != 0) - { - gBattleMons[i].item = CHANGED_ITEM[i]; - CHANGED_ITEM[i] = 0; - } - #undef CHANGED_ITEM - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_ATTACKER_INVISIBLE: // make attacker sprite invisible - if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0, FALSE)) - effect = TRUE; - else - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_ATTACKER_VISIBLE: // make attacker sprite visible - if (ItemBattleEffects(ITEMEFFECT_KINGSROCK_SHELLBELL, 0, FALSE)) - effect = TRUE; - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_TARGET_VISIBLE: // make target sprite visible - if ((gStatuses3[gBankAttacker] & 0x400C0) && (gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - gActiveBattler = gBankAttacker; - EmitSpriteInvisibility(0, 1); - MarkBufferBankForExecution(gActiveBattler); - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_ITEM_EFFECTS_ALL: // item effects for all battlers - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT - || !(gStatuses3[gBankAttacker] & (STATUS3_SEMI_INVULNERABLE)) - || WasUnableToUseMove(gBankAttacker)) - { - gActiveBattler = gBankAttacker; - EmitSpriteInvisibility(0, FALSE); - MarkBufferBankForExecution(gActiveBattler); - gStatuses3[gBankAttacker] &= ~(STATUS3_SEMI_INVULNERABLE); - gSpecialStatuses[gBankAttacker].restoredBankSprite = 1; - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_KINGSROCK_SHELLBELL: // king's rock and shell bell - if (!gSpecialStatuses[gBankTarget].restoredBankSprite && gBankTarget < gBattlersCount - && !(gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE)) - { - gActiveBattler = gBankTarget; - EmitSpriteInvisibility(0, FALSE); - MarkBufferBankForExecution(gActiveBattler); - gStatuses3[gBankTarget] &= ~(STATUS3_SEMI_INVULNERABLE); - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_SUBSTITUTE: // update substitute - for (i = 0; i < gBattlersCount; i++) - { - if (gDisableStructs[i].substituteHP == 0) - gBattleMons[i].status2 &= ~(STATUS2_SUBSTITUTE); - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_UPDATE_LAST_MOVES: - if (gHitMarker & HITMARKER_PURSUIT_TRAP) - { - gActiveBattler = gBankAttacker; - gBankAttacker = gBankTarget; - gBankTarget = gActiveBattler; - gHitMarker &= ~(HITMARKER_PURSUIT_TRAP); - } - - if (gBattleMoves[gChosenMove].effect != 0x7F || (gMoveResultFlags & 0x29)) - gUnknown_02024C2C[gBankAttacker] = gChosenMove; - - if (!(gAbsentBattlerFlags & gBitTable[gBankAttacker]) - && !(gSharedMem[0x160A6] & gBitTable[gBankAttacker]) - && gBattleMoves[gChosenMove].effect != EFFECT_BATON_PASS) - { - if (gHitMarker & HITMARKER_OBEYS) - { - gLastUsedMove[gBankAttacker] = gChosenMove; - gUnknown_02024C4C[gBankAttacker] = gCurrentMove; - } - else - { - gLastUsedMove[gBankAttacker] = 0xFFFF; - gUnknown_02024C4C[gBankAttacker] = 0xFFFF; - } - - if (!(gHitMarker & HITMARKER_FAINTED(gBankTarget))) - gLastHitBy[gBankTarget] = gBankAttacker; - - if (gHitMarker & HITMARKER_OBEYS && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - if (gChosenMove == 0xFFFF) - { - gLastLandedMoves[gBankTarget] = gChosenMove; - } - else - { - gLastLandedMoves[gBankTarget] = gCurrentMove; - GET_MOVE_TYPE(gCurrentMove, gLastHitByType[gBankTarget]); - } - } - else - { - gLastLandedMoves[gBankTarget] = 0xFFFF; - } - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_MIRROR_MOVE: - if (!(gAbsentBattlerFlags & gBitTable[gBankAttacker]) && !(gSharedMem[0x160A6] & gBitTable[gBankAttacker])) - { - if (gBattleMoves[gChosenMove].flags & 0x10 && gHitMarker & HITMARKER_OBEYS - && gBankAttacker != gBankTarget && !(gHitMarker & HITMARKER_FAINTED(gBankTarget)) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gSharedMem[0x160AC + gBankTarget * 2 + 0] = gChosenMove; - gSharedMem[0x160AC + gBankTarget * 2 + 1] = gChosenMove >> 8; - - gSharedMem[0x16100 + gBankTarget * 4 + 0 + (gBankAttacker / 2) * 2] = gChosenMove; - gSharedMem[0x16100 + gBankTarget * 4 + 1 + (gBankAttacker / 2) * 2] = gChosenMove >> 8; - } - else if (gBankAttacker != gBankTarget) - { - gSharedMem[0x160AC + gBankTarget * 2 + 0] = 0; - gSharedMem[0x160AC + gBankTarget * 2 + 1] = 0; - - gSharedMem[0x16100 + gBankTarget * 4 + 0 + (gBankAttacker / 2) * 2] = 0; - gSharedMem[0x16100 + gBankTarget * 4 + 1 + (gBankAttacker / 2) * 2] = 0; - } - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_NEXT_TARGET: - if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && !gProtectStructs[gBankAttacker].chargingTurn && gBattleMoves[gCurrentMove].target == MOVE_TARGET_BOTH - && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) - { - u8 battlerId = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBankTarget))); - if (gBattleMons[battlerId].hp != 0) - { - gBankTarget = battlerId; - gHitMarker |= HITMARKER_NO_ATTACKSTRING; - gBattleStruct->cmd49StateTracker = 0; - MoveValuesCleanUp(); - BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); - gBattlescriptCurrInstr = BattleScript_FlushMessageBox; - return; - } - else - { - gHitMarker |= HITMARKER_NO_ATTACKSTRING; - } - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_COUNT: - break; - } - - if (arg1 == 1 && effect == FALSE) - gBattleStruct->cmd49StateTracker = ATK49_COUNT; - if (arg1 == 2 && arg2 == gBattleStruct->cmd49StateTracker) - gBattleStruct->cmd49StateTracker = ATK49_COUNT; - - } while (gBattleStruct->cmd49StateTracker != ATK49_COUNT && effect == FALSE); - - if (gBattleStruct->cmd49StateTracker == ATK49_COUNT && effect == FALSE) - gBattlescriptCurrInstr += 3; -} - -static void atk4A_typecalc2(void) -{ - u8 flags = 0; - int i = 0; - u8 move_type = gBattleMoves[gCurrentMove].type; - - if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); - gLastLandedMoves[gBankTarget] = 0; - gBattleCommunication[6] = move_type; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) {break;} - else {i += 3; continue;} - } - - if (gTypeEffectiveness[i] == move_type) - { - //check type1 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) - { - if (gTypeEffectiveness[i + 2] == 0) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - break; - } - if (gTypeEffectiveness[i + 2] == 5) - flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - if (gTypeEffectiveness[i + 2] == 20) - flags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - //check type2 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2) - { - if (gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 - && gTypeEffectiveness[i + 2] == 0) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - break; - } - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && gTypeEffectiveness[i + 2] == 5) - flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 - && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && gTypeEffectiveness[i + 2] == 20) - flags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - } - i += 3; - } - } - - if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && !(flags & MOVE_RESULT_NO_EFFECT) && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 && - (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) && - gBattleMoves[gCurrentMove].power) - { - gLastUsedAbility = ABILITY_WONDER_GUARD; - gMoveResultFlags |= MOVE_RESULT_MISSED; - gLastLandedMoves[gBankTarget] = 0; - gBattleCommunication[6] = 3; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) - gProtectStructs[gBankAttacker].notEffective = 1; - - gBattlescriptCurrInstr++; -} - -static void atk4B_returnatktoball(void) -{ - gActiveBattler = gBankAttacker; - if (!(gHitMarker & HITMARKER_FAINTED(gActiveBattler))) - { - EmitReturnPokeToBall(0, 0); - MarkBufferBankForExecution(gActiveBattler); - } - gBattlescriptCurrInstr++; -} - -static void atk4C_getswitchedmondata(void) -{ - if (gBattleExecBuffer) - return; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - - gBattlerPartyIndexes[gActiveBattler] = ewram16068arr(gActiveBattler); - - EmitGetAttributes(0, 0, gBitTable[gBattlerPartyIndexes[gActiveBattler]]); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk4D_switchindataupdate(void) -{ - struct BattlePokemon oldData; - s32 i; - u8 *monData; - - if (gBattleExecBuffer) - return; - - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - oldData = gBattleMons[gActiveBattler]; - monData = (u8*)(&gBattleMons[gActiveBattler]); - - for (i = 0; i < sizeof(struct BattlePokemon); i++) - { - monData[i] = gBattleBufferB[gActiveBattler][4 + i]; - } - - gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; - gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; - gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].altAbility); - - // check knocked off item - i = GetBattlerSide(gActiveBattler); - if (gWishFutureKnock.knockedOffPokes[i] & gBitTable[gBattlerPartyIndexes[gActiveBattler]]) - { - gBattleMons[gActiveBattler].item = 0; - } - - if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) - { - for (i = 0; i < 8; i++) - { - gBattleMons[gActiveBattler].statStages[i] = oldData.statStages[i]; - } - gBattleMons[gActiveBattler].status2 = oldData.status2; - } - - SwitchInClearSetData(); - - gBattleStruct->scriptingActive = gActiveBattler; - - PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]); - - gBattlescriptCurrInstr += 2; -} - -static void atk4E_switchinanim(void) -{ - if (gBattleExecBuffer) - return; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (GetBattlerSide(gActiveBattler) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER))) - { - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), 2); - } - gAbsentBattlerFlags &= ~(gBitTable[gActiveBattler]); - EmitSendOutPoke(0, gBattlerPartyIndexes[gActiveBattler], T2_READ_8(gBattlescriptCurrInstr + 2)); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 3; -} - -static void atk4F_jumpifcantswitch(void) -{ - int val, to_cmp; - register struct Pokemon *party; - u8 r7; - //0x80 byte is used as a way of telling the function whether to not check status2/status3 - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1) & 0x7F); - if (!(T2_READ_8(gBattlescriptCurrInstr + 1) & 0x80) - && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) - || (gStatuses3[gActiveBattler] & STATUS3_ROOTED))) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - return; - } - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (GetBattlerSide(gActiveBattler) == 1) - party = gEnemyParty; - else - party = gPlayerParty; - val = 0; - if (sub_803FBFC(sub_803FC34(gActiveBattler)) == 1) - val = 3; - for (to_cmp = val + 3; val < to_cmp; val++) - { - if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[val], MON_DATA_IS_EGG) - && GetMonData(&party[val], MON_DATA_HP) != 0 - && gBattlerPartyIndexes[gActiveBattler] != val) - break; - } - if (val == to_cmp) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; - } - else - { - if (GetBattlerSide(gActiveBattler) == 1) - { - r7 = GetBattlerAtPosition(1); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - to_cmp = GetBattlerAtPosition(3); - else - to_cmp = r7; - party = gEnemyParty; - } - else - { - r7 = GetBattlerAtPosition(0); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - to_cmp = GetBattlerAtPosition(2); - else - to_cmp = r7; - party = gPlayerParty; - } - for (val = 0; val < 6; val++) - { - if (GetMonData(&party[val], MON_DATA_HP) != 0 - && GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[val], MON_DATA_IS_EGG) - && val != gBattlerPartyIndexes[r7] && val != gBattlerPartyIndexes[to_cmp]) - break; - } - if (val == 6) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; - } -} - -void sub_8022A3C(u8 unkown) -{ - BATTLE_PARTY_ID(gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; - EmitChoosePokemon(0, 1, unkown, 0, gBattleStruct->unk1606C[gActiveBattler]); - MarkBufferBankForExecution(gActiveBattler); -} - -/* -static void atk50_openpartyscreen(void) -{ - int i = 0; - int r9 = 0; - u8* fail_loc = T1_READ_PTR(gBattlescriptCurrInstr + 2); - - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 5) - { - if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) - { - for (gActiveBattler = i; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (!(gHitMarker & HITMARKER_FAINTED(gActiveBattler))) - { - EmitLinkStandbyMsg(0, 2); - MarkBufferBankForExecution(gActiveBattler); - } - else if (sub_8018018(gActiveBattler, 6, 6) == 0 - && !gSpecialStatuses[gActiveBattler].flag40) - { - sub_8022A3C(6); - gSpecialStatuses[gActiveBattler].flag40 = 1; - } - else - { - gAbsentBattlerFlags |= gBitTable[gActiveBattler]; - gHitMarker &= (~HITMARKER_FAINTED(gActiveBattler)); - EmitLinkStandbyMsg(0, 2); - MarkBufferBankForExecution(gActiveBattler); - } - } - } - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - if (!(gHitMarker >> 0x1C & gBitTable[0])) - { - - } - else if (sub_8018018(gActiveBattler, 6, 6) == 0 - && !gSpecialStatuses[gActiveBattler].flag40) - { - - } - else - { - - } - } - } -} -*/ - -NAKED -static void atk50_openpartyscreen(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x4\n\ - movs r7, 0\n\ - movs r0, 0\n\ - mov r9, r0\n\ - ldr r6, _08022B44 @ =gBattlescriptCurrInstr\n\ - ldr r1, [r6]\n\ - ldrb r2, [r1, 0x2]\n\ - ldrb r0, [r1, 0x3]\n\ - lsls r0, 8\n\ - orrs r2, r0\n\ - ldrb r0, [r1, 0x4]\n\ - lsls r0, 16\n\ - orrs r2, r0\n\ - ldrb r0, [r1, 0x5]\n\ - lsls r0, 24\n\ - orrs r2, r0\n\ - mov r8, r2\n\ - ldrb r2, [r1, 0x1]\n\ - adds r0, r2, 0\n\ - mov r12, r6\n\ - cmp r0, 0x5\n\ - beq _08022ACE\n\ - b _08022F74\n\ -_08022ACE:\n\ - ldr r0, _08022B48 @ =gBattleTypeFlags\n\ - ldrh r0, [r0]\n\ - movs r1, 0x41\n\ - ands r1, r0\n\ - cmp r1, 0x1\n\ - beq _08022BBC\n\ - ldr r1, _08022B4C @ =gActiveBattler\n\ - strb r7, [r1]\n\ - ldr r0, _08022B50 @ =gBattlersCount\n\ - ldrb r0, [r0]\n\ - cmp r7, r0\n\ - bcc _08022AE8\n\ - b _08022F62\n\ -_08022AE8:\n\ - ldr r7, _08022B54 @ =gHitMarker\n\ - ldr r6, _08022B58 @ =gBitTable\n\ - adds r4, r1, 0\n\ - ldr r0, _08022B5C @ =gAbsentBattlerFlags\n\ - mov r8, r0\n\ -_08022AF2:\n\ - ldrb r2, [r4]\n\ - lsls r0, r2, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r7]\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08022B94\n\ - adds r0, r2, 0\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022B60\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r7]\n\ - bics r0, r1\n\ - str r0, [r7]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022BA2\n\ - .align 2, 0\n\ -_08022B44: .4byte gBattlescriptCurrInstr\n\ -_08022B48: .4byte gBattleTypeFlags\n\ -_08022B4C: .4byte gActiveBattler\n\ -_08022B50: .4byte gBattlersCount\n\ -_08022B54: .4byte gHitMarker\n\ -_08022B58: .4byte gBitTable\n\ -_08022B5C: .4byte gAbsentBattlerFlags\n\ -_08022B60:\n\ - ldr r5, _08022B90 @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022BA2\n\ - movs r0, 0x6\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022BA2\n\ - .align 2, 0\n\ -_08022B90: .4byte gSpecialStatuses\n\ -_08022B94:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08022BA2:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - ldr r1, _08022BB8 @ =gBattlersCount\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _08022AF2\n\ - b _08022F62\n\ - .align 2, 0\n\ -_08022BB8: .4byte gBattlersCount\n\ -_08022BBC:\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _08022BC4\n\ - b _08022F62\n\ -_08022BC4:\n\ - ldr r0, _08022C1C @ =gHitMarker\n\ - mov r8, r0\n\ - ldr r0, [r0]\n\ - lsrs r5, r0, 28\n\ - ldr r6, _08022C20 @ =gBitTable\n\ - ldr r0, [r6]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08022C7E\n\ - ldr r4, _08022C24 @ =gActiveBattler\n\ - strb r7, [r4]\n\ - movs r0, 0\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022C2C\n\ - ldr r2, _08022C28 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - mov r2, r8\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl Emitcmd42\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022C7E\n\ - .align 2, 0\n\ -_08022C1C: .4byte gHitMarker\n\ -_08022C20: .4byte gBitTable\n\ -_08022C24: .4byte gActiveBattler\n\ -_08022C28: .4byte gAbsentBattlerFlags\n\ -_08022C2C:\n\ - ldr r6, _08022C60 @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022C6C\n\ - ldr r0, _08022C64 @ =gSharedMem\n\ - ldr r1, _08022C68 @ =0x0001606a\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022C7E\n\ - .align 2, 0\n\ -_08022C60: .4byte gSpecialStatuses\n\ -_08022C64: .4byte gSharedMem\n\ -_08022C68: .4byte 0x0001606a\n\ -_08022C6C:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - movs r2, 0x1\n\ - mov r9, r2\n\ -_08022C7E:\n\ - ldr r6, _08022CD8 @ =gBitTable\n\ - ldr r0, [r6, 0x8]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08022D40\n\ - ldr r0, [r6]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - bne _08022D40\n\ - ldr r4, _08022CDC @ =gActiveBattler\n\ - movs r0, 0x2\n\ - strb r0, [r4]\n\ - movs r0, 0x2\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022CE8\n\ - ldr r2, _08022CE0 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _08022CE4 @ =gHitMarker\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl Emitcmd42\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022D40\n\ - .align 2, 0\n\ -_08022CD8: .4byte gBitTable\n\ -_08022CDC: .4byte gActiveBattler\n\ -_08022CE0: .4byte gAbsentBattlerFlags\n\ -_08022CE4: .4byte gHitMarker\n\ -_08022CE8:\n\ - ldr r6, _08022D1C @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022D28\n\ - ldr r0, _08022D20 @ =gSharedMem\n\ - ldr r1, _08022D24 @ =0x00016068\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022D40\n\ - .align 2, 0\n\ -_08022D1C: .4byte gSpecialStatuses\n\ -_08022D20: .4byte gSharedMem\n\ -_08022D24: .4byte 0x00016068\n\ -_08022D28:\n\ - movs r0, 0x1\n\ - mov r2, r9\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _08022D40\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08022D40:\n\ - ldr r6, _08022D90 @ =gBitTable\n\ - ldr r0, [r6, 0x4]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08022DF6\n\ - ldr r4, _08022D94 @ =gActiveBattler\n\ - movs r0, 0x1\n\ - strb r0, [r4]\n\ - movs r0, 0x1\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022DA0\n\ - ldr r2, _08022D98 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _08022D9C @ =gHitMarker\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl Emitcmd42\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022DF6\n\ - .align 2, 0\n\ -_08022D90: .4byte gBitTable\n\ -_08022D94: .4byte gActiveBattler\n\ -_08022D98: .4byte gAbsentBattlerFlags\n\ -_08022D9C: .4byte gHitMarker\n\ -_08022DA0:\n\ - ldr r6, _08022DD4 @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022DE0\n\ - ldr r0, _08022DD8 @ =gSharedMem\n\ - ldr r1, _08022DDC @ =0x0001606b\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022DF6\n\ - .align 2, 0\n\ -_08022DD4: .4byte gSpecialStatuses\n\ -_08022DD8: .4byte gSharedMem\n\ -_08022DDC: .4byte 0x0001606b\n\ -_08022DE0:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - movs r0, 0x2\n\ - mov r2, r9\n\ - orrs r2, r0\n\ - mov r9, r2\n\ -_08022DF6:\n\ - ldr r6, _08022E50 @ =gBitTable\n\ - ldr r0, [r6, 0xC]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08022EB8\n\ - ldr r0, [r6, 0x4]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - bne _08022EB8\n\ - ldr r4, _08022E54 @ =gActiveBattler\n\ - movs r0, 0x3\n\ - strb r0, [r4]\n\ - movs r0, 0x3\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022E60\n\ - ldr r2, _08022E58 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _08022E5C @ =gHitMarker\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl Emitcmd42\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022EB8\n\ - .align 2, 0\n\ -_08022E50: .4byte gBitTable\n\ -_08022E54: .4byte gActiveBattler\n\ -_08022E58: .4byte gAbsentBattlerFlags\n\ -_08022E5C: .4byte gHitMarker\n\ -_08022E60:\n\ - ldr r6, _08022E94 @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022EA0\n\ - ldr r0, _08022E98 @ =gSharedMem\n\ - ldr r1, _08022E9C @ =0x00016069\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022EB8\n\ - .align 2, 0\n\ -_08022E94: .4byte gSpecialStatuses\n\ -_08022E98: .4byte gSharedMem\n\ -_08022E9C: .4byte 0x00016069\n\ -_08022EA0:\n\ - movs r0, 0x2\n\ - mov r2, r9\n\ - ands r2, r0\n\ - cmp r2, 0\n\ - bne _08022EB8\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08022EB8:\n\ - ldr r1, _08022EE8 @ =gSpecialStatuses\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022F0C\n\ - adds r0, r1, 0\n\ - adds r0, 0x28\n\ - ldrb r0, [r0]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022F0C\n\ - cmp r5, 0\n\ - beq _08022F0C\n\ - ldr r0, _08022EEC @ =gAbsentBattlerFlags\n\ - ldrb r1, [r0]\n\ - ldr r0, _08022EF0 @ =gBitTable\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _08022EF8\n\ - ldr r1, _08022EF4 @ =gActiveBattler\n\ - movs r0, 0x2\n\ - strb r0, [r1]\n\ - b _08022EFC\n\ - .align 2, 0\n\ -_08022EE8: .4byte gSpecialStatuses\n\ -_08022EEC: .4byte gAbsentBattlerFlags\n\ -_08022EF0: .4byte gBitTable\n\ -_08022EF4: .4byte gActiveBattler\n\ -_08022EF8:\n\ - ldr r0, _08022F3C @ =gActiveBattler\n\ - strb r1, [r0]\n\ -_08022EFC:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldr r0, _08022F3C @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - bl MarkBufferBankForExecution\n\ -_08022F0C:\n\ - ldr r1, _08022F40 @ =gSpecialStatuses\n\ - ldrb r0, [r1, 0x14]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022F62\n\ - adds r0, r1, 0\n\ - adds r0, 0x3C\n\ - ldrb r0, [r0]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022F62\n\ - cmp r5, 0\n\ - beq _08022F62\n\ - ldr r0, _08022F44 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r0]\n\ - ldr r1, _08022F48 @ =gBitTable\n\ - ldr r1, [r1, 0x4]\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08022F4C\n\ - ldr r1, _08022F3C @ =gActiveBattler\n\ - movs r0, 0x3\n\ - b _08022F50\n\ - .align 2, 0\n\ -_08022F3C: .4byte gActiveBattler\n\ -_08022F40: .4byte gSpecialStatuses\n\ -_08022F44: .4byte gAbsentBattlerFlags\n\ -_08022F48: .4byte gBitTable\n\ -_08022F4C:\n\ - ldr r1, _08022F6C @ =gActiveBattler\n\ - movs r0, 0x1\n\ -_08022F50:\n\ - strb r0, [r1]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldr r0, _08022F6C @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - bl MarkBufferBankForExecution\n\ -_08022F62:\n\ - ldr r1, _08022F70 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x6\n\ - str r0, [r1]\n\ - b _08023302\n\ - .align 2, 0\n\ -_08022F6C: .4byte gActiveBattler\n\ -_08022F70: .4byte gBattlescriptCurrInstr\n\ -_08022F74:\n\ - cmp r0, 0x6\n\ - beq _08022F7A\n\ - b _08023170\n\ -_08022F7A:\n\ - ldr r0, _08022FF0 @ =gBattleTypeFlags\n\ - ldrh r2, [r0]\n\ - movs r0, 0x40\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08022F88\n\ - b _0802310C\n\ -_08022F88:\n\ - movs r0, 0x1\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _08022F92\n\ - b _0802310C\n\ -_08022F92:\n\ - ldr r7, _08022FF4 @ =gHitMarker\n\ - ldr r0, [r7]\n\ - lsrs r5, r0, 28\n\ - ldr r4, _08022FF8 @ =gBitTable\n\ - ldr r0, [r4, 0x8]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _0802303A\n\ - ldr r0, [r4]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _0802303A\n\ - ldr r6, _08022FFC @ =gActiveBattler\n\ - movs r0, 0x2\n\ - strb r0, [r6]\n\ - ldr r0, _08023000 @ =gBattleBufferB\n\ - ldrb r1, [r0, 0x1]\n\ - movs r0, 0x2\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08023008\n\ - ldr r2, _08023004 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r7]\n\ - bics r0, r1\n\ - str r0, [r7]\n\ - movs r0, 0\n\ - bl Emitcmd42\n\ - ldrb r0, [r6]\n\ - bl MarkBufferBankForExecution\n\ - b _0802303A\n\ - .align 2, 0\n\ -_08022FF0: .4byte gBattleTypeFlags\n\ -_08022FF4: .4byte gHitMarker\n\ -_08022FF8: .4byte gBitTable\n\ -_08022FFC: .4byte gActiveBattler\n\ -_08023000: .4byte gBattleBufferB\n\ -_08023004: .4byte gAbsentBattlerFlags\n\ -_08023008:\n\ - ldr r4, _08023098 @ =gSpecialStatuses\n\ - ldrb r0, [r6]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _0802303A\n\ - ldr r0, _0802309C @ =gSharedMem\n\ - ldr r1, _080230A0 @ =0x00016068\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r6]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_0802303A:\n\ - ldr r4, _080230A4 @ =gBitTable\n\ - ldr r0, [r4, 0xC]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _080230EE\n\ - ldr r0, [r4, 0x4]\n\ - ands r5, r0\n\ - cmp r5, 0\n\ - beq _080230EE\n\ - ldr r5, _080230A8 @ =gActiveBattler\n\ - movs r0, 0x3\n\ - strb r0, [r5]\n\ - ldr r0, _080230AC @ =gBattleBufferB\n\ - ldr r2, _080230B0 @ =0x00000201\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r0, 0x3\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080230BC\n\ - ldr r2, _080230B4 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r5]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _080230B8 @ =gHitMarker\n\ - ldrb r0, [r5]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl Emitcmd42\n\ - ldrb r0, [r5]\n\ - bl MarkBufferBankForExecution\n\ - b _080230EE\n\ - .align 2, 0\n\ -_08023098: .4byte gSpecialStatuses\n\ -_0802309C: .4byte gSharedMem\n\ -_080230A0: .4byte 0x00016068\n\ -_080230A4: .4byte gBitTable\n\ -_080230A8: .4byte gActiveBattler\n\ -_080230AC: .4byte gBattleBufferB\n\ -_080230B0: .4byte 0x00000201\n\ -_080230B4: .4byte gAbsentBattlerFlags\n\ -_080230B8: .4byte gHitMarker\n\ -_080230BC:\n\ - ldr r4, _080230FC @ =gSpecialStatuses\n\ - ldrb r0, [r5]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _080230EE\n\ - ldr r0, _08023100 @ =gSharedMem\n\ - ldr r1, _08023104 @ =0x00016069\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r5]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_080230EE:\n\ - ldr r1, _08023108 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x6\n\ - str r0, [r1]\n\ - mov r12, r1\n\ - b _08023110\n\ - .align 2, 0\n\ -_080230FC: .4byte gSpecialStatuses\n\ -_08023100: .4byte gSharedMem\n\ -_08023104: .4byte 0x00016069\n\ -_08023108: .4byte gBattlescriptCurrInstr\n\ -_0802310C:\n\ - adds r0, r1, 0x6\n\ - str r0, [r6]\n\ -_08023110:\n\ - ldr r0, _08023160 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - lsrs r5, r0, 28\n\ - ldr r1, _08023164 @ =gBank1\n\ - movs r0, 0\n\ - strb r0, [r1]\n\ - ldr r4, _08023168 @ =gBitTable\n\ - ldr r2, [r4]\n\ - ands r2, r5\n\ - ldr r6, _0802316C @ =gBattlersCount\n\ - cmp r2, 0\n\ - bne _0802314C\n\ - adds r7, r6, 0\n\ - ldrb r0, [r6]\n\ - cmp r2, r0\n\ - bcs _0802314C\n\ - adds r3, r1, 0\n\ -_08023132:\n\ - ldrb r0, [r3]\n\ - adds r0, 0x1\n\ - strb r0, [r3]\n\ - ldrb r2, [r3]\n\ - lsls r0, r2, 2\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - bne _0802314C\n\ - ldrb r0, [r7]\n\ - cmp r2, r0\n\ - bcc _08023132\n\ -_0802314C:\n\ - ldrb r0, [r1]\n\ - ldrb r6, [r6]\n\ - cmp r0, r6\n\ - beq _08023156\n\ - b _08023302\n\ -_08023156:\n\ - mov r1, r8\n\ - mov r2, r12\n\ - str r1, [r2]\n\ - b _08023302\n\ - .align 2, 0\n\ -_08023160: .4byte gHitMarker\n\ -_08023164: .4byte gBank1\n\ -_08023168: .4byte gBitTable\n\ -_0802316C: .4byte gBattlersCount\n\ -_08023170:\n\ - movs r0, 0x80\n\ - ands r0, r2\n\ - movs r5, 0x1\n\ - cmp r0, 0\n\ - beq _0802317C\n\ - movs r5, 0\n\ -_0802317C:\n\ - movs r0, 0x7F\n\ - ands r0, r2\n\ - bl GetBattleBank\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r1, _080231A4 @ =gSpecialStatuses\n\ - lsls r0, r7, 2\n\ - adds r0, r7\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - bge _080231A8\n\ - ldr r0, [r6]\n\ - adds r0, 0x6\n\ - str r0, [r6]\n\ - b _08023302\n\ - .align 2, 0\n\ -_080231A4: .4byte gSpecialStatuses\n\ -_080231A8:\n\ - adds r0, r7, 0\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080231F8\n\ - ldr r2, _080231E8 @ =gActiveBattler\n\ - strb r7, [r2]\n\ - ldr r3, _080231EC @ =gAbsentBattlerFlags\n\ - ldr r4, _080231F0 @ =gBitTable\n\ - ldrb r0, [r2]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - ldrb r1, [r3]\n\ - orrs r0, r1\n\ - strb r0, [r3]\n\ - ldr r3, _080231F4 @ =gHitMarker\n\ - ldrb r0, [r2]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r3]\n\ - bics r0, r1\n\ - str r0, [r3]\n\ - mov r0, r8\n\ - str r0, [r6]\n\ - b _08023302\n\ - .align 2, 0\n\ -_080231E8: .4byte gActiveBattler\n\ -_080231EC: .4byte gAbsentBattlerFlags\n\ -_080231F0: .4byte gBitTable\n\ -_080231F4: .4byte gHitMarker\n\ -_080231F8:\n\ - ldr r4, _080232A0 @ =gActiveBattler\n\ - strb r7, [r4]\n\ - ldr r3, _080232A4 @ =gSharedMem\n\ - ldrb r0, [r4]\n\ - ldr r2, _080232A8 @ =0x00016064\n\ - adds r1, r0, r2\n\ - adds r1, r3\n\ - ldr r2, _080232AC @ =gBattlerPartyIndexes\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r1, [r4]\n\ - movs r0, 0x2\n\ - eors r0, r1\n\ - ldr r1, _080232B0 @ =0x00016068\n\ - adds r0, r1\n\ - adds r0, r3\n\ - ldrb r2, [r0]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - ldr r1, _080232B4 @ =0x0001606c\n\ - adds r3, r1\n\ - adds r0, r3\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - adds r1, r5, 0\n\ - movs r3, 0\n\ - bl EmitChoosePokemon\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, [r6]\n\ - adds r0, 0x6\n\ - str r0, [r6]\n\ - ldrb r0, [r4]\n\ - bl GetBattlerPosition\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0802325A\n\ - ldr r1, _080232B8 @ =gBattleResults\n\ - ldrb r0, [r1, 0x2]\n\ - cmp r0, 0xFE\n\ - bhi _0802325A\n\ - adds r0, 0x1\n\ - strb r0, [r1, 0x2]\n\ -_0802325A:\n\ - ldr r0, _080232BC @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080232C4\n\ - ldr r1, _080232A0 @ =gActiveBattler\n\ - movs r0, 0\n\ - strb r0, [r1]\n\ - ldr r0, _080232C0 @ =gBattlersCount\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _08023302\n\ - adds r4, r1, 0\n\ -_08023276:\n\ - ldrb r0, [r4]\n\ - cmp r0, r7\n\ - beq _0802328A\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_0802328A:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - ldr r1, _080232C0 @ =gBattlersCount\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _08023276\n\ - b _08023302\n\ - .align 2, 0\n\ -_080232A0: .4byte gActiveBattler\n\ -_080232A4: .4byte gSharedMem\n\ -_080232A8: .4byte 0x00016064\n\ -_080232AC: .4byte gBattlerPartyIndexes\n\ -_080232B0: .4byte 0x00016068\n\ -_080232B4: .4byte 0x0001606c\n\ -_080232B8: .4byte gBattleResults\n\ -_080232BC: .4byte gBattleTypeFlags\n\ -_080232C0: .4byte gBattlersCount\n\ -_080232C4:\n\ - adds r0, r7, 0\n\ - bl GetBattlerPosition\n\ - movs r1, 0x1\n\ - eors r0, r1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetBattlerAtPosition\n\ - ldr r4, _08023310 @ =gActiveBattler\n\ - strb r0, [r4]\n\ - ldr r0, _08023314 @ =gAbsentBattlerFlags\n\ - ldrb r1, [r0]\n\ - ldr r2, _08023318 @ =gBitTable\n\ - ldrb r3, [r4]\n\ - lsls r0, r3, 2\n\ - adds r0, r2\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _080232F4\n\ - movs r0, 0x2\n\ - eors r3, r0\n\ - strb r3, [r4]\n\ -_080232F4:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08023302:\n\ - add sp, 0x4\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08023310: .4byte gActiveBattler\n\ -_08023314: .4byte gAbsentBattlerFlags\n\ -_08023318: .4byte gBitTable\n\ - .syntax divided"); -} - -static void atk51_switchhandleorder(void) -{ - int i; - if (gBattleExecBuffer) - return; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - switch (T2_READ_8(gBattlescriptCurrInstr + 2)) - { - case 0: - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleBufferB[i][0] == 0x22) - ewram16068arr(i) = gBattleBufferB[i][1]; - } - break; - case 1: - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - sub_8012258(gActiveBattler); - break; - case 2: - gBattleCommunication[0] = gBattleBufferB[gActiveBattler][1]; - ewram16068arr(gActiveBattler) = gBattleBufferB[gActiveBattler][1]; - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - ewram1606Carr(0, gActiveBattler) &= 0xF; - ewram1606Carr(0, gActiveBattler) |= (gBattleBufferB[gActiveBattler][2] & 0xF0); - ewram1606Carr(1, gActiveBattler) = gBattleBufferB[gActiveBattler][3]; - ewram1606Carr(0, (gActiveBattler ^ 2)) &= (0xF0); - ewram1606Carr(0, (gActiveBattler ^ 2)) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4; - ewram1606Carr(2, (gActiveBattler ^ 2)) = gBattleBufferB[gActiveBattler][3]; - } - else - sub_8012258(gActiveBattler); - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 6; - gBattleTextBuff1[2] = gBattleMons[gBankAttacker].species; - gBattleTextBuff1[3] = gBattleMons[gBankAttacker].species >> 8; - gBattleTextBuff1[4] = 0xFF; - - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 7; - gBattleTextBuff2[2] = gActiveBattler; - gBattleTextBuff2[3] = gBattleBufferB[gActiveBattler][1]; - gBattleTextBuff2[4] = 0xFF; - break; - } - gBattlescriptCurrInstr += 3; -} - -static void atk52_switchineffects(void) -{ - int i; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - sub_80157C4(gActiveBattler); - gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); - gSpecialStatuses[gActiveBattler].flag40 = 0; - - if (!(gSideAffecting[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES_DAMAGED) && (gSideAffecting[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES) - && gBattleMons[gActiveBattler].type1 != TYPE_FLYING && gBattleMons[gActiveBattler].type2 != TYPE_FLYING && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE) - { - u8 spikesDmg; - - gSideAffecting[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_SPIKES_DAMAGED; - - spikesDmg = (5 - gSideTimers[GetBattlerSide(gActiveBattler)].spikesAmount) * 2; - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (spikesDmg); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - - gBattleStruct->scriptingActive = gActiveBattler; - BattleScriptPushCursor(); - - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0) - gBattlescriptCurrInstr = BattleScript_SpikesOnTarget; - else if (T2_READ_8(gBattlescriptCurrInstr + 1) == 1) - gBattlescriptCurrInstr = BattleScript_SpikesOnAttacker; - else - gBattlescriptCurrInstr = BattleScript_SpikesOngBank1; - } - else - { - if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT) - { - gDisableStructs[gActiveBattler].truantCounter = 1; - } - - if (AbilityBattleEffects(0, gActiveBattler, 0, 0, 0) == 0 && ItemBattleEffects(0, gActiveBattler, 0) == 0) - { - gSideAffecting[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED); - - for (i = 0; i < gBattlersCount; i++) - { - if (gBanksByTurnOrder[i] == gActiveBattler) - gActionsByTurnOrder[i] = 0xC; - } - - for (i = 0; i < gBattlersCount; i++) - { - *(HP_ON_SWITCHOUT + GetBattlerSide(i)) = gBattleMons[i].hp; - } - - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 5) - { - u32 hitmark = gHitMarker >> 0x1C; - gBank1++; - while (1) - { - if (hitmark & gBitTable[gBank1] && !(gAbsentBattlerFlags & gBitTable[gBank1])) - break; - if (gBank1 >= gBattlersCount) - break; - gBank1++; - } - } - gBattlescriptCurrInstr += 2; - } - } -} - -static void atk53_trainerslidein(void) -{ - if (!T2_READ_8(gBattlescriptCurrInstr + 1)) - gActiveBattler = GetBattlerAtPosition(0); - else - gActiveBattler = GetBattlerAtPosition(1); - - EmitTrainerSlide(0); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk54_playse(void) -{ - gActiveBattler = gBankAttacker; - EmitEffectivenessSound(0, T2_READ_16(gBattlescriptCurrInstr + 1)); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 3; -} - -static void atk55_fanfare(void) -{ - gActiveBattler = gBankAttacker; - Emitcmd44(0, T2_READ_16(gBattlescriptCurrInstr + 1)); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 3; -} - -static void atk56_playfaintcry(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - EmitFaintingCry(0); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk57(void) -{ - gActiveBattler = GetBattlerAtPosition(0); - Emitcmd55(0, gBattleOutcome); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 1; -} - -static void atk58_returntoball(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - EmitReturnPokeToBall(0, 1); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -void atk59_handlelearnnewmove(void) -{ - u8* loc1 = T1_READ_PTR(gBattlescriptCurrInstr + 1); - u8* loc2 = T1_READ_PTR(gBattlescriptCurrInstr + 5); - - u16 ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterID], T2_READ_8(gBattlescriptCurrInstr + 9)); - while (ret == 0xFFFE) - ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterID], 0); - - if (ret == 0) - { - gBattlescriptCurrInstr = loc2; - } - else if (ret == 0xFFFF) - { - gBattlescriptCurrInstr += 10; - } - else - { - gActiveBattler = GetBattlerAtPosition(0); - if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterID && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) - GiveMoveToBattleMon(&gBattleMons[gActiveBattler], ret); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) //what is else if - { - gActiveBattler = GetBattlerAtPosition(2); - if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterID && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) - GiveMoveToBattleMon(&gBattleMons[gActiveBattler], ret); - } - gBattlescriptCurrInstr = loc1; - } -} - -void sub_8023A80(void) -{ - sub_802BBD4(0x18, 8, 0x1D, 0xD, 0); - Text_InitWindow(&gUnknown_03004210, BattleText_YesNo, 0x100, 0x19, 0x9); - Text_PrintWindow8002F44(&gUnknown_03004210); - MenuCursor_Create814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20); -} - -void sub_8023AD8(void) -{ - sub_802BBD4(0x18, 8, 0x1D, 0xD, 1); - DestroyMenuCursor(); -} - -static void atk5A_yesnoboxlearnmove(void) -{ - gActiveBattler = 0; - switch (gBattleStruct->atk5A_StateTracker) - { - case 0: - sub_8023A80(); - gBattleStruct->atk5A_StateTracker++; - gBattleCommunication[1] = 0; - sub_802BC6C(); - break; - case 1: - if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 1; - sub_802BC6C(); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gBattleCommunication[1] == 0) - { - sub_8023AD8(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); - gBattleStruct->atk5A_StateTracker++; - return; - } - goto state_tracker_4; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - state_tracker_4: - gBattleStruct->atk5A_StateTracker = 4; - } - break; - case 2: - if (!gPaletteFade.active) - { - ShowSelectMovePokemonSummaryScreen(gPlayerParty, gBattleStruct->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn); - gBattleStruct->atk5A_StateTracker++; - } - break; - case 3: - if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2) - { - u8 move_pos = sub_809FA30(); - if (move_pos == 4) - { - gBattleStruct->atk5A_StateTracker = 4; - } - else - { - u16 move = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MOVE1 + move_pos); - if (IsHMMove2(move)) - { - PrepareStringBattle(0x13F, gActiveBattler); - gBattleStruct->atk5A_StateTracker = 5; - } - else - { - u8 *ptr; - - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - ptr = gBattleTextBuff2; - { - ptr[0] = 0xFD; - ptr[1] = 2; - ptr[2] = move; - ptr[3] = ((move & 0xFF00) >> 8); - ptr += 4; - } - ptr[0] = 0xFF; - RemoveMonPPBonus(&gPlayerParty[gBattleStruct->expGetterID], move_pos); - SetMonMoveSlot(&gPlayerParty[gBattleStruct->expGetterID], gMoveToLearn, move_pos); - if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterID && !(gBattleMons[0].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[0].unk18_b & gBitTable[move_pos])) - { - RemoveBattleMonPPBonus(&gBattleMons[0], move_pos); - SetBattleMonMoveSlot(&gBattleMons[0], gMoveToLearn, move_pos); - } - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[2] == gBattleStruct->expGetterID && !(gBattleMons[2].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[2].unk18_b & gBitTable[move_pos])) - { - RemoveBattleMonPPBonus(&gBattleMons[2], move_pos); - SetBattleMonMoveSlot(&gBattleMons[2], gMoveToLearn, move_pos); - } - } - } - } - break; - case 4: - sub_8023AD8(); - gBattlescriptCurrInstr += 5; - break; - case 5: - if (gBattleExecBuffer == 0) - { - gBattleStruct->atk5A_StateTracker = 2; - } - break; - } -} - -static void atk5B_yesnoboxstoplearningmove(void) -{ - switch (gBattleStruct->atk5A_StateTracker) - { - case 0: - sub_8023A80(); - gBattleStruct->atk5A_StateTracker++; - gBattleCommunication[1] = 0; - sub_802BC6C(); - break; - case 1: - if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 1; - sub_802BC6C(); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gBattleCommunication[1] != 0) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; - sub_8023AD8(); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - sub_8023AD8(); - } - } -} - -static void atk5C_hitanimation(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - gBattlescriptCurrInstr += 2; - else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBattler].substituteHP == 0) - { - EmitHitAnimation(0); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; - } - else - gBattlescriptCurrInstr += 2; -} - -#define MONEY_UNKNOWN ((*(u8*)(ewram_addr + 0x17000 + 0x94))) - -#ifdef NONMATCHING -static void atk5D_getmoneyreward(void) -{ - int i = 0; - u8 r5 = 0; - u32 money_to_give; - if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) - { - money_to_give = 2 * gBattleStruct->moneyMultiplier * MONEY_UNKNOWN; - } - else - { - switch(gTrainers[gTrainerBattleOpponent].partyFlags) - { - case 0: - { - const struct PokeTrainerData1 *data = &gTrainers[gTrainerBattleOpponent].party->noItemNoMoves; - r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl; - } - break; - case 2: - { - const struct PokeTrainerData2 *data = &gTrainers[gTrainerBattleOpponent].party->itemNoMoves; - r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl; - } - break; - case 1: - case 3: - { - const struct PokeTrainerData3 *data = &gTrainers[gTrainerBattleOpponent].party->itemMoves; - r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl; - } - break; - } - for (; gTrainerMoney[i * 4] != 0xFF && gTrainerMoney[i * 4 + 1] != gTrainers[gTrainerBattleOpponent].trainerClass ; i++) {} - - money_to_give = (r5 << 2) * gBattleStruct->moneyMultiplier; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - money_to_give = 2 * gTrainerMoney[i * 4 + 1] * money_to_give; - else - money_to_give = 1 * gTrainerMoney[i * 4 + 1] * money_to_give; - } - - AddMoney(&gSaveBlock1.money, money_to_give); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 4; - gBattleTextBuff1[3] = 5; - gBattleTextBuff1[4] = BYTE0(money_to_give); - gBattleTextBuff1[5] = BYTE1(money_to_give); - gBattleTextBuff1[6] = BYTE2(money_to_give); - gBattleTextBuff1[7] = BYTE3(money_to_give); - gBattleTextBuff1[8] = 0xFF; - - gBattlescriptCurrInstr += 1; -} -#else -NAKED -static void atk5D_getmoneyreward(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - movs r6, 0\n\ - movs r5, 0\n\ - ldr r0, _08024048 @ =gTrainerBattleOpponent\n\ - ldrh r2, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 3\n\ - cmp r2, r1\n\ - bne _08024058\n\ - ldr r0, _0802404C @ =gSharedMem + 0x17000\n\ - adds r1, r0, 0\n\ - adds r1, 0x94\n\ - ldrb r2, [r1]\n\ - ldr r1, _08024050 @ =0xfffff056\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r4, r2, 0\n\ - muls r4, r0\n\ - ldr r0, _08024054 @ =gSaveBlock1 + 0x490\n\ - mov r8, r0\n\ - b _08024140\n\ - .align 2, 0\n\ -_08024048: .4byte gTrainerBattleOpponent\n\ -_0802404C: .4byte gSharedMem + 0x17000\n\ -_08024050: .4byte 0xfffff056\n\ -_08024054: .4byte gSaveBlock1 + 0x490\n\ -_08024058:\n\ - ldr r2, _08024074 @ =gTrainers\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r3, r0, 3\n\ - adds r4, r3, r2\n\ - ldrb r1, [r4]\n\ - cmp r1, 0x1\n\ - beq _080240AE\n\ - cmp r1, 0x1\n\ - bgt _08024078\n\ - cmp r1, 0\n\ - beq _08024082\n\ - b _080240C4\n\ - .align 2, 0\n\ -_08024074: .4byte gTrainers\n\ -_08024078:\n\ - cmp r1, 0x2\n\ - beq _08024098\n\ - cmp r1, 0x3\n\ - beq _080240AE\n\ - b _080240C4\n\ -_08024082:\n\ - adds r0, r2, 0\n\ - adds r0, 0x24\n\ - adds r0, r3, r0\n\ - ldr r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - subs r0, 0x8\n\ - b _080240C2\n\ -_08024098:\n\ - adds r0, r2, 0\n\ - adds r0, 0x24\n\ - adds r0, r3, r0\n\ - ldr r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - subs r0, 0x8\n\ - b _080240C2\n\ -_080240AE:\n\ - adds r0, r2, 0\n\ - adds r0, 0x24\n\ - adds r0, r3, r0\n\ - ldr r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - subs r0, 0x10\n\ -_080240C2:\n\ - ldrb r5, [r0, 0x2]\n\ -_080240C4:\n\ - ldr r0, _08024120 @ =gTrainerMoney\n\ - lsls r1, r6, 2\n\ - adds r3, r1, r0\n\ - ldrb r1, [r3]\n\ - mov r12, r0\n\ - lsls r4, r5, 2\n\ - ldr r5, _08024124 @ =gSharedMem\n\ - ldr r7, _08024128 @ =gBattleTypeFlags\n\ - ldr r0, _0802412C @ =gSaveBlock1 + 0x490\n\ - mov r8, r0\n\ - cmp r1, 0xFF\n\ - beq _080240FE\n\ - ldr r2, _08024130 @ =gTrainers\n\ - ldr r0, _08024134 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - ldrb r2, [r0, 0x1]\n\ - adds r1, r3, 0\n\ -_080240EE:\n\ - ldrb r0, [r1]\n\ - cmp r0, r2\n\ - beq _080240FE\n\ - adds r1, 0x4\n\ - adds r6, 0x1\n\ - ldrb r0, [r1]\n\ - cmp r0, 0xFF\n\ - bne _080240EE\n\ -_080240FE:\n\ - ldr r1, _08024138 @ =0x00016056\n\ - adds r0, r5, r1\n\ - ldrb r0, [r0]\n\ - adds r3, r4, 0\n\ - muls r3, r0\n\ - lsls r0, r6, 2\n\ - add r0, r12\n\ - ldrb r2, [r0, 0x1]\n\ - ldrh r1, [r7]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802413C\n\ - lsls r0, r2, 1\n\ - adds r4, r3, 0\n\ - muls r4, r0\n\ - b _08024140\n\ - .align 2, 0\n\ -_08024120: .4byte gTrainerMoney\n\ -_08024124: .4byte gSharedMem\n\ -_08024128: .4byte gBattleTypeFlags\n\ -_0802412C: .4byte gSaveBlock1 + 0x490\n\ -_08024130: .4byte gTrainers\n\ -_08024134: .4byte gTrainerBattleOpponent\n\ -_08024138: .4byte 0x00016056\n\ -_0802413C:\n\ - adds r4, r3, 0\n\ - muls r4, r2\n\ -_08024140:\n\ - mov r0, r8\n\ - adds r1, r4, 0\n\ - bl AddMoney\n\ - ldr r1, _0802418C @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x1\n\ - strb r0, [r1, 0x1]\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x2]\n\ - movs r0, 0x5\n\ - strb r0, [r1, 0x3]\n\ - strb r4, [r1, 0x4]\n\ - movs r0, 0xFF\n\ - lsls r0, 8\n\ - ands r0, r4\n\ - lsrs r0, 8\n\ - strb r0, [r1, 0x5]\n\ - movs r0, 0xFF\n\ - lsls r0, 16\n\ - ands r0, r4\n\ - lsrs r0, 16\n\ - strb r0, [r1, 0x6]\n\ - lsrs r0, r4, 24\n\ - strb r0, [r1, 0x7]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x8]\n\ - ldr r1, _08024190 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x1\n\ - str r0, [r1]\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0802418C: .4byte gBattleTextBuff1\n\ -_08024190: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} -#endif //NONMATCHING - -/* -static u32 GetTrainerMoneyToGive(u16 trainerId) -{ - u32 i = 0; - u32 lastMonLevel = 0; - u32 moneyReward = 0; - - if (trainerId == SECRET_BASE_OPPONENT) - { - moneyReward = 20 * eSecretBaseRecord->partyLevels[0] * gBattleStruct->moneyMultiplier; - } - else - { - switch (gTrainers[trainerId].partyFlags) - { - case 0: - { - const struct TrainerMonNoItemDefaultMoves *party = gTrainers[trainerId].party.NoItemDefaultMoves; - lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; - } - break; - case F_TRAINER_PARTY_CUSTOM_MOVESET: - { - const struct TrainerMonNoItemCustomMoves *party = gTrainers[trainerId].party.NoItemCustomMoves; - lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; - } - break; - case F_TRAINER_PARTY_HELD_ITEM: - { - const struct TrainerMonItemDefaultMoves *party = gTrainers[trainerId].party.ItemDefaultMoves; - lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; - } - break; - case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM: - { - const struct TrainerMonItemCustomMoves *party = gTrainers[trainerId].party.ItemCustomMoves; - lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; - } - break; - } - - for (; gTrainerMoneyTable[i].classId != 0xFF; i++) - { - if (gTrainerMoneyTable[i].classId == gTrainers[trainerId].trainerClass) - break; - } - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * 2 * gTrainerMoneyTable[i].value; - else - moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * gTrainerMoneyTable[i].value; - } - - return moneyReward; -} - -static void atk5D_getmoneyreward(void) -{ - u32 moneyReward = GetTrainerMoneyToGive(gTrainerBattleOpponent_A); - if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - moneyReward += GetTrainerMoneyToGive(gTrainerBattleOpponent_B); - - AddMoney(&gSaveBlock1Ptr->money, moneyReward); - - PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff1, 5, moneyReward) - - gBattlescriptCurrInstr++; -} -*/ - -static void atk5E_8025A70(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - switch (gBattleCommunication[0]) - { - case 0: - EmitGetAttributes(0, REQUEST_ALL_BATTLE, 0); - MarkBufferBankForExecution(gActiveBattler); - gBattleCommunication[0]++; - break; - case 1: - if (gBattleExecBuffer == 0) - { - int i; - struct BattlePokemon* bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBattler][4]; - for (i = 0; i < 4; i++) - { - gBattleMons[gActiveBattler].moves[i] = bufferPoke->moves[i]; - gBattleMons[gActiveBattler].pp[i] = bufferPoke->pp[i]; - } - gBattlescriptCurrInstr += 2; - } - break; - } -} - -static void atk5F_8025B24(void) -{ - gActiveBattler = gBankAttacker; - gBankAttacker = gBankTarget; - gBankTarget = gActiveBattler; - //what is xor... - if (gHitMarker & HITMARKER_PURSUIT_TRAP) - gHitMarker &= ~(HITMARKER_PURSUIT_TRAP); - else - gHitMarker |= HITMARKER_PURSUIT_TRAP; - gBattlescriptCurrInstr++; -} - -static void atk60_incrementgamestat(void) -{ - if (GetBattlerSide(gBankAttacker) == 0) - { - IncrementGameStat(T2_READ_8(gBattlescriptCurrInstr + 1)); - } - gBattlescriptCurrInstr += 2; -} - -static void atk61_drawpartystatussummary(void) -{ - int i; - struct Pokemon* party; - struct HpAndStatus hpStatus[6]; - if (gBattleExecBuffer) - return; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (GetBattlerSide(gActiveBattler) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - - for (i = 0; i < 6; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES2) == 0 || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatus[i].hp = 0xFFFF; - hpStatus[i].status = 0; - } - else - { - hpStatus[i].hp = GetMonData(&party[i], MON_DATA_HP); - hpStatus[i].status = GetMonData(&party[i], MON_DATA_STATUS); - } - } - EmitDrawPartyStatusSummary(0, hpStatus, 1); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk62_08025C6C(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - Emitcmd49(0); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk63_jumptorandomattack(void) -{ - if (T2_READ_8(gBattlescriptCurrInstr + 1)) - gCurrentMove = gRandomMove; - else - gChosenMove = gCurrentMove = gRandomMove; - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; -} - -static void atk64_statusanimation(void) -{ - if (gBattleExecBuffer == 0) - { - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - EmitStatusAnimation(0, 0, gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - } - gBattlescriptCurrInstr += 2; - } -} - -static void atk65_status2animation(void) -{ - if (gBattleExecBuffer == 0) - { - u32 possible_to_anim; - gActiveBattler = GetBattleBank(T1_READ_8(gBattlescriptCurrInstr + 1)); - possible_to_anim = T1_READ_32(gBattlescriptCurrInstr + 2); - if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - EmitStatusAnimation(0, 1, gBattleMons[gActiveBattler].status2 & possible_to_anim); - MarkBufferBankForExecution(gActiveBattler); - } - gBattlescriptCurrInstr += 6; - } -} - -static void atk66_chosenstatusanimation(void) -{ - if (gBattleExecBuffer == 0) - { - u32 status; - gActiveBattler = GetBattleBank(T1_READ_8(gBattlescriptCurrInstr + 1)); - status = T1_READ_32(gBattlescriptCurrInstr + 3); - if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - EmitStatusAnimation(0, T1_READ_8(gBattlescriptCurrInstr + 2), status); - MarkBufferBankForExecution(gActiveBattler); - } - gBattlescriptCurrInstr += 7; - } -} - -static void atk67_yesnobox(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - sub_8023A80(); - gBattleCommunication[0]++; - gBattleCommunication[1] = 0; - sub_802BC6C(); - break; - case 1: - if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 1; - sub_802BC6C(); - } - if (gMain.newKeys & B_BUTTON) - { - gBattleCommunication[1] = 1; - PlaySE(SE_SELECT); - sub_8023AD8(); - gBattlescriptCurrInstr++; - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_8023AD8(); - gBattlescriptCurrInstr++; - } - break; - } -} - -static void atk68_cancelallactions(void) -{ - int i; - for (i = 0; i < gBattlersCount; i++) - { - gActionsByTurnOrder[i] = 0xC; - } - gBattlescriptCurrInstr++; -} - -static void atk69_adjustsetdamage(void) //literally a copy of atk07 except theres no rand dmg modifier... -{ - u8 hold_effect, quality; - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) - { - RecordItemBattle(gBankTarget, hold_effect); - gSpecialStatuses[gBankTarget].focusBanded = 1; - } - if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE) - goto END; - if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBankTarget].endured - && !gSpecialStatuses[gBankTarget].focusBanded) - goto END; - if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) - goto END; - - gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1; - - if (gProtectStructs[gBankTarget].endured) - { - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; - goto END; - } - if (gSpecialStatuses[gBankTarget].focusBanded) - { - gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; - gLastUsedItem = gBattleMons[gBankTarget].item; - } - - END: - gBattlescriptCurrInstr++; -} - -void atk6A_removeitem(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - USED_HELD_ITEMS(gActiveBattler) = gBattleMons[gActiveBattler].item; - - gBattleMons[gActiveBattler].item = 0; - EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk6B_atknameinbuff1(void) -{ - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 7; - gBattleTextBuff1[2] = gBankAttacker; - gBattleTextBuff1[3] = gBattlerPartyIndexes[gBankAttacker]; - gBattleTextBuff1[4] = 0xFF; - gBattlescriptCurrInstr++; -} - -#ifdef NONMATCHING -static void atk6C_drawlvlupbox(void) -{ - u8 r1 = 0; - u8 r7 = 0; - switch (gBattleStruct->atk6C_statetracker) - { - case 0: - sub_802BBD4(0xB, 0, 0x1D, 0x7, r1); - StringCopy(gStringVar4, BattleText_Format2); - - } -} - -#else -NAKED -static void atk6C_drawlvlupbox(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - movs r1, 0\n\ - movs r7, 0\n\ - ldr r0, _08024928 @ =gSharedMem\n\ - mov r10, r0\n\ - ldr r4, _0802492C @ =0x0001609c\n\ - add r4, r10\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x1\n\ - bne _0802491C\n\ - b _08024AF4\n\ -_0802491C:\n\ - cmp r0, 0x1\n\ - bgt _08024930\n\ - cmp r0, 0\n\ - beq _0802493E\n\ - b _08024C38\n\ - .align 2, 0\n\ -_08024928: .4byte gSharedMem\n\ -_0802492C: .4byte 0x0001609c\n\ -_08024930:\n\ - cmp r0, 0x2\n\ - bne _08024936\n\ - b _08024C04\n\ -_08024936:\n\ - cmp r0, 0x3\n\ - bne _0802493C\n\ - b _08024C30\n\ -_0802493C:\n\ - b _08024C38\n\ -_0802493E:\n\ - str r1, [sp]\n\ - movs r0, 0xB\n\ - movs r1, 0\n\ - movs r2, 0x1D\n\ - movs r3, 0x7\n\ - bl sub_802BBD4\n\ - ldr r0, _0802499C @ =gStringVar4\n\ - ldr r1, _080249A0 @ =BattleText_Format2\n\ - bl StringCopy\n\ - adds r5, r0, 0\n\ - movs r1, 0\n\ - mov r8, r1\n\ -_0802495A:\n\ - movs r2, 0\n\ - mov r9, r2\n\ - ldr r0, _080249A4 @ =gUnknown_0840165C\n\ - mov r1, r8\n\ - lsls r4, r1, 2\n\ - adds r0, r4, r0\n\ - ldr r1, [r0]\n\ - adds r0, r5, 0\n\ - bl StringAppend\n\ - adds r5, r0, 0\n\ - ldr r0, _080249A8 @ =gSharedMem\n\ - ldr r2, _080249AC @ =0x00016018\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _080249B0 @ =gPlayerParty\n\ - adds r0, r1\n\ - ldr r1, _080249B4 @ =gLevelUpStatBoxStats\n\ - add r1, r8\n\ - ldrb r1, [r1]\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - mov r0, r8\n\ - cmp r0, 0x5\n\ - bhi _08024A1A\n\ - ldr r0, _080249B8 @ =_080249BC\n\ - adds r0, r4, r0\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0802499C: .4byte gStringVar4\n\ -_080249A0: .4byte BattleText_Format2\n\ -_080249A4: .4byte gUnknown_0840165C\n\ -_080249A8: .4byte gSharedMem\n\ -_080249AC: .4byte 0x00016018\n\ -_080249B0: .4byte gPlayerParty\n\ -_080249B4: .4byte gLevelUpStatBoxStats\n\ -_080249B8: .4byte _080249BC\n\ - .align 2, 0\n\ -_080249BC:\n\ - .4byte _080249D4\n\ - .4byte _080249E0\n\ - .4byte _080249EC\n\ - .4byte _080249F8\n\ - .4byte _08024A04\n\ - .4byte _08024A10\n\ -_080249D4:\n\ - ldr r0, _080249DC @ =gSharedMem + 0x17180\n\ - ldrh r0, [r0]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_080249DC: .4byte gSharedMem + 0x17180\n\ -_080249E0:\n\ - ldr r0, _080249E8 @ =gSharedMem + 0x17180\n\ - ldrh r0, [r0, 0x8]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_080249E8: .4byte gSharedMem + 0x17180\n\ -_080249EC:\n\ - ldr r0, _080249F4 @ =gSharedMem + 0x17180\n\ - ldrh r0, [r0, 0x2]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_080249F4: .4byte gSharedMem + 0x17180\n\ -_080249F8:\n\ - ldr r0, _08024A00 @ =gSharedMem + 0x17180\n\ - ldrh r0, [r0, 0xA]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_08024A00: .4byte gSharedMem + 0x17180\n\ -_08024A04:\n\ - ldr r0, _08024A0C @ =gSharedMem + 0x17180\n\ - ldrh r0, [r0, 0x4]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_08024A0C: .4byte gSharedMem + 0x17180\n\ -_08024A10:\n\ - ldr r0, _08024A54 @ =gSharedMem + 0x17180\n\ - ldrh r0, [r0, 0x6]\n\ -_08024A14:\n\ - subs r0, r1, r0\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ -_08024A1A:\n\ - lsls r0, r7, 16\n\ - asrs r0, 16\n\ - cmp r0, 0\n\ - bge _08024A2C\n\ - negs r0, r0\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ - movs r1, 0x1\n\ - add r9, r1\n\ -_08024A2C:\n\ - movs r0, 0xFC\n\ - strb r0, [r5]\n\ - movs r0, 0x13\n\ - strb r0, [r5, 0x1]\n\ - movs r1, 0x1\n\ - mov r2, r8\n\ - ands r1, r2\n\ - lsls r0, r1, 3\n\ - adds r0, r1\n\ - adds r0, 0x5\n\ - lsls r0, 3\n\ - adds r0, 0x6\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - mov r0, r9\n\ - cmp r0, 0\n\ - beq _08024A5C\n\ - ldr r1, _08024A58 @ =BattleText_Dash\n\ - b _08024A5E\n\ - .align 2, 0\n\ -_08024A54: .4byte gSharedMem + 0x17180\n\ -_08024A58: .4byte BattleText_Dash\n\ -_08024A5C:\n\ - ldr r1, _08024AA4 @ =BattleText_Plus\n\ -_08024A5E:\n\ - adds r0, r5, 0\n\ - bl StringCopy\n\ - adds r5, r0, 0\n\ - movs r6, 0xFC\n\ - strb r6, [r5]\n\ - movs r4, 0x14\n\ - strb r4, [r5, 0x1]\n\ - movs r0, 0x6\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - lsls r1, r7, 16\n\ - asrs r1, 16\n\ - adds r0, r5, 0\n\ - movs r2, 0x1\n\ - movs r3, 0x2\n\ - bl ConvertIntToDecimalStringN\n\ - adds r5, r0, 0\n\ - strb r6, [r5]\n\ - strb r4, [r5, 0x1]\n\ - movs r0, 0\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - movs r0, 0x1\n\ - mov r1, r8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08024AA8\n\ - movs r0, 0xFE\n\ - strb r0, [r5]\n\ - movs r0, 0xFF\n\ - strb r0, [r5, 0x1]\n\ - adds r5, 0x1\n\ - b _08024AB8\n\ - .align 2, 0\n\ -_08024AA4: .4byte BattleText_Plus\n\ -_08024AA8:\n\ - strb r6, [r5]\n\ - movs r0, 0x11\n\ - strb r0, [r5, 0x1]\n\ - movs r0, 0x8\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - movs r0, 0xFF\n\ - strb r0, [r5]\n\ -_08024AB8:\n\ - movs r2, 0x1\n\ - add r8, r2\n\ - mov r0, r8\n\ - cmp r0, 0x5\n\ - bgt _08024AC4\n\ - b _0802495A\n\ -_08024AC4:\n\ - ldr r4, _08024AE4 @ =gUnknown_03004210\n\ - ldr r1, _08024AE8 @ =gStringVar4\n\ - adds r2, 0xFF\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - adds r0, r4, 0\n\ - movs r3, 0xC\n\ - bl Text_InitWindow\n\ - adds r0, r4, 0\n\ - bl Text_PrintWindow8002F44\n\ - ldr r1, _08024AEC @ =gSharedMem\n\ - ldr r2, _08024AF0 @ =0x0001609c\n\ - adds r1, r2\n\ - b _08024BEA\n\ - .align 2, 0\n\ -_08024AE4: .4byte gUnknown_03004210\n\ -_08024AE8: .4byte gStringVar4\n\ -_08024AEC: .4byte gSharedMem\n\ -_08024AF0: .4byte 0x0001609c\n\ -_08024AF4:\n\ - ldr r0, _08024B94 @ =gMain\n\ - ldrh r0, [r0, 0x2E]\n\ - cmp r0, 0\n\ - bne _08024AFE\n\ - b _08024C38\n\ -_08024AFE:\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - ldr r0, _08024B98 @ =gStringVar4\n\ - ldr r1, _08024B9C @ =BattleText_Format2\n\ - bl StringCopy\n\ - adds r5, r0, 0\n\ - movs r0, 0\n\ - mov r8, r0\n\ - mov r9, r0\n\ - movs r6, 0xFC\n\ - movs r7, 0x14\n\ - ldr r1, _08024BA0 @ =0x00016018\n\ - add r10, r1\n\ -_08024B1C:\n\ - ldr r1, _08024BA4 @ =gUnknown_0840165C\n\ - mov r2, r8\n\ - lsls r0, r2, 2\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - adds r0, r5, 0\n\ - bl StringAppend\n\ - adds r5, r0, 0\n\ - mov r0, r10\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _08024BA8 @ =gPlayerParty\n\ - adds r0, r1\n\ - ldr r1, _08024BAC @ =gLevelUpStatBoxStats\n\ - add r1, r8\n\ - ldrb r1, [r1]\n\ - bl GetMonData\n\ - adds r1, r0, 0\n\ - strb r6, [r5]\n\ - movs r0, 0x13\n\ - strb r0, [r5, 0x1]\n\ - movs r4, 0x1\n\ - mov r2, r8\n\ - ands r4, r2\n\ - lsls r0, r4, 3\n\ - adds r0, r4\n\ - adds r0, 0x5\n\ - lsls r0, 3\n\ - adds r0, 0x6\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - strb r6, [r5]\n\ - strb r7, [r5, 0x1]\n\ - movs r0, 0x6\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - lsls r1, 16\n\ - asrs r1, 16\n\ - adds r0, r5, 0\n\ - movs r2, 0x1\n\ - movs r3, 0x3\n\ - bl ConvertIntToDecimalStringN\n\ - adds r5, r0, 0\n\ - strb r6, [r5]\n\ - strb r7, [r5, 0x1]\n\ - mov r0, r9\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - cmp r4, 0\n\ - beq _08024BB0\n\ - movs r0, 0xFE\n\ - strb r0, [r5]\n\ - movs r0, 0xFF\n\ - strb r0, [r5, 0x1]\n\ - adds r5, 0x1\n\ - b _08024BC0\n\ - .align 2, 0\n\ -_08024B94: .4byte gMain\n\ -_08024B98: .4byte gStringVar4\n\ -_08024B9C: .4byte BattleText_Format2\n\ -_08024BA0: .4byte 0x00016018\n\ -_08024BA4: .4byte gUnknown_0840165C\n\ -_08024BA8: .4byte gPlayerParty\n\ -_08024BAC: .4byte gLevelUpStatBoxStats\n\ -_08024BB0:\n\ - strb r6, [r5]\n\ - movs r0, 0x11\n\ - strb r0, [r5, 0x1]\n\ - movs r0, 0x8\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - movs r0, 0xFF\n\ - strb r0, [r5]\n\ -_08024BC0:\n\ - movs r1, 0x1\n\ - add r8, r1\n\ - mov r2, r8\n\ - cmp r2, 0x5\n\ - ble _08024B1C\n\ - ldr r4, _08024BF4 @ =gUnknown_03004210\n\ - ldr r1, _08024BF8 @ =gStringVar4\n\ - movs r2, 0x80\n\ - lsls r2, 1\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - adds r0, r4, 0\n\ - movs r3, 0xC\n\ - bl Text_InitWindow\n\ - adds r0, r4, 0\n\ - bl Text_PrintWindow8002F44\n\ - ldr r1, _08024BFC @ =gSharedMem\n\ - ldr r0, _08024C00 @ =0x0001609c\n\ - adds r1, r0\n\ -_08024BEA:\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - b _08024C38\n\ - .align 2, 0\n\ -_08024BF4: .4byte gUnknown_03004210\n\ -_08024BF8: .4byte gStringVar4\n\ -_08024BFC: .4byte gSharedMem\n\ -_08024C00: .4byte 0x0001609c\n\ -_08024C04:\n\ - ldr r0, _08024C2C @ =gMain\n\ - ldrh r0, [r0, 0x2E]\n\ - cmp r0, 0\n\ - beq _08024C38\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - movs r0, 0xB\n\ - movs r1, 0\n\ - movs r2, 0x1D\n\ - movs r3, 0x7\n\ - bl sub_802BBD4\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - b _08024C38\n\ - .align 2, 0\n\ -_08024C2C: .4byte gMain\n\ -_08024C30:\n\ - ldr r1, _08024C48 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x1\n\ - str r0, [r1]\n\ -_08024C38:\n\ - add sp, 0x4\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\ -_08024C48: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} - -#endif - -static void atk6D_resetsentmonsvalue(void) -{ - ResetSentPokesToOpponentValue(); - gBattlescriptCurrInstr++; -} - -static void atk6E_setatktoplayer0(void) -{ - gBankAttacker = GetBattlerAtPosition(0); - gBattlescriptCurrInstr++; -} - -static void atk6F_makevisible(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - EmitSpriteInvisibility(0, 0); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk70_recordlastability(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - RecordAbilityBattle(gActiveBattler, gLastUsedAbility); - gBattlescriptCurrInstr += 1; //buggy, should be += 2, one byte for command, one byte for argument... -} - -void sub_8024CEC(void) -{ - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 2; - gBattleTextBuff2[2] = (gMoveToLearn); - gBattleTextBuff2[3] = uBYTE1_16(gMoveToLearn); - gBattleTextBuff2[4] = 0xFF; -} - -static void atk71_buffermovetolearn(void) -{ - sub_8024CEC(); - gBattlescriptCurrInstr++; -} - -static void atk72_jumpifplayerran(void) -{ - if (TryRunFromBattle(gBank1)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; -} - -static void atk73_hpthresholds(void) -{ - u8 opposing_bank; - s32 result; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - opposing_bank = gActiveBattler ^ 1; - - result = gBattleMons[opposing_bank].hp * 100 / gBattleMons[opposing_bank].maxHP; - if (result == 0) - result = 1; - - if (result >= 70 || !gBattleMons[opposing_bank].hp) - gBattleStruct->hpScale = 0; - else if (result >= 40) - gBattleStruct->hpScale = 1; - else if (result >= 10) - gBattleStruct->hpScale = 2; - else - gBattleStruct->hpScale = 3; - } - - gBattlescriptCurrInstr += 2; -} - -static void atk74_hpthresholds2(void) -{ - u8 opposing_bank; - u8 hp_switchout; - s32 result; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - opposing_bank = gActiveBattler ^ 1; - hp_switchout = ewram160BCarr(GetBattlerSide(opposing_bank)); //gBattleStruct->HP_OnSwitchout[GetBattlerSide(opposing_bank)]; - result = (hp_switchout - gBattleMons[opposing_bank].hp) * 100 / hp_switchout; - - if (gBattleMons[opposing_bank].hp >= hp_switchout) - gBattleStruct->hpScale = 0; - else if (result <= 29) - gBattleStruct->hpScale = 1; - else if (result <= 69) - gBattleStruct->hpScale = 2; - else - gBattleStruct->hpScale = 3; - } - - gBattlescriptCurrInstr += 2; -} - -static void atk75_useitemonopponent(void) -{ - gBankInMenu = gBankAttacker; - PokemonUseItemEffects(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker]], gLastUsedItem, gBattlerPartyIndexes[gBankAttacker], 0, 1); - gBattlescriptCurrInstr += 1; -} - -static void atk76_various(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - switch (T2_READ_8(gBattlescriptCurrInstr + 2)) - { - case 0: - CancelMultiTurnMoves(gActiveBattler); - break; - case 1: - { - u8 side; - gBankAttacker = gBankTarget; - side = GetBattlerSide(gBankAttacker) ^ 1; - if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) - gBankTarget = gSideTimers[side].followmeTarget; - else - gBankTarget = gActiveBattler; - } - break; - case 2: - gBattleCommunication[0] = CanRunFromBattle(); - break; - case 3: - gBankTarget = GetMoveTarget(gCurrentMove, 0); - break; - case 4: - if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) - gBattleCommunication[0] = 1; - else - gBattleCommunication[0] = 0; - break; - case 5: - gSpecialStatuses[gActiveBattler].intimidatedPoke = 0; - gSpecialStatuses[gActiveBattler].traced = 0; - break; - case 6: - { - int i; - u16* choiced_move; - if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterID) - goto ACTIVE_0; - if (gBattlerPartyIndexes[2] != gBattleStruct->expGetterID) - break; - if (gBattlerPartyIndexes[0] == gBattlerPartyIndexes[2]) - { - ACTIVE_0: - gActiveBattler = 0; - } - else - gActiveBattler = 2; - - choiced_move = CHOICED_MOVE(gActiveBattler); - for (i = 0; i < 4; i++) - { - if (gBattleMons[gActiveBattler].moves[i] == *choiced_move) - break; - } - if (i == 4) - *choiced_move = 0; - } - break; - } - - gBattlescriptCurrInstr += 3; -} - -static void atk77_setprotectlike(void) //protect and endure -{ - bool8 not_last_turn = 1; - u16 last_move = gUnknown_02024C4C[gBankAttacker]; - - if (last_move != MOVE_PROTECT && last_move != MOVE_DETECT && last_move != MOVE_ENDURE) - gDisableStructs[gBankAttacker].protectUses = 0; - if (gCurrentTurnActionNumber == (gBattlersCount - 1)) - not_last_turn = 0; - - if (sProtectSuccessRates[gDisableStructs[gBankAttacker].protectUses] > Random() && not_last_turn) - { - if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT) - { - gProtectStructs[gBankAttacker].protected = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) //what is else if - { - gProtectStructs[gBankAttacker].endured = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - gDisableStructs[gBankAttacker].protectUses++; - } - else - { - gDisableStructs[gBankAttacker].protectUses = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - gMoveResultFlags |= MOVE_RESULT_MISSED; - } - - gBattlescriptCurrInstr++; -} - -static void atk78_faintifabilitynotdamp(void) -{ - if (gBattleExecBuffer) - return; - - for (gBankTarget = 0; gBankTarget < gBattlersCount; gBankTarget++) - { - if (gBattleMons[gBankTarget].ability == ABILITY_DAMP) - break; - } - - if (gBankTarget == gBattlersCount) - { - gActiveBattler = gBankAttacker; - gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - EmitHealthBarUpdate(0, 0x7FFF); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr++; - - for (gBankTarget = 0; gBankTarget < gBattlersCount; gBankTarget++) - { - if (gBankTarget == gBankAttacker) - continue; - if (!(gAbsentBattlerFlags & gBitTable[gBankTarget])) - break; - } - } - else - { - gLastUsedAbility = ABILITY_DAMP; - RecordAbilityBattle(gBankTarget, gBattleMons[gBankTarget].ability); - gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; - } -} - -static void atk79_setatkhptozero(void) -{ - if (gBattleExecBuffer) - return; - - gActiveBattler = gBankAttacker; - gBattleMons[gActiveBattler].hp = 0; - EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBattler].hp); - MarkBufferBankForExecution(gActiveBattler); - - gBattlescriptCurrInstr++; -} - -static void atk7A_jumpifnexttargetvalid(void) //used by intimidate to loop through all targets -{ - u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - for (gBankTarget++; ; gBankTarget++) - { - if (gBankTarget == gBankAttacker) - continue; - if (!(gAbsentBattlerFlags & gBitTable[gBankTarget])) - break; - } - - if (gBankTarget >= gBattlersCount) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = jump_loc; - } - else - gBattlescriptCurrInstr += 5; -} - -static void atk7B_tryhealhalfhealth(void) -{ - u8* fail_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - - if (T2_READ_8(gBattlescriptCurrInstr + 5) == 1) - gBankTarget = gBankAttacker; - - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - - if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) - gBattlescriptCurrInstr = fail_loc; - else - gBattlescriptCurrInstr += 6; -} - -static void atk7C_trymirrormove(void) -{ - u16 r7 = ewram160ACarr2(0, gBankAttacker) | (ewram160ACarr2(1, gBankAttacker) << 8); - u16 r6 = ewram16100arr2(0, gBankAttacker) | (ewram16100arr2(1, gBankAttacker) << 8); - u16 r5 = ewram16100arr2(2, gBankAttacker) | (ewram16100arr2(3, gBankAttacker) << 8); - - if (r7 != 0 && r7 != 0xFFFF) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCurrentMove = r7; - gBankTarget = GetMoveTarget(gCurrentMove, 0); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - } - else if (r6 != 0 && r5 != 0 && r6 != 0xFFFF && r5 != 0xFFFF) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - if (Random() & 1) - gCurrentMove = r6; - else - gCurrentMove = r5; - gBankTarget = GetMoveTarget(gCurrentMove, 0); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - } - else if (r6 != 0 && r6 != 0xFFFF) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCurrentMove = r6; - gBankTarget = GetMoveTarget(gCurrentMove, 0); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - } - else if (r5 != 0 && r5 != 0xFFFF) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCurrentMove = r5; - gBankTarget = GetMoveTarget(gCurrentMove, 0); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - } - else - { - gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr++; - } -} - -static void atk7D_setrain(void) -{ - if (gBattleWeather & WEATHER_RAIN_ANY) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gBattleWeather = WEATHER_RAIN_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gWishFutureKnock.weatherDuration = 5; - } - gBattlescriptCurrInstr++; -} - -static void atk7E_setreflect(void) -{ - if (gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] & SIDE_STATUS_REFLECT) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else - { - gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] |= SIDE_STATUS_REFLECT; - gSideTimers[GetBattlerPosition(gBankAttacker) & 1].reflectTimer = 5; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - gBattlescriptCurrInstr++; -} - -static void atk7F_setseeded(void) -{ - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT || gStatuses3[gBankTarget] & STATUS3_LEECHSEED) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else if (gBattleMons[gBankTarget].type1 == TYPE_GRASS || gBattleMons[gBankTarget].type2 == TYPE_GRASS) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gStatuses3[gBankTarget] |= gBankAttacker; - gStatuses3[gBankTarget] |= STATUS3_LEECHSEED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - - gBattlescriptCurrInstr++; -} - -static void atk80_manipulatedamage(void) -{ - switch (T2_READ_8(gBattlescriptCurrInstr + 1)) - { - case 0: - gBattleMoveDamage *= -1; - break; - case 1: - gBattleMoveDamage /= 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if ((gBattleMons[gBankTarget].maxHP / 2) < gBattleMoveDamage) - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; - break; - case 2: - gBattleMoveDamage *= 2; - break; - } - - gBattlescriptCurrInstr += 2; -} - -static void atk81_trysetrest(void) -{ - u8* fail_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - gActiveBattler = gBankTarget = gBankAttacker; - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP * (-1); - if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) - gBattlescriptCurrInstr = fail_loc; - else - { - if (gBattleMons[gBankTarget].status1 & ((u8)(~STATUS_SLEEP))) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - - gBattleMons[gBankTarget].status1 = 3; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 5; - } -} - -static void atk82_jumpifnotfirstturn(void) -{ - u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - - if (gDisableStructs[gBankAttacker].isFirstTurn) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = jump_loc; -} - -static void atk83_nop(void) -{ - gBattlescriptCurrInstr++; -} - -bool8 UproarWakeUpCheck(u8 bank) -{ - int i; - for (i = 0; i < gBattlersCount; i++) - { - if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || gBattleMons[bank].ability == ABILITY_SOUNDPROOF) //wtf gamefreak, you should check this only once, not every time in a loop... - continue; - gBattleStruct->scriptingActive = i; - if (gBankTarget == 0xFF) - gBankTarget = i; - else if (gBankTarget == i) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - break; - } - if (i == gBattlersCount) - return 0; - else - return 1; -} - -static void atk84_jumpifcantmakeasleep(void) -{ - u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - if (UproarWakeUpCheck(gBankTarget)) - gBattlescriptCurrInstr = jump_loc; - else if (gBattleMons[gBankTarget].ability == ABILITY_INSOMNIA || gBattleMons[gBankTarget].ability == ABILITY_VITAL_SPIRIT) - { - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - gBattlescriptCurrInstr = jump_loc; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else - { - gBattlescriptCurrInstr += 5; - } -} - -static void atk85_stockpile(void) -{ - if (gDisableStructs[gBankAttacker].stockpileCounter == 3) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gDisableStructs[gBankAttacker].stockpileCounter++; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 1; - gBattleTextBuff1[3] = 1; - gBattleTextBuff1[4] = gDisableStructs[gBankAttacker].stockpileCounter; - gBattleTextBuff1[5] = 0xFF; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - gBattlescriptCurrInstr++; -} - -static void atk86_stockpiletobasedamage(void) -{ - u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - if (gDisableStructs[gBankAttacker].stockpileCounter == 0) - { - gBattlescriptCurrInstr = jump_loc; - } - else - { - if (gBattleCommunication[6] != 1) - { - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, - gSideAffecting[GetBattlerPosition(gBankTarget) & 1], 0, - 0, gBankAttacker, gBankTarget) - * gDisableStructs[gBankAttacker].stockpileCounter; - gBattleStruct->animTurn = gDisableStructs[gBankAttacker].stockpileCounter; - - if (gProtectStructs[gBankAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - } - gDisableStructs[gBankAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr += 5; - } -} - -static void atk87_stockpiletohpheal(void) -{ - u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - if (gDisableStructs[gBankAttacker].stockpileCounter == 0) - { - gBattlescriptCurrInstr = jump_loc; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else if (gBattleMons[gBankAttacker].maxHP == gBattleMons[gBankAttacker].hp) - { - gDisableStructs[gBankAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr = jump_loc; - gBankTarget = gBankAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / (1 << (3 - gDisableStructs[gBankAttacker].stockpileCounter)); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - gBattleStruct->animTurn = gDisableStructs[gBankAttacker].stockpileCounter; - gDisableStructs[gBankAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr += 5; - gBankTarget = gBankAttacker; - } -} - -static void atk88_negativedamage(void) -{ - gBattleMoveDamage = -(gHpDealt / 2); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = -1; - gBattlescriptCurrInstr++; -} - -static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) -{ - bool8 certain = FALSE; - bool8 notProtectAffected = FALSE; - u32 index; - - if (flags & MOVE_EFFECT_AFFECTS_USER) - gActiveBattler = gBankAttacker; - else - gActiveBattler = gBankTarget; - - flags &= ~(MOVE_EFFECT_AFFECTS_USER); - - if (flags & MOVE_EFFECT_CERTAIN) - certain++; - flags &= ~(MOVE_EFFECT_CERTAIN); - - if (flags & STAT_CHANGE_NOT_PROTECT_AFFECTED) - notProtectAffected++; - flags &= ~(STAT_CHANGE_NOT_PROTECT_AFFECTED); - - PREPARE_STAT_BUFFER(gBattleTextBuff1, statId) - - if ((statValue << 0x18) < 0) // stat decrease - { - if (gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer - && !certain && gCurrentMove != MOVE_CURSE) - { - if (flags == STAT_CHANGE_BS_PTR) - { - if (gSpecialStatuses[gActiveBattler].statLowered) - { - gBattlescriptCurrInstr = BS_ptr; - } - else - { - BattleScriptPush(BS_ptr); - gBattleStruct->scriptingActive = gActiveBattler; - gBattlescriptCurrInstr = BattleScript_MistProtected; - gSpecialStatuses[gActiveBattler].statLowered = 1; - } - } - return STAT_CHANGE_DIDNT_WORK; - } - else if (gCurrentMove != MOVE_CURSE - && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(0)) - { - gBattlescriptCurrInstr = BattleScript_ButItFailed; - return STAT_CHANGE_DIDNT_WORK; - } - else if ((gBattleMons[gActiveBattler].ability == ABILITY_CLEAR_BODY - || gBattleMons[gActiveBattler].ability == ABILITY_WHITE_SMOKE) - && !certain && gCurrentMove != MOVE_CURSE) - { - if (flags == STAT_CHANGE_BS_PTR) - { - if (gSpecialStatuses[gActiveBattler].statLowered) - { - gBattlescriptCurrInstr = BS_ptr; - } - else - { - BattleScriptPush(BS_ptr); - gBattleStruct->scriptingActive = gActiveBattler; - gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; - RecordAbilityBattle(gActiveBattler, gLastUsedAbility); - gSpecialStatuses[gActiveBattler].statLowered = 1; - } - } - return STAT_CHANGE_DIDNT_WORK; - } - else if (gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE - && !certain && statId == STAT_STAGE_ACC) - { - if (flags == STAT_CHANGE_BS_PTR) - { - BattleScriptPush(BS_ptr); - gBattleStruct->scriptingActive = gActiveBattler; - gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; - RecordAbilityBattle(gActiveBattler, gLastUsedAbility); - } - return STAT_CHANGE_DIDNT_WORK; - } - else if (gBattleMons[gActiveBattler].ability == ABILITY_HYPER_CUTTER - && !certain && statId == STAT_STAGE_ATK) - { - if (flags == STAT_CHANGE_BS_PTR) - { - BattleScriptPush(BS_ptr); - gBattleStruct->scriptingActive = gActiveBattler; - gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; - RecordAbilityBattle(gActiveBattler, gLastUsedAbility); - } - return STAT_CHANGE_DIDNT_WORK; - } - else if (gBattleMons[gActiveBattler].ability == ABILITY_SHIELD_DUST && flags == 0) - { - return STAT_CHANGE_DIDNT_WORK; - } - else // try to decrease - { - statValue = -GET_STAT_BUFF_VALUE(statValue); - gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; - index = 1; - if (statValue == -2) - { - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_STATHARSHLY; - gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8; - index = 4; - } - gBattleTextBuff2[index] = B_BUFF_STRING; - index++; - gBattleTextBuff2[index] = STRINGID_STATFELL; - index++; - gBattleTextBuff2[index] = STRINGID_STATFELL >> 8; - index++; - gBattleTextBuff2[index] = B_BUFF_EOS; - - if (gBattleMons[gActiveBattler].statStages[statId] == 0) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - else - gBattleCommunication[MULTISTRING_CHOOSER] = (gBankTarget == gActiveBattler); - - } - } - else // stat increase - { - statValue = GET_STAT_BUFF_VALUE(statValue); - gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; - index = 1; - if (statValue == 2) - { - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_STATSHARPLY; - gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; - index = 4; - } - gBattleTextBuff2[index] = B_BUFF_STRING; - index++; - gBattleTextBuff2[index] = STRINGID_STATROSE; - index++; - gBattleTextBuff2[index] = STRINGID_STATROSE >> 8; - index++; - gBattleTextBuff2[index] = B_BUFF_EOS; - - if (gBattleMons[gActiveBattler].statStages[statId] == 0xC) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - else - gBattleCommunication[MULTISTRING_CHOOSER] = (gBankTarget == gActiveBattler); - } - - gBattleMons[gActiveBattler].statStages[statId] += statValue; - if (gBattleMons[gActiveBattler].statStages[statId] < 0) - gBattleMons[gActiveBattler].statStages[statId] = 0; - if (gBattleMons[gActiveBattler].statStages[statId] > 0xC) - gBattleMons[gActiveBattler].statStages[statId] = 0xC; - - if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && flags & STAT_CHANGE_BS_PTR) - gMoveResultFlags |= MOVE_RESULT_MISSED; - - if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && !(flags & STAT_CHANGE_BS_PTR)) - return STAT_CHANGE_DIDNT_WORK; - - return STAT_CHANGE_WORKED; -} - -static void atk89_statbuffchange(void) -{ - u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 2); - if (ChangeStatBuffs(gBattleStruct->statChanger & 0xF0, gBattleStruct->statChanger & 0xF, T2_READ_8(gBattlescriptCurrInstr + 1), jump_loc) == 0) - gBattlescriptCurrInstr += 6; -} - -static void atk8A_normalisebuffs(void) //haze -{ - int i, j; - for (i = 0; i < gBattlersCount; i++) - { - for (j = 0; j < 8; j++) - { - gBattleMons[i].statStages[j] = 6; - } - } - gBattlescriptCurrInstr++; -} - -static void atk8B_setbide(void) -{ - gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gBankAttacker] = gCurrentMove; - gTakenDmg[gBankAttacker] = 0; - gBattleMons[gBankAttacker].status2 |= (STATUS2_BIDE - 0x100); //2 turns - gBattlescriptCurrInstr++; -} - -static void atk8C_confuseifrepeatingattackends(void) -{ - if (!(gBattleMons[gBankAttacker].status2 & STATUS2_LOCK_CONFUSE)) - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x75; - gBattlescriptCurrInstr++; -} - -static void atk8D_setmultihitcounter(void) -{ - if (T2_READ_8(gBattlescriptCurrInstr + 1)) - gMultiHitCounter = T2_READ_8(gBattlescriptCurrInstr + 1); - else - { - gMultiHitCounter = Random() & 3; - if (gMultiHitCounter > 1) - gMultiHitCounter = (Random() & 3) + 2; - else - gMultiHitCounter += 2; - } - gBattlescriptCurrInstr += 2; -} - -static void atk8E_initmultihitstring(void) -{ - ewram160E0(0) = 0xFD; - ewram160E0(1) = 1; - ewram160E0(2) = 1; - ewram160E0(3) = 1; - ewram160E0(4) = 0; - ewram160E0(5) = 0xFF; - gBattlescriptCurrInstr++; -} - -static bool8 sub_80264C0(void) -{ - if (gBattleMons[gBankAttacker].level >= gBattleMons[gBankTarget].level) - { - ewram16064arr(gBankTarget) = gBattlerPartyIndexes[gBankTarget]; - } - else - { - u16 random = Random() & 0xFF; - if ((u32)((random * (gBattleMons[gBankAttacker].level + gBattleMons[gBankTarget].level) >> 8) + 1) <= (gBattleMons[gBankTarget].level / 4)) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - return 0; - } - ewram16064arr(gBankTarget) = gBattlerPartyIndexes[gBankTarget]; - } - gBattlescriptCurrInstr = BattleScript_SuccessForceOut; - return 1; -} - -static void atk8F_forcerandomswitch(void) -{ - if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)) - { - u8 i; - struct Pokemon* party; - u8 valid; - u8 val; - if (!GetBattlerSide(gBankTarget)) - party = gPlayerParty; - else - party = gEnemyParty; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - valid = 0; - val = 0; - if (sub_803FBFC(sub_803FC34(gBankTarget)) == 1) - val = 3; - for (i = val; i < val + 3; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[i], MON_DATA_IS_EGG) - && GetMonData(&party[i], MON_DATA_HP) != 0) - valid++; - } - } - else - { - valid = 0; - for (i = 0; i < 6; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[i], MON_DATA_IS_EGG) - && GetMonData(&party[i], MON_DATA_HP) != 0) - valid++; - } - } - - if ((valid < 2 && (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) - || (valid < 3 && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else if (sub_80264C0()) - { -#define MON_CAN_BATTLE(mon) (((GetMonData(mon, MON_DATA_SPECIES) && GetMonData(mon, MON_DATA_IS_EGG) != 1 && GetMonData(mon, MON_DATA_HP)))) - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - do - { - val = Random() % 3; - if (sub_803FBFC(sub_803FC34(gBankTarget)) == 1) - i = val + 3; - else - i = val; - } while (i == gBattlerPartyIndexes[gBankTarget] || i == gBattlerPartyIndexes[gBankTarget ^ 2] || !MON_CAN_BATTLE(&party[i])); - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - do - { - i = Random() % 6; - } while (i == gBattlerPartyIndexes[gBankTarget] || i == gBattlerPartyIndexes[gBankTarget ^ 2] || !MON_CAN_BATTLE(&party[i])); - } - else - { - do - { - i = Random() % 6; - } while (i == gBattlerPartyIndexes[gBankTarget] || !MON_CAN_BATTLE(&party[i])); - } - } - ewram16068arr(gBankTarget) = i; - if (!IsLinkDoubleBattle()) - sub_8012258(gBankTarget); - sub_8094B6C(gBankTarget, i, 0); - sub_8094B6C(gBankTarget ^ 2, i, 1); -#undef MON_CAN_BATTLE - } - } - else - { - sub_80264C0(); - } -} - -static void atk90_tryconversiontypechange(void) -{ - //randomly changes user's type to one of its moves' type - u8 valid_moves = 0; - u8 checked_move; - u8 move_type; - while (valid_moves < 4) - { - if (gBattleMons[gBankAttacker].moves[valid_moves] == 0) - break; - valid_moves++; - } - - for (checked_move = 0; checked_move < valid_moves; checked_move++) - { - move_type = gBattleMoves[gBattleMons[gBankAttacker].moves[checked_move]].type; - if (move_type == TYPE_MYSTERY) - { - if (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST) - move_type = TYPE_GHOST; - else - move_type = TYPE_NORMAL; - } - if (move_type != gBattleMons[gBankAttacker].type1 && move_type != gBattleMons[gBankAttacker].type2) - break; - } - - if (checked_move == valid_moves) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - do - { - - while ((checked_move = Random() & 3) >= valid_moves); - - move_type = gBattleMoves[gBattleMons[gBankAttacker].moves[checked_move]].type; - if (move_type == TYPE_MYSTERY) - { - if (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST) - move_type = TYPE_GHOST; - else - move_type = TYPE_NORMAL; - } - } while (move_type == gBattleMons[gBankAttacker].type1 || move_type == gBattleMons[gBankAttacker].type2); - - gBattleMons[gBankAttacker].type1 = move_type; - gBattleMons[gBankAttacker].type2 = move_type; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = move_type; - gBattleTextBuff1[3] = 0xFF; - - gBattlescriptCurrInstr += 5; - } -} - -static void atk91_givepaydaymoney(void) -{ - if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gPaydayMoney) - { - AddMoney(&gSaveBlock1.money, gPaydayMoney * gBattleStruct->moneyMultiplier); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 2; - gBattleTextBuff1[3] = 5; - gBattleTextBuff1[4] = gPaydayMoney; - gBattleTextBuff1[5] = uBYTE1_16(gPaydayMoney); - gBattleTextBuff1[6] = 0xFF; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_PrintPayDayMoneyString; - } - else - gBattlescriptCurrInstr++; -} - -static void atk92_setlightscreen(void) -{ - if (gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] & SIDE_STATUS_LIGHTSCREEN) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else - { - gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] |= SIDE_STATUS_LIGHTSCREEN; - gSideTimers[GetBattlerPosition(gBankAttacker) & 1].lightscreenTimer = 5; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - } - gBattlescriptCurrInstr++; -} - -#ifdef NOTMATCHING -static void atk93_tryKO(void) -{ - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) - { - RecordItemBattle(gBankTarget, hold_effect); - gSpecialStatuses[gBankTarget].focusBanded = 1; - } - - if (gBattleMons[gBankTarget].ability == ABILITY_STURDY) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gLastUsedAbility = ABILITY_STURDY; - gBattlescriptCurrInstr = x; - RecordAbilityBattle(gBankTarget, ABILITY_STURDY); - return; - } - - if (!(gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS)) - { - u16 to_cmp = gBattleMons[gBankAttacker].level - gBattleMons[gBankTarget].level + gBattleMoves[gCurrentMove].accuracy; - if (Random() % 0x64 + 1 < to_cmp || gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) - { - goto MOVE_RESULT_MISSED_LABEL; - } - } - else - { - if (gDisableStructs[gBankTarget].bankWithSureHit != gBankAttacker || gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) - { - - } - } - -MOVE_RESULT_MISSED_LABEL: - gBattleTypeFlags |= MOVE_RESULT_MISSED; - if (gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -#else -__attribute((naked)) -static void atk93_tryKO(void) -{ - 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\ - ldr r7, _08026BA8 @ =gBattleMons\n\ - ldr r6, _08026BAC @ =gBankTarget\n\ - ldrb r2, [r6]\n\ - movs r5, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r5\n\ - adds r1, r0, r7\n\ - ldrh r0, [r1, 0x2E]\n\ - cmp r0, 0xAF\n\ - bne _08026BB4\n\ - ldr r1, _08026BB0 @ =gEnigmaBerries\n\ - lsls r0, r2, 3\n\ - subs r0, r2\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r4, [r0, 0x7]\n\ - ldrb r6, [r0, 0x1A]\n\ - b _08026BCE\n\ - .align 2, 0\n\ -_08026BA8: .4byte gBattleMons\n\ -_08026BAC: .4byte gBankTarget\n\ -_08026BB0: .4byte gEnigmaBerries\n\ -_08026BB4:\n\ - ldrh r0, [r1, 0x2E]\n\ - bl ItemId_GetHoldEffect\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldrb r0, [r6]\n\ - muls r0, r5\n\ - adds r0, r7\n\ - ldrh r0, [r0, 0x2E]\n\ - bl ItemId_GetHoldEffectParam\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ -_08026BCE:\n\ - ldr r1, _08026C4C @ =gStringBank\n\ - ldr r5, _08026C50 @ =gBankTarget\n\ - ldrb r0, [r5]\n\ - strb r0, [r1]\n\ - cmp r4, 0x27\n\ - bne _08026C0C\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x64\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, r6\n\ - bcs _08026C0C\n\ - ldrb r0, [r5]\n\ - movs r1, 0x27\n\ - bl RecordItemBattle\n\ - ldr r2, _08026C54 @ =gSpecialStatuses\n\ - ldrb r1, [r5]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r2, 0x80\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_08026C0C:\n\ - ldr r0, _08026C58 @ =gBattleMons\n\ - mov r8, r0\n\ - ldr r1, _08026C50 @ =gBankTarget\n\ - ldrb r2, [r1]\n\ - movs r6, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r6\n\ - mov r3, r8\n\ - adds r5, r0, r3\n\ - adds r0, r5, 0\n\ - adds r0, 0x20\n\ - ldrb r3, [r0]\n\ - mov r10, r8\n\ - cmp r3, 0x5\n\ - bne _08026C6C\n\ - ldr r2, _08026C5C @ =gMoveResultFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r0, _08026C60 @ =gLastUsedAbility\n\ - strb r3, [r0]\n\ - ldr r1, _08026C64 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08026C68 @ =BattleScript_SturdyPreventsOHKO\n\ - str r0, [r1]\n\ - ldr r1, _08026C50 @ =gBankTarget\n\ - ldrb r0, [r1]\n\ - movs r1, 0x5\n\ - bl RecordAbilityBattle\n\ - b _08026E40\n\ - .align 2, 0\n\ -_08026C4C: .4byte gStringBank\n\ -_08026C50: .4byte gBankTarget\n\ -_08026C54: .4byte gSpecialStatuses\n\ -_08026C58: .4byte gBattleMons\n\ -_08026C5C: .4byte gMoveResultFlags\n\ -_08026C60: .4byte gLastUsedAbility\n\ -_08026C64: .4byte gBattlescriptCurrInstr\n\ -_08026C68: .4byte BattleScript_SturdyPreventsOHKO\n\ -_08026C6C:\n\ - ldr r1, _08026CE0 @ =gStatuses3\n\ - lsls r0, r2, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x18\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08026CF4\n\ - ldr r1, _08026CE4 @ =gBattleMoves\n\ - ldr r0, _08026CE8 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - lsls r2, r0, 1\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r1\n\ - ldr r7, _08026CEC @ =gBankAttacker\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - add r0, r10\n\ - adds r0, 0x2A\n\ - ldrb r0, [r0]\n\ - adds r1, r5, 0\n\ - adds r1, 0x2A\n\ - ldrb r1, [r1]\n\ - subs r0, r1\n\ - ldrb r2, [r2, 0x3]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x64\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - adds r0, 0x1\n\ - cmp r0, r4\n\ - bge _08026CDC\n\ - ldrb r0, [r7]\n\ - adds r1, r0, 0\n\ - muls r1, r6\n\ - add r1, r10\n\ - adds r1, 0x2A\n\ - ldr r2, _08026CF0 @ =gBankTarget\n\ - ldrb r0, [r2]\n\ - muls r0, r6\n\ - add r0, r10\n\ - adds r0, 0x2A\n\ - ldrb r1, [r1]\n\ - movs r4, 0x1\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - bcs _08026D20\n\ -_08026CDC:\n\ - mov r10, r8\n\ - b _08026DE0\n\ - .align 2, 0\n\ -_08026CE0: .4byte gStatuses3\n\ -_08026CE4: .4byte gBattleMoves\n\ -_08026CE8: .4byte gCurrentMove\n\ -_08026CEC: .4byte gBankAttacker\n\ -_08026CF0: .4byte gBankTarget\n\ -_08026CF4:\n\ - ldr r0, _08026D4C @ =gDisableStructs\n\ - lsls r1, r2, 3\n\ - subs r1, r2\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldr r2, _08026D50 @ =gBankAttacker\n\ - ldrb r0, [r1, 0x15]\n\ - movs r4, 0\n\ - ldrb r3, [r2]\n\ - cmp r0, r3\n\ - bne _08026D20\n\ - ldrb r0, [r2]\n\ - muls r0, r6\n\ - add r0, r10\n\ - adds r0, 0x2A\n\ - adds r1, r5, 0\n\ - adds r1, 0x2A\n\ - ldrb r0, [r0]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _08026D20\n\ - movs r4, 0x1\n\ -_08026D20:\n\ - cmp r4, 0\n\ - beq _08026DE0\n\ - ldr r0, _08026D54 @ =gProtectStructs\n\ - ldr r1, _08026D58 @ =gBankTarget\n\ - ldrb r2, [r1]\n\ - lsls r1, r2, 4\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - lsls r0, 30\n\ - cmp r0, 0\n\ - bge _08026D64\n\ - ldr r1, _08026D5C @ =gBattleMoveDamage\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - add r0, r10\n\ - ldrh r0, [r0, 0x28]\n\ - subs r0, 0x1\n\ - str r0, [r1]\n\ - ldr r2, _08026D60 @ =gMoveResultFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x40\n\ - b _08026DC6\n\ - .align 2, 0\n\ -_08026D4C: .4byte gDisableStructs\n\ -_08026D50: .4byte gBankAttacker\n\ -_08026D54: .4byte gProtectStructs\n\ -_08026D58: .4byte gBankTarget\n\ -_08026D5C: .4byte gBattleMoveDamage\n\ -_08026D60: .4byte gMoveResultFlags\n\ -_08026D64:\n\ - ldr r0, _08026DA0 @ =gSpecialStatuses\n\ - lsls r1, r2, 2\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - lsrs r0, 7\n\ - cmp r0, 0\n\ - beq _08026DB4\n\ - ldr r1, _08026DA4 @ =gBattleMoveDamage\n\ - movs r3, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r3\n\ - add r0, r10\n\ - ldrh r0, [r0, 0x28]\n\ - subs r0, 0x1\n\ - str r0, [r1]\n\ - ldr r2, _08026DA8 @ =gMoveResultFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x80\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r1, _08026DAC @ =gLastUsedItem\n\ - ldr r2, _08026DB0 @ =gBankTarget\n\ - ldrb r0, [r2]\n\ - muls r0, r3\n\ - add r0, r10\n\ - ldrh r0, [r0, 0x2E]\n\ - strh r0, [r1]\n\ - b _08026DCA\n\ - .align 2, 0\n\ -_08026DA0: .4byte gSpecialStatuses\n\ -_08026DA4: .4byte gBattleMoveDamage\n\ -_08026DA8: .4byte gMoveResultFlags\n\ -_08026DAC: .4byte gLastUsedItem\n\ -_08026DB0: .4byte gBankTarget\n\ -_08026DB4:\n\ - ldr r1, _08026DD4 @ =gBattleMoveDamage\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - add r0, r10\n\ - ldrh r0, [r0, 0x28]\n\ - str r0, [r1]\n\ - ldr r2, _08026DD8 @ =gMoveResultFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x10\n\ -_08026DC6:\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ -_08026DCA:\n\ - ldr r1, _08026DDC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - b _08026E40\n\ - .align 2, 0\n\ -_08026DD4: .4byte gBattleMoveDamage\n\ -_08026DD8: .4byte gMoveResultFlags\n\ -_08026DDC: .4byte gBattlescriptCurrInstr\n\ -_08026DE0:\n\ - ldr r2, _08026E10 @ =gMoveResultFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r0, _08026E14 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - movs r2, 0x58\n\ - adds r1, r0, 0\n\ - muls r1, r2\n\ - add r1, r10\n\ - adds r1, 0x2A\n\ - ldr r3, _08026E18 @ =gBankTarget\n\ - ldrb r0, [r3]\n\ - muls r0, r2\n\ - add r0, r10\n\ - adds r0, 0x2A\n\ - ldrb r1, [r1]\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - bcc _08026E20\n\ - ldr r1, _08026E1C @ =gBattleCommunication\n\ - movs r0, 0\n\ - b _08026E24\n\ - .align 2, 0\n\ -_08026E10: .4byte gMoveResultFlags\n\ -_08026E14: .4byte gBankAttacker\n\ -_08026E18: .4byte gBankTarget\n\ -_08026E1C: .4byte gBattleCommunication\n\ -_08026E20:\n\ - ldr r1, _08026E50 @ =gBattleCommunication\n\ - movs r0, 0x1\n\ -_08026E24:\n\ - strb r0, [r1, 0x5]\n\ - ldr r3, _08026E54 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_08026E40:\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\ -_08026E50: .4byte gBattleCommunication\n\ -_08026E54: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} -#endif // NOTMATCHING - -static void atk94_damagetohalftargethp(void) //super fang -{ - gBattleMoveDamage = gBattleMons[gBankTarget].hp / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattlescriptCurrInstr++; -} - -static void atk95_setsandstorm(void) -{ - if (gBattleWeather & WEATHER_SANDSTORM_ANY) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gBattleWeather = WEATHER_SANDSTORM_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - gWishFutureKnock.weatherDuration = 5; - } - gBattlescriptCurrInstr++; -} - -static void atk96_weatherdamage(void) -{ - if (WEATHER_HAS_EFFECT) - { - if (gBattleWeather & WEATHER_SANDSTORM_ANY) - { - if (gBattleMons[gBankAttacker].type1 != TYPE_ROCK && gBattleMons[gBankAttacker].type1 != TYPE_STEEL && gBattleMons[gBankAttacker].type1 != TYPE_GROUND - && gBattleMons[gBankAttacker].type2 != TYPE_ROCK && gBattleMons[gBankAttacker].type2 != TYPE_STEEL && gBattleMons[gBankAttacker].type2 != TYPE_GROUND - && gBattleMons[gBankAttacker].ability != ABILITY_SAND_VEIL && !(gStatuses3[gBankAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBankAttacker] & STATUS3_UNDERWATER)) - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } - else - { - gBattleMoveDamage = 0; - } - } - if (gBattleWeather & WEATHER_HAIL) - { - if (gBattleMons[gBankAttacker].type1 != TYPE_ICE && gBattleMons[gBankAttacker].type2 != TYPE_ICE && !(gStatuses3[gBankAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBankAttacker] & STATUS3_UNDERWATER)) - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } - else - { - gBattleMoveDamage = 0; - } - } - } - else - gBattleMoveDamage = 0; - - if (gAbsentBattlerFlags & gBitTable[gBankAttacker]) - gBattleMoveDamage = 0; - - gBattlescriptCurrInstr++; -} - -static void atk97_tryinfatuating(void) -{ - struct Pokemon *attacker, *target; - u16 atk_species, def_species; - u32 atk_pid, def_pid; - if (!GetBattlerSide(gBankAttacker)) - attacker = &gPlayerParty[gBattlerPartyIndexes[gBankAttacker]]; - else - attacker = &gEnemyParty[gBattlerPartyIndexes[gBankAttacker]]; - - if (!GetBattlerSide(gBankTarget)) - target = &gPlayerParty[gBattlerPartyIndexes[gBankTarget]]; - else - target = &gEnemyParty[gBattlerPartyIndexes[gBankTarget]]; - - atk_species = GetMonData(attacker, MON_DATA_SPECIES); - atk_pid = GetMonData(attacker, MON_DATA_PERSONALITY); - - def_species = GetMonData(target, MON_DATA_SPECIES); - def_pid = GetMonData(target, MON_DATA_PERSONALITY); - - if (gBattleMons[gBankTarget].ability == ABILITY_OBLIVIOUS) - { - gBattlescriptCurrInstr = BattleScript_ObliviousPreventsAttraction; - gLastUsedAbility = ABILITY_OBLIVIOUS; - RecordAbilityBattle(gBankTarget, ABILITY_OBLIVIOUS); - } - else - { - if (GetGenderFromSpeciesAndPersonality(atk_species, atk_pid) == GetGenderFromSpeciesAndPersonality(def_species, def_pid) - || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE || gBattleMons[gBankTarget].status2 & STATUS2_INFATUATION || GetGenderFromSpeciesAndPersonality(atk_species, atk_pid) == 0xFF - || GetGenderFromSpeciesAndPersonality(def_species, def_pid) == 0xFF) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - gBattleMons[gBankTarget].status2 |= (gBitTable[gBankAttacker] << 16); - gBattlescriptCurrInstr += 5; - } - } -} - -static void atk98_updatestatusicon(void) -{ - if (gBattleExecBuffer) - return; - - if (T2_READ_8(gBattlescriptCurrInstr + 1) != 4) - { - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; - } - else - { - gActiveBattler = gBankAttacker; - if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) - { - EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); - MarkBufferBankForExecution(gActiveBattler); - } - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2); - if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) - { - EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); - MarkBufferBankForExecution(gActiveBattler); - } - } - gBattlescriptCurrInstr += 2; - } -} - -static void atk99_setmist(void) -{ - if (gSideTimers[GetBattlerPosition(gBankAttacker) & 1].mistTimer) - { - gMoveResultFlags |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gSideTimers[GetBattlerPosition(gBankAttacker) & 1].mistTimer = 5; - gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] |= SIDE_STATUS_MIST; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - gBattlescriptCurrInstr++; -} - -static void atk9A_setfocusenergy(void) -{ - if (gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) - { - gMoveResultFlags |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gBattleMons[gBankAttacker].status2 |= STATUS2_FOCUS_ENERGY; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - gBattlescriptCurrInstr++; -} - -static void atk9B_transformdataexecution(void) -{ - gChosenMove = 0xFFFF; - gBattlescriptCurrInstr++; - if (gBattleMons[gBankTarget].status2 & STATUS2_TRANSFORMED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE) - { - gMoveResultFlags |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - u32 i; s32 j; - u8 *atk_data, *def_data; - gBattleMons[gBankAttacker].status2 |= STATUS2_TRANSFORMED; - gDisableStructs[gBankAttacker].disabledMove = 0; - gDisableStructs[gBankAttacker].disableTimer1 = 0; - gDisableStructs[gBankAttacker].transformedMonPersonality = gBattleMons[gBankTarget].personality; - gDisableStructs[gBankAttacker].unk18_b = 0; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 6; - gBattleTextBuff1[2] = (gBattleMons[gBankTarget].species); - gBattleTextBuff1[3] = uBYTE1_16(gBattleMons[gBankTarget].species); - gBattleTextBuff1[4] = 0xFF; - - atk_data = (u8*)(&gBattleMons[gBankAttacker]); - def_data = (u8*)(&gBattleMons[gBankTarget]); - - for (i = 0; i < 0x24; i++) - atk_data[i] = def_data[i]; - - for (j = 0; j < 4; j++) - { - if (gBattleMoves[gBattleMons[gBankAttacker].moves[j]].pp < 5) - gBattleMons[gBankAttacker].pp[j] = gBattleMoves[gBattleMons[gBankAttacker].moves[j]].pp; - else - gBattleMons[gBankAttacker].pp[j] = 5; - } - - gActiveBattler = gBankAttacker; - EmitResetActionMoveSelection(0, 2); - MarkBufferBankForExecution(gActiveBattler); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } -} - -static void atk9C_setsubstitute(void) -{ - u32 hp = gBattleMons[gBankAttacker].maxHP / 4; - if (gBattleMons[gBankAttacker].maxHP / 4 == 0) - hp = 1; - if (gBattleMons[gBankAttacker].hp <= hp) - { - gBattleMoveDamage = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMons[gBankAttacker].status2 |= STATUS2_SUBSTITUTE; - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED); - gDisableStructs[gBankAttacker].substituteHP = gBattleMoveDamage; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE; - } - gBattlescriptCurrInstr++; -} - -static bool8 IsMoveUncopyable(u16 move) -{ - int i; - for (i = 0; sMovesForbiddenToCopy[i] != 0xFFFE && sMovesForbiddenToCopy[i] != move; i++) {} - return (sMovesForbiddenToCopy[i] != 0xFFFE); -} - -static void atk9D_mimicattackcopy(void) -{ - gChosenMove = 0xFFFF; - if (IsMoveUncopyable(gLastUsedMove[gBankTarget]) || gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED - || gLastUsedMove[gBankTarget] == 0 || gLastUsedMove[gBankTarget] == 0xFFFF) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - int i; - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankAttacker].moves[i] == gLastUsedMove[gBankTarget]) - break; - } - if (i == 4) - { - gBattleMons[gBankAttacker].moves[gCurrMovePos] = gLastUsedMove[gBankTarget]; - if (gBattleMoves[gLastUsedMove[gBankTarget]].pp < 5) - gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gLastUsedMove[gBankTarget]].pp; - else - gBattleMons[gBankAttacker].pp[gCurrMovePos] = 5; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gLastUsedMove[gBankTarget]; - gBattleTextBuff1[3] = uBYTE1_16(gLastUsedMove[gBankTarget]); - gBattleTextBuff1[4] = 0xFF; - - gDisableStructs[gBankAttacker].unk18_b |= gBitTable[gCurrMovePos]; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -#if DEBUG -NAKED -static void atk9E_metronome(void) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - ldr r6, ._3076 @ gBankAttacker\n\ - ldrb r2, [r6]\n\ - lsl r1, r2, #0x1\n\ - ldr r0, ._3076 + 4 @ \n\ - add r3, r1, r0\n\ - ldr r5, ._3076 + 8 @ \n\ - mov r4, #0x58\n\ - add r0, r2, #0\n\ - mul r0, r0, r4\n\ - add r1, r0, r5\n\ - ldrh r0, [r1, #0xe]\n\ - cmp r0, #0\n\ - bne ._3071 @cond_branch\n\ - ldrh r2, [r1, #0x10]\n\ - cmp r2, #0\n\ - beq ._3071 @cond_branch\n\ - ldrh r0, [r1, #0x12]\n\ - cmp r0, #0\n\ - beq ._3071 @cond_branch\n\ - ldrh r0, [r3]\n\ - cmp r0, #0\n\ - bne ._3072 @cond_branch\n\ - strh r2, [r3]\n\ -._3072:\n\ - ldr r1, ._3076 + 12 @ \n\ - ldrh r0, [r3]\n\ - strh r0, [r1]\n\ - ldrb r0, [r6]\n\ - mul r0, r0, r4\n\ - add r0, r0, r5\n\ - ldrh r5, [r0, #0x10]\n\ - ldrh r2, [r0, #0x12]\n\ - add r7, r1, #0\n\ - cmp r5, r2\n\ - bcs ._3073 @cond_branch\n\ - ldrh r0, [r3]\n\ - cmp r0, r2\n\ - beq ._3074 @cond_branch\n\ - add r0, r0, #0x1\n\ - b ._3079\n\ -._3077:\n\ - .align 2, 0\n\ -._3076:\n\ - .word gBankAttacker\n\ - .word +0x20160b4\n\ - .word gBattleMons\n\ - .word gCurrentMove\n\ -._3073:\n\ - ldrh r4, [r3]\n\ - add r1, r4, #0\n\ - mov r0, #0xb1\n\ - lsl r0, r0, #0x1\n\ - cmp r1, r0\n\ - bne ._3078 @cond_branch\n\ - mov r0, #0x1\n\ - b ._3079\n\ -._3078:\n\ - cmp r1, r2\n\ - bne ._3080 @cond_branch\n\ -._3074:\n\ - strh r5, [r3]\n\ - b ._3081\n\ -._3080:\n\ - add r0, r4, #1\n\ -._3079:\n\ - strh r0, [r3]\n\ -._3081:\n\ - ldr r4, ._3083 @ gHitMarker\n\ - ldr r2, [r4]\n\ - ldr r0, ._3083 + 4 @ 0xfffffbff\n\ - and r2, r2, r0\n\ - str r2, [r4]\n\ - ldr r6, ._3083 + 8 @ gBattlescriptCurrInstr\n\ - ldr r5, ._3083 + 12 @ gBattleScriptsForMoveEffects\n\ - ldr r3, ._3083 + 16 @ gBattleMoves\n\ - ldrh r1, [r7]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r3\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r5\n\ - ldr r0, [r0]\n\ - str r0, [r6]\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x4\n\ - orr r2, r2, r0\n\ - str r2, [r4]\n\ - ldrh r0, [r7]\n\ - b ._3082\n\ -._3084:\n\ - .align 2, 0\n\ -._3083:\n\ - .word gHitMarker\n\ - .word 0xfffffbff\n\ - .word gBattlescriptCurrInstr\n\ - .word gBattleScriptsForMoveEffects\n\ - .word gBattleMoves\n\ -._3071:\n\ - ldr r7, ._3090 @ gCurrentMove\n\ - mov r6, #0xb1\n\ - lsl r6, r6, #0x1\n\ - ldr r5, ._3090 + 4 @ sMovesForbiddenToCopy\n\ - ldr r0, ._3090 + 8 @ gBattlescriptCurrInstr\n\ - mov r8, r0\n\ -._3089:\n\ - bl Random\n\ - ldr r2, ._3090 + 12 @ 0x1ff\n\ - add r1, r2, #0\n\ - and r0, r0, r1\n\ - add r0, r0, #0x1\n\ - strh r0, [r7]\n\ - cmp r0, r6\n\ - bhi ._3089 @cond_branch\n\ - mov r0, #0x3\n\ -._3086:\n\ - sub r0, r0, #0x1\n\ - cmp r0, #0\n\ - bge ._3086 @cond_branch\n\ - ldr r4, ._3090 @ gCurrentMove\n\ - ldrh r2, [r4]\n\ - ldr r3, ._3090 + 16 @ 0xffff\n\ - sub r0, r5, #2\n\ -._3088:\n\ - add r0, r0, #0x2\n\ - ldrh r1, [r0]\n\ - cmp r1, r2\n\ - beq ._3087 @cond_branch\n\ - cmp r1, r3\n\ - bne ._3088 @cond_branch\n\ -._3087:\n\ - ldr r0, ._3090 + 16 @ 0xffff\n\ - cmp r1, r0\n\ - bne ._3089 @cond_branch\n\ - ldr r2, ._3090 + 20 @ gHitMarker\n\ - ldr r0, [r2]\n\ - ldr r1, ._3090 + 24 @ 0xfffffbff\n\ - and r0, r0, r1\n\ - str r0, [r2]\n\ - ldr r3, ._3090 + 28 @ gBattleScriptsForMoveEffects\n\ - ldr r2, ._3090 + 32 @ gBattleMoves\n\ - ldrh r1, [r4]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r2\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r3\n\ - ldr r0, [r0]\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - ldrh r0, [r4]\n\ -._3082:\n\ - mov r1, #0x0\n\ - bl GetMoveTarget\n\ - ldr r1, ._3090 + 36 @ gBankTarget\n\ - strb r0, [r1]\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._3091:\n\ - .align 2, 0\n\ -._3090:\n\ - .word gCurrentMove\n\ - .word sMovesForbiddenToCopy\n\ - .word gBattlescriptCurrInstr\n\ - .word 0x1ff\n\ - .word 0xffff\n\ - .word gHitMarker\n\ - .word 0xfffffbff\n\ - .word gBattleScriptsForMoveEffects\n\ - .word gBattleMoves\n\ - .word gBankTarget"); -} -#else -#ifdef NONMATCHING -static void atk9E_metronome(void) -{ - // sMovesForbiddenToCopy - int i; - do - { - while ((gCurrentMove = (Random() & 0x1FF) + 1) > 0x162); - for (i = 0; sMovesForbiddenToCopy[i] != gCurrentMove && sMovesForbiddenToCopy[i] != 0xFFFF; i++); - } while (sMovesForbiddenToCopy[i] != 0xFFFF); - - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - gBankTarget = GetMoveTarget(gCurrentMove, 0); -} - -#else -NAKED -static void atk9E_metronome(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - ldr r7, _08027938 @ =gCurrentMove\n\ - movs r6, 0xB1\n\ - lsls r6, 1\n\ - ldr r5, _0802793C @ =sMovesForbiddenToCopy\n\ - ldr r0, _08027940 @ =gBattlescriptCurrInstr\n\ - mov r8, r0\n\ -_080278CA:\n\ - bl Random\n\ - ldr r2, _08027944 @ =0x000001ff\n\ - adds r1, r2, 0\n\ - ands r0, r1\n\ - adds r0, 0x1\n\ - strh r0, [r7]\n\ - cmp r0, r6\n\ - bhi _080278CA\n\ - movs r0, 0x3\n\ -_080278DE:\n\ - subs r0, 0x1\n\ - cmp r0, 0\n\ - bge _080278DE\n\ - ldr r4, _08027938 @ =gCurrentMove\n\ - ldrh r2, [r4]\n\ - ldr r3, _08027948 @ =0x0000ffff\n\ - subs r0, r5, 0x2\n\ -_080278EC:\n\ - adds r0, 0x2\n\ - ldrh r1, [r0]\n\ - cmp r1, r2\n\ - beq _080278F8\n\ - cmp r1, r3\n\ - bne _080278EC\n\ -_080278F8:\n\ - ldr r0, _08027948 @ =0x0000ffff\n\ - cmp r1, r0\n\ - bne _080278CA\n\ - ldr r2, _0802794C @ =gHitMarker\n\ - ldr r0, [r2]\n\ - ldr r1, _08027950 @ =0xfffffbff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r3, _08027954 @ =gBattleScriptsForMoveEffects\n\ - ldr r2, _08027958 @ =gBattleMoves\n\ - ldrh r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - ldrh r0, [r4]\n\ - movs r1, 0\n\ - bl GetMoveTarget\n\ - ldr r1, _0802795C @ =gBankTarget\n\ - strb r0, [r1]\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08027938: .4byte gCurrentMove\n\ -_0802793C: .4byte sMovesForbiddenToCopy\n\ -_08027940: .4byte gBattlescriptCurrInstr\n\ -_08027944: .4byte 0x000001ff\n\ -_08027948: .4byte 0x0000ffff\n\ -_0802794C: .4byte gHitMarker\n\ -_08027950: .4byte 0xfffffbff\n\ -_08027954: .4byte gBattleScriptsForMoveEffects\n\ -_08027958: .4byte gBattleMoves\n\ -_0802795C: .4byte gBankTarget\n\ - .syntax divided"); -} -#endif // NONMATCHING -#endif - -static void atk9F_dmgtolevel(void) -{ - gBattleMoveDamage = gBattleMons[gBankAttacker].level; - gBattlescriptCurrInstr++; -} - -static void atkA0_psywavedamageeffect(void) -{ - s32 rand_dmg; - while ((rand_dmg = (Random() & 0xF)) > 0xA); - rand_dmg *= 10; - gBattleMoveDamage = gBattleMons[gBankAttacker].level * (rand_dmg + 50) / 100; - gBattlescriptCurrInstr++; -} - -static void atkA1_counterdamagecalculator(void) -{ - u8 atk_side = GetBattlerSide(gBankAttacker); - u8 def_side = GetBattlerSide(gProtectStructs[gBankAttacker].physicalBank); - if (gProtectStructs[gBankAttacker].physicalDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].physicalBank].hp) - { - gBattleMoveDamage = gProtectStructs[gBankAttacker].physicalDmg * 2; - if (gSideTimers[def_side].followmeTimer && gBattleMons[gSideTimers[def_side].followmeTarget].hp) - gBankTarget = gSideTimers[def_side].followmeTarget; - else - gBankTarget = gProtectStructs[gBankAttacker].physicalBank; - gBattlescriptCurrInstr += 5; - } - else - { - gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkA2_mirrorcoatdamagecalculator(void) //a copy of atkA1 with the physical -> special field changes -{ - u8 atk_side = GetBattlerSide(gBankAttacker); - u8 def_side = GetBattlerSide(gProtectStructs[gBankAttacker].specialBank); - if (gProtectStructs[gBankAttacker].specialDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].specialBank].hp) - { - gBattleMoveDamage = gProtectStructs[gBankAttacker].specialDmg * 2; - if (gSideTimers[def_side].followmeTimer && gBattleMons[gSideTimers[def_side].followmeTarget].hp) - gBankTarget = gSideTimers[def_side].followmeTarget; - else - gBankTarget = gProtectStructs[gBankAttacker].specialBank; - gBattlescriptCurrInstr += 5; - } - else - { - gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkA3_disablelastusedattack(void) -{ - int i; - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankTarget].moves[i] == gLastUsedMove[gBankTarget]) - break; - } - if (gDisableStructs[gBankTarget].disabledMove == 0 && i != 4 && gBattleMons[gBankTarget].pp[i] != 0) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gBattleMons[gBankTarget].moves[i]; - gBattleTextBuff1[3] = uBYTE1_16(gBattleMons[gBankTarget].moves[i]); - gBattleTextBuff1[4] = 0xFF; - - gDisableStructs[gBankTarget].disabledMove = gBattleMons[gBankTarget].moves[i]; - gDisableStructs[gBankTarget].disableTimer1 = (Random() & 3) + 2; - gDisableStructs[gBankTarget].disableTimer2 = gDisableStructs[gBankTarget].disableTimer1; //that's interesting - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkA4_trysetencore(void) -{ - int i; - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankTarget].moves[i] == gLastUsedMove[gBankTarget]) - break; - } - if (gLastUsedMove[gBankTarget] == MOVE_STRUGGLE || gLastUsedMove[gBankTarget] == MOVE_ENCORE || gLastUsedMove[gBankTarget] == MOVE_MIRROR_MOVE) - i = 4; - if (gDisableStructs[gBankTarget].encoredMove == 0 && i != 4 && gBattleMons[gBankTarget].pp[i] != 0) - { - gDisableStructs[gBankTarget].encoredMove = gBattleMons[gBankTarget].moves[i]; - gDisableStructs[gBankTarget].encoredMovePos = i; - gDisableStructs[gBankTarget].encoreTimer1 = (Random() & 3) + 3; - gDisableStructs[gBankTarget].encoreTimer2 = gDisableStructs[gBankTarget].encoreTimer1; - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkA5_painsplitdmgcalc(void) -{ - if (!(gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE)) - { - s32 hp_diff = (gBattleMons[gBankAttacker].hp + gBattleMons[gBankTarget].hp) / 2; - s32 to_store = gBattleMoveDamage = gBattleMons[gBankTarget].hp - hp_diff; - gBattleStruct->unk16014 = sBYTE0_32(to_store); - gBattleStruct->unk16015 = sBYTE1_32(to_store); - gBattleStruct->unk16016 = sBYTE2_32(to_store); - gBattleStruct->unk16017 = sBYTE3_32(to_store); - - gBattleMoveDamage = gBattleMons[gBankAttacker].hp - hp_diff; - gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF; - - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -#ifdef NONMATCHING -static void atkA6_settypetorandomresistance(void) -{ - if (gLastLandedMoves[gBankAttacker] == 0 || gLastLandedMoves[gBankAttacker] == 0xFFFF || (IsTwoTurnsMove(gLastLandedMoves[gBankAttacker]) && !gProtectStructs[gBankAttacker].physicalDmg && !gProtectStructs[gBankAttacker].specialDmg)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - int type = 0, rands = 0; - do - { - while (((type = (Random() & 0x7F)) > 0x70)); - type *= 3; - if (gTypeEffectiveness[type] == gLastHitByType[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1]) - { - gBattleMons[gBankAttacker].type1 = type; - gBattleMons[gBankAttacker].type2 = type; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = type; - gBattleTextBuff1[3] = 0xFF; - gBattlescriptCurrInstr += 5; - return; - } - rands++; - } while (rands <= 999); - - type = 0, rands = 0; - do - { - if (gTypeEffectiveness[type] == 0xFE || gTypeEffectiveness[type] != 0xFF) - { - if (gTypeEffectiveness[type] == gLastHitByType[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1]) - { - gBattleMons[gBankAttacker].type1 = gTypeEffectiveness[rands + 1]; - gBattleMons[gBankAttacker].type2 = gTypeEffectiveness[rands + 1]; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = gTypeEffectiveness[rands + 1]; - gBattleTextBuff1[3] = 0xFF; - gBattlescriptCurrInstr += 5; - return; - } - } - type += 3, rands += 3; - } while (rands < 336); - - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -#else -NAKED -static void atkA6_settypetorandomresistance(void) -{ - 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\ - ldr r1, _08027FA8 @ =gLastLandedMoves\n\ - ldr r4, _08027FAC @ =gBankAttacker\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r2, r0, r1\n\ - ldrh r1, [r2]\n\ - cmp r1, 0\n\ - beq _08027F8C\n\ - ldr r0, _08027FB0 @ =0x0000ffff\n\ - cmp r1, r0\n\ - beq _08027F8C\n\ - ldrh r0, [r2]\n\ - bl IsTwoTurnsMove\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08028024\n\ - ldr r2, _08027FB4 @ =gProtectStructs\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 4\n\ - adds r0, r2, 0x4\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08028024\n\ - adds r0, r2, 0\n\ - adds r0, 0x8\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08028024\n\ -_08027F8C:\n\ - ldr r3, _08027FB8 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ - b _08028110\n\ - .align 2, 0\n\ -_08027FA8: .4byte gLastLandedMoves\n\ -_08027FAC: .4byte gBankAttacker\n\ -_08027FB0: .4byte 0x0000ffff\n\ -_08027FB4: .4byte gProtectStructs\n\ -_08027FB8: .4byte gBattlescriptCurrInstr\n\ -_08027FBC:\n\ - mov r0, r12\n\ - strb r5, [r0]\n\ - mov r1, r10\n\ - ldrb r0, [r1]\n\ - muls r0, r2\n\ - adds r0, r7\n\ - adds r0, 0x22\n\ - strb r5, [r0]\n\ - ldr r1, _08027FE0 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x3\n\ - strb r0, [r1, 0x1]\n\ - strb r5, [r1, 0x2]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x3]\n\ - ldr r1, _08027FE4 @ =gBattlescriptCurrInstr\n\ - b _08028012\n\ - .align 2, 0\n\ -_08027FE0: .4byte gBattleTextBuff1\n\ -_08027FE4: .4byte gBattlescriptCurrInstr\n\ -_08027FE8:\n\ - mov r0, r8\n\ - adds r0, 0x1\n\ - adds r0, r3\n\ - ldrb r2, [r0]\n\ - strb r2, [r4]\n\ - mov r4, r10\n\ - ldrb r0, [r4]\n\ - muls r0, r6\n\ - ldr r7, _0802801C @ =gBattleMons\n\ - adds r0, r7\n\ - adds r0, 0x22\n\ - strb r2, [r0]\n\ - ldr r1, _08028020 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x3\n\ - strb r0, [r1, 0x1]\n\ - strb r2, [r1, 0x2]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x3]\n\ - mov r1, r12\n\ -_08028012:\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - b _08028110\n\ - .align 2, 0\n\ -_0802801C: .4byte gBattleMons\n\ -_08028020: .4byte gBattleTextBuff1\n\ -_08028024:\n\ - movs r4, 0\n\ - mov r8, r4\n\ - movs r7, 0x7F\n\ - mov r9, r7\n\ -_0802802C:\n\ - bl Random\n\ - mov r4, r9\n\ - ands r4, r0\n\ - cmp r4, 0x70\n\ - bhi _0802802C\n\ - lsls r0, r4, 1\n\ - adds r4, r0, r4\n\ - ldr r6, _08028120 @ =gTypeEffectiveness\n\ - adds r3, r4, r6\n\ - ldr r1, _08028124 @ =gLastHitByType\n\ - ldr r2, _08028128 @ =gBankAttacker\n\ - ldrb r5, [r2]\n\ - lsls r0, r5, 1\n\ - adds r0, r1\n\ - ldrb r1, [r3]\n\ - mov r10, r2\n\ - ldrh r0, [r0]\n\ - cmp r1, r0\n\ - bne _08028088\n\ - adds r0, r4, 0x2\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x5\n\ - bhi _08028088\n\ - ldr r7, _0802812C @ =gBattleMons\n\ - movs r2, 0x58\n\ - adds r0, r5, 0\n\ - muls r0, r2\n\ - adds r3, r0, r7\n\ - movs r0, 0x21\n\ - adds r0, r3\n\ - mov r12, r0\n\ - adds r0, r4, 0x1\n\ - adds r0, r6\n\ - ldrb r5, [r0]\n\ - mov r1, r12\n\ - ldrb r0, [r1]\n\ - adds r1, r5, 0\n\ - cmp r0, r1\n\ - beq _08028088\n\ - adds r0, r3, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, r1\n\ - bne _08027FBC\n\ -_08028088:\n\ - movs r7, 0x1\n\ - add r8, r7\n\ - ldr r0, _08028130 @ =0x000003e7\n\ - cmp r8, r0\n\ - ble _0802802C\n\ - movs r0, 0\n\ - mov r8, r0\n\ - ldr r1, _08028134 @ =gBattlescriptCurrInstr\n\ - mov r12, r1\n\ - ldr r3, _08028120 @ =gTypeEffectiveness\n\ - adds r0, r4, 0x1\n\ - adds r0, r3\n\ - mov r9, r0\n\ - adds r5, r3, 0\n\ -_080280A4:\n\ - ldrb r1, [r5]\n\ - cmp r1, 0xFF\n\ - bgt _080280AE\n\ - cmp r1, 0xFE\n\ - bge _080280E8\n\ -_080280AE:\n\ - mov r4, r10\n\ - ldrb r2, [r4]\n\ - lsls r0, r2, 1\n\ - ldr r7, _08028124 @ =gLastHitByType\n\ - adds r0, r7\n\ - ldrh r0, [r0]\n\ - cmp r1, r0\n\ - bne _080280E8\n\ - ldrb r0, [r5, 0x2]\n\ - cmp r0, 0x5\n\ - bhi _080280E8\n\ - movs r6, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r6\n\ - ldr r1, _0802812C @ =gBattleMons\n\ - adds r2, r0, r1\n\ - adds r4, r2, 0\n\ - adds r4, 0x21\n\ - ldrb r0, [r4]\n\ - mov r7, r9\n\ - ldrb r1, [r7]\n\ - cmp r0, r1\n\ - beq _080280E8\n\ - adds r0, r2, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, r1\n\ - beq _080280E8\n\ - b _08027FE8\n\ -_080280E8:\n\ - adds r5, 0x3\n\ - movs r0, 0x3\n\ - add r8, r0\n\ - ldr r0, _08028138 @ =0x0000014f\n\ - cmp r8, r0\n\ - bls _080280A4\n\ - mov r1, r12\n\ - ldr r2, [r1]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - mov r4, r12\n\ - str r1, [r4]\n\ -_08028110:\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\ -_08028120: .4byte gTypeEffectiveness\n\ -_08028124: .4byte gLastHitByType\n\ -_08028128: .4byte gBankAttacker\n\ -_0802812C: .4byte gBattleMons\n\ -_08028130: .4byte 0x000003e7\n\ -_08028134: .4byte gBattlescriptCurrInstr\n\ -_08028138: .4byte 0x0000014f\n\ - .syntax divided"); -} -#endif // NONMATCHING - -static void atkA7_setalwayshitflag(void) -{ - gStatuses3[gBankTarget] &= ~(STATUS3_ALWAYS_HITS); - gStatuses3[gBankTarget] |= 0x10; - gDisableStructs[gBankTarget].bankWithSureHit = gBankAttacker; - gBattlescriptCurrInstr++; -} - -struct move_pp -{ - u16 move[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -static void atkA8_copymovepermanently(void) -{ - gChosenMove = 0xFFFF; - if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED) && gUnknown_02024C2C[gBankTarget] != MOVE_STRUGGLE && gUnknown_02024C2C[gBankTarget] != 0 && gUnknown_02024C2C[gBankTarget] != 0xFFFF && gUnknown_02024C2C[gBankTarget] != MOVE_SKETCH) - { - int i; - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankAttacker].moves[i] == MOVE_SKETCH) - continue; - if (gBattleMons[gBankAttacker].moves[i] == gUnknown_02024C2C[gBankTarget]) - break; - } - if (i != 4) //sketch fail - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else //sketch worked - { - struct move_pp moves_data; - gBattleMons[gBankAttacker].moves[gCurrMovePos] = gUnknown_02024C2C[gBankTarget]; - gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gUnknown_02024C2C[gBankTarget]].pp; - gActiveBattler = gBankAttacker; - for (i = 0; i < 4; i++) - { - moves_data.move[i] = gBattleMons[gBankAttacker].moves[i]; - moves_data.pp[i] = gBattleMons[gBankAttacker].pp[i]; - } - moves_data.ppBonuses = gBattleMons[gBankAttacker].ppBonuses; - EmitSetMonData(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct move_pp), &moves_data); - MarkBufferBankForExecution(gActiveBattler); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gUnknown_02024C2C[gBankTarget]; - gBattleTextBuff1[3] = gUnknown_02024C2C[gBankTarget] >> 8; - gBattleTextBuff1[4] = 0xFF; - gBattlescriptCurrInstr += 5; - } - } - else //sketch fail - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static bool8 IsTwoTurnsMove(u16 move) -{ - u8 effect = gBattleMoves[move].effect; - if (effect == EFFECT_SKULL_BASH || effect == EFFECT_RAZOR_WIND || effect == EFFECT_SKY_ATTACK || effect == EFFECT_SOLARBEAM || effect == EFFECT_FLY || effect == EFFECT_BIDE) - return 1; - else - return 0; -} - -static bool8 IsMoveUnchoosable(u16 move) -{ - if (move == 0 || move == MOVE_SLEEP_TALK || move == MOVE_ASSIST || move == MOVE_MIRROR_MOVE || move == MOVE_METRONOME) - return 1; - else - return 0; -} - -static u8 AttacksThisTurn(u8 bank, u16 move) //Note: returns 1 if it's a charging turn, otherwise 2 -{ - //first argument is unused - u8 effect; - if (gBattleMoves[move].effect == EFFECT_SOLARBEAM && (gBattleWeather & WEATHER_SUN_ANY)) - return 2; - effect = gBattleMoves[move].effect; - if (effect == EFFECT_SKULL_BASH || effect == EFFECT_RAZOR_WIND || effect == EFFECT_SKY_ATTACK || effect == EFFECT_SOLARBEAM || effect == EFFECT_FLY || effect == EFFECT_BIDE) - { - if ((gHitMarker & HITMARKER_x8000000)) - return 1; - } - return 2; -} - -static void atkA9_trychoosesleeptalkmove(void) -{ - u8 unusable_moves = 0; - int i; - - for (i = 0; i < 4; i++) - { - if (IsMoveUnchoosable(gBattleMons[gBankAttacker].moves[i]) || gBattleMons[gBankAttacker].moves[i] == MOVE_FOCUS_PUNCH - || gBattleMons[gBankAttacker].moves[i] == MOVE_UPROAR || IsTwoTurnsMove(gBattleMons[gBankAttacker].moves[i])) - unusable_moves |= gBitTable[i]; - } - unusable_moves = CheckMoveLimitations(gBankAttacker, unusable_moves, 0xFD); - if (unusable_moves == 0xF) //all 4 moves cannot be chosen - gBattlescriptCurrInstr += 5; - else //at least one move can be chosen - { - u32 random_pos; - do - { - random_pos = Random() & 3; - } while ((gBitTable[random_pos] & unusable_moves)); - - gRandomMove = gBattleMons[gBankAttacker].moves[random_pos]; - gCurrMovePos = random_pos; - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gBankTarget = GetMoveTarget(gRandomMove, 0); - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkAA_setdestinybond(void) -{ - gBattleMons[gBankAttacker].status2 |= STATUS2_DESTINY_BOND; - gBattlescriptCurrInstr++; -} - -static void TrySetDestinyBondToHappen(void) -{ - u8 atk_side = GetBattlerSide(gBankAttacker); - u8 def_side = GetBattlerSide(gBankTarget); - if (gBattleMons[gBankTarget].status2 & STATUS2_DESTINY_BOND && atk_side != def_side && !(gHitMarker & HITMARKER_GRUDGE)) - gHitMarker |= HITMARKER_DESTINYBOND; -} - -static void atkAB_trysetdestinybondtohappen(void) -{ - TrySetDestinyBondToHappen(); - gBattlescriptCurrInstr++; -} - -static void atkAC_remaininghptopower(void) -{ - s32 hp_fraction = GetScaledHPFraction(gBattleMons[gBankAttacker].hp, gBattleMons[gBankAttacker].maxHP, 48); - int i; - for (i = 0; i < 12; i += 2) - { - if (hp_fraction <= sFlailHpScaleToPowerTable[i]) - break; - } - gDynamicBasePower = sFlailHpScaleToPowerTable[i + 1]; - gBattlescriptCurrInstr++; -} - -static void atkAD_tryspiteppreduce(void) -{ - if (gLastUsedMove[gBankTarget] != 0 && gLastUsedMove[gBankTarget] != 0xFFFF && !(gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE)) - { - int i; - for (i = 0; i < 4; i++) - { - if (gLastUsedMove[gBankTarget] == gBattleMons[gBankTarget].moves[i]) - break; - } - if (i != 4 && gBattleMons[gBankTarget].pp[i] > 1) - { - s32 lost_pp = (Random() & 3) + 2; - if (gBattleMons[gBankTarget].pp[i] < lost_pp) - lost_pp = gBattleMons[gBankTarget].pp[i]; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gLastUsedMove[gBankTarget]; - gBattleTextBuff1[3] = gLastUsedMove[gBankTarget] >> 8; - gBattleTextBuff1[4] = 0xFF; - ConvertIntToDecimalStringN(gBattleTextBuff2, lost_pp, 0, 1); - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 1; - gBattleTextBuff2[2] = 1; - gBattleTextBuff2[3] = 1; - gBattleTextBuff2[4] = lost_pp; - gBattleTextBuff2[5] = 0xFF; - - gBattleMons[gBankTarget].pp[i] -= lost_pp; - gActiveBattler = gBankTarget; - if (!(gDisableStructs[gActiveBattler].unk18_b & gBitTable[i]) - && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) - { - EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBattler].pp[i]); - MarkBufferBankForExecution(gActiveBattler); - } - gBattlescriptCurrInstr += 5; - if (gBattleMons[gBankTarget].pp[i] == 0) - CancelMultiTurnMoves(gBankTarget); - return; - } - } - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkAE_healpartystatus(void) -{ - register u32 zero2 asm("r4") = 0; - u32 zero = zero2; - u8 to_heal = 0; - if (gCurrentMove == MOVE_HEAL_BELL) - { - struct Pokemon* party; - int i; - - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (GetBattlerSide(gBankAttacker) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - - if (gBattleMons[gBankAttacker].ability != ABILITY_SOUNDPROOF) - { - gBattleMons[gBankAttacker].status1 = 0; - } - else - { - RecordAbilityBattle(gBankAttacker, gBattleMons[gBankAttacker].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= 1; - } - - gActiveBattler = gBattleStruct->scriptingActive = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) - { - if (gBattleMons[gActiveBattler].ability != ABILITY_SOUNDPROOF) - { - gBattleMons[gActiveBattler].status1 = 0; - } - else - { - RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= 2; - } - } - - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES2); - u8 abilityBit = GetMonData(&party[i], MON_DATA_ALT_ABILITY); - if (species != 0 && species != SPECIES_EGG) - { - u8 ability; - if (gBattlerPartyIndexes[gBankAttacker] == i) - ability = gBattleMons[gBankAttacker].ability; - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[gActiveBattler] == i && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) - ability = gBattleMons[gActiveBattler].ability; - else - ability = GetAbilityBySpecies(species, abilityBit); - if (ability != ABILITY_SOUNDPROOF) - to_heal |= (1 << i); - } - } - } - else //Aromatherapy - { - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - to_heal = 0x3F; - gBattleMons[gBankAttacker].status1 = zero2; - - gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) - gBattleMons[gActiveBattler].status1 = 0; - - } - //missing check? - gActiveBattler = gBankAttacker; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, to_heal, 4, &zero); - MarkBufferBankForExecution(gActiveBattler); - - gBattlescriptCurrInstr++; -} - -static void atkAF_cursetarget(void) -{ - if (gBattleMons[gBankTarget].status2 & STATUS2_CURSED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - gBattleMons[gBankTarget].status2 |= STATUS2_CURSED; - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattlescriptCurrInstr += 5; - } -} - -static void atkB0_trysetspikes(void) -{ - u8 side = GetBattlerSide(gBankAttacker) ^ 1; - if (gSideTimers[side].spikesAmount == 3) - { - gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - gSideAffecting[side] |= SIDE_STATUS_SPIKES; - gSideTimers[side].spikesAmount++; - gBattlescriptCurrInstr += 5; - } -} - -static void atkB1_setforesight(void) -{ - gBattleMons[gBankTarget].status2 |= STATUS2_FORESIGHT; - gBattlescriptCurrInstr++; -} - -static void atkB2_trysetperishsong(void) -{ - int not_affected_pokes = 0, i; - - for (i = 0; i < gBattlersCount; i++) - { - if (gStatuses3[i] & STATUS3_PERISH_SONG || gBattleMons[i].ability == ABILITY_SOUNDPROOF) - not_affected_pokes++; - else - { - gStatuses3[i] |= STATUS3_PERISH_SONG; - gDisableStructs[i].perishSongTimer1 = 3; - gDisableStructs[i].perishSongTimer2 = 3; - } - } - - PressurePPLoseOnUsingPerishSong(gBankAttacker); - if (not_affected_pokes == gBattlersCount) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; -} - -static void atkB3_rolloutdamagecalculation(void) -{ - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - { - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveMissedPause; - } - else - { - int i; - if (!(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) //first hit - { - gDisableStructs[gBankAttacker].rolloutTimer1 = 5; - gDisableStructs[gBankAttacker].rolloutTimer2 = 5; - gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gBankAttacker] = gCurrentMove; - } - if (--gDisableStructs[gBankAttacker].rolloutTimer1 == 0) - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS); - - gDynamicBasePower = gBattleMoves[gCurrentMove].power; - for (i = 1; i < (5 - gDisableStructs[gBankAttacker].rolloutTimer1); i++) - gDynamicBasePower *= 2; - - if (gBattleMons[gBankAttacker].status2 & STATUS2_DEFENSE_CURL) - gDynamicBasePower *= 2; - - gBattlescriptCurrInstr++; - } -} - -static void atkB4_jumpifconfusedandstatmaxed(void) -{ - if (gBattleMons[gBankTarget].status2 & STATUS2_CONFUSION && gBattleMons[gBankTarget].statStages[T2_READ_8(gBattlescriptCurrInstr + 1)] == 0xC) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; -} - -static void atkB5_furycuttercalc(void) -{ - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - { - gDisableStructs[gBankAttacker].furyCutterCounter = 0; - gBattlescriptCurrInstr = BattleScript_MoveMissedPause; - } - else - { - int i; - - if (gDisableStructs[gBankAttacker].furyCutterCounter != 5) - gDisableStructs[gBankAttacker].furyCutterCounter++; - - gDynamicBasePower = gBattleMoves[gCurrentMove].power; - for (i = 1; i < gDisableStructs[gBankAttacker].furyCutterCounter; i++) - gDynamicBasePower *= 2; - - gBattlescriptCurrInstr++; - } -} - -static void atkB6_happinesstodamagecalculation(void) -{ - if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN) - gDynamicBasePower = 10 * (gBattleMons[gBankAttacker].friendship) / 25; - else //EFFECT_FRUSTRATION - gDynamicBasePower = 10 * (255 - gBattleMons[gBankAttacker].friendship) / 25; - gBattlescriptCurrInstr++; -} - -static void atkB7_presentdamagecalculation(void) -{ - s32 rand = Random() & 0xFF; - if (rand < 102) - gDynamicBasePower = 40; - else if (rand < 178) - gDynamicBasePower = 80; - else if (rand < 204) - gDynamicBasePower = 120; - else - { - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - } - if (rand < 204) - gBattlescriptCurrInstr = BattleScript_HitFromCritCalc; - else if (gBattleMons[gBankTarget].maxHP == gBattleMons[gBankTarget].hp) - gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp; - else - { - //gMoveResultFlags &= ~(MOVE_RESULT_DOESNT_AFFECT_FOE); only in Emerald - gBattlescriptCurrInstr = BattleScript_PresentHealTarget; - } -} - -static void atkB8_setsafeguard(void) -{ - if (gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] & SIDE_STATUS_SAFEGUARD) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else - { - gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] |= SIDE_STATUS_SAFEGUARD; - gSideTimers[GetBattlerPosition(gBankAttacker) & 1].safeguardTimer = 5; - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - } - gBattlescriptCurrInstr++; -} - -static void atkB9_magnitudedamagecalculation(void) -{ - s32 magnitude = Random() % 100; - if (magnitude < 5) - { - gDynamicBasePower = 10; - magnitude = 4; - } - else if (magnitude < 15) - { - gDynamicBasePower = 30; - magnitude = 5; - } - else if (magnitude < 35) - { - gDynamicBasePower = 50; - magnitude = 6; - } - else if (magnitude < 65) - { - gDynamicBasePower = 70; - magnitude = 7; - } - else if (magnitude < 85) - { - gDynamicBasePower = 90; - magnitude = 8; - } - else if (magnitude < 95) - { - gDynamicBasePower = 110; - magnitude = 9; - } - else - { - gDynamicBasePower = 150; - magnitude = 10; - } - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 1; - gBattleTextBuff1[3] = 2; - gBattleTextBuff1[4] = magnitude; - gBattleTextBuff1[5] = 0xFF; - - for (gBankTarget = 0; gBankTarget < gBattlersCount; gBankTarget++) - { - if (gBankTarget == gBankAttacker) - continue; - if (!(gAbsentBattlerFlags & gBitTable[gBankTarget])) //a valid target was found - break; - } - gBattlescriptCurrInstr++; -} - -static void atkBA_jumpifnopursuitswitchdmg(void) -{ - if (gMultiHitCounter == 1) - { - if (GetBattlerSide(gBankAttacker) == 0) - gBankTarget = GetBattlerAtPosition(1); - else - gBankTarget = GetBattlerAtPosition(0); - } - else - { - if (GetBattlerSide(gBankAttacker) == 0) - gBankTarget = GetBattlerAtPosition(3); - else - gBankTarget = GetBattlerAtPosition(2); - } - - if (gActionForBanks[gBankTarget] == 0 && gBankAttacker == ewram16010arr(gBankTarget) && !(gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE)) - && gBattleMons[gBankAttacker].hp && !gDisableStructs[gBankTarget].truantCounter && gChosenMovesByBanks[gBankTarget] == MOVE_PURSUIT) - { - int i; - for (i = 0; i < gBattlersCount; i++) - { - if (gBanksByTurnOrder[i] == gBankTarget) - gActionsByTurnOrder[i] = 11; - } - gCurrentMove = MOVE_PURSUIT; - gBattlescriptCurrInstr += 5; - gBattleStruct->animTurn = 1; - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkBB_setsunny(void) -{ - if (gBattleWeather & WEATHER_SUN_ANY) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gBattleWeather = WEATHER_SUN_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - gWishFutureKnock.weatherDuration = 5; - } - gBattlescriptCurrInstr++; -} - -static void atkBC_maxattackhalvehp(void) //belly drum -{ - u32 half_hp = gBattleMons[gBankAttacker].maxHP / 2; - if (!(gBattleMons[gBankAttacker].maxHP / 2)) - half_hp = 1; - - if (gBattleMons[gBankAttacker].statStages[STAT_STAGE_ATK] < 12 && gBattleMons[gBankAttacker].hp > half_hp) - { - gBattleMons[gBankAttacker].statStages[STAT_STAGE_ATK] = 12; - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkBD_copyfoestats(void) //psych up -{ - int i; - for (i = 0; i < 8; i++) - { - gBattleMons[gBankAttacker].statStages[i] = gBattleMons[gBankTarget].statStages[i]; - } - gBattlescriptCurrInstr += 5; //why not 1? possible unused fail possibility? -} - -static void atkBE_rapidspinfree(void) //rapid spin -{ - if (gBattleMons[gBankAttacker].status2 & STATUS2_WRAPPED) - { - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED); - gBankTarget = ewram16020arr(gBankAttacker); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = ewram16004arr(0, gBankAttacker); - gBattleTextBuff1[3] = ewram16004arr(1, gBankAttacker); - gBattleTextBuff1[4] = 0xFF; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WrapFree; - } - else if (gStatuses3[gBankAttacker] & STATUS3_LEECHSEED) - { - gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED); - gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED_BANK); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_LeechSeedFree; - } - else if (gSideAffecting[GetBattlerSide(gBankAttacker)] & SIDE_STATUS_SPIKES) - { - gSideAffecting[GetBattlerSide(gBankAttacker)] &= ~(SIDE_STATUS_SPIKES); - gSideTimers[GetBattlerSide(gBankAttacker)].spikesAmount = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SpikesFree; - } - else - gBattlescriptCurrInstr++; -} - -static void atkBF_setdefensecurlbit(void) -{ - gBattleMons[gBankAttacker].status2 |= STATUS2_DEFENSE_CURL; - gBattlescriptCurrInstr++; -} - -static void atkC0_recoverbasedonsunlight(void) -{ - gBankTarget = gBankAttacker; - if (gBattleMons[gBankAttacker].hp != gBattleMons[gBankAttacker].maxHP) - { - if (!gBattleWeather || !WEATHER_HAS_EFFECT) - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2; - else if (gBattleWeather & WEATHER_SUN_ANY) - gBattleMoveDamage = 20 * gBattleMons[gBankAttacker].maxHP / 30; - else //not sunny weather - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkC1_hiddenpowercalc(void) -{ - u8 power = ((gBattleMons[gBankAttacker].hpIV & 2) >> 1) | - ((gBattleMons[gBankAttacker].attackIV & 2)) | - ((gBattleMons[gBankAttacker].defenseIV & 2) << 1) | - ((gBattleMons[gBankAttacker].speedIV & 2) << 2) | - ((gBattleMons[gBankAttacker].spAttackIV & 2) << 3) | - ((gBattleMons[gBankAttacker].spDefenseIV & 2) << 4); - u8 type = ((gBattleMons[gBankAttacker].hpIV & 1)) | - ((gBattleMons[gBankAttacker].attackIV & 1) << 1) | - ((gBattleMons[gBankAttacker].defenseIV & 1) << 2) | - ((gBattleMons[gBankAttacker].speedIV & 1) << 3) | - ((gBattleMons[gBankAttacker].spAttackIV & 1) << 4) | - ((gBattleMons[gBankAttacker].spDefenseIV & 1) << 5); - - gDynamicBasePower = 30 + (power * 40 / 63); - - gBattleStruct->dynamicMoveType = ((type * 15) / 63) + 1; - if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY) - gBattleStruct->dynamicMoveType++; - - gBattleStruct->dynamicMoveType |= 0xC0; - - gBattlescriptCurrInstr++; -} - -static void atkC2_selectfirstvalidtarget(void) -{ - for (gBankTarget = 0; gBankTarget < gBattlersCount; gBankTarget++) - { - if (gBankTarget == gBankAttacker) - continue; - if (!(gAbsentBattlerFlags & gBitTable[gBankTarget])) - break; - } - gBattlescriptCurrInstr++; -} - -static void atkC3_trysetfutureattack(void) -{ - if (gWishFutureKnock.futureSightCounter[gBankTarget] != 0) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - gWishFutureKnock.futureSightMove[gBankTarget] = gCurrentMove; - gWishFutureKnock.futureSightAttacker[gBankTarget] = gBankAttacker; - gWishFutureKnock.futureSightCounter[gBankTarget] = 3; - gWishFutureKnock.futureSightDmg[gBankTarget] = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, - gSideAffecting[GetBattlerPosition(gBankTarget) & 1], 0, - 0, gBankAttacker, gBankTarget); - - if (gProtectStructs[gBankAttacker].helpingHand) - gWishFutureKnock.futureSightDmg[gBankTarget] = gWishFutureKnock.futureSightDmg[gBankTarget] * 15 / 10; - - if (gCurrentMove == MOVE_DOOM_DESIRE) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - - gBattlescriptCurrInstr += 5; - } -} - -#ifdef NONMATCHING -static void atkC4_trydobeatup(void) -{ - register struct Pokemon* party asm("r7"); - if (GetBattlerSide(gBankAttacker) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - - if (gBattleMons[gBankTarget].hp == 0) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - while (gBattleCommunication[0] < 6) - { - if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) - && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) != SPECIES_EGG && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) - break; - gBattleCommunication[0]++; - } - if (gBattleCommunication[0] < 6) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = gBankAttacker; - gBattleTextBuff1[3] = gBattleCommunication[0]; - gBattleTextBuff1[4] = 0xFF; - gBattlescriptCurrInstr += 9; - - gBattleMoveDamage = gBaseStats[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack; - gBattleMoveDamage *= gBattleMoves[gCurrentMove].power; - gBattleMoveDamage *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2); - gBattleMoveDamage /= gBaseStats[gBattleMons[gBankTarget].species].baseDefense; - gBattleMoveDamage = (gBattleMoveDamage / 50) + 2; - if (gProtectStructs[gBankAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - - gBattleCommunication[0]++; - } - else if (gBattleCommunication[0] != 0) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); - } -} -#else -NAKED -static void atkC4_trydobeatup(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - ldr r0, _08029A8C @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - ldr r7, _08029A90 @ =gEnemyParty\n\ - cmp r0, 0\n\ - bne _08029A62\n\ - ldr r7, _08029A94 @ =gPlayerParty\n\ -_08029A62:\n\ - ldr r2, _08029A98 @ =gBattleMons\n\ - ldr r0, _08029A9C @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r2\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _08029AA4\n\ - ldr r3, _08029AA0 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - b _08029C40\n\ - .align 2, 0\n\ -_08029A8C: .4byte gBankAttacker\n\ -_08029A90: .4byte gEnemyParty\n\ -_08029A94: .4byte gPlayerParty\n\ -_08029A98: .4byte gBattleMons\n\ -_08029A9C: .4byte gBankTarget\n\ -_08029AA0: .4byte gBattlescriptCurrInstr\n\ -_08029AA4:\n\ - ldr r6, _08029BE0 @ =gBattleCommunication\n\ - ldrb r0, [r6]\n\ - mov r8, r0\n\ - cmp r0, 0x5\n\ - bls _08029AB0\n\ - b _08029C0C\n\ -_08029AB0:\n\ - adds r4, r6, 0\n\ - movs r5, 0x64\n\ -_08029AB4:\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029AF8\n\ - ldrb r0, [r6]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029AF8\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _08029AF8\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x37\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029B08\n\ -_08029AF8:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - adds r6, r4, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x5\n\ - bls _08029AB4\n\ -_08029B08:\n\ - ldr r1, _08029BE0 @ =gBattleCommunication\n\ - mov r9, r1\n\ - ldrb r2, [r1]\n\ - cmp r2, 0x5\n\ - bhi _08029C0C\n\ - ldr r1, _08029BE4 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x1]\n\ - ldr r6, _08029BE8 @ =gBankAttacker\n\ - ldrb r0, [r6]\n\ - strb r0, [r1, 0x2]\n\ - strb r2, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _08029BEC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x9\n\ - str r0, [r1]\n\ - ldr r2, _08029BF0 @ =gBattleMoveDamage\n\ - mov r8, r2\n\ - ldr r5, _08029BF4 @ =gBaseStats\n\ - mov r1, r9\n\ - ldrb r0, [r1]\n\ - movs r4, 0x64\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r1, r0, 3\n\ - subs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r3, [r1, 0x1]\n\ - mov r2, r8\n\ - str r3, [r2]\n\ - ldr r2, _08029BF8 @ =gBattleMoves\n\ - ldr r0, _08029BFC @ =gCurrentMove\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0, 0x1]\n\ - muls r0, r3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - lsls r0, 1\n\ - movs r1, 0x5\n\ - bl __udivsi3\n\ - adds r0, 0x2\n\ - mov r2, r8\n\ - ldr r1, [r2]\n\ - muls r0, r1\n\ - str r0, [r2]\n\ - ldr r3, _08029C00 @ =gBattleMons\n\ - ldr r1, _08029C04 @ =gBankTarget\n\ - ldrb r2, [r1]\n\ - movs r1, 0x58\n\ - muls r1, r2\n\ - adds r1, r3\n\ - ldrh r2, [r1]\n\ - lsls r1, r2, 3\n\ - subs r1, r2\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r1, [r1, 0x2]\n\ - bl __divsi3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - movs r1, 0x32\n\ - bl __divsi3\n\ - adds r2, r0, 0x2\n\ - mov r0, r8\n\ - str r2, [r0]\n\ - ldr r1, _08029C08 @ =gProtectStructs\n\ - ldrb r0, [r6]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 28\n\ - cmp r0, 0\n\ - bge _08029BD4\n\ - lsls r0, r2, 4\n\ - subs r0, r2\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ -_08029BD4:\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - adds r0, 0x1\n\ - strb r0, [r2]\n\ - b _08029C46\n\ - .align 2, 0\n\ -_08029BE0: .4byte gBattleCommunication\n\ -_08029BE4: .4byte gBattleTextBuff1\n\ -_08029BE8: .4byte gBankAttacker\n\ -_08029BEC: .4byte gBattlescriptCurrInstr\n\ -_08029BF0: .4byte gBattleMoveDamage\n\ -_08029BF4: .4byte gBaseStats\n\ -_08029BF8: .4byte gBattleMoves\n\ -_08029BFC: .4byte gCurrentMove\n\ -_08029C00: .4byte gBattleMons\n\ -_08029C04: .4byte gBankTarget\n\ -_08029C08: .4byte gProtectStructs\n\ -_08029C0C:\n\ - mov r0, r8\n\ - cmp r0, 0\n\ - beq _08029C2C\n\ - ldr r3, _08029C28 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - b _08029C40\n\ - .align 2, 0\n\ -_08029C28: .4byte gBattlescriptCurrInstr\n\ -_08029C2C:\n\ - ldr r3, _08029C54 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x5]\n\ - ldrb r0, [r2, 0x6]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x7]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x8]\n\ -_08029C40:\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_08029C46:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08029C54: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} -#endif // NONMATCHING - -static void atkC5_setsemiinvulnerablebit(void) -{ - switch (gCurrentMove) - { - case MOVE_FLY: - case MOVE_BOUNCE: - gStatuses3[gBankAttacker] |= STATUS3_ON_AIR; - break; - case MOVE_DIG: - gStatuses3[gBankAttacker] |= STATUS3_UNDERGROUND; - break; - case MOVE_DIVE: - gStatuses3[gBankAttacker] |= STATUS3_UNDERWATER; - break; - } - gBattlescriptCurrInstr++; -} - -static void atkC6_clearsemiinvulnerablebit(void) -{ - switch (gCurrentMove) - { - case MOVE_FLY: - case MOVE_BOUNCE: - gStatuses3[gBankAttacker] &= ~STATUS3_ON_AIR; - break; - case MOVE_DIG: - gStatuses3[gBankAttacker] &= ~STATUS3_UNDERGROUND; - break; - case MOVE_DIVE: - gStatuses3[gBankAttacker] &= ~STATUS3_UNDERWATER; - break; - } - gBattlescriptCurrInstr++; -} - -static void atkC7_setminimize(void) -{ - if (gHitMarker & HITMARKER_OBEYS) - gStatuses3[gBankAttacker] |= STATUS3_MINIMIZED; - gBattlescriptCurrInstr++; -} - -static void atkC8_sethail(void) -{ - if (gBattleWeather & WEATHER_HAIL) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gBattleWeather = WEATHER_HAIL; - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - gWishFutureKnock.weatherDuration = 5; - } - gBattlescriptCurrInstr++; -} - -static void atkC9_jumpifattackandspecialattackcannotfall(void) //memento -{ - if (gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] == 0 - && gBattleMons[gBankTarget].statStages[STAT_STAGE_SPATK] == 0 - && gBattleCommunication[6] != 1) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gActiveBattler = gBankAttacker; - gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - EmitHealthBarUpdate(0, 0x7FFF); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 5; - } -} - -static void atkCA_setforcedtarget(void) //follow me -{ - gSideTimers[GetBattlerSide(gBankAttacker)].followmeTimer = 1; - gSideTimers[GetBattlerSide(gBankAttacker)].followmeTarget = gBankAttacker; - gBattlescriptCurrInstr++; -} - -static void atkCB_setcharge(void) -{ - gStatuses3[gBankAttacker] |= STATUS3_CHARGED_UP; - gDisableStructs[gBankAttacker].chargeTimer1 = 2; - gDisableStructs[gBankAttacker].chargeTimer2 = 2; - gBattlescriptCurrInstr++; -} - -static void atkCC_callterrainattack(void) //nature power -{ - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCurrentMove = sNaturePowerMoves[gBattleTerrain]; - gBankTarget = GetMoveTarget(gCurrentMove, 0); - BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); - gBattlescriptCurrInstr++; -} - -static void atkCD_cureifburnedparalysedorpoisoned(void) //refresh -{ - if (gBattleMons[gBankAttacker].status1 & (STATUS_POISON | STATUS_BURN | STATUS_PARALYSIS | STATUS_TOXIC_POISON)) - { - gBattleMons[gBankAttacker].status1 = 0; - gBattlescriptCurrInstr += 5; - gActiveBattler = gBankAttacker; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkCE_settorment(void) -{ - if (gBattleMons[gBankTarget].status2 & STATUS2_TORMENT) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gBattleMons[gBankTarget].status2 |= STATUS2_TORMENT; - gBattlescriptCurrInstr += 5; - } -} - -static void atkCF_jumpifnodamage(void) -{ - if (gProtectStructs[gBankAttacker].physicalDmg || gProtectStructs[gBankAttacker].specialDmg) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkD0_settaunt(void) -{ - if (gDisableStructs[gBankTarget].tauntTimer1 == 0) - { - gDisableStructs[gBankTarget].tauntTimer1 = 2; - gDisableStructs[gBankTarget].tauntTimer2 = 2; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkD1_trysethelpinghand(void) -{ - gBankTarget = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gBankTarget]) - && !gProtectStructs[gBankAttacker].helpingHand && !gProtectStructs[gBankTarget].helpingHand) - { - gProtectStructs[gBankTarget].helpingHand = 1; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -#ifdef NONMATCHING -static void atkD2_tryswapitems(void) -{ - if ((GetBattlerSide(gBankAttacker) != 1 || gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER) || gTrainerBattleOpponent == SECRET_BASE_OPPONENT)) - { - u8 side = GetBattlerSide(gBankAttacker); - if (gBattleTypeFlags) - } - - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -#else -NAKED -static void atkD2_tryswapitems(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - ldr r0, _0802A30C @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _0802A24C\n\ - ldr r0, _0802A310 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0802A314 @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0802A24C\n\ - ldr r0, _0802A318 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - bne _0802A2EE\n\ -_0802A24C:\n\ - ldr r4, _0802A30C @ =gBankAttacker\n\ - ldrb r0, [r4]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - ldr r0, _0802A310 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0802A314 @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0802A290\n\ - ldr r0, _0802A318 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0802A290\n\ - ldr r0, _0802A31C @ =gWishFutureKnock\n\ - adds r0, 0x29\n\ - adds r0, r2, r0\n\ - ldrb r1, [r0]\n\ - ldr r3, _0802A320 @ =gBitTable\n\ - ldr r2, _0802A324 @ =gBattlerPartyIndexes\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _0802A2EE\n\ -_0802A290:\n\ - ldr r0, _0802A328 @ =gBattleMons\n\ - mov r9, r0\n\ - ldr r1, _0802A30C @ =gBankAttacker\n\ - ldrb r4, [r1]\n\ - movs r2, 0x58\n\ - mov r8, r2\n\ - mov r0, r8\n\ - muls r0, r4\n\ - mov r3, r9\n\ - adds r5, r0, r3\n\ - ldrh r3, [r5, 0x2E]\n\ - adds r1, r3, 0\n\ - cmp r1, 0\n\ - bne _0802A2BE\n\ - ldr r0, _0802A32C @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - add r0, r9\n\ - ldrh r0, [r0, 0x2E]\n\ - cmp r0, 0\n\ - beq _0802A2EE\n\ -_0802A2BE:\n\ - cmp r1, 0xAF\n\ - beq _0802A2EE\n\ - ldr r7, _0802A32C @ =gBankTarget\n\ - ldrb r0, [r7]\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - mov r1, r9\n\ - adds r2, r0, r1\n\ - ldrh r1, [r2, 0x2E]\n\ - cmp r1, 0xAF\n\ - beq _0802A2EE\n\ - adds r0, r3, 0\n\ - subs r0, 0x79\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xB\n\ - bls _0802A2EE\n\ - adds r0, r1, 0\n\ - subs r0, 0x79\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xB\n\ - bhi _0802A334\n\ -_0802A2EE:\n\ - ldr r3, _0802A330 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ - b _0802A49A\n\ - .align 2, 0\n\ -_0802A30C: .4byte gBankAttacker\n\ -_0802A310: .4byte gBattleTypeFlags\n\ -_0802A314: .4byte 0x00000902\n\ -_0802A318: .4byte gTrainerBattleOpponent\n\ -_0802A31C: .4byte gWishFutureKnock\n\ -_0802A320: .4byte gBitTable\n\ -_0802A324: .4byte gBattlerPartyIndexes\n\ -_0802A328: .4byte gBattleMons\n\ -_0802A32C: .4byte gBankTarget\n\ -_0802A330: .4byte gBattlescriptCurrInstr\n\ -_0802A334:\n\ - adds r0, r2, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3C\n\ - bne _0802A36C\n\ - ldr r1, _0802A360 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0802A364 @ =BattleScript_NoItemSteal\n\ - str r0, [r1]\n\ - ldr r1, _0802A368 @ =gLastUsedAbility\n\ - ldrb r0, [r7]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r0, [r7]\n\ - ldrb r1, [r1]\n\ - bl RecordAbilityBattle\n\ - b _0802A49A\n\ - .align 2, 0\n\ -_0802A360: .4byte gBattlescriptCurrInstr\n\ -_0802A364: .4byte BattleScript_NoItemSteal\n\ -_0802A368: .4byte gLastUsedAbility\n\ -_0802A36C:\n\ - lsls r0, r4, 1\n\ - ldr r4, _0802A458 @ =gSharedMem + 0x160F0\n\ - adds r6, r0, r4\n\ - ldrh r5, [r5, 0x2E]\n\ - mov r10, r5\n\ - strh r1, [r6]\n\ - ldr r3, _0802A45C @ =gBankAttacker\n\ - ldrb r0, [r3]\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - add r0, r9\n\ - movs r1, 0\n\ - strh r1, [r0, 0x2E]\n\ - ldrb r0, [r7]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - add r0, r9\n\ - mov r3, r10\n\ - strh r3, [r0, 0x2E]\n\ - ldr r5, _0802A460 @ =gActiveBattler\n\ - ldr r1, _0802A45C @ =gBankAttacker\n\ - ldrb r0, [r1]\n\ - strb r0, [r5]\n\ - str r6, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - movs r3, 0x2\n\ - bl EmitSetMonData\n\ - ldr r2, _0802A45C @ =gBankAttacker\n\ - ldrb r0, [r2]\n\ - bl MarkBufferBankForExecution\n\ - ldrb r0, [r7]\n\ - strb r0, [r5]\n\ - ldrb r0, [r7]\n\ - mov r3, r8\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - adds r1, 0x2E\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - movs r3, 0x2\n\ - bl EmitSetMonData\n\ - ldrb r0, [r7]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, _0802A464 @ =0xfffe9f10\n\ - adds r4, r0\n\ - ldrb r0, [r7]\n\ - lsls r0, 1\n\ - ldr r2, _0802A468 @ =0x000160e8\n\ - adds r0, r2\n\ - adds r0, r4\n\ - movs r1, 0\n\ - strb r1, [r0]\n\ - ldrb r0, [r7]\n\ - lsls r0, 1\n\ - ldr r1, _0802A46C @ =0x000160e9\n\ - adds r0, r1\n\ - adds r0, r4\n\ - movs r3, 0\n\ - strb r3, [r0]\n\ - ldr r3, _0802A45C @ =gBankAttacker\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - adds r0, r4\n\ - movs r2, 0\n\ - strb r2, [r0]\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - adds r0, r4\n\ - strb r2, [r0]\n\ - ldr r1, _0802A470 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - ldr r1, _0802A474 @ =gBattleTextBuff1\n\ - movs r3, 0xFD\n\ - strb r3, [r1]\n\ - movs r2, 0xA\n\ - strb r2, [r1, 0x1]\n\ - ldrh r0, [r6]\n\ - strb r0, [r1, 0x2]\n\ - ldrh r0, [r6]\n\ - lsrs r0, 8\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _0802A478 @ =gBattleTextBuff2\n\ - strb r3, [r1]\n\ - strb r2, [r1, 0x1]\n\ - mov r3, r10\n\ - strb r3, [r1, 0x2]\n\ - mov r2, r10\n\ - lsrs r0, r2, 8\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - strb r0, [r1, 0x4]\n\ - cmp r2, 0\n\ - beq _0802A480\n\ - ldrh r0, [r6]\n\ - cmp r0, 0\n\ - beq _0802A494\n\ - ldr r1, _0802A47C @ =gBattleCommunication\n\ - movs r0, 0x2\n\ - b _0802A498\n\ - .align 2, 0\n\ -_0802A458: .4byte gSharedMem + 0x160F0\n\ -_0802A45C: .4byte gBankAttacker\n\ -_0802A460: .4byte gActiveBattler\n\ -_0802A464: .4byte 0xfffe9f10\n\ -_0802A468: .4byte 0x000160e8\n\ -_0802A46C: .4byte 0x000160e9\n\ -_0802A470: .4byte gBattlescriptCurrInstr\n\ -_0802A474: .4byte gBattleTextBuff1\n\ -_0802A478: .4byte gBattleTextBuff2\n\ -_0802A47C: .4byte gBattleCommunication\n\ -_0802A480:\n\ - ldrh r0, [r6]\n\ - cmp r0, 0\n\ - beq _0802A494\n\ - ldr r0, _0802A490 @ =gBattleCommunication\n\ - movs r3, 0\n\ - strb r3, [r0, 0x5]\n\ - b _0802A49A\n\ - .align 2, 0\n\ -_0802A490: .4byte gBattleCommunication\n\ -_0802A494:\n\ - ldr r1, _0802A4AC @ =gBattleCommunication\n\ - movs r0, 0x1\n\ -_0802A498:\n\ - strb r0, [r1, 0x5]\n\ -_0802A49A:\n\ - add sp, 0x4\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\ -_0802A4AC: .4byte gBattleCommunication\n\ - .syntax divided"); -} -#endif // NONMATCHING - -static void atkD3_trycopyability(void) //role play -{ - if (gBattleMons[gBankTarget].ability != 0 && gBattleMons[gBankTarget].ability != ABILITY_WONDER_GUARD) - { - gBattleMons[gBankAttacker].ability = gBattleMons[gBankTarget].ability; - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkD4_trywish(void) -{ - switch (T2_READ_8(gBattlescriptCurrInstr + 1)) - { - case 0: //use wish - if (gWishFutureKnock.wishCounter[gBankAttacker] == 0) - { - gWishFutureKnock.wishCounter[gBankAttacker] = 2; - gWishFutureKnock.wishUserID[gBankAttacker] = gBattlerPartyIndexes[gBankAttacker]; - gBattlescriptCurrInstr += 6; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - break; - case 1: //heal effect - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = gBankTarget; - gBattleTextBuff1[3] = gWishFutureKnock.wishUserID[gBankTarget]; - gBattleTextBuff1[4] = 0xFF; - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; - break; - } -} - -static void atkD5_trysetroots(void) //ingrain -{ - if (gStatuses3[gBankAttacker] & STATUS3_ROOTED) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gStatuses3[gBankAttacker] |= STATUS3_ROOTED; - gBattlescriptCurrInstr += 5; - } -} - -static void atkD6_doubledamagedealtifdamaged(void) -{ - if ((gProtectStructs[gBankAttacker].physicalDmg && gProtectStructs[gBankAttacker].physicalBank == gBankTarget) - || (gProtectStructs[gBankAttacker].specialDmg && gProtectStructs[gBankAttacker].specialBank == gBankTarget)) - gBattleStruct->dmgMultiplier = 2; - gBattlescriptCurrInstr++; -} - -static void atkD7_setyawn(void) -{ - if (gStatuses3[gBankTarget] & STATUS3_YAWN || (u8) gBattleMons[gBankTarget].status1) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gStatuses3[gBankTarget] |= 0x1000; - gBattlescriptCurrInstr += 5; - } -} - -static void atkD8_setdamagetohealthdifference(void) -{ - if (gBattleMons[gBankTarget].hp <= gBattleMons[gBankAttacker].hp) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - gBattleMoveDamage = gBattleMons[gBankTarget].hp - gBattleMons[gBankAttacker].hp; - gBattlescriptCurrInstr += 5; - } -} - -static void atkD9_scaledamagebyhealthratio(void) -{ - if (gDynamicBasePower == 0) - { - u8 power = gBattleMoves[gCurrentMove].power; - gDynamicBasePower = gBattleMons[gBankAttacker].hp * power / gBattleMons[gBankAttacker].maxHP; - if (gDynamicBasePower == 0) - gDynamicBasePower = 1; - } - gBattlescriptCurrInstr++; -} - -static void atkDA_tryswapabilities(void) -{ - if ((gBattleMons[gBankAttacker].ability == 0 && gBattleMons[gBankTarget].ability == 0) - || gBattleMons[gBankAttacker].ability == ABILITY_WONDER_GUARD || gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD - || gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - u8 atk_ability = gBattleMons[gBankAttacker].ability; - gBattleMons[gBankAttacker].ability = gBattleMons[gBankTarget].ability; - gBattleMons[gBankTarget].ability = atk_ability; - gBattlescriptCurrInstr += 5; - } -} - -static void atkDB_tryimprision(void) -{ - u8 r8 = 0; - if ((gStatuses3[gBankAttacker] & STATUS3_IMPRISIONED)) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - u8 bank; - PressurePPLoseOnUsingImprision(gBankAttacker); - for (bank = 0; bank < gBattlersCount; bank++) - { - if (r8 != GetBattlerSide(bank)) - { - int j; - for (j = 0; j < 4; j++) - { - int k; - for (k = 0; k < 4; k++) - { - if (gBattleMons[gBankAttacker].moves[j] == gBattleMons[bank].moves[k] && gBattleMons[gBankAttacker].moves[j]) - break; - } - if (k != 4) - break; - } - if (j != 4) - { - gStatuses3[gBankAttacker] |= STATUS3_IMPRISIONED; - gBattlescriptCurrInstr += 5; - break; - } - } - } - if (bank == gBattlersCount) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkDC_trysetgrudge(void) -{ - if (gStatuses3[gBankAttacker] & STATUS3_GRUDGE) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gStatuses3[gBankAttacker] |= STATUS3_GRUDGE; - gBattlescriptCurrInstr += 5; - } -} - -static void atkDD_weightdamagecalculation(void) -{ - int i; - for (i = 0; sWeightToDamageTable[i] != 0xFFFF; i += 2) - { - if (sWeightToDamageTable[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) - break; - } - if (sWeightToDamageTable[i] != 0xFFFF) - gDynamicBasePower = sWeightToDamageTable[i + 1]; - else - gDynamicBasePower = 120; - gBattlescriptCurrInstr++; -} - -#ifdef NONMATCHING -static void atkDE_asistattackselect(void) -{ - u32 chooseable_moves_no = 0; - struct Pokemon* party; - int i, j; - u16* chooseable_moves; - if (GetBattlerPosition(gBankAttacker) & 1) - party = gEnemyParty; - else - party = gPlayerParty; - - for (i = 0; i < 6; i++) - { - if (i == gBattlerPartyIndexes[gBankAttacker]) - break; - if (!GetMonData(&party[i], MON_DATA_SPECIES2) || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) - break; - chooseable_moves = &gBattleStruct->assistMove[chooseable_moves_no]; - for (j = 0; j < 4; j++) - { - int k; - u16 move = GetMonData(&party[i], MON_DATA_MOVE1 + i); - if (IsMoveUnchoosable(move)) - break; - //sMovesForbiddenToCopy[k] - for (k = 0; ;k++) - { - if (sMovesForbiddenToCopy[k] == 0xFFFF) - { - if (move) - { - *chooseable_moves = move; - chooseable_moves++; - chooseable_moves_no++; - } - break; - } - if (sMovesForbiddenToCopy[k] == move) - break; - } - } - } - if (chooseable_moves_no) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gRandomMove = gBattleStruct->assistMove[Random() % chooseable_moves_no]; - gBankTarget = GetMoveTarget(gRandomMove, 0); - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -#else -NAKED -static void atkDE_asistattackselect(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - movs r0, 0\n\ - mov r10, r0\n\ - ldr r0, _0802AB9C @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerPosition\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - ldr r0, _0802ABA0 @ =gPlayerParty\n\ - str r0, [sp]\n\ - cmp r1, 0\n\ - beq _0802AAAC\n\ - ldr r1, _0802ABA4 @ =gEnemyParty\n\ - str r1, [sp]\n\ -_0802AAAC:\n\ - movs r2, 0\n\ -_0802AAAE:\n\ - ldr r1, _0802ABA8 @ =gBattlerPartyIndexes\n\ - ldr r0, _0802AB9C @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - adds r1, r2, 0x1\n\ - str r1, [sp, 0x4]\n\ - ldrh r0, [r0]\n\ - cmp r2, r0\n\ - beq _0802AB54\n\ - movs r0, 0x64\n\ - adds r6, r2, 0\n\ - muls r6, r0\n\ - ldr r0, [sp]\n\ - adds r4, r0, r6\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0802AB54\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _0802AB54\n\ - movs r5, 0\n\ - ldr r1, _0802ABAC @ =0x0000ffff\n\ - mov r8, r1\n\ - mov r9, r6\n\ - mov r1, r10\n\ - lsls r0, r1, 1\n\ - ldr r1, _0802ABB0 @ =gSharedMem + 0x16024\n\ - adds r6, r0, r1\n\ -_0802AAF8:\n\ - movs r7, 0\n\ - adds r1, r5, 0\n\ - adds r1, 0xD\n\ - ldr r0, [sp]\n\ - add r0, r9\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - adds r0, r4, 0\n\ - bl IsMoveUnchoosable\n\ - lsls r0, 24\n\ - adds r1, r5, 0x1\n\ - cmp r0, 0\n\ - bne _0802AB4E\n\ - ldr r0, _0802ABB4 @ =sMovesForbiddenToCopy\n\ - ldrh r2, [r0]\n\ - adds r3, r0, 0\n\ - cmp r2, r8\n\ - beq _0802AB42\n\ - cmp r4, r2\n\ - beq _0802AB38\n\ - ldr r5, _0802ABAC @ =0x0000ffff\n\ - adds r2, r3, 0\n\ -_0802AB2A:\n\ - adds r2, 0x2\n\ - adds r7, 0x1\n\ - ldrh r0, [r2]\n\ - cmp r0, r5\n\ - beq _0802AB42\n\ - cmp r4, r0\n\ - bne _0802AB2A\n\ -_0802AB38:\n\ - lsls r0, r7, 1\n\ - adds r0, r3\n\ - ldrh r0, [r0]\n\ - cmp r0, r8\n\ - bne _0802AB4E\n\ -_0802AB42:\n\ - cmp r4, 0\n\ - beq _0802AB4E\n\ - strh r4, [r6]\n\ - adds r6, 0x2\n\ - movs r0, 0x1\n\ - add r10, r0\n\ -_0802AB4E:\n\ - adds r5, r1, 0\n\ - cmp r5, 0x3\n\ - ble _0802AAF8\n\ -_0802AB54:\n\ - ldr r2, [sp, 0x4]\n\ - cmp r2, 0x5\n\ - ble _0802AAAE\n\ - mov r1, r10\n\ - cmp r1, 0\n\ - beq _0802ABCC\n\ - ldr r2, _0802ABB8 @ =gHitMarker\n\ - ldr r0, [r2]\n\ - ldr r1, _0802ABBC @ =0xfffffbff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r4, _0802ABC0 @ =gRandomMove\n\ - bl Random\n\ - movs r1, 0xFF\n\ - ands r1, r0\n\ - mov r0, r10\n\ - muls r0, r1\n\ - asrs r0, 8\n\ - lsls r0, 1\n\ - ldr r1, _0802ABB0 @ =gSharedMem + 0x16024\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - strh r0, [r4]\n\ - ldrh r0, [r4]\n\ - movs r1, 0\n\ - bl GetMoveTarget\n\ - ldr r1, _0802ABC4 @ =gBankTarget\n\ - strb r0, [r1]\n\ - ldr r1, _0802ABC8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - b _0802ABE6\n\ - .align 2, 0\n\ -_0802AB9C: .4byte gBankAttacker\n\ -_0802ABA0: .4byte gPlayerParty\n\ -_0802ABA4: .4byte gEnemyParty\n\ -_0802ABA8: .4byte gBattlerPartyIndexes\n\ -_0802ABAC: .4byte 0x0000ffff\n\ -_0802ABB0: .4byte gSharedMem + 0x16024\n\ -_0802ABB4: .4byte sMovesForbiddenToCopy\n\ -_0802ABB8: .4byte gHitMarker\n\ -_0802ABBC: .4byte 0xfffffbff\n\ -_0802ABC0: .4byte gRandomMove\n\ -_0802ABC4: .4byte gBankTarget\n\ -_0802ABC8: .4byte gBattlescriptCurrInstr\n\ -_0802ABCC:\n\ - ldr r3, _0802ABF8 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_0802ABE6:\n\ - add sp, 0x8\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\ -_0802ABF8: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} - -#endif // NONMATCHING - -static void atkDF_trysetmagiccoat(void) -{ - gBankTarget = gBankAttacker; - gSpecialStatuses[gBankAttacker].flag20 = 1; - if (gCurrentTurnActionNumber == gBattlersCount - 1) //last turn - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gProtectStructs[gBankAttacker].bounceMove = 1; - gBattlescriptCurrInstr += 5; - } -} - -static void atkE0_trysetsnatch(void) -{ - gSpecialStatuses[gBankAttacker].flag20 = 1; - if (gCurrentTurnActionNumber == gBattlersCount - 1) //last turn - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gProtectStructs[gBankAttacker].stealMove = 1; - gBattlescriptCurrInstr += 5; - } -} - -static void atkE1_trygetintimidatetarget(void) -{ - u8 side; - - gBattleStruct->scriptingActive = ewram160DD; - side = GetBattlerSide(gBattleStruct->scriptingActive); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 9; - gBattleTextBuff1[2] = gBattleMons[gBattleStruct->scriptingActive].ability; - gBattleTextBuff1[3] = 0xFF; - - for (;gBankTarget < gBattlersCount; gBankTarget++) - { - if (GetBattlerSide(gBankTarget) == side) - continue; - if (!(gAbsentBattlerFlags & gBitTable[gBankTarget])) - break; - } - - if (gBankTarget >= gBattlersCount) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; -} - -static void atkE2_switchoutabilities(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - switch (gBattleMons[gActiveBattler].ability) - { - case ABILITY_NATURAL_CURE: - gBattleMons[gActiveBattler].status1 = 0; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, gBitTable[ewram16064arr(gActiveBattler)], 4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - break; - } - gBattlescriptCurrInstr += 2; -} - -static void atkE3_jumpifhasnohp(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (gBattleMons[gActiveBattler].hp == 0) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; -} - -static void atkE4_getsecretpowereffect(void) -{ - switch (gBattleTerrain) - { - case BATTLE_TERRAIN_GRASS: - gBattleCommunication[MOVE_EFFECT_BYTE] = 2; - break; - case BATTLE_TERRAIN_LONG_GRASS: - gBattleCommunication[MOVE_EFFECT_BYTE] = 1; - break; - case BATTLE_TERRAIN_SAND: - gBattleCommunication[MOVE_EFFECT_BYTE] = 27; - break; - case BATTLE_TERRAIN_UNDERWATER: - gBattleCommunication[MOVE_EFFECT_BYTE] = 23; - break; - case BATTLE_TERRAIN_WATER: - gBattleCommunication[MOVE_EFFECT_BYTE] = 22; - break; - case BATTLE_TERRAIN_POND: - gBattleCommunication[MOVE_EFFECT_BYTE] = 24; - break; - case BATTLE_TERRAIN_MOUNTAIN: - gBattleCommunication[MOVE_EFFECT_BYTE] = 7; - break; - case BATTLE_TERRAIN_CAVE: - gBattleCommunication[MOVE_EFFECT_BYTE] = 8; - break; - default: - gBattleCommunication[MOVE_EFFECT_BYTE] = 5; - break; - } - gBattlescriptCurrInstr++; -} - -static void atkE5_pickup(void) -{ - int i; - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - u16 held_item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - u8 ability; - if (GetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY)) - ability = gBaseStats[species].ability2; - else - ability = gBaseStats[species].ability1; - - if (ability == ABILITY_PICKUP && species != 0 && species != SPECIES_EGG && held_item == 0 && (Random() % 10) == 0) - { - s32 chance = Random() % 100; - s32 j; - for (j = 0; j < 18; j += 2) - { - if (sPickupItems[j + 1] > chance) - break; - } - SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, (const void*) &sPickupItems[j]); - } - } - gBattlescriptCurrInstr++; -} - -static void atkE6_docastformchangeanimation(void) -{ - gActiveBattler = gBattleStruct->scriptingActive; - if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) - gBattleStruct->castformToChangeInto |= 0x80; - EmitBattleAnimation(0, B_ANIM_CASTFORM_CHANGE, gBattleStruct->castformToChangeInto); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr++; -} - -static void atkE7_trycastformdatachange(void) -{ - u8 form; - gBattlescriptCurrInstr++; - form = CastformDataTypeChange(gBattleStruct->scriptingActive); - if (form) - { - BattleScriptPushCursorAndCallback(BattleScript_CastformChange); - gBattleStruct->castformToChangeInto = form - 1; - } -} - -static void atkE8_settypebasedhalvers(void) //water/mud sport -{ - bool8 worked = FALSE; - if (gBattleMoves[gCurrentMove].effect == EFFECT_MUD_SPORT) - { - if (!(gStatuses3[gBankAttacker] & STATUS3_MUDSPORT)) - { - gStatuses3[gBankAttacker] |= STATUS3_MUDSPORT; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - worked = TRUE; - } - } - else //water sport - { - if (!(gStatuses3[gBankAttacker] & STATUS3_WATERSPORT)) - { - gStatuses3[gBankAttacker] |= STATUS3_WATERSPORT; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - worked = TRUE; - } - } - if (worked) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkE9_setweatherballtype(void) -{ - if (WEATHER_HAS_EFFECT) - { - if ((u8)(gBattleWeather)) - gBattleStruct->dmgMultiplier = 2; - if (gBattleWeather & WEATHER_RAIN_ANY) - gBattleStruct->dynamicMoveType = TYPE_WATER | 0x80; - else if (gBattleWeather & WEATHER_SANDSTORM_ANY) - gBattleStruct->dynamicMoveType = TYPE_ROCK | 0x80; - else if (gBattleWeather & WEATHER_SUN_ANY) - gBattleStruct->dynamicMoveType = TYPE_FIRE | 0x80; - else if (gBattleWeather & WEATHER_HAIL) - gBattleStruct->dynamicMoveType = TYPE_ICE | 0x80; - else - gBattleStruct->dynamicMoveType = TYPE_NORMAL | 0x80; - } - gBattlescriptCurrInstr++; -} - -static void atkEA_tryrecycleitem(void) -{ - u16* used_item; - gActiveBattler = gBankAttacker; - used_item = USED_HELD_ITEM(gActiveBattler); - if (*used_item && gBattleMons[gActiveBattler].item == 0) - { - gLastUsedItem = *used_item; - *used_item = 0; - gBattleMons[gActiveBattler].item = gLastUsedItem; - EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkEB_settypetoterrain(void) -{ - if (gBattleMons[gBankAttacker].type1 != sTerrainToType[gBattleTerrain] && gBattleMons[gBankAttacker].type2 != sTerrainToType[gBattleTerrain]) - { - gBattleMons[gBankAttacker].type1 = sTerrainToType[gBattleTerrain]; - gBattleMons[gBankAttacker].type2 = sTerrainToType[gBattleTerrain]; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = sTerrainToType[gBattleTerrain]; - gBattleTextBuff1[3] = 0xFF; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkEC_pursuitrelated(void) -{ - gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]) && gActionForBanks[gActiveBattler] == 0 && gChosenMovesByBanks[gActiveBattler] == MOVE_PURSUIT) - { - gActionsByTurnOrder[gActiveBattler] = 11; - gCurrentMove = MOVE_PURSUIT; - gBattlescriptCurrInstr += 5; - gBattleStruct->animTurn = 1; - gBattleStruct->unk160A7 = gBankAttacker; - gBankAttacker = gActiveBattler; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkED_snatchsetbanks(void) -{ - gEffectBank = gBankAttacker; - if (gBankAttacker == gBankTarget) - gBankAttacker = gBankTarget = gBattleStruct->scriptingActive; - else - gBankTarget = gBattleStruct->scriptingActive; - gBattleStruct->scriptingActive = gEffectBank; - gBattlescriptCurrInstr++; -} - -static void atkEE_removelightscreenreflect(void) //brick break -{ - u8 side = GetBattlerSide(gBankAttacker) ^ 1; - if (gSideTimers[side].reflectTimer || gSideTimers[side].lightscreenTimer) - { - gSideAffecting[side] &= ~(SIDE_STATUS_REFLECT); - gSideAffecting[side] &= ~(SIDE_STATUS_LIGHTSCREEN); - gSideTimers[side].reflectTimer = 0; - gSideTimers[side].lightscreenTimer = 0; - gBattleStruct->animTurn = 1; - gBattleStruct->animTargetsHit = 1; - } - else - { - gBattleStruct->animTurn = 0; - gBattleStruct->animTargetsHit = 0; - } - gBattlescriptCurrInstr++; -} - -void atkEF_handleballthrow(void) -{ - u8 ball_multiplier = 0; - if (gBattleExecBuffer) - return; - - gActiveBattler = gBankAttacker; - gBankTarget = gBankAttacker ^ 1; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - EmitBallThrow(0, 5); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; - } - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) - { - EmitBallThrow(0, 4); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr = BattleScript_WallyBallThrow; - } - else - { - u32 odds; - u8 catch_rate; - if (gLastUsedItem == ITEM_SAFARI_BALL) - catch_rate = gBattleStruct->unk16089 * 1275 / 100; //correct the name to safariFleeRate - else - catch_rate = gBaseStats[gBattleMons[gBankTarget].species].catchRate; - if (gLastUsedItem > 5) - { - switch (gLastUsedItem) - { - case ITEM_NET_BALL: - if (gBattleMons[gBankTarget].type1 == TYPE_WATER || gBattleMons[gBankTarget].type2 == TYPE_WATER || gBattleMons[gBankTarget].type1 == TYPE_BUG || gBattleMons[gBankTarget].type2 == TYPE_BUG) - ball_multiplier = 30; - else - ball_multiplier = 10; - break; - case ITEM_DIVE_BALL: - if (Overworld_GetMapTypeOfSaveblockLocation() == 5) - ball_multiplier = 35; - else - ball_multiplier = 10; - break; - case ITEM_NEST_BALL: - if (gBattleMons[gBankTarget].level <= 39) - { - ball_multiplier = 40 - gBattleMons[gBankTarget].level; - if (ball_multiplier <= 9) - ball_multiplier = 10; - } - else - ball_multiplier = 10; - break; - case ITEM_REPEAT_BALL: - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) - ball_multiplier = 30; - else - ball_multiplier = 10; - break; - case ITEM_TIMER_BALL: - ball_multiplier = gBattleResults.battleTurnCounter + 10; - if (ball_multiplier > 40) - ball_multiplier = 40; - break; - case ITEM_LUXURY_BALL: - case ITEM_PREMIER_BALL: - ball_multiplier = 10; - break; - } - } - else - ball_multiplier = sBallCatchBonuses[gLastUsedItem - 2]; - - odds = (catch_rate * ball_multiplier / 10) * (gBattleMons[gBankTarget].maxHP * 3 - gBattleMons[gBankTarget].hp * 2) / (3 * gBattleMons[gBankTarget].maxHP); - if (gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE)) - odds *= 2; - if (gBattleMons[gBankTarget].status1 & (STATUS_POISON | STATUS_BURN | STATUS_PARALYSIS /*| STATUS_TOXIC_POISON */)) //nice one gf - odds = (odds * 15) / 10; - - if (gLastUsedItem != ITEM_SAFARI_BALL) - { - if (gLastUsedItem == ITEM_MASTER_BALL) - { - gBattleResults.unk5_1 = 1; - } - else - { - if (gBattleResults.usedBalls[gLastUsedItem - ITEM_ULTRA_BALL] < 0xFF) - gBattleResults.usedBalls[gLastUsedItem - ITEM_ULTRA_BALL]++; - } - } - if (odds > 254) //poke caught - { - EmitBallThrow(0, 4); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankTarget]], MON_DATA_POKEBALL, (const void*) &gLastUsedItem); - if (CalculatePlayerPartyCount() == 6) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else //poke may be caught, calculate shakes - { - u8 shakes; - odds = Sqrt(Sqrt(16711680 / odds)); - odds = 1048560 / odds; - for (shakes = 0; shakes < 4 && Random() < odds; shakes++) {} - if (gLastUsedItem == ITEM_MASTER_BALL) - shakes = 4; //why calculate the shakes before that check? - EmitBallThrow(0, shakes); - MarkBufferBankForExecution(gActiveBattler); - if (shakes == 4) //poke caught, copy of the code above - { - gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankTarget]], MON_DATA_POKEBALL, (const void*) &gLastUsedItem); - if (CalculatePlayerPartyCount() == 6) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else //rip - { - gBattleCommunication[MULTISTRING_CHOOSER] = shakes; - gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; - } - } - } -} - -static void atkF0_givecaughtmon(void) -{ - GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]]); - gBattleResults.caughtPoke = gBattleMons[gBankAttacker ^ 1].species; - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleResults.caughtNick); - gBattlescriptCurrInstr++; -} - -static void atkF1_trysetcaughtmondexflags(void) -{ - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 3); - if (gBattleMons[gBankTarget].species == SPECIES_UNOWN) - gSaveBlock2.pokedex.unownPersonality = gBattleMons[gBankTarget].personality; - if (gBattleMons[gBankTarget].species == SPECIES_SPINDA) //else if - gSaveBlock2.pokedex.spindaPersonality = gBattleMons[gBankTarget].personality; - gBattlescriptCurrInstr += 5; - } -} - -extern const u32 gBattleTerrainTiles_Building[]; -extern const u32 gBattleTerrainTilemap_Building[]; -extern const u32 gBattleTerrainPalette_BattleTower[]; - -static void atkF2_displaydexinfo(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); - gBattleCommunication[0]++; - break; - case 1: - if (!gPaletteFade.active) - { - gBattleCommunication[1] = sub_809070C(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), gBattleMons[gBankTarget].otId, gBattleMons[gBankTarget].personality); - gBattleCommunication[0]++; - } - break; - case 2: - if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2 && !gTasks[gBattleCommunication[1]].isActive) - { - LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - REG_BG3CNT = 0x5a0b; - gBattle_BG3_X = 0x100; - BeginNormalPaletteFade(0xFFFC, 0, 16, 0, RGB(0, 0, 0)); - gBattleCommunication[0]++; - } - break; - case 3: - if (!gPaletteFade.active) - gBattlescriptCurrInstr++; - break; - } -} - -NAKED -void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0) -{ - 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\ - ldr r4, [sp, 0x20]\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r12, r1\n\ - lsls r2, 24\n\ - lsrs r5, r2, 24\n\ - lsls r3, 24\n\ - lsrs r7, r3, 24\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - mov r8, r4\n\ - mov r2, r12\n\ - cmp r2, r7\n\ - bgt _0802BC5A\n\ - lsls r1, r6, 1\n\ - ldr r0, _0802BC20 @ =0x0600c000\n\ - adds r1, r0\n\ - mov r9, r1\n\ -_0802BC06:\n\ - adds r1, r6, 0\n\ - adds r0, r2, 0x1\n\ - mov r10, r0\n\ - cmp r1, r5\n\ - bgt _0802BC54\n\ - lsls r0, r2, 6\n\ - mov r4, r9\n\ - adds r3, r4, r0\n\ -_0802BC16:\n\ - cmp r2, r12\n\ - bne _0802BC28\n\ - ldr r0, _0802BC24 @ =0x00001022\n\ - b _0802BC36\n\ - .align 2, 0\n\ -_0802BC20: .4byte 0x0600c000\n\ -_0802BC24: .4byte 0x00001022\n\ -_0802BC28:\n\ - cmp r2, r7\n\ - bne _0802BC34\n\ - ldr r0, _0802BC30 @ =0x00001028\n\ - b _0802BC36\n\ - .align 2, 0\n\ -_0802BC30: .4byte 0x00001028\n\ -_0802BC34:\n\ - ldr r0, _0802BC68 @ =0x00001025\n\ -_0802BC36:\n\ - cmp r1, r6\n\ - beq _0802BC42\n\ - adds r0, 0x1\n\ - cmp r1, r5\n\ - bne _0802BC42\n\ - adds r0, 0x1\n\ -_0802BC42:\n\ - mov r4, r8\n\ - cmp r4, 0\n\ - beq _0802BC4A\n\ - movs r0, 0\n\ -_0802BC4A:\n\ - strh r0, [r3]\n\ - adds r3, 0x2\n\ - adds r1, 0x1\n\ - cmp r1, r5\n\ - ble _0802BC16\n\ -_0802BC54:\n\ - mov r2, r10\n\ - cmp r2, r7\n\ - ble _0802BC06\n\ -_0802BC5A:\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\ -_0802BC68: .4byte 0x00001025\n\ - .syntax divided"); -} - -void sub_802BC6C(void) -{ - MenuCursor_SetPos814A880(0xC8, ((gBattleCommunication[1] << 28) + 1207959552) >> 24); //what could that be? -} - -void nullsub_6(void) -{ - return; -} - -static void atkF3_trygivecaughtmonnick(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - sub_8023A80(); - gBattleCommunication[0]++; - gBattleCommunication[1] = 0; - sub_802BC6C(); - break; - case 1: - if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 1; - sub_802BC6C(); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gBattleCommunication[1] == 0) - { - gBattleCommunication[0]++; - BeginFastPaletteFade(3); - } - else - gBattleCommunication[0] = 4; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gBattleCommunication[0] = 4; - } - break; - case 2: - if (!gPaletteFade.active) - { - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleStruct->caughtNick); - DoNamingScreen(2, gBattleStruct->caughtNick, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]]), GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_PERSONALITY, 0), BattleMainCB2); - gBattleCommunication[0]++; - } - break; - case 3: - if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active ) - { - SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleStruct->caughtNick); - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - break; - case 4: - if (CalculatePlayerPartyCount() == 6) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - break; - } -} - -static void atkF4_subattackerhpbydmg(void) -{ - gBattleMons[gBankAttacker].hp -= gBattleMoveDamage; - gBattlescriptCurrInstr++; -} - -static void atkF5_removeattackerstatus1(void) -{ - gBattleMons[gBankAttacker].status1 = 0; - gBattlescriptCurrInstr++; -} - -static void atkF6_finishaction(void) -{ - gCurrentActionFuncId = 0xC; -} - -static void atkF7_finishturn(void) -{ - gCurrentActionFuncId = 0xC; - gCurrentTurnActionNumber = gBattlersCount; -} diff --git a/src/battle/battle_7.c b/src/battle/battle_7.c deleted file mode 100644 index 6e1ddceaf..000000000 --- a/src/battle/battle_7.c +++ /dev/null @@ -1,969 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_anim.h" -#include "battle_anim_813F0F4.h" -#include "battle_interface.h" -#include "blend_palette.h" -#include "contest.h" -#include "data2.h" -#include "decompress.h" -#include "main.h" -#include "m4a.h" -#include "palette.h" -#include "pokemon.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "constants/songs.h" -#include "sound.h" -#include "constants/species.h" -#include "sprite.h" -#include "task.h" -#include "text.h" -#include "gba/m4a_internal.h" -#include "ewram.h" -#include "graphics.h" - -extern u8 gBattleBufferA[][0x200]; -extern u8 gActiveBattler; -extern u8 gBattlersCount; -extern u16 gBattlerPartyIndexes[]; -extern u8 gBanksBySide[]; -extern u8 gBankSpriteIds[]; -extern u16 gUnknown_02024DE8; -extern u8 gDoingBattleAnim; -extern u32 gTransformedPersonalities[]; -extern struct Window gUnknown_03004210; -extern void (*gBattleBankFunc[])(void); -extern u8 gHealthboxIDs[]; -extern u8 gUnknown_0300434C[]; -extern struct MusicPlayerInfo gMPlay_SE1; -extern struct MusicPlayerInfo gMPlay_SE2; -extern struct MusicPlayerInfo gMPlay_BGM; -extern u32 gBitTable[]; -extern u16 gBattleTypeFlags; -extern u8 gBattleMonForms[]; -extern u8 gBattleAnimAttacker; -extern u8 gBattleAnimTarget; -extern void (*gAnimScriptCallback)(void); -extern u8 gAnimScriptActive; -extern const u8 *const gBattleAnims_General[]; -extern const u8 *const gBattleAnims_Special[]; -extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; -extern const struct MonCoords gTrainerFrontPicCoords[]; -extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; -extern const struct CompressedSpriteSheet gUnknown_081FAF24; -extern const struct SpriteTemplate gSpriteTemplate_81FAF34; -extern const u8 gSubstituteDollTilemap[]; // graphics.s -extern const u8 gSubstituteDollGfx[]; // graphics.s -extern const u8 gSubstituteDollPal[]; // graphics.s -extern const u8 gUnknown_08D09C48[]; // graphics.s - -const struct CompressedSpriteSheet gUnknown_0820A47C = -{ gBattleWindowLargeGfx, 4096, 0xd6ff }; - -const struct CompressedSpriteSheet gUnknown_0820A484 = -{ gBattleWindowSmallGfx, 4096, 0xd701 }; - -const struct CompressedSpriteSheet gUnknown_0820A48C[] = -{ - { gBattleWindowSmall2Gfx, 2048, 0xd6ff }, - { gBattleWindowSmall2Gfx, 2048, 0xd700 }, -}; - -const struct CompressedSpriteSheet gUnknown_0820A49C[] = -{ - { gBattleWindowSmall3Gfx, 2048, 0xd701 }, - { gBattleWindowSmall3Gfx, 2048, 0xd702 }, -}; - -const struct CompressedSpriteSheet gUnknown_0820A4AC = -{ gBattleWindowLarge2Gfx, 4096, 0xd70b }; - -const struct CompressedSpriteSheet gUnknown_0820A4B4[] = -{ - { gBlankGfxCompressed, 256, 0xd704 }, - { gBlankGfxCompressed, 288, 0xd705 }, - { gBlankGfxCompressed, 256, 0xd706 }, - { gBlankGfxCompressed, 288, 0xd707 }, -}; - -const struct SpritePalette gUnknown_0820A4D4[] = -{ - { gUnknown_08D1212C, 0xD6FF }, - { gUnknown_08D1214C, 0xD704 }, -}; - -extern void c3_0802FDF4(u8); -extern void sub_80440EC(); -extern void sub_804777C(); -extern u8 GetBattlerSpriteCoord(); -extern u8 IsBankSpritePresent(u8); -extern u8 sub_8077F68(u8); -extern u8 sub_8077F7C(u8); -extern void sub_8094958(void); -extern void sub_80105DC(struct Sprite *); -extern void move_anim_start_t2(); - -void sub_80315E8(u8); -u8 sub_803163C(u8); -void sub_80316CC(u8); -void sub_8031F0C(void); -void refresh_graphics_maybe(u8, u8, u8); -void sub_80324E0(u8 a); -void sub_80327CC(void); -void sub_8032978(struct Sprite *); -void sub_80328A4(struct Sprite *); - -void sub_80312F0(struct Sprite *sprite) -{ - u8 spriteId = sprite->data[1]; - - if (gSprites[spriteId].affineAnimEnded && !gSprites[spriteId].invisible) - { - if (gSprites[spriteId].animPaused) - gSprites[spriteId].animPaused = FALSE; - else if (gSprites[spriteId].animEnded) - { - gSprites[spriteId].callback = sub_80105DC; - StartSpriteAffineAnim(&gSprites[spriteId], 0); - sprite->callback = SpriteCallbackDummy; - } - } -} - -void unref_sub_8031364(struct Sprite *sprite, bool8 stupid) -{ - sprite->animPaused = TRUE; - sprite->callback = SpriteCallbackDummy; - if (!stupid) - StartSpriteAffineAnim(sprite, 1); - else - StartSpriteAffineAnim(sprite, 1); - AnimateSprite(sprite); -} - -void sub_80313A0(struct Sprite *sprite) -{ - if (!(gUnknown_02024DE8 & 1)) - { - sprite->pos2.x += sprite->data[0]; - if (sprite->pos2.x == 0) - sprite->callback = SpriteCallbackDummy; - } -} - -void move_anim_start_t2_for_situation(u8 a, u32 b) -{ - ewram17810[gActiveBattler].unk0_4 = 1; - if (a == 0) - { - if (b == 0x20) - move_anim_start_t2(gActiveBattler, 6); - else if (b == 8 || (b & 0x80)) - move_anim_start_t2(gActiveBattler, 0); - else if (b == 0x10) - move_anim_start_t2(gActiveBattler, 2); - else if (b & 7) - move_anim_start_t2(gActiveBattler, 4); - else if (b == 0x40) - move_anim_start_t2(gActiveBattler, 5); - else - ewram17810[gActiveBattler].unk0_4 = 0; - } - else - { - if (b & 0x000F0000) - move_anim_start_t2(gActiveBattler, 3); - else if (b & 7) - move_anim_start_t2(gActiveBattler, 1); - else if (b & 0x10000000) - move_anim_start_t2(gActiveBattler, 7); - else if (b & 0x08000000) - move_anim_start_t2(gActiveBattler, 8); - else if (b & 0x0000E000) - move_anim_start_t2(gActiveBattler, 9); - else - ewram17810[gActiveBattler].unk0_4 = 0; - } -} - -bool8 move_anim_start_t3(u8 a, u8 b, u8 c, u8 d, u16 e) -{ - u8 taskId; - - if (d == 0 && (e & 0x80)) - { - gBattleMonForms[a] = e & 0x7F; - return TRUE; - } - if (ewram17800[a].substituteSprite && sub_803163C(d) == 0) - return TRUE; - if (ewram17800[a].substituteSprite && d == 2 && gSprites[gBankSpriteIds[a]].invisible) - { - refresh_graphics_maybe(a, 1, gBankSpriteIds[a]); - sub_80324E0(a); - return TRUE; - } - gBattleAnimAttacker = b; - gBattleAnimTarget = c; - ewram17840.unk0 = e; - LaunchBattleAnimation(gBattleAnims_General, d, 0); - taskId = CreateTask(sub_80315E8, 10); - gTasks[taskId].data[0] = a; - ewram17810[gTasks[taskId].data[0]].unk0_5 = 1; - return FALSE; -} - -void sub_80315E8(u8 taskId) -{ - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - ewram17810[gTasks[taskId].data[0]].unk0_5 = 0; - DestroyTask(taskId); - } -} - -u8 sub_803163C(u8 a) -{ - switch (a) - { - case 2: - case 10: - case 11: - case 12: - case 13: - case 17: - return 1; - default: - return 0; - } -} - -void move_anim_start_t4(u8 a, u8 b, u8 c, u8 d) -{ - u8 taskId; - - gBattleAnimAttacker = b; - gBattleAnimTarget = c; - LaunchBattleAnimation(gBattleAnims_Special, d, 0); - taskId = CreateTask(sub_80316CC, 10); - gTasks[taskId].data[0] = a; - ewram17810[gTasks[taskId].data[0]].unk0_6 = 1; -} - -void sub_80316CC(u8 taskId) -{ - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - ewram17810[gTasks[taskId].data[0]].unk0_6 = 0; - DestroyTask(taskId); - } -} - -u8 sub_8031720(int unused1, int unused2) -{ - return 0; -} - -bool8 mplay_80342A4(u8 a) -{ - u8 zero = 0; - - if (IsSEPlaying()) - { - ewram17810[a].unk8++; - if (ewram17810[gActiveBattler].unk8 < 30) - return TRUE; - m4aMPlayStop(&gMPlay_SE1); - m4aMPlayStop(&gMPlay_SE2); - } - if (zero == 0) - { - ewram17810[a].unk8 = 0; - return FALSE; - } - return TRUE; -} - -void BattleLoadOpponentMonSprite(struct Pokemon *pkmn, u8 b) -{ - u32 personalityValue; - u16 species; - u32 r7; - u32 otId; - u8 var; - u16 paletteOffset; - const u8 *lzPaletteData; - - personalityValue = GetMonData(pkmn, MON_DATA_PERSONALITY); - if (ewram17800[b].transformedSpecies == 0) - { - species = GetMonData(pkmn, MON_DATA_SPECIES); - r7 = personalityValue; - } - else - { - species = ewram17800[b].transformedSpecies; - r7 = gTransformedPersonalities[b]; - } - otId = GetMonData(pkmn, MON_DATA_OT_ID); - var = GetBattlerPosition(b); - HandleLoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, - gMonFrontPicCoords[species].y_offset, - eVoidSharedArr2, - gUnknown_081FAF4C[var], - species, - r7); - paletteOffset = 0x100 + b * 16; - if (ewram17800[b].transformedSpecies == 0) - lzPaletteData = GetMonSpritePal(pkmn); - else - lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue); - LZDecompressWram(lzPaletteData, gSharedMem); - LoadPalette(gSharedMem, paletteOffset, 0x20); - LoadPalette(gSharedMem, 0x80 + b * 16, 0x20); - if (species == SPECIES_CASTFORM) - { - paletteOffset = 0x100 + b * 16; - LZDecompressWram(lzPaletteData, ewram16400); - LoadPalette(ewram16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20); - } - if (ewram17800[b].transformedSpecies != 0) - { - BlendPalette(paletteOffset, 16, 6, RGB(31, 31, 31)); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); - } -} - -void BattleLoadPlayerMonSprite(struct Pokemon *pkmn, u8 b) -{ - u32 personalityValue; - u16 species; - u32 r7; - u32 otId; - u8 var; - u16 paletteOffset; - const u8 *lzPaletteData; - - personalityValue = GetMonData(pkmn, MON_DATA_PERSONALITY); - if (ewram17800[b].transformedSpecies == 0) - { - species = GetMonData(pkmn, MON_DATA_SPECIES); - r7 = personalityValue; - } - else - { - species = ewram17800[b].transformedSpecies; - r7 = gTransformedPersonalities[b]; - } - otId = GetMonData(pkmn, MON_DATA_OT_ID); - var = GetBattlerPosition(b); - HandleLoadSpecialPokePic( - &gMonBackPicTable[species], - gMonBackPicCoords[species].coords, - gMonBackPicCoords[species].y_offset, - eVoidSharedArr2, - gUnknown_081FAF4C[var], - species, - r7); - paletteOffset = 0x100 + b * 16; - if (ewram17800[b].transformedSpecies == 0) - lzPaletteData = GetMonSpritePal(pkmn); - else - lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue); - LZDecompressWram(lzPaletteData, gSharedMem); - LoadPalette(gSharedMem, paletteOffset, 0x20); - LoadPalette(gSharedMem, 0x80 + b * 16, 0x20); - if (species == SPECIES_CASTFORM) - { - paletteOffset = 0x100 + b * 16; - LZDecompressWram(lzPaletteData, ewram16400); - LoadPalette(ewram16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20); - } - if (ewram17800[b].transformedSpecies != 0) - { - BlendPalette(paletteOffset, 16, 6, RGB(31, 31, 31)); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); - } -} - -void unref_sub_8031A64(void) -{ -} - -void nullsub_9(u16 unused) -{ -} - -void sub_8031A6C(u16 a, u8 b) -{ - u8 status; - struct CompressedSpriteSheet spriteSheet; - - status = GetBattlerPosition(b); - DecompressPicFromTable_2( - &gTrainerFrontPicTable[a], - gTrainerFrontPicCoords[a].coords, - gTrainerFrontPicCoords[a].y_offset, - eVoidSharedArr, - gUnknown_081FAF4C[status], - 0); - spriteSheet.data = gUnknown_081FAF4C[status]; - spriteSheet.size = gTrainerFrontPicTable[a].size; - spriteSheet.tag = gTrainerFrontPicTable[a].tag; - LoadCompressedObjectPic(&spriteSheet); - LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[a]); -} - -void LoadPlayerTrainerBankSprite(u16 a, u8 b) -{ - u8 status; - - status = GetBattlerPosition(b); - DecompressPicFromTable_2( - &gTrainerBackPicTable[a], - gTrainerBackPicCoords[a].coords, - gTrainerBackPicCoords[a].y_offset, - eVoidSharedArr, - gUnknown_081FAF4C[status], - 0); - LoadCompressedPalette(gTrainerBackPicPaletteTable[a].data, 0x100 + b * 16, 32); -} - -void nullsub_10(int unused) -{ -} - -void sub_8031B74(u16 a) -{ - FreeSpritePaletteByTag(gTrainerFrontPicPaletteTable[a].tag); - FreeSpriteTilesByTag(gTrainerFrontPicTable[a].tag); -} - -void unref_sub_8031BA0(void) -{ - u8 count; - u8 i; - - LoadSpritePalette(&gUnknown_0820A4D4[0]); - LoadSpritePalette(&gUnknown_0820A4D4[1]); - if (!IsDoubleBattle()) - { - LoadCompressedObjectPic(&gUnknown_0820A47C); - LoadCompressedObjectPic(&gUnknown_0820A484); - count = 2; - } - else - { - LoadCompressedObjectPic(&gUnknown_0820A48C[0]); - LoadCompressedObjectPic(&gUnknown_0820A48C[1]); - LoadCompressedObjectPic(&gUnknown_0820A49C[0]); - LoadCompressedObjectPic(&gUnknown_0820A49C[1]); - count = 4; - } - for (i = 0; i < count; i++) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[i]]); -} - -bool8 sub_8031C30(u8 a) -{ - bool8 retVal = FALSE; - - if (a != 0) - { - if (a == 1) - { - LoadSpritePalette(&gUnknown_0820A4D4[0]); - LoadSpritePalette(&gUnknown_0820A4D4[1]); - } - else if (!IsDoubleBattle()) - { - if (a == 2) - { - if (gBattleTypeFlags & 0x80) - LoadCompressedObjectPic(&gUnknown_0820A4AC); - else - LoadCompressedObjectPic(&gUnknown_0820A47C); - } - else if (a == 3) - LoadCompressedObjectPic(&gUnknown_0820A484); - else if (a == 4) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[0]]); - else if (a == 5) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[1]]); - else - retVal = TRUE; - } - else - { - if (a == 2) - LoadCompressedObjectPic(&gUnknown_0820A48C[0]); - else if (a == 3) - LoadCompressedObjectPic(&gUnknown_0820A48C[1]); - else if (a == 4) - LoadCompressedObjectPic(&gUnknown_0820A49C[0]); - else if (a == 5) - LoadCompressedObjectPic(&gUnknown_0820A49C[1]); - else if (a == 6) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[0]]); - else if (a == 7) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[1]]); - else if (a == 8) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[2]]); - else if (a == 9) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[3]]); - else - retVal = TRUE; - } - } - return retVal; -} - -void load_gfxc_health_bar(u8 a) -{ - LZDecompressWram(gUnknown_08D09C48, eVoidSharedArr); -} - -u8 battle_load_something(u8 *pState, u8 *b) -{ - bool8 retVal = FALSE; - - switch (*pState) - { - case 0: - sub_8031F0C(); - (*pState)++; - break; - case 1: - if (sub_8031C30(*b) == 0) - { - (*b)++; - } - else - { - *b = 0; - (*pState)++; - } - break; - case 2: - (*pState)++; - break; - case 3: - if ((gBattleTypeFlags & 0x80) && *b == 0) - gHealthboxIDs[*b] = battle_make_oam_safari_battle(); - else - gHealthboxIDs[*b] = battle_make_oam_normal_battle(*b); - (*b)++; - if (*b == gBattlersCount) - { - *b = 0; - (*pState)++; - } - break; - case 4: - sub_8043F44(*b); - if (gBanksBySide[*b] <= 1) - nullsub_11(gHealthboxIDs[*b], 0); - else - nullsub_11(gHealthboxIDs[*b], 1); - (*b)++; - if (*b == gBattlersCount) - { - *b = 0; - (*pState)++; - } - break; - case 5: - if (GetBattlerSide(*b) == 0) - { - if (!(gBattleTypeFlags & 0x80)) - sub_8045A5C(gHealthboxIDs[*b], &gPlayerParty[gBattlerPartyIndexes[*b]], 0); - } - else - { - sub_8045A5C(gHealthboxIDs[*b], &gEnemyParty[gBattlerPartyIndexes[*b]], 0); - } - sub_8043DB0(gHealthboxIDs[*b]); - (*b)++; - if (*b == gBattlersCount) - { - *b = 0; - (*pState)++; - } - break; - case 6: - sub_80327CC(); - sub_8094958(); - retVal = TRUE; - break; - } - return retVal; -} - -void sub_8031EE8(void) -{ - memset(ewram17810, 0, 0x30); - memset(&ewram17840, 0, 0x10); -} - -void sub_8031F0C(void) -{ - sub_8031EE8(); - memset(ewram17800, 0, 0x10); -} - -void sub_8031F24(void) -{ - s32 i; - - for (i = 0; i < gBattlersCount; i++) - ewram17800[i].invisible = gSprites[gBankSpriteIds[i]].invisible; -} - -void sub_8031F88(u8 a) -{ - ewram17800[a].invisible = gSprites[gBankSpriteIds[a]].invisible; -} - -void sub_8031FC4(u8 a, u8 b, bool8 c) -{ - u16 paletteOffset; - u16 species; - u32 personalityValue; - u32 otId; - u8 r10; - const u8 *lzPaletteData; - - if (c) - { - StartSpriteAnim(&gSprites[gBankSpriteIds[a]], ewram17840.unk0); - paletteOffset = 0x100 + a * 16; - LoadPalette(ewram16400 + ewram17840.unk0 * 32, paletteOffset, 32); - gBattleMonForms[a] = ewram17840.unk0; - if (ewram17800[a].transformedSpecies != 0) - { - BlendPalette(paletteOffset, 16, 6, RGB(31, 31, 31)); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); - } - gSprites[gBankSpriteIds[a]].pos1.y = sub_8077F68(a); - } - else - { - if (IsContest()) - { - r10 = 0; - species = shared19348.unk2; - personalityValue = shared19348.unk8; - otId = shared19348.unkC; - HandleLoadSpecialPokePic( - &gMonBackPicTable[species], - gMonBackPicCoords[species].coords, - gMonBackPicCoords[species].y_offset, - eVoidSharedArr2, - gUnknown_081FAF4C[0], - species, - shared19348.unk10); - } - else - { - r10 = GetBattlerPosition(a); - if (GetBattlerSide(b) == 1) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[b]], MON_DATA_SPECIES); - else - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[b]], MON_DATA_SPECIES); - if (GetBattlerSide(a) == 0) - { - personalityValue = GetMonData(&gPlayerParty[gBattlerPartyIndexes[a]], MON_DATA_PERSONALITY); - otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[a]], MON_DATA_OT_ID); - HandleLoadSpecialPokePic( - &gMonBackPicTable[species], - gMonBackPicCoords[species].coords, - gMonBackPicCoords[species].y_offset, - eVoidSharedArr2, - gUnknown_081FAF4C[r10], - species, - gTransformedPersonalities[a]); - } - else - { - personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[a]], MON_DATA_PERSONALITY); - otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[a]], MON_DATA_OT_ID); - HandleLoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, - gMonFrontPicCoords[species].y_offset, - eVoidSharedArr2, - gUnknown_081FAF4C[r10], - species, - gTransformedPersonalities[a]); - } - } - DmaCopy32Defvars(3, gUnknown_081FAF4C[r10], (void *)(VRAM + 0x10000 + gSprites[gBankSpriteIds[a]].oam.tileNum * 32), 0x800); - paletteOffset = 0x100 + a * 16; - lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue); - LZDecompressWram(lzPaletteData, gSharedMem); - LoadPalette(gSharedMem, paletteOffset, 32); - if (species == SPECIES_CASTFORM) - { - u16 *paletteSrc = (u16 *)ewram16400; // TODO: avoid casting? - - LZDecompressWram(lzPaletteData, paletteSrc); - LoadPalette(paletteSrc + gBattleMonForms[b] * 16, paletteOffset, 32); - } - BlendPalette(paletteOffset, 16, 6, RGB(31, 31, 31)); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); - if (!IsContest()) - { - ewram17800[a].transformedSpecies = species; - gBattleMonForms[a] = gBattleMonForms[b]; - } - gSprites[gBankSpriteIds[a]].pos1.y = sub_8077F68(a); - StartSpriteAnim(&gSprites[gBankSpriteIds[a]], gBattleMonForms[a]); - } -} - -void BattleLoadSubstituteSprite(u8 a, u8 b) -{ - u8 r4; - u16 foo; - const u8 *gSubstituteDollPal_; - void *src; - s32 i; - - if (b == 0) - { - if (IsContest()) - r4 = 0; - else - r4 = GetBattlerPosition(a); - if (IsContest()) - LZDecompressVram(gSubstituteDollTilemap, gUnknown_081FAF4C[r4]); - else if (GetBattlerSide(a) != 0) - LZDecompressVram(gSubstituteDollGfx, gUnknown_081FAF4C[r4]); - else - LZDecompressVram(gSubstituteDollTilemap, gUnknown_081FAF4C[r4]); - // There is probably a way to do this without all the temp variables, but I couldn't figure it out. - foo = a * 16; - gSubstituteDollPal_ = gSubstituteDollPal; - src = gUnknown_081FAF4C[r4]; - for (i = 0; i < 3; i++) - DmaCopy32(3, src, src + i * 0x800 + 0x800, 0x800); - LoadCompressedPalette(gSubstituteDollPal_, 0x100 + foo, 32); - } - else - { - if (!IsContest()) - { - if (GetBattlerSide(a) != 0) - BattleLoadOpponentMonSprite(&gEnemyParty[gBattlerPartyIndexes[a]], a); - else - BattleLoadPlayerMonSprite(&gPlayerParty[gBattlerPartyIndexes[a]], a); - } - } -} - -void refresh_graphics_maybe(u8 a, u8 b, u8 spriteId) -{ - BattleLoadSubstituteSprite(a, b); - StartSpriteAnim(&gSprites[spriteId], gBattleMonForms[a]); - if (b == 0) - gSprites[spriteId].pos1.y = sub_8077F7C(a); - else - gSprites[spriteId].pos1.y = sub_8077F68(a); -} - -void sub_80324BC(u8 a, u16 b) -{ - if (b == 0xA4) - ewram17800[a].substituteSprite = 1; -} - -void sub_80324E0(u8 a) -{ - ewram17800[a].substituteSprite = 0; -} - -void HandleLowHpMusicChange(struct Pokemon *pkmn, u8 b) -{ - u16 hp = GetMonData(pkmn, MON_DATA_HP); - u16 maxHP = GetMonData(pkmn, MON_DATA_MAX_HP); - - if (GetHPBarLevel(hp, maxHP) == 1) - { - if (!ewram17800[b].unk0_1) - { - if (!ewram17800[b ^ 2].unk0_1) - PlaySE(SE_HINSI); - ewram17800[b].unk0_1 = 1; - } - } - else - { - ewram17800[b].unk0_1 = 0; - if (!IsDoubleBattle()) - { - m4aSongNumStop(SE_HINSI); - return; - } - if (IsDoubleBattle() && !ewram17800[b ^ 2].unk0_1) - { - m4aSongNumStop(SE_HINSI); - return; - } - } -} - -void BattleStopLowHpSound(void) -{ - u8 r4 = GetBattlerAtPosition(0); - - ewram17800[r4].unk0_1 = 0; - if (IsDoubleBattle()) - ewram17800[r4 ^ 2].unk0_1 = 0; - m4aSongNumStop(SE_HINSI); -} - -u8 unref_sub_8032604(struct Pokemon *pkmn) -{ - u16 hp = GetMonData(pkmn, MON_DATA_HP); - u16 maxHP = GetMonData(pkmn, MON_DATA_MAX_HP); - - return GetHPBarLevel(hp, maxHP); -} - -void sub_8032638(void) -{ - if (gMain.inBattle) - { - u8 r8 = GetBattlerAtPosition(0); - u8 r9 = GetBattlerAtPosition(2); - u8 r4 = pokemon_order_func(gBattlerPartyIndexes[r8]); - u8 r5 = pokemon_order_func(gBattlerPartyIndexes[r9]); - - if (GetMonData(&gPlayerParty[r4], MON_DATA_HP) != 0) - HandleLowHpMusicChange(&gPlayerParty[r4], r8); - if (IsDoubleBattle()) - { - if (GetMonData(&gPlayerParty[r5], MON_DATA_HP) != 0) - HandleLowHpMusicChange(&gPlayerParty[r5], r9); - } - } -} - -void sub_80326EC(u8 a) -{ - s32 i; - - for (i = 0; i < gBattlersCount; i++) - { - if (IsBankSpritePresent(i) != 0) - { - gSprites[gBankSpriteIds[i]].oam.affineMode = a; - if (a == 0) - { - ewram17810[i].unk6 = gSprites[gBankSpriteIds[i]].oam.matrixNum; - gSprites[gBankSpriteIds[i]].oam.matrixNum = 0; - } - else - { - gSprites[gBankSpriteIds[i]].oam.matrixNum = ewram17810[i].unk6; - } - } - } -} - -void sub_80327CC(void) -{ - u8 r5; - - LoadCompressedObjectPic(&gUnknown_081FAF24); - r5 = GetBattlerAtPosition(1); - ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, GetBattlerSpriteCoord(r5, 0), GetBattlerSpriteCoord(r5, 1) + 32, 0xC8); - gSprites[ewram17810[r5].unk7].data[0] = r5; - if (IsDoubleBattle()) - { - r5 = GetBattlerAtPosition(3); - ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, GetBattlerSpriteCoord(r5, 0), GetBattlerSpriteCoord(r5, 1) + 32, 0xC8); - gSprites[ewram17810[r5].unk7].data[0] = r5; - } -} - -void sub_80328A4(struct Sprite *sprite) -{ - bool8 invisible = FALSE; - u8 r4 = sprite->data[0]; - struct Sprite *r7 = &gSprites[gBankSpriteIds[r4]]; - - if (!r7->inUse || IsBankSpritePresent(r4) == 0) - { - sprite->callback = sub_8032978; - return; - } - if (gAnimScriptActive || r7->invisible) - invisible = TRUE; - else if (ewram17800[r4].transformedSpecies != 0 && gEnemyMonElevation[ewram17800[r4].transformedSpecies] == 0) - invisible = TRUE; - if (ewram17800[r4].substituteSprite) - invisible = TRUE; - sprite->pos1.x = r7->pos1.x; - sprite->pos2.x = r7->pos2.x; - sprite->invisible = invisible; -} - -void sub_8032978(struct Sprite *sprite) -{ - sprite->invisible = TRUE; -} - -void sub_8032984(u8 a, u16 b) -{ - if (GetBattlerSide(a) != 0) - { - if (ewram17800[a].transformedSpecies != 0) - b = ewram17800[a].transformedSpecies; - if (gEnemyMonElevation[b] != 0) - gSprites[ewram17810[a].unk7].callback = sub_80328A4; - else - gSprites[ewram17810[a].unk7].callback = sub_8032978; - } -} - -void sub_8032A08(u8 a) -{ - gSprites[ewram17810[a].unk7].callback = sub_8032978; -} - -void sub_8032A38(void) -{ - u16 *ptr = (u16 *)(VRAM + 0x240); - s32 i; - s32 j; - - for (i = 0; i < 9; i++) - { - for (j = 0; j < 16; j++) - { - if (!(*ptr & 0xF000)) - *ptr |= 0xF000; - if (!(*ptr & 0x0F00)) - *ptr |= 0x0F00; - if (!(*ptr & 0x00F0)) - *ptr |= 0x00F0; - if (!(*ptr & 0x000F)) - *ptr |= 0x000F; - ptr++; - } - } -} - -void sub_8032AA8(u8 a, u8 b) -{ - ewram17800[a].transformedSpecies = 0; - gBattleMonForms[a] = 0; - if (b == 0) - sub_80324E0(a); -} diff --git a/src/battle/battle_ai.c b/src/battle/battle_ai.c deleted file mode 100644 index e192251d0..000000000 --- a/src/battle/battle_ai.c +++ /dev/null @@ -1,2157 +0,0 @@ -#include "global.h" -#include "battle_ai.h" -#include "constants/abilities.h" -#include "battle.h" -#include "constants/battle_move_effects.h" -#include "data2.h" -#include "item.h" -#include "constants/moves.h" -#include "pokemon.h" -#include "random.h" -#include "rom_8077ABC.h" -#include "constants/species.h" -#include "util.h" -#include "ewram.h" - -extern u8 gUnknown_02023A14_50; -extern u32 gUnknown_02023A14_4C; -extern u16 gBattleTypeFlags; -extern u16 gBattleWeather; -extern u8 gActiveBattler; -extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT]; -extern u16 gCurrentMove; -extern int gBattleMoveDamage; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u8 gAbsentBattlerFlags; -extern u8 gMoveResultFlags; -extern u16 gDynamicBasePower; -extern u16 gLastUsedMove[MAX_BATTLERS_COUNT]; -extern u32 gStatuses3[MAX_BATTLERS_COUNT]; -extern u16 gSideAffecting[2]; -extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT]; -extern u8 gCritMultiplier; -extern u16 gTrainerBattleOpponent; -extern u8 *BattleAIs[]; - -enum -{ - WEATHER_TYPE_SUN, - WEATHER_TYPE_RAIN, - WEATHER_TYPE_SANDSTORM, - WEATHER_TYPE_HAIL, -}; - -/* -gAIScriptPtr is a pointer to the next battle AI cmd command to read. -when a command finishes processing, gAIScriptPtr is incremented by -the number of bytes that the current command had reserved for arguments -in order to read the next command correctly. refer to battle_ai_scripts.s for the -AI scripts. -*/ -EWRAM_DATA u8 *gAIScriptPtr = NULL; - -static void BattleAICmd_if_random_less_than(void); -static void BattleAICmd_if_random_greater_than(void); -static void BattleAICmd_if_random_equal(void); -static void BattleAICmd_if_random_not_equal(void); -static void BattleAICmd_score(void); -static void BattleAICmd_if_hp_less_than(void); -static void BattleAICmd_if_hp_more_than(void); -static void BattleAICmd_if_hp_equal(void); -static void BattleAICmd_if_hp_not_equal(void); -static void BattleAICmd_if_status(void); -static void BattleAICmd_if_not_status(void); -static void BattleAICmd_if_status2(void); -static void BattleAICmd_if_not_status2(void); -static void BattleAICmd_if_status3(void); -static void BattleAICmd_if_not_status3(void); -static void BattleAICmd_if_status4(void); -static void BattleAICmd_if_not_status4(void); -static void BattleAICmd_if_less_than(void); -static void BattleAICmd_if_more_than(void); -static void BattleAICmd_if_equal(void); -static void BattleAICmd_if_not_equal(void); -static void BattleAICmd_if_less_than_32(void); -static void BattleAICmd_if_more_than_32(void); -static void BattleAICmd_if_equal_32(void); -static void BattleAICmd_if_not_equal_32(void); -static void BattleAICmd_if_move(void); -static void BattleAICmd_if_not_move(void); -static void BattleAICmd_if_in_bytes(void); -static void BattleAICmd_if_not_in_bytes(void); -static void BattleAICmd_if_in_words(void); -static void BattleAICmd_if_not_in_words(void); -static void BattleAICmd_if_user_can_damage(void); -static void BattleAICmd_if_user_cant_damage(void); -static void BattleAICmd_get_turn_count(void); -static void BattleAICmd_get_type(void); -static void BattleAICmd_get_move_power(void); -static void BattleAICmd_is_most_powerful_move(void); -static void BattleAICmd_get_move(void); -static void BattleAICmd_if_arg_equal(void); -static void BattleAICmd_if_arg_not_equal(void); -static void BattleAICmd_if_would_go_first(void); -static void BattleAICmd_if_would_not_go_first(void); -static void BattleAICmd_nullsub_2A(void); -static void BattleAICmd_nullsub_2B(void); -static void BattleAICmd_count_alive_pokemon(void); -static void BattleAICmd_get_considered_move(void); -static void BattleAICmd_get_considered_move_effect(void); -static void BattleAICmd_get_ability(void); -static void BattleAICmd_get_highest_possible_damage(void); -static void BattleAICmd_if_damage_bonus(void); -static void BattleAICmd_nullsub_32(void); -static void BattleAICmd_nullsub_33(void); -static void BattleAICmd_if_status_in_party(void); -static void BattleAICmd_if_status_not_in_party(void); -static void BattleAICmd_get_weather(void); -static void BattleAICmd_if_effect(void); -static void BattleAICmd_if_not_effect(void); -static void BattleAICmd_if_stat_level_less_than(void); -static void BattleAICmd_if_stat_level_more_than(void); -static void BattleAICmd_if_stat_level_equal(void); -static void BattleAICmd_if_stat_level_not_equal(void); -static void BattleAICmd_if_can_faint(void); -static void BattleAICmd_if_cant_faint(void); -static void BattleAICmd_if_has_move(void); -static void BattleAICmd_if_dont_have_move(void); -static void BattleAICmd_if_move_effect(void); -static void BattleAICmd_if_not_move_effect(void); -static void BattleAICmd_if_last_move_did_damage(void); -static void BattleAICmd_if_encored(void); -static void BattleAICmd_flee(void); -static void BattleAICmd_if_random_100(void); -static void BattleAICmd_watch(void); -static void BattleAICmd_get_hold_effect(void); -static void BattleAICmd_get_gender(void); -static void BattleAICmd_is_first_turn(void); -static void BattleAICmd_get_stockpile_count(void); -static void BattleAICmd_is_double_battle(void); -static void BattleAICmd_get_used_item(void); -static void BattleAICmd_get_move_type_from_result(void); -static void BattleAICmd_get_move_power_from_result(void); -static void BattleAICmd_get_move_effect_from_result(void); -static void BattleAICmd_get_protect_count(void); -static void BattleAICmd_nullsub_52(void); -static void BattleAICmd_nullsub_53(void); -static void BattleAICmd_nullsub_54(void); -static void BattleAICmd_nullsub_55(void); -static void BattleAICmd_nullsub_56(void); -static void BattleAICmd_nullsub_57(void); -static void BattleAICmd_call(void); -static void BattleAICmd_jump(void); -static void BattleAICmd_end(void); -static void BattleAICmd_if_level_compare(void); -static void BattleAICmd_if_taunted(void); -static void BattleAICmd_if_not_taunted(void); - -typedef void (*BattleAICmdFunc)(void); - -static const BattleAICmdFunc sBattleAICmdTable[] = -{ - BattleAICmd_if_random_less_than, // 0x0 - BattleAICmd_if_random_greater_than, // 0x1 - BattleAICmd_if_random_equal, // 0x2 - BattleAICmd_if_random_not_equal, // 0x3 - BattleAICmd_score, // 0x4 - BattleAICmd_if_hp_less_than, // 0x5 - BattleAICmd_if_hp_more_than, // 0x6 - BattleAICmd_if_hp_equal, // 0x7 - BattleAICmd_if_hp_not_equal, // 0x8 - BattleAICmd_if_status, // 0x9 - BattleAICmd_if_not_status, // 0xA - BattleAICmd_if_status2, // 0xB - BattleAICmd_if_not_status2, // 0xC - BattleAICmd_if_status3, // 0xD - BattleAICmd_if_not_status3, // 0xE - BattleAICmd_if_status4, // 0xF - BattleAICmd_if_not_status4, // 0x10 - BattleAICmd_if_less_than, // 0x11 - BattleAICmd_if_more_than, // 0x12 - BattleAICmd_if_equal, // 0x13 - BattleAICmd_if_not_equal, // 0x14 - BattleAICmd_if_less_than_32, // 0x15 - BattleAICmd_if_more_than_32, // 0x16 - BattleAICmd_if_equal_32, // 0x17 - BattleAICmd_if_not_equal_32, // 0x18 - BattleAICmd_if_move, // 0x19 - BattleAICmd_if_not_move, // 0x1A - BattleAICmd_if_in_bytes, // 0x1B - BattleAICmd_if_not_in_bytes, // 0x1C - BattleAICmd_if_in_words, // 0x1D - BattleAICmd_if_not_in_words, // 0x1E - BattleAICmd_if_user_can_damage, // 0x1F - BattleAICmd_if_user_cant_damage, // 0x20 - BattleAICmd_get_turn_count, // 0x21 - BattleAICmd_get_type, // 0x22 - BattleAICmd_get_move_power, // 0x23 - BattleAICmd_is_most_powerful_move, // 0x24 - BattleAICmd_get_move, // 0x25 - BattleAICmd_if_arg_equal, // 0x26 - BattleAICmd_if_arg_not_equal, // 0x27 - BattleAICmd_if_would_go_first, // 0x28 - BattleAICmd_if_would_not_go_first, // 0x29 - BattleAICmd_nullsub_2A, // 0x2A - BattleAICmd_nullsub_2B, // 0x2B - BattleAICmd_count_alive_pokemon, // 0x2C - BattleAICmd_get_considered_move, // 0x2D - BattleAICmd_get_considered_move_effect, // 0x2E - BattleAICmd_get_ability, // 0x2F - BattleAICmd_get_highest_possible_damage, // 0x30 - BattleAICmd_if_damage_bonus, // 0x31 - BattleAICmd_nullsub_32, // 0x32 - BattleAICmd_nullsub_33, // 0x33 - BattleAICmd_if_status_in_party, // 0x34 - BattleAICmd_if_status_not_in_party, // 0x35 - BattleAICmd_get_weather, // 0x36 - BattleAICmd_if_effect, // 0x37 - BattleAICmd_if_not_effect, // 0x38 - BattleAICmd_if_stat_level_less_than, // 0x39 - BattleAICmd_if_stat_level_more_than, // 0x3A - BattleAICmd_if_stat_level_equal, // 0x3B - BattleAICmd_if_stat_level_not_equal, // 0x3C - BattleAICmd_if_can_faint, // 0x3D - BattleAICmd_if_cant_faint, // 0x3E - BattleAICmd_if_has_move, // 0x3F - BattleAICmd_if_dont_have_move, // 0x40 - BattleAICmd_if_move_effect, // 0x41 - BattleAICmd_if_not_move_effect, // 0x42 - BattleAICmd_if_last_move_did_damage, // 0x43 - BattleAICmd_if_encored, // 0x44 - BattleAICmd_flee, // 0x45 - BattleAICmd_if_random_100, // 0x46 - BattleAICmd_watch, // 0x47 - BattleAICmd_get_hold_effect, // 0x48 - BattleAICmd_get_gender, // 0x49 - BattleAICmd_is_first_turn, // 0x4A - BattleAICmd_get_stockpile_count, // 0x4B - BattleAICmd_is_double_battle, // 0x4C - BattleAICmd_get_used_item, // 0x4D - BattleAICmd_get_move_type_from_result, // 0x4E - BattleAICmd_get_move_power_from_result, // 0x4F - BattleAICmd_get_move_effect_from_result, // 0x50 - BattleAICmd_get_protect_count, // 0x51 - BattleAICmd_nullsub_52, // 0x52 - BattleAICmd_nullsub_53, // 0x53 - BattleAICmd_nullsub_54, // 0x54 - BattleAICmd_nullsub_55, // 0x55 - BattleAICmd_nullsub_56, // 0x56 - BattleAICmd_nullsub_57, // 0x57 - BattleAICmd_call, // 0x58 - BattleAICmd_jump, // 0x59 - BattleAICmd_end, // 0x5A - BattleAICmd_if_level_compare, // 0x5B - BattleAICmd_if_taunted, // 0x5C - BattleAICmd_if_not_taunted, // 0x5D -}; - -#ifdef NONMATCHING -static -#endif -const u16 sDiscouragedPowerfulMoveEffects[] = -{ - EFFECT_EXPLOSION, - EFFECT_DREAM_EATER, - EFFECT_RAZOR_WIND, - EFFECT_SKY_ATTACK, - EFFECT_RECHARGE, - EFFECT_SKULL_BASH, - EFFECT_SOLARBEAM, - EFFECT_SPIT_UP, - EFFECT_FOCUS_PUNCH, - EFFECT_SUPERPOWER, - EFFECT_ERUPTION, - EFFECT_OVERHEAT, - 0xFFFF -}; - -// if the AI is a Link battle, safari, battle tower, or ereader, it will ignore considering item uses. -void BattleAI_HandleItemUseBeforeAISetup(void) -{ - s32 i; - u8 *data; - - MEMSET_ALT(AI_BATTLE_HISTORY, 0, sizeof(struct BattleHistory), i, data); - - if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && gTrainerBattleOpponent != 0x400 - && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) - { - for (i = 0; i < MAX_TRAINER_ITEMS; i++) - { - if (gTrainers[gTrainerBattleOpponent].items[i] != 0) - { - AI_BATTLE_HISTORY->trainerItems[AI_BATTLE_HISTORY->numItems] = gTrainers[gTrainerBattleOpponent].items[i]; - AI_BATTLE_HISTORY->numItems++; - } - } - } - - BattleAI_SetupAIData(); -} - -void BattleAI_SetupAIData(void) -{ - s32 i; - u8 limitations; - u8 *data; - - // clear AI data and set default move score to 100. strange that they didn't use memset here. - MEMSET_ALT(AI_THINKING_STRUCT, 0, sizeof(struct AI_ThinkingStruct), i, data); - - for (i = 0; i < MAX_MON_MOVES; i++) - AI_THINKING_STRUCT->score[i] = 100; - - limitations = CheckMoveLimitations(gActiveBattler, 0, 0xFF); - - // do not consider moves the AI cannot select - // also, roll simulated RNG for moves that have a degree of - // randomness. - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBitTable[i] & limitations) - AI_THINKING_STRUCT->score[i] = 0; - - AI_THINKING_STRUCT->simulatedRNG[i] = 100 - (Random() % 16); - } - - // clear AI stack. - AI_STACK->size = 0; - gBankAttacker = gActiveBattler; - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - gBankTarget = Random() & 2; // just pick somebody to target. - - if (gAbsentBattlerFlags & gBitTable[gBankTarget]) - gBankTarget ^= 2; - } - else - gBankTarget = gActiveBattler ^ 1; - - // special AI flag cases. - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - AI_THINKING_STRUCT->aiFlags = 0x40000000; - else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) - AI_THINKING_STRUCT->aiFlags = 0x20000000; - else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) - AI_THINKING_STRUCT->aiFlags = 0x80000000; -#ifdef GERMAN - else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER) || gTrainerBattleOpponent == SECRET_BASE_OPPONENT) - AI_THINKING_STRUCT->aiFlags = 7; -#endif - else // otherwise, just set aiFlags to whatever flags the trainer has set in their data. - AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent].aiFlags; -#if DEBUG - if (gUnknown_02023A14_50 & 1) - AI_THINKING_STRUCT->aiFlags = gUnknown_02023A14_4C; -#endif -} - -u8 BattleAI_GetAIActionToUse(void) -{ - u8 currentMoveArray[MAX_MON_MOVES]; - u8 consideredMoveArray[MAX_MON_MOVES]; - u8 numOfBestMoves; - s32 i; - - sub_810745C(); - while (AI_THINKING_STRUCT->aiFlags != 0) - { - if (AI_THINKING_STRUCT->aiFlags & 1) - { - AI_THINKING_STRUCT->aiState = BATTLEAI_SETTING_UP; - BattleAI_DoAIProcessing(); - } - AI_THINKING_STRUCT->aiFlags >>= 1; - AI_THINKING_STRUCT->aiLogicId++; - AI_THINKING_STRUCT->movesetIndex = 0; - } - - // special flee or watch cases for safari. - if (AI_THINKING_STRUCT->aiAction & (AI_ACTION_FLEE)) // flee - return 4; - if (AI_THINKING_STRUCT->aiAction & (AI_ACTION_WATCH)) // watch - return 5; - - numOfBestMoves = 1; - currentMoveArray[0] = AI_THINKING_STRUCT->score[0]; - consideredMoveArray[0] = 0; - - for (i = 1; i < MAX_MON_MOVES; i++) - { - if (currentMoveArray[0] < AI_THINKING_STRUCT->score[i]) - { - numOfBestMoves = 1; - currentMoveArray[0] = AI_THINKING_STRUCT->score[i]; - consideredMoveArray[0] = i; - } - if (currentMoveArray[0] == AI_THINKING_STRUCT->score[i]) - { - currentMoveArray[numOfBestMoves] = AI_THINKING_STRUCT->score[i]; - consideredMoveArray[numOfBestMoves++] = i; - } - } - - return consideredMoveArray[Random() % numOfBestMoves]; // break any ties that exist. -} - -void BattleAI_DoAIProcessing(void) -{ - while (AI_THINKING_STRUCT->aiState != BATTLEAI_FINISHED) - { - switch (AI_THINKING_STRUCT->aiState) - { - case BATTLEAI_DO_NOT_PROCESS: //Needed to match. - break; - case BATTLEAI_SETTING_UP: - gAIScriptPtr = BattleAIs[AI_THINKING_STRUCT->aiLogicId]; // set the AI ptr. - if (gBattleMons[gBankAttacker].pp[AI_THINKING_STRUCT->movesetIndex] == 0) - { - AI_THINKING_STRUCT->moveConsidered = MOVE_NONE; // don't consider a move you have 0 PP for, idiot. - } - else - { - AI_THINKING_STRUCT->moveConsidered = gBattleMons[gBankAttacker].moves[AI_THINKING_STRUCT->movesetIndex]; - } - AI_THINKING_STRUCT->aiState++; - break; - case BATTLEAI_PROCESSING: - if (AI_THINKING_STRUCT->moveConsidered != MOVE_NONE) - sBattleAICmdTable[*gAIScriptPtr](); // run AI command. - else - { - AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; // definitely do not consider any move that has 0 PP. - AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE; - } - if (AI_THINKING_STRUCT->aiAction & AI_ACTION_DONE) - { - AI_THINKING_STRUCT->movesetIndex++; - if (AI_THINKING_STRUCT->movesetIndex < MAX_MON_MOVES && (AI_THINKING_STRUCT->aiAction & AI_ACTION_DO_NOT_ATTACK) == 0) - AI_THINKING_STRUCT->aiState = BATTLEAI_SETTING_UP; // as long as their are more moves to process, keep setting this to setup state. - else - AI_THINKING_STRUCT->aiState++; // done processing. - AI_THINKING_STRUCT->aiAction &= (AI_ACTION_FLEE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK | - AI_ACTION_UNK5 | AI_ACTION_UNK6 | AI_ACTION_UNK7 | AI_ACTION_UNK8); // disable AI_ACTION_DONE. - } - break; - } - } -} - -void sub_810745C(void) -{ - s32 i; - - for (i = 0; i < 8; i++) - { - if (AI_BATTLE_HISTORY->usedMoves[gBankTarget >> 1][i] == 0) - { - AI_BATTLE_HISTORY->usedMoves[gBankTarget >> 1][i] = gLastUsedMove[gBankTarget]; - return; - } - } -} - -void unref_sub_81074A0(u8 a) -{ - s32 i; - - for (i = 0; i < 8; i++) - AI_BATTLE_HISTORY->usedMoves[a / 2][i] = 0; -} - -void RecordAbilityBattle(u8 a, u8 b) -{ - if (GetBattlerSide(a) == 0) - AI_BATTLE_HISTORY->abilities[GetBattlerPosition(a) & 1] = b; -} - -void RecordItemBattle(u8 a, u8 b) -{ - if (GetBattlerSide(a) == 0) - AI_BATTLE_HISTORY->itemEffects[GetBattlerPosition(a) & 1] = b; -} - -static void BattleAICmd_if_random_less_than(void) -{ - if (Random() % 256 < gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_random_greater_than(void) -{ - if (Random() % 256 > gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_random_equal(void) -{ - if (Random() % 256 == gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_random_not_equal(void) -{ - if (Random() % 256 != gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_score(void) -{ - AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] += gAIScriptPtr[1]; // add the result to the array of the move consider's score. - - if (AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] < 0) // if the score is negative, flatten it to 0. - AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; - - gAIScriptPtr += 2; // AI return. -} - -static void BattleAICmd_if_hp_less_than(void) -{ - u16 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) < gAIScriptPtr[2]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_hp_more_than(void) -{ - u16 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) > gAIScriptPtr[2]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_hp_equal(void) -{ - u16 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) == gAIScriptPtr[2]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_hp_not_equal(void) -{ - u16 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) != gAIScriptPtr[2]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_status(void) -{ - u16 index; - u32 arg; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg = T1_READ_32(gAIScriptPtr + 2); - - if ((gBattleMons[index].status1 & arg) != 0) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_not_status(void) -{ - u16 index; - u32 arg; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg = T1_READ_32(gAIScriptPtr + 2); - - if ((gBattleMons[index].status1 & arg) == 0) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_status2(void) -{ - u16 index; - u32 arg; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg = T1_READ_32(gAIScriptPtr + 2); - - if ((gBattleMons[index].status2 & arg) != 0) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_not_status2(void) -{ - u16 index; - u32 arg; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg = T1_READ_32(gAIScriptPtr + 2); - - if ((gBattleMons[index].status2 & arg) == 0) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_status3(void) -{ - u16 index; - u32 arg; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg = T1_READ_32(gAIScriptPtr + 2); - - if ((gStatuses3[index] & arg) != 0) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_not_status3(void) -{ - u16 index; - u32 arg; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg = T1_READ_32(gAIScriptPtr + 2); - - if ((gStatuses3[index] & arg) == 0) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_status4(void) -{ - u16 index; - u32 arg1, arg2; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg1 = GetBattlerPosition(index) & 1; - arg2 = T1_READ_32(gAIScriptPtr + 2); - - if ((gSideAffecting[arg1] & arg2) != 0) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_not_status4(void) -{ - u16 index; - u32 arg1, arg2; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg1 = GetBattlerPosition(index) & 1; - arg2 = T1_READ_32(gAIScriptPtr + 2); - - if ((gSideAffecting[arg1] & arg2) == 0) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_less_than(void) -{ - if (AI_THINKING_STRUCT->funcResult < gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_more_than(void) -{ - if (AI_THINKING_STRUCT->funcResult > gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_equal(void) -{ - if (AI_THINKING_STRUCT->funcResult == gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_not_equal(void) -{ - if (AI_THINKING_STRUCT->funcResult != gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_less_than_32(void) -{ - u8 *temp = T1_READ_PTR(gAIScriptPtr + 1); - - if (AI_THINKING_STRUCT->funcResult < *temp) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); - else - gAIScriptPtr += 9; -} - -static void BattleAICmd_if_more_than_32(void) -{ - u8 *temp = T1_READ_PTR(gAIScriptPtr + 1); - - if (AI_THINKING_STRUCT->funcResult > *temp) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); - else - gAIScriptPtr += 9; -} - -static void BattleAICmd_if_equal_32(void) -{ - u8 *temp = T1_READ_PTR(gAIScriptPtr + 1); - - if (AI_THINKING_STRUCT->funcResult == *temp) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); - else - gAIScriptPtr += 9; -} - -static void BattleAICmd_if_not_equal_32(void) -{ - u8 *temp = T1_READ_PTR(gAIScriptPtr + 1); - - if (AI_THINKING_STRUCT->funcResult != *temp) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); - else - gAIScriptPtr += 9; -} - -static void BattleAICmd_if_move(void) -{ - u16 move = T1_READ_16(gAIScriptPtr + 1); - - if (AI_THINKING_STRUCT->moveConsidered == move) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_not_move(void) -{ - u16 move = T1_READ_16(gAIScriptPtr + 1); - - if (AI_THINKING_STRUCT->moveConsidered != move) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_in_bytes(void) -{ - u8 *ptr = T1_READ_PTR(gAIScriptPtr + 1); - - while (*ptr != 0xFF) - { - if (AI_THINKING_STRUCT->funcResult == *ptr) - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); - return; - } - ptr++; - } - gAIScriptPtr += 9; -} - -static void BattleAICmd_if_not_in_bytes(void) -{ - u8 *ptr = T1_READ_PTR(gAIScriptPtr + 1); - - while (*ptr != 0xFF) - { - if (AI_THINKING_STRUCT->funcResult == *ptr) - { - gAIScriptPtr += 9; - return; - } - ptr++; - } - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); -} - -static void BattleAICmd_if_in_words(void) -{ - u16 *ptr = (u16 *)T1_READ_PTR(gAIScriptPtr + 1); - - while (*ptr != 0xFFFF) - { - if (AI_THINKING_STRUCT->funcResult == *ptr) - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); - return; - } - ptr++; - } - gAIScriptPtr += 9; -} - -static void BattleAICmd_if_not_in_words(void) -{ - u16 *ptr = (u16 *)T1_READ_PTR(gAIScriptPtr + 1); - - while (*ptr != 0xFFFF) - { - if (AI_THINKING_STRUCT->funcResult == *ptr) - { - gAIScriptPtr += 9; - return; - } - ptr++; - } - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); -} - -static void BattleAICmd_if_user_can_damage(void) -{ - s32 i; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBankAttacker].moves[i] != 0 - && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power != 0) - break; - } - if (i == MAX_MON_MOVES) - gAIScriptPtr += 5; - else - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); -} - -static void BattleAICmd_if_user_cant_damage(void) -{ - s32 i; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBankAttacker].moves[i] != 0 - && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power != 0) - break; - } - if (i != MAX_MON_MOVES) - gAIScriptPtr += 5; - else - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); -} - -static void BattleAICmd_get_turn_count(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleResults.battleTurnCounter; - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_type(void) -{ - switch (gAIScriptPtr[1]) - { - case 1: // player primary type - AI_THINKING_STRUCT->funcResult = gBattleMons[gBankAttacker].type1; - break; - case 0: // enemy primary type - AI_THINKING_STRUCT->funcResult = gBattleMons[gBankTarget].type1; - break; - case 3: // player secondary type - AI_THINKING_STRUCT->funcResult = gBattleMons[gBankAttacker].type2; - break; - case 2: // enemy secondary type - AI_THINKING_STRUCT->funcResult = gBattleMons[gBankTarget].type2; - break; - case 4: // type of move being pointed to - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].type; - break; - } - gAIScriptPtr += 2; -} - -static void BattleAICmd_get_move_power(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power; - gAIScriptPtr += 1; -} - -#ifdef NONMATCHING -static void BattleAICmd_is_most_powerful_move(void) -{ - int i, j; - s32 damages[MAX_MON_MOVES]; - - for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i]) - break; - - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1 - && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) - { - gDynamicBasePower = 0; - eDynamicMoveType = 0; - eDmgMultiplier = 1; - gMoveResultFlags = 0; - gCritMultiplier = 1; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - for (j = 0; sDiscouragedPowerfulMoveEffects[j] != 0xFFFF; j++) - { // _08108276 - if (gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j]) - break; - } - - // _081082BA - if (gBattleMons[gBankAttacker].moves[i] - && sDiscouragedPowerfulMoveEffects[j] == 0xFFFF - && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power > 1) - { - gCurrentMove = gBattleMons[gBankAttacker].moves[i]; - AI_CalcDmg(gBankAttacker, gBankTarget); - TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); - damages[i] = (gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[i]) / 100; - - if (damages[i] == 0) // moves always do at least 1 damage. - damages[i] = 1; - } - else - { - damages[i] = 0; - } - } - - for (i = 0; i < MAX_MON_MOVES; i++) - if (damages[i] > damages[AI_THINKING_STRUCT->movesetIndex]) - break; - - if (i == MAX_MON_MOVES) - AI_THINKING_STRUCT->funcResult = 2; - else - AI_THINKING_STRUCT->funcResult = 1; - } - else - { - AI_THINKING_STRUCT->funcResult = 0; - } - - gAIScriptPtr += 1; -} -#else -NAKED -static void BattleAICmd_is_most_powerful_move(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - movs r3, 0\n\ - ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - ldrh r1, [r0]\n\ - ldr r4, _0810832C @ =0x0000ffff\n\ - ldr r6, _08108330 @ =gBattleMoves\n\ - ldr r5, _08108334 @ =gSharedMem + 0x16800\n\ - cmp r1, r4\n\ - beq _0810822E\n\ - ldrh r1, [r5, 0x2]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r2, [r0]\n\ - ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ -_0810821E:\n\ - ldrh r0, [r1]\n\ - cmp r2, r0\n\ - beq _0810822E\n\ - adds r1, 0x2\n\ - adds r3, 0x1\n\ - ldrh r0, [r1]\n\ - cmp r0, r4\n\ - bne _0810821E\n\ -_0810822E:\n\ - ldrh r0, [r5, 0x2]\n\ - lsls r1, r0, 1\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0x1\n\ - bhi _08108240\n\ - b _081083B2\n\ -_08108240:\n\ - lsls r0, r3, 1\n\ - ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - adds r0, r1\n\ - ldrh r3, [r0]\n\ - ldr r0, _0810832C @ =0x0000ffff\n\ - cmp r3, r0\n\ - beq _08108250\n\ - b _081083B2\n\ -_08108250:\n\ - ldr r0, _08108338 @ =gDynamicBasePower\n\ - movs r1, 0\n\ - strh r1, [r0]\n\ - ldr r2, _0810833C @ =0xfffff81c\n\ - adds r0, r5, r2\n\ - strb r1, [r0]\n\ - adds r2, 0x3\n\ - adds r0, r5, r2\n\ - movs r2, 0x1\n\ - strb r2, [r0]\n\ - ldr r0, _08108340 @ =gMoveResultFlags\n\ - strb r1, [r0]\n\ - ldr r0, _08108344 @ =gCritMultiplier\n\ - strb r2, [r0]\n\ - movs r6, 0\n\ - mov r9, r3\n\ - ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - ldrh r0, [r0]\n\ - str r0, [sp, 0x10]\n\ -_08108276:\n\ - movs r3, 0\n\ - ldr r5, _08108348 @ =gBattleMons\n\ - lsls r4, r6, 1\n\ - ldr r7, _0810834C @ =gBankAttacker\n\ - lsls r1, r6, 2\n\ - mov r8, r1\n\ - adds r2, r6, 0x1\n\ - mov r10, r2\n\ - ldr r0, [sp, 0x10]\n\ - cmp r0, r9\n\ - beq _081082BA\n\ - ldr r2, _08108330 @ =gBattleMoves\n\ - ldrb r1, [r7]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r4, r0\n\ - adds r1, r5, 0\n\ - adds r1, 0xC\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r2, [r0]\n\ - ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ -_081082AA:\n\ - ldrh r0, [r1]\n\ - cmp r2, r0\n\ - beq _081082BA\n\ - adds r1, 0x2\n\ - adds r3, 0x1\n\ - ldrh r0, [r1]\n\ - cmp r0, r9\n\ - bne _081082AA\n\ -_081082BA:\n\ - ldrb r1, [r7]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r4, r0\n\ - adds r1, r5, 0\n\ - adds r1, 0xC\n\ - adds r1, r0, r1\n\ - ldrh r0, [r1]\n\ - cmp r0, 0\n\ - beq _0810835C\n\ - lsls r0, r3, 1\n\ - ldr r2, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - cmp r0, r9\n\ - bne _0810835C\n\ - ldr r0, _08108330 @ =gBattleMoves\n\ - ldrh r2, [r1]\n\ - lsls r1, r2, 1\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0x1\n\ - bls _0810835C\n\ - ldr r5, _08108350 @ =gCurrentMove\n\ - strh r2, [r5]\n\ - ldrb r0, [r7]\n\ - ldr r4, _08108354 @ =gBankTarget\n\ - ldrb r1, [r4]\n\ - bl AI_CalcDmg\n\ - ldrh r0, [r5]\n\ - ldrb r1, [r7]\n\ - ldrb r2, [r4]\n\ - bl TypeCalc\n\ - mov r4, sp\n\ - add r4, r8\n\ - ldr r2, _08108358 @ =gBattleMoveDamage\n\ - ldr r0, _08108334 @ =gSharedMem + 0x16800\n\ - adds r0, 0x18\n\ - adds r0, r6, r0\n\ - ldrb r1, [r0]\n\ - ldr r0, [r2]\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - cmp r0, 0\n\ - bne _08108364\n\ - movs r0, 0x1\n\ - str r0, [r4]\n\ - b _08108364\n\ - .align 2, 0\n\ -_08108328: .4byte sDiscouragedPowerfulMoveEffects\n\ -_0810832C: .4byte 0x0000ffff\n\ -_08108330: .4byte gBattleMoves\n\ -_08108334: .4byte gSharedMem + 0x16800\n\ -_08108338: .4byte gDynamicBasePower\n\ -_0810833C: .4byte 0xfffff81c\n\ -_08108340: .4byte gMoveResultFlags\n\ -_08108344: .4byte gCritMultiplier\n\ -_08108348: .4byte gBattleMons\n\ -_0810834C: .4byte gBankAttacker\n\ -_08108350: .4byte gCurrentMove\n\ -_08108354: .4byte gBankTarget\n\ -_08108358: .4byte gBattleMoveDamage\n\ -_0810835C:\n\ - mov r1, sp\n\ - add r1, r8\n\ - movs r0, 0\n\ - str r0, [r1]\n\ -_08108364:\n\ - mov r6, r10\n\ - cmp r6, 0x3\n\ - ble _08108276\n\ - movs r6, 0\n\ - ldr r1, _081083A4 @ =gSharedMem + 0x16800\n\ - ldrb r0, [r1, 0x1]\n\ - lsls r0, 2\n\ - add r0, sp\n\ - ldr r2, [sp]\n\ - ldr r0, [r0]\n\ - adds r5, r1, 0\n\ - ldr r4, _081083A8 @ =gAIScriptPtr\n\ - cmp r2, r0\n\ - bgt _0810839A\n\ - adds r3, r5, 0\n\ - mov r2, sp\n\ -_08108384:\n\ - adds r2, 0x4\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - bgt _0810839A\n\ - ldrb r0, [r3, 0x1]\n\ - lsls r0, 2\n\ - add r0, sp\n\ - ldr r1, [r2]\n\ - ldr r0, [r0]\n\ - cmp r1, r0\n\ - ble _08108384\n\ -_0810839A:\n\ - cmp r6, 0x4\n\ - bne _081083AC\n\ - movs r0, 0x2\n\ - str r0, [r5, 0x8]\n\ - b _081083B8\n\ - .align 2, 0\n\ -_081083A4: .4byte gSharedMem + 0x16800\n\ -_081083A8: .4byte gAIScriptPtr\n\ -_081083AC:\n\ - movs r0, 0x1\n\ - str r0, [r5, 0x8]\n\ - b _081083B8\n\ -_081083B2:\n\ - movs r0, 0\n\ - str r0, [r5, 0x8]\n\ - ldr r4, _081083D0 @ =gAIScriptPtr\n\ -_081083B8:\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - str r0, [r4]\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_081083D0: .4byte gAIScriptPtr\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -static void BattleAICmd_get_move(void) -{ - if (gAIScriptPtr[1] == USER) - AI_THINKING_STRUCT->funcResult = gLastUsedMove[gBankAttacker]; - else - AI_THINKING_STRUCT->funcResult = gLastUsedMove[gBankTarget]; - - gAIScriptPtr += 2; -} - -static void BattleAICmd_if_arg_equal(void) -{ - if (gAIScriptPtr[1] == AI_THINKING_STRUCT->funcResult) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_arg_not_equal(void) -{ - if (gAIScriptPtr[1] != AI_THINKING_STRUCT->funcResult) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_would_go_first(void) -{ - if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, TRUE) == gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_would_not_go_first(void) -{ - if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, TRUE) != gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_nullsub_2A(void) -{ -} - -static void BattleAICmd_nullsub_2B(void) -{ -} - -static void BattleAICmd_count_alive_pokemon(void) -{ - struct Pokemon *party; - int i; - u8 index; - u8 var, var2; - - AI_THINKING_STRUCT->funcResult = 0; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if (GetBattlerSide(index) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - u32 status; - var = gBattlerPartyIndexes[index]; - status = GetBattlerPosition(index) ^ 2; - var2 = gBattlerPartyIndexes[GetBattlerAtPosition(status)]; - } - else - { - var = gBattlerPartyIndexes[index]; - var2 = gBattlerPartyIndexes[index]; - } - - for (i = 0; i < 6; i++) - { - if (i != var && i != var2 - && GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE - && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) - { - AI_THINKING_STRUCT->funcResult++; - } - } - - gAIScriptPtr += 2; -} - -static void BattleAICmd_get_considered_move(void) -{ - AI_THINKING_STRUCT->funcResult = AI_THINKING_STRUCT->moveConsidered; - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_considered_move_effect(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect; - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_ability(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if (GetBattlerSide(index) == TARGET) - { - u16 side = GetBattlerPosition(index) & 1; - - if (AI_BATTLE_HISTORY->abilities[side] != 0) - { - AI_THINKING_STRUCT->funcResult = AI_BATTLE_HISTORY->abilities[side]; - gAIScriptPtr += 2; - return; - } - - // abilities that prevent fleeing. - if (gBattleMons[index].ability == ABILITY_SHADOW_TAG - || gBattleMons[index].ability == ABILITY_MAGNET_PULL - || gBattleMons[index].ability == ABILITY_ARENA_TRAP) - { - AI_THINKING_STRUCT->funcResult = gBattleMons[index].ability; - gAIScriptPtr += 2; - return; - } - - if (gBaseStats[gBattleMons[index].species].ability1 != ABILITY_NONE) - { - if (gBaseStats[gBattleMons[index].species].ability2 != ABILITY_NONE) - { - // AI has no knowledge of opponent, so it guesses which ability. - if (Random() % 2) - { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1; - } - else - { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2; - } - } - else - { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1; // it's definitely ability 1. - } - } - else - { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability. - } - } - else - { - // The AI knows its own ability. - AI_THINKING_STRUCT->funcResult = gBattleMons[index].ability; - } - gAIScriptPtr += 2; -} - -static void BattleAICmd_get_highest_possible_damage(void) -{ - s32 i; - - gDynamicBasePower = 0; - gBattleStruct->dynamicMoveType = 0; - gBattleStruct->dmgMultiplier = 1; - gMoveResultFlags = 0; - gCritMultiplier = 1; - AI_THINKING_STRUCT->funcResult = 0; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - gBattleMoveDamage = 40; - gCurrentMove = gBattleMons[gBankAttacker].moves[i]; - - if (gCurrentMove) - { - TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); - - // reduce by 1/3. - if (gBattleMoveDamage == 120) - gBattleMoveDamage = 80; - if (gBattleMoveDamage == 240) - gBattleMoveDamage = 160; - if (gBattleMoveDamage == 30) - gBattleMoveDamage = 20; - if (gBattleMoveDamage == 15) - gBattleMoveDamage = 10; - - if (gMoveResultFlags & 8) // if it's a status move, it wont do anything. - gBattleMoveDamage = 0; - - if (AI_THINKING_STRUCT->funcResult < gBattleMoveDamage) - AI_THINKING_STRUCT->funcResult = gBattleMoveDamage; - } - } - gAIScriptPtr += 1; -} - -static void BattleAICmd_if_damage_bonus(void) -{ - u8 damageVar; - - gDynamicBasePower = 0; - gBattleStruct->dynamicMoveType = 0; - gBattleStruct->dmgMultiplier = 1; - gMoveResultFlags = 0; - gCritMultiplier = 1; - - gBattleMoveDamage = 40; - gCurrentMove = AI_THINKING_STRUCT->moveConsidered; - - TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); - - if (gBattleMoveDamage == 120) - gBattleMoveDamage = 80; - if (gBattleMoveDamage == 240) - gBattleMoveDamage = 160; - if (gBattleMoveDamage == 30) - gBattleMoveDamage = 20; - if (gBattleMoveDamage == 15) - gBattleMoveDamage = 10; - - if (gMoveResultFlags & 8) - gBattleMoveDamage = 0; - - // store gBattleMoveDamage in a u8 variable because gAIScriptPtr[1] is a u8. - damageVar = gBattleMoveDamage; - - if (damageVar == gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_nullsub_32(void) -{ -} - -static void BattleAICmd_nullsub_33(void) -{ -} - -static void BattleAICmd_if_status_in_party(void) -{ - struct Pokemon *party; - struct Pokemon *partyPtr; - int i; - u32 statusToCompareTo; - - // for whatever reason, game freak put the party pointer into 2 variables instead of 1. it's possible at some point the switch encompassed the whole function and used each respective variable creating largely duplicate code. - switch (gAIScriptPtr[1]) - { - case 1: - party = partyPtr = gEnemyParty; - break; - default: - party = partyPtr = gPlayerParty; - break; - } - - statusToCompareTo = T1_READ_32(gAIScriptPtr + 2); - - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES); - u16 hp = GetMonData(&party[i], MON_DATA_HP); - u32 status = GetMonData(&party[i], MON_DATA_STATUS); - - if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); // WHAT. why is this being merged into the above switch - return; - } - } - - gAIScriptPtr += 10; -} - -// bugged, doesnt return properly. also unused -static void BattleAICmd_if_status_not_in_party(void) -{ - struct Pokemon *party; - struct Pokemon *partyPtr; - int i; - u32 statusToCompareTo; - - switch (gAIScriptPtr[1]) - { - case 1: - party = partyPtr = gEnemyParty; - break; - default: - party = partyPtr = gPlayerParty; - break; - } - - statusToCompareTo = T1_READ_32(gAIScriptPtr + 2); - - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES); - u16 hp = GetMonData(&party[i], MON_DATA_HP); - u32 status = GetMonData(&party[i], MON_DATA_STATUS); - - // everytime the status is found, the AI's logic jumps further and further past its intended destination. this results in a broken AI macro and is probably why it is unused. - if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) - gAIScriptPtr += 10; // doesnt return? - } - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); -} - -static void BattleAICmd_get_weather(void) -{ - if (gBattleWeather & WEATHER_RAIN_ANY) - AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_RAIN; - if (gBattleWeather & WEATHER_SANDSTORM_ANY) - AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_SANDSTORM; - if (gBattleWeather & WEATHER_SUN_ANY) - AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_SUN; - if (gBattleWeather & WEATHER_HAIL) - AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_HAIL; - - gAIScriptPtr += 1; -} - -static void BattleAICmd_if_effect(void) -{ - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_not_effect(void) -{ - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect != gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_stat_level_less_than(void) -{ - u32 party; - - if (gAIScriptPtr[1] == USER) - party = gBankAttacker; - else - party = gBankTarget; - - if (gBattleMons[party].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - else - gAIScriptPtr += 8; -} - -static void BattleAICmd_if_stat_level_more_than(void) -{ - u32 party; - - if (gAIScriptPtr[1] == USER) - party = gBankAttacker; - else - party = gBankTarget; - - if (gBattleMons[party].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - else - gAIScriptPtr += 8; -} - -static void BattleAICmd_if_stat_level_equal(void) -{ - u32 party; - - if (gAIScriptPtr[1] == USER) - party = gBankAttacker; - else - party = gBankTarget; - - if (gBattleMons[party].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - else - gAIScriptPtr += 8; -} - -static void BattleAICmd_if_stat_level_not_equal(void) -{ - u32 party; - - if (gAIScriptPtr[1] == USER) - party = gBankAttacker; - else - party = gBankTarget; - - if (gBattleMons[party].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - else - gAIScriptPtr += 8; -} - -static void BattleAICmd_if_can_faint(void) -{ - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) - { - gAIScriptPtr += 5; - return; - } - - gDynamicBasePower = 0; - gBattleStruct->dynamicMoveType = 0; - gBattleStruct->dmgMultiplier = 1; - gMoveResultFlags = 0; - gCritMultiplier = 1; - gCurrentMove = AI_THINKING_STRUCT->moveConsidered; - AI_CalcDmg(gBankAttacker, gBankTarget); - TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); - - gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; - - // moves always do at least 1 damage. - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - - if (gBattleMons[gBankTarget].hp <= gBattleMoveDamage) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); - else - gAIScriptPtr += 5; -} - -static void BattleAICmd_if_cant_faint(void) -{ - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) - { - gAIScriptPtr += 5; - return; - } - - gDynamicBasePower = 0; - gBattleStruct->dynamicMoveType = 0; - gBattleStruct->dmgMultiplier = 1; - gMoveResultFlags = 0; - gCritMultiplier = 1; - gCurrentMove = AI_THINKING_STRUCT->moveConsidered; - AI_CalcDmg(gBankAttacker, gBankTarget); - TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); - - gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; - - // this macro is missing the damage 0 = 1 assumption. - - if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); - else - gAIScriptPtr += 5; -} - -static void BattleAICmd_if_has_move(void) -{ - int i; - u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2); - - switch (gAIScriptPtr[1]) - { - case 1: - case 3: - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBankAttacker].moves[i] == *temp_ptr) - break; - } - if (i == MAX_MON_MOVES) - gAIScriptPtr += 8; - else - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - break; - case 0: - case 2: - for (i = 0; i < 8; i++) - { - if (AI_BATTLE_HISTORY->usedMoves[gBankTarget >> 1][i] == *temp_ptr) - break; - } - if (i == 8) - gAIScriptPtr += 8; - else - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - break; - } -} - -static void BattleAICmd_if_dont_have_move(void) -{ - int i; - u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2); - - switch (gAIScriptPtr[1]) - { - case 1: - case 3: - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBankAttacker].moves[i] == *temp_ptr) - break; - } - if (i != MAX_MON_MOVES) - gAIScriptPtr += 8; - else - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - break; - case 0: - case 2: - for (i = 0; i < 8; i++) - { - if (AI_BATTLE_HISTORY->usedMoves[gBankTarget >> 1][i] == *temp_ptr) - break; - } - if (i != 8) - gAIScriptPtr += 8; - else - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - break; - } -} - -static void BattleAICmd_if_move_effect(void) -{ - int i; - - switch (gAIScriptPtr[1]) - { - case 1: - case 3: - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBankAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == gAIScriptPtr[2]) - break; - } - if (i != MAX_MON_MOVES) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; - break; - case 0: - case 2: - for (i = 0; i < 8; i++) - { - if (gBattleMons[gBankAttacker].moves[i] != 0 && gBattleMoves[AI_BATTLE_HISTORY->usedMoves[gBankTarget >> 1][i]].effect == gAIScriptPtr[2]) - break; - } - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - } -} - -static void BattleAICmd_if_not_move_effect(void) -{ - int i; - - switch (gAIScriptPtr[1]) - { - case 1: - case 3: - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBankAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == gAIScriptPtr[2]) - break; - } - if (i != MAX_MON_MOVES) - gAIScriptPtr += 7; - else - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - break; - case 0: - case 2: - for (i = 0; i < 8; i++) - { - if (AI_BATTLE_HISTORY->usedMoves[gBankTarget >> 1][i] != 0 && gBattleMoves[AI_BATTLE_HISTORY->usedMoves[gBankTarget >> 1][i]].effect == gAIScriptPtr[2]) - break; - } - gAIScriptPtr += 7; - } -} - -static void BattleAICmd_if_last_move_did_damage(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if (gAIScriptPtr[2] == 0) - { - if (gDisableStructs[index].disabledMove == 0) - { - gAIScriptPtr += 7; - return; - } - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - return; - } - else if (gAIScriptPtr[2] != 1) // ignore the macro if its not 0 or 1. - { - gAIScriptPtr += 7; - return; - } - else if (gDisableStructs[index].encoredMove != 0) - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - return; - } - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_encored(void) -{ - switch (gAIScriptPtr[1]) - { - case 0: // _08109348 - if (gDisableStructs[gActiveBattler].disabledMove == AI_THINKING_STRUCT->moveConsidered) - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; - case 1: // _08109370 - if (gDisableStructs[gActiveBattler].encoredMove == AI_THINKING_STRUCT->moveConsidered) - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; - default: - gAIScriptPtr += 6; - return; - } -} - -static void BattleAICmd_flee(void) -{ - AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_FLEE being enabled. -} - -static void BattleAICmd_if_random_100(void) -{ - u8 safariFleeRate = gBattleStruct->safariFleeRate * 5; // safari flee rate, from 0-20 - - if ((u8)(Random() % 100) < safariFleeRate) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); - else - gAIScriptPtr += 5; -} - -static void BattleAICmd_watch(void) -{ - AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_WATCH being enabled. -} - -static void BattleAICmd_get_hold_effect(void) -{ - u8 index; - u16 side; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if (GetBattlerSide(index) == 0) - { - side = (GetBattlerPosition(index) & 1); - AI_THINKING_STRUCT->funcResult = AI_BATTLE_HISTORY->itemEffects[side]; - } - else - AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[index].item); - - gAIScriptPtr += 2; -} - -static void BattleAICmd_get_gender(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[index].species, gBattleMons[index].personality); - - gAIScriptPtr += 2; -} - -static void BattleAICmd_is_first_turn(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - AI_THINKING_STRUCT->funcResult = gDisableStructs[index].isFirstTurn; - - gAIScriptPtr += 2; -} - -static void BattleAICmd_get_stockpile_count(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - AI_THINKING_STRUCT->funcResult = gDisableStructs[index].stockpileCounter; - - gAIScriptPtr += 2; -} - -static void BattleAICmd_is_double_battle(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleTypeFlags & BATTLE_TYPE_DOUBLE; - - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_used_item(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - AI_THINKING_STRUCT->funcResult = AI_ARRAY_160CC(index); - - gAIScriptPtr += 2; -} - -static void BattleAICmd_get_move_type_from_result(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].type; - - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_move_power_from_result(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].power; - - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_move_effect_from_result(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].effect; - - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_protect_count(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - AI_THINKING_STRUCT->funcResult = gDisableStructs[index].protectUses; - - gAIScriptPtr += 2; -} - -static void BattleAICmd_nullsub_52(void) -{ -} - -static void BattleAICmd_nullsub_53(void) -{ -} - -static void BattleAICmd_nullsub_54(void) -{ -} - -static void BattleAICmd_nullsub_55(void) -{ -} - -static void BattleAICmd_nullsub_56(void) -{ -} - -static void BattleAICmd_nullsub_57(void) -{ -} - -static void BattleAICmd_call(void) -{ - AIStackPushVar(gAIScriptPtr + 5); - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); -} - -static void BattleAICmd_jump(void) -{ - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); -} - -static void BattleAICmd_end(void) -{ - if (AIStackPop() == FALSE) - AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE; -} - -static void BattleAICmd_if_level_compare(void) -{ - switch (gAIScriptPtr[1]) - { - case 0: // greater than - if (gBattleMons[gBankAttacker].level > gBattleMons[gBankTarget].level) - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; - case 1: // less than - if (gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; - case 2: // equal - if (gBattleMons[gBankAttacker].level == gBattleMons[gBankTarget].level) - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; - } -} - -static void BattleAICmd_if_taunted(void) -{ - if (gDisableStructs[gBankTarget].tauntTimer1 != 0) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); - else - gAIScriptPtr += 5; -} - -static void BattleAICmd_if_not_taunted(void) -{ - if (gDisableStructs[gBankTarget].tauntTimer1 == 0) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); - else - gAIScriptPtr += 5; -} - -void AIStackPushVar(u8 *var) -{ - AI_STACK->ptr[AI_STACK->size++] = var; -} - -// unused -void AIStackPushAIPtr(void) -{ - AI_STACK->ptr[AI_STACK->size++] = gAIScriptPtr; -} - -bool8 AIStackPop(void) -{ - if (AI_STACK->size != 0) - { - --AI_STACK->size; - gAIScriptPtr = AI_STACK->ptr[AI_STACK->size]; - return TRUE; - } - else - return FALSE; -} diff --git a/src/battle/battle_ai_switch_items.c b/src/battle/battle_ai_switch_items.c deleted file mode 100644 index 2cf11b50e..000000000 --- a/src/battle/battle_ai_switch_items.c +++ /dev/null @@ -1,1007 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_ai_switch_items.h" -#include "battle_script_commands.h" -#include "data2.h" -#include "ewram.h" -#include "pokemon.h" -#include "random.h" -#include "rom_8077ABC.h" -#include "rom3.h" -#include "util.h" -#include "constants/abilities.h" -#include "constants/items.h" -#include "constants/moves.h" -#include "constants/species.h" - -extern u8 gUnknown_02023A14_50; - -extern u8 gActiveBattler; -extern u16 gBattleTypeFlags; -extern u8 gAbsentBattlerFlags; -extern s32 gBattleMoveDamage; -extern u8 gMoveResultFlags; -extern u16 gDynamicBasePower; -extern u8 gCritMultiplier; -extern u16 gBattlerPartyIndexes[]; -extern u16 gLastLandedMoves[]; -extern const u8 gTypeEffectiveness[]; -extern struct BattlePokemon gBattleMons[]; -extern u32 gStatuses3[MAX_BATTLERS_COUNT]; - -static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng); -static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent); -static bool8 ShouldUseItem(void); - - -static bool8 ShouldSwitchIfPerishSong(void) -{ - if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG - && gDisableStructs[gActiveBattler].perishSongTimer1 == 0) - { - ewram160C8arr(GetBattlerPosition(gActiveBattler)) = 6; // gBattleStruct->AI_monToSwitchIntoId[GetBattlerPosition(gActiveBattler)] = 6; - Emitcmd33(1, 2, 0); - return TRUE; - } - - return FALSE; -} - -#ifdef NONMATCHING -static bool8 ShouldSwitchIfWonderGuard(void) -{ - u8 opposingBattler; - u8 moveFlags; - s32 i, j; - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - return FALSE; - - if (gBattleMons[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)].ability != ABILITY_WONDER_GUARD) - return FALSE; - - // check if pokemon has a super effective move - opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - for (i = 0; i < 4; i++) - { - u16 move = gBattleMons[gActiveBattler].moves[i]; - if (move == MOVE_NONE) - continue; - - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) - return FALSE; - } - - // find a pokemon in the party that has a super effective move - for (i = 0; i < 6; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0 - || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE - || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG - || i == gBattlerPartyIndexes[gActiveBattler]) - continue; - - GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); // unused return value - GetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY); // unused return value - - opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - for (j = 0; j < 4; j++) - { - u16 move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); - if (move == MOVE_NONE) - continue; - - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && (Random() % 3) < 2) - { - // we found a mon - ewram160C8arr(GetBattlerPosition(gActiveBattler)) = i; // gBattleStruct->AI_monToSwitchIntoId[GetBattlerPosition(gActiveBattler)] = i; - Emitcmd33(1, B_ACTION_SWITCH, 0); - return TRUE; - } - } - } - - return FALSE; // at this point there is not a single pokemon in the party that has a super effective move against a pokemon with wonder guard -} -#else -NAKED -static bool8 ShouldSwitchIfWonderGuard(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - ldr r0, _0803606C @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080360A0\n\ - b _080361C8\n\ - .align 2, 0\n\ -_0803606C: .4byte gBattleTypeFlags\n\ -_08036070:\n\ - ldr r0, _08036094 @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - bl GetBattlerPosition\n\ - ldr r1, _08036098 @ =gSharedMem\n\ - lsls r0, 24\n\ - lsrs r0, 25\n\ - ldr r2, _0803609C @ =0x000160c8\n\ - adds r0, r2\n\ - adds r0, r1\n\ - strb r6, [r0]\n\ - movs r0, 0x1\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - bl Emitcmd33\n\ - movs r0, 0x1\n\ - b _080361CA\n\ - .align 2, 0\n\ -_08036094: .4byte gActiveBattler\n\ -_08036098: .4byte gSharedMem\n\ -_0803609C: .4byte 0x000160c8\n\ -_080360A0:\n\ - ldr r4, _080361D8 @ =gBattleMons\n\ - movs r0, 0\n\ - bl GetBattlerAtPosition\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - movs r1, 0x58\n\ - muls r0, r1\n\ - adds r0, r4\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x19\n\ - beq _080360BC\n\ - b _080361C8\n\ -_080360BC:\n\ - movs r0, 0\n\ - bl GetBattlerAtPosition\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - movs r6, 0\n\ - adds r7, r4, 0\n\ - movs r5, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r5\n\ - adds r4, r0, r7\n\ - movs r3, 0x20\n\ - adds r3, r4\n\ - mov r8, r3\n\ -_080360D8:\n\ - lsls r1, r6, 1\n\ - ldr r0, _080361DC @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - muls r0, r5\n\ - adds r1, r0\n\ - adds r0, r7, 0\n\ - adds r0, 0xC\n\ - adds r1, r0\n\ - ldrh r0, [r1]\n\ - cmp r0, 0\n\ - beq _08036104\n\ - ldrh r1, [r4]\n\ - mov r3, r8\n\ - ldrb r2, [r3]\n\ - bl AI_TypeCalc\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - movs r0, 0x2\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _080361C8\n\ -_08036104:\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - ble _080360D8\n\ - movs r6, 0\n\ - ldr r0, _080361E0 @ =gEnemyParty\n\ - mov r9, r0\n\ -_08036110:\n\ - movs r0, 0x64\n\ - adds r5, r6, 0\n\ - muls r5, r0\n\ - mov r2, r9\n\ - adds r4, r5, r2\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _080361C2\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _080361C2\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _080361C2\n\ - ldr r1, _080361E4 @ =gBattlerPartyIndexes\n\ - ldr r0, _080361DC @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - cmp r6, r0\n\ - beq _080361C2\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - adds r0, r4, 0\n\ - movs r1, 0x2E\n\ - bl GetMonData\n\ - movs r0, 0\n\ - bl GetBattlerAtPosition\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - movs r4, 0\n\ - mov r8, r5\n\ - ldr r1, _080361D8 @ =gBattleMons\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r5, r0, r1\n\ - adds r7, r5, 0\n\ - adds r7, 0x20\n\ -_0803617C:\n\ - adds r1, r4, 0\n\ - adds r1, 0xD\n\ - mov r0, r8\n\ - add r0, r9\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0\n\ - beq _080361BC\n\ - ldrh r1, [r5]\n\ - ldrb r2, [r7]\n\ - bl AI_TypeCalc\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - movs r0, 0x2\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _080361BC\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x1\n\ - bhi _080361BC\n\ - b _08036070\n\ -_080361BC:\n\ - adds r4, 0x1\n\ - cmp r4, 0x3\n\ - ble _0803617C\n\ -_080361C2:\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08036110\n\ -_080361C8:\n\ - movs r0, 0\n\ -_080361CA:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080361D8: .4byte gBattleMons\n\ -_080361DC: .4byte gActiveBattler\n\ -_080361E0: .4byte gEnemyParty\n\ -_080361E4: .4byte gBattlerPartyIndexes\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -static bool8 FindMonThatAbsorbsOpponentsMove(void) -{ - u8 battlerIn1, battlerIn2; - u8 absorbingTypeAbility; - s32 i; - - if (HasSuperEffectiveMoveAgainstOpponents(TRUE) && Random() % 3 != 0) - return FALSE; - if (gLastLandedMoves[gActiveBattler] == 0) - return FALSE; - if (gLastLandedMoves[gActiveBattler] == 0xFFFF) - return FALSE; - if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0) - return FALSE; - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - battlerIn1 = gActiveBattler; - if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))]) - battlerIn2 = gActiveBattler; - else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))); - } - else - { - battlerIn1 = gActiveBattler; - battlerIn2 = gActiveBattler; - } - - if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_FIRE) - absorbingTypeAbility = ABILITY_FLASH_FIRE; - else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_WATER) - absorbingTypeAbility = ABILITY_WATER_ABSORB; - else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_ELECTRIC) - absorbingTypeAbility = ABILITY_VOLT_ABSORB; - else - return FALSE; - - if (gBattleMons[gActiveBattler].ability == absorbingTypeAbility) - return FALSE; - - for (i = 0; i < 6; i++) - { - u16 species; - u8 monAbility; - - if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) - continue; - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE) - continue; - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - continue; - if (i == gBattlerPartyIndexes[battlerIn1]) - continue; - if (i == gBattlerPartyIndexes[battlerIn2]) - continue; - if (i == ewram16068arr(battlerIn1)) - continue; - if (i == ewram16068arr(battlerIn2)) - continue; - - species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); - if (GetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY) != 0) - monAbility = gBaseStats[species].ability2; - else - monAbility = gBaseStats[species].ability1; - - if (absorbingTypeAbility == monAbility && Random() & 1) - { - // we found a mon - ewram160C8arr(GetBattlerPosition(gActiveBattler)) = i; - Emitcmd33(1, B_ACTION_SWITCH, 0); - return TRUE; - } - } - - return FALSE; -} - -static bool8 ShouldSwitchIfNaturalCure(void) -{ - if (!(gBattleMons[gActiveBattler].status1 & STATUS_SLEEP)) - return FALSE; - if (gBattleMons[gActiveBattler].ability != ABILITY_NATURAL_CURE) - return FALSE; - if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 2) - return FALSE; - - if ((gLastLandedMoves[gActiveBattler] == 0 || gLastLandedMoves[gActiveBattler] == 0xFFFF) && Random() & 1) - { - ewram160C8arr(GetBattlerPosition(gActiveBattler)) = 6; - Emitcmd33(1, B_ACTION_SWITCH, 0); - return TRUE; - } - else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0 && Random() & 1) - { - ewram160C8arr(GetBattlerPosition(gActiveBattler)) = 6; - Emitcmd33(1, B_ACTION_SWITCH, 0); - return TRUE; - } - - if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 1)) - return TRUE; - if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 1)) - return TRUE; - if (Random() & 1) - { - ewram160C8arr(GetBattlerPosition(gActiveBattler)) = 6; - Emitcmd33(1, B_ACTION_SWITCH, 0); - return TRUE; - } - - return FALSE; -} - -static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) -{ - u8 opposingBattler; - s32 i; - u8 moveFlags; - u16 move; - - opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - if (!(gAbsentBattlerFlags & gBitTable[opposingBattler])) - { - for (i = 0; i < 4; i++) - { - move = gBattleMons[gActiveBattler].moves[i]; - if (move == MOVE_NONE) - continue; - - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) - { - if (noRng) - return TRUE; - if (Random() % 10 != 0) - return TRUE; - } - } - } - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - return FALSE; - - opposingBattler = GetBattlerAtPosition(BATTLE_PARTNER(B_POSITION_PLAYER_LEFT)); - if (!(gAbsentBattlerFlags & gBitTable[opposingBattler])) - { - for (i = 0; i < 4; i++) - { - move = gBattleMons[gActiveBattler].moves[i]; - if (move == MOVE_NONE) - continue; - - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) - { - if (noRng) - return TRUE; - if (Random() % 10 != 0) - return TRUE; - } - } - } - - return FALSE; -} - -static bool8 AreStatsRaised(void) -{ - u8 buffedStatsValue = 0; - s32 i; - - for (i = 0; i < BATTLE_STATS_NO; i++) - { - if (gBattleMons[gActiveBattler].statStages[i] > 6) - buffedStatsValue += gBattleMons[gActiveBattler].statStages[i] - 6; - } - - return (buffedStatsValue > 3); -} - -static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) -{ - u8 battlerIn1, battlerIn2; - s32 i, j; - u16 move; - u8 moveFlags; - - if (gLastLandedMoves[gActiveBattler] == 0) - return FALSE; - if (gLastLandedMoves[gActiveBattler] == 0xFFFF) - return FALSE; - if (gLastHitBy[gActiveBattler] == 0xFF) - return FALSE; - if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0) - return FALSE; - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - battlerIn1 = gActiveBattler; - if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))]) - battlerIn2 = gActiveBattler; - else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))); - } - else - { - battlerIn1 = gActiveBattler; - battlerIn2 = gActiveBattler; - } - - for (i = 0; i < 6; i++) - { - u16 species; - u8 monAbility; - - if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) - continue; - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE) - continue; - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - continue; - if (i == gBattlerPartyIndexes[battlerIn1]) - continue; - if (i == gBattlerPartyIndexes[battlerIn2]) - continue; - if (i == ewram16068arr(battlerIn1)) - continue; - if (i == ewram16068arr(battlerIn2)) - continue; - - species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); - if (GetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY) != 0) - monAbility = gBaseStats[species].ability2; - else - monAbility = gBaseStats[species].ability1; - - moveFlags = AI_TypeCalc(gLastLandedMoves[gActiveBattler], species, monAbility); - if (moveFlags & flags) - { - battlerIn1 = gLastHitBy[gActiveBattler]; - - for (j = 0; j < 4; j++) - { - move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); - if (move == 0) - continue; - - moveFlags = AI_TypeCalc(move, gBattleMons[battlerIn1].species, gBattleMons[battlerIn1].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0) - { - ewram160C8arr(GetBattlerPosition(gActiveBattler)) = i; - Emitcmd33(1, B_ACTION_SWITCH, 0); - return TRUE; - } - } - } - } - - return FALSE; -} - -static bool8 ShouldSwitch(void) -{ - u8 battlerIn1, battlerIn2; - s32 i; - s32 availableToSwitch; - - if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) - return FALSE; - if (gStatuses3[gActiveBattler] & STATUS3_ROOTED) - return FALSE; - if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_SHADOW_TAG, 0, 0)) - return FALSE; - if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_ARENA_TRAP, 0, 0)) - return FALSE; // misses the flying or levitate check - if (AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MAGNET_PULL, 0, 0)) - { - if (gBattleMons[gActiveBattler].type1 == TYPE_STEEL) - return FALSE; - if (gBattleMons[gActiveBattler].type2 == TYPE_STEEL) - return FALSE; - } - - availableToSwitch = 0; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - battlerIn1 = gActiveBattler; - if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) - battlerIn2 = gActiveBattler; - else - battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK); - } - else - { - battlerIn1 = gActiveBattler; - battlerIn2 = gActiveBattler; - } - - for (i = 0; i < 6; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) - continue; - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE) - continue; - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - continue; - if (i == gBattlerPartyIndexes[battlerIn1]) - continue; - if (i == gBattlerPartyIndexes[battlerIn2]) - continue; - if (i == ewram16068arr(battlerIn1)) - continue; - if (i == ewram16068arr(battlerIn2)) - continue; - - availableToSwitch++; - } - - if (availableToSwitch == 0) - return FALSE; - if (ShouldSwitchIfPerishSong()) - return TRUE; - if (ShouldSwitchIfWonderGuard()) - return TRUE; - if (FindMonThatAbsorbsOpponentsMove()) - return TRUE; - if (ShouldSwitchIfNaturalCure()) - return TRUE; - if (HasSuperEffectiveMoveAgainstOpponents(FALSE)) - return FALSE; - if (AreStatsRaised()) - return FALSE; - if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 2) - || FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 3)) - return TRUE; - - return FALSE; -} - -void AI_TrySwitchOrUseItem(void) -{ - u8 battlerIn1, battlerIn2; - - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - if (ShouldSwitch()) - { - if (ewram160C8arr(GetBattlerPosition(gActiveBattler)) == 6) - { - s32 monToSwitchId = GetMostSuitableMonToSwitchInto(); - if (monToSwitchId == 6) - { - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - battlerIn2 = battlerIn1; - } - else - { - battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); - } - - for (monToSwitchId = 0; monToSwitchId < 6; monToSwitchId++) - { - if (GetMonData(&gEnemyParty[monToSwitchId], MON_DATA_HP) == 0) - continue; - if (monToSwitchId == gBattlerPartyIndexes[battlerIn1]) - continue; - if (monToSwitchId == gBattlerPartyIndexes[battlerIn2]) - continue; - if (monToSwitchId == ewram16068arr(battlerIn1)) - continue; - if (monToSwitchId == ewram16068arr(battlerIn2)) - continue; - - break; - } - } - - ewram160C8arr(GetBattlerPosition(gActiveBattler)) = monToSwitchId; - } - - ewram16068arr(gActiveBattler) = ewram160C8arr(GetBattlerPosition(gActiveBattler)); - return; - } - else - { - #if DEBUG - if (!(gUnknown_02023A14_50 & 0x20) && ShouldUseItem()) - return; - #else - if (ShouldUseItem()) - return; - #endif - } - } - - Emitcmd33(1, B_ACTION_USE_MOVE, (gActiveBattler ^ BIT_SIDE) << 8); -} - -static void ModulateByTypeEffectiveness(u8 attackType, u8 defenseType1, u8 defenseType2, u8 *var) -{ - s32 i = 0; - - while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) - { - if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) - { - i += 3; - continue; - } - else if (TYPE_EFFECT_ATK_TYPE(i) == attackType) - { - // check type1 - if (TYPE_EFFECT_DEF_TYPE(i) == defenseType1) - *var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10; - // check type2 - if (TYPE_EFFECT_DEF_TYPE(i) == defenseType2 && defenseType1 != defenseType2) - *var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10; - } - i += 3; - } -} - -u8 GetMostSuitableMonToSwitchInto(void) -{ - u8 opposingBattler; - u8 bestDmg; // note : should be changed to s32 - u8 bestMonId; - u8 battlerIn1, battlerIn2; - s32 i, j; - u8 invalidMons; - u16 move; - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - battlerIn1 = gActiveBattler; - if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) - battlerIn2 = gActiveBattler; - else - battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK); - - // UB: It considers the opponent only player's side even though it can battle alongside player; - opposingBattler = Random() & BIT_FLANK; - if (gAbsentBattlerFlags & gBitTable[opposingBattler]) - opposingBattler ^= BIT_FLANK; - } - else - { - opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - battlerIn1 = gActiveBattler; - battlerIn2 = gActiveBattler; - } - - invalidMons = 0; - - while (invalidMons != 0x3F) // all mons are invalid - { - bestDmg = 0; - bestMonId = 6; - // find the mon which type is the most suitable offensively - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); - if (species != SPECIES_NONE - && GetMonData(&gEnemyParty[i], MON_DATA_HP) != 0 - && !(gBitTable[i] & invalidMons) - && gBattlerPartyIndexes[battlerIn1] != i - && gBattlerPartyIndexes[battlerIn2] != i - && i != ewram16068arr(battlerIn1) - && i != ewram16068arr(battlerIn2)) - { - u8 type1 = gBaseStats[species].type1; - u8 type2 = gBaseStats[species].type2; - u8 typeDmg = 10; - ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type1, type1, type2, &typeDmg); - ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type2, type1, type2, &typeDmg); - if (bestDmg < typeDmg) - { - bestDmg = typeDmg; - bestMonId = i; - } - } - else - { - invalidMons |= gBitTable[i]; - } - } - - // ok, we know the mon has the right typing but does it have at least one super effective move? - if (bestMonId != 6) - { - for (i = 0; i < 4; i++) - { - move = GetMonData(&gEnemyParty[bestMonId], MON_DATA_MOVE1 + i); - if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBattler) & MOVE_RESULT_SUPER_EFFECTIVE) - break; - } - - if (i != 4) - return bestMonId; // has both the typing and at least one super effective move - - invalidMons |= gBitTable[bestMonId]; // sorry buddy, we want something better - } - else - { - invalidMons = 0x3F; // no viable mon to switch - } - } - - gDynamicBasePower = 0; - gBattleStruct->dynamicMoveType = 0; - gBattleStruct->dmgMultiplier = 1; - gMoveResultFlags = 0; - gCritMultiplier = 1; - bestDmg = 0; - bestMonId = 6; - - // if we couldn't find the best mon in terms of typing, find the one that deals most damage - for (i = 0; i < 6; i++) - { - if ((u16)(GetMonData(&gEnemyParty[i], MON_DATA_SPECIES)) == SPECIES_NONE) - continue; - if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) - continue; - if (gBattlerPartyIndexes[battlerIn1] == i) - continue; - if (gBattlerPartyIndexes[battlerIn2] == i) - continue; - if (i == ewram16068arr(battlerIn1)) - continue; - if (i == ewram16068arr(battlerIn2)) - continue; - - for (j = 0; j < 4; j++) - { - move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); - gBattleMoveDamage = 0; - if (move != MOVE_NONE && gBattleMoves[move].power != 1) - { - AI_CalcDmg(gActiveBattler, opposingBattler); - TypeCalc(move, gActiveBattler, opposingBattler); - } - if (bestDmg < gBattleMoveDamage) - { - bestDmg = gBattleMoveDamage; - bestMonId = i; - } - } - } - - return bestMonId; -} - -// TODO: use PokemonItemEffect struct instead of u8 once it's documented -static u8 GetAI_ItemType(u8 itemId, const u8 *itemEffect) // NOTE: should take u16 as item Id argument -{ - if (itemId == ITEM_FULL_RESTORE) - return AI_ITEM_FULL_RESTORE; - if (itemEffect[4] & 4) - return AI_ITEM_HEAL_HP; - if (itemEffect[3] & 0x3F) - return AI_ITEM_CURE_CONDITION; - if (itemEffect[0] & 0x3F || itemEffect[1] != 0 || itemEffect[2] != 0) - return AI_ITEM_X_STAT; - if (itemEffect[3] & 0x80) - return AI_ITEM_GUARD_SPECS; - - return AI_ITEM_NOT_RECOGNIZABLE; -} - -static bool8 ShouldUseItem(void) -{ - s32 i; - u8 validMons = 0; - bool8 shouldUse = FALSE; - - for (i = 0; i < 6; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_HP) != 0 - && GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) != SPECIES_NONE - && GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) != SPECIES_EGG) - { - validMons++; - } - } - - for (i = 0; i < 4; i++) - { - u16 item; - const u8 *itemEffects; - u8 paramOffset; - u8 battlerSide; - - if (i != 0 && validMons > (AI_BATTLE_HISTORY->numItems - i) + 1) - continue; - item = AI_BATTLE_HISTORY->trainerItems[i]; - if (item == ITEM_NONE) - continue; - if (gItemEffectTable[item - 13] == NULL) - continue; - - if (item == ITEM_ENIGMA_BERRY) - itemEffects = gSaveBlock1.enigmaBerry.itemEffect; - else - itemEffects = gItemEffectTable[item - 13]; - - ewram160D8(gActiveBattler) = GetAI_ItemType(item, itemEffects); - - switch (ewram160D8(gActiveBattler)) - { - case AI_ITEM_FULL_RESTORE: - if (gBattleMons[gActiveBattler].hp >= gBattleMons[gActiveBattler].maxHP / 4) - break; - if (gBattleMons[gActiveBattler].hp == 0) - break; - shouldUse = TRUE; - break; - case AI_ITEM_HEAL_HP: - paramOffset = GetItemEffectParamOffset(item, 4, 4); - if (paramOffset == 0) - break; - if (gBattleMons[gActiveBattler].hp == 0) - break; - if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 4 || gBattleMons[gActiveBattler].maxHP - gBattleMons[gActiveBattler].hp > itemEffects[paramOffset]) - shouldUse = TRUE; - break; - case AI_ITEM_CURE_CONDITION: - ewram160DA(gActiveBattler) = 0; - if (itemEffects[3] & 0x20 && gBattleMons[gActiveBattler].status1 & STATUS_SLEEP) - { - ewram160DA(gActiveBattler) |= 0x20; - shouldUse = TRUE; - } - if (itemEffects[3] & 0x10 && (gBattleMons[gActiveBattler].status1 & STATUS_POISON || gBattleMons[gActiveBattler].status1 & STATUS_TOXIC_POISON)) - { - ewram160DA(gActiveBattler) |= 0x10; - shouldUse = TRUE; - } - if (itemEffects[3] & 0x8 && gBattleMons[gActiveBattler].status1 & STATUS_BURN) - { - ewram160DA(gActiveBattler) |= 0x8; - shouldUse = TRUE; - } - if (itemEffects[3] & 0x4 && gBattleMons[gActiveBattler].status1 & STATUS_FREEZE) - { - ewram160DA(gActiveBattler) |= 0x4; - shouldUse = TRUE; - } - if (itemEffects[3] & 0x2 && gBattleMons[gActiveBattler].status1 & STATUS_PARALYSIS) - { - ewram160DA(gActiveBattler) |= 0x2; - shouldUse = TRUE; - } - if (itemEffects[3] & 0x1 && gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION) - { - ewram160DA(gActiveBattler) |= 0x1; - shouldUse = TRUE; - } - break; - case AI_ITEM_X_STAT: - ewram160DA(gActiveBattler) = 0; - if (gDisableStructs[gActiveBattler].isFirstTurn == 0) - break; - if (itemEffects[0] & 0xF) - ewram160DA(gActiveBattler) |= 0x1; - if (itemEffects[1] & 0xF0) - ewram160DA(gActiveBattler) |= 0x2; - if (itemEffects[1] & 0xF) - ewram160DA(gActiveBattler) |= 0x4; - if (itemEffects[2] & 0xF) - ewram160DA(gActiveBattler) |= 0x8; - if (itemEffects[2] & 0xF0) - ewram160DA(gActiveBattler) |= 0x20; - if (itemEffects[0] & 0x30) - ewram160DA(gActiveBattler) |= 0x80; - shouldUse = TRUE; - break; - case AI_ITEM_GUARD_SPECS: - battlerSide = GetBattlerSide(gActiveBattler); - if (gDisableStructs[gActiveBattler].isFirstTurn != 0 && gSideTimers[battlerSide].mistTimer == 0) - shouldUse = TRUE; - break; - case AI_ITEM_NOT_RECOGNIZABLE: - return FALSE; - } - - if (shouldUse) - { - Emitcmd33(1, B_ACTION_USE_ITEM, 0); - ewram160D4(gActiveBattler) = item; - AI_BATTLE_HISTORY->trainerItems[i] = 0; - return shouldUse; - } - } - - return FALSE; -} diff --git a/src/battle/battle_anim.c b/src/battle/battle_anim.c deleted file mode 100644 index 287d80ab1..000000000 --- a/src/battle/battle_anim.c +++ /dev/null @@ -1,3236 +0,0 @@ -#include "global.h" -#include "battle_anim.h" -#include "battle.h" -#include "battle_anim_80CA710.h" -#include "battle_interface.h" -#include "contest.h" -#include "decompress.h" -#include "m4a.h" -#include "main.h" -#include "palette.h" -#include "rom_8077ABC.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "ewram.h" -#include "graphics.h" -#include "constants/battle_anim.h" -#include "constants/songs.h" - -const struct OamData gOamData_837DF24 = -{ - .affineMode = 0, - .objMode = 0, - .shape = 0, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837DF2C = -{ - .affineMode = 0, - .objMode = 0, - .shape = 0, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837DF34 = -{ - .affineMode = 0, - .objMode = 0, - .shape = 0, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837DF3C = -{ - .affineMode = 0, - .objMode = 0, - .shape = 0, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837DF44 = -{ - .affineMode = 0, - .objMode = 0, - .shape = 1, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837DF4C = -{ - .affineMode = 0, - .objMode = 0, - .shape = 1, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837DF54 = -{ - .affineMode = 0, - .objMode = 0, - .shape = 1, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837DF5C = -{ - .affineMode = 0, - .objMode = 0, - .shape = 1, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837DF64 = -{ - .affineMode = 0, - .objMode = 0, - .shape = 2, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837DF6C = -{ - .affineMode = 0, - .objMode = 0, - .shape = 2, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837DF74 = -{ - .affineMode = 0, - .objMode = 0, - .shape = 2, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837DF7C = -{ - .affineMode = 0, - .objMode = 0, - .shape = 2, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837DF84 = -{ - .affineMode = 1, - .objMode = 0, - .shape = 0, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837DF8C = -{ - .affineMode = 1, - .objMode = 0, - .shape = 0, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837DF94 = -{ - .affineMode = 1, - .objMode = 0, - .shape = 0, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837DF9C = -{ - .affineMode = 1, - .objMode = 0, - .shape = 0, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837DFA4 = -{ - .affineMode = 1, - .objMode = 0, - .shape = 1, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837DFAC = -{ - .affineMode = 1, - .objMode = 0, - .shape = 1, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837DFB4 = -{ - .affineMode = 1, - .objMode = 0, - .shape = 1, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837DFBC = -{ - .affineMode = 1, - .objMode = 0, - .shape = 1, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837DFC4 = -{ - .affineMode = 1, - .objMode = 0, - .shape = 2, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837DFCC = -{ - .affineMode = 1, - .objMode = 0, - .shape = 2, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837DFD4 = -{ - .affineMode = 1, - .objMode = 0, - .shape = 2, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837DFDC = -{ - .affineMode = 1, - .objMode = 0, - .shape = 2, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837DFE4 = -{ - .affineMode = 3, - .objMode = 0, - .shape = 0, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837DFEC = -{ - .affineMode = 3, - .objMode = 0, - .shape = 0, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837DFF4 = -{ - .affineMode = 3, - .objMode = 0, - .shape = 0, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837DFFC = -{ - .affineMode = 3, - .objMode = 0, - .shape = 0, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837D004 = -{ - .affineMode = 3, - .objMode = 0, - .shape = 1, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837D00C = -{ - .affineMode = 3, - .objMode = 0, - .shape = 1, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837E014 = -{ - .affineMode = 3, - .objMode = 0, - .shape = 1, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837E01C = -{ - .affineMode = 3, - .objMode = 0, - .shape = 1, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837E024 = -{ - .affineMode = 3, - .objMode = 0, - .shape = 2, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837E02C = -{ - .affineMode = 3, - .objMode = 0, - .shape = 2, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837E034 = -{ - .affineMode = 3, - .objMode = 0, - .shape = 2, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837E03C = -{ - .affineMode = 3, - .objMode = 0, - .shape = 2, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837E044 = -{ - .affineMode = 0, - .objMode = 1, - .shape = 0, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837E04C = -{ - .affineMode = 0, - .objMode = 1, - .shape = 0, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837E054 = -{ - .affineMode = 0, - .objMode = 1, - .shape = 0, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837E05C = -{ - .affineMode = 0, - .objMode = 1, - .shape = 0, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837E064 = -{ - .affineMode = 0, - .objMode = 1, - .shape = 1, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837E06C = -{ - .affineMode = 0, - .objMode = 1, - .shape = 1, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837E074 = -{ - .affineMode = 0, - .objMode = 1, - .shape = 1, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837E07C = -{ - .affineMode = 0, - .objMode = 1, - .shape = 1, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837E084 = -{ - .affineMode = 0, - .objMode = 1, - .shape = 2, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837E08C = -{ - .affineMode = 0, - .objMode = 1, - .shape = 2, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837E094 = -{ - .affineMode = 0, - .objMode = 1, - .shape = 2, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837E09C = -{ - .affineMode = 0, - .objMode = 1, - .shape = 2, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837E0A4 = -{ - .affineMode = 1, - .objMode = 1, - .shape = 0, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837E0AC = -{ - .affineMode = 1, - .objMode = 1, - .shape = 0, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837E0B4 = -{ - .affineMode = 1, - .objMode = 1, - .shape = 0, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837E0BC = -{ - .affineMode = 1, - .objMode = 1, - .shape = 0, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837E0C4 = -{ - .affineMode = 1, - .objMode = 1, - .shape = 1, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837E0CC = -{ - .affineMode = 1, - .objMode = 1, - .shape = 1, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837E0D4 = -{ - .affineMode = 1, - .objMode = 1, - .shape = 1, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837E0DC = -{ - .affineMode = 1, - .objMode = 1, - .shape = 1, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837E0E4 = -{ - .affineMode = 1, - .objMode = 1, - .shape = 2, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837E0EC = -{ - .affineMode = 1, - .objMode = 1, - .shape = 2, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837E0F4 = -{ - .affineMode = 1, - .objMode = 1, - .shape = 2, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837E0FC = -{ - .affineMode = 1, - .objMode = 1, - .shape = 2, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837E104 = -{ - .affineMode = 3, - .objMode = 1, - .shape = 0, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837E10C = -{ - .affineMode = 3, - .objMode = 1, - .shape = 0, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837E114 = -{ - .affineMode = 3, - .objMode = 1, - .shape = 0, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837E11C = -{ - .affineMode = 3, - .objMode = 1, - .shape = 0, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837E124 = -{ - .affineMode = 3, - .objMode = 1, - .shape = 1, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837E12C = -{ - .affineMode = 3, - .objMode = 1, - .shape = 1, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837E134 = -{ - .affineMode = 3, - .objMode = 1, - .shape = 1, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837E13C = -{ - .affineMode = 3, - .objMode = 1, - .shape = 1, - .size = 3, - .priority = 2, -}; - -const struct OamData gOamData_837E144 = -{ - .affineMode = 3, - .objMode = 1, - .shape = 2, - .size = 0, - .priority = 2, -}; - -const struct OamData gOamData_837E14C = -{ - .affineMode = 3, - .objMode = 1, - .shape = 2, - .size = 1, - .priority = 2, -}; - -const struct OamData gOamData_837E154 = -{ - .affineMode = 3, - .objMode = 1, - .shape = 2, - .size = 2, - .priority = 2, -}; - -const struct OamData gOamData_837E15C = -{ - .affineMode = 3, - .objMode = 1, - .shape = 2, - .size = 3, - .priority = 2, -}; - -const struct CompressedSpriteSheet gBattleAnimPicTable[] = -{ - { gBattleAnimSpriteSheet_000, 0x200, ANIM_TAG_BONE }, - { gBattleAnimSpriteSheet_001, 0x300, ANIM_TAG_SPARK }, - { gBattleAnimSpriteSheet_002, 0x200, ANIM_TAG_PENCIL }, - { gBattleAnimSpriteSheet_003, 0x100, ANIM_TAG_AIR_WAVE }, - { gBattleAnimSpriteSheet_004, 0x200, ANIM_TAG_UNUSED_ORB }, - { gBattleAnimSpriteSheet_005, 0x400, ANIM_TAG_SWORD }, - { gBattleAnimSpriteSheet_006, 0x180, ANIM_TAG_SEED }, - { gBattleAnimSpriteSheet_007, 0x800, ANIM_TAG_UNUSED_EXPLOSION }, - { gBattleAnimSpriteSheet_008, 0x20, ANIM_TAG_UNUSED_PINK_ORB }, - { gBattleAnimSpriteSheet_009, 0x400, ANIM_TAG_GUST }, - { gBattleAnimSpriteSheet_010, 0x1200, ANIM_TAG_ICE_CUBE }, - { gBattleAnimSpriteSheet_011, 0x180, ANIM_TAG_SPARK_2 }, - { gBattleAnimSpriteSheet_012, 0x80, ANIM_TAG_UNUSED_ORANGE }, - { gBattleAnimSpriteSheet_013, 0x80, ANIM_TAG_YELLOW_BALL }, - { gBattleAnimSpriteSheet_014, 0x280, ANIM_TAG_LOCK_ON }, - { gBattleAnimSpriteSheet_015, 0x80, ANIM_TAG_TIED_BAG }, - { gBattleAnimSpriteSheet_016, 0x100, ANIM_TAG_BLACK_SMOKE }, - { gBattleAnimSpriteSheet_017, 0x20, ANIM_TAG_BLACK_BALL }, - { gBattleAnimSpriteSheet_018, 0x80, ANIM_TAG_CONVERSION }, - { gBattleAnimSpriteSheet_019, 0x400, ANIM_TAG_UNUSED_GLASS }, - { gBattleAnimSpriteSheet_020, 0x200, ANIM_TAG_HORN_HIT }, - { gBattleAnimSpriteSheet_021, 0xA00, ANIM_TAG_UNUSED_HIT }, - { gBattleAnimSpriteSheet_021, 0xA00, ANIM_TAG_UNUSED_HIT_2 }, - { gBattleAnimSpriteSheet_023, 0x380, ANIM_TAG_UNUSED_BLUE_SHARDS }, - { gBattleAnimSpriteSheet_024, 0x300, ANIM_TAG_UNUSED_CLOSING_EYE }, - { gBattleAnimSpriteSheet_025, 0xA00, ANIM_TAG_UNUSED_WAVING_HAND }, - { gBattleAnimSpriteSheet_026, 0xA00, ANIM_TAG_UNUSED_HIT_DUPLICATE }, - { gBattleAnimSpriteSheet_027, 0xA00, ANIM_TAG_LEER }, - { gBattleAnimSpriteSheet_028, 0xA00, ANIM_TAG_UNUSED_BLUE_BURST }, - { gBattleAnimSpriteSheet_029, 0xA00, ANIM_TAG_SMALL_EMBER }, - { gBattleAnimSpriteSheet_030, 0xA00, ANIM_TAG_GRAY_SMOKE }, - { gBattleAnimSpriteSheet_031, 0xE00, ANIM_TAG_BLUE_STAR }, - { gBattleAnimSpriteSheet_032, 0x380, ANIM_TAG_UNUSED_BUBBLE_BURST }, - { gBattleAnimSpriteSheet_033, 0x1000, ANIM_TAG_FIRE }, - { gBattleAnimSpriteSheet_034, 0x800, ANIM_TAG_UNUSED_SPINNING_FIRE }, - { gBattleAnimSpriteSheet_035, 0xA00, ANIM_TAG_FIRE_PLUME }, - { gBattleAnimSpriteSheet_036, 0x800, ANIM_TAG_UNUSED_LIGHTNING }, - { gBattleAnimSpriteSheet_037, 0xA00, ANIM_TAG_LIGHTNING }, - { gBattleAnimSpriteSheet_038, 0xA00, ANIM_TAG_UNUSED_CLAW_SLASH }, - { gBattleAnimSpriteSheet_039, 0xA00, ANIM_TAG_CLAW_SLASH }, - { gBattleAnimSpriteSheet_040, 0xA00, ANIM_TAG_UNUSED_SCRATCH }, - { gBattleAnimSpriteSheet_041, 0xA00, ANIM_TAG_UNUSED_SCRATCH_2 }, - { gBattleAnimSpriteSheet_042, 0xA00, ANIM_TAG_UNUSED_BUBBLE_BURST_2 }, - { gBattleAnimSpriteSheet_043, 0xA00, ANIM_TAG_ICE_CHUNK }, - { gBattleAnimSpriteSheet_044, 0xA00, ANIM_TAG_UNUSED_GLASS_2 }, - { gBattleAnimSpriteSheet_045, 0xA00, ANIM_TAG_UNUSED_PINK_HEART }, - { gBattleAnimSpriteSheet_046, 0x1000, ANIM_TAG_UNUSED_SAP_DRIP }, - { gBattleAnimSpriteSheet_046, 0x1000, ANIM_TAG_UNUSED_SAP_DRIP_2 }, - { gBattleAnimSpriteSheet_048, 0x1000, ANIM_TAG_SPARKLE_1 }, - { gBattleAnimSpriteSheet_048, 0x1000, ANIM_TAG_SPARKLE_2 }, - { gBattleAnimSpriteSheet_050, 0x200, ANIM_TAG_HUMANOID_FOOT }, - { gBattleAnimSpriteSheet_051, 0x200, ANIM_TAG_UNUSED_MONSTER_FOOT }, - { gBattleAnimSpriteSheet_052, 0x200, ANIM_TAG_UNUSED_HUMANOID_HAND }, - { gBattleAnimSpriteSheet_053, 0x800, ANIM_TAG_NOISE_LINE }, - { gBattleAnimSpriteSheet_054, 0x80, ANIM_TAG_UNUSED_YELLOW_UNK }, - { gBattleAnimSpriteSheet_055, 0x200, ANIM_TAG_UNUSED_RED_FIST }, - { gBattleAnimSpriteSheet_056, 0x1000, ANIM_TAG_SLAM_HIT }, - { gBattleAnimSpriteSheet_057, 0x180, ANIM_TAG_UNUSED_RING }, - { gBattleAnimSpriteSheet_058, 0xC00, ANIM_TAG_ROCKS }, - { gBattleAnimSpriteSheet_059, 0x100, ANIM_TAG_UNUSED_Z }, - { gBattleAnimSpriteSheet_060, 0x40, ANIM_TAG_UNUSED_YELLOW_UNK_2 }, - { gBattleAnimSpriteSheet_061, 0x180, ANIM_TAG_UNUSED_AIR_SLASH }, - { gBattleAnimSpriteSheet_062, 0x800, ANIM_TAG_UNUSED_SPINNING_GREEN_ORBS }, - { gBattleAnimSpriteSheet_063, 0x480, ANIM_TAG_LEAF }, - { gBattleAnimSpriteSheet_064, 0x200, ANIM_TAG_FINGER }, - { gBattleAnimSpriteSheet_065, 0x200, ANIM_TAG_POISON_POWDER }, - { gBattleAnimSpriteSheet_066, 0x100, ANIM_TAG_UNUSED_BROWN_TRIANGLE }, - { gBattleAnimSpriteSheet_065, 0x200, ANIM_TAG_SLEEP_POWDER }, - { gBattleAnimSpriteSheet_065, 0x200, ANIM_TAG_STUN_SPORE }, - { gBattleAnimSpriteSheet_065, 0x200, ANIM_TAG_UNUSED_POWDER }, - { gBattleAnimSpriteSheet_070, 0x200, ANIM_TAG_SPARKLE_3 }, - { gBattleAnimSpriteSheet_071, 0xA00, ANIM_TAG_SPARKLE_4 }, - { gBattleAnimSpriteSheet_072, 0x300, ANIM_TAG_MUSIC_NOTES }, - { gBattleAnimSpriteSheet_073, 0x180, ANIM_TAG_DUCK }, - { gBattleAnimSpriteSheet_074, 0xA0, ANIM_TAG_MUD_SAND }, - { gBattleAnimSpriteSheet_075, 0x700, ANIM_TAG_ALERT }, - { gBattleAnimSpriteSheet_076, 0x400, ANIM_TAG_UNUSED_BLUE_FLAMES }, - { gBattleAnimSpriteSheet_077, 0x200, ANIM_TAG_UNUSED_BLUE_FLAMES_2 }, - { gBattleAnimSpriteSheet_078, 0x300, ANIM_TAG_UNUSED_SHOCK }, - { gBattleAnimSpriteSheet_079, 0xC00, ANIM_TAG_SHOCK }, - { gBattleAnimSpriteSheet_080, 0xA00, ANIM_TAG_UNUSED_BELL }, - { gBattleAnimSpriteSheet_081, 0x80, ANIM_TAG_UNUSED_PINK_GLOVE }, - { gBattleAnimSpriteSheet_082, 0x40, ANIM_TAG_UNUSED_BLUE_LINES }, - { gBattleAnimSpriteSheet_083, 0xE00, ANIM_TAG_UNUSED_IMPACT }, - { gBattleAnimSpriteSheet_084, 0xE00, ANIM_TAG_UNUSED_IMPACT_2 }, - { gBattleAnimSpriteSheet_085, 0x280, ANIM_TAG_UNUSED_RETICLE }, - { gBattleAnimSpriteSheet_086, 0x200, ANIM_TAG_BREATH }, - { gBattleAnimSpriteSheet_087, 0x80, ANIM_TAG_ANGER }, - { gBattleAnimSpriteSheet_088, 0xC0, ANIM_TAG_UNUSED_SNOWBALL }, - { gBattleAnimSpriteSheet_089, 0xA00, ANIM_TAG_UNUSED_VINE }, - { gBattleAnimSpriteSheet_090, 0x200, ANIM_TAG_UNUSED_SWORD }, - { gBattleAnimSpriteSheet_091, 0x180, ANIM_TAG_UNUSED_CLAPPING }, - { gBattleAnimSpriteSheet_092, 0x80, ANIM_TAG_UNUSED_RED_TUBE }, - { gBattleAnimSpriteSheet_093, 0x1000, ANIM_TAG_AMNESIA }, - { gBattleAnimSpriteSheet_094, 0xA00, ANIM_TAG_UNUSED_STRING }, - { gBattleAnimSpriteSheet_095, 0x180, ANIM_TAG_UNUSED_PENCIL }, - { gBattleAnimSpriteSheet_096, 0x380, ANIM_TAG_UNUSED_PETAL }, - { gBattleAnimSpriteSheet_097, 0xC00, ANIM_TAG_BENT_SPOON }, - { gBattleAnimSpriteSheet_098, 0x200, ANIM_TAG_UNUSED_WEB }, - { gBattleAnimSpriteSheet_099, 0x200, ANIM_TAG_MILK_BOTTLE }, - { gBattleAnimSpriteSheet_100, 0x200, ANIM_TAG_COIN }, - { gBattleAnimSpriteSheet_101, 0x200, ANIM_TAG_UNUSED_CRACKED_EGG }, - { gBattleAnimSpriteSheet_102, 0x400, ANIM_TAG_UNUSED_HATCHED_EGG }, - { gBattleAnimSpriteSheet_103, 0x80, ANIM_TAG_UNUSED_FRESH_EGG }, - { gBattleAnimSpriteSheet_104, 0x400, ANIM_TAG_UNUSED_FANGS }, - { gBattleAnimSpriteSheet_105, 0xC00, ANIM_TAG_UNUSED_EXPLOSION_2 }, - { gBattleAnimSpriteSheet_106, 0x200, ANIM_TAG_UNUSED_EXPLOSION_3 }, - { gBattleAnimSpriteSheet_107, 0x1000, ANIM_TAG_UNUSED_WATER_DROPLET }, - { gBattleAnimSpriteSheet_108, 0xA00, ANIM_TAG_UNUSED_WATER_DROPLET_2 }, - { gBattleAnimSpriteSheet_109, 0x20, ANIM_TAG_UNUSED_SEED }, - { gBattleAnimSpriteSheet_110, 0xE00, ANIM_TAG_UNUSED_SPROUT }, - { gBattleAnimSpriteSheet_111, 0x80, ANIM_TAG_UNUSED_RED_WAND }, - { gBattleAnimSpriteSheet_112, 0xA00, ANIM_TAG_UNUSED_PURPLE_GREEN_UNK }, - { gBattleAnimSpriteSheet_113, 0x400, ANIM_TAG_UNUSED_WATER_COLUMN }, - { gBattleAnimSpriteSheet_114, 0x200, ANIM_TAG_UNUSED_MUD_UNK }, - { gBattleAnimSpriteSheet_115, 0x700, ANIM_TAG_RAIN_DROPS }, - { gBattleAnimSpriteSheet_116, 0x800, ANIM_TAG_UNUSED_FURY_SWIPES }, - { gBattleAnimSpriteSheet_117, 0xA00, ANIM_TAG_UNUSED_VINE_2 }, - { gBattleAnimSpriteSheet_118, 0x600, ANIM_TAG_UNUSED_TEETH }, - { gBattleAnimSpriteSheet_119, 0x800, ANIM_TAG_UNUSED_BONE }, - { gBattleAnimSpriteSheet_120, 0x200, ANIM_TAG_UNUSED_WHITE_BAG }, - { gBattleAnimSpriteSheet_121, 0x40, ANIM_TAG_UNUSED_UNKNOWN }, - { gBattleAnimSpriteSheet_122, 0x180, ANIM_TAG_UNUSED_PURPLE_CORAL }, - { gBattleAnimSpriteSheet_123, 0x600, ANIM_TAG_UNUSED_PURPLE_DROPLET }, - { gBattleAnimSpriteSheet_124, 0x600, ANIM_TAG_UNUSED_SHOCK_2 }, - { gBattleAnimSpriteSheet_125, 0x200, ANIM_TAG_UNUSED_CLOSING_EYE_2 }, - { gBattleAnimSpriteSheet_126, 0x80, ANIM_TAG_UNUSED_METAL_BALL }, - { gBattleAnimSpriteSheet_127, 0x200, ANIM_TAG_UNUSED_MONSTER_DOLL }, - { gBattleAnimSpriteSheet_128, 0x800, ANIM_TAG_UNUSED_WHIRLWIND }, - { gBattleAnimSpriteSheet_129, 0x80, ANIM_TAG_UNUSED_WHIRLWIND_2 }, - { gBattleAnimSpriteSheet_130, 0xA00, ANIM_TAG_UNUSED_EXPLOSION_4 }, - { gBattleAnimSpriteSheet_131, 0x280, ANIM_TAG_UNUSED_EXPLOSION_5 }, - { gBattleAnimSpriteSheet_132, 0x280, ANIM_TAG_UNUSED_TONGUE }, - { gBattleAnimSpriteSheet_133, 0x100, ANIM_TAG_UNUSED_SMOKE }, - { gBattleAnimSpriteSheet_134, 0x200, ANIM_TAG_UNUSED_SMOKE_2 }, - { gBattleAnimSpriteSheet_135, 0x200, ANIM_TAG_IMPACT }, - { gBattleAnimSpriteSheet_136, 0x20, ANIM_TAG_CIRCLE_IMPACT }, - { gBattleAnimSpriteSheet_137, 0xA00, ANIM_TAG_SCRATCH }, - { gBattleAnimSpriteSheet_138, 0x800, ANIM_TAG_CUT }, - { gBattleAnimSpriteSheet_139, 0x800, ANIM_TAG_SHARP_TEETH }, - { gBattleAnimSpriteSheet_140, 0xC0, ANIM_TAG_RAINBOW_RINGS }, - { gBattleAnimSpriteSheet_141, 0x1C0, ANIM_TAG_ICE_CRYSTALS }, - { gBattleAnimSpriteSheet_142, 0x100, ANIM_TAG_ICE_SPIKES }, - { gBattleAnimSpriteSheet_143, 0x800, ANIM_TAG_HANDS_AND_FEET }, - { gBattleAnimSpriteSheet_144, 0x200, ANIM_TAG_MIST_CLOUD }, - { gBattleAnimSpriteSheet_145, 0x800, ANIM_TAG_CLAMP }, - { gBattleAnimSpriteSheet_146, 0x180, ANIM_TAG_BUBBLE }, - { gBattleAnimSpriteSheet_147, 0x180, ANIM_TAG_ORBS }, - { gBattleAnimSpriteSheet_148, 0x200, ANIM_TAG_WATER_IMPACT }, - { gBattleAnimSpriteSheet_149, 0x200, ANIM_TAG_WATER_ORB }, - { gBattleAnimSpriteSheet_150, 0x180, ANIM_TAG_POISON_BUBBLE }, - { gBattleAnimSpriteSheet_151, 0x400, ANIM_TAG_TOXIC_BUBBLE }, - { gBattleAnimSpriteSheet_152, 0x80, ANIM_TAG_SPIKES }, - { gBattleAnimSpriteSheet_153, 0x100, ANIM_TAG_HORN_HIT_2 }, - { gBattleAnimSpriteSheet_154, 0x100, ANIM_TAG_AIR_WAVE_2 }, - { gBattleAnimSpriteSheet_155, 0x140, ANIM_TAG_SMALL_BUBBLES }, - { gBattleAnimSpriteSheet_156, 0x800, ANIM_TAG_ROUND_SHADOW }, - { gBattleAnimSpriteSheet_157, 0x200, ANIM_TAG_SUNLIGHT }, - { gBattleAnimSpriteSheet_158, 0x100, ANIM_TAG_SPORE }, - { gBattleAnimSpriteSheet_159, 0xA0, ANIM_TAG_FLOWER }, - { gBattleAnimSpriteSheet_160, 0x100, ANIM_TAG_RAZOR_LEAF }, - { gBattleAnimSpriteSheet_161, 0x80, ANIM_TAG_NEEDLE }, - { gBattleAnimSpriteSheet_162, 0x300, ANIM_TAG_WHIRLWIND_LINES }, - { gBattleAnimSpriteSheet_163, 0x100, ANIM_TAG_GOLD_RING }, - { gBattleAnimSpriteSheet_163, 0x100, ANIM_TAG_PURPLE_RING }, - { gBattleAnimSpriteSheet_163, 0x100, ANIM_TAG_BLUE_RING }, - { gBattleAnimSpriteSheet_166, 0x800, ANIM_TAG_GREEN_LIGHT_WALL }, - { gBattleAnimSpriteSheet_166, 0x800, ANIM_TAG_BLUE_LIGHT_WALL }, - { gBattleAnimSpriteSheet_166, 0x800, ANIM_TAG_RED_LIGHT_WALL }, - { gBattleAnimSpriteSheet_166, 0x800, ANIM_TAG_GRAY_LIGHT_WALL }, - { gBattleAnimSpriteSheet_166, 0x800, ANIM_TAG_ORANGE_LIGHT_WALL }, - { gBattleAnimSpriteSheet_171, 0x80, ANIM_TAG_BLACK_BALL_2 }, - { gBattleAnimSpriteSheet_144, 0x200, ANIM_TAG_PURPLE_GAS_CLOUD }, - { gBattleAnimSpriteSheet_173, 0x200, ANIM_TAG_SPARK_H }, - { gBattleAnimSpriteSheet_174, 0x200, ANIM_TAG_YELLOW_STAR }, - { gBattleAnimSpriteSheet_175, 0x80, ANIM_TAG_LARGE_FRESH_EGG }, - { gBattleAnimSpriteSheet_176, 0x200, ANIM_TAG_SHADOW_BALL }, - { gBattleAnimSpriteSheet_177, 0x500, ANIM_TAG_LICK }, - { gBattleAnimSpriteSheet_178, 0x800, ANIM_TAG_UNUSED_VOID_LINES }, - { gBattleAnimSpriteSheet_179, 0x400, ANIM_TAG_STRING }, - { gBattleAnimSpriteSheet_180, 0x20, ANIM_TAG_STRING_DOT }, - { gBattleAnimSpriteSheet_181, 0x800, ANIM_TAG_WEB }, - { gBattleAnimSpriteSheet_182, 0x100, ANIM_TAG_UNUSED_LIGHTBULB }, - { gBattleAnimSpriteSheet_183, 0x800, ANIM_TAG_SLASH }, - { gBattleAnimSpriteSheet_184, 0x400, ANIM_TAG_FOCUS_ENERGY }, - { gBattleAnimSpriteSheet_185, 0xA00, ANIM_TAG_SPHERE_TO_CUBE }, - { gBattleAnimSpriteSheet_186, 0x1000, ANIM_TAG_TENDRILS }, - { gBattleAnimSpriteSheet_187, 0x800, ANIM_TAG_EYE }, - { gBattleAnimSpriteSheet_188, 0x400, ANIM_TAG_WHITE_SHADOW }, - { gBattleAnimSpriteSheet_189, 0x200, ANIM_TAG_TEAL_ALERT }, - { gBattleAnimSpriteSheet_190, 0x800, ANIM_TAG_OPENING_EYE }, - { gBattleAnimSpriteSheet_191, 0x800, ANIM_TAG_ROUND_WHITE_HALO }, - { gBattleAnimSpriteSheet_192, 0x800, ANIM_TAG_FANG_ATTACK }, - { gBattleAnimSpriteSheet_193, 0x200, ANIM_TAG_PURPLE_HAND_OUTLINE }, - { gBattleAnimSpriteSheet_194, 0x800, ANIM_TAG_MOON }, - { gBattleAnimSpriteSheet_195, 0x200, ANIM_TAG_SPARKLE_5 }, - { gBattleAnimSpriteSheet_196, 0x800, ANIM_TAG_SPIRAL }, - { gBattleAnimSpriteSheet_197, 0x200, ANIM_TAG_SNORE_Z }, - { gBattleAnimSpriteSheet_198, 0x800, ANIM_TAG_EXPLOSION }, - { gBattleAnimSpriteSheet_199, 0x400, ANIM_TAG_NAIL }, - { gBattleAnimSpriteSheet_200, 0x200, ANIM_TAG_GHOSTLY_SPIRIT }, - { gBattleAnimSpriteSheet_201, 0xA80, ANIM_TAG_WARM_ROCK }, - { gBattleAnimSpriteSheet_202, 0x600, ANIM_TAG_BREAKING_EGG }, - { gBattleAnimSpriteSheet_203, 0x800, ANIM_TAG_THIN_RING }, - { gBattleAnimSpriteSheet_204, 0x200, ANIM_TAG_UNUSED_PUNCH_IMPACT }, - { gBattleAnimSpriteSheet_205, 0x600, ANIM_TAG_BELL }, - { gBattleAnimSpriteSheet_206, 0x800, ANIM_TAG_MUSIC_NOTES_2 }, - { gBattleAnimSpriteSheet_207, 0x180, ANIM_TAG_SPEED_DUST }, - { gBattleAnimSpriteSheet_208, 0x800, ANIM_TAG_TORN_METAL }, - { gBattleAnimSpriteSheet_209, 0x800, ANIM_TAG_THOUGHT_BUBBLE }, - { gBattleAnimSpriteSheet_210, 0x80, ANIM_TAG_MAGENTA_HEART }, - { gBattleAnimSpriteSheet_211, 0x80, ANIM_TAG_ELECTRIC_ORBS }, - { gBattleAnimSpriteSheet_212, 0x800, ANIM_TAG_CIRCLE_OF_LIGHT }, - { gBattleAnimSpriteSheet_213, 0x800, ANIM_TAG_ELECTRICITY }, - { gBattleAnimSpriteSheet_214, 0x600, ANIM_TAG_FINGER_2 }, - { gBattleAnimSpriteSheet_215, 0x600, ANIM_TAG_MOVEMENT_WAVES }, - { gBattleAnimSpriteSheet_210, 0x80, ANIM_TAG_RED_HEART }, - { gBattleAnimSpriteSheet_217, 0x80, ANIM_TAG_RED_ORB }, - { gBattleAnimSpriteSheet_218, 0x180, ANIM_TAG_EYE_SPARKLE }, - { gBattleAnimSpriteSheet_210, 0x80, ANIM_TAG_PINK_HEART }, - { gBattleAnimSpriteSheet_220, 0x200, ANIM_TAG_ANGEL }, - { gBattleAnimSpriteSheet_221, 0x400, ANIM_TAG_DEVIL }, - { gBattleAnimSpriteSheet_222, 0xA00, ANIM_TAG_SWIPE }, - { gBattleAnimSpriteSheet_223, 0x800, ANIM_TAG_ROOTS }, - { gBattleAnimSpriteSheet_224, 0x200, ANIM_TAG_ITEM_BAG }, - { gBattleAnimSpriteSheet_225, 0x400, ANIM_TAG_JAGGED_MUSIC_NOTE }, - { gBattleAnimSpriteSheet_226, 0x80, ANIM_TAG_POKEBALL }, - { gBattleAnimSpriteSheet_227, 0x800, ANIM_TAG_SPOTLIGHT }, - { gBattleAnimSpriteSheet_228, 0x200, ANIM_TAG_LETTER_Z }, - { gBattleAnimSpriteSheet_229, 0x300, ANIM_TAG_RAPID_SPIN }, - { gBattleAnimSpriteSheet_230, 0x800, ANIM_TAG_TRI_FORCE_TRIANGLE }, - { gBattleAnimSpriteSheet_231, 0x380, ANIM_TAG_WISP_ORB }, - { gBattleAnimSpriteSheet_232, 0x800, ANIM_TAG_WISP_FIRE }, - { gBattleAnimSpriteSheet_233, 0xC0, ANIM_TAG_GOLD_STARS }, - { gBattleAnimSpriteSheet_234, 0x800, ANIM_TAG_ECLIPSING_ORB }, - { gBattleAnimSpriteSheet_235, 0x60, ANIM_TAG_GRAY_ORB }, - { gBattleAnimSpriteSheet_235, 0x60, ANIM_TAG_BLUE_ORB }, - { gBattleAnimSpriteSheet_235, 0x60, ANIM_TAG_RED_ORB_2 }, - { gBattleAnimSpriteSheet_238, 0x80, ANIM_TAG_PINK_PETAL }, - { gBattleAnimSpriteSheet_239, 0x180, ANIM_TAG_PAIN_SPLIT }, - { gBattleAnimSpriteSheet_240, 0x180, ANIM_TAG_CONFETTI }, - { gBattleAnimSpriteSheet_241, 0x200, ANIM_TAG_GREEN_STAR }, - { gBattleAnimSpriteSheet_242, 0x200, ANIM_TAG_PINK_CLOUD }, - { gBattleAnimSpriteSheet_243, 0x20, ANIM_TAG_SWEAT_DROP }, - { gBattleAnimSpriteSheet_244, 0x400, ANIM_TAG_GUARD_RING }, - { gBattleAnimSpriteSheet_245, 0x600, ANIM_TAG_PURPLE_SCRATCH }, - { gBattleAnimSpriteSheet_246, 0x1000, ANIM_TAG_PURPLE_SWIPE }, - { gBattleAnimSpriteSheet_247, 0x400, ANIM_TAG_TAG_HAND }, - { gBattleAnimSpriteSheet_248, 0x20, ANIM_TAG_SMALL_RED_EYE }, - { gBattleAnimSpriteSheet_249, 0x80, ANIM_TAG_HOLLOW_ORB }, - { gBattleAnimSpriteSheet_250, 0x800, ANIM_TAG_X_SIGN }, - { gBattleAnimSpriteSheet_251, 0x80, ANIM_TAG_BLUEGREEN_ORB }, - { gBattleAnimSpriteSheet_252, 0x200, ANIM_TAG_PAW_PRINT }, - { gBattleAnimSpriteSheet_253, 0x400, ANIM_TAG_PURPLE_FLAME }, - { gBattleAnimSpriteSheet_254, 0x200, ANIM_TAG_RED_BALL }, - { gBattleAnimSpriteSheet_255, 0x200, ANIM_TAG_SMELLINGSALT_EFFECT }, - { gBattleAnimSpriteSheet_256, 0x800, ANIM_TAG_METEOR }, - { gBattleAnimSpriteSheet_257, 0x280, ANIM_TAG_FLAT_ROCK }, - { gBattleAnimSpriteSheet_258, 0x200, ANIM_TAG_MAGNIFYING_GLASS }, - { gBattleAnimSpriteSheet_149, 0x200, ANIM_TAG_BROWN_ORB }, - { gBattleAnimSpriteSheet_260, 0x400, ANIM_TAG_METAL_SOUND_WAVES }, - { gBattleAnimSpriteSheet_261, 0x200, ANIM_TAG_FLYING_DIRT }, - { gBattleAnimSpriteSheet_262, 0x200, ANIM_TAG_ICICLE_SPEAR }, - { gBattleAnimSpriteSheet_263, 0x80, ANIM_TAG_HAIL }, - { gBattleAnimSpriteSheet_264, 0x20, ANIM_TAG_GLOWY_RED_ORB }, - { gBattleAnimSpriteSheet_264, 0x20, ANIM_TAG_GLOWY_GREEN_ORB }, - { gBattleAnimSpriteSheet_266, 0x80, ANIM_TAG_GREEN_SPIKE }, - { gBattleAnimSpriteSheet_212, 0x800, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT }, - { gBattleAnimSpriteSheet_264, 0x20, ANIM_TAG_GLOWY_BLUE_ORB }, - { gBattleAnimSpriteSheet_269, 0x80, ANIM_TAG_UNUSED_RED_BRICK }, - { gBattleAnimSpriteSheet_270, 0x400, ANIM_TAG_WHITE_FEATHER }, - { gBattleAnimSpriteSheet_271, 0x80, ANIM_TAG_SPARKLE_6 }, - { gBattleAnimSpriteSheet_272, 0x800, ANIM_TAG_SPLASH }, - { gBattleAnimSpriteSheet_273, 0x20, ANIM_TAG_SWEAT_BEAD }, - { gBattleAnimSpriteSheet_274, 0x800, ANIM_TAG_UNUSED_GEM_1 }, - { gBattleAnimSpriteSheet_275, 0x800, ANIM_TAG_UNUSED_GEM_2 }, - { gBattleAnimSpriteSheet_276, 0x800, ANIM_TAG_UNUSED_GEM_3 }, - { gBattleAnimSpriteSheet_277, 0x1000, ANIM_TAG_SLAM_HIT_2 }, - { gBattleAnimSpriteSheet_278, 0x800, ANIM_TAG_RECYCLE }, - { gBattleAnimSpriteSheet_279, 0xA0, ANIM_TAG_UNUSED_RED_PARTICLES }, - { gBattleAnimSpriteSheet_280, 0x800, ANIM_TAG_PROTECT }, - { gBattleAnimSpriteSheet_281, 0x200, ANIM_TAG_DIRT_MOUND }, - { gBattleAnimSpriteSheet_282, 0x600, ANIM_TAG_SHOCK_3 }, - { gBattleAnimSpriteSheet_283, 0x200, ANIM_TAG_WEATHER_BALL }, - { gBattleAnimSpriteSheet_284, 0x800, ANIM_TAG_BIRD }, - { gBattleAnimSpriteSheet_285, 0x200, ANIM_TAG_CROSS_IMPACT }, - { gBattleAnimSpriteSheet_183, 0x800, ANIM_TAG_SLASH_2 }, - { gBattleAnimSpriteSheet_056, 0x1000, ANIM_TAG_WHIP_HIT }, - { gBattleAnimSpriteSheet_163, 0x100, ANIM_TAG_BLUE_RING_2 }, -}; - -const struct CompressedSpritePalette gBattleAnimPaletteTable[] = -{ - { gBattleAnimSpritePalette_000, ANIM_TAG_BONE }, - { gBattleAnimSpritePalette_001, ANIM_TAG_SPARK }, - { gBattleAnimSpritePalette_002, ANIM_TAG_PENCIL }, - { gBattleAnimSpritePalette_003, ANIM_TAG_AIR_WAVE }, - { gBattleAnimSpritePalette_004, ANIM_TAG_UNUSED_ORB }, - { gBattleAnimSpritePalette_005, ANIM_TAG_SWORD }, - { gBattleAnimSpritePalette_006, ANIM_TAG_SEED }, - { gBattleAnimSpritePalette_007, ANIM_TAG_UNUSED_EXPLOSION }, - { gBattleAnimSpritePalette_008, ANIM_TAG_UNUSED_PINK_ORB }, - { gBattleAnimSpritePalette_009, ANIM_TAG_GUST }, - { gBattleAnimSpritePalette_010, ANIM_TAG_ICE_CUBE }, - { gBattleAnimSpritePalette_011, ANIM_TAG_SPARK_2 }, - { gBattleAnimSpritePalette_012, ANIM_TAG_UNUSED_ORANGE }, - { gBattleAnimSpritePalette_013, ANIM_TAG_YELLOW_BALL }, - { gBattleAnimSpritePalette_014, ANIM_TAG_LOCK_ON }, - { gBattleAnimSpritePalette_015, ANIM_TAG_TIED_BAG }, - { gBattleAnimSpritePalette_016, ANIM_TAG_BLACK_SMOKE }, - { gBattleAnimSpritePalette_016, ANIM_TAG_BLACK_BALL }, - { gBattleAnimSpritePalette_018, ANIM_TAG_CONVERSION }, - { gBattleAnimSpritePalette_019, ANIM_TAG_UNUSED_GLASS }, - { gBattleAnimSpritePalette_020, ANIM_TAG_HORN_HIT }, - { gBattleAnimSpritePalette_021, ANIM_TAG_UNUSED_HIT }, - { gBattleAnimSpritePalette_022, ANIM_TAG_UNUSED_HIT_2 }, - { gBattleAnimSpritePalette_023, ANIM_TAG_UNUSED_BLUE_SHARDS }, - { gBattleAnimSpritePalette_024, ANIM_TAG_UNUSED_CLOSING_EYE }, - { gBattleAnimSpritePalette_025, ANIM_TAG_UNUSED_WAVING_HAND }, - { gBattleAnimSpritePalette_026, ANIM_TAG_UNUSED_HIT_DUPLICATE }, - { gBattleAnimSpritePalette_027, ANIM_TAG_LEER }, - { gBattleAnimSpritePalette_028, ANIM_TAG_UNUSED_BLUE_BURST }, - { gBattleAnimSpritePalette_029, ANIM_TAG_SMALL_EMBER }, - { gBattleAnimSpritePalette_030, ANIM_TAG_GRAY_SMOKE }, - { gBattleAnimSpritePalette_031, ANIM_TAG_BLUE_STAR }, - { gBattleAnimSpritePalette_032, ANIM_TAG_UNUSED_BUBBLE_BURST }, - { gBattleAnimSpritePalette_033, ANIM_TAG_FIRE }, - { gBattleAnimSpritePalette_033, ANIM_TAG_UNUSED_SPINNING_FIRE }, - { gBattleAnimSpritePalette_033, ANIM_TAG_FIRE_PLUME }, - { gBattleAnimSpritePalette_036, ANIM_TAG_UNUSED_LIGHTNING }, - { gBattleAnimSpritePalette_036, ANIM_TAG_LIGHTNING }, - { gBattleAnimSpritePalette_038, ANIM_TAG_UNUSED_CLAW_SLASH }, - { gBattleAnimSpritePalette_039, ANIM_TAG_CLAW_SLASH }, - { gBattleAnimSpritePalette_038, ANIM_TAG_UNUSED_SCRATCH }, - { gBattleAnimSpritePalette_038, ANIM_TAG_UNUSED_SCRATCH_2 }, - { gBattleAnimSpritePalette_042, ANIM_TAG_UNUSED_BUBBLE_BURST_2 }, - { gBattleAnimSpritePalette_043, ANIM_TAG_ICE_CHUNK }, - { gBattleAnimSpritePalette_044, ANIM_TAG_UNUSED_GLASS_2 }, - { gBattleAnimSpritePalette_045, ANIM_TAG_UNUSED_PINK_HEART }, - { gBattleAnimSpritePalette_046, ANIM_TAG_UNUSED_SAP_DRIP }, - { gBattleAnimSpritePalette_047, ANIM_TAG_UNUSED_SAP_DRIP }, - { gBattleAnimSpritePalette_048, ANIM_TAG_SPARKLE_1 }, - { gBattleAnimSpritePalette_049, ANIM_TAG_SPARKLE_2 }, - { gBattleAnimSpritePalette_050, ANIM_TAG_HUMANOID_FOOT }, - { gBattleAnimSpritePalette_050, ANIM_TAG_UNUSED_MONSTER_FOOT }, - { gBattleAnimSpritePalette_050, ANIM_TAG_UNUSED_HUMANOID_HAND }, - { gBattleAnimSpritePalette_026, ANIM_TAG_NOISE_LINE }, - { gBattleAnimSpritePalette_054, ANIM_TAG_UNUSED_YELLOW_UNK }, - { gBattleAnimSpritePalette_050, ANIM_TAG_UNUSED_RED_FIST }, - { gBattleAnimSpritePalette_056, ANIM_TAG_SLAM_HIT }, - { gBattleAnimSpritePalette_057, ANIM_TAG_UNUSED_RING }, - { gBattleAnimSpritePalette_058, ANIM_TAG_ROCKS }, - { gBattleAnimSpritePalette_059, ANIM_TAG_UNUSED_Z }, - { gBattleAnimSpritePalette_060, ANIM_TAG_UNUSED_YELLOW_UNK_2 }, - { gBattleAnimSpritePalette_061, ANIM_TAG_UNUSED_AIR_SLASH }, - { gBattleAnimSpritePalette_062, ANIM_TAG_UNUSED_SPINNING_GREEN_ORBS }, - { gBattleAnimSpritePalette_063, ANIM_TAG_LEAF }, - { gBattleAnimSpritePalette_064, ANIM_TAG_FINGER }, - { gBattleAnimSpritePalette_065, ANIM_TAG_POISON_POWDER }, - { gBattleAnimSpritePalette_066, ANIM_TAG_UNUSED_BROWN_TRIANGLE }, - { gBattleAnimSpritePalette_067, ANIM_TAG_SLEEP_POWDER }, - { gBattleAnimSpritePalette_068, ANIM_TAG_STUN_SPORE }, - { gBattleAnimSpritePalette_065, ANIM_TAG_UNUSED_POWDER }, - { gBattleAnimSpritePalette_070, ANIM_TAG_SPARKLE_3 }, - { gBattleAnimSpritePalette_070, ANIM_TAG_SPARKLE_4 }, - { gBattleAnimSpritePalette_072, ANIM_TAG_MUSIC_NOTES }, - { gBattleAnimSpritePalette_073, ANIM_TAG_DUCK }, - { gBattleAnimSpritePalette_074, ANIM_TAG_MUD_SAND }, - { gBattleAnimSpritePalette_075, ANIM_TAG_ALERT }, - { gBattleAnimSpritePalette_076, ANIM_TAG_UNUSED_BLUE_FLAMES }, - { gBattleAnimSpritePalette_076, ANIM_TAG_UNUSED_BLUE_FLAMES_2 }, - { gBattleAnimSpritePalette_078, ANIM_TAG_UNUSED_SHOCK }, - { gBattleAnimSpritePalette_078, ANIM_TAG_SHOCK }, - { gBattleAnimSpritePalette_080, ANIM_TAG_UNUSED_BELL }, - { gBattleAnimSpritePalette_081, ANIM_TAG_UNUSED_PINK_GLOVE }, - { gBattleAnimSpritePalette_082, ANIM_TAG_UNUSED_BLUE_LINES }, - { gBattleAnimSpritePalette_083, ANIM_TAG_UNUSED_IMPACT }, - { gBattleAnimSpritePalette_084, ANIM_TAG_UNUSED_IMPACT_2 }, - { gBattleAnimSpritePalette_085, ANIM_TAG_UNUSED_RETICLE }, - { gBattleAnimSpritePalette_086, ANIM_TAG_BREATH }, - { gBattleAnimSpritePalette_087, ANIM_TAG_ANGER }, - { gBattleAnimSpritePalette_088, ANIM_TAG_UNUSED_SNOWBALL }, - { gBattleAnimSpritePalette_089, ANIM_TAG_UNUSED_VINE }, - { gBattleAnimSpritePalette_090, ANIM_TAG_UNUSED_SWORD }, - { gBattleAnimSpritePalette_091, ANIM_TAG_UNUSED_CLAPPING }, - { gBattleAnimSpritePalette_092, ANIM_TAG_UNUSED_RED_TUBE }, - { gBattleAnimSpritePalette_093, ANIM_TAG_AMNESIA }, - { gBattleAnimSpritePalette_094, ANIM_TAG_UNUSED_STRING }, - { gBattleAnimSpritePalette_095, ANIM_TAG_UNUSED_PENCIL }, - { gBattleAnimSpritePalette_096, ANIM_TAG_UNUSED_PETAL }, - { gBattleAnimSpritePalette_097, ANIM_TAG_BENT_SPOON }, - { gBattleAnimSpritePalette_094, ANIM_TAG_UNUSED_WEB }, - { gBattleAnimSpritePalette_099, ANIM_TAG_MILK_BOTTLE }, - { gBattleAnimSpritePalette_100, ANIM_TAG_COIN }, - { gBattleAnimSpritePalette_101, ANIM_TAG_UNUSED_CRACKED_EGG }, - { gBattleAnimSpritePalette_101, ANIM_TAG_UNUSED_HATCHED_EGG }, - { gBattleAnimSpritePalette_103, ANIM_TAG_UNUSED_FRESH_EGG }, - { gBattleAnimSpritePalette_104, ANIM_TAG_UNUSED_FANGS }, - { gBattleAnimSpritePalette_105, ANIM_TAG_UNUSED_EXPLOSION_2 }, - { gBattleAnimSpritePalette_105, ANIM_TAG_UNUSED_EXPLOSION_3 }, - { gBattleAnimSpritePalette_107, ANIM_TAG_UNUSED_WATER_DROPLET }, - { gBattleAnimSpritePalette_107, ANIM_TAG_UNUSED_WATER_DROPLET_2 }, - { gBattleAnimSpritePalette_109, ANIM_TAG_UNUSED_SEED }, - { gBattleAnimSpritePalette_109, ANIM_TAG_UNUSED_SPROUT }, - { gBattleAnimSpritePalette_111, ANIM_TAG_UNUSED_RED_WAND }, - { gBattleAnimSpritePalette_112, ANIM_TAG_UNUSED_PURPLE_GREEN_UNK }, - { gBattleAnimSpritePalette_113, ANIM_TAG_UNUSED_WATER_COLUMN }, - { gBattleAnimSpritePalette_114, ANIM_TAG_UNUSED_MUD_UNK }, - { gBattleAnimSpritePalette_115, ANIM_TAG_RAIN_DROPS }, - { gBattleAnimSpritePalette_116, ANIM_TAG_UNUSED_FURY_SWIPES }, - { gBattleAnimSpritePalette_117, ANIM_TAG_UNUSED_VINE_2 }, - { gBattleAnimSpritePalette_118, ANIM_TAG_UNUSED_TEETH }, - { gBattleAnimSpritePalette_119, ANIM_TAG_UNUSED_BONE }, - { gBattleAnimSpritePalette_120, ANIM_TAG_UNUSED_WHITE_BAG }, - { gBattleAnimSpritePalette_121, ANIM_TAG_UNUSED_UNKNOWN }, - { gBattleAnimSpritePalette_122, ANIM_TAG_UNUSED_PURPLE_CORAL }, - { gBattleAnimSpritePalette_122, ANIM_TAG_UNUSED_PURPLE_DROPLET }, - { gBattleAnimSpritePalette_124, ANIM_TAG_UNUSED_SHOCK_2 }, - { gBattleAnimSpritePalette_125, ANIM_TAG_UNUSED_CLOSING_EYE_2 }, - { gBattleAnimSpritePalette_126, ANIM_TAG_UNUSED_METAL_BALL }, - { gBattleAnimSpritePalette_127, ANIM_TAG_UNUSED_MONSTER_DOLL }, - { gBattleAnimSpritePalette_128, ANIM_TAG_UNUSED_WHIRLWIND }, - { gBattleAnimSpritePalette_128, ANIM_TAG_UNUSED_WHIRLWIND_2 }, - { gBattleAnimSpritePalette_130, ANIM_TAG_UNUSED_EXPLOSION_4 }, - { gBattleAnimSpritePalette_130, ANIM_TAG_UNUSED_EXPLOSION_5 }, - { gBattleAnimSpritePalette_132, ANIM_TAG_UNUSED_TONGUE }, - { gBattleAnimSpritePalette_133, ANIM_TAG_UNUSED_SMOKE }, - { gBattleAnimSpritePalette_133, ANIM_TAG_UNUSED_SMOKE_2 }, - { gBattleAnimSpritePalette_135, ANIM_TAG_IMPACT }, - { gBattleAnimSpritePalette_136, ANIM_TAG_CIRCLE_IMPACT }, - { gBattleAnimSpritePalette_135, ANIM_TAG_SCRATCH }, - { gBattleAnimSpritePalette_135, ANIM_TAG_CUT }, - { gBattleAnimSpritePalette_139, ANIM_TAG_SHARP_TEETH }, - { gBattleAnimSpritePalette_140, ANIM_TAG_RAINBOW_RINGS }, - { gBattleAnimSpritePalette_141, ANIM_TAG_ICE_CRYSTALS }, - { gBattleAnimSpritePalette_141, ANIM_TAG_ICE_SPIKES }, - { gBattleAnimSpritePalette_143, ANIM_TAG_HANDS_AND_FEET }, - { gBattleAnimSpritePalette_144, ANIM_TAG_MIST_CLOUD }, - { gBattleAnimSpritePalette_139, ANIM_TAG_CLAMP }, - { gBattleAnimSpritePalette_115, ANIM_TAG_BUBBLE }, - { gBattleAnimSpritePalette_147, ANIM_TAG_ORBS }, - { gBattleAnimSpritePalette_148, ANIM_TAG_WATER_IMPACT }, - { gBattleAnimSpritePalette_148, ANIM_TAG_WATER_ORB }, - { gBattleAnimSpritePalette_150, ANIM_TAG_POISON_BUBBLE }, - { gBattleAnimSpritePalette_150, ANIM_TAG_TOXIC_BUBBLE }, - { gBattleAnimSpritePalette_152, ANIM_TAG_SPIKES }, - { gBattleAnimSpritePalette_153, ANIM_TAG_HORN_HIT_2 }, - { gBattleAnimSpritePalette_154, ANIM_TAG_AIR_WAVE_2 }, - { gBattleAnimSpritePalette_155, ANIM_TAG_SMALL_BUBBLES }, - { gBattleAnimSpritePalette_156, ANIM_TAG_ROUND_SHADOW }, - { gBattleAnimSpritePalette_157, ANIM_TAG_SUNLIGHT }, - { gBattleAnimSpritePalette_158, ANIM_TAG_SPORE }, - { gBattleAnimSpritePalette_159, ANIM_TAG_FLOWER }, - { gBattleAnimSpritePalette_160, ANIM_TAG_RAZOR_LEAF }, - { gBattleAnimSpritePalette_161, ANIM_TAG_NEEDLE }, - { gBattleAnimSpritePalette_162, ANIM_TAG_WHIRLWIND_LINES }, - { gBattleAnimSpritePalette_163, ANIM_TAG_GOLD_RING }, - { gBattleAnimSpritePalette_164, ANIM_TAG_PURPLE_RING }, - { gBattleAnimSpritePalette_165, ANIM_TAG_BLUE_RING }, - { gBattleAnimSpritePalette_166, ANIM_TAG_GREEN_LIGHT_WALL }, - { gBattleAnimSpritePalette_167, ANIM_TAG_BLUE_LIGHT_WALL }, - { gBattleAnimSpritePalette_168, ANIM_TAG_RED_LIGHT_WALL }, - { gBattleAnimSpritePalette_169, ANIM_TAG_GRAY_LIGHT_WALL }, - { gBattleAnimSpritePalette_170, ANIM_TAG_ORANGE_LIGHT_WALL }, - { gBattleAnimSpritePalette_171, ANIM_TAG_BLACK_BALL_2 }, - { gBattleAnimSpritePalette_172, ANIM_TAG_PURPLE_GAS_CLOUD }, - { gBattleAnimSpritePalette_001, ANIM_TAG_SPARK_H }, - { gBattleAnimSpritePalette_174, ANIM_TAG_YELLOW_STAR }, - { gBattleAnimSpritePalette_175, ANIM_TAG_LARGE_FRESH_EGG }, - { gBattleAnimSpritePalette_176, ANIM_TAG_SHADOW_BALL }, - { gBattleAnimSpritePalette_177, ANIM_TAG_LICK }, - { gBattleAnimSpritePalette_178, ANIM_TAG_UNUSED_VOID_LINES }, - { gBattleAnimSpritePalette_179, ANIM_TAG_STRING }, - { gBattleAnimSpritePalette_179, ANIM_TAG_STRING_DOT }, - { gBattleAnimSpritePalette_179, ANIM_TAG_WEB }, - { gBattleAnimSpritePalette_182, ANIM_TAG_UNUSED_LIGHTBULB }, - { gBattleAnimSpritePalette_183, ANIM_TAG_SLASH }, - { gBattleAnimSpritePalette_184, ANIM_TAG_FOCUS_ENERGY }, - { gBattleAnimSpritePalette_185, ANIM_TAG_SPHERE_TO_CUBE }, - { gBattleAnimSpritePalette_186, ANIM_TAG_TENDRILS }, - { gBattleAnimSpritePalette_187, ANIM_TAG_EYE }, - { gBattleAnimSpritePalette_188, ANIM_TAG_WHITE_SHADOW }, - { gBattleAnimSpritePalette_189, ANIM_TAG_TEAL_ALERT }, - { gBattleAnimSpritePalette_190, ANIM_TAG_OPENING_EYE }, - { gBattleAnimSpritePalette_191, ANIM_TAG_ROUND_WHITE_HALO }, - { gBattleAnimSpritePalette_192, ANIM_TAG_FANG_ATTACK }, - { gBattleAnimSpritePalette_193, ANIM_TAG_PURPLE_HAND_OUTLINE }, - { gBattleAnimSpritePalette_194, ANIM_TAG_MOON }, - { gBattleAnimSpritePalette_195, ANIM_TAG_SPARKLE_5 }, - { gBattleAnimSpritePalette_196, ANIM_TAG_SPIRAL }, - { gBattleAnimSpritePalette_197, ANIM_TAG_SNORE_Z }, - { gBattleAnimSpritePalette_198, ANIM_TAG_EXPLOSION }, - { gBattleAnimSpritePalette_199, ANIM_TAG_NAIL }, - { gBattleAnimSpritePalette_200, ANIM_TAG_GHOSTLY_SPIRIT }, - { gBattleAnimSpritePalette_201, ANIM_TAG_WARM_ROCK }, - { gBattleAnimSpritePalette_202, ANIM_TAG_BREAKING_EGG }, - { gBattleAnimSpritePalette_203, ANIM_TAG_THIN_RING }, - { gBattleAnimSpritePalette_204, ANIM_TAG_UNUSED_PUNCH_IMPACT }, - { gBattleAnimSpritePalette_205, ANIM_TAG_BELL }, - { gBattleAnimSpritePalette_206, ANIM_TAG_MUSIC_NOTES_2 }, - { gBattleAnimSpritePalette_207, ANIM_TAG_SPEED_DUST }, - { gBattleAnimSpritePalette_167, ANIM_TAG_TORN_METAL }, - { gBattleAnimSpritePalette_209, ANIM_TAG_THOUGHT_BUBBLE }, - { gBattleAnimSpritePalette_210, ANIM_TAG_MAGENTA_HEART }, - { gBattleAnimSpritePalette_211, ANIM_TAG_ELECTRIC_ORBS }, - { gBattleAnimSpritePalette_211, ANIM_TAG_CIRCLE_OF_LIGHT }, - { gBattleAnimSpritePalette_211, ANIM_TAG_ELECTRICITY }, - { gBattleAnimSpritePalette_064, ANIM_TAG_FINGER_2 }, - { gBattleAnimSpritePalette_215, ANIM_TAG_MOVEMENT_WAVES }, - { gBattleAnimSpritePalette_216, ANIM_TAG_RED_HEART }, - { gBattleAnimSpritePalette_217, ANIM_TAG_RED_ORB }, - { gBattleAnimSpritePalette_218, ANIM_TAG_EYE_SPARKLE }, - { gBattleAnimSpritePalette_219, ANIM_TAG_PINK_HEART }, - { gBattleAnimSpritePalette_220, ANIM_TAG_ANGEL }, - { gBattleAnimSpritePalette_221, ANIM_TAG_DEVIL }, - { gBattleAnimSpritePalette_222, ANIM_TAG_SWIPE }, - { gBattleAnimSpritePalette_223, ANIM_TAG_ROOTS }, - { gBattleAnimSpritePalette_224, ANIM_TAG_ITEM_BAG }, - { gBattleAnimSpritePalette_225, ANIM_TAG_JAGGED_MUSIC_NOTE }, - { gBattleAnimSpritePalette_226, ANIM_TAG_POKEBALL }, - { gBattleAnimSpritePalette_226, ANIM_TAG_SPOTLIGHT }, - { gBattleAnimSpritePalette_228, ANIM_TAG_LETTER_Z }, - { gBattleAnimSpritePalette_229, ANIM_TAG_RAPID_SPIN }, - { gBattleAnimSpritePalette_230, ANIM_TAG_TRI_FORCE_TRIANGLE }, - { gBattleAnimSpritePalette_231, ANIM_TAG_WISP_ORB }, - { gBattleAnimSpritePalette_231, ANIM_TAG_WISP_FIRE }, - { gBattleAnimSpritePalette_233, ANIM_TAG_GOLD_STARS }, - { gBattleAnimSpritePalette_234, ANIM_TAG_ECLIPSING_ORB }, - { gBattleAnimSpritePalette_235, ANIM_TAG_GRAY_ORB }, - { gBattleAnimSpritePalette_236, ANIM_TAG_BLUE_ORB }, - { gBattleAnimSpritePalette_237, ANIM_TAG_RED_ORB_2 }, - { gBattleAnimSpritePalette_238, ANIM_TAG_PINK_PETAL }, - { gBattleAnimSpritePalette_239, ANIM_TAG_PAIN_SPLIT }, - { gBattleAnimSpritePalette_240, ANIM_TAG_CONFETTI }, - { gBattleAnimSpritePalette_241, ANIM_TAG_GREEN_STAR }, - { gBattleAnimSpritePalette_242, ANIM_TAG_PINK_CLOUD }, - { gBattleAnimSpritePalette_243, ANIM_TAG_SWEAT_DROP }, - { gBattleAnimSpritePalette_244, ANIM_TAG_GUARD_RING }, - { gBattleAnimSpritePalette_245, ANIM_TAG_PURPLE_SCRATCH }, - { gBattleAnimSpritePalette_245, ANIM_TAG_PURPLE_SWIPE }, - { gBattleAnimSpritePalette_064, ANIM_TAG_TAG_HAND }, - { gBattleAnimSpritePalette_248, ANIM_TAG_SMALL_RED_EYE }, - { gBattleAnimSpritePalette_249, ANIM_TAG_HOLLOW_ORB }, - { gBattleAnimSpritePalette_249, ANIM_TAG_X_SIGN }, - { gBattleAnimSpritePalette_251, ANIM_TAG_BLUEGREEN_ORB }, - { gBattleAnimSpritePalette_252, ANIM_TAG_PAW_PRINT }, - { gBattleAnimSpritePalette_253, ANIM_TAG_PURPLE_FLAME }, - { gBattleAnimSpritePalette_254, ANIM_TAG_RED_BALL }, - { gBattleAnimSpritePalette_255, ANIM_TAG_SMELLINGSALT_EFFECT }, - { gBattleAnimSpritePalette_256, ANIM_TAG_METEOR }, - { gBattleAnimSpritePalette_257, ANIM_TAG_FLAT_ROCK }, - { gBattleAnimSpritePalette_258, ANIM_TAG_MAGNIFYING_GLASS }, - { gBattleAnimSpritePalette_259, ANIM_TAG_BROWN_ORB }, - { gBattleAnimSpritePalette_260, ANIM_TAG_METAL_SOUND_WAVES }, - { gBattleAnimSpritePalette_261, ANIM_TAG_FLYING_DIRT }, - { gBattleAnimSpritePalette_262, ANIM_TAG_ICICLE_SPEAR }, - { gBattleAnimSpritePalette_263, ANIM_TAG_HAIL }, - { gBattleAnimSpritePalette_264, ANIM_TAG_GLOWY_RED_ORB }, - { gBattleAnimSpritePalette_265, ANIM_TAG_GLOWY_GREEN_ORB }, - { gBattleAnimSpritePalette_266, ANIM_TAG_GREEN_SPIKE }, - { gBattleAnimSpritePalette_267, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT }, - { gBattleAnimSpritePalette_268, ANIM_TAG_GLOWY_BLUE_ORB }, - { gBattleAnimSpritePalette_269, ANIM_TAG_UNUSED_RED_BRICK }, - { gBattleAnimSpritePalette_270, ANIM_TAG_WHITE_FEATHER }, - { gBattleAnimSpritePalette_271, ANIM_TAG_SPARKLE_6 }, - { gBattleAnimSpritePalette_272, ANIM_TAG_SPLASH }, - { gBattleAnimSpritePalette_272, ANIM_TAG_SWEAT_BEAD }, - { gBattleAnimSpritePalette_274, ANIM_TAG_UNUSED_GEM_1 }, - { gBattleAnimSpritePalette_274, ANIM_TAG_UNUSED_GEM_2 }, - { gBattleAnimSpritePalette_274, ANIM_TAG_UNUSED_GEM_3 }, - { gBattleAnimSpritePalette_277, ANIM_TAG_SLAM_HIT_2 }, - { gBattleAnimSpritePalette_278, ANIM_TAG_RECYCLE }, - { gBattleAnimSpritePalette_279, ANIM_TAG_UNUSED_RED_PARTICLES }, - { gBattleAnimSpritePalette_280, ANIM_TAG_PROTECT }, - { gBattleAnimSpritePalette_281, ANIM_TAG_DIRT_MOUND }, - { gBattleAnimSpritePalette_282, ANIM_TAG_SHOCK_3 }, - { gBattleAnimSpritePalette_283, ANIM_TAG_WEATHER_BALL }, - { gBattleAnimSpritePalette_284, ANIM_TAG_BIRD }, - { gBattleAnimSpritePalette_285, ANIM_TAG_CROSS_IMPACT }, - { gBattleAnimSpritePalette_286, ANIM_TAG_SLASH_2 }, - { gBattleAnimSpritePalette_287, ANIM_TAG_WHIP_HIT }, - { gBattleAnimSpritePalette_288, ANIM_TAG_BLUE_RING_2 }, -}; - -const struct BattleAnimBackground gBattleAnimBackgroundTable[] = -{ - &gBattleAnimBackgroundImage_00, &gBattleAnimBackgroundPalette_00, &gBattleAnimBackgroundTilemap_00, - &gBattleAnimBackgroundImage_00, &gBattleAnimBackgroundPalette_00, &gBattleAnimBackgroundTilemap_00, - &gBattleAnimBackgroundImage_02, &gBattleAnimBackgroundPalette_02, &gBattleAnimBackgroundTilemap_02, - &gBattleAnimBackgroundImage_03, &gBattleAnimBackgroundPalette_03, &gBattleAnimBackgroundTilemap_03, - &gBattleAnimBackgroundImage_04, &gBattleAnimBackgroundPalette_04, &gBattleAnimBackgroundTilemap_04, - &gBattleAnimBackgroundImage_04, &gBattleAnimBackgroundPalette_04, &gBattleAnimBackgroundTilemap_05, - &gBattleAnimBackgroundImage_04, &gBattleAnimBackgroundPalette_04, &gBattleAnimBackgroundTilemap_06, - &gBattleAnimBackgroundImage_07, &gBattleAnimBackgroundPalette_07, &gBattleAnimBackgroundTilemap_07, - &gBattleAnimBackgroundImage_07, &gBattleAnimBackgroundPalette_07, &gBattleAnimBackgroundTilemap_08, - &gBattleAnimBackgroundImage_09, &gBattleAnimBackgroundPalette_09, &gBattleAnimBackgroundTilemap_09, - &gBattleAnimBackgroundImage_09, &gBattleAnimBackgroundPalette_09, &gBattleAnimBackgroundTilemap_10, - &gBattleAnimBackgroundImage_11, &gBattleAnimBackgroundPalette_11, &gBattleAnimBackgroundTilemap_11, - &gBattleAnimBackgroundImage_12, &gBattleAnimBackgroundPalette_12, &gBattleAnimBackgroundTilemap_12, - &gBattleAnimBackgroundImage_12, &gBattleAnimBackgroundPalette_12, &gBattleAnimBackgroundTilemap_13, - &gBattleAnimBackgroundImage_12, &gBattleAnimBackgroundPalette_12, &gBattleAnimBackgroundTilemap_14, - &gBattleAnimBackgroundImage_15, &gBattleAnimBackgroundPalette_15, &gBattleAnimBackgroundTilemap_15, - &gBattleAnimBackgroundImage_16, &gBattleAnimBackgroundPalette_16, &gBattleAnimBackgroundTilemap_16, - &gBattleAnimBackgroundImage_17, &gBattleAnimBackgroundPalette_17, &gBattleAnimBackgroundTilemap_17, - &gBattleAnimBackgroundImage_07, &gBattleAnimBackgroundPalette_18, &gBattleAnimBackgroundTilemap_07, - &gBattleAnimBackgroundImage_07, &gBattleAnimBackgroundPalette_18, &gBattleAnimBackgroundTilemap_08, - &gBattleAnimBackgroundImage_20, &gBattleAnimBackgroundPalette_20, &gBattleAnimBackgroundTilemap_20, - &gBattleAnimBackgroundImage_21, &gBattleAnimBackgroundPalette_21, &gBattleAnimBackgroundTilemap_21, - &gBattleAnimBackgroundImage_09, &gBattleAnimBackgroundPalette_22, &gBattleAnimBackgroundTilemap_09, - &gBattleAnimBackgroundImage_09, &gBattleAnimBackgroundPalette_22, &gBattleAnimBackgroundTilemap_10, - &gBattleAnimBackgroundImage_04, &gBattleAnimBackgroundPalette_24, &gBattleAnimBackgroundTilemap_04, - &gBattleAnimBackgroundImage_04, &gBattleAnimBackgroundPalette_24, &gBattleAnimBackgroundTilemap_05, - &gBattleAnimBackgroundImage_04, &gBattleAnimBackgroundPalette_24, &gBattleAnimBackgroundTilemap_06, -}; - -extern u16 gBattlerPartyIndexes[4]; -extern u8 gBankSpriteIds[]; -extern u8 gBankAttacker; -extern u8 gBankTarget; - -// sBattleAnimScriptPtr is a pointer to the next set of battle script commands. -EWRAM_DATA const u8 *sBattleAnimScriptPtr = NULL; -EWRAM_DATA const u8 *gBattleAnimScriptRetAddr = NULL; -EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL; -EWRAM_DATA s8 gAnimFramesToWait = 0; -EWRAM_DATA u8 gAnimScriptActive = FALSE; -EWRAM_DATA u8 gAnimVisualTaskCount = 0; -EWRAM_DATA u8 gAnimSoundTaskCount = 0; -EWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL; -EWRAM_DATA s32 gAnimMoveDmg = 0; -EWRAM_DATA u16 gAnimMovePower = 0; -EWRAM_DATA u8 gAnimFriendship = 0; -EWRAM_DATA u16 gWeatherMoveAnim = 0; -EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0}; -EWRAM_DATA u8 gAnimMoveTurn = 0; -EWRAM_DATA u8 sAnimBackgroundFadeState = 0; -EWRAM_DATA u16 sAnimMoveIndex = 0; // set but unused. -EWRAM_DATA u8 gBattleAnimAttacker = 0; -EWRAM_DATA u8 gBattleAnimTarget = 0; -EWRAM_DATA u16 gAnimSpeciesByBanks[4] = {0}; -EWRAM_DATA u8 gUnknown_0202F7D2 = 0; // some global pan variable - -u16 gSoundAnimFramesToWait; -s16 gBattleAnimArgs[ANIM_ARGS_COUNT]; -u16 gAnimSpriteIndexArray[ANIM_SPRITE_INDEX_COUNT]; - -extern struct MusicPlayerInfo gMPlay_BGM; -extern struct MusicPlayerInfo gMPlay_SE1; -extern struct MusicPlayerInfo gMPlay_SE2; - -extern const u16 gSingingMoves[]; -extern const u8 *const gBattleAnims_Moves[]; - -static void RunAnimScriptCommand(void); -static void ScriptCmd_loadspritegfx(void); -static void ScriptCmd_unloadspritegfx(void); -static void ScriptCmd_createsprite(void); -static void ScriptCmd_createvisualtask(void); -static void ScriptCmd_delay(void); -static void ScriptCmd_waitforvisualfinish(void); -static void ScriptCmd_hang1(void); -static void ScriptCmd_hang2(void); -static void ScriptCmd_end(void); -static void ScriptCmd_playse(void); -static void ScriptCmd_monbg(void); -static void sub_8076380(void); -static void task_pA_ma0A_obj_to_bg_pal(u8); -static void ScriptCmd_clearmonbg(void); -static void sub_807672C(u8); -static void ScriptCmd_monbg_22(void); -static void ScriptCmd_clearmonbg_23(void); -static void sub_80769A4(u8); -static void ScriptCmd_setalpha(void); -static void ScriptCmd_setbldcnt(void); -static void ScriptCmd_blendoff(void); -static void ScriptCmd_call(void); -static void ScriptCmd_return(void); -static void ScriptCmd_setarg(void); -static void ScriptCmd_choosetwoturnanim(void); -static void ScriptCmd_jumpifmoveturn(void); -static void ScriptCmd_jump(void); -static void ScriptCmd_fadetobg(void); -static void ScriptCmd_fadetobgfromset(void); -static void Task_FadeToBg(u8); -static void LoadMoveBg(u16); -static void LoadDefaultBg(void); -static void ScriptCmd_restorebg(void); -static void ScriptCmd_waitbgfadeout(void); -static void ScriptCmd_waitbgfadein(void); -static void ScriptCmd_changebg(void); -static void ScriptCmd_playsewithpan(void); -static void ScriptCmd_setpan(void); -static void ScriptCmd_panse_1B(void); -static void Task_PanFromInitialToTarget(u8); -static void ScriptCmd_panse_26(void); -static void ScriptCmd_panse_27(void); -static void ScriptCmd_loopsewithpan(void); -static void Task_LoopAndPlaySE(u8); -static void ScriptCmd_waitplaysewithpan(void); -static void Task_WaitAndPlaySE(u8); -static void ScriptCmd_createsoundtask(void); -static void ScriptCmd_waitsound(void); -static void ScriptCmd_jumpargeq(void); -static void ScriptCmd_jumpifcontest(void); -static void ScriptCmd_monbgprio_28(void); -static void ScriptCmd_monbgprio_29(void); -static void ScriptCmd_monbgprio_2A(void); -static void ScriptCmd_invisible(void); -static void ScriptCmd_visible(void); -static void ScriptCmd_doublebattle_2D(void); -static void ScriptCmd_doublebattle_2E(void); -static void ScriptCmd_stopsound(void); - -static void (*const sScriptCmdTable[])(void) = { - ScriptCmd_loadspritegfx, - ScriptCmd_unloadspritegfx, - ScriptCmd_createsprite, - ScriptCmd_createvisualtask, - ScriptCmd_delay, - ScriptCmd_waitforvisualfinish, - ScriptCmd_hang1, - ScriptCmd_hang2, - ScriptCmd_end, - ScriptCmd_playse, - ScriptCmd_monbg, - ScriptCmd_clearmonbg, - ScriptCmd_setalpha, - ScriptCmd_blendoff, - ScriptCmd_call, - ScriptCmd_return, - ScriptCmd_setarg, - ScriptCmd_choosetwoturnanim, - ScriptCmd_jumpifmoveturn, - ScriptCmd_jump, - ScriptCmd_fadetobg, - ScriptCmd_restorebg, - ScriptCmd_waitbgfadeout, - ScriptCmd_waitbgfadein, - ScriptCmd_changebg, - ScriptCmd_playsewithpan, - ScriptCmd_setpan, - ScriptCmd_panse_1B, - ScriptCmd_loopsewithpan, - ScriptCmd_waitplaysewithpan, - ScriptCmd_setbldcnt, - ScriptCmd_createsoundtask, - ScriptCmd_waitsound, - ScriptCmd_jumpargeq, - ScriptCmd_monbg_22, - ScriptCmd_clearmonbg_23, - ScriptCmd_jumpifcontest, - ScriptCmd_fadetobgfromset, - ScriptCmd_panse_26, - ScriptCmd_panse_27, - ScriptCmd_monbgprio_28, - ScriptCmd_monbgprio_29, - ScriptCmd_monbgprio_2A, - ScriptCmd_invisible, - ScriptCmd_visible, - ScriptCmd_doublebattle_2D, - ScriptCmd_doublebattle_2E, - ScriptCmd_stopsound, -}; - -void ClearBattleAnimationVars(void) -{ - s32 i; - - gAnimFramesToWait = 0; - gAnimScriptActive = FALSE; - gAnimVisualTaskCount = 0; - gAnimSoundTaskCount = 0; - gAnimDisableStructPtr = NULL; - gAnimMoveDmg = 0; - gAnimMovePower = 0; - gAnimFriendship = 0; - - // clear index array. - for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) - gAnimSpriteIndexArray[i] |= 0xFFFF; - - // clear anim args. - for (i = 0; i < ANIM_ARGS_COUNT; i++) - gBattleAnimArgs[i] = 0; - - gMonAnimTaskIdArray[0] = 0xFF; - gMonAnimTaskIdArray[1] = 0xFF; - gAnimMoveTurn = 0; - sAnimBackgroundFadeState = 0; - sAnimMoveIndex = 0; - gBattleAnimAttacker = 0; - gBattleAnimTarget = 0; - gUnknown_0202F7D2 = 0; -} - -void DoMoveAnim(u16 move) -{ - gBattleAnimAttacker = gBankAttacker; - gBattleAnimTarget = gBankTarget; - LaunchBattleAnimation(gBattleAnims_Moves, move, TRUE); -} - -void LaunchBattleAnimation(const u8 *const moveAnims[], u16 move, u8 isMoveAnim) -{ - s32 i; - - if (!IsContest()) - { - UpdateBattlerSpritePriorities(); - UpdateOamPriorityInAllHealthboxes(0); - for (i = 0; i < 4; i++) - { - if (GetBattlerSide(i) != 0) - gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); - else - gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); - } - } - else - { - for (i = 0; i < 4; i++) - gAnimSpeciesByBanks[i] = EWRAM_19348[0]; - } - - if (isMoveAnim == 0) - sAnimMoveIndex = 0; - else - sAnimMoveIndex = move; - - for (i = 0; i < ANIM_ARGS_COUNT; i++) - gBattleAnimArgs[i] = 0; - - gMonAnimTaskIdArray[0] = 0xFF; - gMonAnimTaskIdArray[1] = 0xFF; - sBattleAnimScriptPtr = moveAnims[move]; - gAnimScriptActive = TRUE; - gAnimFramesToWait = 0; - gAnimScriptCallback = RunAnimScriptCommand; - - for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) - gAnimSpriteIndexArray[i] |= 0xFFFF; - - if (isMoveAnim) - { - for (i = 0; gSingingMoves[i] != 0xFFFF; i++) - { - if (move == gSingingMoves[i]) - { - // Lower the volume for the short song that gets played. - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128); - break; - } - } - } - - gBattle_WIN0H = 0; - gBattle_WIN0V = 0; - gBattle_WIN1H = 0; - gBattle_WIN1V = 0; -} - -void DestroyAnimSprite(struct Sprite *sprite) -{ - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - gAnimVisualTaskCount--; -} - -void DestroyAnimVisualTask(u8 taskId) -{ - DestroyTask(taskId); - gAnimVisualTaskCount--; -} - -void DestroyAnimSoundTask(u8 taskId) -{ - DestroyTask(taskId); - gAnimSoundTaskCount--; -} - -static void AddSpriteIndex(u16 index) -{ - s32 i; - - for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) - { - if (gAnimSpriteIndexArray[i] == 0xFFFF) - { - gAnimSpriteIndexArray[i] = index; - return; - } - } -} - -static void ClearSpriteIndex(u16 index) -{ - s32 i; - - for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) - { - if (gAnimSpriteIndexArray[i] == index) - { - gAnimSpriteIndexArray[i] |= 0xFFFF; - return; - } - } -} - -static void WaitAnimFrameCount(void) -{ - if (gAnimFramesToWait <= 0) - { - gAnimScriptCallback = RunAnimScriptCommand; - gAnimFramesToWait = 0; - } - else - { - gAnimFramesToWait--; - } -} - -static void RunAnimScriptCommand(void) -{ - do - { - sScriptCmdTable[T1_READ_8(sBattleAnimScriptPtr)](); - } while (gAnimFramesToWait == 0 && gAnimScriptActive); -} - -// Loads sprite graphics used in a move into memory. -// arg 0: gfx ANIM_TAG -static void ScriptCmd_loadspritegfx(void) -{ - u16 tag; - - sBattleAnimScriptPtr++; - tag = T1_READ_16(sBattleAnimScriptPtr); - LoadCompressedObjectPic(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(tag)]); - LoadCompressedObjectPalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(tag)]); - sBattleAnimScriptPtr += 2; - AddSpriteIndex(GET_TRUE_SPRITE_INDEX(tag)); - gAnimFramesToWait = 1; - gAnimScriptCallback = WaitAnimFrameCount; -} - -// Frees sprite graphics from memory when move animation no longer needs them. -// arg0: gfx ANIM_TAG -static void ScriptCmd_unloadspritegfx(void) -{ - u16 tag; - - sBattleAnimScriptPtr++; - tag = T1_READ_16(sBattleAnimScriptPtr); - FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(tag)].tag); - FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(tag)].tag); - sBattleAnimScriptPtr += 2; - ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(tag)); -} - -// Creates a sprite from the given sprite template. -// arg0: SpriteTemplate -// arg1: s16[] gBattleAnimArgs -static void ScriptCmd_createsprite(void) -{ - s32 i; - const struct SpriteTemplate *template; - u8 argVar; - u8 argsCount; - s16 subpriority; - - sBattleAnimScriptPtr++; - template = (const struct SpriteTemplate *)(T2_READ_32(sBattleAnimScriptPtr)); - sBattleAnimScriptPtr += 4; - - argVar = T1_READ_8(sBattleAnimScriptPtr); - sBattleAnimScriptPtr++; - - argsCount = T1_READ_8(sBattleAnimScriptPtr); - sBattleAnimScriptPtr++; - for (i = 0; i < argsCount; i++) - { - gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr); - sBattleAnimScriptPtr += 2; - } - - if (argVar & 0x80) - { - argVar ^= 0x80; - if (argVar >= 0x40) - argVar -= 0x40; - else - argVar *= -1; - - subpriority = GetBattlerSubpriority(gBattleAnimTarget) + (s8)(argVar); - } - else - { - if (argVar >= 0x40) - argVar -= 0x40; - else - argVar *= -1; - - subpriority = GetBattlerSubpriority(gBattleAnimAttacker) + (s8)(argVar); - } - - if (subpriority < 3) - subpriority = 3; - - CreateSpriteAndAnimate(template, GetBattlerSpriteCoord(gBattleAnimTarget, 2), GetBattlerSpriteCoord(gBattleAnimTarget, 3), subpriority); - gAnimVisualTaskCount++; -} - -// Initializes an animation task. -// arg0: AnimTask function -// arg1: s16[] arguments -static void ScriptCmd_createvisualtask(void) -{ - TaskFunc taskFunc; - u8 taskPriority; - u8 taskId; - u8 numArgs; - s32 i; - - sBattleAnimScriptPtr++; - - taskFunc = (TaskFunc)T2_READ_32(sBattleAnimScriptPtr); - sBattleAnimScriptPtr += 4; - - taskPriority = T1_READ_8(sBattleAnimScriptPtr); - sBattleAnimScriptPtr++; - - numArgs = T1_READ_8(sBattleAnimScriptPtr); - sBattleAnimScriptPtr++; - - for (i = 0; i < numArgs; i++) - { - gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr); - sBattleAnimScriptPtr += 2; - } - - taskId = CreateTask(taskFunc, taskPriority); - taskFunc(taskId); - gAnimVisualTaskCount++; -} - -// Creates a visual delay. -// arg0: number of frames to wait. -static void ScriptCmd_delay(void) -{ - sBattleAnimScriptPtr++; - gAnimFramesToWait = T1_READ_8(sBattleAnimScriptPtr); - if (gAnimFramesToWait == 0) - gAnimFramesToWait = -1; - sBattleAnimScriptPtr++; - gAnimScriptCallback = WaitAnimFrameCount; -} - -// Wait for visual tasks to finish. -static void ScriptCmd_waitforvisualfinish(void) -{ - if (gAnimVisualTaskCount == 0) - { - sBattleAnimScriptPtr++; - gAnimFramesToWait = 0; - } - else - { - gAnimFramesToWait = 1; - } -} - -static void ScriptCmd_hang1(void) -{ -} - -static void ScriptCmd_hang2(void) -{ -} - -// Marks the end of an animation. Finishes the anims, tasks, and sound effects. -// started during an animaiton. -static void ScriptCmd_end(void) -{ - s32 i; - bool32 continuousAnim = FALSE; - - // keep waiting as long as there is animations to be done. - if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0 - || gMonAnimTaskIdArray[0] != 0xFF || gMonAnimTaskIdArray[1] != 0xFF) - { - gSoundAnimFramesToWait = 0; - gAnimFramesToWait = 1; - return; - } - - // finish the sound effects. - if (IsSEPlaying()) - { - if (++gSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect. - { - gAnimFramesToWait = 1; - return; - } - else - { - m4aMPlayStop(&gMPlay_SE1); - m4aMPlayStop(&gMPlay_SE2); - } - } - - // the SE has halted, so set the SE Frame Counter to 0 and continue. - gSoundAnimFramesToWait = 0; - - for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) - { - if (gAnimSpriteIndexArray[i] != 0xFFFF) - { - FreeSpriteTilesByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); - FreeSpritePaletteByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); - gAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator. - } - } - - if (!continuousAnim) // may have been used for debug? - { - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); - if (IsContest() == 0) - { - UpdateBattlerSpritePriorities(); - UpdateOamPriorityInAllHealthboxes(1); - } - gAnimScriptActive = FALSE; - } -} - -// Plays a sound effect. -// arg0: sound effect ID -static void ScriptCmd_playse(void) -{ - sBattleAnimScriptPtr++; - PlaySE(T1_READ_16(sBattleAnimScriptPtr)); - sBattleAnimScriptPtr += 2; -} - -// -// arg0: battler -static void ScriptCmd_monbg(void) -{ - u8 animBank; - u8 bank; - u8 identity; - bool8 toBG_2; - u16 spriteId; - u8 taskId; - - sBattleAnimScriptPtr++; - animBank = T1_READ_8(sBattleAnimScriptPtr); - if (animBank == ANIM_BATTLER_ATTACKER) - animBank = ANIM_BATTLER_ATK_PARTNER; - else if (animBank == ANIM_BATTLER_TARGET) - animBank = ANIM_BATTLER_DEF_PARTNER; - - if (animBank == ANIM_BATTLER_ATTACKER || animBank == ANIM_BATTLER_ATK_PARTNER) - bank = gBattleAnimAttacker; - else - bank = gBattleAnimTarget; - - if (IsAnimBankSpriteVisible(bank)) - { - identity = GetBattlerPosition(bank); - identity += 0xFF; - if (identity <= 1 || IsContest() != 0) - toBG_2 = 0; - else - toBG_2 = 1; - - MoveBattlerSpriteToBG(bank, toBG_2); - spriteId = gBankSpriteIds[bank]; - taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10); - gTasks[taskId].data[0] = spriteId; - gTasks[taskId].data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; - gTasks[taskId].data[2] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; - if (toBG_2 == 0) - { - gTasks[taskId].data[3] = gBattle_BG1_X; - gTasks[taskId].data[4] = gBattle_BG1_Y; - } - else - { - gTasks[taskId].data[3] = gBattle_BG2_X; - gTasks[taskId].data[4] = gBattle_BG2_Y; - } - gTasks[taskId].data[5] = toBG_2; - gTasks[taskId].data[6] = bank; - gMonAnimTaskIdArray[0] = taskId; - - } - - bank ^= 2; - if (animBank >= ANIM_BATTLER_ATK_PARTNER && IsAnimBankSpriteVisible(bank)) - { - identity = GetBattlerPosition(bank); - identity += 0xFF; - if (identity <= 1 || IsContest() != 0) - toBG_2 = 0; - else - toBG_2 = 1; - MoveBattlerSpriteToBG(bank, toBG_2); - spriteId = gBankSpriteIds[bank]; - taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10); - gTasks[taskId].data[0] = spriteId; - gTasks[taskId].data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; - gTasks[taskId].data[2] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; - if (toBG_2 == 0) - { - gTasks[taskId].data[3] = gBattle_BG1_X; - gTasks[taskId].data[4] = gBattle_BG1_Y; - } - else - { - gTasks[taskId].data[3] = gBattle_BG2_X; - gTasks[taskId].data[4] = gBattle_BG2_Y; - } - - gTasks[taskId].data[5] = toBG_2; - gTasks[taskId].data[6] = bank; - gMonAnimTaskIdArray[1] = taskId; - } - - sBattleAnimScriptPtr++; -} - -bool8 IsAnimBankSpriteVisible(u8 bank) -{ - if (IsContest()) - { - if (bank == gBattleAnimAttacker) - return TRUE; - else - return FALSE; - } - if (!IsBankSpritePresent(bank)) - return FALSE; - if (IsContest()) - return TRUE; // this line wont ever be reached. - if (!(EWRAM_17800[bank].unk0 & 1) || !gSprites[gBankSpriteIds[bank]].invisible) - return TRUE; - - return FALSE; -} - -void MoveBattlerSpriteToBG(u8 bank, u8 toBG_2) -{ - u8 spriteId; - - if (toBG_2 == 0) - { - volatile u8 pointlessZero; - struct UnknownStruct2 s; - u8 r2; - - sub_8078914(&s); - DmaFill32Large(3, 0, s.unk0, 0x2000, 0x1000); - pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? - pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? - DmaFill16Defvars(3, 0xFF, (void *)s.unk4, 0x1000); - - REG_BG1CNT_BITFIELD.priority = 2; - REG_BG1CNT_BITFIELD.screenSize = 1; - REG_BG1CNT_BITFIELD.areaOverflowMode = 0; - - spriteId = gBankSpriteIds[bank]; - gBattle_BG1_X = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32; - if (IsContest() != 0 && IsSpeciesNotUnown(EWRAM_19348[0]) != 0) - gBattle_BG1_X--; - gBattle_BG1_Y = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32; - gSprites[gBankSpriteIds[bank]].invisible = TRUE; - - REG_BG1HOFS = gBattle_BG1_X; - REG_BG1VOFS = gBattle_BG1_Y; - - LoadPalette(gPlttBufferUnfaded + 0x100 + bank * 16, s.unk8 * 16, 32); - DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + bank * 16, (u16 *)PLTT + s.unk8 * 16, 32); - - if (IsContest() != 0) - r2 = 0; - else - r2 = GetBattlerPosition(bank); - sub_80E4EF8(0, 0, r2, s.unk8, (u32)s.unk0, (((s32)s.unk4 - VRAM) / 2048), REG_BG1CNT_BITFIELD.charBaseBlock); - if (IsContest() != 0) - sub_8076380(); - } - else - { - volatile u8 pointlessZero; - - DmaFill32Large(3, 0, (void *)(VRAM + 0x6000), 0x2000, 0x1000); - pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? - pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? - DmaFill32Defvars(3, 0, (void *)(VRAM + 0xF000), 0x800); - - REG_BG2CNT_BITFIELD.priority = 2; - REG_BG2CNT_BITFIELD.screenSize = 1; - REG_BG2CNT_BITFIELD.areaOverflowMode = 0; - - spriteId = gBankSpriteIds[bank]; - gBattle_BG2_X = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32; - gBattle_BG2_Y = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32; - gSprites[gBankSpriteIds[bank]].invisible = TRUE; - - REG_BG2HOFS = gBattle_BG2_X; - REG_BG2VOFS = gBattle_BG2_Y; - - LoadPalette(gPlttBufferUnfaded + 0x100 + bank * 16, 0x90, 32); - DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + bank * 16, (void *)(PLTT + 0x120), 32); - - sub_80E4EF8(0, 0, GetBattlerPosition(bank), 9, 0x6000, 0x1E, REG_BG2CNT_BITFIELD.charBaseBlock); - } -} - -static void sub_8076380(void) -{ - int i; - int j; - struct UnknownStruct2 s; - u16 *ptr; - - if (IsSpeciesNotUnown(EWRAM_19348[0])) - { - sub_8078914(&s); - ptr = s.unk4; - for (i = 0; i < 8; i++) - { - for (j = 0; j < 4; j++) - { - u16 temp = ptr[j + i * 32]; - - ptr[j + i * 32] = ptr[7 - j + i * 32]; - ptr[7 - j + i * 32] = temp; - } - } - for (i = 0; i < 8; i++) - { - for (j = 0; j < 8; j++) - ptr[j + i * 32] ^= 0x400; - } - } -} - -void sub_80763FC(u16 a, u16 *b, u32 c, u8 d) -{ - u8 i; - u8 j; - u32 r9; - - if (d == 0) - r9 = 32; - else - r9 = 64; - a <<= 12; - for (i = 0; i < r9; i++) - { - for (j = 0; j < 32; j++) - b[j + i * 32] = ((b[j + i * 32] & 0xFFF) | a) + c; - } -} - -void sub_8076464(u8 a) -{ - volatile u8 pointlessZero; - struct UnknownStruct2 s; - - sub_8078914(&s); - if (a == 0 || IsContest() != 0) - { - DmaFill32Large(3, 0, s.unk0, 0x2000, 0x1000); - pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? - pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? - DmaFill32Defvars(3, 0, s.unk4, 0x800); - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - } - else - { - DmaFill32Large(3, 0, (void *)(VRAM + 0x6000), 0x2000, 0x1000); - pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? - pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in? - DmaFill32Defvars(3, 0, (void *)(VRAM + 0xF000), 0x800); - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - } -} - -static void task_pA_ma0A_obj_to_bg_pal(u8 taskId) -{ - u8 spriteId, palIndex; - s16 x, y; - struct UnknownStruct2 s; - - spriteId = gTasks[taskId].data[0]; - palIndex = gTasks[taskId].data[6]; - sub_8078914(&s); - x = gTasks[taskId].data[1] - (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x); - y = gTasks[taskId].data[2] - (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y); - - if (gTasks[taskId].data[5] == 0) - { - gBattle_BG1_X = x + gTasks[taskId].data[3]; - gBattle_BG1_Y = y + gTasks[taskId].data[4]; - DmaCopy32Defvars(3, gPlttBufferFaded + 0x100 + palIndex * 16, gPlttBufferFaded + 0x100 + s.unk8 * 16 - 256, 32); - } - else - { - gBattle_BG2_X = x + gTasks[taskId].data[3]; - gBattle_BG2_Y = y + gTasks[taskId].data[4]; - DmaCopy32Defvars(3, gPlttBufferFaded + 0x100 + palIndex * 16, gPlttBufferFaded + 0x100 - 112, 32); - } -} - -static void ScriptCmd_clearmonbg(void) -{ - u8 animBankId; - u8 bank; - u8 taskId; - - sBattleAnimScriptPtr++; - animBankId = T1_READ_8(sBattleAnimScriptPtr); - - if (animBankId == ANIM_BATTLER_ATTACKER) - animBankId = ANIM_BATTLER_ATK_PARTNER; - else if (animBankId == ANIM_BATTLER_TARGET) - animBankId = ANIM_BATTLER_DEF_PARTNER; - - if (animBankId == ANIM_BATTLER_ATTACKER || animBankId == ANIM_BATTLER_ATK_PARTNER) - bank = gBattleAnimAttacker; - else - bank = gBattleAnimTarget; - - if (gMonAnimTaskIdArray[0] != 0xFF) - gSprites[gBankSpriteIds[bank]].invisible = FALSE; - if (animBankId > 1 && gMonAnimTaskIdArray[1] != 0xFF) - gSprites[gBankSpriteIds[bank ^ 2]].invisible = FALSE; - else - animBankId = 0; - - taskId = CreateTask(sub_807672C, 5); - gTasks[taskId].data[0] = animBankId; - gTasks[taskId].data[2] = bank; - sBattleAnimScriptPtr++; -} - -static void sub_807672C(u8 taskId) -{ - u8 identity; - u8 to_BG2; - - gTasks[taskId].data[1]++; - if (gTasks[taskId].data[1] != 1) - { - identity = GetBattlerPosition(gTasks[taskId].data[2]); - identity += 0xFF; - if (identity <= 1 || IsContest() != 0) - to_BG2 = 0; - else - to_BG2 = 1; - if (gMonAnimTaskIdArray[0] != 0xFF) - { - sub_8076464(to_BG2); - DestroyTask(gMonAnimTaskIdArray[0]); - gMonAnimTaskIdArray[0] = 0xFF; - } - if (gTasks[taskId].data[0] > 1) - { - sub_8076464(to_BG2 ^ 1); - DestroyTask(gMonAnimTaskIdArray[1]); - gMonAnimTaskIdArray[1] = 0xFF; - } - DestroyTask(taskId); - } -} - -static void ScriptCmd_monbg_22(void) -{ - u8 animBankId; - u8 bank; - u8 identity; - u8 r1; - - sBattleAnimScriptPtr++; - animBankId = T1_READ_8(sBattleAnimScriptPtr); - - if (animBankId == ANIM_BATTLER_ATTACKER) - animBankId = ANIM_BATTLER_ATK_PARTNER; - else if (animBankId == ANIM_BATTLER_TARGET) - animBankId = ANIM_BATTLER_DEF_PARTNER; - - if (animBankId == ANIM_BATTLER_ATTACKER || animBankId == ANIM_BATTLER_ATK_PARTNER) - bank = gBattleAnimAttacker; - else - bank = gBattleAnimTarget; - - if (IsAnimBankSpriteVisible(bank)) - { - identity = GetBattlerPosition(bank); - identity += 0xFF; - if (identity <= 1 || IsContest() != 0) - r1 = 0; - else - r1 = 1; - MoveBattlerSpriteToBG(bank, r1); - gSprites[gBankSpriteIds[bank]].invisible = FALSE; - } - - bank ^= 2; - if (animBankId > ANIM_BATTLER_TARGET && IsAnimBankSpriteVisible(bank)) - { - identity = GetBattlerPosition(bank); - identity += 0xFF; - if (identity <= 1 || IsContest() != 0) - r1 = 0; - else - r1 = 1; - MoveBattlerSpriteToBG(bank, r1); - gSprites[gBankSpriteIds[bank]].invisible = FALSE; - } - sBattleAnimScriptPtr++; -} - -static void ScriptCmd_clearmonbg_23(void) -{ - u8 animBankId; - u8 bank; - u8 taskId; - - sBattleAnimScriptPtr++; - animBankId = T1_READ_8(sBattleAnimScriptPtr); - - if (animBankId == ANIM_BATTLER_ATTACKER) - animBankId = ANIM_BATTLER_ATK_PARTNER; - else if (animBankId == ANIM_BATTLER_TARGET) - animBankId = ANIM_BATTLER_DEF_PARTNER; - - if (animBankId == ANIM_BATTLER_ATTACKER || animBankId == ANIM_BATTLER_ATK_PARTNER) - bank = gBattleAnimAttacker; - else - bank = gBattleAnimTarget; - - if (IsAnimBankSpriteVisible(bank)) - gSprites[gBankSpriteIds[bank]].invisible = FALSE; - if (animBankId > 1 && IsAnimBankSpriteVisible(bank ^ 2)) - gSprites[gBankSpriteIds[bank ^ 2]].invisible = FALSE; - else - animBankId = 0; - - taskId = CreateTask(sub_80769A4, 5); - gTasks[taskId].data[0] = animBankId; - gTasks[taskId].data[2] = bank; - - sBattleAnimScriptPtr++; -} - -static void sub_80769A4(u8 taskId) -{ - u8 identity; - u8 bank; - u8 toBG_2; - - gTasks[taskId].data[1]++; - if (gTasks[taskId].data[1] != 1) - { - bank = gTasks[taskId].data[2]; - identity = GetBattlerPosition(bank); - identity += 0xFF; - if (identity <= 1 || IsContest() != 0) - toBG_2 = 0; - else - toBG_2 = 1; - if (IsAnimBankSpriteVisible(bank)) - sub_8076464(toBG_2); - if (gTasks[taskId].data[0] > 1 && IsAnimBankSpriteVisible(bank ^ 2)) - sub_8076464(toBG_2 ^ 1); - DestroyTask(taskId); - } -} - -// Sets transparency of sprite. -// arg0: sprite alpha value -// arg1: background alpha value -static void ScriptCmd_setalpha(void) -{ - u16 spriteAlpha, bgAlpha; - - sBattleAnimScriptPtr++; - spriteAlpha = *(sBattleAnimScriptPtr++); - bgAlpha = *(sBattleAnimScriptPtr++) << 8; - REG_BLDCNT = BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_EFFECT_BLEND; - REG_BLDALPHA = spriteAlpha | bgAlpha; -} - -static void ScriptCmd_setbldcnt(void) -{ - u16 half1, half2; - - sBattleAnimScriptPtr++; - half1 = *(sBattleAnimScriptPtr++); - half2 = *(sBattleAnimScriptPtr++) << 8; - REG_BLDCNT = half1 | half2; -} - -// Turns off alpha blending / semi transparency. -static void ScriptCmd_blendoff(void) -{ - sBattleAnimScriptPtr++; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; -} - -// Calls another animation by resetting sBattleAnimScriptPtr. -// arg0: Function -static void ScriptCmd_call(void) -{ - sBattleAnimScriptPtr++; - gBattleAnimScriptRetAddr = sBattleAnimScriptPtr + 4; - sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr); -} - -// Returns to the function that called this. -static void ScriptCmd_return(void) -{ - sBattleAnimScriptPtr = gBattleAnimScriptRetAddr; -} - -// Sets a value into gBattleAnimArgs[8] -// arg0: index / arg number -// arg1: value to set -static void ScriptCmd_setarg(void) -{ - const u8 *addr = sBattleAnimScriptPtr; - u16 value; - u8 argId; - - sBattleAnimScriptPtr++; - argId = T1_READ_8(sBattleAnimScriptPtr); - sBattleAnimScriptPtr++; - value = T1_READ_16(sBattleAnimScriptPtr); - sBattleAnimScriptPtr = addr + 4; - gBattleAnimArgs[argId] = value; -} - -// Flips between the first and second step of a move with two turns. -// arg0: first turn animation -// arg1: second turn animation -static void ScriptCmd_choosetwoturnanim(void) -{ - sBattleAnimScriptPtr++; - if (gAnimMoveTurn & 1) - sBattleAnimScriptPtr += 4; - sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr); -} - -// Jump to specified step of multi turn moves. -// arg0: move turn -// arg1: turn animation -static void ScriptCmd_jumpifmoveturn(void) -{ - u8 toCheck; - - sBattleAnimScriptPtr++; - toCheck = T1_READ_8(sBattleAnimScriptPtr); - sBattleAnimScriptPtr++; - - if (toCheck == gAnimMoveTurn) - { - sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr); - } - else - { - sBattleAnimScriptPtr += 4; - } -} - -// Jump to another animation. -// arg0: new animation -static void ScriptCmd_jump(void) -{ - sBattleAnimScriptPtr++; - sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr); -} - -bool8 IsContest(void) -{ - if (!gMain.inBattle) - return TRUE; - else - return FALSE; -} - -#define tBackgroundId data[0] -#define tState data[10] - -// Fades the screen and sets new background image. -// arg0: background ID -static void ScriptCmd_fadetobg(void) -{ - u8 backgroundId; - u8 taskId; - - sBattleAnimScriptPtr++; - backgroundId = T1_READ_8(sBattleAnimScriptPtr); - sBattleAnimScriptPtr++; - taskId = CreateTask(Task_FadeToBg, 5); - gTasks[taskId].tBackgroundId = backgroundId; - sAnimBackgroundFadeState = 1; -} - -// Fades to background image based on context of move (contest, battle) -// arg0: opponent background image ID -// arg1: player background image ID -// arg2: contest background image ID -static void ScriptCmd_fadetobgfromset(void) -{ - u8 bg1, bg2, bg3; - u8 taskId; - - sBattleAnimScriptPtr++; - bg1 = sBattleAnimScriptPtr[0]; - bg2 = sBattleAnimScriptPtr[1]; - bg3 = sBattleAnimScriptPtr[2]; - sBattleAnimScriptPtr += 3; - taskId = CreateTask(Task_FadeToBg, 5); - - if (IsContest()) - gTasks[taskId].tBackgroundId = bg3; - else if (GetBattlerSide(gBattleAnimTarget) == 0) - gTasks[taskId].tBackgroundId = bg2; - else - gTasks[taskId].tBackgroundId = bg1; - - sAnimBackgroundFadeState = 1; -} - -static void Task_FadeToBg(u8 taskId) -{ - if (gTasks[taskId].tState == 0) - { - BeginHardwarePaletteFade(0xE8, 0, 0, 16, 0); - gTasks[taskId].tState++; - return; - } - if (gPaletteFade.active) - return; - if (gTasks[taskId].tState == 1) - { - gTasks[taskId].tState++; - sAnimBackgroundFadeState = 2; - } - else if (gTasks[taskId].tState == 2) - { - s16 bgId = (u16)gTasks[taskId].tBackgroundId; - - if (bgId == -1) - LoadDefaultBg(); - else - LoadMoveBg(bgId); - - BeginHardwarePaletteFade(0xE8, 0, 16, 0, 1); - gTasks[taskId].tState++; - return; - } - if (gPaletteFade.active) - return; - if (gTasks[taskId].tState == 3) - { - DestroyTask(taskId); - sAnimBackgroundFadeState = 0; - } -} - -static void LoadMoveBg(u16 bgId) -{ - if (IsContest()) - { - void *tilemap = gBattleAnimBackgroundTable[bgId].tilemap; - - LZDecompressWram(tilemap, IsContest() ? EWRAM_14800 : EWRAM_18000); - sub_80763FC(sub_80789BC(), IsContest() ? EWRAM_14800 : EWRAM_18000, 0x100, 0); - DmaCopy32Defvars(3, IsContest() ? EWRAM_14800 : EWRAM_18000, (void *)(VRAM + 0xD000), 0x800); - LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(VRAM + 0x2000)); - LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, sub_80789BC() * 16, 32); - } - else - { - LZDecompressVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)(VRAM + 0xD000)); - LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(VRAM + 0x8000)); - LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, 32, 32); - } -} - -static void LoadDefaultBg(void) -{ - if (IsContest()) - LoadContestBgAfterMoveAnim(); - else - DrawMainBattleBackground(); -} - -// Restores default background image. -static void ScriptCmd_restorebg(void) -{ - u8 taskId; - - sBattleAnimScriptPtr++; - taskId = CreateTask(Task_FadeToBg, 5); - gTasks[taskId].tBackgroundId = 0xFFFF; - sAnimBackgroundFadeState = 1; -} - -#undef tBackgroundId -#undef tState - -// Wait for background image fade out to compete. -static void ScriptCmd_waitbgfadeout(void) -{ - if (sAnimBackgroundFadeState == 2) - { - sBattleAnimScriptPtr++; - gAnimFramesToWait = 0; - } - else - { - gAnimFramesToWait = 1; - } -} - -// Wait for background image fade in to compete. -static void ScriptCmd_waitbgfadein(void) -{ - if (sAnimBackgroundFadeState == 0) - { - sBattleAnimScriptPtr++; - gAnimFramesToWait = 0; - } - else - { - gAnimFramesToWait = 1; - } -} - -// Change background. -// arg0: background image ID -static void ScriptCmd_changebg(void) -{ - sBattleAnimScriptPtr++; - LoadMoveBg(T1_READ_8(sBattleAnimScriptPtr)); - sBattleAnimScriptPtr++; -} - -//Weird control flow -/* -s8 BattleAnimAdjustPanning(s8 a) -{ - if (!IsContest() && (EWRAM_17810[gBattleAnimAttacker].unk0 & 0x10)) - { - a = GetBattlerSide(gBattleAnimAttacker) ? SOUND_PAN_ATTACKER : SOUND_PAN_TARGET; - } - //_08076FDC - else - { - if (IsContest()) - { - if (gBattleAnimAttacker == gBattleAnimTarget && gBattleAnimAttacker == 2 - && a == SOUND_PAN_TARGET) - { - //jump to _0807707A - if (a < SOUND_PAN_ATTACKER_NEG) - a = SOUND_PAN_ATTACKER; - return a; - } - } - //_08077004 - else - { - if (GetBattlerSide(gBattleAnimAttacker) == 0) - { - if (GetBattlerSide(gBattleAnimTarget) == 0) - } - //_08077042 - else - { - - } - //_0807706C - } - } - //_0807706E -} -*/ -NAKED -s8 BattleAnimAdjustPanning(s8 a) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - bl IsContest\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08076FDC\n\ - ldr r0, _08076FD4 @ =gBattleAnimAttacker\n\ - ldrb r2, [r0]\n\ - lsls r0, r2, 1\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - ldr r1, _08076FD8 @ =gSharedMem + 0x17810\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08076FDC\n\ - adds r0, r2, 0\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - movs r4, 0xC0\n\ - cmp r0, 0\n\ - beq _0807706E\n\ - movs r4, 0x3F\n\ - b _0807706E\n\ - .align 2, 0\n\ -_08076FD4: .4byte gBattleAnimAttacker\n\ -_08076FD8: .4byte gSharedMem + 0x17810\n\ -_08076FDC:\n\ - bl IsContest\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08077004\n\ - ldr r0, _08076FFC @ =gBattleAnimAttacker\n\ - ldr r1, _08077000 @ =gBattleAnimTarget\n\ - ldrb r0, [r0]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bne _08077068\n\ - cmp r0, 0x2\n\ - bne _08077068\n\ - cmp r4, 0x3F\n\ - beq _0807707A\n\ - b _08077068\n\ - .align 2, 0\n\ -_08076FFC: .4byte gBattleAnimAttacker\n\ -_08077000: .4byte gBattleAnimTarget\n\ -_08077004:\n\ - ldr r0, _0807702C @ =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08077042\n\ - ldr r0, _08077030 @ =gBattleAnimTarget\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0807706E\n\ - lsls r0, r4, 24\n\ - asrs r1, r0, 24\n\ - cmp r1, 0x3F\n\ - bne _08077034\n\ - movs r4, 0xC0\n\ - b _0807706E\n\ - .align 2, 0\n\ -_0807702C: .4byte gBattleAnimAttacker\n\ -_08077030: .4byte gBattleAnimTarget\n\ -_08077034:\n\ - movs r0, 0x40\n\ - negs r0, r0\n\ - cmp r1, r0\n\ - beq _0807706E\n\ - negs r0, r1\n\ - lsls r0, 24\n\ - b _0807706C\n\ -_08077042:\n\ - ldr r0, _08077064 @ =gBattleAnimTarget\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _08077068\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - movs r1, 0x40\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bne _0807706E\n\ - movs r4, 0x3F\n\ - b _0807706E\n\ - .align 2, 0\n\ -_08077064: .4byte gBattleAnimTarget\n\ -_08077068:\n\ - lsls r0, r4, 24\n\ - negs r0, r0\n\ -_0807706C:\n\ - lsrs r4, r0, 24\n\ -_0807706E:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3F\n\ - ble _0807707A\n\ - movs r4, 0x3F\n\ - b _08077088\n\ -_0807707A:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - movs r1, 0x40\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _08077088\n\ - movs r4, 0xC0\n\ -_08077088:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} - -s8 BattleAnimAdjustPanning2(s8 pan) -{ - if (!IsContest() && (EWRAM_17810[gBattleAnimAttacker].unk0 & 0x10)) - { - if (GetBattlerSide(gBattleAnimAttacker) != 0) - pan = SOUND_PAN_TARGET; - else - pan = SOUND_PAN_ATTACKER; - } - else - { - if (GetBattlerSide(gBattleAnimAttacker) != 0 || IsContest() != 0) - pan = -pan; - } - return pan; -} - -s16 sub_8077104(s16 newPan, int oldPan) -{ - s16 var = newPan; - - if (var > SOUND_PAN_TARGET) - var = SOUND_PAN_TARGET; - else if (var < SOUND_PAN_ATTACKER_NEG) - var = SOUND_PAN_ATTACKER_NEG; - return var; -} - -s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan) -{ - u16 ret; - - if (sourcePan < targetPan) - ret = ((incrementPan < 0) ? -incrementPan : incrementPan); - else if (sourcePan > targetPan) - ret = -((incrementPan < 0) ? -incrementPan : incrementPan); - else - ret = 0; - - return ret; -} - -static void ScriptCmd_playsewithpan(void) -{ - u16 soundId; - s8 pan; - - sBattleAnimScriptPtr++; - soundId = T1_READ_16(sBattleAnimScriptPtr); - pan = T1_READ_8(sBattleAnimScriptPtr + 2); - PlaySE12WithPanning(soundId, BattleAnimAdjustPanning(pan)); - sBattleAnimScriptPtr += 3; -} - -static void ScriptCmd_setpan(void) -{ - s8 pan; - - sBattleAnimScriptPtr++; - pan = T1_READ_8(sBattleAnimScriptPtr); - SE12PanpotControl(BattleAnimAdjustPanning(pan)); - sBattleAnimScriptPtr++; -} - -#define tInitialPan data[0] -#define tTargetPan data[1] -#define tIncrementPan data[2] -#define tFramesToWait data[3] -#define tCurrentPan data[4] -#define tFrameCounter data[8] - -static void ScriptCmd_panse_1B(void) -{ - u16 songNum; - s8 currentPanArg, incrementPan, incrementPanArg, currentPan, targetPan; - u8 framesToWait; - u8 taskId; - - sBattleAnimScriptPtr++; - songNum = T1_READ_16(sBattleAnimScriptPtr); - currentPanArg = T1_READ_8(sBattleAnimScriptPtr + 2); - incrementPan = T1_READ_8(sBattleAnimScriptPtr + 3); - incrementPanArg = T1_READ_8(sBattleAnimScriptPtr + 4); - framesToWait = T1_READ_8(sBattleAnimScriptPtr + 5); - - currentPan = BattleAnimAdjustPanning(currentPanArg); - targetPan = BattleAnimAdjustPanning(incrementPan); - incrementPan = CalculatePanIncrement(currentPan, targetPan, incrementPanArg); - taskId = CreateTask(Task_PanFromInitialToTarget, 1); - gTasks[taskId].tInitialPan = currentPan; - gTasks[taskId].tTargetPan = targetPan; - gTasks[taskId].tIncrementPan = incrementPan; - gTasks[taskId].tFramesToWait = framesToWait; - gTasks[taskId].tCurrentPan = currentPan; - - PlaySE12WithPanning(songNum, currentPan); - - gAnimSoundTaskCount++; - sBattleAnimScriptPtr += 6; -} - -void Task_PanFromInitialToTarget(u8 taskId) -{ - bool32 destroyTask = FALSE; - if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait) - { - s16 pan; - s16 initialPanning, targetPanning, currentPan, incrementPan; - - gTasks[taskId].tFrameCounter = 0; - initialPanning = gTasks[taskId].tInitialPan; - targetPanning = gTasks[taskId].tTargetPan; - currentPan = gTasks[taskId].tCurrentPan; - incrementPan = gTasks[taskId].tIncrementPan; - pan = currentPan + incrementPan; - gTasks[taskId].tCurrentPan = pan; - - if (incrementPan == 0) // If we're not incrementing, just cancel the task immediately - { - destroyTask = TRUE; - } - else if (initialPanning < targetPanning) // Panning increasing - { - if (pan >= targetPanning) // Target reached - destroyTask = TRUE; - } - else // Panning decreasing - { - if (pan <= targetPanning) // Target reached - destroyTask = TRUE; - } - - if (destroyTask) - { - pan = targetPanning; - DestroyTask(taskId); - gAnimSoundTaskCount--; - } - - SE12PanpotControl(pan); - } -} - -static void ScriptCmd_panse_26(void) -{ - u16 songId; - s8 currentPan, targetPan, incrementPan; - u8 framesToWait; - u8 taskId; - - sBattleAnimScriptPtr++; - songId = T1_READ_16(sBattleAnimScriptPtr); - currentPan = T1_READ_8(sBattleAnimScriptPtr + 2); - targetPan = T1_READ_8(sBattleAnimScriptPtr + 3); - incrementPan = T1_READ_8(sBattleAnimScriptPtr + 4); - framesToWait = T1_READ_8(sBattleAnimScriptPtr + 5); - - taskId = CreateTask(Task_PanFromInitialToTarget, 1); - gTasks[taskId].tInitialPan = currentPan; - gTasks[taskId].tTargetPan = targetPan; - gTasks[taskId].tIncrementPan = incrementPan; - gTasks[taskId].tFramesToWait = framesToWait; - gTasks[taskId].tCurrentPan = currentPan; - - PlaySE12WithPanning(songId, currentPan); - - gAnimSoundTaskCount++; - sBattleAnimScriptPtr += 6; -} - -static void ScriptCmd_panse_27(void) -{ - u16 songId; - u8 targetPanArg, incrementPanArg, currentPan, currentPanArg; - s8 targetPan, incrementPan, framesToWait; - u8 taskId; - - sBattleAnimScriptPtr++; - songId = T1_READ_16(sBattleAnimScriptPtr); - currentPanArg = T1_READ_8(sBattleAnimScriptPtr + 2); - targetPanArg = T1_READ_8(sBattleAnimScriptPtr + 3); - incrementPanArg = T1_READ_8(sBattleAnimScriptPtr + 4); - currentPan = T1_READ_8(sBattleAnimScriptPtr + 5); - - targetPan = BattleAnimAdjustPanning2(currentPanArg); - incrementPan = BattleAnimAdjustPanning2(targetPanArg); - framesToWait = BattleAnimAdjustPanning2(incrementPanArg); - - taskId = CreateTask(Task_PanFromInitialToTarget, 1); - gTasks[taskId].data[0] = targetPan; - gTasks[taskId].data[1] = incrementPan; - gTasks[taskId].data[2] = framesToWait; - gTasks[taskId].data[3] = currentPan; - gTasks[taskId].data[4] = targetPan; - - PlaySE12WithPanning(songId, targetPan); - - gAnimSoundTaskCount++; - sBattleAnimScriptPtr += 6; -} - -#undef tInitialPan -#undef tTargetPan -#undef tIncrementPan -#undef tFramesToWait -#undef tCurrentPan -#undef tFrameCounter - -#define tSongId data[0] -#define tPanning data[1] -#define tFramesToWait data[2] -#define tNumberOfPlays data[3] -#define tFrameCounter data[8] - -static void ScriptCmd_loopsewithpan(void) -{ - u16 songId; - s8 panningArg, panning; - u8 framesToWait, numberOfPlays; - u8 taskId; - - sBattleAnimScriptPtr++; - songId = T1_READ_16(sBattleAnimScriptPtr); - panningArg = T1_READ_8(sBattleAnimScriptPtr + 2); - framesToWait = T1_READ_8(sBattleAnimScriptPtr + 3); - numberOfPlays = T1_READ_8(sBattleAnimScriptPtr + 4); - panning = BattleAnimAdjustPanning(panningArg); - - taskId = CreateTask(Task_LoopAndPlaySE, 1); - gTasks[taskId].tSongId = songId; - gTasks[taskId].tPanning = panning; - gTasks[taskId].tFramesToWait = framesToWait; - gTasks[taskId].tNumberOfPlays = numberOfPlays; - gTasks[taskId].tFrameCounter = framesToWait; - gTasks[taskId].func(taskId); - - gAnimSoundTaskCount++; - sBattleAnimScriptPtr += 5; -} - -static void Task_LoopAndPlaySE(u8 taskId) -{ - if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait) - { - u16 songId; - s8 panning; - u8 numberOfPlays; - - gTasks[taskId].tFrameCounter = 0; - songId = gTasks[taskId].tSongId; - panning = gTasks[taskId].tPanning; - numberOfPlays = --gTasks[taskId].tNumberOfPlays; - PlaySE12WithPanning(songId, panning); - if (numberOfPlays == 0) - { - DestroyTask(taskId); - gAnimSoundTaskCount--; - } - } -} - -#undef tSongId -#undef tPanning -#undef tFramesToWait -#undef tNumberOfPlays -#undef tFrameCounter - -#define tSongId data[0] -#define tPanning data[1] -#define tFramesToWait data[2] - -static void ScriptCmd_waitplaysewithpan(void) -{ - u16 songId; - s8 panningArg, panning; - u8 framesToWait; - u8 taskId; - - sBattleAnimScriptPtr++; - songId = T1_READ_16(sBattleAnimScriptPtr); - panningArg = T1_READ_8(sBattleAnimScriptPtr + 2); - framesToWait = T1_READ_8(sBattleAnimScriptPtr + 3); - panning = BattleAnimAdjustPanning(panningArg); - - taskId = CreateTask(Task_WaitAndPlaySE, 1); - gTasks[taskId].tSongId = songId; - gTasks[taskId].tPanning = panning; - gTasks[taskId].tFramesToWait = framesToWait; - - gAnimSoundTaskCount++; - sBattleAnimScriptPtr += 4; -} - -static void Task_WaitAndPlaySE(u8 taskId) -{ - if (gTasks[taskId].tFramesToWait-- <= 0) - { - PlaySE12WithPanning(gTasks[taskId].tSongId, gTasks[taskId].tPanning); - DestroyTask(taskId); - gAnimSoundTaskCount--; - } -} - -#undef tSongId -#undef tPanning -#undef tFramesToWait - -// Creates a sound task. -// arg0: sound task function -// arg1: s16[] gBattleAnimArgs -static void ScriptCmd_createsoundtask(void) -{ - TaskFunc func; - u8 numArgs, taskId; - s32 i; - - sBattleAnimScriptPtr++; - func = (TaskFunc)T2_READ_32(sBattleAnimScriptPtr); - sBattleAnimScriptPtr += 4; - numArgs = T1_READ_8(sBattleAnimScriptPtr); - sBattleAnimScriptPtr++; - for (i = 0; i < numArgs; i++) - { - gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr); - sBattleAnimScriptPtr += 2; - } - taskId = CreateTask(func, 1); - func(taskId); - gAnimSoundTaskCount++; -} - -// Wait for sound effect to end. -static void ScriptCmd_waitsound(void) -{ - if (gAnimSoundTaskCount != 0) - { - gSoundAnimFramesToWait = 0; - gAnimFramesToWait = 1; - } - else if (IsSEPlaying()) - { - if (++gSoundAnimFramesToWait > 90) - { - m4aMPlayStop(&gMPlay_SE1); - m4aMPlayStop(&gMPlay_SE2); - gSoundAnimFramesToWait = 0; - } - else - { - gAnimFramesToWait = 1; - } - } - else - { - gSoundAnimFramesToWait = 0; - sBattleAnimScriptPtr++; - gAnimFramesToWait = 0; - } -} - -// Jump to animation based on gBattleAnimArgs[index] value. -// arg0: gBattleAnimArgs[] argument index -// arg1: value -// arg2: animation script -static void ScriptCmd_jumpargeq(void) -{ - u8 argId; - s16 valueToCheck; - - sBattleAnimScriptPtr++; - argId = T1_READ_8(sBattleAnimScriptPtr); - valueToCheck = T1_READ_16(sBattleAnimScriptPtr + 1); - - if (valueToCheck == gBattleAnimArgs[argId]) - sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr + 3); - else - sBattleAnimScriptPtr += 7; -} - -// If using move in contest, go to specific animation script. -// arg0: animation script -static void ScriptCmd_jumpifcontest(void) -{ - sBattleAnimScriptPtr++; - if (IsContest()) - sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr); - else - sBattleAnimScriptPtr += 4; -} - -static void ScriptCmd_monbgprio_28(void) -{ - u8 wantedBank; - u8 bank; - u8 bankIdentity; - - wantedBank = T1_READ_8(sBattleAnimScriptPtr + 1); - sBattleAnimScriptPtr += 2; - - if (wantedBank != 0) - bank = gBattleAnimTarget; - else - bank = gBattleAnimAttacker; - - bankIdentity = GetBattlerPosition(bank); - if (!IsContest() && (bankIdentity == 0 || bankIdentity == 3)) - { - REG_BG1CNT_BITFIELD.priority = 1; - REG_BG2CNT_BITFIELD.priority = 2; - } -} - -static void ScriptCmd_monbgprio_29(void) -{ - sBattleAnimScriptPtr++; - if (!IsContest()) - { - REG_BG1CNT_BITFIELD.priority = 1; - REG_BG2CNT_BITFIELD.priority = 2; - } -} - -static void ScriptCmd_monbgprio_2A(void) -{ - u8 wantedBank; - u8 bankIdentity; - u8 bank; - - wantedBank = T1_READ_8(sBattleAnimScriptPtr + 1); - sBattleAnimScriptPtr += 2; - if (GetBattlerSide(gBattleAnimAttacker) != GetBattlerSide(gBattleAnimTarget)) - { - if (wantedBank != 0) - bank = gBattleAnimTarget; - else - bank = gBattleAnimAttacker; - bankIdentity = GetBattlerPosition(bank); - if (!IsContest() && (bankIdentity == 0 || bankIdentity == 3)) - { - REG_BG1CNT_BITFIELD.priority = 1; - REG_BG2CNT_BITFIELD.priority = 2; - } - } -} - -// Sets sprite to be invisible. -// arg0: battler sprite ID -static void ScriptCmd_invisible(void) -{ - u8 spriteId; - - spriteId = GetAnimBattlerSpriteId(T1_READ_8(sBattleAnimScriptPtr + 1)); - if (spriteId != 0xFF) - gSprites[spriteId].invisible = TRUE; - - sBattleAnimScriptPtr += 2; -} - -// Sets aprite to be visible. -// arg0: battler sprite ID -static void ScriptCmd_visible(void) -{ - u8 spriteId; - - spriteId = GetAnimBattlerSpriteId(T1_READ_8(sBattleAnimScriptPtr + 1)); - if (spriteId != 0xFF) - gSprites[spriteId].invisible = FALSE; - - sBattleAnimScriptPtr += 2; -} - -static void ScriptCmd_doublebattle_2D(void) -{ - u8 wantedBank; - u8 r4; - u8 spriteId; - - wantedBank = T1_READ_8(sBattleAnimScriptPtr + 1); - sBattleAnimScriptPtr += 2; - if (!IsContest() && IsDoubleBattle() - && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) - { - if (wantedBank == 0) - { - r4 = GetBattlerPosition_permutated(gBattleAnimAttacker); - spriteId = GetAnimBattlerSpriteId(0); - } - else - { - r4 = GetBattlerPosition_permutated(gBattleAnimTarget); - spriteId = GetAnimBattlerSpriteId(1); - } - if (spriteId != 0xFF) - { - gSprites[spriteId].invisible = FALSE; - if (r4 == 2) - gSprites[spriteId].oam.priority = 3; - if (r4 == 1) - sub_8076464(0); - else - sub_8076464(1); - } - } -} - -static void ScriptCmd_doublebattle_2E(void) -{ - u8 wantedBank; - u8 r4; - u8 spriteId; - - wantedBank = T1_READ_8(sBattleAnimScriptPtr + 1); - sBattleAnimScriptPtr += 2; - if (!IsContest() && IsDoubleBattle() - && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) - { - if (wantedBank == 0) - { - r4 = GetBattlerPosition_permutated(gBattleAnimAttacker); - spriteId = GetAnimBattlerSpriteId(0); - } - else - { - r4 = GetBattlerPosition_permutated(gBattleAnimTarget); - spriteId = GetAnimBattlerSpriteId(1); - } - if (spriteId != 0xFF && r4 == 2) - { - gSprites[spriteId].oam.priority = 2; - } - } -} - -// Cease playing sounds. -static void ScriptCmd_stopsound(void) -{ - m4aMPlayStop(&gMPlay_SE1); - m4aMPlayStop(&gMPlay_SE2); - sBattleAnimScriptPtr++; -} diff --git a/src/battle/battle_anim_807B69C.c b/src/battle/battle_anim_807B69C.c deleted file mode 100644 index 90e6ce38c..000000000 --- a/src/battle/battle_anim_807B69C.c +++ /dev/null @@ -1,354 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_anim.h" -#include "blend_palette.h" -#include "decompress.h" -#include "palette.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" -#include "ewram.h" - -extern u8 gBattleAnimAttacker; -extern u8 gBattleAnimTarget; -extern bool8 gAnimScriptActive; -extern void (*gAnimScriptCallback)(void); -extern s16 gBattleAnimArgs[]; -extern u8 gBattleAnimTarget; -extern u8 gBankSpriteIds[]; -extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; -extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; -extern const u8 *const gBattleAnims_StatusConditions[]; -extern const struct OamData gOamData_837E05C; -extern const struct OamData gOamData_837DF24; - -extern u8 GetBattlerSpriteCoord(u8, u8); -extern void sub_80E32E0(u8); - - -static const struct Subsprite gSubspriteTable_83931B8[] = -{ - {.x = -16, .y = -16, .shape = ST_OAM_SQUARE, .size = 3, .tileOffset = 0, .priority = 2}, - {.x = -16, .y = 48, .shape = ST_OAM_H_RECTANGLE, .size = 3, .tileOffset = 64, .priority = 2}, - {.x = 48, .y = -16, .shape = ST_OAM_V_RECTANGLE, .size = 3, .tileOffset = 96, .priority = 2}, - {.x = 48, .y = 48, .shape = ST_OAM_SQUARE, .size = 2, .tileOffset = 128, .priority = 2}, -}; - -static const struct SubspriteTable gSubspriteTables_83931D8[] = -{ - {ARRAY_COUNT(gSubspriteTable_83931B8), gSubspriteTable_83931B8}, -}; - -static const struct SpriteTemplate gSpriteTemplate_83931E0 = -{ - .tileTag = ANIM_TAG_ICE_CUBE, - .paletteTag = ANIM_TAG_ICE_CUBE, - .oam = &gOamData_837E05C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -static void sub_807B870(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83931F8 = -{ - .tileTag = ANIM_TAG_CIRCLE_IMPACT, - .paletteTag = ANIM_TAG_CIRCLE_IMPACT, - .oam = &gOamData_837DF24, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_807B870, -}; - -static void sub_807B7E0(u8); -static void sub_807B8A4(struct Sprite *); -static void sub_807B9D8(u8); -static void sub_807BA24(u8); -static void sub_807BAD4(u8); -static void sub_807BB24(u8); -static void sub_807BDAC(u8); - -u8 unref_sub_807B69C(u8 a, u8 b) -{ - u8 spriteId1 = gBankSpriteIds[a]; - u8 taskId = CreateTask(sub_807B7E0, 10); - u8 spriteId2; - u8 i; - - LoadCompressedObjectPic(&gBattleAnimPicTable[136]); - LoadCompressedObjectPalette(&gBattleAnimPaletteTable[136]); - gTasks[taskId].data[0] = a; - if (b != 0) - { - gTasks[taskId].data[1] = 0x1F; - for (i = 0; i < 10; i++) - { - spriteId2 = CreateSprite(&gSpriteTemplate_83931F8, gSprites[spriteId1].pos1.x, gSprites[spriteId1].pos1.y + 32, 0); - gSprites[spriteId2].data[0] = i * 51; - gSprites[spriteId2].data[1] = -256; - gSprites[spriteId2].invisible = TRUE; - if (i > 4) - gSprites[spriteId2].data[6] = 21; - } - } - else - { - gTasks[taskId].data[1] = 0x7C00; - for (i = 0; i < 10; i++) - { - spriteId2 = CreateSprite(&gSpriteTemplate_83931F8, gSprites[spriteId1].pos1.x, gSprites[spriteId1].pos1.y - 32, 0); - gSprites[spriteId2].data[0] = i * 51; - gSprites[spriteId2].data[1] = 256; - gSprites[spriteId2].invisible = TRUE; - if (i > 4) - gSprites[spriteId2].data[6] = 21; - } - } - gSprites[spriteId2].data[7] = 1; - return taskId; -} - -static void sub_807B7E0(u8 taskId) -{ - if (gTasks[taskId].data[2] == 2) - { - gTasks[taskId].data[2] = 0; - BlendPalette(0x100 + gTasks[taskId].data[0] * 16, 16, gTasks[taskId].data[4], gTasks[taskId].data[1]); - if (gTasks[taskId].data[5] == 0) - { - gTasks[taskId].data[4]++; - if (gTasks[taskId].data[4] > 8) - gTasks[taskId].data[5] ^= 1; - } - else - { - u16 var = gTasks[taskId].data[4]; - - gTasks[taskId].data[4]--; - if (gTasks[taskId].data[4] < 0) - { - gTasks[taskId].data[4] = var; - gTasks[taskId].data[5] ^= 1; - gTasks[taskId].data[3]++; - if (gTasks[taskId].data[3] == 2) - DestroyTask(taskId); - } - } - } - else - { - gTasks[taskId].data[2]++; - } -} - -static void sub_807B870(struct Sprite *sprite) -{ - if (sprite->data[6] == 0) - { - sprite->invisible = FALSE; - sprite->callback = sub_807B8A4; - sub_807B8A4(sprite); - } - else - { - sprite->data[6] --; - } -} - -static void sub_807B8A4(struct Sprite *sprite) -{ - sprite->pos2.x = Cos(sprite->data[0], 32); - sprite->pos2.y = Sin(sprite->data[0], 8); - if (sprite->data[0] < 128) - sprite->subpriority = 29; - else - sprite->subpriority = 31; - sprite->data[0] = (sprite->data[0] + 8) & 0xFF; - sprite->data[5] += sprite->data[1]; - sprite->pos2.y += sprite->data[5] >> 8; - sprite->data[2]++; - if (sprite->data[2] == 52) - { - if (sprite->data[7] != 0) - DestroySpriteAndFreeResources(sprite); - else - DestroySprite(sprite); - } -} - -void sub_807B920(u8 taskId) -{ - s16 x = GetBattlerSpriteCoord(gBattleAnimTarget, 2) - 32; - s16 y = GetBattlerSpriteCoord(gBattleAnimTarget, 3) - 36; - u8 spriteId; - - if (IsContest()) - x -= 6; - REG_BLDCNT = 0x3F40; - REG_BLDALPHA = 0x1000; - spriteId = CreateSprite(&gSpriteTemplate_83931E0, x, y, 4); - SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83931D8); - gTasks[taskId].data[15] = spriteId; - gTasks[taskId].func = sub_807B9D8; -} - -static void sub_807B9D8(u8 taskId) -{ - gTasks[taskId].data[1]++; - if (gTasks[taskId].data[1] == 10) - { - gTasks[taskId].func = sub_807BA24; - gTasks[taskId].data[1] = 0; - } - else - { - u8 var = gTasks[taskId].data[1]; - - REG_BLDALPHA = ((16 - var) << 8) | var; - } -} - -static void sub_807BA24(u8 taskId) -{ - u8 r2 = IndexOfSpritePaletteTag(0x271A); - - if (gTasks[taskId].data[1]++ > 13) - { - gTasks[taskId].data[2]++; - if (gTasks[taskId].data[2] == 3) - { - u16 temp; - - temp = gPlttBufferFaded[0x100 + r2 * 16 + 13]; - gPlttBufferFaded[0x100 + r2 * 16 + 13] = gPlttBufferFaded[0x100 + r2 * 16 + 14]; - gPlttBufferFaded[0x100 + r2 * 16 + 14] = gPlttBufferFaded[0x100 + r2 * 16 + 15]; - gPlttBufferFaded[0x100 + r2 * 16 + 15] = temp; - - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3]++; - if (gTasks[taskId].data[3] == 3) - { - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[4]++; - if (gTasks[taskId].data[4] == 2) - { - gTasks[taskId].data[1] = 9; - gTasks[taskId].func = sub_807BAD4; - } - } - } - } -} - -static void sub_807BAD4(u8 taskId) -{ - gTasks[taskId].data[1]--; - if (gTasks[taskId].data[1] == -1) - { - gTasks[taskId].func = sub_807BB24; - gTasks[taskId].data[1] = 0; - } - else - { - u8 var = gTasks[taskId].data[1]; - - REG_BLDALPHA = ((16 - var) << 8) | var; - } -} - -static void sub_807BB24(u8 taskId) -{ - gTasks[taskId].data[1]++; - if (gTasks[taskId].data[1] == 37) - { - u8 spriteId = gTasks[taskId].data[15]; - - FreeSpriteOamMatrix(&gSprites[spriteId]); - DestroySprite(&gSprites[spriteId]); - } - else if (gTasks[taskId].data[1] == 39) - { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroyAnimVisualTask(taskId); - } -} - -void sub_807BB88(u8 taskId) -{ - s16 r5; - s16 r2; - s16 r3 = 0; - - switch (ewram17840.unk0) - { - case 15: r5 = 0; r2 = 0; break; - case 16: r5 = 0; r2 = 1; break; - case 17: r5 = 0; r2 = 3; break; - case 18: r5 = 0; r2 = 5; break; - case 19: r5 = 0; r2 = 6; break; - case 20: r5 = 0; r2 = 2; break; - case 21: r5 = 0; r2 = 4; break; - case 22: r5 = 1; r2 = 0; break; - case 23: r5 = 1; r2 = 1; break; - case 24: r5 = 1; r2 = 3; break; - case 25: r5 = 1; r2 = 5; break; - case 26: r5 = 1; r2 = 6; break; - case 27: r5 = 1; r2 = 2; break; - case 28: r5 = 1; r2 = 4; break; - case 39: r5 = 0; r2 = 0; r3 = 1; break; - case 40: r5 = 0; r2 = 1; r3 = 1; break; - case 41: r5 = 0; r2 = 3; r3 = 1; break; - case 42: r5 = 0; r2 = 5; r3 = 1; break; - case 43: r5 = 0; r2 = 6; r3 = 1; break; - case 44: r5 = 0; r2 = 2; r3 = 1; break; - case 45: r5 = 0; r2 = 4; r3 = 1; break; - case 46: r5 = 1; r2 = 0; r3 = 1; break; - case 47: r5 = 1; r2 = 1; r3 = 1; break; - case 48: r5 = 1; r2 = 3; r3 = 1; break; - case 49: r5 = 1; r2 = 5; r3 = 1; break; - case 50: r5 = 1; r2 = 6; r3 = 1; break; - case 51: r5 = 1; r2 = 2; r3 = 1; break; - case 52: r5 = 1; r2 = 4; r3 = 1; break; - case 55: r5 = 0; r2 = 0xFF; r3 = 0; break; - case 56: r5 = 0; r2 = 0xFF; r3 = 1; break; - case 57: r5 = 1; r2 = 0xFF; r3 = 0; break; - case 58: r5 = 1; r2 = 0xFF; r3 = 1; break; - - default: - DestroyAnimVisualTask(taskId); - return; - } - - gBattleAnimArgs[0] = r5; - gBattleAnimArgs[1] = r2; - gBattleAnimArgs[2] = 0; - gBattleAnimArgs[3] = 0; - gBattleAnimArgs[4] = r3; - gTasks[taskId].func = sub_80E32E0; - sub_80E32E0(taskId); -} - -void move_anim_start_t2(u8 a, u8 b) -{ - u8 taskId; - - gBattleAnimAttacker = a; - gBattleAnimTarget = a; - LaunchBattleAnimation(gBattleAnims_StatusConditions, b, 0); - taskId = CreateTask(sub_807BDAC, 10); - gTasks[taskId].data[0] = a; -} - -static void sub_807BDAC(u8 taskId) -{ - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - ewram17810[gTasks[taskId].data[0]].unk0_4 = 0; - DestroyTask(taskId); - } -} diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c deleted file mode 100644 index 5e713a3a7..000000000 --- a/src/battle/battle_anim_80A7E7C.c +++ /dev/null @@ -1,1072 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_anim.h" -#include "rom_8077ABC.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" - -#define SPRITE gSprites[TASK.data[0]] - -extern s16 gBattleAnimArgs[8]; - -extern u8 gBankSpriteIds[]; -extern s32 gAnimMoveDmg; -extern u16 gAnimMovePower; -extern u8 gBattleAnimAttacker; -extern u8 gBattleAnimTarget; - -static void AnimTask_ShakeMonStep(u8 taskId); -static void AnimTask_ShakeMon2Step(u8 taskId); -static void AnimTask_ShakeMonInPlaceStep(u8 taskId); -static void AnimTask_ShakeAndSinkMonStep(u8 taskId); -static void sub_80A8488(u8 taskId); -static void DoHorizontalLunge(struct Sprite *sprite); -static void ReverseHorizontalLungeDirection(struct Sprite *sprite); -static void DoVerticalDip(struct Sprite *sprite); -static void ReverseVerticalDipDirection(struct Sprite* sprite); -static void SlideMonToOriginalPos(struct Sprite *sprite); -static void SlideMonToOriginalPosStep(struct Sprite *sprite); -static void SlideMonToOffset(struct Sprite *sprite); -static void sub_80A8818(struct Sprite *sprite); -static void sub_80A88F0(struct Sprite *sprite); -static void AnimTask_WindUpLungePart1(u8 taskId); -static void AnimTask_WindUpLungePart2(u8 taskId); -static void AnimTask_SwayMonStep(u8 taskId); -static void AnimTask_ScaleMonAndRestoreStep(u8 taskId); -static void sub_80A8FD8(u8 taskId); -static void sub_80A913C(u8 taskId); - -const struct SpriteTemplate gHorizontalLungeSpriteTemplate = -{ - .tileTag = 0, - .paletteTag = 0, - .oam = &gDummyOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = DoHorizontalLunge, -}; - -const struct SpriteTemplate gVerticalDipSpriteTemplate = -{ - .tileTag = 0, - .paletteTag = 0, - .oam = &gDummyOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = DoVerticalDip, -}; - -const struct SpriteTemplate gSlideMonToOriginalPosSpriteTemplate = -{ - .tileTag = 0, - .paletteTag = 0, - .oam = &gDummyOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SlideMonToOriginalPos, -}; - -const struct SpriteTemplate gSlideMonToOffsetSpriteTemplate = -{ - .tileTag = 0, - .paletteTag = 0, - .oam = &gDummyOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SlideMonToOffset, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_83C2010 = -{ - .tileTag = 0, - .paletteTag = 0, - .oam = &gDummyOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80A8818, -}; - -// Task to facilitate simple shaking of a pokemon's picture in battle. -// The shaking alternates between the original position and the target position. -// arg 0: anim battler -// arg 1: x pixel offset -// arg 2: y pixel offset -// arg 3: num times to shake -// arg 4: frame delay -void AnimTask_ShakeMon(u8 taskId) -{ - u8 spriteId; - spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - if (spriteId == 0xff) - { - DestroyAnimVisualTask(taskId); - return; - } - gSprites[spriteId].pos2.x = gBattleAnimArgs[1]; - gSprites[spriteId].pos2.y = gBattleAnimArgs[2]; - TASK.data[0] = spriteId; - TASK.data[1] = gBattleAnimArgs[3]; - TASK.data[2] = gBattleAnimArgs[4]; - TASK.data[3] = gBattleAnimArgs[4]; - TASK.data[4] = gBattleAnimArgs[1]; - TASK.data[5] = gBattleAnimArgs[2]; - TASK.func = AnimTask_ShakeMonStep; - AnimTask_ShakeMonStep(taskId); -} - -static void AnimTask_ShakeMonStep(u8 taskId) -{ - if (TASK.data[3] == 0) - { - if (SPRITE.pos2.x == 0) - { - SPRITE.pos2.x = TASK.data[4]; - } - else - { - SPRITE.pos2.x = 0; - } - if (SPRITE.pos2.y == 0) - { - SPRITE.pos2.y = TASK.data[5]; - } - else - { - SPRITE.pos2.y = 0; - } - TASK.data[3] = TASK.data[2]; - if (--TASK.data[1] == 0) - { - SPRITE.pos2.x = 0; - SPRITE.pos2.y = 0; - DestroyAnimVisualTask(taskId); - return; - } - } - else - { - TASK.data[3]--; - } -} - -// Task to facilitate simple shaking of a pokemon's picture in battle. -// The shaking alternates between the positive and negative versions of the specified pixel offsets. -// arg 0: anim battler -// arg 1: x pixel offset -// arg 2: y pixel offset -// arg 3: num times to shake -// arg 4: frame delay -void AnimTask_ShakeMon2(u8 taskId) -{ - u8 sprite; - bool8 destroy; - u8 side; - destroy = FALSE; - if (gBattleAnimArgs[0] < 4) - { - sprite = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - if (sprite == 0xff) - { - DestroyAnimVisualTask(taskId); - return; - } - } - else if (gBattleAnimArgs[0] != 8) - { - switch (gBattleAnimArgs[0]) - { - case 4: - side = GetBattlerAtPosition(0); - break; - case 5: - side = GetBattlerAtPosition(2); - break; - case 6: - side = GetBattlerAtPosition(1); - break; - case 7: - default: - side = GetBattlerAtPosition(3); - break; - } - - if (IsAnimBankSpriteVisible(side) == FALSE) - destroy = TRUE; - - sprite = gBankSpriteIds[side]; - } - else - { - sprite = gBankSpriteIds[gBattleAnimAttacker]; - } - - if (destroy) - { - DestroyAnimVisualTask(taskId); - return; - } - - gSprites[sprite].pos2.x = gBattleAnimArgs[1]; - gSprites[sprite].pos2.y = gBattleAnimArgs[2]; - TASK.data[0] = sprite; - TASK.data[1] = gBattleAnimArgs[3]; - TASK.data[2] = gBattleAnimArgs[4]; - TASK.data[3] = gBattleAnimArgs[4]; - TASK.data[4] = gBattleAnimArgs[1]; - TASK.data[5] = gBattleAnimArgs[2]; - TASK.func = AnimTask_ShakeMon2Step; - TASK.func(taskId); -} - -static void AnimTask_ShakeMon2Step(u8 taskId) -{ - if (TASK.data[3] == 0) - { - if (SPRITE.pos2.x == TASK.data[4]) - SPRITE.pos2.x = -TASK.data[4]; - else - SPRITE.pos2.x = TASK.data[4]; - - if (SPRITE.pos2.y == TASK.data[5]) - SPRITE.pos2.y = -TASK.data[5]; - else - SPRITE.pos2.y = TASK.data[5]; - - TASK.data[3] = TASK.data[2]; - if (--TASK.data[1] == 0) - { - SPRITE.pos2.x = 0; - SPRITE.pos2.y = 0; - DestroyAnimVisualTask(taskId); - return; - } - } - else - { - TASK.data[3]--; - } -} - -// Task to facilitate simple shaking of a pokemon's picture in battle. -// The shaking alternates between the positive and negative versions of the specified pixel offsets -// with respect to the current location of the mon's picture. -// arg 0: battler -// arg 1: x offset -// arg 2: y offset -// arg 3: num shakes -// arg 4: delay -void AnimTask_ShakeMonInPlace(u8 taskId) -{ - u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - if (spriteId == 0xff) - { - DestroyAnimVisualTask(taskId); - return; - } - - gSprites[spriteId].pos2.x += gBattleAnimArgs[1]; - gSprites[spriteId].pos2.y += gBattleAnimArgs[2]; - TASK.data[0] = spriteId; - TASK.data[1] = 0; - TASK.data[2] = gBattleAnimArgs[3]; - TASK.data[3] = 0; - TASK.data[4] = gBattleAnimArgs[4]; - TASK.data[5] = gBattleAnimArgs[1] * 2; - TASK.data[6] = gBattleAnimArgs[2] * 2; - TASK.func = AnimTask_ShakeMonInPlaceStep; - TASK.func(taskId); -} - -static void AnimTask_ShakeMonInPlaceStep(u8 taskId) -{ - if (TASK.data[3] == 0) - { - if (TASK.data[1] & 1) - { - SPRITE.pos2.x += TASK.data[5]; - SPRITE.pos2.y += TASK.data[6]; - } - else - { - SPRITE.pos2.x -= TASK.data[5]; - SPRITE.pos2.y -= TASK.data[6]; - } - TASK.data[3] = TASK.data[4]; - if (++TASK.data[1] >= TASK.data[2]) - { - if (TASK.data[1] & 1) - { - SPRITE.pos2.x += TASK.data[5] / 2; - SPRITE.pos2.y += TASK.data[6] / 2; - } - else - { - SPRITE.pos2.x -= TASK.data[5] / 2; - SPRITE.pos2.y -= TASK.data[6] / 2; - } - DestroyAnimVisualTask(taskId); - return; - } - } - else - { - TASK.data[3]--; - } -} - -// Shakes a mon bg horizontally and moves it downward linearly. -// arg 0: battler -// arg 1: x offset -// arg 2: frame delay between each movement -// arg 3: downward speed (subpixel) -// arg 4: duration -void AnimTask_ShakeAndSinkMon(u8 taskId) -{ - u8 sprite = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - gSprites[sprite].pos2.x = gBattleAnimArgs[1]; - TASK.data[0] = sprite; - TASK.data[1] = gBattleAnimArgs[1]; - TASK.data[2] = gBattleAnimArgs[2]; - TASK.data[3] = gBattleAnimArgs[3]; - TASK.data[4] = gBattleAnimArgs[4]; - TASK.func = AnimTask_ShakeAndSinkMonStep; - TASK.func(taskId); -} - -static void AnimTask_ShakeAndSinkMonStep(u8 taskId) -{ - s16 x; - u8 sprite; - sprite = TASK.data[0]; - x = TASK.data[1]; - if (TASK.data[2] == TASK.data[8]++) - { - TASK.data[8] = 0; - if (gSprites[sprite].pos2.x == x) - x = -x; - - gSprites[sprite].pos2.x += x; - } - - TASK.data[1] = x; - TASK.data[9] += TASK.data[3]; - gSprites[sprite].pos2.y = TASK.data[9] >> 8; - if (--TASK.data[4] == 0) - { - DestroyAnimVisualTask(taskId); - return; - } -} - -// Moves a mon bg picture along an elliptical path that begins -// and ends at the mon's origin location. -// arg 0: battler -// arg 1: ellipse width -// arg 2: ellipse height -// arg 3: num loops -// arg 4: speed (valid values are 0-5) -void AnimTask_TranslateMonElliptical(u8 taskId) -{ - u8 i; - u8 spriteId; - u8 wavePeriod; - - wavePeriod = 1; - spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - if (gBattleAnimArgs[4] > 5) - gBattleAnimArgs[4] = 5; - - for (i = 0; i < gBattleAnimArgs[4]; i++) - { - wavePeriod <<= 1; - } - - TASK.data[0] = spriteId; - TASK.data[1] = gBattleAnimArgs[1]; - TASK.data[2] = gBattleAnimArgs[2]; - TASK.data[3] = gBattleAnimArgs[3]; - TASK.data[4] = wavePeriod; - TASK.func = sub_80A8488; - TASK.func(taskId); -} - -static void sub_80A8488(u8 taskId) -{ - u8 spriteId = TASK.data[0]; - gSprites[spriteId].pos2.x = Sin(TASK.data[5], TASK.data[1]); - gSprites[spriteId].pos2.y = -Cos(TASK.data[5], TASK.data[2]); - gSprites[spriteId].pos2.y += TASK.data[2]; - TASK.data[5] += TASK.data[4]; - TASK.data[5] &= 0xff; - - if (TASK.data[5] == 0) - TASK.data[3]--; - - if (TASK.data[3] == 0) - { - gSprites[spriteId].pos2.x = 0; - gSprites[spriteId].pos2.y = 0; - DestroyAnimVisualTask(taskId); - return; - } -} - -// Moves a mon bg picture along an elliptical path that begins -// and ends at the mon's origin location. Reverses the direction -// of the path if it's not on the player's side of the battle. -// arg 0: battler -// arg 1: ellipse width -// arg 2: ellipse height -// arg 3: num loops -// arg 4: speed (valid values are 0-5) -void AnimTask_TranslateMonEllipticalRespectSide(u8 taskId) -{ - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - - AnimTask_TranslateMonElliptical(taskId); -} - -// Performs a simple horizontal lunge, where the mon moves -// horizontally, and then moves back in the opposite direction. -// arg 0: duration of single lunge direction -// arg 1: x pixel delta that is applied each frame -static void DoHorizontalLunge(struct Sprite *sprite) -{ - sprite->invisible = TRUE; - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - sprite->data[1] = -gBattleAnimArgs[1]; - else - sprite->data[1] = gBattleAnimArgs[1]; - - sprite->data[0] = gBattleAnimArgs[0]; - sprite->data[2] = 0; - sprite->data[3] = gBankSpriteIds[gBattleAnimAttacker]; - sprite->data[4] = gBattleAnimArgs[0]; - StoreSpriteCallbackInData(sprite, ReverseHorizontalLungeDirection); - sprite->callback = TranslateMonBGUntil; -} - -static void ReverseHorizontalLungeDirection(struct Sprite *sprite) -{ - sprite->data[0] = sprite->data[4]; - sprite->data[1] = -sprite->data[1]; - sprite->callback = TranslateMonBGUntil; - StoreSpriteCallbackInData(sprite, DestroyAnimSprite); -} - -// Performs a simple vertical dipping motion, where moves vertically, and then -// moves back in the opposite direction. -// arg 0: duration of single dip direction -// arg 1: y pixel delta that is applied each frame -// arg 2: battler -static void DoVerticalDip(struct Sprite *sprite) -{ - u8 spriteId; - sprite->invisible = TRUE; - spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]); - sprite->data[0] = gBattleAnimArgs[0]; - sprite->data[1] = 0; - sprite->data[2] = gBattleAnimArgs[1]; - sprite->data[3] = spriteId; - sprite->data[4] = gBattleAnimArgs[0]; - StoreSpriteCallbackInData(sprite, ReverseVerticalDipDirection); - sprite->callback = TranslateMonBGUntil; -} - -static void ReverseVerticalDipDirection(struct Sprite *sprite) -{ - sprite->data[0] = sprite->data[4]; - sprite->data[2] = -sprite->data[2]; - sprite->callback = TranslateMonBGUntil; - StoreSpriteCallbackInData(sprite, DestroyAnimSprite); -} - -// Linearly slides a mon's bg picture back to its original sprite position. -// The sprite parameter is a dummy sprite used for facilitating the movement with its callback. -// arg 0: 1 = target or 0 = attacker -// arg 1: direction (0 = horizontal and vertical, 1 = horizontal only, 2 = vertical only) -// arg 2: duration -static void SlideMonToOriginalPos(struct Sprite *sprite) -{ - int something; - int monSpriteId; - if (!gBattleAnimArgs[0]) - monSpriteId = gBankSpriteIds[gBattleAnimAttacker]; - else - monSpriteId = gBankSpriteIds[gBattleAnimTarget]; - - sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[1] = gSprites[monSpriteId].pos1.x + gSprites[monSpriteId].pos2.x; - sprite->data[2] = gSprites[monSpriteId].pos1.x; - sprite->data[3] = gSprites[monSpriteId].pos1.y + gSprites[monSpriteId].pos2.y; - sprite->data[4] = gSprites[monSpriteId].pos1.y; - something = 0; - InitSpriteDataForLinearTranslation(sprite); - sprite->data[3] = something; - sprite->data[4] = something; - sprite->data[5] = gSprites[monSpriteId].pos2.x; - sprite->data[6] = gSprites[monSpriteId].pos2.y; - sprite->invisible = TRUE; - - if (gBattleAnimArgs[1] == 1) - sprite->data[2] = something; - else if (gBattleAnimArgs[1] == 2) - sprite->data[1] = something; - - sprite->data[7] = gBattleAnimArgs[1]; - sprite->data[7] |= monSpriteId << 8; - sprite->callback = SlideMonToOriginalPosStep; -} - -static void SlideMonToOriginalPosStep(struct Sprite *sprite) -{ - s8 monSpriteId; - u8 lo; - struct Sprite *monSprite; - - lo = sprite->data[7] & 0xff; - monSpriteId = sprite->data[7] >> 8; - monSprite = &gSprites[monSpriteId]; - if (sprite->data[0] == 0) - { - if (lo < 2) - monSprite->pos2.x = 0; - - if (lo == 2 || lo == 0) - monSprite->pos2.y = 0; - - DestroyAnimSprite(sprite); - } - else - { - sprite->data[0]--; - sprite->data[3] += sprite->data[1]; - sprite->data[4] += sprite->data[2]; - monSprite->pos2.x = (s8)(sprite->data[3] >> 8) + sprite->data[5]; - monSprite->pos2.y = (s8)(sprite->data[4] >> 8) + sprite->data[6]; - } -} - -// Linearly translates a mon to a target offset. The horizontal offset -// is mirrored for the opponent's pokemon, and the vertical offset -// is only mirrored if arg 3 is set to 1. -// arg 0: 0 = attacker, 1 = target -// arg 1: target x pixel offset -// arg 2: target y pixel offset -// arg 3: mirror vertical translation for opposite battle side -// arg 4: duration -static void SlideMonToOffset(struct Sprite *sprite) -{ - u8 battler; - u8 monSpriteId; - if (!gBattleAnimArgs[0]) - battler = gBattleAnimAttacker; - else - battler = gBattleAnimTarget; - - monSpriteId = gBankSpriteIds[battler]; - if (GetBattlerSide(battler) != B_SIDE_PLAYER) - { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - if (gBattleAnimArgs[3] == 1) - { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } - } - - sprite->data[0] = gBattleAnimArgs[4]; - sprite->data[1] = gSprites[monSpriteId].pos1.x; - sprite->data[2] = gSprites[monSpriteId].pos1.x + gBattleAnimArgs[1]; - sprite->data[3] = gSprites[monSpriteId].pos1.y; - sprite->data[4] = gSprites[monSpriteId].pos1.y + gBattleAnimArgs[2]; - InitSpriteDataForLinearTranslation(sprite); - sprite->data[3] = 0; - sprite->data[4] = 0; - sprite->data[5] = monSpriteId; - sprite->invisible = TRUE; - StoreSpriteCallbackInData(sprite, DestroyAnimSprite); - sprite->callback = TranslateMonBGSubPixelUntil; -} - -static void sub_80A8818(struct Sprite *sprite) -{ - u8 spriteId; - u8 v1; - sprite->invisible = TRUE; - if (!gBattleAnimArgs[0]) - { - v1 = gBattleAnimAttacker; - } - else - { - v1 = gBattleAnimTarget; - } - spriteId = gBankSpriteIds[v1]; - if (GetBattlerSide(v1)) - { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - if (gBattleAnimArgs[3] == 1) - { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } - } - sprite->data[0] = gBattleAnimArgs[4]; - sprite->data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; - sprite->data[2] = sprite->data[1] + gBattleAnimArgs[1]; - sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; - sprite->data[4] = sprite->data[3] + gBattleAnimArgs[2]; - InitSpriteDataForLinearTranslation(sprite); - sprite->data[3] = gSprites[spriteId].pos2.x << 8; - sprite->data[4] = gSprites[spriteId].pos2.y << 8; - sprite->data[5] = spriteId; - sprite->data[6] = gBattleAnimArgs[5]; - if (!gBattleAnimArgs[5]) - { - StoreSpriteCallbackInData(sprite, DestroyAnimSprite); - } - else - { - StoreSpriteCallbackInData(sprite, sub_80A88F0); - } - sprite->callback = TranslateMonBGSubPixelUntil; -} - - -static void sub_80A88F0(struct Sprite *sprite) -{ - gSprites[sprite->data[5]].pos2.x = 0; - gSprites[sprite->data[5]].pos2.y = 0; - DestroyAnimSprite(sprite); -} - -// Task to facilitate a two-part translation animation, in which the sprite -// is first translated in an arc to one position. Then, it "lunges" to a target -// x offset. Used in TAKE_DOWN, for example. -// arg 0: anim bank -// arg 1: horizontal speed (subpixel) -// arg 2: wave amplitude -// arg 3: first duration -// arg 4: delay before starting lunge -// arg 5: target x offset for lunge -// arg 6: lunge duration -void AnimTask_WindUpLunge(u8 taskId) -{ - s16 wavePeriod = 0x8000 / gBattleAnimArgs[3]; - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - gBattleAnimArgs[5] = -gBattleAnimArgs[5]; - } - TASK.data[0] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - TASK.data[1] = (gBattleAnimArgs[1] << 8) / gBattleAnimArgs[3]; - TASK.data[2] = gBattleAnimArgs[2]; - TASK.data[3] = gBattleAnimArgs[3]; - TASK.data[4] = gBattleAnimArgs[4]; - TASK.data[5] = (gBattleAnimArgs[5] << 8) / gBattleAnimArgs[6]; - TASK.data[6] = gBattleAnimArgs[6]; - TASK.data[7] = wavePeriod; - TASK.func = AnimTask_WindUpLungePart1; -} - -static void AnimTask_WindUpLungePart1(u8 taskId) -{ - u8 spriteId; - spriteId = TASK.data[0]; - TASK.data[11] += TASK.data[1]; - gSprites[spriteId].pos2.x = TASK.data[11] >> 8; - gSprites[spriteId].pos2.y = Sin((u8)(TASK.data[10] >> 8), TASK.data[2]); - TASK.data[10] += TASK.data[7]; - if (--TASK.data[3] == 0) - { - TASK.func = AnimTask_WindUpLungePart2; - } -} - -static void AnimTask_WindUpLungePart2(u8 taskId) -{ - u8 spriteId; - if (TASK.data[4] > 0) - { - TASK.data[4]--; - } - else - { - spriteId = TASK.data[0]; - TASK.data[12] += TASK.data[5]; - gSprites[spriteId].pos2.x = (TASK.data[12] >> 8) + (TASK.data[11] >> 8); - if (--TASK.data[6] == 0) - { - DestroyAnimVisualTask(taskId); - return; - } - } -} - -static void sub_80A8B3C(u8 taskId); - -void sub_80A8A80(u8 taskId) -{ - u8 spriteId; - switch (gBattleAnimArgs[0]) - { - case 0: - case 1: - spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - break; - case 2: - if (!IsAnimBankSpriteVisible(gBattleAnimAttacker ^ 2)) - { - DestroyAnimVisualTask(taskId); - return; - } - spriteId = gBankSpriteIds[gBattleAnimAttacker ^ 2]; - break; - case 3: - if (!IsAnimBankSpriteVisible(gBattleAnimTarget ^ 2)) - { - DestroyAnimVisualTask(taskId); - return; - } - spriteId = gBankSpriteIds[gBattleAnimTarget ^ 2]; - break; - default: - DestroyAnimVisualTask(taskId); - return; - } - TASK.data[0] = spriteId; - if (GetBattlerSide(gBattleAnimTarget)) - { - TASK.data[1] = gBattleAnimArgs[1]; - } - else - { - TASK.data[1] = -gBattleAnimArgs[1]; - } - TASK.func = sub_80A8B3C; -} - -static void sub_80A8B3C(u8 taskId) -{ - u8 spriteId = TASK.data[0]; - gSprites[spriteId].pos2.x += TASK.data[1]; - if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x + 0x20 > 0x130u) - { - DestroyAnimVisualTask(taskId); - return; - } -} - -// Task that facilitates translating the mon bg picture back and forth -// in a swaying motion (uses Sine wave). It can sway either horizontally -// or vertically, but not both. -// arg 0: direction (0 = horizontal, 1 = vertical) -// arg 1: wave amplitude -// arg 2: wave period -// arg 3: num sways -// arg 4: which mon (0 = attacker, 1`= target) -void AnimTask_SwayMon(u8 taskId) -{ - u8 spriteId; - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - - spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[4]); - TASK.data[0] = gBattleAnimArgs[0]; - TASK.data[1] = gBattleAnimArgs[1]; - TASK.data[2] = gBattleAnimArgs[2]; - TASK.data[3] = gBattleAnimArgs[3]; - TASK.data[4] = spriteId; - - if (gBattleAnimArgs[4] == 0) - TASK.data[5] = gBattleAnimAttacker; - else - TASK.data[5] = gBattleAnimTarget; - - TASK.data[12] = 1; - TASK.func = AnimTask_SwayMonStep; -} - -static void AnimTask_SwayMonStep(u8 taskId) -{ - s16 sineValue; - u8 spriteId; - int waveIndex; - u16 sineIndex; - - spriteId = TASK.data[4]; - sineIndex = TASK.data[10] + TASK.data[2]; - TASK.data[10] = sineIndex; - waveIndex = sineIndex >> 8; - sineValue = Sin(waveIndex, TASK.data[1]); - - if (TASK.data[0] == 0) - { - gSprites[spriteId].pos2.x = sineValue; - } - else - { - if (GetBattlerSide(TASK.data[5]) == B_SIDE_PLAYER) - { - gSprites[spriteId].pos2.y = (sineValue >= 0) ? sineValue : -sineValue; - } - else - { - gSprites[spriteId].pos2.y = (sineValue >= 0) ? -sineValue : sineValue; - } - } - - if (((waveIndex >= 0x80u) && (TASK.data[11] == 0) && (TASK.data[12] == 1)) - || ((waveIndex < 0x7fu) && (TASK.data[11] == 1) && (TASK.data[12] == 0))) - { - TASK.data[11] ^= 1; - TASK.data[12] ^= 1; - if (--TASK.data[3] == 0) - { - gSprites[spriteId].pos2.x = 0; - gSprites[spriteId].pos2.y = 0; - DestroyAnimVisualTask(taskId); - return; - } - } -} - -// Scales a mon's sprite, and then scales back to its original dimensions. -// arg 0: x scale delta -// arg 1: y scale delta -// arg 2: duration -// arg 3: anim bank -// arg 4: sprite object mode -void AnimTask_ScaleMonAndRestore(u8 taskId) -{ - u8 spriteId; - spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[3]); - PrepareBattlerSpriteForRotScale(spriteId, gBattleAnimArgs[4]); - TASK.data[0] = gBattleAnimArgs[0]; - TASK.data[1] = gBattleAnimArgs[1]; - TASK.data[2] = gBattleAnimArgs[2]; - TASK.data[3] = gBattleAnimArgs[2]; - TASK.data[4] = spriteId; - TASK.data[10] = 0x100; - TASK.data[11] = 0x100; - TASK.func = AnimTask_ScaleMonAndRestoreStep; -} - -static void AnimTask_ScaleMonAndRestoreStep(u8 taskId) -{ - u8 spriteId; - TASK.data[10] += TASK.data[0]; - TASK.data[11] += TASK.data[1]; - spriteId = TASK.data[4]; - obj_id_set_rotscale(spriteId, TASK.data[10], TASK.data[11], 0); - if (--TASK.data[2] == 0) - { - if (TASK.data[3] > 0) - { - TASK.data[0] = -TASK.data[0]; - TASK.data[1] = -TASK.data[1]; - TASK.data[2] = TASK.data[3]; - TASK.data[3] = 0; - } - else - { - sub_8078F40(spriteId); - DestroyAnimVisualTask(taskId); - return; - } - } -} - -void sub_80A8E04(u8 taskId) -{ - u8 spriteId; - spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]); - PrepareBattlerSpriteForRotScale(spriteId, 0); - TASK.data[1] = 0; - TASK.data[2] = gBattleAnimArgs[0]; - if (gBattleAnimArgs[3] != 1) - { - TASK.data[3] = 0; - } - else - { - TASK.data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1]; - } - TASK.data[4] = gBattleAnimArgs[1]; - TASK.data[5] = spriteId; - TASK.data[6] = gBattleAnimArgs[3]; - if (IsContest()) - { - TASK.data[7] = 1; - } - else - { - if (gBattleAnimArgs[2] == 0) - { - TASK.data[7] = !GetBattlerSide(gBattleAnimAttacker); - } - else - { - TASK.data[7] = !GetBattlerSide(gBattleAnimTarget); - } - } - if (TASK.data[7]) - { - if (!IsContest()) - { - TASK.data[3] *= -1; - TASK.data[4] *= -1; - } - } - TASK.func = sub_80A8FD8; -} - -void sub_80A8EFC(u8 taskId) -{ - u8 spriteId; - spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]); - PrepareBattlerSpriteForRotScale(spriteId, 0); - TASK.data[1] = 0; - TASK.data[2] = gBattleAnimArgs[0]; - if (gBattleAnimArgs[2] == 0) - { - if (GetBattlerSide(gBattleAnimAttacker)) - { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - } - } - else - { - if (GetBattlerSide(gBattleAnimTarget)) - { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - } - } - if (gBattleAnimArgs[3] != 1) - { - TASK.data[3] = 0; - } - else - { - TASK.data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1]; - } - TASK.data[4] = gBattleAnimArgs[1]; - TASK.data[5] = spriteId; - TASK.data[6] = gBattleAnimArgs[3]; - TASK.data[7] = 1; - TASK.data[3] *= -1; - TASK.data[4] *= -1; - TASK.func = sub_80A8FD8; -} - -static void sub_80A8FD8(u8 taskId) -{ - TASK.data[3] += TASK.data[4]; - obj_id_set_rotscale(TASK.data[5], 0x100, 0x100, TASK.data[3]); - if (TASK.data[7]) - { - sub_8078F9C(TASK.data[5]); - } - if (++TASK.data[1] >= TASK.data[2]) - { - switch (TASK.data[6]) - { - case 1: - sub_8078F40(TASK.data[5]); - case 0: - default: - DestroyAnimVisualTask(taskId); - return; - case 2: - TASK.data[1] = 0; - TASK.data[4] *= -1; - TASK.data[6] = 1; - break; - } - } -} - -void sub_80A9058(u8 taskId) -{ - if (!gBattleAnimArgs[0]) - { - TASK.data[15] = gAnimMovePower / 12; - if (TASK.data[15] < 1) - { - TASK.data[15] = 1; - } - if (TASK.data[15] > 16) - { - TASK.data[15] = 16; - } - } - else - { - TASK.data[15] = gAnimMoveDmg / 12; - if (TASK.data[15] < 1) - { - TASK.data[15] = 1; - } - if (TASK.data[15] > 16) - { - TASK.data[15] = 16; - } - } - TASK.data[14] = TASK.data[15] / 2; - TASK.data[13] = TASK.data[14] + (TASK.data[15] & 1); - TASK.data[12] = 0; - TASK.data[10] = gBattleAnimArgs[3]; - TASK.data[11] = gBattleAnimArgs[4]; - TASK.data[7] = GetAnimBattlerSpriteId(1); - TASK.data[8] = gSprites[TASK.data[7]].pos2.x; - TASK.data[9] = gSprites[TASK.data[7]].pos2.y; - TASK.data[0] = 0; - TASK.data[1] = gBattleAnimArgs[1]; - TASK.data[2] = gBattleAnimArgs[2]; - TASK.func = sub_80A913C; -} - -static void sub_80A913C(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - if (++task->data[0] > task->data[1]) - { - task->data[0] = 0; - task->data[12] = (task->data[12] + 1) & 1; - if (task->data[10]) - { - if (task->data[12]) - { - gSprites[task->data[7]].pos2.x = task->data[8] + task->data[13]; - } - else - { - gSprites[task->data[7]].pos2.x = task->data[8] - task->data[14]; - } - } - if (task->data[11]) - { - if (task->data[12]) - { - gSprites[task->data[7]].pos2.y = task->data[15]; - } - else - { - gSprites[task->data[7]].pos2.y = 0; - } - } - if (!--task->data[2]) - { - gSprites[task->data[7]].pos2.x = 0; - gSprites[task->data[7]].pos2.y = 0; - DestroyAnimVisualTask(taskId); - return; - } - } -} diff --git a/src/battle/battle_anim_80CA710.c b/src/battle/battle_anim_80CA710.c deleted file mode 100644 index 65ccd7c21..000000000 --- a/src/battle/battle_anim_80CA710.c +++ /dev/null @@ -1,18 +0,0 @@ - -// Includes -#include "global.h" - -// Static type declarations - -// Static RAM declarations - -IWRAM_DATA u32 filler_03000724; -IWRAM_DATA u16 gUnknown_03000728[4]; -IWRAM_DATA u16 gUnknown_03000730[6]; -IWRAM_DATA u32 filler_0300073c; - -// Static ROM declarations - -// .rodata - -// .text diff --git a/src/battle/battle_anim_812C144.c b/src/battle/battle_anim_812C144.c deleted file mode 100644 index 90e7d8e2c..000000000 --- a/src/battle/battle_anim_812C144.c +++ /dev/null @@ -1,6065 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_anim.h" -#include "blend_palette.h" -#include "contest.h" -#include "data2.h" -#include "decompress.h" -#include "ewram.h" -#include "palette.h" -#include "random.h" -#include "rom_8077ABC.h" -#include "scanline_effect.h" -#include "sound.h" -#include "trig.h" -#include "constants/songs.h" -#include "constants/species.h" - -extern s16 gBattleAnimArgs[]; -extern u8 gBattleAnimAttacker; -extern u8 gBattleAnimTarget; -extern u8 gAnimVisualTaskCount; -extern u8 gAnimFriendship; -extern s32 gAnimMoveDmg; -extern u16 gBattle_WIN0H; -extern u16 gBattle_WIN0V; -extern u16 gBattle_WIN1H; -extern u16 gBattle_WIN1V; -extern u16 gBattle_BG1_X; -extern u16 gBattle_BG1_Y; -extern u16 gBattle_BG2_X; -extern u16 gBattle_BG2_Y; -extern u16 gWeatherMoveAnim; - -extern const struct SpriteTemplate gBattleAnimSpriteTemplate_83D7220; -extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E7C18[]; -extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E7BEC[]; -extern const u32 gUnknown_08D2AA98[]; -extern const u32 gUnknown_08D2A9E0[]; -extern const u16 gUnknown_08D2AA80[]; -extern const u8 gUnknown_08D2E014[]; -extern const u8 gUnknown_08D2E170[]; -extern const u16 gUnknown_08D2E150[]; -extern u8 gBattleMonForms[]; -extern u8 gBankSpriteIds[]; -extern u16 gBattlerPartyIndexes[]; - -extern u8 sub_8046234(s16 x, s16 y, u8 a3); -extern void sub_80DA48C(struct Sprite *); -extern void sub_80E3C4C(u8 taskId, int unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u8 *arg8, const u8 *arg9, const u16 *palette); - -static void sub_812C184(struct Sprite *sprite); -static void sub_812C268(struct Sprite *sprite); -static void sub_812C2A4(struct Sprite *sprite); -static void sub_812C380(struct Sprite *sprite); -static void sub_812C40C(struct Sprite *sprite); -static void sub_812C450(struct Sprite *sprite); -static void sub_812C4FC(struct Sprite *sprite); -static void sub_812C588(u8 taskId); -static void sub_812C64C(u8 taskId); -static void sub_812C798(struct Sprite *sprite); -static void sub_812C7C8(struct Sprite *sprite); -static void sub_812CA04(struct Sprite *sprite); -static void sub_812CAD0(struct Sprite *sprite); -static void sub_812CBB4(struct Sprite *sprite); -static void sub_812CD64(struct Sprite *sprite); -static void sub_812CEF0(u8 taskId); -static void sub_812D06C(u8 taskId); -static void sub_812D254(struct Sprite *sprite); -static void sub_812D4EC(struct Sprite *sprite); -static void sub_812D5E8(struct Sprite *sprite); -static void sub_812DFEC(struct Sprite *sprite); -static void sub_812E09C(struct Sprite *sprite); -static void sub_812E0F8(struct Sprite *sprite); -static void sub_812E638(u8 taskId); -static void sub_812E7F0(struct Sprite *sprite); -static void sub_812E8B4(u8 taskId); -static void sub_812ED24(struct Sprite *sprite); -static void sub_812EE00(struct Sprite *sprite); -static void sub_812EEEC(struct Sprite *sprite); -static void AnimTask_RolePlaySilhouetteStep1(u8 taskId); -static void sub_812F290(u8 taskId); -static void sub_812F474(u8 taskId); -static void sub_812F76C(u8 taskId); -static void sub_812F8DC(struct Sprite *sprite); -static void sub_812FE20(u8 taskId); -static void sub_812FEB8(u8, bool8); -static void sub_813003C(u8 taskId); -static void sub_81301B4(struct Sprite *sprite); -static void sub_81302E4(u8 taskId); -static void sub_8130424(s16, s16, s16, s16, u8, u8, s16*, s16*); -static void sub_81306A4(u8 taskId); -static void sub_813085C(struct Sprite *sprite); -static void sub_8130970(u8 taskId); -static void sub_8130A94(struct Sprite *sprite); -static void sub_8130B38(struct Sprite *sprite); -static void sub_8130DBC(u8 taskId); -static void sub_8130FE0(struct Sprite *sprite); -static void sub_8131408(u8 taskId); -static void sub_81315C8(struct Sprite *sprite); -static void sub_8131810(u8 taskId); -static void sub_8131838(struct Sprite *sprite); -static void sub_812C144(struct Sprite *sprite); -static void sub_812C220(struct Sprite *sprite); -static void sub_812C2BC(struct Sprite *sprite); -static void sub_812C358(struct Sprite *sprite); -static void sub_812C720(struct Sprite *sprite); -static void sub_812C80C(struct Sprite *sprite); -static void sub_812C848(struct Sprite *sprite); -static void sub_812C908(struct Sprite *sprite); -static void sub_812C990(struct Sprite *sprite); -static void sub_812CAFC(struct Sprite *sprite); -static void sub_812CC28(struct Sprite *sprite); -static void sub_812CCE8(struct Sprite *sprite); -static void sub_812D294(struct Sprite *sprite); -static void sub_812D3AC(struct Sprite *sprite); -static void sub_812D4B4(struct Sprite *sprite); -static void sub_812D588(struct Sprite *sprite); -static void sub_812DEAC(struct Sprite *sprite); -static void sub_812D724(struct Sprite *sprite); -static void sub_812E4F0(struct Sprite *sprite); -static void sub_812E7A0(struct Sprite *sprite); -static void sub_812EA4C(struct Sprite *sprite); -static void sub_812EC78(struct Sprite *sprite); -static void sub_812ED84(struct Sprite *sprite); -static void sub_812EEA4(struct Sprite *sprite); -static void sub_812F88C(struct Sprite *sprite); -static void sub_812F948(struct Sprite *sprite); -static void sub_812FF94(struct Sprite *sprite); -static void sub_81300F4(struct Sprite *sprite); -static void sub_81304DC(struct Sprite *sprite); -static void sub_813051C(struct Sprite *sprite); -static void sub_81307B0(struct Sprite *sprite); -static void sub_8130A2C(struct Sprite *sprite); -static void sub_8130AEC(struct Sprite *sprite); -static void sub_8130F5C(struct Sprite *sprite); -static void sub_8131264(struct Sprite *sprite); -extern void sub_80D1FDC(struct Sprite *sprite);// kiss_fountain.c -static void sub_8131564(struct Sprite *sprite); -static void AnimTask_TeeterDanceMovementStep(u8); - -/*static*/ void sub_8131EB8(struct Sprite *sprite);// rest not yet decompiled -void AnimKnockOffStrike(struct Sprite *sprite); -void AnimRecycle(struct Sprite *sprite); -static void AnimRecycleStep(struct Sprite *sprite); -static void AnimTask_SlackOffSquishStep(u8 taskId); - -const union AnimCmd gSpriteAnim_8402164[] = -{ - ANIMCMD_FRAME(0 , 4), - ANIMCMD_FRAME(16, 4), - ANIMCMD_FRAME(32, 4), - ANIMCMD_FRAME(48, 4), - ANIMCMD_FRAME(64, 4), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_840217C[] = -{ - gSpriteAnim_8402164, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402180 = -{ - .tileTag = ANIM_TAG_SCRATCH, - .paletteTag = ANIM_TAG_SCRATCH, - .oam = &gOamData_837E054, - .anims = gSpriteAnimTable_840217C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80793C4, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402198 = -{ - .tileTag = ANIM_TAG_BLACK_SMOKE, - .paletteTag = ANIM_TAG_BLACK_SMOKE, - .oam = &gOamData_837DF54, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812C144, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84021B0 = -{ - .tileTag = ANIM_TAG_BLACK_BALL, - .paletteTag = ANIM_TAG_BLACK_BALL, - .oam = &gOamData_837DF24, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80794A8, -}; - -const union AnimCmd gSpriteAnim_84021C8[] = -{ - ANIMCMD_FRAME(0, 40), - ANIMCMD_FRAME(16, 8), - ANIMCMD_FRAME(32, 40), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_84021D8[] = -{ - gSpriteAnim_84021C8, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84021DC = -{ - .tileTag = ANIM_TAG_OPENING_EYE, - .paletteTag = ANIM_TAG_OPENING_EYE, - .oam = &gOamData_837DF34, - .anims = gSpriteAnimTable_84021D8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80793C4, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84021F4 = -{ - .tileTag = ANIM_TAG_ROUND_WHITE_HALO, - .paletteTag = ANIM_TAG_ROUND_WHITE_HALO, - .oam = &gOamData_837E05C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812C220, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_840220C = -{ - .tileTag = ANIM_TAG_TEAL_ALERT, - .paletteTag = ANIM_TAG_TEAL_ALERT, - .oam = &gOamData_837DF94, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812C2BC, -}; - -const union AffineAnimCmd gSpriteAffineAnim_8402224[] = -{ - AFFINEANIMCMD_FRAME(0x180, 0x180, 0, 0), - AFFINEANIMCMD_FRAME(0xFFE0, 0x18, 0, 5), - AFFINEANIMCMD_FRAME(0x18, 0xFFE0, 0, 5), - AFFINEANIMCMD_JUMP(1), -}; - -const union AffineAnimCmd gSpriteAffineAnim_8402244[] = -{ - AFFINEANIMCMD_FRAME(0x30, 0x30, 0, 0), - AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 6), - AFFINEANIMCMD_END, -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_840225C[] = -{ - gSpriteAffineAnim_8402224, - gSpriteAffineAnim_8402244, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402264 = -{ - .tileTag = ANIM_TAG_EYE, - .paletteTag = ANIM_TAG_EYE, - .oam = &gOamData_837E11C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_840225C, - .callback = sub_812C358, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_840227C = -{ - .tileTag = ANIM_TAG_SPIKES, - .paletteTag = ANIM_TAG_SPIKES, - .oam = &gOamData_837DF2C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812C720, -}; - -const union AnimCmd gSpriteAnim_8402294[] = -{ - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(16, 3), - ANIMCMD_FRAME(32, 3), - ANIMCMD_FRAME(48, 3), - ANIMCMD_FRAME(64, 3), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_84022AC[] = -{ - gSpriteAnim_8402294, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84022B0 = -{ - .tileTag = ANIM_TAG_LEER, - .paletteTag = ANIM_TAG_LEER, - .oam = &gOamData_837DF34, - .anims = gSpriteAnimTable_84022AC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812C80C, -}; - -const union AnimCmd gSpriteAnim_84022C8[] = -{ - ANIMCMD_FRAME(0, 3), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_84022D0[] = -{ - gSpriteAnim_84022C8, -}; - -const union AffineAnimCmd gSpriteAffineAnim_84022D4[] = -{ - AFFINEANIMCMD_FRAME(0xFFF9, 0xFFF9, -3, 16), - AFFINEANIMCMD_FRAME(0x7, 0x7, 3, 16), - AFFINEANIMCMD_JUMP(0), -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_84022EC[] = -{ - gSpriteAffineAnim_84022D4, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84022F0 = -{ - .tileTag = ANIM_TAG_LETTER_Z, - .paletteTag = ANIM_TAG_LETTER_Z, - .oam = &gOamData_837DF94, - .anims = gSpriteAnimTable_84022D0, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_84022EC, - .callback = sub_812C848, -}; - -const union AnimCmd gSpriteAnim_8402308[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(16, 16), - ANIMCMD_FRAME(32, 4), - ANIMCMD_FRAME(48, 4), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_840231C[] = -{ - gSpriteAnim_8402308, -}; - -const union AffineAnimCmd gSpriteAffineAnim_8402320[] = -{ - AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), - AFFINEANIMCMD_FRAME(0xFFE0, 0xFFE0, 0, 8), - AFFINEANIMCMD_END, -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_8402338[] = -{ - gSpriteAffineAnim_8402320, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_840233C = -{ - .tileTag = ANIM_TAG_FANG_ATTACK, - .paletteTag = ANIM_TAG_FANG_ATTACK, - .oam = &gOamData_837DFF4, - .anims = gSpriteAnimTable_840231C, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_8402338, - .callback = sub_812C908, -}; - -const union AffineAnimCmd gSpriteAffineAnim_8402354[] = -{ - AFFINEANIMCMD_FRAME(0x0, 0x180, 0, 0), - AFFINEANIMCMD_FRAME(0x10, 0x0, 0, 20), - AFFINEANIMCMD_END, -}; - -const union AffineAnimCmd gSpriteAffineAnim_840236C[] = -{ - AFFINEANIMCMD_FRAME(0x140, 0x180, 0, 0), - AFFINEANIMCMD_FRAME(0xFFF0, 0x0, 0, 19), - AFFINEANIMCMD_END, -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_8402384[] = -{ - gSpriteAffineAnim_8402354, - gSpriteAffineAnim_840236C, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_840238C = -{ - .tileTag = ANIM_TAG_SPOTLIGHT, - .paletteTag = ANIM_TAG_SPOTLIGHT, - .oam = &gOamData_837DFFC, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_8402384, - .callback = sub_812C990, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84023A4 = -{ - .tileTag = ANIM_TAG_TAG_HAND, - .paletteTag = ANIM_TAG_TAG_HAND, - .oam = &gOamData_837DF34, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812CAFC, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84023BC = -{ - .tileTag = ANIM_TAG_TAG_HAND, - .paletteTag = ANIM_TAG_TAG_HAND, - .oam = &gOamData_837DF34, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812CC28, -}; - -const union AnimCmd gSpriteAnim_84023D4[] = -{ - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(8, 2), - ANIMCMD_FRAME(16, 2), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd *const gSpriteAnimTable_84023E4[] = -{ - gSpriteAnim_84023D4, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84023E8 = -{ - .tileTag = ANIM_TAG_RAPID_SPIN, - .paletteTag = ANIM_TAG_RAPID_SPIN, - .oam = &gOamData_837DF54, - .anims = gSpriteAnimTable_84023E4, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812CCE8, -}; - -const union AffineAnimCmd gUnknown_08402400[] = -{ - AFFINEANIMCMD_FRAME(-12, 8, 0, 4), - AFFINEANIMCMD_FRAME(20, -20, 0, 4), - AFFINEANIMCMD_FRAME(-8, 12, 0, 4), - AFFINEANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_8402420[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_8402428[] = -{ - gSpriteAnim_8402420, -}; - -const union AffineAnimCmd gSpriteAffineAnim_840242C[] = -{ - AFFINEANIMCMD_FRAME(0x0, 0x0, 5, 40), - AFFINEANIMCMD_FRAME(0x0, 0x0, 10, 10), - AFFINEANIMCMD_FRAME(0x0, 0x0, 15, 10), - AFFINEANIMCMD_FRAME(0x0, 0x0, 20, 40), - AFFINEANIMCMD_JUMP(0), -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_8402454[] = -{ - gSpriteAffineAnim_840242C, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402458 = -{ - .tileTag = ANIM_TAG_TRI_FORCE_TRIANGLE, - .paletteTag = ANIM_TAG_TRI_FORCE_TRIANGLE, - .oam = &gOamData_837DFFC, - .anims = gSpriteAnimTable_8402428, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_8402454, - .callback = sub_812D294, -}; - -const union AnimCmd gSpriteAnim_8402470[] = -{ - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(16, 3), - ANIMCMD_FRAME(32, 3), - ANIMCMD_FRAME(48, 3), - ANIMCMD_FRAME(32, 3, .hFlip = TRUE), - ANIMCMD_FRAME(16, 3, .hFlip = TRUE), - ANIMCMD_FRAME(0, 3, .hFlip = TRUE), - ANIMCMD_LOOP(1), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_8402494[] = -{ - gSpriteAnim_8402470, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402498 = -{ - .tileTag = ANIM_TAG_ECLIPSING_ORB, - .paletteTag = ANIM_TAG_ECLIPSING_ORB, - .oam = &gOamData_837DF34, - .anims = gSpriteAnimTable_8402494, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80793C4, -}; - -const union AffineAnimCmd gUnknown_084024B0[] = -{ - AFFINEANIMCMD_FRAME(-12, 20, 0, 8), - AFFINEANIMCMD_FRAME(12, -20, 0, 8), - AFFINEANIMCMD_LOOP(2), - AFFINEANIMCMD_END, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84024D0 = -{ - .tileTag = ANIM_TAG_POKEBALL, - .paletteTag = ANIM_TAG_POKEBALL, - .oam = &gOamData_837DF2C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812D3AC, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84024E8 = -{ - .tileTag = ANIM_TAG_GOLD_STARS, - .paletteTag = ANIM_TAG_GOLD_STARS, - .oam = &gOamData_837DF2C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812D4B4, -}; - -const struct SpriteTemplate gSpriteTemplate_8402500 = -{ - .tileTag = ANIM_TAG_GOLD_STARS, - .paletteTag = ANIM_TAG_GOLD_STARS, - .oam = &gOamData_837DF24, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812D588, -}; - -const union AffineAnimCmd gUnknown_08402518[] = -{ - AFFINEANIMCMD_FRAME(8, -8, 0, 12), - AFFINEANIMCMD_FRAME(-16, 16, 0, 12), - AFFINEANIMCMD_FRAME(8, -8, 0, 12), - AFFINEANIMCMD_LOOP(1), - AFFINEANIMCMD_END, -}; - -const union AffineAnimCmd gUnknown_08402540[] = -{ - AFFINEANIMCMD_FRAME(0, 6, 0, 20), - AFFINEANIMCMD_FRAME(0, 0, 0, 20), - AFFINEANIMCMD_FRAME(0, -18, 0, 6), - AFFINEANIMCMD_FRAME(-18, -18, 0, 3), - AFFINEANIMCMD_FRAME(0, 0, 0, 15), - AFFINEANIMCMD_FRAME(4, 4, 0, 13), - AFFINEANIMCMD_END, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402578 = -{ - .tileTag = ANIM_TAG_BLUE_ORB, - .paletteTag = ANIM_TAG_BLUE_ORB, - .oam = &gOamData_837DF24, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812D724, -}; - -const union AffineAnimCmd gUnknown_08402590[] = -{ - AFFINEANIMCMD_FRAME(0, 6, 0, 20), - AFFINEANIMCMD_FRAME(0, 0, 0, 20), - AFFINEANIMCMD_FRAME(7, -30, 0, 6), - AFFINEANIMCMD_FRAME(0, 0, 0, 20), - AFFINEANIMCMD_FRAME(-2, 3, 0, 20), - AFFINEANIMCMD_END, -}; - -const s8 gUnknown_084025C0[] = -{ - 0xE8, - 0x18, - 0xFC, - 0x00, -}; - -const union AnimCmd gSpriteAnim_84025C4[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(4, 6), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd gSpriteAnim_84025D0[] = -{ - ANIMCMD_FRAME(8, 6), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_84025D8[] = -{ - ANIMCMD_FRAME(12, 6), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_84025E0[] = -{ - gSpriteAnim_84025C4, - gSpriteAnim_84025D0, - gSpriteAnim_84025D8, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84025EC = -{ - .tileTag = ANIM_TAG_GREEN_STAR, - .paletteTag = ANIM_TAG_GREEN_STAR, - .oam = &gOamData_837DF2C, - .anims = gSpriteAnimTable_84025E0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812DEAC, -}; - -const s8 gUnknown_08402604[] = -{ - 0x78, - 0x50, - 0x28, - 0x00, -}; - -const u8 gUnknown_08402608[] = -{ - 0, - 0, - 0, - 0, - 50, -}; - -const union AffineAnimCmd gUnknown_08402610[] = -{ - AFFINEANIMCMD_FRAME(0, -15, 0, 7), - AFFINEANIMCMD_FRAME(0, 15, 0, 7), - AFFINEANIMCMD_LOOP(2), - AFFINEANIMCMD_END, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402630 = -{ - .tileTag = ANIM_TAG_ANGER, - .paletteTag = ANIM_TAG_ANGER, - .oam = &gOamData_837DF2C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812E4F0, -}; - -const union AnimCmd gSpriteAnim_8402648[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(2, 8), - ANIMCMD_FRAME(3, 8), - ANIMCMD_FRAME(3, 8, .vFlip = TRUE), - ANIMCMD_FRAME(2, 8, .vFlip = TRUE), - ANIMCMD_FRAME(0, 8, .vFlip = TRUE), - ANIMCMD_FRAME(1, 8, .vFlip = TRUE), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd gSpriteAnim_840266C[] = -{ - ANIMCMD_FRAME(0, 8, .hFlip = TRUE), - ANIMCMD_FRAME(1, 8, .hFlip = TRUE), - ANIMCMD_FRAME(2, 8, .hFlip = TRUE), - ANIMCMD_FRAME(3, 8, .hFlip = TRUE), - ANIMCMD_FRAME(3, 8, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_FRAME(2, 8, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_FRAME(0, 8, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_FRAME(1, 8, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd gSpriteAnim_8402690[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_8402698[] = -{ - gSpriteAnim_8402648, - gSpriteAnim_840266C, - gSpriteAnim_8402690, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84026A4 = -{ - .tileTag = ANIM_TAG_PINK_PETAL, - .paletteTag = ANIM_TAG_PINK_PETAL, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_8402698, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812E7A0, -}; - -const u16 gUnknown_4026BC[] = INCBIN_U16("graphics/unknown/unknown_4026BC.gbapal"); - -const union AnimCmd gSpriteAnim_84026DC[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(4, 9), - ANIMCMD_FRAME(8, 5), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_84026EC[] = -{ - gSpriteAnim_84026DC, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84026F0 = -{ - .tileTag = ANIM_TAG_PAIN_SPLIT, - .paletteTag = ANIM_TAG_PAIN_SPLIT, - .oam = &gOamData_837DF2C, - .anims = gSpriteAnimTable_84026EC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812EA4C, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402708 = -{ - .tileTag = ANIM_TAG_CONFETTI, - .paletteTag = ANIM_TAG_CONFETTI, - .oam = &gOamData_837DF24, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812EC78, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402720 = -{ - .tileTag = ANIM_TAG_SPOTLIGHT, - .paletteTag = ANIM_TAG_SPOTLIGHT, - .oam = &gOamData_837DFFC, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_8402384, - .callback = sub_812ED84, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402738 = -{ - .tileTag = ANIM_TAG_BLUE_ORB, - .paletteTag = ANIM_TAG_BLUE_ORB, - .oam = &gOamData_837DF24, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812EEA4, -}; - -const union AffineAnimCmd gUnknown_08402750[] = -{ - AFFINEANIMCMD_FRAME(16, 0, 0, 4), - AFFINEANIMCMD_FRAME(0, -3, 0, 16), - AFFINEANIMCMD_FRAME(4, 0, 0, 4), - AFFINEANIMCMD_FRAME(0, 0, 0, 24), - AFFINEANIMCMD_FRAME(-5, 3, 0, 16), - AFFINEANIMCMD_END, -}; - -const union AffineAnimCmd gSpriteAffineAnim_8402780[] = -{ - AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), - AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF8, 0, 8), - AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8), - AFFINEANIMCMD_JUMP(0), -}; - -const union AffineAnimCmd gSpriteAffineAnim_84027A0[] = -{ - AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0), - AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8), - AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF8, 0, 8), - AFFINEANIMCMD_JUMP(0), -}; - -const union AffineAnimCmd gSpriteAffineAnim_84027C0[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8), - AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF8, 0, 8), - AFFINEANIMCMD_JUMP(0), -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_84027E0[] = -{ - gSpriteAffineAnim_8402780, - gSpriteAffineAnim_84027A0, - gSpriteAffineAnim_84027C0, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84027EC = -{ - .tileTag = ANIM_TAG_PINK_CLOUD, - .paletteTag = ANIM_TAG_PINK_CLOUD, - .oam = &gOamData_837DF94, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_84027E0, - .callback = sub_812F88C, -}; - -const union AffineAnimCmd gSpriteAffineAnim_8402804[] = -{ - AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), - AFFINEANIMCMD_FRAME(0xFFFC, 0xFFFA, 0, 16), - AFFINEANIMCMD_FRAME(0x4, 0x6, 0, 16), - AFFINEANIMCMD_JUMP(0), -}; - -const union AffineAnimCmd gSpriteAffineAnim_8402824[] = -{ - AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0), - AFFINEANIMCMD_FRAME(0x4, 0x6, 0, 16), - AFFINEANIMCMD_FRAME(0xFFFC, 0xFFFA, 0, 16), - AFFINEANIMCMD_JUMP(0), -}; - -const union AffineAnimCmd gSpriteAffineAnim_8402844[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x4, 0x6, 0, 16), - AFFINEANIMCMD_FRAME(0xFFFC, 0xFFFA, 0, 16), - AFFINEANIMCMD_JUMP(0), -}; - -const union AffineAnimCmd gSpriteAffineAnim_8402864[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x8, 0xA, 0, 30), - AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF6, 0, 16), - AFFINEANIMCMD_JUMP(0), -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_8402884[] = -{ - gSpriteAffineAnim_8402804, - gSpriteAffineAnim_8402824, - gSpriteAffineAnim_8402844, - gSpriteAffineAnim_8402864, -}; - -//arg[0]: frame (0-3) -//arg[1]: x -//arg[2]: y -//arg[3]: ??? (time on screen?) -const struct SpriteTemplate gPinkSmokeTemplate = -{ - .tileTag = ANIM_TAG_PINK_CLOUD, - .paletteTag = ANIM_TAG_PINK_CLOUD, - .oam = &gOamData_837DFF4, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_8402884, - .callback = sub_812F948, -}; - -const union AffineAnimCmd gUnknown_084028AC[] = -{ - AFFINEANIMCMD_FRAME(-16, 16, 0, 6), - AFFINEANIMCMD_FRAME(16, -16, 0, 12), - AFFINEANIMCMD_FRAME(-16, 16, 0, 6), - AFFINEANIMCMD_END, -}; - -const struct SpriteTemplate gSpriteTemplate_84028CC = -{ - .tileTag = ANIM_TAG_SWEAT_DROP, - .paletteTag = ANIM_TAG_SWEAT_DROP, - .oam = &gOamData_837DF24, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_812FF94, -}; - -const u16 gUnknown_084028E4[] = INCBIN_U16("graphics/battle_anims/sprites/effect.gbapal"); - -const union AnimCmd gSpriteAnim_8402914[] = -{ - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(16, 3), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd gSpriteAnim_8402920[] = -{ - ANIMCMD_FRAME(32, 3), - ANIMCMD_FRAME(48, 3), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd *const gSpriteAnimTable_840292C[] = -{ - gSpriteAnim_8402914, - gSpriteAnim_8402920, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402934 = -{ - .tileTag = ANIM_TAG_NOISE_LINE, - .paletteTag = ANIM_TAG_NOISE_LINE, - .oam = &gOamData_837DF34, - .anims = gSpriteAnimTable_840292C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81300F4, -}; - -const struct SpriteTemplate gSpriteTemplate_840294C = -{ - .tileTag = ANIM_TAG_SMALL_RED_EYE, - .paletteTag = ANIM_TAG_SMALL_RED_EYE, - .oam = &gOamData_837DF24, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81304DC, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402964 = -{ - .tileTag = ANIM_TAG_PAW_PRINT, - .paletteTag = ANIM_TAG_PAW_PRINT, - .oam = &gOamData_837DF34, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813051C, -}; - -const union AffineAnimCmd gSpriteAffineAnim_840297C[] = -{ - AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 24), - AFFINEANIMCMD_END, -}; - -const union AffineAnimCmd gSpriteAffineAnim_840298C[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 24), - AFFINEANIMCMD_END, -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_84029A4[] = -{ - gSpriteAffineAnim_840297C, - gSpriteAffineAnim_840298C, -}; - -const struct SpriteTemplate gSpriteTemplate_84029AC = -{ - .tileTag = ANIM_TAG_RED_BALL, - .paletteTag = ANIM_TAG_RED_BALL, - .oam = &gOamData_837DF94, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_84029A4, - .callback = SpriteCallbackDummy, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84029C4 = -{ - .tileTag = ANIM_TAG_TAG_HAND, - .paletteTag = ANIM_TAG_TAG_HAND, - .oam = &gOamData_837DF34, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81307B0, -}; - -const union AffineAnimCmd gUnknown_084029DC[] = -{ - AFFINEANIMCMD_FRAME(0, -16, 0, 6), - AFFINEANIMCMD_FRAME(0, 16, 0, 6), - AFFINEANIMCMD_END,//0 -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_84029F4 = -{ - .tileTag = ANIM_TAG_SMELLINGSALT_EFFECT, - .paletteTag = ANIM_TAG_SMELLINGSALT_EFFECT, - .oam = &gOamData_837DF34, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8130A2C, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402A0C = -{ - .tileTag = ANIM_TAG_TAG_HAND, - .paletteTag = ANIM_TAG_TAG_HAND, - .oam = &gOamData_837DF34, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8130AEC, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402A24 = -{ - .tileTag = ANIM_TAG_MAGNIFYING_GLASS, - .paletteTag = ANIM_TAG_MAGNIFYING_GLASS, - .oam = &gOamData_837E054, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8130F5C, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402A3C = -{ - .tileTag = ANIM_TAG_GOLD_STARS, - .paletteTag = ANIM_TAG_GOLD_STARS, - .oam = &gOamData_837DF2C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8131264, -}; - -const struct SpriteTemplate gSpriteTemplate_8402A54 = -{ - .tileTag = ANIM_TAG_GOLD_STARS, - .paletteTag = ANIM_TAG_GOLD_STARS, - .oam = &gOamData_837DF2C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80D1FDC, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402A6C = -{ - .tileTag = ANIM_TAG_X_SIGN, - .paletteTag = ANIM_TAG_X_SIGN, - .oam = &gOamData_837DF3C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8131564, -}; - -const struct SpriteTemplate gSpriteTemplate_8402A84 = -{ - .tileTag = ANIM_TAG_ITEM_BAG, - .paletteTag = ANIM_TAG_ITEM_BAG, - .oam = &gOamData_837DF34, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8131EB8, -}; - -const union AnimCmd gSpriteAnim_8402A9C[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(64, 4), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_8402AA8[] = -{ - gSpriteAnim_8402A9C, -}; - -const union AffineAnimCmd gSpriteAffineAnim_8402AAC[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 8), - AFFINEANIMCMD_END, -}; - -const union AffineAnimCmd gSpriteAffineAnim_8402AC4[] = -{ - AFFINEANIMCMD_FRAME(0xFF00, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 8), - AFFINEANIMCMD_END, -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_8402ADC[] = -{ - gSpriteAffineAnim_8402AAC, - gSpriteAffineAnim_8402AC4, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402AE4 = -{ - .tileTag = ANIM_TAG_SLAM_HIT_2, - .paletteTag = ANIM_TAG_SLAM_HIT_2, - .oam = &gOamData_837DF9C, - .anims = gSpriteAnimTable_8402AA8, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_8402ADC, - .callback = AnimKnockOffStrike, -}; - -const union AffineAnimCmd gSpriteAffineAnim_8402AFC[] = -{ - AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 64), - AFFINEANIMCMD_JUMP(0), -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_8402B0C[] = -{ - gSpriteAffineAnim_8402AFC, -}; - -const struct SpriteTemplate gBattleAnimSpriteTemplate_8402B10 = -{ - .tileTag = ANIM_TAG_RECYCLE, - .paletteTag = ANIM_TAG_RECYCLE, - .oam = &gOamData_837E0BC, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_8402B0C, - .callback = AnimRecycle, -}; - -const union AffineAnimCmd gSlackOffSquishAffineAnimCmds[] = -{ - AFFINEANIMCMD_FRAME(0, 16, 0, 4), - AFFINEANIMCMD_FRAME(-2, 0, 0, 8), - AFFINEANIMCMD_FRAME(0, 4, 0, 4), - AFFINEANIMCMD_FRAME(0, 0, 0, 24), - AFFINEANIMCMD_FRAME(1, -5, 0, 16), - AFFINEANIMCMD_END, -}; - -static void sub_812C144(struct Sprite *sprite) -{ - sprite->pos1.x += gBattleAnimArgs[0]; - sprite->pos1.y += gBattleAnimArgs[1]; - - if (gBattleAnimArgs[3] == 0) - sprite->data[0] = gBattleAnimArgs[2]; - else - sprite->data[0] = -gBattleAnimArgs[2]; - - sprite->data[1] = gBattleAnimArgs[4]; - sprite->callback = sub_812C184; -} - -static void sub_812C184(struct Sprite *sprite) -{ - if (sprite->data[1] > 0) - { - sprite->pos2.x = sprite->data[2] >> 8; - sprite->data[2] += sprite->data[0]; - sprite->invisible ^= 1; - sprite->data[1]--; - } - else - { - DestroyAnimSprite(sprite); - } -} - -void sub_812C1D0(u8 taskId) -{ - sub_8046234( - GetBattlerSpriteCoord(gBattleAnimTarget, 2) + 8, - GetBattlerSpriteCoord(gBattleAnimTarget, 3) + 8, - 0); - DestroyAnimVisualTask(taskId); - -} - -static void sub_812C220(struct Sprite *sprite) -{ - sprite->data[0] = 90; - sprite->callback = WaitAnimForDuration; - sprite->data[1] = 7; - StoreSpriteCallbackInData(sprite, sub_812C268); - REG_BLDCNT = 0x3F40; - REG_BLDALPHA = ((16 - sprite->data[1]) << 8) | sprite->data[1]; -} - -static void sub_812C268(struct Sprite *sprite) -{ - REG_BLDALPHA = ((16 - sprite->data[1]) << 8) | sprite->data[1]; - if (--sprite->data[1] < 0) - { - sprite->invisible = 1; - sprite->callback = sub_812C2A4; - } -} - -static void sub_812C2A4(struct Sprite *sprite) -{ - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroyAnimSprite(sprite); -} - -static void sub_812C2BC(struct Sprite *sprite) -{ - u16 rotation; - u8 x = GetBattlerSpriteCoord(gBattleAnimTarget, 2); - u8 y = GetBattlerSpriteCoord(gBattleAnimTarget, 3); - - sub_8078764(sprite, TRUE); - - rotation = ArcTan2Neg(sprite->pos1.x - x, sprite->pos1.y - y); - rotation += 0x6000; - if (IsContest()) - rotation += 0x4000; - - sub_8078FDC(sprite, 0, 0x100, 0x100, rotation); - - sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[2] = x; - sprite->data[4] = y; - sprite->callback = StartAnimLinearTranslation; - StoreSpriteCallbackInData(sprite, DestroyAnimSprite); -} - -static void sub_812C358(struct Sprite *sprite) -{ - REG_BLDCNT = 0x3F40; - REG_BLDALPHA = 0x1000; - sprite->data[0] = 4; - sprite->callback = sub_812C380; -} - -static void sub_812C380(struct Sprite *sprite) -{ - REG_BLDALPHA = ((16 - sprite->data[0]) << 8) | sprite->data[0]; - - if (sprite->data[1]) - sprite->data[0]--; - else - sprite->data[0]++; - - if (sprite->data[0] == 15 || sprite->data[0] == 4) - sprite->data[1] ^= 1; - - if (sprite->data[2]++ > 70) - { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - StartSpriteAffineAnim(sprite, 1); - sprite->data[2] = 0; - sprite->invisible = 1; - sprite->affineAnimPaused = 1; - sprite->callback = sub_812C40C; - } -} - -static void sub_812C40C(struct Sprite *sprite) -{ - if (sprite->data[2]++ > 9) - { - sprite->invisible = 0; - sprite->affineAnimPaused = 0; - if (sprite->affineAnimEnded) - sprite->callback = sub_812C450; - } -} - -static void sub_812C450(struct Sprite *sprite) -{ - switch (sprite->data[3]) - { - case 0: - case 1: - sprite->pos2.x = 1; - sprite->pos2.y = 0; - break; - case 2: - case 3: - sprite->pos2.x = -1; - sprite->pos2.y = 0; - break; - case 4: - case 5: - sprite->pos2.x = 0; - sprite->pos2.y = 1; - break; - case 6: - default: - sprite->pos2.x = 0; - sprite->pos2.y = -1; - break; - } - - if (++sprite->data[3] > 7) - sprite->data[3] = 0; - - if (sprite->data[4]++ > 15) - { - sprite->data[0] = 16; - sprite->data[1] = 0; - REG_BLDCNT = 0x3F40; - REG_BLDALPHA = sprite->data[0]; - sprite->callback = sub_812C4FC; - } -} - -static void sub_812C4FC(struct Sprite *sprite) -{ - REG_BLDALPHA = ((16 - sprite->data[0]) << 8) | sprite->data[0]; - - if (sprite->data[1]++ > 1) - { - sprite->data[0]--; - sprite->data[1] = 0; - } - - if (sprite->data[0] == 0) - sprite->invisible = 1; - - if (sprite->data[0] < 0) - { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroyAnimSprite(sprite); - } -} - -void sub_812C560(u8 taskId) -{ - gTasks[taskId].func = sub_812C588; - gAnimVisualTaskCount--; -} - -static void sub_812C588(u8 taskId) -{ - int i; - u16 lastColor; - u8 paletteIndex = sub_80789BC(); - - if (++gTasks[taskId].data[5] == 4) - { - lastColor = gPlttBufferFaded[paletteIndex * 16 + 11]; - for (i = 10; i > 0; i--) - gPlttBufferFaded[paletteIndex * 16 + i + 1] = gPlttBufferFaded[paletteIndex * 16 + i]; - - gPlttBufferFaded[paletteIndex * 16 + 1] = lastColor; - gTasks[taskId].data[5] = 0; - } - - if ((u16)gBattleAnimArgs[7] == 0xFFFF) - DestroyTask(taskId); -} - -void sub_812C624(u8 taskId) -{ - gTasks[taskId].func = sub_812C64C; - gAnimVisualTaskCount--; -} - -static void sub_812C64C(u8 taskId) -{ - int i; - u16 lastColor; - u8 paletteIndex = sub_80789BC(); - - if (++gTasks[taskId].data[5] == 4) - { - lastColor = gPlttBufferFaded[paletteIndex * 16 + 11]; - for (i = 10; i > 0; i--) - gPlttBufferFaded[paletteIndex * 16 + i + 1] = gPlttBufferFaded[paletteIndex * 16 + i]; - gPlttBufferFaded[paletteIndex * 16 + 1] = lastColor; - - lastColor = gPlttBufferUnfaded[paletteIndex * 16 + 11]; - for (i = 10; i > 0; i--) - gPlttBufferUnfaded[paletteIndex * 16 + i + 1] = gPlttBufferUnfaded[paletteIndex * 16 + i]; - gPlttBufferUnfaded[paletteIndex * 16 + 1] = lastColor; - - gTasks[taskId].data[5] = 0; - } - - if ((u16)gBattleAnimArgs[7] == 0xFFFF) - DestroyTask(taskId); -} - -static void sub_812C720(struct Sprite *sprite) -{ - u16 x; - u16 y; - - InitAnimSpritePos(sprite, 1); - SetAverageBattlerPositions(gBattleAnimTarget, 0, &x, &y); - - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - - sprite->data[0] = gBattleAnimArgs[4]; - sprite->data[2] = x + gBattleAnimArgs[2]; - sprite->data[4] = y + gBattleAnimArgs[3]; - sprite->data[5] = -50; - - InitAnimArcTranslation(sprite); - sprite->callback = sub_812C798; -} - -static void sub_812C798(struct Sprite *sprite) -{ - if (TranslateAnimArc(sprite)) - { - sprite->data[0] = 30; - sprite->data[1] = 0; - sprite->callback = WaitAnimForDuration; - StoreSpriteCallbackInData(sprite, sub_812C7C8); - } -} - -static void sub_812C7C8(struct Sprite *sprite) -{ - if (sprite->data[1] & 1) - sprite->invisible ^= 1; - - if (++sprite->data[1] == 16) - DestroyAnimSprite(sprite); -} - -static void sub_812C80C(struct Sprite *sprite) -{ - sub_8078650(sprite); - sub_807867C(sprite, gBattleAnimArgs[0]); - sprite->pos1.y += gBattleAnimArgs[1]; - sprite->callback = sub_8078600; - StoreSpriteCallbackInData(sprite, DestroyAnimSprite); -} - -// This is likely fakematching due to some strange type casting behavior. -static void sub_812C848(struct Sprite *sprite) -{ - int var0; - int var1; - if (sprite->data[0] == 0) - { - sub_8078650(sprite); - sub_807867C(sprite, gBattleAnimArgs[0]); - - if (!IsContest()) - { - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - { - sprite->data[1] = gBattleAnimArgs[2]; - sprite->data[2] = gBattleAnimArgs[3]; - } - else - { - var1 = -gBattleAnimArgs[2]; - sprite->data[1] = var1; - var1 = -gBattleAnimArgs[3]; - sprite->data[2] = var1; - } - } - else - { - var1 = -gBattleAnimArgs[2]; - sprite->data[1] = var1; - sprite->data[2] = gBattleAnimArgs[3]; - } - } - - sprite->data[0]++; - var0 = (sprite->data[0] * 20) & 0xFF; - sprite->data[3] += sprite->data[1]; - sprite->data[4] += sprite->data[2]; - sprite->pos2.x = (sprite->data[3] + (s32)((u32)sprite->data[3] >> 31)) >> 1; - sprite->pos2.y = Sin(var0 & 0xFF, 5) + ((s32)(sprite->data[4] + ((u32)sprite->data[4] >> 31)) >> 1); - - if ((u16)(sprite->pos1.x + sprite->pos2.x) > 240) - DestroyAnimSprite(sprite); -} - -static void sub_812C908(struct Sprite *sprite) -{ - if (sprite->animEnded) - DestroyAnimSprite(sprite); -} - -void sub_812C924(u8 taskId) -{ - if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) - gBattleAnimArgs[7] = 0; - else - gBattleAnimArgs[7] = 1; - - DestroyAnimVisualTask(taskId); -} - -void sub_812C960(u8 taskId) -{ - if (gAnimMoveDmg > 0) - gBattleAnimArgs[7] = 0; - else - gBattleAnimArgs[7] = 1; - - DestroyAnimVisualTask(taskId); -} - -static void sub_812C990(struct Sprite *sprite) -{ - REG_WINOUT = 0x1F3F; - REG_DISPCNT |= DISPCNT_OBJWIN_ON; - gBattle_WIN0H = 0; - gBattle_WIN0V = 0; - REG_WIN0H = 0; - REG_WIN0V = 0; - - sub_8078764(sprite, FALSE); - - sprite->oam.objMode = ST_OAM_OBJ_WINDOW; - sprite->invisible = 1; - sprite->callback = sub_812CA04; -} - -static void sub_812CA04(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - sprite->invisible = 0; - if (sprite->affineAnimEnded) - sprite->data[0]++; - break; - case 1: - case 3: - sprite->data[1] += 117; - sprite->pos2.x = sprite->data[1] >> 8; - if (++sprite->data[2] == 21) - { - sprite->data[2] = 0; - sprite->data[0]++; - } - break; - case 2: - sprite->data[1] -= 117; - sprite->pos2.x = sprite->data[1] >> 8; - if (++sprite->data[2] == 41) - { - sprite->data[2] = 0; - sprite->data[0]++; - } - break; - case 4: - ChangeSpriteAffineAnim(sprite, 1); - sprite->data[0]++; - break; - case 5: - if (sprite->affineAnimEnded) - { - sprite->invisible = 1; - sprite->callback = sub_812CAD0; - } - break; - } -} - -static void sub_812CAD0(struct Sprite *sprite) -{ - REG_WINOUT = 0x3F3F; - REG_DISPCNT ^= DISPCNT_OBJWIN_ON; - DestroyAnimSprite(sprite); -} - -static void sub_812CAFC(struct Sprite *sprite) -{ - if (gBattleAnimArgs[3] == 0) - { - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); - } - - sprite->pos1.x += gBattleAnimArgs[0]; - sprite->pos1.y += gBattleAnimArgs[1]; - sprite->oam.tileNum += 16; - - if (gBattleAnimArgs[2] == 0) - { - sprite->oam.matrixNum = 8; - sprite->pos2.x = -12; - sprite->data[1] = 2; - } - else - { - sprite->pos2.x = 12; - sprite->data[1] = -2; - } - - sprite->data[0] = gBattleAnimArgs[4]; - - if (sprite->data[3] != 255) - sprite->data[3] = gBattleAnimArgs[2]; - - sprite->callback = sub_812CBB4; -} - -static void sub_812CBB4(struct Sprite *sprite) -{ - if (sprite->data[2] == 0) - { - sprite->pos2.x += sprite->data[1]; - if (sprite->pos2.x == 0) - { - sprite->data[2]++; - if (sprite->data[3] == 0) - { - PlaySE1WithPanning(222, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER_NEG)); - } - } - } - else - { - sprite->pos2.x -= sprite->data[1]; - if (abs(sprite->pos2.x) == 12) - { - sprite->data[0]--; - sprite->data[2]--; - } - - } - - if (sprite->data[0] == 0) - DestroyAnimSprite(sprite); -} - -static void sub_812CC28(struct Sprite *sprite) -{ - sprite->oam.objMode = ST_OAM_OBJ_WINDOW; - sprite->data[3] = 255; - sub_812CAFC(sprite); -} - -void sub_812CC44(u8 taskId) -{ - if (IsContest()) - { - REG_WININ = 0x1F3F; - gBattle_WIN1H = 0x98F0; - gBattle_WIN1V = 0x00A0; - REG_WIN1H = gBattle_WIN0H; - REG_WIN1V = gBattle_WIN0V; - } - - DestroyAnimVisualTask(taskId); -} - -void sub_812CCA8(u8 taskId) -{ - if (IsContest()) - { - REG_WININ = 0x3F3F; - gBattle_WIN1H = 0; - gBattle_WIN1V = 0; - } - - DestroyAnimVisualTask(taskId); -} - -static void sub_812CCE8(struct Sprite *sprite) -{ - int var0; - if (gBattleAnimArgs[0] == 0) - { - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + gBattleAnimArgs[1]; - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); - } - else - { - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0) + gBattleAnimArgs[1]; - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1); - } - - sprite->pos2.y = gBattleAnimArgs[2]; - var0 = 0; - if (sprite->pos2.y > gBattleAnimArgs[3]) - var0 = 1; - - sprite->data[0] = var0; - sprite->data[1] = 0; - sprite->data[2] = gBattleAnimArgs[4]; - sprite->data[3] = gBattleAnimArgs[5]; - sprite->data[4] = gBattleAnimArgs[3]; - sprite->callback = sub_812CD64; -} - -static void sub_812CD64(struct Sprite *sprite) -{ - sprite->data[1] = (sprite->data[1] + sprite->data[2]) & 0xFF; - sprite->pos2.x = gSineTable[sprite->data[1]] >> 4; - sprite->pos2.y += sprite->data[3]; - - if (sprite->data[0]) - { - if (sprite->pos2.y < sprite->data[4]) - DestroyAnimSprite(sprite); - } - else - { - if (sprite->pos2.y > sprite->data[4]) - DestroyAnimSprite(sprite); - } -} - -void sub_812CDC8(u8 taskId) -{ - s16 var0; - u8 toBG2; - s16 var2; - int var3; - int var4; - s16 i; - struct ScanlineEffectParams scanlineParams; - struct Task *task = &gTasks[taskId]; - - if (gBattleAnimArgs[0] == 0) - { - var0 = sub_8077FC0(gBattleAnimAttacker); - toBG2 = GetBattlerPosition_permutated(gBattleAnimAttacker); - } - else - { - var0 = sub_8077FC0(gBattleAnimTarget); - toBG2 = GetBattlerPosition_permutated(gBattleAnimTarget); - } - - task->data[0] = var0 + 36; - task->data[1] = task->data[0]; - task->data[2] = var0 - 33; - if (task->data[2] < 0) - task->data[2] = 0; - - task->data[3] = task->data[0]; - task->data[4] = 8; - task->data[5] = gBattleAnimArgs[1]; - task->data[6] = 0; - task->data[7] = 0; - - if (toBG2 == 1) - { - var3 = gBattle_BG1_X; - task->data[8] = var3; - var4 = var3 + 240; - } - else - { - var3 = gBattle_BG2_X; - task->data[8] = var3; - var4 = var3 + 240; - } - - task->data[9] = var4; - task->data[10] = gBattleAnimArgs[2]; - - if (gBattleAnimArgs[2] == 0) - { - task->data[11] = var4; - var2 = task->data[8]; - } - else - { - task->data[11] = var3; - var2 = task->data[9]; - } - - task->data[15] = 0; - - i = task->data[2]; - while (i <= task->data[3]) - { - gScanlineEffectRegBuffers[0][i] = var2; - gScanlineEffectRegBuffers[1][i] = var2; - i++; - } - - if (toBG2 == 1) - scanlineParams.dmaDest = ®_BG1HOFS; - else - scanlineParams.dmaDest = ®_BG2HOFS; - - scanlineParams.dmaControl = 0xA2600001; - scanlineParams.initState = 1; - scanlineParams.unused9 = 0; - ScanlineEffect_SetParams(scanlineParams); - - task->func = sub_812CEF0; -} - -static void sub_812CEF0(u8 taskId) -{ - s16 i; - struct Task *task = &gTasks[taskId]; - - task->data[0] -= task->data[5]; - if (task->data[0] < task->data[2]) - task->data[0] = task->data[2]; - - if (task->data[4] == 0) - { - task->data[1] -= task->data[5]; - if (task->data[1] < task->data[2]) - { - task->data[1] = task->data[2]; - task->data[15] = 1; - } - } - else - { - task->data[4]--; - } - - if (++task->data[6] > 1) - { - task->data[6] = 0; - task->data[7] = task->data[7] == 0 ? 1 : 0; - - if (task->data[7]) - task->data[12] = task->data[8]; - else - task->data[12] = task->data[9]; - } - - i = task->data[0]; - while (i < task->data[1]) - { - gScanlineEffectRegBuffers[0][i] = task->data[12]; - gScanlineEffectRegBuffers[1][i] = task->data[12]; - i++; - } - - i = task->data[1]; - while (i <= task->data[3]) - { - gScanlineEffectRegBuffers[0][i] = task->data[11]; - gScanlineEffectRegBuffers[1][i] = task->data[11]; - i++; - } - - if (task->data[15]) - { - if (task->data[10]) - gScanlineEffect.state = 3; - - DestroyAnimVisualTask(taskId); - } -} - -void sub_812D008(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - task->data[0] = 0; - task->data[1] = 0; - task->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); - task->data[4] = 32; - task->data[5] = -20; - task->data[6] = 0; - task->data[15] = GetAnimBattlerSpriteId(0); - task->func = sub_812D06C; -} - -static void sub_812D06C(u8 taskId) -{ - int var0, var1; - s16 x, y; - u16 i, j; - u8 spriteId; - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - var0 = task->data[2]; - if (task->data[1] & 1) - { - var1 = task->data[4]; - x = var0 - var1; - } - else - { - var1 = task->data[4]; - x = var0 + var1; - } - - y = task->data[3] + task->data[5]; - spriteId = CreateSprite(&gBattleAnimSpriteTemplate_83D7220, x, y, 6 - task->data[1]); - PlaySE12WithPanning(186, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER_NEG)); - - if (spriteId != MAX_SPRITES) - { - gSprites[spriteId].hFlip = task->data[1] & 1; - gSprites[spriteId].callback = SpriteCallbackDummy; - } - - if (task->data[1] & 1) - { - task->data[4] -= 6; - task->data[5] -= 6; - } - - PrepareAffineAnimInTaskData(task, task->data[15], gUnknown_08402400); - task->data[1]++; - task->data[0] = 1; - break; - case 1: - if (RunAffineAnimFromTaskData(task) == 0) - { - if (task->data[1] == 6) - { - task->data[6] = 8; - task->data[0] = 3; - } - else - { - if (task->data[1] <= 2) - task->data[6] = 10; - else - task->data[6] = 0; - - task->data[0] = 2; - } - } - break; - case 2: - if (task->data[6] != 0) - task->data[6]--; - else - task->data[0] = 0; - break; - case 3: - if (task->data[6] != 0) - task->data[6]--; - else - task->data[0] = 4; - break; - case 4: - for (i = 0, j = 0; i < MAX_SPRITES; i++) - { - if (gSprites[i].template == &gBattleAnimSpriteTemplate_83D7220) - { - gSprites[i].data[0] = taskId; - gSprites[i].data[1] = 6; - StartSpriteAnim(&gSprites[i], 2); - gSprites[i].callback = sub_812D254; - - if (++j == 6) - break; - } - } - - task->data[6] = j; - task->data[0] = 5; - break; - case 5: - if (task->data[6] == 0) - DestroyAnimVisualTask(taskId); - break; - } -} - -static void sub_812D254(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - gTasks[sprite->data[0]].data[sprite->data[1]]--; - DestroySprite(sprite); - } -} - -static void sub_812D294(struct Sprite *sprite) -{ - if (sprite->data[0] == 0) - InitAnimSpritePos(sprite, 0); - - sprite->data[0]++; - if (sprite->data[0] < 40) - { - u16 var = sprite->data[0]; - if ((var & 1) == 0) - sprite->invisible = 1; - else - sprite->invisible = 0; - } - - if (sprite->data[0] > 30) - sprite->invisible = 0; - - if (sprite->data[0] == 61) - { - StoreSpriteCallbackInData(sprite, DestroyAnimSprite); - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data[0] = 20; - sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); - sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); - sprite->callback = StartAnimLinearTranslation; - } -} - -void sub_812D350(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_084024B0); - gTasks[taskId].data[0]++; - break; - case 1: - if (RunAffineAnimFromTaskData(&gTasks[taskId]) == 0) - DestroyAnimVisualTask(taskId); - break; - } -} - -static void sub_812D3AC(struct Sprite *sprite) -{ - u8 spriteId = GetAnimBattlerSpriteId(0); - - switch (sprite->data[0]) - { - case 0: - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); - PrepareBattlerSpriteForRotScale(spriteId, 0); - sprite->data[1] = 256; - sprite->data[2] = 256; - sprite->data[0]++; - break; - case 1: - sprite->data[1] += 96; - sprite->data[2] -= 26; - obj_id_set_rotscale(spriteId, sprite->data[1], sprite->data[2], 0); - - if (++sprite->data[3] == 5) - sprite->data[0]++; - // fall through - case 2: - sprite->data[1] += 96; - sprite->data[2] += 48; - obj_id_set_rotscale(spriteId, sprite->data[1], sprite->data[2], 0); - - if (++sprite->data[3] == 9) - { - sprite->data[3] = 0; - gSprites[spriteId].invisible = 1; - sub_8078F40(spriteId); - sprite->data[0]++; - } - break; - case 3: - sprite->pos2.y -= 6; - if (sprite->pos1.y + sprite->pos2.y < -32) - DestroyAnimSprite(sprite); - break; - } -} - -static void sub_812D4B4(struct Sprite *sprite) -{ - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - sprite->pos1.x = -16; - else - sprite->pos1.x = 256; - - sprite->pos1.y = 0; - sprite->callback = sub_812D4EC; -} - -static void sub_812D4EC(struct Sprite *sprite) -{ - u32 newX; - - sprite->data[0] += 72; - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - sprite->pos2.x = sprite->data[0] >> 4; - else - sprite->pos2.x = -(sprite->data[0] >> 4); - - sprite->data[1] += 16; - sprite->pos2.y += sprite->data[1] >> 8; - - if (++sprite->data[2] % 3 == 0) - { - CreateSpriteAndAnimate( - &gSpriteTemplate_8402500, - sprite->pos1.x + sprite->pos2.x, - sprite->pos1.y + sprite->pos2.y, - sprite->subpriority + 1); - } - - newX = sprite->pos1.x + sprite->pos2.x + 32; - if (newX > 304) - DestroyAnimSprite(sprite); -} - -static void sub_812D588(struct Sprite *sprite) -{ - u8 rand; - s8 y; - - rand = Random() & 3; - if (rand == 0) - sprite->oam.tileNum += 4; - else - sprite->oam.tileNum += 5; - - y = Random() & 7; - if (y > 3) - y = -y; - - sprite->pos2.y = y; - sprite->callback = sub_812D5E8; -} - -static void sub_812D5E8(struct Sprite *sprite) -{ - if (++sprite->data[0] < 30) - { - if (++sprite->data[1] == 2) - { - sprite->invisible ^= 1; - sprite->data[1] = 0; - } - } - else - { - if (sprite->data[1] == 2) - sprite->invisible = 0; - - if (sprite->data[1] == 3) - { - sprite->invisible = 1; - sprite->data[1] = -1; - } - - sprite->data[1]++; - } - - if (sprite->data[0] > 60) - DestroySprite(sprite); -} - -void sub_812D674(u8 taskId) -{ - if (gTasks[taskId].data[0] == 0) - { - PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402518); - gTasks[taskId].data[0]++; - } - else - { - if (RunAffineAnimFromTaskData(&gTasks[taskId]) == 0) - DestroyAnimVisualTask(taskId); - } -} - -void sub_812D6CC(u8 taskId) -{ - if (gTasks[taskId].data[0] == 0) - { - PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402540); - gTasks[taskId].data[0]++; - } - else - { - if (RunAffineAnimFromTaskData(&gTasks[taskId]) == 0) - DestroyAnimVisualTask(taskId); - } -} - -static void sub_812D724(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - InitAnimSpritePos(sprite, 0); - sprite->data[1] = 0x900; - sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); - sprite->data[0]++; - break; - case 1: - sprite->pos2.y -= sprite->data[1] >> 8; - sprite->data[1] -= 96; - if (sprite->pos1.y + sprite->pos2.y > sprite->data[2]) - DestroyAnimSprite(sprite); - break; - } -} - -void sub_812D790(u8 taskId) -{ - if (gTasks[taskId].data[0] == 0) - { - PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402590); - gTasks[taskId].data[0]++; - } - else - { - if (RunAffineAnimFromTaskData(&gTasks[taskId]) == 0) - DestroyAnimVisualTask(taskId); - } -} - -void sub_812D7E8(u8 taskId) -{ - int i, j; - u8 position; - struct Struct_sub_8078914 subStruct; - u8 *dest; - u8 *src; - u16 *field_4; - u16 *ptr; - u16 stretch; - - switch (gTasks[taskId].data[0]) - { - case 0: - REG_MOSAIC = 0; - if (GetBattlerPosition_permutated(gBattleAnimAttacker) == 1) - REG_BG1CNT_BITFIELD.mosaic = 1; - else - REG_BG2CNT_BITFIELD.mosaic = 1; - - gTasks[taskId].data[10] = gBattleAnimArgs[0]; - gTasks[taskId].data[0]++; - break; - case 1: - if (gTasks[taskId].data[2]++ > 1) - { - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[1]++; - stretch = gTasks[taskId].data[1]; - REG_MOSAIC = (stretch << 4) | stretch; - if (stretch == 15) - gTasks[taskId].data[0]++; - } - break; - case 2: - sub_8031FC4(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10]); - sub_8078954(&subStruct, gBattleAnimAttacker); - - if (IsContest()) - position = 0; - else - position = GetBattlerPosition(gBattleAnimAttacker); - - dest = gUnknown_081FAF4C[position] + (gBattleMonForms[gBattleAnimAttacker] << 11); - src = subStruct.field_0; - DmaCopy32(3, dest, src, 0x800); - - if (IsContest()) - { - if (IsSpeciesNotUnown(EWRAM_19348[0]) != IsSpeciesNotUnown(EWRAM_19348[1])) - { - field_4 = (u16 *)subStruct.field_4; - for (i = 0; i < 8; i++) - { - for (j = 0; j < 4; j++) - { - u16 temp = field_4[j + i * 0x20]; - field_4[j + i * 0x20] = field_4[(7 - j) + i * 0x20]; - field_4[(7 - j) + i * 0x20] = temp; - } - } - - for (i = 0; i < 8; i++) - { - for (j = 0; j < 8; j++) - { - field_4[j + i * 0x20] ^= 0x400; - } - } - } - - ptr = EWRAM_19348; - if (IsSpeciesNotUnown(ptr[1])) - gSprites[gBankSpriteIds[gBattleAnimAttacker]].affineAnims = gSpriteAffineAnimTable_81E7C18; - else - gSprites[gBankSpriteIds[gBattleAnimAttacker]].affineAnims = gSpriteAffineAnimTable_81E7BEC; - - StartSpriteAffineAnim(&gSprites[gBankSpriteIds[gBattleAnimAttacker]], 0); - } - - gTasks[taskId].data[0]++; - break; - case 3: - if (gTasks[taskId].data[2]++ > 1) - { - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[1]--; - stretch = gTasks[taskId].data[1]; - REG_MOSAIC = (stretch << 4) | stretch; - - if (stretch == 0) - gTasks[taskId].data[0]++; - } - break; - case 4: - REG_MOSAIC = 0; - if (GetBattlerPosition_permutated(gBattleAnimAttacker) == 1) - REG_BG1CNT_BITFIELD.mosaic = 0; - else - REG_BG2CNT_BITFIELD.mosaic = 0; - - if (!IsContest()) - { - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) - { - if (gTasks[taskId].data[10] == 0) - sub_8032984(gBattleAnimAttacker, eTransformStatuses[gBattleAnimAttacker].species); - } - } - - DestroyAnimVisualTask(taskId); - break; - } -} - -void c3_80DFBE4(u8 taskId) -{ - gBattleAnimArgs[7] = gSprites[gBankSpriteIds[gBattleAnimAttacker]].invisible; - DestroyAnimVisualTask(taskId); -} - -void sub_812DB58(u8 taskId) -{ - sub_8031FC4(gBattleAnimAttacker, gBattleAnimTarget, 1); - DestroyAnimVisualTask(taskId); -} - -void sub_812DB84(u8 taskId) -{ - struct Struct_sub_8078914 subStruct; - - switch (gTasks[taskId].data[0]) - { - case 0: - REG_BLDCNT = BLDCNT_TGT2_BD | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 - | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1; - REG_BLDALPHA = 0x1000; - REG_BG1CNT_BITFIELD.screenSize = 0; - REG_BG1CNT_BITFIELD.priority = 1; - if (!IsContest()) - REG_BG1CNT_BITFIELD.charBaseBlock = 1; - - sub_8078914(&subStruct); - DmaClear32(3, subStruct.field_4, 0x1000); - LZDecompressVram(gUnknown_08D2AA98, subStruct.field_4); - LZDecompressVram(gUnknown_08D2A9E0, subStruct.field_0); - LoadCompressedPalette(gUnknown_08D2AA80, subStruct.field_8 * 16, 32); - if (IsContest()) - { - sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0); - gBattle_BG1_X = -56; - gBattle_BG1_Y = 0; - } - else - { - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - gBattle_BG1_X = -135; - else - gBattle_BG1_X = -10; - - gBattle_BG1_Y = 0; - } - - gTasks[taskId].data[10] = gBattle_BG1_X; - gTasks[taskId].data[11] = gBattle_BG1_Y; - - gTasks[taskId].data[0]++; - PlaySE12WithPanning(SE_W234, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER_NEG)); - break; - case 1: - if (gTasks[taskId].data[4]++ > 0) - { - gTasks[taskId].data[4] = 0; - if (++gTasks[taskId].data[1] > 12) - gTasks[taskId].data[1] = 12; - - REG_BLDALPHA = ((16 - gTasks[taskId].data[1]) << 8) | gTasks[taskId].data[1]; - - if (gTasks[taskId].data[1] == 12) - gTasks[taskId].data[0]++; - } - break; - case 2: - if (--gTasks[taskId].data[1] < 0) - gTasks[taskId].data[1] = 0; - - REG_BLDALPHA = ((16 - gTasks[taskId].data[1]) << 8) | gTasks[taskId].data[1]; - - if (gTasks[taskId].data[1] == 0) - { - gBattle_BG1_X = gUnknown_084025C0[gTasks[taskId].data[2]] + gTasks[taskId].data[10]; - if (++gTasks[taskId].data[2] == 4) - gTasks[taskId].data[0] = 4; - else - gTasks[taskId].data[0] = 3; - } - break; - case 3: - if (++gTasks[taskId].data[3] == 4) - { - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[0] = 1; - PlaySE12WithPanning(SE_W234, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER_NEG)); - } - break; - case 4: - sub_8078914(&subStruct); - DmaFill32Large(3, 0, subStruct.field_0, 0x2000, 0x1000); - DmaClear32(3, subStruct.field_4, 0x800); - - if (!IsContest()) - REG_BG1CNT_BITFIELD.charBaseBlock = 0; - - REG_BG1CNT_BITFIELD.priority = 1; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroyAnimVisualTask(taskId); - break; - } -} - -static void sub_812DEAC(struct Sprite *sprite) -{ - s16 var0; - u8 spriteId1; - u8 spriteId2; - - var0 = Random(); - var0 &= 0x3F; - if (var0 > 31) - var0 = 32 - var0; - - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + var0; - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 32; - sprite->data[1] = gBattleAnimArgs[0]; - sprite->data[2] = gBattleAnimArgs[1]; - - spriteId1 = CreateSprite(&gBattleAnimSpriteTemplate_84025EC, sprite->pos1.x, sprite->pos1.y, sprite->subpriority + 1); - spriteId2 = CreateSprite(&gBattleAnimSpriteTemplate_84025EC, sprite->pos1.x, sprite->pos1.y, sprite->subpriority + 1); - StartSpriteAnim(&gSprites[spriteId1], 1); - StartSpriteAnim(&gSprites[spriteId2], 2); - - gSprites[spriteId1].data[1] = gBattleAnimArgs[0]; - gSprites[spriteId1].data[2] = gBattleAnimArgs[1]; - gSprites[spriteId2].data[1] = gBattleAnimArgs[0]; - gSprites[spriteId2].data[2] = gBattleAnimArgs[1]; - gSprites[spriteId1].data[7] = -1; - gSprites[spriteId2].data[7] = -1; - gSprites[spriteId1].invisible = 1; - gSprites[spriteId2].invisible = 1; - gSprites[spriteId1].callback = sub_812E0F8; - gSprites[spriteId2].callback = sub_812E0F8; - - sprite->data[6] = spriteId1; - sprite->data[7] = spriteId2; - sprite->callback = sub_812DFEC; -} - -static void sub_812DFEC(struct Sprite *sprite) -{ - int var0; - s8 var1; - - var0 = (u16)sprite->data[2] + (u16)sprite->data[3]; - var1 = var0 >> 8; - sprite->pos2.y -= var1; - sprite->data[3] = var0 & 0xFF; - if (sprite->data[4] == 0 && sprite->pos2.y < -8) - { - gSprites[sprite->data[6]].invisible = 0; - sprite->data[4]++; - } - - if (sprite->data[4] == 1 && sprite->pos2.y < -16) - { - gSprites[sprite->data[7]].invisible = 0; - sprite->data[4]++; - } - - if (--sprite->data[1] == -1) - { - sprite->invisible = 1; - sprite->callback = sub_812E09C; - } -} - -static void sub_812E09C(struct Sprite *sprite) -{ - if (gSprites[sprite->data[6]].callback == SpriteCallbackDummy - && gSprites[sprite->data[7]].callback == SpriteCallbackDummy) - { - DestroySprite(&gSprites[sprite->data[6]]); - DestroySprite(&gSprites[sprite->data[7]]); - DestroyAnimSprite(sprite); - } -} - -static void sub_812E0F8(struct Sprite *sprite) -{ - u16 d2; - register u16 d3 asm("r1"); - int var0; - s8 var1; - - if (!sprite->invisible) - { - d2 = sprite->data[2]; - d3 = sprite->data[3]; - var0 = d2 + d3; - var1 = var0 >> 8; - sprite->pos2.y -= var1; - sprite->data[3] = var0 & 0xFF; - if (--sprite->data[1] == -1) - { - sprite->invisible = 1; - sprite->callback = SpriteCallbackDummy; - } - } -} - -void sub_812E14C(u8 taskId) -{ - struct Struct_sub_8078914 subStruct; - - switch (gTasks[taskId].data[0]) - { - case 0: - REG_BLDCNT = BLDCNT_TGT2_BD | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 - | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1; - REG_BLDALPHA = 0xD03; - REG_BG1CNT_BITFIELD.screenSize = 0; - REG_BG1CNT_BITFIELD.priority = 1; - - if (!IsContest()) - REG_BG1CNT_BITFIELD.charBaseBlock = 1; - - sub_8078914(&subStruct); - DmaClear32(3, subStruct.field_4, 0x1000); - LZDecompressVram(gUnknown_08D2AA98, subStruct.field_4); - LZDecompressVram(gUnknown_08D2A9E0, subStruct.field_0); - LoadCompressedPalette(gUnknown_08D2AA80, subStruct.field_8 * 16, 32); - - if (IsContest()) - { - sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0); - gBattle_BG1_X = -56; - gBattle_BG1_Y = 0; - } - else - { - u8 position = GetBattlerPosition(gBattleAnimTarget); - if (IsDoubleBattle() == TRUE) - { - if (position == B_POSITION_OPPONENT_LEFT) - gBattle_BG1_X = -155; - if (position == B_POSITION_OPPONENT_RIGHT) - gBattle_BG1_X = -115; - if (position == B_POSITION_PLAYER_LEFT) - gBattle_BG1_X = 14; - if (position == B_POSITION_PLAYER_RIGHT) - gBattle_BG1_X = -20; - } - else - { - if (position == B_POSITION_OPPONENT_LEFT) - gBattle_BG1_X = -135; - if (position == B_POSITION_PLAYER_LEFT) - gBattle_BG1_X = -10; - } - - gBattle_BG1_Y = 0; - } - - gTasks[taskId].data[10] = gBattle_BG1_X; - gTasks[taskId].data[11] = gBattle_BG1_Y; - gTasks[taskId].data[0]++; - break; - case 1: - gTasks[taskId].data[3] = 0; - if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) - gBattle_BG1_X = gTasks[taskId].data[10] + gUnknown_08402604[gTasks[taskId].data[2]]; - else - gBattle_BG1_X = gTasks[taskId].data[10] - gUnknown_08402604[gTasks[taskId].data[2]]; - - if (++gTasks[taskId].data[2] == 5) - gTasks[taskId].data[0] = 5; - else - gTasks[taskId].data[0]++; - break; - case 2: - if (--gTasks[taskId].data[1] <= 4) - gTasks[taskId].data[1] = 5; - - REG_BLDALPHA = (gTasks[taskId].data[1] << 8) | 3; - if (gTasks[taskId].data[1] == 5) - gTasks[taskId].data[0]++; - break; - case 3: - if (++gTasks[taskId].data[3] > gUnknown_08402608[gTasks[taskId].data[2]]) - gTasks[taskId].data[0]++; - break; - case 4: - if (++gTasks[taskId].data[1] > 13) - gTasks[taskId].data[1] = 13; - - REG_BLDALPHA = (gTasks[taskId].data[1] << 8) | 3; - if (gTasks[taskId].data[1] == 13) - gTasks[taskId].data[0] = 1; - break; - case 5: - sub_8078914(&subStruct); - DmaClear32(3, subStruct.field_4, 0x800); - - if (!IsContest()) - REG_BG1CNT_BITFIELD.charBaseBlock = 0; - - REG_BG1CNT_BITFIELD.priority = 1; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroyAnimVisualTask(taskId); - break; - } -} - -void sub_812E498(u8 taskId) -{ - if (gTasks[taskId].data[0] == 0) - { - PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402610); - gTasks[taskId].data[0]++; - } - else - { - if (!RunAffineAnimFromTaskData(&gTasks[taskId])) - { - DestroyAnimVisualTask(taskId); - } - } -} - -static void sub_812E4F0(struct Sprite *sprite) -{ - if (sprite->data[0] == 0) - { - InitAnimSpritePos(sprite, 0); - sprite->data[0]++; - } - else if (sprite->data[0]++ > 20) - { - sprite->data[1] += 160; - sprite->data[2] += 128; - - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - sprite->pos2.x = -(sprite->data[1] >> 8); - else - sprite->pos2.x = sprite->data[1] >> 8; - - sprite->pos2.y += sprite->data[2] >> 8; - if (sprite->pos2.y > 64) - DestroyAnimSprite(sprite); - } -} - -void sub_812E568(u8 taskId) -{ - u8 side; - struct Task *task = &gTasks[taskId]; - - if (gBattleAnimArgs[1] == 0) - { - DestroyAnimVisualTask(taskId); - return; - } - - if (gBattleAnimArgs[2] < 0) - gBattleAnimArgs[2] = 0; - if (gBattleAnimArgs[2] > 2) - gBattleAnimArgs[2] = 2; - - task->data[0] = 0; - task->data[1] = 0; - task->data[2] = 0; - task->data[3] = 8 - (2 * gBattleAnimArgs[2]); - task->data[4] = 0x100 + (gBattleAnimArgs[2] * 128); - task->data[5] = gBattleAnimArgs[2] + 2; - task->data[6] = gBattleAnimArgs[1] - 1; - task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - - if (gBattleAnimArgs[0] == 0) - side = GetBattlerSide(gBattleAnimAttacker); - else - side = GetBattlerSide(gBattleAnimTarget); - - if (side == B_SIDE_OPPONENT) - { - task->data[4] *= -1; - task->data[5] *= -1; - } - - PrepareBattlerSpriteForRotScale(task->data[15], 0); - task->func = sub_812E638; -} - -static void sub_812E638(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - gSprites[task->data[15]].pos2.x += task->data[5]; - task->data[2] -= task->data[4]; - obj_id_set_rotscale(task->data[15], 0x100, 0x100, task->data[2]); - sub_8078F9C(task->data[15]); - if (++task->data[1] >= task->data[3]) - { - task->data[1] = 0; - task->data[0]++; - } - break; - case 1: - gSprites[task->data[15]].pos2.x -= task->data[5]; - task->data[2] += task->data[4]; - obj_id_set_rotscale(task->data[15], 0x100, 0x100, task->data[2]); - sub_8078F9C(task->data[15]); - if (++task->data[1] >= task->data[3] * 2) - { - task->data[1] = 0; - task->data[0]++; - } - break; - case 2: - gSprites[task->data[15]].pos2.x += task->data[5]; - task->data[2] -= task->data[4]; - obj_id_set_rotscale(task->data[15], 0x100, 0x100, task->data[2]); - sub_8078F9C(task->data[15]); - if (++task->data[1] >= task->data[3]) - { - if (task->data[6]) - { - task->data[6]--; - task->data[1] = 0; - task->data[0] = 0; - } - else - { - task->data[0]++; - } - } - break; - case 3: - sub_8078F40(task->data[15]); - DestroyAnimVisualTask(taskId); - break; - } -} - -static void sub_812E7A0(struct Sprite *sprite) -{ - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - { - sprite->pos1.x = 0; - sprite->pos1.y = gBattleAnimArgs[0]; - } - else - { - sprite->pos1.x = 240; - sprite->pos1.y = gBattleAnimArgs[0] - 30; - } - - sprite->data[2] = gBattleAnimArgs[2]; - StartSpriteAnim(sprite, gBattleAnimArgs[1]); - sprite->callback = sub_812E7F0; -} - -static void sub_812E7F0(struct Sprite *sprite) -{ - sprite->data[0] += 3; - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - { - sprite->pos1.x += 5; - sprite->pos1.y -= 1; - - if (sprite->pos1.x > 240) - DestroyAnimSprite(sprite); - - sprite->pos2.y = Sin(sprite->data[0] & 0xFF, 16); - } - else - { - sprite->pos1.x -= 5; - sprite->pos1.y += 1; - - if (sprite->pos1.x < 0) - DestroyAnimSprite(sprite); - - sprite->pos2.y = Cos(sprite->data[0] & 0xFF, 16); - } -} - -void sub_812E860(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - task->data[0] = 0; - task->data[1] = 0; - task->data[2] = 0; - task->data[3] = 0; - task->data[12] = 0x20; - task->data[13] = 0x40; - task->data[14] = 0x800; - task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - - PrepareBattlerSpriteForRotScale(task->data[15], 0); - task->func = sub_812E8B4; -} - -static void sub_812E8B4(u8 taskId) -{ - int temp; - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - task->data[2] += 0x200; - if (task->data[2] >= task->data[14]) - { - s16 diff = task->data[14] - task->data[2]; - s16 div = diff / (task->data[14] * 2); - s16 mod = diff % (task->data[14] * 2); - - if ((div & 1) == 0) - { - task->data[2] = task->data[14] - mod; - task->data[0] = 1; - } - else - { - task->data[2] = mod - task->data[14]; - } - } - break; - case 1: - task->data[2] -= 0x200; - if (task->data[2] <= -task->data[14]) - { - s16 diff = task->data[14] - task->data[2]; - s16 div = diff / (task->data[14] * 2); - s16 mod = diff % (task->data[14] * 2); - - if ((1 & div) == 0) - { - task->data[2] = mod - task->data[14]; - task->data[0] = 0; - } - else - { - task->data[2] = task->data[14] - mod; - } - } - break; - case 2: - sub_8078F40(task->data[15]); - DestroyAnimVisualTask(taskId); - return; - } - - obj_id_set_rotscale(task->data[15], 0x100, 0x100, task->data[2]); - sub_8078F9C(task->data[15]); - gSprites[task->data[15]].pos2.x = -(((temp = task->data[2]) >= 0 ? task->data[2] : temp + 63) >> 6); - - if (++task->data[1] > 8) - { - if (task->data[12]) - { - task->data[12]--; - task->data[14] -= task->data[13]; - if (task->data[14] < 16) - task->data[14] = 16; - } - else - { - task->data[0] = 2; - } - } -} - -static void sub_812EA4C(struct Sprite *sprite) -{ - if (sprite->data[0] == 0) - { - if (gBattleAnimArgs[2] == 0) - { - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); - } - - sprite->pos1.x += gBattleAnimArgs[0]; - sprite->pos1.y += gBattleAnimArgs[1]; - sprite->data[1] = 0x80; - sprite->data[2] = 0x300; - sprite->data[3] = gBattleAnimArgs[1]; - sprite->data[0]++; - } - else - { - sprite->pos2.x = sprite->data[1] >> 8; - sprite->pos2.y += sprite->data[2] >> 8; - if (sprite->data[4] == 0 && sprite->pos2.y > -sprite->data[3]) - { - sprite->data[4] = 1; - sprite->data[2] = (-sprite->data[2] / 3) * 2; - } - - sprite->data[1] += 192; - sprite->data[2] += 128; - if (sprite->animEnded) - DestroyAnimSprite(sprite); - } -} - -void sub_812EB10(u8 taskId) -{ - u8 spriteId; - - if (gTasks[taskId].data[0] == 0) - { - if (gBattleAnimArgs[0] == 0) - gTasks[taskId].data[11] = gBattleAnimAttacker; - else - gTasks[taskId].data[11] = gBattleAnimTarget; - - spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - gTasks[taskId].data[10] = spriteId; - PrepareBattlerSpriteForRotScale(spriteId, 0); - - switch (gBattleAnimArgs[1]) - { - case 0: - obj_id_set_rotscale(spriteId, 0xE0, 0x140, 0); - sub_8079A64(spriteId); - break; - case 1: - obj_id_set_rotscale(spriteId, 0xD0, 0x130, 0xF00); - sub_8079A64(spriteId); - if (IsContest() || GetBattlerSide(gTasks[taskId].data[11]) == B_SIDE_PLAYER) - gSprites[spriteId].pos2.y += 16; - break; - case 2: - obj_id_set_rotscale(spriteId, 0xD0, 0x130, 0xF100); - sub_8079A64(spriteId); - if (IsContest() || GetBattlerSide(gTasks[taskId].data[11]) == B_SIDE_PLAYER) - gSprites[spriteId].pos2.y += 16; - break; - } - - gSprites[spriteId].pos2.x = 2; - gTasks[taskId].data[0]++; - } - else - { - spriteId = gTasks[taskId].data[10]; - if (++gTasks[taskId].data[2] == 3) - { - gTasks[taskId].data[2] = 0; - gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x; - } - - if (++gTasks[taskId].data[1] == 13) - { - sub_8078F40(spriteId); - gSprites[spriteId].pos2.x = 0; - gSprites[spriteId].pos2.y = 0; - DestroyAnimVisualTask(taskId); - } - } -} - -static void sub_812EC78(struct Sprite *sprite) -{ - u8 tileOffset; - int rand1; - int rand2; - - tileOffset = Random() % 12; - sprite->oam.tileNum += tileOffset; - rand1 = Random() & 0x1FF; - rand2 = Random() & 0xFF; - - if (rand1 & 1) - sprite->data[0] = 0x5E0 + rand1; - else - sprite->data[0] = 0x5E0 - rand1; - - if (rand2 & 1) - sprite->data[1] = 0x480 + rand2; - else - sprite->data[1] = 0x480 - rand2; - - sprite->data[2] = gBattleAnimArgs[0]; - if (sprite->data[2] == 0) - sprite->pos1.x = -8; - else - sprite->pos1.x = 248; - - sprite->pos1.y = 104; - sprite->callback = sub_812ED24; -} - -static void sub_812ED24(struct Sprite *sprite) -{ - if (sprite->data[2] == 0) - { - sprite->pos2.x += sprite->data[0] >> 8; - sprite->pos2.y -= sprite->data[1] >> 8; - } - else - { - sprite->pos2.x -= sprite->data[0] >> 8; - sprite->pos2.y -= sprite->data[1] >> 8; - } - - sprite->data[0] -= 22; - sprite->data[1] -= 48; - if (sprite->data[0] < 0) - sprite->data[0] = 0; - - if (++sprite->data[3] == 31) - DestroyAnimSprite(sprite); -} - -static void sub_812ED84(struct Sprite *sprite) -{ - REG_WINOUT = 0x1F3F; - REG_DISPCNT |= DISPCNT_OBJWIN_ON; - gBattle_WIN0H = 0; - gBattle_WIN0V = 0; - REG_WIN0H = 0; - REG_WIN0V = 0; - - sprite->data[0] = gBattleAnimArgs[2]; - sub_8078764(sprite, FALSE); - sprite->oam.objMode = ST_OAM_OBJ_WINDOW; - sprite->invisible = 1; - sprite->callback = sub_812EE00; -} - -static void sub_812EE00(struct Sprite *sprite) -{ - switch (sprite->data[1]) - { - case 0: - sprite->invisible = 0; - if (sprite->affineAnimEnded) - sprite->data[1]++; - break; - case 1: - if (--sprite->data[0] == 0) - { - ChangeSpriteAffineAnim(sprite, 1); - sprite->data[1]++; - } - break; - case 2: - if (sprite->affineAnimEnded) - { - sprite->invisible = 1; - sprite->data[1]++; - } - break; - case 3: - REG_WINOUT = 0x3F3F; - REG_DISPCNT ^= DISPCNT_OBJWIN_ON; - DestroyAnimSprite(sprite); - break; - } -} - -static void sub_812EEA4(struct Sprite *sprite) -{ - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); - sprite->data[0] = gBattleAnimArgs[0]; - sprite->data[1] = gBattleAnimArgs[1]; - sprite->callback = sub_812EEEC; - sprite->callback(sprite); -} - -static void sub_812EEEC(struct Sprite *sprite) -{ - sprite->pos2.x = Sin(sprite->data[1], sprite->data[2] >> 8); - sprite->pos2.y = Cos(sprite->data[1], sprite->data[3] >> 8); - sprite->data[1] = (sprite->data[1] + 9) & 0xFF; - - if ((u16)sprite->data[1] < 64 || sprite->data[1] > 195) - sprite->subpriority = GetBattlerSubpriority(gBattleAnimAttacker) - 1; - else - sprite->subpriority = GetBattlerSubpriority(gBattleAnimAttacker) + 1; - - if (sprite->data[5] == 0) - { - sprite->data[2] += 0x400; - sprite->data[3] += 0x100; - sprite->data[4]++; - if (sprite->data[4] == sprite->data[0]) - { - sprite->data[4] = 0; - sprite->data[5] = 1; - } - } - else if (sprite->data[5] == 1) - { - sprite->data[2] -= 0x400; - sprite->data[3] -= 0x100; - sprite->data[4]++; - if (sprite->data[4] == sprite->data[0]) - DestroyAnimSprite(sprite); - } -} - -// Copies the target mon's sprite, and makes a white silhouette that shrinks away. -void AnimTask_RolePlaySilhouette(u8 taskId) -{ - u8 isBackPic; - u32 personality; - u32 otId; - u16 species; - s16 xOffset; - u32 priority; - u8 spriteId; - s16 coord1, coord2; - - GetAnimBattlerSpriteId(ANIM_BATTLER_ATTACKER); - if (IsContest()) - { - isBackPic = 1; - personality = eWRAM_19348Struct->personality; - otId = eWRAM_19348Struct->otId; - species = eWRAM_19348Struct->species; - xOffset = 20; - priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); - } - else - { - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - { - isBackPic = 0; - personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_PERSONALITY); - otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_OT_ID); - if (eTransformStatuses[gBattleAnimTarget].species == SPECIES_NONE) - { - if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); - else - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); - } - else - { - species = eTransformStatuses[gBattleAnimTarget].species; - } - - xOffset = 20; - priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); - } - else - { - isBackPic = 1; - personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_PERSONALITY); - otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_OT_ID); - if (eTransformStatuses[gBattleAnimTarget].species == SPECIES_NONE) - { - if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); - else - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); - } - else - { - species = eTransformStatuses[gBattleAnimTarget].species; - } - - xOffset = -20; - priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); - } - } - - coord1 = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); - coord2 = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); - spriteId = sub_8079F44(species, isBackPic, 0, coord1 + xOffset, coord2, 5, personality, otId); - - gSprites[spriteId].oam.priority = priority; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - FillPalette(RGB_WHITE, (gSprites[spriteId].oam.paletteNum << 4) + 0x100, 32); - gSprites[spriteId].oam.priority = priority; - REG_BLDCNT = BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL; - REG_BLDALPHA = BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]); - - gTasks[taskId].data[0] = spriteId; - gTasks[taskId].func = AnimTask_RolePlaySilhouetteStep1; -} - -static void AnimTask_RolePlaySilhouetteStep1(u8 taskId) -{ - if (gTasks[taskId].data[10]++ > 1) - { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[1]++; - REG_BLDALPHA = ((16 - gTasks[taskId].data[1]) << 8) | gTasks[taskId].data[1]; - if (gTasks[taskId].data[1] == 10) - { - gTasks[taskId].data[10] = 256; - gTasks[taskId].data[11] = 256; - gTasks[taskId].func = sub_812F290; - } - } -} - -static void sub_812F290(u8 taskId) -{ - u8 spriteId = gTasks[taskId].data[0]; - gTasks[taskId].data[10] -= 16; - gTasks[taskId].data[11] += 128; - gSprites[spriteId].oam.affineMode |= 2; - sub_8078FDC(&gSprites[spriteId], 1, gTasks[taskId].data[10], gTasks[taskId].data[11], 0); - if (++gTasks[taskId].data[12] == 9) - { - sub_8079098(&gSprites[spriteId]); - DestroySpriteAndFreeResources_(&gSprites[spriteId]); - gTasks[taskId].func = sub_8078634; - } -} - -void sub_812F314(u8 taskId) -{ - u8 battler; - u16 bgX, bgY; - s16 y, i; - struct ScanlineEffectParams scanlineParams; - struct Task *task = &gTasks[taskId]; - - if (gBattleAnimArgs[0] == 0) - battler = gBattleAnimAttacker; - else - battler = gBattleAnimTarget; - - task->data[0] = 0; - task->data[1] = 0; - task->data[2] = 0; - task->data[3] = 16; - task->data[4] = 0; - task->data[5] = battler; - task->data[6] = 32; - task->data[7] = 0; - task->data[8] = 24; - - if (GetBattlerSide(battler) == B_SIDE_OPPONENT) - task->data[8] *= -1; - - task->data[13] = sub_8077FC0(battler) - 34; - if (task->data[13] < 0) - task->data[13] = 0; - - task->data[14] = task->data[13] + 66; - task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - if (GetBattlerPosition_permutated(battler) == 1) - { - scanlineParams.dmaDest = ®_BG1HOFS; - REG_BLDCNT = 0x3F42; - bgX = gBattle_BG1_X; - bgY = gBattle_BG1_Y; - } - else - { - scanlineParams.dmaDest = ®_BG2HOFS; - REG_BLDCNT = 0x3F44; - bgX = gBattle_BG2_X; - bgY = gBattle_BG2_Y; - } - - for (y = 0, i = 0; y < 160; y++, i += 2) - { - gScanlineEffectRegBuffers[0][i] = bgX; - gScanlineEffectRegBuffers[1][i] = bgX; - gScanlineEffectRegBuffers[0][i + 1] = bgY; - gScanlineEffectRegBuffers[1][i + 1] = bgY; - } - - scanlineParams.dmaControl = 0xA6600001; - scanlineParams.initState = 1; - scanlineParams.unused9 = 0; - ScanlineEffect_SetParams(scanlineParams); - task->func = sub_812F474; -} - -static void sub_812F474(u8 taskId) -{ - struct Task *task; - s16 var1; - s16 var2; - s16 bgX, bgY; - s16 offset; - s16 var0; - s16 i; - s16 sineIndex; - s16 var3; - - task = &gTasks[taskId]; - if (GetBattlerPosition_permutated(task->data[5]) == 1) - { - bgX = gBattle_BG1_X; - bgY = gBattle_BG1_Y; - } - else - { - bgX = gBattle_BG2_X; - bgY = gBattle_BG2_Y; - } - - switch (task->data[0]) - { - case 0: - offset = task->data[14] * 2; - var1 = 0; - var2 = 0; - i = 0; - task->data[1] = (task->data[1] + 2) & 0xFF; - sineIndex = task->data[1]; - task->data[9] = 0x7E0 / task->data[6]; - task->data[10] = -((task->data[7] * 2) / task->data[9]); - task->data[11] = task->data[7]; - var3 = task->data[11] >> 5; - task->data[12] = var3; - var0 = task->data[14]; - while (var0 > task->data[13]) - { - gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][offset + 1] = (i - var2) + bgY; - gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][offset] = bgX + var3 + (gSineTable[sineIndex] >> 5); - sineIndex = (sineIndex + 10) & 0xFF; - task->data[11] += task->data[10]; - var3 = task->data[11] >> 5; - task->data[12] = var3; - - i++; - offset -= 2; - var1 += task->data[6]; - var2 = var1 >> 5; - var0--; - } - - var0 *= 2; - while (var0 >= 0) - { - gScanlineEffectRegBuffers[0][var0] = bgX + 240; - gScanlineEffectRegBuffers[1][var0] = bgX + 240; - var0 -= 2; - } - - if (++task->data[6] > 63) - { - task->data[6] = 64; - task->data[2]++; - if (task->data[2] & 1) - task->data[3]--; - else - task->data[4]++; - - REG_BLDALPHA = (task->data[4] << 8) | task->data[3]; - if (task->data[3] == 0 && task->data[4] == 16) - { - task->data[2] = 0; - task->data[3] = 0; - task->data[0]++; - } - } - else - { - task->data[7] += task->data[8]; - } - break; - case 1: - if (++task->data[2] > 12) - { - gScanlineEffect.state = 3; - task->data[2] = 0; - task->data[0]++; - } - break; - case 2: - task->data[2]++; - if (task->data[2] & 1) - task->data[3]++; - else - task->data[4]--; - - REG_BLDALPHA = (task->data[4] << 8) | task->data[3]; - if (task->data[3] == 16 && task->data[4] == 0) - { - task->data[2] = 0; - task->data[3] = 0; - task->data[0]++; - } - break; - case 3: - DestroyAnimVisualTask(taskId); - break; - } -} - -void sub_812F724(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - task->data[0] = 0; - task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - PrepareAffineAnimInTaskData(&gTasks[taskId], task->data[15], &gUnknown_08402750); - task->func = sub_812F76C; -} - -static void sub_812F76C(u8 taskId) -{ - u16 var0; - - struct Task *task = &gTasks[taskId]; - var0 = task->data[0]; - task->data[0]++; - var0 -= 20; - if (var0 < 23) - { - if (++task->data[1] > 1) - { - task->data[1] = 0; - task->data[2]++; - if (task->data[2] & 1) - gSprites[task->data[15]].pos2.x = 1; - else - gSprites[task->data[15]].pos2.x = -1; - } - } - else - { - gSprites[task->data[15]].pos2.x = 0; - } - - if (!RunAffineAnimFromTaskData(&gTasks[taskId])) - DestroyAnimVisualTask(taskId); -} - -static void sub_812F804(struct Sprite *sprite, s16 b, s16 c, s16 d, s16 e, u16 f) -{ - sprite->pos1.x = b; - sprite->pos1.y = c; - sprite->data[4] = b << 4; - sprite->data[5] = c << 4; - sprite->data[6] = ((d - b) << 4) / f; - sprite->data[7] = ((e - c) << 4) / f; -} - -void sub_812F86C(struct Sprite *sprite) -{ - sprite->data[4] += sprite->data[6]; - sprite->data[5] += sprite->data[7]; - sprite->pos1.x = sprite->data[4] >> 4; - sprite->pos1.y = sprite->data[5] >> 4; -} - -static void sub_812F88C(struct Sprite *sprite) -{ - s16 x = sprite->pos1.x; - s16 y = sprite->pos1.y; - - sub_8078650(sprite); - StartSpriteAffineAnim(sprite, gBattleAnimArgs[0]); - sub_812F804(sprite, sprite->pos1.x, sprite->pos1.y, x, y, 64); - sprite->data[0] = 0; - sprite->callback = sub_812F8DC; -} - -static void sub_812F8DC(struct Sprite *sprite) -{ - int index; - - sprite->data[0]++; - index = (sprite->data[0] * 8) & 0xFF; - sub_812F86C(sprite); - sprite->pos2.y = Sin(index, 8); - if (sprite->data[0] > 58) - { - if (++sprite->data[1] > 1) - { - sprite->data[1] = 0; - sprite->data[2]++; - sprite->invisible = sprite->data[2] & 1; - if (sprite->data[2] > 3) - DestroySpriteAndMatrix(sprite); - } - } -} - -static void sub_812F948(struct Sprite *sprite) -{ - sprite->data[0] = gBattleAnimArgs[3]; - StartSpriteAffineAnim(sprite, gBattleAnimArgs[0]); - if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER) - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[1]; - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[2]; - sprite->callback = sub_80DA48C; -} - -static void sub_812F9B0(u8 taskId) -{ - u16 var0 = 0; - u16 var1 = 0; - - gTasks[taskId].data[0]--; - if ((gTasks[taskId].data[6] & 0x8000) && (--gTasks[taskId].data[1] == -1)) - { - if (gTasks[taskId].data[9] == 0) - { - gTasks[taskId].data[9] = gTasks[taskId].data[4]; - gTasks[taskId].data[4] = -gTasks[taskId].data[4]; - } - else - { - gTasks[taskId].data[9] = 0; - } - - if (gTasks[taskId].data[10] == 0) - { - gTasks[taskId].data[10] = gTasks[taskId].data[5]; - gTasks[taskId].data[5] = -gTasks[taskId].data[5]; - } - else - { - gTasks[taskId].data[10] = 0; - } - - gTasks[taskId].data[1] = gTasks[taskId].data[13]; - } - - var0 = gTasks[taskId].data[7]; - var1 = gTasks[taskId].data[8]; - if (gTasks[taskId].data[2] & 0x8000) - gSprites[gTasks[taskId].data[15]].pos2.x = gTasks[taskId].data[9] - (var0 >> 8); - else - gSprites[gTasks[taskId].data[15]].pos2.x = gTasks[taskId].data[9] + (var0 >> 8); - - if (gTasks[taskId].data[3] & 0x8000) - gSprites[gTasks[taskId].data[15]].pos2.y = gTasks[taskId].data[10] - (var1 >> 8); - else - gSprites[gTasks[taskId].data[15]].pos2.y = gTasks[taskId].data[10] + (var1 >> 8); - - if (gTasks[taskId].data[0] < 1) - { - DestroyTask(taskId); - gAnimVisualTaskCount--; - } -} - -static void sub_812FAF8(u8 taskId) -{ - u16 var0 = 0; - u16 var1 = 0; - - gTasks[taskId].data[0]--; - if ((gTasks[taskId].data[6] & 0x8000) && (--gTasks[taskId].data[1] == -1)) - { - if (gTasks[taskId].data[9] == 0) - { - gTasks[taskId].data[9] = gTasks[taskId].data[4]; - gTasks[taskId].data[4] = -gTasks[taskId].data[4]; - } - else - { - gTasks[taskId].data[9] = var0; - } - - if (gTasks[taskId].data[10] == 0) - { - gTasks[taskId].data[10] = gTasks[taskId].data[5]; - gTasks[taskId].data[5] = -gTasks[taskId].data[5]; - } - else - { - gTasks[taskId].data[10] = 0; - } - - gTasks[taskId].data[1] = gTasks[taskId].data[13]; - } - - var0 = (gTasks[taskId].data[2] & 0x7FFF) + gTasks[taskId].data[7]; - var1 = (gTasks[taskId].data[3] & 0x7FFF) + gTasks[taskId].data[8]; - if (gTasks[taskId].data[2] & 0x8000) - gSprites[gTasks[taskId].data[15]].pos2.x = gTasks[taskId].data[9] - (var0 >> 8); - else - gSprites[gTasks[taskId].data[15]].pos2.x = gTasks[taskId].data[9] + (var0 >> 8); - - if (gTasks[taskId].data[3] & 0x8000) - gSprites[gTasks[taskId].data[15]].pos2.y = gTasks[taskId].data[10] - (var1 >> 8); - else - gSprites[gTasks[taskId].data[15]].pos2.y = gTasks[taskId].data[10] + (var1 >> 8); - - gTasks[taskId].data[7] = var0; - gTasks[taskId].data[8] = var1; - if (gTasks[taskId].data[0] < 1) - { - gTasks[taskId].data[0] = 30; - gTasks[taskId].data[13] = 0; - gTasks[taskId].func = sub_812F9B0; - } -} - -void sub_812FC68(u8 taskId) -{ - gTasks[taskId].data[15] = gBankSpriteIds[gBattleAnimAttacker]; - gTasks[taskId].data[14] = gBattleAnimArgs[0]; - gTasks[taskId].data[0] = gBattleAnimArgs[0]; - gTasks[taskId].data[13] = gBattleAnimArgs[6]; - if (gBattleAnimArgs[3]) - gTasks[taskId].data[6] = gTasks[taskId].data[6] | -0x8000; - - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - { - gTasks[taskId].data[2] = gBattleAnimArgs[1]; - gTasks[taskId].data[3] = gBattleAnimArgs[2]; - } - else - { - if (gBattleAnimArgs[1] & 0x8000) - gTasks[taskId].data[2] = gBattleAnimArgs[1] & 0x7FFF; - else - gTasks[taskId].data[2] = gBattleAnimArgs[1] | -0x8000; - - if (gBattleAnimArgs[2] & 0x8000) - gTasks[taskId].data[3] = gBattleAnimArgs[2] & 0x7FFF; - else - gTasks[taskId].data[3] = gBattleAnimArgs[2] | -0x8000; - } - - gTasks[taskId].data[8] = 0; - gTasks[taskId].data[7] = 0; - gTasks[taskId].data[4] = gBattleAnimArgs[4]; - gTasks[taskId].data[5] = gBattleAnimArgs[5]; - gTasks[taskId].func = sub_812FAF8; -} - -void sub_812FD7C(u8 taskId) -{ - u8 battler; - struct Task *task = &gTasks[taskId]; - - if (gBattleAnimArgs[1] == 0) - DestroyAnimVisualTask(taskId); - - task->data[0] = 0; - task->data[1] = 0; - task->data[2] = 0; - task->data[3] = gBattleAnimArgs[1]; - if (gBattleAnimArgs[0] == 0) - battler = gBattleAnimAttacker; - else - battler = gBattleAnimTarget; - - task->data[4] = GetBattlerSpriteCoord(battler, 0); - task->data[5] = GetBattlerSpriteCoord(battler, 1); - task->data[6] = GetBattlerSubpriority(battler); - task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - PrepareAffineAnimInTaskData(task, task->data[15], &gUnknown_084028AC); - task->func = sub_812FE20; -} - -static void sub_812FE20(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - if (++task->data[1] == 6) - sub_812FEB8(taskId, TRUE); - - if (task->data[1] == 18) - sub_812FEB8(taskId, FALSE); - - if (!RunAffineAnimFromTaskData(task)) - { - if (--task->data[3] == 0) - { - task->data[0]++; - } - else - { - task->data[1] = 0; - PrepareAffineAnimInTaskData(task, task->data[15], &gUnknown_084028AC); - } - } - break; - case 1: - if (task->data[2] == 0) - DestroyAnimVisualTask(taskId); - break; - } -} - -static void sub_812FEB8(u8 taskId, bool8 arg1) -{ - u8 i; - s8 xOffset, yOffset; - struct Task *task; - s16 xCoords[4]; - s16 yCoords[2]; - - task = &gTasks[taskId]; - if (!arg1) - { - xOffset = 18; - yOffset = -20; - } - else - { - xOffset = 30; - yOffset = 20; - } - - xCoords[0] = task->data[4] - xOffset; - xCoords[1] = task->data[4] - xOffset - 4; - xCoords[2] = task->data[4] + xOffset; - xCoords[3] = task->data[4] + xOffset + 4; - yCoords[0] = task->data[5] + yOffset; - yCoords[1] = task->data[5] + yOffset + 6; - - for (i = 0; i < 4; i++) - { - u8 spriteId = CreateSprite(&gSpriteTemplate_84028CC, xCoords[i], yCoords[i & 1], task->data[6] - 5); - if (spriteId != MAX_SPRITES) - { - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = i < 2 ? -2 : 2; - gSprites[spriteId].data[2] = -1; - gSprites[spriteId].data[3] = taskId; - gSprites[spriteId].data[4] = 2; - task->data[2]++; - } - } -} - -static void sub_812FF94(struct Sprite *sprite) -{ - sprite->pos1.x += sprite->data[1]; - sprite->pos1.y += sprite->data[2]; - if (++sprite->data[0] > 6) - { - gTasks[sprite->data[3]].data[sprite->data[4]]--; - DestroySprite(sprite); - } -} - -void sub_812FFE4(u8 taskId) -{ - u8 spriteId; - - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = gBattleAnimArgs[1]; - spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - gTasks[taskId].data[2] = 0x100 + gSprites[spriteId].oam.paletteNum * 16; - gTasks[taskId].func = sub_813003C; -} - -static void sub_813003C(u8 taskId) -{ - if (gTasks[taskId].data[1]) - { - BlendPalette(gTasks[taskId].data[2], 16, 8, gUnknown_084028E4[gTasks[taskId].data[0]]); - if (++gTasks[taskId].data[0] > 23) - gTasks[taskId].data[0] = 0; - - gTasks[taskId].data[1]--; - } - else - { - BlendPalette(gTasks[taskId].data[2], 16, 0, RGB(0, 0, 0)); - DestroyAnimVisualTask(taskId); - } -} - -void sub_81300A4(u8 taskId) -{ - sub_80E3C4C( - taskId, - 0, - 0x1A0, - gBattleAnimAttacker, - gBattleAnimArgs[0], - 10, - 2, - 30, - gUnknown_08D2E014, - gUnknown_08D2E170, - gUnknown_08D2E150); -} - -static void sub_81300F4(struct Sprite *sprite) -{ - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) - gBattleAnimArgs[0] = -gBattleAnimArgs[0]; - - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + gBattleAnimArgs[0]; - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + gBattleAnimArgs[1]; - if (gBattleAnimArgs[2] == 0) - { - sprite->data[0] = 640; - sprite->data[1] = -640; - } - else if (gBattleAnimArgs[2] == 1) - { - sprite->vFlip = 1; - sprite->data[0] = 640; - sprite->data[1] = 640; - } - else - { - StartSpriteAnim(sprite, 1); - sprite->data[0] = 640; - } - - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - { - sprite->data[0] = -sprite->data[0]; - sprite->hFlip = 1; - } - - sprite->callback = sub_81301B4; -} - -static void sub_81301B4(struct Sprite *sprite) -{ - sprite->data[6] += sprite->data[0]; - sprite->data[7] += sprite->data[1]; - sprite->pos2.x = sprite->data[6] >> 8; - sprite->pos2.y = sprite->data[7] >> 8; - if (++sprite->data[5] == 14) - DestroyAnimSprite(sprite); -} - -void sub_81301EC(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - if (IsContest()) - { - task->data[5] = 8; - task->data[6] = 3; - task->data[7] = 1; - } - else - { - task->data[5] = 12; - task->data[6] = 3; - task->data[7] = 0; - } - - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + GetBattlerSpriteCoordAttr(gBattleAnimAttacker, 0) / 4; - else - task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, 0) / 4; - - task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, 0) / 4; - task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); - task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); - task->func = sub_81302E4; -} - -static void sub_81302E4(u8 taskId) -{ - u8 i; - s16 x, y; - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - if (++task->data[1] > 3) - { - task->data[1] = 0; - sub_8130424( - task->data[11], - task->data[12], - task->data[13], - task->data[14], - task->data[5], - task->data[2], - &x, - &y); - - for (i = 0; i < 2; i++) - { - u8 spriteId = CreateSprite(&gSpriteTemplate_840294C, x, y, 35); - if (spriteId != MAX_SPRITES) - { - if (task->data[7] == 0) - { - if (i == 0) - gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = -task->data[6]; - else - gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = task->data[6]; - } - else - { - if (i == 0) - { - gSprites[spriteId].pos2.x = -task->data[6]; - gSprites[spriteId].pos2.y = task->data[6]; - } - else - { - gSprites[spriteId].pos2.x = task->data[6]; - gSprites[spriteId].pos2.y = -task->data[6]; - } - } - - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = taskId; - gSprites[spriteId].data[2] = 10; - task->data[10]++; - } - } - - if (task->data[2] == task->data[5]) - task->data[0]++; - - task->data[2]++; - } - break; - case 1: - if (task->data[10] == 0) - DestroyAnimVisualTask(taskId); - break; - } -} - -static void sub_8130424(s16 arg0, s16 arg1, s16 arg2, s16 arg3, u8 arg4, u8 arg5, s16 *x, s16 *y) -{ - int x2; - int y2; - - if (arg5 == 0) - { - *x = arg0; - *y = arg1; - return; - } - - if (arg5 >= arg4) - { - *x = arg2; - *y = arg3; - return; - } - - arg4--; - x2 = (arg0 << 8) + arg5 * (((arg2 - arg0) << 8) / arg4); - y2 = (arg1 << 8) + arg5 * (((arg3 - arg1) << 8) / arg4); - *x = x2 >> 8; - *y = y2 >> 8; -} - -static void sub_81304DC(struct Sprite *sprite) -{ - if (++sprite->data[0] > 36) - { - gTasks[sprite->data[1]].data[sprite->data[2]]--; - DestroySprite(sprite); - } -} - -static void sub_813051C(struct Sprite *sprite) -{ - sprite->pos1.x = gBattleAnimArgs[0]; - sprite->pos1.y = gBattleAnimArgs[1]; - sprite->data[2] = gBattleAnimArgs[2]; - sprite->data[4] = gBattleAnimArgs[3]; - sprite->data[0] = gBattleAnimArgs[4]; - StoreSpriteCallbackInData(sprite, DestroyAnimSprite); - sprite->callback = sub_8078CC0; -} - -void sub_8130554(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); - task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); - task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + GetBattlerSpriteCoordAttr(gBattleAnimTarget, 0) / 4; - task->data[15] = CreateSprite(&gSpriteTemplate_84029AC, task->data[11], task->data[12], GetBattlerSubpriority(gBattleAnimTarget) - 5); - if (task->data[15] != MAX_SPRITES) - { - gSprites[task->data[15]].data[0] = 16; - gSprites[task->data[15]].data[2] = task->data[13]; - gSprites[task->data[15]].data[4] = task->data[14]; - gSprites[task->data[15]].data[5] = -32; - InitAnimArcTranslation(&gSprites[task->data[15]]); - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) - StartSpriteAffineAnim(&gSprites[task->data[15]], 1); - - task->func = sub_81306A4; - } - else - { - DestroyAnimVisualTask(taskId); - } -} - -static void sub_81306A4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - if (++task->data[1] > 1) - { - task->data[1] = 0; - TranslateAnimArc(&gSprites[task->data[15]]); - if (++task->data[2] > 7) - task->data[0]++; - } - break; - case 1: - if (TranslateAnimArc(&gSprites[task->data[15]])) - { - task->data[1] = 0; - task->data[2] = 0; - task->data[0]++; - } - break; - case 2: - if (++task->data[1] > 1) - { - task->data[1] = 0; - task->data[2]++; - gSprites[task->data[15]].invisible = task->data[2] & 1; - if (task->data[2] == 16) - { - FreeOamMatrix(gSprites[task->data[15]].oam.matrixNum); - DestroySprite(&gSprites[task->data[15]]); - task->data[0]++; - } - } - break; - case 3: - DestroyAnimVisualTask(taskId); - break; - } -} - -static void sub_81307B0(struct Sprite *sprite) -{ - u8 battler; - - if (gBattleAnimArgs[0] == 0) - battler = gBattleAnimAttacker; - else - battler = gBattleAnimTarget; - - sprite->oam.tileNum += 16; - sprite->data[6] = gBattleAnimArgs[2]; - sprite->data[7] = gBattleAnimArgs[1] == 0 ? -1 : 1; - sprite->pos1.y = GetBattlerSpriteCoord(battler, 3); - if (gBattleAnimArgs[1] == 0) - { - sprite->oam.matrixNum |= 0x8; - sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, 4) - 8; - } - else - { - sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, 5) + 8; - } - - sprite->callback = sub_813085C; -} - -static void sub_813085C(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - if (++sprite->data[1] > 1) - { - sprite->data[1] = 0; - sprite->pos2.x += sprite->data[7]; - if (++sprite->data[2] == 12) - sprite->data[0]++; - } - break; - case 1: - if (++sprite->data[1] == 8) - { - sprite->data[1] = 0; - sprite->data[0]++; - } - break; - case 2: - sprite->pos2.x -= sprite->data[7] * 4; - if (++sprite->data[1] == 6) - { - sprite->data[1] = 0; - sprite->data[0]++; - } - break; - case 3: - sprite->pos2.x += sprite->data[7] * 3; - if (++sprite->data[1] == 8) - { - if (--sprite->data[6]) - { - sprite->data[1] = 0; - sprite->data[0]--; - } - else - { - DestroyAnimSprite(sprite); - } - } - break; - } -} - -void sub_8130918(u8 taskId) -{ - if (gBattleAnimArgs[0] == 0) - { - DestroyAnimVisualTask(taskId); - } - else - { - gTasks[taskId].data[0] = gBattleAnimArgs[1]; - gTasks[taskId].data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], &gUnknown_084029DC); - gTasks[taskId].func = sub_8130970; - } -} - -static void sub_8130970(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - if (++task->data[1] > 1) - { - task->data[1] = 0; - if (!(task->data[2] & 1)) - gSprites[task->data[15]].pos2.x = 2; - else - gSprites[task->data[15]].pos2.x = -2; - } - - if (!RunAffineAnimFromTaskData(task)) - { - gSprites[task->data[15]].pos2.x = 0; - if (--task->data[0]) - { - PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], &gUnknown_084029DC); - task->data[1] = 0; - task->data[2] = 0; - } - else - { - DestroyAnimVisualTask(taskId); - } - } -} - -static void sub_8130A2C(struct Sprite *sprite) -{ - if (gBattleAnimArgs[0] == 0) - { - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, 2); - } - else - { - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2); - sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimTarget, 2); - } - - if (sprite->pos1.y < 8) - sprite->pos1.y = 8; - - sprite->data[0] = 0; - sprite->data[1] = gBattleAnimArgs[1]; - sprite->data[2] = 0; - sprite->data[3] = gBattleAnimArgs[2]; - sprite->callback = sub_8130A94; -} - -static void sub_8130A94(struct Sprite *sprite) -{ - if (++sprite->data[0] >= sprite->data[1]) - { - sprite->data[0] = 0; - sprite->data[2] = (sprite->data[2] + 1) & 1; - sprite->invisible = sprite->data[2]; - if (sprite->data[2] && --sprite->data[3] == 0) - DestroyAnimSprite(sprite); - } -} - -static void sub_8130AEC(struct Sprite *sprite) -{ - if (gBattleAnimArgs[0] == 0) - { - sprite->oam.matrixNum |= 0x8; - sprite->pos1.x = 100; - sprite->data[7] = 1; - } - else - { - sprite->pos1.x = 140; - sprite->data[7] = -1; - } - - sprite->pos1.y = 56; - sprite->callback = sub_8130B38; -} - -static void sub_8130B38(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - sprite->pos1.y -= sprite->data[7] * 2; - if (sprite->data[1] & 1) - sprite->pos1.x -= sprite->data[7] * 2; - - if (++sprite->data[1] == 9) - { - sprite->data[1] = 0; - sprite->data[0]++; - } - break; - case 1: - if (++sprite->data[1] == 4) - { - sprite->data[1] = 0; - sprite->data[0]++; - } - break; - case 2: - sprite->data[1]++; - sprite->pos1.y += sprite->data[7] * 3; - sprite->pos2.x = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3); - if (sprite->data[1] == 12) - { - sprite->data[1] = 0; - sprite->data[0]++; - } - break; - case 3: - if (++sprite->data[1] == 2) - { - sprite->data[1] = 0; - sprite->data[0]++; - } - break; - case 4: - sprite->data[1]++; - sprite->pos1.y -= sprite->data[7] * 3; - sprite->pos2.x = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3); - if (sprite->data[1] == 12) - sprite->data[0]++; - break; - case 5: - sprite->data[1]++; - sprite->pos1.y += sprite->data[7] * 3; - sprite->pos2.x = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3); - if (sprite->data[1] == 15) - sprite->oam.tileNum += 16; - - if (sprite->data[1] == 18) - { - sprite->data[1] = 0; - sprite->data[0]++; - } - break; - case 6: - sprite->pos1.x += sprite->data[7] * 6; - if (++sprite->data[1] == 9) - { - sprite->data[1] = 0; - sprite->data[0]++; - } - break; - case 7: - sprite->pos1.x += sprite->data[7] * 2; - if (++sprite->data[1] == 1) - { - sprite->data[1] = 0; - sprite->data[0]++; - } - break; - case 8: - sprite->pos1.x -= sprite->data[7] * 3; - if (++sprite->data[1] == 5) - DestroyAnimSprite(sprite); - break; - } -} - -void sub_8130D20(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - task->data[15] = GetAnimBattlerSpriteId(0); - if (!IsContest()) - { - if (IsDoubleBattle() == TRUE) - { - int x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); - int y = GetBattlerSpriteCoord(gBattleAnimAttacker ^ 2, 0); - if (x > y) - task->data[14] = 1; - else - task->data[14] = -1; - } - else - { - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - task->data[14] = -1; - else - task->data[14] = 1; - } - } - else - { - task->data[14] = 1; - } - - task->func = sub_8130DBC; -} - -static void sub_8130DBC(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - if (++task->data[1] == 13) - { - task->data[1] = 0; - task->data[0]++; - } - break; - case 1: - gSprites[task->data[15]].pos2.x -= task->data[14] * 3; - if (++task->data[1] == 6) - { - task->data[1] = 0; - task->data[0]++; - } - break; - case 2: - gSprites[task->data[15]].pos2.x += task->data[14] * 3; - if (++task->data[1] == 6) - { - task->data[1] = 0; - task->data[0]++; - } - break; - case 3: - if (++task->data[1] == 2) - { - task->data[1] = 0; - if (task->data[2] == 0) - { - task->data[2]++; - task->data[0] = 1; - } - else - { - task->data[0]++; - } - } - break; - case 4: - gSprites[task->data[15]].pos2.x += task->data[14]; - if (++task->data[1] == 3) - { - task->data[1] = 0; - task->data[0]++; - } - break; - case 5: - if (++task->data[1] == 6) - { - task->data[1] = 0; - task->data[0]++; - } - break; - case 6: - gSprites[task->data[15]].pos2.x -= task->data[14] * 4; - if (++task->data[1] == 5) - { - task->data[1] = 0; - task->data[0]++; - } - break; - case 7: - gSprites[task->data[15]].pos2.x += task->data[14] * 4; - if (++task->data[1] == 5) - { - task->data[1] = 0; - task->data[0]++; - } - break; - case 8: - gSprites[task->data[15]].pos2.x = 0; - DestroyAnimVisualTask(taskId); - break; - } -} - -static void sub_8130F5C(struct Sprite *sprite) -{ - if (gBattleAnimArgs[0] == 0) - { - InitAnimSpritePos(sprite, 1); - sprite->data[7] = gBattleAnimAttacker; - } - else - { - sprite->data[7] = gBattleAnimTarget; - } - - if (GetBattlerSide(sprite->data[7]) == B_SIDE_OPPONENT) - sprite->oam.matrixNum = 8; - - sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]); - sprite->oam.objMode = ST_OAM_OBJ_BLEND; - sprite->callback = sub_8130FE0; -} - -static void sub_8130FE0(struct Sprite *sprite) -{ - u16 x, y; - - switch (sprite->data[5]) - { - case 0: - switch (sprite->data[6]) - { - default: - sprite->data[6] = 0; - case 0: - case 4: - x = GetBattlerSpriteCoordAttr(sprite->data[7], 5) - 4; - y = GetBattlerSpriteCoordAttr(sprite->data[7], 3) - 4; - break; - case 1: - x = GetBattlerSpriteCoordAttr(sprite->data[7], 5) - 4; - y = GetBattlerSpriteCoordAttr(sprite->data[7], 2) + 4; - break; - case 2: - x = GetBattlerSpriteCoordAttr(sprite->data[7], 4) + 4; - y = GetBattlerSpriteCoordAttr(sprite->data[7], 3) - 4; - break; - case 3: - x = GetBattlerSpriteCoordAttr(sprite->data[7], 4) + 4; - y = GetBattlerSpriteCoordAttr(sprite->data[7], 2) - 4; - break; - case 5: - x = GetBattlerSpriteCoord(sprite->data[7], 2); - y = GetBattlerSpriteCoord(sprite->data[7], 3); - break; - } - - if (sprite->data[6] == 4) - sprite->data[0] = 24; - else if (sprite->data[6] == 5) - sprite->data[0] = 6; - else - sprite->data[0] = 12; - - sprite->data[1] = sprite->pos1.x; - sprite->data[2] = x; - sprite->data[3] = sprite->pos1.y; - sprite->data[4] = y; - InitAnimLinearTranslation(sprite); - sprite->data[5]++; - break; - case 1: - if (TranslateAnimLinear(sprite)) - { - switch (sprite->data[6]) - { - default: - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.y = 0; - sprite->pos2.x = 0; - sprite->data[0] = 0; - sprite->data[5]++; - sprite->data[6]++; - break; - case 4: - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.y = 0; - sprite->pos2.x = 0; - sprite->data[5] = 0; - sprite->data[6]++; - break; - case 5: - sprite->data[0] = 0; - sprite->data[1] = 16; - sprite->data[2] = 0; - sprite->data[5] = 3; - break; - } - } - break; - case 2: - if (++sprite->data[0] == 4) - sprite->data[5] = 0; - break; - case 3: - if (!(sprite->data[0] & 1)) - sprite->data[1]--; - else - sprite->data[2]++; - - REG_BLDALPHA = (sprite->data[2] << 8) | sprite->data[1]; - if (++sprite->data[0] == 32) - { - sprite->invisible = 1; - sprite->data[5]++; - } - break; - case 4: - DestroyAnimSprite(sprite); - break; - } -} - -static void sub_81311E4(struct Sprite *sprite) -{ - sprite->pos2.x = ((sprite->data[2] - sprite->data[0]) * sprite->data[5]) / sprite->data[4]; - sprite->pos2.y = ((sprite->data[3] - sprite->data[1]) * sprite->data[5]) / sprite->data[4]; - if (!(sprite->data[5] & 1)) - { - CreateSprite( - &gSpriteTemplate_8402500, - sprite->pos1.x + sprite->pos2.x, - sprite->pos1.y + sprite->pos2.y, 5); - } - - if (sprite->data[5] == sprite->data[4]) - DestroyAnimSprite(sprite); - - sprite->data[5]++; -} - -static void sub_8131264(struct Sprite *sprite) -{ - GetBattlerSpriteCoord(gBattleAnimTarget, 2); // unused local variable - GetBattlerSpriteCoord(gBattleAnimTarget, 3); // unused local variable - - if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER || IsContest()) - { - sprite->data[0] = sprite->pos1.x - gBattleAnimArgs[0]; - sprite->data[2] = sprite->pos1.x - gBattleAnimArgs[2]; - } - else - { - sprite->data[0] = sprite->pos1.x + gBattleAnimArgs[0]; - sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; - } - - sprite->data[1] = sprite->pos1.y + gBattleAnimArgs[1]; - sprite->data[3] = sprite->pos1.y + gBattleAnimArgs[3]; - sprite->data[4] = gBattleAnimArgs[4]; - sprite->pos1.x = sprite->data[0]; - sprite->pos1.y = sprite->data[1]; - sprite->callback = sub_81311E4; -} - -void sub_81312E4(u8 taskId) -{ - int i; - u8 spriteId = GetAnimBattlerSpriteId(0); - - if (gTasks[taskId].data[0] == 0) - { - PrepareBattlerSpriteForRotScale(spriteId, 0); - gTasks[taskId].data[1] = 0x100; - gTasks[taskId].data[2] = 0x100; - gTasks[taskId].data[0]++; - } - else if (gTasks[taskId].data[0] == 1) - { - gTasks[taskId].data[1] += 0x60; - gTasks[taskId].data[2] -= 0xD; - obj_id_set_rotscale(spriteId, gTasks[taskId].data[1], gTasks[taskId].data[2], 0); - if (++gTasks[taskId].data[3] == 9) - { - gTasks[taskId].data[3] = 0; - sub_8078F40(spriteId); - gSprites[spriteId].invisible = 1; - gTasks[taskId].data[0]++; - } - } - else - { - refresh_graphics_maybe(gBattleAnimAttacker, 0, spriteId); - if (IsContest()) - { - gSprites[gBankSpriteIds[gBattleAnimAttacker]].affineAnims = gSpriteAffineAnimTable_81E7C18; - StartSpriteAffineAnim(&gSprites[gBankSpriteIds[gBattleAnimAttacker]], 0); - } - - for (i = 0; i < 16; i++) - gTasks[taskId].data[i] = 0; - - gTasks[taskId].func = sub_8131408; - } -} - -static void sub_8131408(u8 taskId) -{ - u8 spriteId = GetAnimBattlerSpriteId(0); - - switch (gTasks[taskId].data[0]) - { - case 0: - gSprites[spriteId].pos2.y = -200; - gSprites[spriteId].pos2.x = 200; - gSprites[spriteId].invisible = 0; - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0]++; - break; - case 1: - gTasks[taskId].data[10] += 112; - gSprites[spriteId].pos2.y += gTasks[taskId].data[10] >> 8; - if (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y >= -32) - gSprites[spriteId].pos2.x = 0; - - if (gSprites[spriteId].pos2.y > 0) - gSprites[spriteId].pos2.y = 0; - - if (gSprites[spriteId].pos2.y == 0) - { - PlaySE12WithPanning(SE_W145B, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER_NEG)); - gTasks[taskId].data[10] -= 0x800; - gTasks[taskId].data[0]++; - } - break; - case 2: - gTasks[taskId].data[10] -= 112; - if (gTasks[taskId].data[10] < 0) - gTasks[taskId].data[10] = 0; - - gSprites[spriteId].pos2.y -= gTasks[taskId].data[10] >> 8; - if (gTasks[taskId].data[10] == 0) - gTasks[taskId].data[0]++; - break; - case 3: - gTasks[taskId].data[10] += 112; - gSprites[spriteId].pos2.y += gTasks[taskId].data[10] >> 8; - if (gSprites[spriteId].pos2.y > 0) - gSprites[spriteId].pos2.y = 0; - - if (gSprites[spriteId].pos2.y == 0) - { - PlaySE12WithPanning(SE_W145B, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER_NEG)); - DestroyAnimVisualTask(taskId); - } - break; - } -} - -static void sub_8131564(struct Sprite *sprite) -{ - s16 y2; - - if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) - { - sprite->subpriority = GetBattlerSubpriority(gBattleAnimTarget) - 2; - y2 = -144; - } - else - { - sprite->subpriority = GetBattlerSubpriority(gBattleAnimTarget) + 2; - y2 = -96; - } - - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3); - sprite->pos2.y = y2; - sprite->callback = sub_81315C8; -} - -static void sub_81315C8(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - sprite->pos2.y += 10; - if (sprite->pos2.y >= 0) - { - PlaySE12WithPanning(SE_W166, BattleAnimAdjustPanning(SOUND_PAN_TARGET)); - sprite->pos2.y = 0; - sprite->data[0]++; - } - break; - case 1: - sprite->data[1] += 4; - sprite->pos2.y = -(gSineTable[sprite->data[1]] >> 3); - if (sprite->data[1] > 127) - { - PlaySE12WithPanning(SE_W166, BattleAnimAdjustPanning(SOUND_PAN_TARGET)); - sprite->data[1] = 0; - sprite->pos2.y = 0; - sprite->data[0]++; - } - break; - case 2: - sprite->data[1] += 6; - sprite->pos2.y = -(gSineTable[sprite->data[1]] >> 4); - if (sprite->data[1] > 127) - { - sprite->data[1] = 0; - sprite->pos2.y = 0; - sprite->data[0]++; - } - break; - case 3: - if (++sprite->data[1] > 8) - { - PlaySE12WithPanning(SE_W043, BattleAnimAdjustPanning(SOUND_PAN_TARGET)); - sprite->data[1] = 0; - sprite->data[0]++; - } - break; - case 4: - if (++sprite->data[1] > 8) - { - sprite->data[1] = 0; - sprite->data[2]++; - sprite->invisible = sprite->data[2] & 1; - if (sprite->data[2] == 7) - DestroyAnimSprite(sprite); - } - break; - } -} - -void sub_81316F8(u8 taskId) -{ - s16 spriteId1, spriteId2; - - if (IsContest()) - { - DestroyAnimVisualTask(taskId); - return; - } - - spriteId1 = duplicate_obj_of_side_rel2move_in_transparent_mode(1); - if (spriteId1 < 0) - { - DestroyAnimVisualTask(taskId); - return; - } - - spriteId2 = duplicate_obj_of_side_rel2move_in_transparent_mode(1); - if (spriteId2 < 0) - { - obj_delete_but_dont_free_vram(&gSprites[spriteId1]); - DestroyAnimVisualTask(taskId); - return; - } - - gSprites[spriteId2].pos2.x += 24; - gSprites[spriteId1].pos2.x -= 24; - gSprites[spriteId2].data[0] = 0; - gSprites[spriteId1].data[0] = 0; - gSprites[spriteId2].data[1] = 0; - gSprites[spriteId1].data[1] = 0; - gSprites[spriteId2].data[2] = 0; - gSprites[spriteId1].data[2] = 0; - gSprites[spriteId2].data[3] = 16; - gSprites[spriteId1].data[3] = -16; - gSprites[spriteId2].data[4] = 0; - gSprites[spriteId1].data[4] = 128; - gSprites[spriteId2].data[5] = 24; - gSprites[spriteId1].data[5] = 24; - gSprites[spriteId2].data[6] = taskId; - gSprites[spriteId1].data[6] = taskId; - gSprites[spriteId2].data[7] = 0; - gSprites[spriteId1].data[7] = 0; - gTasks[taskId].data[0] = 2; - gSprites[spriteId2].invisible = 0; - gSprites[spriteId1].invisible = 1; - gSprites[spriteId2].oam.objMode = ST_OAM_OBJ_NORMAL; - gSprites[spriteId1].oam.objMode = ST_OAM_OBJ_NORMAL; - gSprites[spriteId2].callback = sub_8131838; - gSprites[spriteId1].callback = sub_8131838; - gTasks[taskId].func = sub_8131810; -} - -static void sub_8131810(u8 taskId) -{ - if (gTasks[taskId].data[0] == 0) - DestroyAnimVisualTask(taskId); -} - -static void sub_8131838(struct Sprite *sprite) -{ - if (++sprite->data[1] > 1) - { - sprite->data[1] = 0; - sprite->invisible ^= 1; - } - - sprite->data[4] = (sprite->data[4] + sprite->data[3]) & 0xFF; - sprite->pos2.x = Cos(sprite->data[4], sprite->data[5]); - switch (sprite->data[0]) - { - case 0: - if (++sprite->data[2] == 60) - { - sprite->data[2] = 0; - sprite->data[0]++; - } - break; - case 1: - if (++sprite->data[2] > 0) - { - sprite->data[2] = 0; - sprite->data[5] -= 2; - if (sprite->data[5] < 0) - { - gTasks[sprite->data[6]].data[sprite->data[7]]--; - obj_delete_but_dont_free_vram(sprite); - } - } - break; - } -} - -void AnimTask_GetReturnPowerLevel(u8 taskId) -{ - gBattleAnimArgs[7] = 0; - if (gAnimFriendship < 60) - gBattleAnimArgs[7] = 0; - if (gAnimFriendship > 60 && gAnimFriendship < 92) - gBattleAnimArgs[7] = 1; - if (gAnimFriendship > 91 && gAnimFriendship < 201) - gBattleAnimArgs[7] = 2; - if (gAnimFriendship > 200) - gBattleAnimArgs[7] = 3; - - DestroyAnimVisualTask(taskId); -} - -#ifdef NONMATCHING -// Makes the mon run out of screen, run past the opposing mon, and return to its original position. -// No args. -void AnimTask_SnatchOpposingMonMove(u8 taskId) -{ - u8 spriteId, spriteId2; - u32 personality; - u32 otId; - u16 species; - u8 subpriority; - u8 isBackPic; - s16 x; - - switch (gTasks[taskId].data[0]) - { - case 0: - spriteId = GetAnimBattlerSpriteId(ANIM_BATTLER_ATTACKER); - gTasks[taskId].data[1] += 0x800; - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - gSprites[spriteId].pos2.x += (gTasks[taskId].data[1] >> 8); - else - gSprites[spriteId].pos2.x -= (gTasks[taskId].data[1] >> 8); - - gTasks[taskId].data[1] &= 0xFF; - x = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; - if ((u16)(x + 32) > 304) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - break; - case 1: - if (IsContest()) - { - personality = eWRAM_19348Struct->personality; - otId = eWRAM_19348Struct->otId; - species = eWRAM_19348Struct->species; - subpriority = GetBattlerSubpriority(gBattleAnimAttacker); - isBackPic = 0; - x = -32; - } - else - { - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - { - personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY); - otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID); - if (eTransformStatuses[gBattleAnimTarget].species == SPECIES_NONE) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - else - species = eTransformStatuses[gBattleAnimTarget].species; - - subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_BATTLER_TARGET)].subpriority + 1; - isBackPic = 0; - x = 272; - } - else - { - personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY); - otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID); - if (eTransformStatuses[gBattleAnimTarget].species == SPECIES_NONE) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - else - species = eTransformStatuses[gBattleAnimTarget].species; - - subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_BATTLER_TARGET)].subpriority - 1; - isBackPic = 1; - x = -32; - } - } - - spriteId2 = sub_8079F44(species, isBackPic, 0, x, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y), subpriority, personality, otId); - if (eTransformStatuses[gBattleAnimTarget].species != SPECIES_NONE) - BlendPalette((gSprites[spriteId2].oam.paletteNum * 16) | 0x100, 16, 6, RGB_WHITE); - - gTasks[taskId].data[15] = spriteId2; - gTasks[taskId].data[0]++; - break; - case 2: - spriteId2 = gTasks[taskId].data[15]; - gTasks[taskId].data[1] += 0x800; - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - gSprites[spriteId2].pos2.x -= (gTasks[taskId].data[1] >> 8); - else - gSprites[spriteId2].pos2.x += (gTasks[taskId].data[1] >> 8); - - gTasks[taskId].data[1] &= 0xFF; - x = gSprites[spriteId2].pos1.x + gSprites[spriteId2].pos2.x; - if (gTasks[taskId].data[14] == 0) - { - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - { - if (x < GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X)) - { - gTasks[taskId].data[14]++; - gBattleAnimArgs[7] = 0xFFFF; - } - } - else - { - if (x > GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X)) - { - gTasks[taskId].data[14]++; - gBattleAnimArgs[7] = 0xFFFF; - } - } - } - - if ((u16)(x + 32) > 304) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - break; - case 3: - spriteId = GetAnimBattlerSpriteId(ANIM_BATTLER_ATTACKER); - spriteId2 = gTasks[taskId].data[15]; - DestroySpriteAndFreeResources_(&gSprites[spriteId2]); - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - gSprites[spriteId].pos2.x = -gSprites[spriteId].pos1.x - 32; - else - gSprites[spriteId].pos2.x = 272 - gSprites[spriteId].pos1.x; - - gTasks[taskId].data[0]++; - break; - case 4: - spriteId = GetAnimBattlerSpriteId(ANIM_BATTLER_ATTACKER); - gTasks[taskId].data[1] += 0x800; - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - { - gSprites[spriteId].pos2.x += (gTasks[taskId].data[1] >> 8); - if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x >= GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X)) - gSprites[spriteId].pos2.x = 0; - } - else - { - gSprites[spriteId].pos2.x -= (gTasks[taskId].data[1] >> 8); - if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x <= GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X)) - gSprites[spriteId].pos2.x = 0; - } - - gTasks[taskId].data[1] = (u8)gTasks[taskId].data[1]; - if (gSprites[spriteId].pos2.x == 0) - DestroyAnimVisualTask(taskId); - break; - } -} -#else -NAKED -void AnimTask_SnatchOpposingMonMove(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - ldr r1, _08131974 @ =gTasks\n\ - lsls r0, 2\n\ - add r0, r8\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - movs r1, 0x8\n\ - ldrsh r0, [r0, r1]\n\ - cmp r0, 0x4\n\ - bls _0813196A\n\ - b _08131EA0\n\ -_0813196A:\n\ - lsls r0, 2\n\ - ldr r1, _08131978 @ =_0813197C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_08131974: .4byte gTasks\n\ -_08131978: .4byte _0813197C\n\ - .align 2, 0\n\ -_0813197C:\n\ - .4byte _08131990\n\ - .4byte _08131A44\n\ - .4byte _08131C20\n\ - .4byte _08131D40\n\ - .4byte _08131DC4\n\ -_08131990:\n\ - movs r0, 0\n\ - bl GetAnimBattlerSpriteId\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r1, _081319DC @ =gTasks\n\ - mov r2, r8\n\ - lsls r4, r2, 2\n\ - adds r0, r4, r2\n\ - lsls r0, 3\n\ - adds r6, r0, r1\n\ - movs r3, 0x80\n\ - lsls r3, 4\n\ - adds r0, r3, 0\n\ - ldrh r1, [r6, 0xA]\n\ - adds r0, r1\n\ - strh r0, [r6, 0xA]\n\ - ldr r0, _081319E0 @ =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - mov r9, r4\n\ - cmp r0, 0\n\ - bne _081319E8\n\ - ldr r2, _081319E4 @ =gSprites\n\ - lsls r3, r7, 4\n\ - adds r1, r3, r7\n\ - lsls r1, 2\n\ - adds r1, r2\n\ - ldrh r0, [r6, 0xA]\n\ - lsls r0, 16\n\ - asrs r0, 24\n\ - ldrh r4, [r1, 0x24]\n\ - adds r0, r4\n\ - strh r0, [r1, 0x24]\n\ - b _08131A02\n\ - .align 2, 0\n\ -_081319DC: .4byte gTasks\n\ -_081319E0: .4byte gBattleAnimAttacker\n\ -_081319E4: .4byte gSprites\n\ -_081319E8:\n\ - ldr r3, _08131A3C @ =gSprites\n\ - lsls r4, r7, 4\n\ - adds r2, r4, r7\n\ - lsls r2, 2\n\ - adds r2, r3\n\ - ldrh r1, [r6, 0xA]\n\ - lsls r1, 16\n\ - asrs r1, 24\n\ - ldrh r0, [r2, 0x24]\n\ - subs r0, r1\n\ - strh r0, [r2, 0x24]\n\ - adds r2, r3, 0\n\ - adds r3, r4, 0\n\ -_08131A02:\n\ - ldr r1, _08131A40 @ =gTasks\n\ - mov r0, r9\n\ - add r0, r8\n\ - lsls r0, 3\n\ - adds r4, r0, r1\n\ - ldrb r0, [r4, 0xA]\n\ - strh r0, [r4, 0xA]\n\ - adds r1, r3, r7\n\ - lsls r1, 2\n\ - adds r1, r2\n\ - ldrh r0, [r1, 0x24]\n\ - ldrh r1, [r1, 0x20]\n\ - adds r0, r1\n\ - lsls r0, 16\n\ - movs r1, 0x80\n\ - lsls r1, 14\n\ - adds r0, r1\n\ - movs r1, 0x98\n\ - lsls r1, 17\n\ - cmp r0, r1\n\ - bhi _08131A2E\n\ - b _08131EA0\n\ -_08131A2E:\n\ - movs r0, 0\n\ - strh r0, [r4, 0xA]\n\ - ldrh r0, [r4, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r4, 0x8]\n\ - b _08131EA0\n\ - .align 2, 0\n\ -_08131A3C: .4byte gSprites\n\ -_08131A40: .4byte gTasks\n\ -_08131A44:\n\ - bl IsContest\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08131A74\n\ - ldr r0, _08131A6C @ =gSharedMem + 0x19348\n\ - ldr r2, [r0, 0x8]\n\ - mov r10, r2\n\ - ldr r3, [r0, 0xC]\n\ - mov r9, r3\n\ - ldrh r5, [r0]\n\ - ldr r0, _08131A70 @ =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSubpriority\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - movs r7, 0\n\ - b _08131B92\n\ - .align 2, 0\n\ -_08131A6C: .4byte gSharedMem + 0x19348\n\ -_08131A70: .4byte gBattleAnimAttacker\n\ -_08131A74:\n\ - ldr r4, _08131AD4 @ =gBattleAnimAttacker\n\ - ldrb r0, [r4]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08131B10\n\ - ldr r7, _08131AD8 @ =gBattlerPartyIndexes\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r7\n\ - ldrh r0, [r0]\n\ - movs r6, 0x64\n\ - muls r0, r6\n\ - ldr r5, _08131ADC @ =gPlayerParty\n\ - adds r0, r5\n\ - movs r1, 0\n\ - bl GetMonData\n\ - mov r10, r0\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r7\n\ - ldrh r0, [r0]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x1\n\ - bl GetMonData\n\ - mov r9, r0\n\ - ldrb r2, [r4]\n\ - lsls r1, r2, 2\n\ - ldr r0, _08131AE0 @ =gSharedMem + 0x17800\n\ - adds r1, r0\n\ - ldrh r0, [r1, 0x2]\n\ - cmp r0, 0\n\ - bne _08131AE4\n\ - lsls r0, r2, 1\n\ - adds r0, r7\n\ - ldrh r0, [r0]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - b _08131AE6\n\ - .align 2, 0\n\ -_08131AD4: .4byte gBattleAnimAttacker\n\ -_08131AD8: .4byte gBattlerPartyIndexes\n\ -_08131ADC: .4byte gPlayerParty\n\ -_08131AE0: .4byte gSharedMem + 0x17800\n\ -_08131AE4:\n\ - ldrh r5, [r1, 0x2]\n\ -_08131AE6:\n\ - movs r0, 0x1\n\ - bl GetAnimBattlerSpriteId\n\ - ldr r2, _08131B0C @ =gSprites\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, r0, 4\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r2\n\ - adds r1, 0x43\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - movs r7, 0\n\ - movs r6, 0x88\n\ - lsls r6, 1\n\ - b _08131B94\n\ - .align 2, 0\n\ -_08131B0C: .4byte gSprites\n\ -_08131B10:\n\ - ldr r7, _08131B64 @ =gBattlerPartyIndexes\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r7\n\ - ldrh r0, [r0]\n\ - movs r6, 0x64\n\ - muls r0, r6\n\ - ldr r5, _08131B68 @ =gEnemyParty\n\ - adds r0, r5\n\ - movs r1, 0\n\ - bl GetMonData\n\ - mov r10, r0\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r7\n\ - ldrh r0, [r0]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x1\n\ - bl GetMonData\n\ - mov r9, r0\n\ - ldrb r2, [r4]\n\ - lsls r1, r2, 2\n\ - ldr r0, _08131B6C @ =gSharedMem + 0x17800\n\ - adds r1, r0\n\ - ldrh r0, [r1, 0x2]\n\ - cmp r0, 0\n\ - bne _08131B70\n\ - lsls r0, r2, 1\n\ - adds r0, r7\n\ - ldrh r0, [r0]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - b _08131B72\n\ - .align 2, 0\n\ -_08131B64: .4byte gBattlerPartyIndexes\n\ -_08131B68: .4byte gEnemyParty\n\ -_08131B6C: .4byte gSharedMem + 0x17800\n\ -_08131B70:\n\ - ldrh r5, [r1, 0x2]\n\ -_08131B72:\n\ - movs r0, 0x1\n\ - bl GetAnimBattlerSpriteId\n\ - ldr r2, _08131C04 @ =gSprites\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, r0, 4\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r2\n\ - adds r1, 0x43\n\ - ldrb r0, [r1]\n\ - subs r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - movs r7, 0x1\n\ -_08131B92:\n\ - ldr r6, _08131C08 @ =0x0000ffe0\n\ -_08131B94:\n\ - ldr r0, _08131C0C @ =gBattleAnimTarget\n\ - ldrb r0, [r0]\n\ - movs r1, 0x1\n\ - bl GetBattlerSpriteCoord\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r3, r6, 16\n\ - asrs r3, 16\n\ - str r0, [sp]\n\ - str r4, [sp, 0x4]\n\ - mov r4, r10\n\ - str r4, [sp, 0x8]\n\ - mov r0, r9\n\ - str r0, [sp, 0xC]\n\ - adds r0, r5, 0\n\ - adds r1, r7, 0\n\ - movs r2, 0\n\ - bl sub_8079F44\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - ldr r0, _08131C10 @ =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 2\n\ - ldr r1, _08131C14 @ =gSharedMem + 0x17800\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x2]\n\ - cmp r0, 0\n\ - beq _08131BF2\n\ - ldr r1, _08131C04 @ =gSprites\n\ - lsls r0, r5, 4\n\ - adds r0, r5\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x5]\n\ - lsrs r0, 4\n\ - lsls r0, 4\n\ - movs r2, 0x80\n\ - lsls r2, 1\n\ - adds r1, r2, 0\n\ - orrs r0, r1\n\ - ldr r3, _08131C18 @ =0x00007fff\n\ - movs r1, 0x10\n\ - movs r2, 0x6\n\ - bl BlendPalette\n\ -_08131BF2:\n\ - ldr r0, _08131C1C @ =gTasks\n\ - mov r3, r8\n\ - lsls r1, r3, 2\n\ - add r1, r8\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - strh r5, [r1, 0x26]\n\ - b _08131DB6\n\ - .align 2, 0\n\ -_08131C04: .4byte gSprites\n\ -_08131C08: .4byte 0x0000ffe0\n\ -_08131C0C: .4byte gBattleAnimTarget\n\ -_08131C10: .4byte gBattleAnimAttacker\n\ -_08131C14: .4byte gSharedMem + 0x17800\n\ -_08131C18: .4byte 0x00007fff\n\ -_08131C1C: .4byte gTasks\n\ -_08131C20:\n\ - ldr r1, _08131C6C @ =gTasks\n\ - mov r0, r8\n\ - lsls r4, r0, 2\n\ - adds r0, r4, r0\n\ - lsls r0, 3\n\ - adds r6, r0, r1\n\ - ldrh r0, [r6, 0x26]\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - movs r1, 0x80\n\ - lsls r1, 4\n\ - adds r0, r1, 0\n\ - ldrh r2, [r6, 0xA]\n\ - adds r0, r2\n\ - strh r0, [r6, 0xA]\n\ - ldr r0, _08131C70 @ =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - mov r9, r4\n\ - cmp r0, 0\n\ - bne _08131C78\n\ - ldr r3, _08131C74 @ =gSprites\n\ - lsls r4, r5, 4\n\ - adds r2, r4, r5\n\ - lsls r2, 2\n\ - adds r2, r3\n\ - ldrh r1, [r6, 0xA]\n\ - lsls r1, 16\n\ - asrs r1, 24\n\ - ldrh r0, [r2, 0x24]\n\ - subs r0, r1\n\ - strh r0, [r2, 0x24]\n\ - adds r2, r3, 0\n\ - adds r3, r4, 0\n\ - b _08131C8E\n\ - .align 2, 0\n\ -_08131C6C: .4byte gTasks\n\ -_08131C70: .4byte gBattleAnimAttacker\n\ -_08131C74: .4byte gSprites\n\ -_08131C78:\n\ - ldr r2, _08131CDC @ =gSprites\n\ - lsls r3, r5, 4\n\ - adds r1, r3, r5\n\ - lsls r1, 2\n\ - adds r1, r2\n\ - ldrh r0, [r6, 0xA]\n\ - lsls r0, 16\n\ - asrs r0, 24\n\ - ldrh r4, [r1, 0x24]\n\ - adds r0, r4\n\ - strh r0, [r1, 0x24]\n\ -_08131C8E:\n\ - ldr r1, _08131CE0 @ =gTasks\n\ - mov r0, r9\n\ - add r0, r8\n\ - lsls r0, 3\n\ - adds r6, r0, r1\n\ - ldrb r0, [r6, 0xA]\n\ - strh r0, [r6, 0xA]\n\ - adds r1, r3, r5\n\ - lsls r1, 2\n\ - adds r1, r2\n\ - ldrh r0, [r1, 0x24]\n\ - ldrh r1, [r1, 0x20]\n\ - adds r0, r1\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - movs r1, 0x24\n\ - ldrsh r0, [r6, r1]\n\ - cmp r0, 0\n\ - bne _08131D0E\n\ - ldr r0, _08131CE4 @ =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08131CEC\n\ - lsls r4, r5, 16\n\ - asrs r4, 16\n\ - ldr r0, _08131CE8 @ =gBattleAnimTarget\n\ - ldrb r0, [r0]\n\ - movs r1, 0\n\ - bl GetBattlerSpriteCoord\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r4, r0\n\ - bge _08131D0E\n\ - b _08131D02\n\ - .align 2, 0\n\ -_08131CDC: .4byte gSprites\n\ -_08131CE0: .4byte gTasks\n\ -_08131CE4: .4byte gBattleAnimAttacker\n\ -_08131CE8: .4byte gBattleAnimTarget\n\ -_08131CEC:\n\ - lsls r4, r5, 16\n\ - asrs r4, 16\n\ - ldr r0, _08131D30 @ =gBattleAnimTarget\n\ - ldrb r0, [r0]\n\ - movs r1, 0\n\ - bl GetBattlerSpriteCoord\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r4, r0\n\ - ble _08131D0E\n\ -_08131D02:\n\ - ldrh r0, [r6, 0x24]\n\ - adds r0, 0x1\n\ - strh r0, [r6, 0x24]\n\ - ldr r1, _08131D34 @ =gBattleAnimArgs\n\ - ldr r0, _08131D38 @ =0x0000ffff\n\ - strh r0, [r1, 0xE]\n\ -_08131D0E:\n\ - lsls r0, r5, 16\n\ - movs r2, 0x80\n\ - lsls r2, 14\n\ - adds r0, r2\n\ - movs r1, 0x98\n\ - lsls r1, 17\n\ - cmp r0, r1\n\ - bhi _08131D20\n\ - b _08131EA0\n\ -_08131D20:\n\ - ldr r0, _08131D3C @ =gTasks\n\ - mov r1, r9\n\ - add r1, r8\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - movs r0, 0\n\ - strh r0, [r1, 0xA]\n\ - b _08131DB6\n\ - .align 2, 0\n\ -_08131D30: .4byte gBattleAnimTarget\n\ -_08131D34: .4byte gBattleAnimArgs\n\ -_08131D38: .4byte 0x0000ffff\n\ -_08131D3C: .4byte gTasks\n\ -_08131D40:\n\ - movs r0, 0\n\ - bl GetAnimBattlerSpriteId\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r1, _08131D8C @ =gTasks\n\ - mov r3, r8\n\ - lsls r4, r3, 2\n\ - adds r0, r4, r3\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x26]\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - lsls r0, r5, 4\n\ - adds r0, r5\n\ - lsls r0, 2\n\ - ldr r5, _08131D90 @ =gSprites\n\ - adds r0, r5\n\ - bl DestroySpriteAndFreeResources_\n\ - ldr r0, _08131D94 @ =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - mov r9, r4\n\ - cmp r0, 0\n\ - bne _08131D98\n\ - lsls r1, r7, 4\n\ - adds r1, r7\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrh r0, [r1, 0x20]\n\ - negs r0, r0\n\ - subs r0, 0x20\n\ - strh r0, [r1, 0x24]\n\ - b _08131DAC\n\ - .align 2, 0\n\ -_08131D8C: .4byte gTasks\n\ -_08131D90: .4byte gSprites\n\ -_08131D94: .4byte gBattleAnimAttacker\n\ -_08131D98:\n\ - lsls r0, r7, 4\n\ - adds r0, r7\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - ldrh r2, [r0, 0x20]\n\ - movs r4, 0x88\n\ - lsls r4, 1\n\ - adds r1, r4, 0\n\ - subs r1, r2\n\ - strh r1, [r0, 0x24]\n\ -_08131DAC:\n\ - ldr r0, _08131DC0 @ =gTasks\n\ - mov r1, r9\n\ - add r1, r8\n\ - lsls r1, 3\n\ - adds r1, r0\n\ -_08131DB6:\n\ - ldrh r0, [r1, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r1, 0x8]\n\ - b _08131EA0\n\ - .align 2, 0\n\ -_08131DC0: .4byte gTasks\n\ -_08131DC4:\n\ - movs r0, 0\n\ - bl GetAnimBattlerSpriteId\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r1, _08131E38 @ =gTasks\n\ - mov r0, r8\n\ - lsls r4, r0, 2\n\ - adds r0, r4, r0\n\ - lsls r0, 3\n\ - adds r2, r0, r1\n\ - movs r1, 0x80\n\ - lsls r1, 4\n\ - adds r0, r1, 0\n\ - ldrh r3, [r2, 0xA]\n\ - adds r0, r3\n\ - strh r0, [r2, 0xA]\n\ - ldr r0, _08131E3C @ =gBattleAnimAttacker\n\ - mov r10, r0\n\ - ldrb r0, [r0]\n\ - str r2, [sp, 0x10]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - mov r9, r4\n\ - ldr r2, [sp, 0x10]\n\ - cmp r0, 0\n\ - bne _08131E44\n\ - ldr r1, _08131E40 @ =gSprites\n\ - lsls r5, r7, 4\n\ - adds r0, r5, r7\n\ - lsls r0, 2\n\ - adds r6, r0, r1\n\ - ldrh r0, [r2, 0xA]\n\ - lsls r0, 16\n\ - asrs r0, 24\n\ - ldrh r1, [r6, 0x24]\n\ - adds r0, r1\n\ - strh r0, [r6, 0x24]\n\ - movs r2, 0x24\n\ - ldrsh r4, [r6, r2]\n\ - movs r3, 0x20\n\ - ldrsh r0, [r6, r3]\n\ - adds r4, r0\n\ - mov r1, r10\n\ - ldrb r0, [r1]\n\ - movs r1, 0\n\ - bl GetBattlerSpriteCoord\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - adds r3, r5, 0\n\ - cmp r4, r0\n\ - blt _08131E7C\n\ - movs r2, 0\n\ - strh r2, [r6, 0x24]\n\ - b _08131E7C\n\ - .align 2, 0\n\ -_08131E38: .4byte gTasks\n\ -_08131E3C: .4byte gBattleAnimAttacker\n\ -_08131E40: .4byte gSprites\n\ -_08131E44:\n\ - ldr r1, _08131EB0 @ =gSprites\n\ - lsls r5, r7, 4\n\ - adds r0, r5, r7\n\ - lsls r0, 2\n\ - adds r6, r0, r1\n\ - ldrh r1, [r2, 0xA]\n\ - lsls r1, 16\n\ - asrs r1, 24\n\ - ldrh r0, [r6, 0x24]\n\ - subs r0, r1\n\ - strh r0, [r6, 0x24]\n\ - movs r3, 0x24\n\ - ldrsh r4, [r6, r3]\n\ - movs r1, 0x20\n\ - ldrsh r0, [r6, r1]\n\ - adds r4, r0\n\ - mov r2, r10\n\ - ldrb r0, [r2]\n\ - movs r1, 0\n\ - bl GetBattlerSpriteCoord\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - adds r3, r5, 0\n\ - cmp r4, r0\n\ - bgt _08131E7C\n\ - movs r4, 0\n\ - strh r4, [r6, 0x24]\n\ -_08131E7C:\n\ - ldr r1, _08131EB4 @ =gTasks\n\ - mov r0, r9\n\ - add r0, r8\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldrb r1, [r0, 0xA]\n\ - strh r1, [r0, 0xA]\n\ - ldr r1, _08131EB0 @ =gSprites\n\ - adds r0, r3, r7\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - movs r1, 0x24\n\ - ldrsh r0, [r0, r1]\n\ - cmp r0, 0\n\ - bne _08131EA0\n\ - mov r0, r8\n\ - bl DestroyAnimVisualTask\n\ -_08131EA0:\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08131EB0: .4byte gSprites\n\ -_08131EB4: .4byte gTasks\n\ - .syntax divided"); -} -#endif // NONMATCHING - -void sub_8131EB8(struct Sprite *sprite) -{ - switch (sprite->data[7]) - { - case 0: - if (gBattleAnimArgs[7] == -1) - { - PlaySE12WithPanning(SE_W233, BattleAnimAdjustPanning(63)); - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 16; - sprite->data[0] = -32; - sprite->data[7]++; - sprite->invisible = 0; - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT && !IsContest()) - sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_BATTLER_TARGET)].subpriority - 1; - } - else - { - sprite->invisible = 1; - } - break; - case 1: - sprite->pos2.y = Sin(sprite->data[1], sprite->data[0]); - sprite->data[1] += 5; - if (sprite->data[1] > 0x7F) - { - sprite->data[0] = sprite->data[0] / 2; - sprite->data[3]++; - sprite->data[1] -= 0x7F; - } - - sprite->data[2] += 0x100; - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - sprite->pos2.x -= (sprite->data[2] >> 8); - else - sprite->pos2.x += (sprite->data[2] >> 8); - - sprite->data[2] &= 0xFF; - if (sprite->data[3] == 2) - DestroyAnimSprite(sprite); - break; - } -} - -// Quickly moves the mon towards its partner and back. -// No args. -void AnimTask_SnatchPartnerMove(u8 taskId) -{ - s16 attackerX, targetX; - u8 spriteId; - - switch (gTasks[taskId].data[15]) - { - case 0: - attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); - targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); - gTasks[taskId].data[0] = 6; - if (attackerX > targetX) - gTasks[taskId].data[0] *= -1; - - gTasks[taskId].data[1] = attackerX; - gTasks[taskId].data[2] = targetX; - gTasks[taskId].data[15]++; - break; - case 1: - spriteId = gBankSpriteIds[gBattleAnimAttacker]; - gSprites[spriteId].pos2.x += gTasks[taskId].data[0]; - if (gTasks[taskId].data[0] > 0) - { - if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x >= gTasks[taskId].data[2]) - gTasks[taskId].data[15]++; - } - else - { - if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x <= gTasks[taskId].data[2]) - gTasks[taskId].data[15]++; - } - break; - case 2: - gTasks[taskId].data[0] *= -1; - gTasks[taskId].data[15]++; - break; - case 3: - spriteId = gBankSpriteIds[gBattleAnimAttacker]; - gSprites[spriteId].pos2.x += gTasks[taskId].data[0]; - if (gTasks[taskId].data[0] < 0) - { - if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x <= gTasks[taskId].data[1]) - gTasks[taskId].data[15]++; - } - else - { - if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x >= gTasks[taskId].data[1]) - gTasks[taskId].data[15]++; - } - break; - case 4: - default: - spriteId = gBankSpriteIds[gBattleAnimAttacker]; - gSprites[spriteId].pos2.x = 0; - DestroyAnimVisualTask(taskId); - break; - } -} - -// Moves the mon's sprite back and forth in an unpredictable swaying motion. -// No args. -void AnimTask_TeeterDanceMovement(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - task->data[3] = GetAnimBattlerSpriteId(ANIM_BATTLER_ATTACKER); - task->data[4] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : -1; - task->data[6] = gSprites[task->data[3]].pos1.y; - task->data[5] = gSprites[task->data[3]].pos1.x; - task->data[9] = 0; - task->data[11] = 0; - task->data[10] = 1; - task->data[12] = 0; - task->func = AnimTask_TeeterDanceMovementStep; -} - -static void AnimTask_TeeterDanceMovementStep(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - switch (task->data[0]) - { - case 0: - task->data[11] += 8; - task->data[11] &= 0xFF; - gSprites[task->data[3]].pos2.x = gSineTable[task->data[11]] >> 5; - task->data[9] += 2; - task->data[9] &= 0xFF; - gSprites[task->data[3]].pos1.x = (gSineTable[task->data[9]] >> 3) * task->data[4] + task->data[5]; - if (task->data[9] == 0) - { - gSprites[task->data[3]].pos1.x = task->data[5]; - task->data[0]++; - } - break; - case 1: - task->data[11] += 8; - task->data[11] &= 0xFF; - gSprites[task->data[3]].pos2.x = gSineTable[task->data[11]] >> 5; - if (task->data[11] == 0) - { - gSprites[task->data[3]].pos2.x = 0; - task->data[0]++; - } - break; - case 2: - DestroyAnimVisualTask(taskId); - break; - } -} - -static void AnimKnockOffStrikeStep(struct Sprite *sprite) -{ - // These two cases are identical. - if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) - { - sprite->data[1] += sprite->data[0]; - sprite->data[1] &= 0xFF; - } - else - { - sprite->data[1] += sprite->data[0]; - sprite->data[1] &= 0xFF; - } - - sprite->pos2.x = Cos(sprite->data[1], 20); - sprite->pos2.y = Sin(sprite->data[1], 20); - if (sprite->animEnded) - DestroyAnimSprite(sprite); - - sprite->data[2]++; -} - -// Animates a strike that swipes downard at the target mon. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -void AnimKnockOffStrike(struct Sprite *sprite) -{ - if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) - { - sprite->pos1.x -= gBattleAnimArgs[0]; - sprite->pos1.y += gBattleAnimArgs[1]; - sprite->data[0] = -11; - sprite->data[1] = 192; - StartSpriteAffineAnim(sprite, 1); - } - else - { - sprite->data[0] = 11; - sprite->data[1] = 192; - sprite->pos1.x += gBattleAnimArgs[0]; - sprite->pos1.y += gBattleAnimArgs[1]; - } - - sprite->callback = AnimKnockOffStrikeStep; -} - -// Gradually fades a rotating recyle arrow sprite in and back out. -// No args. -void AnimRecycle(struct Sprite *sprite) -{ - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); - sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP); - if (sprite->pos1.y < 16) - sprite->pos1.y = 16; - - sprite->data[6] = 0; - sprite->data[7] = 16; - sprite->callback = AnimRecycleStep; - REG_BLDALPHA = BLDALPHA_BLEND(sprite->data[6], sprite->data[7]); -} - -static void AnimRecycleStep(struct Sprite *sprite) -{ - switch (sprite->data[2]) - { - case 0: - if (++sprite->data[0] > 1) - { - sprite->data[0] = 0; - if (!(sprite->data[1] & 1)) - { - if (sprite->data[6] < 16) - sprite->data[6]++; - } - else - { - if (sprite->data[7] != 0) - sprite->data[7]--; - } - - sprite->data[1]++; - REG_BLDALPHA = BLDALPHA_BLEND(sprite->data[6], sprite->data[7]); - if (sprite->data[7] == 0) - sprite->data[2]++; - } - break; - case 1: - if (++sprite->data[0] == 10) - { - sprite->data[0] = 0; - sprite->data[1] = 0; - sprite->data[2]++; - } - break; - case 2: - if (++sprite->data[0] > 1) - { - sprite->data[0] = 0; - if (!(sprite->data[1] & 1)) - { - if (sprite->data[6] != 0) - sprite->data[6]--; - } - else - { - if (sprite->data[7] < 16) - sprite->data[7]++; - } - - sprite->data[1]++; - REG_BLDALPHA = BLDALPHA_BLEND(sprite->data[6], sprite->data[7]); - if (sprite->data[7] == 16) - sprite->data[2]++; - } - break; - case 3: - DestroySpriteAndMatrix(sprite); - break; - } -} - -void AnimTask_GetWeather(u8 taskId) -{ - gBattleAnimArgs[7] = ANIM_WEATHER_NONE; - if (gWeatherMoveAnim & WEATHER_SUN_ANY) - gBattleAnimArgs[7] = ANIM_WEATHER_SUN; - else if (gWeatherMoveAnim & WEATHER_RAIN_ANY) - gBattleAnimArgs[7] = ANIM_WEATHER_RAIN; - else if (gWeatherMoveAnim & WEATHER_SANDSTORM_ANY) - gBattleAnimArgs[7] = ANIM_WEATHER_SANDSTORM; - else if (gWeatherMoveAnim & WEATHER_HAIL_ANY) - gBattleAnimArgs[7] = ANIM_WEATHER_HAIL; - - DestroyAnimVisualTask(taskId); -} - -// Squishes the mon sprite vertically, and shakes it back and forth. -// arg 0: which battler -void AnimTask_SlackOffSquish(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - task->data[0] = 0; - task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - PrepareAffineAnimInTaskData(task, task->data[15], gSlackOffSquishAffineAnimCmds); - task->func = AnimTask_SlackOffSquishStep; -} - -static void AnimTask_SlackOffSquishStep(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - gTasks[taskId].data[0]++; - if (gTasks[taskId].data[0] > 16 && gTasks[taskId].data[0] < 40) - { - if (++task->data[1] > 2) - { - task->data[1] = 0; - task->data[2]++; - if (!(task->data[2] & 1)) - gSprites[task->data[15]].pos2.x = -1; - else - gSprites[task->data[15]].pos2.x = 1; - } - } - else - { - gSprites[task->data[15]].pos2.x = 0; - } - - if (!RunAffineAnimFromTaskData(&gTasks[taskId])) - DestroyAnimVisualTask(taskId); -}
\ No newline at end of file diff --git a/src/battle/battle_anim_813F0F4.c b/src/battle/battle_anim_813F0F4.c deleted file mode 100755 index 9ea0585d1..000000000 --- a/src/battle/battle_anim_813F0F4.c +++ /dev/null @@ -1,2170 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_anim.h" -#include "battle_anim_813F0F4.h" -#include "battle_interface.h" -#include "blend_palette.h" -#include "decompress.h" -#include "ewram.h" -#include "m4a.h" -#include "main.h" -#include "palette.h" -#include "pokeball.h" -#include "rom_8077ABC.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" -#include "util.h" -#include "constants/items.h" -#include "constants/songs.h" - -extern int gUnknown_03005F0C; -extern u16 gUnknown_03005F10; -extern u16 gUnknown_03005F14; - -extern s16 gBattleAnimArgs[]; -extern u8 gBattleAnimAttacker; -extern u8 gBattleAnimTarget; -extern u8 gHealthboxIDs[]; -extern u8 gBankSpriteIds[]; -extern u16 gBattlerPartyIndexes[]; -extern u16 gLastUsedItem; -extern u8 gDoingBattleAnim; -extern u8 gEffectBank; - -extern const u8 gUnknown_08D2EE48[]; -extern const u8 gUnknown_08D2EDFC[]; -extern const u16 gUnknown_08D2E150[]; -extern const struct SpriteTemplate gSpriteTemplates_840B3B4[]; -extern const struct SpriteTemplate gSpriteTemplate_8402500; -extern const struct SpriteTemplate gBattleAnimSpriteTemplate_84024E8; -extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; -extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; - -static void sub_813F300(u8 taskId); -static void sub_813F6CC(u8 taskId); -static void sub_813FD34(u8 taskId); -static void sub_813FD90(struct Sprite *sprite); -static void sub_813FB7C(u8 taskId); -static void sub_813FCBC(u8 taskId); -static void sub_813FDC0(struct Sprite *sprite); -static void sub_813FE70(struct Sprite *sprite); -static void sub_81407B8(struct Sprite *sprite); -static void sub_813FEC8(struct Sprite *sprite); -static void sub_8140014(struct Sprite *sprite); -static void sub_8140058(struct Sprite *sprite); -static void sub_8140410(struct Sprite *sprite); -static void sub_8140158(struct Sprite *sprite); -static void sub_81401A0(struct Sprite *sprite); -static void sub_8140434(struct Sprite *sprite); -static void sub_81405F4(struct Sprite *sprite); -static void sub_8140454(struct Sprite *sprite); -static void sub_81404E4(struct Sprite *sprite); -static void sub_81405C8(struct Sprite *sprite); -static void sub_81406BC(struct Sprite *sprite); -static void sub_81407F4(struct Sprite *sprite); -static void PokeBallOpenParticleAnimation_Step1(struct Sprite *sprite); -static void PokeBallOpenParticleAnimation_Step2(struct Sprite *sprite); -static void DestroyBallOpenAnimationParticle(struct Sprite *sprite); -static void FanOutBallOpenParticles_Step1(struct Sprite *sprite); -static void RepeatBallOpenParticleAnimation_Step1(struct Sprite *sprite); -static void PremierBallOpenParticleAnimation_Step1(struct Sprite *sprite); -static void sub_81413DC(u8 taskId); -static void sub_814146C(u8 taskId); -static void sub_81414BC(u8 taskId); -static void sub_814191C(u8 taskId); -static void sub_8141B20(struct Sprite *sprite); -static void sub_8141B74(struct Sprite *sprite); -static void sub_8141AD8(u8 taskId); -static void sub_8141CBC(struct Sprite *sprite); -static void sub_8141CF4(struct Sprite *sprite); -static void sub_8141D20(struct Sprite *sprite); - -extern const u8 gBattleAnimSpriteSheet_Particles[]; -const struct CompressedSpriteSheet gBallOpenParticleSpritesheets[] = -{ - {gBattleAnimSpriteSheet_Particles, 0x100, 0xD6EC}, - {gBattleAnimSpriteSheet_Particles, 0x100, 0xD6ED}, - {gBattleAnimSpriteSheet_Particles, 0x100, 0xD6EE}, - {gBattleAnimSpriteSheet_Particles, 0x100, 0xD6EF}, - {gBattleAnimSpriteSheet_Particles, 0x100, 0xD6F0}, - {gBattleAnimSpriteSheet_Particles, 0x100, 0xD6F1}, - {gBattleAnimSpriteSheet_Particles, 0x100, 0xD6F2}, - {gBattleAnimSpriteSheet_Particles, 0x100, 0xD6F3}, - {gBattleAnimSpriteSheet_Particles, 0x100, 0xD6F4}, - {gBattleAnimSpriteSheet_Particles, 0x100, 0xD6F5}, - {gBattleAnimSpriteSheet_Particles, 0x100, 0xD6F6}, - {gBattleAnimSpriteSheet_Particles, 0x100, 0xD6F7}, -}; - -extern const u8 gBattleAnimSpritePalette_136[]; -const struct CompressedSpritePalette gBallOpenParticlePalettes[] = -{ - {gBattleAnimSpritePalette_136, 0xD6EC}, - {gBattleAnimSpritePalette_136, 0xD6ED}, - {gBattleAnimSpritePalette_136, 0xD6EE}, - {gBattleAnimSpritePalette_136, 0xD6EF}, - {gBattleAnimSpritePalette_136, 0xD6F0}, - {gBattleAnimSpritePalette_136, 0xD6F1}, - {gBattleAnimSpritePalette_136, 0xD6F2}, - {gBattleAnimSpritePalette_136, 0xD6F3}, - {gBattleAnimSpritePalette_136, 0xD6F4}, - {gBattleAnimSpritePalette_136, 0xD6F5}, - {gBattleAnimSpritePalette_136, 0xD6F6}, - {gBattleAnimSpritePalette_136, 0xD6F7}, -}; - -const union AnimCmd gSpriteAnim_840B318[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(2, 1), - ANIMCMD_FRAME(0, 1, .hFlip = TRUE), - ANIMCMD_FRAME(2, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd gSpriteAnim_840B334[] = -{ - ANIMCMD_FRAME(3, 1), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_840B33C[] = -{ - ANIMCMD_FRAME(4, 1), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_840B344[] = -{ - ANIMCMD_FRAME(5, 1), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_840B34C[] = -{ - ANIMCMD_FRAME(6, 4), - ANIMCMD_FRAME(7, 4), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd gSpriteAnim_840B358[] = -{ - ANIMCMD_FRAME(7, 4), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_840B360[] = -{ - gSpriteAnim_840B318, - gSpriteAnim_840B334, - gSpriteAnim_840B33C, - gSpriteAnim_840B344, - gSpriteAnim_840B34C, - gSpriteAnim_840B358, -}; - -const u8 gBallOpenParticleAnimNums[] = -{ - 0, - 0, - 0, - 5, - 1, - 2, - 2, - 3, - 5, - 5, - 4, - 4, -}; - -void PokeBallOpenParticleAnimation(u8); -void GreatBallOpenParticleAnimation(u8); -void SafariBallOpenParticleAnimation(u8); -void UltraBallOpenParticleAnimation(u8); -void MasterBallOpenParticleAnimation(u8); -void SafariBallOpenParticleAnimation(u8); -void DiveBallOpenParticleAnimation(u8); -void UltraBallOpenParticleAnimation(u8); -void RepeatBallOpenParticleAnimation(u8); -void TimerBallOpenParticleAnimation(u8); -void GreatBallOpenParticleAnimation(u8); -void PremierBallOpenParticleAnimation(u8); - -const TaskFunc gBallOpenParticleAnimationFuncs[] = -{ - PokeBallOpenParticleAnimation, - GreatBallOpenParticleAnimation, - SafariBallOpenParticleAnimation, - UltraBallOpenParticleAnimation, - MasterBallOpenParticleAnimation, - SafariBallOpenParticleAnimation, - DiveBallOpenParticleAnimation, - UltraBallOpenParticleAnimation, - RepeatBallOpenParticleAnimation, - TimerBallOpenParticleAnimation, - GreatBallOpenParticleAnimation, - PremierBallOpenParticleAnimation, -}; - -const struct SpriteTemplate gSpriteTemplates_840B3B4[] = -{ - { - .tileTag = 55020, - .paletteTag = 55020, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_840B360, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55021, - .paletteTag = 55021, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_840B360, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55022, - .paletteTag = 55022, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_840B360, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55023, - .paletteTag = 55023, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_840B360, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55024, - .paletteTag = 55024, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_840B360, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55025, - .paletteTag = 55025, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_840B360, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55026, - .paletteTag = 55026, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_840B360, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55027, - .paletteTag = 55027, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_840B360, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55028, - .paletteTag = 55028, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_840B360, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55029, - .paletteTag = 55029, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_840B360, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55030, - .paletteTag = 55030, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_840B360, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55031, - .paletteTag = 55031, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_840B360, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, -}; - -const u16 gUnknown_0840B4D4[] = -{ - 0x7ADF, - 0x7AF0, - 0x53D7, - 0x3FFF, - 0x7297, - 0x67F5, - 0x7B2C, - 0x2B7E, - 0x431F, - 0x7BDD, - 0x2A3F, - 0x293F, - 0x0000, - 0x0201, - 0x0403, - 0x0101, - 0x0100, - 0x0503, - 0x0506, - 0x0004, -}; - -static void sub_8141C30(struct Sprite *sprite); -const struct SpriteTemplate gBattleAnimSpriteTemplate_840B4FC = -{ - .tileTag = ANIM_TAG_UNUSED_RED_BRICK, - .paletteTag = ANIM_TAG_UNUSED_RED_BRICK, - .oam = &gOamData_837DF2C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8141C30, -}; - -void unref_sub_813F0F4(u8 taskId) -{ - struct Struct_sub_8078914 subStruct; - u8 healthBoxSpriteId; - u8 battler; - u8 spriteId1, spriteId2, spriteId3, spriteId4; - - battler = gBattleAnimAttacker; - gBattle_WIN0H = 0; - gBattle_WIN0V = 0; - REG_WININ = 0x3F3F; - REG_WINOUT = 0x3F3D; - REG_DISPCNT |= DISPCNT_OBJWIN_ON; - REG_BLDCNT = 0x3F42; - REG_BLDALPHA = 0x1000; - REG_BG1CNT_BITFIELD.priority = 0; - REG_BG1CNT_BITFIELD.screenSize = 0; - REG_BG1CNT_BITFIELD.areaOverflowMode = 1; - REG_BG1CNT_BITFIELD.charBaseBlock = 1; - - healthBoxSpriteId = gHealthboxIDs[battler]; - spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam; - spriteId2 = gSprites[healthBoxSpriteId].data[5]; - spriteId3 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); - spriteId4 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); - gSprites[healthBoxSpriteId].oam.priority = 1; - gSprites[spriteId1].oam.priority = 1; - gSprites[spriteId2].oam.priority = 1; - gSprites[spriteId3] = gSprites[healthBoxSpriteId]; - gSprites[spriteId4] = gSprites[spriteId1]; - gSprites[spriteId3].oam.objMode = ST_OAM_OBJ_WINDOW; - gSprites[spriteId4].oam.objMode = ST_OAM_OBJ_WINDOW; - gSprites[spriteId3].callback = SpriteCallbackDummy; - gSprites[spriteId4].callback = SpriteCallbackDummy; - - sub_8078914(&subStruct); - DmaFill32Defvars(3, 0, subStruct.field_4, 0x1000); - LZDecompressVram(&gUnknown_08D2EE48, subStruct.field_4); - LZDecompressVram(&gUnknown_08D2EDFC, subStruct.field_0); - LoadCompressedPalette(gUnknown_08D2E150, subStruct.field_8 << 4, 32); - - gBattle_BG1_X = -gSprites[spriteId3].pos1.x + 32; - gBattle_BG1_Y = -gSprites[spriteId3].pos1.y - 32; - gTasks[taskId].data[1] = 640; - gTasks[taskId].data[0] = spriteId3; - gTasks[taskId].data[2] = spriteId4; - gTasks[taskId].func = sub_813F300; -} - -static void sub_813F300(u8 taskId) -{ - struct Struct_sub_8078914 subStruct; - u8 spriteId1, spriteId2; - u8 battler; - - battler = gBattleAnimAttacker; - gTasks[taskId].data[13] += gTasks[taskId].data[1]; - gBattle_BG1_Y += (u16)gTasks[taskId].data[13] >> 8; - gTasks[taskId].data[13] &= 0xFF; - - switch (gTasks[taskId].data[15]) - { - case 0: - if (gTasks[taskId].data[11]++ > 1) - { - gTasks[taskId].data[11] = 0; - gTasks[taskId].data[12]++; - REG_BLDALPHA = ((16 - gTasks[taskId].data[12]) << 8) | gTasks[taskId].data[12]; - if (gTasks[taskId].data[12] == 8) - gTasks[taskId].data[15]++; - } - break; - case 1: - if (++gTasks[taskId].data[10] == 30) - gTasks[taskId].data[15]++; - break; - case 2: - if (gTasks[taskId].data[11]++ > 1) - { - gTasks[taskId].data[11] = 0; - gTasks[taskId].data[12]--; - REG_BLDALPHA = ((16 - gTasks[taskId].data[12]) << 8) | gTasks[taskId].data[12]; - if (gTasks[taskId].data[12] == 0) - { - sub_8076464(0); - gBattle_WIN0H = 0; - gBattle_WIN0V = 0; - REG_WININ = 0x3F3F; - REG_WINOUT = 0x3F3F; - if (!IsContest()) - REG_BG1CNT_BITFIELD.charBaseBlock = 0; - - REG_DISPCNT ^= DISPCNT_OBJWIN_ON; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroySprite(&gSprites[gTasks[taskId].data[0]]); - DestroySprite(&gSprites[gTasks[taskId].data[2]]); - sub_8078914(&subStruct); - DmaFill32Defvars(3, 0, subStruct.field_4, 0x800); - REG_BG1CNT_BITFIELD.areaOverflowMode = 0; - spriteId1 = gSprites[gHealthboxIDs[battler]].oam.affineParam; - spriteId2 = gSprites[gHealthboxIDs[battler]].data[5]; - gSprites[gHealthboxIDs[battler]].oam.priority = 1; - gSprites[spriteId1].oam.priority = 1; - gSprites[spriteId2].oam.priority = 1; - DestroyAnimVisualTask(taskId); - } - } - break; - } -} - -void sub_813F4EC(u8 taskId) -{ - u8 healthBoxSpriteId; - u8 spriteId1, spriteId2; - u8 paletteNum1, paletteNum2; - u16 offset1, offset2; - - healthBoxSpriteId = gHealthboxIDs[gBattleAnimAttacker]; - spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam; - spriteId2 = gSprites[healthBoxSpriteId].data[5]; - paletteNum1 = AllocSpritePalette(0xD709); - paletteNum2 = AllocSpritePalette(0xD70A); - - offset1 = (gSprites[healthBoxSpriteId].oam.paletteNum * 16) + 0x100; - offset2 = (gSprites[spriteId2].oam.paletteNum * 16) + 0x100; - LoadPalette(&gPlttBufferUnfaded[offset1], paletteNum1 * 16 + 0x100, 0x20); - LoadPalette(&gPlttBufferUnfaded[offset2], paletteNum2 * 16 + 0x100, 0x20); - - gSprites[healthBoxSpriteId].oam.paletteNum = paletteNum1; - gSprites[spriteId1].oam.paletteNum = paletteNum1; - gSprites[spriteId2].oam.paletteNum = paletteNum2; - DestroyAnimVisualTask(taskId); -} - -void sub_813F5E8(u8 taskId) -{ - u8 healthBoxSpriteId; - u8 spriteId1, spriteId2; - u8 paletteIndex1, paletteIndex2; - - healthBoxSpriteId = gHealthboxIDs[gBattleAnimAttacker]; - spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam; - spriteId2 = gSprites[healthBoxSpriteId].data[5]; - - FreeSpritePaletteByTag(0xD709); - FreeSpritePaletteByTag(0xD70A); - paletteIndex1 = IndexOfSpritePaletteTag(0xD6FF); - paletteIndex2 = IndexOfSpritePaletteTag(0xD704); - gSprites[healthBoxSpriteId].oam.paletteNum = paletteIndex1; - gSprites[spriteId1].oam.paletteNum = paletteIndex1; - gSprites[spriteId2].oam.paletteNum = paletteIndex2; - - DestroyAnimVisualTask(taskId); -} - -void sub_813F6A0(u8 taskId) -{ - gTasks[taskId].data[10] = gBattleAnimArgs[0]; - gTasks[taskId].data[11] = gBattleAnimArgs[1]; - gTasks[taskId].func = sub_813F6CC; -} - -static void sub_813F6CC(u8 taskId) -{ - u8 paletteNum; - int paletteOffset, colorOffset; - - gTasks[taskId].data[0]++; - if (gTasks[taskId].data[0]++ >= gTasks[taskId].data[11]) - { - gTasks[taskId].data[0] = 0; - paletteNum = IndexOfSpritePaletteTag(0xD709); - colorOffset = gTasks[taskId].data[10] == 0 ? 6 : 2; - switch (gTasks[taskId].data[1]) - { - case 0: - gTasks[taskId].data[2] += 2; - if (gTasks[taskId].data[2] > 16) - gTasks[taskId].data[2] = 16; - - paletteOffset = paletteNum * 16 + 0x100; - BlendPalette(paletteOffset + colorOffset, 1, gTasks[taskId].data[2], RGB(20, 27, 31)); - if (gTasks[taskId].data[2] == 16) - gTasks[taskId].data[1]++; - break; - case 1: - gTasks[taskId].data[2] -= 2; - if (gTasks[taskId].data[2] < 0) - gTasks[taskId].data[2] = 0; - - paletteOffset = paletteNum * 16 + 0x100; - BlendPalette(paletteOffset + colorOffset, 1, gTasks[taskId].data[2], RGB(20, 27, 31)); - if (gTasks[taskId].data[2] == 0) - DestroyAnimVisualTask(taskId); - break; - } - } -} - -void sub_813F798(u8 taskId) -{ - u8 spriteId; - - spriteId = gBankSpriteIds[gBattleAnimAttacker]; - switch (gTasks[taskId].data[0]) - { - case 0: - PrepareBattlerSpriteForRotScale(spriteId, 0); - gTasks[taskId].data[10] = 0x100; - gTasks[taskId].data[0]++; - break; - case 1: - gTasks[taskId].data[10] += 0x30; - obj_id_set_rotscale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[10], 0); - sub_8079A64(spriteId); - if (gTasks[taskId].data[10] >= 0x2D0) - gTasks[taskId].data[0]++; - break; - case 2: - sub_8078F40(spriteId); - gSprites[spriteId].invisible = 1; - DestroyAnimVisualTask(taskId); - break; - } -} - -void sub_813F844(u8 taskId) -{ - u8 spriteId; - u16 ball; - u8 ballIndex; - u8 x, y; - u8 priority, subpriority; - u32 selectedPalettes; - - spriteId = gBankSpriteIds[gBattleAnimAttacker]; - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - ball = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_POKEBALL); - else - ball = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_POKEBALL); - - ballIndex = ball_number_to_ball_processing_index(ball); - switch (gTasks[taskId].data[0]) - { - case 0: - x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); - y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); - priority = gSprites[spriteId].oam.priority; - subpriority = gSprites[spriteId].subpriority; - gTasks[taskId].data[10] = AnimateBallOpenParticles(x, y + 32, priority, subpriority, ballIndex); - selectedPalettes = sub_80791A8(1, 0, 0, 0, 0, 0, 0); - gTasks[taskId].data[11] = sub_8141314(0, gBattleAnimAttacker, selectedPalettes, ballIndex); - gTasks[taskId].data[0]++; - break; - case 1: - if (!gTasks[gTasks[taskId].data[10]].isActive && !gTasks[gTasks[taskId].data[11]].isActive) - DestroyAnimVisualTask(taskId); - break; - } -} - -void sub_813F990(u8 taskId) -{ - u8 ballIndex = ball_number_to_ball_processing_index(gLastUsedItem); - LoadBallGraphics(ballIndex); - DestroyAnimVisualTask(taskId); -} - -void sub_813F9B8(u8 taskId) -{ - u8 ballIndex = ball_number_to_ball_processing_index(gLastUsedItem); - FreeBallGraphics(ballIndex); - DestroyAnimVisualTask(taskId); -} - -void sub_813F9E0(u8 taskId) -{ - if (ewram17840.unk8 == 5) - gBattleAnimArgs[7] = -1; - else - gBattleAnimArgs[7] = 0; - - DestroyAnimVisualTask(taskId); -} - -u8 ball_number_to_ball_processing_index(u16 ballItem) -{ - switch (ballItem) - { - case ITEM_MASTER_BALL: - return 4; - case ITEM_ULTRA_BALL: - return 3; - case ITEM_GREAT_BALL: - return 1; - case ITEM_SAFARI_BALL: - return 2; - case ITEM_NET_BALL: - return 5; - case ITEM_DIVE_BALL: - return 6; - case ITEM_NEST_BALL: - return 7; - case ITEM_REPEAT_BALL: - return 8; - case ITEM_TIMER_BALL: - return 9; - case ITEM_LUXURY_BALL: - return 10; - case ITEM_PREMIER_BALL: - return 11; - case ITEM_POKE_BALL: - default: - return 0; - } -} - -void sub_813FA94(u8 taskId) -{ - u8 ballIndex; - u8 spriteId; - - ballIndex = ball_number_to_ball_processing_index(gLastUsedItem); - spriteId = CreateSprite(&gBallSpriteTemplates[ballIndex], 32, 80, 29); - gSprites[spriteId].data[0] = 34; - gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 0); - gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 1) - 16; - gSprites[spriteId].callback = sub_813FD90; - ewram17840.unk9_1 = gSprites[gBankSpriteIds[gBattleAnimTarget]].invisible; - gTasks[taskId].data[0] = spriteId; - gTasks[taskId].func = sub_813FB7C; -} - -static void sub_813FB7C(u8 taskId) -{ - u8 spriteId = gTasks[taskId].data[0]; - if ((u16)gSprites[spriteId].data[0] == 0xFFFF) - DestroyAnimVisualTask(taskId); -} - -void sub_813FBB8(u8 taskId) -{ - int x, y; - u8 ballIndex; - u8 subpriority; - u8 spriteId; - - if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) - { - x = 32; - y = 11; - } - else - { - x = 23; - y = 5; - } - - ballIndex = ball_number_to_ball_processing_index(gLastUsedItem); - subpriority = GetBattlerSubpriority(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) + 1; - spriteId = CreateSprite(&gBallSpriteTemplates[ballIndex], x + 32, y | 80, subpriority); - gSprites[spriteId].data[0] = 34; - gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 0); - gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 1) - 16; - gSprites[spriteId].callback = SpriteCallbackDummy; - StartSpriteAnim(&gSprites[gBankSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]], 1); - gTasks[taskId].data[0] = spriteId; - gTasks[taskId].func = sub_813FCBC; -} - -static void sub_813FCBC(u8 taskId) -{ - if (gSprites[gBankSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].animCmdIndex == 1) - { - PlaySE12WithPanning(SE_NAGERU, 0); - gSprites[gTasks[taskId].data[0]].callback = sub_813FD90; - CreateTask(sub_813FD34, 10); - gTasks[taskId].func = sub_813FB7C; - } -} - -static void sub_813FD34(u8 taskId) -{ - if (gSprites[gBankSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].animEnded) - { - StartSpriteAnim(&gSprites[gBankSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]], 0); - DestroyTask(taskId); - } -} - -static void sub_813FD90(struct Sprite *sprite) -{ - u16 temp = sprite->data[1]; - u16 temp2 = sprite->data[2]; - sprite->data[1] = sprite->pos1.x; - sprite->data[2] = temp; - sprite->data[3] = sprite->pos1.y; - sprite->data[4] = temp2; - sprite->data[5] = -40; - InitAnimArcTranslation(sprite); - sprite->callback = sub_813FDC0; -} - -static void sub_813FDC0(struct Sprite *sprite) -{ - int i; - u8 ballIndex; - int ballIndex2; // extra var needed to match - - if (TranslateAnimArc(sprite)) - { - if (ewram17840.unk8 == 5) - { - sprite->callback = sub_81407B8; - } - else - { - StartSpriteAnim(sprite, 1); - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - - for (i = 0; i < 8; i++) - { - sprite->data[i] = 0; - } - - sprite->data[5] = 0; - sprite->callback = sub_813FE70; - ballIndex = ball_number_to_ball_processing_index(gLastUsedItem); - ballIndex2 = ballIndex; - if (ballIndex2 > 11) - return; - if (ballIndex2 < 0) - return; - - AnimateBallOpenParticles(sprite->pos1.x, sprite->pos1.y - 5, 1, 28, ballIndex); - sub_8141314(0, gBattleAnimTarget, 14, ballIndex); - } - } -} - -static void sub_813FE70(struct Sprite *sprite) -{ - if (++sprite->data[5] == 10) - { - sprite->data[5] = CreateTask(TaskDummy, 50); - sprite->callback = sub_813FEC8; - gSprites[gBankSpriteIds[gBattleAnimTarget]].data[1] = 0; - } -} - -static void sub_813FEC8(struct Sprite *sprite) -{ - u8 spriteId; - u8 taskId; - - spriteId = gBankSpriteIds[gBattleAnimTarget]; - taskId = sprite->data[5]; - - if (++gTasks[taskId].data[1] == 11) - PlaySE(SE_SUIKOMU); - - switch (gTasks[taskId].data[0]) - { - case 0: - PrepareBattlerSpriteForRotScale(spriteId, 0); - gTasks[taskId].data[10] = 256; - gUnknown_03005F0C = 28; - gUnknown_03005F14 = (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) - (sprite->pos1.y + sprite->pos2.y); - gUnknown_03005F10 = (u32)(gUnknown_03005F14 * 256) / 28; - gTasks[taskId].data[2] = gUnknown_03005F10; - gTasks[taskId].data[0]++; - break; - case 1: - gTasks[taskId].data[10] += 0x20; - obj_id_set_rotscale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[10], 0); - gTasks[taskId].data[3] += gTasks[taskId].data[2]; - gSprites[spriteId].pos2.y = -gTasks[taskId].data[3] >> 8; - if (gTasks[taskId].data[10] >= 0x480) - gTasks[taskId].data[0]++; - break; - case 2: - sub_8078F40(spriteId); - gSprites[spriteId].invisible = 1; - gTasks[taskId].data[0]++; - break; - default: - if (gTasks[taskId].data[1] > 10) - { - DestroyTask(taskId); - StartSpriteAnim(sprite, 2); - sprite->data[5] = 0; - sprite->callback = sub_8140014; - } - break; - } -} - -static void sub_8140014(struct Sprite *sprite) -{ - int angle; - - if (sprite->animEnded) - { - sprite->data[3] = 0; - sprite->data[4] = 32; - sprite->data[5] = 0; - angle = 0; - sprite->pos1.y += Cos(angle, 32); - sprite->pos2.y = -Cos(angle, sprite->data[4]); - sprite->callback = sub_8140058; - } -} - -static void sub_8140058(struct Sprite *sprite) -{ - bool8 lastBounce; - int bounceCount; - - lastBounce = 0; - - switch (sprite->data[3] & 0xFF) - { - case 0: - sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]); - sprite->data[5] += (sprite->data[3] >> 8) + 4; - if (sprite->data[5] >= 64) - { - sprite->data[4] -= 10; - sprite->data[3] += 257; - - bounceCount = sprite->data[3] >> 8; - if (bounceCount == 4) - lastBounce = 1; - - // Play a different sound effect for each pokeball bounce. - switch (bounceCount) - { - case 1: - PlaySE(SE_KON); - break; - case 2: - PlaySE(SE_KON2); - break; - case 3: - PlaySE(SE_KON3); - break; - default: - PlaySE(SE_KON4); - break; - } - } - break; - case 1: - sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]); - sprite->data[5] -= (sprite->data[3] >> 8) + 4; - if (sprite->data[5] <= 0) - { - sprite->data[5] = 0; - sprite->data[3] &= -0x100; - } - break; - } - - if (lastBounce) - { - sprite->data[3] = 0; - sprite->pos1.y += Cos(64, 32); - sprite->pos2.y = 0; - if (ewram17840.unk8 == 0) - { - sprite->data[5] = 0; - sprite->callback = sub_8140410; - } - else - { - sprite->callback = sub_8140158; - sprite->data[4] = 1; - sprite->data[5] = 0; - } - } -} - -static void sub_8140158(struct Sprite *sprite) -{ - if (++sprite->data[3] == 31) - { - sprite->data[3] = 0; - sprite->affineAnimPaused = 1; - StartSpriteAffineAnim(sprite, 1); - ewram17840.unkC = 0; - sprite->callback = sub_81401A0; - PlaySE(SE_BOWA); - } -} - -static void sub_81401A0(struct Sprite *sprite) -{ - s8 state; - u16 var0; - - switch (sprite->data[3] & 0xFF) - { - case 0: - if ((s16)ewram17840.unkC > 0xFF) - { - sprite->pos2.x += sprite->data[4]; - ewram17840.unkC &= 0xFF; - } - else - { - ewram17840.unkC += 0xB0; - } - - sprite->data[5]++; - sprite->affineAnimPaused = 0; - var0 = sprite->data[5] + 7; - if (var0 > 14) - { - ewram17840.unkC = 0; - sprite->data[3]++; - sprite->data[5] = 0; - } - break; - case 1: - if (++sprite->data[5] == 1) - { - sprite->data[5] = 0; - sprite->data[4] = -sprite->data[4]; - sprite->data[3]++; - sprite->affineAnimPaused = 0; - if (sprite->data[4] < 0) - ChangeSpriteAffineAnim(sprite, 2); - else - ChangeSpriteAffineAnim(sprite, 1); - } - else - { - sprite->affineAnimPaused = 1; - } - break; - case 2: - if ((s16)ewram17840.unkC > 0xFF) - { - sprite->pos2.x += sprite->data[4]; - ewram17840.unkC &= 0xFF; - } - else - { - ewram17840.unkC += 0xB0; - } - - sprite->data[5]++; - sprite->affineAnimPaused = 0; - var0 = sprite->data[5] + 12; - if (var0 > 24) - { - ewram17840.unkC = 0; - sprite->data[3]++; - sprite->data[5] = 0; - } - break; - case 3: - if (sprite->data[5]++ < 0) - { - sprite->affineAnimPaused = 1; - break; - } - - sprite->data[5] = 0; - sprite->data[4] = -sprite->data[4]; - sprite->data[3]++; - sprite->affineAnimPaused = 0; - if (sprite->data[4] < 0) - ChangeSpriteAffineAnim(sprite, 2); - else - ChangeSpriteAffineAnim(sprite, 1); - // fall through - case 4: - if ((s16)ewram17840.unkC > 0xFF) - { - sprite->pos2.x += sprite->data[4]; - ewram17840.unkC &= 0xFF; - } - else - { - ewram17840.unkC += 0xB0; - } - - sprite->data[5]++; - sprite->affineAnimPaused = 0; - var0 = sprite->data[5] + 4; - if (var0 > 8) - { - ewram17840.unkC = 0; - sprite->data[3]++; - sprite->data[5] = 0; - sprite->data[4] = -sprite->data[4]; - } - break; - case 5: - sprite->data[3] += 0x100; - state = sprite->data[3] >> 8; - if (state == ewram17840.unk8) - { - sprite->affineAnimPaused = 1; - sprite->callback = sub_8140410; - } - else - { - if (ewram17840.unk8 == 4 && state == 3) - { - sprite->callback = sub_8140434; - sprite->affineAnimPaused = 1; - } - else - { - sprite->data[3]++; - sprite->affineAnimPaused = 1; - } - } - break; - case 6: - default: - if (++sprite->data[5] == 31) - { - sprite->data[5] = 0; - sprite->data[3] &= -0x100; - StartSpriteAffineAnim(sprite, 3); - if (sprite->data[4] < 0) - StartSpriteAffineAnim(sprite, 2); - else - StartSpriteAffineAnim(sprite, 1); - - PlaySE(SE_BOWA); - } - break; - } -} - -static void sub_8140410(struct Sprite *sprite) -{ - if (++sprite->data[5] == 31) - { - sprite->data[5] = 0; - sprite->callback = sub_81405F4; - } -} - -static void sub_8140434(struct Sprite *sprite) -{ - sprite->animPaused = 1; - sprite->callback = sub_8140454; - sprite->data[3] = 0; - sprite->data[4] = 0; - sprite->data[5] = 0; -} - -static void sub_8140454(struct Sprite *sprite) -{ - u8 *battler = &gBattleAnimTarget; - - sprite->data[4]++; - if (sprite->data[4] == 40) - return; - - if (sprite->data[4] == 95) - { - gDoingBattleAnim = 0; - UpdateOamPriorityInAllHealthboxes(1); - m4aMPlayAllStop(); - PlaySE(MUS_FANFA5); - } - else if (sprite->data[4] == 315) - { - FreeOamMatrix(gSprites[gBankSpriteIds[*battler]].oam.matrixNum); - DestroySprite(&gSprites[gBankSpriteIds[*battler]]); - sprite->data[0] = 0; - sprite->callback = sub_81404E4; - } -} - -static void sub_81404E4(struct Sprite *sprite) -{ - u8 paletteIndex; - - switch (sprite->data[0]) - { - case 0: - sprite->data[1] = 0; - sprite->data[2] = 0; - sprite->oam.objMode = ST_OAM_OBJ_BLEND; - REG_BLDCNT = 0x3F40; - REG_BLDALPHA = 0x0010; - paletteIndex = IndexOfSpritePaletteTag(sprite->template->paletteTag); - BeginNormalPaletteFade(1 << (paletteIndex + 0x10), 0, 0, 16, RGB(31, 31, 31)); - sprite->data[0]++; - break; - case 1: - if (sprite->data[1]++ > 0) - { - sprite->data[1] = 0; - sprite->data[2]++; - REG_BLDALPHA = (sprite->data[2] << 8) | (16 - sprite->data[2]); - if (sprite->data[2] == 16) - sprite->data[0]++; - } - break; - case 2: - sprite->invisible = 1; - sprite->data[0]++; - break; - default: - if (!gPaletteFade.active) - { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - sprite->data[0] = 0; - sprite->callback = sub_81405C8; - } - break; - } -} - -static void sub_81405C8(struct Sprite *sprite) -{ - if (sprite->data[0] == 0) - { - sprite->data[0] = -1; - } - else - { - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - } -} - -// fakematching. I think the return type of ball_number_to_ball_processing_index() -// is wrong because of the weird required casting. -static void sub_81405F4(struct Sprite *sprite) -{ - u8 ballIndex; - int ballIndex2; // extra var needed to match - - StartSpriteAnim(sprite, 1); - StartSpriteAffineAnim(sprite, 0); - sprite->callback = sub_81406BC; - - ballIndex = ball_number_to_ball_processing_index(gLastUsedItem); - ballIndex2 = ballIndex; - if (ballIndex2 > 11) - goto LABEL; - if (ballIndex2 < 0) - goto LABEL; - - AnimateBallOpenParticles(sprite->pos1.x, sprite->pos1.y - 5, 1, 28, ballIndex); - sub_8141314(1, gBattleAnimTarget, 14, ballIndex); - - LABEL: - gSprites[gBankSpriteIds[gBattleAnimTarget]].invisible = 0; - StartSpriteAffineAnim(&gSprites[gBankSpriteIds[gBattleAnimTarget]], 1); - AnimateSprite(&gSprites[gBankSpriteIds[gBattleAnimTarget]]); - gSprites[gBankSpriteIds[gBattleAnimTarget]].data[1] = 0x1000; -} - -static void sub_81406BC(struct Sprite *sprite) -{ - int next = FALSE; - - if (sprite->animEnded) - sprite->invisible = 1; - - if (gSprites[gBankSpriteIds[gBattleAnimTarget]].affineAnimEnded) - { - StartSpriteAffineAnim(&gSprites[gBankSpriteIds[gBattleAnimTarget]], 0); - next = TRUE; - } - else - { - gSprites[gBankSpriteIds[gBattleAnimTarget]].data[1] -= 288; - gSprites[gBankSpriteIds[gBattleAnimTarget]].pos2.y = gSprites[gBankSpriteIds[gBattleAnimTarget]].data[1] >> 8; - } - - if (sprite->animEnded && next) - { - gSprites[gBankSpriteIds[gBattleAnimTarget]].pos2.y = 0; - gSprites[gBankSpriteIds[gBattleAnimTarget]].invisible = ewram17840.unk9_1; - sprite->data[0] = 0; - sprite->callback = sub_81405C8; - gDoingBattleAnim = 0; - UpdateOamPriorityInAllHealthboxes(1); - } -} - -static void sub_81407B8(struct Sprite *sprite) -{ - int i; - - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.y = 0; - sprite->pos2.x = 0; - for (i = 0; i < 6; i++) - sprite->data[i] = 0; - - sprite->callback = sub_81407F4; -} - -#ifdef NONMATCHING -// there is some weird typing going on with var0 and var1. -static void sub_81407F4(struct Sprite *sprite) -{ - s16 var0, var1; - - var0 = sprite->data[0] + 0x800; - var1 = sprite->data[1] + 0x680; - sprite->pos2.x -= var1 >> 8; - sprite->pos2.y += var0 >> 8; - sprite->data[0] = var0 & 0xFF; - sprite->data[1] = var1 & 0xFF; - - if (sprite->pos1.y + sprite->pos2.y > 160 - || sprite->pos1.x + sprite->pos2.x < -8) - { - sprite->data[0] = 0; - sprite->callback = sub_81405C8; - gDoingBattleAnim = 0; - UpdateOamPriorityInAllHealthboxes(1); - } -} -#else -NAKED -static void sub_81407F4(struct Sprite *sprite) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - adds r4, r0, 0\n\ - movs r0, 0x80\n\ - lsls r0, 4\n\ - adds r2, r0, 0\n\ - ldrh r1, [r4, 0x2E]\n\ - adds r2, r1\n\ - movs r0, 0xD0\n\ - lsls r0, 3\n\ - adds r3, r0, 0\n\ - ldrh r1, [r4, 0x30]\n\ - adds r3, r1\n\ - lsls r1, r3, 16\n\ - asrs r1, 24\n\ - ldrh r0, [r4, 0x24]\n\ - subs r0, r1\n\ - strh r0, [r4, 0x24]\n\ - lsls r0, r2, 16\n\ - asrs r0, 24\n\ - ldrh r1, [r4, 0x26]\n\ - adds r0, r1\n\ - strh r0, [r4, 0x26]\n\ - movs r0, 0xFF\n\ - ands r2, r0\n\ - strh r2, [r4, 0x2E]\n\ - ands r3, r0\n\ - strh r3, [r4, 0x30]\n\ - movs r2, 0x22\n\ - ldrsh r0, [r4, r2]\n\ - movs r2, 0x26\n\ - ldrsh r1, [r4, r2]\n\ - adds r0, r1\n\ - cmp r0, 0xA0\n\ - bgt _0814084A\n\ - movs r1, 0x20\n\ - ldrsh r0, [r4, r1]\n\ - movs r2, 0x24\n\ - ldrsh r1, [r4, r2]\n\ - adds r0, r1\n\ - movs r1, 0x8\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _0814085E\n\ -_0814084A:\n\ - movs r0, 0\n\ - strh r0, [r4, 0x2E]\n\ - ldr r0, _08140864 @ =sub_81405C8\n\ - str r0, [r4, 0x1C]\n\ - ldr r1, _08140868 @ =gDoingBattleAnim\n\ - movs r0, 0\n\ - strb r0, [r1]\n\ - movs r0, 0x1\n\ - bl UpdateOamPriorityInAllHealthboxes\n\ -_0814085E:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08140864: .4byte sub_81405C8\n\ -_08140868: .4byte gDoingBattleAnim\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballIndex) -{ - u8 taskId; - - if (GetSpriteTileStartByTag(gBallOpenParticleSpritesheets[ballIndex].tag) == 0xFFFF) - { - LoadCompressedObjectPic(&gBallOpenParticleSpritesheets[ballIndex]); - LoadCompressedObjectPalette(&gBallOpenParticlePalettes[ballIndex]); - } - - taskId = CreateTask(gBallOpenParticleAnimationFuncs[ballIndex], 5); - gTasks[taskId].data[1] = x; - gTasks[taskId].data[2] = y; - gTasks[taskId].data[3] = priority; - gTasks[taskId].data[4] = subpriority; - gTasks[taskId].data[15] = ballIndex; - PlaySE(SE_BOWA2); - if (gMain.inBattle) - ewram17840.unkA++; - - return taskId; -} - -void PokeBallOpenParticleAnimation(u8 taskId) -{ - u8 spriteId; - u8 x, y; - u8 priority, subpriority; - u8 ballIndex; - u8 var0; - - ballIndex = gTasks[taskId].data[15]; - if (gTasks[taskId].data[0] < 16) - { - x = gTasks[taskId].data[1]; - y = gTasks[taskId].data[2]; - priority = gTasks[taskId].data[3]; - subpriority = gTasks[taskId].data[4]; - - spriteId = CreateSprite(&gSpriteTemplates_840B3B4[ballIndex], x, y, subpriority); - StartSpriteAnim(&gSprites[spriteId], gBallOpenParticleAnimNums[ballIndex]); - gSprites[spriteId].callback = PokeBallOpenParticleAnimation_Step1; - gSprites[spriteId].oam.priority = priority; - - var0 = (u8)gTasks[taskId].data[0]; - if (var0 >= 8) - var0 -= 8; - - gSprites[spriteId].data[0] = var0 * 32; - if (gTasks[taskId].data[0] == 15) - { - gSprites[spriteId].data[7] = 1; - DestroyTask(taskId); - return; - } - } - - gTasks[taskId].data[0]++; -} - -static void PokeBallOpenParticleAnimation_Step1(struct Sprite *sprite) -{ - if (sprite->data[1] == 0) - sprite->callback = PokeBallOpenParticleAnimation_Step2; - else - sprite->data[1]--; -} - -static void PokeBallOpenParticleAnimation_Step2(struct Sprite *sprite) -{ - sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]); - sprite->pos2.y = Cos(sprite->data[0], sprite->data[1]); - sprite->data[1] += 2; - if (sprite->data[1] == 50) - DestroyBallOpenAnimationParticle(sprite); -} - -void TimerBallOpenParticleAnimation(u8 taskId) -{ - u8 i; - u8 x, y, priority, subpriority, ballIndex; - u8 spriteId; - - ballIndex = gTasks[taskId].data[15]; - x = gTasks[taskId].data[1]; - y = gTasks[taskId].data[2]; - priority = gTasks[taskId].data[3]; - subpriority = gTasks[taskId].data[4]; - - for (i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gSpriteTemplates_840B3B4[ballIndex], x, y, subpriority); - StartSpriteAnim(&gSprites[spriteId], gBallOpenParticleAnimNums[ballIndex]); - gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; - gSprites[spriteId].oam.priority = priority; - gSprites[spriteId].data[0] = i * 32; - gSprites[spriteId].data[4] = 10; - gSprites[spriteId].data[5] = 2; - gSprites[spriteId].data[6] = 1; - } - - gSprites[spriteId].data[7] = 1; - DestroyTask(taskId); -} - -void DiveBallOpenParticleAnimation(u8 taskId) -{ - u8 i; - u8 x, y, priority, subpriority, ballIndex; - u8 spriteId; - - ballIndex = gTasks[taskId].data[15]; - x = gTasks[taskId].data[1]; - y = gTasks[taskId].data[2]; - priority = gTasks[taskId].data[3]; - subpriority = gTasks[taskId].data[4]; - - for (i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gSpriteTemplates_840B3B4[ballIndex], x, y, subpriority); - StartSpriteAnim(&gSprites[spriteId], gBallOpenParticleAnimNums[ballIndex]); - gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; - gSprites[spriteId].oam.priority = priority; - gSprites[spriteId].data[0] = i * 32; - gSprites[spriteId].data[4] = 10; - gSprites[spriteId].data[5] = 1; - gSprites[spriteId].data[6] = 2; - } - - gSprites[spriteId].data[7] = 1; - DestroyTask(taskId); -} - -void SafariBallOpenParticleAnimation(u8 taskId) -{ - u8 i; - u8 x, y, priority, subpriority, ballIndex; - u8 spriteId; - - ballIndex = gTasks[taskId].data[15]; - x = gTasks[taskId].data[1]; - y = gTasks[taskId].data[2]; - priority = gTasks[taskId].data[3]; - subpriority = gTasks[taskId].data[4]; - - for (i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gSpriteTemplates_840B3B4[ballIndex], x, y, subpriority); - StartSpriteAnim(&gSprites[spriteId], gBallOpenParticleAnimNums[ballIndex]); - gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; - gSprites[spriteId].oam.priority = priority; - gSprites[spriteId].data[0] = i * 32; - gSprites[spriteId].data[4] = 4; - gSprites[spriteId].data[5] = 1; - gSprites[spriteId].data[6] = 1; - } - - gSprites[spriteId].data[7] = 1; - DestroyTask(taskId); -} - -void UltraBallOpenParticleAnimation(u8 taskId) -{ - u8 i; - u8 x, y, priority, subpriority, ballIndex; - u8 spriteId; - - ballIndex = gTasks[taskId].data[15]; - x = gTasks[taskId].data[1]; - y = gTasks[taskId].data[2]; - priority = gTasks[taskId].data[3]; - subpriority = gTasks[taskId].data[4]; - - for (i = 0; i < 10; i++) - { - spriteId = CreateSprite(&gSpriteTemplates_840B3B4[ballIndex], x, y, subpriority); - StartSpriteAnim(&gSprites[spriteId], gBallOpenParticleAnimNums[ballIndex]); - gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; - gSprites[spriteId].oam.priority = priority; - gSprites[spriteId].data[0] = i * 25; - gSprites[spriteId].data[4] = 5; - gSprites[spriteId].data[5] = 1; - gSprites[spriteId].data[6] = 1; - } - - gSprites[spriteId].data[7] = 1; - DestroyTask(taskId); -} - -void GreatBallOpenParticleAnimation(u8 taskId) -{ - u8 i; - u8 x, y, priority, subpriority, ballIndex; - u8 spriteId; - - if (gTasks[taskId].data[7]) - { - gTasks[taskId].data[7]--; - } - else - { - ballIndex = gTasks[taskId].data[15]; - x = gTasks[taskId].data[1]; - y = gTasks[taskId].data[2]; - priority = gTasks[taskId].data[3]; - subpriority = gTasks[taskId].data[4]; - - for (i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gSpriteTemplates_840B3B4[ballIndex], x, y, subpriority); - StartSpriteAnim(&gSprites[spriteId], gBallOpenParticleAnimNums[ballIndex]); - gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; - gSprites[spriteId].oam.priority = priority; - gSprites[spriteId].data[0] = i * 32; - gSprites[spriteId].data[4] = 8; - gSprites[spriteId].data[5] = 2; - gSprites[spriteId].data[6] = 2; - } - - gTasks[taskId].data[7] = 8; - if (++gTasks[taskId].data[0] == 2) - { - gSprites[spriteId].data[7] = 1; - DestroyTask(taskId); - } - } -} - -static void FanOutBallOpenParticles_Step1(struct Sprite *sprite) -{ - sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]); - sprite->pos2.y = Cos(sprite->data[0], sprite->data[2]); - sprite->data[0] = (sprite->data[0] + sprite->data[4]) & 0xFF; - sprite->data[1] += sprite->data[5]; - sprite->data[2] += sprite->data[6]; - if (++sprite->data[3] == 51) - DestroyBallOpenAnimationParticle(sprite); -} - -void RepeatBallOpenParticleAnimation(u8 taskId) -{ - u8 i; - u8 x, y, priority, subpriority, ballIndex; - u8 spriteId; - - ballIndex = gTasks[taskId].data[15]; - x = gTasks[taskId].data[1]; - y = gTasks[taskId].data[2]; - priority = gTasks[taskId].data[3]; - subpriority = gTasks[taskId].data[4]; - - for (i = 0; i < 12; i++) - { - spriteId = CreateSprite(&gSpriteTemplates_840B3B4[ballIndex], x, y, subpriority); - StartSpriteAnim(&gSprites[spriteId], gBallOpenParticleAnimNums[ballIndex]); - gSprites[spriteId].callback = RepeatBallOpenParticleAnimation_Step1; - gSprites[spriteId].oam.priority = priority; - gSprites[spriteId].data[0] = i * 21; - } - - gSprites[spriteId].data[7] = 1; - DestroyTask(taskId); -} - -static void RepeatBallOpenParticleAnimation_Step1(struct Sprite *sprite) -{ - sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]); - sprite->pos2.y = Cos(sprite->data[0], Sin(sprite->data[0], sprite->data[2])); - sprite->data[0] = (sprite->data[0] + 6) & 0xFF; - sprite->data[1]++; - sprite->data[2]++; - if (++sprite->data[3] == 51) - DestroyBallOpenAnimationParticle(sprite); -} - -void MasterBallOpenParticleAnimation(u8 taskId) -{ - u8 i, j; - u8 x, y, priority, subpriority, ballIndex; - u8 spriteId; - - ballIndex = gTasks[taskId].data[15]; - x = gTasks[taskId].data[1]; - y = gTasks[taskId].data[2]; - priority = gTasks[taskId].data[3]; - subpriority = gTasks[taskId].data[4]; - - for (j = 0; j < 2; j++) - { - for (i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gSpriteTemplates_840B3B4[ballIndex], x, y, subpriority); - StartSpriteAnim(&gSprites[spriteId], gBallOpenParticleAnimNums[ballIndex]); - gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; - gSprites[spriteId].oam.priority = priority; - gSprites[spriteId].data[0] = i * 32; - gSprites[spriteId].data[4] = 8; - - if (j == 0) - { - gSprites[spriteId].data[5] = 2; - gSprites[spriteId].data[6] = 1; - } - else - { - gSprites[spriteId].data[5] = 1; - gSprites[spriteId].data[6] = 2; - } - } - } - - gSprites[spriteId].data[7] = 1; - DestroyTask(taskId); -} - -void PremierBallOpenParticleAnimation(u8 taskId) -{ - u8 i; - u8 x, y, priority, subpriority, ballIndex; - u8 spriteId; - - ballIndex = gTasks[taskId].data[15]; - x = gTasks[taskId].data[1]; - y = gTasks[taskId].data[2]; - priority = gTasks[taskId].data[3]; - subpriority = gTasks[taskId].data[4]; - - for (i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gSpriteTemplates_840B3B4[ballIndex], x, y, subpriority); - StartSpriteAnim(&gSprites[spriteId], gBallOpenParticleAnimNums[ballIndex]); - gSprites[spriteId].callback = PremierBallOpenParticleAnimation_Step1; - gSprites[spriteId].oam.priority = priority; - gSprites[spriteId].data[0] = i * 32; - } - - gSprites[spriteId].data[7] = 1; - DestroyTask(taskId); -} - -static void PremierBallOpenParticleAnimation_Step1(struct Sprite *sprite) -{ - sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]); - sprite->pos2.y = Cos(sprite->data[0], Sin(sprite->data[0] & 0x3F, sprite->data[2])); - sprite->data[0] = (sprite->data[0] + 10) & 0xFF; - sprite->data[1]++; - sprite->data[2]++; - if (++sprite->data[3] == 51) - DestroyBallOpenAnimationParticle(sprite); -} - -static void DestroyBallOpenAnimationParticle(struct Sprite *sprite) -{ - int i; - int temp; - - if (!gMain.inBattle) - { - temp = sprite->data[7]; // temp var needed to match - if (temp == 1) - DestroySpriteAndFreeResources(sprite); - else - DestroySprite(sprite); - } - else if (sprite->data[7] == 1) - { - if (--ewram17840.unkA == 0) - { - for (i = 0; i < 12; i++) - { - FreeSpriteTilesByTag(gBallOpenParticleSpritesheets[i].tag); - FreeSpritePaletteByTag(gBallOpenParticlePalettes[i].tag); - } - - DestroySprite(sprite); - } - else - DestroySprite(sprite); - } - else - DestroySprite(sprite); -} - -u8 sub_8141314(u8 arg0, u8 battler, u32 selectedPalettes, u8 ballIndex) -{ - u8 taskId; - - taskId = CreateTask(sub_81413DC, 5); - gTasks[taskId].data[15] = ballIndex; - gTasks[taskId].data[3] = battler; - gTasks[taskId].data[10] = selectedPalettes; - gTasks[taskId].data[11] = selectedPalettes >> 16; - - if (!arg0) - { - BlendPalette(battler * 16 + 0x100, 16, 0, gUnknown_0840B4D4[ballIndex]); - gTasks[taskId].data[1] = 1; - } - else - { - BlendPalette(battler * 16 + 0x100, 16, 16, gUnknown_0840B4D4[ballIndex]); - gTasks[taskId].data[0] = 16; - gTasks[taskId].data[1] = -1; - gTasks[taskId].func = sub_814146C; - } - - BeginNormalPaletteFade(selectedPalettes, 0, 0, 16, RGB(31, 31, 31)); - return taskId; -} - -static void sub_81413DC(u8 taskId) -{ - u8 ballIndex = gTasks[taskId].data[15]; - - if (gTasks[taskId].data[2] <= 16) - { - BlendPalette(gTasks[taskId].data[3] * 16 + 0x100, 16, gTasks[taskId].data[0], gUnknown_0840B4D4[ballIndex]); - gTasks[taskId].data[0] += gTasks[taskId].data[1]; - gTasks[taskId].data[2]++; - } - else if (!gPaletteFade.active) - { - u32 selectedPalettes = (u16)gTasks[taskId].data[10] | ((u16)gTasks[taskId].data[11] << 16); - BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB(31, 31, 31)); - DestroyTask(taskId); - } -} - -static void sub_814146C(u8 taskId) -{ - if (!gPaletteFade.active) - { - u32 selectedPalettes = (u16)gTasks[taskId].data[10] | ((u16)gTasks[taskId].data[11] << 16); - BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB(31, 31, 31)); - gTasks[taskId].func = sub_81414BC; - } -} - -static void sub_81414BC(u8 taskId) -{ - u8 ballIndex = gTasks[taskId].data[15]; - - if (gTasks[taskId].data[2] <= 16) - { - BlendPalette(gTasks[taskId].data[3] * 16 + 0x100, 16, gTasks[taskId].data[0], gUnknown_0840B4D4[ballIndex]); - gTasks[taskId].data[0] += gTasks[taskId].data[1]; - gTasks[taskId].data[2]++; - } - else - { - DestroyTask(taskId); - } -} - -void sub_814151C(u8 taskId) -{ - u8 spriteId; - u32 x; - u32 done; - - done = FALSE; - spriteId = gBankSpriteIds[gBattleAnimAttacker]; - switch (gTasks[taskId].data[10]) - { - case 0: - gTasks[taskId].data[11] = gBattleAnimArgs[0]; - gTasks[taskId].data[0] += 0x500; - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - gSprites[spriteId].pos2.x += gTasks[taskId].data[0] >> 8; - else - gSprites[spriteId].pos2.x -= gTasks[taskId].data[0] >> 8; - - gTasks[taskId].data[0] &= 0xFF; - x = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x + 32; - if (x > 304) - gTasks[taskId].data[10]++; - break; - case 1: - refresh_graphics_maybe(gBattleAnimAttacker, gTasks[taskId].data[11], spriteId); - gTasks[taskId].data[10]++; - break; - case 2: - gTasks[taskId].data[0] += 0x500; - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - gSprites[spriteId].pos2.x -= gTasks[taskId].data[0] >> 8; - else - gSprites[spriteId].pos2.x += gTasks[taskId].data[0] >> 8; - - gTasks[taskId].data[0] &= 0xFF; - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - { - if (gSprites[spriteId].pos2.x <= 0) - { - gSprites[spriteId].pos2.x = 0; - // done = FALSE; // fakematching--can't get the tail merge correct - goto DONE; - } - } - else - { - if (gSprites[spriteId].pos2.x >= 0) - { - gSprites[spriteId].pos2.x = 0; - done = TRUE; - } - } - - if (done) - { - DONE: - DestroyAnimVisualTask(taskId); - } - break; - } -} - -void sub_81416C4(u8 taskId) -{ - u8 spriteId; - - switch (gTasks[taskId].data[15]) - { - case 0: - if (GetBattlerPosition_permutated(gBattleAnimAttacker) == 1) - REG_BLDCNT = 0x3F42; - else - REG_BLDCNT = 0x3F44; - - REG_BLDALPHA = 0x0010; - gTasks[taskId].data[15]++; - break; - case 1: - if (gTasks[taskId].data[1]++ > 1) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - REG_BLDALPHA = (gTasks[taskId].data[0] << 8) | (16 - gTasks[taskId].data[0]); - if (gTasks[taskId].data[0] == 16) - gTasks[taskId].data[15]++; - } - break; - case 2: - spriteId = gBankSpriteIds[gBattleAnimAttacker]; - DmaClear32(3, (void *)OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * TILE_SIZE_4BPP, 0x800); - sub_80324E0(gBattleAnimAttacker); - DestroyAnimVisualTask(taskId); - break; - } -} - -void sub_81417D8(u8 taskId) -{ - gBattleAnimArgs[7] = ewram17800[gBattleAnimAttacker].substituteSprite; - DestroyAnimVisualTask(taskId); -} - -void sub_8141808(u8 taskId) -{ - gBattleAnimTarget = gEffectBank; - DestroyAnimVisualTask(taskId); -} - -void sub_8141828(u8 battler, struct Pokemon *mon) -{ - int isShiny; - u32 otId, personality; - u32 shinyValue; - u8 taskId1, taskId2; - - isShiny = 0; - ewram17810[battler].unk0_7 = 1; - otId = GetMonData(mon, MON_DATA_OT_ID); - personality = GetMonData(mon, MON_DATA_PERSONALITY); - - if (IsAnimBankSpriteVisible(battler)) - { - shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); - if (shinyValue < 8) - isShiny = TRUE; - - if (isShiny) - { - if (GetSpriteTileStartByTag(0x27F9) == 0xFFFF) - { - LoadCompressedObjectPic(&gBattleAnimPicTable[233]); - LoadCompressedObjectPalette(&gBattleAnimPaletteTable[233]); - } - - taskId1 = CreateTask(sub_814191C, 10); - taskId2 = CreateTask(sub_814191C, 10); - gTasks[taskId1].data[0] = battler; - gTasks[taskId2].data[0] = battler; - gTasks[taskId1].data[1] = 0; - gTasks[taskId2].data[1] = 1; - return; - } - } - - ewram17810[battler].unk1_0 = 1; -} - -static void sub_814191C(u8 taskId) -{ - u8 battler; - u8 x, y; - u8 spriteId; - u16 counter; - s16 state; - u8 pan; - - if (gTasks[taskId].data[13] < 60) - { - gTasks[taskId].data[13]++; - return; - } - - if (ewram17840.unkA) - return; - - counter = gTasks[taskId].data[10]++; - if (counter & 3) - return; - - battler = gTasks[taskId].data[0]; - x = GetBattlerSpriteCoord(battler, 0); - y = GetBattlerSpriteCoord(battler, 1); - state = gTasks[taskId].data[11]; - if (state == 0) - { - spriteId = CreateSprite(&gBattleAnimSpriteTemplate_84024E8, x, y, 5); - } - else if (state >= 0 && gTasks[taskId].data[11] < 4) - { - spriteId = CreateSprite(&gSpriteTemplate_8402500, x, y, 5); - gSprites[spriteId].oam.tileNum += 4; - } - else - { - spriteId = CreateSprite(&gSpriteTemplate_8402500, x, y, 5); - gSprites[spriteId].oam.tileNum += 5; - } - - if (gTasks[taskId].data[1] == 0) - { - gSprites[spriteId].callback = sub_8141B20; - } - else - { - gSprites[spriteId].callback = sub_8141B74; - gSprites[spriteId].pos2.x = -32; - gSprites[spriteId].pos2.y = 32; - gSprites[spriteId].invisible = 1; - if (gTasks[taskId].data[11] == 0) - { - if (GetBattlerSide(battler) == B_SIDE_PLAYER) - pan = 192; - else - pan = 63; - - PlaySE12WithPanning(SE_REAPOKE, pan); - } - } - - gSprites[spriteId].data[0] = taskId; - gTasks[taskId].data[11]++; - gTasks[taskId].data[12]++; - if (gTasks[taskId].data[11] == 5) - gTasks[taskId].func = sub_8141AD8; -} - -static void sub_8141AD8(u8 taskId) -{ - u8 battler; - - if (gTasks[taskId].data[12] == 0) - { - if (gTasks[taskId].data[1] == 1) - { - battler = gTasks[taskId].data[0]; - ewram17810[battler].unk1_0 = 1; - } - - DestroyTask(taskId); - } -} - -static void sub_8141B20(struct Sprite *sprite) -{ - sprite->pos2.x = Sin(sprite->data[1], 24); - sprite->pos2.y = Cos(sprite->data[1], 24); - sprite->data[1] += 12; - if (sprite->data[1] > 0xFF) - { - gTasks[sprite->data[0]].data[12]--; - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - } -} - -static void sub_8141B74(struct Sprite *sprite) -{ - if (sprite->data[1] < 4) - { - sprite->data[1]++; - } - else - { - sprite->invisible = 0; - sprite->pos2.x += 5; - sprite->pos2.y -= 5; - if (sprite->pos2.x > 32) - { - gTasks[sprite->data[0]].data[12]--; - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - } - } -} - -void sub_8141BD4(u8 taskId) -{ - u8 paletteIndex; - - LoadCompressedObjectPic(&gBattleAnimPicTable[269]); - LoadCompressedObjectPalette(&gBattleAnimPaletteTable[269]); - paletteIndex = IndexOfSpritePaletteTag(0x281D); // unused - DestroyAnimVisualTask(taskId); -} - -void sub_8141C08(u8 taskId) -{ - FreeSpriteTilesByTag(0x281D); - FreeSpritePaletteByTag(0x281D); - DestroyAnimVisualTask(taskId); -} - -static void sub_8141C30(struct Sprite *sprite) -{ - InitAnimSpritePos(sprite, 0); - sprite->data[0] = 30; - sprite->data[2] = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), 0) + gBattleAnimArgs[2]; - sprite->data[4] = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), 1) + gBattleAnimArgs[3]; - sprite->data[5] = -32; - InitAnimArcTranslation(sprite); - StartSpriteAnim(&gSprites[gBankSpriteIds[gBattleAnimAttacker]], 1); - sprite->callback = sub_8141CBC; -} - -static void sub_8141CBC(struct Sprite *sprite) -{ - if (gSprites[gBankSpriteIds[gBattleAnimAttacker]].animCmdIndex == 1) - sprite->callback = sub_8141CF4; -} - -static void sub_8141CF4(struct Sprite *sprite) -{ - if (TranslateAnimArc(sprite)) - { - sprite->data[0] = 0; - sprite->invisible = 1; - sprite->callback = sub_8141D20; - } -} - -static void sub_8141D20(struct Sprite *sprite) -{ - if (gSprites[gBankSpriteIds[gBattleAnimAttacker]].animEnded) - { - if (++sprite->data[0] > 0) - { - StartSpriteAnim(&gSprites[gBankSpriteIds[gBattleAnimAttacker]], 0); - DestroyAnimSprite(sprite); - } - } -} - -void sub_8141D7C(u8 taskId) -{ - gBattleAnimAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - gBattleAnimTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - DestroyAnimVisualTask(taskId); -} - -void sub_8141DAC(u8 taskId) -{ - if (ewram17840.unk0 == 83) - gBattleAnimArgs[0] = 1; - else if (ewram17840.unk0 == 250) - gBattleAnimArgs[0] = 2; - else if (ewram17840.unk0 == 128) - gBattleAnimArgs[0] = 3; - else if (ewram17840.unk0 == 328) - gBattleAnimArgs[0] = 4; - else - gBattleAnimArgs[0] = 0; - - DestroyAnimVisualTask(taskId); -} - -void sub_8141E10(u8 taskId) -{ - gBattleAnimAttacker = ewram17840.unk0; - gBattleAnimTarget = ewram17840.unk0 >> 8; - DestroyAnimVisualTask(taskId); -} diff --git a/src/battle/battle_bg.c b/src/battle/battle_bg.c deleted file mode 100644 index c3877ec1c..000000000 --- a/src/battle/battle_bg.c +++ /dev/null @@ -1,864 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "decompress.h" -#include "ewram.h" -#include "graphics.h" -#include "link.h" -#include "main.h" -#include "palette.h" -#include "task.h" -#include "text.h" -#include "text_window.h" -#include "trainer.h" -#include "trig.h" -#include "sound.h" -#include "constants/map_types.h" -#include "constants/songs.h" - - -extern u16 gBattleTypeFlags; -extern u8 gBattleOutcome; - -extern struct Window gUnknown_03004210; - -extern u8 BattleText_Win[]; -extern u8 BattleText_Loss[]; -extern u8 BattleText_Tie[]; - -extern void sub_8032A38(void); - -#define GetCurrentMapBattleScene sav1_map_get_battletype -//extern u8 GetCurrentMapBattleScene(void); - -extern const u8 gGameVersion; -extern u16 gBattleTypeFlags; -extern struct Trainer gTrainers[]; -extern u16 gTrainerBattleOpponent; - -extern u8 gBattleTerrain; - -extern u16 gBattleTerrainPalette_Groudon[]; -extern u16 gBattleTerrainPalette_Kyogre[]; -extern u16 gBattleTerrainPalette_BuildingLeader[]; -extern u16 gBattleTerrainPalette_StadiumSteven[]; -extern u16 gBattleTerrainPalette_BuildingGym[]; -extern u16 gBattleTerrainPalette_StadiumMagma[]; -extern u16 gBattleTerrainPalette_StadiumAqua[]; -extern u16 gBattleTerrainPalette_StadiumSidney[]; -extern u16 gBattleTerrainPalette_StadiumPhoebe[]; -extern u16 gBattleTerrainPalette_StadiumGlacia[]; -extern u16 gBattleTerrainPalette_StadiumDrake[]; -extern u16 gBattleTerrainPalette_BattleTower[]; - -extern u8 gVersusFrameGfx[]; -extern u16 gVersusFrameTilemap[]; -extern u16 gVersusFramePal[]; - -extern u16 gBattle_BG1_X; -extern u16 gBattle_BG1_Y; -extern u16 gBattle_BG2_X; -extern u16 gBattle_BG2_Y; - -extern u8 sav1_map_get_battletype(void); - -struct LinkResultWindow { - struct Window *window; - u16 offset; - u8 left; - u8 top; - u8 *dest; -}; - -#define gLinkResultWindows gUnknown_081F9680 -extern const struct LinkResultWindow gLinkResultWindows[]; - -extern struct SpriteTemplate gSpriteTemplate_81F96D0; - -const struct OamData gOamData_81F952C = { - .affineMode = ST_OAM_AFFINE_DOUBLE, - .size = 3 -}; - -const struct OamData gOamData_81F9534 = { - .affineMode = ST_OAM_AFFINE_DOUBLE, - .size = 3, - .tileNum = 64 -}; - -const union AffineAnimCmd gSpriteAffineAnim_81F953C[] = { - AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd gSpriteAffineAnim_81F954C[] = { - AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), - AFFINEANIMCMD_FRAME(0x18, 0x18, 0, -128), - AFFINEANIMCMD_FRAME(0x18, 0x18, 0, -128), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_81F956C[] = { - gSpriteAffineAnim_81F953C, - gSpriteAffineAnim_81F954C -}; - -const struct SpriteTemplate gSpriteTemplate_81F9574 = { - .tileTag = 10000, - .paletteTag = 10000, - .oam = &gOamData_81F952C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_81F956C, - .callback = nullsub_36 -}; - -const struct SpriteTemplate gSpriteTemplate_81F958C = { - .tileTag = 10000, - .paletteTag = 10000, - .oam = &gOamData_81F9534, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_81F956C, - .callback = nullsub_36 -}; - -extern const u8 gUnknown_08E5DC2C[]; - -const struct CompressedSpriteSheet gUnknown_081F95A4[] = { - {gUnknown_08E5DC2C, 4096, 0x2710}, -}; - -struct BattleBackground -{ - const void *tileset; - const void *tilemap; - const void *entryTileset; - const void *entryTilemap; - const void *palette; -}; - -const struct BattleBackground gBattleTerrainTable[] = { -{ - .tileset = gBattleTerrainTiles_TallGrass, - .tilemap = gBattleTerrainTilemap_TallGrass, - .entryTileset = gBattleTerrainAnimTiles_TallGrass, - .entryTilemap = gBattleTerrainAnimTilemap_TallGrass, - .palette = gBattleTerrainPalette_TallGrass -}, -{ - .tileset = gBattleTerrainTiles_LongGrass, - .tilemap = gBattleTerrainTilemap_LongGrass, - .entryTileset = gBattleTerrainAnimTiles_LongGrass, - .entryTilemap = gBattleTerrainAnimTilemap_LongGrass, - .palette = gBattleTerrainPalette_LongGrass -}, -{ - .tileset = gBattleTerrainTiles_Sand, - .tilemap = gBattleTerrainTilemap_Sand, - .entryTileset = gBattleTerrainAnimTiles_Sand, - .entryTilemap = gBattleTerrainAnimTilemap_Sand, - .palette = gBattleTerrainPalette_Sand -}, -{ - .tileset = gBattleTerrainTiles_Underwater, - .tilemap = gBattleTerrainTilemap_Underwater, - .entryTileset = gBattleTerrainAnimTiles_Underwater, - .entryTilemap = gBattleTerrainAnimTilemap_Underwater, - .palette = gBattleTerrainPalette_Underwater -}, -{ - .tileset = gBattleTerrainTiles_Water, - .tilemap = gBattleTerrainTilemap_Water, - .entryTileset = gBattleTerrainAnimTiles_Water, - .entryTilemap = gBattleTerrainAnimTilemap_Water, - .palette = gBattleTerrainPalette_Water -}, -{ - .tileset = gBattleTerrainTiles_PondWater, - .tilemap = gBattleTerrainTilemap_PondWater, - .entryTileset = gBattleTerrainAnimTiles_PondWater, - .entryTilemap = gBattleTerrainAnimTilemap_PondWater, - .palette = gBattleTerrainPalette_PondWater -}, -{ - .tileset = gBattleTerrainTiles_Rock, - .tilemap = gBattleTerrainTilemap_Rock, - .entryTileset = gBattleTerrainAnimTiles_Rock, - .entryTilemap = gBattleTerrainAnimTilemap_Rock, - .palette = gBattleTerrainPalette_Rock -}, -{ - .tileset = gBattleTerrainTiles_Cave, - .tilemap = gBattleTerrainTilemap_Cave, - .entryTileset = gBattleTerrainAnimTiles_Cave, - .entryTilemap = gBattleTerrainAnimTilemap_Cave, - .palette = gBattleTerrainPalette_Cave -}, -{ - .tileset = gBattleTerrainTiles_Building, - .tilemap = gBattleTerrainTilemap_Building, - .entryTileset = gBattleTerrainAnimTiles_Building, - .entryTilemap = gBattleTerrainAnimTilemap_Building, - .palette = gBattleTerrainPalette_Building -}, -{ - .tileset = gBattleTerrainTiles_Building, - .tilemap = gBattleTerrainTilemap_Building, - .entryTileset = gBattleTerrainAnimTiles_Building, - .entryTilemap = gBattleTerrainAnimTilemap_Building, - .palette = gBattleTerrainPalette_Plain - } -}; - -static void sub_800D6C4(void); - -void debug_sub_800D684(void) -{ - u8 spriteId; - ResetSpriteData(); - spriteId = CreateSprite(&gSpriteTemplate_81F96D0, 0, 0, 0); - gSprites[spriteId].invisible = TRUE; - SetMainCallback2(sub_800D6C4); -} - -static void sub_800D6C4(void) -{ - AnimateSprites(); - BuildOamBuffer(); -} - -void sub_800D6D4(void) -{ - u16 ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - REG_DISPSTAT = DISPSTAT_VBLANK_INTR; - REG_BG0CNT = 0x9800; - REG_BG1CNT = 0x9c04; - REG_BG2CNT = 0x5e05; - REG_BG3CNT = 0x5a0b; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_DISPCNT = 0xbf40; -} - -void ApplyPlayerChosenFrameToBattleMenu(void) -{ - TextWindow_SetBaseTileNum(0x12); - TextWindow_LoadStdFrameGraphicsOverridePal(&gUnknown_03004210, 1); - TextWindow_SetBaseTileNum(0x22); - TextWindow_LoadStdFrameGraphicsOverridePal(&gUnknown_03004210, 1); - gPlttBufferUnfaded[92] = 0x7fe0; - gPlttBufferUnfaded[93] = 0x2529; - gPlttBufferUnfaded[94] = 0x7fff; - gPlttBufferUnfaded[95] = 0x675a; - CpuSet(&gPlttBufferUnfaded[92], &gPlttBufferFaded[92], 4); - sub_8032A38(); -} - -void DrawMainBattleBackground(void) -{ - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER /*| BATTLE_TYPE_x2000000*/)) - { - LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - } - else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) - { - if (gGameVersion == VERSION_RUBY) - { - LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); - } - else - { - LZDecompressVram(gBattleTerrainTiles_Water, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60); - } - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - u8 trainerClass = gTrainers[gTrainerBattleOpponent].trainerClass; - if (trainerClass == TRAINER_CLASS_LEADER) - { - LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60); - return; - } - else if (trainerClass == TRAINER_CLASS_CHAMPION) - { - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumSteven, 0x20, 0x60); - return; - } - } - - switch (GetCurrentMapBattleScene()) - { - case MAP_BATTLE_SCENE_NORMAL: - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_GYM: - LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_MAGMA: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_AQUA: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_SIDNEY: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_PHOEBE: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_GLACIA: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_DRAKE: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_BATTLE_TOWER: - LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - break; - } - } -} - -void LoadBattleTextboxAndBackground(void) -{ - LZDecompressVram(gBattleTextboxTiles, (void*)(BG_VRAM)); - CpuSet(gBattleTextboxTilemap, (void *)(VRAM + 0xC000), 0x800); - LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40); - ApplyPlayerChosenFrameToBattleMenu(); - DrawMainBattleBackground(); - - #if DEBUG - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - debug_sub_8008218((void*)(VRAM + 0x600), 0, (void*)(VRAM + 0xC000), 1); - debug_sub_8008264(257, 3, 1, 3, 1); - debug_sub_8008264(257, 3, 21, 3, 1); - debug_sub_8008264(257, 3, 41, 3, 1); - } - #endif -} - -static void sub_800DAF8(u8 taskId, u8 windowId, u8 *dest) -{ - int i; - u16 r4 = 0; - u16 src[6]; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - if (gTasks[taskId].data[5]) { - switch (windowId) { - case 0: - r4 = gTasks[taskId].data[3] & 0x3f; - break; - case 1: - r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6; - break; - case 2: - r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6; - break; - case 3: - r4 = gTasks[taskId].data[4] & 0x3f; - break; - } - } else { - switch (windowId) { - case 0: - r4 = gTasks[taskId].data[3] & 0x3f; - break; - case 1: - r4 = gTasks[taskId].data[4] & 0x3f; - break; - case 2: - r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6; - break; - case 3: - r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6; - break; - } - } - for (i = 0; i < 3; i++) { - src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001; - } - CpuSet(src, dest, 3); - } else { - if (windowId == gBattleStruct->linkPlayerIndex) { - r4 = gTasks[taskId].data[3]; - } else { - r4 = gTasks[taskId].data[4]; - } - for (i = 0; i < 6; i++) { - src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001; - } - CpuSet(src, dest, 6); - } -} - - -#if ENGLISH -#define LEFT_MESSAGE_X 6 -#define RIGHT_MESSAGE_X 21 -#define TILE_OFFSET_LOSS 168 -#elif GERMAN -#define LEFT_MESSAGE_X 5 -#define RIGHT_MESSAGE_X 20 -#define TILE_OFFSET_LOSS 172 -#endif -#define TILE_OFFSET_WIN 160 -#define CENTER_MESSAGE_X 13 -#define MESSAGE_Y 2 - -#define PRINT_MESSAGE(text, tileDataStartOffset, x) \ -{ \ - Text_InitWindow(&gUnknown_03004210, text, tileDataStartOffset, x, MESSAGE_Y); \ - Text_PrintWindow8002F44(&gUnknown_03004210); \ -} - -#define PRINT_MESSAGE_LEFT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, LEFT_MESSAGE_X) -#define PRINT_MESSAGE_RIGHT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, RIGHT_MESSAGE_X) - -static void PrintLinkBattleWinLossTie(void) -{ - - if (gBattleOutcome == 3) - { - PRINT_MESSAGE(BattleText_Tie, TILE_OFFSET_WIN, CENTER_MESSAGE_X); - return; - } - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - // Double battle? - - if (gBattleOutcome == 1) - { - - // lp_field_18 = player position? - switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18) - { - case 0: - case 2: - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - return; - - case 1: - case 3: - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN) - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS) - return; - } - } - else - { - - switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18) - { - case 1: - case 3: - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - return; - - case 0: - case 2: - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); - return; - } - } - - return; - } - - - if (gBattleOutcome == 1) - { - if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 != 0) - { - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); - } - else - { - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - } - } - else - { - if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 != 0) - { - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - } - else - { - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); - } - } -} - - -void sub_800DE30(u8 taskId) -{ - u8 palette; - int i; - - switch (gTasks[taskId].data[0]) { - - case 0: - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - for (i = 0; i < 4; i++) { - u8 windowId = (gLinkPlayers[i].lp_field_18 & 3); - Text_InitWindow8002E4C( - gLinkResultWindows[windowId].window, - gLinkPlayers[i].name, - gLinkResultWindows[windowId].offset, - gLinkResultWindows[windowId].left, - gLinkResultWindows[windowId].top, - 1); - Text_PrintWindow8002F44(gLinkResultWindows[windowId].window); - sub_800DAF8(taskId, windowId, gLinkResultWindows[windowId].dest); - } - } else { - u8 windowId = 4; - - u8 playerId = gBattleStruct->linkPlayerIndex; - u8 opponentId = gBattleStruct->linkPlayerIndex ^ 1; - if (gLinkPlayers[playerId].lp_field_18) { - opponentId = gBattleStruct->linkPlayerIndex; - playerId = gBattleStruct->linkPlayerIndex ^ 1; - } - - Text_InitWindow8002E4C( - gLinkResultWindows[windowId].window, - gLinkPlayers[playerId].name, - gLinkResultWindows[windowId].offset, - gLinkResultWindows[windowId].left, - gLinkResultWindows[windowId].top, - 1); - Text_PrintWindow8002F44(gLinkResultWindows[windowId].window); - sub_800DAF8(taskId, playerId, gLinkResultWindows[windowId].dest); - - Text_InitWindow8002E4C( - gLinkResultWindows[windowId + 1].window, - gLinkPlayers[opponentId].name, - gLinkResultWindows[windowId + 1].offset, - gLinkResultWindows[windowId + 1].left, - gLinkResultWindows[windowId + 1].top, - 1); - Text_PrintWindow8002F44(gLinkResultWindows[windowId + 1].window); - sub_800DAF8(taskId, opponentId, gLinkResultWindows[windowId + 1].dest); - } - gTasks[taskId].data[0]++; - break; - - case 1: - palette = AllocSpritePalette(10000); - gPlttBufferUnfaded[palette * 16 + 0x10f] = gPlttBufferFaded[palette * 16 + 0x10f] = 0x7fff; - gBattleStruct->unk1608A = CreateSprite(&gSpriteTemplate_81F9574, 108, 80, 0); - gBattleStruct->unk1608B = CreateSprite(&gSpriteTemplate_81F958C, 132, 80, 0); - gSprites[gBattleStruct->unk1608A].invisible = TRUE; - gSprites[gBattleStruct->unk1608B].invisible = TRUE; - gTasks[taskId].data[0]++; - break; - - case 2: - if (gTasks[taskId].data[5]) { - gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32); - gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32); - gBattle_BG1_Y = -36; - gBattle_BG2_Y = -36; - } else { - gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32); - gBattle_BG1_Y = (-164) + (Cos2(gTasks[taskId].data[1]) / 32); - gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32); - gBattle_BG2_Y = (-164) + (Cos2(gTasks[taskId].data[2]) / 32); - } - if (gTasks[taskId].data[2]) { - gTasks[taskId].data[2] -= 2; - gTasks[taskId].data[1] += 2; - } else { - if (gTasks[taskId].data[5]) { - PrintLinkBattleWinLossTie(); - } - PlaySE(SE_W231); - DestroyTask(taskId); - gSprites[gBattleStruct->unk1608A].invisible = FALSE; - gSprites[gBattleStruct->unk1608B].invisible = FALSE; - gSprites[gBattleStruct->unk1608B].oam.tileNum += 0x40; - gSprites[gBattleStruct->unk1608A].data[0] = 0; - gSprites[gBattleStruct->unk1608B].data[0] = 1; - gSprites[gBattleStruct->unk1608A].data[1] = gSprites[gBattleStruct->unk1608A].pos1.x; - gSprites[gBattleStruct->unk1608B].data[1] = gSprites[gBattleStruct->unk1608B].pos1.x; - gSprites[gBattleStruct->unk1608A].data[2] = 0; - gSprites[gBattleStruct->unk1608B].data[2] = 0; - } - break; - } -} - -void LoadBattleEntryBackground(void) { - if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - LZDecompressVram(gVersusFrameGfx, (void *)(VRAM + 0x4000)); - LZDecompressVram(gVersusFrameTilemap, (void *)(VRAM + 0xE000)); - LZDecompressVram(gVersusFrameTilemap, (void *)(VRAM + 0xF000)); - LZDecompressVram(gUnknown_08E5DC2C, (void *)(VRAM + 0x10000)); - LoadCompressedPalette(gVersusFramePal, 0x60, 0x20); - REG_BG1CNT = 0x5c04; - REG_WININ = 0x36; - REG_WINOUT = 0x36; - gBattle_BG1_Y = 0xff5c; - gBattle_BG2_Y = 0xff5c; - LoadCompressedObjectPic(gUnknown_081F95A4); - return; - } else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) { - LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)(VRAM + 0x4000)); - LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)(VRAM + 0xE000)); - return; - } else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { - if (gGameVersion == VERSION_RUBY) { - LZDecompressVram(gBattleTerrainAnimTiles_Cave, (void *)(VRAM + 0x4000)); - LZDecompressVram(gBattleTerrainAnimTilemap_Cave, (void *)(VRAM + 0xE000)); - return; - } else { - LZDecompressVram(gBattleTerrainAnimTiles_Underwater, (void *)(VRAM + 0x4000)); - LZDecompressVram(gBattleTerrainAnimTilemap_Underwater, (void *)(VRAM + 0xE000)); - return; - } - } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { - LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)(VRAM + 0x4000)); - LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)(VRAM + 0xE000)); - return; - } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { - LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)(VRAM + 0x4000)); - LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)(VRAM + 0xE000)); - return; - } - } - if (sav1_map_get_battletype() == 0) { - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTileset, (void *)(VRAM + 0x4000)); - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTilemap, (void *)(VRAM + 0xE000)); - return; - } - LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)(VRAM + 0x4000)); - LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)(VRAM + 0xE000)); -} - -int LoadChosenBattleElement(u8 type) { - int ret = 0; - switch (type) { - case 0: - LZDecompressVram(&gBattleTextboxTiles, (void *)VRAM); - break; - case 1: - CpuCopy16(gBattleTextboxTilemap, (void *)(VRAM + 0xC000), 0x1000); - break; - case 2: - LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40); - break; - case 3: // tiles - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { - if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { - if (gGameVersion == VERSION_RUBY) { - LZDecompressVram(gBattleTerrainTiles_Cave, (void *)(VRAM + 0x8000)); - break; - } else { - LZDecompressVram(gBattleTerrainTiles_Water, (void *)(VRAM + 0x8000)); - break; - } - } else { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { - LZDecompressVram(gBattleTerrainTiles_Building, (void *)(VRAM + 0x8000)); - break; - } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)(VRAM + 0x8000)); - break; - } - } - switch (sav1_map_get_battletype()) { - case 0: - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void *)(VRAM + 0x8000)); - break; - case 2: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)(VRAM + 0x8000)); - break; - case 3: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)(VRAM + 0x8000)); - break; - case 4: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)(VRAM + 0x8000)); - break; - case 5: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)(VRAM + 0x8000)); - break; - case 6: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)(VRAM + 0x8000)); - break; - case 7: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)(VRAM + 0x8000)); - break; - case 1: - case 8: - LZDecompressVram(gBattleTerrainTiles_Building, (void *)(VRAM + 0x8000)); - break; - } - break; - } - } else { - LZDecompressVram(gBattleTerrainTiles_Building, (void *)(VRAM + 0x8000)); - break; - } - case 4: // tilemap - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { - if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { - if (gGameVersion == 2) { - LZDecompressVram(gBattleTerrainTilemap_Cave, (void *)(VRAM + 0xD000)); - break; - } else { - LZDecompressVram(gBattleTerrainTilemap_Water, (void *)(VRAM + 0xD000)); - break; - } - } else { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { - LZDecompressVram(gBattleTerrainTilemap_Building, (void *)(VRAM + 0xD000)); - break; - } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)(VRAM + 0xD000)); - break; - } - } - switch (sav1_map_get_battletype()) { - case 0: - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void *)(VRAM + 0xD000)); - break; - case 2: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)(VRAM + 0xD000)); - break; - case 3: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)(VRAM + 0xD000)); - break; - case 4: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)(VRAM + 0xD000)); - break; - case 5: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)(VRAM + 0xD000)); - break; - case 6: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)(VRAM + 0xD000)); - break; - case 7: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)(VRAM + 0xD000)); - break; - case 1: - case 8: - LZDecompressVram(gBattleTerrainTilemap_Building, (void *)(VRAM + 0xD000)); - break; - } - break; - } - } else { - LZDecompressVram(gBattleTerrainTilemap_Building, (void *)(VRAM + 0xD000)); - break; - } - case 5: // palette - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { - if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { - if (gGameVersion == 2) { - LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); - break; - } else { - LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60); - break; - } - } else { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { - LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60); - break; - } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { - LoadCompressedPalette(gBattleTerrainPalette_StadiumSteven, 0x20, 0x60); - break; - } - } - switch (sav1_map_get_battletype()) { - case 0: - LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60); - break; - case 1: - LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60); - break; - case 2: - LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60); - break; - case 3: - LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60); - break; - case 4: - LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60); - break; - case 5: - LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60); - break; - case 6: - LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60); - break; - case 7: - LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60); - break; - case 8: - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - break; - } - break; - } - } else { - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - break; - } - case 6: - ApplyPlayerChosenFrameToBattleMenu(); - break; - default: - ret = 1; - } - return ret; -} diff --git a/src/battle/battle_controller_linkopponent.c b/src/battle/battle_controller_linkopponent.c deleted file mode 100644 index 117aeb932..000000000 --- a/src/battle/battle_controller_linkopponent.c +++ /dev/null @@ -1,1778 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_anim.h" -#include "battle_anim_813F0F4.h" -#include "battle_interface.h" -#include "data2.h" -#include "link.h" -#include "m4a.h" -#include "main.h" -#include "palette.h" -#include "rom_8077ABC.h" -#include "rom3.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "util.h" -#include "ewram.h" - -struct MovePpInfo -{ - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -extern u8 gActiveBattler; -extern u8 gBattleBufferA[][0x200]; -extern u8 gBankSpriteIds[]; -extern u16 gBattlerPartyIndexes[]; -extern u8 gHealthboxIDs[]; -extern u16 gBattleTypeFlags; -extern u8 gBattleMonForms[]; -extern void (*gBattleBankFunc[])(void); -extern s32 gAnimMoveDmg; -extern u16 gAnimMovePower; -extern u8 gAnimFriendship; -extern u16 gWeatherMoveAnim; -extern u32 gTransformedPersonalities[]; -extern u8 gAnimScriptActive; -extern void (*gAnimScriptCallback)(void); -extern u8 gDisplayedStringBattle[]; -extern bool8 gDoingBattleAnim; -extern u8 gBattleOutcome; -extern u16 gUnknown_02024DE8; -extern u8 gUnknown_02024E68[]; -extern struct SpriteTemplate gUnknown_02024E8C; -extern u8 gAnimMoveTurn; -extern struct Window gUnknown_03004210; -extern u8 gUnknown_0300434C[]; -extern u32 gBattleExecBuffer; -extern MainCallback gPreBattleCallback1; -extern struct MusicPlayerInfo gMPlay_BGM; - -extern u8 sub_8077F68(); -extern u8 GetBattlerSubpriority(); -extern u8 GetBattlerPosition(u8); -extern void BattleLoadOpponentMonSprite(struct Pokemon *, u8); -extern void sub_8037A74(void); -extern void sub_8032984(u8, u16); -extern void sub_8037E30(void); -extern void sub_80312F0(struct Sprite *); -extern u8 StartSendOutMonAnimation(); -extern void sub_8032A08(); -extern void sub_8043DB0(); -extern void sub_8037BBC(void); -extern s32 sub_803FC34(u16); -extern void sub_8031A6C(u16, u8); -extern void sub_80313A0(struct Sprite *); -extern void sub_803757C(void); -extern void oamt_add_pos2_onto_pos1(); -extern void StoreSpriteCallbackInData(); -extern void StartAnimLinearTranslation(struct Sprite *); -extern void sub_80375B4(void); -extern void sub_8010384(struct Sprite *); -extern void sub_8037B78(void); -extern u8 sub_8031720(); -extern bool8 mplay_80342A4(u8); -extern void DoMoveAnim(); -extern void sub_80326EC(); -extern void sub_8031F24(void); -extern void sub_80324BC(); -extern void BufferStringBattle(); -extern void sub_8037C2C(void); -extern void sub_8043D84(); -extern void sub_8037B24(void); -extern void sub_8045A5C(); -extern void sub_8037FAC(void); -extern void move_anim_start_t2_for_situation(); -extern void dp01t_0F_4_move_anim(void); -extern void sub_8047858(); -extern u8 GetBattlerSide(u8); -extern void StartBattleIntroAnim(); -extern void sub_803A3A8(struct Sprite *); -extern void sub_8044CA0(u8); -extern void nullsub_47(void); -extern bool8 IsDoubleBattle(void); -extern void sub_8037840(void); -extern void sub_8031B74(); -extern u8 IsBankSpritePresent(); -extern u8 move_anim_start_t3(); -extern void sub_8037FD8(void); -extern void sub_8037F34(void); -extern void LinkOpponentBufferExecCompleted(void); -extern void sub_804777C(); - -// this file's functions - -u32 dp01_getattr_by_ch1_for_player_pokemon__(u8, u8 *); -void sub_803752C(void); -void sub_8037D2C(void); -void sub_8038900(u8); -void sub_8039430(u8, u8); -void sub_8039648(void); -void sub_8039B64(void); -void sub_803A2C4(u8); -void sub_803A4E0(void); - -void LinkOpponentHandleGetAttributes(void); -void LinkOpponentHandlecmd1(void); -void LinkOpponentHandleSetAttributes(void); -void LinkOpponentHandlecmd3(void); -void LinkOpponentHandleLoadPokeSprite(void); -void LinkOpponentHandleSendOutPoke(void); -void LinkOpponentHandleReturnPokeToBall(void); -void LinkOpponentHandleTrainerThrow(void); -void LinkOpponentHandleTrainerSlide(void); -void LinkOpponentHandleTrainerSlideBack(void); -void LinkOpponentHandlecmd10(void); -void LinkOpponentHandlecmd11(void); -void LinkOpponentHandlecmd12(void); -void LinkOpponentHandleBallThrow(void); -void LinkOpponentHandlePuase(void); -void LinkOpponentHandleMoveAnimation(void); -void LinkOpponentHandlePrintString(void); -void LinkOpponentHandlePrintStringPlayerOnly(void); -void LinkOpponentHandlecmd18(void); -void LinkOpponentHandlecmd19(void); -void LinkOpponentHandlecmd20(void); -void LinkOpponentHandleOpenBag(void); -void LinkOpponentHandlecmd22(void); -void LinkOpponentHandlecmd23(void); -void LinkOpponentHandleHealthBarUpdate(void); -void LinkOpponentHandleExpBarUpdate(void); -void LinkOpponentHandleStatusIconUpdate(void); -void LinkOpponentHandleStatusAnimation(void); -void LinkOpponentHandleStatusXor(void); -void LinkOpponentHandlecmd29(void); -void LinkOpponentHandleDMATransfer(void); -void LinkOpponentHandlecmd31(void); -void LinkOpponentHandlecmd32(void); -void LinkOpponentHandlecmd33(void); -void LinkOpponentHandlecmd34(void); -void LinkOpponentHandlecmd35(void); -void LinkOpponentHandlecmd36(void); -void LinkOpponentHandlecmd37(void); -void LinkOpponentHandlecmd38(void); -void LinkOpponentHandlecmd39(void); -void LinkOpponentHandlecmd40(void); -void LinkOpponentHandleHitAnimation(void); -void LinkOpponentHandlecmd42(void); -void LinkOpponentHandleEffectivenessSound(void); -void LinkOpponentHandlecmd44(void); -void LinkOpponentHandleFaintingCry(void); -void LinkOpponentHandleIntroSlide(void); -void LinkOpponentHandleTrainerBallThrow(void); -void LinkOpponentHandlecmd48(void); -void LinkOpponentHandlecmd49(void); -void LinkOpponentHandlecmd50(void); -void LinkOpponentHandleSpriteInvisibility(void); -void LinkOpponentHandleBattleAnimation(void); -void LinkOpponentHandleLinkStandbyMsg(void); -void LinkOpponentHandleResetActionMoveSelection(void); -void LinkOpponentHandlecmd55(void); -void LinkOpponentHandlecmd56(void); - -// const data - -typedef void (*BattleBufferCmd) (void); -const BattleBufferCmd gLinkOpponentBufferCommands[] = -{ - LinkOpponentHandleGetAttributes, - LinkOpponentHandlecmd1, - LinkOpponentHandleSetAttributes, - LinkOpponentHandlecmd3, - LinkOpponentHandleLoadPokeSprite, - LinkOpponentHandleSendOutPoke, - LinkOpponentHandleReturnPokeToBall, - LinkOpponentHandleTrainerThrow, - LinkOpponentHandleTrainerSlide, - LinkOpponentHandleTrainerSlideBack, - LinkOpponentHandlecmd10, - LinkOpponentHandlecmd11, - LinkOpponentHandlecmd12, - LinkOpponentHandleBallThrow, - LinkOpponentHandlePuase, - LinkOpponentHandleMoveAnimation, - LinkOpponentHandlePrintString, - LinkOpponentHandlePrintStringPlayerOnly, - LinkOpponentHandlecmd18, - LinkOpponentHandlecmd19, - LinkOpponentHandlecmd20, - LinkOpponentHandleOpenBag, - LinkOpponentHandlecmd22, - LinkOpponentHandlecmd23, - LinkOpponentHandleHealthBarUpdate, - LinkOpponentHandleExpBarUpdate, - LinkOpponentHandleStatusIconUpdate, - LinkOpponentHandleStatusAnimation, - LinkOpponentHandleStatusXor, - LinkOpponentHandlecmd29, - LinkOpponentHandleDMATransfer, - LinkOpponentHandlecmd31, - LinkOpponentHandlecmd32, - LinkOpponentHandlecmd33, - LinkOpponentHandlecmd34, - LinkOpponentHandlecmd35, - LinkOpponentHandlecmd36, - LinkOpponentHandlecmd37, - LinkOpponentHandlecmd38, - LinkOpponentHandlecmd39, - LinkOpponentHandlecmd40, - LinkOpponentHandleHitAnimation, - LinkOpponentHandlecmd42, - LinkOpponentHandleEffectivenessSound, - LinkOpponentHandlecmd44, - LinkOpponentHandleFaintingCry, - LinkOpponentHandleIntroSlide, - LinkOpponentHandleTrainerBallThrow, - LinkOpponentHandlecmd48, - LinkOpponentHandlecmd49, - LinkOpponentHandlecmd50, - LinkOpponentHandleSpriteInvisibility, - LinkOpponentHandleBattleAnimation, - LinkOpponentHandleLinkStandbyMsg, - LinkOpponentHandleResetActionMoveSelection, - LinkOpponentHandlecmd55, - LinkOpponentHandlecmd56 -}; - -// code - -void nullsub_47(void) -{ -} - -void SetBankFuncToLinkOpponentBufferRunCommand(void) -{ - gBattleBankFunc[gActiveBattler] = sub_803752C; -} - -void sub_803752C(void) -{ - if (gBattleExecBuffer & gBitTable[gActiveBattler]) - { - if (gBattleBufferA[gActiveBattler][0] <= 0x38) - gLinkOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]](); - else - LinkOpponentBufferExecCompleted(); - } -} - -void sub_803757C(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - LinkOpponentBufferExecCompleted(); -} - -void sub_80375B4(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - { - sub_8031B74(gSprites[gBankSpriteIds[gActiveBattler]].oam.affineParam); - gSprites[gBankSpriteIds[gActiveBattler]].oam.tileNum = gSprites[gBankSpriteIds[gActiveBattler]].data[5]; - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - LinkOpponentBufferExecCompleted(); - } -} - -void sub_8037644(void) -{ - if ((--ewram17810[gActiveBattler].unk9) == 0xFF) - { - ewram17810[gActiveBattler].unk9 = 0; - LinkOpponentBufferExecCompleted(); - } -} - -void sub_8037680(void) -{ - bool8 r6 = FALSE; - - if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) - { - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy) - r6 = TRUE; - } - else - { - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gHealthboxIDs[gActiveBattler ^ 2]].callback == SpriteCallbackDummy) - r6 = TRUE; - } - if (IsCryPlayingOrClearCrySongs()) - r6 = FALSE; - - if (r6) - { - if (GetBattlerPosition(gActiveBattler) == 1) - { - if (!ewram17810[gActiveBattler].unk1_0 || !ewram17810[gActiveBattler ^ 2].unk1_0) - return; - ewram17810[gActiveBattler].unk0_7 = 0; - ewram17810[gActiveBattler].unk1_0 = 0; - ewram17810[gActiveBattler ^ 2].unk0_7 = 0; - ewram17810[gActiveBattler ^ 2].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - } - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (GetBattlerPosition(gActiveBattler) == 1) - m4aMPlayContinue(&gMPlay_BGM); - } - else - { - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); - } - ewram17810[gActiveBattler].unk9 = 3; - gBattleBankFunc[gActiveBattler] = sub_8037644; - } -} - -void sub_8037840(void) -{ - if (!ewram17810[gActiveBattler].unk0_3 && !ewram17810[gActiveBattler].unk0_7) - sub_8141828(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - if (!ewram17810[gActiveBattler ^ 2].unk0_3 && !ewram17810[gActiveBattler ^ 2].unk0_7) - sub_8141828(gActiveBattler ^ 2, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ 2]]); - if (!ewram17810[gActiveBattler].unk0_3 && !ewram17810[gActiveBattler ^ 2].unk0_3) - { - if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) && GetBattlerPosition(gActiveBattler) == 3) - { - if (++ewram17810[gActiveBattler].unk9 == 1) - return; - ewram17810[gActiveBattler].unk9 = 0; - } - if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler ^ 2]]); - sub_8045A5C( - gHealthboxIDs[gActiveBattler ^ 2], - &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ 2]], - 0); - sub_804777C(gActiveBattler ^ 2); - sub_8043DFC(gHealthboxIDs[gActiveBattler ^ 2]); - sub_8032984( - gActiveBattler ^ 2, - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ 2]], MON_DATA_SPECIES)); - } - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler]]); - sub_8045A5C( - gHealthboxIDs[gActiveBattler], - &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], - 0); - sub_804777C(gActiveBattler); - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - sub_8032984( - gActiveBattler, - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - - ewram17840.unk9_0 = 0; - gBattleBankFunc[gActiveBattler] = sub_8037680; - } -} - -void sub_8037A74(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].animEnded == TRUE - && gSprites[gBankSpriteIds[gActiveBattler]].pos2.x == 0) - { - if (!ewram17810[gActiveBattler].unk0_7) - { - sub_8141828(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - return; - } - if (ewram17810[gActiveBattler].unk1_0) - { - ewram17810[gActiveBattler].unk0_7 = 0; - ewram17810[gActiveBattler].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - LinkOpponentBufferExecCompleted(); - return; - } - } -} - -void sub_8037B24(void) -{ - s16 r4 = sub_8045C78(gActiveBattler, gHealthboxIDs[gActiveBattler], 0, 0); - - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - if (r4 != -1) - sub_80440EC(gHealthboxIDs[gActiveBattler], r4, 0); - else - LinkOpponentBufferExecCompleted(); -} - -void sub_8037B78(void) -{ - if (!gSprites[gBankSpriteIds[gActiveBattler]].inUse) - { - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - LinkOpponentBufferExecCompleted(); - } -} - -void sub_8037BBC(void) -{ - if (!ewram17810[gActiveBattler].unk0_6) - { - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - sub_8032A08(gActiveBattler); - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - LinkOpponentBufferExecCompleted(); - } -} - -void sub_8037C2C(void) -{ - if (gUnknown_03004210.state == 0) - LinkOpponentBufferExecCompleted(); -} - -void dp01t_0F_4_move_anim(void) -{ - u8 spriteId = gBankSpriteIds[gActiveBattler]; - - if (gSprites[spriteId].data[1] == 32) - { - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].invisible = FALSE; - gDoingBattleAnim = 0; - LinkOpponentBufferExecCompleted(); - } - else - { - if (((u16)gSprites[spriteId].data[1] % 4) == 0) - gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data[1]++; - } -} - -void sub_8037CC0(void) -{ - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy) - { - if (ewram17800[gActiveBattler].substituteSprite) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 6); - gBattleBankFunc[gActiveBattler] = sub_8037D2C; - } -} - -void sub_8037D2C(void) -{ - if (!ewram17810[gActiveBattler].unk0_6) - { - CreateTask(c3_0802FDF4, 10); - LinkOpponentBufferExecCompleted(); - } -} - -void sub_8037D64(void) -{ - if (ewram17810[gActiveBattler].unk1_0) - { - ewram17810[gActiveBattler].unk0_7 = 0; - ewram17810[gActiveBattler].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], 0); - sub_8045A5C( - gHealthboxIDs[gActiveBattler], - &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], - 0); - sub_804777C(gActiveBattler); - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - sub_8031F88(gActiveBattler); - gBattleBankFunc[gActiveBattler] = sub_8037CC0; - } -} - -void sub_8037E30(void) -{ - if (!ewram17810[gActiveBattler].unk0_3 && !ewram17810[gActiveBattler].unk0_7) - sub_8141828(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - if (gSprites[gUnknown_0300434C[gActiveBattler]].callback == SpriteCallbackDummy - && !ewram17810[gActiveBattler].unk0_3) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler]]); - sub_8032984(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattleBankFunc[gActiveBattler] = sub_8037D64; - } -} - -void sub_8037EF0(void) -{ - if (gReceivedRemoteLinkPlayers == 0) - { - m4aSongNumStop(SE_HINSI); - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(c2_8011A1C); - } -} - -void sub_8037F34(void) -{ - if (!gPaletteFade.active) - { - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - sub_800832C(); - gBattleBankFunc[gActiveBattler] = sub_8037EF0; - } - else - { - m4aSongNumStop(SE_HINSI); - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(gMain.savedCallback); - } - } -} - -void sub_8037FAC(void) -{ - if (!ewram17810[gActiveBattler].unk0_4) - LinkOpponentBufferExecCompleted(); -} - -void sub_8037FD8(void) -{ - if (!ewram17810[gActiveBattler].unk0_5) - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentBufferExecCompleted(void) -{ - gBattleBankFunc[gActiveBattler] = sub_803752C; - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - u8 playerId = GetMultiplayerId(); - - PrepareBufferDataTransferLink(2, 4, &playerId); - gBattleBufferA[gActiveBattler][0] = 0x38; - } - else - { - gBattleExecBuffer &= ~gBitTable[gActiveBattler]; - } -} - -void LinkOpponentHandleGetAttributes(void) -{ - u8 buffer[0x100]; - u32 r6 = 0; - u8 r4; - s32 i; - - if (gBattleBufferA[gActiveBattler][2] == 0) - { - r6 = dp01_getattr_by_ch1_for_player_pokemon__(gBattlerPartyIndexes[gActiveBattler], buffer); - } - else - { - r4 = gBattleBufferA[gActiveBattler][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - r6 += dp01_getattr_by_ch1_for_player_pokemon__(i, buffer + r6); - r4 >>= 1; - } - } - Emitcmd29(1, r6, buffer); - LinkOpponentBufferExecCompleted(); -} - -u32 dp01_getattr_by_ch1_for_player_pokemon__(u8 a, u8 *buffer) -{ - struct BattlePokemon battlePokemon; - struct MovePpInfo moveData; - u8 nickname[20]; - u8 *src; - s16 data16; - u32 data32; - s32 size = 0; - - switch (gBattleBufferA[gActiveBattler][1]) - { - case 0: - battlePokemon.species = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); - battlePokemon.item = GetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) - { - battlePokemon.moves[size] = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + size); - battlePokemon.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); - } - battlePokemon.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - battlePokemon.friendship = GetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP); - battlePokemon.experience = GetMonData(&gEnemyParty[a], MON_DATA_EXP); - battlePokemon.hpIV = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); - battlePokemon.attackIV = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); - battlePokemon.defenseIV = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV); - battlePokemon.spAttackIV = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); - battlePokemon.spDefenseIV = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); - battlePokemon.personality = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); - battlePokemon.status1 = GetMonData(&gEnemyParty[a], MON_DATA_STATUS); - battlePokemon.level = GetMonData(&gEnemyParty[a], MON_DATA_LEVEL); - battlePokemon.hp = GetMonData(&gEnemyParty[a], MON_DATA_HP); - battlePokemon.maxHP = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); - battlePokemon.attack = GetMonData(&gEnemyParty[a], MON_DATA_ATK); - battlePokemon.defense = GetMonData(&gEnemyParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gEnemyParty[a], MON_DATA_SPEED); - battlePokemon.spAttack = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); - battlePokemon.spDefense = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); - battlePokemon.isEgg = GetMonData(&gEnemyParty[a], MON_DATA_IS_EGG); - battlePokemon.altAbility = GetMonData(&gEnemyParty[a], MON_DATA_ALT_ABILITY); - battlePokemon.otId = GetMonData(&gEnemyParty[a], MON_DATA_OT_ID); - GetMonData(&gEnemyParty[a], MON_DATA_NICKNAME, nickname); - StringCopy10(battlePokemon.nickname, nickname); - GetMonData(&gEnemyParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - - MEMCPY_ALT(&battlePokemon, buffer, sizeof(battlePokemon), size, src); - break; - case 1: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 2: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 3: - for (size = 0; size < 4; size++) - { - moveData.moves[size] = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + size); - moveData.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); - } - moveData.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - MEMCPY_ALT(&moveData, buffer, sizeof(moveData), size, src); - break; - case 4: - case 5: - case 6: - case 7: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - 4); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 8: - for (size = 0; size < 4; size++) - buffer[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); - buffer[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - size++; - break; - case 9: - case 10: - case 11: - case 12: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - 9); - size = 1; - break; - case 17: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_OT_ID); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 18: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_EXP); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 19: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_EV); - size = 1; - break; - case 20: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_EV); - size = 1; - break; - case 21: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_EV); - size = 1; - break; - case 22: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_EV); - size = 1; - break; - case 23: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV); - size = 1; - break; - case 24: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_EV); - size = 1; - break; - case 25: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP); - size = 1; - break; - case 26: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_POKERUS); - size = 1; - break; - case 27: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_LOCATION); - size = 1; - break; - case 28: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_LEVEL); - size = 1; - break; - case 29: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_GAME); - size = 1; - break; - case 30: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_POKEBALL); - size = 1; - break; - case 31: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); - buffer[1] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); - buffer[2] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV); - buffer[4] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); - buffer[5] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); - size = 6; - break; - case 32: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); - size = 1; - break; - case 33: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); - size = 1; - break; - case 34: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - size = 1; - break; - case 35: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV); - size = 1; - break; - case 36: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); - size = 1; - break; - case 37: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); - size = 1; - break; - case 38: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 39: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_CHECKSUM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 40: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_STATUS); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 41: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_LEVEL); - size = 1; - break; - case 42: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 43: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 44: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_ATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 45: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_DEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 46: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPEED); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 47: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 48: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 49: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_COOL); - size = 1; - break; - case 50: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_BEAUTY); - size = 1; - break; - case 51: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_CUTE); - size = 1; - break; - case 52: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SMART); - size = 1; - break; - case 53: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_TOUGH); - size = 1; - break; - case 54: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SHEEN); - size = 1; - break; - case 55: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_COOL_RIBBON); - size = 1; - break; - case 56: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_BEAUTY_RIBBON); - size = 1; - break; - case 57: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_CUTE_RIBBON); - size = 1; - break; - case 58: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SMART_RIBBON); - size = 1; - break; - case 59: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_TOUGH_RIBBON); - size = 1; - break; - } - return size; -} - -void LinkOpponentHandlecmd1(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleSetAttributes(void) -{ - u8 i; - u8 r4; - - if (gBattleBufferA[gActiveBattler][2] == 0) - { - sub_8038900(gBattlerPartyIndexes[gActiveBattler]); - } - else - { - r4 = gBattleBufferA[gActiveBattler][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - sub_8038900(i); - r4 >>= 1; - } - } - LinkOpponentBufferExecCompleted(); -} - -void sub_8038900(u8 a) -{ - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; - s32 i; - - switch (gBattleBufferA[gActiveBattler][1]) - { - case 0: - { - u8 iv; - - SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, &battlePokemon->species); - SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) - { - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, &battlePokemon->pp[i]); - } - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); - SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); - SetMonData(&gEnemyParty[a], MON_DATA_EXP, &battlePokemon->experience); - iv = battlePokemon->hpIV; - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &iv); - iv = battlePokemon->attackIV; - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &iv); - iv = battlePokemon->defenseIV; - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &iv); - iv = battlePokemon->speedIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV, &iv); - iv = battlePokemon->spAttackIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &iv); - iv = battlePokemon->spDefenseIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &iv); - SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, &battlePokemon->personality); - SetMonData(&gEnemyParty[a], MON_DATA_STATUS, &battlePokemon->status1); - SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, &battlePokemon->level); - SetMonData(&gEnemyParty[a], MON_DATA_HP, &battlePokemon->hp); - SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, &battlePokemon->maxHP); - SetMonData(&gEnemyParty[a], MON_DATA_ATK, &battlePokemon->attack); - SetMonData(&gEnemyParty[a], MON_DATA_DEF, &battlePokemon->defense); - SetMonData(&gEnemyParty[a], MON_DATA_SPEED, &battlePokemon->speed); - SetMonData(&gEnemyParty[a], MON_DATA_SPATK, &battlePokemon->spAttack); - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, &battlePokemon->spDefense); - } - break; - case 1: - SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); - break; - case 2: - SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); - break; - case 3: - for (i = 0; i < 4; i++) - { - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, &moveData->moves[i]); - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, &moveData->pp[i]); - } - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); - break; - case 4: - case 5: - case 6: - case 7: - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - 4, &gBattleBufferA[gActiveBattler][3]); - break; - case 8: - SetMonData(&gEnemyParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gEnemyParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gEnemyParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gEnemyParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); - break; - case 9: - case 10: - case 11: - case 12: - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - 9, &gBattleBufferA[gActiveBattler][3]); - break; - case 17: - SetMonData(&gEnemyParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); - break; - case 18: - SetMonData(&gEnemyParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); - break; - case 19: - SetMonData(&gEnemyParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 20: - SetMonData(&gEnemyParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 21: - SetMonData(&gEnemyParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 22: - SetMonData(&gEnemyParty[a], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 23: - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 24: - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 25: - SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); - break; - case 26: - SetMonData(&gEnemyParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); - break; - case 27: - SetMonData(&gEnemyParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); - break; - case 28: - SetMonData(&gEnemyParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); - break; - case 29: - SetMonData(&gEnemyParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); - break; - case 30: - SetMonData(&gEnemyParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); - break; - case 31: - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); - break; - case 32: - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 33: - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 34: - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 35: - SetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 36: - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 37: - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 38: - SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); - break; - case 39: - SetMonData(&gEnemyParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); - break; - case 40: - SetMonData(&gEnemyParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); - break; - case 41: - SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); - break; - case 42: - SetMonData(&gEnemyParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); - break; - case 43: - SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); - break; - case 44: - SetMonData(&gEnemyParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); - break; - case 45: - SetMonData(&gEnemyParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); - break; - case 46: - SetMonData(&gEnemyParty[a], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); - break; - case 47: - SetMonData(&gEnemyParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); - break; - case 48: - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); - break; - case 49: - SetMonData(&gEnemyParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); - break; - case 50: - SetMonData(&gEnemyParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); - break; - case 51: - SetMonData(&gEnemyParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); - break; - case 52: - SetMonData(&gEnemyParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); - break; - case 53: - SetMonData(&gEnemyParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); - break; - case 54: - SetMonData(&gEnemyParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); - break; - case 55: - SetMonData(&gEnemyParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 56: - SetMonData(&gEnemyParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 57: - SetMonData(&gEnemyParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 58: - SetMonData(&gEnemyParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 59: - SetMonData(&gEnemyParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - } -} - -void LinkOpponentHandlecmd3(void) -{ - u8 *dst; - u8 i; - - MEMSET_ALT(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][3 + i], gBattleBufferA[gActiveBattler][2], i, dst); - - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleLoadPokeSprite(void) -{ - u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - - BattleLoadOpponentMonSprite(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - GetMonSpriteTemplate_803C56C(species, GetBattlerPosition(gActiveBattler)); - gBankSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_02024E8C, - GetBattlerSpriteCoord(gActiveBattler, 2), - sub_8077F68(gActiveBattler), - GetBattlerSubpriority(gActiveBattler)); - gSprites[gBankSpriteIds[gActiveBattler]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = gActiveBattler; - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); - sub_8032984(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattleBankFunc[gActiveBattler] = sub_8037A74; -} - -void LinkOpponentHandleSendOutPoke(void) -{ - gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; - sub_8039430(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattleBankFunc[gActiveBattler] = sub_8037E30; -} - -void sub_8039430(u8 a, u8 b) -{ - u16 species; - - sub_8032AA8(a, b); - gBattlerPartyIndexes[a] = gBattleBufferA[a][1]; - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[a]], MON_DATA_SPECIES); - gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); - BattleLoadOpponentMonSprite(&gEnemyParty[gBattlerPartyIndexes[a]], a); - GetMonSpriteTemplate_803C56C(species, GetBattlerPosition(a)); - gBankSpriteIds[a] = CreateSprite( - &gUnknown_02024E8C, - GetBattlerSpriteCoord(a, 2), - sub_8077F68(a), - GetBattlerSubpriority(a)); - gSprites[gUnknown_0300434C[a]].data[1] = gBankSpriteIds[a]; - gSprites[gBankSpriteIds[a]].data[0] = a; - gSprites[gBankSpriteIds[a]].data[2] = species; - gSprites[gBankSpriteIds[a]].oam.paletteNum = a; - StartSpriteAnim(&gSprites[gBankSpriteIds[a]], gBattleMonForms[a]); - gSprites[gBankSpriteIds[a]].invisible = TRUE; - gSprites[gBankSpriteIds[a]].callback = SpriteCallbackDummy; - gSprites[gUnknown_0300434C[a]].data[0] = StartSendOutMonAnimation(0, 0xFE); -} - -void LinkOpponentHandleReturnPokeToBall(void) -{ - if (gBattleBufferA[gActiveBattler][1] == 0) - { - ewram17810[gActiveBattler].unk4 = 0; - gBattleBankFunc[gActiveBattler] = sub_8039648; - } - else - { - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - sub_8032A08(gActiveBattler); - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - LinkOpponentBufferExecCompleted(); - } -} - -void sub_8039648(void) -{ - switch (ewram17810[gActiveBattler].unk4) - { - case 0: - if (ewram17800[gActiveBattler].substituteSprite) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - ewram17810[gActiveBattler].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBattler].unk0_6) - { - ewram17810[gActiveBattler].unk4 = 0; - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 2); - gBattleBankFunc[gActiveBattler] = sub_8037BBC; - } - break; - } -} - -void LinkOpponentHandleTrainerThrow(void) -{ - s16 xOffset; - u32 gender; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (GetBattlerPosition(gActiveBattler) & 2) - xOffset = -16; - else - xOffset = 16; - gender = gLinkPlayers[sub_803FC34(gActiveBattler)].gender; - } - else - { - xOffset = 0; - gender = gLinkPlayers[GetMultiplayerId() ^ 1].gender; - } - sub_8031A6C(gender, gActiveBattler); - GetMonSpriteTemplate_803C5A0(gender, GetBattlerPosition(gActiveBattler)); - gBankSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_02024E8C, - 176 + xOffset, 40 + 4 * (8 - gTrainerFrontPicCoords[gender].coords), - GetBattlerSubpriority(gActiveBattler)); - gSprites[gBankSpriteIds[gActiveBattler]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 2; - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[gender].tag); - gSprites[gBankSpriteIds[gActiveBattler]].data[5] = gSprites[gBankSpriteIds[gActiveBattler]].oam.tileNum; - gSprites[gBankSpriteIds[gActiveBattler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[gender].tag); - gSprites[gBankSpriteIds[gActiveBattler]].oam.affineParam = gender; - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_80313A0; - gBattleBankFunc[gActiveBattler] = sub_803757C; -} - -void LinkOpponentHandleTrainerSlide(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleTrainerSlideBack(void) -{ - oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBattler]]); - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 35; - gSprites[gBankSpriteIds[gActiveBattler]].data[2] = 280; - gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], SpriteCallbackDummy); - gBattleBankFunc[gActiveBattler] = sub_80375B4; -} - -void LinkOpponentHandlecmd10(void) -{ - if (ewram17810[gActiveBattler].unk4 == 0) - { - if (ewram17800[gActiveBattler].substituteSprite) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - ewram17810[gActiveBattler].unk4++; - } - else if (!ewram17810[gActiveBattler].unk0_6) - { - ewram17810[gActiveBattler].unk4 = 0; - PlaySE12WithPanning(SE_POKE_DEAD, 63); - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_8010384; - gBattleBankFunc[gActiveBattler] = sub_8037B78; - } -} - -void LinkOpponentHandlecmd11(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd12(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleBallThrow(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlePuase(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleMoveAnimation(void) -{ - if (!mplay_80342A4(gActiveBattler)) - { - u32 r0 = gBattleBufferA[gActiveBattler][1] - | (gBattleBufferA[gActiveBattler][2] << 8); - - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] - | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] - | (gBattleBufferA[gActiveBattler][7] << 8) - | (gBattleBufferA[gActiveBattler][8] << 16) - | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] - | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; - gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; - - // Dead code. sub_8031720 always returns 0. - if (sub_8031720(r0, gAnimMoveTurn) != 0) - { - LinkOpponentBufferExecCompleted(); - } - else - { - ewram17810[gActiveBattler].unk4 = 0; - gBattleBankFunc[gActiveBattler] = sub_8039B64; - } - } -} - -void sub_8039B64(void) -{ - u16 r4 = gBattleBufferA[gActiveBattler][1] - | (gBattleBufferA[gActiveBattler][2] << 8); - u8 r7 = gBattleBufferA[gActiveBattler][11]; - - switch (ewram17810[gActiveBattler].unk4) - { - case 0: - if (ewram17800[gActiveBattler].substituteSprite && !ewram17800[gActiveBattler].unk0_3) - { - ewram17800[gActiveBattler].unk0_3 = 1; - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - } - ewram17810[gActiveBattler].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBattler].unk0_6) - { - sub_80326EC(0); - DoMoveAnim(r4); - ewram17810[gActiveBattler].unk4 = 2; - } - break; - case 2: - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - sub_80326EC(1); - if ((ewram17800[gActiveBattler].substituteSprite) && r7 <= 1) - { - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 6); - ewram17800[gActiveBattler].unk0_3 = 0; - } - ewram17810[gActiveBattler].unk4 = 3; - } - break; - case 3: - if (!ewram17810[gActiveBattler].unk0_6) - { - sub_8031F24(); - sub_80324BC( - gActiveBattler, - gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - ewram17810[gActiveBattler].unk4 = 0; - LinkOpponentBufferExecCompleted(); - } - break; - } -} - -void LinkOpponentHandlePrintString(void) -{ - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBattler][2]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gBattleBankFunc[gActiveBattler] = sub_8037C2C; -} - -void LinkOpponentHandlePrintStringPlayerOnly(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd18(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd19(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd20(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleOpenBag(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd22(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd23(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleHealthBarUpdate(void) -{ - s16 r7; - - load_gfxc_health_bar(0); - r7 = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - if (r7 != 0x7FFF) - { - u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); - u32 hp = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); - - sub_8043D84(gActiveBattler, gHealthboxIDs[gActiveBattler], maxHP, hp, r7); - } - else - { - u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); - - sub_8043D84(gActiveBattler, gHealthboxIDs[gActiveBattler], maxHP, 0, r7); - } - gBattleBankFunc[gActiveBattler] = sub_8037B24; -} - -void LinkOpponentHandleExpBarUpdate(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleStatusIconUpdate(void) -{ - if (mplay_80342A4(gActiveBattler) == 0) - { - sub_8045A5C(gHealthboxIDs[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], 9); - ewram17810[gActiveBattler].unk0_4 = 0; - gBattleBankFunc[gActiveBattler] = sub_8037FAC; - } -} - -void LinkOpponentHandleStatusAnimation(void) -{ - if (mplay_80342A4(gActiveBattler) == 0) - { - move_anim_start_t2_for_situation( - gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2] - | (gBattleBufferA[gActiveBattler][3] << 8) - | (gBattleBufferA[gActiveBattler][4] << 16) - | (gBattleBufferA[gActiveBattler][5] << 24)); - gBattleBankFunc[gActiveBattler] = sub_8037FAC; - } -} - -void LinkOpponentHandleStatusXor(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd29(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleDMATransfer(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd31(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd32(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd33(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd34(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd35(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd36(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd37(void) -{ - gUnknown_020238C8.unk0_0 = 0; - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd38(void) -{ - gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBattler][1]; - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd39(void) -{ - gUnknown_020238C8.unk0_7 = 0; - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd40(void) -{ - gUnknown_020238C8.unk0_7 ^= 1; - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleHitAnimation(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].invisible == TRUE) - { - LinkOpponentBufferExecCompleted(); - } - else - { - gDoingBattleAnim = TRUE; - gSprites[gBankSpriteIds[gActiveBattler]].data[1] = 0; - sub_8047858(gActiveBattler); - gBattleBankFunc[gActiveBattler] = dp01t_0F_4_move_anim; - } -} - -void LinkOpponentHandlecmd42(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleEffectivenessSound(void) -{ - s8 pan; - - if (GetBattlerSide(gActiveBattler) == 0) - pan = -64; - else - pan = 63; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd44(void) -{ - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleFaintingCry(void) -{ - PlayCry3( - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES), - 25, 5); - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleIntroSlide(void) -{ - StartBattleIntroAnim(gBattleBufferA[gActiveBattler][1]); - gUnknown_02024DE8 |= 1; - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleTrainerBallThrow(void) -{ - u8 taskId; - - oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBattler]]); - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 35; - gSprites[gBankSpriteIds[gActiveBattler]].data[2] = 280; - gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], sub_803A3A8); - taskId = CreateTask(sub_803A2C4, 5); - gTasks[taskId].data[0] = gActiveBattler; - if (ewram17810[gActiveBattler].unk0_0) - gTasks[gUnknown_02024E68[gActiveBattler]].func = sub_8044CA0; - ewram17840.unk9_0 = 1; - gBattleBankFunc[gActiveBattler] = nullsub_47; -} - -void sub_803A2C4(u8 taskId) -{ - u8 r9; - - r9 = gActiveBattler; - gActiveBattler = gTasks[taskId].data[0]; - if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_8039430(gActiveBattler, 0); - } - else - { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_8039430(gActiveBattler, 0); - gActiveBattler ^= 2; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_8039430(gActiveBattler, 0); - gActiveBattler ^= 2; - } - gBattleBankFunc[gActiveBattler] = sub_8037840; - gActiveBattler = r9; - DestroyTask(taskId); -} - -void sub_803A3A8(struct Sprite *sprite) -{ - sub_8031B74(sprite->oam.affineParam); - sprite->oam.tileNum = sprite->data[5]; - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); -} - -void LinkOpponentHandlecmd48(void) -{ - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == 0) - { - LinkOpponentBufferExecCompleted(); - return; - } - - ewram17810[gActiveBattler].unk0_0 = 1; - if (gBattleBufferA[gActiveBattler][2] != 0) - { - if (ewram17810[gActiveBattler].unk1_1 < 2) - { - ewram17810[gActiveBattler].unk1_1++; - return; - } - else - { - ewram17810[gActiveBattler].unk1_1 = 0; - } - } - gUnknown_02024E68[gActiveBattler] = sub_8044804( - gActiveBattler, - (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBattler][4], - gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2]); - ewram17810[gActiveBattler].unk5 = 0; - if (gBattleBufferA[gActiveBattler][2] != 0) - ewram17810[gActiveBattler].unk5 = 0x5D; - gBattleBankFunc[gActiveBattler] = sub_803A4E0; -} - -void sub_803A4E0(void) -{ - if (ewram17810[gActiveBattler].unk5++ >= 93) - { - ewram17810[gActiveBattler].unk5 = 0; - LinkOpponentBufferExecCompleted(); - } -} - -void LinkOpponentHandlecmd49(void) -{ - if (ewram17810[gActiveBattler].unk0_0) - gTasks[gUnknown_02024E68[gActiveBattler]].func = sub_8044CA0; - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd50(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleSpriteInvisibility(void) -{ - if (IsBankSpritePresent(gActiveBattler) != 0) - { - gSprites[gBankSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; - sub_8031F88(gActiveBattler); - } - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleBattleAnimation(void) -{ - if (mplay_80342A4(gActiveBattler) == 0) - { - u8 r3 = gBattleBufferA[gActiveBattler][1]; - u16 r4 = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - - if (move_anim_start_t3(gActiveBattler, gActiveBattler, gActiveBattler, r3, r4) != 0) - LinkOpponentBufferExecCompleted(); - else - gBattleBankFunc[gActiveBattler] = sub_8037FD8; - } -} - -void LinkOpponentHandleLinkStandbyMsg(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandleResetActionMoveSelection(void) -{ - LinkOpponentBufferExecCompleted(); -} - -void LinkOpponentHandlecmd55(void) -{ - if (gBattleBufferA[gActiveBattler][1] == 3) - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; - else - gBattleOutcome = gBattleBufferA[gActiveBattler][1] ^ 3; - FadeOutMapMusic(5); - BeginFastPaletteFade(3); - LinkOpponentBufferExecCompleted(); - gBattleBankFunc[gActiveBattler] = sub_8037F34; -} - -void LinkOpponentHandlecmd56(void) -{ -} diff --git a/src/battle/battle_controller_linkpartner.c b/src/battle/battle_controller_linkpartner.c deleted file mode 100644 index 0db2f54b4..000000000 --- a/src/battle/battle_controller_linkpartner.c +++ /dev/null @@ -1,1714 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_anim.h" -#include "battle_anim_813F0F4.h" -#include "battle_interface.h" -#include "data2.h" -#include "battle_811DA74.h" -#include "battle_anim_813F0F4.h" -#include "link.h" -#include "m4a.h" -#include "main.h" -#include "palette.h" -#include "pokeball.h" -#include "pokemon.h" -#include "rom3.h" -#include "rom_8077ABC.h" -#include "sound.h" -#include "constants/songs.h" -#include "sprite.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "util.h" -#include "ewram.h" - -struct MovePpInfo -{ - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -extern u16 gBattleTypeFlags; -extern u8 gDisplayedStringBattle[]; -extern u8 gBattleBufferA[][0x200]; -extern u8 gActiveBattler; -extern u32 gBattleExecBuffer; -extern u16 gBattlerPartyIndexes[]; -extern u8 gBankSpriteIds[]; -extern u8 gBattleOutcome; -extern u16 gUnknown_02024DE8; -extern u8 gUnknown_02024E68[]; -extern u8 gDoingBattleAnim; -extern u32 gTransformedPersonalities[]; -extern struct SpriteTemplate gUnknown_02024E8C; -extern s32 gAnimMoveDmg; -extern u16 gAnimMovePower; -extern u8 gAnimFriendship; -extern u16 gWeatherMoveAnim; -extern u8 gAnimMoveTurn; -extern struct Window gUnknown_03004210; -extern MainCallback gPreBattleCallback1; -extern void (*gBattleBankFunc[])(void); -extern u8 gHealthboxIDs[]; -extern u8 gUnknown_0300434C[]; -extern u8 gBattleMonForms[]; -extern u8 gAnimScriptActive; -extern void (*gAnimScriptCallback)(void); - -extern u8 move_anim_start_t3(); -extern u8 IsBankSpritePresent(); -extern void sub_8044CA0(u8); -extern void sub_8030E38(struct Sprite *); -extern void StartBattleIntroAnim(); -extern void sub_8047858(); -extern void move_anim_start_t2_for_situation(); -extern void sub_8043D84(); -extern void BufferStringBattle(); -extern void sub_8031F24(void); -extern void sub_80326EC(); -extern void DoMoveAnim(); -extern void sub_80324BC(); -extern u8 sub_8031720(); -extern u8 mplay_80342A4(); -extern void oamt_add_pos2_onto_pos1(); -extern void StoreSpriteCallbackInData(); -extern void StartAnimLinearTranslation(struct Sprite *); -extern void sub_80105EC(struct Sprite *); -extern s32 sub_803FC34(u16); -extern void LoadPlayerTrainerBankSprite(); -extern void sub_80313A0(struct Sprite *); -extern u8 StartSendOutMonAnimation(); -extern void sub_80312F0(struct Sprite *); -extern u8 CreateInvisibleSpriteWithCallback(); -extern void BattleLoadPlayerMonSprite(); -extern u8 GetBattlerSpriteCoord(); -extern u8 sub_8077F68(); -extern u8 GetBattlerSubpriority(); -extern void nullsub_10(); -extern void sub_8045A5C(); -extern void sub_804777C(); -extern void sub_8043DFC(); -//extern s16 sub_8045C78(); -extern void sub_80440EC(); -extern void HandleLowHpMusicChange(); -extern void nullsub_9(u16); -extern void sub_8043DB0(); -extern void move_anim_start_t4(); -extern void c3_0802FDF4(u8); -extern void sub_8031F88(); -extern void c2_8011A1C(void); - -// this file's functions - -void LinkPartnerBufferRunCommand(void); -void sub_811E0A0(void); -void LinkPartnerBufferExecCompleted(void); -u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *b); -void sub_811EC68(u8); -void sub_811F864(u8, u8); -void sub_811FA5C(void); -void sub_811FF30(void); -void sub_812071C(u8); -void sub_81208E0(void); - -void LinkPartnerHandleGetAttributes(void); -void LinkPartnerHandlecmd1(void); -void LinkPartnerHandleSetAttributes(void); -void LinkPartnerHandlecmd3(void); -void LinkPartnerHandleLoadPokeSprite(void); -void LinkPartnerHandleSendOutPoke(void); -void LinkPartnerHandleReturnPokeToBall(void); -void LinkPartnerHandleTrainerThrow(void); -void LinkPartnerHandleTrainerSlide(void); -void LinkPartnerHandleTrainerSlideBack(void); -void LinkPartnerHandlecmd10(void); -void LinkPartnerHandlecmd11(void); -void LinkPartnerHandlecmd12(void); -void LinkPartnerHandleBallThrow(void); -void LinkPartnerHandlePuase(void); -void LinkPartnerHandleMoveAnimation(void); -void LinkPartnerHandlePrintString(void); -void LinkPartnerHandlePrintStringPlayerOnly(void); -void LinkPartnerHandlecmd18(void); -void LinkPartnerHandlecmd19(void); -void LinkPartnerHandlecmd20(void); -void LinkPartnerHandleOpenBag(void); -void LinkPartnerHandlecmd22(void); -void LinkPartnerHandlecmd23(void); -void LinkPartnerHandleHealthBarUpdate(void); -void LinkPartnerHandleExpBarUpdate(void); -void LinkPartnerHandleStatusIconUpdate(void); -void LinkPartnerHandleStatusAnimation(void); -void LinkPartnerHandleStatusXor(void); -void LinkPartnerHandlecmd29(void); -void LinkPartnerHandleDMATransfer(void); -void LinkPartnerHandlecmd31(void); -void LinkPartnerHandlecmd32(void); -void LinkPartnerHandlecmd33(void); -void LinkPartnerHandlecmd34(void); -void LinkPartnerHandlecmd35(void); -void LinkPartnerHandlecmd36(void); -void LinkPartnerHandlecmd37(void); -void LinkPartnerHandlecmd38(void); -void LinkPartnerHandlecmd39(void); -void LinkPartnerHandlecmd40(void); -void LinkPartnerHandleHitAnimation(void); -void LinkPartnerHandlecmd42(void); -void LinkPartnerHandleEffectivenessSound(void); -void LinkPartnerHandlecmd44(void); -void LinkPartnerHandleFaintingCry(void); -void LinkPartnerHandleIntroSlide(void); -void LinkPartnerHandleTrainerBallThrow(void); -void LinkPartnerHandlecmd48(void); -void LinkPartnerHandlecmd49(void); -void LinkPartnerHandlecmd50(void); -void LinkPartnerHandleSpriteInvisibility(void); -void LinkPartnerHandleBattleAnimation(void); -void LinkPartnerHandleLinkStandbyMsg(void); -void LinkPartnerHandleResetActionMoveSelection(void); -void LinkPartnerHandlecmd55(void); -void LinkPartnerHandlecmd56(void); - -// const data -typedef void (*BattleBufferCmd) (void); -static const BattleBufferCmd gLinkPartnerBufferCommands[] = -{ - LinkPartnerHandleGetAttributes, - LinkPartnerHandlecmd1, - LinkPartnerHandleSetAttributes, - LinkPartnerHandlecmd3, - LinkPartnerHandleLoadPokeSprite, - LinkPartnerHandleSendOutPoke, - LinkPartnerHandleReturnPokeToBall, - LinkPartnerHandleTrainerThrow, - LinkPartnerHandleTrainerSlide, - LinkPartnerHandleTrainerSlideBack, - LinkPartnerHandlecmd10, - LinkPartnerHandlecmd11, - LinkPartnerHandlecmd12, - LinkPartnerHandleBallThrow, - LinkPartnerHandlePuase, - LinkPartnerHandleMoveAnimation, - LinkPartnerHandlePrintString, - LinkPartnerHandlePrintStringPlayerOnly, - LinkPartnerHandlecmd18, - LinkPartnerHandlecmd19, - LinkPartnerHandlecmd20, - LinkPartnerHandleOpenBag, - LinkPartnerHandlecmd22, - LinkPartnerHandlecmd23, - LinkPartnerHandleHealthBarUpdate, - LinkPartnerHandleExpBarUpdate, - LinkPartnerHandleStatusIconUpdate, - LinkPartnerHandleStatusAnimation, - LinkPartnerHandleStatusXor, - LinkPartnerHandlecmd29, - LinkPartnerHandleDMATransfer, - LinkPartnerHandlecmd31, - LinkPartnerHandlecmd32, - LinkPartnerHandlecmd33, - LinkPartnerHandlecmd34, - LinkPartnerHandlecmd35, - LinkPartnerHandlecmd36, - LinkPartnerHandlecmd37, - LinkPartnerHandlecmd38, - LinkPartnerHandlecmd39, - LinkPartnerHandlecmd40, - LinkPartnerHandleHitAnimation, - LinkPartnerHandlecmd42, - LinkPartnerHandleEffectivenessSound, - LinkPartnerHandlecmd44, - LinkPartnerHandleFaintingCry, - LinkPartnerHandleIntroSlide, - LinkPartnerHandleTrainerBallThrow, - LinkPartnerHandlecmd48, - LinkPartnerHandlecmd49, - LinkPartnerHandlecmd50, - LinkPartnerHandleSpriteInvisibility, - LinkPartnerHandleBattleAnimation, - LinkPartnerHandleLinkStandbyMsg, - LinkPartnerHandleResetActionMoveSelection, - LinkPartnerHandlecmd55, - LinkPartnerHandlecmd56, -}; -// code starts here - -void nullsub_74(void) -{ -} - -void SetBankFuncToLinkPartnerBufferRunCommand(void) -{ - gBattleBankFunc[gActiveBattler] = LinkPartnerBufferRunCommand; -} - -void LinkPartnerBufferRunCommand(void) -{ - if (gBattleExecBuffer & gBitTable[gActiveBattler]) - { - if (gBattleBufferA[gActiveBattler][0] <= 0x38) - gLinkPartnerBufferCommands[gBattleBufferA[gActiveBattler][0]](); - else - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811DAE4(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - LinkPartnerBufferExecCompleted(); -} - -void sub_811DB1C(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - { - nullsub_10(0); - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811DB84(void) -{ - if ((--ewram17810[gActiveBattler].unk9) == 0xFF) - { - ewram17810[gActiveBattler].unk9 = 0; - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811DBC0(void) -{ - bool8 r6 = FALSE; - - if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & 0x40))) - { - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy) - r6 = TRUE; - } - else - { - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gHealthboxIDs[gActiveBattler ^ 2]].callback == SpriteCallbackDummy) - r6 = TRUE; - } - if (IsCryPlayingOrClearCrySongs()) - r6 = FALSE; - if (r6) - { - ewram17810[gActiveBattler].unk9 = 3; - gBattleBankFunc[gActiveBattler] = sub_811DB84; - } -} - -void sub_811DCA0(void) -{ - u8 r2; - - if (!ewram17810[gActiveBattler].unk0_3) - { - // I couldn't get it to work as a bitfield here - r2 = *((u8 *)&ewram17810[gActiveBattler ^ 2]) & 8; - if (!r2 && (++ewram17810[gActiveBattler].unk9) != 1) - { - ewram17810[gActiveBattler].unk9 = r2; - if (IsDoubleBattle() && !(gBattleTypeFlags & 0x40)) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler ^ 2]]); - sub_8045A5C(gHealthboxIDs[gActiveBattler ^ 2], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ 2]], 0); - sub_804777C(gActiveBattler ^ 2); - sub_8043DFC(gHealthboxIDs[gActiveBattler ^ 2]); - } - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler]]); - sub_8045A5C(gHealthboxIDs[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], 0); - sub_804777C(gActiveBattler); - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - (s8)ewram17810[4].unk9 &= ~1; - gBattleBankFunc[gActiveBattler] = sub_811DBC0; - } - } -} - -void sub_811DDE8(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].animEnded - && gSprites[gBankSpriteIds[gActiveBattler]].pos2.x == 0) - LinkPartnerBufferExecCompleted(); -} - -void bx_t3_healthbar_update(void) -{ - s16 r4; - - r4 = sub_8045C78(gActiveBattler, gHealthboxIDs[gActiveBattler], 0, 0); - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - if (r4 != -1) - { - sub_80440EC(gHealthboxIDs[gActiveBattler], r4, 0); - } - else - { - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811DE98(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].pos1.y + gSprites[gBankSpriteIds[gActiveBattler]].pos2.y > 160) - { - nullsub_9(GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - FreeOamMatrix(gSprites[gBankSpriteIds[gActiveBattler]].oam.matrixNum); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811DF34(void) -{ - if (!ewram17810[gActiveBattler].unk0_6) - { - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811DFA0(void) -{ - if (gUnknown_03004210.state == 0) - LinkPartnerBufferExecCompleted(); -} - -void bx_blink_t3(void) -{ - u8 spriteId = gBankSpriteIds[gActiveBattler]; - if (gSprites[spriteId].data[1] == 32) - { - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].invisible = FALSE; - gDoingBattleAnim = 0; - LinkPartnerBufferExecCompleted(); - } - else - { - if ((gSprites[spriteId].data[1] % 4) == 0) - { - gSprites[spriteId].invisible ^= 1; - } - gSprites[spriteId].data[1]++; - } -} - -void sub_811E034(void) -{ - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy) - { - if (ewram17800[gActiveBattler].substituteSprite) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 6); - gBattleBankFunc[gActiveBattler] = sub_811E0A0; - } -} - -void sub_811E0A0(void) -{ - if (!ewram17810[gActiveBattler].unk0_6) - LinkPartnerBufferExecCompleted(); -} - -void sub_811E0CC(void) -{ - if (ewram17810[gActiveBattler].unk1_0) - { - ewram17810[gActiveBattler].unk0_7 = 0; - ewram17810[gActiveBattler].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - CreateTask(c3_0802FDF4, 10); - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], 0); - sub_8045A5C(gHealthboxIDs[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], 0); - sub_804777C(gActiveBattler); - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - sub_8031F88(gActiveBattler); - gBattleBankFunc[gActiveBattler] = sub_811E034; - } -} - -void sub_811E1BC(void) -{ - if (!ewram17810[gActiveBattler].unk0_3 && !ewram17810[gActiveBattler].unk0_7) - sub_8141828(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - if (gSprites[gUnknown_0300434C[gActiveBattler]].callback == SpriteCallbackDummy - && !ewram17810[gActiveBattler].unk0_3) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler]]); - gBattleBankFunc[gActiveBattler] = sub_811E0CC; - } -} - -void sub_811E258(void) -{ - if (gReceivedRemoteLinkPlayers == 0) - { - m4aSongNumStop(0x5A); - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(c2_8011A1C); - } -} - -void sub_811E29C(void) -{ - if (!gPaletteFade.active) - { - if (gBattleTypeFlags & 2) - { - sub_800832C(); - gBattleBankFunc[gActiveBattler] = sub_811E258; - } - else - { - m4aSongNumStop(0x5A); - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(gMain.savedCallback); - } - } -} - -void LinkPartnerBufferExecCompleted(void) -{ - u8 multiplayerId; - - gBattleBankFunc[gActiveBattler] = LinkPartnerBufferRunCommand; - if (gBattleTypeFlags & 2) - { - multiplayerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(2, 4, &multiplayerId); - gBattleBufferA[gActiveBattler][0] = 0x38; - } - else - { - gBattleExecBuffer &= ~gBitTable[gActiveBattler]; - } -} - -void sub_811E38C(void) -{ - if (!ewram17810[gActiveBattler].unk0_4) - LinkPartnerBufferExecCompleted(); -} - -void sub_811E3B8(void) -{ - if (!ewram17810[gActiveBattler].unk0_5) - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleGetAttributes(void) -{ - u8 unk[256]; - int r6 = 0; - s32 i; - - if (gBattleBufferA[gActiveBattler][2] == 0) - { - r6 = dp01_getattr_by_ch1_for_player_pokemon(gBattlerPartyIndexes[gActiveBattler], unk); - } - else - { - u8 r4 = gBattleBufferA[gActiveBattler][2]; - - for (i = 0; i < 6; i++) - { - if (r4 & 1) - r6 += dp01_getattr_by_ch1_for_player_pokemon(i, unk + r6); - r4 >>= 1; - } - } - Emitcmd29(1, r6, unk); - LinkPartnerBufferExecCompleted(); -} - -// Duplicate of dp01_getattr_by_ch1_for_player_pokemon_ -u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) -{ - struct BattlePokemon battlePokemon; - struct MovePpInfo moveData; - u8 nickname[20]; - u8 *src; - s16 data16; - u32 data32; - s32 size = 0; - - switch (gBattleBufferA[gActiveBattler][1]) - { - case 0: - battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); - battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) - { - battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); - battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - } - battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); - battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP); - battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); - battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); - battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); - battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); - battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP); - battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); - battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); - battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPEED); - battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); - battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); - battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); - battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY); - battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); - GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); - StringCopy10(battlePokemon.nickname, nickname); - GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - MEMCPY_ALT(&battlePokemon, buffer, sizeof(battlePokemon), size, src); - break; - case 1: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 2: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 3: - for (size = 0; size < 4; size++) - { - moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); - moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - } - moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - MEMCPY_ALT(&moveData, buffer, sizeof(moveData), size, src); - break; - case 4: - case 5: - case 6: - case 7: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - 4); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 8: - for (size = 0; size < 4; size++) - buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - size++; - break; - case 9: - case 10: - case 11: - case 12: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - 9); - size = 1; - break; - case 17: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 18: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 19: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV); - size = 1; - break; - case 20: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV); - size = 1; - break; - case 21: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV); - size = 1; - break; - case 22: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_EV); - size = 1; - break; - case 23: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV); - size = 1; - break; - case 24: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV); - size = 1; - break; - case 25: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); - size = 1; - break; - case 26: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS); - size = 1; - break; - case 27: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION); - size = 1; - break; - case 28: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL); - size = 1; - break; - case 29: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME); - size = 1; - break; - case 30: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL); - size = 1; - break; - case 31: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); - buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - size = 6; - break; - case 32: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - size = 1; - break; - case 33: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - size = 1; - break; - case 34: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - size = 1; - break; - case 35: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); - size = 1; - break; - case 36: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - size = 1; - break; - case 37: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - size = 1; - break; - case 38: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 39: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 40: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 41: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); - size = 1; - break; - case 42: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 43: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 44: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 45: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 46: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPEED); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 47: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 48: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 49: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL); - size = 1; - break; - case 50: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY); - size = 1; - break; - case 51: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE); - size = 1; - break; - case 52: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART); - size = 1; - break; - case 53: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH); - size = 1; - break; - case 54: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN); - size = 1; - break; - case 55: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON); - size = 1; - break; - case 56: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON); - size = 1; - break; - case 57: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON); - size = 1; - break; - case 58: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON); - size = 1; - break; - case 59: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON); - size = 1; - break; - } - return size; -} - -void LinkPartnerHandlecmd1(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleSetAttributes(void) -{ - u8 i; - u8 r4; - - if (gBattleBufferA[gActiveBattler][2] == 0) - { - sub_811EC68(gBattlerPartyIndexes[gActiveBattler]); - } - else - { - r4 = gBattleBufferA[gActiveBattler][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - sub_811EC68(i); - r4 >>= 1; - } - } - LinkPartnerBufferExecCompleted(); -} - -// Duplicate of dp01_setattr_by_ch1_for_player_pokemon -void sub_811EC68(u8 a) -{ - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; - s32 i; - - switch (gBattleBufferA[gActiveBattler][1]) - { - case 0: - { - u8 iv; - - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &battlePokemon->species); - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, &battlePokemon->pp[i]); - } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); - SetMonData(&gPlayerParty[a], MON_DATA_EXP, &battlePokemon->experience); - iv = battlePokemon->hpIV; - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &iv); - iv = battlePokemon->attackIV; - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &iv); - iv = battlePokemon->defenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &iv); - iv = battlePokemon->speedIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &iv); - iv = battlePokemon->spAttackIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &iv); - iv = battlePokemon->spDefenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &iv); - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &battlePokemon->personality); - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &battlePokemon->status1); - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &battlePokemon->level); - SetMonData(&gPlayerParty[a], MON_DATA_HP, &battlePokemon->hp); - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &battlePokemon->maxHP); - SetMonData(&gPlayerParty[a], MON_DATA_ATK, &battlePokemon->attack); - SetMonData(&gPlayerParty[a], MON_DATA_DEF, &battlePokemon->defense); - SetMonData(&gPlayerParty[a], MON_DATA_SPEED, &battlePokemon->speed); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &battlePokemon->spAttack); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &battlePokemon->spDefense); - } - break; - case 1: - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); - break; - case 2: - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); - break; - case 3: - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, &moveData->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, &moveData->pp[i]); - } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); - break; - case 4: - case 5: - case 6: - case 7: - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - 4, &gBattleBufferA[gActiveBattler][3]); - break; - case 8: - SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); - break; - case 9: - case 10: - case 11: - case 12: - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - 9, &gBattleBufferA[gActiveBattler][3]); - break; - case 17: - SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); - break; - case 18: - SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); - break; - case 19: - SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 20: - SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 21: - SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 22: - SetMonData(&gPlayerParty[a], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 23: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 24: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 25: - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); - break; - case 26: - SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); - break; - case 27: - SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); - break; - case 28: - SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); - break; - case 29: - SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); - break; - case 30: - SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); - break; - case 31: - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); - break; - case 32: - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 33: - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 34: - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 35: - SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 36: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 37: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 38: - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); - break; - case 39: - SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); - break; - case 40: - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); - break; - case 41: - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); - break; - case 42: - SetMonData(&gPlayerParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); - break; - case 43: - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); - break; - case 44: - SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); - break; - case 45: - SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); - break; - case 46: - SetMonData(&gPlayerParty[a], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); - break; - case 47: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); - break; - case 48: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); - break; - case 49: - SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); - break; - case 50: - SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); - break; - case 51: - SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); - break; - case 52: - SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); - break; - case 53: - SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); - break; - case 54: - SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); - break; - case 55: - SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 56: - SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 57: - SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 58: - SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 59: - SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - } - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); -} - -void LinkPartnerHandlecmd3(void) -{ - u8 *dst; - u8 i; - - MEMSET_ALT(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][3 + i], gBattleBufferA[gActiveBattler][2], i, dst); - - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleLoadPokeSprite(void) -{ - BattleLoadPlayerMonSprite(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - GetMonSpriteTemplate_803C56C( - GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES), - GetBattlerPosition(gActiveBattler)); - gBankSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_02024E8C, - GetBattlerSpriteCoord(gActiveBattler, 2), - sub_8077F68(gActiveBattler), - GetBattlerSubpriority(gActiveBattler)); - gSprites[gBankSpriteIds[gActiveBattler]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = gActiveBattler; - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); - gBattleBankFunc[gActiveBattler] = sub_811DDE8; -} - -void LinkPartnerHandleSendOutPoke(void) -{ - sub_8032AA8(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; - BattleLoadPlayerMonSprite(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_811F864(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattleBankFunc[gActiveBattler] = sub_811E1BC; -} - -void sub_811F864(u8 a, u8 b) -{ - u16 species; - - sub_8032AA8(a, b); - gBattlerPartyIndexes[a] = gBattleBufferA[a][1]; - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[a]], MON_DATA_SPECIES); - gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); - GetMonSpriteTemplate_803C56C(species, GetBattlerPosition(a)); - gBankSpriteIds[a] = CreateSprite( - &gUnknown_02024E8C, - GetBattlerSpriteCoord(a, 2), - sub_8077F68(a), - GetBattlerSubpriority(a)); - gSprites[gUnknown_0300434C[a]].data[1] = gBankSpriteIds[a]; - gSprites[gBankSpriteIds[a]].data[0] = a; - gSprites[gBankSpriteIds[a]].data[2] = species; - gSprites[gBankSpriteIds[a]].oam.paletteNum = a; - StartSpriteAnim(&gSprites[gBankSpriteIds[a]], gBattleMonForms[a]); - gSprites[gBankSpriteIds[a]].invisible = TRUE; - gSprites[gBankSpriteIds[a]].callback = SpriteCallbackDummy; - gSprites[gUnknown_0300434C[a]].data[0] = StartSendOutMonAnimation(0, 0xFF); -} - -void LinkPartnerHandleReturnPokeToBall(void) -{ - if (gBattleBufferA[gActiveBattler][1] == 0) - { - ewram17810[gActiveBattler].unk4 = 0; - gBattleBankFunc[gActiveBattler] = sub_811FA5C; - } - else - { - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811FA5C(void) -{ - switch (ewram17810[gActiveBattler].unk4) - { - case 0: - if (ewram17800[gActiveBattler].substituteSprite) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - ewram17810[gActiveBattler].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBattler].unk0_6) - { - ewram17810[gActiveBattler].unk4 = 0; - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 1); - gBattleBankFunc[gActiveBattler] = sub_811DF34; - } - break; - } -} - -void LinkPartnerHandleTrainerThrow(void) -{ - s16 xOffset; - u32 gender; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (GetBattlerPosition(gActiveBattler) & 2) - xOffset = 16; - else - xOffset = -16; - gender = gLinkPlayers[sub_803FC34(gActiveBattler)].gender; - } - else - { - xOffset = 0; - gender = gLinkPlayers[GetMultiplayerId() ^ 1].gender; - } - LoadPlayerTrainerBankSprite(gender, gActiveBattler); - GetMonSpriteTemplate_803C5A0(gender, GetBattlerPosition(gActiveBattler)); - gBankSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_02024E8C, - 80 + xOffset, 80 + 4 * (8 - gTrainerBackPicCoords[gender].coords), - GetBattlerSubpriority(gActiveBattler)); - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBankSpriteIds[gActiveBattler]].pos2.x = 240; - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_80313A0; - gBattleBankFunc[gActiveBattler] = sub_811DAE4; -} - -void LinkPartnerHandleTrainerSlide(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleTrainerSlideBack(void) -{ - oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBattler]]); - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 35; - gSprites[gBankSpriteIds[gActiveBattler]].data[2] = -40; - gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], SpriteCallbackDummy); - gBattleBankFunc[gActiveBattler] = sub_811DB1C; -} - -void LinkPartnerHandlecmd10(void) -{ - if (ewram17810[gActiveBattler].unk4 == 0) - { - if (ewram17800[gActiveBattler].substituteSprite) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - ewram17810[gActiveBattler].unk4++; - } - else if (!ewram17810[gActiveBattler].unk0_6) - { - ewram17810[gActiveBattler].unk4 = 0; - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - PlaySE12WithPanning(SE_POKE_DEAD, -64); - gSprites[gBankSpriteIds[gActiveBattler]].data[1] = 0; - gSprites[gBankSpriteIds[gActiveBattler]].data[2] = 5; - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_80105EC; - gBattleBankFunc[gActiveBattler] = sub_811DE98; - } -} - -void LinkPartnerHandlecmd11(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd12(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleBallThrow(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlePuase(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleMoveAnimation(void) -{ - if (!mplay_80342A4(gActiveBattler)) - { - u32 r0 = gBattleBufferA[gActiveBattler][1] - | (gBattleBufferA[gActiveBattler][2] << 8); - - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] - | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] - | (gBattleBufferA[gActiveBattler][7] << 8) - | (gBattleBufferA[gActiveBattler][8] << 16) - | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] - | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; - gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; - - if (sub_8031720(r0, gAnimMoveTurn) != 0) - LinkPartnerBufferExecCompleted(); - else - { - ewram17810[gActiveBattler].unk4 = 0; - gBattleBankFunc[gActiveBattler] = sub_811FF30; - } - } -} - -void sub_811FF30(void) -{ - u16 r4 = gBattleBufferA[gActiveBattler][1] - | (gBattleBufferA[gActiveBattler][2] << 8); - u8 r7 = gBattleBufferA[gActiveBattler][11]; - - switch (ewram17810[gActiveBattler].unk4) - { - case 0: - if (ewram17800[gActiveBattler].substituteSprite && !ewram17800[gActiveBattler].unk0_3) - { - ewram17800[gActiveBattler].unk0_3 = 1; - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - } - ewram17810[gActiveBattler].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBattler].unk0_6) - { - sub_80326EC(0); - DoMoveAnim(r4); - ewram17810[gActiveBattler].unk4 = 2; - } - break; - case 2: - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - sub_80326EC(1); - if ((ewram17800[gActiveBattler].substituteSprite) && r7 <= 1) - { - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 6); - ewram17800[gActiveBattler].unk0_3 = 0; - } - ewram17810[gActiveBattler].unk4 = 3; - } - break; - case 3: - if (!ewram17810[gActiveBattler].unk0_6) - { - sub_8031F24(); - sub_80324BC( - gActiveBattler, - gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - ewram17810[gActiveBattler].unk4 = 0; - LinkPartnerBufferExecCompleted(); - } - break; - } -} - -void LinkPartnerHandlePrintString(void) -{ - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBattler][2]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gBattleBankFunc[gActiveBattler] = sub_811DFA0; -} - -void LinkPartnerHandlePrintStringPlayerOnly(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd18(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd19(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd20(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleOpenBag(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd22(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd23(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleHealthBarUpdate(void) -{ - s16 r7; - - load_gfxc_health_bar(0); - r7 = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - if (r7 != 0x7FFF) - { - u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); - u32 hp = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); - - sub_8043D84(gActiveBattler, gHealthboxIDs[gActiveBattler], maxHP, hp, r7); - } - else - { - u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); - - sub_8043D84(gActiveBattler, gHealthboxIDs[gActiveBattler], maxHP, 0, r7); - } - gBattleBankFunc[gActiveBattler] = bx_t3_healthbar_update; -} - -void LinkPartnerHandleExpBarUpdate(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleStatusIconUpdate(void) -{ - if (mplay_80342A4(gActiveBattler) == 0) - { - sub_8045A5C(gHealthboxIDs[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], 9); - ewram17810[gActiveBattler].unk0_4 = 0; - gBattleBankFunc[gActiveBattler] = sub_811E38C; - } -} - -void LinkPartnerHandleStatusAnimation(void) -{ - if (mplay_80342A4(gActiveBattler) == 0) - { - move_anim_start_t2_for_situation( - gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2] - | (gBattleBufferA[gActiveBattler][3] << 8) - | (gBattleBufferA[gActiveBattler][4] << 16) - | (gBattleBufferA[gActiveBattler][5] << 24)); - gBattleBankFunc[gActiveBattler] = sub_811E38C; - } -} - -void LinkPartnerHandleStatusXor(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd29(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleDMATransfer(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd31(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd32(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd33(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd34(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd35(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd36(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd37(void) -{ - gUnknown_020238C8.unk0_0 = 0; - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd38(void) -{ - gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBattler][1]; - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd39(void) -{ - gUnknown_020238C8.unk0_7 = 0; - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd40(void) -{ - gUnknown_020238C8.unk0_7 ^= 1; - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleHitAnimation(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].invisible == TRUE) - { - LinkPartnerBufferExecCompleted(); - } - else - { - gDoingBattleAnim = TRUE; - gSprites[gBankSpriteIds[gActiveBattler]].data[1] = 0; - sub_8047858(gActiveBattler); - gBattleBankFunc[gActiveBattler] = bx_blink_t3; - } -} - -void LinkPartnerHandlecmd42(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleEffectivenessSound(void) -{ - s8 pan; - - if (GetBattlerSide(gActiveBattler) == 0) - pan = -64; - else - pan = 63; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd44(void) -{ - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleFaintingCry(void) -{ - PlayCry3( - GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES), - -25, 5); - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleIntroSlide(void) -{ - StartBattleIntroAnim(gBattleBufferA[gActiveBattler][1]); - gUnknown_02024DE8 |= 1; - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleTrainerBallThrow(void) -{ - u8 r4; - u8 taskId; - - oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBattler]]); - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 50; - gSprites[gBankSpriteIds[gActiveBattler]].data[2] = -40; - gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - gSprites[gBankSpriteIds[gActiveBattler]].data[5] = gActiveBattler; - StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], sub_8030E38); - StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], 1); - r4 = AllocSpritePalette(0xD6F9); - LoadCompressedPalette( - gTrainerBackPicPaletteTable[gLinkPlayers[sub_803FC34(gActiveBattler)].gender].data, - 0x100 + r4 * 16, 0x20); - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = r4; - taskId = CreateTask(sub_812071C, 5); - gTasks[taskId].data[0] = gActiveBattler; - if (ewram17810[gActiveBattler].unk0_0) - gTasks[gUnknown_02024E68[gActiveBattler]].func = sub_8044CA0; - ewram17840.unk9_0 = 1; - gBattleBankFunc[gActiveBattler] = nullsub_74; -} - -void sub_812071C(u8 taskId) -{ - u8 r9; - - if (gTasks[taskId].data[1] < 24) - { - gTasks[taskId].data[1]++; - return; - } - - r9 = gActiveBattler; - gActiveBattler = gTasks[taskId].data[0]; - if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_811F864(gActiveBattler, 0); - } - else - { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_811F864(gActiveBattler, 0); - gActiveBattler ^= 2; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - BattleLoadPlayerMonSprite(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_811F864(gActiveBattler, 0); - gActiveBattler ^= 2; - } - gBattleBankFunc[gActiveBattler] = sub_811DCA0; - gActiveBattler = r9; - DestroyTask(taskId); -} - -void LinkPartnerHandlecmd48(void) -{ - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == 0) - { - LinkPartnerBufferExecCompleted(); - return; - } - - ewram17810[gActiveBattler].unk0_0 = 1; - gUnknown_02024E68[gActiveBattler] = sub_8044804( - gActiveBattler, - (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBattler][4], - gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2]); - ewram17810[gActiveBattler].unk5 = 0; - if (gBattleBufferA[gActiveBattler][2] != 0) - ewram17810[gActiveBattler].unk5 = 0x5D; - gBattleBankFunc[gActiveBattler] = sub_81208E0; -} - -void sub_81208E0(void) -{ - if (ewram17810[gActiveBattler].unk5++ >= 93) - { - ewram17810[gActiveBattler].unk5 = 0; - LinkPartnerBufferExecCompleted(); - } -} - -void LinkPartnerHandlecmd49(void) -{ - if (ewram17810[gActiveBattler].unk0_0) - gTasks[gUnknown_02024E68[gActiveBattler]].func = sub_8044CA0; - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd50(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleSpriteInvisibility(void) -{ - if (IsBankSpritePresent(gActiveBattler) != 0) - { - gSprites[gBankSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; - sub_8031F88(gActiveBattler); - } - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleBattleAnimation(void) -{ - if (mplay_80342A4(gActiveBattler) == 0) - { - u8 r3 = gBattleBufferA[gActiveBattler][1]; - u16 r4 = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - - if (move_anim_start_t3(gActiveBattler, gActiveBattler, gActiveBattler, r3, r4) != 0) - LinkPartnerBufferExecCompleted(); - else - gBattleBankFunc[gActiveBattler] = sub_811E3B8; - } -} - -void LinkPartnerHandleLinkStandbyMsg(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleResetActionMoveSelection(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandlecmd55(void) -{ - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; - FadeOutMapMusic(5); - BeginFastPaletteFade(3); - LinkPartnerBufferExecCompleted(); - gBattleBankFunc[gActiveBattler] = sub_811E29C; -} - -void LinkPartnerHandlecmd56(void) -{ -} diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c deleted file mode 100644 index 15e077e92..000000000 --- a/src/battle/battle_controller_opponent.c +++ /dev/null @@ -1,2369 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_ai_switch_items.h" -#include "battle_anim.h" -#include "battle_interface.h" -#include "data2.h" -#include "battle_811DA74.h" -#include "battle_anim_813F0F4.h" -#include "battle_tower.h" -#include "link.h" -#include "m4a.h" -#include "main.h" -#include "palette.h" -#include "pokeball.h" -#include "pokemon.h" -#include "rom3.h" -#include "rom_8077ABC.h" -#include "sound.h" -#include "constants/songs.h" -#include "sprite.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "util.h" -#include "ewram.h" - -struct MovePpInfo -{ - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -extern u8 gUnknown_02023A14_50; -extern u8 gActiveBattler; -extern u8 gBattleBufferA[][0x200]; -extern u16 gBattlerPartyIndexes[]; -extern u8 gBankSpriteIds[]; -extern u8 gBattleMonForms[]; -extern struct SpriteTemplate gUnknown_02024E8C; -extern void (*gBattleBankFunc[])(void); -extern u8 gUnknown_0300434C[]; -extern u8 gHealthboxIDs[]; -extern u16 gBattleTypeFlags; -extern u16 gTrainerBattleOpponent; -extern s32 gAnimMoveDmg; -extern u16 gAnimMovePower; -extern u8 gAnimFriendship; -extern u16 gWeatherMoveAnim; -extern u32 gTransformedPersonalities[]; -extern u8 gAnimMoveTurn; -extern u8 gAnimScriptActive; -extern void (*gAnimScriptCallback)(void); -extern struct Window gUnknown_03004210; -extern u8 gDisplayedStringBattle[]; -extern u8 gBankTarget; -extern u8 gAbsentBattlerFlags; -extern bool8 gDoingBattleAnim; -extern u16 gUnknown_02024DE8; -extern u8 gUnknown_02024E68[]; -extern MainCallback gPreBattleCallback1; -extern void (*const gOpponentBufferCommands[])(void); -extern struct MusicPlayerInfo gMPlay_SE1; -extern struct MusicPlayerInfo gMPlay_SE2; -extern struct MusicPlayerInfo gMPlay_BGM; -extern u32 gBattleExecBuffer; - -extern u8 GetBattlerSpriteCoord(); -extern u8 sub_8077F68(); -extern u8 GetBattlerSubpriority(); -extern void sub_8033018(void); -extern void BattleLoadOpponentMonSprite(); -extern u8 GetBattlerPosition(u8); -extern void sub_8032984(u8, u16); -extern void sub_80333D4(void); -extern void sub_80312F0(struct Sprite *); -extern u8 StartSendOutMonAnimation(); -extern void sub_8032A08(); -extern void sub_8043DB0(); -extern void sub_8033160(void); -extern u8 get_trainer_class_pic_index(void); -extern void sub_80313A0(struct Sprite *); -extern void sub_8032B4C(void); -extern void sub_8031A6C(u16, u8); -extern void sub_8032B84(void); -extern void StartAnimLinearTranslation(struct Sprite *); -extern void sub_8032BBC(void); -extern void oamt_add_pos2_onto_pos1(); -extern void StoreSpriteCallbackInData(); -extern void sub_803311C(void); -extern void sub_8010384(struct Sprite *); -extern bool8 mplay_80342A4(u8); -extern u8 sub_8031720(); -extern void DoMoveAnim(); -extern void sub_80326EC(); -extern void sub_8031F24(void); -extern void sub_80324BC(); -extern void BufferStringBattle(); -extern void sub_80331D0(void); -extern void AI_TrySwitchOrUseItem(void); -extern u8 GetBattlerAtPosition(u8); -extern void sub_80330C8(void); -extern void sub_8043D84(); -extern void sub_8045A5C(); -void sub_8033494(void); -extern void move_anim_start_t2_for_situation(); -extern void bx_blink_t7(void); -extern void sub_8047858(); -extern u8 GetBattlerSide(u8); -extern void StartBattleIntroAnim(); -extern void sub_8044CA0(u8); -extern void nullsub_45(void); -extern void sub_8031B74(); -extern bool8 IsDoubleBattle(void); -extern void sub_8032E2C(void); -extern u8 IsBankSpritePresent(); -extern u8 move_anim_start_t3(); -extern void sub_80334C0(void); - -// this file's functions - -void OpponentBufferExecCompleted(void); -void OpponentBufferRunCommand(void); -u32 sub_8033598(u8, u8 *); -void sub_8033E24(u8); -void sub_803495C(u8, u8); -void sub_8034B74(void); -void sub_8035238(void); -void sub_8035C10(struct Sprite *); -void sub_8035C44(u8); -void sub_8035E2C(void); -void sub_80332D0(void); - -void OpponentHandleGetAttributes(void); -void OpponentHandlecmd1(void); -void OpponentHandleSetAttributes(void); -void OpponentHandlecmd3(void); -void OpponentHandleLoadPokeSprite(void); -void OpponentHandleSendOutPoke(void); -void OpponentHandleReturnPokeToBall(void); -void OpponentHandleTrainerThrow(void); -void OpponentHandleTrainerSlide(void); -void OpponentHandleTrainerSlideBack(void); -void OpponentHandlecmd10(void); -void OpponentHandlecmd11(void); -void OpponentHandlecmd12(void); -void OpponentHandleBallThrow(void); -void OpponentHandlePuase(void); -void OpponentHandleMoveAnimation(void); -void OpponentHandlePrintString(void); -void OpponentHandlePrintStringPlayerOnly(void); -void OpponentHandlecmd18(void); -void OpponentHandlecmd19(void); -void OpponentHandlecmd20(void); -void OpponentHandleOpenBag(void); -void OpponentHandlecmd22(void); -void OpponentHandlecmd23(void); -void OpponentHandleHealthBarUpdate(void); -void OpponentHandleExpBarUpdate(void); -void OpponentHandleStatusIconUpdate(void); -void OpponentHandleStatusAnimation(void); -void OpponentHandleStatusXor(void); -void OpponentHandlecmd29(void); -void OpponentHandleDMATransfer(void); -void OpponentHandlecmd31(void); -void OpponentHandlecmd32(void); -void OpponentHandlecmd33(void); -void OpponentHandlecmd34(void); -void OpponentHandlecmd35(void); -void OpponentHandlecmd36(void); -void OpponentHandlecmd37(void); -void OpponentHandlecmd38(void); -void OpponentHandlecmd39(void); -void OpponentHandlecmd40(void); -void OpponentHandleHitAnimation(void); -void OpponentHandlecmd42(void); -void OpponentHandleEffectivenessSound(void); -void OpponentHandlecmd44(void); -void OpponentHandleFaintingCry(void); -void OpponentHandleIntroSlide(void); -void OpponentHandleTrainerBallThrow(void); -void OpponentHandlecmd48(void); -void OpponentHandlecmd49(void); -void OpponentHandlecmd50(void); -void OpponentHandleSpriteInvisibility(void); -void OpponentHandleBattleAnimation(void); -void OpponentHandleLinkStandbyMsg(void); -void OpponentHandleResetActionMoveSelection(void); -void OpponentHandlecmd55(void); -void OpponentHandlecmd56(void); - -// const data -typedef void (*BattleBufferCmd) (void); -static const BattleBufferCmd gOpponentBufferCommands[] = -{ - OpponentHandleGetAttributes, - OpponentHandlecmd1, - OpponentHandleSetAttributes, - OpponentHandlecmd3, - OpponentHandleLoadPokeSprite, - OpponentHandleSendOutPoke, - OpponentHandleReturnPokeToBall, - OpponentHandleTrainerThrow, - OpponentHandleTrainerSlide, - OpponentHandleTrainerSlideBack, - OpponentHandlecmd10, - OpponentHandlecmd11, - OpponentHandlecmd12, - OpponentHandleBallThrow, - OpponentHandlePuase, - OpponentHandleMoveAnimation, - OpponentHandlePrintString, - OpponentHandlePrintStringPlayerOnly, - OpponentHandlecmd18, - OpponentHandlecmd19, - OpponentHandlecmd20, - OpponentHandleOpenBag, - OpponentHandlecmd22, - OpponentHandlecmd23, - OpponentHandleHealthBarUpdate, - OpponentHandleExpBarUpdate, - OpponentHandleStatusIconUpdate, - OpponentHandleStatusAnimation, - OpponentHandleStatusXor, - OpponentHandlecmd29, - OpponentHandleDMATransfer, - OpponentHandlecmd31, - OpponentHandlecmd32, - OpponentHandlecmd33, - OpponentHandlecmd34, - OpponentHandlecmd35, - OpponentHandlecmd36, - OpponentHandlecmd37, - OpponentHandlecmd38, - OpponentHandlecmd39, - OpponentHandlecmd40, - OpponentHandleHitAnimation, - OpponentHandlecmd42, - OpponentHandleEffectivenessSound, - OpponentHandlecmd44, - OpponentHandleFaintingCry, - OpponentHandleIntroSlide, - OpponentHandleTrainerBallThrow, - OpponentHandlecmd48, - OpponentHandlecmd49, - OpponentHandlecmd50, - OpponentHandleSpriteInvisibility, - OpponentHandleBattleAnimation, - OpponentHandleLinkStandbyMsg, - OpponentHandleResetActionMoveSelection, - OpponentHandlecmd55, - OpponentHandlecmd56, -}; - -static const u8 sUnknownBytes[] = {0xB0, 0xB0, 0xC8, 0x98, 0x28, 0x28, 0x28, 0x20}; - -// code - -void nullsub_45(void) -{ -} - -void SetBankFuncToOpponentBufferRunCommand(void) -{ - gBattleBankFunc[gActiveBattler] = OpponentBufferRunCommand; -} - -void OpponentBufferRunCommand(void) -{ - if (gBattleExecBuffer & gBitTable[gActiveBattler]) - { - if (gBattleBufferA[gActiveBattler][0] <= 0x38) - gOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]](); - else - OpponentBufferExecCompleted(); - } -} - -void sub_8032B4C(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - OpponentBufferExecCompleted(); -} - -// Duplicate of sub_8032B4C -void sub_8032B84(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - OpponentBufferExecCompleted(); -} - -void sub_8032BBC(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - { - sub_8031B74(gSprites[gBankSpriteIds[gActiveBattler]].oam.affineParam); - gSprites[gBankSpriteIds[gActiveBattler]].oam.tileNum = gSprites[gBankSpriteIds[gActiveBattler]].data[5]; - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - OpponentBufferExecCompleted(); - } -} - -void sub_8032C4C(void) -{ - if ((--ewram17810[gActiveBattler].unk9) == 0xFF) - { - ewram17810[gActiveBattler].unk9 = 0; - OpponentBufferExecCompleted(); - } -} - -void sub_8032C88(void) -{ - bool8 r6 = FALSE; - - if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) - { - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy) - r6 = TRUE; - } - else - { - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gHealthboxIDs[gActiveBattler ^ 2]].callback == SpriteCallbackDummy) - r6 = TRUE; - } - if (IsCryPlayingOrClearCrySongs()) - r6 = FALSE; - - if (r6 && ewram17810[gActiveBattler].unk1_0 && ewram17810[gActiveBattler ^ 2].unk1_0) - { - ewram17810[gActiveBattler].unk0_7 = 0; - ewram17810[gActiveBattler].unk1_0 = 0; - ewram17810[gActiveBattler ^ 2].unk0_7 = 0; - ewram17810[gActiveBattler ^ 2].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - m4aMPlayContinue(&gMPlay_BGM); - else - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); - ewram17810[gActiveBattler].unk9 = 3; - gBattleBankFunc[gActiveBattler] = sub_8032C4C; - } -} - -void sub_8032E2C(void) -{ - if (!ewram17810[gActiveBattler].unk0_3 && !ewram17810[gActiveBattler].unk0_7) - sub_8141828(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - if (!ewram17810[gActiveBattler ^ 2].unk0_3 && !ewram17810[gActiveBattler ^ 2].unk0_7) - sub_8141828(gActiveBattler ^ 2, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ 2]]); - if (!ewram17810[gActiveBattler].unk0_3 && !ewram17810[gActiveBattler ^ 2].unk0_3) - { - if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler ^ 2]]); - sub_8045A5C( - gHealthboxIDs[gActiveBattler ^ 2], - &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ 2]], - 0); - sub_804777C(gActiveBattler ^ 2); - sub_8043DFC(gHealthboxIDs[gActiveBattler ^ 2]); - sub_8032984( - gActiveBattler ^ 2, - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ 2]], MON_DATA_SPECIES)); - } - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler]]); - sub_8045A5C( - gHealthboxIDs[gActiveBattler], - &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], - 0); - sub_804777C(gActiveBattler); - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - sub_8032984( - gActiveBattler, - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - - ewram17840.unk9_0 = 0; - gBattleBankFunc[gActiveBattler] = sub_8032C88; - } -} - -void sub_8033018(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].animEnded == TRUE - && gSprites[gBankSpriteIds[gActiveBattler]].pos2.x == 0) - { - if (!ewram17810[gActiveBattler].unk0_7) - { - sub_8141828(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - return; - } - if (ewram17810[gActiveBattler].unk1_0) - { - ewram17810[gActiveBattler].unk0_7 = 0; - ewram17810[gActiveBattler].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - OpponentBufferExecCompleted(); - return; - } - } -} - -void sub_80330C8(void) -{ - s16 r4 = sub_8045C78(gActiveBattler, gHealthboxIDs[gActiveBattler], 0, 0); - - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - if (r4 != -1) - sub_80440EC(gHealthboxIDs[gActiveBattler], r4, 0); - else - OpponentBufferExecCompleted(); -} - -void sub_803311C(void) -{ - if (!gSprites[gBankSpriteIds[gActiveBattler]].inUse) - { - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - OpponentBufferExecCompleted(); - } -} - -void sub_8033160(void) -{ - if (!ewram17810[gActiveBattler].unk0_6) - { - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - sub_8032A08(gActiveBattler); - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - OpponentBufferExecCompleted(); - } -} - -void sub_80331D0(void) -{ - if (gUnknown_03004210.state == 0) - OpponentBufferExecCompleted(); -} - -void bx_blink_t7(void) -{ - u8 spriteId = gBankSpriteIds[gActiveBattler]; - - if (gSprites[spriteId].data[1] == 32) - { - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].invisible = FALSE; - gDoingBattleAnim = 0; - OpponentBufferExecCompleted(); - } - else - { - if (((u16)gSprites[spriteId].data[1] % 4) == 0) - gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data[1]++; - } -} - -void sub_8033264(void) -{ - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy) - { - if (ewram17800[gActiveBattler].substituteSprite) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 6); - gBattleBankFunc[gActiveBattler] = sub_80332D0; - } -} - -void sub_80332D0(void) -{ - if (!ewram17810[gActiveBattler].unk0_6) - { - CreateTask(c3_0802FDF4, 10); - OpponentBufferExecCompleted(); - } -} - -void sub_8033308(void) -{ - if (ewram17810[gActiveBattler].unk1_0) - { - ewram17810[gActiveBattler].unk0_7 = 0; - ewram17810[gActiveBattler].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], 0); - sub_8045A5C( - gHealthboxIDs[gActiveBattler], - &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], - 0); - sub_804777C(gActiveBattler); - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - sub_8031F88(gActiveBattler); - gBattleBankFunc[gActiveBattler] = sub_8033264; - } -} - -void sub_80333D4(void) -{ - if (!ewram17810[gActiveBattler].unk0_3 && !ewram17810[gActiveBattler].unk0_7) - sub_8141828(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - if (gSprites[gUnknown_0300434C[gActiveBattler]].callback == SpriteCallbackDummy - && !ewram17810[gActiveBattler].unk0_3) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler]]); - sub_8032984(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattleBankFunc[gActiveBattler] = sub_8033308; - } -} - -void sub_8033494(void) -{ - if (!ewram17810[gActiveBattler].unk0_4) - OpponentBufferExecCompleted(); -} - -void sub_80334C0(void) -{ - if (!ewram17810[gActiveBattler].unk0_5) - OpponentBufferExecCompleted(); -} - -void OpponentBufferExecCompleted(void) -{ - gBattleBankFunc[gActiveBattler] = OpponentBufferRunCommand; - gBattleExecBuffer &= ~gBitTable[gActiveBattler]; -} - -void OpponentHandleGetAttributes(void) -{ - u8 buffer[256]; - int r6 = 0; - s32 i; - - if (gBattleBufferA[gActiveBattler][2] == 0) - { - r6 = sub_8033598(gBattlerPartyIndexes[gActiveBattler], buffer); - } - else - { - u8 r4 = gBattleBufferA[gActiveBattler][2]; - - for (i = 0; i < 6; i++) - { - if (r4 & 1) - r6 += sub_8033598(i, buffer + r6); - r4 >>= 1; - } - } - Emitcmd29(1, r6, buffer); - OpponentBufferExecCompleted(); -} - -u32 sub_8033598(u8 a, u8 *buffer) -{ - struct BattlePokemon battlePokemon; - struct MovePpInfo moveData; - u8 nickname[20]; - u8 *src; - s16 data16; - u32 data32; - s32 size = 0; - - switch (gBattleBufferA[gActiveBattler][1]) - { - case 0: - battlePokemon.species = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); - battlePokemon.item = GetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) - { - battlePokemon.moves[size] = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + size); - battlePokemon.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); - } - battlePokemon.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - battlePokemon.friendship = GetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP); - battlePokemon.experience = GetMonData(&gEnemyParty[a], MON_DATA_EXP); - battlePokemon.hpIV = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); - battlePokemon.attackIV = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); - battlePokemon.defenseIV = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV); - battlePokemon.spAttackIV = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); - battlePokemon.spDefenseIV = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); - battlePokemon.personality = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); - battlePokemon.status1 = GetMonData(&gEnemyParty[a], MON_DATA_STATUS); - battlePokemon.level = GetMonData(&gEnemyParty[a], MON_DATA_LEVEL); - battlePokemon.hp = GetMonData(&gEnemyParty[a], MON_DATA_HP); - battlePokemon.maxHP = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); - battlePokemon.attack = GetMonData(&gEnemyParty[a], MON_DATA_ATK); - battlePokemon.defense = GetMonData(&gEnemyParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gEnemyParty[a], MON_DATA_SPEED); - battlePokemon.spAttack = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); - battlePokemon.spDefense = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); - battlePokemon.isEgg = GetMonData(&gEnemyParty[a], MON_DATA_IS_EGG); - battlePokemon.altAbility = GetMonData(&gEnemyParty[a], MON_DATA_ALT_ABILITY); - battlePokemon.otId = GetMonData(&gEnemyParty[a], MON_DATA_OT_ID); - GetMonData(&gEnemyParty[a], MON_DATA_NICKNAME, nickname); - StringCopy10(battlePokemon.nickname, nickname); - GetMonData(&gEnemyParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - MEMCPY_ALT(&battlePokemon, buffer, sizeof(battlePokemon), size, src); - break; - case 1: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 2: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 3: - for (size = 0; size < 4; size++) - { - moveData.moves[size] = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + size); - moveData.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); - } - moveData.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - MEMCPY_ALT(&moveData, buffer, sizeof(moveData), size, src); - break; - case 4: - case 5: - case 6: - case 7: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - 4); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 8: - for (size = 0; size < 4; size++) - buffer[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); - buffer[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - size++; - break; - case 9: - case 10: - case 11: - case 12: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - 9); - size = 1; - break; - case 17: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_OT_ID); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 18: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_EXP); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 19: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_EV); - size = 1; - break; - case 20: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_EV); - size = 1; - break; - case 21: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_EV); - size = 1; - break; - case 22: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_EV); - size = 1; - break; - case 23: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV); - size = 1; - break; - case 24: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_EV); - size = 1; - break; - case 25: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP); - size = 1; - break; - case 26: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_POKERUS); - size = 1; - break; - case 27: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_LOCATION); - size = 1; - break; - case 28: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_LEVEL); - size = 1; - break; - case 29: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_GAME); - size = 1; - break; - case 30: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_POKEBALL); - size = 1; - break; - case 31: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); - buffer[1] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); - buffer[2] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV); - buffer[4] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); - buffer[5] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); - size = 6; - break; - case 32: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); - size = 1; - break; - case 33: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); - size = 1; - break; - case 34: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - size = 1; - break; - case 35: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV); - size = 1; - break; - case 36: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); - size = 1; - break; - case 37: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); - size = 1; - break; - case 38: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 39: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_CHECKSUM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 40: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_STATUS); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 41: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_LEVEL); - size = 1; - break; - case 42: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 43: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 44: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_ATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 45: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_DEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 46: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPEED); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 47: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 48: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 49: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_COOL); - size = 1; - break; - case 50: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_BEAUTY); - size = 1; - break; - case 51: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_CUTE); - size = 1; - break; - case 52: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SMART); - size = 1; - break; - case 53: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_TOUGH); - size = 1; - break; - case 54: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SHEEN); - size = 1; - break; - case 55: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_COOL_RIBBON); - size = 1; - break; - case 56: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_BEAUTY_RIBBON); - size = 1; - break; - case 57: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_CUTE_RIBBON); - size = 1; - break; - case 58: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SMART_RIBBON); - size = 1; - break; - case 59: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_TOUGH_RIBBON); - size = 1; - break; - } - return size; -} - -void OpponentHandlecmd1(void) -{ - struct BattlePokemon buffer; - u8 i; - // TODO: Maybe fix this. Integrating this into MEMSET_ALT is too hard. - u8 *src = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; - u8 *dst; - - MEMSET_ALT(&buffer + gBattleBufferA[gActiveBattler][1], src[i], gBattleBufferA[gActiveBattler][2], i, dst); - Emitcmd29(1, gBattleBufferA[gActiveBattler][2], dst); - OpponentBufferExecCompleted(); -} - -void OpponentHandleSetAttributes(void) -{ - u8 i; - u8 r4; - - if (gBattleBufferA[gActiveBattler][2] == 0) - { - sub_8033E24(gBattlerPartyIndexes[gActiveBattler]); - } - else - { - r4 = gBattleBufferA[gActiveBattler][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - sub_8033E24(i); - r4 >>= 1; - } - } - OpponentBufferExecCompleted(); -} - -void sub_8033E24(u8 a) -{ - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; - s32 i; - - switch (gBattleBufferA[gActiveBattler][1]) - { - case 0: - { - u8 iv; - - SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, &battlePokemon->species); - SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) - { - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, &battlePokemon->pp[i]); - } - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); - SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); - SetMonData(&gEnemyParty[a], MON_DATA_EXP, &battlePokemon->experience); - iv = battlePokemon->hpIV; - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &iv); - iv = battlePokemon->attackIV; - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &iv); - iv = battlePokemon->defenseIV; - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &iv); - iv = battlePokemon->speedIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV, &iv); - iv = battlePokemon->spAttackIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &iv); - iv = battlePokemon->spDefenseIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &iv); - SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, &battlePokemon->personality); - SetMonData(&gEnemyParty[a], MON_DATA_STATUS, &battlePokemon->status1); - SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, &battlePokemon->level); - SetMonData(&gEnemyParty[a], MON_DATA_HP, &battlePokemon->hp); - SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, &battlePokemon->maxHP); - SetMonData(&gEnemyParty[a], MON_DATA_ATK, &battlePokemon->attack); - SetMonData(&gEnemyParty[a], MON_DATA_DEF, &battlePokemon->defense); - SetMonData(&gEnemyParty[a], MON_DATA_SPEED, &battlePokemon->speed); - SetMonData(&gEnemyParty[a], MON_DATA_SPATK, &battlePokemon->spAttack); - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, &battlePokemon->spDefense); - } - break; - case 1: - SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); - break; - case 2: - SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); - break; - case 3: - for (i = 0; i < 4; i++) - { - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, &moveData->moves[i]); - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, &moveData->pp[i]); - } - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); - break; - case 4: - case 5: - case 6: - case 7: - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - 4, &gBattleBufferA[gActiveBattler][3]); - break; - case 8: - SetMonData(&gEnemyParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gEnemyParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gEnemyParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gEnemyParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); - break; - case 9: - case 10: - case 11: - case 12: - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - 9, &gBattleBufferA[gActiveBattler][3]); - break; - case 17: - SetMonData(&gEnemyParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); - break; - case 18: - SetMonData(&gEnemyParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); - break; - case 19: - SetMonData(&gEnemyParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 20: - SetMonData(&gEnemyParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 21: - SetMonData(&gEnemyParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 22: - SetMonData(&gEnemyParty[a], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 23: - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 24: - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 25: - SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); - break; - case 26: - SetMonData(&gEnemyParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); - break; - case 27: - SetMonData(&gEnemyParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); - break; - case 28: - SetMonData(&gEnemyParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); - break; - case 29: - SetMonData(&gEnemyParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); - break; - case 30: - SetMonData(&gEnemyParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); - break; - case 31: - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); - break; - case 32: - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 33: - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 34: - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 35: - SetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 36: - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 37: - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 38: - SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); - break; - case 39: - SetMonData(&gEnemyParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); - break; - case 40: - SetMonData(&gEnemyParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); - break; - case 41: - SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); - break; - case 42: - SetMonData(&gEnemyParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); - break; - case 43: - SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); - break; - case 44: - SetMonData(&gEnemyParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); - break; - case 45: - SetMonData(&gEnemyParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); - break; - case 46: - SetMonData(&gEnemyParty[a], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); - break; - case 47: - SetMonData(&gEnemyParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); - break; - case 48: - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); - break; - case 49: - SetMonData(&gEnemyParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); - break; - case 50: - SetMonData(&gEnemyParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); - break; - case 51: - SetMonData(&gEnemyParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); - break; - case 52: - SetMonData(&gEnemyParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); - break; - case 53: - SetMonData(&gEnemyParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); - break; - case 54: - SetMonData(&gEnemyParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); - break; - case 55: - SetMonData(&gEnemyParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 56: - SetMonData(&gEnemyParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 57: - SetMonData(&gEnemyParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 58: - SetMonData(&gEnemyParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 59: - SetMonData(&gEnemyParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - } -} - -void OpponentHandlecmd3(void) -{ - u8 *dst; - u8 i; - - MEMSET_ALT(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][3 + i], - gBattleBufferA[gActiveBattler][2], i, dst); - OpponentBufferExecCompleted(); -} - -void OpponentHandleLoadPokeSprite(void) -{ - u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - - BattleLoadOpponentMonSprite(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - GetMonSpriteTemplate_803C56C(species, GetBattlerPosition(gActiveBattler)); - gBankSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_02024E8C, - GetBattlerSpriteCoord(gActiveBattler, 2), - sub_8077F68(gActiveBattler), - GetBattlerSubpriority(gActiveBattler)); - gSprites[gBankSpriteIds[gActiveBattler]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = gActiveBattler; - gSprites[gBankSpriteIds[gActiveBattler]].data[2] = species; - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); - sub_8032984(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattleBankFunc[gActiveBattler] = sub_8033018; -} - -void OpponentHandleSendOutPoke(void) -{ - gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; - - sub_803495C(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattleBankFunc[gActiveBattler] = sub_80333D4; -} - -void sub_803495C(u8 a, u8 b) -{ - u16 species; - - sub_8032AA8(a, b); - gBattlerPartyIndexes[a] = gBattleBufferA[a][1]; - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[a]], MON_DATA_SPECIES); - gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); - BattleLoadOpponentMonSprite(&gEnemyParty[gBattlerPartyIndexes[a]], a); - GetMonSpriteTemplate_803C56C(species, GetBattlerPosition(a)); - gBankSpriteIds[a] = CreateSprite( - &gUnknown_02024E8C, - GetBattlerSpriteCoord(a, 2), - sub_8077F68(a), - GetBattlerSubpriority(a)); - gSprites[gBankSpriteIds[a]].data[0] = a; - gSprites[gBankSpriteIds[a]].data[2] = species; - gSprites[gUnknown_0300434C[a]].data[1] = gBankSpriteIds[a]; - gSprites[gBankSpriteIds[a]].oam.paletteNum = a; - StartSpriteAnim(&gSprites[gBankSpriteIds[a]], gBattleMonForms[a]); - gSprites[gBankSpriteIds[a]].invisible = TRUE; - gSprites[gBankSpriteIds[a]].callback = SpriteCallbackDummy; - gSprites[gUnknown_0300434C[a]].data[0] = StartSendOutMonAnimation(0, 0xFE); -} - -void OpponentHandleReturnPokeToBall(void) -{ - if (gBattleBufferA[gActiveBattler][1] == 0) - { - ewram17810[gActiveBattler].unk4 = 0; - gBattleBankFunc[gActiveBattler] = sub_8034B74; - } - else - { - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - sub_8032A08(gActiveBattler); - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - OpponentBufferExecCompleted(); - } -} - -void sub_8034B74(void) -{ - switch (ewram17810[gActiveBattler].unk4) - { - case 0: - if (ewram17800[gActiveBattler].substituteSprite) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - ewram17810[gActiveBattler].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBattler].unk0_6) - { - ewram17810[gActiveBattler].unk4 = 0; - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 2); - gBattleBankFunc[gActiveBattler] = sub_8033160; - } - break; - } -} - -void OpponentHandleTrainerThrow(void) -{ - u32 trainerPicIndex; - -#if DEBUG - if (gUnknown_02023A14_50 & 0x10) - { - trainerPicIndex = gSharedMem[0x160A3]; - } - else -#endif - { - if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) - trainerPicIndex = GetSecretBaseTrainerPicIndex(); - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - trainerPicIndex = get_trainer_class_pic_index(); - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - trainerPicIndex = GetEReaderTrainerPicIndex(); - else - trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; - } - - sub_8031A6C(trainerPicIndex, gActiveBattler); - GetMonSpriteTemplate_803C5A0(trainerPicIndex, GetBattlerPosition(gActiveBattler)); - gBankSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_02024E8C, - 0xB0, - 40 + 4 * (8 - gTrainerFrontPicCoords[trainerPicIndex].coords), - GetBattlerSubpriority(gActiveBattler)); - gSprites[gBankSpriteIds[gActiveBattler]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 2; - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag); - gSprites[gBankSpriteIds[gActiveBattler]].data[5] = gSprites[gBankSpriteIds[gActiveBattler]].oam.tileNum; - gSprites[gBankSpriteIds[gActiveBattler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag); - gSprites[gBankSpriteIds[gActiveBattler]].oam.affineParam = trainerPicIndex; - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_80313A0; - gBattleBankFunc[gActiveBattler] = sub_8032B4C; -} - -void OpponentHandleTrainerSlide(void) -{ - u32 trainerPicIndex; - - if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) - trainerPicIndex = GetSecretBaseTrainerPicIndex(); - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - trainerPicIndex = get_trainer_class_pic_index(); - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - trainerPicIndex = GetEReaderTrainerPicIndex(); - else - trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; - - sub_8031A6C(trainerPicIndex, gActiveBattler); - GetMonSpriteTemplate_803C5A0(trainerPicIndex, GetBattlerPosition(gActiveBattler)); - gBankSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_02024E8C, - 0xB0, - 40 + 4 * (8 - gTrainerFrontPicCoords[trainerPicIndex].coords), - 0x1E); - gSprites[gBankSpriteIds[gActiveBattler]].pos2.x = 96; - gSprites[gBankSpriteIds[gActiveBattler]].pos1.x += 32; - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag); - gSprites[gBankSpriteIds[gActiveBattler]].data[5] = gSprites[gBankSpriteIds[gActiveBattler]].oam.tileNum; - gSprites[gBankSpriteIds[gActiveBattler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag); - gSprites[gBankSpriteIds[gActiveBattler]].oam.affineParam = trainerPicIndex; - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_80313A0; - gBattleBankFunc[gActiveBattler] = sub_8032B84; -} - -void OpponentHandleTrainerSlideBack(void) -{ - oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBattler]]); - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 35; - gSprites[gBankSpriteIds[gActiveBattler]].data[2] = 280; - gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], SpriteCallbackDummy); - gBattleBankFunc[gActiveBattler] = sub_8032BBC; -} - -void OpponentHandlecmd10(void) -{ - if (ewram17810[gActiveBattler].unk4 == 0) - { - if (ewram17800[gActiveBattler].substituteSprite) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - ewram17810[gActiveBattler].unk4++; - } - else if (!ewram17810[gActiveBattler].unk0_6) - { - ewram17810[gActiveBattler].unk4 = 0; - PlaySE12WithPanning(SE_POKE_DEAD, 63); - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_8010384; - gBattleBankFunc[gActiveBattler] = sub_803311C; - } -} - -void OpponentHandlecmd11(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd12(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleBallThrow(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlePuase(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleMoveAnimation(void) -{ - if (!mplay_80342A4(gActiveBattler)) - { - u32 r0 = gBattleBufferA[gActiveBattler][1] - | (gBattleBufferA[gActiveBattler][2] << 8); - - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] - | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] - | (gBattleBufferA[gActiveBattler][7] << 8) - | (gBattleBufferA[gActiveBattler][8] << 16) - | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] - | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; - gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; - - // Dead code. sub_8031720 always returns 0. - if (sub_8031720(r0, gAnimMoveTurn) != 0) - { - OpponentBufferExecCompleted(); - } - else - { - ewram17810[gActiveBattler].unk4 = 0; - gBattleBankFunc[gActiveBattler] = sub_8035238; - } - } -} - -void sub_8035238(void) -{ - u16 r4 = gBattleBufferA[gActiveBattler][1] - | (gBattleBufferA[gActiveBattler][2] << 8); - u8 r7 = gBattleBufferA[gActiveBattler][11]; - - switch (ewram17810[gActiveBattler].unk4) - { - case 0: - if (ewram17800[gActiveBattler].substituteSprite && !ewram17800[gActiveBattler].unk0_3) - { - ewram17800[gActiveBattler].unk0_3 = 1; - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - } - ewram17810[gActiveBattler].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBattler].unk0_6) - { - sub_80326EC(0); - DoMoveAnim(r4); - ewram17810[gActiveBattler].unk4 = 2; - } - break; - case 2: - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - sub_80326EC(1); - if ((ewram17800[gActiveBattler].substituteSprite) && r7 <= 1) - { - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 6); - ewram17800[gActiveBattler].unk0_3 = 0; - } - ewram17810[gActiveBattler].unk4 = 3; - } - break; - case 3: - if (!ewram17810[gActiveBattler].unk0_6) - { - sub_8031F24(); - sub_80324BC( - gActiveBattler, - gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - ewram17810[gActiveBattler].unk4 = 0; - OpponentBufferExecCompleted(); - } - break; - } -} - -void OpponentHandlePrintString(void) -{ - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBattler][2]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gBattleBankFunc[gActiveBattler] = sub_80331D0; -} - -void OpponentHandlePrintStringPlayerOnly(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd18(void) -{ - AI_TrySwitchOrUseItem(); - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd19(void) -{ - OpponentBufferExecCompleted(); -} - -#if DEBUG -NAKED -void OpponentHandlecmd20(void) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, sl\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5, r6, r7}\n\ - ldr r6, ._549 @ gActiveBattler\n\ - ldrb r0, [r6]\n\ - lsl r0, r0, #0x9\n\ - ldr r1, ._549 + 4 @ gBattleBufferA\n\ - add r5, r0, r1\n\ - ldr r2, ._549 + 8 @ gUnknown_02023A14_50\n\ - ldrb r1, [r2]\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - mov sl, r6\n\ - cmp r0, #0\n\ - beq ._546 @cond_branch\n\ - ldr r0, ._549 + 12 @ gBattleMoves\n\ - mov r9, r0\n\ - ldr r1, ._549 + 16 @ \n\ - mov ip, r1\n\ - add r7, r6, #0\n\ - mov r0, #0x2\n\ - mov r8, r0\n\ - ldr r6, ._549 + 20 @ \n\ -._552:\n\ - ldrb r1, [r7]\n\ - mov r0, r8\n\ - and r0, r0, r1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x19\n\ - add r0, r0, r6\n\ - mov r1, ip\n\ - add r3, r0, r1\n\ - ldrb r1, [r3]\n\ - lsl r0, r1, #0x1\n\ - add r0, r5, r0\n\ - ldrh r2, [r0]\n\ - add r4, r1, #0\n\ - cmp r2, #0\n\ - beq ._547 @cond_branch\n\ - add r0, r4, #1\n\ - strb r0, [r3]\n\ - b ._548\n\ -._550:\n\ - .align 2, 0\n\ -._549:\n\ - .word gActiveBattler\n\ - .word gBattleBufferA+4\n\ - .word gUnknown_02023A14_50\n\ - .word gBattleMoves\n\ - .word +0x2000000\n\ - .word 0x1609e\n\ -._547:\n\ - strb r2, [r3]\n\ -._548:\n\ - ldrb r0, [r7]\n\ - mov r1, r8\n\ - and r1, r1, r0\n\ - lsl r1, r1, #0x18\n\ - lsr r1, r1, #0x19\n\ - add r1, r1, r6\n\ - add r1, r1, ip\n\ - ldrb r0, [r1]\n\ - cmp r0, #0x3\n\ - bls ._551 @cond_branch\n\ - mov r0, #0x0\n\ - strb r0, [r1]\n\ -._551:\n\ - cmp r2, #0\n\ - beq ._552 @cond_branch\n\ - lsl r0, r2, #0x1\n\ - add r0, r0, r2\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r9\n\ - ldrb r3, [r0, #0x6]\n\ - mov r0, #0x12\n\ - and r0, r0, r3\n\ - cmp r0, #0\n\ - beq ._553 @cond_branch\n\ - mov r1, sl\n\ - ldrb r0, [r1]\n\ - b ._561\n\ -._553:\n\ - ldr r0, ._559 @ gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._557 @cond_branch\n\ - ldr r0, ._559 + 4 @ gUnknown_02023A14_50\n\ - ldrb r1, [r0]\n\ - mov r5, #0x2\n\ - add r0, r5, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._556 @cond_branch\n\ - cmp r3, #0\n\ - bne ._557 @cond_branch\n\ - mov r1, sl\n\ - ldrb r0, [r1]\n\ - bl GetBattlerPosition\n\ - mov r1, #0x2\n\ - eor r0, r0, r1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - b ._558\n\ -._560:\n\ - .align 2, 0\n\ -._559:\n\ - .word gBattleTypeFlags\n\ - .word gUnknown_02023A14_50\n\ -._556:\n\ - bl Random\n\ - add r1, r5, #0\n\ - and r1, r1, r0\n\ - lsl r1, r1, #0x10\n\ - lsr r0, r1, #0x10\n\ - b ._561\n\ -._557:\n\ - mov r0, #0x0\n\ -._558:\n\ - bl GetBattlerAtPosition\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ -._561:\n\ - lsl r2, r0, #0x8\n\ - orr r2, r2, r4\n\ - mov r0, #0x1\n\ - mov r1, #0xa\n\ -._569:\n\ - bl Emitcmd33\n\ -._573:\n\ - bl OpponentBufferExecCompleted\n\ - b ._562\n\ -._546:\n\ - ldr r0, ._567 @ gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - mov r0, #0x93\n\ - lsl r0, r0, #0x3\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._563 @cond_branch\n\ - bl BattleAI_SetupAIData\n\ - bl BattleAI_GetAIActionToUse\n\ - lsl r0, r0, #0x18\n\ - lsr r4, r0, #0x18\n\ - cmp r4, #0x4\n\ - beq ._564 @cond_branch\n\ - cmp r4, #0x5\n\ - bne ._565 @cond_branch\n\ - mov r0, #0x1\n\ - mov r1, #0x4\n\ - b ._566\n\ -._568:\n\ - .align 2, 0\n\ -._567:\n\ - .word gBattleTypeFlags\n\ -._564:\n\ - mov r0, #0x1\n\ - mov r1, #0x3\n\ -._566:\n\ - mov r2, #0x0\n\ - b ._569\n\ -._565:\n\ - ldr r3, ._574 @ gBattleMoves\n\ - lsl r0, r4, #0x1\n\ - add r2, r5, r0\n\ - ldrh r1, [r2]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r3\n\ - ldrb r1, [r0, #0x6]\n\ - mov r0, #0x12\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._570 @cond_branch\n\ - ldr r1, ._574 + 4 @ gBankTarget\n\ - ldrb r0, [r6]\n\ - strb r0, [r1]\n\ -._570:\n\ - ldrh r1, [r2]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r3\n\ - ldrb r1, [r0, #0x6]\n\ - mov r0, #0x8\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._572 @cond_branch\n\ - mov r0, #0x0\n\ - bl GetBattlerAtPosition\n\ - ldr r5, ._574 + 4 @ gBankTarget\n\ - strb r0, [r5]\n\ - ldr r0, ._574 + 8 @ gAbsentBattlerFlags\n\ - ldrb r1, [r0]\n\ - ldr r2, ._574 + 12 @ gBitTable\n\ - ldrb r0, [r5]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r2\n\ - ldr r0, [r0]\n\ - and r1, r1, r0\n\ - cmp r1, #0\n\ - beq ._572 @cond_branch\n\ - mov r0, #0x2\n\ - bl GetBattlerAtPosition\n\ - strb r0, [r5]\n\ -._572:\n\ - ldr r0, ._574 + 4 @ gBankTarget\n\ - ldrb r2, [r0]\n\ - lsl r2, r2, #0x8\n\ - orr r2, r2, r4\n\ - mov r0, #0x1\n\ - mov r1, #0xa\n\ - bl Emitcmd33\n\ - b ._573\n\ -._575:\n\ - .align 2, 0\n\ -._574:\n\ - .word gBattleMoves\n\ - .word gBankTarget\n\ - .word gAbsentBattlerFlags\n\ - .word gBitTable\n\ -._563:\n\ - mov r6, #0x3\n\ -._576:\n\ - bl Random\n\ - add r4, r0, #0\n\ - and r4, r4, r6\n\ - lsl r0, r4, #0x1\n\ - add r0, r5, r0\n\ - ldrh r2, [r0]\n\ - cmp r2, #0\n\ - beq ._576 @cond_branch\n\ - ldr r1, ._579 @ gBattleMoves\n\ - lsl r0, r2, #0x1\n\ - add r0, r0, r2\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x6]\n\ - mov r0, #0x12\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._577 @cond_branch\n\ - ldr r0, ._579 + 4 @ gActiveBattler\n\ - ldrb r2, [r0]\n\ - lsl r2, r2, #0x8\n\ - b ._578\n\ -._580:\n\ - .align 2, 0\n\ -._579:\n\ - .word gBattleMoves\n\ - .word gActiveBattler\n\ -._577:\n\ - ldr r0, ._583 @ gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._581 @cond_branch\n\ - bl Random\n\ - mov r1, #0x2\n\ - and r1, r1, r0\n\ - lsl r1, r1, #0x18\n\ - lsr r1, r1, #0x18\n\ - add r0, r1, #0\n\ - bl GetBattlerAtPosition\n\ - add r2, r0, #0\n\ - lsl r2, r2, #0x18\n\ - lsr r2, r2, #0x10\n\ -._578:\n\ - orr r2, r2, r4\n\ - mov r0, #0x1\n\ - mov r1, #0xa\n\ - bl Emitcmd33\n\ - b ._582\n\ -._584:\n\ - .align 2, 0\n\ -._583:\n\ - .word gBattleTypeFlags\n\ -._581:\n\ - mov r0, #0x0\n\ - bl GetBattlerAtPosition\n\ - add r2, r0, #0\n\ - lsl r2, r2, #0x18\n\ - lsr r2, r2, #0x10\n\ - orr r2, r2, r4\n\ - mov r0, #0x1\n\ - mov r1, #0xa\n\ - bl Emitcmd33\n\ -._582:\n\ - bl OpponentBufferExecCompleted\n\ -._562:\n\ - pop {r3, r4, r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov sl, r5\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0"); -} -#else -#ifdef NONMATCHING -void OpponentHandlecmd20(void) -{ - u16 r4; - // Needed to match closer - struct {u16 moves[4];} *r5 = (void *)&gBattleBufferA[gActiveBattler][4]; - - if (gBattleTypeFlags & 0x498) - { - BattleAI_SetupAIData(); - r4 = BattleAI_GetAIActionToUse(); - switch (r4) - { - case 5: - Emitcmd33(1, 4, 0); - break; - case 4: - Emitcmd33(1, 3, 0); - break; - default: - if (gBattleMoves[r5->moves[r4]].target & 0x12) - gBankTarget = gActiveBattler; - if (gBattleMoves[r5->moves[r4]].target & 8) - { - gBankTarget = GetBattlerAtPosition(0); - if (gAbsentBattlerFlags & gBitTable[gBankTarget]) - gBankTarget = GetBattlerAtPosition(2); - } - r4 |= gBankTarget << 8; - Emitcmd33(1, 10, r4); - break; - } - OpponentBufferExecCompleted(); - } - else - { - u16 r2; - - do - { - // Can't for the life of me get this to match. - r4 = Random() % 4; - r2 = r5->moves[r4]; - } while (r2 == 0); - - if (gBattleMoves[r2].target & 0x12) - { - r4 |= gActiveBattler << 8; - Emitcmd33(1, 10, r4); - } - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - u16 r2 = GetBattlerAtPosition(Random() & 2) << 8; - - Emitcmd33(1, 10, r4 | r2); - } - else - { - u16 r2 = GetBattlerAtPosition(0) << 8; - - Emitcmd33(1, 10, r4 | r2); - } - OpponentBufferExecCompleted(); - } -} -#else -NAKED -void OpponentHandlecmd20(void) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - ldr r6, _0803545C @ =gActiveBattler\n\ - ldrb r0, [r6]\n\ - lsls r0, 9\n\ - ldr r1, _08035460 @ =gBattleBufferA+4\n\ - adds r5, r0, r1\n\ - ldr r0, _08035464 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x93\n\ - lsls r0, 3\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080354F8\n\ - bl BattleAI_SetupAIData\n\ - bl BattleAI_GetAIActionToUse\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0x4\n\ - beq _08035468\n\ - cmp r4, 0x5\n\ - bne _08035474\n\ - movs r0, 0x1\n\ - movs r1, 0x4\n\ - b _0803546C\n\ - .align 2, 0\n\ -_0803545C: .4byte gActiveBattler\n\ -_08035460: .4byte gBattleBufferA+4\n\ -_08035464: .4byte gBattleTypeFlags\n\ -_08035468:\n\ - movs r0, 0x1\n\ - movs r1, 0x3\n\ -_0803546C:\n\ - movs r2, 0\n\ - bl Emitcmd33\n\ - b _080354E0\n\ -_08035474:\n\ - ldr r3, _080354E8 @ =gBattleMoves\n\ - lsls r0, r4, 1\n\ - adds r2, r5, r0\n\ - ldrh r1, [r2]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldrb r1, [r0, 0x6]\n\ - movs r0, 0x12\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08035494\n\ - ldr r1, _080354EC @ =gBankTarget\n\ - ldrb r0, [r6]\n\ - strb r0, [r1]\n\ -_08035494:\n\ - ldrh r1, [r2]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldrb r1, [r0, 0x6]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080354CE\n\ - movs r0, 0\n\ - bl GetBattlerAtPosition\n\ - ldr r5, _080354EC @ =gBankTarget\n\ - strb r0, [r5]\n\ - ldr r0, _080354F0 @ =gAbsentBattlerFlags\n\ - ldrb r1, [r0]\n\ - ldr r2, _080354F4 @ =gBitTable\n\ - ldrb r0, [r5]\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _080354CE\n\ - movs r0, 0x2\n\ - bl GetBattlerAtPosition\n\ - strb r0, [r5]\n\ -_080354CE:\n\ - ldr r0, _080354EC @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - lsls r0, 8\n\ - orrs r4, r0\n\ - movs r0, 0x1\n\ - movs r1, 0xA\n\ - adds r2, r4, 0\n\ - bl Emitcmd33\n\ -_080354E0:\n\ - bl OpponentBufferExecCompleted\n\ - b _0803558A\n\ - .align 2, 0\n\ -_080354E8: .4byte gBattleMoves\n\ -_080354EC: .4byte gBankTarget\n\ -_080354F0: .4byte gAbsentBattlerFlags\n\ -_080354F4: .4byte gBitTable\n\ -_080354F8:\n\ - movs r6, 0x3\n\ -_080354FA:\n\ - bl Random\n\ - adds r4, r0, 0\n\ - ands r4, r6\n\ - lsls r0, r4, 1\n\ - adds r0, r5, r0\n\ - ldrh r2, [r0]\n\ - cmp r2, 0\n\ - beq _080354FA\n\ - ldr r1, _08035534 @ =gBattleMoves\n\ - lsls r0, r2, 1\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r1, [r0, 0x6]\n\ - movs r0, 0x12\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803553C\n\ - ldr r0, _08035538 @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - lsls r0, 8\n\ - orrs r4, r0\n\ - movs r0, 0x1\n\ - movs r1, 0xA\n\ - adds r2, r4, 0\n\ - bl Emitcmd33\n\ - b _08035586\n\ - .align 2, 0\n\ -_08035534: .4byte gBattleMoves\n\ -_08035538: .4byte gActiveBattler\n\ -_0803553C:\n\ - ldr r0, _0803556C @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08035570\n\ - bl Random\n\ - movs r1, 0x2\n\ - ands r1, r0\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r0, r1, 0\n\ - bl GetBattlerAtPosition\n\ - adds r2, r0, 0\n\ - lsls r2, 24\n\ - lsrs r2, 16\n\ - orrs r2, r4\n\ - movs r0, 0x1\n\ - movs r1, 0xA\n\ - bl Emitcmd33\n\ - b _08035586\n\ - .align 2, 0\n\ -_0803556C: .4byte gBattleTypeFlags\n\ -_08035570:\n\ - movs r0, 0\n\ - bl GetBattlerAtPosition\n\ - adds r2, r0, 0\n\ - lsls r2, 24\n\ - lsrs r2, 16\n\ - orrs r2, r4\n\ - movs r0, 0x1\n\ - movs r1, 0xA\n\ - bl Emitcmd33\n\ -_08035586:\n\ - bl OpponentBufferExecCompleted\n\ -_0803558A:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif -#endif - -void OpponentHandleOpenBag(void) -{ - // What is this? - Emitcmd35(1, ewram160D4(gActiveBattler)); - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd22(void) -{ - s32 r4; - - if (ewram160C8arr(GetBattlerPosition(gActiveBattler)) == 6) - { - u8 r6; - u8 r5; - - r4 = GetMostSuitableMonToSwitchInto(); - if (r4 == 6) - { - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - r5 = GetBattlerAtPosition(1); - r6 = r5; - } - else - { - r6 = GetBattlerAtPosition(1); - r5 = GetBattlerAtPosition(3); - } - for (r4 = 0; r4 < 6; r4++) - { - if (GetMonData(&gEnemyParty[r4], MON_DATA_HP) != 0 - && r4 != gBattlerPartyIndexes[r6] - && r4 != gBattlerPartyIndexes[r5]) - break; - } - } - } - else - { - r4 = ewram160C8arr(GetBattlerPosition(gActiveBattler)); - ewram160C8arr(GetBattlerPosition(gActiveBattler)) = 6; - } - ewram16068arr(gActiveBattler) = r4; - Emitcmd34(1, r4, 0); - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd23(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleHealthBarUpdate(void) -{ - s16 r7; - - load_gfxc_health_bar(0); - r7 = (gBattleBufferA[gActiveBattler][3] << 8) | gBattleBufferA[gActiveBattler][2]; - if (r7 != 0x7FFF) - { - u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); - u32 hp = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); - - sub_8043D84(gActiveBattler, gHealthboxIDs[gActiveBattler], maxHP, hp, r7); - } - else - { - u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); - - sub_8043D84(gActiveBattler, gHealthboxIDs[gActiveBattler], maxHP, 0, r7); - } - gBattleBankFunc[gActiveBattler] = sub_80330C8; -} - -void OpponentHandleExpBarUpdate(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleStatusIconUpdate(void) -{ - if (mplay_80342A4(gActiveBattler) == 0) - { - sub_8045A5C(gHealthboxIDs[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], 9); - ewram17810[gActiveBattler].unk0_4 = 0; - gBattleBankFunc[gActiveBattler] = sub_8033494; - } -} - -void OpponentHandleStatusAnimation(void) -{ - if (mplay_80342A4(gActiveBattler) == 0) - { - move_anim_start_t2_for_situation( - gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2] - | (gBattleBufferA[gActiveBattler][3] << 8) - | (gBattleBufferA[gActiveBattler][4] << 16) - | (gBattleBufferA[gActiveBattler][5] << 24)); - gBattleBankFunc[gActiveBattler] = sub_8033494; - } -} - -void OpponentHandleStatusXor(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd29(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleDMATransfer(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd31(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd32(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd33(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd34(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd35(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd36(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd37(void) -{ - gUnknown_020238C8.unk0_0 = 0; - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd38(void) -{ - gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBattler][1]; - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd39(void) -{ - gUnknown_020238C8.unk0_7 = 0; - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd40(void) -{ - gUnknown_020238C8.unk0_7 ^= 1; - OpponentBufferExecCompleted(); -} - -void OpponentHandleHitAnimation(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].invisible == TRUE) - { - OpponentBufferExecCompleted(); - } - else - { - gDoingBattleAnim = TRUE; - gSprites[gBankSpriteIds[gActiveBattler]].data[1] = 0; - sub_8047858(gActiveBattler); - gBattleBankFunc[gActiveBattler] = bx_blink_t7; - } -} - -void OpponentHandlecmd42(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleEffectivenessSound(void) -{ - s8 pan; - - if (GetBattlerSide(gActiveBattler) == 0) - pan = -64; - else - pan = 63; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd44(void) -{ - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - OpponentBufferExecCompleted(); -} - -void OpponentHandleFaintingCry(void) -{ - PlayCry3( - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES), - 25, 5); - OpponentBufferExecCompleted(); -} - -void OpponentHandleIntroSlide(void) -{ - StartBattleIntroAnim(gBattleBufferA[gActiveBattler][1]); - gUnknown_02024DE8 |= 1; - OpponentBufferExecCompleted(); -} - -void OpponentHandleTrainerBallThrow(void) -{ - u8 taskId; - - oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBattler]]); - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 35; - gSprites[gBankSpriteIds[gActiveBattler]].data[2] = 280; - gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], sub_8035C10); - taskId = CreateTask(sub_8035C44, 5); - gTasks[taskId].data[0] = gActiveBattler; - if (ewram17810[gActiveBattler].unk0_0) - gTasks[gUnknown_02024E68[gActiveBattler]].func = sub_8044CA0; - ewram17840.unk9_0 = 1; - gBattleBankFunc[gActiveBattler] = nullsub_45; -} - -void sub_8035C10(struct Sprite *sprite) -{ - sub_8031B74(sprite->oam.affineParam); - sprite->oam.tileNum = sprite->data[5]; - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); -} - -void sub_8035C44(u8 taskId) -{ - u8 r9; - - r9 = gActiveBattler; - gActiveBattler = gTasks[taskId].data[0]; - if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_803495C(gActiveBattler, 0); - } - else - { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_803495C(gActiveBattler, 0); - gActiveBattler ^= 2; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_803495C(gActiveBattler, 0); - gActiveBattler ^= 2; - } - gBattleBankFunc[gActiveBattler] = sub_8032E2C; - gActiveBattler = r9; - DestroyTask(taskId); -} - -void OpponentHandlecmd48(void) -{ - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == 0) - { - OpponentBufferExecCompleted(); - return; - } - - ewram17810[gActiveBattler].unk0_0 = 1; - if (gBattleBufferA[gActiveBattler][2] != 0) - { - if (ewram17810[gActiveBattler].unk1_1 < 2) - { - ewram17810[gActiveBattler].unk1_1++; - return; - } - else - { - ewram17810[gActiveBattler].unk1_1 = 0; - } - } - gUnknown_02024E68[gActiveBattler] = sub_8044804( - gActiveBattler, - (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBattler][4], - gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2]); - ewram17810[gActiveBattler].unk5 = 0; - if (gBattleBufferA[gActiveBattler][2] != 0) - ewram17810[gActiveBattler].unk5 = 0x5D; - gBattleBankFunc[gActiveBattler] = sub_8035E2C; -} - -void sub_8035E2C(void) -{ - if (ewram17810[gActiveBattler].unk5++ >= 93) - { - ewram17810[gActiveBattler].unk5 = 0; - OpponentBufferExecCompleted(); - } -} - -void OpponentHandlecmd49(void) -{ - if (ewram17810[gActiveBattler].unk0_0) - gTasks[gUnknown_02024E68[gActiveBattler]].func = sub_8044CA0; - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd50(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleSpriteInvisibility(void) -{ - if (IsBankSpritePresent(gActiveBattler) != 0) - { - gSprites[gBankSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; - sub_8031F88(gActiveBattler); - } - OpponentBufferExecCompleted(); -} - -void OpponentHandleBattleAnimation(void) -{ - if (mplay_80342A4(gActiveBattler) == 0) - { - u8 r3 = gBattleBufferA[gActiveBattler][1]; - u16 r4 = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - - if (move_anim_start_t3(gActiveBattler, gActiveBattler, gActiveBattler, r3, r4) != 0) - OpponentBufferExecCompleted(); - else - gBattleBankFunc[gActiveBattler] = sub_80334C0; - } -} - -void OpponentHandleLinkStandbyMsg(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleResetActionMoveSelection(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd55(void) -{ - if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_WILD)) - { - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(gMain.savedCallback); - } - OpponentBufferExecCompleted(); -} - -void OpponentHandlecmd56(void) -{ -} diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c deleted file mode 100644 index 5d7a8955c..000000000 --- a/src/battle/battle_controller_player.c +++ /dev/null @@ -1,3239 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "battle.h" -#include "battle_anim.h" -#include "battle_anim_813F0F4.h" -#include "battle_interface.h" -#include "battle_message.h" -#include "item.h" -#include "constants/items.h" -#include "link.h" -#include "m4a.h" -#include "main.h" -#include "menu_cursor.h" -#include "constants/moves.h" -#include "palette.h" -#include "pokemon.h" -#include "rom3.h" -#include "constants/songs.h" -#include "sound.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "util.h" -#include "ewram.h" - -struct MovePpInfo -{ - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -#if ENGLISH -#define SUB_803037C_TILE_DATA_OFFSET 440 -#elif GERMAN -#define SUB_803037C_TILE_DATA_OFFSET 444 -#endif - -extern struct Window gUnknown_03004210; - -extern void (*gBattleBankFunc[])(void); - -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u32 gOamMatrixAllocBitmap; -extern u8 gUnknown_020297ED; -extern u8 gActiveBattler; -extern u8 gActionSelectionCursor[]; -extern u8 gDisplayedStringBattle[]; -extern u8 gMoveSelectionCursor[]; -extern u8 gBattleBufferA[][0x200]; -extern u8 gBankInMenu; -extern u16 gBattlerPartyIndexes[]; -extern u8 gHealthboxIDs[]; -extern u8 gDoingBattleAnim; -extern u8 gBankSpriteIds[]; -extern u16 gBattleTypeFlags; -extern u8 gBattleOutcome; -extern void (*gAnimScriptCallback)(void); -extern bool8 gAnimScriptActive; -extern u16 gAnimMovePower; -extern s32 gAnimMoveDmg; -extern u8 gAnimFriendship; -extern u16 gWeatherMoveAnim; -extern u32 gTransformedPersonalities[]; -extern u8 gBattleMonForms[]; -extern u16 gUnknown_02024DE8; -extern u8 gUnknown_02024E68[]; -extern struct SpriteTemplate gUnknown_02024E8C; -extern u8 gAnimMoveTurn; -extern u8 gUnknown_02038470[]; -extern u8 gUnknown_03004344; -extern u8 gUnknown_0300434C[]; - -extern const u8 BattleText_OtherMenu[]; -extern const u8 BattleText_MenuOptions[]; -extern const u8 BattleText_PP[]; - -extern void sub_802C68C(void); -extern void sub_802E1B0(void); -extern void sub_802E220(); -extern void sub_802E2D4(); -extern void sub_802E004(void); -extern void sub_802DF30(void); -extern void BattleStopLowHpSound(void); -extern void PlayerBufferExecCompleted(void); -extern void bx_t1_healthbar_update(void); -extern void nullsub_91(void); -extern void sub_802D924(u8); -extern void sub_802E434(void); -extern bool8 mplay_80342A4(u8); -extern void move_anim_start_t2_for_situation(); -extern void bx_blink_t1(void); -extern void sub_8047858(); -extern u8 GetBattlerSide(u8); -extern void StartBattleIntroAnim(); -extern void oamt_add_pos2_onto_pos1(); -extern void StartAnimLinearTranslation(struct Sprite *); -extern void StoreSpriteCallbackInData(); -extern void BattleLoadPlayerMonSprite(); -extern bool8 IsDoubleBattle(void); -extern void sub_802D500(void); -extern bool8 IsBankSpritePresent(u8); -extern bool8 move_anim_start_t3(); -extern void sub_802E460(void); -extern void b_link_standby_message(void); -extern void sub_802D18C(void); -extern void sub_802DF18(void); -extern void BufferStringBattle(); -extern void sub_80326EC(); -extern void sub_8031F24(void); -extern void sub_80324BC(); -extern u8 sub_8031720(); -extern void bx_wait_t1(void); -extern u8 GetBattlerAtPosition(u8); -extern void sub_802DE10(void); -extern void sub_80105EC(struct Sprite *); -extern void sub_802D274(void); -extern void sub_802D23C(void); -extern u8 GetBattlerPosition(u8); -extern void LoadPlayerTrainerBankSprite(); -extern void sub_80313A0(struct Sprite *); -extern void sub_802D204(void); -extern u8 GetBattlerSubpriority(); -extern void sub_802DEAC(void); -extern void sub_80312F0(struct Sprite *); -extern u8 GetBattlerSpriteCoord(); -extern u8 sub_8077F68(); -extern u8 StartSendOutMonAnimation(); -extern void sub_802D798(void); -extern void bx_0802E404(void); -extern u8 gActiveBattler; -extern void (*gBattleBankFunc[])(void); -extern bool8 gDoingBattleAnim; -extern u16 gBattleTypeFlags; -extern u32 gBattleExecBuffer; -extern u8 gBattleBufferA[][0x200]; -extern u8 gBankSpriteIds[]; -extern u8 gActionSelectionCursor[]; -extern u8 gMoveSelectionCursor[]; -extern u8 gAbsentBattlerFlags; -extern u8 gUnknown_03004344; -extern u8 gBattlersCount; -extern u16 gBattlerPartyIndexes[]; -extern struct Window gUnknown_03004210; -extern const u8 BattleText_SwitchWhich[]; -extern u8 gUnknown_03004348; -extern struct BattlePokemon gBattleMons[]; -extern MainCallback gPreBattleCallback1; -extern u8 gHealthboxIDs[]; -extern struct MusicPlayerInfo gMPlay_BGM; -extern u8 gUnknown_0300434C[]; -extern u8 gUnknown_0202E8F4; -extern u8 gUnknown_0202E8F5; -extern u8 gUnknown_02038470[]; -extern u16 gSpecialVar_ItemId; -extern u8 gDisplayedStringBattle[]; -extern const u8 BattleText_LinkStandby[]; - -extern void dp11b_obj_instanciate(u8, u8, s8, s8); -extern u8 GetBattlerPosition(u8); -extern u8 GetBattlerAtPosition(u8); -extern void dp11b_obj_free(u8, u8); -extern void sub_8010520(struct Sprite *); -extern void sub_8010574(struct Sprite *); -extern bool8 IsDoubleBattle(); -extern void sub_804777C(); -extern void sub_8094E20(u8); -extern void nullsub_14(void); -extern void sub_80A6DCC(void); -extern void ReshowBattleScreenAfterMenu(void); - -void PlayerHandleGetAttributes(void); -void PlayerHandlecmd1(void); -void PlayerHandleSetAttributes(void); -void PlayerHandlecmd3(void); -void PlayerHandleLoadPokeSprite(void); -void PlayerHandleSendOutPoke(void); -void PlayerHandleReturnPokeToBall(void); -void PlayerHandleTrainerThrow(void); -void PlayerHandleTrainerSlide(void); -void PlayerHandleTrainerSlideBack(void); -void PlayerHandlecmd10(void); -void PlayerHandlecmd11(void); -void PlayerHandlecmd12(void); -void PlayerHandleBallThrow(void); -void PlayerHandlePuase(void); -void PlayerHandleMoveAnimation(void); -void PlayerHandlePrintString(void); -void PlayerHandlePrintStringPlayerOnly(void); -void PlayerHandlecmd18(void); -void PlayerHandlecmd19(void); -void PlayerHandlecmd20(void); -void PlayerHandleOpenBag(void); -void PlayerHandlecmd22(void); -void PlayerHandlecmd23(void); -void PlayerHandleHealthBarUpdate(void); -void PlayerHandleExpBarUpdate(void); -void PlayerHandleStatusIconUpdate(void); -void PlayerHandleStatusAnimation(void); -void PlayerHandleStatusXor(void); -void PlayerHandlecmd29(void); -void PlayerHandleDMATransfer(void); -void PlayerHandlecmd31(void); -void PlayerHandlecmd32(void); -void PlayerHandlecmd33(void); -void PlayerHandlecmd34(void); -void PlayerHandlecmd35(void); -void PlayerHandlecmd36(void); -void PlayerHandlecmd37(void); -void PlayerHandlecmd38(void); -void PlayerHandlecmd39(void); -void PlayerHandlecmd40(void); -void PlayerHandleHitAnimation(void); -void PlayerHandlecmd42(void); -void PlayerHandleEffectivenessSound(void); -void PlayerHandlecmd44(void); -void PlayerHandleFaintingCry(void); -void PlayerHandleIntroSlide(void); -void PlayerHandleTrainerBallThrow(void); -void PlayerHandlecmd48(void); -void PlayerHandlecmd49(void); -void PlayerHandlecmd50(void); -void PlayerHandleSpriteInvisibility(void); -void PlayerHandleBattleAnimation(void); -void PlayerHandleLinkStandbyMsg(void); -void PlayerHandleResetActionMoveSelection(void); -void PlayerHandlecmd55(void); -void PlayerHandlecmd56(void); - -const u8 gString_TurnJP[] = _("ターン"); - -void (*const gPlayerBufferCommands[])(void) = -{ - PlayerHandleGetAttributes, - PlayerHandlecmd1, - PlayerHandleSetAttributes, - PlayerHandlecmd3, - PlayerHandleLoadPokeSprite, - PlayerHandleSendOutPoke, - PlayerHandleReturnPokeToBall, - PlayerHandleTrainerThrow, - PlayerHandleTrainerSlide, - PlayerHandleTrainerSlideBack, - PlayerHandlecmd10, - PlayerHandlecmd11, - PlayerHandlecmd12, - PlayerHandleBallThrow, - PlayerHandlePuase, - PlayerHandleMoveAnimation, - PlayerHandlePrintString, - PlayerHandlePrintStringPlayerOnly, - PlayerHandlecmd18, - PlayerHandlecmd19, - PlayerHandlecmd20, - PlayerHandleOpenBag, - PlayerHandlecmd22, - PlayerHandlecmd23, - PlayerHandleHealthBarUpdate, - PlayerHandleExpBarUpdate, - PlayerHandleStatusIconUpdate, - PlayerHandleStatusAnimation, - PlayerHandleStatusXor, - PlayerHandlecmd29, - PlayerHandleDMATransfer, - PlayerHandlecmd31, - PlayerHandlecmd32, - PlayerHandlecmd33, - PlayerHandlecmd34, - PlayerHandlecmd35, - PlayerHandlecmd36, - PlayerHandlecmd37, - PlayerHandlecmd38, - PlayerHandlecmd39, - PlayerHandlecmd40, - PlayerHandleHitAnimation, - PlayerHandlecmd42, - PlayerHandleEffectivenessSound, - PlayerHandlecmd44, - PlayerHandleFaintingCry, - PlayerHandleIntroSlide, - PlayerHandleTrainerBallThrow, - PlayerHandlecmd48, - PlayerHandlecmd49, - PlayerHandlecmd50, - PlayerHandleSpriteInvisibility, - PlayerHandleBattleAnimation, - PlayerHandleLinkStandbyMsg, - PlayerHandleResetActionMoveSelection, - PlayerHandlecmd55, - PlayerHandlecmd56, -}; - -void PlayerBufferRunCommand(void); -void sub_802C2EC(void); -void sub_802C68C(void); -void sub_802CA60(void); -void sub_802D730(void); -void sub_802DA9C(u8); -void sub_802DB6C(u8); -void sub_802DCB0(u8); -void sub_802DD10(u8); -void sub_802DDC4(u8); -void sub_802DF88(void); -void sub_802E03C(void); -void sub_802E12C(s32, const u8 *); -void sub_802E1B0(void); -void sub_802E220(void); -void sub_802E2D4(void); -void sub_802E3B4(u8, int); -void nullsub_7(u8); -void b_link_standby_message(void); -u32 dp01_getattr_by_ch1_for_player_pokemon_(u8, u8 *); -void dp01_setattr_by_ch1_for_player_pokemon(u8); -void sub_802F934(u8, u8); -void sub_802FB2C(void); -void sub_8030190(void); -void sub_80304A8(void); -void sub_8030E38(struct Sprite *); -void task05_08033660(u8); -void sub_8031064(void); - -void nullsub_91(void) -{ -} - -void SetBankFuncToPlayerBufferRunCommand(void) -{ - gBattleBankFunc[gActiveBattler] = PlayerBufferRunCommand; - gDoingBattleAnim = FALSE; -} - -void PlayerBufferExecCompleted(void) -{ - gBattleBankFunc[gActiveBattler] = PlayerBufferRunCommand; - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - u8 playerId = GetMultiplayerId(); - - PrepareBufferDataTransferLink(2, 4, &playerId); - gBattleBufferA[gActiveBattler][0] = 0x38; - } - else - { - gBattleExecBuffer &= ~gBitTable[gActiveBattler]; - } -} - -void PlayerBufferRunCommand(void) -{ - if (gBattleExecBuffer & gBitTable[gActiveBattler]) - { - if (gBattleBufferA[gActiveBattler][0] < 0x39) - gPlayerBufferCommands[gBattleBufferA[gActiveBattler][0]](); - else - PlayerBufferExecCompleted(); - } -} - -void bx_0802E404(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].pos2.x == 0) - PlayerBufferExecCompleted(); -} - -void sub_802C098(void) -{ - u16 itemId = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - - dp11b_obj_instanciate(gActiveBattler, 1, 7, 1); - dp11b_obj_instanciate(gActiveBattler, 0, 7, 1); - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - DestroyMenuCursor(); - - // Useless switch statement. - switch (gActionSelectionCursor[gActiveBattler]) - { - case 0: - Emitcmd33(1, 0, 0); - break; - case 1: - Emitcmd33(1, 1, 0); - break; - case 2: - Emitcmd33(1, 2, 0); - break; - case 3: - Emitcmd33(1, 3, 0); - break; - } - PlayerBufferExecCompleted(); - } - else if (gMain.newKeys & DPAD_LEFT) - { - if (gActionSelectionCursor[gActiveBattler] & 1) - { - PlaySE(SE_SELECT); - nullsub_8(gActionSelectionCursor[gActiveBattler]); - gActionSelectionCursor[gActiveBattler] ^= 1; - sub_802E3E4(gActionSelectionCursor[gActiveBattler], 0); - } - } - else if (gMain.newKeys & DPAD_RIGHT) - { - if (!(gActionSelectionCursor[gActiveBattler] & 1)) - { - PlaySE(SE_SELECT); - nullsub_8(gActionSelectionCursor[gActiveBattler]); - gActionSelectionCursor[gActiveBattler] ^= 1; - sub_802E3E4(gActionSelectionCursor[gActiveBattler], 0); - } - } - else if (gMain.newKeys & DPAD_UP) - { - if (gActionSelectionCursor[gActiveBattler] & 2) - { - PlaySE(SE_SELECT); - nullsub_8(gActionSelectionCursor[gActiveBattler]); - gActionSelectionCursor[gActiveBattler] ^= 2; - sub_802E3E4(gActionSelectionCursor[gActiveBattler], 0); - } - } - else if (gMain.newKeys & DPAD_DOWN) - { - if (!(gActionSelectionCursor[gActiveBattler] & 2)) - { - PlaySE(SE_SELECT); - nullsub_8(gActionSelectionCursor[gActiveBattler]); - gActionSelectionCursor[gActiveBattler] ^= 2; - sub_802E3E4(gActionSelectionCursor[gActiveBattler], 0); - } - } - else if (gMain.newKeys & B_BUTTON) - { - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - && GetBattlerPosition(gActiveBattler) == 2 - && !(gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(0)]) - && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - if (gBattleBufferA[gActiveBattler][1] == 1) - { - // Add item to bag if it is a ball - if (itemId <= ITEM_PREMIER_BALL) - AddBagItem(itemId, 1); - else - return; - } - PlaySE(SE_SELECT); - Emitcmd33(1, 12, 0); - PlayerBufferExecCompleted(); - DestroyMenuCursor(); - } - } - else if (gMain.newKeys & START_BUTTON) - { - sub_804454C(); - } -} - -void unref_sub_802C2B8(void) -{ - dp11b_obj_free(gActiveBattler, 1); - dp11b_obj_free(gActiveBattler, 0); - gBattleBankFunc[gActiveBattler] = sub_802C2EC; -} - -// TODO: fix this function -void sub_802C2EC(void) -{ - u8 arr[4] = {0, 2, 3, 1}; - s32 i; - - dp11b_obj_instanciate(gUnknown_03004344, 1, 15, 1); - i = 0; - if (gBattlersCount != 0) - { - do - { - if (i != gUnknown_03004344) - dp11b_obj_free(i, 1); - i++; - } while (i < gBattlersCount); - } - if (gMain.newKeys & A_BUTTON) - { - DestroyMenuCursor(); - PlaySE(SE_SELECT); - gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010574; - Emitcmd33(1, 10, gMoveSelectionCursor[gActiveBattler] | (gUnknown_03004344 << 8)); - dp11b_obj_free(gUnknown_03004344, 1); - PlayerBufferExecCompleted(); - } - //_0802C3A8 - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010574; - gBattleBankFunc[gActiveBattler] = sub_802C68C; - dp11b_obj_instanciate(gActiveBattler, 1, 7, 1); - dp11b_obj_instanciate(gActiveBattler, 0, 7, 1); - dp11b_obj_free(gUnknown_03004344, 1); - } - else if (gMain.newKeys & 0x60) - { - PlaySE(SE_SELECT); - gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010574; - do - { - u8 var = GetBattlerPosition(gUnknown_03004344); - - for (i = 0; i < 4; i++) - { - if (var == arr[i]) - break; - } - do - { - i--; - if (i < 0) - i = 3; - gUnknown_03004344 = GetBattlerAtPosition(arr[i]); - } while(gUnknown_03004344 == gBattlersCount); - i = 0; - switch (GetBattlerPosition(gUnknown_03004344)) - { - case 0: - case 2: - if (gActiveBattler == gUnknown_03004344) - { - u32 moveId; - - asm("":::"memory"); - moveId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler]); - if (!(gBattleMoves[moveId].target & 2)) - break; - } - i++; - break; - case 1: - case 3: - i++; - } - //_0802C500 - if (gAbsentBattlerFlags & gBitTable[gUnknown_03004344]) - i = 0; - } while (i == 0); - gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010520; - } - //_0802C540 - else if (gMain.newKeys & 0x90) - { - PlaySE(SE_SELECT); - gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010574; - do - { - u8 var = GetBattlerPosition(gUnknown_03004344); - - for (i = 0; i < 4; i++) - { - if (var == arr[i]) - break; - } - do - { - i++; - if (i > 3) - i = 0; - gUnknown_03004344 = GetBattlerAtPosition(arr[i]); - } while (gUnknown_03004344 == gBattlersCount); - i = 0; - switch (GetBattlerPosition(gUnknown_03004344)) - { - case 0: - case 2: - if (gActiveBattler == gUnknown_03004344) - { - u32 moveId; - - asm("":::"memory"); - moveId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler]); - if (!(gBattleMoves[moveId].target & 2)) - break; - } - i++; - break; - case 1: - case 3: - i++; - } - if (gAbsentBattlerFlags & gBitTable[gUnknown_03004344]) - i = 0; - } while (i == 0); - gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010520; - } -} - -struct ChooseMoveStruct -{ - u16 moves[4]; - u8 pp[4]; - u8 unkC[0x12-0xC]; - u8 unk12; - u8 effectStringId; - u8 filler14[0x20-0x14]; -}; - -const u8 gUnknown_081FAE80[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW WHITE LIGHT_BLUE WHITE2}"); - -void debug_sub_8030C24(void); - -void sub_802C68C(void) -{ - u32 r8 = 0; -#if DEBUG - u8 count = 0; -#endif - struct ChooseMoveStruct *r6 = (struct ChooseMoveStruct *)(gBattleBufferA[gActiveBattler] + 4); - - if (gMain.newKeys & A_BUTTON) - { - u32 r4; - - PlaySE(SE_SELECT); - - if (r6->moves[gMoveSelectionCursor[gActiveBattler]] == MOVE_CURSE) - r4 = (r6->unk12 != TYPE_GHOST && (r6->effectStringId ^ 7)) ? 0x10 : 0; - else - r4 = gBattleMoves[r6->moves[gMoveSelectionCursor[gActiveBattler]]].target; - - if (r4 & 0x10) - gUnknown_03004344 = gActiveBattler; - else - gUnknown_03004344 = GetBattlerAtPosition((GetBattlerPosition(gActiveBattler) & 1) ^ 1); - - if (gBattleBufferA[gActiveBattler][1] == 0) - { - if ((r4 & 2) && gBattleBufferA[gActiveBattler][2] == 0) - r8++; - } - else - { - if (!(r4 & 0x7D)) - r8++; - if (r6->pp[gMoveSelectionCursor[gActiveBattler]] == 0) - { - r8 = 0; - } - else if (!(r4 & 0x12) && CountAliveMons(0) <= 1) - { - gUnknown_03004344 = sub_803C434(gActiveBattler); - r8 = 0; - } - } - if (r8 == 0) - { - DestroyMenuCursor(); - Emitcmd33(1, 10, gMoveSelectionCursor[gActiveBattler] | (gUnknown_03004344 << 8)); - PlayerBufferExecCompleted(); - } - else - { - gBattleBankFunc[gActiveBattler] = sub_802C2EC; - if (r4 & 0x12) - gUnknown_03004344 = gActiveBattler; - else if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(1)]) - gUnknown_03004344 = GetBattlerAtPosition(3); - else - gUnknown_03004344 = GetBattlerAtPosition(1); - gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010520; - } - } - else if (gMain.newKeys & B_BUTTON) - { - DestroyMenuCursor(); - PlaySE(SE_SELECT); - gBattle_BG0_X = 0; - gBattle_BG0_Y = 320; - Emitcmd33(1, 10, 0xFFFF); - PlayerBufferExecCompleted(); - } - else if (gMain.newKeys & DPAD_LEFT) - { - if (gMoveSelectionCursor[gActiveBattler] & 1) - { - nullsub_7(gMoveSelectionCursor[gActiveBattler]); - gMoveSelectionCursor[gActiveBattler] ^= 1; - PlaySE(SE_SELECT); - sub_802E3B4(gMoveSelectionCursor[gActiveBattler], 0); - sub_802E220(); - sub_802E2D4(); - } - } - else if (gMain.newKeys & DPAD_RIGHT) - { - if (!(gMoveSelectionCursor[gActiveBattler] & 1) - && (gMoveSelectionCursor[gActiveBattler] ^ 1) < gUnknown_03004348) - { - nullsub_7(gMoveSelectionCursor[gActiveBattler]); - gMoveSelectionCursor[gActiveBattler] ^= 1; - PlaySE(SE_SELECT); - sub_802E3B4(gMoveSelectionCursor[gActiveBattler], 0); - sub_802E220(); - sub_802E2D4(); - } - } - else if (gMain.newKeys & DPAD_UP) - { - if (gMoveSelectionCursor[gActiveBattler] & 2) - { - nullsub_7(gMoveSelectionCursor[gActiveBattler]); - gMoveSelectionCursor[gActiveBattler] ^= 2; - PlaySE(SE_SELECT); - sub_802E3B4(gMoveSelectionCursor[gActiveBattler], 0); - sub_802E220(); - sub_802E2D4(); - } - } - else if (gMain.newKeys & DPAD_DOWN) - { - if (!(gMoveSelectionCursor[gActiveBattler] & 2) - && (gMoveSelectionCursor[gActiveBattler] ^ 2) < gUnknown_03004348) - { - nullsub_7(gMoveSelectionCursor[gActiveBattler]); - gMoveSelectionCursor[gActiveBattler] ^= 2; - PlaySE(SE_SELECT); - sub_802E3B4(gMoveSelectionCursor[gActiveBattler], 0); - sub_802E220(); - sub_802E2D4(); - } - } - else if (gMain.newKeys & SELECT_BUTTON) - { - if (gUnknown_03004348 > 1 && !(gBattleTypeFlags & BATTLE_TYPE_LINK)) - { - sub_802E12C(gMoveSelectionCursor[gActiveBattler], gUnknown_081FAE80); - if (gMoveSelectionCursor[gActiveBattler] != 0) - gUnknown_03004344 = 0; - else - gUnknown_03004344 = gMoveSelectionCursor[gActiveBattler] + 1; - sub_802E3B4(gUnknown_03004344, 27); - Text_FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A); - Text_InitWindow(&gUnknown_03004210, BattleText_SwitchWhich, 0x290, 0x17, 0x37); - Text_PrintWindow8002F44(&gUnknown_03004210); - gBattleBankFunc[gActiveBattler] = sub_802CA60; - } - } -#if DEBUG - else if (gUnknown_020297ED == 1 && (gMain.newKeys & START_BUTTON)) - { - const u8 *moveName; - s32 i; - - Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x3A); - moveName = gMoveNames[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1)]; - Text_InitWindowAndPrintText(&gUnknown_03004210, moveName, 0x100, 2, 0x37); - ConvertIntToDecimalStringN( - gDisplayedStringBattle, - GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1), - 2, 3); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x110, 10, 0x37); - Text_InitWindowAndPrintText(&gUnknown_03004210, gString_TurnJP, 0x116, 1, 0x39); - ConvertIntToDecimalStringN(gDisplayedStringBattle, gAnimMoveTurn, 2, 3); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x11C, 4, 0x39); - for (i = 0; i < 64; i++) - { - if (gSprites[i].inUse) - count++; - } - ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x122, 8, 0x39); - count = GetTaskCount(); - ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x126, 11, 0x39); - for (i = 0, count = 0; i < 32; i++) - { - if (gOamMatrixAllocBitmap & (1 << i)) - count++; - } - ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x12A, 14, 0x39); - gBattleBankFunc[gActiveBattler] = debug_sub_8030C24; - } -#endif -} - -extern const u8 BattleText_Format[]; - -void sub_802CA60(void) -{ - u8 perMovePPBonuses[4]; - struct - { - u16 moves[4]; - u8 pp[4]; - u8 filler18[8]; // what is this? - } sp0; - //struct ChooseMoveStruct sp0; - u8 totalPPBonuses; - - if (gMain.newKeys & (A_BUTTON | SELECT_BUTTON)) - { - PlaySE(SE_SELECT); - if (gMoveSelectionCursor[gActiveBattler] != gUnknown_03004344) - { - struct ChooseMoveStruct *r9 = (struct ChooseMoveStruct *)&gBattleBufferA[gActiveBattler][4]; - s32 i; - - i = r9->moves[gMoveSelectionCursor[gActiveBattler]]; - r9->moves[gMoveSelectionCursor[gActiveBattler]] = r9->moves[gUnknown_03004344]; - r9->moves[gUnknown_03004344] = i; - - i = r9->pp[gMoveSelectionCursor[gActiveBattler]]; - r9->pp[gMoveSelectionCursor[gActiveBattler]] = r9->pp[gUnknown_03004344]; - r9->pp[gUnknown_03004344] = i; - - i = r9->unkC[gMoveSelectionCursor[gActiveBattler]]; - r9->unkC[gMoveSelectionCursor[gActiveBattler]] = r9->unkC[gUnknown_03004344]; - r9->unkC[gUnknown_03004344] = i; - - if (gDisableStructs[gActiveBattler].unk18_b & gBitTable[gMoveSelectionCursor[gActiveBattler]]) - { - gDisableStructs[gActiveBattler].unk18_b &= ~gBitTable[gMoveSelectionCursor[gActiveBattler]]; - gDisableStructs[gActiveBattler].unk18_b |= gBitTable[gUnknown_03004344]; - } - - sub_802E1B0(); - - for (i = 0; i < 4; i++) - perMovePPBonuses[i] = (gBattleMons[gActiveBattler].ppBonuses & (3 << (i * 2))) >> (i * 2); - totalPPBonuses = perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]]; - perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]] = perMovePPBonuses[gUnknown_03004344]; - perMovePPBonuses[gUnknown_03004344] = totalPPBonuses; - - totalPPBonuses = 0; - for (i = 0; i < 4; i++) - totalPPBonuses |= perMovePPBonuses[i] << (i * 2); - gBattleMons[gActiveBattler].ppBonuses = totalPPBonuses; - - for (i = 0; i < 4; i++) - { - gBattleMons[gActiveBattler].moves[i] = r9->moves[i]; - gBattleMons[gActiveBattler].pp[i] = r9->pp[i]; - } - if (!(gBattleMons[gActiveBattler].status2 & 0x200000)) - { - for (i = 0; i < 4; i++) - { - sp0.moves[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i); - sp0.pp[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP1 + i); - } - - totalPPBonuses = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP_BONUSES); - for (i = 0; i < 4; i++) - perMovePPBonuses[i] = (totalPPBonuses & (3 << (i * 2))) >> (i * 2); - - i = sp0.moves[gMoveSelectionCursor[gActiveBattler]]; - sp0.moves[gMoveSelectionCursor[gActiveBattler]] = sp0.moves[gUnknown_03004344]; - sp0.moves[gUnknown_03004344] = i; - - i = sp0.pp[gMoveSelectionCursor[gActiveBattler]]; - sp0.pp[gMoveSelectionCursor[gActiveBattler]] = sp0.pp[gUnknown_03004344]; - sp0.pp[gUnknown_03004344] = i; - - totalPPBonuses = perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]]; - perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]] = perMovePPBonuses[gUnknown_03004344]; - perMovePPBonuses[gUnknown_03004344] = totalPPBonuses; - - totalPPBonuses = 0; - for (i = 0; i < 4; i++) - totalPPBonuses |= perMovePPBonuses[i] << (i * 2); - - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i, &sp0.moves[i]); - SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP1 + i, &sp0.pp[i]); - } - SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP_BONUSES, &totalPPBonuses); - } - } - else - { - sub_802E12C(gUnknown_03004344, BattleText_Format); - } - gBattleBankFunc[gActiveBattler] = sub_802C68C; - gMoveSelectionCursor[gActiveBattler] = gUnknown_03004344; - sub_802E3B4(gMoveSelectionCursor[gActiveBattler], 0); - Text_FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A); - Text_InitWindow(&gUnknown_03004210, BattleText_PP, 0x290, 0x17, 0x37); - Text_PrintWindow8002F44(&gUnknown_03004210); - sub_802E220(); - sub_802E2D4(); - } - if (gMain.newKeys & (B_BUTTON | SELECT_BUTTON)) - { - PlaySE(SE_SELECT); - nullsub_7(gUnknown_03004344); - sub_802E3B4(gMoveSelectionCursor[gActiveBattler], 0); - sub_802E12C(gMoveSelectionCursor[gActiveBattler], BattleText_Format); - gBattleBankFunc[gActiveBattler] = sub_802C68C; - Text_FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A); - Text_InitWindow(&gUnknown_03004210, BattleText_PP, 0x290, 0x17, 0x37); - Text_PrintWindow8002F44(&gUnknown_03004210); - sub_802E220(); - sub_802E2D4(); - } - if ((gMain.newKeys & DPAD_LEFT) && (gUnknown_03004344 & 1)) - { - if (gUnknown_03004344 == gMoveSelectionCursor[gActiveBattler]) - sub_802E3B4(gMoveSelectionCursor[gActiveBattler], 0x1D); - else - nullsub_7(gUnknown_03004344); - gUnknown_03004344 ^= 1; - PlaySE(SE_SELECT); - if (gUnknown_03004344 == gMoveSelectionCursor[gActiveBattler]) - sub_802E3B4(gUnknown_03004344, 0); - else - sub_802E3B4(gUnknown_03004344, 0x1B); - } - if ((gMain.newKeys & DPAD_RIGHT) && !(gUnknown_03004344 & 1) && (gUnknown_03004344 ^ 1) < gUnknown_03004348) - { - if (gUnknown_03004344 == gMoveSelectionCursor[gActiveBattler]) - sub_802E3B4(gMoveSelectionCursor[gActiveBattler], 0x1D); - else - nullsub_7(gUnknown_03004344); - gUnknown_03004344 ^= 1; - PlaySE(SE_SELECT); - if (gUnknown_03004344 == gMoveSelectionCursor[gActiveBattler]) - sub_802E3B4(gUnknown_03004344, 0); - else - sub_802E3B4(gUnknown_03004344, 0x1B); - } - if ((gMain.newKeys & DPAD_UP) && (gUnknown_03004344 & 2)) - { - if (gUnknown_03004344 == gMoveSelectionCursor[gActiveBattler]) - sub_802E3B4(gMoveSelectionCursor[gActiveBattler], 0x1D); - else - nullsub_7(gUnknown_03004344); - gUnknown_03004344 ^= 2; - PlaySE(SE_SELECT); - if (gUnknown_03004344 == gMoveSelectionCursor[gActiveBattler]) - sub_802E3B4(gUnknown_03004344, 0); - else - sub_802E3B4(gUnknown_03004344, 0x1B); - } - if ((gMain.newKeys & DPAD_DOWN) && !(gUnknown_03004344 & 2) && (gUnknown_03004344 ^ 2) < gUnknown_03004348) - { - if (gUnknown_03004344 == gMoveSelectionCursor[gActiveBattler]) - sub_802E3B4(gMoveSelectionCursor[gActiveBattler], 0x1D); - else - nullsub_7(gUnknown_03004344); - gUnknown_03004344 ^= 2; - PlaySE(SE_SELECT); - if (gUnknown_03004344 == gMoveSelectionCursor[gActiveBattler]) - sub_802E3B4(gUnknown_03004344, 0); - else - sub_802E3B4(gUnknown_03004344, 0x1B); - } -} - -void sub_802D148(void) -{ - if (gReceivedRemoteLinkPlayers == 0) - { - m4aSongNumStop(SE_HINSI); - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(c2_8011A1C); - } -} - -void sub_802D18C(void) -{ - if (!gPaletteFade.active) - { - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - sub_800832C(); - gBattleBankFunc[gActiveBattler] = sub_802D148; - } - else - { - m4aSongNumStop(SE_HINSI); - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(gMain.savedCallback); - } - } -} - -#if DEBUG - -void debug_sub_803107C(void); - -void debug_sub_8030C24(void) -{ - s16 move = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1); - - switch (gMain.newAndRepeatedKeys) - { - case START_BUTTON: - dp11b_obj_free(gActiveBattler, 1); - dp11b_obj_free(gActiveBattler, 0); - gBankAttacker = gActiveBattler; - if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - gBankTarget = gBankAttacker ^ 2; - else if ((gMain.heldKeysRaw & A_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - gBankTarget = GetBattlerAtPosition(3); - else - gBankTarget = GetBattlerAtPosition(1); - sub_80326EC(0); - DoMoveAnim(move); - gBattleBankFunc[gActiveBattler] = debug_sub_803107C; - break; - case SELECT_BUTTON: - dp11b_obj_free(gActiveBattler, 1); - dp11b_obj_free(gActiveBattler, 0); - gBankTarget = gActiveBattler; - if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - gBankAttacker = gBankTarget ^ 2; - else if ((gMain.heldKeysRaw & A_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - gBankAttacker = GetBattlerAtPosition(3); - else - gBankAttacker = GetBattlerAtPosition(1); - sub_80326EC(0); - DoMoveAnim(move); - gBattleBankFunc[gActiveBattler] = debug_sub_803107C; - break; - case R_BUTTON: - if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - dp11b_obj_free(gActiveBattler, 1); - dp11b_obj_free(gActiveBattler, 0); - gBankAttacker = GetBattlerAtPosition(3); - gBankTarget = GetBattlerAtPosition(1); - sub_80326EC(0); - DoMoveAnim(move); - gBattleBankFunc[gActiveBattler] = debug_sub_803107C; - } - else - { - move += 9; - case DPAD_RIGHT: - if (++move > 354) - move = 1; - SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1, &move); - gBattleMons[gActiveBattler].moves[0] = move; - Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x38); - Text_InitWindowAndPrintText(&gUnknown_03004210, gMoveNames[move], 0x100, 2, 0x37); - ConvertIntToDecimalStringN(gDisplayedStringBattle, move, 2, 3); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 272, 10, 0x37); - } - break; - case L_BUTTON: - if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - dp11b_obj_free(gActiveBattler, 1); - dp11b_obj_free(gActiveBattler, 0); - gBankAttacker = GetBattlerAtPosition(1); - gBankTarget = GetBattlerAtPosition(3); - sub_80326EC(0); - DoMoveAnim(move); - gBattleBankFunc[gActiveBattler] = debug_sub_803107C; - } - else - { - move -= 9; - case DPAD_LEFT: - if (--move <= 0) - move = 354; - SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1, &move); - gBattleMons[gActiveBattler].moves[0] = move; - Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x38); - Text_InitWindowAndPrintText(&gUnknown_03004210, gMoveNames[move], 0x100, 2, 0x37); - ConvertIntToDecimalStringN(gDisplayedStringBattle, move, 2, 3); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 272, 10, 0x37); - } - break; - case DPAD_UP: - case DPAD_DOWN: - if (gMain.newAndRepeatedKeys == DPAD_UP) - gAnimMoveTurn--; - else - gAnimMoveTurn++; - ConvertIntToDecimalStringN(gDisplayedStringBattle, gAnimMoveTurn, 2, 3); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 284, 4, 0x39); - break; - } - - if ((gMain.heldKeysRaw & (L_BUTTON | R_BUTTON)) == (L_BUTTON | R_BUTTON)) - { - u8 i; - u32 move; - - for (i = 0; i < 4; i++) - { - StringCopy(gDisplayedStringBattle, BattleText_Format); - move = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i); - StringAppend(gDisplayedStringBattle, gMoveNames[move]); - Text_InitWindow( - &gUnknown_03004210, - gDisplayedStringBattle, - 0x100 + i * 16, - (i & 1) ? 10 : 2, - (i < 2) ? 0x37 : 0x39); - Text_PrintWindow8002F44(&gUnknown_03004210); - } - gBattleBankFunc[gActiveBattler] = sub_802C68C; - } -} - -void debug_sub_803107C(void) -{ - u8 count = 0; - - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - s32 i; - - sub_80326EC(1); - dp11b_obj_instanciate(gActiveBattler, 1, 7, 1); - dp11b_obj_instanciate(gActiveBattler, 0, 7, 1); - - for (i = 0, count = 0; i < MAX_SPRITES; i++) - { - if (gSprites[i].inUse) - count++; - } - ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 290, 8, 0x39); - - count = GetTaskCount(); - ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 294, 11, 0x39); - - for (i = 0, count = 0; i < 32; i++) - { - if (gOamMatrixAllocBitmap & (1 << i)) - count++; - } - ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 298, 14, 0x39); - - gBattleBankFunc[gActiveBattler] = debug_sub_8030C24; - } -} - -#endif - -void sub_802D204(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - PlayerBufferExecCompleted(); -} - -// duplicate of sub_802D204 -void sub_802D23C(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - PlayerBufferExecCompleted(); -} - -void sub_802D274(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - { - nullsub_10(gSaveBlock2.playerGender); - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - PlayerBufferExecCompleted(); - } -} - -void sub_802D2E0(void) -{ - if (--ewram17810[gActiveBattler].unk9 == 0xFF) - { - ewram17810[gActiveBattler].unk9 = 0; - PlayerBufferExecCompleted(); - } -} - -void sub_802D31C(void) -{ - bool8 r6 = FALSE; - - if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) - { - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy) - r6 = TRUE; - } - else - { - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gHealthboxIDs[gActiveBattler ^ 2]].callback == SpriteCallbackDummy) - r6 = TRUE; - } - if (IsCryPlayingOrClearCrySongs()) - r6 = FALSE; - - if (r6 && ewram17810[gActiveBattler].unk1_0 && ewram17810[gActiveBattler ^ 2].unk1_0) - { - ewram17810[gActiveBattler].unk0_7 = 0; - ewram17810[gActiveBattler].unk1_0 = 0; - ewram17810[gActiveBattler ^ 2].unk0_7 = 0; - ewram17810[gActiveBattler ^ 2].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - m4aMPlayContinue(&gMPlay_BGM); - else - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - if (IsDoubleBattle()) - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ 2]], gActiveBattler ^ 2); - ewram17810[gActiveBattler].unk9 = 3; - gBattleBankFunc[gActiveBattler] = sub_802D2E0; - } -} - -void sub_802D500(void) -{ - if (!ewram17810[gActiveBattler].unk0_3 && !ewram17810[gActiveBattler].unk0_7) - sub_8141828(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - if (!ewram17810[gActiveBattler ^ 2].unk0_3 && !ewram17810[gActiveBattler ^ 2].unk0_7) - sub_8141828(gActiveBattler ^ 2, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ 2]]); - if (!ewram17810[gActiveBattler].unk0_3 && !ewram17810[gActiveBattler ^ 2].unk0_3) - { - if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler ^ 2]]); - sub_8045A5C( - gHealthboxIDs[gActiveBattler ^ 2], - &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ 2]], - 0); - sub_804777C(gActiveBattler ^ 2); - sub_8043DFC(gHealthboxIDs[gActiveBattler ^ 2]); - } - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler]]); - sub_8045A5C( - gHealthboxIDs[gActiveBattler], - &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], - 0); - sub_804777C(gActiveBattler); - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - ewram17840.unk9_0 = 0; - gBattleBankFunc[gActiveBattler] = sub_802D31C; - } -} - -void sub_802D680(void) -{ - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy - && ewram17810[gActiveBattler].unk1_0) - { - ewram17810[gActiveBattler].unk0_7 = 0; - ewram17810[gActiveBattler].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - if (ewram17800[gActiveBattler].substituteSprite) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 6); - gBattleBankFunc[gActiveBattler] = sub_802D730; - } -} - -void sub_802D730(void) -{ - if (!ewram17810[gActiveBattler].unk0_6 && !IsCryPlayingOrClearCrySongs()) - { - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - PlayerBufferExecCompleted(); - } -} - -void sub_802D798(void) -{ - if (!ewram17810[gActiveBattler].unk0_3 && !ewram17810[gActiveBattler].unk0_7) - sub_8141828(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - if (gSprites[gUnknown_0300434C[gActiveBattler]].callback == SpriteCallbackDummy - && !ewram17810[gActiveBattler].unk0_3) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler]]); - sub_8045A5C(gHealthboxIDs[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], 0); - sub_804777C(gActiveBattler); - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - sub_8031F88(gActiveBattler); - gBattleBankFunc[gActiveBattler] = sub_802D680; - } -} - -void c3_0802FDF4(u8 taskId) -{ - if (!IsCryPlayingOrClearCrySongs()) - { - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); - DestroyTask(taskId); - } -} - -void bx_t1_healthbar_update(void) -{ - s16 r4 = sub_8045C78(gActiveBattler, gHealthboxIDs[gActiveBattler], 0, 0); - - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - if (r4 != -1) - { - sub_80440EC(gHealthboxIDs[gActiveBattler], r4, 0); - } - else - { - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - PlayerBufferExecCompleted(); - } -} - -void sub_802D90C(void) -{ - if (gUnknown_03004210.state == 0) - PlayerBufferExecCompleted(); -} - -// Rare Candy usage, maybe? -void sub_802D924(u8 taskId) -{ - u32 pkmnIndex = (u8)gTasks[taskId].data[0]; - u8 bank = gTasks[taskId].data[2]; - s16 gainedExp = gTasks[taskId].data[1]; - - if (IsDoubleBattle() == TRUE || pkmnIndex != gBattlerPartyIndexes[bank]) - { - struct Pokemon *pkmn = &gPlayerParty[pkmnIndex]; - u16 species = GetMonData(pkmn, MON_DATA_SPECIES); - u8 level = GetMonData(pkmn, MON_DATA_LEVEL); - u32 currExp = GetMonData(pkmn, MON_DATA_EXP); - u32 nextLvlExp = gExperienceTables[gBaseStats[species].growthRate][level + 1]; - - if (currExp + gainedExp >= nextLvlExp) - { - u8 savedActiveBank; - - SetMonData(pkmn, MON_DATA_EXP, &nextLvlExp); - CalculateMonStats(pkmn); - gainedExp -= nextLvlExp - currExp; - savedActiveBank = gActiveBattler; - gActiveBattler = bank; - Emitcmd33(1, 11, gainedExp); - gActiveBattler = savedActiveBank; - - if (IsDoubleBattle() == TRUE - && ((u16)pkmnIndex == gBattlerPartyIndexes[bank] || (u16)pkmnIndex == gBattlerPartyIndexes[bank ^ 2])) - gTasks[taskId].func = sub_802DCB0; - else - gTasks[taskId].func = sub_802DDC4; - } - else - { - currExp += gainedExp; - SetMonData(pkmn, MON_DATA_EXP, &currExp); - gBattleBankFunc[bank] = sub_802D90C; - DestroyTask(taskId); - } - } - else - { - gTasks[taskId].func = sub_802DA9C; - } -} - -void sub_802DA9C(u8 taskId) -{ - u8 pkmnIndex = gTasks[taskId].data[0]; - s32 r9 = gTasks[taskId].data[1]; - u8 bank = gTasks[taskId].data[2]; - struct Pokemon *pkmn = &gPlayerParty[pkmnIndex]; - u8 level = GetMonData(pkmn, MON_DATA_LEVEL); - u16 species = GetMonData(pkmn, MON_DATA_SPECIES); - u32 exp = GetMonData(pkmn, MON_DATA_EXP); - u32 currLvlExp = gExperienceTables[gBaseStats[species].growthRate][level]; - u32 expToNextLvl; - - exp -= currLvlExp; - expToNextLvl = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLvlExp; - sub_8043D84(bank, gHealthboxIDs[bank], expToNextLvl, exp, -r9); - PlaySE(SE_EXP); - gTasks[taskId].func = sub_802DB6C; -} - -#ifdef NONMATCHING -void sub_802DB6C(u8 taskId) -{ - if (gTasks[taskId].data[10] < 13) - { - gTasks[taskId].data[10]++; - } - else - { - u8 r9 = gTasks[taskId].data[0]; - s32 r10 = gTasks[taskId].data[1]; //s16? - u8 r7 = gTasks[taskId].data[2]; - s16 r4; - - r4 = sub_8045C78(r7, gHealthboxIDs[r7], 1, 0); - sub_8043DFC(gHealthboxIDs[r7]); - if (r4 == -1) - { - struct Pokemon *pkmn; - u8 r4; - u32 sp4; - u16 r0; - u32 sp0; - - m4aSongNumStop(SE_EXP); - pkmn = &gPlayerParty[r9]; - r4 = GetMonData(pkmn, MON_DATA_LEVEL); - sp4 = GetMonData(pkmn, MON_DATA_EXP); - r0 = GetMonData(pkmn, MON_DATA_SPECIES); - sp0 = gExperienceTables[gBaseStats[r0].growthRate][r4 + 1]; - if (sp4 + r10 >= sp0) - { - u8 r5; - u32 asdf; - - SetMonData(pkmn, MON_DATA_EXP, &sp0); - CalculateMonStats(pkmn); - //r10 -= sp0 - sp4; - asdf = sp0 - sp4; - //asdf = r10 - (sp0 - sp4); - r10 -= asdf; - r5 = gActiveBattler; - gActiveBattler = r7; - Emitcmd33(1, 11, r10); - gActiveBattler = r5; - gTasks[taskId].func = sub_802DCB0; - } - else - { - //u32 asdf = sp4 + r10; - sp4 += r10; - SetMonData(pkmn, MON_DATA_EXP, &sp4); - gBattleBankFunc[r7] = sub_802D90C; - DestroyTask(taskId); - } - } - } -} -#else -NAKED -void sub_802DB6C(u8 taskId) -{ - asm_unified("push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - ldr r1, _0802DB98 @ =gTasks\n\ - lsls r0, 2\n\ - add r0, r8\n\ - lsls r0, 3\n\ - adds r6, r0, r1\n\ - ldrh r1, [r6, 0x1C]\n\ - movs r2, 0x1C\n\ - ldrsh r0, [r6, r2]\n\ - cmp r0, 0xC\n\ - bgt _0802DB9C\n\ - adds r0, r1, 0x1\n\ - strh r0, [r6, 0x1C]\n\ - b _0802DC98\n\ - .align 2, 0\n\ -_0802DB98: .4byte gTasks\n\ -_0802DB9C:\n\ - ldrb r0, [r6, 0x8]\n\ - mov r9, r0\n\ - ldrh r2, [r6, 0xA]\n\ - mov r10, r2\n\ - ldrb r7, [r6, 0xC]\n\ - ldr r5, _0802DC64 @ =gHealthboxIDs\n\ - adds r5, r7, r5\n\ - ldrb r1, [r5]\n\ - adds r0, r7, 0\n\ - movs r2, 0x1\n\ - movs r3, 0\n\ - bl sub_8045C78\n\ - adds r4, r0, 0\n\ - lsls r4, 16\n\ - lsrs r4, 16\n\ - ldrb r0, [r5]\n\ - bl sub_8043DFC\n\ - lsls r4, 16\n\ - asrs r4, 16\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - cmp r4, r0\n\ - bne _0802DC98\n\ - movs r0, 0x21\n\ - bl m4aSongNumStop\n\ - movs r0, 0x64\n\ - mov r1, r9\n\ - muls r1, r0\n\ - ldr r0, _0802DC68 @ =gPlayerParty\n\ - adds r5, r1, r0\n\ - adds r0, r5, 0\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - adds r4, r0, 0\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - adds r0, r5, 0\n\ - movs r1, 0x19\n\ - bl GetMonData\n\ - str r0, [sp, 0x4]\n\ - adds r0, r5, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - ldr r3, _0802DC6C @ =gExperienceTables\n\ - adds r4, 0x1\n\ - lsls r4, 2\n\ - ldr r2, _0802DC70 @ =gBaseStats\n\ - lsls r1, r0, 3\n\ - subs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r2\n\ - ldrb r1, [r1, 0x13]\n\ - movs r0, 0xCA\n\ - lsls r0, 1\n\ - muls r0, r1\n\ - adds r4, r0\n\ - adds r4, r3\n\ - ldr r1, [r4]\n\ - str r1, [sp]\n\ - mov r2, r10\n\ - lsls r0, r2, 16\n\ - asrs r4, r0, 16\n\ - ldr r0, [sp, 0x4]\n\ - adds r0, r4\n\ - cmp r0, r1\n\ - blt _0802DC7C\n\ - adds r0, r5, 0\n\ - movs r1, 0x19\n\ - mov r2, sp\n\ - bl SetMonData\n\ - adds r0, r5, 0\n\ - bl CalculateMonStats\n\ - ldr r2, [sp]\n\ - add r0, sp, 0x4\n\ - ldrh r0, [r0]\n\ - subs r2, r0\n\ - subs r2, r4, r2\n\ - ldr r4, _0802DC74 @ =gActiveBattler\n\ - ldrb r5, [r4]\n\ - strb r7, [r4]\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - movs r0, 0x1\n\ - movs r1, 0xB\n\ - bl Emitcmd33\n\ - strb r5, [r4]\n\ - ldr r0, _0802DC78 @ =sub_802DCB0\n\ - str r0, [r6]\n\ - b _0802DC98\n\ - .align 2, 0\n\ -_0802DC64: .4byte gHealthboxIDs\n\ -_0802DC68: .4byte gPlayerParty\n\ -_0802DC6C: .4byte gExperienceTables\n\ -_0802DC70: .4byte gBaseStats\n\ -_0802DC74: .4byte gActiveBattler\n\ -_0802DC78: .4byte sub_802DCB0\n\ -_0802DC7C:\n\ - str r0, [sp, 0x4]\n\ - add r2, sp, 0x4\n\ - adds r0, r5, 0\n\ - movs r1, 0x19\n\ - bl SetMonData\n\ - ldr r1, _0802DCA8 @ =gBattleBankFunc\n\ - lsls r0, r7, 2\n\ - adds r0, r1\n\ - ldr r1, _0802DCAC @ =sub_802D90C\n\ - str r1, [r0]\n\ - mov r0, r8\n\ - bl DestroyTask\n\ -_0802DC98:\n\ - add sp, 0x8\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\ -_0802DCA8: .4byte gBattleBankFunc\n\ -_0802DCAC: .4byte sub_802D90C\n"); -} -#endif - -void sub_802DCB0(u8 taskId) -{ - u8 bank = gTasks[taskId].data[2]; - u8 pkmnIndex = gTasks[taskId].data[0]; - - if (IsDoubleBattle() == TRUE && pkmnIndex == gBattlerPartyIndexes[bank ^ 2]) - bank ^= 2; - move_anim_start_t4(bank, bank, bank, 0); - gTasks[taskId].func = sub_802DD10; -} - -void sub_802DD10(u8 taskId) -{ - u8 bank = gTasks[taskId].data[2]; - - if (!ewram17810[bank].unk0_6) - { - u8 pkmnIndex = gTasks[taskId].data[0]; - - GetMonData(&gPlayerParty[pkmnIndex], MON_DATA_LEVEL); // Unused return value - if (IsDoubleBattle() == TRUE && pkmnIndex == gBattlerPartyIndexes[bank ^ 2]) - sub_8045A5C(gHealthboxIDs[bank ^ 2], &gPlayerParty[pkmnIndex], 0); - else - sub_8045A5C(gHealthboxIDs[bank], &gPlayerParty[pkmnIndex], 0); - gTasks[taskId].func = sub_802DDC4; - } -} - -void sub_802DDC4(u8 taskId) -{ - u8 pkmnIndex; - u8 bank; - - pkmnIndex = gTasks[taskId].data[0]; - GetMonData(&gPlayerParty[pkmnIndex], MON_DATA_LEVEL); // Unused return value - bank = gTasks[taskId].data[2]; - gBattleBankFunc[bank] = sub_802D90C; - DestroyTask(taskId); -} - -void sub_802DE10(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].pos1.y + gSprites[gBankSpriteIds[gActiveBattler]].pos2.y > DISPLAY_HEIGHT) - { - u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - - nullsub_9(species); - FreeOamMatrix(gSprites[gBankSpriteIds[gActiveBattler]].oam.matrixNum); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - PlayerBufferExecCompleted(); - } -} - -void sub_802DEAC(void) -{ - if (!ewram17810[gActiveBattler].unk0_6) - { - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - PlayerBufferExecCompleted(); - } -} - -// Duplicate of sub_802D90C -void sub_802DF18(void) -{ - if (gUnknown_03004210.state == 0) - PlayerBufferExecCompleted(); -} - -void sub_802DF30(void) -{ - if (!gPaletteFade.active) - { - u8 r4; - - gBattleBankFunc[gActiveBattler] = sub_802DF88; - r4 = gTasks[gUnknown_0300434C[gActiveBattler]].data[0]; - DestroyTask(gUnknown_0300434C[gActiveBattler]); - sub_8094E20(r4); - } -} - -void sub_802DF88(void) -{ - if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) - { - if (gUnknown_0202E8F4 == 1) - Emitcmd34(1, gUnknown_0202E8F5, gUnknown_02038470); - else - Emitcmd34(1, 6, NULL); - if ((gBattleBufferA[gActiveBattler][1] & 0xF) == 1) - b_link_standby_message(); - PlayerBufferExecCompleted(); - } -} - -void sub_802E004(void) -{ - if (!gPaletteFade.active) - { - gBattleBankFunc[gActiveBattler] = sub_802E03C; - nullsub_14(); - sub_80A6DCC(); - } -} - -void sub_802E03C(void) -{ - if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) - { - Emitcmd35(1, gSpecialVar_ItemId); - PlayerBufferExecCompleted(); - } -} - -void bx_wait_t1(void) -{ - if (!gDoingBattleAnim || !ewram17810[gActiveBattler].unk0_6) - PlayerBufferExecCompleted(); -} - -void bx_blink_t1(void) -{ - u8 spriteId = gBankSpriteIds[gActiveBattler]; - - if (gSprites[spriteId].data[1] == 32) - { - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].invisible = FALSE; - gDoingBattleAnim = 0; - PlayerBufferExecCompleted(); - } - else - { - if (((u16)gSprites[spriteId].data[1] % 4) == 0) - gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data[1]++; - } -} - -void sub_802E12C(s32 a, const u8 *b) -{ - struct ChooseMoveStruct *r4 = (struct ChooseMoveStruct *)&gBattleBufferA[gActiveBattler][4]; - - StringCopy(gDisplayedStringBattle, b); - StringAppend(gDisplayedStringBattle, gMoveNames[r4->moves[a]]); - Text_InitWindow( - &gUnknown_03004210, - gDisplayedStringBattle, - 0x300 + a * 20, - (a & 1) ? 11 : 1, - (a < 2) ? 0x37 : 0x39); - Text_PrintWindow8002F44(&gUnknown_03004210); -} - -void sub_802E1B0(void) -{ - struct ChooseMoveStruct *r4 = (struct ChooseMoveStruct *)&gBattleBufferA[gActiveBattler][4]; - s32 i; - - gUnknown_03004348 = 0; - Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 0x14, 0x3A); - for (i = 0; i < 4; i++) - { - nullsub_7(i); - sub_802E12C(i, BattleText_Format); - if (r4->moves[i] != 0) - gUnknown_03004348++; - } -} - -void sub_802E220(void) -{ - if (gBattleBufferA[gActiveBattler][2] != 1) - { - struct ChooseMoveStruct *r4 = (struct ChooseMoveStruct *)&gBattleBufferA[gActiveBattler][4]; - u8 *str = gDisplayedStringBattle; - - str = StringCopy(str, BattleText_Format); - str[0] = EXT_CTRL_CODE_BEGIN; - str[1] = 0x11; - str[2] = 2; - str += 3; - str[0] = EXT_CTRL_CODE_BEGIN; - str[1] = 0x14; - str[2] = 6; - str += 3; - str = ConvertIntToDecimalStringN(str, r4->pp[gMoveSelectionCursor[gActiveBattler]], 1, 2); - *str++ = CHAR_SLASH; - ConvertIntToDecimalStringN(str, r4->unkC[gMoveSelectionCursor[gActiveBattler]], 1, 2); - Text_InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 0x2A2, 0x19, 0x37); - Text_PrintWindow8002F44(&gUnknown_03004210); - } -} - -extern const u8 BattleText_ForgetMove[]; -extern const u8 gTypeNames[][7]; - -void sub_802E2D4(void) -{ - if (gBattleBufferA[gActiveBattler][2] == 1) - { - Text_FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A); - Text_InitWindow(&gUnknown_03004210, BattleText_ForgetMove, 0x290, 0x13, 0x37); - } - else - { - struct ChooseMoveStruct *r4 = (struct ChooseMoveStruct *)&gBattleBufferA[gActiveBattler][4]; - u8 *str = gDisplayedStringBattle; - - str = StringCopy(str, BattleText_Format); - StringCopy(str, gTypeNames[gBattleMoves[r4->moves[gMoveSelectionCursor[gActiveBattler]]].type]); - Text_FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x39, 0x1C, 0x3A); - Text_InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 0x2C0, 0x17, 0x39); - } - Text_PrintWindow8002F44(&gUnknown_03004210); -} - -const u8 gUnknown_081FAE89[][2] = -{ - { 8, 120}, - {88, 120}, - { 8, 136}, - {88, 136}, -}; - -const u8 gUnknown_081FAE91[][2] = -{ - {144, 120}, - {190, 120}, - {144, 136}, - {190, 136}, - { 72, 72}, - { 32, 90}, - { 80, 80}, - { 80, 88}, -}; - -void sub_802E3B4(u8 a, int unused) -{ - sub_814A958(0x48); - MenuCursor_SetPos814A880(gUnknown_081FAE89[a][0], gUnknown_081FAE89[a][1]); -} - -void nullsub_7(u8 a) -{ -} - -void sub_802E3E4(u8 a, int unused) -{ - sub_814A958(0x2A); - MenuCursor_SetPos814A880(gUnknown_081FAE91[a][0], gUnknown_081FAE91[a][1]); -} - -void nullsub_8(u8 a) -{ -} - -void sub_802E414(void) -{ - SetMainCallback2(ReshowBattleScreenAfterMenu); -} - -void sub_802E424(void) -{ - SetMainCallback2(ReshowBattleScreenAfterMenu); -} - -void sub_802E434(void) -{ - if (!ewram17810[gActiveBattler].unk0_4) - PlayerBufferExecCompleted(); -} - -void sub_802E460(void) -{ - if (!ewram17810[gActiveBattler].unk0_5) - PlayerBufferExecCompleted(); -} - -void b_link_standby_message(void) -{ - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - Text_InitWindow8002EB0(&gUnknown_03004210, BattleText_LinkStandby, 0x90, 2, 15); - } -} - -void PlayerHandleGetAttributes(void) -{ - u8 unkData[0x100]; - u32 offset = 0; - u8 r4; - s32 i; - - if (gBattleBufferA[gActiveBattler][2] == 0) - { - offset += dp01_getattr_by_ch1_for_player_pokemon_(gBattlerPartyIndexes[gActiveBattler], unkData); - } - else - { - r4 = gBattleBufferA[gActiveBattler][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - offset += dp01_getattr_by_ch1_for_player_pokemon_(i, unkData + offset); - r4 >>= 1; - } - } - Emitcmd29(1, offset, unkData); - PlayerBufferExecCompleted(); -} - -// Duplicate of dp01_getattr_by_ch1_for_player_pokemon -u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) -{ - struct BattlePokemon battlePokemon; - struct MovePpInfo moveData; - u8 nickname[20]; - u8 *src; - s16 data16; - u32 data32; - s32 size = 0; - - switch (gBattleBufferA[gActiveBattler][1]) - { - case 0: - battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); - battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) - { - battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); - battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - } - battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); - battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP); - battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); - battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); - battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); - battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); - battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP); - battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); - battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); - battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPEED); - battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); - battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); - battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); - battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY); - battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); - GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); - StringCopy10(battlePokemon.nickname, nickname); - GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - MEMCPY_ALT(&battlePokemon, buffer, sizeof(battlePokemon), size, src); - break; - case 1: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 2: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 3: - for (size = 0; size < 4; size++) - { - moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); - moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - } - moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - MEMCPY_ALT(&moveData, buffer, sizeof(moveData), size, src); - break; - case 4: - case 5: - case 6: - case 7: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - 4); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 8: - for (size = 0; size < 4; size++) - buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - size++; - break; - case 9: - case 10: - case 11: - case 12: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - 9); - size = 1; - break; - case 17: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 18: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 19: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV); - size = 1; - break; - case 20: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV); - size = 1; - break; - case 21: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV); - size = 1; - break; - case 22: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_EV); - size = 1; - break; - case 23: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV); - size = 1; - break; - case 24: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV); - size = 1; - break; - case 25: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); - size = 1; - break; - case 26: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS); - size = 1; - break; - case 27: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION); - size = 1; - break; - case 28: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL); - size = 1; - break; - case 29: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME); - size = 1; - break; - case 30: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL); - size = 1; - break; - case 31: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); - buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - size = 6; - break; - case 32: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - size = 1; - break; - case 33: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - size = 1; - break; - case 34: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - size = 1; - break; - case 35: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); - size = 1; - break; - case 36: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - size = 1; - break; - case 37: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - size = 1; - break; - case 38: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 39: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 40: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 41: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); - size = 1; - break; - case 42: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 43: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 44: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 45: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 46: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPEED); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 47: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 48: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 49: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL); - size = 1; - break; - case 50: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY); - size = 1; - break; - case 51: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE); - size = 1; - break; - case 52: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART); - size = 1; - break; - case 53: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH); - size = 1; - break; - case 54: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN); - size = 1; - break; - case 55: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON); - size = 1; - break; - case 56: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON); - size = 1; - break; - case 57: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON); - size = 1; - break; - case 58: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON); - size = 1; - break; - case 59: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON); - size = 1; - break; - } - return size; -} - -void PlayerHandlecmd1(void) -{ - struct BattlePokemon battleMon; - u8 i; - // TODO: Maybe fix this. Integrating this into MEMSET_ALT is too hard. - u8 *src = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; - u8 *dst; - - MEMSET_ALT(&battleMon + gBattleBufferA[gActiveBattler][1], src[i], gBattleBufferA[gActiveBattler][2], i, dst); - Emitcmd29(1, gBattleBufferA[gActiveBattler][2], dst); - PlayerBufferExecCompleted(); -} - -void PlayerHandleSetAttributes(void) -{ - u8 r4; - u8 i; - - if (gBattleBufferA[gActiveBattler][2] == 0) - { - dp01_setattr_by_ch1_for_player_pokemon(gBattlerPartyIndexes[gActiveBattler]); - } - else - { - r4 = gBattleBufferA[gActiveBattler][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - dp01_setattr_by_ch1_for_player_pokemon(i); - r4 >>= 1; - } - } - PlayerBufferExecCompleted(); -} - -// Duplicate of sub_811EC68 -void dp01_setattr_by_ch1_for_player_pokemon(u8 a) -{ - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; - s32 i; - - switch (gBattleBufferA[gActiveBattler][1]) - { - case 0: - { - u8 iv; - - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &battlePokemon->species); - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, &battlePokemon->pp[i]); - } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); - SetMonData(&gPlayerParty[a], MON_DATA_EXP, &battlePokemon->experience); - iv = battlePokemon->hpIV; - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &iv); - iv = battlePokemon->attackIV; - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &iv); - iv = battlePokemon->defenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &iv); - iv = battlePokemon->speedIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &iv); - iv = battlePokemon->spAttackIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &iv); - iv = battlePokemon->spDefenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &iv); - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &battlePokemon->personality); - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &battlePokemon->status1); - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &battlePokemon->level); - SetMonData(&gPlayerParty[a], MON_DATA_HP, &battlePokemon->hp); - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &battlePokemon->maxHP); - SetMonData(&gPlayerParty[a], MON_DATA_ATK, &battlePokemon->attack); - SetMonData(&gPlayerParty[a], MON_DATA_DEF, &battlePokemon->defense); - SetMonData(&gPlayerParty[a], MON_DATA_SPEED, &battlePokemon->speed); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &battlePokemon->spAttack); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &battlePokemon->spDefense); - } - break; - case 1: - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); - break; - case 2: - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); - break; - case 3: - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, &moveData->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, &moveData->pp[i]); - } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); - break; - case 4: - case 5: - case 6: - case 7: - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - 4, &gBattleBufferA[gActiveBattler][3]); - break; - case 8: - SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); - break; - case 9: - case 10: - case 11: - case 12: - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - 9, &gBattleBufferA[gActiveBattler][3]); - break; - case 17: - SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); - break; - case 18: - SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); - break; - case 19: - SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 20: - SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 21: - SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 22: - SetMonData(&gPlayerParty[a], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 23: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 24: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 25: - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); - break; - case 26: - SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); - break; - case 27: - SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); - break; - case 28: - SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); - break; - case 29: - SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); - break; - case 30: - SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); - break; - case 31: - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); - break; - case 32: - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 33: - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 34: - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 35: - SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 36: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 37: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 38: - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); - break; - case 39: - SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); - break; - case 40: - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); - break; - case 41: - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); - break; - case 42: - SetMonData(&gPlayerParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); - break; - case 43: - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); - break; - case 44: - SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); - break; - case 45: - SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); - break; - case 46: - SetMonData(&gPlayerParty[a], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); - break; - case 47: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); - break; - case 48: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); - break; - case 49: - SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); - break; - case 50: - SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); - break; - case 51: - SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); - break; - case 52: - SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); - break; - case 53: - SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); - break; - case 54: - SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); - break; - case 55: - SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 56: - SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 57: - SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 58: - SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 59: - SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - } - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); -} - -void PlayerHandlecmd3(void) -{ - u8 i; - u8 *dst; - - MEMSET_ALT(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][3 + i], - gBattleBufferA[gActiveBattler][2], i, dst); - PlayerBufferExecCompleted(); -} - -void PlayerHandleLoadPokeSprite(void) -{ - BattleLoadPlayerMonSprite(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gBattleBankFunc[gActiveBattler] = bx_0802E404; -} - -void PlayerHandleSendOutPoke(void) -{ - sub_8032AA8(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; - BattleLoadPlayerMonSprite(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - gActionSelectionCursor[gActiveBattler] = 0; - gMoveSelectionCursor[gActiveBattler] = 0; - sub_802F934(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattleBankFunc[gActiveBattler] = sub_802D798; -} - -void sub_802F934(u8 bank, u8 b) -{ - u16 species; - - sub_8032AA8(bank, b); - gBattlerPartyIndexes[bank] = gBattleBufferA[bank][1]; - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[bank]], MON_DATA_SPECIES); - gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0); - GetMonSpriteTemplate_803C56C(species, GetBattlerPosition(bank)); - gBankSpriteIds[bank] = CreateSprite( - &gUnknown_02024E8C, - GetBattlerSpriteCoord(bank, 2), - sub_8077F68(bank), - GetBattlerSubpriority(bank)); - gSprites[gUnknown_0300434C[bank]].data[1] = gBankSpriteIds[bank]; - gSprites[gBankSpriteIds[bank]].data[0] = bank; - gSprites[gBankSpriteIds[bank]].data[2] = species; - gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; - StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); - gSprites[gBankSpriteIds[bank]].invisible = TRUE; - gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gUnknown_0300434C[bank]].data[0] = StartSendOutMonAnimation(0, 0xFF); -} - -void PlayerHandleReturnPokeToBall(void) -{ - if (gBattleBufferA[gActiveBattler][1] == 0) - { - ewram17810[gActiveBattler].unk4 = 0; - gBattleBankFunc[gActiveBattler] = sub_802FB2C; - } - else - { - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - PlayerBufferExecCompleted(); - } -} - -void sub_802FB2C(void) -{ - switch (ewram17810[gActiveBattler].unk4) - { - case 0: - if (ewram17800[gActiveBattler].substituteSprite) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - ewram17810[gActiveBattler].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBattler].unk0_6) - { - ewram17810[gActiveBattler].unk4 = 0; - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 1); - gBattleBankFunc[gActiveBattler] = sub_802DEAC; - } - } -} - -void PlayerHandleTrainerThrow(void) -{ - s16 r7; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (GetBattlerPosition(gActiveBattler) & 2) - r7 = 16; - else - r7 = -16; - } - else - { - r7 = 0; - } - LoadPlayerTrainerBankSprite(gSaveBlock2.playerGender, gActiveBattler); - GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBattlerPosition(gActiveBattler)); - gBankSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_02024E8C, - r7 + 80, - (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, - GetBattlerSubpriority(gActiveBattler)); - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBankSpriteIds[gActiveBattler]].pos2.x = 240; - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_80313A0; - gBattleBankFunc[gActiveBattler] = sub_802D204; -} - -void PlayerHandleTrainerSlide(void) -{ - LoadPlayerTrainerBankSprite(gSaveBlock2.playerGender, gActiveBattler); - GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBattlerPosition(gActiveBattler)); - gBankSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_02024E8C, - 80, - (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, - 30); - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBankSpriteIds[gActiveBattler]].pos2.x = -96; - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 2; - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_80313A0; - gBattleBankFunc[gActiveBattler] = sub_802D23C; -} - -void PlayerHandleTrainerSlideBack(void) -{ - oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBattler]]); - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 50; - gSprites[gBankSpriteIds[gActiveBattler]].data[2] = -40; - gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], SpriteCallbackDummy); - StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], 1); - gBattleBankFunc[gActiveBattler] = sub_802D274; -} - -void PlayerHandlecmd10(void) -{ - if (ewram17810[gActiveBattler].unk4 == 0) - { - if (ewram17800[gActiveBattler].substituteSprite) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - ewram17810[gActiveBattler].unk4++; - } - else - { - if (ewram17810[gActiveBattler].unk0_6 == 0) - { - ewram17810[gActiveBattler].unk4 = 0; - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - PlaySE12WithPanning(SE_POKE_DEAD, -64); - gSprites[gBankSpriteIds[gActiveBattler]].data[1] = 0; - gSprites[gBankSpriteIds[gActiveBattler]].data[2] = 5; - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_80105EC; - gBattleBankFunc[gActiveBattler] = sub_802DE10; - } - } -} - -void PlayerHandlecmd11(void) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, RGB(0, 0, 0)); - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd12(void) -{ - ewram17840.unk8 = 4; - gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBattler, gActiveBattler, GetBattlerAtPosition(1), 3); - gBattleBankFunc[gActiveBattler] = bx_wait_t1; -} - -void PlayerHandleBallThrow(void) -{ - u8 var = gBattleBufferA[gActiveBattler][1]; - - ewram17840.unk8 = var; - gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBattler, gActiveBattler, GetBattlerAtPosition(1), 3); - gBattleBankFunc[gActiveBattler] = bx_wait_t1; -} - -void PlayerHandlePuase(void) -{ - u8 var = gBattleBufferA[gActiveBattler][1]; - - // WTF is this?? - while (var != 0) - var--; - - PlayerBufferExecCompleted(); -} - -void PlayerHandleMoveAnimation(void) -{ - if (!mplay_80342A4(gActiveBattler)) - { - u16 r0 = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; - gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; - if (sub_8031720(r0, gAnimMoveTurn) != 0) - { - // Dead code. sub_8031720 always returns 0. - PlayerBufferExecCompleted(); - } - else - { - ewram17810[gActiveBattler].unk4 = 0; - gBattleBankFunc[gActiveBattler] = sub_8030190; - } - } -} - -void sub_8030190(void) -{ - u16 r4 = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - u8 r7 = gBattleBufferA[gActiveBattler][11]; - - switch (ewram17810[gActiveBattler].unk4) - { - case 0: - if (ewram17800[gActiveBattler].substituteSprite == 1 && ewram17800[gActiveBattler].unk0_3 == 0) - { - ewram17800[gActiveBattler].unk0_3 = 1; - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - } - ewram17810[gActiveBattler].unk4 = 1; - break; - case 1: - if (ewram17810[gActiveBattler].unk0_6 == 0) - { - sub_80326EC(0); - DoMoveAnim(r4); - ewram17810[gActiveBattler].unk4 = 2; - } - break; - case 2: - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - sub_80326EC(1); - if (ewram17800[gActiveBattler].substituteSprite == 1 && r7 < 2) - { - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 6); - ewram17800[gActiveBattler].unk0_3 = 0; - } - ewram17810[gActiveBattler].unk4 = 3; - } - break; - case 3: - if (ewram17810[gActiveBattler].unk0_6 == 0) - { - sub_8031F24(); - sub_80324BC(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - ewram17810[gActiveBattler].unk4 = 0; - PlayerBufferExecCompleted(); - } - break; - } -} - -void PlayerHandlePrintString(void) -{ - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBattler][2]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); - gBattleBankFunc[gActiveBattler] = sub_802DF18; -} - -void PlayerHandlePrintStringPlayerOnly(void) -{ - if (GetBattlerSide(gActiveBattler) == 0) - PlayerHandlePrintString(); - else - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd18(void) -{ - int r4; - - gBattle_BG0_X = 0; - gBattle_BG0_Y = 160; - Text_FillWindowRect(&gUnknown_03004210, 10, 2, 15, 27, 18); - Text_FillWindowRect(&gUnknown_03004210, 10, 2, 35, 16, 38); - - gBattleBankFunc[gActiveBattler] = sub_802C098; - - Text_InitWindow(&gUnknown_03004210, BattleText_MenuOptions, 400, 18, 35); - Text_PrintWindow8002F44(&gUnknown_03004210); - MenuCursor_Create814A5C0(0, 0xFFFF, 12, 11679, 0); - - for (r4 = 0; r4 < 4; r4++) - nullsub_8(r4); - - sub_802E3E4(gActionSelectionCursor[gActiveBattler], 0); - - StrCpyDecodeToDisplayedStringBattle(BattleText_OtherMenu); - Text_InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_803037C_TILE_DATA_OFFSET, 2, 35); - Text_PrintWindow8002F44(&gUnknown_03004210); -} - -void PlayerHandlecmd19() -{ -} - -void PlayerHandlecmd20(void) -{ - MenuCursor_Create814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); - sub_80304A8(); - gBattleBankFunc[gActiveBattler] = sub_802C68C; -} - -void sub_80304A8(void) -{ - gBattle_BG0_X = 0; - gBattle_BG0_Y = 320; - sub_802E1B0(); - gUnknown_03004344 = 0xFF; - sub_802E3B4(gMoveSelectionCursor[gActiveBattler], 0); - if (gBattleBufferA[gActiveBattler][2] != 1) - { - Text_InitWindow(&gUnknown_03004210, BattleText_PP, 656, 23, 55); - Text_PrintWindow8002F44(&gUnknown_03004210); - } - sub_802E220(); - sub_802E2D4(); -} - -void PlayerHandleOpenBag(void) -{ - s32 i; - - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); - gBattleBankFunc[gActiveBattler] = sub_802E004; - gBankInMenu = gActiveBattler; - for (i = 0; i < 3; i++) - gUnknown_02038470[i] = gBattleBufferA[gActiveBattler][1 + i]; -} - -void PlayerHandlecmd22(void) -{ - s32 i; - - gUnknown_0300434C[gActiveBattler] = CreateTask(TaskDummy, 0xFF); - gTasks[gUnknown_0300434C[gActiveBattler]].data[0] = gBattleBufferA[gActiveBattler][1] & 0xF; - ewram16054 = gBattleBufferA[gActiveBattler][1] >> 4; - EWRAM_1609D = gBattleBufferA[gActiveBattler][2]; - ewram160C0 = gBattleBufferA[gActiveBattler][3]; - for (i = 0; i < 3; i++) - gUnknown_02038470[i] = gBattleBufferA[gActiveBattler][4 + i]; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); - gBattleBankFunc[gActiveBattler] = sub_802DF30; - gBankInMenu = gActiveBattler; -} - -void PlayerHandlecmd23(void) -{ - BattleStopLowHpSound(); - BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, RGB(0, 0, 0)); - PlayerBufferExecCompleted(); -} - -void PlayerHandleHealthBarUpdate(void) -{ - s16 r7; - - load_gfxc_health_bar(0); - r7 = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - if (r7 != 0x7FFF) - { - u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); - u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); - - sub_8043D84(gActiveBattler, gHealthboxIDs[gActiveBattler], maxHP, curHP, r7); - } - else - { - u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); - - sub_8043D84(gActiveBattler, gHealthboxIDs[gActiveBattler], maxHP, 0, r7); - sub_80440EC(gHealthboxIDs[gActiveBattler], 0, 0); - } - gBattleBankFunc[gActiveBattler] = bx_t1_healthbar_update; -} - -void PlayerHandleExpBarUpdate(void) -{ - u8 r7 = gBattleBufferA[gActiveBattler][1]; - - if (GetMonData(&gPlayerParty[r7], MON_DATA_LEVEL) >= 100) - { - PlayerBufferExecCompleted(); - } - else - { - u16 r4; - u8 taskId; - - load_gfxc_health_bar(1); - GetMonData(&gPlayerParty[r7], MON_DATA_SPECIES); // unused return value - r4 = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - taskId = CreateTask(sub_802D924, 10); - gTasks[taskId].data[0] = r7; - gTasks[taskId].data[1] = r4; - gTasks[taskId].data[2] = gActiveBattler; - gBattleBankFunc[gActiveBattler] = nullsub_91; - } -} - -void PlayerHandleStatusIconUpdate(void) -{ - if (!mplay_80342A4(gActiveBattler)) - { - sub_8045A5C(gHealthboxIDs[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], 9); - ewram17810[gActiveBattler].unk0_4 = 0; - gBattleBankFunc[gActiveBattler] = sub_802E434; - } -} - -void PlayerHandleStatusAnimation(void) -{ - if (!mplay_80342A4(gActiveBattler)) - { - move_anim_start_t2_for_situation( - gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); - gBattleBankFunc[gActiveBattler] = sub_802E434; - } -} - -void PlayerHandleStatusXor(void) -{ - u8 val = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_STATUS) ^ gBattleBufferA[gActiveBattler][1]; - - SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_STATUS, &val); - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd29(void) -{ - PlayerBufferExecCompleted(); -} - -void PlayerHandleDMATransfer(void) -{ - u32 val1 = gBattleBufferA[gActiveBattler][1] - | (gBattleBufferA[gActiveBattler][2] << 8) - | (gBattleBufferA[gActiveBattler][3] << 16) - | (gBattleBufferA[gActiveBattler][4] << 24); - u16 val2 = gBattleBufferA[gActiveBattler][5] | (gBattleBufferA[gActiveBattler][6] << 8); - - Dma3CopyLarge16_(&gBattleBufferA[gActiveBattler][7], (u8 *)val1, val2); - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd31(void) -{ - PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd32(void) -{ - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd33(void) -{ - Emitcmd33(1, 0, 0); - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd34(void) -{ - Emitcmd34(1, 0, 0); - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd35(void) -{ - Emitcmd35(1, 0); - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd36(void) -{ - Emitcmd36(1, 0); - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd37(void) -{ - gUnknown_020238C8.unk0_0 = 0; - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd38(void) -{ - gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBattler][1]; - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd39(void) -{ - gUnknown_020238C8.unk0_7 = 0; - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd40(void) -{ - gUnknown_020238C8.unk0_7 ^= 1; - PlayerBufferExecCompleted(); -} - -void PlayerHandleHitAnimation(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].invisible == TRUE) - { - PlayerBufferExecCompleted(); - } - else - { - gDoingBattleAnim = 1; - gSprites[gBankSpriteIds[gActiveBattler]].data[1] = 0; - sub_8047858(gActiveBattler); - gBattleBankFunc[gActiveBattler] = bx_blink_t1; - } -} - -void PlayerHandlecmd42(void) -{ - PlayerBufferExecCompleted(); -} - -void PlayerHandleEffectivenessSound(void) -{ - s8 pan; - - if (GetBattlerSide(gActiveBattler) == 0) - pan = -64; - else - pan = 63; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd44(void) -{ - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - PlayerBufferExecCompleted(); -} - -void PlayerHandleFaintingCry(void) -{ - u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - - PlayCry3(species, -25, 5); - PlayerBufferExecCompleted(); -} - -void PlayerHandleIntroSlide(void) -{ - StartBattleIntroAnim(gBattleBufferA[gActiveBattler][1]); - gUnknown_02024DE8 |= 1; - PlayerBufferExecCompleted(); -} - -void PlayerHandleTrainerBallThrow(void) -{ - u8 paletteNum; - u8 taskId; - - oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBattler]]); - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 50; - gSprites[gBankSpriteIds[gActiveBattler]].data[2] = -40; - gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - gSprites[gBankSpriteIds[gActiveBattler]].data[5] = gActiveBattler; - StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], sub_8030E38); - StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], 1); - paletteNum = AllocSpritePalette(0xD6F8); - LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2.playerGender].data, 0x100 + paletteNum * 16, 32); - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; - taskId = CreateTask(task05_08033660, 5); - gTasks[taskId].data[0] = gActiveBattler; - if (ewram17810[gActiveBattler].unk0_0) - gTasks[gUnknown_02024E68[gActiveBattler]].func = sub_8044CA0; - ewram17810[4].unk9 |= 1; - gBattleBankFunc[gActiveBattler] = nullsub_91; -} - -void sub_8030E38(struct Sprite *sprite) -{ - u8 r4 = sprite->data[5]; - - FreeSpriteOamMatrix(sprite); - FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); - DestroySprite(sprite); - BattleLoadPlayerMonSprite(&gPlayerParty[gBattlerPartyIndexes[r4]], r4); - StartSpriteAnim(&gSprites[gBankSpriteIds[r4]], 0); -} - -void task05_08033660(u8 taskId) -{ - if (gTasks[taskId].data[1] < 31) - { - gTasks[taskId].data[1]++; - } - else - { - u8 savedActiveBank = gActiveBattler; - - gActiveBattler = gTasks[taskId].data[0]; - if (!IsDoubleBattle() || (gBattleTypeFlags & 0x40)) - { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_802F934(gActiveBattler, 0); - } - else - { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_802F934(gActiveBattler, 0); - gActiveBattler ^= 2; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - BattleLoadPlayerMonSprite(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_802F934(gActiveBattler, 0); - gActiveBattler ^= 2; - } - gBattleBankFunc[gActiveBattler] = sub_802D500; - gActiveBattler = savedActiveBank; - DestroyTask(taskId); - } -} - -void PlayerHandlecmd48(void) -{ - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == 0) - { - PlayerBufferExecCompleted(); - } - else - { - ewram17810[gActiveBattler].unk0_0 = 1; - gUnknown_02024E68[gActiveBattler] = sub_8044804(gActiveBattler, (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); - ewram17810[gActiveBattler].unk5 = 0; - if (gBattleBufferA[gActiveBattler][2] != 0) - ewram17810[gActiveBattler].unk5 = 0x5D; - gBattleBankFunc[gActiveBattler] = sub_8031064; - } -} - -void sub_8031064(void) -{ - if (ewram17810[gActiveBattler].unk5++ > 0x5C) - { - ewram17810[gActiveBattler].unk5 = 0; - PlayerBufferExecCompleted(); - } -} - -void PlayerHandlecmd49(void) -{ - if (ewram17810[gActiveBattler].unk0_0) - gTasks[gUnknown_02024E68[gActiveBattler]].func = sub_8044CA0; - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd50(void) -{ - dp11b_obj_free(gActiveBattler, 1); - dp11b_obj_free(gActiveBattler, 0); - PlayerBufferExecCompleted(); -} - -void PlayerHandleSpriteInvisibility(void) -{ - if (IsBankSpritePresent(gActiveBattler)) - { - gSprites[gBankSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; - sub_8031F88(gActiveBattler); - } - PlayerBufferExecCompleted(); -} - -void PlayerHandleBattleAnimation(void) -{ - if (!mplay_80342A4(gActiveBattler)) - { - u8 val2 = gBattleBufferA[gActiveBattler][1]; - u16 val = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - - if (move_anim_start_t3(gActiveBattler, gActiveBattler, gActiveBattler, val2, val)) - PlayerBufferExecCompleted(); - else - gBattleBankFunc[gActiveBattler] = sub_802E460; - } -} - -void PlayerHandleLinkStandbyMsg(void) -{ - switch (gBattleBufferA[gActiveBattler][1]) - { - case 0: - b_link_standby_message(); - // fall through - case 1: - dp11b_obj_free(gActiveBattler, 1); - dp11b_obj_free(gActiveBattler, 0); - break; - case 2: - b_link_standby_message(); - break; - } - PlayerBufferExecCompleted(); -} - -void PlayerHandleResetActionMoveSelection(void) -{ - switch (gBattleBufferA[gActiveBattler][1]) - { - case 0: - gActionSelectionCursor[gActiveBattler] = 0; - gMoveSelectionCursor[gActiveBattler] = 0; - break; - case 1: - gActionSelectionCursor[gActiveBattler] = 0; - break; - case 2: - gMoveSelectionCursor[gActiveBattler] = 0; - break; - } - PlayerBufferExecCompleted(); -} - -void PlayerHandlecmd55(void) -{ - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; - FadeOutMapMusic(5); - BeginFastPaletteFade(3); - PlayerBufferExecCompleted(); - gBattleBankFunc[gActiveBattler] = sub_802D18C; -} - -void PlayerHandlecmd56(void) -{ -} diff --git a/src/battle/battle_controller_safari.c b/src/battle/battle_controller_safari.c deleted file mode 100644 index e547c4a3c..000000000 --- a/src/battle/battle_controller_safari.c +++ /dev/null @@ -1,720 +0,0 @@ -#include "global.h" -#include "battle_anim_81258BC.h" -#include "battle.h" -#include "battle_interface.h" -#include "battle_message.h" -#include "data2.h" -#include "link.h" -#include "main.h" -#include "menu_cursor.h" -#include "palette.h" -#include "rom3.h" -#include "constants/songs.h" -#include "sound.h" -#include "text.h" -#include "util.h" -#include "ewram.h" - -extern struct Window gUnknown_03004210; -extern u8 gDisplayedStringBattle[]; -extern u8 gActionSelectionCursor[]; - -extern const u8 BattleText_PlayerMenu[]; -extern u8 gActiveBattler; -extern const u8 BattleText_MenuOptionsSafari[]; - -extern void *gBattleBankFunc[]; -extern u8 gBattleBufferA[][0x200]; -extern bool8 gDoingBattleAnim; -extern u8 gBankSpriteIds[]; -extern struct SpriteTemplate gUnknown_02024E8C; -extern u16 gBattleTypeFlags; -extern u32 gBattleExecBuffer; -extern u16 gSpecialVar_ItemId; -extern MainCallback gPreBattleCallback1; -extern u8 gBankInMenu; -extern u8 gHealthboxIDs[]; -extern u16 gBattlerPartyIndexes[]; -extern u16 gUnknown_02024DE8; -extern u8 gBattleOutcome; - -extern u8 GetBattlerSide(u8); -extern u8 GetBattlerAtPosition(u8); -extern u8 GetBattlerPosition(u8); -extern void LoadPlayerTrainerBankSprite(); -extern u8 GetBattlerSubpriority(); -extern void sub_80313A0(struct Sprite *); -extern void sub_810BADC(void); -extern void sub_8045A5C(); -extern void StartBattleIntroAnim(); -extern void sub_804777C(); -extern void sub_8043DFC(); -extern bool8 move_anim_start_t3(); - -#if ENGLISH -#define SUB_812BB10_TILE_DATA_OFFSET 440 -#elif GERMAN -#define SUB_812BB10_TILE_DATA_OFFSET 444 -#endif - -// this file's functions -void SafariHandleGetAttributes(void); -void SafariHandlecmd1(void); -void SafariHandleSetAttributes(void); -void SafariHandlecmd3(void); -void SafariHandleLoadPokeSprite(void); -void SafariHandleSendOutPoke(void); -void SafariHandleReturnPokeToBall(void); -void SafariHandleTrainerThrow(void); -void SafariHandleTrainerSlide(void); -void SafariHandleTrainerSlideBack(void); -void SafariHandlecmd10(void); -void SafariHandlecmd11(void); -void SafariHandlecmd12(void); -void SafariHandleBallThrow(void); -void SafariHandlePuase(void); -void SafariHandleMoveAnimation(void); -void SafariHandlePrintString(void); -void SafariHandlePrintStringPlayerOnly(void); -void SafariHandlecmd18(void); -void SafariHandlecmd19(void); -void SafariHandlecmd20(void); -void SafariHandleOpenBag(void); -void SafariHandlecmd22(void); -void SafariHandlecmd23(void); -void SafariHandleHealthBarUpdate(void); -void SafariHandleExpBarUpdate(void); -void SafariHandleStatusIconUpdate(void); -void SafariHandleStatusAnimation(void); -void SafariHandleStatusXor(void); -void SafariHandlecmd29(void); -void SafariHandleDMATransfer(void); -void SafariHandlecmd31(void); -void SafariHandlecmd32(void); -void SafariHandlecmd33(void); -void SafariHandlecmd34(void); -void SafariHandlecmd35(void); -void SafariHandlecmd36(void); -void SafariHandlecmd37(void); -void SafariHandlecmd38(void); -void SafariHandlecmd39(void); -void SafariHandlecmd40(void); -void SafariHandleHitAnimation(void); -void SafariHandlecmd42(void); -void SafariHandleEffectivenessSound(void); -void SafariHandlecmd44(void); -void SafariHandleFaintingCry(void); -void SafariHandleIntroSlide(void); -void SafariHandleTrainerBallThrow(void); -void SafariHandlecmd48(void); -void SafariHandlecmd49(void); -void SafariHandlecmd50(void); -void SafariHandleSpriteInvisibility(void); -void SafariHandleBattleAnimation(void); -void SafariHandleLinkStandbyMsg(void); -void SafariHandleResetActionMoveSelection(void); -void SafariHandlecmd55(void); -void SafariHandlecmd56(void); - -// const data -typedef void (*BattleBufferCmd) (void); -const BattleBufferCmd gSafariBufferCommands[] = -{ - SafariHandleGetAttributes, - SafariHandlecmd1, - SafariHandleSetAttributes, - SafariHandlecmd3, - SafariHandleLoadPokeSprite, - SafariHandleSendOutPoke, - SafariHandleReturnPokeToBall, - SafariHandleTrainerThrow, - SafariHandleTrainerSlide, - SafariHandleTrainerSlideBack, - SafariHandlecmd10, - SafariHandlecmd11, - SafariHandlecmd12, - SafariHandleBallThrow, - SafariHandlePuase, - SafariHandleMoveAnimation, - SafariHandlePrintString, - SafariHandlePrintStringPlayerOnly, - SafariHandlecmd18, - SafariHandlecmd19, - SafariHandlecmd20, - SafariHandleOpenBag, - SafariHandlecmd22, - SafariHandlecmd23, - SafariHandleHealthBarUpdate, - SafariHandleExpBarUpdate, - SafariHandleStatusIconUpdate, - SafariHandleStatusAnimation, - SafariHandleStatusXor, - SafariHandlecmd29, - SafariHandleDMATransfer, - SafariHandlecmd31, - SafariHandlecmd32, - SafariHandlecmd33, - SafariHandlecmd34, - SafariHandlecmd35, - SafariHandlecmd36, - SafariHandlecmd37, - SafariHandlecmd38, - SafariHandlecmd39, - SafariHandlecmd40, - SafariHandleHitAnimation, - SafariHandlecmd42, - SafariHandleEffectivenessSound, - SafariHandlecmd44, - SafariHandleFaintingCry, - SafariHandleIntroSlide, - SafariHandleTrainerBallThrow, - SafariHandlecmd48, - SafariHandlecmd49, - SafariHandlecmd50, - SafariHandleSpriteInvisibility, - SafariHandleBattleAnimation, - SafariHandleLinkStandbyMsg, - SafariHandleResetActionMoveSelection, - SafariHandlecmd55, - SafariHandlecmd56, -}; -// code - -void SafariBufferExecCompleted(void); -void bx_wait_t6(void); -void sub_812B65C(void); -void SafariBufferRunCommand(void); -void sub_812B758(void); - -void unref_sub_812B464(void) -{ -} - -void SetBankFuncToSafariBufferRunCommand(void) -{ - gBattleBankFunc[gActiveBattler] = SafariBufferRunCommand; -} - -void SafariBufferRunCommand(void) -{ - if (gBattleExecBuffer & gBitTable[gActiveBattler]) - { - if (gBattleBufferA[gActiveBattler][0] < 0x39) - gSafariBufferCommands[gBattleBufferA[gActiveBattler][0]](); - else - SafariBufferExecCompleted(); - } -} - -void bx_battle_menu_t6_2(void) -{ - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - DestroyMenuCursor(); - - // Useless switch statement. - switch (gActionSelectionCursor[gActiveBattler]) - { - case 0: - Emitcmd33(1, 5, 0); - break; - case 1: - Emitcmd33(1, 6, 0); - break; - case 2: - Emitcmd33(1, 7, 0); - break; - case 3: - Emitcmd33(1, 8, 0); - break; - } - SafariBufferExecCompleted(); - } - else if (gMain.newKeys & DPAD_LEFT) - { - if (gActionSelectionCursor[gActiveBattler] & 1) - { - PlaySE(SE_SELECT); - nullsub_8(gActionSelectionCursor[gActiveBattler]); - gActionSelectionCursor[gActiveBattler] ^= 1; - sub_802E3E4(gActionSelectionCursor[gActiveBattler], 0); - } - } - else if (gMain.newKeys & DPAD_RIGHT) - { - if (!(gActionSelectionCursor[gActiveBattler] & 1)) - { - PlaySE(SE_SELECT); - nullsub_8(gActionSelectionCursor[gActiveBattler]); - gActionSelectionCursor[gActiveBattler] ^= 1; - sub_802E3E4(gActionSelectionCursor[gActiveBattler], 0); - } - } - else if (gMain.newKeys & DPAD_UP) - { - if (gActionSelectionCursor[gActiveBattler] & 2) - { - PlaySE(SE_SELECT); - nullsub_8(gActionSelectionCursor[gActiveBattler]); - gActionSelectionCursor[gActiveBattler] ^= 2; - sub_802E3E4(gActionSelectionCursor[gActiveBattler], 0); - } - } - else if (gMain.newKeys & DPAD_DOWN) - { - if (!(gActionSelectionCursor[gActiveBattler] & 2)) - { - PlaySE(SE_SELECT); - nullsub_8(gActionSelectionCursor[gActiveBattler]); - gActionSelectionCursor[gActiveBattler] ^= 2; - sub_802E3E4(gActionSelectionCursor[gActiveBattler], 0); - } - } -#if DEBUG - else if (gMain.newKeys & R_BUTTON) - { - if (!ewram17810[gActiveBattler].unk0_5) - move_anim_start_t3(gActiveBattler, gActiveBattler, gActiveBattler, 4, 0); - } - else if (gMain.newKeys & START_BUTTON) - { - sub_804454C(); - } -#endif -} - -void sub_812B65C(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - SafariBufferExecCompleted(); -} - -void sub_812B694(void) -{ - if (gUnknown_03004210.state == 0) - SafariBufferExecCompleted(); -} - -void sub_812B6AC(void) -{ - if (!gPaletteFade.active) - { - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(gMain.savedCallback); - } -} - -void bx_wait_t6(void) -{ - if (!gDoingBattleAnim || !ewram17810[gActiveBattler].unk0_6) - SafariBufferExecCompleted(); -} - -void sub_812B724(void) -{ - if (!gPaletteFade.active) - { - gBattleBankFunc[gActiveBattler] = sub_812B758; - sub_810BADC(); - } -} - -void sub_812B758(void) -{ - if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) - { - Emitcmd35(1, gSpecialVar_ItemId); - SafariBufferExecCompleted(); - } -} - -void sub_812B794(void) -{ - if (!ewram17810[gActiveBattler].unk0_5) - SafariBufferExecCompleted(); -} - -void SafariBufferExecCompleted(void) -{ - gBattleBankFunc[gActiveBattler] = SafariBufferRunCommand; - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - u8 playerId = GetMultiplayerId(); - - PrepareBufferDataTransferLink(2, 4, &playerId); - gBattleBufferA[gActiveBattler][0] = 0x38; - } - else - { - gBattleExecBuffer &= ~gBitTable[gActiveBattler]; - } -} - -void unref_sub_812B838(void) -{ - if (!ewram17810[gActiveBattler].unk0_4) - SafariBufferExecCompleted(); -} - -void SafariHandleGetAttributes(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd1(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleSetAttributes(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd3(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleLoadPokeSprite(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleSendOutPoke(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleReturnPokeToBall(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleTrainerThrow(void) -{ - LoadPlayerTrainerBankSprite(gSaveBlock2.playerGender, gActiveBattler); - GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBattlerPosition(gActiveBattler)); - gBankSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_02024E8C, - 80, - (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, - 30); - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBankSpriteIds[gActiveBattler]].pos2.x = 240; - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_80313A0; - gBattleBankFunc[gActiveBattler] = sub_812B65C; -} - -void SafariHandleTrainerSlide(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleTrainerSlideBack(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd10(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd11(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd12(void) -{ - ewram17840.unk8 = 4; - gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBattler, gActiveBattler, GetBattlerAtPosition(1), 4); - gBattleBankFunc[gActiveBattler] = bx_wait_t6; -} - -void SafariHandleBallThrow(void) -{ - u8 var = gBattleBufferA[gActiveBattler][1]; - - ewram17840.unk8 = var; - gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBattler, gActiveBattler, GetBattlerAtPosition(1), 4); - gBattleBankFunc[gActiveBattler] = bx_wait_t6; -} - -// TODO: spell Pause correctly -void SafariHandlePuase(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleMoveAnimation(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlePrintString(void) -{ - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBattler][2]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gBattleBankFunc[gActiveBattler] = sub_812B694; -} - -void SafariHandlePrintStringPlayerOnly(void) -{ - if (GetBattlerSide(gActiveBattler) == 0) - SafariHandlePrintString(); - else - SafariBufferExecCompleted(); -} - -void SafariHandlecmd18(void) -{ - int i; - - gBattle_BG0_X = 0; - gBattle_BG0_Y = 160; - gUnknown_03004210.paletteNum = 0; - Text_FillWindowRectDefPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); - Text_FillWindowRectDefPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); - gBattleBankFunc[gActiveBattler] = bx_battle_menu_t6_2; - - Text_InitWindow(&gUnknown_03004210, BattleText_MenuOptionsSafari, 400, 18, 35); - Text_PrintWindow8002F44(&gUnknown_03004210); - MenuCursor_Create814A5C0(0, 0xFFFF, 12, 11679, 0); - - for (i = 0; i < 4; i++) - nullsub_8(i); - - sub_802E3E4(gActionSelectionCursor[gActiveBattler], 0); - StrCpyDecodeToDisplayedStringBattle(BattleText_PlayerMenu); - - Text_InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_812BB10_TILE_DATA_OFFSET, 2, 35); - Text_PrintWindow8002F44(&gUnknown_03004210); -} - -void SafariHandlecmd19(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd20(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleOpenBag(void) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); - gBattleBankFunc[gActiveBattler] = sub_812B724; - gBankInMenu = gActiveBattler; -} - -void SafariHandlecmd22(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd23(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleHealthBarUpdate(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleExpBarUpdate(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleStatusIconUpdate(void) -{ - sub_8045A5C(gHealthboxIDs[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], 11); - SafariBufferExecCompleted(); -} - -void SafariHandleStatusAnimation(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleStatusXor(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd29(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleDMATransfer(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd31(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd32(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd33(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd34(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd35(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd36(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd37(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd38(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd39(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd40(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleHitAnimation(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd42(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleEffectivenessSound(void) -{ - s8 pan; - - if (GetBattlerSide(gActiveBattler) == 0) - pan = -64; - else - pan = 63; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); - SafariBufferExecCompleted(); -} - -void SafariHandlecmd44(void) -{ - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - SafariBufferExecCompleted(); -} - -void SafariHandleFaintingCry(void) -{ - u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - - PlayCry1(species, 25); - SafariBufferExecCompleted(); -} - -void SafariHandleIntroSlide(void) -{ - StartBattleIntroAnim(gBattleBufferA[gActiveBattler][1]); - gUnknown_02024DE8 |= 1; - SafariBufferExecCompleted(); -} - -void SafariHandleTrainerBallThrow(void) -{ - sub_8045A5C(gHealthboxIDs[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], 10); - sub_804777C(gActiveBattler); - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - SafariBufferExecCompleted(); -} - -void SafariHandlecmd48(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd49(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd50(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleSpriteInvisibility(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleBattleAnimation(void) -{ - u8 r3 = gBattleBufferA[gActiveBattler][1]; - u16 r4 = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - - if (move_anim_start_t3(gActiveBattler, gActiveBattler, gActiveBattler, r3, r4) != 0) - SafariBufferExecCompleted(); - else - gBattleBankFunc[gActiveBattler] = sub_812B794; -} - -void SafariHandleLinkStandbyMsg(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandleResetActionMoveSelection(void) -{ - SafariBufferExecCompleted(); -} - -void SafariHandlecmd55(void) -{ - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; - FadeOutMapMusic(5); - BeginFastPaletteFade(3); - SafariBufferExecCompleted(); - if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_WILD)) - gBattleBankFunc[gActiveBattler] = sub_812B6AC; -} - -void SafariHandlecmd56(void) -{ -} diff --git a/src/battle/battle_controller_wally.c b/src/battle/battle_controller_wally.c deleted file mode 100644 index fa8b2a63b..000000000 --- a/src/battle/battle_controller_wally.c +++ /dev/null @@ -1,1605 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_anim.h" -#include "battle_anim_813F0F4.h" -#include "battle_interface.h" -#include "battle_message.h" -#include "data2.h" -#include "link.h" -#include "main.h" -#include "menu_cursor.h" -#include "palette.h" -#include "pokemon.h" -#include "rom3.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "item_use.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "util.h" -#include "ewram.h" - -struct MovePpInfo -{ - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -extern u8 gActiveBattler; -extern void (*gBattleBankFunc[])(void); -extern u32 gBattleExecBuffer; -extern u8 gBattleBufferA[][0x200]; -extern u8 gBankSpriteIds[]; -extern MainCallback gPreBattleCallback1; -extern bool8 gDoingBattleAnim; -extern u16 gBattlerPartyIndexes[]; -extern u8 gHealthboxIDs[]; -extern u16 gBattleTypeFlags; -extern u16 gAnimMovePower; -extern s32 gAnimMoveDmg; -extern u8 gAnimFriendship; -extern u16 gWeatherMoveAnim; -extern u32 gTransformedPersonalities[]; -extern void (*gAnimScriptCallback)(void); -extern bool8 gAnimScriptActive; -extern u8 gDisplayedStringBattle[]; -extern u8 gBankInMenu; -extern u8 gBattleMonForms[]; -extern u8 gBattleOutcome; -extern u16 gUnknown_02024DE8; -extern u8 gUnknown_02024E68[]; -extern struct SpriteTemplate gUnknown_02024E8C; -extern u8 gAnimMoveTurn; -extern struct Window gUnknown_03004210; -extern u8 gUnknown_0300434C[]; -extern const u8 BattleText_WallyMenu[]; -extern const u8 BattleText_MenuOptions[]; - -// TODO: include rom3.h when my other PR gets merged -extern void Emitcmd33(u8, u8, u16); -extern void Emitcmd35(u8, u16); - -extern void nullsub_14(void); -extern void PrepareBagForWallyTutorial(void); -extern void sub_8045A5C(); -extern void sub_804777C(); -extern void sub_8043DFC(); -extern bool8 IsDoubleBattle(void); -extern void c3_0802FDF4(u8); -extern void PlayerHandlecmd1(void); -extern void LoadPlayerTrainerBankSprite(); -extern u8 GetBattlerPosition(u8); -extern void sub_80313A0(struct Sprite *); -extern u8 GetBattlerAtPosition(u8); -extern u8 sub_8031720(); -extern void DoMoveAnim(); -extern void sub_80326EC(); -extern void sub_8031F24(void); -extern void sub_80324BC(); -extern void BufferStringBattle(); -extern u8 GetBattlerSide(u8); -extern void sub_80304A8(void); -extern void sub_8047858(); -extern void StartBattleIntroAnim(); -extern void oamt_add_pos2_onto_pos1(); -extern void StartAnimLinearTranslation(struct Sprite *); -extern void sub_8030E38(struct Sprite *); -extern void StoreSpriteCallbackInData(); -extern u8 StartSendOutMonAnimation(); -extern u8 GetBattlerSpriteCoord(); -extern u8 sub_8077F68(); -extern u8 GetBattlerSubpriority(); -extern void sub_80312F0(struct Sprite *); -extern bool8 move_anim_start_t3(); - -// this file's functions - -void WallyBufferRunCommand(void); -void sub_81374FC(void); -void sub_81376B8(void); -void WallyBufferExecCompleted(void); -u32 sub_8137A84(u8, u8 *); -void sub_8138294(u8); -void sub_81390D0(void); -void sub_8139A2C(u8); - -void WallyHandleGetAttributes(void); -void WallyHandlecmd1(void); -void WallyHandleSetAttributes(void); -void WallyHandlecmd3(void); -void WallyHandleLoadPokeSprite(void); -void WallyHandleSendOutPoke(void); -void WallyHandleReturnPokeToBall(void); -void WallyHandleTrainerThrow(void); -void WallyHandleTrainerSlide(void); -void WallyHandleTrainerSlideBack(void); -void WallyHandlecmd10(void); -void WallyHandlecmd11(void); -void WallyHandlecmd12(void); -void WallyHandleBallThrow(void); -void WallyHandlePuase(void); -void WallyHandleMoveAnimation(void); -void WallyHandlePrintString(void); -void WallyHandlePrintStringPlayerOnly(void); -void WallyHandlecmd18(void); -void WallyHandlecmd19(void); -void WallyHandlecmd20(void); -void WallyHandleOpenBag(void); -void WallyHandlecmd22(void); -void WallyHandlecmd23(void); -void WallyHandleHealthBarUpdate(void); -void WallyHandleExpBarUpdate(void); -void WallyHandleStatusIconUpdate(void); -void WallyHandleStatusAnimation(void); -void WallyHandleStatusXor(void); -void WallyHandlecmd29(void); -void WallyHandleDMATransfer(void); -void WallyHandlecmd31(void); -void WallyHandlecmd32(void); -void WallyHandlecmd33(void); -void WallyHandlecmd34(void); -void WallyHandlecmd35(void); -void WallyHandlecmd36(void); -void WallyHandlecmd37(void); -void WallyHandlecmd38(void); -void WallyHandlecmd39(void); -void WallyHandlecmd40(void); -void WallyHandleHitAnimation(void); -void WallyHandlecmd42(void); -void WallyHandleEffectivenessSound(void); -void WallyHandlecmd44(void); -void WallyHandleFaintingCry(void); -void WallyHandleIntroSlide(void); -void WallyHandleTrainerBallThrow(void); -void WallyHandlecmd48(void); -void WallyHandlecmd49(void); -void WallyHandlecmd50(void); -void WallyHandleSpriteInvisibility(void); -void WallyHandleBattleAnimation(void); -void WallyHandleLinkStandbyMsg(void); -void WallyHandleResetActionMoveSelection(void); -void WallyHandlecmd55(void); -void WallyHandlecmd56(void); - -// const data - -typedef void (*BattleBufferCmd) (void); -static const BattleBufferCmd gWallyBufferCommands[] = -{ - WallyHandleGetAttributes, - WallyHandlecmd1, - WallyHandleSetAttributes, - WallyHandlecmd3, - WallyHandleLoadPokeSprite, - WallyHandleSendOutPoke, - WallyHandleReturnPokeToBall, - WallyHandleTrainerThrow, - WallyHandleTrainerSlide, - WallyHandleTrainerSlideBack, - WallyHandlecmd10, - WallyHandlecmd11, - WallyHandlecmd12, - WallyHandleBallThrow, - WallyHandlePuase, - WallyHandleMoveAnimation, - WallyHandlePrintString, - WallyHandlePrintStringPlayerOnly, - WallyHandlecmd18, - WallyHandlecmd19, - WallyHandlecmd20, - WallyHandleOpenBag, - WallyHandlecmd22, - WallyHandlecmd23, - WallyHandleHealthBarUpdate, - WallyHandleExpBarUpdate, - WallyHandleStatusIconUpdate, - WallyHandleStatusAnimation, - WallyHandleStatusXor, - WallyHandlecmd29, - WallyHandleDMATransfer, - WallyHandlecmd31, - WallyHandlecmd32, - WallyHandlecmd33, - WallyHandlecmd34, - WallyHandlecmd35, - WallyHandlecmd36, - WallyHandlecmd37, - WallyHandlecmd38, - WallyHandlecmd39, - WallyHandlecmd40, - WallyHandleHitAnimation, - WallyHandlecmd42, - WallyHandleEffectivenessSound, - WallyHandlecmd44, - WallyHandleFaintingCry, - WallyHandleIntroSlide, - WallyHandleTrainerBallThrow, - WallyHandlecmd48, - WallyHandlecmd49, - WallyHandlecmd50, - WallyHandleSpriteInvisibility, - WallyHandleBattleAnimation, - WallyHandleLinkStandbyMsg, - WallyHandleResetActionMoveSelection, - WallyHandlecmd55, - WallyHandlecmd56, -}; - -// code - -void unref_sub_8137220(void) -{ -} - -void SetBankFuncToWallyBufferRunCommand(void) -{ - gBattleBankFunc[gActiveBattler] = WallyBufferRunCommand; - ewram160A8 = 0; - ewram160A9 = 0; - ewram160AA = 0; - ewram160AB = 0; -} - -void WallyBufferRunCommand(void) -{ - if (gBattleExecBuffer & gBitTable[gActiveBattler]) - { - if (gBattleBufferA[gActiveBattler][0] < 0x39) - gWallyBufferCommands[gBattleBufferA[gActiveBattler][0]](); - else - WallyBufferExecCompleted(); - } -} - -void sub_81372BC(void) -{ - u8 r4; - - switch (ewram160A8) - { - case 0: - ewram160AA = 64; - ewram160A8++; - // fall through - case 1: - r4 = --ewram160AA; - if (r4 == 0) - { - PlaySE(SE_SELECT); - Emitcmd33(1, 0, 0); - WallyBufferExecCompleted(); - ewram160A8++; - ewram160A9 = r4; - ewram160AA = 64; - } - break; - case 2: - r4 = --ewram160AA; - if (r4 == 0) - { - PlaySE(SE_SELECT); - Emitcmd33(1, 0, 0); - WallyBufferExecCompleted(); - ewram160A8++; - ewram160A9 = r4; - ewram160AA = 64; - } - break; - case 3: - r4 = --ewram160AA; - if (r4 == 0) - { - Emitcmd33(1, 9, 0); - WallyBufferExecCompleted(); - ewram160A8++; - ewram160A9 = r4; - ewram160AA = 64; - } - break; - case 4: - if (--ewram160AA == 0) - { - PlaySE(SE_SELECT); - nullsub_8(0); - sub_802E3E4(1, 0); - ewram160AA = 64; - ewram160A8++; - } - break; - case 5: - if (--ewram160AA == 0) - { - PlaySE(SE_SELECT); - DestroyMenuCursor(); - Emitcmd33(1, 1, 0); - WallyBufferExecCompleted(); - } - break; - } -} - -void sub_813741C(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - WallyBufferExecCompleted(); -} - -void sub_8137454(void) -{ - if (gUnknown_03004210.state == 0) - WallyBufferExecCompleted(); -} - -void sub_813746C(void) -{ - if (!gPaletteFade.active) - { - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(gMain.savedCallback); - } -} - -void bx_wait_t5(void) -{ - if (!gDoingBattleAnim) - WallyBufferExecCompleted(); -} - -void sub_81374C4(void) -{ - if (!gPaletteFade.active) - { - gBattleBankFunc[gActiveBattler] = sub_81374FC; - nullsub_14(); - PrepareBagForWallyTutorial(); - } -} - -void sub_81374FC(void) -{ - if (gMain.callback2 == BattleMainCB2 - && !gPaletteFade.active) - { - Emitcmd35(1, gSpecialVar_ItemId); - WallyBufferExecCompleted(); - } -} - -void sub_8137538(void) -{ - if (!ewram17810[gActiveBattler].unk0_3 && !ewram17810[gActiveBattler].unk0_7) - sub_8141828(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - - if (!ewram17810[gActiveBattler ^ 2].unk0_3 && !ewram17810[gActiveBattler ^ 2].unk0_7) - sub_8141828(gActiveBattler ^ 2, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ 2]]); - - if (!ewram17810[gActiveBattler].unk0_3 && !ewram17810[gActiveBattler ^ 2].unk0_3) - { - if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler ^ 2]]); - sub_8045A5C(gHealthboxIDs[gActiveBattler ^ 2], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ 2]], 0); - sub_804777C(gActiveBattler ^ 2); - sub_8043DFC(gHealthboxIDs[gActiveBattler ^ 2]); - } - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBattler]]); - sub_8045A5C(gHealthboxIDs[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], 0); - sub_804777C(gActiveBattler); - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - ewram17840.unk9_0 = 0; - gBattleBankFunc[gActiveBattler] = sub_81376B8; - } -} - -void sub_81376B8(void) -{ - bool8 r4 = FALSE; - - if (gSprites[gHealthboxIDs[gActiveBattler]].callback == SpriteCallbackDummy) - r4 = TRUE; - if (r4 && ewram17810[gActiveBattler].unk1_0 && ewram17810[gActiveBattler ^ 2].unk1_0) - { - ewram17810[gActiveBattler].unk0_7 = 0; - ewram17810[gActiveBattler].unk1_0 = 0; - ewram17810[gActiveBattler ^ 2].unk0_7 = 0; - ewram17810[gActiveBattler ^ 2].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - CreateTask(c3_0802FDF4, 10); - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - WallyBufferExecCompleted(); - } -} - -void sub_81377B0(void) -{ - s16 r4; - - r4 = sub_8045C78(gActiveBattler, gHealthboxIDs[gActiveBattler], 0, 0); - sub_8043DFC(gHealthboxIDs[gActiveBattler]); - if (r4 != -1) - { - sub_80440EC(gHealthboxIDs[gActiveBattler], r4, 0); - } - else - { - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - WallyBufferExecCompleted(); - } -} - -void bx_blink_t5(void) -{ - u8 spriteId = gBankSpriteIds[gActiveBattler]; - - if (gSprites[spriteId].data[1] == 32) - { - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].invisible = FALSE; - gDoingBattleAnim = FALSE; - WallyBufferExecCompleted(); - } - else - { - if (((u16)gSprites[spriteId].data[1] % 4) == 0) - gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data[1]++; - } -} - -void sub_813789C(void) -{ - if (!ewram17810[gActiveBattler].unk0_6) - { - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - WallyBufferExecCompleted(); - } -} - -// Duplicate of sub_813741C -void sub_8137908(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - WallyBufferExecCompleted(); -} - -void sub_8137940(void) -{ - if (!ewram17810[gActiveBattler].unk0_5) - WallyBufferExecCompleted(); -} - -void WallyBufferExecCompleted(void) -{ - gBattleBankFunc[gActiveBattler] = WallyBufferRunCommand; - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - u8 multiplayerId = GetMultiplayerId(); - - PrepareBufferDataTransferLink(2, 4, &multiplayerId); - gBattleBufferA[gActiveBattler][0] = 0x38; - } - else - { - gBattleExecBuffer &= ~gBitTable[gActiveBattler]; - } -} - -void unref_sub_81379E4(void) -{ - if (!ewram17810[gActiveBattler].unk0_4) - WallyBufferExecCompleted(); -} - -void WallyHandleGetAttributes(void) -{ - u8 arr[0x100]; - u32 r6 = 0; - u8 r4; - s32 i; - - if (gBattleBufferA[gActiveBattler][2] == 0) - { - r6 = sub_8137A84(gBattlerPartyIndexes[gActiveBattler], arr); - } - else - { - r4 = gBattleBufferA[gActiveBattler][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - r6 += sub_8137A84(i, arr + r6); - r4 >>= 1; - } - } - Emitcmd29(1, r6, arr); - WallyBufferExecCompleted(); -} - -u32 sub_8137A84(u8 a, u8 *buffer) -{ - struct BattlePokemon battlePokemon; - struct MovePpInfo moveData; - u8 nickname[20]; - u8 *src; - s16 data16; - u32 data32; - s32 size = 0; - - switch (gBattleBufferA[gActiveBattler][1]) - { - case 0: - battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); - battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) - { - battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); - battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - } - battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); - battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP); - battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); - battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); - battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); - battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); - battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP); - battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); - battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); - battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPEED); - battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); - battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); - battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); - battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY); - battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); - GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); - StringCopy10(battlePokemon.nickname, nickname); - GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - MEMCPY_ALT(&battlePokemon, buffer, sizeof(battlePokemon), size, src); - break; - case 1: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 2: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 3: - for (size = 0; size < 4; size++) - { - moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); - moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - } - moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - MEMCPY_ALT(&moveData, buffer, sizeof(moveData), size, src); - break; - case 4: - case 5: - case 6: - case 7: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - 4); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 8: - for (size = 0; size < 4; size++) - buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - size++; - break; - case 9: - case 10: - case 11: - case 12: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - 9); - size = 1; - break; - case 17: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 18: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 19: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV); - size = 1; - break; - case 20: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV); - size = 1; - break; - case 21: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV); - size = 1; - break; - case 22: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_EV); - size = 1; - break; - case 23: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV); - size = 1; - break; - case 24: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV); - size = 1; - break; - case 25: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); - size = 1; - break; - case 26: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS); - size = 1; - break; - case 27: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION); - size = 1; - break; - case 28: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL); - size = 1; - break; - case 29: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME); - size = 1; - break; - case 30: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL); - size = 1; - break; - case 31: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); - buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - size = 6; - break; - case 32: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - size = 1; - break; - case 33: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - size = 1; - break; - case 34: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - size = 1; - break; - case 35: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); - size = 1; - break; - case 36: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - size = 1; - break; - case 37: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - size = 1; - break; - case 38: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 39: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 40: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 41: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); - size = 1; - break; - case 42: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 43: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 44: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 45: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 46: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPEED); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 47: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 48: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 49: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL); - size = 1; - break; - case 50: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY); - size = 1; - break; - case 51: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE); - size = 1; - break; - case 52: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART); - size = 1; - break; - case 53: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH); - size = 1; - break; - case 54: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN); - size = 1; - break; - case 55: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON); - size = 1; - break; - case 56: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON); - size = 1; - break; - case 57: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON); - size = 1; - break; - case 58: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON); - size = 1; - break; - case 59: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON); - size = 1; - break; - } - return size; -} - -void WallyHandlecmd1(void) -{ - PlayerHandlecmd1(); -} - -void WallyHandleSetAttributes(void) -{ - u8 r4; - u8 i; - - if (gBattleBufferA[gActiveBattler][2] == 0) - { - sub_8138294(gBattlerPartyIndexes[gActiveBattler]); - } - else - { - r4 = gBattleBufferA[gActiveBattler][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - sub_8138294(i); - r4 >>= 1; - } - } - WallyBufferExecCompleted(); -} - -void sub_8138294(u8 a) -{ - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; - s32 i; - - switch (gBattleBufferA[gActiveBattler][1]) - { - case 0: - { - u8 iv; - - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &battlePokemon->species); - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, &battlePokemon->pp[i]); - } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); - SetMonData(&gPlayerParty[a], MON_DATA_EXP, &battlePokemon->experience); - iv = battlePokemon->hpIV; - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &iv); - iv = battlePokemon->attackIV; - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &iv); - iv = battlePokemon->defenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &iv); - iv = battlePokemon->speedIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &iv); - iv = battlePokemon->spAttackIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &iv); - iv = battlePokemon->spDefenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &iv); - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &battlePokemon->personality); - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &battlePokemon->status1); - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &battlePokemon->level); - SetMonData(&gPlayerParty[a], MON_DATA_HP, &battlePokemon->hp); - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &battlePokemon->maxHP); - SetMonData(&gPlayerParty[a], MON_DATA_ATK, &battlePokemon->attack); - SetMonData(&gPlayerParty[a], MON_DATA_DEF, &battlePokemon->defense); - SetMonData(&gPlayerParty[a], MON_DATA_SPEED, &battlePokemon->speed); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &battlePokemon->spAttack); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &battlePokemon->spDefense); - } - break; - case 1: - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); - break; - case 2: - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); - break; - case 3: - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, &moveData->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, &moveData->pp[i]); - } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); - break; - case 4: - case 5: - case 6: - case 7: - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - 4, &gBattleBufferA[gActiveBattler][3]); - break; - case 8: - SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); - break; - case 9: - case 10: - case 11: - case 12: - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - 9, &gBattleBufferA[gActiveBattler][3]); - break; - case 17: - SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); - break; - case 18: - SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); - break; - case 19: - SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 20: - SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 21: - SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 22: - SetMonData(&gPlayerParty[a], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 23: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 24: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); - break; - case 25: - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); - break; - case 26: - SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); - break; - case 27: - SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); - break; - case 28: - SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); - break; - case 29: - SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); - break; - case 30: - SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); - break; - case 31: - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); - break; - case 32: - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 33: - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 34: - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 35: - SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 36: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 37: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); - break; - case 38: - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); - break; - case 39: - SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); - break; - case 40: - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); - break; - case 41: - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); - break; - case 42: - SetMonData(&gPlayerParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); - break; - case 43: - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); - break; - case 44: - SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); - break; - case 45: - SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); - break; - case 46: - SetMonData(&gPlayerParty[a], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); - break; - case 47: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); - break; - case 48: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); - break; - case 49: - SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); - break; - case 50: - SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); - break; - case 51: - SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); - break; - case 52: - SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); - break; - case 53: - SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); - break; - case 54: - SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); - break; - case 55: - SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 56: - SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 57: - SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 58: - SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - case 59: - SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); - break; - } - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); -} - -void WallyHandlecmd3(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleLoadPokeSprite(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleSendOutPoke(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleReturnPokeToBall(void) -{ - if (gBattleBufferA[gActiveBattler][1] == 0) - { - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 1); - gBattleBankFunc[gActiveBattler] = sub_813789C; - } - else - { - FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBankSpriteIds[gActiveBattler]]); - sub_8043DB0(gHealthboxIDs[gActiveBattler]); - WallyBufferExecCompleted(); - } -} - -void WallyHandleTrainerThrow(void) -{ - LoadPlayerTrainerBankSprite(2, gActiveBattler); - GetMonSpriteTemplate_803C5A0(2, GetBattlerPosition(gActiveBattler)); - gBankSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_02024E8C, - 80, 80 + 4 * (8 - gTrainerBackPicCoords[2].coords), - 30); - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBankSpriteIds[gActiveBattler]].pos2.x = 240; - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_80313A0; - gBattleBankFunc[gActiveBattler] = sub_813741C; -} - -void WallyHandleTrainerSlide(void) -{ - LoadPlayerTrainerBankSprite(2, gActiveBattler); - GetMonSpriteTemplate_803C5A0(2, GetBattlerPosition(gActiveBattler)); - gBankSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_02024E8C, - 80, 80 + 4 * (8 - gTrainerBackPicCoords[2].coords), - 30); - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBankSpriteIds[gActiveBattler]].pos2.x = -96; - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 2; - gSprites[gBankSpriteIds[gActiveBattler]].callback = sub_80313A0; - gBattleBankFunc[gActiveBattler] = sub_8137908; -} - -void WallyHandleTrainerSlideBack(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd10(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd11(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd12(void) -{ - ewram17840.unk8 = 4; - gDoingBattleAnim = TRUE; - move_anim_start_t4(gActiveBattler, gActiveBattler, GetBattlerAtPosition(1), 4); - gBattleBankFunc[gActiveBattler] = bx_wait_t5; -} - -void WallyHandleBallThrow(void) -{ - u8 val = gBattleBufferA[gActiveBattler][1]; - - ewram17840.unk8 = val; - gDoingBattleAnim = TRUE; - move_anim_start_t4(gActiveBattler, gActiveBattler, GetBattlerAtPosition(1), 4); - gBattleBankFunc[gActiveBattler] = bx_wait_t5; -} - -void WallyHandlePuase(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleMoveAnimation(void) -{ - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; - gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; - if (sub_8031720(move, gAnimMoveTurn) != 0) - { - // Dead code. sub_8031720 always returns 0. - WallyBufferExecCompleted(); - } - else - { - ewram17810[gActiveBattler].unk4 = 0; - gBattleBankFunc[gActiveBattler] = sub_81390D0; - } -} - -void sub_81390D0(void) -{ - u16 r4 = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - -#ifndef NONMATCHING - asm("":::"r6"); -#endif - - switch (ewram17810[gActiveBattler].unk4) - { - case 0: - if (ewram17800[gActiveBattler].substituteSprite == 1) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 5); - ewram17810[gActiveBattler].unk4 = 1; - break; - case 1: - if (ewram17810[gActiveBattler].unk0_6 == 0) - { - sub_80326EC(0); - DoMoveAnim(r4); - ewram17810[gActiveBattler].unk4 = 2; - } - break; - case 2: - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - sub_80326EC(1); - if (ewram17800[gActiveBattler].substituteSprite == 1) - move_anim_start_t4(gActiveBattler, gActiveBattler, gActiveBattler, 6); - ewram17810[gActiveBattler].unk4 = 3; - } - break; - case 3: - if (ewram17810[gActiveBattler].unk0_6 == 0) - { - sub_8031F24(); - sub_80324BC(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - ewram17810[gActiveBattler].unk4 = 0; - WallyBufferExecCompleted(); - } - break; - } -} - -void WallyHandlePrintString(void) -{ - u16 *ptr; - - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - ptr = (u16 *)&gBattleBufferA[gActiveBattler][2]; - if (*ptr == 2) - DestroyMenuCursor(); - BufferStringBattle(*ptr); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); - gBattleBankFunc[gActiveBattler] = sub_8137454; -} - -void WallyHandlePrintStringPlayerOnly(void) -{ - if (GetBattlerSide(gActiveBattler) == 0) - WallyHandlePrintString(); - else - WallyBufferExecCompleted(); -} - -void WallyHandlecmd18(void) -{ - s32 i; - - gBattle_BG0_X = 0; - gBattle_BG0_Y = 160; - gUnknown_03004210.paletteNum = 0; - Text_FillWindowRectDefPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); - Text_FillWindowRectDefPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); - gBattleBankFunc[gActiveBattler] = sub_81372BC; - Text_InitWindow(&gUnknown_03004210, BattleText_MenuOptions, 400, 18, 35); - Text_PrintWindow8002F44(&gUnknown_03004210); - MenuCursor_Create814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); - for (i = 0; i < 4; i++) - nullsub_8(i); - sub_802E3E4(0, 0); - StrCpyDecodeToDisplayedStringBattle(BattleText_WallyMenu); -#ifdef ENGLISH - Text_InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 440, 2, 35); -#else - Text_InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 444, 2, 35); -#endif - Text_PrintWindow8002F44(&gUnknown_03004210); -} - -void WallyHandlecmd19(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd20(void) -{ - switch (ewram160A9) - { - case 0: - sub_80304A8(); - ewram160A9++; - ewram160AB = 80; - // fall through - case 1: - ewram160AB--; - if (ewram160AB == 0) - { - DestroyMenuCursor(); - PlaySE(SE_SELECT); - Emitcmd33(1, 10, 256); - WallyBufferExecCompleted(); - } - break; - } -} - -void WallyHandleOpenBag(void) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); - gBattleBankFunc[gActiveBattler] = sub_81374C4; - gBankInMenu = gActiveBattler; -} - -void WallyHandlecmd22(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd23(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleHealthBarUpdate(void) -{ - s16 r7; - - load_gfxc_health_bar(0); - r7 = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - if (r7 != 0x7FFF) - { - u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); - u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); - - sub_8043D84(gActiveBattler, gHealthboxIDs[gActiveBattler], maxHP, curHP, r7); - } - else - { - u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); - - sub_8043D84(gActiveBattler, gHealthboxIDs[gActiveBattler], maxHP, 0, r7); - sub_80440EC(gHealthboxIDs[gActiveBattler], 0, 0); - } - gBattleBankFunc[gActiveBattler] = sub_81377B0; -} - -void WallyHandleExpBarUpdate(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleStatusIconUpdate(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleStatusAnimation(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleStatusXor(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd29(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleDMATransfer(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd31(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd32(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd33(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd34(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd35(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd36(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd37(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd38(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd39(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd40(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleHitAnimation(void) -{ - if (gSprites[gBankSpriteIds[gActiveBattler]].invisible == TRUE) - { - WallyBufferExecCompleted(); - } - else - { - gDoingBattleAnim = 1; - gSprites[gBankSpriteIds[gActiveBattler]].data[1] = 0; - sub_8047858(gActiveBattler); - gBattleBankFunc[gActiveBattler] = bx_blink_t5; - } -} - -void WallyHandlecmd42(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleEffectivenessSound(void) -{ - PlaySE(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - WallyBufferExecCompleted(); -} - -void WallyHandlecmd44(void) -{ - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - WallyBufferExecCompleted(); -} - -void WallyHandleFaintingCry(void) -{ - PlayCry1(GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES), 25); - WallyBufferExecCompleted(); -} - -void WallyHandleIntroSlide(void) -{ - StartBattleIntroAnim(gBattleBufferA[gActiveBattler][1]); - gUnknown_02024DE8 |= 1; - WallyBufferExecCompleted(); -} - -void WallyHandleTrainerBallThrow(void) -{ - u8 paletteNum; - u8 taskId; - - oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBattler]]); - gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 50; - gSprites[gBankSpriteIds[gActiveBattler]].data[2] = -40; - gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - gSprites[gBankSpriteIds[gActiveBattler]].data[5] = gActiveBattler; - StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], sub_8030E38); - StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], 1); - paletteNum = AllocSpritePalette(0xD6F8); - LoadCompressedPalette(gTrainerBackPicPaletteTable[2].data, 0x100 + paletteNum * 16, 32); - gSprites[gBankSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; - taskId = CreateTask(sub_8139A2C, 5); - gTasks[taskId].data[0] = gActiveBattler; - if (ewram17810[gActiveBattler].unk0_0) - gTasks[gUnknown_02024E68[gActiveBattler]].func = sub_8044CA0; - ewram17810[4].unk9 |= 1; - gBattleBankFunc[gActiveBattler] = nullsub_91; -} - -void sub_81398BC(u8 bank) -{ - u16 species; - - ewram17800[bank].transformedSpecies = 0; - gBattlerPartyIndexes[bank] = gBattleBufferA[bank][1]; - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[bank]], MON_DATA_SPECIES); - gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0); - GetMonSpriteTemplate_803C56C(species, GetBattlerPosition(bank)); - gBankSpriteIds[bank] = CreateSprite( - &gUnknown_02024E8C, - GetBattlerSpriteCoord(bank, 2), - sub_8077F68(bank), - GetBattlerSubpriority(bank)); - gSprites[gUnknown_0300434C[bank]].data[1] = gBankSpriteIds[bank]; - gSprites[gBankSpriteIds[bank]].data[0] = bank; - gSprites[gBankSpriteIds[bank]].data[2] = species; - gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; - StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); - gSprites[gBankSpriteIds[bank]].invisible = TRUE; - gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gUnknown_0300434C[bank]].data[0] = StartSendOutMonAnimation(0, 0xFF); -} - -void sub_8139A2C(u8 taskId) -{ - if (gTasks[taskId].data[1] < 31) - { - gTasks[taskId].data[1]++; - } - else - { - u8 savedActiveBank = gActiveBattler; - - gActiveBattler = gTasks[taskId].data[0]; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_81398BC(gActiveBattler); - gBattleBankFunc[gActiveBattler] = sub_8137538; - gActiveBattler = savedActiveBank; - DestroyTask(taskId); - } -} - -void WallyHandlecmd48(void) -{ - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == 0) - { - WallyBufferExecCompleted(); - } - else - { - ewram17810[gActiveBattler].unk0_0 = 1; - gUnknown_02024E68[gActiveBattler] = sub_8044804(gActiveBattler, (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); - WallyBufferExecCompleted(); - } -} - -void WallyHandlecmd49(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd50(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleSpriteInvisibility(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleBattleAnimation(void) -{ - u8 val2 = gBattleBufferA[gActiveBattler][1]; - u16 val = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - - if (move_anim_start_t3(gActiveBattler, gActiveBattler, gActiveBattler, val2, val)) - WallyBufferExecCompleted(); - else - gBattleBankFunc[gActiveBattler] = sub_8137940; -} - -void WallyHandleLinkStandbyMsg(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandleResetActionMoveSelection(void) -{ - WallyBufferExecCompleted(); -} - -void WallyHandlecmd55(void) -{ - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; - FadeOutMapMusic(5); - BeginFastPaletteFade(3); - WallyBufferExecCompleted(); - if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_WILD)) - gBattleBankFunc[gActiveBattler] = sub_813746C; -} - -void WallyHandlecmd56(void) -{ -} diff --git a/src/battle/battle_interface.c b/src/battle/battle_interface.c deleted file mode 100644 index b91db9838..000000000 --- a/src/battle/battle_interface.c +++ /dev/null @@ -1,3423 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_interface.h" -#include "decompress.h" -#include "palette.h" -#include "pokedex.h" -#include "pokemon.h" -#include "rom_8077ABC.h" -#include "safari_zone.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "ewram.h" -#include "graphics.h" - -struct UnknownStruct5 -{ - u8 unk0; - u32 unk4; - u32 unk8; - u32 unkC; - u32 unk10; -}; - -struct UnknownStruct7 -{ - u8 filler0[0x180]; -}; - -static void sub_8043CEC(struct Sprite *sprite); -static void sub_8045030(struct Sprite *sprite); -static void sub_804507C(struct Sprite *sprite); - -const struct OamData gOamData_820A4E4 = -{ - .shape = 1, - .size = 3, - .priority = 1, -}; - -const struct SpriteTemplate gSpriteTemplates_820A4EC[] = -{ - { - .tileTag = 55039, - .paletteTag = 55039, - .oam = &gOamData_820A4E4, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55040, - .paletteTag = 55039, - .oam = &gOamData_820A4E4, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, -}; - -const struct SpriteTemplate gSpriteTemplates_820A51C[] = -{ - { - .tileTag = 55041, - .paletteTag = 55039, - .oam = &gOamData_820A4E4, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, - { - .tileTag = 55042, - .paletteTag = 55039, - .oam = &gOamData_820A4E4, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, -}; - -const struct SpriteTemplate gSpriteTemplate_820A54C = -{ - .tileTag = 55051, - .paletteTag = 55039, - .oam = &gOamData_820A4E4, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -const struct OamData gOamData_820A564 = -{ - .shape = 1, - .size = 1, - .priority = 1, -}; - -const struct SpriteTemplate gSpriteTemplates_820A56C[] = -{ - { - .tileTag = 55044, - .paletteTag = 55044, - .oam = &gOamData_820A564, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8043CEC, - }, - { - .tileTag = 55045, - .paletteTag = 55044, - .oam = &gOamData_820A564, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8043CEC, - }, - { - .tileTag = 55046, - .paletteTag = 55044, - .oam = &gOamData_820A564, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8043CEC, - }, - { - .tileTag = 55047, - .paletteTag = 55044, - .oam = &gOamData_820A564, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8043CEC, - }, -}; - -const struct Subsprite gSubspriteTable_820A5CC[] = -{ - { .x = -16, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 0, .size = 3 }, // size := 64x32 - { .x = 48, .y = 0, .shape = ST_OAM_SQUARE, .priority = 1, .tileOffset = 32, .size = 2 }, // size := 32x32 - { .x = -16, .y = 32, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 48, .size = 1 }, // size := 32x8 - { .x = 16, .y = 32, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 52, .size = 1 }, // size := 32x8 - { .x = 48, .y = 32, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 56, .size = 1 }, // size := 32x8 -}; - -const struct Subsprite gSubspriteTable_820A5F4[] = -{ - { .x = -16, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 64, .size = 3 }, // size := 64x32 - { .x = 48, .y = 0, .shape = ST_OAM_SQUARE, .priority = 1, .tileOffset = 96, .size = 2 }, // size := 32x32 - { .x = -16, .y = 32, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset =112, .size = 1 }, // size := 32x8 - { .x = 16, .y = 32, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset =116, .size = 1 }, // size := 32x8 - { .x = 48, .y = 32, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset =120, .size = 1 }, // size := 32x8 -}; - -const struct Subsprite gSubspriteTable_820A61C[] = -{ - { .x = -16, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 0, .size = 3 }, // size := 64x32 - { .x = 48, .y = 0, .shape = ST_OAM_SQUARE, .priority = 1, .tileOffset = 32, .size = 2 }, // size := 32x32 -}; - -const struct Subsprite gSubspriteTable_820A62C[] = -{ - { .x = -16, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 0, .size = 3 }, // size := 64x32 - { .x = 48, .y = 0, .shape = ST_OAM_SQUARE, .priority = 1, .tileOffset = 32, .size = 2 }, // size := 32x32 -}; - -const struct Subsprite gSubspriteTable_820A63C[] = -{ - { .x = -16, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 0, .size = 1 }, // size := 32x8 - { .x = 16, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 4, .size = 1 }, // size := 32x8 -}; - -const struct Subsprite gSubspriteTable_820A64C[] = -{ - { .x = -16, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 0, .size = 1 }, // size := 32x8 - { .x = 16, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 4, .size = 1 }, // size := 32x8 - { .x = -32, .y = 0, .shape = ST_OAM_SQUARE, .priority = 1, .tileOffset = 8, .size = 0 }, // size := 8x8 -}; - -const struct SubspriteTable gSubspriteTables_unreferenced[] = -{ - { ARRAY_COUNT(gSubspriteTable_820A5CC), gSubspriteTable_820A5CC }, - { ARRAY_COUNT(gSubspriteTable_820A61C), gSubspriteTable_820A61C }, - { ARRAY_COUNT(gSubspriteTable_820A5F4), gSubspriteTable_820A5F4 }, - { ARRAY_COUNT(gSubspriteTable_820A62C), gSubspriteTable_820A62C }, -}; - -const struct SubspriteTable gSubspriteTables_820A684[] = -{ - { ARRAY_COUNT(gSubspriteTable_820A63C), gSubspriteTable_820A63C }, - { ARRAY_COUNT(gSubspriteTable_820A64C), gSubspriteTable_820A64C }, -}; - -const struct Subsprite gSubspriteTable_820A694[] = -{ - { .x = -96, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 0, .size = 1 }, // size := 32x8 - { .x = -64, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 4, .size = 1 }, // size := 32x8 - { .x = -32, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 8, .size = 1 }, // size := 32x8 - { .x = 0, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 12, .size = 1 }, // size := 32x8 -}; - -const struct Subsprite gSubspriteTable_820A6B4[] = -{ - { .x = -96, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 0, .size = 1 }, // size := 32x8 - { .x = -64, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 4, .size = 1 }, // size := 32x8 - { .x = -32, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 8, .size = 1 }, // size := 32x8 - { .x = 0, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 8, .size = 1 }, // size := 32x8 - { .x = 32, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 8, .size = 1 }, // size := 32x8 - { .x = 64, .y = 0, .shape = ST_OAM_H_RECTANGLE, .priority = 1, .tileOffset = 12, .size = 1 }, // size := 32x8 -}; - -const struct SubspriteTable gSubspriteTables_820A6E4[] = -{ - { ARRAY_COUNT(gSubspriteTable_820A694), gSubspriteTable_820A694 }, -}; - -const struct SubspriteTable gSubspriteTables_820A6EC[] = -{ - { ARRAY_COUNT(gSubspriteTable_820A6B4), gSubspriteTable_820A6B4 }, -}; - -// unused dakuten/handakuten tiles -const u8 gUnusedDakuten[] = INCBIN_U8("graphics/unused/dakuten.4bpp"); - -const struct CompressedSpriteSheet gUnknown_0820A754[] = -{ - { gBattleGfx_BallStatusBar, 512, 0xd70c }, - { gBattleGfx_BallStatusBar, 512, 0xd70d }, -}; - -const struct SpritePalette gUnknown_0820A764[] = -{ - { gUnknown_08D1212C, 0xd710 }, - { gUnknown_08D1212C, 0xd711 }, -}; - -const struct SpritePalette gUnknown_0820A774[] = -{ - { gUnknown_08D1214C, 0xd712 }, - { gUnknown_08D1214C, 0xd713 }, -}; - -const struct CompressedSpriteSheet gUnknown_0820A784[] = -{ - { Tiles_D129AC, 0x80, 0xd714 }, - { Tiles_D129AC, 0x80, 0xd715 }, -}; - -const struct OamData gOamData_820A794 = -{ - .shape = 1, - .size = 3, - .priority = 1, -}; - -const struct OamData gOamData_820A79C = -{ - .shape = 0, - .size = 0, - .priority = 1, -}; - -const struct SpriteTemplate gSpriteTemplate_820A7A4 = -{ - .tileTag = 55052, - .paletteTag = 55056, - .oam = &gOamData_820A4E4, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8045030, -}; - -const struct SpriteTemplate gSpriteTemplate_820A7BC = -{ - .tileTag = 55053, - .paletteTag = 55057, - .oam = &gOamData_820A4E4, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8045030, -}; - -const struct SpriteTemplate gSpriteTemplate_820A7D4 = -{ - .tileTag = 55060, - .paletteTag = 55058, - .oam = &gOamData_820A79C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_804507C, -}; - -const struct SpriteTemplate gSpriteTemplate_820A7EC = -{ - .tileTag = 55061, - .paletteTag = 55059, - .oam = &gOamData_820A79C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_804507C, -}; - -u8 *const gUnknown_0820A804[2] = -{ - OBJ_VRAM0 + 32 * 74, - OBJ_VRAM0 + 32 * 75, -}; - -u8 *const gUnknown_0820A80C[2] = -{ - OBJ_VRAM0 + 32 * 41, - OBJ_VRAM0 + 32 * 42, -}; - -u8 *const gUnknown_0820A814[2] = -{ - OBJ_VRAM0 + 32 * 42, - OBJ_VRAM0 + 32 * 43, -}; - -const u8 gUnknown_0820A81C[] = __("{COLOR DARK_GREY}{HIGHLIGHT RED} "); - -u8 *const gUnknown_0820A83C[3] = -{ - OBJ_VRAM0 + 32 * 31, - OBJ_VRAM0 + 32 * 88, - OBJ_VRAM0 + 32 * 89, -}; - -u8 *const gUnknown_0820A848[3] = -{ - OBJ_VRAM0 + 32 * 22, - OBJ_VRAM0 + 32 * 23, - OBJ_VRAM0 + 32 * 48, -}; - -u8 *const gUnknown_0820A854[2] = -{ - OBJ_VRAM0 + 32 * 90, - OBJ_VRAM0 + 32 * 91, -}; - -u8 *const gUnknown_0820A85C[2] = -{ - OBJ_VRAM0 + 32 * 49, - OBJ_VRAM0 + 32 * 50, -}; - -const u8 gUnknown_0820A864[] = _("{COLOR DARK_GREY}{HIGHLIGHT RED} /"); - -u8 *const gUnknown_0820A87C[6] = -{ - OBJ_VRAM0 + 32 * 0, - OBJ_VRAM0 + 32 * 1, - OBJ_VRAM0 + 32 * 2, - OBJ_VRAM0 + 32 * 3, - OBJ_VRAM0 + 32 * 4, - OBJ_VRAM0 + 32 * 5, -}; - -u8 *const gUnknown_0820A894[2] = -{ - OBJ_VRAM0 + 32 * 6, - OBJ_VRAM0 + 32 * 7, -}; - -const u8 gUnknown_0820A89C[] = __("{COLOR DARK_GREY}{HIGHLIGHT TRANSPARENT} "); -const u8 gUnknown_0820A8B0[] = _("{HIGHLIGHT RED}"); - -u8 *const gUnknown_0820A8B4[10] = -{ - OBJ_VRAM0 + 32 * 2, - OBJ_VRAM0 + 32 * 3, - OBJ_VRAM0 + 32 * 4, - OBJ_VRAM0 + 32 * 5, - OBJ_VRAM0 + 32 * 6, - OBJ_VRAM0 + 32 * 7, - OBJ_VRAM0 + 32 * 64, - OBJ_VRAM0 + 32 * 65, - OBJ_VRAM0 + 32 * 66, - OBJ_VRAM0 + 32 * 67, -}; - -u8 *const gUnknown_0820A8DC[10] = -{ - OBJ_VRAM0 + 32 * 1, - OBJ_VRAM0 + 32 * 2, - OBJ_VRAM0 + 32 * 3, - OBJ_VRAM0 + 32 * 4, - OBJ_VRAM0 + 32 * 5, - OBJ_VRAM0 + 32 * 6, - OBJ_VRAM0 + 32 * 7, - OBJ_VRAM0 + 32 * 32, - OBJ_VRAM0 + 32 * 33, - OBJ_VRAM0 + 32 * 34, -}; - -u8 *const gUnknown_0820A904[10] = -{ - OBJ_VRAM0 + 32 * 2, - OBJ_VRAM0 + 32 * 3, - OBJ_VRAM0 + 32 * 4, - OBJ_VRAM0 + 32 * 5, - OBJ_VRAM0 + 32 * 6, - OBJ_VRAM0 + 32 * 7, - OBJ_VRAM0 + 32 * 32, - OBJ_VRAM0 + 32 * 33, - OBJ_VRAM0 + 32 * 34, - OBJ_VRAM0 + 32 * 35, -}; - -extern u8 gDisplayedStringBattle[]; -extern u8 gBattlersCount; -extern u16 gBattlerPartyIndexes[]; -extern u8 gBanksBySide[]; -extern u8 gHealthboxIDs[]; - -extern u16 gBattleTypeFlags; - -extern const u8 BattleText_SafariBalls[]; -extern const u8 BattleText_SafariBallsLeft[]; -extern const u8 BattleText_HighlightRed[]; -extern const u8 gHealthboxElementsGfxTable[][32]; - -extern const u16 gBattleInterfaceStatusIcons_DynPal[]; - -#define ABS(n) ((n) >= 0 ? (n) : -(n)) -// Used for computing copy destination addresses -#define MACRO1(n) ((n) - (n) / 8 * 8) + 64 * ((n) / 8) - -static void sub_8043D5C(struct Sprite *); -static const void *sub_8043CDC(u8); -/*static*/ void sub_8044210(u8, s16, u8); -/*static*/ void draw_status_ailment_maybe(u8); -extern void sub_8045180(struct Sprite *); -static void sub_8045110(struct Sprite *); -static void sub_8045048(struct Sprite *); -static void sub_8044F70(u8 taskId); -static void sub_8044E74(u8 taskId); -static void sub_8044ECC(u8 taskId); -static u8 sub_80457E8(u8, u8); -static int sub_8045F58(s32, s32, int, int *, u8, u16); -static u8 GetScaledExpFraction(int, int, int, u8); -static void sub_8045D58(u8, u8); -static u8 sub_804602C(int, int, int, int *, u8 *, u8); -static void sub_8046128(struct BattleInterfaceStruct1 *a, int *b, u16 *c); - -static int do_nothing(s16 unused1, s16 unused2, int unused3) -{ - return 9; -} - -#ifdef NONMATCHING -void sub_8043740(s16 a, u16 *b, u8 c) -{ - u8 sp0[4]; - s8 i; - s8 j; - s32 r9; - - for (i = 0; i < 4; i++) - sp0[i] = 0; - - //_0804377C - //i = 3; - //r9 = -1; - for (i = 3, r9 = -1;;) - { - if (a > 0) - { - sp0[i] = a % 10; - a /= 10; - i--; - } - else - break; - asm(""::"r"(r9)); - } - - //_080437AA - for (; i > r9; i--) - { - //asm("":"=r"(r9)); - sp0[i] = -1; - } - //_080437CE - if (sp0[3] == 0xFF) - sp0[3] = 0; - - //_080437DA - if (c == 0) - { - for (i = 0, j = 0; i < 4; i++) - { - if (sp0[j] == 0xFF) - { - b[j] = (b[j] & 0xFC00) | 0x1E; - b[i + 0x20] = (b[i + 0x20] & 0xFC00) | 0x1E; - } - else - { - b[j] = (b[j] & 0xFC00) | (sp0[j] + 0x14); - b[i + 0x20] = (b[i + 0x20] & 0xFC00) | (sp0[i] + 0x34); - } - j++; - } - - } - //_0804386A - else - { - for (i = 0; i < 4; i++) - { - if (sp0[i] == 0xFF) - { - b[i] = (b[i] & 0xFC00) | 0x1E; - b[i + 0x20] = (b[i + 0x20] & 0xFC00) | 0x1E; - } - else - { - b[i] = (b[i] & 0xFC00) | (sp0[i] + 0x14); - b[i + 0x20] = (b[i + 0x20] & 0xFC00) | (sp0[i] + 0x34); - } - } - } - asm(""::"r"(r9)); -} -#else -NAKED -void sub_8043740(s16 a, u16 *b, u8 c) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - adds r7, r1, 0\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - mov r10, r2\n\ - movs r3, 0\n\ - movs r2, 0\n\ -_0804375C:\n\ - lsls r0, r3, 24\n\ - asrs r0, 24\n\ - mov r3, sp\n\ - adds r1, r3, r0\n\ - strb r2, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3\n\ - ble _0804375C\n\ - movs r3, 0x3\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - mov r9, r0\n\ - mov r8, sp\n\ -_0804377C:\n\ - lsls r0, r5, 16\n\ - asrs r6, r0, 16\n\ - cmp r6, 0\n\ - ble _080437AA\n\ - lsls r4, r3, 24\n\ - asrs r4, 24\n\ - mov r1, sp\n\ - adds r5, r1, r4\n\ - adds r0, r6, 0\n\ - movs r1, 0xA\n\ - bl __modsi3\n\ - strb r0, [r5]\n\ - adds r0, r6, 0\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - subs r4, 0x1\n\ - lsls r4, 24\n\ - lsrs r3, r4, 24\n\ - b _0804377C\n\ -_080437AA:\n\ - lsls r1, r3, 24\n\ - asrs r0, r1, 24\n\ - cmp r0, r9\n\ - ble _080437CE\n\ - movs r4, 0xFF\n\ - movs r3, 0x1\n\ - negs r3, r3\n\ -_080437B8:\n\ - asrs r2, r1, 24\n\ - mov r5, sp\n\ - adds r1, r5, r2\n\ - ldrb r0, [r1]\n\ - orrs r0, r4\n\ - strb r0, [r1]\n\ - subs r2, 0x1\n\ - lsls r1, r2, 24\n\ - asrs r0, r1, 24\n\ - cmp r0, r3\n\ - bgt _080437B8\n\ -_080437CE:\n\ - mov r1, r8\n\ - ldrb r0, [r1, 0x3]\n\ - cmp r0, 0xFF\n\ - bne _080437DA\n\ - movs r0, 0\n\ - strb r0, [r1, 0x3]\n\ -_080437DA:\n\ - mov r2, r10\n\ - cmp r2, 0\n\ - bne _0804386A\n\ - movs r3, 0\n\ - movs r1, 0\n\ - movs r6, 0xFC\n\ - lsls r6, 8\n\ - movs r5, 0x1E\n\ - mov r12, r5\n\ -_080437EC:\n\ - lsls r1, 24\n\ - asrs r2, r1, 24\n\ - mov r0, sp\n\ - adds r5, r0, r2\n\ - ldrb r0, [r5]\n\ - mov r8, r1\n\ - cmp r0, 0xFF\n\ - bne _08043822\n\ - lsls r1, r2, 1\n\ - adds r1, r7\n\ - ldrh r2, [r1]\n\ - adds r0, r6, 0\n\ - ands r0, r2\n\ - mov r2, r12\n\ - orrs r0, r2\n\ - strh r0, [r1]\n\ - lsls r3, 24\n\ - asrs r1, r3, 23\n\ - adds r1, r7\n\ - adds r1, 0x40\n\ - ldrh r2, [r1]\n\ - adds r0, r6, 0\n\ - ands r0, r2\n\ - mov r5, r12\n\ - orrs r0, r5\n\ - strh r0, [r1]\n\ - b _08043852\n\ -_08043822:\n\ - lsls r2, 1\n\ - adds r2, r7\n\ - ldrh r0, [r2]\n\ - adds r1, r6, 0\n\ - ands r1, r0\n\ - ldrb r0, [r5]\n\ - adds r0, 0x14\n\ - orrs r1, r0\n\ - strh r1, [r2]\n\ - lsls r4, r3, 24\n\ - asrs r3, r4, 24\n\ - lsls r2, r3, 1\n\ - adds r2, r7\n\ - adds r2, 0x40\n\ - ldrh r0, [r2]\n\ - adds r1, r6, 0\n\ - ands r1, r0\n\ - mov r5, sp\n\ - adds r0, r5, r3\n\ - ldrb r0, [r0]\n\ - adds r0, 0x34\n\ - orrs r1, r0\n\ - strh r1, [r2]\n\ - adds r3, r4, 0\n\ -_08043852:\n\ - movs r0, 0x80\n\ - lsls r0, 17\n\ - add r0, r8\n\ - lsrs r1, r0, 24\n\ - movs r2, 0x80\n\ - lsls r2, 17\n\ - adds r0, r3, r2\n\ - lsrs r3, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3\n\ - ble _080437EC\n\ - b _080438CE\n\ -_0804386A:\n\ - movs r3, 0\n\ - movs r4, 0xFC\n\ - lsls r4, 8\n\ - movs r6, 0x1E\n\ -_08043872:\n\ - lsls r1, r3, 24\n\ - asrs r2, r1, 24\n\ - mov r3, sp\n\ - adds r5, r3, r2\n\ - ldrb r0, [r5]\n\ - adds r3, r1, 0\n\ - cmp r0, 0xFF\n\ - bne _0804389E\n\ - lsls r1, r2, 1\n\ - adds r1, r7\n\ - ldrh r2, [r1]\n\ - adds r0, r4, 0\n\ - ands r0, r2\n\ - orrs r0, r6\n\ - strh r0, [r1]\n\ - adds r1, 0x40\n\ - ldrh r2, [r1]\n\ - adds r0, r4, 0\n\ - ands r0, r2\n\ - orrs r0, r6\n\ - strh r0, [r1]\n\ - b _080438C0\n\ -_0804389E:\n\ - lsls r2, 1\n\ - adds r2, r7\n\ - ldrh r0, [r2]\n\ - adds r1, r4, 0\n\ - ands r1, r0\n\ - ldrb r0, [r5]\n\ - adds r0, 0x14\n\ - orrs r1, r0\n\ - strh r1, [r2]\n\ - adds r2, 0x40\n\ - ldrh r0, [r2]\n\ - adds r1, r4, 0\n\ - ands r1, r0\n\ - ldrb r0, [r5]\n\ - adds r0, 0x34\n\ - orrs r1, r0\n\ - strh r1, [r2]\n\ -_080438C0:\n\ - movs r5, 0x80\n\ - lsls r5, 17\n\ - adds r0, r3, r5\n\ - lsrs r3, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3\n\ - ble _08043872\n\ -_080438CE:\n\ - add sp, 0x4\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\ - .syntax divided\n"); -} -#endif - -void unref_sub_80438E0(s16 a, s16 b, u16 *c) -{ - c[4] = 0x1E; - sub_8043740(b, c, 0); - sub_8043740(a, c + 5, 1); -} - -u8 battle_make_oam_normal_battle(u8 a) -{ - int sp0 = 0; - u8 spriteId1; - u8 spriteId2; - u8 spriteId3; - struct Sprite *sprite; - - if (!IsDoubleBattle()) - { - if (GetBattlerSide(a) == 0) - { - spriteId1 = CreateSprite(&gSpriteTemplates_820A4EC[0], 240, 160, 1); - spriteId2 = CreateSpriteAtEnd(&gSpriteTemplates_820A4EC[0], 240, 160, 1); - - gSprites[spriteId1].oam.shape = 0; - gSprites[spriteId2].oam.shape = 0; - gSprites[spriteId2].oam.tileNum += 64; - } - else - { - spriteId1 = CreateSprite(&gSpriteTemplates_820A51C[0], 240, 160, 1); - spriteId2 = CreateSpriteAtEnd(&gSpriteTemplates_820A51C[0], 240, 160, 1); - - gSprites[spriteId2].oam.tileNum += 32; - sp0 = 2; - } - //_080439F2 - - gSprites[spriteId1].oam.affineParam = spriteId2; - gSprites[spriteId2].data[5] = spriteId1; - gSprites[spriteId2].callback = sub_8043D5C; - } - //_08043A28 - else - { - if (GetBattlerSide(a) == 0) - { - spriteId1 = CreateSprite(&gSpriteTemplates_820A4EC[GetBattlerPosition(a) / 2], 240, 160, 1); - spriteId2 = CreateSpriteAtEnd(&gSpriteTemplates_820A4EC[GetBattlerPosition(a) / 2], 240, 160, 1); - - gSprites[spriteId1].oam.affineParam = spriteId2; - gSprites[spriteId2].data[5] = spriteId1; - gSprites[spriteId2].oam.tileNum += 32; - gSprites[spriteId2].callback = sub_8043D5C; - sp0 = 1; - } - //_08043ACC - else - { - spriteId1 = CreateSprite(&gSpriteTemplates_820A51C[GetBattlerPosition(a) / 2], 240, 160, 1); - spriteId2 = CreateSpriteAtEnd(&gSpriteTemplates_820A51C[GetBattlerPosition(a) / 2], 240, 160, 1); - - gSprites[spriteId1].oam.affineParam = spriteId2; - gSprites[spriteId2].data[5] = spriteId1; - gSprites[spriteId2].oam.tileNum += 32; - gSprites[spriteId2].callback = sub_8043D5C; - sp0 = 2; - } - //_08043B4E - } - //_08043B50 - - spriteId3 = CreateSpriteAtEnd(&gSpriteTemplates_820A56C[gBanksBySide[a]], 140, 60, 0); - sprite = &gSprites[spriteId3]; - SetSubspriteTables(sprite, &gSubspriteTables_820A684[GetBattlerSide(a)]); - sprite->subspriteMode = 2; - sprite->oam.priority = 1; - CpuCopy32(sub_8043CDC(1), OBJ_VRAM0 + sprite->oam.tileNum * 32, 64); - - gSprites[spriteId1].data[5] = spriteId3; - gSprites[spriteId1].data[6] = a; - gSprites[spriteId1].invisible = TRUE; - gSprites[spriteId2].invisible = TRUE; - sprite->data[5] = spriteId1; - sprite->data[6] = sp0; - sprite->invisible = TRUE; - - return spriteId1; -} - -u8 battle_make_oam_safari_battle(void) -{ - u8 spriteId1 = CreateSprite(&gSpriteTemplate_820A54C, 240, 160, 1); - u8 spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A54C, 240, 160, 1); - - gSprites[spriteId1].oam.shape = 0; - gSprites[spriteId2].oam.shape = 0; - gSprites[spriteId2].oam.tileNum += 0x40; - gSprites[spriteId1].oam.affineParam = spriteId2; - gSprites[spriteId2].data[5] = spriteId1; - gSprites[spriteId2].callback = sub_8043D5C; - return spriteId1; -} - -static const void *sub_8043CDC(u8 a) -{ - return gHealthboxElementsGfxTable[a]; -} - -static void sub_8043CEC(struct Sprite *sprite) -{ - u8 r5 = sprite->data[5]; - - switch (sprite->data[6]) - { - case 0: - sprite->pos1.x = gSprites[r5].pos1.x + 16; - sprite->pos1.y = gSprites[r5].pos1.y; - break; - case 1: - sprite->pos1.x = gSprites[r5].pos1.x + 16; - sprite->pos1.y = gSprites[r5].pos1.y; - break; - default: - case 2: - sprite->pos1.x = gSprites[r5].pos1.x + 8; - sprite->pos1.y = gSprites[r5].pos1.y; - break; - } - sprite->pos2.x = gSprites[r5].pos2.x; - sprite->pos2.y = gSprites[r5].pos2.y; -} - -static void sub_8043D5C(struct Sprite *sprite) -{ - u8 data5 = sprite->data[5]; - - sprite->pos1.x = gSprites[data5].pos1.x + 64; - sprite->pos1.y = gSprites[data5].pos1.y; - sprite->pos2.x = gSprites[data5].pos2.x; - sprite->pos2.y = gSprites[data5].pos2.y; -} - -void sub_8043D84(u8 a, u8 b, u32 c, u32 d, u32 e) -{ - ewram17850[a].unk0 = b; - ewram17850[a].unk4 = c; - ewram17850[a].unk8 = d; - ewram17850[a].unkC = e; - ewram17850[a].unk10 = 0xFFFF8000; -} - -void sub_8043DB0(u8 a) -{ - gSprites[a].invisible = TRUE; - gSprites[gSprites[a].data[5]].invisible = TRUE; - gSprites[gSprites[a].oam.affineParam].invisible = TRUE; -} - -void sub_8043DFC(u8 a) -{ - gSprites[a].invisible = FALSE; - gSprites[gSprites[a].data[5]].invisible = FALSE; - gSprites[gSprites[a].oam.affineParam].invisible = FALSE; -} - -static void sub_8043E50(u8 spriteId, s16 x, s16 y) -{ - gSprites[spriteId].pos1.x = x; - gSprites[spriteId].pos1.y = y; -} - -void unref_sub_8043E70(u8 a) -{ - DestroySprite(&gSprites[gSprites[a].oam.affineParam]); - DestroySprite(&gSprites[gSprites[a].data[5]]); - DestroySprite(&gSprites[a]); -} - -void nullsub_11() -{ -} - -void UpdateOamPriorityInAllHealthboxes(u8 priority) -{ - s32 i; - - for (i = 0; i < gBattlersCount; i++) - { - u8 spriteId1; - u8 spriteId2; - u8 spriteId3; - - spriteId1 = gHealthboxIDs[i]; - spriteId2 = gSprites[spriteId1].oam.affineParam; - spriteId3 = gSprites[spriteId1].data[5]; - gSprites[spriteId1].oam.priority = priority; - gSprites[spriteId2].oam.priority = priority; - gSprites[spriteId3].oam.priority = priority; - } -} - -void sub_8043F44(u8 a) -{ - s16 x = 0; - s16 y = 0; - - if (!IsDoubleBattle()) - { - if (GetBattlerSide(a) != 0) - { - x = 44; - y = 30; - } - else - { - x = 158; - y = 88; - } - } - else - { - switch (GetBattlerPosition(a)) - { - case 0: - x = 159; - y = 77; - break; - case 2: - x = 171; - y = 102; - break; - case 1: - x = 44; - y = 19; - break; - case 3: - x = 32; - y = 44; - break; - } - } - sub_8043E50(gHealthboxIDs[a], x, y); -} - -#if ENGLISH -#define CHAR_LV_SEPARATOR CHAR_COLON -#elif GERMAN -#define CHAR_LV_SEPARATOR CHAR_PERIOD -#endif - -/*static*/ void sub_8043FC0(u8 a, u8 b) -{ - u8 str[30]; - u8 *const *r7; - u8 *ptr; - s32 i; - s32 two; - - // TODO: Make this a local variable - memcpy(str, gUnknown_0820A81C, sizeof(str)); - if (!IsDoubleBattle()) - { - if (GetBattlerSide(gSprites[a].data[6]) == 0) - r7 = gUnknown_0820A804; - else - r7 = gUnknown_0820A80C; - } - else - { - if (GetBattlerSide(gSprites[a].data[6]) == 0) - r7 = gUnknown_0820A814; - else - r7 = gUnknown_0820A80C; - } - - ptr = str + 6; - if (b == 100) - { - ptr = ConvertIntToDecimalStringN(ptr, 100, 0, 3); - } - else - { - *(ptr++) = EXT_CTRL_CODE_BEGIN; - *(ptr++) = 0x11; - *(ptr++) = 1; - *(ptr++) = EXT_CTRL_CODE_BEGIN; - *(ptr++) = 0x14; - *(ptr++) = 4; - *(ptr++) = CHAR_LV_SEPARATOR; - *(ptr++) = EXT_CTRL_CODE_BEGIN; - *(ptr++) = 0x14; - *(ptr++) = 0; - ptr = ConvertIntToDecimalStringN(ptr, b, 0, 2); - } - - *(ptr++) = EXT_CTRL_CODE_BEGIN; - *(ptr++) = 0x13; - *(ptr++) = 0xF; - *(ptr++) = EOS; - sub_80034D4(ewram0_9(0), str); - - two = 2; - for (i = 0; i < two; i++) - CpuCopy32((void *)(ewram0_9(1) + i * 64), r7[i] + gSprites[a].oam.tileNum * 32, 32); -} - -#ifdef NONMATCHING -void sub_80440EC(u8 a, s16 b, u8 c) -{ - u8 str[0x14]; - u8 *ptr; - s32 foo; - u8 *const *r4; - s32 i; - - // TODO: make this a local variable - memcpy(str, gUnknown_0820A864, sizeof(str)); - foo = gSprites[a].data[6]; - - if (IsDoubleBattle() == TRUE || GetBattlerSide(foo) == 1) - { - //_08044136 - sub_8044210(a, b, c); - return; - } - // - ptr = str + 6; - if (c == 0) - { - if (GetBattlerSide(gSprites[a].data[6]) == 0) - r4 = gUnknown_0820A83C; - else - r4 = gUnknown_0820A848; - c = 3; - ptr = sub_8003504(ptr, b, 0x13, 1); - *(ptr++) = 0xBA; - *(ptr++) = 0xFF; - sub_80034D4(ewram0_9(0), str); - } - else - { - if (GetBattlerSide(gSprites[a].data[6]) == 0) - r4 = gUnknown_0820A854; - else - r4 = gUnknown_0820A85C; - c = 2; - sub_8003504(ptr, b, 0xF, 1); - sub_80034D4(ewram0_9(0), str); - } - //asm(""::"r"(a)); - //_080441B6 - for (i = 0; i < c; i++) // _080440BC - { - void *temp = r4[i] + gSprites[a].oam.tileNum * 32; - CpuCopy32((void *)(ewram0_9(1) + i * 0x40), temp, 0x20); - } -} -#else -NAKED -void sub_80440EC(u8 a, s16 b, u8 c) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - sub sp, 0x14\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - lsls r1, 16\n\ - lsrs r6, r1, 16\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - mov r8, r2\n\ - ldr r1, _08044144 @ =gUnknown_0820A864\n\ - mov r0, sp\n\ - movs r2, 0x14\n\ - bl memcpy\n\ - ldr r1, _08044148 @ =gSprites\n\ - lsls r0, r7, 4\n\ - adds r0, r7\n\ - lsls r0, 2\n\ - adds r4, r0, r1\n\ - movs r0, 0x3A\n\ - ldrsh r5, [r4, r0]\n\ - bl IsDoubleBattle\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - beq _08044136\n\ - lsls r0, r5, 24\n\ - lsrs r0, 24\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _0804414C\n\ -_08044136:\n\ - lsls r1, r6, 16\n\ - asrs r1, 16\n\ - adds r0, r7, 0\n\ - mov r2, r8\n\ - bl sub_8044210\n\ - b _080441F0\n\ - .align 2, 0\n\ -_08044144: .4byte gUnknown_0820A864\n\ -_08044148: .4byte gSprites\n\ -_0804414C:\n\ - mov r5, sp\n\ - adds r5, 0x6\n\ - mov r0, r8\n\ - cmp r0, 0\n\ - bne _08044190\n\ - ldrh r0, [r4, 0x3A]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - ldr r4, _08044188 @ =gUnknown_0820A848\n\ - cmp r0, 0\n\ - bne _0804416A\n\ - ldr r4, _0804418C @ =gUnknown_0820A83C\n\ -_0804416A:\n\ - movs r0, 0x3\n\ - mov r8, r0\n\ - lsls r1, r6, 16\n\ - asrs r1, 16\n\ - adds r0, r5, 0\n\ - movs r2, 0x13\n\ - movs r3, 0x1\n\ - bl sub_8003504\n\ - adds r5, r0, 0\n\ - movs r0, 0xBA\n\ - strb r0, [r5]\n\ - movs r0, 0xFF\n\ - strb r0, [r5, 0x1]\n\ - b _080441B6\n\ - .align 2, 0\n\ -_08044188: .4byte gUnknown_0820A848\n\ -_0804418C: .4byte gUnknown_0820A83C\n\ -_08044190:\n\ - ldrh r0, [r4, 0x3A]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - ldr r4, _080441FC @ =gUnknown_0820A85C\n\ - cmp r0, 0\n\ - bne _080441A4\n\ - ldr r4, _08044200 @ =gUnknown_0820A854\n\ -_080441A4:\n\ - movs r0, 0x2\n\ - mov r8, r0\n\ - lsls r1, r6, 16\n\ - asrs r1, 16\n\ - adds r0, r5, 0\n\ - movs r2, 0xF\n\ - movs r3, 0x1\n\ - bl sub_8003504\n\ -_080441B6:\n\ - movs r0, 0x80\n\ - lsls r0, 18\n\ - mov r1, sp\n\ - bl sub_80034D4\n\ - mov r0, r8\n\ - cmp r0, 0\n\ - beq _080441F0\n\ - ldr r1, _08044204 @ =gSprites\n\ - lsls r0, r7, 4\n\ - adds r0, r7\n\ - lsls r0, 2\n\ - adds r6, r0, r1\n\ - adds r7, r4, 0\n\ - ldr r5, _08044208 @ =gSharedMem + 0x20\n\ - mov r4, r8\n\ -_080441D6:\n\ - ldrh r0, [r6, 0x4]\n\ - lsls r0, 22\n\ - lsrs r0, 17\n\ - ldm r7!, {r1}\n\ - adds r1, r0\n\ - adds r0, r5, 0\n\ - ldr r2, _0804420C @ =REG_BG0CNT\n\ - bl CpuSet\n\ - adds r5, 0x40\n\ - subs r4, 0x1\n\ - cmp r4, 0\n\ - bne _080441D6\n\ -_080441F0:\n\ - add sp, 0x14\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080441FC: .4byte gUnknown_0820A85C\n\ -_08044200: .4byte gUnknown_0820A854\n\ -_08044204: .4byte gSprites\n\ -_08044208: .4byte gSharedMem + 0x20\n\ -_0804420C: .4byte 0x04000008\n\ - .syntax divided\n"); -} -#endif - -/*static*/ void sub_8044210(u8 a, s16 b, u8 c) -{ - u8 str[0x14]; - u8 *ptr; - u8 *const *r7; - int r10; - int r4; - int i; - - // TODO: make this a local variable - memcpy(str, gUnknown_0820A89C, sizeof(str)); - r4 = gSprites[a].data[6]; - if ((ewram17800[r4].unk0_4) == 0) - return; - ptr = str + 6; - if (c == 0) - { - r7 = gUnknown_0820A87C; - r10 = 6; - ptr = sub_8003504(ptr, b, 0x2B, 1); - *(ptr++) = CHAR_SLASH; - *(ptr++) = EOS; - } - else - { - r7 = gUnknown_0820A894; - r10 = 2; - sub_8003504(ptr, b, 0xF, 1); - if (GetBattlerSide(r4) == 0) - { - CpuCopy32(sub_8043CDC(0x74), OBJ_VRAM0 + (gSprites[a].oam.tileNum + 0x34) * 32, 32); - } - } - r4 = gSprites[a].data[5]; - sub_80034D4(ewram0_9(0), str); - for (i = 0; i < r10; i++) - { - CpuCopy32((void *)(ewram0_9(1) + i * 0x40), r7[i] + gSprites[r4].oam.tileNum * 32, 32); - } -} - -#ifdef NONMATCHING -void sub_8044338(u8 a, struct Pokemon *pkmn) -{ - u8 str[0x14]; - u8 *r6; - s32 r8; - u8 nature; // = GetNature(pkmn); - s32 r7; - u8 i; - u8 r5; - - // TODO: make this a local variable - memcpy(str, gUnknown_0820A864, sizeof(str)); - r6 = ewram520[GetBattlerPosition(gSprites[a].data[6])].filler0; - r8 = 5; - nature = GetNature(pkmn); - StringCopy(str + 6, gNatureNames[nature]); - sub_80034D4(r6, str); - r7 = 6; - for (i = 0; i < (u32)r8; i++, r7++) //_080443AA - { - u8 val; - - if ((u8)(str[r7] - 0x37) <= 0x13 || (u8)(str[r7] + 0x79) <= 0x13) - val = 0x2C; - //_080443DC - else if ((u8)(str[r7] - 0x4B) <= 4 || (u8)(str[r7] + 0x65) <= 4) - val = 0x2D; - else - val = 0x2B; - - CpuCopy32(sub_8043CDC(val), r6 + i * 64, 32); - } - //r7 = 1; - //sp18 = a * 16; - for (r7 = 1; r7 < r8 + 1; r7++) - { - int foo; - - foo = gSprites[a].oam.tileNum + MACRO1(r7); - CpuCopy32(r6, (u8 *)(VRAM + 0x10000) + foo * 32, 32); - r6 += 32; - - foo = gSprites[a].oam.tileNum + 8 + MACRO1(r7); - CpuCopy32(r6, (u8 *)(VRAM + 0x10000) + foo * 32, 32); - r6 += 32; - } - //_08044486 - r5 = gSprites[a].data[5]; - ConvertIntToDecimalStringN(str + 6, ewram16089, 1, 2); - ConvertIntToDecimalStringN(str + 9, ewram16088, 1, 2); - str[5] = 0; - str[8] = 0xBA; - sub_80034D4(ewram0_9(0), str); - - for (r7 = 0; r7 < 5; r7++) - { - if (r7 <= 1) - { - int foo = (gSprites[r5].oam.tileNum + 2 + r7); - CpuCopy32(ewram0_9(1) + r7 * 0x40, (u8 *)(VRAM + 0x10000) + foo * 32, 32); - } - else - { - int foo = (r7 + gSprites[r5].oam.tileNum); - CpuCopy32(ewram0_9(1) + r7 * 0x40, (u8 *)(VRAM + 0x100C0) + foo * 32, 32); - } - } -} -#else -NAKED -void sub_8044338(u8 a, struct Pokemon *pkmn) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x20\n\ - adds r4, r1, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x14]\n\ - ldr r1, _080443CC @ =gUnknown_0820A864\n\ - mov r0, sp\n\ - movs r2, 0x14\n\ - bl memcpy\n\ - ldr r1, _080443D0 @ =gSprites\n\ - ldr r2, [sp, 0x14]\n\ - lsls r0, r2, 4\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x3A]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetBattlerPosition\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, r0, 1\n\ - adds r1, r0\n\ - lsls r1, 7\n\ - ldr r3, _080443D4 @ =gSharedMem + 0x520\n\ - adds r6, r1, r3\n\ - movs r0, 0x5\n\ - mov r8, r0\n\ - adds r0, r4, 0\n\ - bl GetNature\n\ - lsls r0, 24\n\ - mov r4, sp\n\ - adds r4, 0x6\n\ - ldr r1, _080443D8 @ =gNatureNames\n\ - lsrs r0, 22\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - adds r0, r4, 0\n\ - bl StringCopy\n\ - adds r0, r6, 0\n\ - mov r1, sp\n\ - bl sub_80034D4\n\ - movs r7, 0x6\n\ - movs r5, 0\n\ - mov r1, sp\n\ - adds r1, 0x9\n\ - str r1, [sp, 0x1C]\n\ -_080443AA:\n\ - mov r2, sp\n\ - adds r0, r2, r7\n\ - ldrb r1, [r0]\n\ - adds r0, r1, 0\n\ - subs r0, 0x37\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x13\n\ - bls _080443C8\n\ - adds r0, r1, 0\n\ - adds r0, 0x79\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x13\n\ - bhi _080443DC\n\ -_080443C8:\n\ - movs r0, 0x2C\n\ - b _080443FA\n\ - .align 2, 0\n\ -_080443CC: .4byte gUnknown_0820A864\n\ -_080443D0: .4byte gSprites\n\ -_080443D4: .4byte gSharedMem + 0x520\n\ -_080443D8: .4byte gNatureNames\n\ -_080443DC:\n\ - adds r0, r1, 0\n\ - subs r0, 0x4B\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x4\n\ - bls _080443F4\n\ - adds r0, r1, 0\n\ - adds r0, 0x65\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x4\n\ - bhi _080443F8\n\ -_080443F4:\n\ - movs r0, 0x2D\n\ - b _080443FA\n\ -_080443F8:\n\ - movs r0, 0x2B\n\ -_080443FA:\n\ - bl sub_8043CDC\n\ - lsls r1, r5, 6\n\ - adds r1, r6, r1\n\ - ldr r2, _080444F8 @ =REG_BG0CNT\n\ - bl CpuSet\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - adds r7, 0x1\n\ - cmp r5, r8\n\ - bcc _080443AA\n\ - movs r7, 0x1\n\ - ldr r3, [sp, 0x14]\n\ - lsls r3, 4\n\ - str r3, [sp, 0x18]\n\ - movs r0, 0x1\n\ - add r0, r8\n\ - mov r9, r0\n\ - cmp r7, r9\n\ - bge _08044486\n\ - ldr r1, _080444FC @ =gSprites\n\ - ldr r2, _080444F8 @ =REG_BG0CNT\n\ - mov r10, r2\n\ - ldr r2, [sp, 0x14]\n\ - adds r0, r3, r2\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - mov r8, r0\n\ -_08044436:\n\ - mov r3, r8\n\ - ldrh r0, [r3, 0x4]\n\ - lsls r0, 22\n\ - lsrs r0, 22\n\ - adds r5, r7, 0\n\ - cmp r7, 0\n\ - bge _08044446\n\ - adds r5, r7, 0x7\n\ -_08044446:\n\ - asrs r5, 3\n\ - lsls r4, r5, 3\n\ - subs r4, r7, r4\n\ - adds r0, r4\n\ - lsls r5, 6\n\ - adds r0, r5\n\ - lsls r0, 5\n\ - ldr r2, _08044500 @ =(VRAM + 0x10000)\n\ - adds r1, r0, r2\n\ - adds r0, r6, 0\n\ - mov r2, r10\n\ - bl CpuSet\n\ - adds r6, 0x20\n\ - mov r3, r8\n\ - ldrh r0, [r3, 0x4]\n\ - lsls r0, 22\n\ - lsrs r0, 22\n\ - adds r4, 0x8\n\ - adds r0, r4\n\ - adds r0, r5\n\ - lsls r0, 5\n\ - ldr r2, _08044500 @ =(VRAM + 0x10000)\n\ - adds r1, r0, r2\n\ - adds r0, r6, 0\n\ - mov r2, r10\n\ - bl CpuSet\n\ - adds r6, 0x20\n\ - adds r7, 0x1\n\ - cmp r7, r9\n\ - blt _08044436\n\ -_08044486:\n\ - ldr r6, _080444FC @ =gSprites\n\ - ldr r3, [sp, 0x18]\n\ - ldr r1, [sp, 0x14]\n\ - adds r0, r3, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrh r5, [r0, 0x38]\n\ - lsls r5, 24\n\ - lsrs r5, 24\n\ - ldr r4, _08044504 @ =gSharedMem\n\ - ldr r2, _08044508 @ =0x00016089\n\ - adds r0, r4, r2\n\ - ldrb r1, [r0]\n\ - mov r0, sp\n\ - adds r0, 0x6\n\ - movs r2, 0x1\n\ - movs r3, 0x2\n\ - bl ConvertIntToDecimalStringN\n\ - ldr r3, _0804450C @ =0x00016088\n\ - adds r4, r3\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp, 0x1C]\n\ - movs r2, 0x1\n\ - movs r3, 0x2\n\ - bl ConvertIntToDecimalStringN\n\ - mov r1, sp\n\ - movs r0, 0\n\ - strb r0, [r1, 0x5]\n\ - movs r0, 0xBA\n\ - strb r0, [r1, 0x8]\n\ - movs r0, 0x80\n\ - lsls r0, 18\n\ - bl sub_80034D4\n\ - movs r7, 0\n\ - lsls r0, r5, 4\n\ - adds r0, r5\n\ - lsls r0, 2\n\ - adds r5, r0, r6\n\ - ldr r4, _08044510 @ =gSharedMem + 0x20\n\ -_080444DA:\n\ - cmp r7, 0x1\n\ - bgt _08044514\n\ - ldrh r1, [r5, 0x4]\n\ - lsls r1, 22\n\ - lsrs r1, 22\n\ - adds r0, r7, 0x2\n\ - adds r1, r0\n\ - lsls r1, 5\n\ - ldr r0, _08044500 @ =(VRAM + 0x10000)\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - ldr r2, _080444F8 @ =REG_BG0CNT\n\ - bl CpuSet\n\ - b _0804452A\n\ - .align 2, 0\n\ -_080444F8: .4byte 0x04000008\n\ -_080444FC: .4byte gSprites\n\ -_08044500: .4byte 0x06010000\n\ -_08044504: .4byte gSharedMem\n\ -_08044508: .4byte 0x00016089\n\ -_0804450C: .4byte 0x00016088\n\ -_08044510: .4byte gSharedMem + 0x20\n\ -_08044514:\n\ - ldrh r1, [r5, 0x4]\n\ - lsls r1, 22\n\ - lsrs r1, 22\n\ - adds r1, r7, r1\n\ - lsls r1, 5\n\ - ldr r2, _08044544 @ =0x060100c0\n\ - adds r1, r2\n\ - adds r0, r4, 0\n\ - ldr r2, _08044548 @ =REG_BG0CNT\n\ - bl CpuSet\n\ -_0804452A:\n\ - adds r4, 0x40\n\ - adds r7, 0x1\n\ - cmp r7, 0x4\n\ - ble _080444DA\n\ - add sp, 0x20\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\ -_08044544: .4byte 0x060100c0\n\ -_08044548: .4byte 0x04000008\n\ - .syntax divided\n"); -} -#endif - -extern u8 gUnknown_020297ED; - -void sub_804454C(void) -{ - s32 i; - u8 spriteId; - - for (i = 0; i < gBattlersCount; i++) - { - if (gSprites[gHealthboxIDs[i]].callback == SpriteCallbackDummy -#if DEBUG - && (gUnknown_020297ED != 0 || GetBattlerSide(i) != 1) -#else - && GetBattlerSide(i) != 1 -#endif - && (IsDoubleBattle() || GetBattlerSide(i) != 0)) - { - u8 r6; - - ewram17800[i].unk0_4 ^= 1; - r6 = ewram17800[i].unk0_4; - if (GetBattlerSide(i) == 0) - { - - if (!IsDoubleBattle()) - continue; - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - continue; - - if (r6 == 1) - { - spriteId = gSprites[gHealthboxIDs[i]].data[5]; - - CpuFill32(0, OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32, 0x100); - sub_8044210(gHealthboxIDs[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_HP), 0); - sub_8044210(gHealthboxIDs[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), 1); - } - else - { - draw_status_ailment_maybe(gHealthboxIDs[i]); - sub_8045A5C(gHealthboxIDs[i], &gPlayerParty[gBattlerPartyIndexes[i]], 5); - CpuCopy32(sub_8043CDC(0x75), OBJ_VRAM0 + 0x680 + gSprites[gHealthboxIDs[i]].oam.tileNum * 32, 32); - } - } - else - { - if (r6 == 1) - { - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - { - sub_8044338(gHealthboxIDs[i], &gEnemyParty[gBattlerPartyIndexes[i]]); - } - else - { - spriteId = gSprites[gHealthboxIDs[i]].data[5]; - - CpuFill32(0, OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32, 0x100); - sub_8044210(gHealthboxIDs[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_HP), 0); - sub_8044210(gHealthboxIDs[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), 1); - } - } - else - { - draw_status_ailment_maybe(gHealthboxIDs[i]); - sub_8045A5C(gHealthboxIDs[i], &gEnemyParty[gBattlerPartyIndexes[i]], 5); - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - sub_8045A5C(gHealthboxIDs[i], &gEnemyParty[gBattlerPartyIndexes[i]], 4); - } - } - gSprites[gHealthboxIDs[i]].data[7] ^= 1; - } - } -} - -// This function almost matches except for just two instructions around 0x08044B52 that are swapped. -#ifdef NONMATCHING -u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d) -{ - u8 r7; - s16 x; - s16 y; - s16 r8; - s16 r5; - - int i; - u8 sp[6]; - s8 sp14; - u8 sp18; - u8 taskId; - - if (c == 0 || GetBattlerPosition(a) != 3) - { - if (GetBattlerSide(a) == 0) - { - r7 = 0; - x = 136; - y = 96; - r8 = 100; - r5 = -5; - } - else - { - r7 = 1; - if (c == 0 || !IsDoubleBattle()) - { - x = 104; - y = 40; - } - else - { - x = 104; - y = 16; - } - r8 = -100; - r5 = 5; - } - } - else - { - r7 = 1; - x = 104; - y = 40; - r8 = -100; - r5 = 5; - } - //_08044884 - - sp14 = 0; - for (i = 0; i < 6; i++) //_080448A0 - { - if (b[i].unk0 != 0xFFFF) - sp14++; - } - - LoadCompressedObjectPic(&gUnknown_0820A754[r7]); - LoadSpriteSheet(&gUnknown_0820A784[r7]); - LoadSpritePalette(&gUnknown_0820A764[r7]); - LoadSpritePalette(&gUnknown_0820A774[r7]); - - sp18 = CreateSprite(&gSpriteTemplate_820A7A4[r7], x, y, 10); - SetSubspriteTables(&gSprites[sp18], gSubspriteTables_820A6E4); - gSprites[sp18].pos2.x = r8; - gSprites[sp18].data[0] = r5; - if (r7 != 0) - { - gSprites[sp18].pos1.x -= 96; - gSprites[sp18].oam.matrixNum = 8; - } - else - { - gSprites[sp18].pos1.x += 0x60; - } - //_0804495A - for (i = 0; i < 6; i++) //_08044970 - { - sp[i] = CreateSpriteAtEnd(&gSpriteTemplate_820A7D4[r7], x, y - 4, 9); - if (d == 0) - { - gSprites[sp[i]].callback = sub_8045180; - } - //_080449A0 - if (r7 == 0) - { - gSprites[sp[i]].pos2.x = 0; - gSprites[sp[i]].pos2.y = 0; - } - //_080449BE - gSprites[sp[i]].data[0] = sp18; - if (r7 == 0) - { - gSprites[sp[i]].pos1.x += 10 * i + 24; - gSprites[sp[i]].data[1] = i * 7 + 10; - gSprites[sp[i]].pos2.x = 120; - } - //_08044A18 - else - { - gSprites[sp[i]].pos1.x -= 10 * (5 - i) + 24; - gSprites[sp[i]].data[1] = (6 - i) * 7 + 10; - gSprites[sp[i]].pos2.x = -120; - } - //_08044A56 - gSprites[sp[i]].data[2] = r7; - } - //_08044A76 - if (GetBattlerSide(a) == 0) - { - for (i = 0; i < 6; i++) //_08044A9A - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) // && b[i] != 0xFFFF && b[i] - { - if (b[i].unk0 == 0xFFFF) - { - //_08044AE6 - gSprites[sp[i]].oam.tileNum += 1; - gSprites[sp[i]].data[7] = 1; - // to _08044B52 - } - else if (b[i].unk0 == 0) - { - gSprites[sp[i]].oam.tileNum += 3; - // to _08044B46 - } - else if (b[i].unk4 != 0) - { - gSprites[sp[i]].oam.tileNum += 2; - } - } - //_08044ADC - else - { - if (i >= sp14) - { - //_08044AE6 - gSprites[sp[i]].oam.tileNum += 1; - gSprites[sp[i]].data[7] = 1; - // to _08044B52 - } - else if (b[i].unk0 == 0) - { - //_08044B14 - gSprites[sp[i]].oam.tileNum += 3; - // to _08044B46 - } - else if (b[i].unk4 != 0) - { - gSprites[sp[i]].oam.tileNum += 2; - } - } - } - } - //_08044B5E - else - { - // Mismatch occurrs in this loop initialization - for (i = 0; i < 6; i++) - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (b[i].unk0 == 0xFFFF) - { - gSprites[sp[5 - i]].oam.tileNum += 1; - gSprites[sp[5 - i]].data[7] = 1; - } - else if (b[i].unk0 == 0) - { - gSprites[sp[5 - i]].oam.tileNum += 3; - } - else if (b[i].unk4 != 0) - { - gSprites[sp[5 - i]].oam.tileNum += 2; - } - } - else - { - if (i >= sp14) - { - gSprites[sp[5 - i]].oam.tileNum += 1; - gSprites[sp[5 - i]].data[7] = 1; - } - else if (b[i].unk0 == 0) - { - gSprites[sp[5 - i]].oam.tileNum += 3; - } - else if (b[i].unk4 != 0) - { - gSprites[sp[5 - i]].oam.tileNum += 2; - } - } - // This corrects the initialization order, but messes up the counter update order - asm(""::"r"(&b[i])); - } - } - //_08044C38 - taskId = CreateTask(TaskDummy, 5); - gTasks[taskId].data[0] = a; - gTasks[taskId].data[1] = sp18; - for (i = 0; i < 6; i++) - gTasks[taskId].data[3 + i] = sp[i]; - gTasks[taskId].data[10] = d; - PlaySE12WithPanning(SE_TB_START, 0); - return taskId; -} -#else -NAKED -u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x28\n\ - str r1, [sp, 0xC]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x8]\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - adds r4, r2, 0\n\ - lsls r3, 24\n\ - lsrs r3, 24\n\ - str r3, [sp, 0x10]\n\ - cmp r4, 0\n\ - beq _08044834\n\ - bl GetBattlerPosition\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x3\n\ - beq _08044878\n\ -_08044834:\n\ - ldr r0, [sp, 0x8]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08044854\n\ - movs r7, 0\n\ - movs r1, 0x88\n\ - movs r2, 0x60\n\ - movs r0, 0x64\n\ - mov r8, r0\n\ - ldr r5, _08044850 @ =0x0000fffb\n\ - b _08044884\n\ - .align 2, 0\n\ -_08044850: .4byte 0x0000fffb\n\ -_08044854:\n\ - movs r7, 0x1\n\ - cmp r4, 0\n\ - beq _08044864\n\ - bl IsDoubleBattle\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0804486A\n\ -_08044864:\n\ - movs r1, 0x68\n\ - movs r2, 0x28\n\ - b _0804486E\n\ -_0804486A:\n\ - movs r1, 0x68\n\ - movs r2, 0x10\n\ -_0804486E:\n\ - ldr r3, _08044874 @ =0x0000ff9c\n\ - mov r8, r3\n\ - b _08044882\n\ - .align 2, 0\n\ -_08044874: .4byte 0x0000ff9c\n\ -_08044878:\n\ - movs r7, 0x1\n\ - movs r1, 0x68\n\ - movs r2, 0x28\n\ - ldr r5, _08044930 @ =0x0000ff9c\n\ - mov r8, r5\n\ -_08044882:\n\ - movs r5, 0x5\n\ -_08044884:\n\ - movs r6, 0\n\ - str r6, [sp, 0x14]\n\ - lsls r4, r7, 3\n\ - ldr r0, _08044934 @ =gUnknown_0820A754\n\ - mov r10, r0\n\ - lsls r3, r7, 1\n\ - mov r9, r3\n\ - lsls r1, 16\n\ - str r1, [sp, 0x20]\n\ - lsls r2, 16\n\ - str r2, [sp, 0x24]\n\ - ldr r2, _08044938 @ =0x0000ffff\n\ - ldr r1, [sp, 0xC]\n\ - movs r6, 0x5\n\ -_080448A0:\n\ - ldrh r0, [r1]\n\ - cmp r0, r2\n\ - beq _080448B4\n\ - ldr r3, [sp, 0x14]\n\ - lsls r0, r3, 24\n\ - movs r3, 0x80\n\ - lsls r3, 17\n\ - adds r0, r3\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x14]\n\ -_080448B4:\n\ - adds r1, 0x8\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _080448A0\n\ - mov r6, r10\n\ - adds r0, r4, r6\n\ - bl LoadCompressedObjectPic\n\ - ldr r0, _0804493C @ =gUnknown_0820A784\n\ - adds r0, r4, r0\n\ - bl LoadSpriteSheet\n\ - ldr r0, _08044940 @ =gUnknown_0820A764\n\ - adds r0, r4, r0\n\ - bl LoadSpritePalette\n\ - ldr r0, _08044944 @ =gUnknown_0820A774\n\ - adds r0, r4, r0\n\ - bl LoadSpritePalette\n\ - mov r1, r9\n\ - adds r0, r1, r7\n\ - lsls r0, 3\n\ - ldr r1, _08044948 @ =gSpriteTemplate_820A7A4\n\ - adds r0, r1\n\ - ldr r2, [sp, 0x20]\n\ - asrs r1, r2, 16\n\ - ldr r3, [sp, 0x24]\n\ - asrs r2, r3, 16\n\ - movs r3, 0xA\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x18]\n\ - lsls r0, 4\n\ - ldr r6, [sp, 0x18]\n\ - adds r0, r6\n\ - lsls r0, 2\n\ - ldr r1, _0804494C @ =gSprites\n\ - adds r4, r0, r1\n\ - ldr r1, _08044950 @ =gSubspriteTables_820A6E4\n\ - adds r0, r4, 0\n\ - bl SetSubspriteTables\n\ - mov r0, r8\n\ - strh r0, [r4, 0x24]\n\ - strh r5, [r4, 0x2E]\n\ - cmp r7, 0\n\ - beq _08044954\n\ - ldrh r0, [r4, 0x20]\n\ - subs r0, 0x60\n\ - strh r0, [r4, 0x20]\n\ - ldrb r1, [r4, 0x3]\n\ - movs r0, 0x3F\n\ - negs r0, r0\n\ - ands r0, r1\n\ - movs r1, 0x10\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x3]\n\ - b _0804495A\n\ - .align 2, 0\n\ -_08044930: .4byte 0x0000ff9c\n\ -_08044934: .4byte gUnknown_0820A754\n\ -_08044938: .4byte 0x0000ffff\n\ -_0804493C: .4byte gUnknown_0820A784\n\ -_08044940: .4byte gUnknown_0820A764\n\ -_08044944: .4byte gUnknown_0820A774\n\ -_08044948: .4byte gSpriteTemplate_820A7A4\n\ -_0804494C: .4byte gSprites\n\ -_08044950: .4byte gSubspriteTables_820A6E4\n\ -_08044954:\n\ - ldrh r0, [r4, 0x20]\n\ - adds r0, 0x60\n\ - strh r0, [r4, 0x20]\n\ -_0804495A:\n\ - movs r6, 0\n\ - ldr r1, _08044A04 @ =gSprites\n\ - mov r10, r1\n\ - mov r4, sp\n\ - mov r2, r9\n\ - adds r0, r2, r7\n\ - lsls r0, 3\n\ - str r0, [sp, 0x1C]\n\ - movs r3, 0xA\n\ - mov r9, r3\n\ - mov r8, r6\n\ -_08044970:\n\ - ldr r0, _08044A08 @ =gSpriteTemplate_820A7D4\n\ - ldr r5, [sp, 0x24]\n\ - ldr r1, _08044A0C @ =0xfffc0000\n\ - adds r2, r5, r1\n\ - ldr r3, [sp, 0x1C]\n\ - adds r0, r3, r0\n\ - ldr r5, [sp, 0x20]\n\ - asrs r1, r5, 16\n\ - asrs r2, 16\n\ - movs r3, 0x9\n\ - bl CreateSpriteAtEnd\n\ - strb r0, [r4]\n\ - ldr r0, [sp, 0x10]\n\ - cmp r0, 0\n\ - bne _080449A0\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 4\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - ldr r2, _08044A10 @ =gSprites + 0x1C\n\ - adds r1, r2\n\ - ldr r0, _08044A14 @ =sub_8045180\n\ - str r0, [r1]\n\ -_080449A0:\n\ - ldr r5, _08044A04 @ =gSprites\n\ - cmp r7, 0\n\ - bne _080449BE\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - add r0, r10\n\ - strh r7, [r0, 0x24]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - add r0, r10\n\ - strh r7, [r0, 0x26]\n\ -_080449BE:\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - movs r1, 0\n\ - mov r3, sp\n\ - ldrh r3, [r3, 0x18]\n\ - strh r3, [r0, 0x2E]\n\ - cmp r7, 0\n\ - bne _08044A18\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 4\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrh r0, [r1, 0x20]\n\ - adds r0, 0x18\n\ - add r0, r8\n\ - strh r0, [r1, 0x20]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - mov r1, r9\n\ - strh r1, [r0, 0x30]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - movs r1, 0x78\n\ - b _08044A56\n\ - .align 2, 0\n\ -_08044A04: .4byte gSprites\n\ -_08044A08: .4byte gSpriteTemplate_820A7D4\n\ -_08044A0C: .4byte 0xfffc0000\n\ -_08044A10: .4byte gSprites + 0x1C\n\ -_08044A14: .4byte sub_8045180\n\ -_08044A18:\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r5\n\ - ldrh r3, [r2, 0x20]\n\ - subs r3, 0x18\n\ - movs r1, 0x5\n\ - subs r1, r6\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 1\n\ - subs r3, r0\n\ - strh r3, [r2, 0x20]\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r5\n\ - movs r1, 0x6\n\ - subs r1, r6\n\ - lsls r0, r1, 3\n\ - subs r0, r1\n\ - adds r0, 0xA\n\ - strh r0, [r2, 0x30]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - ldr r1, _08044AC4 @ =0x0000ff88\n\ -_08044A56:\n\ - strh r1, [r0, 0x24]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - strh r7, [r0, 0x32]\n\ - adds r4, 0x1\n\ - movs r2, 0x7\n\ - add r9, r2\n\ - movs r3, 0xA\n\ - add r8, r3\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - bgt _08044A76\n\ - b _08044970\n\ -_08044A76:\n\ - ldr r0, [sp, 0x8]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08044B5E\n\ - movs r6, 0\n\ - ldr r5, _08044AC8 @ =gBattleTypeFlags\n\ - mov r10, r5\n\ - ldr r0, _08044ACC @ =0x0000ffff\n\ - mov r9, r0\n\ - ldr r7, _08044AD0 @ =gSprites\n\ - ldr r1, _08044AD4 @ =0x000003ff\n\ - mov r12, r1\n\ - ldr r2, _08044AD8 @ =0xfffffc00\n\ - mov r8, r2\n\ - mov r4, sp\n\ - ldr r5, [sp, 0xC]\n\ -_08044A9A:\n\ - mov r3, r10\n\ - ldrh r1, [r3]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08044ADC\n\ - ldrh r0, [r5]\n\ - cmp r0, r9\n\ - beq _08044AE6\n\ - cmp r0, 0\n\ - bne _08044B2E\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x3\n\ - b _08044B46\n\ - .align 2, 0\n\ -_08044AC4: .4byte 0x0000ff88\n\ -_08044AC8: .4byte gBattleTypeFlags\n\ -_08044ACC: .4byte 0x0000ffff\n\ -_08044AD0: .4byte gSprites\n\ -_08044AD4: .4byte 0x000003ff\n\ -_08044AD8: .4byte 0xfffffc00\n\ -_08044ADC:\n\ - ldr r1, [sp, 0x14]\n\ - lsls r0, r1, 24\n\ - asrs r0, 24\n\ - cmp r6, r0\n\ - blt _08044B14\n\ -_08044AE6:\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x1\n\ - mov r0, r12\n\ - ands r1, r0\n\ - mov r0, r8\n\ - ands r0, r3\n\ - orrs r0, r1\n\ - strh r0, [r2, 0x4]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r7\n\ - movs r1, 0x1\n\ - strh r1, [r0, 0x3C]\n\ - b _08044B52\n\ -_08044B14:\n\ - ldrh r0, [r5]\n\ - cmp r0, 0\n\ - bne _08044B2E\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x3\n\ - b _08044B46\n\ -_08044B2E:\n\ - ldr r0, [r5, 0x4]\n\ - cmp r0, 0\n\ - beq _08044B52\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x2\n\ -_08044B46:\n\ - mov r0, r12\n\ - ands r1, r0\n\ - mov r0, r8\n\ - ands r0, r3\n\ - orrs r0, r1\n\ - strh r0, [r2, 0x4]\n\ -_08044B52:\n\ - adds r4, 0x1\n\ - adds r5, 0x8\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08044A9A\n\ - b _08044C38\n\ -_08044B5E:\n\ - movs r6, 0\n\ - ldr r1, _08044BA4 @ =gBattleTypeFlags\n\ - mov r10, r1\n\ - ldr r2, _08044BA8 @ =0x0000ffff\n\ - mov r9, r2\n\ - ldr r7, _08044BAC @ =gSprites\n\ - ldr r3, _08044BB0 @ =0x000003ff\n\ - mov r12, r3\n\ - ldr r5, _08044BB4 @ =0xfffffc00\n\ - mov r8, r5\n\ - ldr r5, [sp, 0xC]\n\ - mov r4, sp\n\ - adds r4, 0x5\n\ -_08044B78:\n\ - mov r0, r10\n\ - ldrh r1, [r0]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08044BB8\n\ - ldrh r0, [r5]\n\ - cmp r0, r9\n\ - beq _08044BC2\n\ - cmp r0, 0\n\ - bne _08044C0A\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x3\n\ - b _08044C22\n\ - .align 2, 0\n\ -_08044BA4: .4byte gBattleTypeFlags\n\ -_08044BA8: .4byte 0x0000ffff\n\ -_08044BAC: .4byte gSprites\n\ -_08044BB0: .4byte 0x000003ff\n\ -_08044BB4: .4byte 0xfffffc00\n\ -_08044BB8:\n\ - ldr r1, [sp, 0x14]\n\ - lsls r0, r1, 24\n\ - asrs r0, 24\n\ - cmp r6, r0\n\ - blt _08044BF0\n\ -_08044BC2:\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x1\n\ - mov r0, r12\n\ - ands r1, r0\n\ - mov r0, r8\n\ - ands r0, r3\n\ - orrs r0, r1\n\ - strh r0, [r2, 0x4]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r7\n\ - movs r1, 0x1\n\ - strh r1, [r0, 0x3C]\n\ - b _08044C2E\n\ -_08044BF0:\n\ - ldrh r0, [r5]\n\ - cmp r0, 0\n\ - bne _08044C0A\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x3\n\ - b _08044C22\n\ -_08044C0A:\n\ - ldr r0, [r5, 0x4]\n\ - cmp r0, 0\n\ - beq _08044C2E\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x2\n\ -_08044C22:\n\ - mov r0, r12\n\ - ands r1, r0\n\ - mov r0, r8\n\ - ands r0, r3\n\ - orrs r0, r1\n\ - strh r0, [r2, 0x4]\n\ -_08044C2E:\n\ - subs r4, 0x1\n\ - adds r5, 0x8\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08044B78\n\ -_08044C38:\n\ - ldr r0, _08044C98 @ =TaskDummy\n\ - movs r1, 0x5\n\ - bl CreateTask\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldr r2, _08044C9C @ =gTasks\n\ - lsls r3, r4, 2\n\ - adds r1, r3, r4\n\ - lsls r1, 3\n\ - adds r0, r1, r2\n\ - mov r5, sp\n\ - ldrh r5, [r5, 0x8]\n\ - strh r5, [r0, 0x8]\n\ - mov r6, sp\n\ - ldrh r6, [r6, 0x18]\n\ - strh r6, [r0, 0xA]\n\ - movs r6, 0\n\ - adds r0, r2, 0\n\ - adds r0, 0xE\n\ - adds r1, r0\n\ -_08044C62:\n\ - mov r5, sp\n\ - adds r0, r5, r6\n\ - ldrb r0, [r0]\n\ - strh r0, [r1]\n\ - adds r1, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08044C62\n\ - adds r0, r3, r4\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - ldrh r6, [r5, 0x10]\n\ - strh r6, [r0, 0x1C]\n\ - movs r0, 0x72\n\ - movs r1, 0\n\ - bl PlaySE12WithPanning\n\ - adds r0, r4, 0\n\ - add sp, 0x28\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08044C98: .4byte TaskDummy\n\ -_08044C9C: .4byte gTasks\n\ - .syntax divided\n"); -} -#endif - -void sub_8044CA0(u8 taskId) -{ - u8 sp[6]; - u8 r9; - u8 r10; - u8 sp8; - s32 i; - - r9 = gTasks[taskId].data[10]; - r10 = gTasks[taskId].data[1]; - sp8 = gTasks[taskId].data[0]; - for (i = 0; i < 6; i++) - sp[i] = gTasks[taskId].data[3 + i]; - - REG_BLDCNT = 0x3F40; - REG_BLDALPHA = 0x10; - gTasks[taskId].data[15] = 16; - for (i = 0; i < 6; i++) - gSprites[sp[i]].oam.objMode = 1; - gSprites[r10].oam.objMode = 1; - if (r9 != 0) - { - for (i = 0; i < 6; i++) - { - if (GetBattlerSide(sp8) != 0) - { - gSprites[sp[5 - i]].data[1] = 7 * i; - gSprites[sp[5 - i]].data[3] = 0; - gSprites[sp[5 - i]].data[4] = 0; - gSprites[sp[5 - i]].callback = sub_8045110; - } - else - { - gSprites[sp[i]].data[1] = 7 * i; - gSprites[sp[i]].data[3] = 0; - gSprites[sp[i]].data[4] = 0; - gSprites[sp[i]].callback = sub_8045110; - } - } - gSprites[r10].data[0] /= 2; - gSprites[r10].data[1] = 0; - gSprites[r10].callback = sub_8045048; - SetSubspriteTables(&gSprites[r10], gSubspriteTables_820A6EC); - gTasks[taskId].func = sub_8044E74; - } - else - { - gTasks[taskId].func = sub_8044F70; - } -} - -static void sub_8044E74(u8 taskId) -{ - u16 temp = gTasks[taskId].data[11]++; - - if ((temp & 1) == 0) - { - gTasks[taskId].data[15]--; - if (gTasks[taskId].data[15] < 0) - return; - REG_BLDALPHA = (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8); - } - if (gTasks[taskId].data[15] == 0) - gTasks[taskId].func = sub_8044ECC; -} - -static void sub_8044ECC(u8 taskId) -{ - u8 sp[6]; - s32 i; - - gTasks[taskId].data[15]--; - if (gTasks[taskId].data[15] == -1) - { - u8 var = gTasks[taskId].data[1]; - - for (i = 0; i < 6; i++) - sp[i] = gTasks[taskId].data[3 + i]; - DestroySpriteAndFreeResources(&gSprites[var]); - DestroySpriteAndFreeResources(&gSprites[sp[0]]); - for (i = 1; i < 6; i++) - DestroySprite(&gSprites[sp[i]]); - } - else if (gTasks[taskId].data[15] == -3) - { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroyTask(taskId); - } -} - -static void sub_8044F70(u8 taskId) -{ - u8 sp[6]; - s32 i; - - gTasks[taskId].data[15]--; - // Same as above function except with this check. - if (gTasks[taskId].data[15] >= 0) - { - REG_BLDALPHA = (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8); - } - else if (gTasks[taskId].data[15] == -1) - { - u8 var = gTasks[taskId].data[1]; - - for (i = 0; i < 6; i++) - sp[i] = gTasks[taskId].data[3 + i]; - DestroySpriteAndFreeResources(&gSprites[var]); - DestroySpriteAndFreeResources(&gSprites[sp[0]]); - for (i = 1; i < 6; i++) - DestroySprite(&gSprites[sp[i]]); - } - else if (gTasks[taskId].data[15] == -3) - { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroyTask(taskId); - } -} - -static void sub_8045030(struct Sprite *sprite) -{ - if (sprite->pos2.x != 0) - sprite->pos2.x += sprite->data[0]; -} - -static void sub_8045048(struct Sprite *sprite) -{ - sprite->data[1] += 32; - if (sprite->data[0] > 0) - sprite->pos2.x += sprite->data[1] >> 4; - else - sprite->pos2.x -= sprite->data[1] >> 4; - sprite->data[1] &= 0xF; -} - -static void sub_804507C(struct Sprite *sprite) -{ - u8 r3; - u16 r2; - s8 pan; - - if (sprite->data[1] > 0) - { - sprite->data[1]--; - return; - } - r3 = sprite->data[2]; - r2 = sprite->data[3]; - r2 += 56; - sprite->data[3] = r2 & 0xFFF0; - if (r3 != 0) - { - sprite->pos2.x += r2 >> 4; - if (sprite->pos2.x > 0) - sprite->pos2.x = 0; - } - else - { - sprite->pos2.x -= r2 >> 4; - if (sprite->pos2.x < 0) - sprite->pos2.x = 0; - } - if (sprite->pos2.x == 0) - { - pan = 63; - if (r3 != 0) - pan = -64; - if (sprite->data[7] != 0) - PlaySE2WithPanning(SE_TB_KARA, pan); - else - PlaySE1WithPanning(SE_TB_KON, pan); - sprite->callback = SpriteCallbackDummy; - } -} - -static void sub_8045110(struct Sprite *sprite) -{ - u8 r0; - u16 r2; - - if (sprite->data[1] > 0) - { - sprite->data[1]--; - return; - } - r0 = sprite->data[2]; - r2 = sprite->data[3]; - r2 += 56; - sprite->data[3] = r2 & 0xFFF0; - if (r0 != 0) - sprite->pos2.x += r2 >> 4; - else - sprite->pos2.x -= r2 >> 4; - if (sprite->pos2.x + sprite->pos1.x > 248 - || sprite->pos2.x + sprite->pos1.x < -8) - { - sprite->invisible = TRUE; - sprite->callback = SpriteCallbackDummy; - } -} - -void sub_8045180(struct Sprite *sprite) -{ - u8 spriteId = sprite->data[0]; - - sprite->pos2.x = gSprites[spriteId].pos2.x; - sprite->pos2.y = gSprites[spriteId].pos2.y; -} - -/*static*/ void sub_80451A0(u8 a, struct Pokemon *pkmn) -{ - u8 nickname[POKEMON_NAME_LENGTH]; - u8 gender; - u16 species; - u8 language; - u8 *ptr; - s32 i; - s32 _7; - u8 *const *r1; - - StringCopy(gDisplayedStringBattle, gUnknown_0820A8B0); - GetMonData(pkmn, MON_DATA_NICKNAME, nickname); - StringGetEnd10(nickname); - ptr = StringCopy(gDisplayedStringBattle + 3, nickname); - ptr[0] = EXT_CTRL_CODE_BEGIN; - ptr[1] = 3; - ptr[2] = 2; - ptr[3] = EXT_CTRL_CODE_BEGIN; - ptr[4] = 1; - ptr += 5; - gender = GetMonGender(pkmn); - species = GetMonData(pkmn, MON_DATA_SPECIES); - language = GetMonData(pkmn, MON_DATA_LANGUAGE); - if (ShouldHideGenderIconForLanguage(species, nickname, language)) - gender = 100; - switch (gender) - { - default: - ptr[0] = 0xB; - ptr[1] = EOS; - ptr += 1; - break; - case MON_MALE: - ptr[0] = 0xB; - ptr[1] = CHAR_MALE; - ptr[2] = EOS; - ptr += 2; - break; - case MON_FEMALE: - ptr[0] = 0xA; - ptr[1] = CHAR_FEMALE; - ptr[2] = EOS; - ptr += 2; - break; - } - ptr[0] = EXT_CTRL_CODE_BEGIN; - ptr[1] = 0x13; - ptr[2] = 0x37; - ptr[3] = EOS; - ptr = ewram520_2 + GetBattlerPosition(gSprites[a].data[6]) * 0x180; - sub_80034D4(ptr, gDisplayedStringBattle); - - i = 0; - _7 = 7; - if (GetMonData(pkmn, MON_DATA_LANGUAGE) == 1 - && GetMonData(pkmn, MON_DATA_IS_EGG) == 0) - { - u8 *p = gDisplayedStringBattle; - - while (*p != EOS) - { - if (*p == EXT_CTRL_CODE_BEGIN) - { - p += GetExtCtrlCodeLength(p[1]) + 1; - } - else - { - u8 r0; - - if ((*p >= 0x37 && *p <= 0x4A) || (*p >= 0x87 && *p <= 0x9A)) - r0 = 0x2C; - else if ((*p >= 0x4B && *p <= 0x4F) || (*p >= 0x9B && *p <= 0x9F)) - r0 = 0x2D; - else - r0 = 0x2B; - - CpuCopy32(sub_8043CDC(r0), ptr + 0x40 * i, 32); - i++; - p++; - } - } - } - - for (; i < _7; i++) - CpuCopy32(sub_8043CDC(0x2B), ptr + 64 * i, 32); - - if (GetBattlerSide(gSprites[a].data[6]) == 0 && !IsDoubleBattle()) - { - r1 = (u8 *const *)gUnknown_0820A8B4; - for (i = 0; i < _7; i++) - { - u8 *r4 = r1[i]; - - r4 += gSprites[a].oam.tileNum * 32; - CpuCopy32(ptr, r4, 32); - ptr += 32; - - r4 += 0x100; - CpuCopy32(ptr, r4, 32); - ptr += 32; - } - } - else - { - if (GetBattlerSide(gSprites[a].data[6]) == 0) - r1 = (u8 *const *)gUnknown_0820A904; - else - r1 = (u8 *const *)gUnknown_0820A8DC; - for (i = 0; i < _7; i++) - { - u8 *r4 = r1[i]; - - r4 += gSprites[a].oam.tileNum * 32; - CpuCopy32(ptr, r4, 32); - ptr += 32; - - r4 += 0x100; - CpuCopy32(ptr, r4, 32); - ptr += 32; - } - } -} - -static void sub_8045458(u8 a, u8 b) -{ - u8 r4; - - if (gBattleTypeFlags & 0x200) - return; - if (gBattleTypeFlags & 8) - return; - - r4 = gSprites[a].data[6]; - if (GetBattlerSide(r4) != 0) - { - u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[r4]], MON_DATA_SPECIES); - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 1) != 0) - { - r4 = gSprites[a].data[5]; - if (b != 0) - CpuCopy32(sub_8043CDC(0x46), OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 8) * 32, 32); - else - CpuFill32(0, OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 8) * 32, 32); - } - } -} - -/*static*/ void draw_status_ailment_maybe(u8 a) -{ - s32 r4; - s32 r4_2; - u8 r7; - u8 r10; - s16 r8; - const u8 *r6; - u8 r0; - s32 i; - - r7 = gSprites[a].data[6]; - r10 = gSprites[a].data[5]; - if (GetBattlerSide(r7) == 0) - { - r4 = GetMonData(&gPlayerParty[gBattlerPartyIndexes[r7]], MON_DATA_STATUS); - if (!IsDoubleBattle()) - r8 = 0x1A; - else - r8 = 0x12; - } - else - { - r4 = GetMonData(&gEnemyParty[gBattlerPartyIndexes[r7]], MON_DATA_STATUS); - r8 = 0x11; - } - if (r4 & 7) - { - r6 = sub_8043CDC(sub_80457E8(0x1B, r7)); - r0 = 2; - } - else if (r4 & 0x88) - { - r6 = sub_8043CDC(sub_80457E8(0x15, r7)); - r0 = 0; - } - else if (r4 & 0x10) - { - r6 = sub_8043CDC(sub_80457E8(0x21, r7)); - r0 = 4; - } - else if (r4 & 0x20) - { - r6 = sub_8043CDC(sub_80457E8(0x1E, r7)); - r0 = 3; - } - else if (r4 & 0x40) - { - r6 = sub_8043CDC(sub_80457E8(0x18, r7)); - r0 = 1; - } - else - { - r6 = sub_8043CDC(0x27); - - for (i = 0; i < 3; i++) - CpuCopy32(r6, OBJ_VRAM0 + (gSprites[a].oam.tileNum + r8 + i) * 32, 32); - - if (!ewram17800[r7].unk0_4) - CpuCopy32(sub_8043CDC(1), OBJ_VRAM0 + gSprites[r10].oam.tileNum * 32, 64); - - sub_8045458(a, 1); - return; - } - - r4_2 = gSprites[a].oam.paletteNum * 16; - r4_2 += r7 + 12; - // I don't like writing the array index like this, but I can't get it to match otherwise. - FillPalette(r0[gBattleInterfaceStatusIcons_DynPal], r4_2 + 0x100, 2); - CpuCopy16(gPlttBufferUnfaded + 0x100 + r4_2, (void *)(OBJ_PLTT + r4_2 * 2), 2); - CpuCopy32(r6, OBJ_VRAM0 + (gSprites[a].oam.tileNum + r8) * 32, 96); - if (IsDoubleBattle() == TRUE || GetBattlerSide(r7) == TRUE) - { - if (!ewram17800[r7].unk0_4) - { - CpuCopy32(sub_8043CDC(0), OBJ_VRAM0 + gSprites[r10].oam.tileNum * 32, 32); - CpuCopy32(sub_8043CDC(0x41), OBJ_VRAM0 + (gSprites[r10].oam.tileNum + 1) * 32, 32); - } - } - sub_8045458(a, 0); -} - -static u8 sub_80457E8(u8 a, u8 b) -{ - u8 ret = a; - - switch (a) - { - case 21: - if (b == 0) - ret = 21; - else if (b == 1) - ret = 71; - else if (b == 2) - ret = 86; - else - ret = 101; - break; - case 24: - if (b == 0) - ret = 24; - else if (b == 1) - ret = 74; - else if (b == 2) - ret = 89; - else - ret = 104; - break; - case 27: - if (b == 0) - ret = 27; - else if (b == 1) - ret = 77; - else if (b == 2) - ret = 92; - else - ret = 107; - break; - case 30: - if (b == 0) - ret = 30; - else if (b == 1) - ret = 80; - else if (b == 2) - ret = 95; - else - ret = 110; - break; - case 33: - if (b == 0) - ret = 33; - else if (b == 1) - ret = 83; - else if (b == 2) - ret = 98; - else - ret = 113; - break; - } - return ret; -} - -/*static*/ void sub_80458B0(u8 a) -{ - u8 *r6; - u8 r8; - u8 i; - s32 r7; - u8 *addr; - - r6 = ewram520_2 + GetBattlerPosition(gSprites[a].data[6]) * 0x180; - r8 = 7; - sub_80034D4(r6, BattleText_SafariBalls); - for (i = 0; i < r8; i++) - CpuCopy32(sub_8043CDC(0x2B), r6 + i * 64, 32); - for (r7 = 3; r7 < 3 + r8; r7++) - { - addr = OBJ_VRAM0 + (gSprites[a].oam.tileNum + MACRO1(r7)) * 32; - CpuCopy32(r6, addr, 32); - r6 += 32; - - addr = OBJ_VRAM0 + (8 + gSprites[a].oam.tileNum + MACRO1(r7)) * 32; - CpuCopy32(r6, addr, 32); - r6 += 32; - } - -} - -/*static*/ void sub_8045998(u8 a) -{ - u8 *r7; - u8 status; - s32 r6; - s32 i; - - r7 = StringCopy(gDisplayedStringBattle, BattleText_SafariBallsLeft); - r7 = sub_8003504(r7, gNumSafariBalls, 10, 1); - StringAppend(r7, BattleText_HighlightRed); - status = GetBattlerPosition(gSprites[a].data[6]); - r7 = ewram520_2 + status * 0x180; - r6 = 5; - sub_80034D4(r7, gDisplayedStringBattle); - r7 = ewram520_2 + status * 0x180 + 32; - for (i = 6; i < 6 + r6; i++) - { - CpuCopy32(r7, OBJ_VRAM0 + (gSprites[a].oam.tileNum + 0x18 + MACRO1(i)) * 32, 32); - r7 += 64; - } -} - -void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) -{ - u8 r10; - u32 maxhp; - u32 currhp; - - r10 = gSprites[a].data[6]; - if (GetBattlerSide(r10) == 0) - { - if (c == 3 || c == 0) - sub_8043FC0(a, GetMonData(pkmn, MON_DATA_LEVEL)); - if (c == 1 || c == 0) - sub_80440EC(a, GetMonData(pkmn, MON_DATA_HP), 0); - if (c == 2 || c == 0) - sub_80440EC(a, GetMonData(pkmn, MON_DATA_MAX_HP), 1); - if (c == 5 || c == 0) - { - load_gfxc_health_bar(0); - maxhp = GetMonData(pkmn, MON_DATA_MAX_HP); - currhp = GetMonData(pkmn, MON_DATA_HP); - sub_8043D84(r10, a, maxhp, currhp, 0); - sub_8045C78(r10, a, 0, 0); - } - if (!IsDoubleBattle() && (c == 6 || c == 0)) - { - u16 species; - u8 level; - u32 exp; - u32 var1; - u32 var2; - u32 currLevelExp; - - load_gfxc_health_bar(3); - species = GetMonData(pkmn, MON_DATA_SPECIES); - level = GetMonData(pkmn, MON_DATA_LEVEL); - exp = GetMonData(pkmn, MON_DATA_EXP); - currLevelExp = gExperienceTables[gBaseStats[species].growthRate][level]; - var1 = exp - currLevelExp; - var2 = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLevelExp; - sub_8043D84(r10, a, var2, var1, 0); - sub_8045C78(r10, a, 1, 0); - } - if (c == 4 || c == 0) - sub_80451A0(a, pkmn); - if (c == 9 || c == 0) - draw_status_ailment_maybe(a); - if (c == 10) - sub_80458B0(a); - if (c == 10 || c == 11) - sub_8045998(a); - } - else - { - if (c == 3 || c == 0) - sub_8043FC0(a, GetMonData(pkmn, MON_DATA_LEVEL)); -#if DEBUG - if (gUnknown_020297ED == 1) - { - if (c == 1 || c == 0) - sub_80440EC(a, GetMonData(pkmn, MON_DATA_HP), 0); - if (c == 2 || c == 0) - sub_80440EC(a, GetMonData(pkmn, MON_DATA_MAX_HP), 1); - } -#endif - if (c == 5 || c == 0) - { - load_gfxc_health_bar(0); - maxhp = GetMonData(pkmn, MON_DATA_MAX_HP); - currhp = GetMonData(pkmn, MON_DATA_HP); - sub_8043D84(r10, a, maxhp, currhp, 0); - sub_8045C78(r10, a, 0, 0); - } - if (c == 4 || c == 0) - sub_80451A0(a, pkmn); - if (c == 9 || c == 0) - draw_status_ailment_maybe(a); - } -} - -s32 sub_8045C78(u8 a, u8 unused1, u8 c, u8 unused2) -{ - s32 r6; - - if (c == 0) - { - r6 = sub_8045F58(ewram17850[a].unk4, ewram17850[a].unk8, ewram17850[a].unkC, &ewram17850[a].unk10, 6, 1); - } - else - { - u16 r5; - s32 r8; - - r5 = GetScaledExpFraction(ewram17850[a].unk8, ewram17850[a].unkC, ewram17850[a].unk4, 8); - if (r5 == 0) - r5 = 1; - r8 = ewram17850[a].unkC; - r5 = ABS(r8 / r5); - r6 = sub_8045F58(ewram17850[a].unk4, ewram17850[a].unk8, r8, &ewram17850[a].unk10, 8, r5); - } - if (c == 1 || (c == 0 && (!ewram17800[a].unk0_4))) - sub_8045D58(a, c); - if (r6 == -1) - ewram17850[a].unk10 = 0; - return r6; -} - -static void sub_8045D58(u8 a, u8 b) -{ - u8 sp8[7]; - u8 r0; - u8 r8; - u8 i; - - switch (b) - { - case 0: - r0 = sub_804602C(ewram17850[a].unk4, ewram17850[a].unk8, ewram17850[a].unkC, &ewram17850[a].unk10, sp8, 6); - r8 = 3; - if (r0 <= 0x18) - { - r8 = 0x38; - if (r0 > 9) - r8 = 0x2F; - } - for (i = 0; i < 6; i++) - { - u8 r4 = gSprites[ewram17850[a].unk0].data[5]; - if (i < 2) - CpuCopy32(sub_8043CDC(r8) + sp8[i] * 32, OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 2 + i) * 32, 32); - else - CpuCopy32(sub_8043CDC(r8) + sp8[i] * 32, OBJ_VRAM0 + 64 + (i + gSprites[r4].oam.tileNum) * 32, 32); - } - break; - case 1: - sub_804602C(ewram17850[a].unk4, ewram17850[a].unk8, ewram17850[a].unkC, &ewram17850[a].unk10, sp8, 8); - r0 = GetMonData(&gPlayerParty[gBattlerPartyIndexes[a]], MON_DATA_LEVEL); - if (r0 == 100) - { - for (i = 0; i < 8; i++) - sp8[i] = 0; - } - for (i = 0; i < 8; i++) - { - if (i < 4) - CpuCopy32(sub_8043CDC(0xC) + sp8[i] * 32, OBJ_VRAM0 + (gSprites[ewram17850[a].unk0].oam.tileNum + 0x24 + i) * 32, 32); - else - CpuCopy32(sub_8043CDC(0xC) + sp8[i] * 32, OBJ_VRAM0 + 0xB80 + (i + gSprites[ewram17850[a].unk0].oam.tileNum) * 32, 32); - } - break; - } -} - -static int sub_8045F58(s32 a, s32 b, int c, int *d, u8 e, u16 f) -{ - u8 r2 = e << 3; - int r6; - int ret; - - if (*d == -32768) - { - if (a < r2) - *d = b << 8; - else - *d = b; - } - //_08045F8A - b -= c; - if (b < 0) - b = 0; - else if (b > a) - b = a; - if (a < r2) - { - int var = *d >> 8; - - r6 = *d; - if (b == var && (r6 & 0xFF) == 0) - return -1; - } - else - { - r6 = *d; - if (b == r6) - return -1; - } - //_08045FC4 - if (a < r2) - { - int r0 = (a << 8) / r2; - - if (c < 0) - { - *d = r6 + r0; - ret = *d >> 8; - if (ret >= b) - { - *d = b << 8; - ret = b; - } - } - //_08045FE2 - else - { - *d = r6 - r0; - ret = *d >> 8; - if ((*d & 0xFF) > 0) - ret++; - if (ret <= b) - { - *d = b << 8; - ret = b; - } - } - } - else - { - //_08045FFE - if (c < 0) - { - *d += f; - if (*d > b) - *d = b; - ret = *d; - } - //_08046010 - else - { - *d -= f; - if (*d < b) - *d = b; - ret = *d; - } - } - return ret; -} - -static u8 sub_804602C(int a, int b, int c, int *d, u8 *e, u8 f) -{ - s32 r5 = b - c; - u8 r3; - u8 i; - u8 r2; - - if (r5 < 0) - r5 = 0; - else if (r5 > a) - r5 = a; - r3 = f << 3; - for (i = 0; i < f; i++) - e[i] = 0; - if (a < r3) - r2 = *d * r3 / a >> 8; - else - r2 = *d * r3 / a; - r3 = r2; - if (r3 == 0 && r5 > 0) - { - e[0] = 1; - r3 = 1; - } - else - { - for (i = 0; i < f; i++) - { - if (r2 >= 8) - { - e[i] = 8; - } - else - { - e[i] = r2; - break; - } - r2 -= 8; - } - } - return r3; -} - -s16 sub_80460C8(struct BattleInterfaceStruct1 *a, int *b, u16 *c, int d) -{ - u16 r7; - s16 r1; - - r7 = sub_8045F58(a->unk0, a->unk4, a->unk8, b, 6, 1); - sub_8046128(a, b, c); - if (a->unk0 < 0x30) - r1 = *b >> 8; - else - r1 = *b; - do_nothing(a->unk0, r1, d); - return r7; -} - -static void sub_8046128(struct BattleInterfaceStruct1 *a, int *b, u16 *c) -{ - u8 sp8[6]; - u16 sp10[6]; - u8 i; - - sub_804602C(a->unk0, a->unk4, a->unk8, b, (u8 *)sp8, 6); - for (i = 0; i < 6; i++) - sp10[i] = (a->unkC_0 << 12) | (a->unk10 + sp8[i]); - CpuCopy16(sp10, c, sizeof(sp10)); -} - -static u8 GetScaledExpFraction(int a, int b, int c, u8 d) -{ - u8 r7 = d * 8; - int r5 = a - b; - s8 r4; - s8 r0; - s32 result; - - if (r5 < 0) - r5 = 0; - else if (r5 > c) - r5 = c; - - r4 = a * r7 / c; - r0 = r5 * r7 / c; - result = r4 - r0; - return ABS(result); -} - -u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale) -{ - u8 result = hp * scale / maxhp; - - if (result == 0 && hp > 0) - return 1; - return result; -} - -u8 GetHPBarLevel(s16 hp, s16 maxhp) -{ - int result; - - if (hp == maxhp) - result = 4; - else - { - u8 fraction = GetScaledHPFraction(hp, maxhp, 48); - if (fraction >= 25) - result = 3; - else if (fraction >= 10) - result = 2; - else if (fraction > 0) - result = 1; - else - result = 0; - } - return result; -} diff --git a/src/battle/battle_message.c b/src/battle/battle_message.c deleted file mode 100644 index 30d127be3..000000000 --- a/src/battle/battle_message.c +++ /dev/null @@ -1,1054 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_message.h" -#include "battle_tower.h" -#include "item.h" -#include "event_data.h" -#include "constants/items.h" -#include "pokemon.h" -#include "data2.h" -#include "text.h" -#include "string_util.h" -#include "link.h" -#include "battle_setup.h" -#include "battle_tower.h" -#include "constants/flags.h" -#include "ewram.h" - -#define BATTLESTRING_TO_SUB 12 -#define BATTLESTRINGS_NO 351 -#define BATTLESTRINGS_MAX BATTLESTRINGS_NO + BATTLESTRING_TO_SUB - -#ifdef GERMAN -#include "../data/battle_strings_de.h" // TODO: German -#else -#include "../data/battle_strings_en.h" -#endif - -// This is four lists of moves which use a different attack string in Japanese -// to the default. See the documentation for sub_8121D74 for more detail. -const u16 gUnknown_084016BC[] = -{ - MOVE_SWORDS_DANCE, - MOVE_STRENGTH, - MOVE_GROWTH, - MOVE_HARDEN, - MOVE_MINIMIZE, - MOVE_SMOKESCREEN, - MOVE_WITHDRAW, - MOVE_DEFENSE_CURL, - MOVE_EGG_BOMB, - MOVE_SMOG, - MOVE_BONE_CLUB, - MOVE_FLASH, - MOVE_SPLASH, - MOVE_ACID_ARMOR, - MOVE_BONEMERANG, - MOVE_REST, - MOVE_SHARPEN, - MOVE_SUBSTITUTE, - MOVE_MIND_READER, - MOVE_SNORE, - MOVE_PROTECT, - MOVE_SPIKES, - MOVE_ENDURE, - MOVE_ROLLOUT, - MOVE_SWAGGER, - MOVE_SLEEP_TALK, - MOVE_HIDDEN_POWER, - MOVE_PSYCH_UP, - MOVE_EXTREME_SPEED, - MOVE_FOLLOW_ME, - MOVE_TRICK, - MOVE_ASSIST, - MOVE_INGRAIN, - MOVE_KNOCK_OFF, - MOVE_CAMOUFLAGE, - MOVE_ASTONISH, - MOVE_ODOR_SLEUTH, - MOVE_GRASS_WHISTLE, - MOVE_SHEER_COLD, - MOVE_MUDDY_WATER, - MOVE_IRON_DEFENSE, - MOVE_BOUNCE, - 0, - MOVE_TELEPORT, - MOVE_RECOVER, - MOVE_BIDE, - MOVE_AMNESIA, - MOVE_FLAIL, - MOVE_TAUNT, - MOVE_BULK_UP, - 0, - MOVE_MEDITATE, - MOVE_AGILITY, - MOVE_MIMIC, - MOVE_DOUBLE_TEAM, - MOVE_BARRAGE, - MOVE_TRANSFORM, - MOVE_STRUGGLE, - MOVE_SCARY_FACE, - MOVE_CHARGE, - MOVE_WISH, - MOVE_BRICK_BREAK, - MOVE_YAWN, - MOVE_FEATHER_DANCE, - MOVE_TEETER_DANCE, - MOVE_MUD_SPORT, - MOVE_FAKE_TEARS, - MOVE_WATER_SPORT, - MOVE_CALM_MIND, - 0, - MOVE_POUND, - MOVE_SCRATCH, - MOVE_VICE_GRIP, - MOVE_WING_ATTACK, - MOVE_FLY, - MOVE_BIND, - MOVE_SLAM, - MOVE_HORN_ATTACK, - MOVE_WRAP, - MOVE_THRASH, - MOVE_TAIL_WHIP, - MOVE_LEER, - MOVE_BITE, - MOVE_GROWL, - MOVE_ROAR, - MOVE_SING, - MOVE_PECK, - MOVE_ABSORB, - MOVE_STRING_SHOT, - MOVE_EARTHQUAKE, - MOVE_FISSURE, - MOVE_DIG, - MOVE_TOXIC, - MOVE_SCREECH, - MOVE_METRONOME, - MOVE_LICK, - MOVE_CLAMP, - MOVE_CONSTRICT, - MOVE_POISON_GAS, - MOVE_BUBBLE, - MOVE_SLASH, - MOVE_SPIDER_WEB, - MOVE_NIGHTMARE, - MOVE_CURSE, - MOVE_FORESIGHT, - MOVE_CHARM, - MOVE_ATTRACT, - MOVE_ROCK_SMASH, - MOVE_UPROAR, - MOVE_SPIT_UP, - MOVE_SWALLOW, - MOVE_TORMENT, - MOVE_FLATTER, - MOVE_ROLE_PLAY, - MOVE_ENDEAVOR, - MOVE_TICKLE, - MOVE_COVET, - 0, -}; - -const u8 gUnknown_084017A8[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // empty flags - -extern const u8* const gBattleStringsTable[BATTLESTRINGS_NO]; - -extern u16 gLastUsedItem; -extern u8 gLastUsedAbility; -extern u8 gActiveBattler; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u8 gStringBank; -extern u8 gEffectBank; -extern u8 gBattleTextBuff1[]; -extern u8 gBattleTextBuff2[]; -extern u8 gBattleTextBuff3[]; -extern u8 gStringVar1[]; -extern u8 gStringVar2[]; -extern u8 gStringVar3[]; -extern u16 gBattleTypeFlags; -extern u16 gTrainerBattleOpponent; -extern u8 gDisplayedStringBattle[]; -extern u8 gStringVar1[]; -extern u8 gStringVar2[]; -extern u8 gStringVar3[]; -extern u16 gBattlerPartyIndexes[4]; -extern struct BattleEnigmaBerry gEnigmaBerries[4]; -extern u8 gBattleBufferA[4][0x200]; - -EWRAM_DATA u8 gAbilitiesPerBank[4] = {0}; - -extern const u8* const gUnknown_08401674[]; // table of pointers to 'a -TYPE' strings -extern const u8* const gUnknown_08400F58[]; // table of pointers to stat strings -extern const u8* const gUnknown_08400F78[]; // table of pointers to flavour strings - -struct StatusFlagString -{ - u8* flag; - u8* ptr; -}; - -extern const struct StatusFlagString gUnknown_081FA6D4[7]; // status flag/text - -extern struct StringInfoBattle* gSelectedOrderFromParty; -#define gStringInfo gSelectedOrderFromParty - -void sub_8121D1C(u8* textBuff); -void sub_8121D74(u8* textBuff); -void StrCpyDecodeBattleTextBuff(u8* src, u8* dst); - -u8 GetBattlerSide(u8 bank); -s32 sub_803FC34(u16); -void get_trainer_name(u8* dst); -u8 get_trainer_class_name_index(void); -u8 GetMultiplayerId(void); -u8 GetBattlerAtPosition(u8 ID); -u8 GetBattlerSide(u8 bank); -u8 GetBattlerPosition(u8 bank); -#ifdef GERMAN -extern u8 *de_sub_804110C(); -#endif - -void BufferStringBattle(u16 stringID) -{ - int i; - const u8* stringPtr = NULL; - - gStringInfo = (struct StringInfoBattle*)(&gBattleBufferA[gActiveBattler][4]); - gLastUsedItem = gStringInfo->lastItem; - gLastUsedAbility = gStringInfo->lastAbility; - gBattleStruct->scriptingActive = gStringInfo->scrActive; - gBattleStruct->unk1605E = gStringInfo->unk1605E; - gBattleStruct->hpScale = gStringInfo->hpScale; - gStringBank = gStringInfo->StringBank; - gBattleStruct->stringMoveType = gStringInfo->moveType; - for (i = 0; i < 4; i++) - { - gAbilitiesPerBank[i] = gStringInfo->abilities[i]; - } - for (i = 0; i < 0x10; i++) - { - gBattleTextBuff1[i] = gStringInfo->textBuffs[0][i]; - gBattleTextBuff2[i] = gStringInfo->textBuffs[1][i]; - gBattleTextBuff3[i] = gStringInfo->textBuffs[2][i]; - } - switch (stringID) - { - case 0: // first battle msg - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - stringPtr = BattleText_DoubleWantToBattle; - else - stringPtr = BattleText_SingleWantToBattle2; - } - else - { - stringPtr = BattleText_SingleWantToBattle1; -#ifdef GERMAN - stringPtr = de_sub_804110C(0xFFFF, stringPtr); -#endif - } - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) - stringPtr = BattleText_WildAppeared2; - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) // interesting, looks like they had something planned for wild double battles - stringPtr = BattleText_WildDoubleAppeared; - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) - stringPtr = BattleText_WildAppeared3; - else - stringPtr = BattleText_WildAppeared1; - } - break; - case 1: // poke first send-out - if (GetBattlerSide(gActiveBattler) == 0) - { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - stringPtr = BattleText_SentOutSingle11; - else - stringPtr = BattleText_SentOutDouble4; - } - else - stringPtr = BattleText_SentOutSingle6; - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - stringPtr = BattleText_SentOutDouble3; - else if (gBattleTypeFlags & BATTLE_TYPE_LINK) - stringPtr = BattleText_SentOutDouble2; - else - { - stringPtr = BattleText_SentOutDouble1; -#ifdef GERMAN - stringPtr = de_sub_804110C(0xFFFF, stringPtr); -#endif - } - } - else if (gBattleTypeFlags & BATTLE_TYPE_LINK) - stringPtr = BattleText_SentOutSingle3; - else - { - stringPtr = BattleText_SentOutSingle1; -#ifdef GERMAN - stringPtr = de_sub_804110C(0xFFFF, stringPtr); -#endif - } - } - break; - case 2: // sending poke to ball msg - if (GetBattlerSide(gActiveBattler) == 0) - { - if (gBattleStruct->hpScale == 0) - stringPtr = BattleText_ComeBackSingle1; - else if (gBattleStruct->hpScale == 1 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - stringPtr = BattleText_ComeBackSingle2; - else if (gBattleStruct->hpScale == 2) - stringPtr = BattleText_ComeBackSingle3; - else - stringPtr = BattleText_ComeBackSingle4; - } - else - { - if (gTrainerBattleOpponent == LINK_BATTLE_OPPONENT) - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - stringPtr = BattleText_WithdrewPoke3; - else - stringPtr = BattleText_WithdrewPoke2; - } - else - { - stringPtr = BattleText_WithdrewPoke1; -#ifdef GERMAN - stringPtr = de_sub_804110C(0xFFFF, stringPtr); -#endif - } - } - break; - case 3: // switch-in msg - if (GetBattlerSide(gBattleStruct->scriptingActive) == 0) - { - if (gBattleStruct->hpScale == 0 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - stringPtr = BattleText_SentOutSingle7; - else if (gBattleStruct->hpScale == 1) - stringPtr = BattleText_SentOutSingle8; - else if (gBattleStruct->hpScale == 2) - stringPtr = BattleText_SentOutSingle9; - else - stringPtr = BattleText_SentOutSingle10; - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - stringPtr = BattleText_SentOutSingle5; - else - stringPtr = BattleText_SentOutSingle4; - } - else - { - stringPtr = BattleText_SentOutSingle2; -#ifdef GERMAN - stringPtr = de_sub_804110C(0xFFFF, stringPtr); -#endif - } - } - break; - case 4: // pokemon used a move msg - sub_8121D1C(gBattleTextBuff1); - if (gStringInfo->currentMove > 0x162) - StringCopy(gBattleTextBuff2, gUnknown_08401674[gBattleStruct->stringMoveType]); - else - StringCopy(gBattleTextBuff2, gMoveNames[gStringInfo->currentMove]); - sub_8121D74(gBattleTextBuff2); - stringPtr = BattleText_OpponentUsedMove; - break; - case 5: // battle end - if (gBattleTextBuff1[0] & 0x80) - { - gBattleTextBuff1[0] &= ~(0x80); - if (GetBattlerSide(gActiveBattler) == 1 && gBattleTextBuff1[0] != 3) - gBattleTextBuff1[0] ^= 3; - if (gBattleTextBuff1[0] == BATTLE_LOST || gBattleTextBuff1[0] == BATTLE_DREW) - stringPtr = BattleText_GotAwaySafely; - else - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - stringPtr = BattleText_FledDouble; - else - stringPtr = BattleText_FledSingle; - } - } - else - { - if (GetBattlerSide(gActiveBattler) == 1 && gBattleTextBuff1[0] != 3) - gBattleTextBuff1[0] ^= 3; - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - switch (gBattleTextBuff1[0]) - { - case BATTLE_WON: - stringPtr = BattleText_PlayerDefeatedTrainers; - break; - case BATTLE_LOST: - stringPtr = BattleText_PlayerLostTrainers; - break; - case BATTLE_DREW: - stringPtr = BattleText_PlayerTiedTrainers; - break; - } - } - else - { - switch (gBattleTextBuff1[0]) - { - case BATTLE_WON: - stringPtr = BattleText_PlayerDefeatedTrainer; - break; - case BATTLE_LOST: - stringPtr = BattleText_PlayerLostTrainer; - break; - case BATTLE_DREW: - stringPtr = BattleText_PlayerTiedTrainer; - break; - } - } - } - break; - default: // load a string from the table - if (stringID >= BATTLESTRINGS_MAX) - { - gDisplayedStringBattle[0] = EOS; - return; - } - else - { - stringPtr = gBattleStringsTable[stringID - BATTLESTRING_TO_SUB]; -#ifdef GERMAN - stringPtr = de_sub_804110C(stringID, stringPtr); -#endif - } - break; - } - StrCpyDecodeToDisplayedStringBattle(stringPtr); -} - -u32 StrCpyDecodeToDisplayedStringBattle(const u8* src) -{ - StrCpyDecodeBattle(src, gDisplayedStringBattle); -} - -const u8* AppendStatusString(u8* src) -{ - u32 i; - u8 status[8]; - u32 flag1, flag2; - u8* statusPtr; - - memcpy(status, gUnknown_084017A8, 8); - - statusPtr = status; - for (i = 0; i < sizeof(struct StatusFlagString); i++) - { - if (*src == EOS) - break; - *statusPtr = *src; - src++; - statusPtr++; - } - flag1 = *(u32*)(&status[0]); - flag2 = *(u32*)(&status[4]); - for (i = 0; i < 7; i++) - { - if (flag1 == *(u32*)(&gUnknown_081FA6D4[i].flag[0]) && flag2 == *(u32*)(&gUnknown_081FA6D4[i].flag[4])) - return gUnknown_081FA6D4[i].ptr; - } - return NULL; -} - -#ifdef GERMAN -extern u8 *de_sub_8073174(u8 *, const u8 *); -extern u8 *de_sub_8041024(s32, u32); -#endif - -#ifdef ENGLISH -#define HANDLE_NICKNAME_STRING_CASE(bank, monIndex) \ - if (GetBattlerSide(bank) != 0) \ - { \ - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) \ - toCpy = BattleText_Foe; \ - else \ - toCpy = BattleText_Wild; \ - while (*toCpy != EOS) \ - { \ - dst[dstID] = *toCpy; \ - dstID++; \ - toCpy++; \ - } \ - GetMonData(&gEnemyParty[monIndex], MON_DATA_NICKNAME, text); \ - } \ - else \ - { \ - GetMonData(&gPlayerParty[monIndex], MON_DATA_NICKNAME, text); \ - } \ - StringGetEnd10(text); \ - toCpy = text; -#else -#define HANDLE_NICKNAME_STRING_CASE(bank, monIndex) \ - if (GetBattlerSide(bank) != 0) \ - { \ - GetMonData(&gEnemyParty[monIndex], MON_DATA_NICKNAME, text); \ - StringGetEnd10(text); \ - toCpy = text; \ - while (*toCpy != EOS) \ - { \ - dst[dstID] = *toCpy; \ - dstID++; \ - toCpy++; \ - } \ - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) \ - toCpy = BattleText_Foe; \ - else \ - toCpy = BattleText_Wild; \ - } \ - else \ - { \ - GetMonData(&gPlayerParty[monIndex], MON_DATA_NICKNAME, text); \ - StringGetEnd10(text); \ - toCpy = text; \ - } -#endif - -u32 StrCpyDecodeBattle(const u8* src, u8* dst) -{ - u32 dstID = 0; // if they used dstID, why not use srcID as well? - const u8* toCpy = NULL; - u8 text[12]; - u8 multiplayerID = GetMultiplayerId(); - - while (*src != EOS) - { - if (*src == 0xFD) - { - src++; - switch (*src) - { - case 0: - if (gBattleTextBuff1[0] == 0xFD) - { - StrCpyDecodeBattleTextBuff(gBattleTextBuff1, gStringVar1); - toCpy = gStringVar1; - } - else - { - toCpy = AppendStatusString(gBattleTextBuff1); - if (toCpy == 0) - toCpy = gBattleTextBuff1; - } - break; - case 1: - if (gBattleTextBuff2[0] == 0xFD) - { - StrCpyDecodeBattleTextBuff(gBattleTextBuff2, gStringVar2); - toCpy = gStringVar2; - } - else - toCpy = gBattleTextBuff2; - break; - case 42: - if (gBattleTextBuff3[0] == 0xFD) - { - StrCpyDecodeBattleTextBuff(gBattleTextBuff3, gStringVar3); - toCpy = gStringVar3; - } - else - toCpy = gBattleTextBuff3; - break; - case 2: // first player poke name - GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(0)]], MON_DATA_NICKNAME, text); - StringGetEnd10(text); - toCpy = text; - break; - case 3: // first enemy poke name - GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(1)]], MON_DATA_NICKNAME, text); - StringGetEnd10(text); - toCpy = text; - break; - case 4: // second player poke name - GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(2)]], MON_DATA_NICKNAME, text); - StringGetEnd10(text); - toCpy = text; - break; - case 5: // second enemy poke name - GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(3)]], MON_DATA_NICKNAME, text); - StringGetEnd10(text); - toCpy = text; - break; - case 6: // link first player poke name - GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18]], MON_DATA_NICKNAME, text); - StringGetEnd10(text); - toCpy = text; - break; - case 7: // link first opponent poke name - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18 ^ 1]], MON_DATA_NICKNAME, text); - StringGetEnd10(text); - toCpy = text; - break; - case 8: // link second player poke name - GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18 ^ 2]], MON_DATA_NICKNAME, text); - StringGetEnd10(text); - toCpy = text; - break; - case 9: // link second opponent poke name - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18 ^ 3]], MON_DATA_NICKNAME, text); - StringGetEnd10(text); - toCpy = text; - break; - case 10: // attacker name with prefix, only bank 0/1 - HANDLE_NICKNAME_STRING_CASE(gBankAttacker, gBattlerPartyIndexes[GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) & 1)]) - break; - case 11: // attacker partner name, only bank 0/1 - if (GetBattlerSide(gBankAttacker) == 0) - GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text); - else - GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text); - - StringGetEnd10(text); - toCpy = text; - break; - case 12: // attacker name with prefix - HANDLE_NICKNAME_STRING_CASE(gBankAttacker, gBattlerPartyIndexes[gBankAttacker]) - break; - case 13: // target name with prefix - HANDLE_NICKNAME_STRING_CASE(gBankTarget, gBattlerPartyIndexes[gBankTarget]) - break; - case 14: // effect bank name with prefix - HANDLE_NICKNAME_STRING_CASE(gEffectBank, gBattlerPartyIndexes[gEffectBank]) - break; - case 15: // active bank name with prefix - HANDLE_NICKNAME_STRING_CASE(gActiveBattler, gBattlerPartyIndexes[gActiveBattler]) - break; - case 16: // scripting active bank name with prefix - HANDLE_NICKNAME_STRING_CASE(gBattleStruct->scriptingActive, gBattlerPartyIndexes[gBattleStruct->scriptingActive]) - break; - case 17: // current move name - if (gStringInfo->currentMove > 0x162) - toCpy = (void*) &gUnknown_08401674[gBattleStruct->stringMoveType]; - else - toCpy = gMoveNames[gStringInfo->currentMove]; - break; - case 18: // last used move name - if (gStringInfo->lastMove > 0x162) - toCpy = (void*) &gUnknown_08401674[gBattleStruct->stringMoveType]; - else - toCpy = gMoveNames[gStringInfo->lastMove]; - break; - case 19: // last used item - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - if (gLastUsedItem == ITEM_ENIGMA_BERRY) - { - if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 == gStringBank) - { - StringCopy(text, gEnigmaBerries[gStringBank].name); -#ifdef ENGLISH - StringAppend(text, BattleText_Berry); -#else - de_sub_8073174(text, BattleText_Berry); -#endif - toCpy = text; - } - else - toCpy = BattleText_EnigmaBerry; - } - else - { - CopyItemName(gLastUsedItem, text); - toCpy = text; - } - } - else - { - CopyItemName(gLastUsedItem, text); - toCpy = text; - } - break; - case 20: // last used ability - toCpy = gAbilityNames[gLastUsedAbility]; - break; - case 21: // attacker ability - toCpy = gAbilityNames[gAbilitiesPerBank[gBankAttacker]]; - break; - case 22: // target ability - toCpy = gAbilityNames[gAbilitiesPerBank[gBankTarget]]; - break; - case 23: // scripting active ability - toCpy = gAbilityNames[gAbilitiesPerBank[gBattleStruct->scriptingActive]]; - break; - case 24: // effect bank ability - toCpy = gAbilityNames[gAbilitiesPerBank[gEffectBank]]; - break; - case 25: // trainer class name -#ifdef ENGLISH - if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) - toCpy = gTrainerClassNames[GetSecretBaseTrainerNameIndex()]; - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - toCpy = gTrainerClassNames[get_trainer_class_name_index()]; - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - toCpy = gTrainerClassNames[GetEReaderTrainerClassNameIndex()]; - else - toCpy = gTrainerClassNames[gTrainers[gTrainerBattleOpponent].trainerClass]; - break; -#else - if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) - toCpy = de_sub_8041024(gTrainerBattleOpponent, 0); - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - toCpy = de_sub_8041024(BATTLE_TYPE_BATTLE_TOWER, 0); - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - toCpy = de_sub_8041024(BATTLE_TYPE_EREADER_TRAINER, 0); - else - toCpy = de_sub_8041024(0, gTrainerBattleOpponent); - break; -#endif - case 26: // trainer name - if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) - { - memset(text, 0xFF, 8); - memcpy(text, ewram17002, 7); - toCpy = text; - } - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - { - get_trainer_name(text); - toCpy = text; - } - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - { - SetEReaderTrainerName(text); - toCpy = text; - } - else - toCpy = gTrainers[gTrainerBattleOpponent].trainerName; - break; - case 27: // link player name? - toCpy = gLinkPlayers[multiplayerID].name; - break; - case 28: // link partner name? - toCpy = gLinkPlayers[sub_803FC34(2 ^ gLinkPlayers[multiplayerID].lp_field_18)].name; - break; - case 29: // link opponent 1 name? - toCpy = gLinkPlayers[sub_803FC34(1 ^ gLinkPlayers[multiplayerID].lp_field_18)].name; - break; - case 30: // link opponent 2 name? - toCpy = gLinkPlayers[sub_803FC34(3 ^ gLinkPlayers[multiplayerID].lp_field_18)].name; - break; - case 31: // link scripting active name - toCpy = gLinkPlayers[sub_803FC34(gBattleStruct->scriptingActive)].name; - break; - case 32: // player name - toCpy = gSaveBlock2.playerName; - break; - case 33: // ? - toCpy = GetTrainerLoseText(); - break; - case 34: // ? - HANDLE_NICKNAME_STRING_CASE(gBattleStruct->scriptingActive, gBattleStruct->unk1605E) - break; - case 35: // lanette pc - if (FlagGet(FLAG_SYS_PC_LANETTE)) - toCpy = BattleText_Lanette; - else - toCpy = BattleText_Someone; - break; - case 38: - if (GetBattlerSide(gBankAttacker) == 0) - toCpy = BattleText_Ally2; - else - toCpy = BattleText_Foe3; - break; - case 39: - if (GetBattlerSide(gBankTarget) == 0) - toCpy = BattleText_Ally2; - else - toCpy = BattleText_Foe3; - break; - case 36: - if (GetBattlerSide(gBankAttacker) == 0) - toCpy = BattleText_Ally; - else - toCpy = BattleText_Foe2; - break; - case 37: - if (GetBattlerSide(gBankTarget) == 0) - toCpy = BattleText_Ally; - else - toCpy = BattleText_Foe2; - break; - case 40: - if (GetBattlerSide(gBankAttacker) == 0) - toCpy = BattleText_Ally3; - else - toCpy = BattleText_Foe4; - break; - case 41: - if (GetBattlerSide(gBankTarget) == 0) - toCpy = BattleText_Ally3; - else - toCpy = BattleText_Foe4; - break; - } - //if (toCpy != NULL) really GF, why did you forget about this? - while (*toCpy != EOS) - { - dst[dstID] = *toCpy; - dstID++; - toCpy++; - } - if (*src == 33) - { - dst[dstID] = 0xFC; - dstID++; - dst[dstID] = 9; - dstID++; - } - } - else - { - dst[dstID] = *src; - dstID++; - } - src++; - } - dst[dstID] = *src; - dstID++; - return dstID; -} - -#define ByteRead16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) -#define ByteRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) - -void StrCpyDecodeBattleTextBuff(u8* src, u8* dst) -{ - u32 srcID = 1; - u32 value = 0; - u8 text[12]; - u16 hword; - - *dst = EOS; - while (src[srcID] != EOS) - { - switch (src[srcID]) - { - case 0: // battle string - hword = ByteRead16(&src[srcID + 1]); -#ifdef GERMAN - if (hword == 209 || hword == 211) - srcID += 3; -#endif - StringAppend(dst, gBattleStringsTable[hword - BATTLESTRING_TO_SUB]); - srcID += 3; - break; - case 1: // int to string - switch (src[srcID + 1]) - { - case 1: - value = src[srcID + 3]; - break; - case 2: - value = ByteRead16(&src[srcID + 3]); - break; - case 4: - value = ByteRead32(&src[srcID + 3]); - break; - } - ConvertIntToDecimalStringN(dst, value, 0, src[srcID + 2]); - srcID += src[srcID + 1] + 3; - break; - case 2: // move name - StringAppend(dst, gMoveNames[ByteRead16(&src[srcID + 1])]); - srcID += 3; - break; - case 3: // type name - StringAppend(dst, gTypeNames[src[srcID + 1]]); - srcID += 2; - break; - case 4: // poke nick with prefix -#ifdef ENGLISH - if (GetBattlerSide(src[srcID + 1]) == 0) - { - GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, text); - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - StringAppend(dst, BattleText_Foe); - else - StringAppend(dst, BattleText_Wild); - GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, text); - } - StringGetEnd10(text); - StringAppend(dst, text); -#else - if (GetBattlerSide(src[srcID + 1]) == 0) - { - GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, text); - StringGetEnd10(text); - StringAppend(dst, text); - } - else - { - GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, text); - StringGetEnd10(text); - StringAppend(dst, text); - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - StringAppend(dst, BattleText_Foe); - else - StringAppend(dst, BattleText_Wild); - } -#endif - srcID += 3; - break; - case 5: // stats - StringAppend(dst, gUnknown_08400F58[src[srcID + 1]]); - srcID += 2; - break; - case 6: // species name - GetSpeciesName(dst, ByteRead16(&src[srcID + 1])); - srcID += 3; - break; - case 7: // poke nick without prefix - if (GetBattlerSide(src[srcID + 1]) == 0) - GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, dst); - else - GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, dst); - StringGetEnd10(dst); - srcID += 3; - break; - case 8: // flavour table - StringAppend(dst, gUnknown_08400F78[src[srcID + 1]]); - srcID += 2; - break; - case 9: // ability names - StringAppend(dst, gAbilityNames[src[srcID + 1]]); - srcID += 2; - break; - case 10: // item name - { - hword = ByteRead16(&src[srcID + 1]); - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - if (hword == ITEM_ENIGMA_BERRY) - { - if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 == gStringBank) - { - StringCopy(dst, gEnigmaBerries[gStringBank].name); -#ifdef ENGLISH - StringAppend(dst, BattleText_Berry); -#else - de_sub_8073174(dst, BattleText_Berry); -#endif - } - else - StringAppend(dst, BattleText_EnigmaBerry); - } - else - CopyItemName(hword, dst); - } - else - CopyItemName(hword, dst); - srcID += 3; - } - break; - } - } -} - -// Loads one of two text strings into the provided buffer. This is functionally -// unused, since the value loaded into the buffer is not read; it loaded one of -// two particles (either "は" or "の") which works in tandem with sub_8121D74 -// below to effect changes in the meaning of the line. -void sub_8121D1C(u8* textBuff) -{ - s32 counter = 0; - u32 i = 0; - - while (counter != 4) - { - if (gUnknown_084016BC[i] == 0) - counter++; - if (gUnknown_084016BC[i++] == gStringInfo->currentMove) - break; - } - - if (counter >= 0) - { - if (counter <= 2) - StringCopy(textBuff, BattleText_Format10); // is - else if (counter <= 4) - StringCopy(textBuff, BattleText_Format11); // 's - } -} - -// Appends "!" to the text buffer `dst`. In the original Japanese this looked -// into the table of moves at gUnknown_084016BC and varied the line accordingly. -// -// BattleText_Exclamation was a plain "!", used for any attack not on the list. -// It resulted in the translation "<NAME>'s <ATTACK>!". -// -// BattleText_Exclamation2 was "を つかった!". This resulted in the translation -// "<NAME> used <ATTACK>!", which was used for all attacks in English. -// -// BattleText_Exclamation3 was "した!". This was used for those moves whose -// names were verbs, such as Recover, and resulted in translations like "<NAME> -// recovered itself!". -// -// BattleText_Exclamation4 was "を した!" This resulted in a translation of -// "<NAME> did an <ATTACK>!". -// -// BattleText_Exclamation5 was " こうげき!" This resulted in a translation of -// "<NAME>'s <ATTACK> attack!". -void sub_8121D74(u8* dst) -{ - s32 counter = 0; - s32 i = 0; - - while (*dst != EOS) - dst++; - - while (counter != 4) - { - if (gUnknown_084016BC[i] == 0) - counter++; - if (gUnknown_084016BC[i++] == gStringInfo->currentMove) - break; - } - - switch (counter) - { - case 0: - StringCopy(dst, BattleText_Exclamation2); - break; - case 1: - StringCopy(dst, BattleText_Exclamation3); - break; - case 2: - StringCopy(dst, BattleText_Exclamation4); - break; - case 3: - StringCopy(dst, BattleText_Exclamation5); - break; - case 4: - StringCopy(dst, BattleText_Exclamation); - break; - } -} diff --git a/src/battle/battle_party_menu.c b/src/battle/battle_party_menu.c deleted file mode 100644 index e758b7957..000000000 --- a/src/battle/battle_party_menu.c +++ /dev/null @@ -1,731 +0,0 @@ -#include "global.h" -#include "battle_party_menu.h" -#include "battle.h" -#include "item_menu.h" -#include "item_use.h" -#include "main.h" -#include "menu.h" -#include "menu_helpers.h" -#include "palette.h" -#include "party_menu.h" -#include "pokemon.h" -#include "pokemon_summary_screen.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "constants/songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" -#include "ewram.h" - -extern u8 sub_806BD58(u8, u8); -extern void PartyMenuPrintMonsLevelOrStatus(void); -extern void nullsub_13(void); -extern void sub_802E414(void); -extern void sub_80A6DCC(void); -extern u8 *sub_8040D08(); -extern void sub_8040B8C(void); -extern void nullsub_14(); -extern u8 sub_803FBBC(void); - -extern u8 gPlayerPartyCount; -extern u8 gBattlersCount; -extern u16 gBattlerPartyIndexes[]; -extern u8 gBankInMenu; -extern u8 gUnknown_0202E8F4; -extern u8 gUnknown_0202E8F5; -extern u8 gUnknown_0202E8F6; -extern u8 gUnknown_02038470[3]; -extern u8 gUnknown_02038473; -extern u8 gUnknown_020384F0; -extern void (*gPokemonItemUseCallback)(); //don't know types yet -extern struct PokemonStorage gPokemonStorage; -extern void nullsub_14(); - -void sub_8094C98(u8, u8); -u8 pokemon_order_func(u8); - -static void sub_8094998(u8[3], u8); -static void sub_8094A74(u8[3], u8, u32); -static void sub_8094D60(void); -static void Task_809527C(u8); -static void Task_80952B4(u8); -static void Task_80952E4(u8); -static void Task_8095330(u8); -static void Task_809538C(void); -static void Task_HandlePopupMenuInput(u8); -static void Task_BattlePartyMenuSummary(u8 taskId); -static void Task_BattlePartyMenuShift(u8 taskId); -static void Task_BattlePartyMenuCancel(u8 taskId); - -static const struct MenuAction2 sBattlePartyMenuActions[] = -{ - {OtherText_Summary, Task_BattlePartyMenuSummary}, - {gOtherText_CancelNoTerminator, Task_BattlePartyMenuCancel}, - {OtherText_Shift, Task_BattlePartyMenuShift}, - {OtherText_SendOut, Task_BattlePartyMenuShift}, -}; -static const u8 Unknown_83B5FEC[] = {2, 0, 1}; //SHIFT, SUMMARY, CANCEL -static const u8 Unknown_83B5FEF[] = {3, 0, 1}; //SEND OUT, SUMMARY, CANCEL -static const u8 Unknown_83B5FF2[] = {0, 1}; //SUMMARY, CANCEL -static const struct PartyPopupMenu sBattlePartyPopupMenus[] = -{ - {ARRAY_COUNT(Unknown_83B5FEC), 9, Unknown_83B5FEC}, - {ARRAY_COUNT(Unknown_83B5FEF), 9, Unknown_83B5FEF}, - {ARRAY_COUNT(Unknown_83B5FF2), 9, Unknown_83B5FF2}, -}; - -void unref_sub_8094928(struct PokemonStorage *ptr) -{ - *ptr = gPokemonStorage; -} - -void unref_sub_8094940(struct PokemonStorage *ptr) -{ - gPokemonStorage = *ptr; -} - -void sub_8094958(void) -{ - sub_8094998(gUnknown_02038470, sub_803FBBC()); -} - -void sub_8094978(u8 arg1, u8 arg2) -{ - sub_8094A74((UNK_201606C_ARRAY) + arg1 * 3, arg2, arg1); -} - -static void sub_8094998(u8 arg[3], u8 player_number) -{ - int i; - u32 pos; - u8 temp[6]; - if (IsLinkDoubleBattle() == TRUE) - { - if (player_number) - { - *arg = 0x30; - arg[1] = 0x45; - arg[2] = 0x12; - } - else - { - *arg = 0x03; - arg[1] = 0x12; - arg[2] = 0x45; - } - } - else - { - if (!IsDoubleBattle()) - { - pos = 1; - *temp = gBattlerPartyIndexes[GetBattlerAtPosition(0)]; - for (i = 0; i <= 5; i++) - if (i != *temp) - temp[pos++] = i; - } - else - { - pos = 2; - *temp = gBattlerPartyIndexes[GetBattlerAtPosition(0)]; - temp[1] = gBattlerPartyIndexes[GetBattlerAtPosition(2)]; - for (i = 0; i <= 5; i++) - if ((i != *temp) && (i != temp[1])) - temp[pos++] = i; - } - for (i = 0; i <= 2; i++) - arg[i] = (temp[i << 1] << 4) | temp[(i << 1) + 1]; - } -} - -static void sub_8094A74(u8 arg[3], u8 player_number, u32 arg3) -{ - int i, j; - u8 temp[6]; - if (!GetBattlerSide(arg3)) - { - i = GetBattlerAtPosition(0); - j = GetBattlerAtPosition(2); - } - else - { - i = GetBattlerAtPosition(1); - j = GetBattlerAtPosition(3); - } - if (IsLinkDoubleBattle() == TRUE) - { - if (player_number) - { - *arg = 0x30; - arg[1] = 0x45; - arg[2] = 0x12; - } - else - { - *arg = 0x03; - arg[1] = 0x12; - arg[2] = 0x45; - } - } - else - { - if (!IsDoubleBattle()) - { - int pos = 1; - *temp = gBattlerPartyIndexes[i]; - for (i = 0; i <= 5; i++) - if (i != *temp) - temp[pos++] = i; - } - else - { - int pos = 2; - *temp = gBattlerPartyIndexes[i]; - temp[1] = gBattlerPartyIndexes[j]; - for (i = 0; i <= 5; i++) - if ((i != *temp) && (i != temp[1])) - temp[pos++] = i; - } - for (i = 0; i <= 2; i++) - arg[i] = (temp[i << 1] << 4) | temp[(i << 1) + 1]; - } -} - -void sub_8094B6C(u8 a, u8 b, u8 c) -{ - s32 i; - s32 j; - u8 temp[6]; - u8 r3; - u8 r7 = 0; - - if (IsLinkDoubleBattle()) - { - u8 *arr = &ewram1606Carr(0, a); - - for (i = 0, j = 0; i < 3; i++) - { - temp[j++] = arr[i] >> 4; - temp[j++] = arr[i] & 0xF; - } - r3 = temp[c]; - for (i = 0; i < 6; i++) - { - if (temp[i] == b) - { - r7 = temp[i]; - temp[i] = r3; - break; - } - } - if (i != 6) - { - temp[c] = r7; - - arr[0] = (temp[0] << 4) | temp[1]; - arr[1] = (temp[2] << 4) | temp[3]; - arr[2] = (temp[4] << 4) | temp[5]; - } - } -} - -u8 sub_8094C20(u8 monIndex) -{ - u8 retVal; - u8 val = monIndex & 1; - - monIndex /= 2; - if (val) - retVal = gUnknown_02038470[monIndex] & 0xF; - else - retVal = gUnknown_02038470[monIndex] >> 4; - return retVal; -} - -void sub_8094C54(u8 a, u8 b) -{ - u8 val = a & 1; - - a /= 2; - if (val) - gUnknown_02038470[a] = (gUnknown_02038470[a] & 0xF0) | b; - else - gUnknown_02038470[a] = (gUnknown_02038470[a] & 0xF) | (b << 4); -} - -void sub_8094C98(u8 a, u8 b) -{ - u8 r4 = sub_8094C20(a); - u8 r1 = sub_8094C20(b); - - sub_8094C54(a, r1); - sub_8094C54(b, r4); -} - -u8 pokemon_order_func(u8 a) -{ - u8 i; - u8 r2; - - for (i = 0, r2 = 0; i < 3; i++) - { - if ((gUnknown_02038470[i] >> 4) == a) - return r2; - r2++; - if ((gUnknown_02038470[i] & 0xF) == a) - return r2; - r2++; - } - return 0; -} - -void pokemon_change_order(void) -{ - u8 i; - - memcpy(ewram1B000.unk0, gPlayerParty, sizeof(gPlayerParty)); - for (i = 0; i < 6; i++) - { - u8 n = pokemon_order_func(i); - - memcpy(&gPlayerParty[n], &ewram1B000.unk0[i], sizeof(struct Pokemon)); - } -} - -static void sub_8094D60(void) -{ - struct Pokemon temp[6]; - u8 i; - - memcpy(temp, gPlayerParty, sizeof(gPlayerParty)); - for (i = 0; i < 6; i++) - { - u8 n = sub_8094C20(i); - - memcpy(&gPlayerParty[n], &temp[i], sizeof(struct Pokemon)); - } -} - -void unref_sub_8094DB0(void) -{ - u8 i; - u8 r4; - - for (i = 1; i < 6; i++) - { - u8 n = sub_8094C20(i); - - if (GetMonData(&gPlayerParty[n], MON_DATA_SPECIES) != 0 - && GetMonData(&gPlayerParty[n], MON_DATA_HP) != 0) - { - r4 = sub_8094C20(0); - sub_8094C98(0, i); - SwapPokemon(&gPlayerParty[r4], &gPlayerParty[n]); - break; - } - } -} - -void sub_8094E20(u8 a) -{ - gPaletteFade.bufferTransferDisabled = TRUE; - gUnknown_02038473 = a; - nullsub_14(); - pokemon_change_order(); - OpenPartyMenu(PARTY_MENU_TYPE_BATTLE, 0xFF); -} - -void sub_8094E4C(void) -{ - sub_8094E20(3); -} - -bool8 SetUpBattlePartyMenu(void) -{ - switch (EWRAM_1B000.setupState) - //switch (ewram1B000.unk264[0]) - { - case 0: - //TODO: try to get rid of this duplicate code - if (IsLinkDoubleBattle() == TRUE) - { - if (EWRAM_1B000.monIndex != 6) - { - TryCreatePartyMenuMonIcon(EWRAM_1B000.menuHandlerTaskId, EWRAM_1B000.monIndex, &gPlayerParty[EWRAM_1B000.monIndex]); - EWRAM_1B000.monIndex++; - } - else - { - EWRAM_1B000.monIndex = 0; - EWRAM_1B000.setupState++; - } - } - else - { - if (EWRAM_1B000.monIndex < 6) - { - TryCreatePartyMenuMonIcon(EWRAM_1B000.menuHandlerTaskId, EWRAM_1B000.monIndex, &gPlayerParty[EWRAM_1B000.monIndex]); - EWRAM_1B000.monIndex++; - } - else - { - EWRAM_1B000.monIndex = 0; - EWRAM_1B000.setupState++; - } - } - break; - case 1: - LoadHeldItemIconGraphics(); - EWRAM_1B000.setupState++; - break; - case 2: - CreateHeldItemIcons_806DC34(EWRAM_1B000.menuHandlerTaskId); - EWRAM_1B000.setupState++; - break; - case 3: - if (sub_806BD58(EWRAM_1B000.menuHandlerTaskId, EWRAM_1B000.monIndex) == 1) - { - EWRAM_1B000.monIndex = 0; - EWRAM_1B000.setupState++; - } - else - EWRAM_1B000.monIndex++; - break; - case 4: - PartyMenuPrintMonsLevelOrStatus(); - EWRAM_1B000.setupState++; - break; - case 5: - PrintPartyMenuMonNicknames(); - EWRAM_1B000.setupState++; - break; - case 6: - PartyMenuTryPrintMonsHP(); - EWRAM_1B000.setupState++; - break; - case 7: - nullsub_13(); - EWRAM_1B000.setupState++; - break; - case 8: - PartyMenuDrawHPBars(); - EWRAM_1B000.setupState++; - break; - case 9: - if (DrawPartyMonBackground(EWRAM_1B000.monIndex) == 1) - { - EWRAM_1B000.monIndex = 0; - EWRAM_1B000.setupState++; - } - else - EWRAM_1B000.monIndex++; - break; - case 10: - if (gUnknown_02038473 == 3) - { - if (GetItemEffectType(gSpecialVar_ItemId) == 10) - ewram1B000.promptTextId = 0xFF; - else - ewram1B000.promptTextId = 3; - } - return TRUE; - } - return FALSE; -} - -static void sub_8095050(u8 a, u8 b) -{ - if (!GetMonData(&gPlayerParty[b], MON_DATA_IS_EGG)) - { - if (gUnknown_02038473 == 1) - { - gTasks[EWRAM_1B000.menuHandlerTaskId].data[4] = 1; - gTasks[EWRAM_1B000.menuHandlerTaskId].data[5] = 1; - } - else - { - gTasks[EWRAM_1B000.menuHandlerTaskId].data[4] = 0; - gTasks[EWRAM_1B000.menuHandlerTaskId].data[5] = 0; - } - } - else - { - gTasks[EWRAM_1B000.menuHandlerTaskId].data[4] = 2; - gTasks[EWRAM_1B000.menuHandlerTaskId].data[5] = 2; - } - - ShowPartyPopupMenu(gTasks[a].data[4], sBattlePartyPopupMenus, sBattlePartyMenuActions, 0); -} - -void HandleBattlePartyMenu(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gUnknown_02038473 == 3 && GetItemEffectType(gSpecialVar_ItemId) == 10) - { - gPokemonItemUseCallback(taskId, gSpecialVar_ItemId, Task_80952E4); - return; - } - - switch (HandleDefaultPartyMenuInput(taskId)) - { - case A_BUTTON: - if (gUnknown_02038473 == 3) - { - if (GetMonData(&gPlayerParty[sub_806CA38(taskId)], MON_DATA_IS_EGG)) - PlaySE(SE_HAZURE); - else - { - sub_806D5A4(); - gPokemonItemUseCallback(taskId, gSpecialVar_ItemId, Task_80952E4); - } - } - else - { - PlaySE(SE_SELECT); - GetMonNickname(&gPlayerParty[sub_806CA38(taskId)], gStringVar1); - sub_8095050(taskId, sub_806CA38(taskId)); - SetTaskFuncWithFollowupFunc(taskId, Task_HandlePopupMenuInput, HandleBattlePartyMenu); - } - break; - case B_BUTTON: - if (gUnknown_02038473 == 1) - PlaySE(SE_HAZURE); - else - { - PlaySE(SE_SELECT); - if (gUnknown_02038473 == 3) - { - gUnknown_0202E8F4 = 0; - gTasks[taskId].func = Task_80952E4; - } - else - { - gUnknown_0202E8F4 = 0; - gTasks[taskId].func = Task_809527C; - } - } - break; - } - } -} - -static void Task_809527C(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); - gTasks[taskId].func = Task_80952B4; -} - -static void Task_80952B4(u8 taskId) -{ - if (!gPaletteFade.active) - { - sub_8094D60(); - DestroyTask(taskId); - SetMainCallback2(sub_802E414); - } -} - -static void Task_80952E4(u8 taskId) -{ - if (gUnknown_0202E8F4 != 0) - Task_809527C(taskId); - else - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); - gTasks[taskId].func = Task_8095330; - } -} - -static void Task_8095330(u8 taskId) -{ - if (!gPaletteFade.active) - { - sub_8094D60(); - DestroyTask(taskId); - sub_80A6DCC(); - } -} - -static void Task_809535C(void) -{ - gPaletteFade.bufferTransferDisabled = TRUE; - SetPartyMenuSettings(PARTY_MENU_TYPE_BATTLE, 0xFF, HandleBattlePartyMenu, 5); - SetMainCallback2(Task_809538C); -} - -static void Task_809538C(void) -{ - do - { - if (InitPartyMenu() == TRUE) - { - sub_806C994(EWRAM_1B000.menuHandlerTaskId, gUnknown_020384F0); - ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); - GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); - sub_8095050(EWRAM_1B000.menuHandlerTaskId, gUnknown_020384F0); - SetTaskFuncWithFollowupFunc(EWRAM_1B000.menuHandlerTaskId, Task_HandlePopupMenuInput, HandleBattlePartyMenu); - SetMainCallback2(CB2_PartyMenuMain); - return; - } - } while (sub_80F9344() != 1); -} - -static void Task_HandlePopupMenuInput(u8 taskId) -{ - TaskFunc func; - - if (!gPaletteFade.active) - { - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - return; - } - if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - return; - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - func = PartyMenuGetPopupMenuFunc(gTasks[taskId].data[4], - sBattlePartyPopupMenus, - sBattlePartyMenuActions, - Menu_GetCursorPos()); - func(taskId); - return; - } - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - Task_BattlePartyMenuCancel(taskId); - return; - } - } -} - -static void Task_80954C0(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - Task_BattlePartyMenuCancel(taskId); -} - -static void Task_ShowSummaryScreen(u8 taskId) -{ - u8 partySelection = sub_806CA38(taskId); - - if (!gPaletteFade.active) - { - DestroyTask(taskId); - EWRAM_1B000.unk262 = 1; - ShowPokemonSummaryScreen(gPlayerParty, partySelection, gPlayerPartyCount - 1, Task_809535C, PSS_MODE_NO_MOVE_ORDER_EDIT); - } -} - -static void Task_BattlePartyMenuSummary(u8 taskId) -{ - sub_806CA38(taskId); //an unused variable was probably set with this. - gTasks[taskId].func = Task_ShowSummaryScreen; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); -} - -static void Task_BattlePartyMenuShift(u8 taskId) -{ - u8 partySelection; - u8 i; - u8 r4; - - ClosePartyPopupMenu(gTasks[taskId].data[4], sBattlePartyPopupMenus); - partySelection = sub_806CA38(taskId); - if (IsLinkDoubleBattle() == TRUE && (partySelection == 1 || partySelection == 4 || partySelection == 5)) - { - sub_806D5A4(); - StringCopy(gStringVar1, sub_8040D08()); - StringExpandPlaceholders(gStringVar4, gOtherText_CantSwitchPokeWithYours); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - if (GetMonData(&gPlayerParty[partySelection], MON_DATA_HP) == 0) - { - sub_806D5A4(); - GetMonNickname(&gPlayerParty[partySelection], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_NoEnergyLeft); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerSide(i) == 0 - && sub_8094C20(partySelection) == gBattlerPartyIndexes[i]) - { - sub_806D5A4(); - GetMonNickname(&gPlayerParty[partySelection], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyBattle); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - } - if (GetMonData(&gPlayerParty[partySelection], MON_DATA_IS_EGG)) - { - sub_806D5A4(); - StringExpandPlaceholders(gStringVar4, gOtherText_EGGCantBattle); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - if (sub_8094C20(partySelection) == EWRAM_1609D) - { - sub_806D5A4(); - GetMonNickname(&gPlayerParty[partySelection], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_AlreadySelected); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - if (gUnknown_02038473 == 4) - { - sub_806D5A4(); - sub_8040B8C(); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - if (gUnknown_02038473 == 2) - { - u8 r0; - u8 r4 = gBankInMenu; - - sub_806D5A4(); - r0 = pokemon_order_func(gBattlerPartyIndexes[r4]); - GetMonNickname(&gPlayerParty[r0], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_CantBeSwitched); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - gUnknown_0202E8F5 = sub_8094C20(partySelection); - gUnknown_0202E8F4 = 1; - r4 = pokemon_order_func(gBattlerPartyIndexes[gBankInMenu]); - sub_8094C98(r4, partySelection); - SwapPokemon(&gPlayerParty[r4], &gPlayerParty[partySelection]); - gTasks[taskId].func = Task_809527C; -} - -static void Task_BattlePartyMenuCancel(u8 taskId) -{ - Menu_DestroyCursor(); - ClosePartyPopupMenu(gTasks[taskId].data[4], sBattlePartyPopupMenus); - gTasks[taskId].data[4] = gTasks[taskId].data[5]; - PrintPartyMenuPromptText(0, 0); - SwitchTaskToFollowupFunc(taskId); -} diff --git a/src/battle/battle_records.c b/src/battle/battle_records.c deleted file mode 100644 index d94d88032..000000000 --- a/src/battle/battle_records.c +++ /dev/null @@ -1,382 +0,0 @@ -#include "global.h" -#include "battle_records.h" -#include "constants/game_stat.h" -#include "link.h" -#include "menu.h" -#include "overworld.h" -#include "string_util.h" -#include "strings2.h" -#include "trainer_card.h" - -struct DebugStruct1 -{ - u16 var0; - u8 var1[10]; -}; - -extern struct LinkPlayerEventObject gLinkPlayerEventObjects[4]; -extern u8 gBattleOutcome; - -#if DEBUG -const struct DebugStruct1 gUnknown_Debug_4245CC[] = -{ - { 1, _("NUMBER1") }, - { 2, _("ナンバー2") }, - { 3, _("ナンバー3") }, - { 4, _("ナンバー4") }, - { 5, _("ナンバー5") }, - { 6, _("ナンバー6") }, - { 7, _("ナンバー7") }, -}; - -const struct {u8 unk0; u8 unk1;} gUnknown_Debug_8424620[] = -{ - { 1, 1 }, - { 2, 1 }, - { 3, 1 }, -}; -#endif - -static void InitLinkBattleRecord(struct LinkBattleRecord *record) -{ - CpuFill16(0, record, sizeof(struct LinkBattleRecord)); - record->name[0] = 0xFF; - record->trainerId = 0; - record->wins = 0; - record->losses = 0; - record->draws = 0; -} - -static void InitLinkBattleRecords_(struct LinkBattleRecord *records) -{ - int i; - for (i = 0; i < 5; i++) - { - InitLinkBattleRecord(records + i); - } - SetGameStat(GAME_STAT_LINK_BATTLE_WINS, 0); - SetGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 0); - SetGameStat(GAME_STAT_LINK_BATTLE_DRAWS, 0); -} - -static int GetLinkBattleRecordTotalBattles(struct LinkBattleRecord *record) -{ - return record->wins + record->losses + record->draws; -} - -static int FindLinkBattleRecord(struct LinkBattleRecord *records, const u8 *name, u16 trainerId) -{ - int i; - - for (i = 0; i < 5; i++) - { - memcpy(gStringVar1, records[i].name, 7); - gStringVar1[7] = EOS; - if (!StringCompareWithoutExtCtrlCodes(gStringVar1, name) && records[i].trainerId == trainerId) - return i; - } - - return 5; -} - -static void SortLinkBattleRecords(struct LinkBattleRecord *records) -{ - int i, j; - - for (i = 4; i > 0; i--) - { - for (j = i - 1; j >= 0; j--) - { - int totalBattlesI = GetLinkBattleRecordTotalBattles(records + i); - int totalBattlesJ = GetLinkBattleRecordTotalBattles(records + j); - - if (totalBattlesI > totalBattlesJ) - { - struct LinkBattleRecord temp = *(records + i); - *(records + i) = *(records + j); - *(records + j) = temp; - } - } - } -} - -static void UpdateLinkBattleRecord(struct LinkBattleRecord *record, int battleOutcome) -{ - switch (battleOutcome) - { - case 1: - record->wins++; - if (record->wins > 9999) - record->wins = 9999; - break; - case 2: - record->losses++; - if (record->losses > 9999) - record->losses = 9999; - break; - case 3: - record->draws++; - if (record->draws > 9999) - record->draws = 9999; - break; - } -} - -static void UpdateLinkBattleGameStats(int battleOutcome) -{ - u8 stat; - - switch (battleOutcome) - { - case 1: - stat = GAME_STAT_LINK_BATTLE_WINS; - break; - case 2: - stat = GAME_STAT_LINK_BATTLE_LOSSES; - break; - case 3: - stat = GAME_STAT_LINK_BATTLE_DRAWS; - break; - default: - return; - } - - if (GetGameStat(stat) < 9999) - IncrementGameStat(stat); -} - -static void UpdateLinkBattleRecords_(struct LinkBattleRecord *records, const u8 *name, u16 trainerId, int battleOutcome, u8 language) -{ - int index; - UpdateLinkBattleGameStats(battleOutcome); - SortLinkBattleRecords(records); - index = FindLinkBattleRecord(records, name, trainerId); - if (index == 5) - { - index = 4; - InitLinkBattleRecord(records + index); - if (language == LANGUAGE_JAPANESE) - { - records[index].name[0] = EXT_CTRL_CODE_BEGIN; - records[index].name[1] = 0x15; - StringCopyN(records[index].name + 2, name, 5); - } - else - { - StringCopyN(records[index].name, name, 7); - } - - // needed block to match - { - struct LinkBattleRecord *record = records + index; - record->trainerId = trainerId; - } - } - UpdateLinkBattleRecord(records + index, battleOutcome); - SortLinkBattleRecords(records); -} - -void InitLinkBattleRecords(void) -{ - InitLinkBattleRecords_(gSaveBlock1.linkBattleRecords); -} - -static void IncTrainerCardWins(int id) -{ - u16 *wins = &gTrainerCards[id].linkBattleWins; - (*wins)++; - if (*wins > 9999) - *wins = 9999; -} - -static void IncTrainerCardLosses(int id) -{ - u16 *losses = &gTrainerCards[id].linkBattleLosses; - (*losses)++; - if (*losses > 9999) - *losses = 9999; -} - -static void UpdateTrainerCardWinsLosses(int id) -{ - switch (gBattleOutcome) - { - case 1: - IncTrainerCardWins(id ^ 1); - IncTrainerCardLosses(id); - break; - case 2: - IncTrainerCardLosses(id ^ 1); - IncTrainerCardWins(id); - break; - } -} - -void UpdateLinkBattleRecords(int id) -{ - UpdateTrainerCardWinsLosses(id); - UpdateLinkBattleRecords_( - gSaveBlock1.linkBattleRecords, - gTrainerCards[id].playerName, - gTrainerCards[id].trainerId, - gBattleOutcome, - gLinkPlayers[gLinkPlayerEventObjects[id].linkPlayerId].language); -} - -#if DEBUG -void debug_sub_81257E0(void) -{ - u32 i; - - InitLinkBattleRecords(); - for (i = 0; i < 3; i++) - { - u32 id = gUnknown_Debug_8424620[i].unk0 - 1; - - UpdateLinkBattleRecords_( - gSaveBlock1.linkBattleRecords, - gUnknown_Debug_4245CC[id].var1, - gUnknown_Debug_4245CC[id].var0, - gUnknown_Debug_8424620[i].unk1, - gLinkPlayers[gLinkPlayerEventObjects[id].linkPlayerId].language); - } -} -#endif - -static void PrintLinkBattleWinsLossesDraws(struct LinkBattleRecord *records) -{ - ConvertIntToDecimalStringN_DigitWidth6(gStringVar1, GetGameStat(GAME_STAT_LINK_BATTLE_WINS), STR_CONV_MODE_RIGHT_ALIGN, 4); - ConvertIntToDecimalStringN_DigitWidth6(gStringVar2, GetGameStat(GAME_STAT_LINK_BATTLE_LOSSES), STR_CONV_MODE_RIGHT_ALIGN, 4); - ConvertIntToDecimalStringN_DigitWidth6(gStringVar3, GetGameStat(GAME_STAT_LINK_BATTLE_DRAWS), STR_CONV_MODE_RIGHT_ALIGN, 4); - Menu_PrintText(gOtherText_WinRecord, 3, 3); -} - -static void PrintLinkBattleRecord(struct LinkBattleRecord *record, u8 y) -{ - if (!record->wins && !record->losses && !record->draws) - { - u8 buffer[16]; - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x14; - buffer[2] = 6; - buffer[3] = EXT_CTRL_CODE_BEGIN; - buffer[4] = 0x11; - buffer[5] = 1; - StringCopy(buffer + 6, gOtherText_SevenDashes); - Menu_PrintText(buffer, 3, y); - StringCopy(buffer + 6, gOtherText_FourDashes); - Menu_PrintText(buffer, 11, y); - Menu_PrintText(buffer, 17, y); - Menu_PrintText(buffer, 23, y); - } - else - { - StringFillWithTerminator(gStringVar1, 8); - StringCopyN(gStringVar1, record->name, 7); - Menu_PrintText(gStringVar1, 3, y); - gStringVar1[0] = EXT_CTRL_CODE_BEGIN; - gStringVar1[1] = 0x14; - gStringVar1[2] = 6; - ConvertIntToDecimalStringN(gStringVar1 + 3, record->wins, STR_CONV_MODE_RIGHT_ALIGN, 4); - Menu_PrintText(gStringVar1, 11, y); - ConvertIntToDecimalStringN(gStringVar1 + 3, record->losses, STR_CONV_MODE_RIGHT_ALIGN, 4); - Menu_PrintText(gStringVar1, 17, y); - ConvertIntToDecimalStringN(gStringVar1 + 3, record->draws, STR_CONV_MODE_RIGHT_ALIGN, 4); - Menu_PrintText(gStringVar1, 23, y); - } -} - -void ShowLinkBattleRecords(void) -{ - s32 i; - Menu_DrawStdWindowFrame(1, 0, 28, 18); - MenuPrint_Centered(gOtherText_BattleResults, 0, 1, 240); - - PrintLinkBattleWinsLossesDraws(gSaveBlock1.linkBattleRecords); -#if ENGLISH - Menu_PrintText(gOtherText_WinLoseDraw, 12, 6); -#elif GERMAN - Menu_PrintTextPixelCoords(gOtherText_WinLoseDraw, 88, 48, 1); -#endif - - for (i = 0; i < 5; i++) - { - PrintLinkBattleRecord(&gSaveBlock1.linkBattleRecords[i], 6 + (i + 1) * 2); - } -} - -static bool32 sub_8110494(u8 level) -{ - struct BattleTowerData *battleTower = &gSaveBlock2.battleTower; - - switch (battleTower->var_4AE[level]) - { - case 0: - return FALSE; - case 1: - return FALSE; - case 2: - return TRUE; - case 4: - return FALSE; - case 3: - return TRUE; - case 5: - return FALSE; - case 6: - return TRUE; - default: - return FALSE; - } -} - -static void PrintWinStreak(const u8 *str, u16 streak, u8 left, u8 top) -{ - Menu_PrintText(str, left, top); - if (streak > 9999) - streak = 9999; - AlignInt1InMenuWindow(gStringVar1, streak, 24, 1); - Menu_PrintText(gOtherText_WinStreak, left + 7, top); -} - -static void PrintRecordWinStreak(u8 level, u8 left, u8 top) -{ - struct BattleTowerData *battleTower = &gSaveBlock2.battleTower; - u16 winStreak = battleTower->recordWinStreaks[level]; - PrintWinStreak(gOtherText_Record, winStreak, left, top); -} - -static u16 GetLastWinStreak(u8 level) -{ - u16 winStreak = gSaveBlock2.battleTower.currentWinStreaks[level]; - if (winStreak > 9999) - winStreak = 9999; - - return winStreak; -} - -static void PrintLastWinStreak(u8 level, u8 left, u8 top) -{ - u16 winStreak = GetLastWinStreak(level); - if (sub_8110494(level) == TRUE) - PrintWinStreak(gOtherText_Current, winStreak, left, top); - else - PrintWinStreak(gOtherText_Prev, winStreak, left, top); -} - -void ShowBattleTowerRecords(void) -{ - u16 i; - Menu_DrawStdWindowFrame(3, 1, 27, 17); - MenuPrint_Centered(gOtherText_BattleTowerResults, 3, 2, 0xC8); - Menu_PrintText(gOtherText_Lv50, 5, 6); - Menu_PrintText(gOtherText_Lv100, 5, 12); - for (i = 5; i < 26; i++) - { - sub_8071F60(CHAR_HYPHEN, i, 10); - } - PrintLastWinStreak(0, 10, 6); - PrintRecordWinStreak(0, 10, 8); - PrintLastWinStreak(1, 10, 12); - PrintRecordWinStreak(1, 10, 14); -} diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c deleted file mode 100644 index c457cc8ec..000000000 --- a/src/battle/battle_setup.c +++ /dev/null @@ -1,1482 +0,0 @@ -#include "global.h" -#include "battle_setup.h" -#include "battle.h" -#include "battle_transition.h" -#include "data2.h" -#include "event_data.h" -#include "field_control_avatar.h" -#include "field_fadetransition.h" -#include "field_message_box.h" -#include "field_player_avatar.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "fldeff_poison.h" -#include "main.h" -#include "metatile_behavior.h" -#include "palette.h" -#include "random.h" -#include "overworld.h" -#include "safari_zone.h" -#include "script.h" -#include "script_pokemon_80C4.h" -#include "secret_base.h" -#include "sound.h" -#include "starter_choose.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" -#include "trainer.h" -#include "constants/map_types.h" -#include "constants/maps.h" -#include "constants/opponents.h" -#include "constants/songs.h" -#include "constants/species.h" - -extern u16 gSpecialVar_Result; - -extern void (*gFieldCallback)(void); - -EWRAM_DATA static u16 sTrainerBattleMode = 0; -EWRAM_DATA u16 gTrainerBattleOpponent = 0; -EWRAM_DATA static u16 sTrainerEventObjectLocalId = 0; -EWRAM_DATA static u8 *sTrainerIntroSpeech = NULL; -EWRAM_DATA static u8 *sTrainerDefeatSpeech = NULL; -EWRAM_DATA static u8 *sTrainerVictorySpeech = NULL; -EWRAM_DATA static u8 *sTrainerCannotBattleSpeech = NULL; -EWRAM_DATA static u8 *sTrainerBattleScriptRetAddr = NULL; -EWRAM_DATA static u8 *sTrainerBattleEndScript = NULL; - -extern u16 gBattleTypeFlags; -extern u16 gSpecialVar_LastTalked; -extern u8 gBattleOutcome; - -extern struct EventObject gEventObjects[]; - -extern u8 gUnknown_0819F818[]; -extern u8 gUnknown_0819F840[]; -extern u8 gUnknown_0819F878[]; -extern u8 gUnknown_0819F887[]; -extern u8 gUnknown_0819F8AE[]; - -extern u8 gUnknown_0819F80B[]; -extern u8 gUnknown_081C6C02[]; - -// The first transition is used if the enemy pokemon are lower level than our pokemon. -// Otherwise, the second transition is used. -static const u8 gBattleTransitionTable_Wild[][2] = -{ - {B_TRANSITION_SLICE, B_TRANSITION_WHITEFADE}, // Normal - {B_TRANSITION_CLOCKWISE_BLACKFADE, B_TRANSITION_GRID_SQUARES}, // Cave - {B_TRANSITION_BLUR, B_TRANSITION_GRID_SQUARES}, // Cave with flash used - {B_TRANSITION_WAVE, B_TRANSITION_RIPPLE}, // Water -}; -static const u8 gBattleTransitionTable_Trainer[][2] = -{ - {B_TRANSITION_POKEBALLS_TRAIL, B_TRANSITION_SHARDS}, // Normal - {B_TRANSITION_SHUFFLE, B_TRANSITION_BIG_POKEBALL}, // Cave - {B_TRANSITION_BLUR, B_TRANSITION_GRID_SQUARES}, // Cave with flash used - {B_TRANSITION_SWIRL, B_TRANSITION_RIPPLE}, // Water -}; - -enum -{ - TRAINER_PARAM_LOAD_VAL_8BIT, - TRAINER_PARAM_LOAD_VAL_16BIT, - TRAINER_PARAM_LOAD_VAL_32BIT, - TRAINER_PARAM_CLEAR_VAL_8BIT, - TRAINER_PARAM_CLEAR_VAL_16BIT, - TRAINER_PARAM_CLEAR_VAL_32BIT, - TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR, -}; - -struct TrainerBattleParameter -{ - void *varPtr; - u8 ptrType; -}; - -static const struct TrainerBattleParameter gTrainerBattleSpecs_0[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleScriptRetAddr, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; -static const struct TrainerBattleParameter gTrainerBattleSpecs_1[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBattleScriptRetAddr, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; -static const struct TrainerBattleParameter gTrainerBattleSpecs_2[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleScriptRetAddr, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; -static const struct TrainerBattleParameter gTrainerBattleSpecs_3[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleScriptRetAddr, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; -static const struct TrainerBattleParameter gTrainerBattleSpecs_4[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBattleScriptRetAddr, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -const struct TrainerEyeTrainer gTrainerEyeTrainers[] = -{ - { - {TRAINER_ROSE_1, TRAINER_ROSE_2, TRAINER_ROSE_3, TRAINER_ROSE_4, TRAINER_ROSE_5}, - MAP_GROUP(ROUTE118), - MAP_NUM(ROUTE118), - }, - { - {TRAINER_DUSTY_1, TRAINER_DUSTY_2, TRAINER_DUSTY_3, TRAINER_DUSTY_4, TRAINER_DUSTY_5}, - MAP_GROUP(ROUTE111), - MAP_NUM(ROUTE111), - }, - { - {TRAINER_LOLA_1, TRAINER_LOLA_2, TRAINER_LOLA_3, TRAINER_LOLA_4, TRAINER_LOLA_5}, - MAP_GROUP(ROUTE109), - MAP_NUM(ROUTE109), - }, - { - {TRAINER_RICKY_1, TRAINER_RICKY_2, TRAINER_RICKY_3, TRAINER_RICKY_4, TRAINER_RICKY_5}, - MAP_GROUP(ROUTE109), - MAP_NUM(ROUTE109), - }, - { - {TRAINER_RITA_AND_SAM_1, TRAINER_RITA_AND_SAM_2, TRAINER_RITA_AND_SAM_3, TRAINER_RITA_AND_SAM_4, TRAINER_RITA_AND_SAM_5}, - MAP_GROUP(ROUTE124), - MAP_NUM(ROUTE124), - }, - { - {TRAINER_BROOKE_1, TRAINER_BROOKE_2, TRAINER_BROOKE_3, TRAINER_BROOKE_4, TRAINER_BROOKE_5}, - MAP_GROUP(ROUTE111), - MAP_NUM(ROUTE111), - }, - { - {TRAINER_WILTON_1, TRAINER_WILTON_2, TRAINER_WILTON_3, TRAINER_WILTON_4, TRAINER_WILTON_5}, - MAP_GROUP(ROUTE111), - MAP_NUM(ROUTE111), - }, - { - {TRAINER_VALERIE_1, TRAINER_VALERIE_2, TRAINER_VALERIE_3, TRAINER_VALERIE_4, TRAINER_VALERIE_5}, - MAP_GROUP(MT_PYRE_6F), - MAP_NUM(MT_PYRE_6F), - }, - { - {TRAINER_CINDY_1, TRAINER_CINDY_3, TRAINER_CINDY_4, TRAINER_CINDY_5, TRAINER_CINDY_6}, - MAP_GROUP(ROUTE104), - MAP_NUM(ROUTE104), - }, - { - {TRAINER_JESSICA_1, TRAINER_JESSICA_2, TRAINER_JESSICA_3, TRAINER_JESSICA_4, TRAINER_JESSICA_5}, - MAP_GROUP(ROUTE121), - MAP_NUM(ROUTE121), - }, - { - {TRAINER_WINSTON_1, TRAINER_WINSTON_2, TRAINER_WINSTON_3, TRAINER_WINSTON_4, TRAINER_WINSTON_5}, - MAP_GROUP(ROUTE104), - MAP_NUM(ROUTE104), - }, - { - {TRAINER_STEVE_1, TRAINER_STEVE_2, TRAINER_STEVE_3, TRAINER_STEVE_4, TRAINER_STEVE_5}, - MAP_GROUP(ROUTE114), - MAP_NUM(ROUTE114), - }, - { - {TRAINER_TONY_1, TRAINER_TONY_2, TRAINER_TONY_3, TRAINER_TONY_4, TRAINER_TONY_5}, - MAP_GROUP(ROUTE107), - MAP_NUM(ROUTE107), - }, - { - {TRAINER_NOB_1, TRAINER_NOB_2, TRAINER_NOB_3, TRAINER_NOB_4, TRAINER_NOB_5}, - MAP_GROUP(ROUTE115), - MAP_NUM(ROUTE115), - }, - { - {TRAINER_DALTON_1, TRAINER_DALTON_2, TRAINER_DALTON_3, TRAINER_DALTON_4, TRAINER_DALTON_5}, - MAP_GROUP(ROUTE118), - MAP_NUM(ROUTE118), - }, - { - {TRAINER_BERNIE_1, TRAINER_BERNIE_2, TRAINER_BERNIE_3, TRAINER_BERNIE_4, TRAINER_BERNIE_5}, - MAP_GROUP(ROUTE114), - MAP_NUM(ROUTE114), - }, - { - {TRAINER_ETHAN_1, TRAINER_ETHAN_2, TRAINER_ETHAN_3, TRAINER_ETHAN_4, TRAINER_ETHAN_5}, - MAP_GROUP(JAGGED_PASS), - MAP_NUM(JAGGED_PASS), - }, - { - {TRAINER_JOHN_AND_JAY_1, TRAINER_JOHN_AND_JAY_2, TRAINER_JOHN_AND_JAY_3, TRAINER_JOHN_AND_JAY_4, TRAINER_JOHN_AND_JAY_5}, - MAP_GROUP(METEOR_FALLS_1F_2R), - MAP_NUM(METEOR_FALLS_1F_2R), - }, - { - {TRAINER_BRANDON_1, TRAINER_BRANDON_2, TRAINER_BRANDON_3, TRAINER_BRANDON_4, TRAINER_BRANDON_5}, - MAP_GROUP(ROUTE120), - MAP_NUM(ROUTE120), - }, - { - {TRAINER_CAMERON_1, TRAINER_CAMERON_2, TRAINER_CAMERON_3, TRAINER_CAMERON_4, TRAINER_CAMERON_5}, - MAP_GROUP(ROUTE123), - MAP_NUM(ROUTE123), - }, - { - {TRAINER_JACKI_1, TRAINER_JACKI_2, TRAINER_JACKI_3, TRAINER_JACKI_4, TRAINER_JACKI_5}, - MAP_GROUP(ROUTE123), - MAP_NUM(ROUTE123), - }, - { - {TRAINER_WALTER_1, TRAINER_WALTER_2, TRAINER_WALTER_3, TRAINER_WALTER_4, TRAINER_WALTER_5}, - MAP_GROUP(ROUTE121), - MAP_NUM(ROUTE121), - }, - { - {TRAINER_KAREN_1, TRAINER_KAREN_2, TRAINER_KAREN_3, TRAINER_KAREN_4, TRAINER_KAREN_5}, - MAP_GROUP(ROUTE116), - MAP_NUM(ROUTE116), - }, - { - {TRAINER_JERRY_1, TRAINER_JERRY_2, TRAINER_JERRY_3, TRAINER_JERRY_4, TRAINER_JERRY_5}, - MAP_GROUP(ROUTE116), - MAP_NUM(ROUTE116), - }, - { - {TRAINER_ANNA_AND_MEG_1, TRAINER_ANNA_AND_MEG_2, TRAINER_ANNA_AND_MEG_3, TRAINER_ANNA_AND_MEG_4, TRAINER_ANNA_AND_MEG_5}, - MAP_GROUP(ROUTE117), - MAP_NUM(ROUTE117), - }, - { - {TRAINER_ISABEL_1, TRAINER_ISABEL_2, TRAINER_ISABEL_3, TRAINER_ISABEL_4, TRAINER_ISABEL_5}, - MAP_GROUP(ROUTE110), - MAP_NUM(ROUTE110), - }, - { - {TRAINER_MIGUEL_1, TRAINER_MIGUEL_2, TRAINER_MIGUEL_3, TRAINER_MIGUEL_4, TRAINER_MIGUEL_5}, - MAP_GROUP(ROUTE103), - MAP_NUM(ROUTE103), - }, - { - {TRAINER_TIMOTHY_1, TRAINER_TIMOTHY_2, TRAINER_TIMOTHY_3, TRAINER_TIMOTHY_4, TRAINER_TIMOTHY_5}, - MAP_GROUP(ROUTE115), - MAP_NUM(ROUTE115), - }, - { - {TRAINER_SHELBY_1, TRAINER_SHELBY_2, TRAINER_SHELBY_3, TRAINER_SHELBY_4, TRAINER_SHELBY_5}, - MAP_GROUP(MT_CHIMNEY), - MAP_NUM(MT_CHIMNEY), - }, - { - {TRAINER_CALVIN_1, TRAINER_CALVIN_2, TRAINER_CALVIN_3, TRAINER_CALVIN_4, TRAINER_CALVIN_5}, - MAP_GROUP(ROUTE102), - MAP_NUM(ROUTE102), - }, - { - {TRAINER_ELLIOT_1, TRAINER_ELLIOT_2, TRAINER_ELLIOT_3, TRAINER_ELLIOT_4, TRAINER_ELLIOT_5}, - MAP_GROUP(ROUTE106), - MAP_NUM(ROUTE106), - }, - { - {TRAINER_ABIGAIL_1, TRAINER_ABIGAIL_2, TRAINER_ABIGAIL_3, TRAINER_ABIGAIL_4, TRAINER_ABIGAIL_5}, - MAP_GROUP(ROUTE110), - MAP_NUM(ROUTE110), - }, - { - {TRAINER_BENJAMIN_1, TRAINER_BENJAMIN_2, TRAINER_BENJAMIN_3, TRAINER_BENJAMIN_4, TRAINER_BENJAMIN_5}, - MAP_GROUP(ROUTE110), - MAP_NUM(ROUTE110), - }, - { - {TRAINER_ISAIAH_1, TRAINER_ISAIAH_2, TRAINER_ISAIAH_3, TRAINER_ISAIAH_4, TRAINER_ISAIAH_5}, - MAP_GROUP(ROUTE128), - MAP_NUM(ROUTE128), - }, - { - {TRAINER_KATELYN_1, TRAINER_KATELYN_2, TRAINER_KATELYN_3, TRAINER_KATELYN_4, TRAINER_KATELYN_5}, - MAP_GROUP(ROUTE128), - MAP_NUM(ROUTE128), - }, - { - {TRAINER_MARIA_1, TRAINER_MARIA_2, TRAINER_MARIA_3, TRAINER_MARIA_4, TRAINER_MARIA_5}, - MAP_GROUP(ROUTE117), - MAP_NUM(ROUTE117), - }, - { - {TRAINER_DYLAN_1, TRAINER_DYLAN_2, TRAINER_DYLAN_3, TRAINER_DYLAN_4, TRAINER_DYLAN_5}, - MAP_GROUP(ROUTE117), - MAP_NUM(ROUTE117), - }, - { - {TRAINER_NICOLAS_1, TRAINER_NICOLAS_2, TRAINER_NICOLAS_3, TRAINER_NICOLAS_4, TRAINER_NICOLAS_5}, - MAP_GROUP(METEOR_FALLS_1F_2R), - MAP_NUM(METEOR_FALLS_1F_2R), - }, - { - {TRAINER_ROBERT_1, TRAINER_ROBERT_2, TRAINER_ROBERT_3, TRAINER_ROBERT_4, TRAINER_ROBERT_5}, - MAP_GROUP(ROUTE120), - MAP_NUM(ROUTE120), - }, - { - {TRAINER_LAO_1, TRAINER_LAO_2, TRAINER_LAO_3, TRAINER_LAO_4, TRAINER_LAO_5}, - MAP_GROUP(ROUTE113), - MAP_NUM(ROUTE113), - }, - { - {TRAINER_CYNDY_1, TRAINER_CYNDY_2, TRAINER_CYNDY_3, TRAINER_CYNDY_4, TRAINER_CYNDY_5}, - MAP_GROUP(ROUTE115), - MAP_NUM(ROUTE115), - }, - { - {TRAINER_MADELINE_1, TRAINER_MADELINE_2, TRAINER_MADELINE_3, TRAINER_MADELINE_4, TRAINER_MADELINE_5}, - MAP_GROUP(ROUTE113), - MAP_NUM(ROUTE113), - }, - { - {TRAINER_JENNY_1, TRAINER_JENNY_2, TRAINER_JENNY_3, TRAINER_JENNY_4, TRAINER_JENNY_5}, - MAP_GROUP(ROUTE124), - MAP_NUM(ROUTE124), - }, - { - {TRAINER_DIANA_1, TRAINER_DIANA_2, TRAINER_DIANA_3, TRAINER_DIANA_4, TRAINER_DIANA_5}, - MAP_GROUP(JAGGED_PASS), - MAP_NUM(JAGGED_PASS), - }, - { - {TRAINER_AMY_AND_LIV_1, TRAINER_AMY_AND_LIV_2, TRAINER_AMY_AND_LIV_4, TRAINER_AMY_AND_LIV_5, TRAINER_AMY_AND_LIV_6}, - MAP_GROUP(ROUTE103), - MAP_NUM(ROUTE103), - }, - { - {TRAINER_ERNEST_1, TRAINER_ERNEST_2, TRAINER_ERNEST_3, TRAINER_ERNEST_4, TRAINER_ERNEST_5}, - MAP_GROUP(ROUTE125), - MAP_NUM(ROUTE125), - }, - { - {TRAINER_EDWIN_1, TRAINER_EDWIN_2, TRAINER_EDWIN_3, TRAINER_EDWIN_4, TRAINER_EDWIN_5}, - MAP_GROUP(ROUTE110), - MAP_NUM(ROUTE110), - }, - { - {TRAINER_LYDIA_1, TRAINER_LYDIA_2, TRAINER_LYDIA_3, TRAINER_LYDIA_4, TRAINER_LYDIA_5}, - MAP_GROUP(ROUTE117), - MAP_NUM(ROUTE117), - }, - { - {TRAINER_ISAAC_1, TRAINER_ISAAC_2, TRAINER_ISAAC_3, TRAINER_ISAAC_4, TRAINER_ISAAC_5}, - MAP_GROUP(ROUTE117), - MAP_NUM(ROUTE117), - }, - { - {TRAINER_CATHERINE_1, TRAINER_CATHERINE_2, TRAINER_CATHERINE_3, TRAINER_CATHERINE_4, TRAINER_CATHERINE_5}, - MAP_GROUP(ROUTE119), - MAP_NUM(ROUTE119), - }, - { - {TRAINER_JACKSON_1, TRAINER_JACKSON_2, TRAINER_JACKSON_3, TRAINER_JACKSON_4, TRAINER_JACKSON_5}, - MAP_GROUP(ROUTE119), - MAP_NUM(ROUTE119), - }, - { - {TRAINER_HALEY_1, TRAINER_HALEY_2, TRAINER_HALEY_3, TRAINER_HALEY_4, TRAINER_HALEY_5}, - MAP_GROUP(ROUTE104), - MAP_NUM(ROUTE104), - }, - { - {TRAINER_JAMES_1, TRAINER_JAMES_2, TRAINER_JAMES_3, TRAINER_JAMES_4, TRAINER_JAMES_5}, - MAP_GROUP(PETALBURG_WOODS), - MAP_NUM(PETALBURG_WOODS), - }, - { - {TRAINER_TRENT_1, TRAINER_TRENT_2, TRAINER_TRENT_3, TRAINER_TRENT_4, TRAINER_TRENT_5}, - MAP_GROUP(ROUTE112), - MAP_NUM(ROUTE112), - }, - { - {TRAINER_LOIS_AND_HAL_1, TRAINER_LOIS_AND_HAL_2, TRAINER_LOIS_AND_HAL_3, TRAINER_LOIS_AND_HAL_4, TRAINER_LOIS_AND_HAL_5}, - MAP_GROUP(ABANDONED_SHIP_ROOMS2_1F), - MAP_NUM(ABANDONED_SHIP_ROOMS2_1F), - }, - { - {TRAINER_WALLY_3, TRAINER_WALLY_4, TRAINER_WALLY_5, TRAINER_WALLY_6, TRAINER_NONE}, - MAP_GROUP(VICTORY_ROAD_1F), - MAP_NUM(VICTORY_ROAD_1F), - }, -}; - -static const u16 sBadgeFlags[] = -{ - FLAG_BADGE01_GET, - FLAG_BADGE02_GET, - FLAG_BADGE03_GET, - FLAG_BADGE04_GET, - FLAG_BADGE05_GET, - FLAG_BADGE06_GET, - FLAG_BADGE07_GET, - FLAG_BADGE08_GET, -}; - -static void DoStandardWildBattle(void); -static void DoSafariBattle(void); -static void SetTrainerFlagsAfterTrainerEyeRematch(void); -static void CB2_EndWildBattle(void); -static void CB2_EndScriptedWildBattle(void); -static u8 GetWildBattleTransition(void); -static u8 GetTrainerBattleTransition(void); -static void CB2_GiveStarter(void); -static void CB2_StartFirstBattle(void); -static void CB2_EndFirstBattle(void); -static bool32 IsPlayerDefeated(u32 a1); - -#define tState data[0] -#define tTransition data[1] - -static void Task_BattleStart(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (tState) - { - case 0: - if (!FldeffPoison_IsActive()) // is poison not active? - { - BattleTransition_StartOnField(tTransition); - tState++; // go to case 1. - } - break; - case 1: - if (IsBattleTransitionDone() == TRUE) - { - SetMainCallback2(sub_800E7C4); - RestartWildEncounterImmunitySteps(); - ClearPoisonStepCounter(); - DestroyTask(taskId); - } - break; - } -} - -static void CreateBattleStartTask(u8 transition, u16 song) -{ - u8 taskId = CreateTask(Task_BattleStart, 1); - - gTasks[taskId].tTransition = transition; - current_map_music_set__default_for_battle(song); -} - -#undef tState -#undef tTransition - -void BattleSetup_StartWildBattle(void) -{ - if (GetSafariZoneFlag()) - DoSafariBattle(); - else - DoStandardWildBattle(); -} - -static void DoStandardWildBattle(void) -{ - ScriptContext2_Enable(); - FreezeEventObjects(); - sub_80597F4(); - gMain.savedCallback = CB2_EndWildBattle; - gBattleTypeFlags = 0; - CreateBattleStartTask(GetWildBattleTransition(), 0); - IncrementGameStat(GAME_STAT_TOTAL_BATTLES); - IncrementGameStat(GAME_STAT_WILD_BATTLES); -} - -void BattleSetup_StartRoamerBattle(void) -{ - ScriptContext2_Enable(); - FreezeEventObjects(); - sub_80597F4(); - gMain.savedCallback = CB2_EndWildBattle; - gBattleTypeFlags = BATTLE_TYPE_ROAMER; - CreateBattleStartTask(GetWildBattleTransition(), 0); - IncrementGameStat(GAME_STAT_TOTAL_BATTLES); - IncrementGameStat(GAME_STAT_WILD_BATTLES); -} - -static void DoSafariBattle(void) -{ - ScriptContext2_Enable(); - FreezeEventObjects(); - sub_80597F4(); - gMain.savedCallback = sub_80C824C; - gBattleTypeFlags = BATTLE_TYPE_SAFARI; - CreateBattleStartTask(GetWildBattleTransition(), 0); -} - -static void StartTheBattle(void) -{ - CreateBattleStartTask(GetTrainerBattleTransition(), 0); - IncrementGameStat(GAME_STAT_TOTAL_BATTLES); - IncrementGameStat(GAME_STAT_TRAINER_BATTLES); -} - -//Initiates battle where Wally catches Ralts -void ScrSpecial_StartWallyTutorialBattle(void) -{ - CreateMaleMon(&gEnemyParty[0], SPECIES_RALTS, 5); - ScriptContext2_Enable(); - gMain.savedCallback = c2_exit_to_overworld_1_continue_scripts_restart_music; - gBattleTypeFlags = BATTLE_TYPE_WALLY_TUTORIAL; - CreateBattleStartTask(B_TRANSITION_SLICE, 0); -} - -void BattleSetup_StartScriptedWildBattle(void) -{ - ScriptContext2_Enable(); - gMain.savedCallback = CB2_EndScriptedWildBattle; - gBattleTypeFlags = 0; - CreateBattleStartTask(GetWildBattleTransition(), 0); - IncrementGameStat(GAME_STAT_TOTAL_BATTLES); - IncrementGameStat(GAME_STAT_WILD_BATTLES); -} - -void ScrSpecial_StartSouthernIslandBattle(void) -{ - ScriptContext2_Enable(); - gMain.savedCallback = CB2_EndScriptedWildBattle; - gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; - CreateBattleStartTask(GetWildBattleTransition(), 0); - IncrementGameStat(GAME_STAT_TOTAL_BATTLES); - IncrementGameStat(GAME_STAT_WILD_BATTLES); -} - -void ScrSpecial_StartRayquazaBattle(void) -{ - ScriptContext2_Enable(); - gMain.savedCallback = CB2_EndScriptedWildBattle; - gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; - CreateBattleStartTask(B_TRANSITION_BLUR, MUS_BATTLE34); - IncrementGameStat(GAME_STAT_TOTAL_BATTLES); - IncrementGameStat(GAME_STAT_WILD_BATTLES); -} - -void ScrSpecial_StartGroudonKyogreBattle(void) -{ - ScriptContext2_Enable(); - gMain.savedCallback = CB2_EndScriptedWildBattle; - gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON; - if (gGameVersion == VERSION_RUBY) - CreateBattleStartTask(B_TRANSITION_SHARDS, MUS_BATTLE34); // GROUDON - else - CreateBattleStartTask(B_TRANSITION_RIPPLE, MUS_BATTLE34); // KYOGRE - IncrementGameStat(GAME_STAT_TOTAL_BATTLES); - IncrementGameStat(GAME_STAT_WILD_BATTLES); -} - -void ScrSpecial_StartRegiBattle(void) -{ - ScriptContext2_Enable(); - gMain.savedCallback = CB2_EndScriptedWildBattle; - gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI; - CreateBattleStartTask(B_TRANSITION_GRID_SQUARES, MUS_BATTLE36); - IncrementGameStat(GAME_STAT_TOTAL_BATTLES); - IncrementGameStat(GAME_STAT_WILD_BATTLES); -} - -static void CB2_EndWildBattle(void) -{ - CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE); - ResetOamRange(0, 128); - - if (IsPlayerDefeated(gBattleOutcome) == TRUE) - { - SetMainCallback2(CB2_WhiteOut); - } - else - { - SetMainCallback2(CB2_ReturnToField); - gFieldCallback = sub_8080E44; - } -} - -void CB2_EndScriptedWildBattle(void) -{ - CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE); - ResetOamRange(0, 128); - - if (IsPlayerDefeated(gBattleOutcome) == TRUE) - SetMainCallback2(CB2_WhiteOut); - else - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -s8 BattleSetup_GetTerrain(void) -{ - u16 tileBehavior; - s16 x, y; - - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - - if (MetatileBehavior_IsTallGrass(tileBehavior)) - return BATTLE_TERRAIN_GRASS; - if (MetatileBehavior_IsLongGrass(tileBehavior)) - return BATTLE_TERRAIN_LONG_GRASS; - if (MetatileBehavior_IsSandOrDeepSand(tileBehavior)) - return BATTLE_TERRAIN_SAND; - switch (gMapHeader.mapType) - { - case MAP_TYPE_TOWN: - case MAP_TYPE_CITY: - case MAP_TYPE_ROUTE: - break; - case MAP_TYPE_UNDERGROUND: - if (MetatileBehavior_IsIndoorEncounter(tileBehavior)) - return BATTLE_TERRAIN_BUILDING; - if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) - return BATTLE_TERRAIN_POND; - return BATTLE_TERRAIN_CAVE; - case MAP_TYPE_INDOOR: - case MAP_TYPE_SECRET_BASE: - return BATTLE_TERRAIN_BUILDING; - case MAP_TYPE_UNDERWATER: - return BATTLE_TERRAIN_UNDERWATER; - case MAP_TYPE_6: - if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) - return BATTLE_TERRAIN_WATER; - return BATTLE_TERRAIN_PLAIN; - } - if (MetatileBehavior_IsOceanWater(tileBehavior)) - return BATTLE_TERRAIN_WATER; - if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) - return BATTLE_TERRAIN_POND; - if (MetatileBehavior_IsMountainTop(tileBehavior)) - return BATTLE_TERRAIN_MOUNTAIN; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - { - if (MetatileBehavior_GetBridgeType(tileBehavior)) - return BATTLE_TERRAIN_POND; - if (MetatileBehavior_IsBridge(tileBehavior) == TRUE) - return BATTLE_TERRAIN_WATER; - } - if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE113) && gSaveBlock1.location.mapNum == MAP_NUM(ROUTE113)) - return BATTLE_TERRAIN_SAND; - if (GetSav1Weather() == 8) - return BATTLE_TERRAIN_SAND; - return BATTLE_TERRAIN_PLAIN; -} - -static s8 GetBattleTransitionTypeByMap(void) -{ - u16 tileBehavior; - s16 x, y; - - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - if (Overworld_GetFlashLevel()) - return 2; - if (!MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) - { - switch (gMapHeader.mapType) - { - case MAP_TYPE_UNDERGROUND: - return 1; - case MAP_TYPE_UNDERWATER: - return 3; - default: - return 0; - } - } - return 3; -} - -static u16 GetSumOfPlayerPartyLevel(u8 numMons) -{ - u8 sum = 0; - int i; - - for (i = 0; i < 6; i++) - { - u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - - if (species != SPECIES_EGG && species != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0) - { - sum += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); - numMons--; - if (numMons == 0) - break; - } - } - return sum; -} - -static u8 GetSumOfEnemyPartyLevel(u16 opponentId, u8 numMons) -{ - u8 i; - u8 sum; - u32 count = numMons; - - if (gTrainers[opponentId].partySize < count) - count = gTrainers[opponentId].partySize; - - sum = 0; - - switch (gTrainers[opponentId].partyFlags) - { - case 0: - { - const struct TrainerMonNoItemDefaultMoves *party; - party = gTrainers[opponentId].party.NoItemDefaultMoves; - for (i = 0; i < count; i++) - sum += party[i].level; - } - break; - case F_TRAINER_PARTY_CUSTOM_MOVESET: - { - const struct TrainerMonNoItemCustomMoves *party; - party = gTrainers[opponentId].party.NoItemCustomMoves; - for (i = 0; i < count; i++) - sum += party[i].level; - } - break; - case F_TRAINER_PARTY_HELD_ITEM: - { - const struct TrainerMonItemDefaultMoves *party; - party = gTrainers[opponentId].party.ItemDefaultMoves; - for (i = 0; i < count; i++) - sum += party[i].level; - } - break; - case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM: - { - const struct TrainerMonItemCustomMoves *party; - party = gTrainers[opponentId].party.ItemCustomMoves; - for (i = 0; i < count; i++) - sum += party[i].level; - } - break; - } - - return sum; -} - -static u8 GetWildBattleTransition(void) -{ - u8 transitionType = GetBattleTransitionTypeByMap(); - u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); - u8 playerLevel = GetSumOfPlayerPartyLevel(1); - - if (enemyLevel < playerLevel) - return gBattleTransitionTable_Wild[transitionType][0]; - else - return gBattleTransitionTable_Wild[transitionType][1]; -} - -static u8 GetTrainerBattleTransition(void) -{ - const struct Trainer *trainer; - u8 minPartyCount; - u8 transitionType; - u8 enemyLevel; - u8 playerLevel; - - if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) - return B_TRANSITION_STEVEN; - - trainer = gTrainers; - - if (trainer[gTrainerBattleOpponent].trainerClass == TRAINER_CLASS_ELITE_FOUR) - { - if (gTrainerBattleOpponent == TRAINER_SIDNEY) - return B_TRANSITION_SYDNEY; - if (gTrainerBattleOpponent == TRAINER_PHOEBE) - return B_TRANSITION_PHOEBE; - if (gTrainerBattleOpponent == TRAINER_GLACIA) - return B_TRANSITION_GLACIA; - if (gTrainerBattleOpponent == TRAINER_DRAKE) - return B_TRANSITION_DRAKE; - return B_TRANSITION_STEVEN; - } - - if (trainer[gTrainerBattleOpponent].trainerClass == TRAINER_CLASS_CHAMPION) - return B_TRANSITION_STEVEN; - - if (trainer[gTrainerBattleOpponent].doubleBattle == TRUE) - minPartyCount = 2; // double battles always at least have 2 pokemon. - else - minPartyCount = 1; - - transitionType = GetBattleTransitionTypeByMap(); - enemyLevel = GetSumOfEnemyPartyLevel(gTrainerBattleOpponent, minPartyCount); - playerLevel = GetSumOfPlayerPartyLevel(minPartyCount); - if (enemyLevel < playerLevel) // is wild mon level than the player's mon level? - return gBattleTransitionTable_Trainer[transitionType][0]; - else - return gBattleTransitionTable_Trainer[transitionType][1]; -} - -u8 BattleSetup_GetBattleTowerBattleTransition(void) -{ - u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); - u8 playerLevel = GetSumOfPlayerPartyLevel(1); - - if (enemyLevel < playerLevel) - return B_TRANSITION_POKEBALLS_TRAIL; - else - return B_TRANSITION_BIG_POKEBALL; -} - -void ScrSpecial_ChooseStarter(void) -{ - SetMainCallback2(CB2_ChooseStarter); - gMain.savedCallback = CB2_GiveStarter; -} - -static void CB2_GiveStarter(void) -{ - u16 starterPoke; - - *GetVarPointer(VAR_STARTER_MON) = gSpecialVar_Result; - starterPoke = GetStarterPokemon(gSpecialVar_Result); - ScriptGiveMon(starterPoke, 5, 0, 0, 0, 0); - ResetTasks(); - sub_80408BC(); - SetMainCallback2(CB2_StartFirstBattle); - BattleTransition_Start(0); -} - -static void CB2_StartFirstBattle(void) -{ - UpdatePaletteFade(); - RunTasks(); - - if (IsBattleTransitionDone() == TRUE) - { - gBattleTypeFlags = BATTLE_TYPE_FIRST_BATTLE; - gMain.savedCallback = CB2_EndFirstBattle; - SetMainCallback2(sub_800E7C4); - RestartWildEncounterImmunitySteps(); - ClearPoisonStepCounter(); - IncrementGameStat(GAME_STAT_TOTAL_BATTLES); - IncrementGameStat(GAME_STAT_WILD_BATTLES); - } -} - -static void CB2_EndFirstBattle(void) -{ - Overworld_ClearSavedMusic(); - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -// why not just use the macros? maybe its because they didnt want to uncast const every time? -static u32 TrainerBattleLoadArg32(const u8 *ptr) -{ - return T1_READ_32(ptr); -} - -static u16 TrainerBattleLoadArg16(const u8 *ptr) -{ - return T1_READ_16(ptr); -} - -static u8 TrainerBattleLoadArg8(const u8 *ptr) -{ - return T1_READ_8(ptr); -} - -static u16 CurrentOpponentTrainerFlag(void) -{ - return TRAINER_FLAG_START + gTrainerBattleOpponent; -} - -static bool32 IsPlayerDefeated(u32 battleOutcome) -{ - switch (battleOutcome) - { - case BATTLE_LOST: - case BATTLE_DREW: - return TRUE; - case BATTLE_WON: - case BATTLE_RAN: - case BATTLE_PLAYER_TELEPORTED: - case BATTLE_POKE_FLED: - case BATTLE_CAUGHT: - return FALSE; - default: - return FALSE; - } -} - -static void ResetTrainerOpponentIds(void) -{ - sTrainerBattleMode = 0; - gTrainerBattleOpponent = 0; - sTrainerEventObjectLocalId = 0; - sTrainerIntroSpeech = 0; - sTrainerDefeatSpeech = 0; - sTrainerVictorySpeech = 0; - sTrainerCannotBattleSpeech = 0; - sTrainerBattleScriptRetAddr = 0; - sTrainerBattleEndScript = 0; -} - -static void TrainerBattleLoadArgs(const struct TrainerBattleParameter *specs, const u8 *data) -{ - while (1) - { - switch (specs->ptrType) - { - case TRAINER_PARAM_LOAD_VAL_8BIT: - *(u8 *)specs->varPtr = TrainerBattleLoadArg8(data); - data += 1; - break; - case TRAINER_PARAM_LOAD_VAL_16BIT: - *(u16 *)specs->varPtr = TrainerBattleLoadArg16(data); - data += 2; - break; - case TRAINER_PARAM_LOAD_VAL_32BIT: - *(u32 *)specs->varPtr = TrainerBattleLoadArg32(data); - data += 4; - break; - case TRAINER_PARAM_CLEAR_VAL_8BIT: - *(u8 *)specs->varPtr = 0; - break; - case TRAINER_PARAM_CLEAR_VAL_16BIT: - *(u16 *)specs->varPtr = 0; - break; - case TRAINER_PARAM_CLEAR_VAL_32BIT: - *(u32 *)specs->varPtr = 0; - break; - case TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR: - *(const u8 **)specs->varPtr = data; - return; - } - specs++; - } -} - -static void SetMapVarsToTrainer(void) -{ - if (sTrainerEventObjectLocalId) - { - gSpecialVar_LastTalked = sTrainerEventObjectLocalId; - gSelectedEventObject = GetEventObjectIdByLocalIdAndMap(sTrainerEventObjectLocalId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - } -} - -u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) -{ - ResetTrainerOpponentIds(); - sTrainerBattleMode = TrainerBattleLoadArg8(data); - - switch (sTrainerBattleMode) - { - case 3: - TrainerBattleLoadArgs(gTrainerBattleSpecs_3, data); - return gUnknown_0819F878; - case 4: - TrainerBattleLoadArgs(gTrainerBattleSpecs_2, data); - SetMapVarsToTrainer(); - return gUnknown_0819F840; - case 1: - case 2: - TrainerBattleLoadArgs(gTrainerBattleSpecs_1, data); - SetMapVarsToTrainer(); - return gUnknown_0819F818; - case 6: - case 8: - TrainerBattleLoadArgs(gTrainerBattleSpecs_4, data); - SetMapVarsToTrainer(); - return gUnknown_0819F840; - case 7: - TrainerBattleLoadArgs(gTrainerBattleSpecs_2, data); - SetMapVarsToTrainer(); - gTrainerBattleOpponent = GetRematchTrainerId(gTrainerBattleOpponent); - return gUnknown_0819F8AE; - case 5: - TrainerBattleLoadArgs(gTrainerBattleSpecs_0, data); - SetMapVarsToTrainer(); - gTrainerBattleOpponent = GetRematchTrainerId(gTrainerBattleOpponent); - return gUnknown_0819F887; - default: - TrainerBattleLoadArgs(gTrainerBattleSpecs_0, data); - SetMapVarsToTrainer(); - return gUnknown_0819F818; - } -} - -void TrainerWantsBattle(u8 trainerEventObjId, const u8 *trainerScript) -{ - gSelectedEventObject = trainerEventObjId; - gSpecialVar_LastTalked = gEventObjects[trainerEventObjId].localId; - BattleSetup_ConfigureTrainerBattle(trainerScript + 1); - ScriptContext1_SetupScript(gUnknown_0819F80B); - ScriptContext2_Enable(); -} - -bool32 GetTrainerFlagFromScriptPointer(const u8 *data) -{ - u32 flag = TrainerBattleLoadArg16(data + 2); - return FlagGet(TRAINER_FLAG_START + flag); -} - -void sub_8082524(void) -{ - struct EventObject *eventObject = &gEventObjects[gSelectedEventObject]; - - SetTrainerMovementType(eventObject, GetTrainerFacingDirectionMovementType(eventObject->facingDirection)); -} - -u8 ScrSpecial_GetTrainerBattleMode(void) -{ - return sTrainerBattleMode; -} - -u8 ScrSpecial_HasTrainerBeenFought(void) -{ - return FlagGet(CurrentOpponentTrainerFlag()); -} - -void SetCurrentTrainerBattledFlag(void) -{ - FlagSet(CurrentOpponentTrainerFlag()); -} - -void unref_sub_8082590(void) -{ - FlagSet(CurrentOpponentTrainerFlag()); // duplicate function -} - -u8 HasTrainerAlreadyBeenFought(u16 flag) -{ - return FlagGet(TRAINER_FLAG_START + flag); -} - -void SetTrainerFlag(u16 flag) -{ - FlagSet(TRAINER_FLAG_START + flag); -} - -void ClearTrainerFlag(u16 flag) -{ - FlagClear(TRAINER_FLAG_START + flag); -} - -void BattleSetup_StartTrainerBattle(void) -{ - gBattleTypeFlags = BATTLE_TYPE_TRAINER; - gMain.savedCallback = CB2_EndTrainerBattle; - StartTheBattle(); - ScriptContext1_Stop(); -} - -void CB2_EndTrainerBattle(void) -{ - if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) - { - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); - } - else if (IsPlayerDefeated(gBattleOutcome) == TRUE) - { - SetMainCallback2(CB2_WhiteOut); - } - else - { - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); - SetCurrentTrainerBattledFlag(); - } -} - -void CB2_EndTrainerEyeRematchBattle(void) -{ - if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) - { - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); - } - else if (IsPlayerDefeated(gBattleOutcome) == TRUE) - { - SetMainCallback2(CB2_WhiteOut); - } - else - { - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); - SetCurrentTrainerBattledFlag(); - SetTrainerFlagsAfterTrainerEyeRematch(); - } -} - -void ScrSpecial_StartTrainerEyeRematch(void) -{ - gBattleTypeFlags = BATTLE_TYPE_TRAINER; - gMain.savedCallback = CB2_EndTrainerEyeRematchBattle; - StartTheBattle(); - ScriptContext1_Stop(); -} - -static const u8 *GetTrainerIntroSpeech(void); -static const u8 *GetTrainerNonBattlingSpeech(void); - -void ScrSpecial_ShowTrainerIntroSpeech(void) -{ - ShowFieldMessage(GetTrainerIntroSpeech()); -} - -u8 *BattleSetup_GetScriptAddrAfterBattle(void) -{ - if (sTrainerBattleScriptRetAddr) - return sTrainerBattleScriptRetAddr; - else - return gUnknown_081C6C02; -} - -u8 *BattleSetup_GetTrainerPostBattleScript(void) -{ - if (sTrainerBattleEndScript) - return sTrainerBattleEndScript; - else - return gUnknown_081C6C02; -} - -void ScrSpecial_ShowTrainerNonBattlingSpeech(void) -{ - ShowFieldMessage(GetTrainerNonBattlingSpeech()); -} - -void PlayTrainerEncounterMusic(void) -{ - u16 music; - - if (sTrainerBattleMode != 1 && sTrainerBattleMode != 8) - { - switch (sub_803FC58(gTrainerBattleOpponent)) - { - case TRAINER_ENCOUNTER_MUSIC_MALE: - music = MUS_BOYEYE; - break; - case TRAINER_ENCOUNTER_MUSIC_FEMALE: - music = MUS_GIRLEYE; - break; - case TRAINER_ENCOUNTER_MUSIC_GIRL: - music = MUS_SYOUJOEYE; - break; - case TRAINER_ENCOUNTER_MUSIC_INTENSE: - music = MUS_HAGESHII; - break; - case TRAINER_ENCOUNTER_MUSIC_COOL: - music = MUS_KAKKOII; - break; - case TRAINER_ENCOUNTER_MUSIC_AQUA: - music = MUS_AQA_0; - break; - case TRAINER_ENCOUNTER_MUSIC_MAGMA: - music = MUS_MGM0; - break; - case TRAINER_ENCOUNTER_MUSIC_SWIMMER: - music = MUS_SWIMEYE; - break; - case TRAINER_ENCOUNTER_MUSIC_TWINS: - music = MUS_HUTAGO; - break; - case TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR: - music = MUS_SITENNOU; - break; - case TRAINER_ENCOUNTER_MUSIC_HIKER: - music = MUS_YAMA_EYE; - break; - case TRAINER_ENCOUNTER_MUSIC_INTERVIEWER: - music = MUS_INTER_V; - break; - case TRAINER_ENCOUNTER_MUSIC_RICH: - music = MUS_TEST; - break; - default: - music = MUS_AYASII; - } - PlayNewMapMusic(music); - } -} - -//Returns an empty string if a null pointer was passed, otherwise returns str -static const u8 *SanitizeString(const u8 *str) -{ - if (str) - return str; - else - return gOtherText_CancelWithTerminator; -} - -static const u8 *GetTrainerIntroSpeech(void) -{ - return SanitizeString(sTrainerIntroSpeech); -} - -u8 *GetTrainerLoseText(void) -{ - const u8 *str; - - if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) - str = GetSecretBaseTrainerLoseText(); - else - str = sTrainerDefeatSpeech; - - StringExpandPlaceholders(gStringVar4, SanitizeString(str)); - return gStringVar4; -} - -const u8 *unref_sub_808286C(void) -{ - return SanitizeString(sTrainerVictorySpeech); -} - -static const u8 *GetTrainerNonBattlingSpeech(void) -{ - return SanitizeString(sTrainerCannotBattleSpeech); -} - -s32 FirstBattleTrainerIdToRematchTableId(const struct TrainerEyeTrainer *trainers, u16 opponentId) -{ - s32 i; - - for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) - { - if (trainers[i].opponentIDs[0] == opponentId) - return i; - } - return -1; -} - -s32 TrainerIdToRematchTableId(const struct TrainerEyeTrainer *trainers, u16 opponentId) -{ - s32 i; - s32 j; - - for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) - { - for (j = 0; j < 5 && trainers[i].opponentIDs[j] != 0; j++) - { - if (trainers[i].opponentIDs[j] == opponentId) - return i; - } - } - return -1; -} - -bool32 UpdateRandomTrainerEyeRematches(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum) -{ - int i; - bool32 ret = FALSE; - - for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) - { - if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum) - { - if (gSaveBlock1.trainerRematches[i] != 0) - { - // Trainer already wants rematch. Don't bother updating it - ret = TRUE; - } - else if (HasTrainerAlreadyBeenFought(trainers[i].opponentIDs[0]) == TRUE - && (Random() % 100) <= 30) // 31% chance of getting a rematch - { - int rematches = 1; - - while (rematches < 5 && trainers[i].opponentIDs[rematches] != 0 - && HasTrainerAlreadyBeenFought(trainers[i].opponentIDs[rematches])) - rematches++; - gSaveBlock1.trainerRematches[i] = rematches; - ret = TRUE; - } - } - } - return ret; -} - -s32 DoesSomeoneWantRematchIn_(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum) -{ - s32 i; - - for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) - { - if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum && gSaveBlock1.trainerRematches[i]) - return 1; - } - return 0; -} - -s32 IsRematchTrainerIn_(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum) -{ - s32 i; - - for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) - { - if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum) - return 1; - } - return 0; -} - -bool8 IsFirstTrainerIdReadyForRematch(const struct TrainerEyeTrainer *trainers, u16 opponentId) -{ - s32 trainerEyeIndex = FirstBattleTrainerIdToRematchTableId(trainers, opponentId); - - if (trainerEyeIndex != -1 && trainerEyeIndex < 100 && gSaveBlock1.trainerRematches[trainerEyeIndex]) - return TRUE; - else - return FALSE; -} - -bool8 GetTrainerEyeRematchFlag(const struct TrainerEyeTrainer *trainers, u16 opponentId) -{ - s32 trainerEyeIndex = TrainerIdToRematchTableId(trainers, opponentId); - - if (trainerEyeIndex != -1 && trainerEyeIndex < 100 && gSaveBlock1.trainerRematches[trainerEyeIndex]) - return TRUE; - else - return FALSE; -} - -u16 GetRematchTrainerIdFromTable(const struct TrainerEyeTrainer *trainers, u16 opponentId) -{ - int i; - const struct TrainerEyeTrainer *trainer; - s32 trainerEyeIndex = FirstBattleTrainerIdToRematchTableId(trainers, opponentId); - - if (trainerEyeIndex == -1) - return 0; - trainer = &trainers[trainerEyeIndex]; - for (i = 1; i < 5; i++) - { - if (!trainer->opponentIDs[i]) - return trainer->opponentIDs[i - 1]; - if (!HasTrainerAlreadyBeenFought(trainer->opponentIDs[i])) - return trainer->opponentIDs[i]; - } - return trainer->opponentIDs[4]; -} - -void ClearTrainerEyeRematchFlag(const struct TrainerEyeTrainer *trainers, u16 opponentId) -{ - s32 trainerEyeIndex = TrainerIdToRematchTableId(trainers, opponentId); - - if (trainerEyeIndex != -1) - gSaveBlock1.trainerRematches[trainerEyeIndex] = 0; -} - -bool8 WasSecondRematchWon(const struct TrainerEyeTrainer *trainers, u16 opponentId) -{ - s32 trainerEyeIndex = FirstBattleTrainerIdToRematchTableId(trainers, opponentId); - - if (trainerEyeIndex != -1 && HasTrainerAlreadyBeenFought(trainers[trainerEyeIndex].opponentIDs[1])) - return TRUE; - else - return FALSE; -} - -bool32 HasAtLeastFiveBadges(void) -{ - int badgeCount = 0; - u32 i; - - for (i = 0; i < 8; i++) - { - if (FlagGet(sBadgeFlags[i]) == TRUE) - { - badgeCount++; - if (badgeCount >= 5) - return TRUE; - } - } - return FALSE; -} - -void IncrementRematchStepCounter(void) -{ - if (HasAtLeastFiveBadges()) - { - if (gSaveBlock1.trainerRematchStepCounter >= TRAINER_REMATCH_STEPS) - gSaveBlock1.trainerRematchStepCounter = TRAINER_REMATCH_STEPS; - else - gSaveBlock1.trainerRematchStepCounter++; - } -} - -bool32 IsRematchStepCounterMaxed(void) -{ - if (HasAtLeastFiveBadges() && gSaveBlock1.trainerRematchStepCounter >= TRAINER_REMATCH_STEPS) - return TRUE; - else - return FALSE; -} - -void TryUpdateRandomTrainerRematches(u16 mapGroup, u16 mapNum) -{ - if (IsRematchStepCounterMaxed() && UpdateRandomTrainerEyeRematches(gTrainerEyeTrainers, mapGroup, mapNum) == TRUE) - gSaveBlock1.trainerRematchStepCounter = 0; -} - -s32 DoesSomeoneWantRematchIn(u16 mapGroup, u16 mapNum) -{ - return DoesSomeoneWantRematchIn_(gTrainerEyeTrainers, mapGroup, mapNum); -} - -s32 IsRematchTrainerIn(u16 mapGroup, u16 mapNum) -{ - return IsRematchTrainerIn_(gTrainerEyeTrainers, mapGroup, mapNum); -} - -u16 GetRematchTrainerId(u16 opponentId) -{ - return GetRematchTrainerIdFromTable(gTrainerEyeTrainers, opponentId); -} - -bool8 ShouldTryRematchBattle(void) -{ - if (IsFirstTrainerIdReadyForRematch(gTrainerEyeTrainers, gTrainerBattleOpponent)) - return 1; - else - return WasSecondRematchWon(gTrainerEyeTrainers, gTrainerBattleOpponent); -} - -u8 ScrSpecial_GetTrainerEyeRematchFlag(void) -{ - return GetTrainerEyeRematchFlag(gTrainerEyeTrainers, gTrainerBattleOpponent); -} - -void SetTrainerFlagsAfterTrainerEyeRematch(void) -{ - ClearTrainerEyeRematchFlag(gTrainerEyeTrainers, gTrainerBattleOpponent); - SetCurrentTrainerBattledFlag(); -} diff --git a/src/battle/battle_transition.c b/src/battle/battle_transition.c deleted file mode 100644 index a0c94f713..000000000 --- a/src/battle/battle_transition.c +++ /dev/null @@ -1,2511 +0,0 @@ -#include "global.h" -#include "battle_transition.h" -#include "main.h" -#include "overworld.h" -#include "task.h" -#include "palette.h" -#include "trig.h" -#include "field_effect.h" -#include "field_weather.h" -#include "random.h" -#include "sprite.h" -#include "sound.h" -#include "trainer.h" -#include "field_camera.h" -#include "ewram.h" -#include "scanline_effect.h" -#include "constants/songs.h" -#include "constants/field_effects.h" - -void ScanlineEffect_Clear(void); - -extern const struct OamData gFieldOamData_32x32; - -struct TransitionData -{ - vs8 VBlank_DMA; - u16 WININ; - u16 WINOUT; - u16 field_6; - u16 WIN0V; - u16 field_A; - u16 field_C; - u16 BLDCNT; - u16 BLDALPHA; - u16 BLDY; - s16 field_14; - s16 field_16; - s16 field_18; - s16 field_1A; - s16 field_1C; - s16 field_1E; // unused - s16 field_20; - s16 field_22; // unused - s16 data[11]; -}; - -typedef bool8 (*TransitionState)(struct Task* task); -typedef bool8 (*TransitionSpriteCallback)(struct Sprite* sprite); - -// this file's functions -static void LaunchBattleTransitionTask(u8 transitionID); -static void Task_BattleTransitionMain(u8 taskID); -static void Phase1Task_TransitionAll(u8 taskID); -static void Phase2Task_Transition_Blur(u8 taskID); -static void Phase2Task_Transition_Swirl(u8 taskID); -static void Phase2Task_Transition_Shuffle(u8 taskID); -static void Phase2Task_Transition_BigPokeball(u8 taskID); -static void Phase2Task_Transition_PokeballsTrail(u8 taskID); -static void Phase2Task_Transition_Clockwise_BlackFade(u8 taskID); -static void Phase2Task_Transition_Ripple(u8 taskID); -static void Phase2Task_Transition_Wave(u8 taskID); -static void Phase2Task_Transition_Slice(u8 taskID); -static void Phase2Task_Transition_WhiteFade(u8 taskID); -static void Phase2Task_Transition_GridSquares(u8 taskID); -static void Phase2Task_Transition_Shards(u8 taskID); -static void Phase2Task_Transition_Sydney(u8 taskID); -static void Phase2Task_Transition_Phoebe(u8 taskID); -static void Phase2Task_Transition_Glacia(u8 taskID); -static void Phase2Task_Transition_Drake(u8 taskID); -static void Phase2Task_Transition_Steven(u8 taskID); -static bool8 Transition_Phase1(struct Task* task); -static bool8 Transition_WaitForPhase1(struct Task* task); -static bool8 Transition_Phase2(struct Task* task); -static bool8 Transition_WaitForPhase2(struct Task* task); -static void VBlankCB_Phase2_Transition_Swirl(void); -static void HBlankCB_Phase2_Transition_Swirl(void); -static void VBlankCB_Phase2_Transition_Shuffle(void); -static void HBlankCB_Phase2_Transition_Shuffle(void); -static void VBlankCB0_Phase2_Transition_BigPokeball(void); -static void VBlankCB1_Phase2_Transition_BigPokeball(void); -static void VBlankCB_Phase2_Transition_Clockwise_BlackFade(void); -static void VBlankCB_Phase2_Transition_Ripple(void); -static void HBlankCB_Phase2_Transition_Ripple(void); -static void VBlankCB_Phase2_Transition_Wave(void); -static void VBlankCB_Phase2_Transition_Slice(void); -static void HBlankCB_Phase2_Transition_Slice(void); -static void VBlankCB0_Phase2_Transition_WhiteFade(void); -static void VBlankCB1_Phase2_Transition_WhiteFade(void); -static void HBlankCB_Phase2_Transition_WhiteFade(void); -static void VBlankCB0_Phase2_Mugshots(void); -static void VBlankCB1_Phase2_Mugshots(void); -static void HBlankCB_Phase2_Mugshots(void); -static void VBlankCB_Phase2_Transition_Shards(void); -static bool8 Phase2_Transition_Blur_Func1(struct Task* task); -static bool8 Phase2_Transition_Blur_Func2(struct Task* task); -static bool8 Phase2_Transition_Blur_Func3(struct Task* task); -static bool8 Phase2_Transition_Swirl_Func1(struct Task* task); -static bool8 Phase2_Transition_Swirl_Func2(struct Task* task); -static bool8 Phase2_Transition_Shuffle_Func1(struct Task* task); -static bool8 Phase2_Transition_Shuffle_Func2(struct Task* task); -static bool8 Phase2_Transition_BigPokeball_Func1(struct Task* task); -static bool8 Phase2_Transition_BigPokeball_Func2(struct Task* task); -static bool8 Phase2_Transition_BigPokeball_Func3(struct Task* task); -static bool8 Phase2_Transition_BigPokeball_Func4(struct Task* task); -static bool8 Phase2_Transition_BigPokeball_Func5(struct Task* task); -static bool8 Phase2_Transition_BigPokeball_Func6(struct Task* task); -static bool8 Phase2_Transition_PokeballsTrail_Func1(struct Task* task); -static bool8 Phase2_Transition_PokeballsTrail_Func2(struct Task* task); -static bool8 Phase2_Transition_PokeballsTrail_Func3(struct Task* task); -static bool8 Phase2_Transition_Clockwise_BlackFade_Func1(struct Task* task); -static bool8 Phase2_Transition_Clockwise_BlackFade_Func2(struct Task* task); -static bool8 Phase2_Transition_Clockwise_BlackFade_Func3(struct Task* task); -static bool8 Phase2_Transition_Clockwise_BlackFade_Func4(struct Task* task); -static bool8 Phase2_Transition_Clockwise_BlackFade_Func5(struct Task* task); -static bool8 Phase2_Transition_Clockwise_BlackFade_Func6(struct Task* task); -static bool8 Phase2_Transition_Clockwise_BlackFade_Func7(struct Task* task); -static bool8 Phase2_Transition_Ripple_Func1(struct Task* task); -static bool8 Phase2_Transition_Ripple_Func2(struct Task* task); -static bool8 Phase2_Transition_Wave_Func1(struct Task* task); -static bool8 Phase2_Transition_Wave_Func2(struct Task* task); -static bool8 Phase2_Transition_Wave_Func3(struct Task* task); -static bool8 Phase2_Transition_Slice_Func1(struct Task* task); -static bool8 Phase2_Transition_Slice_Func2(struct Task* task); -static bool8 Phase2_Transition_Slice_Func3(struct Task* task); -static bool8 Phase2_Transition_WhiteFade_Func1(struct Task* task); -static bool8 Phase2_Transition_WhiteFade_Func2(struct Task* task); -static bool8 Phase2_Transition_WhiteFade_Func3(struct Task* task); -static bool8 Phase2_Transition_WhiteFade_Func4(struct Task* task); -static bool8 Phase2_Transition_WhiteFade_Func5(struct Task* task); -static bool8 Phase2_Transition_GridSquares_Func1(struct Task* task); -static bool8 Phase2_Transition_GridSquares_Func2(struct Task* task); -static bool8 Phase2_Transition_GridSquares_Func3(struct Task* task); -static bool8 Phase2_Transition_Shards_Func1(struct Task* task); -static bool8 Phase2_Transition_Shards_Func2(struct Task* task); -static bool8 Phase2_Transition_Shards_Func3(struct Task* task); -static bool8 Phase2_Transition_Shards_Func4(struct Task* task); -static bool8 Phase2_Transition_Shards_Func5(struct Task* task); -static bool8 Phase2_Mugshot_Func1(struct Task* task); -static bool8 Phase2_Mugshot_Func2(struct Task* task); -static bool8 Phase2_Mugshot_Func3(struct Task* task); -static bool8 Phase2_Mugshot_Func4(struct Task* task); -static bool8 Phase2_Mugshot_Func5(struct Task* task); -static bool8 Phase2_Mugshot_Func6(struct Task* task); -static bool8 Phase2_Mugshot_Func7(struct Task* task); -static bool8 Phase2_Mugshot_Func8(struct Task* task); -static bool8 Phase2_Mugshot_Func9(struct Task* task); -static bool8 Phase2_Mugshot_Func10(struct Task* task); -static void Phase2Task_MugShotTransition(u8 taskID); -static void Mugshots_CreateOpponentPlayerSprites(struct Task* task); -static void sub_811CA10(s16 spriteID, s16 value); -static void sub_811CA28(s16 spriteID); -static s16 sub_811CA44(s16 spriteID); -static bool8 sub_811C934(struct Sprite* sprite); -static bool8 sub_811C938(struct Sprite* sprite); -static bool8 sub_811C984(struct Sprite* sprite); -static bool8 sub_811C9B8(struct Sprite* sprite); -static bool8 sub_811C9E4(struct Sprite* sprite); -static void CreatePhase1Task(s16 a0, s16 a1, s16 a2, s16 a3, s16 a4); -static bool8 sub_811D52C(void); -static void Phase1_Task_RunFuncs(u8 taskID); -static bool8 Phase1_TransitionAll_Func1(struct Task* task); -static bool8 Phase1_TransitionAll_Func2(struct Task* task); -static void sub_811D658(void); -static void VBlankCB_BattleTransition(void); -static void sub_811D6A8(u16** a0, u16** a1); -static void sub_811D690(u16** a0); -static void sub_811D6D4(void); -static void sub_811D6E8(s16* array, s16 sinAdd, s16 index, s16 indexIncrementer, s16 amplitude, s16 arrSize); -static void sub_811D764(u16* a0, s16 a1, s16 a2, s16 a3); -static void sub_811D8FC(s16* a0, s16 a1, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6); -static bool8 sub_811D978(s16* a0, bool8 a1, bool8 a2); -static void sub_811CFD0(struct Sprite* sprite); -static void sub_811B720(struct Sprite* sprite); -static void sub_811C90C(struct Sprite* sprite); - -// const data - -static const u32 sBigPokeball_Tileset[] = INCBIN_U32("graphics/battle_transitions/big_pokeball.4bpp"); -static const u32 sPokeballTrail_Tileset[] = INCBIN_U32("graphics/battle_transitions/pokeball_trail.4bpp"); -static const u8 sSpriteImage_83FC148[] = INCBIN_U8("graphics/battle_transitions/pokeball.4bpp"); -static const u32 sUnknown_083FC348[] = INCBIN_U32("graphics/battle_transitions/elite_four_bg.4bpp"); -static const u8 sSpriteImage_83FC528[] = INCBIN_U8("graphics/battle_transitions/unused_brendan.4bpp"); -static const u8 sSpriteImage_83FCD28[] = INCBIN_U8("graphics/battle_transitions/unused_lass.4bpp"); -static const u32 sShrinkingBoxTileset[] = INCBIN_U32("graphics/battle_transitions/shrinking_box.4bpp"); - -static struct TransitionData * const sTransitionStructPtr = &TRANSITION_STRUCT; - -static const TaskFunc sPhase1_Tasks[TRANSITIONS_NO] = -{ - [0 ... TRANSITIONS_NO - 1] = &Phase1Task_TransitionAll -}; - -static const TaskFunc sPhase2_Tasks[TRANSITIONS_NO] = -{ - Phase2Task_Transition_Blur, // 0 - Phase2Task_Transition_Swirl, // 1 - Phase2Task_Transition_Shuffle, // 2 - Phase2Task_Transition_BigPokeball, // 3 - Phase2Task_Transition_PokeballsTrail, // 4 - Phase2Task_Transition_Clockwise_BlackFade, // 5 - Phase2Task_Transition_Ripple, // 6 - Phase2Task_Transition_Wave, // 7 - Phase2Task_Transition_Slice, // 8 - Phase2Task_Transition_WhiteFade, // 9 - Phase2Task_Transition_GridSquares, // 10 - Phase2Task_Transition_Shards, // 11 - Phase2Task_Transition_Sydney, // 12 - Phase2Task_Transition_Phoebe, // 13 - Phase2Task_Transition_Glacia, // 14 - Phase2Task_Transition_Drake, // 15 - Phase2Task_Transition_Steven, // 16 -}; - -static const TransitionState sMainTransitionPhases[] = -{ - &Transition_Phase1, - &Transition_WaitForPhase1, - &Transition_Phase2, - &Transition_WaitForPhase2 -}; - -static const TransitionState sPhase2_Transition_Blur_Funcs[] = -{ - Phase2_Transition_Blur_Func1, - Phase2_Transition_Blur_Func2, - Phase2_Transition_Blur_Func3 -}; - -static const TransitionState sPhase2_Transition_Swirl_Funcs[] = -{ - Phase2_Transition_Swirl_Func1, - Phase2_Transition_Swirl_Func2, -}; - -static const TransitionState sPhase2_Transition_Shuffle_Funcs[] = -{ - Phase2_Transition_Shuffle_Func1, - Phase2_Transition_Shuffle_Func2, -}; - -static const TransitionState sPhase2_Transition_BigPokeball_Funcs[] = -{ - Phase2_Transition_BigPokeball_Func1, - Phase2_Transition_BigPokeball_Func2, - Phase2_Transition_BigPokeball_Func3, - Phase2_Transition_BigPokeball_Func4, - Phase2_Transition_BigPokeball_Func5, - Phase2_Transition_BigPokeball_Func6 -}; - -static const TransitionState sPhase2_Transition_PokeballsTrail_Funcs[] = -{ - Phase2_Transition_PokeballsTrail_Func1, - Phase2_Transition_PokeballsTrail_Func2, - Phase2_Transition_PokeballsTrail_Func3 -}; - -static const s16 sUnknown_083FD7E4[2] = {-16, 256}; -static const s16 sUnknown_083FD7E8[5] = {0, 32, 64, 18, 48}; -static const s16 sUnknown_083FD7F2[2] = {8, -8}; - -static const TransitionState sPhase2_Transition_Clockwise_BlackFade_Funcs[] = -{ - Phase2_Transition_Clockwise_BlackFade_Func1, - Phase2_Transition_Clockwise_BlackFade_Func2, - Phase2_Transition_Clockwise_BlackFade_Func3, - Phase2_Transition_Clockwise_BlackFade_Func4, - Phase2_Transition_Clockwise_BlackFade_Func5, - Phase2_Transition_Clockwise_BlackFade_Func6, - Phase2_Transition_Clockwise_BlackFade_Func7 -}; - -static const TransitionState sPhase2_Transition_Ripple_Funcs[] = -{ - Phase2_Transition_Ripple_Func1, - Phase2_Transition_Ripple_Func2 -}; - -static const TransitionState sPhase2_Transition_Wave_Funcs[] = -{ - Phase2_Transition_Wave_Func1, - Phase2_Transition_Wave_Func2, - Phase2_Transition_Wave_Func3 -}; - -static const TransitionState sPhase2_Mugshot_Transition_Funcs[] = -{ - Phase2_Mugshot_Func1, - Phase2_Mugshot_Func2, - Phase2_Mugshot_Func3, - Phase2_Mugshot_Func4, - Phase2_Mugshot_Func5, - Phase2_Mugshot_Func6, - Phase2_Mugshot_Func7, - Phase2_Mugshot_Func8, - Phase2_Mugshot_Func9, - Phase2_Mugshot_Func10 -}; - -static const u8 sMugshotsTrainerPicIDsTable[MUGSHOTS_NO] = {TRAINER_PIC_SIDNEY, TRAINER_PIC_PHOEBE, TRAINER_PIC_GLACIA, TRAINER_PIC_DRAKE, TRAINER_PIC_STEVEN}; -static const s16 sMugshotsOpponentRotationScales[MUGSHOTS_NO][2] = -{ - {0x200, 0x200}, - {0x200, 0x200}, - {0x1B0, 0x1B0}, - {0x1A0, 0x1A0}, - {0x188, 0x188}, -}; -static const s16 sMugshotsOpponentCoords[MUGSHOTS_NO][2] = -{ - {0, 0}, - {0, 0}, - {-4, 4}, - {0, 5}, - {0, 7}, -}; - -static const TransitionSpriteCallback sUnknown_083FD880[] = -{ - sub_811C934, - sub_811C938, - sub_811C984, - sub_811C9B8, - sub_811C934, - sub_811C9E4, - sub_811C934 -}; - -static const s16 sUnknown_083FD89C[2] = {12, -12}; -static const s16 sUnknown_083FD8A0[2] = {-1, 1}; - -static const TransitionState sPhase2_Transition_Slice_Funcs[] = -{ - Phase2_Transition_Slice_Func1, - Phase2_Transition_Slice_Func2, - Phase2_Transition_Slice_Func3 -}; - -static const TransitionState sPhase2_Transition_WhiteFade_Funcs[] = -{ - Phase2_Transition_WhiteFade_Func1, - Phase2_Transition_WhiteFade_Func2, - Phase2_Transition_WhiteFade_Func3, - Phase2_Transition_WhiteFade_Func4, - Phase2_Transition_WhiteFade_Func5 -}; - -static const s16 sUnknown_083FD8C4[8] = {0, 20, 15, 40, 10, 25, 35, 5}; - -static const TransitionState sPhase2_Transition_GridSquares_Funcs[] = -{ - Phase2_Transition_GridSquares_Func1, - Phase2_Transition_GridSquares_Func2, - Phase2_Transition_GridSquares_Func3 -}; - -static const TransitionState sPhase2_Transition_Shards_Funcs[] = -{ - Phase2_Transition_Shards_Func1, - Phase2_Transition_Shards_Func2, - Phase2_Transition_Shards_Func3, - Phase2_Transition_Shards_Func4, - Phase2_Transition_Shards_Func5 -}; - -static const s16 sUnknown_083FD8F4[][5] = -{ - {56, 0, 0, 160, 0}, - {104, 160, 240, 88, 1}, - {240, 72, 56, 0, 1}, - {0, 32, 144, 160, 0}, - {144, 160, 184, 0, 1}, - {56, 0, 168, 160, 0}, - {168, 160, 48, 0, 1}, -}; - -static const s16 sUnknown_083FD93A[] = {8, 4, 2, 1, 1, 1, 0}; - -static const TransitionState sPhase1_TransitionAll_Funcs[] = -{ - Phase1_TransitionAll_Func1, - Phase1_TransitionAll_Func2 -}; - -static const struct SpriteFrameImage sSpriteImageTable_83FD950[] = -{ - sSpriteImage_83FC148, 0x200 -}; - -static const union AnimCmd sSpriteAnim_83FD958[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_END -}; - -static const union AnimCmd *const sSpriteAnimTable_83FD960[] = -{ - sSpriteAnim_83FD958 -}; - -static const union AffineAnimCmd sSpriteAffineAnim_83FD964[] = -{ - AFFINEANIMCMD_FRAME(0, 0, -4, 1), - AFFINEANIMCMD_JUMP(0) -}; - -static const union AffineAnimCmd sSpriteAffineAnim_83FD974[] = -{ - AFFINEANIMCMD_FRAME(0, 0, 4, 1), - AFFINEANIMCMD_JUMP(0) -}; - -static const union AffineAnimCmd *const sSpriteAffineAnimTable_83FD984[] = -{ - sSpriteAffineAnim_83FD964, - sSpriteAffineAnim_83FD974 -}; - -static const struct SpriteTemplate sSpriteTemplate_83FD98C = -{ - .tileTag = 0xFFFF, - .paletteTag = 4105, - .oam = &gFieldOamData_32x32, - .anims = sSpriteAnimTable_83FD960, - .images = sSpriteImageTable_83FD950, - .affineAnims = sSpriteAffineAnimTable_83FD984, - .callback = sub_811B720 -}; - -static const struct OamData gOamData_83FD9A4 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -static const struct SpriteFrameImage sSpriteImageTable_83FD9AC[] = -{ - sSpriteImage_83FC528, 0x800 -}; - -static const struct SpriteFrameImage sSpriteImageTable_83FD9B4[] = -{ - sSpriteImage_83FCD28, 0x800 -}; - -static const union AnimCmd sSpriteAnim_83FD9BC[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_END -}; - -static const union AnimCmd *const sSpriteAnimTable_83FD9C4[] = -{ - sSpriteAnim_83FD9BC -}; - -static const struct SpriteTemplate sSpriteTemplate_83FD9C8 = -{ - .tileTag = 0xFFFF, - .paletteTag = 4106, - .oam = &gOamData_83FD9A4, - .anims = sSpriteAnimTable_83FD9C4, - .images = sSpriteImageTable_83FD9AC, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_811C90C -}; - -static const struct SpriteTemplate sSpriteTemplate_83FD9E0 = -{ - .tileTag = 0xFFFF, - .paletteTag = 4106, - .oam = &gOamData_83FD9A4, - .anims = sSpriteAnimTable_83FD9C4, - .images = sSpriteImageTable_83FD9B4, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_811C90C -}; - -static const u16 gFieldEffectObjectPalette10[] = INCBIN_U16("graphics/field_effect_objects/palettes/10.gbapal"); - -const struct SpritePalette gFieldEffectObjectPaletteInfo10 = -{ - gFieldEffectObjectPalette10, 0x1009 -}; - -static const u16 sMugshotPal_Sydney[] = INCBIN_U16("graphics/battle_transitions/sidney_bg.gbapal"); -static const u16 sMugshotPal_Phoebe[] = INCBIN_U16("graphics/battle_transitions/phoebe_bg.gbapal"); -static const u16 sMugshotPal_Glacia[] = INCBIN_U16("graphics/battle_transitions/glacia_bg.gbapal"); -static const u16 sMugshotPal_Drake[] = INCBIN_U16("graphics/battle_transitions/drake_bg.gbapal"); -static const u16 sMugshotPal_Steven[] = INCBIN_U16("graphics/battle_transitions/steven_bg.gbapal"); -static const u16 sMugshotPal_Brendan[] = INCBIN_U16("graphics/battle_transitions/brendan_bg.gbapal"); -static const u16 sMugshotPal_May[] = INCBIN_U16("graphics/battle_transitions/may_bg.gbapal"); - -static const u16 * const sOpponentMugshotsPals[MUGSHOTS_NO] = -{ - sMugshotPal_Sydney, - sMugshotPal_Phoebe, - sMugshotPal_Glacia, - sMugshotPal_Drake, - sMugshotPal_Steven -}; - -static const u16 * const sPlayerMugshotsPals[2] = -{ - sMugshotPal_Brendan, - sMugshotPal_May -}; - -static const u16 sUnusedTrainerPalette[] = INCBIN_U16("graphics/battle_transitions/unused_trainer.gbapal"); -static const struct SpritePalette sSpritePalette_UnusedTrainer = -{ - sUnusedTrainerPalette, 0x100A -}; - -static const u16 sBigPokeball_Tilemap[] = INCBIN_U16("graphics/battle_transitions/big_pokeball_map.bin"); -static const u16 sMugshotsTilemap[] = INCBIN_U16("graphics/battle_transitions/elite_four_bg_map.bin"); - -// actual code starts here - -void BattleTransition_StartOnField(u8 transitionID) -{ - gMain.callback2 = CB2_OverworldBasic; - LaunchBattleTransitionTask(transitionID); -} - -void BattleTransition_Start(u8 transitionID) -{ - LaunchBattleTransitionTask(transitionID); -} - -#define tState data[0] -#define tTransitionID data[1] -#define tTransitionDone data[15] - -bool8 IsBattleTransitionDone(void) -{ - u8 taskID = FindTaskIdByFunc(Task_BattleTransitionMain); - if (gTasks[taskID].tTransitionDone) - { - DestroyTask(taskID); - return TRUE; - } - else - return FALSE; -} - -static void LaunchBattleTransitionTask(u8 transitionID) -{ - u8 taskID = CreateTask(Task_BattleTransitionMain, 2); - gTasks[taskID].tTransitionID = transitionID; -} - -static void Task_BattleTransitionMain(u8 taskID) -{ - while (sMainTransitionPhases[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Transition_Phase1(struct Task* task) -{ - SetWeatherScreenFadeOut(); - CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); - if (sPhase1_Tasks[task->tTransitionID] != NULL) - { - CreateTask(sPhase1_Tasks[task->tTransitionID], 4); - task->tState++; - return FALSE; - } - else - { - task->tState = 2; - return TRUE; - } -} - -static bool8 Transition_WaitForPhase1(struct Task* task) -{ - if (FindTaskIdByFunc(sPhase1_Tasks[task->tTransitionID]) == 0xFF) - { - task->tState++; - return TRUE; - } - else - return FALSE; -} - -static bool8 Transition_Phase2(struct Task* task) -{ - CreateTask(sPhase2_Tasks[task->tTransitionID], 0); - task->tState++; - return FALSE; -} - -static bool8 Transition_WaitForPhase2(struct Task* task) -{ - task->tTransitionDone = 0; - if (FindTaskIdByFunc(sPhase2_Tasks[task->tTransitionID]) == 0xFF) - task->tTransitionDone = 1; - return FALSE; -} - -static void Phase1Task_TransitionAll(u8 taskID) -{ - if (gTasks[taskID].tState == 0) - { - gTasks[taskID].tState++; - CreatePhase1Task(0, 0, 3, 2, 2); - } - else if (sub_811D52C()) - DestroyTask(taskID); -} - -static void Phase2Task_Transition_Blur(u8 taskID) -{ - while (sPhase2_Transition_Blur_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Transition_Blur_Func1(struct Task* task) -{ - REG_MOSAIC = 0; - REG_BG1CNT |= BGCNT_MOSAIC; - REG_BG2CNT |= BGCNT_MOSAIC; - REG_BG3CNT |= BGCNT_MOSAIC; - task->tState++; - return TRUE; -} - -static bool8 Phase2_Transition_Blur_Func2(struct Task* task) -{ - if (task->data[1] != 0) - task->data[1]--; - else - { - task->data[1] = 4; - if (++task->data[2] == 10) - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB(0, 0, 0)); - REG_MOSAIC = (task->data[2] & 15) * 17; - if (task->data[2] > 14) - task->tState++; - } - return FALSE; -} - -static bool8 Phase2_Transition_Blur_Func3(struct Task* task) -{ - if (!gPaletteFade.active) - { - u8 taskID = FindTaskIdByFunc(Phase2Task_Transition_Blur); - DestroyTask(taskID); - } - return FALSE; -} - -static void Phase2Task_Transition_Swirl(u8 taskID) -{ - while (sPhase2_Transition_Swirl_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Transition_Swirl_Func1(struct Task* task) -{ - u16 savedIME; - - sub_811D658(); - ScanlineEffect_Clear(); - BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 16, RGB(0, 0, 0)); - sub_811D6E8(gScanlineEffectRegBuffers[1], TRANSITION_STRUCT.field_14, 0, 2, 0, 160); - - SetVBlankCallback(VBlankCB_Phase2_Transition_Swirl); - SetHBlankCallback(HBlankCB_Phase2_Transition_Swirl); - - savedIME = REG_IME; - REG_IME = 0; - REG_IE |= (INTR_FLAG_VBLANK | INTR_FLAG_HBLANK); - REG_IME = savedIME; - REG_DISPSTAT |= (DISPSTAT_VBLANK_INTR | DISPSTAT_HBLANK_INTR); - - task->tState++; - return FALSE; -} - -static bool8 Phase2_Transition_Swirl_Func2(struct Task* task) -{ - TRANSITION_STRUCT.VBlank_DMA = 0; - task->data[1] += 4; - task->data[2] += 8; - - sub_811D6E8(gScanlineEffectRegBuffers[0], TRANSITION_STRUCT.field_14, task->data[1], 2, task->data[2], 160); - - if (!gPaletteFade.active) - { - u8 taskID = FindTaskIdByFunc(Phase2Task_Transition_Swirl); - DestroyTask(taskID); - } - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static void VBlankCB_Phase2_Transition_Swirl(void) -{ - VBlankCB_BattleTransition(); - if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); -} - -static void HBlankCB_Phase2_Transition_Swirl(void) -{ - u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT]; - REG_BG1HOFS = var; - REG_BG2HOFS = var; - REG_BG3HOFS = var; -} - -static void Phase2Task_Transition_Shuffle(u8 taskID) -{ - while (sPhase2_Transition_Shuffle_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Transition_Shuffle_Func1(struct Task* task) -{ - u16 savedIME; - - sub_811D658(); - ScanlineEffect_Clear(); - - BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 16, RGB(0, 0, 0)); - memset(gScanlineEffectRegBuffers[1], TRANSITION_STRUCT.field_16, 0x140); - - SetVBlankCallback(VBlankCB_Phase2_Transition_Shuffle); - SetHBlankCallback(HBlankCB_Phase2_Transition_Shuffle); - - savedIME = REG_IME; - REG_IME = 0; - REG_IE |= (INTR_FLAG_VBLANK | INTR_FLAG_HBLANK); - REG_IME = savedIME; - REG_DISPSTAT |= (DISPSTAT_VBLANK_INTR | DISPSTAT_HBLANK_INTR); - - task->tState++; - return FALSE; -} - -static bool8 Phase2_Transition_Shuffle_Func2(struct Task* task) -{ - u8 i; - u16 r3, r4; - - TRANSITION_STRUCT.VBlank_DMA = 0; - r4 = task->data[1]; - r3 = task->data[2] >> 8; - task->data[1] += 4224; - task->data[2] += 384; - - for (i = 0; i < 160; i++, r4 += 4224) - { - u16 var = r4 / 256; - gScanlineEffectRegBuffers[0][i] = TRANSITION_STRUCT.field_16 + Sin(var, r3); - } - - if (!gPaletteFade.active) - DestroyTask(FindTaskIdByFunc(Phase2Task_Transition_Shuffle)); - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static void VBlankCB_Phase2_Transition_Shuffle(void) -{ - VBlankCB_BattleTransition(); - if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); -} - -static void HBlankCB_Phase2_Transition_Shuffle(void) -{ - u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT]; - REG_BG1VOFS = var; - REG_BG2VOFS = var; - REG_BG3VOFS = var; -} - -static void Phase2Task_Transition_BigPokeball(u8 taskID) -{ - while (sPhase2_Transition_BigPokeball_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Transition_BigPokeball_Func1(struct Task* task) -{ - u16 i; - u16 *dst1, *dst2; - - sub_811D658(); - ScanlineEffect_Clear(); - - task->data[1] = 16; - task->data[2] = 0; - task->data[4] = 0; - task->data[5] = 0x4000; - TRANSITION_STRUCT.WININ = 63; - TRANSITION_STRUCT.WINOUT = 0; - TRANSITION_STRUCT.field_6 = 240; - TRANSITION_STRUCT.WIN0V = 160; - TRANSITION_STRUCT.BLDCNT = 0x3F41; - TRANSITION_STRUCT.BLDALPHA = task->data[1] * 256; // 16 * 256 = 0x1000 - - for (i = 0; i < 160; i++) - { - gScanlineEffectRegBuffers[1][i] = 240; - } - - SetVBlankCallback(VBlankCB0_Phase2_Transition_BigPokeball); - - sub_811D6A8(&dst1, & dst2); - CpuFill16(0, dst1, 0x800); - CpuSet(sBigPokeball_Tileset, dst2, 0x2C0); - LoadPalette(gFieldEffectObjectPalette10, 240, 32); - - task->tState++; - return FALSE; -} - -static bool8 Phase2_Transition_BigPokeball_Func2(struct Task* task) -{ - s16 i, j; - u16 *dst1, *dst2; - const u16* BigPokeballMap; - - BigPokeballMap = sBigPokeball_Tilemap; - sub_811D6A8(&dst1, &dst2); - for (i = 0; i < 20; i++) - { - for (j = 0; j < 30; j++, BigPokeballMap++) - { - dst1[i * 32 + j] = *BigPokeballMap | 0xF000; - } - } - sub_811D6E8(gScanlineEffectRegBuffers[0], 0, task->data[4], 132, task->data[5], 160); - - task->tState++; - return TRUE; -} - -static bool8 Phase2_Transition_BigPokeball_Func3(struct Task* task) -{ - TRANSITION_STRUCT.VBlank_DMA = 0; - if (task->data[3] == 0 || --task->data[3] == 0) - { - task->data[2]++; - task->data[3] = 2; - } - TRANSITION_STRUCT.BLDALPHA = (task->data[1] << 8) | task->data[2]; - if (task->data[2] > 15) - task->tState++; - task->data[4] += 8; - task->data[5] -= 256; - - sub_811D6E8(gScanlineEffectRegBuffers[0], 0, task->data[4], 132, task->data[5] >> 8, 160); - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Transition_BigPokeball_Func4(struct Task* task) -{ - TRANSITION_STRUCT.VBlank_DMA = 0; - if (task->data[3] == 0 || --task->data[3] == 0) - { - task->data[1]--; - task->data[3] = 2; - } - TRANSITION_STRUCT.BLDALPHA = (task->data[1] << 8) | task->data[2]; - if (task->data[1] == 0) - task->tState++; - task->data[4] += 8; - task->data[5] -= 256; - - sub_811D6E8(gScanlineEffectRegBuffers[0], 0, task->data[4], 132, task->data[5] >> 8, 160); - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Transition_BigPokeball_Func5(struct Task* task) -{ - TRANSITION_STRUCT.VBlank_DMA = 0; - task->data[4] += 8; - task->data[5] -= 256; - - sub_811D6E8(gScanlineEffectRegBuffers[0], 0, task->data[4], 132, task->data[5] >> 8, 160); - - if (task->data[5] <= 0) - { - task->tState++; - task->data[1] = 160; - task->data[2] = 256; - task->data[3] = 0; - } - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Transition_BigPokeball_Func6(struct Task* task) -{ - TRANSITION_STRUCT.VBlank_DMA = 0; - if (task->data[2] < 1024) - task->data[2] += 128; - if (task->data[1] != 0) - { - task->data[1] -= (task->data[2] >> 8); - if (task->data[1] < 0) - task->data[1] = 0; - } - sub_811D764(gScanlineEffectRegBuffers[0], 120, 80, task->data[1]); - if (task->data[1] == 0) - { - DmaStop(0); - sub_811D6D4(); - DestroyTask(FindTaskIdByFunc(Phase2Task_Transition_BigPokeball)); - } - if (task->data[3] == 0) - { - task->data[3]++; - SetVBlankCallback(VBlankCB1_Phase2_Transition_BigPokeball); - } - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static void Transition_BigPokeball_Vblank(void) -{ - DmaStop(0); - VBlankCB_BattleTransition(); - if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); - REG_WININ = TRANSITION_STRUCT.WININ; - REG_WINOUT = TRANSITION_STRUCT.WINOUT; - REG_WIN0V = TRANSITION_STRUCT.WIN0V; - REG_BLDCNT = TRANSITION_STRUCT.BLDCNT; - REG_BLDALPHA = TRANSITION_STRUCT.BLDALPHA; -} - -static void VBlankCB0_Phase2_Transition_BigPokeball(void) -{ - Transition_BigPokeball_Vblank(); - DmaSet(0, gScanlineEffectRegBuffers[1], ®_BG0HOFS, 0xA2400001); -} - -static void VBlankCB1_Phase2_Transition_BigPokeball(void) -{ - Transition_BigPokeball_Vblank(); - DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001); -} - -static void Phase2Task_Transition_PokeballsTrail(u8 taskID) -{ - while (sPhase2_Transition_PokeballsTrail_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Transition_PokeballsTrail_Func1(struct Task* task) -{ - u16 *dst1, *dst2; - - sub_811D6A8(&dst1, &dst2); - CpuSet(sPokeballTrail_Tileset, dst2, 0x20); - CpuFill32(0, dst1, 0x800); - LoadPalette(gFieldEffectObjectPalette10, 0xF0, 0x20); - - task->tState++; - return FALSE; -} - -static bool8 Phase2_Transition_PokeballsTrail_Func2(struct Task* task) -{ - s16 i; - s16 rand; - s16 arr0[2]; - s16 arr1[5]; - - memcpy(arr0, sUnknown_083FD7E4, sizeof(sUnknown_083FD7E4)); - memcpy(arr1, sUnknown_083FD7E8, sizeof(sUnknown_083FD7E8)); - rand = Random() & 1; - for (i = 0; i <= 4; i++, rand ^= 1) - { - gFieldEffectArguments[0] = arr0[rand]; // x - gFieldEffectArguments[1] = (i * 32) + 16; // y - gFieldEffectArguments[2] = rand; - gFieldEffectArguments[3] = arr1[i]; - FieldEffectStart(FLDEFF_POKEBALL); - } - - task->tState++; - return FALSE; -} - -static bool8 Phase2_Transition_PokeballsTrail_Func3(struct Task* task) -{ - if (!FieldEffectActiveListContains(FLDEFF_POKEBALL)) - { - sub_811D6D4(); - DestroyTask(FindTaskIdByFunc(Phase2Task_Transition_PokeballsTrail)); - } - return FALSE; -} - -bool8 FldEff_Pokeball(void) -{ - u8 spriteID = CreateSpriteAtEnd(&sSpriteTemplate_83FD98C, gFieldEffectArguments[0], gFieldEffectArguments[1], 0); - gSprites[spriteID].oam.priority = 0; - gSprites[spriteID].oam.affineMode = 1; - gSprites[spriteID].data[0] = gFieldEffectArguments[2]; - gSprites[spriteID].data[1] = gFieldEffectArguments[3]; - gSprites[spriteID].data[2] = -1; - InitSpriteAffineAnim(&gSprites[spriteID]); - StartSpriteAffineAnim(&gSprites[spriteID], gFieldEffectArguments[2]); - return FALSE; -} - -#define SOME_VRAM_STORE(ptr, posY, posX, toStore) \ -{ \ - u32 index = (posY) * 32 + posX; \ - ptr[index] = toStore; \ -} - -static void sub_811B720(struct Sprite* sprite) -{ - s16 arr0[2]; - - memcpy(arr0, sUnknown_083FD7F2, sizeof(sUnknown_083FD7F2)); - if (sprite->data[1] != 0) - sprite->data[1]--; - else - { - if (sprite->pos1.x >= 0 && sprite->pos1.x <= 240) - { - s16 posX = sprite->pos1.x >> 3; - s16 posY = sprite->pos1.y >> 3; - - if (posX != sprite->data[2]) - { - u32 var; - u16 *ptr; - - sprite->data[2] = posX; - var = (((REG_BG0CNT >> 8) & 0x1F) << 11); // r2 - ptr = (u16 *)(VRAM + var); - - SOME_VRAM_STORE(ptr, posY - 2, posX, 0xF001); - SOME_VRAM_STORE(ptr, posY - 1, posX, 0xF001); - SOME_VRAM_STORE(ptr, posY - 0, posX, 0xF001); - SOME_VRAM_STORE(ptr, posY + 1, posX, 0xF001); - } - } - sprite->pos1.x += arr0[sprite->data[0]]; - if (sprite->pos1.x < -15 || sprite->pos1.x > 255) - FieldEffectStop(sprite, FLDEFF_POKEBALL); - } -} - -static void Phase2Task_Transition_Clockwise_BlackFade(u8 taskID) -{ - while (sPhase2_Transition_Clockwise_BlackFade_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Transition_Clockwise_BlackFade_Func1(struct Task* task) -{ - u16 i; - - sub_811D658(); - ScanlineEffect_Clear(); - - TRANSITION_STRUCT.WININ = 0; - TRANSITION_STRUCT.WINOUT = 63; - TRANSITION_STRUCT.field_6 = -3855; - TRANSITION_STRUCT.WIN0V = 160; - - for (i = 0; i < 160; i++) - { - gScanlineEffectRegBuffers[1][i] = 0xF3F4; - } - - SetVBlankCallback(VBlankCB_Phase2_Transition_Clockwise_BlackFade); - TRANSITION_STRUCT.data[4] = 120; - - task->tState++; - return TRUE; -} - -static bool8 Phase2_Transition_Clockwise_BlackFade_Func2(struct Task* task) -{ - TRANSITION_STRUCT.VBlank_DMA = 0; - - sub_811D8FC(TRANSITION_STRUCT.data, 120, 80, TRANSITION_STRUCT.data[4], -1, 1, 1); - do - { - gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] = (TRANSITION_STRUCT.data[2] + 1) | 0x7800; - } while (!sub_811D978(TRANSITION_STRUCT.data, 1, 1)); - - TRANSITION_STRUCT.data[4] += 16; - if (TRANSITION_STRUCT.data[4] >= 240) - { - TRANSITION_STRUCT.data[5] = 0; - task->tState++; - } - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Transition_Clockwise_BlackFade_Func3(struct Task* task) -{ - s16 r1, r3; - vu8 var = 0; - - TRANSITION_STRUCT.VBlank_DMA = 0; - - sub_811D8FC(TRANSITION_STRUCT.data, 120, 80, 240, TRANSITION_STRUCT.data[5], 1, 1); - - while (1) - { - r1 = 120, r3 = TRANSITION_STRUCT.data[2] + 1; - if (TRANSITION_STRUCT.data[5] >= 80) - r1 = TRANSITION_STRUCT.data[2], r3 = 240; - gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] = (r3) | (r1 << 8); - if (var != 0) - break; - var = sub_811D978(TRANSITION_STRUCT.data, 1, 1); - } - - TRANSITION_STRUCT.data[5] += 8; - if (TRANSITION_STRUCT.data[5] >= 160) - { - TRANSITION_STRUCT.data[4] = 240; - task->tState++; - } - else - { - while (TRANSITION_STRUCT.data[3] < TRANSITION_STRUCT.data[5]) - { - gScanlineEffectRegBuffers[0][++TRANSITION_STRUCT.data[3]] = (r3) | (r1 << 8); - } - } - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Transition_Clockwise_BlackFade_Func4(struct Task* task) -{ - TRANSITION_STRUCT.VBlank_DMA = 0; - - sub_811D8FC(TRANSITION_STRUCT.data, 120, 80, TRANSITION_STRUCT.data[4], 160, 1, 1); - do - { - gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] = (TRANSITION_STRUCT.data[2] << 8) | 0xF0; - } while (!sub_811D978(TRANSITION_STRUCT.data, 1, 1)); - - TRANSITION_STRUCT.data[4] -= 16; - if (TRANSITION_STRUCT.data[4] <= 0) - { - TRANSITION_STRUCT.data[5] = 160; - task->tState++; - } - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Transition_Clockwise_BlackFade_Func5(struct Task* task) -{ - s16 r1, r2, r3; - vu8 var = 0; - - TRANSITION_STRUCT.VBlank_DMA = 0; - - sub_811D8FC(TRANSITION_STRUCT.data, 120, 80, 0, TRANSITION_STRUCT.data[5], 1, 1); - - while (1) - { - r1 = gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] & 0xFF, r2 = TRANSITION_STRUCT.data[2]; - if (TRANSITION_STRUCT.data[5] <= 80) - r2 = 120, r1 = TRANSITION_STRUCT.data[2]; - gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] = (r1) | (r2 << 8); - r3 = 0; - if (var != 0) - break; - var = sub_811D978(TRANSITION_STRUCT.data, 1, 1); - } - - TRANSITION_STRUCT.data[5] -= 8; - if (TRANSITION_STRUCT.data[5] <= 0) - { - TRANSITION_STRUCT.data[4] = r3; - task->tState++; - } - else - { - while (TRANSITION_STRUCT.data[3] > TRANSITION_STRUCT.data[5]) - { - gScanlineEffectRegBuffers[0][--TRANSITION_STRUCT.data[3]] = (r1) | (r2 << 8); - } - } - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Transition_Clockwise_BlackFade_Func6(struct Task* task) -{ - TRANSITION_STRUCT.VBlank_DMA = 0; - - sub_811D8FC(TRANSITION_STRUCT.data, 120, 80, TRANSITION_STRUCT.data[4], 0, 1, 1); - do - { - s16 r2, r3; - - r2 = 120, r3 = TRANSITION_STRUCT.data[2]; - if (TRANSITION_STRUCT.data[2] >= 120) - r2 = 0, r3 = 240; - gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] = (r3) | (r2 << 8); - - } while (!sub_811D978(TRANSITION_STRUCT.data, 1, 1)); - - TRANSITION_STRUCT.data[4] += 16; - if (TRANSITION_STRUCT.data[2] > 120) - task->tState++; - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Transition_Clockwise_BlackFade_Func7(struct Task* task) -{ - DmaStop(0); - sub_811D6D4(); - DestroyTask(FindTaskIdByFunc(Phase2Task_Transition_Clockwise_BlackFade)); - return FALSE; -} - -static void VBlankCB_Phase2_Transition_Clockwise_BlackFade(void) -{ - DmaStop(0); - VBlankCB_BattleTransition(); - if (TRANSITION_STRUCT.VBlank_DMA != 0) - DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); - REG_WININ = TRANSITION_STRUCT.WININ; - REG_WINOUT = TRANSITION_STRUCT.WINOUT; - REG_WIN0V = TRANSITION_STRUCT.WIN0V; - REG_WIN0H = gScanlineEffectRegBuffers[1][0]; - DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001); -} - -static void Phase2Task_Transition_Ripple(u8 taskID) -{ - while (sPhase2_Transition_Ripple_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Transition_Ripple_Func1(struct Task* task) -{ - u8 i; - - sub_811D658(); - ScanlineEffect_Clear(); - - for (i = 0; i < 160; i++) - { - gScanlineEffectRegBuffers[1][i] = TRANSITION_STRUCT.field_16; - } - - SetVBlankCallback(VBlankCB_Phase2_Transition_Ripple); - SetHBlankCallback(HBlankCB_Phase2_Transition_Ripple); - - REG_IE |= INTR_FLAG_HBLANK; - REG_DISPSTAT |= DISPSTAT_HBLANK_INTR; - - task->tState++; - return TRUE; -} - -static bool8 Phase2_Transition_Ripple_Func2(struct Task* task) -{ - u8 i; - s16 r3; - u16 r4, r8; - - TRANSITION_STRUCT.VBlank_DMA = 0; - - r3 = task->data[2] >> 8; - r4 = task->data[1]; - r8 = 384; - task->data[1] += 0x400; - if (task->data[2] <= 0x1FFF) - task->data[2] += 0x180; - - for (i = 0; i < 160; i++, r4 += r8) - { - // todo: fix the asm - s16 var = r4 >> 8; - asm(""); - gScanlineEffectRegBuffers[0][i] = TRANSITION_STRUCT.field_16 + Sin(var, r3); - asm(""); - } - - if (++task->data[3] == 81) - { - task->data[4]++; - BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, RGB(0, 0, 0)); - } - - if (task->data[4] != 0 && !gPaletteFade.active) - DestroyTask(FindTaskIdByFunc(Phase2Task_Transition_Ripple)); - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static void VBlankCB_Phase2_Transition_Ripple(void) -{ - VBlankCB_BattleTransition(); - if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); -} - -static void HBlankCB_Phase2_Transition_Ripple(void) -{ - u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT]; - REG_BG1VOFS = var; - REG_BG2VOFS = var; - REG_BG3VOFS = var; -} - -static void Phase2Task_Transition_Wave(u8 taskID) -{ - while (sPhase2_Transition_Wave_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Transition_Wave_Func1(struct Task* task) -{ - u8 i; - - sub_811D658(); - ScanlineEffect_Clear(); - - TRANSITION_STRUCT.WININ = 63; - TRANSITION_STRUCT.WINOUT = 0; - TRANSITION_STRUCT.field_6 = 240; - TRANSITION_STRUCT.WIN0V = 160; - - for (i = 0; i < 160; i++) - { - gScanlineEffectRegBuffers[1][i] = 242; - } - - SetVBlankCallback(VBlankCB_Phase2_Transition_Wave); - - task->tState++; - return TRUE; -} - -static bool8 Phase2_Transition_Wave_Func2(struct Task* task) -{ - u8 i, r5; - u16* toStore; - bool8 nextFunc; - - TRANSITION_STRUCT.VBlank_DMA = 0; - toStore = gScanlineEffectRegBuffers[0]; - r5 = task->data[2]; - task->data[2] += 16; - task->data[1] += 8; - - for (i = 0, nextFunc = TRUE; i < 160; i++, r5 += 4, toStore++) - { - s16 value = task->data[1] + Sin(r5, 40); - if (value < 0) - value = 0; - if (value > 240) - value = 240; - *toStore = (value << 8) | (0xF1); - if (value < 240) - nextFunc = FALSE; - } - if (nextFunc) - task->tState++; - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Transition_Wave_Func3(struct Task* task) -{ - DmaStop(0); - sub_811D6D4(); - DestroyTask(FindTaskIdByFunc(Phase2Task_Transition_Wave)); - return FALSE; -} - -static void VBlankCB_Phase2_Transition_Wave(void) -{ - DmaStop(0); - VBlankCB_BattleTransition(); - if (TRANSITION_STRUCT.VBlank_DMA != 0) - DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); - REG_WININ = TRANSITION_STRUCT.WININ; - REG_WINOUT = TRANSITION_STRUCT.WINOUT; - REG_WIN0V = TRANSITION_STRUCT.WIN0V; - DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001); -} - -#define tMugshotOpponentID data[13] -#define tMugshotPlayerID data[14] -#define tMugshotID data[15] - -static void Phase2Task_Transition_Sydney(u8 taskID) -{ - gTasks[taskID].tMugshotID = MUGSHOT_SYDNEY; - Phase2Task_MugShotTransition(taskID); -} - -static void Phase2Task_Transition_Phoebe(u8 taskID) -{ - gTasks[taskID].tMugshotID = MUGSHOT_PHOEBE; - Phase2Task_MugShotTransition(taskID); -} - -static void Phase2Task_Transition_Glacia(u8 taskID) -{ - gTasks[taskID].tMugshotID = MUGSHOT_GLACIA; - Phase2Task_MugShotTransition(taskID); -} - -static void Phase2Task_Transition_Drake(u8 taskID) -{ - gTasks[taskID].tMugshotID = MUGSHOT_DRAKE; - Phase2Task_MugShotTransition(taskID); -} - -static void Phase2Task_Transition_Steven(u8 taskID) -{ - gTasks[taskID].tMugshotID = MUGSHOT_STEVEN; - Phase2Task_MugShotTransition(taskID); -} - -static void Phase2Task_MugShotTransition(u8 taskID) -{ - while (sPhase2_Mugshot_Transition_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Mugshot_Func1(struct Task* task) -{ - u8 i; - - sub_811D658(); - ScanlineEffect_Clear(); - Mugshots_CreateOpponentPlayerSprites(task); - - task->data[1] = 0; - task->data[2] = 1; - task->data[3] = 239; - TRANSITION_STRUCT.WININ = 63; - TRANSITION_STRUCT.WINOUT = 62; - TRANSITION_STRUCT.WIN0V = 160; - - for (i = 0; i < 160; i++) - { - gScanlineEffectRegBuffers[1][i] = 0xF0F1; - } - - SetVBlankCallback(VBlankCB0_Phase2_Mugshots); - - task->tState++; - return FALSE; -} - -static bool8 Phase2_Mugshot_Func2(struct Task* task) -{ - s16 i, j; - u16 *dst1, *dst2; - const u16* MugshotsMap; - - MugshotsMap = sMugshotsTilemap; - sub_811D6A8(&dst1, &dst2); - CpuSet(sUnknown_083FC348, dst2, 0xF0); - LoadPalette(sOpponentMugshotsPals[task->tMugshotID], 0xF0, 0x20); - LoadPalette(sPlayerMugshotsPals[gSaveBlock2.playerGender], 0xFA, 0xC); - - for (i = 0; i < 20; i++) - { - for (j = 0; j < 32; j++, MugshotsMap++) - { - dst1[i * 32 + j] = *MugshotsMap | 0xF000; - } - } - - REG_IE |= INTR_FLAG_HBLANK; - REG_DISPSTAT |= DISPSTAT_HBLANK_INTR; - SetHBlankCallback(HBlankCB_Phase2_Mugshots); - task->tState++; - return FALSE; -} - -static bool8 Phase2_Mugshot_Func3(struct Task* task) -{ - u8 i, r5; - u16* toStore; - s16 value; - s32 mergedValue; - - TRANSITION_STRUCT.VBlank_DMA = 0; - - toStore = gScanlineEffectRegBuffers[0]; - r5 = task->data[1]; - task->data[1] += 0x10; - - for (i = 0; i < 80; i++, toStore++, r5 += 0x10) - { - value = task->data[2] + Sin(r5, 0x10); - if (value < 0) - value = 1; - if (value > 0xF0) - value = 0xF0; - *toStore = value; - } - for (; i < 160; i++, toStore++, r5 += 0x10) - { - value = task->data[3] - Sin(r5, 0x10); - if (value < 0) - value = 0; - if (value > 0xEF) - value = 0xEF; - *toStore = (value << 8) | (0xF0); - } - - task->data[2] += 8; - task->data[3] -= 8; - if (task->data[2] > 0xF0) - task->data[2] = 0xF0; - if (task->data[3] < 0) - task->data[3] = 0; - mergedValue = *(s32*)(&task->data[2]); - if (mergedValue == 0xF0) - task->tState++; - - TRANSITION_STRUCT.field_18 -= 8; - TRANSITION_STRUCT.field_1A += 8; - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Mugshot_Func4(struct Task* task) -{ - u8 i; - u16* toStore; - - TRANSITION_STRUCT.VBlank_DMA = 0; - - for (i = 0, toStore = gScanlineEffectRegBuffers[0]; i < 160; i++, toStore++) - { - *toStore = 0xF0; - } - - task->tState++; - task->data[1] = 0; - task->data[2] = 0; - task->data[3] = 0; - TRANSITION_STRUCT.field_18 -= 8; - TRANSITION_STRUCT.field_1A += 8; - - sub_811CA10(task->tMugshotOpponentID, 0); - sub_811CA10(task->tMugshotPlayerID, 1); - sub_811CA28(task->tMugshotOpponentID); - - PlaySE(SE_BT_START); - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Mugshot_Func5(struct Task* task) -{ - TRANSITION_STRUCT.field_18 -= 8; - TRANSITION_STRUCT.field_1A += 8; - if (sub_811CA44(task->tMugshotOpponentID)) - { - task->tState++; - sub_811CA28(task->tMugshotPlayerID); - } - return FALSE; -} - -static bool8 Phase2_Mugshot_Func6(struct Task* task) -{ - TRANSITION_STRUCT.field_18 -= 8; - TRANSITION_STRUCT.field_1A += 8; - if (sub_811CA44(task->tMugshotPlayerID)) - { - TRANSITION_STRUCT.VBlank_DMA = 0; - SetVBlankCallback(NULL); - DmaStop(0); - memset(gScanlineEffectRegBuffers[0], 0, 0x140); - memset(gScanlineEffectRegBuffers[1], 0, 0x140); - REG_WIN0H = 0xF0; - REG_BLDY = 0; - task->tState++; - task->data[3] = 0; - task->data[4] = 0; - TRANSITION_STRUCT.BLDCNT = 0xBF; - SetVBlankCallback(VBlankCB1_Phase2_Mugshots); - } - return FALSE; -} - -static bool8 Phase2_Mugshot_Func7(struct Task* task) -{ - bool32 r6; - - TRANSITION_STRUCT.VBlank_DMA = 0; - r6 = TRUE; - TRANSITION_STRUCT.field_18 -= 8; - TRANSITION_STRUCT.field_1A += 8; - - if (task->data[4] < 0x50) - task->data[4] += 2; - if (task->data[4] > 0x50) - task->data[4] = 0x50; - - if (++task->data[3] & 1) - { - s16 i; - for (i = 0, r6 = FALSE; i <= task->data[4]; i++) - { - s16 index1 = 0x50 - i; - s16 index2 = 0x50 + i; - if (gScanlineEffectRegBuffers[0][index1] <= 15) - { - r6 = TRUE; - gScanlineEffectRegBuffers[0][index1]++; - } - if (gScanlineEffectRegBuffers[0][index2] <= 15) - { - r6 = TRUE; - gScanlineEffectRegBuffers[0][index2]++; - } - } - } - - if (task->data[4] == 0x50 && !r6) - task->tState++; - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Mugshot_Func8(struct Task* task) -{ - TRANSITION_STRUCT.VBlank_DMA = 0; - BlendPalettes(0xFFFFFFFF, 16, RGB(31, 31, 31)); - TRANSITION_STRUCT.BLDCNT = 0xFF; - task->data[3] = 0; - - task->tState++; - return TRUE; -} - -static bool8 Phase2_Mugshot_Func9(struct Task* task) -{ - TRANSITION_STRUCT.VBlank_DMA = 0; - - task->data[3]++; - memset(gScanlineEffectRegBuffers[0], task->data[3], 0x140); - if (task->data[3] > 15) - task->tState++; - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Mugshot_Func10(struct Task* task) -{ - DmaStop(0); - sub_811D6D4(); - DestroyTask(FindTaskIdByFunc(task->func)); - return FALSE; -} - -static void VBlankCB0_Phase2_Mugshots(void) -{ - DmaStop(0); - VBlankCB_BattleTransition(); - if (TRANSITION_STRUCT.VBlank_DMA != 0) - DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); - REG_BG0VOFS = TRANSITION_STRUCT.field_1C; - REG_WININ = TRANSITION_STRUCT.WININ; - REG_WINOUT = TRANSITION_STRUCT.WINOUT; - REG_WIN0V = TRANSITION_STRUCT.WIN0V; - DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001); -} - -static void VBlankCB1_Phase2_Mugshots(void) -{ - DmaStop(0); - VBlankCB_BattleTransition(); - if (TRANSITION_STRUCT.VBlank_DMA != 0) - DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); - REG_BLDCNT = TRANSITION_STRUCT.BLDCNT; - DmaSet(0, gScanlineEffectRegBuffers[1], ®_BLDY, 0xA2400001); -} - -static void HBlankCB_Phase2_Mugshots(void) -{ - if (REG_VCOUNT < 80) - REG_BG0HOFS = TRANSITION_STRUCT.field_18; - else - REG_BG0HOFS = TRANSITION_STRUCT.field_1A; -} - -static void Mugshots_CreateOpponentPlayerSprites(struct Task* task) -{ - struct Sprite *opponentSprite, *playerSprite; - - s16 mugshotID = task->tMugshotID; - task->tMugshotOpponentID = CreateTrainerSprite(sMugshotsTrainerPicIDsTable[mugshotID], - sMugshotsOpponentCoords[mugshotID][0] - 32, - sMugshotsOpponentCoords[mugshotID][1] + 42, - 0, ewramC03C); - task->tMugshotPlayerID = CreateTrainerSprite(gSaveBlock2.playerGender, 272, 106, 0, ewramC03C); - - opponentSprite = &gSprites[task->tMugshotOpponentID]; - playerSprite = &gSprites[task->tMugshotPlayerID]; - - opponentSprite->callback = sub_811C90C; - playerSprite->callback = sub_811C90C; - - opponentSprite->oam.affineMode = 3; - playerSprite->oam.affineMode = 3; - - opponentSprite->oam.matrixNum = AllocOamMatrix(); - playerSprite->oam.matrixNum = AllocOamMatrix(); - - opponentSprite->oam.shape = 1; - playerSprite->oam.shape = 1; - - opponentSprite->oam.size = 3; - playerSprite->oam.size = 3; - - CalcCenterToCornerVec(opponentSprite, 1, 3, 3); - CalcCenterToCornerVec(playerSprite, 1, 3, 3); - - SetOamMatrixRotationScaling(opponentSprite->oam.matrixNum, sMugshotsOpponentRotationScales[mugshotID][0], sMugshotsOpponentRotationScales[mugshotID][1], 0); - SetOamMatrixRotationScaling(playerSprite->oam.matrixNum, -512, 0x200, 0); -} - -static void sub_811C90C(struct Sprite* sprite) -{ - while (sUnknown_083FD880[sprite->data[0]](sprite)); -} - -static bool8 sub_811C934(struct Sprite* sprite) -{ - return FALSE; -} - -static bool8 sub_811C938(struct Sprite* sprite) -{ - s16 arr0[2]; - s16 arr1[2]; - - memcpy(arr0, sUnknown_083FD89C, sizeof(sUnknown_083FD89C)); - memcpy(arr1, sUnknown_083FD8A0, sizeof(sUnknown_083FD8A0)); - - sprite->data[0]++; - sprite->data[1] = arr0[sprite->data[7]]; - sprite->data[2] = arr1[sprite->data[7]]; - return TRUE; -} - -static bool8 sub_811C984(struct Sprite* sprite) -{ - sprite->pos1.x += sprite->data[1]; - if (sprite->data[7] && sprite->pos1.x < 133) - sprite->data[0]++; - else if (!sprite->data[7] && sprite->pos1.x > 103) - sprite->data[0]++; - return FALSE; -} - -static bool8 sub_811C9B8(struct Sprite* sprite) -{ - sprite->data[1] += sprite->data[2]; - sprite->pos1.x += sprite->data[1]; - if (sprite->data[1] == 0) - { - sprite->data[0]++; - sprite->data[2] = -sprite->data[2]; - sprite->data[6] = 1; - } - return FALSE; -} - -static bool8 sub_811C9E4(struct Sprite* sprite) -{ - sprite->data[1] += sprite->data[2]; - sprite->pos1.x += sprite->data[1]; - if (sprite->pos1.x < -31 || sprite->pos1.x > 271) - sprite->data[0]++; - return FALSE; -} - -static void sub_811CA10(s16 spriteID, s16 value) -{ - gSprites[spriteID].data[7] = value; -} - -static void sub_811CA28(s16 spriteID) -{ - gSprites[spriteID].data[0]++; -} - -static s16 sub_811CA44(s16 spriteID) -{ - return gSprites[spriteID].data[6]; -} - -#undef tMugshotOpponentID -#undef tMugshotPlayerID -#undef tMugshotID - -static void Phase2Task_Transition_Slice(u8 taskID) -{ - while (sPhase2_Transition_Slice_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Transition_Slice_Func1(struct Task* task) -{ - u16 i; - - sub_811D658(); - ScanlineEffect_Clear(); - - task->data[2] = 256; - task->data[3] = 1; - TRANSITION_STRUCT.WININ = 63; - TRANSITION_STRUCT.WINOUT = 0; - TRANSITION_STRUCT.WIN0V = 160; - - for (i = 0; i < 160; i++) - { - gScanlineEffectRegBuffers[1][i] = TRANSITION_STRUCT.field_14; - gScanlineEffectRegBuffers[1][160 + i] = 0xF0; - } - - REG_IE |= INTR_FLAG_HBLANK; - REG_DISPSTAT |= DISPSTAT_HBLANK_INTR; - - SetVBlankCallback(VBlankCB_Phase2_Transition_Slice); - SetHBlankCallback(HBlankCB_Phase2_Transition_Slice); - - task->tState++; - return TRUE; -} - -static bool8 Phase2_Transition_Slice_Func2(struct Task* task) -{ - u16 i; - - TRANSITION_STRUCT.VBlank_DMA = 0; - - task->data[1] += (task->data[2] >> 8); - if (task->data[1] > 0xF0) - task->data[1] = 0xF0; - if (task->data[2] <= 0xFFF) - task->data[2] += task->data[3]; - if (task->data[3] < 128) - task->data[3] <<= 1; // multiplying by two - - for (i = 0; i < 160; i++) - { - u16* storeLoc1 = &gScanlineEffectRegBuffers[0][i]; - u16* storeLoc2 = &gScanlineEffectRegBuffers[0][i + 160]; - if (1 & i) - { - *storeLoc1 = TRANSITION_STRUCT.field_14 + task->data[1]; - *storeLoc2 = 0xF0 - task->data[1]; - } - else - { - *storeLoc1 = TRANSITION_STRUCT.field_14 - task->data[1]; - *storeLoc2 = (task->data[1] << 8) | (0xF1); - } - } - - if (task->data[1] > 0xEF) - task->tState++; - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Transition_Slice_Func3(struct Task* task) -{ - DmaStop(0); - sub_811D6D4(); - DestroyTask(FindTaskIdByFunc(Phase2Task_Transition_Slice)); - return FALSE; -} - -static void VBlankCB_Phase2_Transition_Slice(void) -{ - DmaStop(0); - VBlankCB_BattleTransition(); - REG_WININ = TRANSITION_STRUCT.WININ; - REG_WINOUT = TRANSITION_STRUCT.WINOUT; - REG_WIN0V = TRANSITION_STRUCT.WIN0V; - if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 640); - DmaSet(0, &gScanlineEffectRegBuffers[1][160], ®_WIN0H, 0xA2400001); -} - -static void HBlankCB_Phase2_Transition_Slice(void) -{ - u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT]; - REG_BG1HOFS = var; - REG_BG2HOFS = var; - REG_BG3HOFS = var; -} - -static void Phase2Task_Transition_WhiteFade(u8 taskID) -{ - while (sPhase2_Transition_WhiteFade_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Transition_WhiteFade_Func1(struct Task* task) -{ - u16 i; - - sub_811D658(); - ScanlineEffect_Clear(); - - TRANSITION_STRUCT.BLDCNT = 0xBF; - TRANSITION_STRUCT.BLDY = 0; - TRANSITION_STRUCT.WININ = 0x1E; - TRANSITION_STRUCT.WINOUT = 0x3F; - TRANSITION_STRUCT.WIN0V = 0xA0; - - for (i = 0; i < 160; i++) - { - gScanlineEffectRegBuffers[1][i] = 0; - gScanlineEffectRegBuffers[1][i + 160] = 0xF0; - } - - REG_IE |= INTR_FLAG_HBLANK; - REG_DISPSTAT |= DISPSTAT_HBLANK_INTR; - - SetHBlankCallback(HBlankCB_Phase2_Transition_WhiteFade); - SetVBlankCallback(VBlankCB0_Phase2_Transition_WhiteFade); - - task->tState++; - return FALSE; -} - -static bool8 Phase2_Transition_WhiteFade_Func2(struct Task* task) -{ - s16 i, posY; - s16 arr1[8]; - struct Sprite* sprite; - - memcpy(arr1, sUnknown_083FD8C4, sizeof(sUnknown_083FD8C4)); - for (i = 0, posY = 0; i < 8; i++, posY += 0x14) - { - sprite = &gSprites[CreateInvisibleSprite(sub_811CFD0)]; - sprite->pos1.x = 0xF0; - sprite->pos1.y = posY; - sprite->data[5] = arr1[i]; - } - sprite->data[6]++; - - task->tState++; - return FALSE; -} - -static bool8 Phase2_Transition_WhiteFade_Func3(struct Task* task) -{ - TRANSITION_STRUCT.VBlank_DMA = 0; - if (TRANSITION_STRUCT.field_20 > 7) - { - BlendPalettes(0xFFFFFFFF, 16, RGB(31, 31, 31)); - task->tState++; - } - return FALSE; -} - -static bool8 Phase2_Transition_WhiteFade_Func4(struct Task* task) -{ - TRANSITION_STRUCT.VBlank_DMA = 0; - - DmaStop(0); - SetVBlankCallback(0); - SetHBlankCallback(0); - - TRANSITION_STRUCT.field_6 = 0xF0; - TRANSITION_STRUCT.BLDY = 0; - TRANSITION_STRUCT.BLDCNT = 0xFF; - TRANSITION_STRUCT.WININ = 0x3F; - - SetVBlankCallback(VBlankCB1_Phase2_Transition_WhiteFade); - - task->tState++; - return FALSE; -} - -static bool8 Phase2_Transition_WhiteFade_Func5(struct Task* task) -{ - if (++TRANSITION_STRUCT.BLDY > 16) - { - sub_811D6D4(); - DestroyTask(FindTaskIdByFunc(Phase2Task_Transition_WhiteFade)); - } - return FALSE; -} - -static void VBlankCB0_Phase2_Transition_WhiteFade(void) -{ - DmaStop(0); - VBlankCB_BattleTransition(); - REG_BLDCNT = TRANSITION_STRUCT.BLDCNT; - REG_WININ = TRANSITION_STRUCT.WININ; - REG_WINOUT = TRANSITION_STRUCT.WINOUT; - REG_WIN0V = TRANSITION_STRUCT.field_6; - if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 640); - DmaSet(0, &gScanlineEffectRegBuffers[1][160], ®_WIN0H, 0xA2400001); -} - -static void VBlankCB1_Phase2_Transition_WhiteFade(void) -{ - VBlankCB_BattleTransition(); - REG_BLDY = TRANSITION_STRUCT.BLDY; - REG_BLDCNT = TRANSITION_STRUCT.BLDCNT; - REG_WININ = TRANSITION_STRUCT.WININ; - REG_WINOUT = TRANSITION_STRUCT.WINOUT; - REG_WIN0H = TRANSITION_STRUCT.field_6; - REG_WIN0V = TRANSITION_STRUCT.WIN0V; -} - -static void HBlankCB_Phase2_Transition_WhiteFade(void) -{ - REG_BLDY = gScanlineEffectRegBuffers[1][REG_VCOUNT]; -} - -static void sub_811CFD0(struct Sprite* sprite) -{ - if (sprite->data[5]) - { - sprite->data[5]--; - if (sprite->data[6]) - TRANSITION_STRUCT.VBlank_DMA = 1; - } - else - { - u16 i; - u16* ptr1 = &gScanlineEffectRegBuffers[0][sprite->pos1.y]; - u16* ptr2 = &gScanlineEffectRegBuffers[0][sprite->pos1.y + 160]; - for (i = 0; i < 20; i++) - { - ptr1[i] = sprite->data[0] >> 8; - ptr2[i] = (u8)(sprite->pos1.x); - } - if (sprite->pos1.x == 0 && sprite->data[0] == 0x1000) - sprite->data[1] = 1; - - sprite->pos1.x -= 16; - sprite->data[0] += 0x80; - - if (sprite->pos1.x < 0) - sprite->pos1.x = 0; - if (sprite->data[0] > 0x1000) - sprite->data[0] = 0x1000; - - if (sprite->data[6]) - TRANSITION_STRUCT.VBlank_DMA = 1; - - if (sprite->data[1]) - { - if (sprite->data[6] == 0 || (TRANSITION_STRUCT.field_20 > 6 && sprite->data[2]++ > 7)) - { - TRANSITION_STRUCT.field_20++; - DestroySprite(sprite); - } - } - } -} - -static void Phase2Task_Transition_GridSquares(u8 taskID) -{ - while (sPhase2_Transition_GridSquares_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Transition_GridSquares_Func1(struct Task* task) -{ - u16 *dst1, *dst2; - - sub_811D6A8(&dst1, &dst2); - CpuSet(sShrinkingBoxTileset, dst2, 0x10); - CpuFill16(0xF000, dst1, 0x800); - LoadPalette(gFieldEffectObjectPalette10, 0xF0, 0x20); - - task->tState++; - return FALSE; -} - -static bool8 Phase2_Transition_GridSquares_Func2(struct Task* task) -{ - u16* dst1; - - if (task->data[1] == 0) - { - sub_811D690(&dst1); - task->data[1] = 3; - task->data[2]++; - CpuSet(sShrinkingBoxTileset + (task->data[2] * 8), dst1, 0x10); - if (task->data[2] > 0xD) - { - task->tState++; - task->data[1] = 16; - } - } - - task->data[1]--; - return FALSE; -} - -static bool8 Phase2_Transition_GridSquares_Func3(struct Task* task) -{ - if (--task->data[1] == 0) - { - sub_811D6D4(); - DestroyTask(FindTaskIdByFunc(Phase2Task_Transition_GridSquares)); - } - return FALSE; -} - -static void Phase2Task_Transition_Shards(u8 taskID) -{ - while (sPhase2_Transition_Shards_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase2_Transition_Shards_Func1(struct Task* task) -{ - u16 i; - - sub_811D658(); - ScanlineEffect_Clear(); - - TRANSITION_STRUCT.WININ = 0x3F; - TRANSITION_STRUCT.WINOUT = 0; - TRANSITION_STRUCT.WIN0V = 0xA0; - - for (i = 0; i < 160; i++) - { - gScanlineEffectRegBuffers[0][i] = 0xF0; - } - - CpuSet(gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 0xA0); - SetVBlankCallback(VBlankCB_Phase2_Transition_Shards); - - task->tState++; - return TRUE; -} - -static bool8 Phase2_Transition_Shards_Func2(struct Task* task) -{ - sub_811D8FC(TRANSITION_STRUCT.data, - sUnknown_083FD8F4[task->data[1]][0], - sUnknown_083FD8F4[task->data[1]][1], - sUnknown_083FD8F4[task->data[1]][2], - sUnknown_083FD8F4[task->data[1]][3], - 1, 1); - task->data[2] = sUnknown_083FD8F4[task->data[1]][4]; - task->tState++; - return TRUE; -} - -static bool8 Phase2_Transition_Shards_Func3(struct Task* task) -{ - s16 i; - bool8 nextFunc; - - TRANSITION_STRUCT.VBlank_DMA = 0; - - for (i = 0, nextFunc = FALSE; i < 16; i++) - { - s16 r3 = gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] >> 8; - s16 r4 = gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] & 0xFF; - if (task->data[2] == 0) - { - if (r3 < TRANSITION_STRUCT.data[2]) - r3 = TRANSITION_STRUCT.data[2]; - if (r3 > r4) - r3 = r4; - } - else - { - if (r4 > TRANSITION_STRUCT.data[2]) - r4 = TRANSITION_STRUCT.data[2]; - if (r4 <= r3) - r4 = r3; - } - gScanlineEffectRegBuffers[0][TRANSITION_STRUCT.data[3]] = (r4) | (r3 << 8); - if (nextFunc) - { - task->tState++; - break; - } - else - nextFunc = sub_811D978(TRANSITION_STRUCT.data, 1, 1); - } - - TRANSITION_STRUCT.VBlank_DMA++; - return FALSE; -} - -static bool8 Phase2_Transition_Shards_Func4(struct Task* task) -{ - if (++task->data[1] < 7) - { - task->tState++; - task->data[3] = sUnknown_083FD93A[task->data[1] - 1]; - return TRUE; - } - else - { - DmaStop(0); - sub_811D6D4(); - DestroyTask(FindTaskIdByFunc(Phase2Task_Transition_Shards)); - return FALSE; - } -} - -static bool8 Phase2_Transition_Shards_Func5(struct Task* task) -{ - if (--task->data[3] == 0) - { - task->tState = 1; - return TRUE; - } - else - return FALSE; -} - -static void VBlankCB_Phase2_Transition_Shards(void) -{ - DmaStop(0); - VBlankCB_BattleTransition(); - if (TRANSITION_STRUCT.VBlank_DMA) - DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); - REG_WININ = TRANSITION_STRUCT.WININ; - REG_WINOUT = TRANSITION_STRUCT.WINOUT; - REG_WIN0V = TRANSITION_STRUCT.WIN0V; - REG_WIN0H = gScanlineEffectRegBuffers[1][0]; - DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001); -} - -static void CreatePhase1Task(s16 a0, s16 a1, s16 a2, s16 a3, s16 a4) -{ - u8 taskID = CreateTask(Phase1_Task_RunFuncs, 3); - gTasks[taskID].data[1] = a0; - gTasks[taskID].data[2] = a1; - gTasks[taskID].data[3] = a2; - gTasks[taskID].data[4] = a3; - gTasks[taskID].data[5] = a4; - gTasks[taskID].data[6] = a0; -} - -static bool8 sub_811D52C(void) -{ - if (FindTaskIdByFunc(Phase1_Task_RunFuncs) == 0xFF) - return TRUE; - else - return FALSE; -} - -static void Phase1_Task_RunFuncs(u8 taskID) -{ - while (sPhase1_TransitionAll_Funcs[gTasks[taskID].tState](&gTasks[taskID])); -} - -static bool8 Phase1_TransitionAll_Func1(struct Task* task) -{ - if (task->data[6] == 0 || --task->data[6] == 0) - { - task->data[6] = task->data[1]; - task->data[7] += task->data[4]; - if (task->data[7] > 16) - task->data[7] = 16; - BlendPalettes(0xFFFFFFFF, task->data[7], RGB(11, 11, 11)); - } - if (task->data[7] > 15) - { - task->tState++; - task->data[6] = task->data[2]; - } - return FALSE; -} - -static bool8 Phase1_TransitionAll_Func2(struct Task* task) -{ - if (task->data[6] == 0 || --task->data[6] == 0) - { - task->data[6] = task->data[2]; - task->data[7] -= task->data[5]; - if (task->data[7] < 0) - task->data[7] = 0; - BlendPalettes(0xFFFFFFFF, task->data[7], RGB(11, 11, 11)); - } - if (task->data[7] == 0) - { - if (--task->data[3] == 0) - DestroyTask(FindTaskIdByFunc(Phase1_Task_RunFuncs)); - else - { - task->data[6] = task->data[1]; - task->tState = 0; - } - } - return FALSE; -} - -static void sub_811D658(void) -{ - struct TransitionData* const* dummy = &sTransitionStructPtr; - memset(*dummy, 0, sizeof(struct TransitionData)); - sub_8057B14(&TRANSITION_STRUCT.field_14, &TRANSITION_STRUCT.field_16); -} - -static void VBlankCB_BattleTransition(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void sub_811D690(u16** a0) -{ - u16 reg, *vram; - - reg = REG_BG0CNT >> 2; - reg <<= 0xE; - vram = (u16*)(VRAM + reg); - - *a0 = vram; -} - -static void sub_811D6A8(u16** a0, u16** a1) -{ - u16 reg0, reg1, *vram0, *vram1; - - reg0 = REG_BG0CNT >> 8; - reg1 = REG_BG0CNT >> 2; - - reg0 <<= 0xB; - reg1 <<= 0xE; - - vram0 = (u16*)(VRAM + reg0); - *a0 = vram0; - - vram1 = (u16*)(VRAM + reg1); - *a1 = vram1; -} - -static void sub_811D6D4(void) -{ - BlendPalettes(0xFFFFFFFF, 16, RGB(0, 0, 0)); -} - -static void sub_811D6E8(s16* array, s16 sinAdd, s16 index, s16 indexIncrementer, s16 amplitude, s16 arrSize) -{ - u8 i; - for (i = 0; arrSize > 0; arrSize--, i++, index += indexIncrementer) - { - array[i] = sinAdd + Sin(0xFF & index, amplitude); - } -} - -static void sub_811D764(u16* array, s16 a1, s16 a2, s16 a3) -{ - s16 i; - - memset(array, 0xA, 160 * sizeof(s16)); - for (i = 0; i < 64; i++) - { - s16 sinResult, cosResult; - s16 toStoreOrr, r2, r3, toStore, r7, r8; - - sinResult = Sin(i, a3); - cosResult = Cos(i, a3); - - toStoreOrr = a1 - sinResult; - toStore = a1 + sinResult; - r7 = a2 - cosResult; - r8 = a2 + cosResult; - - if (toStoreOrr < 0) - toStoreOrr = 0; - if (toStore > 0xF0) - toStore = 0xF0; - if (r7 < 0) - r7 = 0; - if (r8 > 0x9F) - r8 = 0x9F; - - toStore |= (toStoreOrr << 8); - array[r7] = toStore; - array[r8] = toStore; - - cosResult = Cos(i + 1, a3); - r3 = a2 - cosResult; - r2 = a2 + cosResult; - - if (r3 < 0) - r3 = 0; - if (r2 > 0x9F) - r2 = 0x9F; - - while (r7 > r3) - array[--r7] = toStore; - while (r7 < r3) - array[++r7] = toStore; - - while (r8 > r2) - array[--r8] = toStore; - while (r8 < r2) - array[++r8] = toStore; - } -} - -static void sub_811D8FC(s16* data, s16 a1, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6) -{ - data[0] = a1; - data[1] = a2; - data[2] = a1; - data[3] = a2; - data[4] = a3; - data[5] = a4; - data[6] = a5; - data[7] = a6; - data[8] = a3 - a1; - if (data[8] < 0) - { - data[8] = -data[8]; - data[6] = -a5; - } - data[9] = a4 - a2; - if (data[9] < 0) - { - data[9] = -data[9]; - data[7] = -a6; - } - data[10] = 0; -} - -static bool8 sub_811D978(s16* data, bool8 a1, bool8 a2) -{ - u8 var; - if (data[8] > data[9]) - { - data[2] += data[6]; - data[10] += data[9]; - if (data[10] > data[8]) - { - data[3] += data[7]; - data[10] -= data[8]; - } - } - else - { - data[3] += data[7]; - data[10] += data[8]; - if (data[10] > data[9]) - { - data[2] += data[6]; - data[10] -= data[9]; - } - } - var = 0; - if ((data[6] > 0 && data[2] >= data[4]) || (data[6] < 0 && data[2] <= data[4])) - { - var++; - if (a1) - data[2] = data[4]; - } - if ((data[7] > 0 && data[3] >= data[5]) || (data[7] < 0 && data[3] <= data[5])) - { - var++; - if (a2) - data[3] = data[5]; - } - if (var == 2) - return TRUE; - else - return FALSE; -} diff --git a/src/battle/battle_util.c b/src/battle/battle_util.c deleted file mode 100644 index 3d1770239..000000000 --- a/src/battle/battle_util.c +++ /dev/null @@ -1,3549 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_util.h" -#include "data2.h" -#include "event_data.h" -#include "ewram.h" -#include "field_weather.h" -#include "item.h" -#include "link.h" -#include "pokemon.h" -#include "random.h" -#include "rom_8077ABC.h" -#include "string_util.h" -#include "text.h" -#include "util.h" -#include "constants/abilities.h" -#include "constants/battle_move_effects.h" -#include "constants/flags.h" -#include "constants/hold_effects.h" -#include "constants/items.h" -#include "constants/moves.h" -#include "constants/species.h" -#include "constants/weather.h" - -extern u8 gUnknown_02023A14_50; - -extern const u8* gBattlescriptCurrInstr; -extern u8 gActiveBattler; -extern u8 gBattleBufferB[4][0x200]; -extern u8* gSelectionBattleScripts[4]; //battlescript location when you try to choose a move you're not allowed to -extern u16 gLastUsedMove[4]; -extern struct BattlePokemon gBattleMons[4]; -extern struct BattleEnigmaBerry gEnigmaBerries[4]; -extern u8 gStringBank; -extern u16 gLastUsedItem; -extern u16 gCurrentMove; -extern const u32 gBitTable[]; -extern u16 gBattleTypeFlags; -extern u8 gBattlersCount; -extern u32 gStatuses3[4]; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u8 gBanksByTurnOrder[4]; -extern u16 gSideAffecting[2]; -extern u16 gBattleWeather; -extern void (*gBattleMainFunc)(void); -extern u8 gAbsentBattlerFlags; -extern u8 gBattleCommunication[]; -extern u32 gHitMarker; -extern u8 gEffectBank; -extern u8 gBank1; -extern s32 gBattleMoveDamage; -extern u16 gBattlerPartyIndexes[4]; -extern u16 gChosenMovesByBanks[4]; -extern s32 gTakenDmg[4]; -extern u8 gTakenDmgBanks[4]; -extern u8 gMoveResultFlags; -extern u8 gLastUsedAbility; -extern u8 gBattleTextBuff2[]; -extern u8 gCurrentActionFuncId; -extern struct BattleEnigmaBerry gEnigmaBerries[4]; -extern u8 gUnknown_02024BE5; -extern u8 gCurrMovePos; -extern u16 gRandomMove; -extern s32 gBattleMoveDamage; -extern u16 gDynamicBasePower; -extern u32 gBattleExecBuffer; -extern u8 gSentPokesToOpponent[2]; -extern const u16 gSoundMovesTable[]; -extern const u8 gStatusConditionString_PoisonJpn[]; -extern const u8 gStatusConditionString_SleepJpn[]; -extern const u8 gStatusConditionString_ParalysisJpn[]; -extern const u8 gStatusConditionString_BurnJpn[]; -extern const u8 gStatusConditionString_IceJpn[]; -extern const u8 gStatusConditionString_ConfusionJpn[]; -extern const u8 gStatusConditionString_LoveJpn[]; -extern const BattleCmdFunc gBattleScriptingCommandsTable[]; - -u8 IsImprisoned(u8 bank, u16 move); -u8 GetBattlerAtPosition(u8 ID); -u8 GetBattlerPosition(u8 bank); -u8 GetBattlerSide(u8 bank); -void SetMoveEffect(bool8 primary, u8 certainArg); -bool8 UproarWakeUpCheck(u8 bank); -bool8 sub_8018018(u8 bank, u8, u8); -s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 bank_atk, u8 bank_def); -u8 CountTrailingZeroBits(u32 a); -u8 GetMoveTarget(u16 move, u8 useMoveTarget); -u8 sub_803FC34(u8 bank); -u16 sub_803FBFC(u8 a); -void RecordAbilityBattle(u8 bank, u8 ability); -void RecordItemBattle(u8 bank, u8 holdEffect); -s8 GetPokeFlavourRelation(u32 pid, u8 flavor); - -extern u8 BattleScript_MoveSelectionDisabledMove[]; -extern u8 BattleScript_MoveSelectionTormented[]; -extern u8 BattleScript_MoveSelectionTaunted[]; -extern u8 BattleScript_MoveSelectionImprisoned[]; -extern u8 BattleScript_MoveSelectionChoiceBanded[]; -extern u8 BattleScript_MoveSelectionNoPP[]; -extern u8 BattleScript_NoMovesLeft[]; -extern u8 BattleScript_WishComesTrue[]; -extern u8 BattleScript_IngrainTurnHeal[]; -extern u8 BattleScript_LeechSeedTurnDrain[]; -extern u8 BattleScript_PoisonTurnDmg[]; -extern u8 BattleScript_BurnTurnDmg[]; -extern u8 BattleScript_NightmareTurnDmg[]; -extern u8 BattleScript_CurseTurnDmg[]; -extern u8 BattleScript_WrapTurnDmg[]; -extern u8 BattleScript_WrapEnds[]; -extern u8 BattleScript_DisabledNoMore[]; -extern u8 BattleScript_EncoredNoMore[]; - -extern u8 BattleScript_SideStatusWoreOff[]; -extern u8 BattleScript_RainContinuesOrEnds[]; -extern u8 BattleScript_SandStormHailEnds[]; -extern u8 BattleScript_DamagingWeatherContinues[]; -extern u8 BattleScript_SunlightFaded[]; -extern u8 BattleScript_SunlightContinues[]; -extern u8 BattleScript_SafeguardEnds[]; -extern u8 BattleScript_MonWokeUpInUproar[]; //uproar wakeup BS -extern u8 BattleScript_PrintUproarOverTurns[]; //uproar BS -extern u8 BattleScript_ThrashConfuses[]; -extern u8 BattleScript_YawnMakesAsleep[]; -extern u8 BattleScript_MonTookFutureAttack[]; -extern u8 BattleScript_PerishSongHits[]; -extern u8 BattleScript_PerishSongTimerGoesDown[]; -extern u8 BattleScript_GiveExp[]; -extern u8 BattleScript_HandleFaintedMon[]; - -extern u8 BattleScript_MoveUsedIsAsleep[]; -extern u8 BattleScript_MoveUsedWokeUp[]; -extern u8 BattleScript_MoveUsedIsFrozen[]; -extern u8 BattleScript_MoveUsedUnfroze[]; -extern u8 BattleScript_MoveUsedLoafingAround[]; -extern u8 BattleScript_MoveUsedMustRecharge[]; -extern u8 BattleScript_MoveUsedFlinched[]; -extern u8 BattleScript_MoveUsedIsDisabled[]; -extern u8 BattleScript_MoveUsedIsTaunted[]; -extern u8 BattleScript_MoveUsedIsImprisoned[]; -extern u8 BattleScript_MoveUsedIsConfused[]; -extern u8 BattleScript_MoveUsedIsConfusedNoMore[]; -extern u8 BattleScript_MoveUsedIsParalyzed[]; -extern u8 BattleScript_MoveUsedIsParalyzedCantAttack[]; -extern u8 BattleScript_MoveUsedIsInLove[]; -extern u8 BattleScript_BideStoringEnergy[]; -extern u8 BattleScript_BideAttack[]; -extern u8 BattleScript_BideNoEnergyToAttack[]; - -extern u8 BattleScript_OverworldWeatherStarts[]; //load weather from overworld -extern u8 BattleScript_DrizzleActivates[]; -extern u8 BattleScript_SandstreamActivates[]; -extern u8 BattleScript_DroughtActivates[]; -extern u8 BattleScript_CastformChange[]; -extern u8 BattleScript_RainDishActivates[]; -extern u8 BattleScript_ShedSkinActivates[]; -extern u8 BattleScript_SpeedBoostActivates[]; -extern u8 BattleScript_SoundproofProtected[]; -extern u8 BattleScript_MoveHPDrain[]; -extern u8 BattleScript_MoveHPDrain_PPLoss[]; -extern u8 BattleScript_FlashFireBoost[]; -extern u8 BattleScript_FlashFireBoost_PPLoss[]; -extern u8 BattleScript_MoveHPDrain_FullHP[]; -extern u8 BattleScript_MoveHPDrain_FullHP_PPLoss[]; -extern u8 BattleScript_ColorChangeActivates[]; -extern u8 BattleScript_RoughSkinActivates[]; -extern u8 BattleScript_ApplySecondaryEffect[]; -extern u8 BattleScript_CuteCharmActivates[]; -extern u8 BattleScript_AbilityCuredStatus[]; //ability status clear -extern u8 BattleScript_SynchronizeActivates[]; -extern u8 gUnknown_081D978C[]; //intimidate1 -extern u8 gUnknown_081D9795[]; //intimidate2 -extern u8 BattleScript_TraceActivates[]; - -extern u8 BattleScript_WhiteHerbEnd2[]; -extern u8 BattleScript_WhiteHerbRet[]; -extern u8 BattleScript_ItemHealHP_RemoveItem[]; -extern u8 BattleScript_BerryPPHealEnd2[]; -extern u8 BattleScript_ItemHealHP_End2[]; -extern u8 BattleScript_BerryConfuseHealEnd2[]; -extern u8 BattleScript_BerryStatRaiseEnd2[]; -extern u8 BattleScript_BerryFocusEnergyEnd2[]; -extern u8 BattleScript_BerryCurePrlzEnd2[]; -extern u8 BattleScript_BerryCurePsnEnd2[]; -extern u8 BattleScript_BerryCureBrnEnd2[]; -extern u8 BattleScript_BerryCureFrzEnd2[]; -extern u8 BattleScript_BerryCureSlpEnd2[]; -extern u8 BattleScript_BerryCureConfusionEnd2[]; -extern u8 BattleScript_BerryCureChosenStatusEnd2[]; //berry cure any status end2 -extern u8 BattleScript_BerryCureParRet[]; -extern u8 BattleScript_BerryCurePsnRet[]; -extern u8 BattleScript_BerryCureBrnRet[]; -extern u8 BattleScript_BerryCureFrzRet[]; -extern u8 BattleScript_BerryCureSlpRet[]; -extern u8 BattleScript_BerryCureConfusionRet[]; -extern u8 BattleScript_BerryCureChosenStatusRet[]; //berry cure any status return - -extern u8 BattleScript_ItemHealHP_Ret[]; - -extern u8 gUnknown_081D995F[]; //disobedient while asleep -extern u8 BattleScript_IgnoresAndUsesRandomMove[]; //disobedient, uses a random move -extern u8 BattleScript_IgnoresAndFallsAsleep[]; //disobedient, went to sleep -extern u8 gUnknown_081D99A0[]; //disobedient, hits itself - -//array entries for battle communication -#define MOVE_EFFECT_BYTE 0x3 -#define MULTISTRING_CHOOSER 0x5 -#define MSG_DISPLAY 0x7 - -u8 GetBattleBank(u8 caseId) -{ - u8 ret = 0; - switch (caseId) - { - case BS_GET_TARGET: - ret = gBankTarget; - break; - case BS_GET_ATTACKER: - ret = gBankAttacker; - break; - case BS_GET_EFFECT_BANK: - ret = gEffectBank; - break; - case BS_GET_BANK_0: - ret = 0; - break; - case BS_GET_SCRIPTING_BANK: - ret = ewram16003; - break; - case BS_GET_gBank1: - ret = gBank1; - break; - case 5: - ret = gBank1; - break; - } - return ret; -} - -void PressurePPLose(u8 bankDef, u8 bankAtk, u16 move) -{ - s32 i; - - if (gBattleMons[bankDef].ability != ABILITY_PRESSURE) - return; - - for (i = 0; i < 4; i++) - { - if (gBattleMons[bankAtk].moves[i] == move) - break; - } - - if (i == 4) // mons don't share any moves - return; - - if (gBattleMons[bankAtk].pp[i] != 0) - gBattleMons[bankAtk].pp[i]--; - - if (!(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[bankAtk].unk18_b & gBitTable[i])) - { - gActiveBattler = bankAtk; - EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBattler].pp[i]); - MarkBufferBankForExecution(gActiveBattler); - } -} - -void PressurePPLoseOnUsingImprision(u8 bankAtk) -{ - s32 i, j; - s32 imprisionPos = 4; - u8 atkSide = GetBattlerSide(bankAtk); - - for (i = 0; i < gBattlersCount; i++) - { - if (atkSide != GetBattlerSide(i) && gBattleMons[i].ability == ABILITY_PRESSURE) - { - for (j = 0; j < 4; j++) - { - if (gBattleMons[bankAtk].moves[j] == MOVE_IMPRISON) - break; - } - if (j != 4) - { - imprisionPos = j; - if (gBattleMons[bankAtk].pp[j] != 0) - gBattleMons[bankAtk].pp[j]--; - } - } - } - - if (imprisionPos != 4 - && !(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[bankAtk].unk18_b & gBitTable[imprisionPos])) - { - gActiveBattler = bankAtk; - EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + imprisionPos, 0, 1, &gBattleMons[gActiveBattler].pp[imprisionPos]); - MarkBufferBankForExecution(gActiveBattler); - } -} - -void PressurePPLoseOnUsingPerishSong(u8 bankAtk) -{ - s32 i, j; - s32 perishSongPos = 4; - - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ABILITY_PRESSURE && i != bankAtk) - { - for (j = 0; j < 4; j++) - { - if (gBattleMons[bankAtk].moves[j] == MOVE_PERISH_SONG) - break; - } - if (j != 4) - { - perishSongPos = j; - if (gBattleMons[bankAtk].pp[j] != 0) - gBattleMons[bankAtk].pp[j]--; - } - } - } - - if (perishSongPos != 4 - && !(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[bankAtk].unk18_b & gBitTable[perishSongPos])) - { - gActiveBattler = bankAtk; - EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBattler].pp[perishSongPos]); - MarkBufferBankForExecution(gActiveBattler); - } -} - - -void MarkAllBufferBanksForExecution(void) // unused -{ - s32 i; - - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - for (i = 0; i < gBattlersCount; i++) - gBattleExecBuffer |= gBitTable[i] << 0x1C; - } - else - { - for (i = 0; i < gBattlersCount; i++) - gBattleExecBuffer |= gBitTable[i]; - } -} - -void MarkBufferBankForExecution(u8 bank) -{ - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - gBattleExecBuffer |= gBitTable[bank] << 0x1C; - } - else - { - gBattleExecBuffer |= gBitTable[bank]; - } -} - -void sub_80155A4(u8 arg0) -{ - s32 i; - - for (i = 0; i < GetLinkPlayerCount(); i++) - gBattleExecBuffer |= gBitTable[arg0] << (i << 2); - - gBattleExecBuffer &= ~(0x10000000 << arg0); -} - -void CancelMultiTurnMoves(u8 bank) -{ - gBattleMons[bank].status2 &= ~(STATUS2_MULTIPLETURNS); - gBattleMons[bank].status2 &= ~(STATUS2_LOCK_CONFUSE); - gBattleMons[bank].status2 &= ~(STATUS2_UPROAR); - gBattleMons[bank].status2 &= ~(STATUS2_BIDE); - - gStatuses3[bank] &= ~(STATUS3_SEMI_INVULNERABLE); - - gDisableStructs[bank].rolloutTimer1 = 0; - gDisableStructs[bank].furyCutterCounter = 0; -} - -bool8 WasUnableToUseMove(u8 bank) -{ - if (gProtectStructs[bank].prlzImmobility - || gProtectStructs[bank].notEffective - || gProtectStructs[bank].usedImprisionedMove - || gProtectStructs[bank].loveImmobility - || gProtectStructs[bank].usedDisabledMove - || gProtectStructs[bank].usedTauntedMove - || gProtectStructs[bank].flag2Unknown - || gProtectStructs[bank].flinchImmobility - || gProtectStructs[bank].confusionSelfDmg) - return TRUE; - else - return FALSE; -} - -void PrepareStringBattle(u16 stringId, u8 bank) -{ - gActiveBattler = bank; - EmitPrintString(0, stringId); - MarkBufferBankForExecution(gActiveBattler); -} - -void ResetSentPokesToOpponentValue(void) -{ - s32 i; - u32 bits = 0; - - gSentPokesToOpponent[0] = 0; - gSentPokesToOpponent[1] = 0; - - for (i = 0; i < gBattlersCount; i += 2) - bits |= gBitTable[gBattlerPartyIndexes[i]]; - - for (i = 1; i < gBattlersCount; i += 2) - gSentPokesToOpponent[(i & BIT_FLANK) >> 1] = bits; -} - -void sub_8015740(u8 bank) -{ - s32 i = 0; - u32 bits = 0; - - if (GetBattlerSide(bank) == B_SIDE_OPPONENT) - { - u8 id = ((bank & BIT_FLANK) >> 1); - gSentPokesToOpponent[id] = 0; - - for (i = 0; i < gBattlersCount; i += 2) - { - if (!(gAbsentBattlerFlags & gBitTable[i])) - bits |= gBitTable[gBattlerPartyIndexes[i]]; - } - - gSentPokesToOpponent[id] = bits; - } -} - -void sub_80157C4(u8 bank) -{ - if (GetBattlerSide(bank) == B_SIDE_OPPONENT) - { - sub_8015740(bank); - } - else - { - s32 i; - for (i = 1; i < gBattlersCount; i++) - gSentPokesToOpponent[(i & BIT_FLANK) >> 1] |= gBitTable[gBattlerPartyIndexes[bank]]; - } -} - -void BattleScriptPush(const u8* BS_ptr) -{ - B_BATTLESCRIPTS_STACK->ptr[B_BATTLESCRIPTS_STACK->size++] = BS_ptr; -} - -void BattleScriptPushCursor(void) -{ - B_BATTLESCRIPTS_STACK->ptr[B_BATTLESCRIPTS_STACK->size++] = gBattlescriptCurrInstr; -} - -void BattleScriptPop(void) -{ - gBattlescriptCurrInstr = B_BATTLESCRIPTS_STACK->ptr[--B_BATTLESCRIPTS_STACK->size]; -} - -u8 TrySetCantSelectMoveBattleScript(void) //msg can't select a move -{ - u8 limitations = 0; - u16 move = gBattleMons[gActiveBattler].moves[gBattleBufferB[gActiveBattler][2]]; - u8 holdEffect; - u16* choicedMove = CHOICED_MOVE(gActiveBattler); - if (gDisableStructs[gActiveBattler].disabledMove == move && move) - { - gBattleStruct->scriptingActive = gActiveBattler; - gCurrentMove = move; - gSelectionBattleScripts[gActiveBattler] = BattleScript_MoveSelectionDisabledMove; - limitations++; - } - if (move == gLastUsedMove[gActiveBattler] && move != MOVE_STRUGGLE && gBattleMons[gActiveBattler].status2 & STATUS2_TORMENT) - { - CancelMultiTurnMoves(gActiveBattler); - gSelectionBattleScripts[gActiveBattler] = BattleScript_MoveSelectionTormented; - limitations++; - } - if (gDisableStructs[gActiveBattler].tauntTimer1 && gBattleMoves[move].power == 0) - { - gCurrentMove = move; - gSelectionBattleScripts[gActiveBattler] = BattleScript_MoveSelectionTaunted; - limitations++; - } - if (IsImprisoned(gActiveBattler, move)) - { - gCurrentMove = move; - gSelectionBattleScripts[gActiveBattler] = BattleScript_MoveSelectionImprisoned; - limitations++; - } - if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY) - holdEffect = gEnigmaBerries[gActiveBattler].holdEffect; - else - holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item); - gStringBank = gActiveBattler; - if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != move) - { - gCurrentMove = *choicedMove; - gLastUsedItem = gBattleMons[gActiveBattler].item; - gSelectionBattleScripts[gActiveBattler] = BattleScript_MoveSelectionChoiceBanded; - limitations++; - } - if (gBattleMons[gActiveBattler].pp[gBattleBufferB[gActiveBattler][2]] == 0) - { - gSelectionBattleScripts[gActiveBattler] = BattleScript_MoveSelectionNoPP; - limitations++; - } - return limitations; -} - -#define MOVE_LIMITATION_ZEROMOVE (1 << 0) -#define MOVE_LIMITATION_PP (1 << 1) -#define MOVE_LIMITATION_DISABLED (1 << 2) -#define MOVE_LIMITATION_TORMENTED (1 << 3) -#define MOVE_LIMITATION_TAUNT (1 << 4) -#define MOVE_LIMITATION_IMPRISION (1 << 5) - -u8 CheckMoveLimitations(u8 bank, u8 unusableMoves, u8 check) -{ - u8 holdEffect; - u16* choicedMove = CHOICED_MOVE(bank); - s32 i; - if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY) - holdEffect = gEnigmaBerries[bank].holdEffect; - else - holdEffect = ItemId_GetHoldEffect(gBattleMons[bank].item); - gStringBank = bank; - for (i = 0; i < 4; i++) - { - if (gBattleMons[bank].moves[i] == 0 && check & MOVE_LIMITATION_ZEROMOVE) - unusableMoves |= gBitTable[i]; - if (gBattleMons[bank].pp[i] == 0 && check & MOVE_LIMITATION_PP) - unusableMoves |= gBitTable[i]; - if (gBattleMons[bank].moves[i] == gDisableStructs[bank].disabledMove && check & MOVE_LIMITATION_DISABLED) - unusableMoves |= gBitTable[i]; - if (gBattleMons[bank].moves[i] == gLastUsedMove[bank] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[bank].status2 & STATUS2_TORMENT) - unusableMoves |= gBitTable[i]; - if (gDisableStructs[bank].tauntTimer1 && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[bank].moves[i]].power == 0) - unusableMoves |= gBitTable[i]; - if (IsImprisoned(bank, gBattleMons[bank].moves[i]) && check & MOVE_LIMITATION_IMPRISION) - unusableMoves |= gBitTable[i]; - if (gDisableStructs[bank].encoreTimer1 && gDisableStructs[bank].encoredMove != gBattleMons[bank].moves[i]) - unusableMoves |= gBitTable[i]; - if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[bank].moves[i]) - unusableMoves |= gBitTable[i]; - } - return unusableMoves; -} - -bool8 AreAllMovesUnusable(void) -{ - u8 unusable; - unusable = CheckMoveLimitations(gActiveBattler, 0, 0xFF); - if (unusable == 0xF) //all moves are unusable - { - gProtectStructs[gActiveBattler].onlyStruggle = 1; - gSelectionBattleScripts[gActiveBattler] = BattleScript_NoMovesLeft; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - gBattleBufferB[gActiveBattler][3] = GetBattlerAtPosition((GetBattlerPosition(gActiveBattler) ^ 1) | (Random() & 2)); - else - gBattleBufferB[gActiveBattler][3] = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ 1); - } - else - gProtectStructs[gActiveBattler].onlyStruggle = 0; - return (unusable == 0xF); -} - -u8 IsImprisoned(u8 bank, u16 move) -{ - u8 imprisionedMoves = 0; - u8 bankSide = GetBattlerSide(bank); - s32 i; - for (i = 0; i < gBattlersCount; i++) - { - if (bankSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISIONED) - { - s32 j; - for (j = 0; j < 4; j++) - { - if (move == gBattleMons[i].moves[j]) - break; - } - if (j < 4) - imprisionedMoves++; - } - } - return imprisionedMoves; -} - -u8 UpdateTurnCounters(void) -{ - u8 effect = 0; - s32 i; - - for (gBankAttacker = 0; gBankAttacker < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBankAttacker]; gBankAttacker++) - { - } - for (gBankTarget = 0; gBankTarget < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBankTarget]; gBankTarget++) - { - } - - do - { - u8 sideBank; - - switch (gBattleStruct->turncountersTracker) - { - case 0: - for (i = 0; i < gBattlersCount; i++) - { - gBanksByTurnOrder[i] = i; - } - for (i = 0; i < gBattlersCount - 1; i++) - { - s32 j; - for (j = i + 1; j < gBattlersCount; j++) - { - if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 0)) - SwapTurnOrder(i, j); - } - } - gBattleStruct->turncountersTracker++; - gBattleStruct->turnSideTracker = 0; - case 1: - while (gBattleStruct->turnSideTracker < 2) - { - gActiveBattler = gBankAttacker = sideBank = gBattleStruct->turnSideTracker; - - if (gSideAffecting[sideBank] & SIDE_STATUS_REFLECT) - { - if (--gSideTimers[sideBank].reflectTimer == 0) - { - - gSideAffecting[sideBank] &= ~SIDE_STATUS_REFLECT; - BattleScriptExecute(BattleScript_SideStatusWoreOff); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = MOVE_REFLECT; - gBattleTextBuff1[3] = MOVE_REFLECT >> 8; - gBattleTextBuff1[4] = EOS; - effect++; - } - } - gBattleStruct->turnSideTracker++; - if (effect) - break; - } - if (!effect) - { - gBattleStruct->turncountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case 2: - while (gBattleStruct->turnSideTracker < 2) - { - gActiveBattler = gBankAttacker = sideBank = gBattleStruct->turnSideTracker; - if (gSideAffecting[sideBank] & SIDE_STATUS_LIGHTSCREEN) - { - if (--gSideTimers[sideBank].lightscreenTimer == 0) - { - gSideAffecting[sideBank] &= ~SIDE_STATUS_LIGHTSCREEN; - BattleScriptExecute(BattleScript_SideStatusWoreOff); - gBattleCommunication[MULTISTRING_CHOOSER] = sideBank; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = MOVE_LIGHT_SCREEN; - gBattleTextBuff1[3] = MOVE_LIGHT_SCREEN >> 8; - gBattleTextBuff1[4] = EOS; - effect++; - } - } - gBattleStruct->turnSideTracker++; - if (effect) - break; - } - if (!effect) - { - gBattleStruct->turncountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case 3: - while (gBattleStruct->turnSideTracker < 2) - { - gActiveBattler = gBankAttacker = sideBank = gBattleStruct->turnSideTracker; - if (gSideTimers[sideBank].mistTimer && --gSideTimers[sideBank].mistTimer == 0) - { - gSideAffecting[sideBank] &= ~SIDE_STATUS_MIST; - BattleScriptExecute(BattleScript_SideStatusWoreOff); - gBattleCommunication[MULTISTRING_CHOOSER] = sideBank; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = MOVE_MIST; - gBattleTextBuff1[3] = MOVE_MIST >> 8; - gBattleTextBuff1[4] = EOS; - effect++; - } - gBattleStruct->turnSideTracker++; - if (effect) - break; - } - if (!effect) - { - gBattleStruct->turncountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case 4: - while (gBattleStruct->turnSideTracker < 2) - { - gActiveBattler = gBankAttacker = sideBank = gBattleStruct->turnSideTracker; - if (gSideAffecting[sideBank] & SIDE_STATUS_SAFEGUARD) - { - if (--gSideTimers[sideBank].safeguardTimer == 0) - { - gSideAffecting[sideBank] &= ~SIDE_STATUS_SAFEGUARD; - BattleScriptExecute(BattleScript_SafeguardEnds); - effect++; - } - } - gBattleStruct->turnSideTracker++; - if (effect) - break; - } - if (!effect) - { - gBattleStruct->turncountersTracker++; - gBattleStruct->turnSideTracker = 0; - } - break; - case 5: - while (gBattleStruct->turnSideTracker < gBattlersCount) - { - gActiveBattler = gBanksByTurnOrder[gBattleStruct->turnSideTracker]; - if (gWishFutureKnock.wishCounter[gActiveBattler] && --gWishFutureKnock.wishCounter[gActiveBattler] == 0 && gBattleMons[gActiveBattler].hp) - { - gBankTarget = gActiveBattler; - BattleScriptExecute(BattleScript_WishComesTrue); - effect++; - } - gBattleStruct->turnSideTracker++; - if (effect) - break; - } - if (!effect) - { - gBattleStruct->turncountersTracker++; - } - break; - case 6: - if (gBattleWeather & WEATHER_RAIN_ANY) - { - if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) - { - if (--gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~WEATHER_RAIN_TEMPORARY; - gBattleWeather &= ~WEATHER_RAIN_DOWNPOUR; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else if (gBattleWeather & WEATHER_RAIN_DOWNPOUR) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else if (gBattleWeather & WEATHER_RAIN_DOWNPOUR) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - BattleScriptExecute(BattleScript_RainContinuesOrEnds); - effect++; - } - gBattleStruct->turncountersTracker++; - break; - case 7: - if (gBattleWeather & WEATHER_SANDSTORM_ANY) - { - if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~WEATHER_SANDSTORM_TEMPORARY; - gBattlescriptCurrInstr = BattleScript_SandStormHailEnds; - } - else - gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; - - gBattleStruct->animArg1 = B_ANIM_SANDSTORM_CONTINUES; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - BattleScriptExecute(gBattlescriptCurrInstr); - effect++; - } - gBattleStruct->turncountersTracker++; - break; - case 8: - if (gBattleWeather & WEATHER_SUN_ANY) - { - if (!(gBattleWeather & WEATHER_SUN_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~WEATHER_SUN_TEMPORARY; - gBattlescriptCurrInstr = BattleScript_SunlightFaded; - } - else - gBattlescriptCurrInstr = BattleScript_SunlightContinues; - - BattleScriptExecute(gBattlescriptCurrInstr); - effect++; - } - gBattleStruct->turncountersTracker++; - break; - case 9: - if (gBattleWeather & WEATHER_HAIL) - { - if (--gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~WEATHER_HAIL; - gBattlescriptCurrInstr = BattleScript_SandStormHailEnds; - } - else - gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; - - gBattleStruct->animArg1 = B_ANIM_HAIL_CONTINUES; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - BattleScriptExecute(gBattlescriptCurrInstr); - effect++; - } - gBattleStruct->turncountersTracker++; - break; - case 10: - effect++; - break; - } - } while (effect == 0); - return (gBattleMainFunc != BattleTurnPassed); -} - -#define TURNBASED_MAX_CASE 19 - -u8 TurnBasedEffects(void) -{ - u8 effect = 0; - - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); - while (gBattleStruct->turnEffectsBank < gBattlersCount && gBattleStruct->turnEffectsTracker <= TURNBASED_MAX_CASE) - { - gActiveBattler = gBankAttacker = gBanksByTurnOrder[gBattleStruct->turnEffectsBank]; - if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) - { - gBattleStruct->turnEffectsBank++; - } - else - { - switch (gBattleStruct->turnEffectsTracker) - { - case 0: // ingrain - if ((gStatuses3[gActiveBattler] & STATUS3_ROOTED) - && gBattleMons[gActiveBattler].hp != gBattleMons[gActiveBattler].maxHP - && gBattleMons[gActiveBattler].hp != 0) - { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - BattleScriptExecute(BattleScript_IngrainTurnHeal); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case 1: // end turn abilities - if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBattler, 0, 0, 0)) - effect++; - gBattleStruct->turnEffectsTracker++; - break; - case 2: // item effects - if (ItemBattleEffects(1, gActiveBattler, 0)) - effect++; - gBattleStruct->turnEffectsTracker++; - break; - case 18: // item effects again - if (ItemBattleEffects(1, gActiveBattler, 1)) - effect++; - gBattleStruct->turnEffectsTracker++; - break; - case 3: // leech seed - if (gStatuses3[gActiveBattler] & STATUS3_LEECHSEED && gBattleMons[gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BANK].hp != 0 && gBattleMons[gActiveBattler].hp != 0) - { - gBankTarget = gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BANK; //funny how the 'target' is actually the bank that receives HP - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleStruct->animArg1 = gBankTarget; - gBattleStruct->animArg2 = gBankAttacker; - BattleScriptExecute(BattleScript_LeechSeedTurnDrain); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case 4: // poison - if ((gBattleMons[gActiveBattler].status1 & STATUS_POISON) && gBattleMons[gActiveBattler].hp != 0) - { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptExecute(BattleScript_PoisonTurnDmg); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case 5: // toxic poison - if ((gBattleMons[gActiveBattler].status1 & STATUS_TOXIC_POISON) && gBattleMons[gActiveBattler].hp != 0) - { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if ((gBattleMons[gActiveBattler].status1 & 0xF00) != 0xF00) //not 16 turns - gBattleMons[gActiveBattler].status1 += 0x100; - gBattleMoveDamage *= (gBattleMons[gActiveBattler].status1 & 0xF00) >> 8; - BattleScriptExecute(BattleScript_PoisonTurnDmg); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case 6: // burn - if ((gBattleMons[gActiveBattler].status1 & STATUS_BURN) && gBattleMons[gActiveBattler].hp != 0) - { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptExecute(BattleScript_BurnTurnDmg); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case 7: // spooky nightmares - if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBattler].hp != 0) - { - // missing sleep check - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptExecute(BattleScript_NightmareTurnDmg); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case 8: // curse - if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) && gBattleMons[gActiveBattler].hp != 0) - { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptExecute(BattleScript_CurseTurnDmg); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case 9: // wrap - if ((gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBattler].hp != 0) - { - gBattleMons[gActiveBattler].status2 -= 0x2000; - if (gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) // damaged by wrap - { - gBattleStruct->animArg1 = ewram16004arr(0, gActiveBattler); - gBattleStruct->animArg2 = ewram16004arr(1, gActiveBattler); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = ewram16004arr(0, gActiveBattler); - gBattleTextBuff1[3] = ewram16004arr(1, gActiveBattler); - gBattleTextBuff1[4] = EOS; - gBattlescriptCurrInstr = BattleScript_WrapTurnDmg; - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } - else // broke free - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = ewram16004arr(0, gActiveBattler); - gBattleTextBuff1[3] = ewram16004arr(1, gActiveBattler); - gBattleTextBuff1[4] = EOS; - gBattlescriptCurrInstr = BattleScript_WrapEnds; - } - BattleScriptExecute(gBattlescriptCurrInstr); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case 10: // uproar - if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) - { - for (gBankAttacker = 0; gBankAttacker < gBattlersCount; gBankAttacker++) - { - if ((gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) - && gBattleMons[gBankAttacker].ability != ABILITY_SOUNDPROOF) - { - gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP); - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - BattleScriptExecute(BattleScript_MonWokeUpInUproar); - gActiveBattler = gBankAttacker; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - break; - } - } - if (gBankAttacker != gBattlersCount) - { - effect = 2; // a pokemon was awaken - break; - } - else - { - gBankAttacker = gActiveBattler; - gBattleMons[gActiveBattler].status2 -= 0x10; // uproar timer goes down - if (WasUnableToUseMove(gActiveBattler)) - { - CancelMultiTurnMoves(gActiveBattler); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattleMons[gActiveBattler].status2 |= STATUS2_MULTIPLETURNS; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - CancelMultiTurnMoves(gActiveBattler); - } - BattleScriptExecute(BattleScript_PrintUproarOverTurns); - effect = 1; - } - } - if (effect != 2) - gBattleStruct->turnEffectsTracker++; - break; - case 11: // thrash - if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) - { - gBattleMons[gActiveBattler].status2 -= 0x400; - if (WasUnableToUseMove(gActiveBattler)) - CancelMultiTurnMoves(gActiveBattler); - else if (!(gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) - && (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS)) - { - gBattleMons[gActiveBattler].status2 &= ~(STATUS2_MULTIPLETURNS); - if (!(gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x47; - SetMoveEffect(1, 0); - if (gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION) - BattleScriptExecute(BattleScript_ThrashConfuses); - effect++; - } - } - } - gBattleStruct->turnEffectsTracker++; - break; - case 12: // disable - if (gDisableStructs[gActiveBattler].disableTimer1 != 0) - { - int i; - for (i = 0; i < 4; i++) - { - if (gDisableStructs[gActiveBattler].disabledMove == gBattleMons[gActiveBattler].moves[i]) - break; - } - if (i == 4) // pokemon does not have the disabled move anymore - { - gDisableStructs[gActiveBattler].disabledMove = 0; - gDisableStructs[gActiveBattler].disableTimer1 = 0; - } - else if (--gDisableStructs[gActiveBattler].disableTimer1 == 0) // disable ends - { - gDisableStructs[gActiveBattler].disabledMove = 0; - BattleScriptExecute(BattleScript_DisabledNoMore); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case 13: // encore - if (gDisableStructs[gActiveBattler].encoreTimer1 != 0) - { - if (gBattleMons[gActiveBattler].moves[gDisableStructs[gActiveBattler].encoredMovePos] != gDisableStructs[gActiveBattler].encoredMove) // pokemon does not have the encored move anymore - { - gDisableStructs[gActiveBattler].encoredMove = 0; - gDisableStructs[gActiveBattler].encoreTimer1 = 0; - } - else if (--gDisableStructs[gActiveBattler].encoreTimer1 == 0 - || gBattleMons[gActiveBattler].pp[gDisableStructs[gActiveBattler].encoredMovePos] == 0) - { - gDisableStructs[gActiveBattler].encoredMove = 0; - gDisableStructs[gActiveBattler].encoreTimer1 = 0; - BattleScriptExecute(BattleScript_EncoredNoMore); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case 14: // lock-on decrement - if (gStatuses3[gActiveBattler] & STATUS3_ALWAYS_HITS) - gStatuses3[gActiveBattler] -= 0x8; - gBattleStruct->turnEffectsTracker++; - break; - case 15: // charge - if (gDisableStructs[gActiveBattler].chargeTimer1 && --gDisableStructs[gActiveBattler].chargeTimer1 == 0) - gStatuses3[gActiveBattler] &= ~STATUS3_CHARGED_UP; - gBattleStruct->turnEffectsTracker++; - break; - case 16: // taunt - if (gDisableStructs[gActiveBattler].tauntTimer1) - gDisableStructs[gActiveBattler].tauntTimer1--; - gBattleStruct->turnEffectsTracker++; - break; - case 17: // yawn - if (gStatuses3[gActiveBattler] & STATUS3_YAWN) - { - gStatuses3[gActiveBattler] -= 0x800; - if (!(gStatuses3[gActiveBattler] & STATUS3_YAWN) && !(gBattleMons[gActiveBattler].status1 & STATUS_ANY) - && gBattleMons[gActiveBattler].ability != ABILITY_VITAL_SPIRIT - && gBattleMons[gActiveBattler].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler)) - { - CancelMultiTurnMoves(gActiveBattler); - gBattleMons[gActiveBattler].status1 |= (Random() & 3) + 2; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - gEffectBank = gActiveBattler; - BattleScriptExecute(BattleScript_YawnMakesAsleep); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case 19: // done - gBattleStruct->turnEffectsTracker = 0; - gBattleStruct->turnEffectsBank++; - break; - } - if (effect != 0) - return effect; - } - } - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); - return 0; -} - -bool8 HandleWishPerishSongOnTurnEnd(void) -{ - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); - switch (gBattleStruct->sub80170DC_Tracker) - { - case 0: // future sight - while (gBattleStruct->sub80170DC_Bank < gBattlersCount) - { - gActiveBattler = gBattleStruct->sub80170DC_Bank; - if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) - gBattleStruct->sub80170DC_Bank++; - else - { - gBattleStruct->sub80170DC_Bank++; - if (gWishFutureKnock.futureSightCounter[gActiveBattler] && --gWishFutureKnock.futureSightCounter[gActiveBattler] == 0 && gBattleMons[gActiveBattler].hp) - { - if (gWishFutureKnock.futureSightMove[gActiveBattler] == MOVE_FUTURE_SIGHT) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else //Doom Desire - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gWishFutureKnock.futureSightMove[gActiveBattler]; - gBattleTextBuff1[3] = gWishFutureKnock.futureSightMove[gActiveBattler] >> 8; - gBattleTextBuff1[4] = 0xFF; - gBankTarget = gActiveBattler; - gBankAttacker = gWishFutureKnock.futureSightAttacker[gActiveBattler]; - gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBattler]; - gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF; - BattleScriptExecute(BattleScript_MonTookFutureAttack); - return 1; - } - } - } - gBattleStruct->sub80170DC_Tracker = 1; - gBattleStruct->sub80170DC_Bank = 0; - case 1: // perish song - while (gBattleStruct->sub80170DC_Bank < gBattlersCount) - { - gActiveBattler = gBankAttacker = gBanksByTurnOrder[gBattleStruct->sub80170DC_Bank]; - if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) - gBattleStruct->sub80170DC_Bank++; - else - { - gBattleStruct->sub80170DC_Bank++; - if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 1; - gBattleTextBuff1[3] = 1; - gBattleTextBuff1[4] = gDisableStructs[gActiveBattler].perishSongTimer1; - gBattleTextBuff1[5] = 0xFF; - if (gDisableStructs[gActiveBattler].perishSongTimer1 == 0) - { - gStatuses3[gActiveBattler] &= ~(STATUS3_PERISH_SONG); - gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - gBattlescriptCurrInstr = BattleScript_PerishSongHits; - } - else - { - gDisableStructs[gActiveBattler].perishSongTimer1--; - gBattlescriptCurrInstr = BattleScript_PerishSongTimerGoesDown; - } - BattleScriptExecute(gBattlescriptCurrInstr); - return 1; - } - } - } - break; - } - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); - return 0; -} - -#define HandleFaintedMonActions_MAX_CASE 7 - -bool8 HandleFaintedMonActions(void) -{ - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - return 0; - do - { - int i; - switch (gBattleStruct->sub80173A4_Tracker) - { - case 0: - gBattleStruct->unk1605A = 0; - gBattleStruct->sub80173A4_Tracker++; - for (i = 0; i < gBattlersCount; i++) - { - if (gAbsentBattlerFlags & gBitTable[i] && !sub_8018018(i, 6, 6)) - gAbsentBattlerFlags &= ~(gBitTable[i]); - } - case 1: - do - { - gBank1 = gBankTarget = gBattleStruct->unk1605A; - if (gBattleMons[gBattleStruct->unk1605A].hp == 0 && !(gBattleStruct->unk16113 & gBitTable[gBattlerPartyIndexes[gBattleStruct->unk1605A]]) && !(gAbsentBattlerFlags & gBitTable[gBattleStruct->unk1605A])) - { - BattleScriptExecute(BattleScript_GiveExp); - gBattleStruct->sub80173A4_Tracker = 2; - return 1; - } - } while (++gBattleStruct->unk1605A != gBattlersCount); - gBattleStruct->sub80173A4_Tracker = 3; - break; - case 2: - sub_8015740(gBank1); - if (++gBattleStruct->unk1605A == gBattlersCount) - gBattleStruct->sub80173A4_Tracker = 3; - else - gBattleStruct->sub80173A4_Tracker = 1; - break; - case 3: - gBattleStruct->unk1605A = 0; - gBattleStruct->sub80173A4_Tracker++; - case 4: - do - { - gBank1 = gBankTarget = gBattleStruct->unk1605A; //or should banks be switched? - if (gBattleMons[gBattleStruct->unk1605A].hp == 0 && !(gAbsentBattlerFlags & gBitTable[gBattleStruct->unk1605A])) - { - BattleScriptExecute(BattleScript_HandleFaintedMon); - gBattleStruct->sub80173A4_Tracker = 5; - return 1; - } - } while (++gBattleStruct->unk1605A != gBattlersCount); - gBattleStruct->sub80173A4_Tracker = 6; - break; - case 5: - if (++gBattleStruct->unk1605A == gBattlersCount) - gBattleStruct->sub80173A4_Tracker = 6; - else - gBattleStruct->sub80173A4_Tracker = 4; - break; - case 6: - if (AbilityBattleEffects(9, 0, 0, 0, 0) || AbilityBattleEffects(0xB, 0, 0, 0, 0) || ItemBattleEffects(1, 0, 1) || AbilityBattleEffects(6, 0, 0, 0, 0)) - return 1; - gBattleStruct->sub80173A4_Tracker++; - break; - case 7: - break; - } - } while (gBattleStruct->sub80173A4_Tracker != HandleFaintedMonActions_MAX_CASE); - return 0; -} - -void TryClearRageStatuses(void) -{ - int i; - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].status2 & STATUS2_RAGE && gChosenMovesByBanks[i] != MOVE_RAGE) - gBattleMons[i].status2 &= ~(STATUS2_RAGE); - } -} - -#define ATKCANCELLER_MAX_CASE 14 - -u8 AtkCanceller_UnableToUseMove(void) -{ - u8 effect = 0; - s32* bideDmg = &gBattleStruct->bideDmg; - do - { - switch (gBattleStruct->atkCancellerTracker) - { - case 0: // flags clear - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_DESTINY_BOND); - gStatuses3[gBankAttacker] &= ~(STATUS3_GRUDGE); - gBattleStruct->atkCancellerTracker++; - break; - case 1: // check being asleep - if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) - { - if (UproarWakeUpCheck(gBankAttacker)) - { - gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP); - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); - BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; - effect = 2; - } - else - { - u8 toSub; - if (gBattleMons[gBankAttacker].ability == ABILITY_EARLY_BIRD) - toSub = 2; - else - toSub = 1; - if ((gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) < toSub) - gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP); - else - gBattleMons[gBankAttacker].status1 -= toSub; - if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) - { - if (gCurrentMove != MOVE_SNORE && gCurrentMove != MOVE_SLEEP_TALK) - { - gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 2; - } - } - else - { - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); - BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; - effect = 2; - } - } - } - gBattleStruct->atkCancellerTracker++; - break; - case 2: // check being frozen - if (gBattleMons[gBankAttacker].status1 & STATUS_FREEZE) - { - if (Random() % 5) - { - if (gBattleMoves[gCurrentMove].effect != EFFECT_THAW_HIT) // unfreezing via a move effect happens in case 13 - { - gBattlescriptCurrInstr = BattleScript_MoveUsedIsFrozen; - gHitMarker |= HITMARKER_NO_ATTACKSTRING; - } - else - { - gBattleStruct->atkCancellerTracker++; - break; - } - } - else // unfreeze - { - gBattleMons[gBankAttacker].status1 &= ~(STATUS_FREEZE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - effect = 2; - } - gBattleStruct->atkCancellerTracker++; - break; - case 3: // truant - if (gBattleMons[gBankAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBankAttacker].truantCounter) - { - CancelMultiTurnMoves(gBankAttacker); - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; - gMoveResultFlags |= MOVE_RESULT_MISSED; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case 4: // recharge - if (gBattleMons[gBankAttacker].status2 & STATUS2_RECHARGE) - { - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_RECHARGE); - gDisableStructs[gBankAttacker].rechargeCounter = 0; - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case 5: // flinch - if (gBattleMons[gBankAttacker].status2 & STATUS2_FLINCHED) - { - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_FLINCHED); - gProtectStructs[gBankAttacker].flinchImmobility = 1; - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case 6: // disabled move - if (gDisableStructs[gBankAttacker].disabledMove == gCurrentMove && gDisableStructs[gBankAttacker].disabledMove != 0) - { - gProtectStructs[gBankAttacker].usedDisabledMove = 1; - gBattleStruct->scriptingActive = gBankAttacker; - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case 7: // taunt - if (gDisableStructs[gBankAttacker].tauntTimer1 && gBattleMoves[gCurrentMove].power == 0) - { - gProtectStructs[gBankAttacker].usedTauntedMove = 1; - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case 8: // imprisoned - if (IsImprisoned(gBankAttacker, gCurrentMove)) - { - gProtectStructs[gBankAttacker].usedImprisionedMove = 1; - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case 9: // confusion - if (gBattleMons[gBankAttacker].status2 & STATUS2_CONFUSION) - { - gBattleMons[gBankAttacker].status2--; - if (gBattleMons[gBankAttacker].status2 & STATUS2_CONFUSION) - { - if (Random() & 1) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - BattleScriptPushCursor(); - } - else // confusion dmg - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBankTarget = gBankAttacker; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankAttacker], MOVE_POUND, 0, 40, 0, gBankAttacker, gBankAttacker); - gProtectStructs[gBankAttacker].confusionSelfDmg = 1; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - } - gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; - } - else // snapped out of confusion - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfusedNoMore; - } - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case 10: // paralysis - if (gBattleMons[gBankAttacker].status1 & STATUS_PARALYSIS && (Random() % 4) == 0) - { - gProtectStructs[gBankAttacker].prlzImmobility = 1; - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case 11: // infatuation - if (gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) - { - gBattleStruct->scriptingActive = CountTrailingZeroBits((gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) >> 0x10); - if (Random() & 1) - BattleScriptPushCursor(); - else - { - BattleScriptPush(BattleScript_MoveUsedIsParalyzedCantAttack); - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gProtectStructs[gBankAttacker].loveImmobility = 1; - CancelMultiTurnMoves(gBankAttacker); - } - gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case 12: // bide - if (gBattleMons[gBankAttacker].status2 & STATUS2_BIDE) - { - gBattleMons[gBankAttacker].status2 -= 0x100; - if (gBattleMons[gBankAttacker].status2 & STATUS2_BIDE) - gBattlescriptCurrInstr = BattleScript_BideStoringEnergy; - else - { - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS); - if (gTakenDmg[gBankAttacker]) - { - gCurrentMove = MOVE_BIDE; - *bideDmg = gTakenDmg[gBankAttacker] * 2; - gBankTarget = gTakenDmgBanks[gBankAttacker]; - if (gAbsentBattlerFlags & gBitTable[gBankTarget]) - gBankTarget = GetMoveTarget(MOVE_BIDE, 1); - gBattlescriptCurrInstr = BattleScript_BideAttack; - } - else - gBattlescriptCurrInstr = BattleScript_BideNoEnergyToAttack; - } - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case 13: // move thawing - if (gBattleMons[gBankAttacker].status1 & STATUS_FREEZE) - { - if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT) - { - gBattleMons[gBankAttacker].status1 &= ~(STATUS_FREEZE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - effect = 2; - } - gBattleStruct->atkCancellerTracker++; - break; - case 14: // last case - break; - } - - } while (gBattleStruct->atkCancellerTracker != ATKCANCELLER_MAX_CASE && effect == 0); - - if (effect == 2) - { - gActiveBattler = gBankAttacker; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - } - return effect; -} - -bool8 sub_8018018(u8 bank, u8 r1, u8 r2) -{ - struct Pokemon* party; - u8 r7; - u8 r6; - s32 i; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - return 0; - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - r7 = sub_803FC34(bank); - if (GetBattlerSide(bank) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - r6 = sub_803FBFC(r7); - for (i = r6 * 3; i < r6 * 3 + 3; i++) - { - if (GetMonData(&party[i], MON_DATA_HP) && GetMonData(&party[i], MON_DATA_SPECIES2) && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) - break; - } - return (i == r6 * 3 + 3); - } - else - { - if (GetBattlerSide(bank) == 1) - { - r7 = GetBattlerAtPosition(1); - r6 = GetBattlerAtPosition(3); - party = gEnemyParty; - } - else - { - r7 = GetBattlerAtPosition(0); - r6 = GetBattlerAtPosition(2); - party = gPlayerParty; - } - if (r1 == 6) - r1 = gBattlerPartyIndexes[r7]; - if (r2 == 6) - r2 = gBattlerPartyIndexes[r6]; - for (i = 0; i < 6; i++) - { - if (GetMonData(&party[i], MON_DATA_HP) && GetMonData(&party[i], MON_DATA_SPECIES2) && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG && i != r1 && i != r2 && i != ewram16068arr(r7) && i != ewram16068arr(r6)) - break; - } - return (i == 6); - } -} - -enum -{ - CASTFORM_NO_CHANGE, //0 - CASTFORM_TO_NORMAL, //1 - CASTFORM_TO_FIRE, //2 - CASTFORM_TO_WATER, //3 - CASTFORM_TO_ICE, //4 -}; - -u8 CastformDataTypeChange(u8 bank) -{ - u8 formChange = 0; - if (gBattleMons[bank].species != SPECIES_CASTFORM || gBattleMons[bank].ability != ABILITY_FORECAST || gBattleMons[bank].hp == 0) - return CASTFORM_NO_CHANGE; - if (!WEATHER_HAS_EFFECT && gBattleMons[bank].type1 != TYPE_NORMAL && gBattleMons[bank].type2 != TYPE_NORMAL) - { - gBattleMons[bank].type1 = TYPE_NORMAL; - gBattleMons[bank].type2 = TYPE_NORMAL; - return CASTFORM_TO_NORMAL; - } - if (!WEATHER_HAS_EFFECT) - return CASTFORM_NO_CHANGE; - if (!(gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SUN_ANY | WEATHER_HAIL)) && gBattleMons[bank].type1 != TYPE_NORMAL && gBattleMons[bank].type2 != TYPE_NORMAL) - { - gBattleMons[bank].type1 = TYPE_NORMAL; - gBattleMons[bank].type2 = TYPE_NORMAL; - formChange = CASTFORM_TO_NORMAL; - } - if (gBattleWeather & WEATHER_SUN_ANY && gBattleMons[bank].type1 != TYPE_FIRE && gBattleMons[bank].type2 != TYPE_FIRE) - { - gBattleMons[bank].type1 = TYPE_FIRE; - gBattleMons[bank].type2 = TYPE_FIRE; - formChange = CASTFORM_TO_FIRE; - } - if (gBattleWeather & WEATHER_RAIN_ANY && gBattleMons[bank].type1 != TYPE_WATER && gBattleMons[bank].type2 != TYPE_WATER) - { - gBattleMons[bank].type1 = TYPE_WATER; - gBattleMons[bank].type2 = TYPE_WATER; - formChange = CASTFORM_TO_WATER; - } - if (gBattleWeather & WEATHER_HAIL && gBattleMons[bank].type1 != TYPE_ICE && gBattleMons[bank].type2 != TYPE_ICE) - { - gBattleMons[bank].type1 = TYPE_ICE; - gBattleMons[bank].type2 = TYPE_ICE; - formChange = CASTFORM_TO_ICE; - } - return formChange; -} - -u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) -{ - u8 effect = 0; - struct Pokemon* pokeAtk; - struct Pokemon* pokeDef; - u16 speciesAtk; - u16 speciesDef; - u32 pidAtk; - u32 pidDef; - - if (gBankAttacker >= gBattlersCount) - gBankAttacker = bank; - if (GetBattlerSide(gBankAttacker) == 0) - pokeAtk = &gPlayerParty[gBattlerPartyIndexes[gBankAttacker]]; - else - pokeAtk = &gEnemyParty[gBattlerPartyIndexes[gBankAttacker]]; - - if (gBankTarget >= gBattlersCount) - gBankTarget = bank; - if (GetBattlerSide(gBankTarget) == 0) - pokeDef = &gPlayerParty[gBattlerPartyIndexes[gBankTarget]]; - else - pokeDef = &gEnemyParty[gBattlerPartyIndexes[gBankTarget]]; - - speciesAtk = GetMonData(pokeAtk, MON_DATA_SPECIES); - pidAtk = GetMonData(pokeAtk, MON_DATA_PERSONALITY); - - speciesDef = GetMonData(pokeDef, MON_DATA_SPECIES); - pidDef = GetMonData(pokeDef, MON_DATA_PERSONALITY); - - if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // why isn't that check done at the beginning? - { - u8 moveType; - s32 i; - u16 move; - u8 side; - u8 target1; - - if (special) - gLastUsedAbility = special; - else - gLastUsedAbility = gBattleMons[bank].ability; - - if (moveArg) - move = moveArg; - else - move = gCurrentMove; - - if (gBattleStruct->dynamicMoveType) - moveType = gBattleStruct->dynamicMoveType & 0x3F; - else - moveType = gBattleMoves[move].type; - - switch (caseID) - { - case ABILITYEFFECT_ON_SWITCHIN: // 0 - if (gBankAttacker >= gBattlersCount) - gBankAttacker = bank; - switch (gLastUsedAbility) - { - case 0xFF: //weather from overworld - switch (GetCurrentWeather()) - { - case WEATHER_RAIN_LIGHT: - case WEATHER_RAIN_MED: - case WEATHER_RAIN_HEAVY: - if (!(gBattleWeather & WEATHER_RAIN_ANY)) - { - gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT); - gBattleStruct->animArg1 = B_ANIM_RAIN_CONTINUES; - gBattleStruct->scriptingActive = bank; - effect++; - } - break; - case WEATHER_SANDSTORM: - if (!(gBattleWeather & WEATHER_SANDSTORM_ANY)) - { - gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); - gBattleStruct->animArg1 = B_ANIM_SANDSTORM_CONTINUES; - gBattleStruct->scriptingActive = bank; - effect++; - } - break; - case WEATHER_DROUGHT: - if (!(gBattleWeather & WEATHER_SUN_ANY)) - { - gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); - gBattleStruct->animArg1 = B_ANIM_SUN_CONTINUES; - gBattleStruct->scriptingActive = bank; - effect++; - } - break; - } - if (effect) - { - gBattleCommunication[MULTISTRING_CHOOSER] = GetCurrentWeather(); - BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); - } - break; - case ABILITY_DRIZZLE: - if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) - { - gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY); - BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); - gBattleStruct->scriptingActive = bank; - effect++; - } - break; - case ABILITY_SAND_STREAM: - if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT)) - { - gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); - BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); - gBattleStruct->scriptingActive = bank; - effect++; - } - break; - case ABILITY_DROUGHT: - if (!(gBattleWeather & WEATHER_SUN_PERMANENT)) - { - gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); - BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); - gBattleStruct->scriptingActive = bank; - effect++; - } - break; - case ABILITY_INTIMIDATE: - if (!(gSpecialStatuses[bank].intimidatedPoke)) - { - gStatuses3[bank] |= STATUS3_INTIMIDATE_POKES; - gSpecialStatuses[bank].intimidatedPoke = 1; - } - break; - case ABILITY_FORECAST: - effect = CastformDataTypeChange(bank); - if (effect != 0) - { - BattleScriptPushCursorAndCallback(BattleScript_CastformChange); - gBattleStruct->scriptingActive = bank; - gBattleStruct->castformToChangeInto = effect - 1; - } - break; - case ABILITY_TRACE: - if (!(gSpecialStatuses[bank].traced)) - { - gStatuses3[bank] |= STATUS3_TRACE; - gSpecialStatuses[bank].traced = 1; - } - break; - case ABILITY_CLOUD_NINE: - case ABILITY_AIR_LOCK: - { - // that's a weird choice for a variable, why not use i or bank? - for (target1 = 0; target1 < gBattlersCount; target1++) - { - effect = CastformDataTypeChange(target1); - if (effect != 0) - { - BattleScriptPushCursorAndCallback(BattleScript_CastformChange); - gBattleStruct->scriptingActive = target1; - gBattleStruct->castformToChangeInto = effect - 1; - break; - } - } - } - break; - } - break; - case ABILITYEFFECT_ENDTURN: // 1 - if (gBattleMons[bank].hp != 0) - { - gBankAttacker = bank; - switch (gLastUsedAbility) - { - case ABILITY_RAIN_DISH: - if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) - && gBattleMons[bank].maxHP > gBattleMons[bank].hp) - { - gLastUsedAbility = ABILITY_RAIN_DISH; // why - BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); - gBattleMoveDamage = gBattleMons[bank].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - effect++; - } - break; - case ABILITY_SHED_SKIN: - if ((gBattleMons[bank].status1 & STATUS_ANY) && (Random() % 3) == 0) - { - if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON)) - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - if (gBattleMons[bank].status1 & STATUS_SLEEP) - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - if (gBattleMons[bank].status1 & STATUS_PARALYSIS) - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - if (gBattleMons[bank].status1 & STATUS_BURN) - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - if (gBattleMons[bank].status1 & STATUS_FREEZE) - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - gBattleMons[bank].status1 = 0; - // BUG: The nightmare status does not get cleared here. This was fixed in Emerald. - //gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - gBattleStruct->scriptingActive = gActiveBattler = bank; - BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1); - MarkBufferBankForExecution(gActiveBattler); - effect++; - } - break; - case ABILITY_SPEED_BOOST: - if (gBattleMons[bank].statStages[STAT_STAGE_SPEED] < 0xC && gDisableStructs[bank].isFirstTurn != 2) - { - gBattleMons[bank].statStages[STAT_STAGE_SPEED]++; - gBattleStruct->animArg1 = 0x11; - gBattleStruct->animArg2 = 0; - BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates); - gBattleStruct->scriptingActive = bank; - effect++; - } - break; - case ABILITY_TRUANT: - gDisableStructs[gBankAttacker].truantCounter ^= 1; - break; - } - } - break; - case ABILITYEFFECT_MOVES_BLOCK: // 2 - if (gLastUsedAbility == ABILITY_SOUNDPROOF) - { - for (i = 0; gSoundMovesTable[i] != 0xFFFF; i++) - { - if (gSoundMovesTable[i] == move) - break; - } - if (gSoundMovesTable[i] != 0xFFFF) - { - if (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - gBattlescriptCurrInstr = BattleScript_SoundproofProtected; - effect = 1; - } - } - break; - case ABILITYEFFECT_ABSORBING: // 3 - if (move) - { - switch (gLastUsedAbility) - { - case ABILITY_VOLT_ABSORB: - if (moveType == TYPE_ELECTRIC && gBattleMoves[move].power != 0) - { - if (gProtectStructs[gBankAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_MoveHPDrain; - else - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; - effect = 1; - } - break; - case ABILITY_WATER_ABSORB: - if (moveType == TYPE_WATER && gBattleMoves[move].power != 0) - { - if (gProtectStructs[gBankAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_MoveHPDrain; - else - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; - effect = 1; - } - break; - case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE && !(gBattleMons[bank].status1 & STATUS_FREEZE)) - { - if (!(eFlashFireArr.arr[bank] & 1)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (gProtectStructs[gBankAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_FlashFireBoost; - else - gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; - eFlashFireArr.arr[bank] |= 1; - effect = 2; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - if (gProtectStructs[gBankAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_FlashFireBoost; - else - gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; - effect = 2; - } - } - break; - } - if (effect == 1) - { - if (gBattleMons[bank].maxHP == gBattleMons[bank].hp) - { - if ((gProtectStructs[gBankAttacker].notFirstStrike)) - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_FullHP; - else - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_FullHP_PPLoss; - } - else - { - gBattleMoveDamage = gBattleMons[bank].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - } - } - } - break; - case ABILITYEFFECT_CONTACT: // 4 - switch (gLastUsedAbility) - { - case ABILITY_COLOR_CHANGE: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && move != MOVE_STRUGGLE - && gBattleMoves[move].power != 0 - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && gBattleMons[bank].type1 != moveType - && gBattleMons[bank].type2 != moveType - && gBattleMons[bank].hp != 0) - { - gBattleMons[bank].type1 = moveType; - gBattleMons[bank].type2 = moveType; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = moveType; - gBattleTextBuff1[3] = 0xFF; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ColorChangeActivates; - effect++; - } - break; - case ABILITY_ROUGH_SKIN: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & F_MAKES_CONTACT)) - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RoughSkinActivates; - effect++; - } - break; - case ABILITY_EFFECT_SPORE: - if (DEBUG && (gUnknown_02023A14_50 & 4)) - { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & F_MAKES_CONTACT)) - { - do - { - gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; - } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); - if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3) - gBattleCommunication[MOVE_EFFECT_BYTE] += 2; - gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - } - else - { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & F_MAKES_CONTACT) - && (Random() % 10) == 0) - { - do - { - gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; - } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); - if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3) - gBattleCommunication[MOVE_EFFECT_BYTE] += 2; - gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - } - break; - case ABILITY_POISON_POINT: - if (DEBUG && (gUnknown_02023A14_50 & 4)) - { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & F_MAKES_CONTACT)) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - } - else - { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & F_MAKES_CONTACT) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - } - break; - case ABILITY_STATIC: - if (DEBUG && (gUnknown_02023A14_50 & 4)) - { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & F_MAKES_CONTACT)) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - } - else - { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & F_MAKES_CONTACT) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - } - break; - case ABILITY_FLAME_BODY: - if (DEBUG && (gUnknown_02023A14_50 & 4)) - { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & F_MAKES_CONTACT) - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - } - else - { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & F_MAKES_CONTACT) - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - } - break; - case ABILITY_CUTE_CHARM: - if (DEBUG && (gUnknown_02023A14_50 & 4)) - { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & F_MAKES_CONTACT) - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && gBattleMons[gBankTarget].hp != 0 - && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS - && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) - && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) - && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF - && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF) - { - gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; - effect++; - } - } - else - { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & F_MAKES_CONTACT) - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && gBattleMons[gBankTarget].hp != 0 - && (Random() % 3) == 0 - && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS - && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) - && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) - && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF - && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF) - { - gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; - effect++; - } - } - break; - } - break; - case ABILITYEFFECT_IMMUNITY: // 5 - { - for (bank = 0; bank < gBattlersCount; bank++) - { - switch (gBattleMons[bank].ability) - { - case ABILITY_IMMUNITY: - if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | 0xF00)) // TODO: what is 0xF00? - { - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - effect = 1; - } - break; - case ABILITY_OWN_TEMPO: - if (gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - effect = 2; - } - break; - case ABILITY_LIMBER: - if (gBattleMons[bank].status1 & STATUS_PARALYSIS) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - effect = 1; - } - break; - case ABILITY_INSOMNIA: - case ABILITY_VITAL_SPIRIT: - if (gBattleMons[bank].status1 & STATUS_SLEEP) - { - gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - effect = 1; - } - break; - case ABILITY_WATER_VEIL: - if (gBattleMons[bank].status1 & STATUS_BURN) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - effect = 1; - } - break; - case ABILITY_MAGMA_ARMOR: - if (gBattleMons[bank].status1 & STATUS_FREEZE) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - effect = 1; - } - break; - case ABILITY_OBLIVIOUS: - if (gBattleMons[bank].status2 & STATUS2_INFATUATION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - effect = 3; - } - break; - } - if (effect) - { - switch (effect) - { - case 1: // status cleared - gBattleMons[bank].status1 = 0; - break; - case 2: // get rid of confusion - gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - break; - case 3: // get rid of infatuation - gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); - break; - } - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; - gBattleStruct->scriptingActive = bank; - gActiveBattler = bank; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - return effect; - } - } - } - break; - case ABILITYEFFECT_FORECAST: // 6 - { - for (bank = 0; bank < gBattlersCount; bank++) - { - if (gBattleMons[bank].ability == ABILITY_FORECAST) - { - effect = CastformDataTypeChange(bank); - if (effect) - { - BattleScriptPushCursorAndCallback(BattleScript_CastformChange); - gBattleStruct->scriptingActive = bank; - gBattleStruct->castformToChangeInto = effect - 1; - return effect; - } - } - } - } - break; - case ABILITYEFFECT_SYNCHRONIZE: // 7 - if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) - { - gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); - gBattleStruct->synchroniseEffect &= 0x3F; - if (gBattleStruct->synchroniseEffect == 6) - gBattleStruct->synchroniseEffect = 2; - gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchroniseEffect + 0x40; - gBattleStruct->scriptingActive = gBankTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8 - if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) - { - gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); - gBattleStruct->synchroniseEffect &= 0x3F; - if (gBattleStruct->synchroniseEffect == 6) - gBattleStruct->synchroniseEffect = 2; - gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchroniseEffect; - gBattleStruct->scriptingActive = gBankAttacker; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITYEFFECT_INTIMIDATE1: // 9 - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES) - { - gLastUsedAbility = ABILITY_INTIMIDATE; - gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); - BattleScriptPushCursorAndCallback(gUnknown_081D978C); - gBattleStruct->intimidateBank = i; - effect++; - break; - } - } - break; - case ABILITYEFFECT_TRACE: // 11 - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE)) - { - u8 target2; - side = (GetBattlerPosition(i) ^ 1) & 1; - target1 = GetBattlerAtPosition(side); - target2 = GetBattlerAtPosition(side + 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0 - && gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) - { - gActiveBattler = GetBattlerAtPosition(((Random() & 1) * 2) | side); - gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; - effect++; - } - else if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0) - { - gActiveBattler = target1; - gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; - effect++; - } - else if (gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) - { - gActiveBattler = target2; - gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; - effect++; - } - } - else - { - gActiveBattler = target1; - if (gBattleMons[target1].ability && gBattleMons[target1].hp) - { - gBattleMons[i].ability = gBattleMons[target1].ability; - gLastUsedAbility = gBattleMons[target1].ability; - effect++; - } - } - if (effect) - { - BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); - gStatuses3[i] &= ~(STATUS3_TRACE); - gBattleStruct->scriptingActive = i; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = gActiveBattler; - gBattleTextBuff1[3] = gBattlerPartyIndexes[gActiveBattler]; - gBattleTextBuff1[4] = EOS; - - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 9; - gBattleTextBuff2[2] = gLastUsedAbility; - gBattleTextBuff2[3] = EOS; - break; - } - } - } - break; - case ABILITYEFFECT_INTIMIDATE2: // 10 - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES)) - { - gLastUsedAbility = ABILITY_INTIMIDATE; - gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = gUnknown_081D9795; - gBattleStruct->intimidateBank = i; - effect++; - break; - } - } - break; - case ABILITYEFFECT_CHECK_OTHER_SIDE: // 12 - side = GetBattlerSide(bank); - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - case ABILITYEFFECT_CHECK_BANK_SIDE: // 13 - side = GetBattlerSide(bank); - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerSide(i) == side && gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - case ABILITYEFFECT_FIELD_SPORT: // 14 - switch (gLastUsedAbility) - { - case 0xFD: - for (i = 0; i < gBattlersCount; i++) - { - if (gStatuses3[i] & STATUS3_MUDSPORT) - effect = i + 1; - } - break; - case 0xFE: - for (i = 0; i < gBattlersCount; i++) - { - if (gStatuses3[i] & STATUS3_WATERSPORT) - effect = i + 1; - } - break; - default: - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - } - break; - case ABILITYEFFECT_CHECK_ON_FIELD: // 19 - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ability && gBattleMons[i].hp != 0) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK: // 15 - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ability && i != bank) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - case ABILITYEFFECT_COUNT_OTHER_SIZE: // 16 - side = GetBattlerSide(bank); - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect++; - } - } - break; - case ABILITYEFFECT_COUNT_BANK_SIDE: // 17 - side = GetBattlerSide(bank); - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerSide(i) == side && gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect++; - } - } - break; - case ABILITYEFFECT_COUNT_ON_FIELD: // 18 - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ability && i != bank) - { - gLastUsedAbility = ability; - effect++; - } - } - break; - } - if (effect && caseID < 0xC && gLastUsedAbility != 0xFF) - RecordAbilityBattle(bank, gLastUsedAbility); - } - - return effect; -} - -void BattleScriptExecute(const u8* BS_ptr) -{ - gBattlescriptCurrInstr = BS_ptr; - B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc; - gBattleMainFunc = RunBattleScriptCommands_PopCallbacksStack; - gCurrentActionFuncId = 0; -} - -void BattleScriptPushCursorAndCallback(u8* BS_ptr) -{ - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BS_ptr; - B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc; - gBattleMainFunc = RunBattleScriptCommands; -} - -enum -{ - ITEM_NO_EFFECT, // 0 - ITEM_STATUS_CHANGE, // 1 - ITEM_EFFECT_OTHER, // 2 - ITEM_PP_CHANGE, // 3 - ITEM_HP_CHANGE, // 4 - ITEM_STATS_CHANGE, // 5 -}; - -enum -{ - FLAVOR_SPICY, // 0 - FLAVOR_DRY, // 1 - FLAVOR_SWEET, // 2 - FLAVOR_BITTER, // 3 - FLAVOR_SOUR, // 4 -}; - -u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) -{ - int i = 0; - u8 effect = ITEM_NO_EFFECT; - u8 changedPP = 0; - u8 bankHoldEffect, atkHoldEffect, defHoldEffect; - u8 bankQuality, atkQuality, defQuality; - u16 atkItem, defItem; - - gLastUsedItem = gBattleMons[bank].item; - if (gLastUsedItem == ITEM_ENIGMA_BERRY) - { - bankHoldEffect = gEnigmaBerries[bank].holdEffect; - bankQuality = gEnigmaBerries[bank].holdEffectParam; - } - else - { - bankHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); - bankQuality = ItemId_GetHoldEffectParam(gLastUsedItem); - } - - atkItem = gBattleMons[gBankAttacker].item; - if (atkItem == ITEM_ENIGMA_BERRY) - { - atkHoldEffect = gEnigmaBerries[gBankAttacker].holdEffect; - atkQuality = gEnigmaBerries[gBankAttacker].holdEffectParam; - } - else - { - atkHoldEffect = ItemId_GetHoldEffect(atkItem); - atkQuality = ItemId_GetHoldEffectParam(atkItem); - } - - // def variables are unused - defItem = gBattleMons[gBankTarget].item; - if (defItem == ITEM_ENIGMA_BERRY) - { - defHoldEffect = gEnigmaBerries[gBankTarget].holdEffect; - defQuality = gEnigmaBerries[gBankTarget].holdEffectParam; - } - else - { - defHoldEffect = ItemId_GetHoldEffect(defItem); - defQuality = ItemId_GetHoldEffectParam(defItem); - } - - switch (caseID) - { - case 0: - switch (bankHoldEffect) - { - case HOLD_EFFECT_DOUBLE_PRIZE: - gBattleStruct->moneyMultiplier = 2; - break; - case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < 8; i++) - { - if (gBattleMons[bank].statStages[i] < 6) - { - gBattleMons[bank].statStages[i] = 6; - effect = ITEM_STATS_CHANGE; - } - } - if (effect) - { - gBattleStruct->scriptingActive = bank; - gStringBank = bank; - gActiveBattler = gBankAttacker = bank; - BattleScriptExecute(BattleScript_WhiteHerbEnd2); - } - break; - } - break; - case 1: - if (gBattleMons[bank].hp) - { - switch (bankHoldEffect) - { - case HOLD_EFFECT_RESTORE_HP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) - { - gBattleMoveDamage = bankQuality; - if (gBattleMons[bank].hp + bankQuality > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = 4; - } - break; - case HOLD_EFFECT_RESTORE_PP: - if (!moveTurn) - { - struct Pokemon* poke; - u8 ppBonuses; - u16 move; - - if (GetBattlerSide(bank) == 0) - poke = &gPlayerParty[gBattlerPartyIndexes[bank]]; - else - poke = &gEnemyParty[gBattlerPartyIndexes[bank]]; - for (i = 0; i < 4; i++) - { - move = GetMonData(poke, MON_DATA_MOVE1 + i); - changedPP = GetMonData(poke, MON_DATA_PP1 + i); - ppBonuses = GetMonData(poke, MON_DATA_PP_BONUSES); - if (move && changedPP == 0) - break; - } - if (i != 4) - { - u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i); - if (changedPP + bankQuality > maxPP) - changedPP = maxPP; - else - changedPP = changedPP + bankQuality; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = move; - gBattleTextBuff1[3] = move >> 8; - gBattleTextBuff1[4] = 0xFF; - BattleScriptExecute(BattleScript_BerryPPHealEnd2); - EmitSetMonData(0, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); - MarkBufferBankForExecution(gActiveBattler); - effect = ITEM_PP_CHANGE; - } - } - break; - case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < 8; i++) - { - if (gBattleMons[bank].statStages[i] < 6) - { - gBattleMons[bank].statStages[i] = 6; - effect = ITEM_STATS_CHANGE; - } - } - if (effect) - { - gBattleStruct->scriptingActive = bank; - gStringBank = bank; - gActiveBattler = gBankAttacker = bank; - BattleScriptExecute(BattleScript_WhiteHerbEnd2); - } - break; - case HOLD_EFFECT_LEFTOVERS: - if (gBattleMons[bank].hp < gBattleMons[bank].maxHP && !moveTurn) - { - gBattleMoveDamage = gBattleMons[bank].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - BattleScriptExecute(BattleScript_ItemHealHP_End2); - effect = ITEM_HP_CHANGE; - RecordItemBattle(bank, bankHoldEffect); - } - break; - // nice copy/paste there gamefreak, making a function for confuse berries was too much eh? - case HOLD_EFFECT_CONFUSE_SPICY: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 8; - gBattleTextBuff1[2] = FLAVOR_SPICY; - gBattleTextBuff1[3] = EOS; - gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SPICY) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } - break; - case HOLD_EFFECT_CONFUSE_DRY: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 8; - gBattleTextBuff1[2] = FLAVOR_DRY; - gBattleTextBuff1[3] = EOS; - gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_DRY) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } - break; - case HOLD_EFFECT_CONFUSE_SWEET: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 8; - gBattleTextBuff1[2] = FLAVOR_SWEET; - gBattleTextBuff1[3] = EOS; - gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SWEET) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } - break; - case HOLD_EFFECT_CONFUSE_BITTER: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 8; - gBattleTextBuff1[2] = FLAVOR_BITTER; - gBattleTextBuff1[3] = EOS; - gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_BITTER) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } - break; - case HOLD_EFFECT_CONFUSE_SOUR: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 8; - gBattleTextBuff1[2] = FLAVOR_SOUR; - gBattleTextBuff1[3] = EOS; - gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SOUR) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } - break; - // copy/paste again, smh - case HOLD_EFFECT_ATTACK_UP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_ATK] < 0xC) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = STAT_STAGE_ATK; - gBattleTextBuff1[3] = EOS; - - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = 0xD2; - gBattleTextBuff2[3] = 0xD2 >> 8; - gBattleTextBuff2[4] = EOS; - - gEffectBank = bank; - gBattleStruct->statChanger = 0x10 + STAT_STAGE_ATK; - gBattleStruct->animArg1 = 0xE + STAT_STAGE_ATK; - gBattleStruct->animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - break; - case HOLD_EFFECT_DEFENSE_UP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_DEF] < 0xC) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = STAT_STAGE_DEF; - gBattleTextBuff1[3] = EOS; - - gEffectBank = bank; - gBattleStruct->statChanger = 0x10 + STAT_STAGE_DEF; - gBattleStruct->animArg1 = 0xE + STAT_STAGE_DEF; - gBattleStruct->animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - break; - case HOLD_EFFECT_SPEED_UP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_SPEED] < 0xC) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = STAT_STAGE_SPEED; - gBattleTextBuff1[3] = EOS; - - gEffectBank = bank; - gBattleStruct->statChanger = 0x10 + STAT_STAGE_SPEED; - gBattleStruct->animArg1 = 0xE + STAT_STAGE_SPEED; - gBattleStruct->animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - break; - case HOLD_EFFECT_SP_ATTACK_UP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_SPATK] < 0xC) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = STAT_STAGE_SPATK; - gBattleTextBuff1[3] = EOS; - - gEffectBank = bank; - gBattleStruct->statChanger = 0x10 + STAT_STAGE_SPATK; - gBattleStruct->animArg1 = 0xE + STAT_STAGE_SPATK; - gBattleStruct->animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - break; - case HOLD_EFFECT_SP_DEFENSE_UP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_SPDEF] < 0xC) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = STAT_STAGE_SPDEF; - gBattleTextBuff1[3] = EOS; - - gEffectBank = bank; - gBattleStruct->statChanger = 0x10 + STAT_STAGE_SPDEF; - gBattleStruct->animArg1 = 0xE + STAT_STAGE_SPDEF; - gBattleStruct->animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - break; - case HOLD_EFFECT_CRITICAL_UP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && !(gBattleMons[bank].status2 & STATUS2_FOCUS_ENERGY)) - { - gBattleMons[bank].status2 |= STATUS2_FOCUS_ENERGY; - BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_RANDOM_STAT_UP: - if (!moveTurn && gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality) - { - for (i = 0; i < 5; i++) - { - if (gBattleMons[bank].statStages[STAT_STAGE_ATK + i] < 0xC) - break; - } - if (i != 5) - { - do - { - i = Random() % 5; - } while (gBattleMons[bank].statStages[STAT_STAGE_ATK + i] == 0xC); - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = i + 1; - gBattleTextBuff1[3] = EOS; - - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = 0xD1; - gBattleTextBuff2[3] = 0xD1 >> 8; - gBattleTextBuff2[4] = 0; - gBattleTextBuff2[5] = 0xD2; - gBattleTextBuff2[6] = 0xD2 >> 8; - gBattleTextBuff2[7] = EOS; - - gEffectBank = bank; - gBattleStruct->statChanger = 0x21 + i; - gBattleStruct->animArg1 = 0x21 + i + 6; - gBattleStruct->animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - } - break; - case HOLD_EFFECT_CURE_PAR: - if (gBattleMons[bank].status1 & STATUS_PARALYSIS) - { - gBattleMons[bank].status1 &= ~(STATUS_PARALYSIS); - BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[bank].status1 & STATUS_PSN_ANY) - { - gBattleMons[bank].status1 &= ~(STATUS_PSN_ANY | STATUS_TOXIC_COUNTER); - BattleScriptExecute(BattleScript_BerryCurePsnEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_BRN: - if (gBattleMons[bank].status1 & STATUS_BURN) - { - gBattleMons[bank].status1 &= ~(STATUS_BURN); - BattleScriptExecute(BattleScript_BerryCureBrnEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_FRZ: - if (gBattleMons[bank].status1 & STATUS_FREEZE) - { - gBattleMons[bank].status1 &= ~(STATUS_FREEZE); - BattleScriptExecute(BattleScript_BerryCureFrzEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_SLP: - if (gBattleMons[bank].status1 & STATUS_SLEEP) - { - gBattleMons[bank].status1 &= ~(STATUS_SLEEP); - gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - BattleScriptExecute(BattleScript_BerryCureSlpEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - BattleScriptExecute(BattleScript_BerryCureConfusionEnd2); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_CURE_STATUS: - if (gBattleMons[bank].status1 & STATUS_ANY || gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - i = 0; - if (gBattleMons[bank].status1 & STATUS_PSN_ANY) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - i++; - } - if (gBattleMons[bank].status1 & STATUS_SLEEP) - { - gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - i++; - } - if (gBattleMons[bank].status1 & STATUS_PARALYSIS) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - i++; - } - if (gBattleMons[bank].status1 & STATUS_BURN) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - i++; - } - if (gBattleMons[bank].status1 & STATUS_FREEZE) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - i++; - } - if (gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - i++; - } - if (!(i > 1)) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattleMons[bank].status1 = 0; - gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_ATTRACT: - if (gBattleMons[bank].status2 & STATUS2_INFATUATION) - { - gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - effect = ITEM_EFFECT_OTHER; - } - break; - } - if (effect) - { - gBattleStruct->scriptingActive = bank; - gStringBank = bank; - gActiveBattler = gBankAttacker = bank; - switch (effect) - { - case ITEM_STATUS_CHANGE: - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1); - MarkBufferBankForExecution(gActiveBattler); - break; - case ITEM_PP_CHANGE: - if (!(gBattleMons[bank].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[bank].unk18_b & gBitTable[i])) - gBattleMons[bank].pp[i] = changedPP; - break; - } - } - } - break; - case 2: - break; - case 3: - for (bank = 0; bank < gBattlersCount; bank++) - { - gLastUsedItem = gBattleMons[bank].item; - if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY) - { - bankHoldEffect = gEnigmaBerries[bank].holdEffect; - bankQuality = gEnigmaBerries[bank].holdEffectParam; - } - else - { - bankHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); - bankQuality = ItemId_GetHoldEffectParam(gLastUsedItem); - } - switch (bankHoldEffect) - { - case HOLD_EFFECT_CURE_PAR: - if (gBattleMons[bank].status1 & STATUS_PARALYSIS) - { - gBattleMons[bank].status1 &= ~(STATUS_PARALYSIS); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureParRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[bank].status1 & STATUS_PSN_ANY) - { - gBattleMons[bank].status1 &= ~(STATUS_PSN_ANY | STATUS_TOXIC_COUNTER); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCurePsnRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_BRN: - if (gBattleMons[bank].status1 & STATUS_BURN) - { - gBattleMons[bank].status1 &= ~(STATUS_BURN); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_FRZ: - if (gBattleMons[bank].status1 & STATUS_FREEZE) - { - gBattleMons[bank].status1 &= ~(STATUS_FREEZE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_SLP: - if (gBattleMons[bank].status1 & STATUS_SLEEP) - { - gBattleMons[bank].status1 &= ~(STATUS_SLEEP); - gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet; - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_CURE_ATTRACT: - if (gBattleMons[bank].status2 & STATUS2_INFATUATION) - { - gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_CURE_STATUS: - if (gBattleMons[bank].status1 & STATUS_ANY || gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - if (gBattleMons[bank].status1 & STATUS_PSN_ANY) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - } - if (gBattleMons[bank].status1 & STATUS_SLEEP) - { - gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - } - if (gBattleMons[bank].status1 & STATUS_PARALYSIS) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - } - if (gBattleMons[bank].status1 & STATUS_BURN) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - } - if (gBattleMons[bank].status1 & STATUS_FREEZE) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - } - if (gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - } - gBattleMons[bank].status1 = 0; - gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < 8; i++) - { - if (gBattleMons[bank].statStages[i] < 6) - { - gBattleMons[bank].statStages[i] = 6; - effect = ITEM_STATS_CHANGE; - } - } - if (effect) - { - gBattleStruct->scriptingActive = bank; - gStringBank = bank; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WhiteHerbRet; - return effect; // unnecessary return - } - break; - } - if (effect) - { - gBattleStruct->scriptingActive = bank; - gStringBank = bank; - gActiveBattler = bank; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - break; - } - } - break; - case 4: - if (gBattleMoveDamage) - { - switch (atkHoldEffect) - { - case HOLD_EFFECT_FLINCH: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (Random() % 100) < bankQuality - && gBattleMoves[gCurrentMove].flags & F_AFFECTED_BY_KINGS_ROCK - && gBattleMons[gBankTarget].hp) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 8; - BattleScriptPushCursor(); - SetMoveEffect(0, 0); - BattleScriptPop(); - } - break; - case HOLD_EFFECT_SHELL_BELL: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gSpecialStatuses[gBankTarget].moveturnLostHP != 0 - && gSpecialStatuses[gBankTarget].moveturnLostHP != 0xFFFF - && gBankAttacker != gBankTarget - && gBattleMons[gBankAttacker].hp != gBattleMons[gBankAttacker].maxHP - && gBattleMons[gBankAttacker].hp != 0) - { - gLastUsedItem = atkItem; - gStringBank = gBankAttacker; - gBattleStruct->scriptingActive = gBankAttacker; - gBattleMoveDamage = (gSpecialStatuses[gBankTarget].moveturnLostHP / atkQuality) * -1; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = -1; - gSpecialStatuses[gBankTarget].moveturnLostHP = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret; - effect++; - } - break; - } - } - break; - } - - return effect; -} - -struct CombinedMove -{ - u16 move1; - u16 move2; - u16 newMove; -}; - -static const struct CombinedMove sCombinedMoves[2] = -{ - {MOVE_EMBER, MOVE_GUST, MOVE_HEAT_WAVE}, - {0xFFFF, 0xFFFF, 0xFFFF} -}; - -void unref_sub_801B40C(void) -{ - int i = 0; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - do - { - u8 bank = 0; - do - { - u8 absent = gAbsentBattlerFlags; - if (gBitTable[bank] & absent || absent & gBitTable[bank + 2]) - bank++; - else - { - if (sCombinedMoves[i].move1 == gChosenMovesByBanks[bank] && sCombinedMoves[i].move2 == gChosenMovesByBanks[bank + 2]) - { - gSideTimers[GetBattlerPosition(bank) & 1].field3 = (bank) | ((bank + 2) << 4); - gSideTimers[GetBattlerPosition(bank) & 1].field4 = sCombinedMoves[i].newMove; - gSideAffecting[GetBattlerPosition(bank) & 1] |= SIDE_STATUS_X4; - } - if (sCombinedMoves[i].move1 == gChosenMovesByBanks[bank + 2] && sCombinedMoves[i].move2 == gChosenMovesByBanks[bank]) - { - gSideTimers[GetBattlerPosition(bank) & 1].field3 = (bank + 2) | ((bank) << 4); - gSideTimers[GetBattlerPosition(bank) & 1].field4 = sCombinedMoves[i].newMove; - gSideAffecting[GetBattlerPosition(bank) & 1] |= SIDE_STATUS_X4; - } - bank++; - } - } while (bank < 2); - i++; - } while (sCombinedMoves[i].move1 != 0xFFFF); - } -} - -void sub_801B594(void) -{ - if (gBattleExecBuffer == 0) - gBattleScriptingCommandsTable[*gBattlescriptCurrInstr](); -} - -u8 GetMoveTarget(u16 move, u8 useMoveTarget) //get move target -{ - u8 targetBank = 0; - u8 moveTarget; - u8 side; - - if (useMoveTarget) - moveTarget = useMoveTarget - 1; - else - moveTarget = gBattleMoves[move].target; - - switch (moveTarget) - { - case 0: - side = GetBattlerSide(gBankAttacker) ^ 1; - if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) - targetBank = gSideTimers[side].followmeTarget; - else - { - side = GetBattlerSide(gBankAttacker); - do - { - targetBank = Random() % gBattlersCount; - } while (targetBank == gBankAttacker || side == GetBattlerSide(targetBank) || gAbsentBattlerFlags & gBitTable[targetBank]); - if (gBattleMoves[move].type == TYPE_ELECTRIC - && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIZE, gBankAttacker, ABILITY_LIGHTNING_ROD, 0, 0) - && gBattleMons[targetBank].ability != ABILITY_LIGHTNING_ROD) - { - targetBank ^= 2; - RecordAbilityBattle(targetBank, gBattleMons[targetBank].ability); - gSpecialStatuses[targetBank].lightningRodRedirected = 1; - } - } - break; - case 1: - case 8: - case 32: - case 64: - targetBank = GetBattlerAtPosition((GetBattlerPosition(gBankAttacker) & 1) ^ 1); - if (gAbsentBattlerFlags & gBitTable[targetBank]) - targetBank ^= 2; - break; - case 4: - side = GetBattlerSide(gBankAttacker) ^ 1; - if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) - targetBank = gSideTimers[side].followmeTarget; - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & 4) - { - if (GetBattlerSide(gBankAttacker) == 0) - { - if (Random() & 1) - targetBank = GetBattlerAtPosition(1); - else - targetBank = GetBattlerAtPosition(3); - } - else - { - if (Random() & 1) - targetBank = GetBattlerAtPosition(0); - else - targetBank = GetBattlerAtPosition(2); - } - if (gAbsentBattlerFlags & gBitTable[targetBank]) - targetBank ^= 2; - } - else - targetBank = GetBattlerAtPosition((GetBattlerPosition(gBankAttacker) & 1) ^ 1); - break; - case 2: - case 16: - targetBank = gBankAttacker; - break; - } - ewram16010arr(gBankAttacker) = targetBank; - return targetBank; -} - -u8 IsMonDisobedient(void) -{ - u8 obedienceLevel; - s32 rnd; - s32 calc; - - if (gBattleTypeFlags & BATTLE_TYPE_LINK - || GetBattlerSide(gBankAttacker) == 1 - || !IsOtherTrainer(gBattleMons[gBankAttacker].otId, gBattleMons[gBankAttacker].otName)) - return 0; - - if (DEBUG && (gUnknown_02023A14_50 & 0x40)) - { - obedienceLevel = 10; - } - else - { - if (FlagGet(FLAG_BADGE08_GET)) - return 0; - obedienceLevel = 10; - if (FlagGet(FLAG_BADGE02_GET)) - obedienceLevel = 30; - if (FlagGet(FLAG_BADGE04_GET)) - obedienceLevel = 50; - if (FlagGet(FLAG_BADGE06_GET)) - obedienceLevel = 70; - } - - if (gBattleMons[gBankAttacker].level <= obedienceLevel) - return 0; - rnd = (Random() & 255); - calc = (gBattleMons[gBankAttacker].level + obedienceLevel) * rnd >> 8; - if (calc < obedienceLevel) - return 0; - - // is not obedient - if (gCurrentMove == MOVE_RAGE) - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_RAGE); - if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP && (gCurrentMove == MOVE_SNORE || gCurrentMove == MOVE_SLEEP_TALK)) - { - gBattlescriptCurrInstr = gUnknown_081D995F; - return 1; - } - - rnd = (Random() & 255); - calc = (gBattleMons[gBankAttacker].level + obedienceLevel) * rnd >> 8; - if (calc < obedienceLevel) - { - calc = CheckMoveLimitations(gBankAttacker, gBitTable[gCurrMovePos], 0xFF); - if (calc == 0xF) // all moves cannot be used - { - gBattleCommunication[MULTISTRING_CHOOSER] = Random() & 3; - gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; - return 1; - } - else // use a random move - { - do - { - gCurrMovePos = gUnknown_02024BE5 = Random() & 3; - } while (gBitTable[gCurrMovePos] & calc); - gRandomMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; - gBattleCommunication[3] = 0; - gDynamicBasePower = 0; - gBattleStruct->dynamicMoveType = 0; - gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; - gBankTarget = GetMoveTarget(gRandomMove, 0); - gHitMarker |= HITMARKER_x200000; - return 2; - } - } - else - { - obedienceLevel = gBattleMons[gBankAttacker].level - obedienceLevel; - - calc = (Random() & 255); - if (calc < obedienceLevel && !(gBattleMons[gBankAttacker].status1 & STATUS_ANY) && gBattleMons[gBankAttacker].ability != ABILITY_VITAL_SPIRIT && gBattleMons[gBankAttacker].ability != ABILITY_INSOMNIA) - { - // try putting asleep - int i; - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].status2 & STATUS2_UPROAR) - break; - } - if (i == gBattlersCount) - { - gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; - return 1; - } - } - calc -= obedienceLevel; - if (calc < obedienceLevel) - { - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankAttacker], MOVE_POUND, 0, 40, 0, gBankAttacker, gBankAttacker); - gBankTarget = gBankAttacker; - gBattlescriptCurrInstr = gUnknown_081D99A0; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return 2; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = Random() & 3; - gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; - return 1; - } - } -} diff --git a/src/battle/calculate_base_damage.c b/src/battle/calculate_base_damage.c deleted file mode 100644 index e4ae70c0b..000000000 --- a/src/battle/calculate_base_damage.c +++ /dev/null @@ -1,338 +0,0 @@ -#include "global.h" -#include "constants/abilities.h" -#include "constants/battle_move_effects.h" -#include "constants/hold_effects.h" -#include "constants/items.h" -#include "constants/moves.h" -#include "constants/species.h" -#include "battle.h" -#include "berry.h" -#include "data2.h" -#include "event_data.h" -#include "item.h" -#include "pokemon.h" -#include "ewram.h" - -extern u16 gBattleTypeFlags; -extern struct BattlePokemon gBattleMons[4]; -extern u16 gCurrentMove; -extern u8 gCritMultiplier; -extern u16 gBattleWeather; -extern struct BattleEnigmaBerry gEnigmaBerries[]; -extern u16 gBattleMovePower; -extern u16 gTrainerBattleOpponent; - -// Masks for getting PP Up count, also PP Max values -const u8 gPPUpReadMasks[] = {0x03, 0x0c, 0x30, 0xc0}; - -// Masks for setting PP Up count -const u8 gPPUpWriteMasks[] = {0xFC, 0xF3, 0xCF, 0x3F}; - -// Values added to PP Up count -const u8 gPPUpValues[] = {0x01, 0x04, 0x10, 0x40}; - -const u8 gStatStageRatios[][2] = -{ - {10, 40}, // -6 - {10, 35}, // -5 - {10, 30}, // -4 - {10, 25}, // -3 - {10, 20}, // -2 - {10, 15}, // -1 - {10, 10}, // 0 - {15, 10}, // 1 - {20, 10}, // 2 - {25, 10}, // 3 - {30, 10}, // 4 - {35, 10}, // 5 - {40, 10} // 6 -}; - -const u8 unknownGameFreakAbbrev_820825E[] = _("ゲーフリ"); - -const u8 gHoldEffectToType[][2] = -{ - {HOLD_EFFECT_BUG_POWER, TYPE_BUG}, - {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL}, - {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND}, - {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK}, - {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS}, - {HOLD_EFFECT_DARK_POWER, TYPE_DARK}, - {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING}, - {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC}, - {HOLD_EFFECT_WATER_POWER, TYPE_WATER}, - {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING}, - {HOLD_EFFECT_POISON_POWER, TYPE_POISON}, - {HOLD_EFFECT_ICE_POWER, TYPE_ICE}, - {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST}, - {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC}, - {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE}, - {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON}, - {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL} -}; - -u8 GetBattlerSide(u8 bank); - -#define APPLY_STAT_MOD(var, mon, stat, statIndex) \ -{ \ - (var) = (stat) * (gStatStageRatios)[(mon)->statStages[(statIndex)]][0]; \ - (var) /= (gStatStageRatios)[(mon)->statStages[(statIndex)]][1]; \ -} - -#define BADGE_BOOST(badge, stat, bank) ({ \ -if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) \ -{ \ - if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) \ - && gTrainerBattleOpponent != SECRET_BASE_OPPONENT \ - && FlagGet(FLAG_BADGE0##badge##_GET) \ - && GetBattlerSide(bank) == B_SIDE_PLAYER) \ - (stat) = (110 * (stat)) / 100; \ -} \ -}) - -s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 bankAtk, u8 bankDef) -{ - u32 i; - s32 damage = 0; - s32 damageHelper; - u8 type; - u16 attack, defense; - u16 spAttack, spDefense; - u8 defenderHoldEffect; - u8 defenderHoldEffectParam; - u8 attackerHoldEffect; - u8 attackerHoldEffectParam; - - if (!powerOverride) - gBattleMovePower = gBattleMoves[move].power; - else - gBattleMovePower = powerOverride; - - if (!typeOverride) - type = gBattleMoves[move].type; - else - type = typeOverride & 0x3F; - - attack = attacker->attack; - defense = defender->defense; - spAttack = attacker->spAttack; - spDefense = defender->spDefense; - - if (attacker->item == ITEM_ENIGMA_BERRY) - { - attackerHoldEffect = gEnigmaBerries[bankAtk].holdEffect; - attackerHoldEffectParam = gEnigmaBerries[bankAtk].holdEffectParam; - } - else - { - attackerHoldEffect = ItemId_GetHoldEffect(attacker->item); - attackerHoldEffectParam = ItemId_GetHoldEffectParam(attacker->item); - } - - if (defender->item == ITEM_ENIGMA_BERRY) - { - defenderHoldEffect = gEnigmaBerries[bankDef].holdEffect; - defenderHoldEffectParam = gEnigmaBerries[bankDef].holdEffectParam; - } - else - { - defenderHoldEffect = ItemId_GetHoldEffect(defender->item); - defenderHoldEffectParam = ItemId_GetHoldEffectParam(defender->item); - } - - if (attacker->ability == ABILITY_HUGE_POWER || attacker->ability == ABILITY_PURE_POWER) - attack *= 2; - - BADGE_BOOST(1, attack, bankAtk); - BADGE_BOOST(5, defense, bankDef); - BADGE_BOOST(7, spAttack, bankAtk); - BADGE_BOOST(7, spDefense, bankDef); - - for (i = 0; i < 17; i++) - { - if (attackerHoldEffect == gHoldEffectToType[i][0] - && type == gHoldEffectToType[i][1]) - { - if (TYPE_IS_PHYSICAL(type)) - attack = (attack * (attackerHoldEffectParam + 100)) / 100; - else - spAttack = (spAttack * (attackerHoldEffectParam + 100)) / 100; - break; - } - } - - if (attackerHoldEffect == HOLD_EFFECT_CHOICE_BAND) - attack = (150 * attack) / 100; - if (attackerHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) && (attacker->species == SPECIES_LATIAS || attacker->species == SPECIES_LATIOS)) - spAttack = (150 * spAttack) / 100; - if (defenderHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) && (defender->species == SPECIES_LATIAS || defender->species == SPECIES_LATIOS)) - spDefense = (150 * spDefense) / 100; - if (attackerHoldEffect == HOLD_EFFECT_DEEP_SEA_TOOTH && attacker->species == SPECIES_CLAMPERL) - spAttack *= 2; - if (defenderHoldEffect == HOLD_EFFECT_DEEP_SEA_SCALE && defender->species == SPECIES_CLAMPERL) - spDefense *= 2; - if (attackerHoldEffect == HOLD_EFFECT_LIGHT_BALL && attacker->species == SPECIES_PIKACHU) - spAttack *= 2; - if (defenderHoldEffect == HOLD_EFFECT_METAL_POWDER && defender->species == SPECIES_DITTO) - defense *= 2; - if (attackerHoldEffect == HOLD_EFFECT_THICK_CLUB && (attacker->species == SPECIES_CUBONE || attacker->species == SPECIES_MAROWAK)) - attack *= 2; - if (defender->ability == ABILITY_THICK_FAT && (type == TYPE_FIRE || type == TYPE_ICE)) - spAttack /= 2; - if (attacker->ability == ABILITY_HUSTLE) - attack = (150 * attack) / 100; - if (attacker->ability == ABILITY_PLUS && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MINUS, 0, 0)) - spAttack = (150 * spAttack) / 100; - if (attacker->ability == ABILITY_MINUS && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_PLUS, 0, 0)) - spAttack = (150 * spAttack) / 100; - if (attacker->ability == ABILITY_GUTS && attacker->status1) - attack = (150 * attack) / 100; - if (defender->ability == ABILITY_MARVEL_SCALE && defender->status1) - defense = (150 * defense) / 100; - if (type == TYPE_ELECTRIC && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, 0xFD, 0)) - gBattleMovePower /= 2; - if (type == TYPE_FIRE && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, 0xFE, 0)) - gBattleMovePower /= 2; - if (type == TYPE_GRASS && attacker->ability == ABILITY_OVERGROW && attacker->hp <= (attacker->maxHP / 3)) - gBattleMovePower = (150 * gBattleMovePower) / 100; - if (type == TYPE_FIRE && attacker->ability == ABILITY_BLAZE && attacker->hp <= (attacker->maxHP / 3)) - gBattleMovePower = (150 * gBattleMovePower) / 100; - if (type == TYPE_WATER && attacker->ability == ABILITY_TORRENT && attacker->hp <= (attacker->maxHP / 3)) - gBattleMovePower = (150 * gBattleMovePower) / 100; - if (type == TYPE_BUG && attacker->ability == ABILITY_SWARM && attacker->hp <= (attacker->maxHP / 3)) - gBattleMovePower = (150 * gBattleMovePower) / 100; - if (gBattleMoves[gCurrentMove].effect == EFFECT_EXPLOSION) - defense /= 2; - - if (TYPE_IS_PHYSICAL(type)) // type < TYPE_MYSTERY - { - if (gCritMultiplier == 2) - { - if (attacker->statStages[STAT_STAGE_ATK] > 6) - APPLY_STAT_MOD(damage, attacker, attack, STAT_STAGE_ATK) - else - damage = attack; - } - else - APPLY_STAT_MOD(damage, attacker, attack, STAT_STAGE_ATK) - - damage = damage * gBattleMovePower; - damage *= (2 * attacker->level / 5 + 2); - - if (gCritMultiplier == 2) - { - if (defender->statStages[STAT_STAGE_DEF] < 6) - APPLY_STAT_MOD(damageHelper, defender, defense, STAT_STAGE_DEF) - else - damageHelper = defense; - } - else - APPLY_STAT_MOD(damageHelper, defender, defense, STAT_STAGE_DEF) - - damage = damage / damageHelper; - damage /= 50; - - if ((attacker->status1 & STATUS_BURN) && attacker->ability != ABILITY_GUTS) - damage /= 2; - - if ((sideStatus & SIDE_STATUS_REFLECT) && gCritMultiplier == 1) - { - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMons(2) == 2) - damage = 2 * (damage / 3); - else - damage /= 2; - } - - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMons(2) == 2) - damage /= 2; - - // moves always do at least 1 damage. - if (damage == 0) - damage = 1; - } - - if (type == TYPE_MYSTERY) - damage = 0; // is ??? type. does 0 damage. - - if (TYPE_IS_SPECIAL(type)) // type > TYPE_MYSTERY - { - if (gCritMultiplier == 2) - { - if (attacker->statStages[STAT_STAGE_SPATK] > 6) - APPLY_STAT_MOD(damage, attacker, spAttack, STAT_STAGE_SPATK) - else - damage = spAttack; - } - else - APPLY_STAT_MOD(damage, attacker, spAttack, STAT_STAGE_SPATK) - - damage = damage * gBattleMovePower; - damage *= (2 * attacker->level / 5 + 2); - - if (gCritMultiplier == 2) - { - if (defender->statStages[STAT_STAGE_SPDEF] < 6) - APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_STAGE_SPDEF) - else - damageHelper = spDefense; - } - else - APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_STAGE_SPDEF) - - damage = (damage / damageHelper); - damage /= 50; - - if ((sideStatus & SIDE_STATUS_LIGHTSCREEN) && gCritMultiplier == 1) - { - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMons(2) == 2) - damage = 2 * (damage / 3); - else - damage /= 2; - } - - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMons(2) == 2) - damage /= 2; - - // are effects of weather negated with cloud nine or air lock - if (!AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_CLOUD_NINE, 0, 0) - && !AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_AIR_LOCK, 0, 0)) - { - if (gBattleWeather & WEATHER_RAIN_TEMPORARY) - { - switch (type) - { - case TYPE_FIRE: - damage /= 2; - break; - case TYPE_WATER: - damage = (15 * damage) / 10; - break; - } - } - - // any weather except sun weakens solar beam - if ((gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_HAIL)) && gCurrentMove == MOVE_SOLAR_BEAM) - damage /= 2; - - // sunny - if (gBattleWeather & WEATHER_SUN_ANY) - { - switch (type) - { - case TYPE_FIRE: - damage = (15 * damage) / 10; - break; - case TYPE_WATER: - damage /= 2; - break; - } - } - } - - // flash fire triggered - if ((eFlashFireArr.arr[bankAtk] & 1) && type == TYPE_FIRE) - damage = (15 * damage) / 10; - } - - return damage + 2; -} diff --git a/src/battle/contest_link_80C2020.c b/src/battle/contest_link_80C2020.c deleted file mode 100644 index 8269f424b..000000000 --- a/src/battle/contest_link_80C2020.c +++ /dev/null @@ -1,2906 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "util.h" -#include "random.h" -#include "overworld.h" -#include "constants/songs.h" -#include "ewram.h" -#include "main.h" -#include "scanline_effect.h" -#include "decompress.h" -#include "palette.h" -#include "blend_palette.h" -#include "graphics.h" -#include "strings2.h" -#include "text.h" -#include "string_util.h" -#include "menu.h" -#include "sound.h" -#include "pokedex.h" -#include "pokemon_icon.h" -#include "tv.h" -#include "battle.h" -#include "contest.h" -#include "link.h" -#include "field_effect.h" -#include "field_specials.h" -#include "contest_link_80C857C.h" -#include "contest_link_80C2020.h" -#include "pokemon_storage_system.h" -#include "event_data.h" -#include "script.h" -#include "trig.h" - -#define ABS(x) ((x) < 0 ? -(x) : (x)) - -#define GET_CONTEST_WINNER(var) { \ - for ((var) = 0; (var) < 4; (var)++) \ - { \ - if (gContestFinalStandings[i] == 0) \ - break; \ - } \ -} - -struct UnkEwramStruct18000 { - u8 unk_00; - u8 unk_01; - u8 unk_02; - u8 unk_03; - u8 unk_04; - u8 unk_05; - u8 unk_06; - u8 unk_07; - u8 unk_08; - u8 unk_09; - u8 unk_0a; - s16 unk_0c[4]; - u8 unk_14; -}; - -struct UnkEwramStruct18018 { - s32 unk_00; - s32 unk_04; - u32 unk_08; - u32 unk_0c; - u8 unk_10; - u8 unk_11; - u8 unk_12; -}; - -#define eContestLink80C2020Struct2018000 (*(struct UnkEwramStruct18000 *)(gSharedMem + 0x18000)) -#define eContestLink80C2020Struct2018018 ((struct UnkEwramStruct18018 *)(gSharedMem + 0x18018)) -#define eContestLink80C2020Struct2018068 (gSharedMem + 0x18068) - -static void sub_80C2430(void); -static void sub_80C2448(void); -static void sub_80C24F4(u8 taskId); -static void sub_80C255C(u8 taskId); -static void sub_80C25A4(u8 taskId); -static void sub_80C25C0(u8 taskId); -static void sub_80C2600(u8 taskId); -static void sub_80C26E4(u8 taskId); -static void sub_80C2770(u8 taskId); -static void sub_80C27EC(u8 taskId); -static void sub_80C2878(u8 taskId); -static void sub_80C2A8C(u8 taskId); -static void sub_80C2D1C(u8 taskId); -static void sub_80C2D80(u8 taskId); -static void sub_80C2DD8(u8 taskId); -static void sub_80C2E14(u8 taskId); -static void sub_80C2EA0(u8 taskId); -static void sub_80C2F28(u8 taskId); -static void sub_80C2F64(u8 taskId); -static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow); -void sub_80C310C(void); -void sub_80C3158(const u8 *string, u8 spriteId); -void sub_80C33DC(void); -u16 sub_80C34AC(const u8 *string); -void sub_80C34CC(s16 data4, u16 pos0y, u16 data5, u16 data6); -void sub_80C3520(u16 a0); -void sub_80C3588(struct Sprite *sprite); -void sub_80C35FC(struct Sprite *sprite); -void sub_80C3630(struct Sprite *sprite); -void sub_80C3698(const u8 *string); -void sub_80C3764(void); -void sub_80C37E4(void); -u8 sub_80C3990(u8 a0, u8 a1); -s8 sub_80C39E4(u8 a0, u8 a1); -void sub_80C3A5C(u8 taskId); -void sub_80C3BD8(u8 taskId); -void sub_80C3B30(u8 taskId); -void sub_80C3C44(struct Sprite *sprite); -void sub_80C3CB8(struct Sprite *sprite); -void sub_80C3D04(u8 taskId); -void sub_80C3DF0(struct Sprite *sprite); -void sub_80C3E60(u8 a0, u8 a1); -void sub_80C3EA4(u8 taskId); -void sub_80C3F00(void); -void sub_80C40D4(u8 a0, u8 a1); -void sub_80C42C0(u8 taskId); -void sub_80C49C4(u8 taskId); -void sub_80C49F0(u8 taskId); -void sub_80C4A0C(u8 taskId); -void sub_80C4A28(u8 taskId); -void sub_80C4A44(u8 taskId); -void sub_80C4B0C(u8 taskId); -void sub_80C4B5C(u8 taskId); -void sub_80C4BA4(u8 taskId); -void sub_80C4BCC(u8 taskId); - -const u16 gUnknown_083D1624[] = INCBIN_U16("graphics/unknown/unknown_3D1624/0.4bpp"); -const u16 gUnknown_083D1644[] = INCBIN_U16("graphics/unknown/unknown_3D1624/1.4bpp"); -const u16 gUnknown_083D1664[] = INCBIN_U16("graphics/unknown/unknown_3D1624/2.4bpp"); -const u16 gUnknown_083D1684[] = INCBIN_U16("graphics/unknown/unknown_3D1624/3.4bpp"); -const u16 gUnknown_083D16A4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/4.4bpp"); -const u16 gUnknown_083D16C4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/5.4bpp"); -const u16 gUnknown_083D16E4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/6.4bpp"); -const u16 gUnknown_083D1704[] = INCBIN_U16("graphics/unknown/unknown_3D1624/7.4bpp"); -const u16 gMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal"); - -const struct OamData gOamData_83D1744 = { - .shape = ST_OAM_H_RECTANGLE, - .size = 3, - .priority = 3, - .paletteNum = 2 -}; - -const struct SpriteTemplate gSpriteTemplate_83D174C = { - 0xbc1, - 0xbc1, - &gOamData_83D1744, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy -}; - -const struct SpriteSheet gUnknown_083D1764[] = { - {gMiscBlank_Gfx, 0x400, 0xbc1}, - {gMiscBlank_Gfx, 0x400, 0xbc2}, - {gMiscBlank_Gfx, 0x400, 0xbc3}, - {gMiscBlank_Gfx, 0x400, 0xbc4}, - {gMiscBlank_Gfx, 0x400, 0xbc5}, - {gMiscBlank_Gfx, 0x400, 0xbc6}, - {gMiscBlank_Gfx, 0x400, 0xbc7}, - {gMiscBlank_Gfx, 0x400, 0xbc8}, -}; - -const struct SpritePalette gUnknown_083D17A4 = { - gMiscBlank_Pal, 0xbc1 -}; - -const struct OamData gOamData_83D17AC = {}; - -const struct SpriteTemplate gSpriteTemplate_83D17B4 = { - 0xbc9, - 0xbc9, - &gOamData_83D17AC, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - sub_80C3DF0 -}; - -const struct CompressedSpriteSheet gUnknown_083D17CC = {gContestConfetti_Gfx, 0x220, 0xbc9}; - -const struct CompressedSpritePalette gUnknown_083D17D4 = {gContestConfetti_Pal, 0xbc9}; - -const u8 gUnknown_083D17DC[] = _("{COLOR RED}"); -const u8 gUnknown_083D17E0[] = _("/"); -const u8 gUnknown_083D17E2[] = _("{SIZE 3}{COLOR_HIGHLIGHT_SHADOW WHITE2 DARK_GREY LIGHT_BLUE}"); - -void sub_80C2020(void) -{ - REG_DISPCNT = DISPCNT_OBJ_1D_MAP; - Text_LoadWindowTemplate(&gWindowTemplate_81E6FA0); - Text_InitWindowWithTemplate(&gMenuWindow, &gWindowTemplate_81E6FA0); - REG_BG0CNT = BGCNT_WRAP | BGCNT_SCREENBASE(30); - REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(24); - REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(28); - REG_BG3CNT = BGCNT_WRAP | BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(26); - REG_MOSAIC = 0; - REG_WININ = 0x3f3f; - REG_WINOUT = 0x3f2e; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 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_DISPCNT |= DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - gBattle_BG3_X = 0; - gBattle_BG3_Y = 0; - gBattle_WIN0H = 0; - gBattle_WIN0V = 0; - gBattle_WIN1H = 0; - gBattle_WIN1V = 0; -} - -void sub_80C2144(void) -{ - int i; - int j; - s8 r7; - s8 r4; - u16 r6; - u16 r3; - - DmaFill32Large(3, 0, VRAM, VRAM_SIZE, 0x1000); - LZDecompressVram(gUnknown_08D1977C, BG_SCREEN_ADDR(0)); - LZDecompressVram(gUnknown_08D1A490, BG_SCREEN_ADDR(26)); - LZDecompressVram(gUnknown_08D1A364, BG_SCREEN_ADDR(28)); - LZDecompressVram(gUnknown_08D1A250, BG_SCREEN_ADDR(30)); - sub_80C37E4(); - LoadCompressedPalette(gUnknown_08D1A618, 0, 0x200); - LoadFontDefaultPalette(&gWindowTemplate_81E6FA0); - for (i = 0; i < 4; i++) - { - r7 = sub_80C3990(i, 1); - r4 = sub_80C39E4(i, 1); - for (j = 0; j < 10; j++) - { - r6 = 0x60b2; - if (j < r7) - r6 = 0x60b4; - if (j < ABS(r4)) - { - r3 = 0x60a4; - if (r4 < 0) - r3 = 0x60a6; - } - else - r3 = 0x60a2; - ((u16 *)BG_VRAM)[i * 0x60 + j + 0x60b3] = r6; - ((u16 *)BG_VRAM)[i * 0x60 + j + 0x60d3] = r3; - } - } -} - -void sub_80C226C(u8 a0) -{ - u8 *strbuf; - - if (a0 == gContestPlayerMonIndex) - strbuf = StringCopy(gDisplayedStringBattle, gUnknown_083D17DC); - else - strbuf = gDisplayedStringBattle; - strbuf[0] = EXT_CTRL_CODE_BEGIN; - strbuf[1] = 0x06; - strbuf[2] = 0x04; - strbuf += 3; - strbuf = StringCopy(strbuf, gContestMons[a0].nickname); - strbuf[0] = EXT_CTRL_CODE_BEGIN; - strbuf[1] = 0x13; - strbuf[2] = 0x32; - strbuf += 3; - strbuf = StringCopy(strbuf, gUnknown_083D17E0); - if (gIsLinkContest & 1) - StringCopy(strbuf, gLinkPlayers[a0].name); - else - StringCopy(strbuf, gContestMons[a0].trainerName); - Text_InitWindowAndPrintText(&gMenuWindow, gDisplayedStringBattle, a0 * 36 + 770, 7, a0 * 3 + 4); -} - -void sub_80C2340(void) -{ - int i; - - for (i = 0; i < 4; i++) - sub_80C226C(i); -} - -void sub_80C2358(void) -{ - gPaletteFade.bufferTransferDisabled = TRUE; - SetVBlankCallback(NULL); - sub_80C2020(); - ScanlineEffect_Clear(); - ResetPaletteFade(); - ResetSpriteData(); - ResetTasks(); - FreeAllSpritePalettes(); - sub_80C2144(); - sub_80C310C(); - LoadAllContestMonIcons(0, TRUE); - sub_80C2340(); - eContestLink80C2020Struct2018000 = (struct UnkEwramStruct18000){}; - memset(eContestLink80C2020Struct2018018, 0, 4 * sizeof(struct UnkEwramStruct18018)); - sub_80C33DC(); - BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0); - gPaletteFade.bufferTransferDisabled = FALSE; - eContestLink80C2020Struct2018000.unk_02 = CreateTask(sub_80C24F4, 5); - SetMainCallback2(sub_80C2430); - gBattle_WIN1H = 0xf0; - gBattle_WIN1V = 0x80a0; - CreateTask(sub_80C2F28, 20); - sub_80C3F00(); - PlayBGM(MUS_CON_K); - SetVBlankCallback(sub_80C2448); -} - -static void sub_80C2430(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - UpdatePaletteFade(); -} - -static void sub_80C2448(void) -{ - REG_BG0HOFS = gBattle_BG0_X; - REG_BG0VOFS = gBattle_BG0_Y; - REG_BG1HOFS = gBattle_BG1_X; - REG_BG1VOFS = gBattle_BG1_Y; - REG_BG2HOFS = gBattle_BG2_X; - REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gBattle_BG3_X; - REG_BG3VOFS = gBattle_BG3_Y; - REG_WIN0H = gBattle_WIN0H; - REG_WIN0V = gBattle_WIN0V; - REG_WIN1H = gBattle_WIN1H; - REG_WIN1V = gBattle_WIN1V; - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - ScanlineEffect_InitHBlankDmaTransfer(); -} - -static void sub_80C24F4(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gIsLinkContest & 1) - { - sub_80C3698(gOtherText_LinkStandby); - gTasks[taskId].func = sub_80C255C; - } - else - { - gTasks[taskId].func = sub_80C2600; - } - } -} - -static void sub_80C255C(u8 taskId) -{ - if (gReceivedRemoteLinkPlayers && GetLinkPlayerCount() == MAX_LINK_PLAYERS) - { - CreateTask(sub_80C25A4, 0); - gTasks[taskId].func = TaskDummy; - } -} - -static void sub_80C25A4(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80C89DC, sub_80C25C0); -} - -static void sub_80C25C0(u8 taskId) -{ - if (IsLinkTaskFinished()) - { - DestroyTask(taskId); - gTasks[eContestLink80C2020Struct2018000.unk_02].func = sub_80C2600; - sub_80C3764(); - } -} - -static void sub_80C2600(u8 taskId) -{ - if (gTasks[taskId].data[0] == 0) - { - CreateTask(sub_80C2F64, 20); - sub_80C3158(gContestText_AnnounceResults, eContestLink80C2020Struct2018000.unk_00); - sub_80C34CC(sub_80C34AC(gContestText_AnnounceResults), 0x90, 0x78, 0x440); - gTasks[taskId].data[0]++; - } - else if (gTasks[taskId].data[0] == 1) - { - if (eContestLink80C2020Struct2018000.unk_04 == 0) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - } - else if (gTasks[taskId].data[0] == 2) - { - if (++gTasks[taskId].data[1] == 0x15) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - } - else if (gTasks[taskId].data[0] == 3) - { - sub_80C3158(gContestText_PreliminaryResults, eContestLink80C2020Struct2018000.unk_00); - sub_80C34CC(sub_80C34AC(gContestText_PreliminaryResults), 0x90, 0xffff, 0x440); - gTasks[taskId].data[0]++; - } - else if (gTasks[taskId].data[0] == 4) - { - if (eContestLink80C2020Struct2018000.unk_04 == 2) - { - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80C26E4; - } - } -} - -static void sub_80C26E4(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (eContestLink80C2020Struct2018000.unk_0a == 0) - { - sub_80C40D4(0, gTasks[taskId].data[2]++); - if (eContestLink80C2020Struct2018000.unk_14 == 0) - { - gTasks[taskId].data[0] = 2; - } - else - { - gTasks[taskId].data[0]++; - } - } - break; - case 1: - if (eContestLink80C2020Struct2018000.unk_14 == 0) - { - gTasks[taskId].data[0] = 0; - } - break; - case 2: - sub_80C3520(0x440); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].func = sub_80C2770; - break; - } -} - -static void sub_80C2770(u8 taskId) -{ - if (eContestLink80C2020Struct2018000.unk_04 == 0) - { - if (++gTasks[taskId].data[1] == 21) - { - gTasks[taskId].data[1] = 0; - sub_80C3158(gContestText_Round2Results, eContestLink80C2020Struct2018000.unk_00); - sub_80C34CC(sub_80C34AC(gContestText_Round2Results), 0x90, 0xffff, 0x440); - } - } - else if (eContestLink80C2020Struct2018000.unk_04 == 2) - { - gTasks[taskId].func = sub_80C27EC; - } -} - -static void sub_80C27EC(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (eContestLink80C2020Struct2018000.unk_0a == 0) - { - sub_80C40D4(1, gTasks[taskId].data[2]++); - if (eContestLink80C2020Struct2018000.unk_14 == 0) - { - gTasks[taskId].data[0] = 2; - } - else - { - gTasks[taskId].data[0]++; - } - } - break; - case 1: - if (eContestLink80C2020Struct2018000.unk_14 == 0) - { - gTasks[taskId].data[0] = 0; - } - break; - case 2: - sub_80C3520(0x440); - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80C2878; - break; - } -} - -static void sub_80C2878(u8 taskId) -{ - int i; - u8 taskId2; - u8 strbuf[100]; - - switch (gTasks[taskId].data[0]) - { - case 0: - if (eContestLink80C2020Struct2018000.unk_04 == 0) - gTasks[taskId].data[0]++; - break; - case 1: - if (++gTasks[taskId].data[1] == 31) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - break; - case 2: - for (i = 0; i < 4; i++) - { - taskId2 = CreateTask(sub_80C3A5C, 10); - gTasks[taskId2].data[0] = gContestFinalStandings[i]; - gTasks[taskId2].data[1] = i; - } - gTasks[taskId].data[0]++; - break; - case 3: - if (eContestLink80C2020Struct2018000.unk_05 == 4) - { - if (++gTasks[taskId].data[1] == 31) - { - gTasks[taskId].data[1] = 0; - CreateTask(sub_80C3B30, 10); - gTasks[taskId].data[0]++; - GET_CONTEST_WINNER(i); - sub_80C3E60(i, 14); - } - } - break; - case 4: - if (++gTasks[taskId].data[1] == 21) - { - gTasks[taskId].data[1] = 0; - GET_CONTEST_WINNER(i); - if (gIsLinkContest & 1) - { - StringCopy(gStringVar1, gLinkPlayers[i].name); - } - else - { - StringCopy(gStringVar1, gContestMons[i].trainerName); - } - StringCopy(gStringVar2, gContestMons[i].nickname); - StringExpandPlaceholders(strbuf, gContestText_PokeWon); - sub_80C3158(strbuf, eContestLink80C2020Struct2018000.unk_00); - sub_80C34CC(sub_80C34AC(strbuf), 0x90, 0xffff, 0x440); - gTasks[taskId].data[0]++; - } - break; - case 5: - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80C2A8C; - break; - } -} - -static void sub_80C2A8C(u8 taskId) -{ - int i; - u8 spriteId; - u16 species; - u32 personality; - u32 otId; - const struct CompressedSpritePalette *monPal; - - switch (gTasks[taskId].data[0]) - { - case 0: - gBattle_WIN0H = 0xf0; - gBattle_WIN0V = 0x5050; - GET_CONTEST_WINNER(i); - species = gContestMons[i].species; - personality = gContestMons[i].personality; - otId = gContestMons[i].otId; - HandleLoadSpecialPokePic(gMonFrontPicTable + species, gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (intptr_t)gSharedMem, gUnknown_081FAF4C[1], species, personality); - monPal = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); - LoadCompressedObjectPalette(monPal); - GetMonSpriteTemplate_803C56C(species, 1); - gUnknown_02024E8C.paletteTag = monPal->tag; - spriteId = CreateSprite(&gUnknown_02024E8C, 0x110, 0x50, 10); - gSprites[spriteId].data[1] = species; - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].callback = sub_80C3C44; - eContestLink80C2020Struct2018000.unk_08 = spriteId; - LoadCompressedObjectPic(&gUnknown_083D17CC); - LoadCompressedObjectPalette(&gUnknown_083D17D4); - CreateTask(sub_80C3D04, 10); - gTasks[taskId].data[0]++; - break; - case 1: - if (++gTasks[taskId].data[3] == 1) - { - u8 win0v; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[2] += 2; - if (gTasks[taskId].data[2] > 0x20) - gTasks[taskId].data[2] = 0x20; - win0v = gTasks[taskId].data[2]; - gBattle_WIN0V = ((0x50 - win0v) << 8) | (0x50 + win0v); - if (win0v == 0x20) - { - gTasks[taskId].data[0]++; - } - } - break; - case 2: - if (eContestLink80C2020Struct2018000.unk_06 == 1) - { - gTasks[taskId].data[0]++; - } - break; - case 3: - if (++gTasks[taskId].data[1] == 121) - { - gTasks[taskId].data[1] = 0; - gSprites[eContestLink80C2020Struct2018000.unk_08].callback = sub_80C3CB8; - gTasks[taskId].data[0]++; - } - break; - case 4: - if (eContestLink80C2020Struct2018000.unk_06 == 2) - { - u8 win0v = (gBattle_WIN0V >> 8); - win0v += 2; - if (win0v > 0x50) - win0v = 0x50; - gBattle_WIN0V = (win0v << 8) | (0xa0 - win0v); - if (win0v == 0x50) - { - gTasks[taskId].data[0]++; - } - } - break; - case 5: - if (eContestLink80C2020Struct2018000.unk_06 == 2) - { - eContestLink80C2020Struct2018000.unk_09 = 1; - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80C2D1C; - } - break; - } -} - -static void sub_80C2D1C(u8 taskId) -{ - int i; - - if (gMain.newKeys & A_BUTTON) - { - if (!(gIsLinkContest & 1)) - { - for (i = 0; i < 4; i++) - { - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gContestMons[i].species), FLAG_SET_SEEN); - } - } - gTasks[taskId].func = sub_80C2D80; - } -} - -static void sub_80C2D80(u8 taskId) -{ - if (gIsLinkContest & 1) - { - sub_80C3698(gOtherText_LinkStandby); - sub_800832C(); - gTasks[taskId].func = sub_80C2DD8; - } - else - { - gTasks[taskId].func = sub_80C2E14; - } -} - -static void sub_80C2DD8(u8 taskId) -{ - if (gReceivedRemoteLinkPlayers == 0) - { - gIsLinkContest = 0; - sub_80C3764(); - gTasks[taskId].func = sub_80C2E14; - } -} - -static void sub_80C2E14(u8 taskId) -{ - sub_80BE284(gContestFinalStandings[gContestPlayerMonIndex]); - sub_810FB10(2); - Contest_SaveWinner(gSpecialVar_ContestRank); - Contest_SaveWinner(0xFE); - ewram15DDF = 1; - ewram15DDE = sub_80B2C4C(0xfe, 0); - BeginHardwarePaletteFade(0xff, 0, 0, 16, 0); - gTasks[taskId].func = sub_80C2EA0; -} - -static void sub_80C2EA0(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gTasks[taskId].data[1] == 0) - { - DestroyTask(eContestLink80C2020Struct2018000.unk_03); - BlendPalettes(0x0000ffff, 16, 0); - gTasks[taskId].data[1]++; - } - else if (gTasks[taskId].data[1] == 1) - { - BlendPalettes(0xffff0000, 16, 0); - gTasks[taskId].data[1]++; - } - else - { - REG_BLDCNT = 0; - REG_BLDY = 0; - DestroyTask(taskId); - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); - } - } -} - -static void sub_80C2F28(u8 taskId) -{ - gBattle_BG3_X += 2; - gBattle_BG3_Y++; - if (gBattle_BG3_X > 0xff) - gBattle_BG3_X -= 0xff; - if (gBattle_BG3_Y > 0xff) - gBattle_BG3_Y -= 0xff; -} - -static void sub_80C2F64(u8 taskId) -{ - if (++gTasks[taskId].data[0] == 2) - { - gTasks[taskId].data[0] = 0; - if (gTasks[taskId].data[2] == 0) - gTasks[taskId].data[1]++; - else - gTasks[taskId].data[1]--; - if (gTasks[taskId].data[1] == 16) - gTasks[taskId].data[2] = 1; - else if (gTasks[taskId].data[1] == 0) - gTasks[taskId].data[2] = 0; - BlendPalette(0x6b, 0x01, gTasks[taskId].data[1], RGB(30, 22, 11)); - BlendPalette(0x68, 0x01, gTasks[taskId].data[1], RGB(31, 31, 31)); - BlendPalette(0x6e, 0x01, gTasks[taskId].data[1], RGB(30, 29, 29)); - } - if (gTasks[taskId].data[1] == 0) - eContestLink80C2020Struct2018000.unk_0a = 0; - else - eContestLink80C2020Struct2018000.unk_0a = 1; -} - -void sub_80C3024(u16 species, u8 destOffset, u8 srcOffset, bool8 useDmaNow, u32 personality) -{ - int i; - int j; - u16 tile; - u16 offset; - u16 var0; - u16 var1; - - if (useDmaNow) - { - DmaCopy32Defvars(3, GetMonIconPtr(species, personality) + (srcOffset << 9) + 0x80, BG_CHAR_ADDR(1) + (destOffset << 9), 0x180); - var0 = ((destOffset + 10) << 12); - var1 = (destOffset * 16 + 0x200); - tile = var1 | var0; - offset = destOffset * 0x60 + 0x83; - for (i = 0; i < 3; i++) - { - for (j = 0; j < 4; j++) - { - ((u16 *)BG_CHAR_ADDR(3))[(i << 5) + j + offset] = tile; - tile++; - } - } - } - else - { - RequestSpriteCopy(GetMonIconPtr(species, personality) + (srcOffset << 9) + 0x80, BG_CHAR_ADDR(1) + (destOffset << 9), 0x180); - } -} - -static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow) -{ - int i; - - for (i = 0; i < 4; i++) - { - sub_80C3024(gContestMons[i].species, i, srcOffset, useDmaNow, gContestMons[i].personality); - } -} - -void sub_80C310C(void) -{ - int i; - register u16 species asm("r0"); - - for (i = 0; i < 4; i++) - { - species = mon_icon_convert_unown_species_id(gContestMons[i].species, 0); - LoadPalette(gMonIconPalettes[gMonIconPaletteIndices[species]], 0xa0 + 0x10 * i, 0x20); - } -} - -#ifdef NONMATCHING -void sub_80C3158(const u8 *string, u8 spriteId) -{ - int i, j; - u8 width; - u8 * displayedStringBattle; - void * dest; - u8 * d1; - u8 * d2; - void *d3; - void *d4; - void *d5; - void *d6; - int w; - u16 sp00[4]; - struct Sprite *sprite = &gSprites[spriteId]; - sp00[0] = gSprites[spriteId].oam.tileNum; - sp00[1] = gSprites[sprite->data[0]].oam.tileNum; - sp00[2] = gSprites[sprite->data[1]].oam.tileNum; - sp00[3] = gSprites[sprite->data[2]].oam.tileNum; - - for (i = 0; i < 4; i++) - { - DmaClear32(3, (void *)VRAM + 0x10000 + 32 * sp00[i], 0x400); - } - - width = Text_GetStringWidthFromWindowTemplate(&gWindowTemplate_81E7278, string); - displayedStringBattle = gDisplayedStringBattle; - displayedStringBattle = StringCopy(displayedStringBattle, gUnknown_083D17E2); - if ((~width + 1) & 7) - { - displayedStringBattle[0] = EXT_CTRL_CODE_BEGIN; - displayedStringBattle[1] = 0x11; - displayedStringBattle[2] = ((~width + 1) & 7) / 2; - displayedStringBattle += 3; - } - - width += -8 & (width + 7); - displayedStringBattle = StringCopy(displayedStringBattle, string); - - displayedStringBattle[0] = EXT_CTRL_CODE_BEGIN; - displayedStringBattle[1] = 0x13; - displayedStringBattle[2] = width; - displayedStringBattle[3] = EOS; - - sub_80034D4(eContestLink80C2020Struct2018068, gDisplayedStringBattle); - - CpuCopy32(&gUnknown_083D1624[0x0], (void *)(VRAM + 0x10000) + 32 * sp00[0], 32); - CpuCopy32(&gUnknown_083D1624[0x40], (void *)(VRAM + 0x10000) + 32 * sp00[0] + 0x100, 32); - CpuCopy32(&gUnknown_083D1624[0x40], (void *)(VRAM + 0x10000) + 32 * sp00[0] + 0x200, 32); - CpuCopy32(&gUnknown_083D1624[0x20], (void *)(VRAM + 0x10000) + 32 * sp00[0] + 0x300, 32); - - w = width / 8; - j = 0; - if (j <= w) - { - d2 = eContestLink80C2020Struct2018068 + 0x20; - d1 = eContestLink80C2020Struct2018068; - d3 = (void *)VRAM + 0x0FD20; - d4 = (void *)VRAM + 0x0FE20; - d5 = (void *)VRAM + 0x0FF20; - d6 = (void *)VRAM + 0x10020; - while (j <= w) - { - if (j < 7) - dest = 32 * sp00[0] + d6; - else if (j < 15) - dest = 32 * sp00[1] + d5; - else if (j < 23) - dest = 32 * sp00[2] + d4; - else - dest = 32 * sp00[3] + d3; - - if (j == w) - break; - - CpuCopy32(gUnknown_083D16E4, dest, 32); - CpuCopy32(gUnknown_083D16E4 + 0x10, dest + 0x300, 32); - CpuCopy32(j * 0x40 + d2, dest + 0x100, 32); - CpuCopy32(j * 0x40 + d1, dest + 0x200, 32); - - d3 += 0x20; - d4 += 0x20; - d5 += 0x20; - d6 += 0x20; - j++; - } - } - - CpuCopy32(gUnknown_083D1644, dest, 32); - CpuCopy32(gUnknown_083D1644 + 0x40, dest + 0x100, 32); - CpuCopy32(gUnknown_083D1644 + 0x40, dest + 0x200, 32); - CpuCopy32(gUnknown_083D1644 + 0x20, dest + 0x300, 32); -} -#else -asm(".include \"constants/gba_constants.inc\""); -asm(".include \"include/macros.inc\""); -NAKED -void sub_80C3158(const u8 * string, u8 spriteId) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x1C\n" - "\tmov r9, r0\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tlsls r2, r1, 4\n" - "\tadds r2, r1\n" - "\tlsls r2, 2\n" - "\tldr r3, _080C32C0 @ =gSprites\n" - "\tadds r2, r3\n" - "\tmov r1, sp\n" - "\tldrh r0, [r2, 0x4]\n" - "\tlsls r0, 22\n" - "\tlsrs r0, 22\n" - "\tstrh r0, [r1]\n" - "\tmov r4, sp\n" - "\tmovs r0, 0x2E\n" - "\tldrsh r1, [r2, r0]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r3\n" - "\tldrh r0, [r0, 0x4]\n" - "\tlsls r0, 22\n" - "\tlsrs r0, 22\n" - "\tstrh r0, [r4, 0x2]\n" - "\tmovs r0, 0x30\n" - "\tldrsh r1, [r2, r0]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r3\n" - "\tldrh r0, [r0, 0x4]\n" - "\tlsls r0, 22\n" - "\tlsrs r0, 22\n" - "\tstrh r0, [r4, 0x4]\n" - "\tmovs r0, 0x32\n" - "\tldrsh r1, [r2, r0]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r3\n" - "\tldrh r0, [r0, 0x4]\n" - "\tlsls r0, 22\n" - "\tlsrs r0, 22\n" - "\tstrh r0, [r4, 0x6]\n" - "\tldr r1, _080C32C4 @ =gWindowTemplate_81E7278\n" - "\tmov r8, r1\n" - "\tldr r7, _080C32C8 @ =0x06010000\n" - "\tldr r2, _080C32CC @ =0x040000d4\n" - "\tldr r6, _080C32D0 @ =0x85000100\n" - "\tmov r1, sp\n" - "\tmovs r5, 0\n" - "\tadd r3, sp, 0x8\n" - "\tmovs r4, 0x3\n" - "_080C31CE:\n" - "\tldrh r0, [r1]\n" - "\tlsls r0, 5\n" - "\tadds r0, r7\n" - "\tstr r5, [sp, 0x8]\n" - "\tstr r3, [r2]\n" - "\tstr r0, [r2, 0x4]\n" - "\tstr r6, [r2, 0x8]\n" - "\tldr r0, [r2, 0x8]\n" - "\tadds r1, 0x2\n" - "\tsubs r4, 0x1\n" - "\tcmp r4, 0\n" - "\tbge _080C31CE\n" - "\tmov r0, r8\n" - "\tmov r1, r9\n" - "\tbl Text_GetStringWidthFromWindowTemplate\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tldr r2, _080C32D4 @ =gDisplayedStringBattle\n" - "\tldr r1, _080C32D8 @ =gUnknown_083D17E2\n" - "\tadds r0, r2, 0\n" - "\tbl StringCopy\n" - "\tadds r2, r0, 0\n" - "\tmvns r0, r5\n" - "\tadds r1, r0, 0x1\n" - "\tmovs r0, 0x7\n" - "\tands r1, r0\n" - "\tcmp r1, 0\n" - "\tbeq _080C3218\n" - "\tmovs r0, 0xFC\n" - "\tstrb r0, [r2]\n" - "\tmovs r0, 0x11\n" - "\tstrb r0, [r2, 0x1]\n" - "\tlsrs r0, r1, 1\n" - "\tstrb r0, [r2, 0x2]\n" - "\tadds r2, 0x3\n" - "_080C3218:\n" - "\tadds r6, r5, 0x7\n" - "\tmovs r1, 0x8\n" - "\tnegs r1, r1\n" - "\tadds r0, r1, 0\n" - "\tands r6, r0\n" - "\tlsls r6, 24\n" - "\tlsrs r5, r6, 24\n" - "\tadds r0, r2, 0\n" - "\tmov r1, r9\n" - "\tbl StringCopy\n" - "\tadds r2, r0, 0\n" - "\tmovs r0, 0xFC\n" - "\tstrb r0, [r2]\n" - "\tmovs r0, 0x13\n" - "\tstrb r0, [r2, 0x1]\n" - "\tstrb r5, [r2, 0x2]\n" - "\tmovs r0, 0xFF\n" - "\tstrb r0, [r2, 0x3]\n" - "\tldr r0, _080C32DC @ =gSharedMem + 0x18068\n" - "\tmov r10, r0\n" - "\tldr r1, _080C32D4 @ =gDisplayedStringBattle\n" - "\tbl sub_80034D4\n" - "\tmov r0, sp\n" - "\tldrh r4, [r0]\n" - "\tlsls r4, 5\n" - "\tldr r1, _080C32C8 @ =0x06010000\n" - "\tadds r7, r4, r1\n" - "\tldr r0, _080C32E0 @ =gUnknown_083D1624\n" - "\tmov r9, r0\n" - "\tldr r1, _080C32E4 @ =REG_BG0CNT\n" - "\tmov r8, r1\n" - "\tadds r1, r7, 0\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tmov r5, r9\n" - "\tadds r5, 0x80\n" - "\tldr r0, _080C32E8 @ =0x06010100\n" - "\tadds r1, r4, r0\n" - "\tadds r0, r5, 0\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tldr r0, _080C32EC @ =0x06010200\n" - "\tadds r1, r4, r0\n" - "\tadds r0, r5, 0\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tmov r0, r9\n" - "\tadds r0, 0x40\n" - "\tldr r1, _080C32F0 @ =0x06010300\n" - "\tadds r4, r1\n" - "\tadds r1, r4, 0\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tlsrs r5, r6, 27\n" - "\tmovs r4, 0\n" - "\tcmp r4, r5\n" - "\tbgt _080C3382\n" - "\tmov r6, sp\n" - "\tmov r0, r10\n" - "\tadds r0, 0x20\n" - "\tstr r0, [sp, 0xC]\n" - "\tmov r1, r10\n" - "\tstr r1, [sp, 0x10]\n" - "\tldr r0, _080C32F4 @ =0x0600fd20\n" - "\tstr r0, [sp, 0x14]\n" - "\tldr r1, _080C32F8 @ =0x0600fe20\n" - "\tstr r1, [sp, 0x18]\n" - "\tldr r0, _080C32FC @ =0x0600ff20\n" - "\tmov r10, r0\n" - "\tldr r1, _080C3300 @ =0x06010020\n" - "\tmov r9, r1\n" - "_080C32B2:\n" - "\tcmp r4, 0x6\n" - "\tbgt _080C3304\n" - "\tldrh r0, [r6]\n" - "\tlsls r0, 5\n" - "\tmov r1, r9\n" - "\tb _080C3322\n" - "\t.align 2, 0\n" - "_080C32C0: .4byte gSprites\n" - "_080C32C4: .4byte gWindowTemplate_81E7278\n" - "_080C32C8: .4byte 0x06010000\n" - "_080C32CC: .4byte 0x040000d4\n" - "_080C32D0: .4byte 0x85000100\n" - "_080C32D4: .4byte gDisplayedStringBattle\n" - "_080C32D8: .4byte gUnknown_083D17E2\n" - "_080C32DC: .4byte gSharedMem + 0x18068\n" - "_080C32E0: .4byte gUnknown_083D1624\n" - "_080C32E4: .4byte REG_BG0CNT\n" - "_080C32E8: .4byte 0x06010100\n" - "_080C32EC: .4byte 0x06010200\n" - "_080C32F0: .4byte 0x06010300\n" - "_080C32F4: .4byte 0x0600fd20\n" - "_080C32F8: .4byte 0x0600fe20\n" - "_080C32FC: .4byte 0x0600ff20\n" - "_080C3300: .4byte 0x06010020\n" - "_080C3304:\n" - "\tcmp r4, 0xE\n" - "\tbgt _080C3310\n" - "\tldrh r0, [r6, 0x2]\n" - "\tlsls r0, 5\n" - "\tmov r1, r10\n" - "\tb _080C3322\n" - "_080C3310:\n" - "\tcmp r4, 0x16\n" - "\tbgt _080C331C\n" - "\tldrh r0, [r6, 0x4]\n" - "\tlsls r0, 5\n" - "\tldr r1, [sp, 0x18]\n" - "\tb _080C3322\n" - "_080C331C:\n" - "\tldrh r0, [r6, 0x6]\n" - "\tlsls r0, 5\n" - "\tldr r1, [sp, 0x14]\n" - "_080C3322:\n" - "\tadds r7, r0, r1\n" - "\tcmp r4, r5\n" - "\tbeq _080C3382\n" - "\tldr r0, _080C33D0 @ =gUnknown_083D16E4\n" - "\tadds r1, r7, 0\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tmovs r0, 0xC0\n" - "\tlsls r0, 2\n" - "\tadds r1, r7, r0\n" - "\tldr r0, _080C33D0 @ =gUnknown_083D16E4\n" - "\tadds r0, 0x20\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 1\n" - "\tadds r1, r7, r0\n" - "\tldr r0, [sp, 0x10]\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 2\n" - "\tadds r1, r7, r0\n" - "\tldr r0, [sp, 0xC]\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tldr r1, [sp, 0xC]\n" - "\tadds r1, 0x40\n" - "\tstr r1, [sp, 0xC]\n" - "\tldr r0, [sp, 0x10]\n" - "\tadds r0, 0x40\n" - "\tstr r0, [sp, 0x10]\n" - "\tldr r1, [sp, 0x14]\n" - "\tadds r1, 0x20\n" - "\tstr r1, [sp, 0x14]\n" - "\tldr r0, [sp, 0x18]\n" - "\tadds r0, 0x20\n" - "\tstr r0, [sp, 0x18]\n" - "\tmovs r1, 0x20\n" - "\tadd r10, r1\n" - "\tadd r9, r1\n" - "\tadds r4, 0x1\n" - "\tcmp r4, r5\n" - "\tble _080C32B2\n" - "_080C3382:\n" - "\tldr r4, _080C33D4 @ =gUnknown_083D1644\n" - "\tldr r5, _080C33D8 @ =REG_BG0CNT\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r7, 0\n" - "\tadds r2, r5, 0\n" - "\tbl CpuSet\n" - "\tadds r6, r4, 0\n" - "\tadds r6, 0x80\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 1\n" - "\tadds r1, r7, r0\n" - "\tadds r0, r6, 0\n" - "\tadds r2, r5, 0\n" - "\tbl CpuSet\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 2\n" - "\tadds r1, r7, r0\n" - "\tadds r0, r6, 0\n" - "\tadds r2, r5, 0\n" - "\tbl CpuSet\n" - "\tadds r4, 0x40\n" - "\tmovs r0, 0xC0\n" - "\tlsls r0, 2\n" - "\tadds r1, r7, r0\n" - "\tadds r0, r4, 0\n" - "\tadds r2, r5, 0\n" - "\tbl CpuSet\n" - "\tadd sp, 0x1C\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080C33D0: .4byte gUnknown_083D16E4\n" - "_080C33D4: .4byte gUnknown_083D1644\n" - "_080C33D8: .4byte REG_BG0CNT"); -} -#endif //NONMATCHING - -void sub_80C33DC(void) -{ - int i; - struct SpriteTemplate template; - u8 spriteIds[8]; - - template = gSpriteTemplate_83D174C; - for (i = 0; i <8; i++) - LoadSpriteSheet(&gUnknown_083D1764[i]); - - LoadSpritePalette(&gUnknown_083D17A4); - for (i = 0; i < 8; i++) - { - spriteIds[i] = CreateSprite(&template, 272, 144, 10); - template.tileTag++; - } - - gSprites[spriteIds[0]].data[0] = spriteIds[1]; - gSprites[spriteIds[0]].data[1] = spriteIds[2]; - gSprites[spriteIds[0]].data[2] = spriteIds[3]; - - gSprites[spriteIds[4]].data[0] = spriteIds[5]; - gSprites[spriteIds[4]].data[1] = spriteIds[6]; - gSprites[spriteIds[4]].data[2] = spriteIds[7]; - - eContestLink80C2020Struct2018000.unk_00 = spriteIds[0]; - eContestLink80C2020Struct2018000.unk_04 = 0; - eContestLink80C2020Struct2018000.unk_01 = spriteIds[4]; - sub_80C3764(); -} - -u16 sub_80C34AC(const u8 * string) -{ - u8 width = (StringLength(string) * 6); - return 0x70 - (width / 2); -} - -void sub_80C34CC(s16 arg0, u16 y, u16 arg2, u16 arg3) -{ - struct Sprite *sprite = &gSprites[eContestLink80C2020Struct2018000.unk_00]; - sprite->pos1.x = 272; - sprite->pos1.y = y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data[4] = arg0 + 32; - sprite->data[5] = arg2; - sprite->data[6] = arg3; - sprite->data[7] = 0; - sprite->callback = sub_80C3588; - eContestLink80C2020Struct2018000.unk_04 = 1; -} - -void sub_80C3520(u16 arg0) -{ - struct Sprite *sprite = &gSprites[eContestLink80C2020Struct2018000.unk_00]; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.y = 0; - sprite->pos2.x = 0; - sprite->data[6] = arg0; - sprite->data[7] = 0; - sprite->callback = sub_80C3630; - eContestLink80C2020Struct2018000.unk_04 = 3; -} - -void sub_80C3564(struct Sprite *sprite) -{ - sprite->pos1.x = 272; - sprite->pos1.y = 144; - sprite->pos2.y = 0; - sprite->pos2.x = 0; - sprite->callback = SpriteCallbackDummy; - eContestLink80C2020Struct2018000.unk_04 = 0; -} - - -void sub_80C3588(struct Sprite *sprite) -{ - int i; - s16 var0; - - var0 = (u16)sprite->data[7] + (u16)sprite->data[6]; - sprite->pos1.x -= var0 >> 8; - sprite->data[7] = (sprite->data[6] + sprite->data[7]) & 0xFF; - if (sprite->pos1.x < sprite->data[4]) - sprite->pos1.x = sprite->data[4]; - - for (i = 0; i < 3; i++) - { - struct Sprite *sprite2 = &gSprites[sprite->data[i]]; - sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; - } - - if (sprite->pos1.x == sprite->data[4]) - sprite->callback = sub_80C35FC; -} - -void sub_80C35FC(struct Sprite *sprite) -{ - eContestLink80C2020Struct2018000.unk_04 = 2; - if ((u16)sprite->data[5] != 0xFFFF) - { - if (--sprite->data[5] == -1) - sub_80C3520(sprite->data[6]); - } -} - -void sub_80C3630(struct Sprite *sprite) -{ - int i; - s16 var0; - - var0 = (u16)sprite->data[7] + (u16)sprite->data[6]; - sprite->pos1.x -= var0 >> 8; - sprite->data[7] = (sprite->data[6] + sprite->data[7]) & 0xFF; - for (i = 0; i < 3; i++) - { - struct Sprite *sprite2 = &gSprites[sprite->data[i]]; - sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; - } - - if (sprite->pos1.x + sprite->pos2.x < -224) - sub_80C3564(sprite); -} - -void sub_80C3698(const u8 *text) -{ - int i; - u16 x; - struct Sprite *sprite; - - sub_80C3158(text, eContestLink80C2020Struct2018000.unk_01); - x = sub_80C34AC(text); - sprite = &gSprites[eContestLink80C2020Struct2018000.unk_01]; - sprite->pos1.x = x + 32; - sprite->pos1.y = 80; - sprite->invisible = 0; - for (i = 0; i < 3; i++) - { - gSprites[sprite->data[i]].pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; - gSprites[sprite->data[i]].pos1.y = sprite->pos1.y; - gSprites[sprite->data[i]].invisible = 0; - } - - gBattle_WIN0H = 0x00F0; - gBattle_WIN0V = ((sprite->pos1.y - 16) << 8) | (sprite->pos1.y + 16); - REG_WININ = WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR; -} - -void sub_80C3764(void) -{ - int i; - struct Sprite *sprite; - - sprite = &gSprites[eContestLink80C2020Struct2018000.unk_01]; - sprite->invisible = 1; - for (i = 0; i < 3; i++) - gSprites[sprite->data[i]].invisible = 1; - - gBattle_WIN0H = 0; - gBattle_WIN0V = 0; - REG_WIN0H = gBattle_WIN0H; - REG_WIN0V = gBattle_WIN0V; - REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR; -} - -#ifdef ENGLISH -#ifdef NONMATCHING -static inline s32 de_sub_80C39A8(s32 a0) -{ - s32 result = 0; - if (gIsLinkContest & 0x1) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 9, 2, 8, 2); - result = 8; - } - else if (gSpecialVar_ContestRank == 0) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 0, 9, 2); - result = 9; - } - else if (gSpecialVar_ContestRank == 1) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 9, 0, 8, 2); - result = 8; - } - else if (gSpecialVar_ContestRank == 2) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 17, 0, 8, 2); - result = 8; - } - else - { - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 2, 9, 2); - result = 9; - } - return result; -} - -static inline s32 de_sub_80C3A84(s32 a0, s32 * a1) -{ - s32 result; - if (gSpecialVar_ContestCategory == 0) - { - *a1 = 0; - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 17, 2, 10, 2); - result = 10; - } - else if (gSpecialVar_ContestCategory == 1) - { - *a1 = 1; - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 4, 11, 2); - result = 11; - } - else if (gSpecialVar_ContestCategory == 2) - { - *a1 = 2; - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 11, 4, 10, 2); - result = 10; - } - else if (gSpecialVar_ContestCategory == 3) - { - *a1 = 3; - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 21, 4, 10, 2); - result = 10; - } - else - { - *a1 = 4; - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 6, 10, 2); - result = 10; - } - return result; -} - -void sub_80C37E4(void) -{ - s32 sp0; - s32 i; - de_sub_80C3A84(de_sub_80C39A8(5) + 5, &sp0); - for (i = 0; i < 0x80; i++) - { - ((vu16 *)(VRAM + 0xE000))[i] &= 0xFFF; - ((vu16 *)(VRAM + 0xE000))[i] |= sp0 << 12;; - } -} -#else -NAKED -void sub_80C37E4(void) -{ - asm_unified("\tpush {r4-r6,lr}\n" - "\tsub sp, 0x10\n" - "\tmovs r5, 0x1\n" - "\tmovs r4, 0\n" - "\tldr r0, _080C3808 @ =gIsLinkContest\n" - "\tldrb r0, [r0]\n" - "\tadds r1, r5, 0\n" - "\tands r1, r0\n" - "\tcmp r1, 0\n" - "\tbeq _080C3814\n" - "\tldr r0, _080C380C @ =0x0600e000\n" - "\tldr r3, _080C3810 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0x9\n" - "\tstr r1, [sp]\n" - "\tmovs r2, 0x2\n" - "\tstr r2, [sp, 0x4]\n" - "\tb _080C386A\n" - "\t.align 2, 0\n" - "_080C3808: .4byte gIsLinkContest\n" - "_080C380C: .4byte 0x0600e000\n" - "_080C3810: .4byte gUnknown_08E964B8\n" - "_080C3814:\n" - "\tldr r0, _080C3830 @ =gSpecialVar_ContestRank\n" - "\tldrh r2, [r0]\n" - "\tcmp r2, 0\n" - "\tbne _080C383C\n" - "\tmovs r4, 0x1\n" - "\tldr r0, _080C3834 @ =0x0600e000\n" - "\tldr r3, _080C3838 @ =gUnknown_08E964B8\n" - "\tstr r2, [sp]\n" - "\tstr r2, [sp, 0x4]\n" - "\tmovs r1, 0x9\n" - "\tstr r1, [sp, 0x8]\n" - "\tmovs r1, 0x2\n" - "\tstr r1, [sp, 0xC]\n" - "\tb _080C3870\n" - "\t.align 2, 0\n" - "_080C3830: .4byte gSpecialVar_ContestRank\n" - "_080C3834: .4byte 0x0600e000\n" - "_080C3838: .4byte gUnknown_08E964B8\n" - "_080C383C:\n" - "\tcmp r2, 0x1\n" - "\tbne _080C385C\n" - "\tldr r0, _080C3854 @ =0x0600e000\n" - "\tldr r3, _080C3858 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0x9\n" - "\tstr r1, [sp]\n" - "\tstr r4, [sp, 0x4]\n" - "\tmovs r1, 0x8\n" - "\tstr r1, [sp, 0x8]\n" - "\tmovs r1, 0x2\n" - "\tstr r1, [sp, 0xC]\n" - "\tb _080C3870\n" - "\t.align 2, 0\n" - "_080C3854: .4byte 0x0600e000\n" - "_080C3858: .4byte gUnknown_08E964B8\n" - "_080C385C:\n" - "\tcmp r2, 0x2\n" - "\tbne _080C3884\n" - "\tldr r0, _080C387C @ =0x0600e000\n" - "\tldr r3, _080C3880 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0x11\n" - "\tstr r1, [sp]\n" - "\tstr r4, [sp, 0x4]\n" - "_080C386A:\n" - "\tmovs r1, 0x8\n" - "\tstr r1, [sp, 0x8]\n" - "\tstr r2, [sp, 0xC]\n" - "_080C3870:\n" - "\tmovs r1, 0x5\n" - "\tmovs r2, 0x1\n" - "\tbl sub_809D104\n" - "\tb _080C389E\n" - "\t.align 2, 0\n" - "_080C387C: .4byte 0x0600e000\n" - "_080C3880: .4byte gUnknown_08E964B8\n" - "_080C3884:\n" - "\tmovs r4, 0x1\n" - "\tldr r0, _080C38C0 @ =0x0600e000\n" - "\tldr r3, _080C38C4 @ =gUnknown_08E964B8\n" - "\tstr r1, [sp]\n" - "\tmovs r2, 0x2\n" - "\tstr r2, [sp, 0x4]\n" - "\tmovs r1, 0x9\n" - "\tstr r1, [sp, 0x8]\n" - "\tstr r2, [sp, 0xC]\n" - "\tmovs r1, 0x5\n" - "\tmovs r2, 0x1\n" - "\tbl sub_809D104\n" - "_080C389E:\n" - "\tadds r4, 0xD\n" - "\tldr r0, _080C38C8 @ =gSpecialVar_ContestCategory\n" - "\tldrh r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _080C38CC\n" - "\tmovs r6, 0\n" - "\tldr r0, _080C38C0 @ =0x0600e000\n" - "\tldr r3, _080C38C4 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0x11\n" - "\tstr r1, [sp]\n" - "\tmovs r2, 0x2\n" - "\tstr r2, [sp, 0x4]\n" - "\tmovs r1, 0xA\n" - "\tstr r1, [sp, 0x8]\n" - "\tstr r2, [sp, 0xC]\n" - "\tb _080C392A\n" - "\t.align 2, 0\n" - "_080C38C0: .4byte 0x0600e000\n" - "_080C38C4: .4byte gUnknown_08E964B8\n" - "_080C38C8: .4byte gSpecialVar_ContestCategory\n" - "_080C38CC:\n" - "\tcmp r0, 0x1\n" - "\tbne _080C38EC\n" - "\tmovs r6, 0x1\n" - "\tldr r0, _080C38E4 @ =0x0600e000\n" - "\tldr r3, _080C38E8 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0\n" - "\tstr r1, [sp]\n" - "\tmovs r1, 0x4\n" - "\tstr r1, [sp, 0x4]\n" - "\tmovs r1, 0xB\n" - "\tb _080C3924\n" - "\t.align 2, 0\n" - "_080C38E4: .4byte 0x0600e000\n" - "_080C38E8: .4byte gUnknown_08E964B8\n" - "_080C38EC:\n" - "\tcmp r0, 0x2\n" - "\tbne _080C3910\n" - "\tmovs r6, 0x2\n" - "\tldr r0, _080C3908 @ =0x0600e000\n" - "\tldr r3, _080C390C @ =gUnknown_08E964B8\n" - "\tmovs r1, 0xB\n" - "\tstr r1, [sp]\n" - "\tmovs r1, 0x4\n" - "\tstr r1, [sp, 0x4]\n" - "\tmovs r1, 0xA\n" - "\tstr r1, [sp, 0x8]\n" - "\tstr r6, [sp, 0xC]\n" - "\tb _080C392A\n" - "\t.align 2, 0\n" - "_080C3908: .4byte 0x0600e000\n" - "_080C390C: .4byte gUnknown_08E964B8\n" - "_080C3910:\n" - "\tcmp r0, 0x3\n" - "\tbne _080C393C\n" - "\tmovs r6, 0x3\n" - "\tldr r0, _080C3934 @ =0x0600e000\n" - "\tldr r3, _080C3938 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0x15\n" - "\tstr r1, [sp]\n" - "\tmovs r1, 0x4\n" - "\tstr r1, [sp, 0x4]\n" - "\tmovs r1, 0xA\n" - "_080C3924:\n" - "\tstr r1, [sp, 0x8]\n" - "\tmovs r1, 0x2\n" - "\tstr r1, [sp, 0xC]\n" - "_080C392A:\n" - "\tadds r1, r4, 0\n" - "\tadds r2, r5, 0\n" - "\tbl sub_809D104\n" - "\tb _080C395A\n" - "\t.align 2, 0\n" - "_080C3934: .4byte 0x0600e000\n" - "_080C3938: .4byte gUnknown_08E964B8\n" - "_080C393C:\n" - "\tmovs r6, 0x4\n" - "\tldr r0, _080C3984 @ =0x0600e000\n" - "\tldr r3, _080C3988 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0\n" - "\tstr r1, [sp]\n" - "\tmovs r1, 0x6\n" - "\tstr r1, [sp, 0x4]\n" - "\tmovs r1, 0xA\n" - "\tstr r1, [sp, 0x8]\n" - "\tmovs r1, 0x2\n" - "\tstr r1, [sp, 0xC]\n" - "\tadds r1, r4, 0\n" - "\tadds r2, r5, 0\n" - "\tbl sub_809D104\n" - "_080C395A:\n" - "\tldr r5, _080C398C @ =0x00000fff\n" - "\tlsls r4, r6, 12\n" - "\tldr r2, _080C3984 @ =0x0600e000\n" - "\tmovs r3, 0x7F\n" - "_080C3962:\n" - "\tldrh r1, [r2]\n" - "\tadds r0, r5, 0\n" - "\tands r0, r1\n" - "\tstrh r0, [r2]\n" - "\tldrh r1, [r2]\n" - "\tadds r0, r4, 0\n" - "\torrs r0, r1\n" - "\tstrh r0, [r2]\n" - "\tadds r2, 0x2\n" - "\tsubs r3, 0x1\n" - "\tcmp r3, 0\n" - "\tbge _080C3962\n" - "\tadd sp, 0x10\n" - "\tpop {r4-r6}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080C3984: .4byte 0x0600e000\n" - "_080C3988: .4byte gUnknown_08E964B8\n" - "_080C398C: .4byte 0x00000fff"); -} -#endif // NONMATCHING - -#elif defined(GERMAN) -s16 de_sub_80C39A8(s32 a0) -{ - s16 result; - if (gIsLinkContest & 1) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 11, 3, 8, 3); - result = 8; - } - else if (gSpecialVar_ContestRank == 0) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 0, 0, 11, 3); - result = 11; - } - else if (gSpecialVar_ContestRank == 1) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 11, 0, 10, 3); - result = 10; - } - else if (gSpecialVar_ContestRank == 2) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 21, 0, 10, 3); - result = 10; - } - else - { - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 0, 3, 11, 3); - result = 11; - } - return result; -} - -s16 de_sub_80C3A84(s32 a0, s32 * a1) -{ - s16 result; - if (gSpecialVar_ContestCategory == 0) - { - *a1 = 0; - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 19, 3, 7, 3); - result = 7; - } - else if (gSpecialVar_ContestCategory == 1) - { - *a1 = 1; - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 0, 6, 7, 3); - result = 7; - } - else if (gSpecialVar_ContestCategory == 2) - { - *a1 = 2; - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 7, 6, 4, 3); - result = 4; - } - else if (gSpecialVar_ContestCategory == 3) - { - *a1 = 3; - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 11, 6, 6, 3); - result = 6; - } - else - { - *a1 = 4; - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 17, 6, 5, 3); - result = 5; - } - return result; -} - -void sub_80C37E4(void) -{ - s32 sp0; - s32 i; - de_sub_80C3A84(de_sub_80C39A8(6) + 6, &sp0); - for (i = 0; i < 0x80; i++) - { - ((vu16 *)(VRAM + 0xE000))[i] &= 0xFFF; - ((vu16 *)(VRAM + 0xE000))[i] |= sp0 << 12;; - } -} -#endif - -// fakematching? -u8 sub_80C3990(u8 monIndex, u8 arg1) -{ - u32 var0; - u32 var1; - - var0 = gContestMonConditions[monIndex] << 16; - var1 = var0 / 0x3F; - if (var1 & 0xFFFF) - var1 += 0x10000; - - var1 >>= 16; - if (var1 == 0 && var0) - var1 = 1; - - if (arg1 && var1 > 10) - var1 = 10; - - return var1; -} - -s8 sub_80C39E4(u8 arg0, u8 arg1) -{ - u32 r4; - u32 r2; - s16 val; - s8 ret; - - val = gUnknown_02038688[arg0]; - if (val < 0) - r4 = -val << 16; - else - r4 = val << 16; - r2 = r4 / 80; - if (r2 & 0xFFFF) - r2 += 0x10000; - - r2 >>= 16; - if (r2 == 0 && r4 != 0) - r2 = 1; - - if (arg1 != 0 && r2 > 10) - r2 = 10; - - if (gUnknown_02038688[arg0] < 0) - ret = -r2; - else - ret = r2; - - return ret; -} - -void sub_80C3A5C(u8 taskId) -{ - u16 firstTileNum; - - if (gTasks[taskId].data[10] == 0) - { - gTasks[taskId].data[11] = (3 - gTasks[taskId].data[0]) * 40; - gTasks[taskId].data[10]++; - } - else if (gTasks[taskId].data[10] == 1) - { - if (--gTasks[taskId].data[11] == -1) - { - firstTileNum = gTasks[taskId].data[0] * 2 + 0x5043; - *(vu16 *)((VRAM + 0xE142) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x00; - *(vu16 *)((VRAM + 0xE144) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x01; - *(vu16 *)((VRAM + 0xE182) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x10; - *(vu16 *)((VRAM + 0xE184) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x11; - eContestLink80C2020Struct2018000.unk_05++; - DestroyTask(taskId); - PlaySE(SE_JYUNI); - } - } -} - -#ifdef NONMATCHING -void sub_80C3B30(u8 taskId) -{ - int i, j, k; - - for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) - ; - - for (j = 0; j < 3; j++) - { - for (k = 0; k < 30; k++) - { - ((u16 *)((VRAM + 0xE100) + 2 * (96 * i + 32 * j)))[k] &= 0x0FFF; - ((u16 *)((VRAM + 0xE100) + 2 * (96 * i + 32 * j)))[k] |= 0x9000; - } - } - gTasks[taskId].data[10] = i; - gTasks[taskId].data[12] = 1; - gTasks[taskId].func = sub_80C3BD8; - eContestLink80C2020Struct2018000.unk_03 = taskId; -} -#else -NAKED -void sub_80C3B30(u8 taskId) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r12, r0\n" - "\tmovs r5, 0\n" - "\tldr r1, _080C3BC0 @ =gContestFinalStandings\n" - "\tldrb r0, [r1]\n" - "\tldr r2, _080C3BC4 @ =gTasks\n" - "\tmov r10, r2\n" - "\tcmp r0, 0\n" - "\tbeq _080C3B5C\n" - "_080C3B4E:\n" - "\tadds r5, 0x1\n" - "\tcmp r5, 0x3\n" - "\tbgt _080C3B5C\n" - "\tadds r0, r5, r1\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _080C3B4E\n" - "_080C3B5C:\n" - "\tmovs r1, 0\n" - "\tlsls r0, r5, 1\n" - "\tmov r2, r12\n" - "\tlsls r2, 2\n" - "\tmov r9, r2\n" - "\tadds r0, r5\n" - "\tlsls r0, 5\n" - "\tmov r8, r0\n" - "\tldr r7, _080C3BC8 @ =0x00000fff\n" - "\tmovs r0, 0x90\n" - "\tlsls r0, 8\n" - "\tadds r6, r0, 0\n" - "_080C3B74:\n" - "\tlsls r0, r1, 5\n" - "\tadds r4, r1, 0x1\n" - "\tadd r0, r8\n" - "\t@ the next two instructions are swapped\n" - "\tmovs r3, 0x1D\n" - "\tlsls r0, 1\n" - "\tldr r1, _080C3BCC @ =0x0600e100\n" - "\tadds r2, r0, r1\n" - "_080C3B82:\n" - "\tldrh r1, [r2]\n" - "\tadds r0, r7, 0\n" - "\tands r0, r1\n" - "\torrs r0, r6\n" - "\tstrh r0, [r2]\n" - "\tadds r2, 0x2\n" - "\tsubs r3, 0x1\n" - "\tcmp r3, 0\n" - "\tbge _080C3B82\n" - "\tadds r1, r4, 0\n" - "\tcmp r1, 0x2\n" - "\tble _080C3B74\n" - "\tmov r0, r9\n" - "\tadd r0, r12\n" - "\tlsls r0, 3\n" - "\tadd r0, r10\n" - "\tstrh r5, [r0, 0x1C]\n" - "\tmovs r1, 0x1\n" - "\tstrh r1, [r0, 0x20]\n" - "\tldr r2, _080C3BD0 @ =sub_80C3BD8\n" - "\tstr r2, [r0]\n" - "\tmov r1, r12\n" - "\tldr r0, _080C3BD4 @ =gSharedMem + 0x18000\n" - "\tstrb r1, [r0, 0x3]\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080C3BC0: .4byte gContestFinalStandings\n" - "_080C3BC4: .4byte gTasks\n" - "_080C3BC8: .4byte 0x00000fff\n" - "_080C3BCC: .4byte 0x0600e100\n" - "_080C3BD0: .4byte sub_80C3BD8\n" - "_080C3BD4: .4byte gSharedMem + 0x18000"); -} -#endif //NONMATCHING - -void sub_80C3BD8(u8 taskId) -{ - if (++gTasks[taskId].data[11] == 1) - { - gTasks[taskId].data[11] = 0; - BlendPalette(0x91, 1, gTasks[taskId].data[12], RGB(13, 28, 27)); - if (gTasks[taskId].data[13] == 0) - { - if (++gTasks[taskId].data[12] == 16) - gTasks[taskId].data[13] = 1; - } - else - { - if (--gTasks[taskId].data[12] == 0) - gTasks[taskId].data[13] = 0; - } - } -} - -void sub_80C3C44(struct Sprite *sprite) -{ - if (sprite->data[0] < 10) - { - if (++sprite->data[0] == 10) - { - PlayCry1(sprite->data[1], 0); - sprite->data[1] = 0; - } - } - else - { - s16 delta = (u16)sprite->data[1] + 0x600; - sprite->pos1.x -= delta >> 8; - sprite->data[1] = (sprite->data[1] + 0x600) & 0xFF; - if (sprite->pos1.x < 120) - sprite->pos1.x = 120; - - if (sprite->pos1.x == 120) - { - sprite->callback = SpriteCallbackDummy; - sprite->data[1] = 0; - eContestLink80C2020Struct2018000.unk_06 = 1; - } - } -} - -void sub_80C3CB8(struct Sprite *sprite) -{ - s16 delta = (u16)sprite->data[1] + 0x600; - sprite->pos1.x -= delta >> 8; - sprite->data[1] = (sprite->data[1] + 0x600) & 0xFF; - if (sprite->pos1.x < -32) - { - sprite->callback = SpriteCallbackDummy; - sprite->invisible = 1; - eContestLink80C2020Struct2018000.unk_06 = 2; - } -} - -void sub_80C3D04(u8 taskId) -{ - if (++gTasks[taskId].data[0] == 5) - { - gTasks[taskId].data[0] = 0; - if (eContestLink80C2020Struct2018000.unk_07 < 40) - { - u8 spriteId = CreateSprite(&gSpriteTemplate_83D17B4, (Random() % 240) - 20, 44, 5); - gSprites[spriteId].data[0] = Random() % 512; - gSprites[spriteId].data[1] = (Random() % 24) + 16; - gSprites[spriteId].data[2] = (Random() % 256) + 48; - gSprites[spriteId].oam.tileNum += Random() % 17; - eContestLink80C2020Struct2018000.unk_07++; - } - } - - if (eContestLink80C2020Struct2018000.unk_09) - DestroyTask(taskId); -} - -void sub_80C3DF0(struct Sprite *sprite) -{ - register s16 var0 asm("r1"); - - sprite->data[3] += sprite->data[0]; - sprite->pos2.x = Sin(sprite->data[3] >> 8, sprite->data[1]); - var0 = sprite->data[4] + sprite->data[2]; - sprite->pos1.x += var0 >> 8; - var0 = var0 & 0xFF; - sprite->data[4] = var0; - sprite->pos1.y++; - if (eContestLink80C2020Struct2018000.unk_09) - sprite->invisible = 1; - - if (sprite->pos1.x > 248 || sprite->pos1.y > 116) - { - DestroySprite(sprite); - eContestLink80C2020Struct2018000.unk_07--; - } -} - -void sub_80C3E60(u8 monIndex, u8 numFrames) -{ - u8 taskId = CreateTask(sub_80C3EA4, 8); - gTasks[taskId].data[0] = monIndex; - gTasks[taskId].data[1] = numFrames; - gTasks[taskId].data[2] = gContestMons[monIndex].species; -} - -void sub_80C3EA4(u8 taskId) -{ - u8 monIndex = gTasks[taskId].data[0]; - if (gTasks[taskId].data[10]++ == gTasks[taskId].data[1]) - { - gTasks[taskId].data[10] = 0; - sub_80C3024(gTasks[taskId].data[2], monIndex, gTasks[taskId].data[11], FALSE, gContestMons[monIndex].personality); - gTasks[taskId].data[11] ^= 1; - } -} - -void sub_80C3F00(void) -{ - s32 i; - s16 r2 = gUnknown_02038678[0]; - s32 r4; - u32 r5; - s8 r0; - - for (i = 1; i < 4; i++) - { - if (r2 < gUnknown_02038678[i]) - r2 = gUnknown_02038678[i]; - } - - if (r2 < 0) - { - r2 = gUnknown_02038678[0]; - - for (i = 1; i < 4; i++) - { - if (r2 > gUnknown_02038678[i]) - r2 = gUnknown_02038678[i]; - } - } - - for (i = 0; i < 4; i++) - { - r4 = 1000 * gContestMonConditions[i] / ABS(r2); - if ((r4 % 10) >= 5) - r4 += 10; - eContestLink80C2020Struct2018018[i].unk_00 = r4 / 10; - - r4 = 1000 * ABS(gUnknown_02038688[i]) / ABS(r2); - if ((r4 % 10) >= 5) - r4 += 10; - eContestLink80C2020Struct2018018[i].unk_04 = r4 / 10; - - if (gUnknown_02038688[i] < 0) - eContestLink80C2020Struct2018018[i].unk_10 = 1; - - r5 = 22528 * eContestLink80C2020Struct2018018[i].unk_00 / 100; - if ((r5 % 256) >= 128) - r5 += 256; - eContestLink80C2020Struct2018018[i].unk_08 = r5 / 256; - - r5 = eContestLink80C2020Struct2018018[i].unk_04 * 22528 / 100; - if ((r5 % 256) >= 128) - r5 += 256; - eContestLink80C2020Struct2018018[i].unk_0c = r5 / 256; - - eContestLink80C2020Struct2018018[i].unk_11 = sub_80C3990(i, 1); - r0 = sub_80C39E4(i, 1); - eContestLink80C2020Struct2018018[i].unk_12 = ABS(r0); - - if (gContestFinalStandings[i]) - { - s16 r2__ = eContestLink80C2020Struct2018018[i].unk_08; - s16 r1__ = eContestLink80C2020Struct2018018[i].unk_0c; - if (eContestLink80C2020Struct2018018[i].unk_10) - r1__ = -r1__; - if (r2__ + r1__ == 88) - { - if (r1__ > 0) - eContestLink80C2020Struct2018018[i].unk_0c--; - else if (r2__ > 0) - eContestLink80C2020Struct2018018[i].unk_08--; - } - } - } -} - -#ifdef NONMATCHING -void sub_80C40D4(u8 arg0, u8 arg1) -{ - int i; - u8 taskId; - u8 sp8, spC; - - sp8 = 0; - spC = 0; - if (!arg0) - { - u32 var0; - for (i = 0; i < 4; i++) - { - u8 var1 = eContestLink80C2020Struct2018018[i].unk_11; - if (arg1 < var1) - { - int x = var1 + 19; - x += 32 * (i * 3 + 5); - x -= arg1; - x--; - *(vu16 *)((VRAM + 0xC000) + 2 * x) = 0x60B3; - taskId = CreateTask(sub_80C42C0, 10); - var0 = ((eContestLink80C2020Struct2018018[i].unk_08 << 16) / eContestLink80C2020Struct2018018[i].unk_11) * (arg1 + 1); - if ((var0 % 0x10000) >= 0x8000) - var0 += 0x10000; - - gTasks[taskId].data[0] = i; - gTasks[taskId].data[1] = var0 >> 16; - eContestLink80C2020Struct2018000.unk_14++; - sp8++; - } - } - } - else - { - u32 var0; - for (i = 0; i < 4; i++) - { - int tile; - s8 var1 = eContestLink80C2020Struct2018018[i].unk_12; - tile = eContestLink80C2020Struct2018018[i].unk_10 ? 0x60A5 : 0x60A3; - if (arg1 < var1) - { - int x = var1 + 19; - x += 32 * (i * 3 + 6); - x -= arg1; - x--; - *(vu16 *)((VRAM + 0xC000) + 2 * x) = tile; - taskId = CreateTask(sub_80C42C0, 10); - var0 = ((eContestLink80C2020Struct2018018[i].unk_0c << 16) / eContestLink80C2020Struct2018018[i].unk_12) * (arg1 + 1); - if ((var0 % 0x10000) >= 0x8000) - var0 += 0x10000; - - gTasks[taskId].data[0] = i; - if (eContestLink80C2020Struct2018018[i].unk_10) - { - gTasks[taskId].data[2] = 1; - spC++; - } - else - { - sp8++; - } - - if (eContestLink80C2020Struct2018018[i].unk_10) - gTasks[taskId].data[1] = -(var0 >> 16) + eContestLink80C2020Struct2018018[i].unk_08; - else - gTasks[taskId].data[1] = (var0 >> 16) + eContestLink80C2020Struct2018018[i].unk_08; - - eContestLink80C2020Struct2018000.unk_14++; - } - } - } - - if (spC) - PlaySE(SE_BOO); - - if (sp8) - PlaySE(SE_PIN); -} -#else -// Assorted register differences -NAKED -void sub_80C40D4(u8 arg0, u8 arg1) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x8\n" - "\tlsls r0, 24\n" - "\tlsls r1, 24\n" - "\tlsrs r7, r1, 24\n" - "\tmovs r1, 0\n" - "\tmov r10, r1\n" - "\tmovs r2, 0\n" - "\tstr r2, [sp]\n" - "\tcmp r0, 0\n" - "\tbne _080C4198\n" - "\tmov r8, r2\n" - "\tldr r0, _080C417C @ =gSharedMem + 0x18018\n" - "\tsubs r1, 0x18\n" - "\tadds r1, r0\n" - "\tmov r9, r1\n" - "\tadds r4, r0, 0\n" - "\tadds r4, 0x8\n" - "\tmovs r6, 0xA0\n" - "_080C4102:\n" - "\tldrb r0, [r4, 0x9]\n" - "\tcmp r7, r0\n" - "\tbcs _080C416A\n" - "\tadds r0, 0x13\n" - "\tadds r0, r6, r0\n" - "\tsubs r0, r7\n" - "\tlsls r0, 1\n" - "\tldr r2, _080C4180 @ =0x0600bffe\n" - "\tadds r0, r2\n" - "\tldr r2, _080C4184 @ =0x000060b3\n" - "\tadds r1, r2, 0\n" - "\tstrh r1, [r0]\n" - "\tldr r0, _080C4188 @ =sub_80C42C0\n" - "\tmovs r1, 0xA\n" - "\tbl CreateTask\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tldr r0, [r4]\n" - "\tlsls r0, 16\n" - "\tldrb r1, [r4, 0x9]\n" - "\tbl __udivsi3\n" - "\tadds r1, r7, 0x1\n" - "\tadds r3, r0, 0\n" - "\tmuls r3, r1\n" - "\tldr r0, _080C418C @ =0x0000ffff\n" - "\tands r0, r3\n" - "\tldr r1, _080C4190 @ =0x00007fff\n" - "\tcmp r0, r1\n" - "\tbls _080C4146\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 9\n" - "\tadds r3, r0\n" - "_080C4146:\n" - "\tldr r1, _080C4194 @ =gTasks\n" - "\tlsls r0, r5, 2\n" - "\tadds r0, r5\n" - "\tlsls r0, 3\n" - "\tadds r0, r1\n" - "\tmov r1, r8\n" - "\tstrh r1, [r0, 0x8]\n" - "\tlsrs r1, r3, 16\n" - "\tstrh r1, [r0, 0xA]\n" - "\tmov r2, r9\n" - "\tldrb r0, [r2, 0x14]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r2, 0x14]\n" - "\tmov r0, r10\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r10, r0\n" - "_080C416A:\n" - "\tadds r4, 0x14\n" - "\tadds r6, 0x60\n" - "\tmovs r0, 0x1\n" - "\tadd r8, r0\n" - "\tmov r1, r8\n" - "\tcmp r1, 0x3\n" - "\tble _080C4102\n" - "\tb _080C4292\n" - "\t.align 2, 0\n" - "_080C417C: .4byte gSharedMem + 0x18018\n" - "_080C4180: .4byte 0x0600bffe\n" - "_080C4184: .4byte 0x000060b3\n" - "_080C4188: .4byte sub_80C42C0\n" - "_080C418C: .4byte 0x0000ffff\n" - "_080C4190: .4byte 0x00007fff\n" - "_080C4194: .4byte gTasks\n" - "_080C4198:\n" - "\tmovs r2, 0\n" - "\tmov r8, r2\n" - "\tldr r0, _080C4220 @ =gSharedMem + 0x18018\n" - "\tmov r12, r0\n" - "\tmov r9, r2\n" - "\tmovs r1, 0xC0\n" - "\tstr r1, [sp, 0x4]\n" - "_080C41A6:\n" - "\tmov r6, r9\n" - "\tadd r6, r12\n" - "\tldrb r1, [r6, 0x12]\n" - "\tldrb r0, [r6, 0x10]\n" - "\tldr r2, _080C4224 @ =0x000060a3\n" - "\tcmp r0, 0\n" - "\tbeq _080C41B6\n" - "\tadds r2, 0x2\n" - "_080C41B6:\n" - "\tlsls r0, r1, 24\n" - "\tasrs r0, 24\n" - "\tcmp r7, r0\n" - "\tbge _080C427E\n" - "\tadds r0, 0x13\n" - "\tldr r1, [sp, 0x4]\n" - "\tadds r0, r1, r0\n" - "\tsubs r0, r7\n" - "\tlsls r0, 1\n" - "\tldr r1, _080C4228 @ =0x0600bffe\n" - "\tadds r0, r1\n" - "\tstrh r2, [r0]\n" - "\tldr r0, _080C422C @ =sub_80C42C0\n" - "\tmovs r1, 0xA\n" - "\tbl CreateTask\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tldr r0, [r6, 0xC]\n" - "\tlsls r0, 16\n" - "\tldrb r1, [r6, 0x12]\n" - "\tbl __udivsi3\n" - "\tadds r1, r7, 0x1\n" - "\tadds r3, r0, 0\n" - "\tmuls r3, r1\n" - "\tldr r0, _080C4230 @ =0x0000ffff\n" - "\tands r0, r3\n" - "\tldr r1, _080C4234 @ =0x00007fff\n" - "\tcmp r0, r1\n" - "\tbls _080C41FA\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 9\n" - "\tadds r3, r2\n" - "_080C41FA:\n" - "\tldr r1, _080C4238 @ =gTasks\n" - "\tlsls r2, r5, 2\n" - "\tadds r0, r2, r5\n" - "\tlsls r0, 3\n" - "\tadds r4, r0, r1\n" - "\tmov r0, r8\n" - "\tstrh r0, [r4, 0x8]\n" - "\tldrb r0, [r6, 0x10]\n" - "\tadds r6, r1, 0\n" - "\tcmp r0, 0\n" - "\tbeq _080C423C\n" - "\tmovs r0, 0x1\n" - "\tstrh r0, [r4, 0xC]\n" - "\tldr r0, [sp]\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tstr r0, [sp]\n" - "\tb _080C4246\n" - "\t.align 2, 0\n" - "_080C4220: .4byte gSharedMem + 0x18018\n" - "_080C4224: .4byte 0x000060a3\n" - "_080C4228: .4byte 0x0600bffe\n" - "_080C422C: .4byte sub_80C42C0\n" - "_080C4230: .4byte 0x0000ffff\n" - "_080C4234: .4byte 0x00007fff\n" - "_080C4238: .4byte gTasks\n" - "_080C423C:\n" - "\tmov r0, r10\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r10, r0\n" - "_080C4246:\n" - "\tldr r0, _080C4264 @ =gSharedMem + 0x18018\n" - "\tmov r1, r9\n" - "\tadds r4, r1, r0\n" - "\tldrb r1, [r4, 0x10]\n" - "\tmov r12, r0\n" - "\tcmp r1, 0\n" - "\tbeq _080C4268\n" - "\tadds r0, r2, r5\n" - "\tlsls r0, 3\n" - "\tadds r0, r6\n" - "\tlsrs r2, r3, 16\n" - "\tldr r1, [r4, 0x8]\n" - "\tsubs r1, r2\n" - "\tb _080C4274\n" - "\t.align 2, 0\n" - "_080C4264: .4byte gSharedMem + 0x18018\n" - "_080C4268:\n" - "\tadds r0, r2, r5\n" - "\tlsls r0, 3\n" - "\tadds r0, r6\n" - "\tlsrs r2, r3, 16\n" - "\tldr r1, [r4, 0x8]\n" - "\tadds r1, r2\n" - "_080C4274:\n" - "\tstrh r1, [r0, 0xA]\n" - "\tldr r1, _080C42BC @ =gSharedMem + 0x18000\n" - "\tldrb r0, [r1, 0x14]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1, 0x14]\n" - "_080C427E:\n" - "\tmovs r2, 0x14\n" - "\tadd r9, r2\n" - "\tldr r0, [sp, 0x4]\n" - "\tadds r0, 0x60\n" - "\tstr r0, [sp, 0x4]\n" - "\tmovs r1, 0x1\n" - "\tadd r8, r1\n" - "\tmov r2, r8\n" - "\tcmp r2, 0x3\n" - "\tble _080C41A6\n" - "_080C4292:\n" - "\tldr r0, [sp]\n" - "\tcmp r0, 0\n" - "\tbeq _080C429E\n" - "\tmovs r0, 0x16\n" - "\tbl PlaySE\n" - "_080C429E:\n" - "\tmov r1, r10\n" - "\tcmp r1, 0\n" - "\tbeq _080C42AA\n" - "\tmovs r0, 0x15\n" - "\tbl PlaySE\n" - "_080C42AA:\n" - "\tadd sp, 0x8\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080C42BC: .4byte gSharedMem + 0x18000"); -} -#endif //NONMATCHING - -void sub_80C42C0(u8 taskId /*r12*/) -{ - bool32 r6 = FALSE; - bool32 r9 = FALSE; - u8 r5 = gTasks[taskId].data[0]; - s16 r7 = gTasks[taskId].data[1]; - s16 r1 = gTasks[taskId].data[2]; - s32 i; - - if (r1 != 0) - { - if (eContestLink80C2020Struct2018000.unk_0c[r5] <= 0) - r6 = TRUE; - } - else - { - if (eContestLink80C2020Struct2018000.unk_0c[r5] >= 88) - r6 = TRUE; - } - if (eContestLink80C2020Struct2018000.unk_0c[r5] == r7) - r9 = TRUE; - - if (!r9) - { - if (r6) - { - eContestLink80C2020Struct2018000.unk_0c[r5] = r7; - } - else if (r1 != 0) - { - eContestLink80C2020Struct2018000.unk_0c[r5]--; - } - else - { - eContestLink80C2020Struct2018000.unk_0c[r5]++; - } - } - if (!r6) - { - if (!r9) - { - for (i = 0; i < 11; i++) - { - u8 r0; - u16 tile; - if (eContestLink80C2020Struct2018000.unk_0c[r5] >= 8 * (i + 1)) - { - r0 = 8; - } - else if (eContestLink80C2020Struct2018000.unk_0c[r5] >= 8 * i) - { - r0 = eContestLink80C2020Struct2018000.unk_0c[r5] % 8; - } - else - { - r0 = 0; - } - if (r0 < 4) - tile = 0x504C + r0; - else - tile = 0x5057 + r0; - *(vu16 *)((VRAM + 0xE18E) + 2 * (96 * r5 + i)) = tile; - } - } - } - if (r9) - { - eContestLink80C2020Struct2018000.unk_14--; - DestroyTask(taskId); - } -} - -void ScrSpecial_CheckSelectedMonAndInitContest(void) -{ - u8 result = CanMonParticipateInContest(&gPlayerParty[gContestMonPartyIndex]); - if (result != 0) - { - Contest_InitAllPokemon(gSpecialVar_ContestCategory, gSpecialVar_ContestRank); - InitContestMonConditions(gSpecialVar_ContestCategory); - } - gSpecialVar_Result = result; -} - -u16 ScrSpecial_CanMonParticipateInSelectedLinkContest(void) -{ - u16 result = 0; - struct Pokemon *mon = &gPlayerParty[gContestMonPartyIndex]; - switch (gSpecialVar_ContestCategory) - { - case CONTEST_CATEGORY_COOL: - if (GetMonData(mon, MON_DATA_COOL_RIBBON) > gSpecialVar_ContestRank) - result = 1; - break; - case CONTEST_CATEGORY_BEAUTY: - if (GetMonData(mon, MON_DATA_BEAUTY_RIBBON) > gSpecialVar_ContestRank) - result = 1; - break; - case CONTEST_CATEGORY_CUTE: - if (GetMonData(mon, MON_DATA_CUTE_RIBBON) > gSpecialVar_ContestRank) - result = 1; - break; - case CONTEST_CATEGORY_SMART: - if (GetMonData(mon, MON_DATA_SMART_RIBBON) > gSpecialVar_ContestRank) - result = 1; - break; - case CONTEST_CATEGORY_TOUGH: - if (GetMonData(mon, MON_DATA_TOUGH_RIBBON) > gSpecialVar_ContestRank) - result = 1; - break; - } - - return result; -} - - -void ScrSpecial_GiveContestRibbon(void) -{ - u8 ribbonData; - - if (gContestFinalStandings[gContestPlayerMonIndex] != 0) - return; - - switch (gSpecialVar_ContestCategory) - { - case CONTEST_CATEGORY_COOL: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON, &ribbonData); - } - break; - case CONTEST_CATEGORY_BEAUTY: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON, &ribbonData); - } - break; - case CONTEST_CATEGORY_CUTE: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON, &ribbonData); - } - break; - case CONTEST_CATEGORY_SMART: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON, &ribbonData); - } - break; - case CONTEST_CATEGORY_TOUGH: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON, &ribbonData); - } - break; - } -} - -void Contest_CopyAndConvertTrainerName_Intl(u8 * dest, const u8 * src) -{ - StringCopy(dest, src); - if (dest[0] == EXT_CTRL_CODE_BEGIN && dest[1] == 0x15) - ConvertInternationalString(dest, LANGUAGE_JAPANESE); -} - -void Contest_CopyAndConvertNicknameI_Intl(u8 * dest, u8 idx) -{ - StringCopy(dest, gContestMons[idx].nickname); - if (gIsLinkContest & 1) - { - if (gLinkPlayers[idx].language == LANGUAGE_JAPANESE) - { - ConvertInternationalString(dest, GetStringLanguage(dest)); - } - } -} - -void Contest_GetTrainerNameI_StringVar1(void) -{ - if (gIsLinkContest & 1) - { - Contest_CopyAndConvertTrainerName_Intl(gStringVar1, gLinkPlayers[gSpecialVar_0x8006].name); - } - else - { - Contest_CopyAndConvertTrainerName_Intl(gStringVar1, gContestMons[gSpecialVar_0x8006].trainerName); - } -} - -void Contest_GetNicknameI_StringVar1(void) -{ - Contest_CopyAndConvertNicknameI_Intl(gStringVar3, gSpecialVar_0x8006); -} - -void ScrSpecial_CountContestMonsWithBetterCondition(void) -{ - u8 i; - u8 count; - - for (i = 0, count = 0; i < 4; i++) - { - if (gContestMonConditions[gSpecialVar_0x8006] < gContestMonConditions[i]) - count++; - } - - gSpecialVar_0x8004 = count; -} - -void ScrSpecial_GetMonCondition(void) -{ - gSpecialVar_0x8004 = gContestMonConditions[gSpecialVar_0x8006]; -} - -void ScrSpecial_GetContestWinnerIdx(void) -{ - u8 i; - - for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) - ; - - gSpecialVar_0x8005 = i; -} - -void ScrSpecial_GetContestWinnerTrainerName(void) -{ - u8 i; - - for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) - ; - - if (gIsLinkContest & 1) - { - Contest_CopyAndConvertTrainerName_Intl(gStringVar3, gLinkPlayers[i].name); - } - else - { - Contest_CopyAndConvertTrainerName_Intl(gStringVar3, gContestMons[i].trainerName); - } -} - -void ScrSpecial_GetContestWinnerNick(void) -{ - u8 i; - - for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) - ; - - Contest_CopyAndConvertNicknameI_Intl(gStringVar1, i); -} - -void sub_80C488C(void) -{ - SetMainCallback2(CB2_StartContest); -} - -void sub_80C489C(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyTask(taskId); - SetMainCallback2(sub_80C488C); - } -} - -void sub_80C48C8(void) -{ - ScriptContext2_Enable(); - CreateTask(sub_80C489C, 10); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); -} - -void sub_80C48F4(void) -{ - gSpecialVar_0x8004 = gContestMons[gSpecialVar_0x8006].species; -} - -void sub_80C4914(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyTask(taskId); - SetMainCallback2(sub_80C2358); - } -} - -void sub_80C4940(void) -{ - ScriptContext2_Enable(); - CreateTask(sub_80C4914, 10); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); -} - -void ScrSpecial_GetContestPlayerMonIdx(void) -{ - gSpecialVar_0x8004 = gContestPlayerMonIndex; -} - -void sub_80C4980(u8 taskId) -{ - u8 taskId2; - ScriptContext2_Enable(); - taskId2 = CreateTask(sub_80C8604, 0); - SetTaskFuncWithFollowupFunc(taskId2, sub_80C8604, sub_80C49C4); - gTasks[taskId2].data[9] = taskId; -} - -void sub_80C49C4(u8 taskId) -{ - Contest_CreatePlayerMon(gContestMonPartyIndex); - SetTaskFuncWithFollowupFunc(taskId, sub_80C8734, sub_80C49F0); -} - -void sub_80C49F0(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80C88AC, sub_80C4A0C); -} - -void sub_80C4A0C(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80C8E1C, sub_80C4A28); -} - -void sub_80C4A28(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80C8938, sub_80C4A44); -} - -void sub_80C4A44(u8 taskId) -{ - u8 i; - u8 sp0[4]; - u8 sp4[4]; - - for (i = 0; i < 4; i++) - sp0[i] = gTasks[taskId].data[i + 1]; - - for (i = 0; i < 4; i++) - { - if (sp0[0] != sp0[i]) - break; - } - - if (i == 4) - gSpecialVar_0x8004 = 0; - else - gSpecialVar_0x8004 = 1; - - for (i = 0; i < 4; i++) - sp4[i] = gTasks[taskId].data[i + 5]; - - gUnknown_0203869B = sub_80C4B34(sp4); - InitContestMonConditions(gSpecialVar_ContestCategory); - SetTaskFuncWithFollowupFunc(taskId, sub_80C8EBC, sub_80C4B0C); -} - -void sub_80C4B0C(u8 taskId) -{ - sub_80B0F28(0); - SetTaskFuncWithFollowupFunc(taskId, sub_80C8F34, sub_80C4B5C); -} - -u8 sub_80C4B34(u8 * a0) -{ - s32 i; - u8 result = 0; - - for (i = 1; i < 4; i++) - { - if (a0[result] < a0[i]) - result = i; - } - - return result; -} - -void sub_80C4B5C(u8 taskId) -{ - if (gSpecialVar_0x8004 == 1) - { - if (IsLinkTaskFinished()) - gTasks[taskId].func = sub_80C4BA4; - } - else - { - DestroyTask(taskId); - ScriptContext2_Disable(); - EnableBothScriptContexts(); - } -} - -void sub_80C4BA4(u8 taskId) -{ - sub_800832C(); - gTasks[taskId].func = sub_80C4BCC; -} - -void sub_80C4BCC(u8 taskId) -{ - if (!gReceivedRemoteLinkPlayers) - { - DestroyTask(taskId); - ScriptContext2_Disable(); - EnableBothScriptContexts(); - } -} diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c deleted file mode 100644 index a694380df..000000000 --- a/src/battle/contest_link_80C857C.c +++ /dev/null @@ -1,755 +0,0 @@ -#include "global.h" -#include "ewram.h" -#include "random.h" -#include "task.h" -#include "contest.h" -#include "text.h" -#include "string_util.h" -#include "link.h" - -static void sub_80C8644(u8 taskId); -static void sub_80C8660(u8 taskId); -#if GERMAN -static void de_sub_80C9274(bool32 arg0); -static void de_sub_80C9294(bool32 arg0); -#endif - -static void SendBlockToAllOpponents(const void *data, u16 size) -{ - memcpy(eContestLinkSendBuffer, data, size); - SendBlock(bitmask_all_link_players_but_self(), eContestLinkSendBuffer, size); -} - -static bool8 HasPlayerReceivedBlock(u8 who) -{ - u8 flag = 1 << who; - if (!(GetBlockReceivedStatus() & flag)) - return FALSE; - ResetBlockReceivedFlag(flag); - return TRUE; -} - -static bool8 HaveAllPlayersReceivedBlock(void) -{ - int i; - - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - if (!((GetBlockReceivedStatus() >> i) & 1)) - return FALSE; - } - ResetBlockReceivedFlags(); - return TRUE; -} - -void sub_80C8604(u8 taskId) -{ -#if ENGLISH - u8 i; - - for (i = 0; i < 4; i++) - gBlockRecvBuffer[i][0] = 0xff; -#endif - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80C8644; -} - -static void sub_80C8644(u8 taskId) -{ - gTasks[taskId].func = sub_80C8660; -} - -static void sub_80C8660(u8 taskId) -{ - if (gReceivedRemoteLinkPlayers) - { - gContestPlayerMonIndex = GetMultiplayerId(); - if (GetLinkPlayerCount() == MAX_LINK_PLAYERS) - { - gIsLinkContest = TRUE; - SwitchTaskToFollowupFunc(taskId); - } - } -} - -#ifdef NONMATCHING -u8 GetStringLanguage(const u8 *string) -{ - u8 language = GAME_LANGUAGE; - if (string[0] == EXT_CTRL_CODE_BEGIN && string[1] == 0x15) - return language; - if (StringLength(string) > 5) - return language; - for (; *string != EOS; string++) - { - if (!((*string >= CHAR_A && *string <= CHAR_z) || - (*string >= CHAR_0 + 0 && *string <= CHAR_0 + 9) || - *string == CHAR_SPACE || - *string == CHAR_PERIOD || - *string == CHAR_COMMA || - *string == 0xAB || - *string == CHAR_QUESTION_MARK || - *string == CHAR_MALE || - *string == CHAR_FEMALE || - *string == CHAR_SLASH || - *string == CHAR_HYPHEN || - *string == CHAR_ELLIPSIS || - *string == 0xB1 || - *string == 0xB2 || - *string == 0xB3 || - *string == 0xB1 - )) - { - language = LANGUAGE_JAPANESE; - break; - } - } - return language; -} -#else -NAKED u8 GetStringLanguage(const u8 *string) -{ - asm_unified("\tpush {r4,r5,lr}\n" - "\tadds r4, r0, 0\n" - ".ifdef ENGLISH\n" - "\tmovs r5, 0x2\n" - ".else\n" - "\tmovs r5, 0x5\n" - ".endif\n" - "\tldrb r0, [r4]\n" - "\tcmp r0, 0xFC\n" - "\tbne _080C86B6\n" - "\tldrb r0, [r4, 0x1]\n" - "\tcmp r0, 0x15\n" - "\tbne _080C86B6\n" - ".ifdef ENGLISH\n" - "\tmovs r0, 0x2\n" - ".else\n" - "\tmovs r0, 0x5\n" - ".endif\n" - "\tb _080C872C\n" - "_080C86B6:\n" - "\tadds r0, r4, 0\n" - "\tbl StringLength\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x5\n" - "\tbhi _080C872A\n" - "\tldrb r0, [r4]\n" - "\tcmp r0, 0xFF\n" - "\tbeq _080C872A\n" - "_080C86CA:\n" - "\tldrb r1, [r4]\n" - "\tadds r0, r1, 0\n" - "\tadds r0, 0x45\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x33\n" - "\tbls _080C871E\n" - "\tadds r0, r1, 0\n" - "\tadds r0, 0x5F\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x9\n" - "\tbls _080C871E\n" - "\tadds r0, r1, 0\n" - "\tcmp r0, 0\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xAD\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB8\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xAB\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xAC\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB5\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB6\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xBA\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xAE\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB0\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB1\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB2\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB3\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB1\n" - "\tbne _080C8728\n" - "_080C871E:\n" - "\tadds r4, 0x1\n" - "\tldrb r0, [r4]\n" - "\tcmp r0, 0xFF\n" - "\tbne _080C86CA\n" - "\tb _080C872A\n" - "_080C8728:\n" - "\tmovs r5, 0x1\n" - "_080C872A:\n" - "\tadds r0, r5, 0\n" - "_080C872C:\n" - "\tpop {r4,r5}\n" - "\tpop {r1}\n" - "\tbx r1"); -} -#endif - -void sub_80C8734(u8 taskId) -{ - int i; - u8 *name; - - switch (gTasks[taskId].data[0]) { -#if ENGLISH - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; -#elif GERMAN - case 8: -#endif - case 0: - if (GetMultiplayerId() == 0) { - if (IsLinkTaskFinished()) { -#if ENGLISH - memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); - sub_8007E9C(2); - gTasks[taskId].data[0]++; -#elif GERMAN - if (gTasks[taskId].data[0] == 0) - { - gTasks[taskId].data[0] = 3; - } - else - { - memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); - de_sub_80C9274(FALSE); - sub_8007E9C(2); - gTasks[taskId].data[0] = 1; - } -#endif - } - } - else - { - memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); -#if GERMAN - de_sub_80C9294(FALSE); -#endif - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - memcpy(gContestMons + i, gBlockRecvBuffer[i], sizeof(struct ContestPokemon)); - name = gContestMons[i].nickname; - if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) - { - ConvertInternationalString(name, GetStringLanguage(name)); - } - else if (name[10] == EXT_CTRL_CODE_BEGIN) - { - ConvertInternationalString(name, LANGUAGE_JAPANESE); - } else - { - name[5] = name[10]; - name[10] = EOS; - } - name = gContestMons[i].trainerName; - if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) - { - name[7] = EOS; - name[6] = name[4]; - name[5] = name[3]; - name[4] = name[2]; - name[3] = name[1]; - name[2] = name[0]; - name[1] = 0x15; - name[0] = EXT_CTRL_CODE_BEGIN; - } - else - { - name[5] = name[7]; - name[7] = EOS; - } - } - gTasks[taskId].data[0]++; - } - break; -#if GERMAN - case 2: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - default: - gTasks[taskId].data[0]++; - break; -#endif - } -} - -void sub_80C88AC(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (GetMultiplayerId() == 0) - { - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(&gRngValue, sizeof(u32)); - gTasks[taskId].data[0]++; - } - } - else - { - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HasPlayerReceivedBlock(0)) - { - memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(u32)); - memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(u32)); - gTasks[taskId].data[0]++; - } - break; - } -} - -void sub_80C8938(u8 taskId) -{ - int i; - - switch (gTasks[taskId].data[0]) - { -#if ENGLISH - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; -#elif GERMAN - case 8: -#endif - case 0: - gBlockSendBuffer[0] = gTasks[taskId].data[9]; - if (GetMultiplayerId() == 0) - { - if (IsLinkTaskFinished()) - { -#if ENGLISH - sub_8007E9C(2); - gTasks[taskId].data[0]++; -#elif GERMAN - if (gTasks[taskId].data[0] == 0) - { - gTasks[taskId].data[0] = 3; - } - else - { - de_sub_80C9274(TRUE); - sub_8007E9C(2); - gTasks[taskId].data[0] = 1; - } -#endif - } - } - else - { -#if GERMAN - de_sub_80C9294(TRUE); -#endif - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - gTasks[taskId].data[i + 1] = gBlockRecvBuffer[i][0]; - } - gTasks[taskId].data[0]++; - } - break; -#if GERMAN - case 2: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - default: - gTasks[taskId].data[0]++; - break; -#endif - } -} - -void sub_80C89DC(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(&gContestPlayerMonIndex, sizeof(u8)); - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - gTasks[taskId].data[0]++; - } - break; - } -} - -void sub_80C8A38(u8 taskId) -{ - int i; - - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(&sContestantStatus[gContestPlayerMonIndex].currMove, sizeof(u16)); - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - *&sContestantStatus[i].currMove = gBlockRecvBuffer[i][0]; - } - gTasks[taskId].data[0]++; - } - break; - } -} - -void sub_80C8AD0(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gUnknown_02038678, sizeof gUnknown_02038678); - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gUnknown_02038678, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038678); - gTasks[taskId].data[0]++; - } - break; - case 2: - case 5: - case 8: - case 11: - if (gTasks[taskId].data[1]++ > 10) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - break; - case 3: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gUnknown_02038680, sizeof gUnknown_02038680); - gTasks[taskId].data[0]++; - } - break; - case 4: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gUnknown_02038680, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038680); - gTasks[taskId].data[0]++; - } - break; - case 6: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gUnknown_02038688, sizeof gUnknown_02038688); - gTasks[taskId].data[0]++; - } - break; - case 7: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gUnknown_02038688, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038688); - gTasks[taskId].data[0]++; - } - break; - case 9: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gContestFinalStandings, sizeof gContestFinalStandings); - gTasks[taskId].data[0]++; - } - break; - case 10: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gContestFinalStandings, gBlockRecvBuffer[gUnknown_0203869B], sizeof gContestFinalStandings); - gTasks[taskId].data[0]++; - } - break; - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80C8C80(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(sContestantStatus, 4 * sizeof(struct ContestantStatus)); - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(sContestantStatus, gBlockRecvBuffer[gUnknown_0203869B], 4 * sizeof(struct ContestantStatus)); - gTasks[taskId].data[0]++; - } - break; - case 2: - case 5: - case 8: - case 11: - if (gTasks[taskId].data[1]++ > 10) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - break; - case 3: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(&shared192D0, sizeof shared192D0); - gTasks[taskId].data[0]++; - } - break; - case 4: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(&shared192D0, gBlockRecvBuffer[gUnknown_0203869B], sizeof shared192D0); - gTasks[taskId].data[0]++; - } - break; - case 6: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(&shared19328, sizeof shared19328); - gTasks[taskId].data[0]++; - } - break; - case 7: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(&shared19328, gBlockRecvBuffer[gUnknown_0203869B], sizeof shared19328); - gTasks[taskId].data[0]++; - } - break; - case 9: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gUnknown_02038696, sizeof gUnknown_02038696); - gTasks[taskId].data[0]++; - } - break; - case 10: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gUnknown_02038696, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038696); - gTasks[taskId].data[0]++; - } - break; - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80C8E1C(u8 taskId) -{ - int i; - - switch (gTasks[taskId].data[0]) - { -#if ENGLISH - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; -#elif GERMAN - case 8: -#endif - case 0: - gBlockSendBuffer[0] = 0x64; - if (GetMultiplayerId() == 0) - { - if (IsLinkTaskFinished()) - { -#if ENGLISH - sub_8007E9C(2); - gTasks[taskId].data[0]++; -#elif GERMAN - if (gTasks[taskId].data[0] == 0) - { - gTasks[taskId].data[0] = 3; - } - else - { - de_sub_80C9274(FALSE); - sub_8007E9C(2); - gTasks[taskId].data[0] = 1; - } -#endif - } - } - else - { -#if GERMAN - de_sub_80C9294(FALSE); -#endif - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - gTasks[taskId].data[5 + i] = gBlockRecvBuffer[i][0]; - } - gTasks[taskId].data[0]++; - } - break; -#if GERMAN - case 2: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - default: - gTasks[taskId].data[0]++; - break; -#endif - } -} - -void sub_80C8EBC(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gContestMonConditions, sizeof gContestMonConditions); - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gContestMonConditions, gBlockRecvBuffer[gUnknown_0203869B], sizeof gContestMonConditions); - gTasks[taskId].data[0]++; - } - break; - } -} - -void sub_80C8F34(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gUnknown_02038696, sizeof gUnknown_02038696); - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gUnknown_02038696, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038696); - gTasks[taskId].data[0]++; - } - break; - } -} - -#if GERMAN - -static void de_sub_80C9274(bool32 arg0) -{ - if (deUnkValue2 == 1) - { - if (arg0) - deUnkValue2 = 3; - else - deUnkValue2 = 2; - } -} - -static void de_sub_80C9294(bool32 arg0) -{ - if (deUnkValue2 == 1) - { - if (arg0) - deUnkValue2 = 3; - else - deUnkValue2 = 2; - } - else if (deUnkValue2 == 2) - { - SendBlock(0, sBlockRequestLookupTable[deUnkValue1].address, sBlockRequestLookupTable[deUnkValue1].size); - if (arg0) - deUnkValue2 = 0; - else - deUnkValue2 = 1; - } -} - -#endif diff --git a/src/battle/pokeball.c b/src/battle/pokeball.c deleted file mode 100644 index abfdf2c3d..000000000 --- a/src/battle/pokeball.c +++ /dev/null @@ -1,1203 +0,0 @@ -#include "global.h" -#include "gba/m4a_internal.h" -#include "battle.h" -#include "battle_anim_813F0F4.h" -#include "decompress.h" -#include "graphics.h" -#include "m4a.h" -#include "main.h" -#include "pokeball.h" -#include "pokemon.h" -#include "rom_8077ABC.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" -#include "util.h" -#include "ewram.h" - -extern struct MusicPlayerInfo gMPlay_BGM; -extern u16 gBattleTypeFlags; -extern u8 gBankTarget; -extern u8 gActiveBattler; -extern u16 gBattlerPartyIndexes[]; -extern u8 gBankSpriteIds[]; -extern u8 gDoingBattleAnim; -extern u8 gHealthboxIDs[]; - -#define GFX_TAG_POKEBALL 55000 -#define GFX_TAG_GREATBALL 55001 -#define GFX_TAG_SAFARIBALL 55002 -#define GFX_TAG_ULTRABALL 55003 -#define GFX_TAG_MASTERBALL 55004 -#define GFX_TAG_NETBALL 55005 -#define GFX_TAG_DIVEBALL 55006 -#define GFX_TAG_NESTBALL 55007 -#define GFX_TAG_REPEATBALL 55008 -#define GFX_TAG_TIMERBALL 55009 -#define GFX_TAG_LUXURYBALL 55010 -#define GFX_TAG_PREMIERBALL 55011 - -static const struct CompressedSpriteSheet sBallSpriteSheets[] = -{ - {gInterfaceGfx_PokeBall, 384, GFX_TAG_POKEBALL}, - {gInterfaceGfx_GreatBall, 384, GFX_TAG_GREATBALL}, - {gInterfaceGfx_SafariBall, 384, GFX_TAG_SAFARIBALL}, - {gInterfaceGfx_UltraBall, 384, GFX_TAG_ULTRABALL}, - {gInterfaceGfx_MasterBall, 384, GFX_TAG_MASTERBALL}, - {gInterfaceGfx_NetBall, 384, GFX_TAG_NETBALL}, - {gInterfaceGfx_DiveBall, 384, GFX_TAG_DIVEBALL}, - {gInterfaceGfx_NestBall, 384, GFX_TAG_NESTBALL}, - {gInterfaceGfx_RepeatBall, 384, GFX_TAG_REPEATBALL}, - {gInterfaceGfx_TimerBall, 384, GFX_TAG_TIMERBALL}, - {gInterfaceGfx_LuxuryBall, 384, GFX_TAG_LUXURYBALL}, - {gInterfaceGfx_PremierBall, 384, GFX_TAG_PREMIERBALL}, -}; - -static const struct CompressedSpritePalette sBallSpritePalettes[] = -{ - {gInterfacePal_PokeBall, GFX_TAG_POKEBALL}, - {gInterfacePal_GreatBall, GFX_TAG_GREATBALL}, - {gInterfacePal_SafariBall, GFX_TAG_SAFARIBALL}, - {gInterfacePal_UltraBall, GFX_TAG_ULTRABALL}, - {gInterfacePal_MasterBall, GFX_TAG_MASTERBALL}, - {gInterfacePal_NetBall, GFX_TAG_NETBALL}, - {gInterfacePal_DiveBall, GFX_TAG_DIVEBALL}, - {gInterfacePal_NestBall, GFX_TAG_NESTBALL}, - {gInterfacePal_RepeatBall, GFX_TAG_REPEATBALL}, - {gInterfacePal_TimerBall, GFX_TAG_TIMERBALL}, - {gInterfacePal_LuxuryBall, GFX_TAG_LUXURYBALL}, - {gInterfacePal_PremierBall, GFX_TAG_PREMIERBALL}, -}; - -static const struct OamData sBallOamData = -{ - .y = 0, - .affineMode = 3, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sBallAnimSeq3[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sBallAnimSeq5[] = -{ - ANIMCMD_FRAME(4, 1), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sBallAnimSeq4[] = -{ - ANIMCMD_FRAME(8, 5), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sBallAnimSeq6[] = -{ - ANIMCMD_FRAME(12, 1), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sBallAnimSeq0[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sBallAnimSeq1[] = -{ - ANIMCMD_FRAME(4, 5), - ANIMCMD_FRAME(8, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sBallAnimSeq2[] = -{ - ANIMCMD_FRAME(4, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd *const sBallAnimSequences[] = -{ - sBallAnimSeq0, - sBallAnimSeq1, - sBallAnimSeq2, - - // unused? - sBallAnimSeq3, - sBallAnimSeq4, - sBallAnimSeq5, - sBallAnimSeq6, -}; - -static const union AffineAnimCmd sBallAffineAnimSeq0[] = -{ - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sBallAffineAnimSeq1[] = -{ - AFFINEANIMCMD_FRAME(0, 0, -3, 1), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sBallAffineAnimSeq2[] = -{ - AFFINEANIMCMD_FRAME(0, 0, 3, 1), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sBallAffineAnimSeq3[] = -{ - AFFINEANIMCMD_FRAME(256, 256, 0, 0), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sBallAffineAnimSeq4[] = -{ - AFFINEANIMCMD_FRAME(0, 0, 25, 1), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd *const sBallAffineAnimSequences[] = -{ - sBallAffineAnimSeq0, - sBallAffineAnimSeq1, - sBallAffineAnimSeq2, - sBallAffineAnimSeq3, - sBallAffineAnimSeq4, -}; - -static void objc_0804ABD4(struct Sprite *sprite); -const struct SpriteTemplate gBallSpriteTemplates[] = -{ - { - .tileTag = GFX_TAG_POKEBALL, - .paletteTag = GFX_TAG_POKEBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_GREATBALL, - .paletteTag = GFX_TAG_GREATBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_SAFARIBALL, - .paletteTag = GFX_TAG_SAFARIBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_ULTRABALL, - .paletteTag = GFX_TAG_ULTRABALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_MASTERBALL, - .paletteTag = GFX_TAG_MASTERBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_NETBALL, - .paletteTag = GFX_TAG_NETBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_DIVEBALL, - .paletteTag = GFX_TAG_DIVEBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_NESTBALL, - .paletteTag = GFX_TAG_NESTBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_REPEATBALL, - .paletteTag = GFX_TAG_REPEATBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_TIMERBALL, - .paletteTag = GFX_TAG_TIMERBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_LUXURYBALL, - .paletteTag = GFX_TAG_LUXURYBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_PREMIERBALL, - .paletteTag = GFX_TAG_PREMIERBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, -}; - -extern void InitAnimArcTranslation(); -extern bool8 TranslateAnimArc(struct Sprite *); - -static void SendOutMonAnimation(u8); -static void sub_80466E8(struct Sprite *); -static void sub_80466F4(struct Sprite *); -static void sub_8046760(struct Sprite *); -static void sub_80467F8(struct Sprite *); -static void sub_804684C(struct Sprite *); -static void sub_8046944(struct Sprite *); -static void sub_8046984(struct Sprite *); -static void sub_8046C78(struct Sprite *); -static void sub_8046E7C(struct Sprite *); -static void sub_8046E9C(struct Sprite *); -static void sub_8046FBC(struct Sprite *); -static void SendOutPlayerMonAnimation_Step0(struct Sprite *); -static void SendOutPlayerMonAnimation_Step1(struct Sprite *); -static void SendOutMonAnimation_Delay(struct Sprite *); -static void SendOutOpponentMonAnimation_Step0(struct Sprite *); -static void sub_80473D0(struct Sprite *); -static void sub_804748C(struct Sprite *); -static void sub_8047638(struct Sprite *); -static void sub_80476E0(struct Sprite *); -static void sub_8047754(struct Sprite *); -static void sub_804780C(struct Sprite *); -static void sub_8047830(struct Sprite *); -static void oamc_804BEB4(struct Sprite *); -static u16 GetBattlerBall(u8); - -u8 StartSendOutMonAnimation(u16 a, u8 side) -{ - u8 taskId; - - gDoingBattleAnim = 1; - ewram17810[gActiveBattler].unk0_3 = 1; - taskId = CreateTask(SendOutMonAnimation, 5); - gTasks[taskId].data[1] = a; - gTasks[taskId].data[2] = side; - gTasks[taskId].data[3] = gActiveBattler; - return 0; -} - -static void SendOutMonAnimation(u8 taskId) -{ - bool8 debug = FALSE; - u16 side; - u8 battler; - u16 ball; - u8 ballIndex; - u8 spriteId; - - if (gTasks[taskId].data[0] == 0) - { - gTasks[taskId].data[0]++; - return; - } - - side = gTasks[taskId].data[2]; - battler = gTasks[taskId].data[3]; - if (GetBattlerSide(battler) != B_SIDE_PLAYER) - ball = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_POKEBALL); - else - ball = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_POKEBALL); - - ballIndex = ball_number_to_ball_processing_index(ball); - LoadBallGraphics(ballIndex); - spriteId = CreateSprite(&gBallSpriteTemplates[ballIndex], 32, 80, 29); - gSprites[spriteId].data[0] = 0x80; - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].data[7] = side; - - switch (side) - { - case 0xFF: // Player's side - gBankTarget = battler; - gSprites[spriteId].pos1.x = 24; - gSprites[spriteId].pos1.y = 68; - gSprites[spriteId].callback = SendOutPlayerMonAnimation_Step0; - break; - case 0xFE: // Opponent's side - gSprites[spriteId].pos1.x = GetBattlerSpriteCoord(battler, 0); - gSprites[spriteId].pos1.y = GetBattlerSpriteCoord(battler, 1) + 24; - gBankTarget = battler; - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].callback = SendOutOpponentMonAnimation_Step0; - break; - default: - gBankTarget = GetBattlerAtPosition(1); - debug = TRUE; - break; - } - - gSprites[spriteId].data[6] = gBankTarget; - if (!debug) - { - DestroyTask(taskId); - return; - } - - gSprites[spriteId].data[0] = 0x22; - gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBankTarget, 0); - gSprites[spriteId].data[4] = GetBattlerSpriteCoord(gBankTarget, 1) - 16; - gSprites[spriteId].data[5] = -40; - InitAnimArcTranslation(&gSprites[spriteId]); - gSprites[spriteId].oam.affineParam = taskId; - gTasks[taskId].data[4] = gBankTarget; - gTasks[taskId].func = TaskDummy; - PlaySE(SE_NAGERU); -} - -static void objc_0804ABD4(struct Sprite *sprite) -{ - if (TranslateAnimArc(sprite)) - { - u8 taskId = sprite->oam.affineParam; - u8 r5 = gTasks[taskId].data[4]; - u8 r8 = gTasks[taskId].data[2]; - u32 r4; // not sure of this type - - StartSpriteAnim(sprite, 1); - sprite->affineAnimPaused = TRUE; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data[5] = 0; - r4 = ball_number_to_ball_processing_index(GetBattlerBall(r5)); - AnimateBallOpenParticles(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, r4); - sprite->data[0] = sub_8141314(0, r5, 14, r4); - sprite->data[6] = r5; - sprite->data[7] = r8; - DestroyTask(taskId); - sprite->callback = sub_80466E8; - } -} - -static void sub_80466E8(struct Sprite *sprite) -{ - sprite->callback = sub_80466F4; -} - -static void sub_80466F4(struct Sprite *sprite) -{ - sprite->data[5]++; - if (sprite->data[5] == 10) - { - sprite->data[5] = 0; - sprite->callback = sub_8046760; - StartSpriteAffineAnim(&gSprites[gBankSpriteIds[sprite->data[6]]], 2); - AnimateSprite(&gSprites[gBankSpriteIds[sprite->data[6]]]); - gSprites[gBankSpriteIds[sprite->data[6]]].data[1] = 0; - } -} - -static void sub_8046760(struct Sprite *sprite) -{ - sprite->data[5]++; - if (sprite->data[5] == 11) - PlaySE(SE_SUIKOMU); - if (gSprites[gBankSpriteIds[sprite->data[6]]].affineAnimEnded) - { - StartSpriteAnim(sprite, 2); - gSprites[gBankSpriteIds[sprite->data[6]]].invisible = TRUE; - sprite->data[5] = 0; - sprite->callback = sub_80467F8; - } - else - { - gSprites[gBankSpriteIds[sprite->data[6]]].data[1] += 0x60; - gSprites[gBankSpriteIds[sprite->data[6]]].pos2.y = -gSprites[gBankSpriteIds[sprite->data[6]]].data[1] >> 8; - } -} - -static void sub_80467F8(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - sprite->data[5]++; - if (sprite->data[5] == 1) - { - sprite->data[3] = 0; - sprite->data[4] = 32; - sprite->data[5] = 0; - sprite->pos1.y += Cos(0, 32); - sprite->pos2.y = -Cos(0, sprite->data[4]); - sprite->callback = sub_804684C; - } - } -} - -static void sub_804684C(struct Sprite *sprite) -{ - bool8 r5 = FALSE; - - switch (sprite->data[3] & 0xFF) - { - case 0: - sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]); - sprite->data[5] += 4 + (sprite->data[3] >> 8); - if (sprite->data[5] >= 64) - { - sprite->data[4] -= 10; - sprite->data[3] += 0x101; - if (sprite->data[3] >> 8 == 4) - r5 = TRUE; - switch (sprite->data[3] >> 8) - { - case 1: - PlaySE(SE_KON); - break; - case 2: - PlaySE(SE_KON2); - break; - case 3: - PlaySE(SE_KON3); - break; - default: - PlaySE(SE_KON4); - break; - } - } - break; - case 1: - sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]); - sprite->data[5] -= 4 + (sprite->data[3] >> 8); - if (sprite->data[5] <= 0) - { - sprite->data[5] = 0; - sprite->data[3] &= 0xFF00; - } - break; - } - if (r5) - { - sprite->data[3] = 0; - sprite->pos1.y += Cos(64, 32); - sprite->pos2.y = 0; - if (sprite->data[7] == 0) - { - sprite->callback = sub_8046C78; - } - else - { - sprite->callback = sub_8046944; - sprite->data[4] = 1; - sprite->data[5] = 0; - } - } -} - -static void sub_8046944(struct Sprite *sprite) -{ - sprite->data[3]++; - if (sprite->data[3] == 31) - { - sprite->data[3] = 0; - sprite->affineAnimPaused = TRUE; - StartSpriteAffineAnim(sprite, 1); - sprite->callback = sub_8046984; - PlaySE(SE_BOWA); - } -} - -static void sub_8046984(struct Sprite *sprite) -{ - switch (sprite->data[3] & 0xFF) - { - case 0: - case 2: - sprite->pos2.x += sprite->data[4]; - sprite->data[5] += sprite->data[4]; - sprite->affineAnimPaused = FALSE; - if (sprite->data[5] > 3 || sprite->data[5] < -3) - { - sprite->data[3]++; - sprite->data[5] = 0; - } - break; - case 1: - sprite->data[5]++; - if (sprite->data[5] == 1) - { - sprite->data[5] = 0; - sprite->data[4] = -sprite->data[4]; - sprite->data[3]++; - sprite->affineAnimPaused = FALSE; - if (sprite->data[4] < 0) - ChangeSpriteAffineAnim(sprite, 2); - else - ChangeSpriteAffineAnim(sprite, 1); - } - else - { - sprite->affineAnimPaused = TRUE; - } - break; - case 3: - sprite->data[3] += 0x100; - if (sprite->data[3] >> 8 == sprite->data[7]) - { - sprite->callback = sub_8046C78; - } - else - { - if (sprite->data[7] == 4 && sprite->data[3] >> 8 == 3) - { - sprite->callback = sub_8046E7C; - sprite->affineAnimPaused = TRUE; - } - else - { - sprite->data[3]++; - sprite->affineAnimPaused = TRUE; - } - } - break; - case 4: - default: - sprite->data[5]++; - if (sprite->data[5] == 31) - { - sprite->data[5] = 0; - sprite->data[3] &= 0xFF00; - StartSpriteAffineAnim(sprite, 3); - if (sprite->data[4] < 0) - StartSpriteAffineAnim(sprite, 2); - else - StartSpriteAffineAnim(sprite, 1); - PlaySE(SE_BOWA); - } - break; - } -} - -static void sub_8046AD0(u8 taskId) -{ - u8 r6 = gTasks[taskId].data[2]; - u8 r3 = gTasks[taskId].data[1]; - u16 species = gTasks[taskId].data[0]; - - switch (gTasks[taskId].data[15]) - { - case 0: - default: - if (gTasks[taskId].data[8] < 3) - gTasks[taskId].data[8]++; - else - gTasks[taskId].data[15] = r6 + 1; - break; - case 1: - PlayCry1(species, r3); - DestroyTask(taskId); - break; - case 2: - StopCryAndClearCrySongs(); - gTasks[taskId].data[10] = 3; - gTasks[taskId].data[15] = 20; - break; - case 20: - if (gTasks[taskId].data[10] != 0) - { - gTasks[taskId].data[10]--; - break; - } - PlayCry4(species, r3, 1); - DestroyTask(taskId); - break; - case 3: - gTasks[taskId].data[10] = 6; - gTasks[taskId].data[15] = 30; - break; - case 30: - if (gTasks[taskId].data[10] != 0) - { - gTasks[taskId].data[10]--; - break; - } - gTasks[taskId].data[15]++; - // fall through - case 31: - if (!IsCryPlayingOrClearCrySongs()) - { - StopCryAndClearCrySongs(); - gTasks[taskId].data[10] = 3; - gTasks[taskId].data[15]++; - } - break; - case 32: - if (gTasks[taskId].data[10] != 0) - { - gTasks[taskId].data[10]--; - break; - } - PlayCry4(species, r3, 0); - DestroyTask(taskId); - break; - } -} - -static void sub_8046C78(struct Sprite *sprite) -{ - int ballIndex; - u8 battler = sprite->data[6]; - - StartSpriteAnim(sprite, 1); - ballIndex = ball_number_to_ball_processing_index(GetBattlerBall(battler)); - AnimateBallOpenParticles(sprite->pos1.x, sprite->pos1.y - 5, 1, 28, ballIndex); - sprite->data[0] = sub_8141314(1, sprite->data[6], 14, ballIndex); - sprite->callback = sub_8046E9C; - if (gMain.inBattle) - { - struct Pokemon *mon; - u16 species; - s8 cryPanning; - u16 cryBehavior; - u8 taskId; - - if (GetBattlerSide(battler) != 0) - { - mon = &gEnemyParty[gBattlerPartyIndexes[battler]]; - cryPanning = 25; - } - else - { - mon = &gPlayerParty[gBattlerPartyIndexes[battler]]; - cryPanning = -25; - } - - species = GetMonData(mon, MON_DATA_SPECIES); - if ((battler == GetBattlerAtPosition(0) || battler == GetBattlerAtPosition(1)) - && IsDoubleBattle() && ewram17840.unk9_0) - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (IsBGMPlaying()) - m4aMPlayStop(&gMPlay_BGM); - } - else - { - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128); - } - } - - if (!IsDoubleBattle() || !ewram17840.unk9_0) - cryBehavior = 0; - else if (battler == GetBattlerAtPosition(0) || battler == GetBattlerAtPosition(1)) - cryBehavior = 1; - else - cryBehavior = 2; - - taskId = CreateTask(sub_8046AD0, 3); - gTasks[taskId].data[0] = species; - gTasks[taskId].data[1] = cryPanning; - gTasks[taskId].data[2] = cryBehavior; - gTasks[taskId].data[15] = 0; - } - - StartSpriteAffineAnim(&gSprites[gBankSpriteIds[sprite->data[6]]], 1); - AnimateSprite(&gSprites[gBankSpriteIds[sprite->data[6]]]); - gSprites[gBankSpriteIds[sprite->data[6]]].data[1] = 0x1000; -} - -static void sub_8046E7C(struct Sprite *sprite) -{ - sprite->animPaused = TRUE; - sprite->callback = sub_8046FBC; - sprite->data[3] = 0; - sprite->data[4] = 0; - sprite->data[5] = 0; -} - -static void sub_8046E9C(struct Sprite *sprite) -{ - bool8 r7 = FALSE; - u8 r4 = sprite->data[6]; - - gSprites[gBankSpriteIds[r4]].invisible = FALSE; - if (sprite->animEnded) - sprite->invisible = TRUE; - if (gSprites[gBankSpriteIds[r4]].affineAnimEnded) - { - StartSpriteAffineAnim(&gSprites[gBankSpriteIds[r4]], 0); - r7 = TRUE; - } - else - { - gSprites[gBankSpriteIds[r4]].data[1] -= 288; - gSprites[gBankSpriteIds[r4]].pos2.y = gSprites[gBankSpriteIds[r4]].data[1] >> 8; - } - if (sprite->animEnded && r7) - { - s32 i; - u32 r3; - - gSprites[gBankSpriteIds[r4]].pos2.y = 0; - gDoingBattleAnim = 0; - ewram17810[r4].unk0_3 = 0; - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - for (r3 = 0, i = 0; i < 4; i++) - { - if (ewram17810[i].unk0_3 == 0) - r3++; - } - if (r3 == 4) - { - for (i = 0; i < 12; i++) - FreeBallGraphics(i); - } - } -} - -static void sub_8046FBC(struct Sprite *sprite) -{ - u8 r7 = sprite->data[6]; - - sprite->data[4]++; - if (sprite->data[4] == 40) - { - return; - } - else if (sprite->data[4] == 95) - { - gDoingBattleAnim = 0; - m4aMPlayAllStop(); - PlaySE(MUS_FANFA5); - } - else if (sprite->data[4] == 315) - { - FreeOamMatrix(gSprites[gBankSpriteIds[sprite->data[6]]].oam.matrixNum); - DestroySprite(&gSprites[gBankSpriteIds[sprite->data[6]]]); - DestroySpriteAndFreeResources(sprite); - if (gMain.inBattle) - ewram17810[r7].unk0_3 = 0; - } -} - -static void SendOutPlayerMonAnimation_Step0(struct Sprite *sprite) -{ - sprite->data[0] = 25; - sprite->data[2] = GetBattlerSpriteCoord(sprite->data[6], 2); - sprite->data[4] = GetBattlerSpriteCoord(sprite->data[6], 3) + 24; - sprite->data[5] = -30; - sprite->oam.affineParam = sprite->data[6]; - InitAnimArcTranslation(sprite); - sprite->callback = SendOutPlayerMonAnimation_Step1; -} - -#define HIBYTE(x) (((x) >> 8) & 0xFF) - -static void SendOutPlayerMonAnimation_Step1(struct Sprite *sprite) -{ - u32 r6; - u32 r7; - - if (HIBYTE(sprite->data[7]) >= 35 && HIBYTE(sprite->data[7]) < 80) - { - s16 r4; - - if ((sprite->oam.affineParam & 0xFF00) == 0) - { - r6 = sprite->data[1] & 1; - r7 = sprite->data[2] & 1; - sprite->data[1] = ((sprite->data[1] / 3) & ~1) | r6; - sprite->data[2] = ((sprite->data[2] / 3) & ~1) | r7; - StartSpriteAffineAnim(sprite, 4); - } - - r4 = sprite->data[0]; - TranslateAnimLinear(sprite); - sprite->data[7] += sprite->data[6] / 3; - sprite->pos2.y += Sin(HIBYTE(sprite->data[7]), sprite->data[5]); - sprite->oam.affineParam += 0x100; - if ((sprite->oam.affineParam >> 8) % 3 != 0) - sprite->data[0] = r4; - else - sprite->data[0] = r4 - 1; - - if (HIBYTE(sprite->data[7]) >= 80) - { - r6 = sprite->data[1] & 1; - r7 = sprite->data[2] & 1; - sprite->data[1] = ((sprite->data[1] * 3) & ~1) | r6; - sprite->data[2] = ((sprite->data[2] * 3) & ~1) | r7; - } - } - else - { - if (TranslateAnimArc(sprite)) - { - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.y = 0; - sprite->pos2.x = 0; - sprite->data[6] = sprite->oam.affineParam & 0xFF; - sprite->data[0] = 0; - if (IsDoubleBattle() && ewram17840.unk9_0 && sprite->data[6] == GetBattlerAtPosition(2)) - sprite->callback = SendOutMonAnimation_Delay; - else - sprite->callback = sub_8046C78; - - StartSpriteAffineAnim(sprite, 0); - } - } -} - -static void SendOutMonAnimation_Delay(struct Sprite *sprite) -{ - if (sprite->data[0]++ > 24) - { - sprite->data[0] = 0; - sprite->callback = sub_8046C78; - } -} - -static void SendOutOpponentMonAnimation_Step0(struct Sprite *sprite) -{ - sprite->data[0]++; - if (sprite->data[0] > 15) - { - sprite->data[0] = 0; - if (IsDoubleBattle() && ewram17840.unk9_0 && sprite->data[6] == GetBattlerAtPosition(3)) - sprite->callback = SendOutMonAnimation_Delay; - else - sprite->callback = sub_8046C78; - } -} - -static u8 sub_80472B0(u8 a, u8 b, u8 c, u8 d) -{ - return AnimateBallOpenParticles(a, b, c, d, 0); -} - -static u8 sub_80472D8(u8 a, u8 b, u32 c) -{ - return sub_8141314(a, b, c, 0); -} - -void CreatePokeballSprite(u8 a, u8 b, u8 x, u8 y, u8 e, u8 f, u8 g, u32 h) -{ - u8 spriteId; - - LoadCompressedObjectPic(&sBallSpriteSheets[0]); - LoadCompressedObjectPalette(&sBallSpritePalettes[0]); - spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, f); - gSprites[spriteId].data[0] = a; - gSprites[spriteId].data[5] = gSprites[a].pos1.x; - gSprites[spriteId].data[6] = gSprites[a].pos1.y; - gSprites[a].pos1.x = x; - gSprites[a].pos1.y = y; - gSprites[spriteId].data[1] = g; - gSprites[spriteId].data[2] = b; - gSprites[spriteId].data[3] = h; - gSprites[spriteId].data[4] = h >> 16; - gSprites[spriteId].oam.priority = e; - gSprites[spriteId].callback = sub_80473D0; - gSprites[a].invisible = TRUE; -} - -static void sub_80473D0(struct Sprite *sprite) -{ - if (sprite->data[1] == 0) - { - u8 r5; - u8 r7 = sprite->data[0]; - u8 r8 = sprite->data[2]; - u32 r4 = (u16)sprite->data[3] | ((u16)sprite->data[4] << 16); - - if (sprite->subpriority != 0) - r5 = sprite->subpriority - 1; - else - r5 = 0; - StartSpriteAnim(sprite, 1); - sub_80472B0(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r5); - sprite->data[1] = sub_80472D8(1, r8, r4); - sprite->callback = sub_804748C; - gSprites[r7].invisible = FALSE; - StartSpriteAffineAnim(&gSprites[r7], 1); - AnimateSprite(&gSprites[r7]); - gSprites[r7].data[1] = 0x1000; - sprite->data[7] = 0; - } - else - { - sprite->data[1]--; - } -} - -static void sub_804748C(struct Sprite *sprite) -{ - bool8 r12 = FALSE; - bool8 r6 = FALSE; - u8 r3 = sprite->data[0]; - u16 var1; - u16 var2; - - if (sprite->animEnded) - sprite->invisible = TRUE; - if (gSprites[r3].affineAnimEnded) - { - StartSpriteAffineAnim(&gSprites[r3], 0); - r12 = TRUE; - } - var1 = (sprite->data[5] - sprite->pos1.x) * sprite->data[7] / 128 + sprite->pos1.x; - var2 = (sprite->data[6] - sprite->pos1.y) * sprite->data[7] / 128 + sprite->pos1.y; - gSprites[r3].pos1.x = var1; - gSprites[r3].pos1.y = var2; - if (sprite->data[7] < 128) - { - s16 sine = -(gSineTable[(u8)sprite->data[7]] / 8); - - sprite->data[7] += 4; - gSprites[r3].pos2.x = sine; - gSprites[r3].pos2.y = sine; - } - else - { - gSprites[r3].pos1.x = sprite->data[5]; - gSprites[r3].pos1.y = sprite->data[6]; - gSprites[r3].pos2.x = 0; - gSprites[r3].pos2.y = 0; - r6 = TRUE; - } - if (sprite->animEnded && r12 && r6) - DestroySpriteAndFreeResources(sprite); -} - -u8 sub_8047580(u8 a, u8 b, u8 x, u8 y, u8 e, u8 f, u8 g, u32 h) -{ - u8 spriteId; - - LoadCompressedObjectPic(&sBallSpriteSheets[0]); - LoadCompressedObjectPalette(&sBallSpritePalettes[0]); - spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, f); - gSprites[spriteId].data[0] = a; - gSprites[spriteId].data[1] = g; - gSprites[spriteId].data[2] = b; - gSprites[spriteId].data[3] = h; - gSprites[spriteId].data[4] = h >> 16; - gSprites[spriteId].oam.priority = e; - gSprites[spriteId].callback = sub_8047638; - return spriteId; -} - -static void sub_8047638(struct Sprite *sprite) -{ - if (sprite->data[1] == 0) - { - u8 r6; - u8 r7 = sprite->data[0]; - u8 r8 = sprite->data[2]; - u32 r5 = (u16)sprite->data[3] | ((u16)sprite->data[4] << 16); - - if (sprite->subpriority != 0) - r6 = sprite->subpriority - 1; - else - r6 = 0; - StartSpriteAnim(sprite, 1); - sub_80472B0(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r6); - sprite->data[1] = sub_80472D8(1, r8, r5); - sprite->callback = sub_80476E0; - StartSpriteAffineAnim(&gSprites[r7], 2); - AnimateSprite(&gSprites[r7]); - gSprites[r7].data[1] = 0; - } - else - { - sprite->data[1]--; - } -} - -static void sub_80476E0(struct Sprite *sprite) -{ - u8 r1; - - sprite->data[5]++; - if (sprite->data[5] == 11) - PlaySE(SE_SUIKOMU); - r1 = sprite->data[0]; - if (gSprites[r1].affineAnimEnded) - { - StartSpriteAnim(sprite, 2); - gSprites[r1].invisible = TRUE; - sprite->data[5] = 0; - sprite->callback = sub_8047754; - } - else - { - gSprites[r1].data[1] += 96; - gSprites[r1].pos2.y = -gSprites[r1].data[1] >> 8; - } -} - -static void sub_8047754(struct Sprite *sprite) -{ - if (sprite->animEnded) - sprite->callback = SpriteCallbackDummy; -} - -void obj_delete_and_free_associated_resources_(struct Sprite *sprite) -{ - DestroySpriteAndFreeResources(sprite); -} - -void sub_804777C(u8 a) -{ - struct Sprite *sprite = &gSprites[gHealthboxIDs[a]]; - - sprite->data[0] = 5; - sprite->data[1] = 0; - sprite->pos2.x = 0x73; - sprite->pos2.y = 0; - sprite->callback = sub_8047830; - if (GetBattlerSide(a) != 0) - { - sprite->data[0] = -sprite->data[0]; - sprite->data[1] = -sprite->data[1]; - sprite->pos2.x = -sprite->pos2.x; - sprite->pos2.y = -sprite->pos2.y; - } - gSprites[sprite->data[5]].callback(&gSprites[sprite->data[5]]); - if (GetBattlerPosition(a) == 2) - sprite->callback = sub_804780C; -} - -static void sub_804780C(struct Sprite *sprite) -{ - sprite->data[1]++; - if (sprite->data[1] == 20) - { - sprite->data[1] = 0; - sprite->callback = sub_8047830; - } -} - -static void sub_8047830(struct Sprite *sprite) -{ - sprite->pos2.x -= sprite->data[0]; - sprite->pos2.y -= sprite->data[1]; - if (sprite->pos2.x == 0 && sprite->pos2.y == 0) - sprite->callback = SpriteCallbackDummy; -} - -void sub_8047858(u8 a) -{ - u8 spriteId; - - spriteId = CreateInvisibleSpriteWithCallback(oamc_804BEB4); - gSprites[spriteId].data[0] = 1; - gSprites[spriteId].data[1] = gHealthboxIDs[a]; - gSprites[spriteId].callback = oamc_804BEB4; -} - -static void oamc_804BEB4(struct Sprite *sprite) -{ - u8 r1 = sprite->data[1]; - - gSprites[r1].pos2.y = sprite->data[0]; - sprite->data[0] = -sprite->data[0]; - sprite->data[2]++; - if (sprite->data[2] == 21) - { - gSprites[r1].pos2.x = 0; - gSprites[r1].pos2.y = 0; - DestroySprite(sprite); - } -} - -void LoadBallGraphics(u8 ballIndex) -{ - u16 tileStart; - - if (GetSpriteTileStartByTag(sBallSpriteSheets[ballIndex].tag) == 0xFFFF) - { - LoadCompressedObjectPic(&sBallSpriteSheets[ballIndex]); - LoadCompressedObjectPalette(&sBallSpritePalettes[ballIndex]); - } - - switch (ballIndex) - { - case 6: - case 10: - case 11: - break; - default: - tileStart = GetSpriteTileStartByTag(sBallSpriteSheets[ballIndex].tag); - LZDecompressVram(gUnknown_08D030D0, (void *)(VRAM + 0x10100 + tileStart * 32)); - break; - } -} - -void FreeBallGraphics(u8 ballIndex) -{ - FreeSpriteTilesByTag(sBallSpriteSheets[ballIndex].tag); - FreeSpritePaletteByTag(sBallSpritePalettes[ballIndex].tag); -} - -static u16 GetBattlerBall(u8 battler) -{ - if (GetBattlerSide(battler) == B_SIDE_PLAYER) - return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_POKEBALL); - else - return GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_POKEBALL); -} diff --git a/src/battle/post_battle_event_funcs.c b/src/battle/post_battle_event_funcs.c deleted file mode 100644 index d0fbbec85..000000000 --- a/src/battle/post_battle_event_funcs.c +++ /dev/null @@ -1,70 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "hall_of_fame.h" -#include "load_save.h" -#include "main.h" -#include "pokemon.h" -#include "overworld.h" -#include "script_pokemon_80C4.h" -#include "constants/heal_locations.h" - -extern u8 gUnknown_02039324; - -int GameClear(void) -{ - int i; - bool32 ribbonGet; - - ScrSpecial_HealPlayerParty(); - - if (FlagGet(FLAG_SYS_GAME_CLEAR) == TRUE) - { - gUnknown_02039324 = 1; - } - else - { - gUnknown_02039324 = 0; - FlagSet(FLAG_SYS_GAME_CLEAR); - } - - if (!GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME)) - SetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME, (gSaveBlock2.playTimeHours << 16) | (gSaveBlock2.playTimeMinutes << 8) | gSaveBlock2.playTimeSeconds); - - SetSecretBase2Field_9(); - - if (gSaveBlock2.playerGender == MALE) - sub_80537CC(HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F); - else - sub_80537CC(HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F); - - ribbonGet = FALSE; - - for (i = 0; i < 6; i++) - { - u8 val; - u8 *ptr = &val; - if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT2) - && !GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT3) - && !GetMonData(&gPlayerParty[i], MON_DATA_CHAMPION_RIBBON)) - { - *ptr = 1; - SetMonData(&gPlayerParty[i], MON_DATA_CHAMPION_RIBBON, ptr); - ribbonGet = TRUE; - } - } - - if (ribbonGet == TRUE) - { - IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); - FlagSet(FLAG_SYS_RIBBON_GET); - } - - SetMainCallback2(sub_8141F90); - return 0; -} - -int sp0C8_whiteout_maybe(void) -{ - SetMainCallback2(CB2_WhiteOut); - return 0; -} diff --git a/src/battle/reshow_battle_screen.c b/src/battle/reshow_battle_screen.c deleted file mode 100644 index 712ec3ea8..000000000 --- a/src/battle/reshow_battle_screen.c +++ /dev/null @@ -1,316 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_anim.h" -#include "palette.h" -#include "main.h" -#include "scanline_effect.h" -#include "text.h" -#include "rom_8077ABC.h" -#include "data2.h" -#include "ewram.h" - -extern struct SpriteTemplate gUnknown_02024E8C; -extern struct Window gUnknown_03004210; -extern u8 gReservedSpritePaletteCount; -extern u8 gActionSelectionCursor[4]; -extern u8 gBankInMenu; -extern u16 gBattlerPartyIndexes[4]; -extern u8 gBattlersCount; -extern u16 gBattleTypeFlags; -extern u8 gBankSpriteIds[4]; -extern u8 gBattleMonForms[4]; -extern u8 gHealthboxIDs[4]; - -bool8 LoadChosenBattleElement(u8 a0); -bool8 sub_8031C30(u8 a0); -void sub_8031EE8(void); -void sub_80327CC(void); -void sub_8032984(u8 a, u16 b); -void sub_800FCD4(void); -void BattleLoadOpponentMonSprite(struct Pokemon *, u8 bank); -void BattleLoadPlayerMonSprite(struct Pokemon *, u8 bank); -void BattleLoadSubstituteSprite(u8 bank, u8 b); -void LoadPlayerTrainerBankSprite(u16 a0, u8 bank); -u8 sub_8077F7C(u8 bank); -u8 sub_8077F68(u8 bank); -void nullsub_11(u8 healthboxID, u8 a1); -void sub_8043DB0(u8 bank); -u8 battle_make_oam_normal_battle(u8 bank); -u8 battle_make_oam_safari_battle(void); -void sub_8045A5C(u8 healthboxID, struct Pokemon*, u8); -void sub_8043F44(u8 bank); -void sub_8043DFC(u8 healthboxID); - -// this file's functions -static void CB2_ReshowBattleScreenAfterMenu(void); -static bool8 LoadAppropiateBankSprite(u8 bank); -static void sub_807B184(u8 bank); -static void sub_807B508(u8 bank); -static void sub_807B06C(void); - -void nullsub_14(void) -{ - -} - -void ReshowBattleScreenAfterMenu(void) -{ - gPaletteFade.bufferTransferDisabled = 1; - SetHBlankCallback(0); - SetVBlankCallback(0); - REG_MOSAIC = 0; - gReshowState = 0; - gHelperState = 0; - SetMainCallback2(CB2_ReshowBattleScreenAfterMenu); -} - -static void CB2_ReshowBattleScreenAfterMenu(void) -{ - switch (gReshowState) - { - case 0: - ScanlineEffect_Clear(); - Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); - ResetPaletteFade(); - Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - gBattle_BG3_X = 0; - gBattle_BG3_Y = 0; - break; - case 1: - { - const u32 zero = 0; - CpuFastSet(&zero, (void*) VRAM, 0x1006000); - } - break; - case 2: - if (!LoadChosenBattleElement(gHelperState)) - { - gHelperState++; - gReshowState--; - } - else - gHelperState = 0; - break; - case 3: - ResetSpriteData(); - break; - case 4: - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 4; - break; - case 5: - sub_8031EE8(); - break; - case 6: - if (sub_8031C30(gHelperState)) - gHelperState = 0; - else - { - gHelperState++; - gReshowState--; - } - break; - case 7: - if (!LoadAppropiateBankSprite(0)) - gReshowState--; - break; - case 8: - if (!LoadAppropiateBankSprite(1)) - gReshowState--; - break; - case 9: - if (!LoadAppropiateBankSprite(2)) - gReshowState--; - break; - case 10: - if (!LoadAppropiateBankSprite(3)) - gReshowState--; - break; - case 11: - sub_807B184(0); - break; - case 12: - sub_807B184(1); - break; - case 13: - sub_807B184(2); - break; - case 14: - sub_807B184(3); - break; - case 15: - sub_807B508(0); - break; - case 16: - sub_807B508(1); - break; - case 17: - sub_807B508(2); - break; - case 18: - sub_807B508(3); - break; - case 19: - { - u8 opponentBank; - u16 species; - - sub_80327CC(); - - opponentBank = GetBattlerAtPosition(1); - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBank]], MON_DATA_SPECIES); - sub_8032984(opponentBank, species); - - if (IsDoubleBattle()) - { - opponentBank = GetBattlerAtPosition(3); - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBank]], MON_DATA_SPECIES); - sub_8032984(opponentBank, species); - } - sub_802E3E4(gActionSelectionCursor[gBankInMenu], 0); - } - break; - default: - SetHBlankCallback(sub_800FCD4); - SetVBlankCallback(sub_800FCFC); - sub_807B06C(); - BeginHardwarePaletteFade(0xFF, 0, 0x10, 0, 1); - gPaletteFade.bufferTransferDisabled = 0; - SetMainCallback2(BattleMainCB2); - break; - } - gReshowState++; -} - -static void sub_807B06C(void) -{ - sub_800D6D4(); - ((vBgCnt *)®_BG1CNT)->charBaseBlock = 0; - ((vBgCnt *)®_BG2CNT)->charBaseBlock = 0; -} - -static bool8 LoadAppropiateBankSprite(u8 bank) -{ - if (bank < gBattlersCount) - { - if (GetBattlerSide(bank)) - { - if (!ewram17800[bank].substituteSprite) - BattleLoadOpponentMonSprite(&gEnemyParty[gBattlerPartyIndexes[bank]], bank); - else - BattleLoadSubstituteSprite(bank, 0); - } - else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0) - LoadPlayerTrainerBankSprite(gSaveBlock2.playerGender, 0); - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0) - LoadPlayerTrainerBankSprite(2, 0); - else if (!ewram17800[bank].substituteSprite) - BattleLoadPlayerMonSprite(&gPlayerParty[gBattlerPartyIndexes[bank]], bank); - else - BattleLoadSubstituteSprite(bank, 0); - - gHelperState = 0; - } - return 1; -} - -static void sub_807B184(u8 bank) -{ - if (bank < gBattlersCount) - { - u8 posY; - - if (ewram17800[bank].substituteSprite) - posY = sub_8077F7C(bank); - else - posY = sub_8077F68(bank); - if (GetBattlerSide(bank)) - { - if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[bank]], MON_DATA_HP) == 0) - return; - GetMonSpriteTemplate_803C56C(GetMonData(&gEnemyParty[gBattlerPartyIndexes[bank]], MON_DATA_SPECIES), GetBattlerPosition(bank)); - gBankSpriteIds[bank] = CreateSprite(&gUnknown_02024E8C, GetBattlerSpriteCoord(bank, 2), posY, GetBattlerSubpriority(bank)); - gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; - gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gBankSpriteIds[bank]].data[0] = bank; - gSprites[gBankSpriteIds[bank]].data[2] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[bank]], MON_DATA_SPECIES); - StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); - } - else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0) - { - GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBattlerPosition(0)); - gBankSpriteIds[bank] = CreateSprite(&gUnknown_02024E8C, 0x50, - (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, - GetBattlerSubpriority(0)); - gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; - gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gBankSpriteIds[bank]].data[0] = bank; - } - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0) - { - GetMonSpriteTemplate_803C5A0(2, GetBattlerPosition(0)); - gBankSpriteIds[bank] = CreateSprite(&gUnknown_02024E8C, 0x50, - (8 - gTrainerBackPicCoords[2].coords) * 4 + 80, - GetBattlerSubpriority(0)); - gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; - gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gBankSpriteIds[bank]].data[0] = bank; - } - else - { - if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[bank]], MON_DATA_HP) == 0) - return; - GetMonSpriteTemplate_803C56C(GetMonData(&gPlayerParty[gBattlerPartyIndexes[bank]], MON_DATA_SPECIES), GetBattlerPosition(bank)); - gBankSpriteIds[bank] = CreateSprite(&gUnknown_02024E8C, GetBattlerSpriteCoord(bank, 2), posY, GetBattlerSubpriority(bank)); - gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; - gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gBankSpriteIds[bank]].data[0] = bank; - gSprites[gBankSpriteIds[bank]].data[2] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[bank]], MON_DATA_SPECIES); - StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); - } - gSprites[gBankSpriteIds[bank]].invisible = ewram17800[bank].invisible; - } -} - -static void sub_807B508(u8 bank) -{ - if (bank < gBattlersCount) - { - u8 healthboxID; - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0) - healthboxID = battle_make_oam_safari_battle(); - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0) - return; - else - healthboxID = battle_make_oam_normal_battle(bank); - gHealthboxIDs[bank] = healthboxID; - sub_8043F44(bank); - sub_8043DFC(healthboxID); - if (GetBattlerSide(bank)) - sub_8045A5C(gHealthboxIDs[bank], &gEnemyParty[gBattlerPartyIndexes[bank]], 0); - else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - sub_8045A5C(gHealthboxIDs[bank], &gPlayerParty[gBattlerPartyIndexes[bank]], 10); - else - sub_8045A5C(gHealthboxIDs[bank], &gPlayerParty[gBattlerPartyIndexes[bank]], 0); - if (GetBattlerPosition(bank) == 3 || GetBattlerPosition(bank) == 2) - nullsub_11(gHealthboxIDs[bank], 1); - else - nullsub_11(gHealthboxIDs[bank], 0); - if (GetBattlerSide(bank)) - { - if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[bank]], MON_DATA_HP) == 0) - sub_8043DB0(healthboxID); - } - else if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) - { - if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[bank]], MON_DATA_HP) == 0) - sub_8043DB0(healthboxID); - } - } -} diff --git a/src/battle/smokescreen.c b/src/battle/smokescreen.c deleted file mode 100644 index dc2887007..000000000 --- a/src/battle/smokescreen.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "decompress.h" -#include "sprite.h" -#include "util.h" - - -static void sub_8046388(struct Sprite *); - - -u8 sub_8046234(s16 x, s16 y, u8 a3) -{ - u8 mainSpriteId; - u8 spriteId1, spriteId2, spriteId3, spriteId4; - struct Sprite *mainSprite; - - if (GetSpriteTileStartByTag(gUnknown_081FAEA4.tag) == 0xFFFF) - { - LoadCompressedObjectPic(&gUnknown_081FAEA4); - LoadCompressedObjectPalette(&gUnknown_081FAEAC); - } - - mainSpriteId = CreateInvisibleSpriteWithCallback(sub_8046388); - mainSprite = &gSprites[mainSpriteId]; - mainSprite->data[1] = a3; - - spriteId1 = CreateSprite(&gSpriteTemplate_81FAF0C, x - 16, y - 16, 2); - gSprites[spriteId1].data[0] = mainSpriteId; - mainSprite->data[0]++; - AnimateSprite(&gSprites[spriteId1]); - - spriteId2 = CreateSprite(&gSpriteTemplate_81FAF0C, x, y - 16, 2); - gSprites[spriteId2].data[0] = mainSpriteId; - mainSprite->data[0]++; - StartSpriteAnim(&gSprites[spriteId2], 1); - AnimateSprite(&gSprites[spriteId2]); - - spriteId3 = CreateSprite(&gSpriteTemplate_81FAF0C, x - 16, y, 2); - gSprites[spriteId3].data[0] = mainSpriteId; - mainSprite->data[0]++; - StartSpriteAnim(&gSprites[spriteId3], 2); - AnimateSprite(&gSprites[spriteId3]); - - spriteId4 = CreateSprite(&gSpriteTemplate_81FAF0C, x, y, 2); - gSprites[spriteId4].data[0] = mainSpriteId; - mainSprite->data[0]++; - StartSpriteAnim(&gSprites[spriteId4], 3); - AnimateSprite(&gSprites[spriteId4]); - - return mainSpriteId; -} - -static void sub_8046388(struct Sprite *sprite) -{ - if (!sprite->data[0]) - { - FreeSpriteTilesByTag(gUnknown_081FAEA4.tag); - FreeSpritePaletteByTag(gUnknown_081FAEAC.tag); - if (!sprite->data[1]) - DestroySprite(sprite); - else - sprite->callback = SpriteCallbackDummy; - } -} - -void sub_80463CC(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - gSprites[sprite->data[0]].data[0]--; - DestroySprite(sprite); - } -} |