diff options
Diffstat (limited to 'src')
82 files changed, 10810 insertions, 2733 deletions
diff --git a/src/battle_2.c b/src/battle_2.c index 2be6f9d77..7bde3d174 100644 --- a/src/battle_2.c +++ b/src/battle_2.c @@ -6,16 +6,18 @@ #include "gpu_regs.h" #include "unknown_task.h" #include "battle_setup.h" +#include "battle_scripts.h" #include "pokemon.h" #include "palette.h" #include "task.h" #include "event_data.h" -#include "species.h" +#include "constants/species.h" #include "berry.h" #include "text.h" #include "item.h" -#include "items.h" -#include "hold_effects.h" +#include "constants/items.h" +#include "constants/hold_effects.h" +#include "constants/trainers.h" #include "link.h" #include "bg.h" #include "dma3.h" @@ -24,20 +26,19 @@ #include "event_data.h" #include "m4a.h" #include "window.h" -#include "rng.h" -#include "songs.h" +#include "random.h" +#include "constants/songs.h" #include "sound.h" #include "battle_message.h" #include "sprite.h" #include "util.h" #include "trig.h" #include "battle_ai_script_commands.h" -#include "battle_move_effects.h" +#include "constants/battle_move_effects.h" #include "battle_controllers.h" #include "pokedex.h" -#include "abilities.h" -#include "moves.h" -#include "trainer_classes.h" +#include "constants/abilities.h" +#include "constants/moves.h" #include "evolution_scene.h" #include "roamer.h" #include "tv.h" @@ -119,14 +120,14 @@ extern u32 gBattleExecBuffer; extern u8 gMultiHitCounter; extern u8 gBattleMoveFlags; extern s32 gBattleMoveDamage; -extern const u8* gUnknown_02024230[BATTLE_BANKS_COUNT]; -extern u16 gUnknownMovesUsedByBanks[BATTLE_BANKS_COUNT]; -extern u16 gLastUsedMovesByBanks[BATTLE_BANKS_COUNT]; -extern u16 gUnknown_02024250[BATTLE_BANKS_COUNT]; -extern u16 gUnknown_02024258[BATTLE_BANKS_COUNT]; -extern u16 gUnknown_02024260[BATTLE_BANKS_COUNT]; +extern const u8* gPalaceSelectionBattleScripts[BATTLE_BANKS_COUNT]; +extern u16 gLastPrintedMoves[BATTLE_BANKS_COUNT]; +extern u16 gLastMoves[BATTLE_BANKS_COUNT]; +extern u16 gLastLandedMoves[BATTLE_BANKS_COUNT]; +extern u16 gLastHitByType[BATTLE_BANKS_COUNT]; +extern u16 gLastResultingMoves[BATTLE_BANKS_COUNT]; extern u16 gLockedMoves[BATTLE_BANKS_COUNT]; -extern u8 gUnknown_02024270[BATTLE_BANKS_COUNT]; +extern u8 gLastHitBy[BATTLE_BANKS_COUNT]; extern u8 gUnknown_02024284[BATTLE_BANKS_COUNT]; extern u32 gStatuses3[BATTLE_BANKS_COUNT]; extern u16 gSideAffecting[2]; @@ -140,7 +141,7 @@ extern u16 gChosenMovesByBanks[BATTLE_BANKS_COUNT]; extern u8 gCurrentActionFuncId; extern u8 gLastUsedAbility; extern u8 gUnknown_0203CF00[]; -extern const u8* gBattlescriptPtrsForSelection[BATTLE_BANKS_COUNT]; +extern const u8* gSelectionBattleScripts[BATTLE_BANKS_COUNT]; extern const u8* gBattlescriptCurrInstr; extern u8 gActionsByTurnOrder[BATTLE_BANKS_COUNT]; extern u8 gCurrentTurnActionNumber; @@ -148,7 +149,7 @@ extern u16 gDynamicBasePower; extern u8 gCritMultiplier; extern u8 gCurrMovePos; extern u8 gUnknown_020241E9; -extern u16 gLastUsedMove; +extern u16 gChosenMove; extern const struct BattleMove gBattleMoves[]; extern const u16 gUnknown_08C004E0[]; // battle textbox palette @@ -159,7 +160,7 @@ extern const u8 gStatStageRatios[][2]; extern const u8 * const gBattleScriptsForMoveEffects[]; extern const u8 * const gBattlescriptsForBallThrow[]; extern const u8 * const gBattlescriptsForRunningByItem[]; -extern const u8 * const gUnknown_082DBD3C[]; +extern const u8 * const gBattlescriptsForUsingItem[]; extern const u8 * const gBattlescriptsForSafariActions[]; // strings @@ -178,38 +179,13 @@ extern const u8 gText_Ice[]; extern const u8 gText_Confusion[]; extern const u8 gText_Love[]; -// battlescripts -extern const u8 gUnknown_082DB8BE[]; -extern const u8 gUnknown_082DB881[]; -extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[]; -extern const u8 gUnknown_082DAB11[]; -extern const u8 gUnknown_082DB9BA[]; -extern const u8 gUnknown_082DAAFE[]; -extern const u8 gUnknown_082DAB0B[]; -extern const u8 BattleScript_FocusPunchSetUp[]; -extern const u8 BattleScript_LinkBattleWonOrLost[]; -extern const u8 BattleScript_FrontierTrainerBattleWon[]; -extern const u8 BattleScript_LocalTrainerBattleWon[]; -extern const u8 BattleScript_PayDayMoneyAndPickUpItems[]; -extern const u8 BattleScript_LocalBattleLost[]; -extern const u8 gUnknown_082DB9C8[]; -extern const u8 gUnknown_082DAA0B[]; -extern const u8 gUnknown_082DB9C1[]; -extern const u8 BattleScript_RanAwayUsingMonAbility[]; -extern const u8 BattleScript_SmokeBallEscape[]; -extern const u8 BattleScript_GotAwaySafely[]; -extern const u8 BattleScript_WildMonFled[]; -extern const u8 BattleScript_MoveUsedLoafingAround[]; -extern const u8 BattleScript_ActionSwitch[]; -extern const u8 BattleScript_PrintFailedToRunString[]; - // functions extern void dp12_8087EA4(void); extern void sub_80356D0(void); extern void GetFrontierTrainerName(u8* dst, u16 trainerId); // battle tower extern void sub_8166188(void); // battle tower, sets link battle mons level but why? extern void sub_8165B88(u8* dst, u16 trainerId); // battle tower, gets language -extern void sub_81DB4DC(u8* dst, u8 arg2); // +extern void PadNameString(u8* dst, u8 arg2); // extern void sub_81B9150(void); extern void sub_800AC34(void); extern void sub_80B3AF8(u8 taskId); // cable club @@ -439,7 +415,7 @@ static void CB2_InitBattleInternal(void) gBattleTerrain = BattleSetup_GetTerrainId(); if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - gBattleTerrain = BATTLE_TERRAIN_INSIDE; + gBattleTerrain = BATTLE_TERRAIN_BUILDING; sub_80356D0(); LoadBattleTextboxAndBackground(); @@ -485,7 +461,7 @@ static void sub_8036A5C(void) u32 status = 0; s32 i; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); @@ -1164,7 +1140,7 @@ static void sub_80379F8(u8 arrayIdPlus) gUnknown_02022FF8[i].gender = GetMonGender(&gPlayerParty[arrayIdPlus + i]); StripExtCtrlCodes(gUnknown_02022FF8[i].nickname); if (GetMonData(&gPlayerParty[arrayIdPlus + i], MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE) - sub_81DB4DC(gUnknown_02022FF8[i].nickname, 0); + PadNameString(gUnknown_02022FF8[i].nickname, CHAR_SPACE); } memcpy(gUnknown_02023058, gUnknown_02022FF8, sizeof(gUnknown_02022FF8)); } @@ -1644,7 +1620,7 @@ void CB2_QuitRecordedBattle(void) void sub_8038528(struct Sprite* sprite) { - sprite->data0 = 0; + sprite->data[0] = 0; sprite->callback = sub_8038538; } @@ -1652,42 +1628,42 @@ static void sub_8038538(struct Sprite *sprite) { u16 *arr = (u16*)(gDecompressionBuffer); - switch (sprite->data0) + switch (sprite->data[0]) { case 0: - sprite->data0++; - sprite->data1 = 0; - sprite->data2 = 0x281; - sprite->data3 = 0; - sprite->data4 = 1; + sprite->data[0]++; + sprite->data[1] = 0; + sprite->data[2] = 0x281; + sprite->data[3] = 0; + sprite->data[4] = 1; // fall through case 1: - sprite->data4--; - if (sprite->data4 == 0) + sprite->data[4]--; + if (sprite->data[4] == 0) { s32 i; s32 r2; s32 r0; - sprite->data4 = 2; - r2 = sprite->data1 + sprite->data3 * 32; - r0 = sprite->data2 - sprite->data3 * 32; + 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->data3++; - if (sprite->data3 == 21) + sprite->data[3]++; + if (sprite->data[3] == 21) { - sprite->data0++; - sprite->data1 = 32; + sprite->data[0]++; + sprite->data[1] = 32; } } break; case 2: - sprite->data1--; - if (sprite->data1 == 20) + sprite->data[1]--; + if (sprite->data[1] == 20) SetMainCallback2(CB2_InitBattle); break; } @@ -1742,7 +1718,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir { const struct TrainerMonNoItemDefaultMoves *partyData = gTrainers[trainerNum].party.NoItemDefaultMoves; - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) + for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++) nameHash += gSpeciesNames[partyData[i].species][j]; personalityValue += nameHash << 8; @@ -1750,11 +1726,11 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); break; } - case PARTY_FLAG_CUSTOM_MOVES: + case F_TRAINER_PARTY_CUSTOM_MOVESET: { const struct TrainerMonNoItemCustomMoves *partyData = gTrainers[trainerNum].party.NoItemCustomMoves; - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) + for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++) nameHash += gSpeciesNames[partyData[i].species][j]; personalityValue += nameHash << 8; @@ -1768,11 +1744,11 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir } break; } - case PARTY_FLAG_HAS_ITEM: + case F_TRAINER_PARTY_HELD_ITEM: { const struct TrainerMonItemDefaultMoves *partyData = gTrainers[trainerNum].party.ItemDefaultMoves; - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) + for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++) nameHash += gSpeciesNames[partyData[i].species][j]; personalityValue += nameHash << 8; @@ -1782,11 +1758,11 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); break; } - case PARTY_FLAG_CUSTOM_MOVES | PARTY_FLAG_HAS_ITEM: + 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++) + for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++) nameHash += gSpeciesNames[partyData[i].species][j]; personalityValue += nameHash << 8; @@ -1848,12 +1824,12 @@ void nullsub_17(void) static void sub_8038B04(struct Sprite *sprite) { - if (sprite->data0 != 0) - sprite->pos1.x = sprite->data1 + ((sprite->data2 & 0xFF00) >> 8); + if (sprite->data[0] != 0) + sprite->pos1.x = sprite->data[1] + ((sprite->data[2] & 0xFF00) >> 8); else - sprite->pos1.x = sprite->data1 - ((sprite->data2 & 0xFF00) >> 8); + sprite->pos1.x = sprite->data[1] - ((sprite->data[2] & 0xFF00) >> 8); - sprite->data2 += 0x180; + sprite->data[2] += 0x180; if (sprite->affineAnimEnded) { @@ -1902,7 +1878,7 @@ static void sub_8038B94(u8 taskId) } r7 = 0; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&sp4[i], MON_DATA_SPECIES2); u16 hp = GetMonData(&sp4[i], MON_DATA_HP); @@ -1926,7 +1902,7 @@ static void sub_8038B94(u8 taskId) gTasks[taskId].data[3] = r7; r7 = 0; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&sp8[i], MON_DATA_SPECIES2); u16 hp = GetMonData(&sp8[i], MON_DATA_HP); @@ -2406,8 +2382,8 @@ u32 sub_80397C4(u32 setId, u32 tableId) return gUnknown_0831ABA0[setId][tableId].width * 8; } -#define tBank data0 -#define tSpeciesId data2 +#define tBank data[0] +#define tSpeciesId data[2] void oac_poke_opponent(struct Sprite *sprite) { @@ -2455,20 +2431,20 @@ void SpriteCallbackDummy_2(struct Sprite *sprite) static void sub_80398BC(struct Sprite *sprite) // unused? { - sprite->data3 = 6; - sprite->data4 = 1; + sprite->data[3] = 6; + sprite->data[4] = 1; sprite->callback = sub_80398D0; } static void sub_80398D0(struct Sprite *sprite) { - sprite->data4--; - if (sprite->data4 == 0) + sprite->data[4]--; + if (sprite->data[4] == 0) { - sprite->data4 = 8; + sprite->data[4] = 8; sprite->invisible ^= 1; - sprite->data3--; - if (sprite->data3 == 0) + sprite->data[3]--; + if (sprite->data[3] == 0) { sprite->invisible = FALSE; sprite->callback = SpriteCallbackDummy_2; @@ -2519,8 +2495,8 @@ void sub_8039934(struct Sprite *sprite) yOffset = gMonFrontPicCoords[species].y_offset; } - sprite->data3 = 8 - yOffset / 8; - sprite->data4 = 1; + sprite->data[3] = 8 - yOffset / 8; + sprite->data[4] = 1; sprite->callback = sub_8039A48; } @@ -2528,20 +2504,20 @@ static void sub_8039A48(struct Sprite *sprite) { s32 i; - sprite->data4--; - if (sprite->data4 == 0) + sprite->data[4]--; + if (sprite->data[4] == 0) { - sprite->data4 = 2; + sprite->data[4] = 2; sprite->pos2.y += 8; - sprite->data3--; - if (sprite->data3 < 0) + sprite->data[3]--; + if (sprite->data[3] < 0) { FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } else { - u8 *dst = (u8 *)gMonSpritesGfxPtr->sprites[GetBankIdentity(sprite->tBank)] + (gBattleMonForms[sprite->tBank] << 11) + (sprite->data3 << 8); + u8 *dst = (u8 *)gMonSpritesGfxPtr->sprites[GetBankIdentity(sprite->tBank)] + (gBattleMonForms[sprite->tBank] << 11) + (sprite->data[3] << 8); for (i = 0; i < 0x100; i++) *(dst++) = 0; @@ -2553,25 +2529,25 @@ static void sub_8039A48(struct Sprite *sprite) void sub_8039AD8(struct Sprite *sprite) { - sprite->data3 = 8; - sprite->data4 = sprite->invisible; + sprite->data[3] = 8; + sprite->data[4] = sprite->invisible; sprite->callback = sub_8039AF4; } static void sub_8039AF4(struct Sprite *sprite) { - sprite->data3--; - if (sprite->data3 == 0) + sprite->data[3]--; + if (sprite->data[3] == 0) { sprite->invisible ^= 1; - sprite->data3 = 8; + sprite->data[3] = 8; } } void sub_8039B2C(struct Sprite *sprite) { - sprite->invisible = sprite->data4; - sprite->data4 = FALSE; + sprite->invisible = sprite->data[4]; + sprite->data[4] = FALSE; sprite->callback = SpriteCallbackDummy_2; } @@ -2601,7 +2577,7 @@ static void oac_poke_ally_(struct Sprite *sprite) if (sprite->pos2.x == 0) { sprite->callback = SpriteCallbackDummy_3; - sprite->data1 = 0; + sprite->data[1] = 0; } } } @@ -2619,8 +2595,8 @@ void sub_8039C00(struct Sprite *sprite) { if (!(gUnknown_020243FC & 1)) { - sprite->pos2.x += sprite->data1; - sprite->pos2.y += sprite->data2; + sprite->pos2.x += sprite->data[1]; + sprite->pos2.y += sprite->data[2]; } } @@ -2646,19 +2622,19 @@ void dp11b_obj_instanciate(u8 bank, u8 b, s8 c, s8 d) spriteId2 = gHealthBoxesIds[bank]; gBattleSpritesDataPtr->healthBoxesData[bank].field_2 = bounceHealthBoxSpriteId; gBattleSpritesDataPtr->healthBoxesData[bank].flag_x2 = 1; - gSprites[bounceHealthBoxSpriteId].data0 = 0x80; + gSprites[bounceHealthBoxSpriteId].data[0] = 0x80; } else { spriteId2 = gBankSpriteIds[bank]; gBattleSpritesDataPtr->healthBoxesData[bank].field_3 = bounceHealthBoxSpriteId; gBattleSpritesDataPtr->healthBoxesData[bank].flag_x4 = 1; - gSprites[bounceHealthBoxSpriteId].data0 = 0xC0; + gSprites[bounceHealthBoxSpriteId].data[0] = 0xC0; } - gSprites[bounceHealthBoxSpriteId].data1 = c; - gSprites[bounceHealthBoxSpriteId].data2 = d; - gSprites[bounceHealthBoxSpriteId].data3 = spriteId2; - gSprites[bounceHealthBoxSpriteId].data4 = b; + gSprites[bounceHealthBoxSpriteId].data[1] = c; + gSprites[bounceHealthBoxSpriteId].data[2] = d; + gSprites[bounceHealthBoxSpriteId].data[3] = spriteId2; + gSprites[bounceHealthBoxSpriteId].data[4] = b; gSprites[spriteId2].pos2.x = 0; gSprites[spriteId2].pos2.y = 0; } @@ -2672,7 +2648,7 @@ void dp11b_obj_free(u8 bank, bool8 b) if (!gBattleSpritesDataPtr->healthBoxesData[bank].flag_x2) return; - r4 = gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].field_2].data3; + r4 = gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].field_2].data[3]; DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].field_2]); gBattleSpritesDataPtr->healthBoxesData[bank].flag_x2 = 0; } @@ -2681,7 +2657,7 @@ void dp11b_obj_free(u8 bank, bool8 b) if (!gBattleSpritesDataPtr->healthBoxesData[bank].flag_x4) return; - r4 = gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].field_3].data3; + r4 = gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].field_3].data[3]; DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].field_3]); gBattleSpritesDataPtr->healthBoxesData[bank].flag_x4 = 0; } @@ -2691,16 +2667,16 @@ void dp11b_obj_free(u8 bank, bool8 b) static void SpriteCB_HealthBoxBounce(struct Sprite *sprite) { - u8 spriteId = sprite->data3; + u8 spriteId = sprite->data[3]; s32 var; - if (sprite->data4 == 1) - var = sprite->data0; + if (sprite->data[4] == 1) + var = sprite->data[0]; else - var = sprite->data0; + var = sprite->data[0]; - gSprites[spriteId].pos2.y = Sin(var, sprite->data2) + sprite->data2; - sprite->data0 = (sprite->data0 + sprite->data1) & 0xFF; + gSprites[spriteId].pos2.y = Sin(var, sprite->data[2]) + sprite->data[2]; + sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF; } void sub_8039E44(struct Sprite *sprite) @@ -2765,17 +2741,17 @@ static void BattleStartClearSetData(void) for (j = 0; j < sizeof(struct DisableStruct); j++) dataPtr[j] = 0; - gDisableStructs[i].isFirstTurn= 2; + gDisableStructs[i].isFirstTurn = 2; gUnknown_02024284[i] = 0; - gLastUsedMovesByBanks[i] = 0; - gUnknown_02024250[i] = 0; - gUnknown_02024258[i] = 0; - gUnknown_02024260[i] = 0; - gUnknown_02024270[i] = 0xFF; + gLastMoves[i] = 0; + gLastLandedMoves[i] = 0; + gLastHitByType[i] = 0; + gLastResultingMoves[i] = 0; + gLastHitBy[i] = 0xFF; gLockedMoves[i] = 0; - gUnknownMovesUsedByBanks[i] = 0; + gLastPrintedMoves[i] = 0; gBattleResources->flags->flags[i] = 0; - gUnknown_02024230[i] = 0; + gPalaceSelectionBattleScripts[i] = 0; } for (i = 0; i < 2; i++) @@ -2896,7 +2872,7 @@ void SwitchInClearSetData(void) && (gStatuses3[i] & STATUS3_ALWAYS_HITS) != 0 && (gDisableStructs[i].bankWithSureHit == gActiveBank)) { - gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; + gStatuses3[i] &= ~(STATUS3_ALWAYS_HITS); gStatuses3[i] |= 0x10; } } @@ -2932,14 +2908,14 @@ void SwitchInClearSetData(void) } gBattleMoveFlags = 0; - gDisableStructs[gActiveBank].isFirstTurn= 2; + gDisableStructs[gActiveBank].isFirstTurn = 2; gDisableStructs[gActiveBank].truantUnknownBit = disableStructCopy.truantUnknownBit; - gLastUsedMovesByBanks[gActiveBank] = 0; - gUnknown_02024250[gActiveBank] = 0; - gUnknown_02024258[gActiveBank] = 0; - gUnknown_02024260[gActiveBank] = 0; - gUnknownMovesUsedByBanks[gActiveBank] = 0; - gUnknown_02024270[gActiveBank] = 0xFF; + gLastMoves[gActiveBank] = 0; + gLastLandedMoves[gActiveBank] = 0; + gLastHitByType[gActiveBank] = 0; + gLastResultingMoves[gActiveBank] = 0; + gLastPrintedMoves[gActiveBank] = 0; + gLastHitBy[gActiveBank] = 0xFF; *(gBattleStruct->mirrorMoves + gActiveBank * 2 + 0) = 0; *(gBattleStruct->mirrorMoves + gActiveBank * 2 + 1) = 0; @@ -3026,12 +3002,12 @@ void FaintClearSetData(void) gDisableStructs[gActiveBank].isFirstTurn = 2; - gLastUsedMovesByBanks[gActiveBank] = 0; - gUnknown_02024250[gActiveBank] = 0; - gUnknown_02024258[gActiveBank] = 0; - gUnknown_02024260[gActiveBank] = 0; - gUnknownMovesUsedByBanks[gActiveBank] = 0; - gUnknown_02024270[gActiveBank] = 0xFF; + gLastMoves[gActiveBank] = 0; + gLastLandedMoves[gActiveBank] = 0; + gLastHitByType[gActiveBank] = 0; + gLastResultingMoves[gActiveBank] = 0; + gLastPrintedMoves[gActiveBank] = 0; + gLastHitBy[gActiveBank] = 0xFF; *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBank]) + 0) = 0; *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBank]) + 1) = 0; @@ -3213,7 +3189,7 @@ static void BattleIntroDrawPartySummaryScreens(void) if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) @@ -3231,7 +3207,7 @@ static void BattleIntroDrawPartySummaryScreens(void) EmitDrawPartyStatusSummary(0, hpStatus, 0x80); MarkBufferBankForExecution(gActiveBank); - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) @@ -3692,10 +3668,10 @@ static void TryDoEventsBeforeFirstTurn(void) *(&gBattleStruct->turnEffectsTracker) = 0; *(&gBattleStruct->turnEffectsBank) = 0; - *(&gBattleStruct->field_1A0) = 0; - *(&gBattleStruct->field_1A1) = 0; + *(&gBattleStruct->wishPerishSongState) = 0; + *(&gBattleStruct->wishPerishSongBank) = 0; gBattleScripting.atk49_state = 0; - gBattleStruct->field_4D = 0; + gBattleStruct->faintedActionsState = 0; gBattleStruct->turncountersTracker = 0; gBattleMoveFlags = 0; @@ -3704,7 +3680,7 @@ static void TryDoEventsBeforeFirstTurn(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA) { StopCryAndClearCrySongs(); - BattleScriptExecute(gUnknown_082DB8BE); + BattleScriptExecute(BattleScript_82DB8BE); } } @@ -3725,8 +3701,8 @@ static void HandleEndTurn_ContinueBattle(void) } gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBank = 0; - gBattleStruct->field_1A0 = 0; - gBattleStruct->field_1A1 = 0; + gBattleStruct->wishPerishSongState = 0; + gBattleStruct->wishPerishSongBank = 0; gBattleStruct->turncountersTracker = 0; gBattleMoveFlags = 0; } @@ -3744,10 +3720,10 @@ void BattleTurnPassed(void) if (TurnBasedEffects() != 0) return; } - if (sub_8041728() != 0) + if (HandleFaintedMonActions() != 0) return; - gBattleStruct->field_4D = 0; - if (sub_8041364() != 0) + gBattleStruct->faintedActionsState = 0; + if (HandleWishPerishSongOnTurnEnd() != 0) return; TurnValuesCleanUp(FALSE); @@ -3792,9 +3768,9 @@ void BattleTurnPassed(void) gRandomTurnNumber = Random(); if (gBattleTypeFlags & BATTLE_TYPE_PALACE) - BattleScriptExecute(gUnknown_082DB881); + BattleScriptExecute(BattleScript_82DB881); else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->field_DA == 0) - BattleScriptExecute(gUnknown_082DB8BE); + BattleScriptExecute(BattleScript_82DB8BE); } u8 IsRunningFromBattleImpossible(void) @@ -4007,7 +3983,7 @@ static void HandleTurnActionSelectionState(void) | BATTLE_TYPE_x2000000)) { RecordedBattle_ClearBankAction(gActiveBank, 1); - gBattlescriptPtrsForSelection[gActiveBank] = BattleScript_ActionSelectionItemsCantBeUsed; + gSelectionBattleScripts[gActiveBank] = BattleScript_ActionSelectionItemsCantBeUsed; gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT; *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE; *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_BEFORE_ACTION_CHOSEN; @@ -4052,7 +4028,7 @@ static void HandleTurnActionSelectionState(void) case ACTION_SAFARI_ZONE_BALL: if (IsPlayerPartyAndPokemonStorageFull()) { - gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DAB11; + gSelectionBattleScripts[gActiveBank] = BattleScript_PrintFullBox; gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT; *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE; *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_BEFORE_ACTION_CHOSEN; @@ -4107,7 +4083,7 @@ static void HandleTurnActionSelectionState(void) && gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_x4000000) && gBattleBufferB[gActiveBank][1] == ACTION_RUN) { - gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB9BA; + gSelectionBattleScripts[gActiveBank] = BattleScript_AskIfWantsToForfeitMatch; gBattleCommunication[gActiveBank] = 8; *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE; *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_BEFORE_ACTION_CHOSEN; @@ -4117,13 +4093,13 @@ static void HandleTurnActionSelectionState(void) && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) && gBattleBufferB[gActiveBank][1] == ACTION_RUN) { - BattleScriptExecute(gUnknown_082DAAFE); + BattleScriptExecute(BattleScript_PrintCantRunFromTrainer); gBattleCommunication[gActiveBank] = 1; } - else if (IsRunningFromBattleImpossible() != 0 + else if (IsRunningFromBattleImpossible() && gBattleBufferB[gActiveBank][1] == ACTION_RUN) { - gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DAB0B; + gSelectionBattleScripts[gActiveBank] = BattleScript_PrintCantEscapeFromBattle; gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT; *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE; *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_BEFORE_ACTION_CHOSEN; @@ -4276,12 +4252,12 @@ static void HandleTurnActionSelectionState(void) else { gBankAttacker = gActiveBank; - gBattlescriptCurrInstr = gBattlescriptPtrsForSelection[gActiveBank]; + gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBank]; if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC)))) { gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } - gBattlescriptPtrsForSelection[gActiveBank] = gBattlescriptCurrInstr; + gSelectionBattleScripts[gActiveBank] = gBattlescriptCurrInstr; } break; case STATE_WAIT_SET_BEFORE_ACTION: @@ -4308,12 +4284,12 @@ static void HandleTurnActionSelectionState(void) else { gBankAttacker = gActiveBank; - gBattlescriptCurrInstr = gBattlescriptPtrsForSelection[gActiveBank]; + gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBank]; if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC)))) { gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } - gBattlescriptPtrsForSelection[gActiveBank] = gBattlescriptCurrInstr; + gSelectionBattleScripts[gActiveBank] = gBattlescriptCurrInstr; } break; } @@ -4716,7 +4692,7 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) gBattleMainFunc = RunTurnActionsFunctions; gBattleCommunication[3] = 0; gBattleCommunication[4] = 0; - gBattleScripting.field_16 = 0; + gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; } @@ -4725,7 +4701,7 @@ static void RunTurnActionsFunctions(void) if (gBattleOutcome != 0) gCurrentActionFuncId = 12; - *(&gBattleStruct->field_4B) = gCurrentTurnActionNumber; + *(&gBattleStruct->savedTurnActionNumber) = gCurrentTurnActionNumber; sTurnActionsFuncsTable[gCurrentActionFuncId](); if (gCurrentTurnActionNumber >= gNoOfAllBanks) // everyone did their actions, turn finished @@ -4735,7 +4711,7 @@ static void RunTurnActionsFunctions(void) } else { - if (gBattleStruct->field_4B != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another bank + if (gBattleStruct->savedTurnActionNumber != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another bank { gHitMarker &= ~(HITMARKER_NO_ATTACKSTRING); gHitMarker &= ~(HITMARKER_UNABLE_TO_USE_MOVE); @@ -4753,7 +4729,7 @@ static void HandleEndTurn_BattleWon(void) gBattleTextBuff1[0] = gBattleOutcome; gBankAttacker = GetBankByIdentity(IDENTITY_PLAYER_MON1); gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost; - gBattleOutcome &= ~(BATTLE_OUTCOME_BIT_x80); + gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN); } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_x4000000 | BATTLE_TYPE_EREADER_TRAINER)) @@ -4773,19 +4749,19 @@ static void HandleEndTurn_BattleWon(void) switch (gTrainers[gTrainerBattleOpponent_A].trainerClass) { - case CLASS_ELITE_FOUR: - case CLASS_CHAMPION: + case TRAINER_CLASS_ELITE_FOUR: + case TRAINER_CLASS_CHAMPION: PlayBGM(BGM_KACHI5); break; - case CLASS_TEAM_AQUA: - case CLASS_TEAM_MAGMA: - case CLASS_AQUA_ADMIN: - case CLASS_AQUA_LEADER: - case CLASS_MAGMA_ADMIN: - case CLASS_MAGMA_LEADER: + 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(BGM_KACHI4); break; - case CLASS_LEADER: + case TRAINER_CLASS_LEADER: PlayBGM(BGM_KACHI3); break; default: @@ -4809,16 +4785,16 @@ static void HandleEndTurn_BattleLost(void) { if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - if (gBattleOutcome & BATTLE_OUTCOME_BIT_x80) + if (gBattleOutcome & OUTCOME_LINK_BATTLE_RUN) { - gBattlescriptCurrInstr = gUnknown_082DB9C8; - gBattleOutcome &= ~(BATTLE_OUTCOME_BIT_x80); + gBattlescriptCurrInstr = BattleScript_PrintPlayerForfeitedLinkBattle; + gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN); gSaveBlock2Ptr->field_CA9_b = 1; } else { - gBattlescriptCurrInstr = gUnknown_082DAA0B; - gBattleOutcome &= ~(BATTLE_OUTCOME_BIT_x80); + gBattlescriptCurrInstr = BattleScript_82DAA0B; + gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN); } } else @@ -4826,7 +4802,7 @@ static void HandleEndTurn_BattleLost(void) gBattleTextBuff1[0] = gBattleOutcome; gBankAttacker = GetBankByIdentity(IDENTITY_PLAYER_MON1); gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost; - gBattleOutcome &= ~(BATTLE_OUTCOME_BIT_x80); + gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN); } } else @@ -4843,13 +4819,13 @@ static void HandleEndTurn_RanFromBattle(void) if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER && gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - gBattlescriptCurrInstr = gUnknown_082DB9C1; + gBattlescriptCurrInstr = BattleScript_PrintPlayerForfeited; gBattleOutcome = BATTLE_FORFEITED; gSaveBlock2Ptr->field_CA9_b = 1; } else if (gBattleTypeFlags & BATTLE_TYPE_x4000000) { - gBattlescriptCurrInstr = gUnknown_082DB9C1; + gBattlescriptCurrInstr = BattleScript_PrintPlayerForfeited; gBattleOutcome = BATTLE_FORFEITED; } else @@ -5072,19 +5048,19 @@ static void HandleAction_UseMove(void) if (gProtectStructs[gBankAttacker].onlyStruggle) { gProtectStructs[gBankAttacker].onlyStruggle = 0; - gCurrentMove = gLastUsedMove = MOVE_STRUGGLE; + gCurrentMove = gChosenMove = MOVE_STRUGGLE; gHitMarker |= HITMARKER_NO_PPDEDUCT; *(gBattleStruct->moveTarget + gBankAttacker) = GetMoveTarget(MOVE_STRUGGLE, 0); } else if (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBankAttacker].status2 & STATUS2_RECHARGE) { - gCurrentMove = gLastUsedMove = gLockedMoves[gBankAttacker]; + 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 = gLastUsedMove = gDisableStructs[gBankAttacker].encoredMove; + gCurrentMove = gChosenMove = gDisableStructs[gBankAttacker].encoredMove; gCurrMovePos = gUnknown_020241E9 = gDisableStructs[gBankAttacker].encoredMovePos; *(gBattleStruct->moveTarget + gBankAttacker) = GetMoveTarget(gCurrentMove, 0); } @@ -5093,7 +5069,7 @@ static void HandleAction_UseMove(void) && gDisableStructs[gBankAttacker].encoredMove != gBattleMons[gBankAttacker].moves[gDisableStructs[gBankAttacker].encoredMovePos]) { gCurrMovePos = gUnknown_020241E9 = gDisableStructs[gBankAttacker].encoredMovePos; - gCurrentMove = gLastUsedMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; + gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; gDisableStructs[gBankAttacker].encoredMove = MOVE_NONE; gDisableStructs[gBankAttacker].encoredMovePos = 0; gDisableStructs[gBankAttacker].encoreTimer1 = 0; @@ -5101,12 +5077,12 @@ static void HandleAction_UseMove(void) } else if (gBattleMons[gBankAttacker].moves[gCurrMovePos] != gChosenMovesByBanks[gBankAttacker]) { - gCurrentMove = gLastUsedMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; + gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; *(gBattleStruct->moveTarget + gBankAttacker) = GetMoveTarget(gCurrentMove, 0); } else { - gCurrentMove = gLastUsedMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; + gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; } if (gBattleMons[gBankAttacker].hp != 0) @@ -5146,7 +5122,7 @@ static void HandleAction_UseMove(void) } if (var == 4) { - if (gBattleMoves[gLastUsedMove].target & MOVE_TARGET_RANDOM) + if (gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM) { if (GetBankSide(gBankAttacker) == SIDE_PLAYER) { @@ -5191,7 +5167,7 @@ static void HandleAction_UseMove(void) } } else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && gBattleMoves[gLastUsedMove].target & MOVE_TARGET_RANDOM) + && gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM) { if (GetBankSide(gBankAttacker) == SIDE_PLAYER) { @@ -5241,11 +5217,11 @@ static void HandleAction_UseMove(void) gCurrentActionFuncId = 12; return; } - else if (gUnknown_02024230[gBankAttacker] != NULL) + else if (gPalaceSelectionBattleScripts[gBankAttacker] != NULL) { gBattleCommunication[MULTISTRING_CHOOSER] = 4; - gBattlescriptCurrInstr = gUnknown_02024230[gBankAttacker]; - gUnknown_02024230[gBankAttacker] = NULL; + gBattlescriptCurrInstr = gPalaceSelectionBattleScripts[gBankAttacker]; + gPalaceSelectionBattleScripts[gBankAttacker] = NULL; } else { @@ -5300,7 +5276,7 @@ static void HandleAction_UseItem(void) } else if (GetBankSide(gBankAttacker) == SIDE_PLAYER) { - gBattlescriptCurrInstr = gUnknown_082DBD3C[0]; + gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0]; } else { @@ -5356,7 +5332,7 @@ static void HandleAction_UseItem(void) break; } - gBattlescriptCurrInstr = gUnknown_082DBD3C[*(gBattleStruct->AI_itemType + gBankAttacker / 2)]; + gBattlescriptCurrInstr = gBattlescriptsForUsingItem[*(gBattleStruct->AI_itemType + gBankAttacker / 2)]; } gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; } @@ -5463,7 +5439,7 @@ static void HandleAction_Run(void) } } - gBattleOutcome |= BATTLE_OUTCOME_BIT_x80; + gBattleOutcome |= OUTCOME_LINK_BATTLE_RUN; gSaveBlock2Ptr->field_CA9_b = 1; } else @@ -5589,9 +5565,9 @@ static void HandleAction_Action9(void) static void HandleAction_Action11(void) { - if (!sub_8041728()) + if (!HandleFaintedMonActions()) { - gBattleStruct->field_4D = 0; + gBattleStruct->faintedActionsState = 0; gCurrentActionFuncId = ACTION_FINISHED; } } @@ -5624,13 +5600,13 @@ static void HandleAction_ActionFinished(void) gBattleMoveFlags = 0; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; - gUnknown_02024250[gBankAttacker] = 0; - gUnknown_02024258[gBankAttacker] = 0; + gLastLandedMoves[gBankAttacker] = 0; + gLastHitByType[gBankAttacker] = 0; gBattleStruct->dynamicMoveType = 0; gDynamicBasePower = 0; gBattleScripting.atk49_state = 0; gBattleCommunication[3] = 0; gBattleCommunication[4] = 0; - gBattleScripting.field_16 = 0; + gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; } diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 24377eacc..44be0a4d9 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -2,17 +2,16 @@ #include "battle_ai_script_commands.h" #include "pokemon.h" #include "battle.h" -#include "species.h" -#include "abilities.h" -#include "rng.h" +#include "constants/species.h" +#include "constants/abilities.h" +#include "random.h" #include "item.h" -#include "battle_move_effects.h" -#include "moves.h" +#include "constants/battle_move_effects.h" +#include "constants/moves.h" #include "util.h" #define AIScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) #define AIScriptRead16(ptr) ((ptr)[0] | (ptr)[1] << 8) -#define AIScriptRead8(ptr) ((ptr)[0]) #define AIScriptReadPtr(ptr) (const u8*) AIScriptRead32(ptr) #define AI_ACTION_DONE 0x0001 @@ -58,7 +57,7 @@ extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT]; extern u16 gCurrentMove; extern u8 gBankTarget; extern u8 gAbsentBankFlags; -extern u16 gLastUsedMovesByBanks[BATTLE_BANKS_COUNT]; +extern u16 gLastMoves[BATTLE_BANKS_COUNT]; extern u16 gTrainerBattleOpponent_A; extern u16 gTrainerBattleOpponent_B; extern u32 gStatuses3[BATTLE_BANKS_COUNT]; @@ -633,12 +632,12 @@ static void RecordLastUsedMoveByTarget(void) for (i = 0; i < 4; i++) { - if (gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] == gLastUsedMovesByBanks[gBankTarget]) + if (gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] == gLastMoves[gBankTarget]) break; - if (gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] != gLastUsedMovesByBanks[gBankTarget] // HACK: This redundant condition is a hack to make the asm match. + if (gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] != gLastMoves[gBankTarget] // HACK: This redundant condition is a hack to make the asm match. && gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] == 0) { - gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] = gLastUsedMovesByBanks[gBankTarget]; + gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] = gLastMoves[gBankTarget]; break; } } @@ -1252,9 +1251,9 @@ static void BattleAICmd_is_most_powerful_move(void) static void BattleAICmd_get_last_used_bank_move(void) { if (gAIScriptPtr[1] == AI_USER) - AI_THINKING_STRUCT->funcResult = gLastUsedMovesByBanks[sBank_AI]; + AI_THINKING_STRUCT->funcResult = gLastMoves[sBank_AI]; else - AI_THINKING_STRUCT->funcResult = gLastUsedMovesByBanks[gBankTarget]; + AI_THINKING_STRUCT->funcResult = gLastMoves[gBankTarget]; gAIScriptPtr += 2; } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 75d144c3d..b3fccb17f 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1,13 +1,13 @@ #include "global.h" #include "battle.h" #include "battle_controllers.h" -#include "abilities.h" -#include "moves.h" +#include "constants/abilities.h" +#include "constants/moves.h" #include "pokemon.h" -#include "species.h" -#include "rng.h" +#include "constants/species.h" +#include "random.h" #include "util.h" -#include "items.h" +#include "constants/items.h" #include "pokemon_item_effects.h" extern u8 gActiveBank; @@ -16,8 +16,8 @@ extern u32 gBattleTypeFlags; extern u32 gStatuses3[BATTLE_BANKS_COUNT]; extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT]; extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; -extern u16 gUnknown_02024250[BATTLE_BANKS_COUNT]; -extern u8 gUnknown_02024270[BATTLE_BANKS_COUNT]; +extern u16 gLastLandedMoves[BATTLE_BANKS_COUNT]; +extern u8 gLastHitBy[BATTLE_BANKS_COUNT]; extern u16 gDynamicBasePower; extern u8 gBattleMoveFlags; extern u8 gCritMultiplier; @@ -141,11 +141,11 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) if (HasSuperEffectiveMoveAgainstOpponents(TRUE) && Random() % 3 != 0) return FALSE; - if (gUnknown_02024250[gActiveBank] == 0) + if (gLastLandedMoves[gActiveBank] == 0) return FALSE; - if (gUnknown_02024250[gActiveBank] == 0xFFFF) + if (gLastLandedMoves[gActiveBank] == 0xFFFF) return FALSE; - if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0) + if (gBattleMoves[gLastLandedMoves[gActiveBank]].power == 0) return FALSE; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) @@ -162,11 +162,11 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) bankIn2 = gActiveBank; } - if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_FIRE) + if (gBattleMoves[gLastLandedMoves[gActiveBank]].type == TYPE_FIRE) absorbingTypeAbility = ABILITY_FLASH_FIRE; - else if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_WATER) + else if (gBattleMoves[gLastLandedMoves[gActiveBank]].type == TYPE_WATER) absorbingTypeAbility = ABILITY_WATER_ABSORB; - else if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_ELECTRIC) + else if (gBattleMoves[gLastLandedMoves[gActiveBank]].type == TYPE_ELECTRIC) absorbingTypeAbility = ABILITY_VOLT_ABSORB; else return FALSE; @@ -238,13 +238,13 @@ static bool8 ShouldSwitchIfNaturalCure(void) if (gBattleMons[gActiveBank].hp < gBattleMons[gActiveBank].maxHP / 2) return FALSE; - if ((gUnknown_02024250[gActiveBank] == 0 || gUnknown_02024250[gActiveBank] == 0xFFFF) && Random() & 1) + if ((gLastLandedMoves[gActiveBank] == 0 || gLastLandedMoves[gActiveBank] == 0xFFFF) && Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = 6; EmitTwoReturnValues(1, ACTION_SWITCH, 0); return TRUE; } - else if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0 && Random() & 1) + else if (gBattleMoves[gLastLandedMoves[gActiveBank]].power == 0 && Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = 6; EmitTwoReturnValues(1, ACTION_SWITCH, 0); @@ -345,13 +345,13 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) u16 move; u8 moveFlags; - if (gUnknown_02024250[gActiveBank] == 0) + if (gLastLandedMoves[gActiveBank] == 0) return FALSE; - if (gUnknown_02024250[gActiveBank] == 0xFFFF) + if (gLastLandedMoves[gActiveBank] == 0xFFFF) return FALSE; - if (gUnknown_02024270[gActiveBank] == 0xFF) + if (gLastHitBy[gActiveBank] == 0xFF) return FALSE; - if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0) + if (gBattleMoves[gLastLandedMoves[gActiveBank]].power == 0) return FALSE; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) @@ -411,10 +411,10 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) else monAbility = gBaseStats[species].ability1; - moveFlags = AI_TypeCalc(gUnknown_02024250[gActiveBank], species, monAbility); + moveFlags = AI_TypeCalc(gLastLandedMoves[gActiveBank], species, monAbility); if (moveFlags & flags) { - bankIn1 = gUnknown_02024270[gActiveBank]; + bankIn1 = gLastHitBy[gActiveBank]; for (j = 0; j < 4; j++) { diff --git a/src/battle_anim.c b/src/battle_anim.c index fa3ac73be..2eec0bed5 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -423,7 +423,7 @@ static void ScriptCmd_createsprite(void) if (subpriority < 3) subpriority = 3; - CreateSpriteAndAnimate(template, sub_80A5C6C(gAnimBankTarget, 2), sub_80A5C6C(gAnimBankTarget, 3), subpriority); + CreateSpriteAndAnimate(template, GetBankPosition(gAnimBankTarget, 2), GetBankPosition(gAnimBankTarget, 3), subpriority); gAnimVisualTaskCount++; } diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 423d34d45..dd8582618 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -10,7 +10,7 @@ #include "link.h" #include "util.h" #include "main.h" -#include "songs.h" +#include "constants/songs.h" #include "sound.h" #include "window.h" #include "m4a.h" @@ -82,7 +82,7 @@ static void LinkOpponentHandleBallThrowAnim(void); static void LinkOpponentHandlePause(void); static void LinkOpponentHandleMoveAnimation(void); static void LinkOpponentHandlePrintString(void); -static void LinkOpponentHandlePrintStringPlayerOnly(void); +static void LinkOpponentHandlePrintSelectionString(void); static void LinkOpponentHandleChooseAction(void); static void LinkOpponentHandleUnknownYesNoBox(void); static void LinkOpponentHandleChooseMove(void); @@ -108,7 +108,7 @@ static void LinkOpponentHandleCmd39(void); static void LinkOpponentHandleCmd40(void); static void LinkOpponentHandleHitAnimation(void); static void LinkOpponentHandleCmd42(void); -static void LinkOpponentHandleEffectivenessSound(void); +static void LinkOpponentHandlePlaySE(void); static void LinkOpponentHandlePlayFanfareOrBGM(void); static void LinkOpponentHandleFaintingCry(void); static void LinkOpponentHandleIntroSlide(void); @@ -154,7 +154,7 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = LinkOpponentHandlePause, LinkOpponentHandleMoveAnimation, LinkOpponentHandlePrintString, - LinkOpponentHandlePrintStringPlayerOnly, + LinkOpponentHandlePrintSelectionString, LinkOpponentHandleChooseAction, LinkOpponentHandleUnknownYesNoBox, LinkOpponentHandleChooseMove, @@ -180,7 +180,7 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = LinkOpponentHandleCmd40, LinkOpponentHandleHitAnimation, LinkOpponentHandleCmd42, - LinkOpponentHandleEffectivenessSound, + LinkOpponentHandlePlaySE, LinkOpponentHandlePlayFanfareOrBGM, LinkOpponentHandleFaintingCry, LinkOpponentHandleIntroSlide, @@ -310,14 +310,14 @@ static void sub_8064734(void) { bool32 r10 = FALSE; - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1) { sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]); } if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8 + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1) { @@ -325,7 +325,7 @@ static void sub_8064734(void) } - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80) { @@ -465,18 +465,18 @@ static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBankSpriteIds[gActiveBank]; - if (gSprites[spriteId].data1 == 32) + if (gSprites[spriteId].data[1] == 32) { - gSprites[spriteId].data1 = 0; + gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = 0; gDoingBattleAnim = FALSE; LinkOpponentBufferExecCompleted(); } else { - if ((gSprites[spriteId].data1 % 4) == 0) + if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data1++; + gSprites[spriteId].data[1]++; } } @@ -527,14 +527,14 @@ static void sub_8064E50(void) static void sub_8064F40(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80) { sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]); } if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) { DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]); SetBankEnemyShadowSpriteCallback(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); @@ -1163,12 +1163,12 @@ static void LinkOpponentHandleLoadMonSprite(void) sub_806A068(species, GetBankIdentity(gActiveBank)); gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, - sub_80A5C6C(gActiveBank, 2), + GetBankPosition(gActiveBank, 2), GetBankSpriteDefault_Y(gActiveBank), sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]); @@ -1197,15 +1197,15 @@ static void sub_8066494(u8 bank, bool8 dontClearSubstituteBit) gBankSpriteIds[bank] = CreateSprite( &gUnknown_0202499C, - sub_80A5C6C(bank, 2), + GetBankPosition(bank, 2), GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); - gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; - gSprites[gUnknown_03005D7C[bank]].data2 = bank; + gSprites[gUnknown_03005D7C[bank]].data[1] = gBankSpriteIds[bank]; + gSprites[gUnknown_03005D7C[bank]].data[2] = bank; - gSprites[gBankSpriteIds[bank]].data0 = bank; - gSprites[gBankSpriteIds[bank]].data2 = species; + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = species; gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); @@ -1213,7 +1213,7 @@ static void sub_8066494(u8 bank, bool8 dontClearSubstituteBit) gSprites[gBankSpriteIds[bank]].invisible = TRUE; gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFE); + gSprites[gUnknown_03005D7C[bank]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); } static void LinkOpponentHandleReturnMonToBall(void) @@ -1334,7 +1334,7 @@ static void LinkOpponentHandleDrawTrainerPic(void) sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = 2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2; gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicId; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; @@ -1357,7 +1357,7 @@ static void LinkOpponentHandleTrainerSlide(void) gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 96; gSprites[gBankSpriteIds[gActiveBank]].pos1.x += 32; - gSprites[gBankSpriteIds[gActiveBank]].data0 = -2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicId; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; @@ -1369,9 +1369,9 @@ static void LinkOpponentHandleTrainerSlide(void) static void LinkOpponentHandleTrainerSlideBack(void) { oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 35; - gSprites[gBankSpriteIds[gActiveBank]].data2 = 280; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_8064470; @@ -1505,7 +1505,7 @@ static void LinkOpponentHandlePrintString(void) sub_817C95C(*stringId); } -static void LinkOpponentHandlePrintStringPlayerOnly(void) +static void LinkOpponentHandlePrintSelectionString(void) { LinkOpponentBufferExecCompleted(); } @@ -1670,7 +1670,7 @@ static void LinkOpponentHandleHitAnimation(void) else { gDoingBattleAnim = TRUE; - gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBank); gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect; } @@ -1681,7 +1681,7 @@ static void LinkOpponentHandleCmd42(void) LinkOpponentBufferExecCompleted(); } -static void LinkOpponentHandleEffectivenessSound(void) +static void LinkOpponentHandlePlaySE(void) { s8 pan; @@ -1731,9 +1731,9 @@ static void LinkOpponentHandleIntroTrainerBallThrow(void) oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 35; - gSprites[gBankSpriteIds[gActiveBank]].data2 = 280; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_80676FC); diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index e3bee98d9..9da468761 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -10,7 +10,7 @@ #include "link.h" #include "util.h" #include "main.h" -#include "songs.h" +#include "constants/songs.h" #include "sound.h" #include "window.h" #include "m4a.h" @@ -78,7 +78,7 @@ static void LinkPartnerHandleBallThrowAnim(void); static void LinkPartnerHandlePause(void); static void LinkPartnerHandleMoveAnimation(void); static void LinkPartnerHandlePrintString(void); -static void LinkPartnerHandlePrintStringPlayerOnly(void); +static void LinkPartnerHandlePrintSelectionString(void); static void LinkPartnerHandleChooseAction(void); static void LinkPartnerHandleUnknownYesNoBox(void); static void LinkPartnerHandleChooseMove(void); @@ -104,7 +104,7 @@ static void LinkPartnerHandleCmd39(void); static void LinkPartnerHandleCmd40(void); static void LinkPartnerHandleHitAnimation(void); static void LinkPartnerHandleCmd42(void); -static void LinkPartnerHandleEffectivenessSound(void); +static void LinkPartnerHandlePlaySE(void); static void LinkPartnerHandlePlayFanfareOrBGM(void); static void LinkPartnerHandleFaintingCry(void); static void LinkPartnerHandleIntroSlide(void); @@ -149,7 +149,7 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = LinkPartnerHandlePause, LinkPartnerHandleMoveAnimation, LinkPartnerHandlePrintString, - LinkPartnerHandlePrintStringPlayerOnly, + LinkPartnerHandlePrintSelectionString, LinkPartnerHandleChooseAction, LinkPartnerHandleUnknownYesNoBox, LinkPartnerHandleChooseMove, @@ -175,7 +175,7 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = LinkPartnerHandleCmd40, LinkPartnerHandleHitAnimation, LinkPartnerHandleCmd42, - LinkPartnerHandleEffectivenessSound, + LinkPartnerHandlePlaySE, LinkPartnerHandlePlayFanfareOrBGM, LinkPartnerHandleFaintingCry, LinkPartnerHandleIntroSlide, @@ -267,8 +267,8 @@ static void sub_814B004(void) static void sub_814B0E8(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive && gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy && ++gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 != 1) @@ -352,18 +352,18 @@ static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBankSpriteIds[gActiveBank]; - if (gSprites[spriteId].data1 == 32) + if (gSprites[spriteId].data[1] == 32) { - gSprites[spriteId].data1 = 0; + gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = 0; gDoingBattleAnim = FALSE; LinkPartnerBufferExecCompleted(); } else { - if ((gSprites[spriteId].data1 % 4) == 0) + if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data1++; + gSprites[spriteId].data[1]++; } } @@ -412,13 +412,13 @@ static void sub_814B5A8(void) static void sub_814B69C(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) { sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]); } if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) { DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]); gBattleBankFunc[gActiveBank] = sub_814B5A8; @@ -1049,11 +1049,11 @@ static void LinkPartnerHandleLoadMonSprite(void) sub_806A068(species, GetBankIdentity(gActiveBank)); gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, - sub_80A5C6C(gActiveBank, 2), + GetBankPosition(gActiveBank, 2), GetBankSpriteDefault_Y(gActiveBank), sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]); gBattleBankFunc[gActiveBank] = sub_814B290; @@ -1080,15 +1080,15 @@ static void sub_814CC98(u8 bank, bool8 dontClearSubstituteBit) gBankSpriteIds[bank] = CreateSprite( &gUnknown_0202499C, - sub_80A5C6C(bank, 2), + GetBankPosition(bank, 2), GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); - gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; - gSprites[gUnknown_03005D7C[bank]].data2 = bank; + gSprites[gUnknown_03005D7C[bank]].data[1] = gBankSpriteIds[bank]; + gSprites[gUnknown_03005D7C[bank]].data[2] = bank; - gSprites[gBankSpriteIds[bank]].data0 = bank; - gSprites[gBankSpriteIds[bank]].data2 = species; + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = species; gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); @@ -1096,7 +1096,7 @@ static void sub_814CC98(u8 bank, bool8 dontClearSubstituteBit) gSprites[gBankSpriteIds[bank]].invisible = TRUE; gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFF); + gSprites[gUnknown_03005D7C[bank]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void LinkPartnerHandleReturnMonToBall(void) @@ -1174,7 +1174,7 @@ static void LinkPartnerHandleDrawTrainerPic(void) gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = -2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy; @@ -1188,9 +1188,9 @@ static void LinkPartnerHandleTrainerSlide(void) static void LinkPartnerHandleTrainerSlideBack(void) { oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 35; - gSprites[gBankSpriteIds[gActiveBank]].data2 = -40; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_814AF54; @@ -1211,8 +1211,8 @@ static void LinkPartnerHandleFaintAnimation(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_PLAYER); - gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; - gSprites[gBankSpriteIds[gActiveBank]].data2 = 5; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 5; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8039C00; gBattleBankFunc[gActiveBank] = sub_814B340; } @@ -1327,7 +1327,7 @@ static void LinkPartnerHandlePrintString(void) sub_817C95C(*stringId); } -static void LinkPartnerHandlePrintStringPlayerOnly(void) +static void LinkPartnerHandlePrintSelectionString(void) { LinkPartnerBufferExecCompleted(); } @@ -1492,7 +1492,7 @@ static void LinkPartnerHandleHitAnimation(void) else { gDoingBattleAnim = TRUE; - gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBank); gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect; } @@ -1503,7 +1503,7 @@ static void LinkPartnerHandleCmd42(void) LinkPartnerBufferExecCompleted(); } -static void LinkPartnerHandleEffectivenessSound(void) +static void LinkPartnerHandlePlaySE(void) { s8 pan; @@ -1554,11 +1554,11 @@ static void LinkPartnerHandleIntroTrainerBallThrow(void) oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 50; - gSprites[gBankSpriteIds[gActiveBank]].data2 = -40; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; - gSprites[gBankSpriteIds[gActiveBank]].data5 = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_805CC00); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 0aac4cbe4..0862e72a7 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -11,10 +11,10 @@ #include "util.h" #include "main.h" #include "item.h" -#include "items.h" -#include "songs.h" +#include "constants/items.h" +#include "constants/songs.h" #include "sound.h" -#include "moves.h" +#include "constants/moves.h" #include "window.h" #include "m4a.h" #include "palette.h" @@ -23,7 +23,7 @@ #include "string_util.h" #include "bg.h" #include "reshow_battle_screen.h" -#include "rng.h" +#include "random.h" #include "pokeball.h" #include "data2.h" @@ -83,7 +83,7 @@ static void OpponentHandleBallThrow(void); static void OpponentHandlePause(void); static void OpponentHandleMoveAnimation(void); static void OpponentHandlePrintString(void); -static void OpponentHandlePrintStringPlayerOnly(void); +static void OpponentHandlePrintSelectionString(void); static void OpponentHandleChooseAction(void); static void OpponentHandleUnknownYesNoBox(void); static void OpponentHandleChooseMove(void); @@ -109,7 +109,7 @@ static void OpponentHandleCmd39(void); static void OpponentHandleCmd40(void); static void OpponentHandleHitAnimation(void); static void OpponentHandleCmd42(void); -static void OpponentHandleEffectivenessSound(void); +static void OpponentHandlePlaySE(void); static void OpponentHandlePlayFanfareOrBGM(void); static void OpponentHandleFaintingCry(void); static void OpponentHandleIntroSlide(void); @@ -155,7 +155,7 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = OpponentHandlePause, OpponentHandleMoveAnimation, OpponentHandlePrintString, - OpponentHandlePrintStringPlayerOnly, + OpponentHandlePrintSelectionString, OpponentHandleChooseAction, OpponentHandleUnknownYesNoBox, OpponentHandleChooseMove, @@ -181,7 +181,7 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = OpponentHandleCmd40, OpponentHandleHitAnimation, OpponentHandleCmd42, - OpponentHandleEffectivenessSound, + OpponentHandlePlaySE, OpponentHandlePlayFanfareOrBGM, OpponentHandleFaintingCry, OpponentHandleIntroSlide, @@ -318,11 +318,11 @@ static void sub_805F560(void) bool32 sp = FALSE; bool32 r10 = FALSE; - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1) sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]); - if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI) && IsDoubleBattle() && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1) + if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI) && IsDoubleBattle() && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1) sub_8172EF0(gActiveBank ^ BIT_MON, &gEnemyParty[gBattlePartyID[gActiveBank ^ BIT_MON]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80) { @@ -453,18 +453,18 @@ static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBankSpriteIds[gActiveBank]; - if (gSprites[spriteId].data1 == 32) + if (gSprites[spriteId].data[1] == 32) { - gSprites[spriteId].data1 = 0; + gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = 0; gDoingBattleAnim = FALSE; OpponentBufferExecCompleted(); } else { - if ((gSprites[spriteId].data1 % 4) == 0) + if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data1++; + gSprites[spriteId].data[1]++; } } @@ -509,11 +509,11 @@ static void sub_805FD00(void) static void sub_805FDF0(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]); if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) { DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]); SetBankEnemyShadowSpriteCallback(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); @@ -1151,13 +1151,13 @@ static void OpponentHandleLoadMonSprite(void) sub_806A068(species, GetBankIdentity(gActiveBank)); gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, - sub_80A5C6C(gActiveBank, 2), + GetBankPosition(gActiveBank, 2), GetBankSpriteDefault_Y(gActiveBank), sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank; - gSprites[gBankSpriteIds[gActiveBank]].data2 = species; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = species; gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]); @@ -1186,15 +1186,15 @@ static void sub_80613DC(u8 bank, bool8 dontClearSubstituteBit) sub_806A068(species, GetBankIdentity(bank)); gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, - sub_80A5C6C(bank, 2), + GetBankPosition(bank, 2), GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); - gSprites[gBankSpriteIds[bank]].data0 = bank; - gSprites[gBankSpriteIds[bank]].data2 = species; + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = species; - gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; - gSprites[gUnknown_03005D7C[bank]].data2 = bank; + gSprites[gUnknown_03005D7C[bank]].data[1] = gBankSpriteIds[bank]; + gSprites[gUnknown_03005D7C[bank]].data[2] = bank; gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; @@ -1203,7 +1203,7 @@ static void sub_80613DC(u8 bank, bool8 dontClearSubstituteBit) gSprites[gBankSpriteIds[bank]].invisible = TRUE; gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFE); + gSprites[gUnknown_03005D7C[bank]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); } static void OpponentHandleReturnMonToBall(void) @@ -1321,7 +1321,7 @@ static void OpponentHandleDrawTrainerPic(void) sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = 2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2; gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicId; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; @@ -1391,7 +1391,7 @@ static void OpponentHandleTrainerSlide(void) gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 96; gSprites[gBankSpriteIds[gActiveBank]].pos1.x += 32; - gSprites[gBankSpriteIds[gActiveBank]].data0 = -2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicId; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; @@ -1402,9 +1402,9 @@ static void OpponentHandleTrainerSlide(void) static void OpponentHandleTrainerSlideBack(void) { oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 35; - gSprites[gBankSpriteIds[gActiveBank]].data2 = 280; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_805F240; @@ -1537,7 +1537,7 @@ static void OpponentHandlePrintString(void) sub_81A57E4(gActiveBank, *stringId); } -static void OpponentHandlePrintStringPlayerOnly(void) +static void OpponentHandlePrintSelectionString(void) { OpponentBufferExecCompleted(); } @@ -1815,7 +1815,7 @@ static void OpponentHandleHitAnimation(void) else { gDoingBattleAnim = TRUE; - gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBank); gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect; } @@ -1826,7 +1826,7 @@ static void OpponentHandleCmd42(void) OpponentBufferExecCompleted(); } -static void OpponentHandleEffectivenessSound(void) +static void OpponentHandlePlaySE(void) { s8 pan; @@ -1876,9 +1876,9 @@ static void OpponentHandleIntroTrainerBallThrow(void) oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 35; - gSprites[gBankSpriteIds[gActiveBank]].data2 = 280; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_806280C); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 16c62c53b..e497dbfe2 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -10,10 +10,10 @@ #include "util.h" #include "main.h" #include "item.h" -#include "items.h" -#include "songs.h" +#include "constants/items.h" +#include "constants/songs.h" #include "sound.h" -#include "moves.h" +#include "constants/moves.h" #include "window.h" #include "m4a.h" #include "palette.h" @@ -22,7 +22,7 @@ #include "string_util.h" #include "bg.h" #include "reshow_battle_screen.h" -#include "rng.h" +#include "random.h" #include "pokeball.h" #include "data2.h" @@ -102,7 +102,7 @@ static void PlayerHandleBallThrowAnim(void); static void PlayerHandlePause(void); static void PlayerHandleMoveAnimation(void); static void PlayerHandlePrintString(void); -static void PlayerHandlePrintStringPlayerOnly(void); +static void PlayerHandlePrintSelectionString(void); static void PlayerHandleChooseAction(void); static void PlayerHandleUnknownYesNoBox(void); static void PlayerHandleChooseMove(void); @@ -128,7 +128,7 @@ static void PlayerHandleCmd39(void); static void PlayerHandleCmd40(void); static void PlayerHandleHitAnimation(void); static void PlayerHandleCmd42(void); -static void PlayerHandleEffectivenessSound(void); +static void PlayerHandlePlaySE(void); static void PlayerHandlePlayFanfareOrBGM(void); static void PlayerHandleFaintingCry(void); static void PlayerHandleIntroSlide(void); @@ -189,7 +189,7 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = PlayerHandlePause, PlayerHandleMoveAnimation, PlayerHandlePrintString, - PlayerHandlePrintStringPlayerOnly, + PlayerHandlePrintSelectionString, PlayerHandleChooseAction, PlayerHandleUnknownYesNoBox, PlayerHandleChooseMove, @@ -215,7 +215,7 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = PlayerHandleCmd40, PlayerHandleHitAnimation, PlayerHandleCmd42, - PlayerHandleEffectivenessSound, + PlayerHandlePlaySE, PlayerHandlePlayFanfareOrBGM, PlayerHandleFaintingCry, PlayerHandleIntroSlide, @@ -1023,12 +1023,12 @@ static void sub_8058B40(void) bool32 r9 = FALSE; bool32 r8 = FALSE; - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive) sub_8172EF0(gActiveBank ^ BIT_MON, &gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80) { @@ -1127,13 +1127,13 @@ static void sub_8058FC0(void) static void sub_805902C(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) { sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]); } if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) { DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]); UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL); @@ -1431,18 +1431,18 @@ static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBankSpriteIds[gActiveBank]; - if (gSprites[spriteId].data1 == 32) + if (gSprites[spriteId].data[1] == 32) { - gSprites[spriteId].data1 = 0; + gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = 0; gDoingBattleAnim = FALSE; PlayerBufferExecCompleted(); } else { - if ((gSprites[spriteId].data1 % 4) == 0) + if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data1++; + gSprites[spriteId].data[1]++; } } @@ -2237,15 +2237,15 @@ static void sub_805B258(u8 bank, bool8 dontClearSubstituteBit) gBankSpriteIds[bank] = CreateSprite( &gUnknown_0202499C, - sub_80A5C6C(bank, 2), + GetBankPosition(bank, 2), GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); - gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; - gSprites[gUnknown_03005D7C[bank]].data2 = bank; + gSprites[gUnknown_03005D7C[bank]].data[1] = gBankSpriteIds[bank]; + gSprites[gUnknown_03005D7C[bank]].data[2] = bank; - gSprites[gBankSpriteIds[bank]].data0 = bank; - gSprites[gBankSpriteIds[bank]].data2 = species; + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = species; gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); @@ -2253,7 +2253,7 @@ static void sub_805B258(u8 bank, bool8 dontClearSubstituteBit) gSprites[gBankSpriteIds[bank]].invisible = TRUE; gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFF); + gSprites[gUnknown_03005D7C[bank]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void PlayerHandleReturnMonToBall(void) @@ -2358,7 +2358,7 @@ static void PlayerHandleDrawTrainerPic(void) gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; gSprites[gBankSpriteIds[gActiveBank]].pos2.y = 48; - gSprites[gBankSpriteIds[gActiveBank]].data0 = -2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; gSprites[gBankSpriteIds[gActiveBank]].oam.affineMode = 0; gSprites[gBankSpriteIds[gActiveBank]].hFlip = 1; @@ -2372,7 +2372,7 @@ static void PlayerHandleDrawTrainerPic(void) gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = -2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; } @@ -2411,7 +2411,7 @@ static void PlayerHandleTrainerSlide(void) gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -96; - gSprites[gBankSpriteIds[gActiveBank]].data0 = 2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy2; @@ -2420,9 +2420,9 @@ static void PlayerHandleTrainerSlide(void) static void PlayerHandleTrainerSlideBack(void) { oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 50; - gSprites[gBankSpriteIds[gActiveBank]].data2 = -40; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); @@ -2444,8 +2444,8 @@ static void PlayerHandleFaintAnimation(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_PLAYER); - gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; - gSprites[gBankSpriteIds[gActiveBank]].data2 = 5; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 5; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8039C00; gBattleBankFunc[gActiveBank] = sub_80596A8; } @@ -2576,7 +2576,7 @@ static void PlayerHandlePrintString(void) sub_81A57E4(gActiveBank, *stringId); } -static void PlayerHandlePrintStringPlayerOnly(void) +static void PlayerHandlePrintSelectionString(void) { if (GetBankSide(gActiveBank) == SIDE_PLAYER) PlayerHandlePrintString(); @@ -2902,7 +2902,7 @@ static void PlayerHandleHitAnimation(void) else { gDoingBattleAnim = TRUE; - gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBank); gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect; } @@ -2913,7 +2913,7 @@ static void PlayerHandleCmd42(void) PlayerBufferExecCompleted(); } -static void PlayerHandleEffectivenessSound(void) +static void PlayerHandlePlaySE(void) { s8 pan; @@ -2963,11 +2963,11 @@ static void PlayerHandleIntroTrainerBallThrow(void) oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 50; - gSprites[gBankSpriteIds[gActiveBank]].data2 = -40; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; - gSprites[gBankSpriteIds[gActiveBank]].data5 = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_805CC00); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); @@ -2988,7 +2988,7 @@ static void PlayerHandleIntroTrainerBallThrow(void) void sub_805CC00(struct Sprite *sprite) { - u8 bank = sprite->data5; + u8 bank = sprite->data[5]; FreeSpriteOamMatrix(sprite); FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 0cd34442a..eb57297da 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -9,7 +9,7 @@ #include "link.h" #include "util.h" #include "main.h" -#include "songs.h" +#include "constants/songs.h" #include "sound.h" #include "window.h" #include "m4a.h" @@ -78,7 +78,7 @@ static void PlayerPartnerHandleBallThrowAnim(void); static void PlayerPartnerHandlePause(void); static void PlayerPartnerHandleMoveAnimation(void); static void PlayerPartnerHandlePrintString(void); -static void PlayerPartnerHandlePrintStringPlayerOnly(void); +static void PlayerPartnerHandlePrintSelectionString(void); static void PlayerPartnerHandleChooseAction(void); static void PlayerPartnerHandleUnknownYesNoBox(void); static void PlayerPartnerHandleChooseMove(void); @@ -104,7 +104,7 @@ static void PlayerPartnerHandleCmd39(void); static void PlayerPartnerHandleCmd40(void); static void PlayerPartnerHandleHitAnimation(void); static void PlayerPartnerHandleCmd42(void); -static void PlayerPartnerHandleEffectivenessSound(void); +static void PlayerPartnerHandlePlaySE(void); static void PlayerPartnerHandlePlayFanfareOrBGM(void); static void PlayerPartnerHandleFaintingCry(void); static void PlayerPartnerHandleIntroSlide(void); @@ -155,7 +155,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = PlayerPartnerHandlePause, PlayerPartnerHandleMoveAnimation, PlayerPartnerHandlePrintString, - PlayerPartnerHandlePrintStringPlayerOnly, + PlayerPartnerHandlePrintSelectionString, PlayerPartnerHandleChooseAction, PlayerPartnerHandleUnknownYesNoBox, PlayerPartnerHandleChooseMove, @@ -181,7 +181,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = PlayerPartnerHandleCmd40, PlayerPartnerHandleHitAnimation, PlayerPartnerHandleCmd42, - PlayerPartnerHandleEffectivenessSound, + PlayerPartnerHandlePlaySE, PlayerPartnerHandlePlayFanfareOrBGM, PlayerPartnerHandleFaintingCry, PlayerPartnerHandleIntroSlide, @@ -282,8 +282,8 @@ static void sub_81BAF48(void) static void sub_81BB02C(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive && gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy && ++gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 != 1) @@ -539,18 +539,18 @@ static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBankSpriteIds[gActiveBank]; - if (gSprites[spriteId].data1 == 32) + if (gSprites[spriteId].data[1] == 32) { - gSprites[spriteId].data1 = 0; + gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = 0; gDoingBattleAnim = FALSE; PlayerPartnerBufferExecCompleted(); } else { - if ((gSprites[spriteId].data1 % 4) == 0) + if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data1++; + gSprites[spriteId].data[1]++; } } @@ -599,13 +599,13 @@ static void sub_81BB9F4(void) static void sub_81BBAE8(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) { sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]); } if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) { DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]); gBattleBankFunc[gActiveBank] = sub_81BB9F4; @@ -1236,11 +1236,11 @@ static void PlayerPartnerHandleLoadMonSprite(void) sub_806A068(species, GetBankIdentity(gActiveBank)); gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, - sub_80A5C6C(gActiveBank, 2), + GetBankPosition(gActiveBank, 2), GetBankSpriteDefault_Y(gActiveBank), sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]); gBattleBankFunc[gActiveBank] = sub_81BB1D4; @@ -1267,15 +1267,15 @@ static void sub_81BD0E4(u8 bank, bool8 dontClearSubstituteBit) gBankSpriteIds[bank] = CreateSprite( &gUnknown_0202499C, - sub_80A5C6C(bank, 2), + GetBankPosition(bank, 2), GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); - gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; - gSprites[gUnknown_03005D7C[bank]].data2 = bank; + gSprites[gUnknown_03005D7C[bank]].data[1] = gBankSpriteIds[bank]; + gSprites[gUnknown_03005D7C[bank]].data[2] = bank; - gSprites[gBankSpriteIds[bank]].data0 = bank; - gSprites[gBankSpriteIds[bank]].data2 = species; + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = species; gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); @@ -1283,7 +1283,7 @@ static void sub_81BD0E4(u8 bank, bool8 dontClearSubstituteBit) gSprites[gBankSpriteIds[bank]].invisible = TRUE; gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFF); + gSprites[gUnknown_03005D7C[bank]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void PlayerPartnerHandleReturnMonToBall(void) @@ -1353,7 +1353,7 @@ static void PlayerPartnerHandleDrawTrainerPic(void) gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = -2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; } else // otherwise use front sprite @@ -1365,7 +1365,7 @@ static void PlayerPartnerHandleDrawTrainerPic(void) gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; gSprites[gBankSpriteIds[gActiveBank]].pos2.y = 48; - gSprites[gBankSpriteIds[gActiveBank]].data0 = -2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; gSprites[gBankSpriteIds[gActiveBank]].oam.affineMode = 0; gSprites[gBankSpriteIds[gActiveBank]].hFlip = 1; @@ -1382,9 +1382,9 @@ static void PlayerPartnerHandleTrainerSlide(void) static void PlayerPartnerHandleTrainerSlideBack(void) { oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 35; - gSprites[gBankSpriteIds[gActiveBank]].data2 = -40; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_81BAE98; @@ -1405,8 +1405,8 @@ static void PlayerPartnerHandleFaintAnimation(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_PLAYER); - gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; - gSprites[gBankSpriteIds[gActiveBank]].data2 = 5; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 5; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8039C00; gBattleBankFunc[gActiveBank] = sub_81BB78C; } @@ -1519,7 +1519,7 @@ static void PlayerPartnerHandlePrintString(void) gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter2; } -static void PlayerPartnerHandlePrintStringPlayerOnly(void) +static void PlayerPartnerHandlePrintSelectionString(void) { PlayerPartnerBufferExecCompleted(); } @@ -1745,7 +1745,7 @@ static void PlayerPartnerHandleHitAnimation(void) else { gDoingBattleAnim = TRUE; - gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBank); gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect; } @@ -1756,7 +1756,7 @@ static void PlayerPartnerHandleCmd42(void) PlayerPartnerBufferExecCompleted(); } -static void PlayerPartnerHandleEffectivenessSound(void) +static void PlayerPartnerHandlePlaySE(void) { s8 pan; @@ -1806,11 +1806,11 @@ static void PlayerPartnerHandleIntroTrainerBallThrow(void) oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 50; - gSprites[gBankSpriteIds[gActiveBank]].data2 = -40; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; - gSprites[gBankSpriteIds[gActiveBank]].data5 = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_805CC00); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index b55d644ac..8e2f31879 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -11,7 +11,7 @@ #include "link.h" #include "util.h" #include "main.h" -#include "songs.h" +#include "constants/songs.h" #include "sound.h" #include "window.h" #include "m4a.h" @@ -81,7 +81,7 @@ static void RecordedOpponentHandleBallThrowAnim(void); static void RecordedOpponentHandlePause(void); static void RecordedOpponentHandleMoveAnimation(void); static void RecordedOpponentHandlePrintString(void); -static void RecordedOpponentHandlePrintStringPlayerOnly(void); +static void RecordedOpponentHandlePrintSelectionString(void); static void RecordedOpponentHandleChooseAction(void); static void RecordedOpponentHandleUnknownYesNoBox(void); static void RecordedOpponentHandleChooseMove(void); @@ -107,7 +107,7 @@ static void RecordedOpponentHandleCmd39(void); static void RecordedOpponentHandleCmd40(void); static void RecordedOpponentHandleHitAnimation(void); static void RecordedOpponentHandleCmd42(void); -static void RecordedOpponentHandleEffectivenessSound(void); +static void RecordedOpponentHandlePlaySE(void); static void RecordedOpponentHandlePlayFanfareOrBGM(void); static void RecordedOpponentHandleFaintingCry(void); static void RecordedOpponentHandleIntroSlide(void); @@ -153,7 +153,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void RecordedOpponentHandlePause, RecordedOpponentHandleMoveAnimation, RecordedOpponentHandlePrintString, - RecordedOpponentHandlePrintStringPlayerOnly, + RecordedOpponentHandlePrintSelectionString, RecordedOpponentHandleChooseAction, RecordedOpponentHandleUnknownYesNoBox, RecordedOpponentHandleChooseMove, @@ -179,7 +179,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void RecordedOpponentHandleCmd40, RecordedOpponentHandleHitAnimation, RecordedOpponentHandleCmd42, - RecordedOpponentHandleEffectivenessSound, + RecordedOpponentHandlePlaySE, RecordedOpponentHandlePlayFanfareOrBGM, RecordedOpponentHandleFaintingCry, RecordedOpponentHandleIntroSlide, @@ -298,12 +298,12 @@ static void sub_818686C(void) bool32 r9 = FALSE; bool32 r8 = FALSE; - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive) sub_8172EF0(gActiveBank ^ BIT_MON, &gEnemyParty[gBattlePartyID[gActiveBank ^ BIT_MON]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80) { @@ -449,18 +449,18 @@ static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBankSpriteIds[gActiveBank]; - if (gSprites[spriteId].data1 == 32) + if (gSprites[spriteId].data[1] == 32) { - gSprites[spriteId].data1 = 0; + gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = 0; gDoingBattleAnim = FALSE; RecordedOpponentBufferExecCompleted(); } else { - if ((gSprites[spriteId].data1 % 4) == 0) + if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data1++; + gSprites[spriteId].data[1]++; } } @@ -512,14 +512,14 @@ static void sub_8186F94(void) static void sub_8187084(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80) { sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]); } if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) { DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]); SetBankEnemyShadowSpriteCallback(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); @@ -1148,14 +1148,14 @@ static void RecordedOpponentHandleLoadMonSprite(void) sub_806A068(species, GetBankIdentity(gActiveBank)); gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, - sub_80A5C6C(gActiveBank, 2), + GetBankPosition(gActiveBank, 2), GetBankSpriteDefault_Y(gActiveBank), sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]); @@ -1183,15 +1183,15 @@ static void sub_81885D8(u8 bank, bool8 dontClearSubstituteBit) sub_806A068(species, GetBankIdentity(bank)); gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, - sub_80A5C6C(bank, 2), + GetBankPosition(bank, 2), GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); - gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; - gSprites[gUnknown_03005D7C[bank]].data2 = bank; + gSprites[gUnknown_03005D7C[bank]].data[1] = gBankSpriteIds[bank]; + gSprites[gUnknown_03005D7C[bank]].data[2] = bank; - gSprites[gBankSpriteIds[bank]].data0 = bank; - gSprites[gBankSpriteIds[bank]].data2 = species; + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = species; gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); @@ -1199,7 +1199,7 @@ static void sub_81885D8(u8 bank, bool8 dontClearSubstituteBit) gSprites[gBankSpriteIds[bank]].invisible = TRUE; gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFE); + gSprites[gUnknown_03005D7C[bank]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); } static void RecordedOpponentHandleReturnMonToBall(void) @@ -1285,7 +1285,7 @@ static void RecordedOpponentHandleDrawTrainerPic(void) sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = 2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2; gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicId; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; @@ -1301,9 +1301,9 @@ static void RecordedOpponentHandleTrainerSlide(void) static void RecordedOpponentHandleTrainerSlideBack(void) { oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 35; - gSprites[gBankSpriteIds[gActiveBank]].data2 = 280; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_81865C8; @@ -1435,7 +1435,7 @@ static void RecordedOpponentHandlePrintString(void) gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter; } -static void RecordedOpponentHandlePrintStringPlayerOnly(void) +static void RecordedOpponentHandlePrintSelectionString(void) { RecordedOpponentBufferExecCompleted(); } @@ -1614,7 +1614,7 @@ static void RecordedOpponentHandleHitAnimation(void) else { gDoingBattleAnim = TRUE; - gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBank); gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect; } @@ -1625,7 +1625,7 @@ static void RecordedOpponentHandleCmd42(void) RecordedOpponentBufferExecCompleted(); } -static void RecordedOpponentHandleEffectivenessSound(void) +static void RecordedOpponentHandlePlaySE(void) { s8 pan; @@ -1675,9 +1675,9 @@ static void RecordedOpponentHandleIntroTrainerBallThrow(void) oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 35; - gSprites[gBankSpriteIds[gActiveBank]].data2 = 280; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_818962C); diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 78e7497a5..f558fde87 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -10,7 +10,7 @@ #include "link.h" #include "util.h" #include "main.h" -#include "songs.h" +#include "constants/songs.h" #include "sound.h" #include "window.h" #include "m4a.h" @@ -81,7 +81,7 @@ static void RecordedPlayerHandleBallThrowAnim(void); static void RecordedPlayerHandlePause(void); static void RecordedPlayerHandleMoveAnimation(void); static void RecordedPlayerHandlePrintString(void); -static void RecordedPlayerHandlePrintStringPlayerOnly(void); +static void RecordedPlayerHandlePrintSelectionString(void); static void RecordedPlayerHandleChooseAction(void); static void RecordedPlayerHandleUnknownYesNoBox(void); static void RecordedPlayerHandleChooseMove(void); @@ -107,7 +107,7 @@ static void RecordedPlayerHandleCmd39(void); static void RecordedPlayerHandleCmd40(void); static void RecordedPlayerHandleHitAnimation(void); static void RecordedPlayerHandleCmd42(void); -static void RecordedPlayerHandleEffectivenessSound(void); +static void RecordedPlayerHandlePlaySE(void); static void RecordedPlayerHandlePlayFanfareOrBGM(void); static void RecordedPlayerHandleFaintingCry(void); static void RecordedPlayerHandleIntroSlide(void); @@ -152,7 +152,7 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) RecordedPlayerHandlePause, RecordedPlayerHandleMoveAnimation, RecordedPlayerHandlePrintString, - RecordedPlayerHandlePrintStringPlayerOnly, + RecordedPlayerHandlePrintSelectionString, RecordedPlayerHandleChooseAction, RecordedPlayerHandleUnknownYesNoBox, RecordedPlayerHandleChooseMove, @@ -178,7 +178,7 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) RecordedPlayerHandleCmd40, RecordedPlayerHandleHitAnimation, RecordedPlayerHandleCmd42, - RecordedPlayerHandleEffectivenessSound, + RecordedPlayerHandlePlaySE, RecordedPlayerHandlePlayFanfareOrBGM, RecordedPlayerHandleFaintingCry, RecordedPlayerHandleIntroSlide, @@ -314,19 +314,19 @@ static void sub_8189D40(void) if (GetBankIdentity(gActiveBank) == IDENTITY_PLAYER_MON1) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) { sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]); } if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive) { sub_8172EF0(gActiveBank ^ BIT_MON, &gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]]); } } - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80) { @@ -437,18 +437,18 @@ static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBankSpriteIds[gActiveBank]; - if (gSprites[spriteId].data1 == 32) + if (gSprites[spriteId].data[1] == 32) { - gSprites[spriteId].data1 = 0; + gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = 0; gDoingBattleAnim = FALSE; RecordedPlayerBufferExecCompleted(); } else { - if ((gSprites[spriteId].data1 % 4) == 0) + if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data1++; + gSprites[spriteId].data[1]++; } } @@ -497,13 +497,13 @@ static void sub_818A37C(void) static void sub_818A470(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) { sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]); } if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) { DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]); gBattleBankFunc[gActiveBank] = sub_818A37C; @@ -1134,11 +1134,11 @@ static void RecordedPlayerHandleLoadMonSprite(void) sub_806A068(species, GetBankIdentity(gActiveBank)); gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, - sub_80A5C6C(gActiveBank, 2), + GetBankPosition(gActiveBank, 2), GetBankSpriteDefault_Y(gActiveBank), sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]); gBattleBankFunc[gActiveBank] = sub_818A064; @@ -1165,15 +1165,15 @@ static void sub_818BA6C(u8 bank, bool8 dontClearSubstituteBit) gBankSpriteIds[bank] = CreateSprite( &gUnknown_0202499C, - sub_80A5C6C(bank, 2), + GetBankPosition(bank, 2), GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); - gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; - gSprites[gUnknown_03005D7C[bank]].data2 = bank; + gSprites[gUnknown_03005D7C[bank]].data[1] = gBankSpriteIds[bank]; + gSprites[gUnknown_03005D7C[bank]].data[2] = bank; - gSprites[gBankSpriteIds[bank]].data0 = bank; - gSprites[gBankSpriteIds[bank]].data2 = species; + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = species; gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); @@ -1181,7 +1181,7 @@ static void sub_818BA6C(u8 bank, bool8 dontClearSubstituteBit) gSprites[gBankSpriteIds[bank]].invisible = TRUE; gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFF); + gSprites[gUnknown_03005D7C[bank]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void RecordedPlayerHandleReturnMonToBall(void) @@ -1272,7 +1272,7 @@ static void RecordedPlayerHandleDrawTrainerPic(void) gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; gSprites[gBankSpriteIds[gActiveBank]].pos2.y = 48; - gSprites[gBankSpriteIds[gActiveBank]].data0 = -2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; gSprites[gBankSpriteIds[gActiveBank]].oam.affineMode = 0; gSprites[gBankSpriteIds[gActiveBank]].hFlip = 1; @@ -1285,7 +1285,7 @@ static void RecordedPlayerHandleDrawTrainerPic(void) gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = -2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; } @@ -1300,9 +1300,9 @@ static void RecordedPlayerHandleTrainerSlide(void) static void RecordedPlayerHandleTrainerSlideBack(void) { oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 35; - gSprites[gBankSpriteIds[gActiveBank]].data2 = -40; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_81899F0; @@ -1323,8 +1323,8 @@ static void RecordedPlayerHandleFaintAnimation(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlaySE12WithPanning(SE_POKE_DEAD, -64); - gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; - gSprites[gBankSpriteIds[gActiveBank]].data2 = 5; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 5; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8039C00; gBattleBankFunc[gActiveBank] = sub_818A114; } @@ -1437,7 +1437,7 @@ static void RecordedPlayerHandlePrintString(void) gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter; } -static void RecordedPlayerHandlePrintStringPlayerOnly(void) +static void RecordedPlayerHandlePrintSelectionString(void) { RecordedPlayerBufferExecCompleted(); } @@ -1633,7 +1633,7 @@ static void RecordedPlayerHandleHitAnimation(void) else { gDoingBattleAnim = TRUE; - gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBank); gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect; } @@ -1644,7 +1644,7 @@ static void RecordedPlayerHandleCmd42(void) RecordedPlayerBufferExecCompleted(); } -static void RecordedPlayerHandleEffectivenessSound(void) +static void RecordedPlayerHandlePlaySE(void) { s8 pan; @@ -1695,11 +1695,11 @@ static void RecordedPlayerHandleIntroTrainerBallThrow(void) oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 50; - gSprites[gBankSpriteIds[gActiveBank]].data2 = -40; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; - gSprites[gBankSpriteIds[gActiveBank]].data5 = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_805CC00); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index a4f35bed1..db4670523 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -8,7 +8,7 @@ #include "link.h" #include "util.h" #include "main.h" -#include "songs.h" +#include "constants/songs.h" #include "sound.h" #include "window.h" #include "m4a.h" @@ -66,7 +66,7 @@ static void SafariHandleBallThrowAnim(void); static void SafariHandlePause(void); static void SafariHandleMoveAnimation(void); static void SafariHandlePrintString(void); -static void SafariHandlePrintStringPlayerOnly(void); +static void SafariHandlePrintSelectionString(void); static void SafariHandleChooseAction(void); static void SafariHandleUnknownYesNoBox(void); static void SafariHandleChooseMove(void); @@ -92,7 +92,7 @@ static void SafariHandleCmd39(void); static void SafariHandleCmd40(void); static void SafariHandleHitAnimation(void); static void SafariHandleCmd42(void); -static void SafariHandleEffectivenessSound(void); +static void SafariHandlePlaySE(void); static void SafariHandlePlayFanfareOrBGM(void); static void SafariHandleFaintingCry(void); static void SafariHandleIntroSlide(void); @@ -130,7 +130,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) = SafariHandlePause, SafariHandleMoveAnimation, SafariHandlePrintString, - SafariHandlePrintStringPlayerOnly, + SafariHandlePrintSelectionString, SafariHandleChooseAction, SafariHandleUnknownYesNoBox, SafariHandleChooseMove, @@ -156,7 +156,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) = SafariHandleCmd40, SafariHandleHitAnimation, SafariHandleCmd42, - SafariHandleEffectivenessSound, + SafariHandlePlaySE, SafariHandlePlayFanfareOrBGM, SafariHandleFaintingCry, SafariHandleIntroSlide, @@ -384,7 +384,7 @@ static void SafariHandleDrawTrainerPic(void) 30); gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = -2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy; } @@ -449,7 +449,7 @@ static void SafariHandlePrintString(void) gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter; } -static void SafariHandlePrintStringPlayerOnly(void) +static void SafariHandlePrintSelectionString(void) { if (GetBankSide(gActiveBank) == SIDE_PLAYER) SafariHandlePrintString(); @@ -607,7 +607,7 @@ static void SafariHandleCmd42(void) SafariBufferExecCompleted(); } -static void SafariHandleEffectivenessSound(void) +static void SafariHandlePlaySE(void) { s8 pan; diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 4dac1d264..446027944 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -10,10 +10,10 @@ #include "util.h" #include "main.h" #include "item.h" -#include "items.h" -#include "songs.h" +#include "constants/items.h" +#include "constants/songs.h" #include "sound.h" -#include "moves.h" +#include "constants/moves.h" #include "window.h" #include "m4a.h" #include "palette.h" @@ -22,7 +22,7 @@ #include "string_util.h" #include "bg.h" #include "reshow_battle_screen.h" -#include "rng.h" +#include "random.h" #include "pokeball.h" #include "data2.h" #include "party_menu.h" @@ -86,7 +86,7 @@ static void WallyHandleBallThrowAnim(void); static void WallyHandlePause(void); static void WallyHandleMoveAnimation(void); static void WallyHandlePrintString(void); -static void WallyHandlePrintStringPlayerOnly(void); +static void WallyHandlePrintSelectionString(void); static void WallyHandleChooseAction(void); static void WallyHandleUnknownYesNoBox(void); static void WallyHandleChooseMove(void); @@ -112,7 +112,7 @@ static void WallyHandleCmd39(void); static void WallyHandleCmd40(void); static void WallyHandleHitAnimation(void); static void WallyHandleCmd42(void); -static void WallyHandleEffectivenessSound(void); +static void WallyHandlePlaySE(void); static void WallyHandlePlayFanfareOrBGM(void); static void WallyHandleFaintingCry(void); static void WallyHandleIntroSlide(void); @@ -155,7 +155,7 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(void) = WallyHandlePause, WallyHandleMoveAnimation, WallyHandlePrintString, - WallyHandlePrintStringPlayerOnly, + WallyHandlePrintSelectionString, WallyHandleChooseAction, WallyHandleUnknownYesNoBox, WallyHandleChooseMove, @@ -181,7 +181,7 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(void) = WallyHandleCmd40, WallyHandleHitAnimation, WallyHandleCmd42, - WallyHandleEffectivenessSound, + WallyHandlePlaySE, WallyHandlePlayFanfareOrBGM, WallyHandleFaintingCry, WallyHandleIntroSlide, @@ -321,13 +321,13 @@ static void CompleteOnChosenItem(void) static void sub_816864C(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive) sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive) sub_8172EF0(gActiveBank ^ BIT_MON, &gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].ballAnimActive && gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) { @@ -396,18 +396,18 @@ static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBankSpriteIds[gActiveBank]; - if (gSprites[spriteId].data1 == 32) + if (gSprites[spriteId].data[1] == 32) { - gSprites[spriteId].data1 = 0; + gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = 0; gDoingBattleAnim = FALSE; WallyBufferExecCompleted(); } else { - if ((gSprites[spriteId].data1 % 4) == 0) + if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data1++; + gSprites[spriteId].data[1]++; } } @@ -1073,7 +1073,7 @@ static void WallyHandleDrawTrainerPic(void) 30); gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; - gSprites[gBankSpriteIds[gActiveBank]].data0 = -2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy; } @@ -1088,7 +1088,7 @@ static void WallyHandleTrainerSlide(void) 30); gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -96; - gSprites[gBankSpriteIds[gActiveBank]].data0 = 2; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC; gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy2; } @@ -1211,7 +1211,7 @@ static void WallyHandlePrintString(void) gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter; } -static void WallyHandlePrintStringPlayerOnly(void) +static void WallyHandlePrintSelectionString(void) { if (GetBankSide(gActiveBank) == SIDE_PLAYER) WallyHandlePrintString(); @@ -1408,7 +1408,7 @@ static void WallyHandleHitAnimation(void) else { gDoingBattleAnim = TRUE; - gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBank); gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect; } @@ -1419,7 +1419,7 @@ static void WallyHandleCmd42(void) WallyBufferExecCompleted(); } -static void WallyHandleEffectivenessSound(void) +static void WallyHandlePlaySE(void) { PlaySE(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); WallyBufferExecCompleted(); @@ -1462,11 +1462,11 @@ static void WallyHandleIntroTrainerBallThrow(void) oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); - gSprites[gBankSpriteIds[gActiveBank]].data0 = 50; - gSprites[gBankSpriteIds[gActiveBank]].data2 = -40; - gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC; - gSprites[gBankSpriteIds[gActiveBank]].data5 = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank; StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_805CC00); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); @@ -1495,21 +1495,21 @@ static void sub_816AA80(u8 bank) gUnknown_03005D7C[bank] = CreateInvisibleSpriteWithCallback(sub_805D714); sub_806A068(species, GetBankIdentity(bank)); gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, - sub_80A5C6C(bank, 2), + GetBankPosition(bank, 2), GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); - gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; - gSprites[gUnknown_03005D7C[bank]].data2 = bank; + gSprites[gUnknown_03005D7C[bank]].data[1] = gBankSpriteIds[bank]; + gSprites[gUnknown_03005D7C[bank]].data[2] = bank; - gSprites[gBankSpriteIds[bank]].data0 = bank; - gSprites[gBankSpriteIds[bank]].data2 = species; + 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_03005D7C[bank]].data0 = sub_80753E8(0, 0xFF); + gSprites[gUnknown_03005D7C[bank]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void sub_816AC04(u8 taskId) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 858540a9f..c6d47e71e 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -6,10 +6,10 @@ #include "battle_ai_script_commands.h" #include "battle_anim.h" #include "pokemon.h" -#include "species.h" +#include "constants/species.h" #include "recorded_battle.h" #include "util.h" -#include "abilities.h" +#include "constants/abilities.h" #include "battle_message.h" extern u32 gBattleTypeFlags; @@ -38,7 +38,7 @@ extern u8 gEffectBank; extern u16 gBattleWeather; extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT]; extern u16 gCurrentMove; -extern u16 gLastUsedMove; +extern u16 gChosenMove; extern u16 gLastUsedItem; extern u8 gBattleOutcome; extern u8 gLastUsedAbility; @@ -1120,7 +1120,7 @@ void EmitPrintString(u8 bufferId, u16 stringID) stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]); stringInfo->currentMove = gCurrentMove; - stringInfo->lastMove = gLastUsedMove; + stringInfo->originallyUsedMove = gChosenMove; stringInfo->lastItem = gLastUsedItem; stringInfo->lastAbility = gLastUsedAbility; stringInfo->scrActive = gBattleScripting.bank; @@ -1140,10 +1140,10 @@ void EmitPrintString(u8 bufferId, u16 stringID) PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4); } -void EmitPrintStringPlayerOnly(u8 bufferId, u16 stringID) +void EmitPrintSelectionString(u8 bufferId, u16 stringID) { s32 i; - struct StringInfoBattle* stringInfo; + struct StringInfoBattle *stringInfo; gBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRINGPLAYERONLY; gBattleBuffersTransferData[1] = CONTROLLER_PRINTSTRINGPLAYERONLY; @@ -1152,7 +1152,7 @@ void EmitPrintStringPlayerOnly(u8 bufferId, u16 stringID) stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]); stringInfo->currentMove = gCurrentMove; - stringInfo->lastMove = gLastUsedMove; + stringInfo->originallyUsedMove = gChosenMove; stringInfo->lastItem = gLastUsedItem; stringInfo->lastAbility = gLastUsedAbility; stringInfo->scrActive = gBattleScripting.bank; @@ -1427,7 +1427,7 @@ void EmitCmd42(u8 bufferId) PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); } -void EmitEffectivenessSound(u8 bufferId, u16 songId) +void EmitPlaySE(u8 bufferId, u16 songId) { gBattleBuffersTransferData[0] = CONTROLLER_EFFECTIVENESSSOUND; gBattleBuffersTransferData[1] = songId; diff --git a/src/battle_dome_cards.c b/src/battle_dome_cards.c index 9385417b4..d549856f2 100644 --- a/src/battle_dome_cards.c +++ b/src/battle_dome_cards.c @@ -4,7 +4,7 @@ #include "sprite.h" #include "window.h" #include "malloc.h" -#include "species.h" +#include "constants/species.h" #include "palette.h" #include "decompress.h" #include "battle_dome_cards.h" diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 99a82f3ca..22be086f0 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -6,21 +6,21 @@ #include "battle_interface.h" #include "main.h" #include "malloc.h" -#include "rng.h" +#include "random.h" #include "util.h" #include "pokemon.h" -#include "moves.h" +#include "constants/moves.h" #include "task.h" #include "sprite.h" #include "sound.h" #include "m4a.h" -#include "species.h" +#include "constants/species.h" #include "decompress.h" #include "data2.h" #include "palette.h" #include "blend_palette.h" #include "contest.h" -#include "songs.h" +#include "constants/songs.h" extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200]; extern u8 gActiveBank; @@ -332,7 +332,7 @@ static u16 BattlePalaceGetTargetRetValue(void) void sub_805D714(struct Sprite *sprite) { - u8 spriteId = sprite->data1; + u8 spriteId = sprite->data[1]; if (!gSprites[spriteId].affineAnimEnded) return; @@ -367,7 +367,7 @@ void sub_805D7AC(struct Sprite *sprite) { if (!(gUnknown_020243FC & 1)) { - sprite->pos2.x += sprite->data0; + sprite->pos2.x += sprite->data[0]; if (sprite->pos2.x == 0) { if (sprite->pos2.y != 0) @@ -1134,7 +1134,7 @@ void sub_805EB9C(u8 affineMode) } } -#define tBank data0 +#define tBank data[0] void LoadAndCreateEnemyShadowSprites(void) { @@ -1143,14 +1143,14 @@ void LoadAndCreateEnemyShadowSprites(void) LoadCompressedObjectPic(&gSpriteSheet_EnemyShadow); bank = GetBankByIdentity(IDENTITY_OPPONENT_MON1); - gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, sub_80A5C6C(bank, 0), sub_80A5C6C(bank, 1) + 29, 0xC8); - gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].data0 = bank; + gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, GetBankPosition(bank, 0), GetBankPosition(bank, 1) + 29, 0xC8); + gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].data[0] = bank; if (IsDoubleBattle()) { bank = GetBankByIdentity(IDENTITY_OPPONENT_MON2); - gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, sub_80A5C6C(bank, 0), sub_80A5C6C(bank, 1) + 29, 0xC8); - gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].data0 = bank; + gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, GetBankPosition(bank, 0), GetBankPosition(bank, 1) + 29, 0xC8); + gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].data[0] = bank; } } diff --git a/src/battle_interface.c b/src/battle_interface.c index 240c64862..95f1a1111 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -8,13 +8,13 @@ #include "string_util.h" #include "text.h" #include "sound.h" -#include "songs.h" +#include "constants/songs.h" #include "decompress.h" #include "task.h" #include "util.h" #include "gpu_regs.h" #include "battle_message.h" -#include "species.h" +#include "constants/species.h" #include "pokedex.h" #include "palette.h" #include "international_string_util.h" @@ -927,7 +927,7 @@ u8 CreateBankHealthboxSprites(u8 bank) data6 = 2; } gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; - gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1; + gSprites[healthboxSpriteId_2].data[5] = healthboxSpriteId_1; gSprites[healthboxSpriteId_2].callback = sub_8072924; } else @@ -939,7 +939,7 @@ u8 CreateBankHealthboxSprites(u8 bank) gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; - gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1; + gSprites[healthboxSpriteId_2].data[5] = healthboxSpriteId_1; gSprites[healthboxSpriteId_2].oam.tileNum += 32; gSprites[healthboxSpriteId_2].callback = sub_8072924; @@ -952,7 +952,7 @@ u8 CreateBankHealthboxSprites(u8 bank) gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; - gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1; + gSprites[healthboxSpriteId_2].data[5] = healthboxSpriteId_1; gSprites[healthboxSpriteId_2].oam.tileNum += 32; gSprites[healthboxSpriteId_2].callback = sub_8072924; @@ -968,14 +968,14 @@ u8 CreateBankHealthboxSprites(u8 bank) CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void*)(OBJ_VRAM0 + unkSpritePtr->oam.tileNum * 32), 64); - gSprites[healthboxSpriteId_1].data5 = unkSpriteId; - gSprites[healthboxSpriteId_1].data6 = bank; + gSprites[healthboxSpriteId_1].data[5] = unkSpriteId; + gSprites[healthboxSpriteId_1].data[6] = bank; gSprites[healthboxSpriteId_1].invisible = 1; gSprites[healthboxSpriteId_2].invisible = 1; - unkSpritePtr->data5 = healthboxSpriteId_1; - unkSpritePtr->data6 = data6; + unkSpritePtr->data[5] = healthboxSpriteId_1; + unkSpritePtr->data[6] = data6; unkSpritePtr->invisible = 1; return healthboxSpriteId_1; @@ -994,7 +994,7 @@ u8 CreateSafariPlayerHealthboxSprites(void) gSprites[healthboxSpriteId_2].oam.tileNum += 64; gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; - gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1; + gSprites[healthboxSpriteId_2].data[5] = healthboxSpriteId_1; gSprites[healthboxSpriteId_2].callback = sub_8072924; @@ -1008,9 +1008,9 @@ static const u8 *GetHealthboxElementGfxPtr(u8 elementId) static void sub_80728B4(struct Sprite *sprite) { - u8 var = sprite->data5; + u8 var = sprite->data[5]; - switch (sprite->data6) + switch (sprite->data[6]) { case 0: sprite->pos1.x = gSprites[var].pos1.x + 16; @@ -1033,7 +1033,7 @@ static void sub_80728B4(struct Sprite *sprite) static void sub_8072924(struct Sprite *sprite) { - u8 otherSpriteId = sprite->data5; + u8 otherSpriteId = sprite->data[5]; sprite->pos1.x = gSprites[otherSpriteId].pos1.x + 64; sprite->pos1.y = gSprites[otherSpriteId].pos1.y; @@ -1054,14 +1054,14 @@ void SetBattleBarStruct(u8 bank, u8 healthboxSpriteId, s32 maxVal, s32 currVal, void SetHealthboxSpriteInvisible(u8 healthboxSpriteId) { gSprites[healthboxSpriteId].invisible = 1; - gSprites[gSprites[healthboxSpriteId].data5].invisible = 1; + gSprites[gSprites[healthboxSpriteId].data[5]].invisible = 1; gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = 1; } void SetHealthboxSpriteVisible(u8 healthboxSpriteId) { gSprites[healthboxSpriteId].invisible = 0; - gSprites[gSprites[healthboxSpriteId].data5].invisible = 0; + gSprites[gSprites[healthboxSpriteId].data[5]].invisible = 0; gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = 0; } @@ -1074,7 +1074,7 @@ static void UpdateSpritePos(u8 spriteId, s16 x, s16 y) void DestoryHealthboxSprite(u8 healthboxSpriteId) { DestroySprite(&gSprites[gSprites[healthboxSpriteId].oam.affineParam]); - DestroySprite(&gSprites[gSprites[healthboxSpriteId].data5]); + DestroySprite(&gSprites[gSprites[healthboxSpriteId].data[5]]); DestroySprite(&gSprites[healthboxSpriteId]); } @@ -1091,7 +1091,7 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority) { u8 healthboxSpriteId_1 = gHealthBoxesIds[i]; u8 healthboxSpriteId_2 = gSprites[gHealthBoxesIds[i]].oam.affineParam; - u8 healthboxSpriteId_3 = gSprites[gHealthBoxesIds[i]].data5; + u8 healthboxSpriteId_3 = gSprites[gHealthBoxesIds[i]].data[5]; gSprites[healthboxSpriteId_1].oam.priority = priority; gSprites[healthboxSpriteId_2].oam.priority = priority; @@ -1156,7 +1156,7 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, xPos, 3, 2, &windowId); spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; - if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER) + if (GetBankSide(gSprites[healthboxSpriteId].data[6]) == SIDE_PLAYER) { objVram = (void*)(OBJ_VRAM0); if (!IsDoubleBattle()) @@ -1180,7 +1180,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) u8 text[32]; void *objVram; - if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER && !IsDoubleBattle()) + if (GetBankSide(gSprites[healthboxSpriteId].data[6]) == SIDE_PLAYER && !IsDoubleBattle()) { spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; if (maxOrCurrent != HP_CURRENT) // singles, max @@ -1213,7 +1213,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) u8 bank; memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4)); - bank = gSprites[healthboxSpriteId].data6; + bank = gSprites[healthboxSpriteId].data[6]; if (IsDoubleBattle() == TRUE || GetBankSide(bank) == SIDE_OPPONENT) { UpdateHpTextInHealthboxInDoubles(healthboxSpriteId, value, maxOrCurrent); @@ -1223,7 +1223,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) u32 var; u8 i; - if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER) + if (GetBankSide(gSprites[healthboxSpriteId].data[6]) == SIDE_PLAYER) { if (maxOrCurrent == HP_CURRENT) var = 29; @@ -1258,11 +1258,11 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 u8 text[32]; void *objVram; - if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER) + if (GetBankSide(gSprites[healthboxSpriteId].data[6]) == SIDE_PLAYER) { - if (gBattleSpritesDataPtr->bankData[gSprites[healthboxSpriteId].data6].hpNumbersNoBars) // don't print text if only bars are visible + if (gBattleSpritesDataPtr->bankData[gSprites[healthboxSpriteId].data[6]].hpNumbersNoBars) // don't print text if only bars are visible { - spriteTileNum = gSprites[gSprites[healthboxSpriteId].data5].oam.tileNum * 32; + spriteTileNum = gSprites[gSprites[healthboxSpriteId].data[5]].oam.tileNum * 32; objVram = (void*)(OBJ_VRAM0) + spriteTileNum; if (maxOrCurrent != HP_CURRENT) // doubles, max hp @@ -1292,7 +1292,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 u8 bank; memcpy(text, sUnknown_0832C3D8, sizeof(sUnknown_0832C3D8)); - bank = gSprites[healthboxSpriteId].data6; + bank = gSprites[healthboxSpriteId].data[6]; if (gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars) // don't print text if only bars are visible { @@ -1304,7 +1304,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 if (maxOrCurrent == HP_CURRENT) var = 0; - r7 = gSprites[healthboxSpriteId].data5; + r7 = gSprites[healthboxSpriteId].data[5]; txtPtr = ConvertIntToDecimalStringN(text + 6, value, STR_CONV_MODE_RIGHT_ALIGN, 3); if (!maxOrCurrent) StringCopy(txtPtr, gText_Slash); @@ -1354,7 +1354,7 @@ static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon) u8 i, var, nature, healthboxSpriteId_2; memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4)); - barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBankIdentity(gSprites[healthboxSpriteId].data6) * 384)]; + barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBankIdentity(gSprites[healthboxSpriteId].data[6]) * 384)]; var = 5; nature = GetNature(mon); StringCopy(text + 6, gNatureNamePointers[nature]); @@ -1385,7 +1385,7 @@ static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon) barFontGfx += 0x20; } - healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5; + healthboxSpriteId_2 = gSprites[healthboxSpriteId].data[5]; ConvertIntToDecimalStringN(text + 6, gBattleStruct->field_7C, STR_CONV_MODE_RIGHT_ALIGN, 2); ConvertIntToDecimalStringN(text + 9, gBattleStruct->field_7B, STR_CONV_MODE_RIGHT_ALIGN, 2); text[5] = CHAR_SPACE; @@ -1434,7 +1434,7 @@ void SwapHpBarsWithHpText(void) if (noBars == TRUE) // bars to text { - spriteId = gSprites[gHealthBoxesIds[i]].data5; + spriteId = gSprites[gHealthBoxesIds[i]].data[5]; CpuFill32(0, (void*)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_HP), HP_CURRENT); @@ -1457,7 +1457,7 @@ void SwapHpBarsWithHpText(void) } else { - spriteId = gSprites[gHealthBoxesIds[i]].data5; + spriteId = gSprites[gHealthBoxesIds[i]].data[5]; CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_HP), HP_CURRENT); @@ -1472,7 +1472,7 @@ void SwapHpBarsWithHpText(void) UpdateHealthboxAttribute(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]], HEALTHBOX_NICK); } } - gSprites[gHealthBoxesIds[i]].data7 ^= 1; + gSprites[gHealthBoxesIds[i]].data[7] ^= 1; } } } @@ -1524,7 +1524,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar barSpriteId = CreateSprite(&sStatusSummaryBarSpriteTemplates[isOpponent], bar_X, bar_Y, 10); SetSubspriteTables(&gSprites[barSpriteId], sStatusSummaryBar_SubspriteTable); gSprites[barSpriteId].pos2.x = bar_pos2_X; - gSprites[barSpriteId].data0 = bar_data0; + gSprites[barSpriteId].data[0] = bar_data0; if (isOpponent) { @@ -1549,22 +1549,22 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar gSprites[ballIconSpritesIds[i]].pos2.y = 0; } - gSprites[ballIconSpritesIds[i]].data0 = barSpriteId; + gSprites[ballIconSpritesIds[i]].data[0] = barSpriteId; if (!isOpponent) { gSprites[ballIconSpritesIds[i]].pos1.x += 10 * i + 24; - gSprites[ballIconSpritesIds[i]].data1 = i * 7 + 10; + gSprites[ballIconSpritesIds[i]].data[1] = i * 7 + 10; gSprites[ballIconSpritesIds[i]].pos2.x = 120; } else { gSprites[ballIconSpritesIds[i]].pos1.x -= 10 * (5 - i) + 24; - gSprites[ballIconSpritesIds[i]].data1 = (6 - i) * 7 + 10; + gSprites[ballIconSpritesIds[i]].data[1] = (6 - i) * 7 + 10; gSprites[ballIconSpritesIds[i]].pos2.x = -120; } - gSprites[ballIconSpritesIds[i]].data2 = isOpponent; + gSprites[ballIconSpritesIds[i]].data[2] = isOpponent; } if (GetBankSide(bank) == SIDE_PLAYER) @@ -1576,7 +1576,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg { gSprites[ballIconSpritesIds[i]].oam.tileNum += 1; - gSprites[ballIconSpritesIds[i]].data7 = 1; + gSprites[ballIconSpritesIds[i]].data[7] = 1; } else if (partyInfo[i].hp == 0) // fainted mon { @@ -1595,7 +1595,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar if (partyInfo[j].hp == 0xFFFF) // empty slot or an egg { gSprites[ballIconSpritesIds[var]].oam.tileNum += 1; - gSprites[ballIconSpritesIds[var]].data7 = 1; + gSprites[ballIconSpritesIds[var]].data[7] = 1; var--; continue; } @@ -1624,7 +1624,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg { gSprites[ballIconSpritesIds[var]].oam.tileNum += 1; - gSprites[ballIconSpritesIds[var]].data7 = 1; + gSprites[ballIconSpritesIds[var]].data[7] = 1; } else if (partyInfo[i].hp == 0) // fainted mon { @@ -1644,7 +1644,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar if (partyInfo[j].hp == 0xFFFF) // empty slot or an egg { gSprites[ballIconSpritesIds[i]].oam.tileNum += 1; - gSprites[ballIconSpritesIds[i]].data7 = 1; + gSprites[ballIconSpritesIds[i]].data[7] = 1; i++; continue; } @@ -1714,21 +1714,21 @@ void sub_8073C30(u8 taskId) { if (GetBankSide(bank) != SIDE_PLAYER) { - gSprites[sp[5 - i]].data1 = 7 * i; - gSprites[sp[5 - i]].data3 = 0; - gSprites[sp[5 - i]].data4 = 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_8074158; } else { - gSprites[sp[i]].data1 = 7 * i; - gSprites[sp[i]].data3 = 0; - gSprites[sp[i]].data4 = 0; + gSprites[sp[i]].data[1] = 7 * i; + gSprites[sp[i]].data[3] = 0; + gSprites[sp[i]].data[4] = 0; gSprites[sp[i]].callback = sub_8074158; } } - gSprites[r10].data0 /= 2; - gSprites[r10].data1 = 0; + gSprites[r10].data[0] /= 2; + gSprites[r10].data[1] = 0; gSprites[r10].callback = sub_8074090; SetSubspriteTables(&gSprites[r10], sUnknown_0832C2CC); gTasks[taskId].func = sub_8073E08; @@ -1831,17 +1831,17 @@ static void sub_8073F98(u8 taskId) static void SpriteCB_StatusSummaryBar(struct Sprite *sprite) { if (sprite->pos2.x != 0) - sprite->pos2.x += sprite->data0; + sprite->pos2.x += sprite->data[0]; } static void sub_8074090(struct Sprite *sprite) { - sprite->data1 += 32; - if (sprite->data0 > 0) - sprite->pos2.x += sprite->data1 >> 4; + sprite->data[1] += 32; + if (sprite->data[0] > 0) + sprite->pos2.x += sprite->data[1] >> 4; else - sprite->pos2.x -= sprite->data1 >> 4; - sprite->data1 &= 0xF; + sprite->pos2.x -= sprite->data[1] >> 4; + sprite->data[1] &= 0xF; } static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite) @@ -1850,16 +1850,16 @@ static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite) u16 var2; s8 pan; - if (sprite->data1 > 0) + if (sprite->data[1] > 0) { - sprite->data1--; + sprite->data[1]--; return; } - var1 = sprite->data2; - var2 = sprite->data3; + var1 = sprite->data[2]; + var2 = sprite->data[3]; var2 += 56; - sprite->data3 = var2 & 0xFFF0; + sprite->data[3] = var2 & 0xFFF0; if (var1 != 0) { @@ -1880,7 +1880,7 @@ static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite) if (var1 != 0) pan = PAN_SIDE_PLAYER; - if (sprite->data7 != 0) + if (sprite->data[7] != 0) PlaySE2WithPanning(SE_TB_KARA, pan); else PlaySE1WithPanning(SE_TB_KON, pan); @@ -1894,15 +1894,15 @@ static void sub_8074158(struct Sprite *sprite) u8 var1; u16 var2; - if (sprite->data1 > 0) + if (sprite->data[1] > 0) { - sprite->data1--; + sprite->data[1]--; return; } - var1 = sprite->data2; - var2 = sprite->data3; + var1 = sprite->data[2]; + var2 = sprite->data[3]; var2 += 56; - sprite->data3 = var2 & 0xFFF0; + sprite->data[3] = var2 & 0xFFF0; if (var1 != 0) sprite->pos2.x += var2 >> 4; else @@ -1917,7 +1917,7 @@ static void sub_8074158(struct Sprite *sprite) static void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite *sprite) { - u8 barSpriteId = sprite->data0; + u8 barSpriteId = sprite->data[0]; sprite->pos2.x = gSprites[barSpriteId].pos2.x; sprite->pos2.y = gSprites[barSpriteId].pos2.y; @@ -1964,7 +1964,7 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; - if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER) + if (GetBankSide(gSprites[healthboxSpriteId].data[6]) == SIDE_PLAYER) { sub_8075198((void*)(0x6010040 + spriteTileNum), windowTileData, 6); ptr = (void*)(OBJ_VRAM0); @@ -1991,13 +1991,13 @@ static void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) return; - bank = gSprites[healthboxSpriteId].data6; + bank = gSprites[healthboxSpriteId].data[6]; if (GetBankSide(bank) == SIDE_PLAYER) return; if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT)) return; - healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5; + healthboxSpriteId_2 = gSprites[healthboxSpriteId].data[5]; if (noStatus) CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_70), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 8) * 32), 32); @@ -2014,8 +2014,8 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) s16 tileNumAdder; u8 statusPalId; - bank = gSprites[healthboxSpriteId].data6; - healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5; + bank = gSprites[healthboxSpriteId].data[6]; + healthboxSpriteId_2 = gSprites[healthboxSpriteId].data[5]; if (GetBankSide(bank) == SIDE_PLAYER) { status = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_STATUS); @@ -2178,12 +2178,12 @@ static void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId) void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId) { s32 maxHp, currHp; - u8 bank = gSprites[healthboxSpriteId].data6; + u8 bank = gSprites[healthboxSpriteId].data[6]; if (elementId == HEALTHBOX_ALL && !IsDoubleBattle()) GetBankSide(bank); // pointless function call - if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER) + if (GetBankSide(gSprites[healthboxSpriteId].data[6]) == SIDE_PLAYER) { u8 isDoubles; @@ -2308,7 +2308,7 @@ static void sub_8074B9C(u8 bank, u8 whichBar) } for (i = 0; i < 6; i++) { - u8 healthboxSpriteId_2 = gSprites[gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId].data5; + u8 healthboxSpriteId_2 = gSprites[gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId].data[5]; if (i < 2) CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 2 + i) * 32), 32); diff --git a/src/battle_message.c b/src/battle_message.c index 9c37cf646..cab4bdf42 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -2,16 +2,17 @@ #include "battle.h" #include "battle_message.h" #include "battle_string_ids.h" -#include "moves.h" +#include "constants/moves.h" #include "text.h" #include "string_util.h" -#include "items.h" +#include "constants/items.h" #include "event_data.h" #include "link.h" #include "item.h" #include "window.h" #include "palette.h" #include "battle_controllers.h" +#include "battle_setup.h" extern u16 gLastUsedItem; extern u8 gLastUsedAbility; @@ -54,12 +55,10 @@ extern void sub_81D5554(u8 *txtPtr, u16 trainerId); // pokenav extern void GetEreaderTrainerName(u8 *txtPtr); extern void sub_81A36D0(u8 arg0, u16 trainerId); // battle_frontier_2 extern void sub_81D572C(u8 arg0, u16 trainerId); // pokenav -extern const u8* GetTrainer1LoseText(void); // battle_setup -extern const u8* GetTrainer2LoseText(void); // battle_setup extern void GetFrontierTrainerName(u8 *dst, u16 trainerId); extern s32 GetStringCenterAlignXOffsetWithLetterSpacing(u8 fontId, const u8 *str, s32 totalWidth, s16 letterSpacing); extern u8 GetTextSpeedInRecordedBattle(void); -extern u8 sav2_get_text_speed(void); +extern u8 GetPlayerTextSpeed(void); // this file's functions static void sub_814F8F8(u8 *textPtr); @@ -932,58 +931,237 @@ const u16 gSandStormHailDmgStringIds[] = STRINGID_PKMNBUFFETEDBYSANDSTORM, STRINGID_PKMNPELTEDBYHAIL }; -// todo once battlescripts are dumped -const u16 gTooLazyToSplitThemStringIds[] = +const u16 gSandStormHailEndStringIds[] = { - STRINGID_SANDSTORMSUBSIDED, STRINGID_HAILSTOPPED, STRINGID_RAINCONTINUES, STRINGID_DOWNPOURCONTINUES, - STRINGID_RAINSTOPPED, STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF, - STRINGID_BUTITFAILED, STRINGID_BUTITFAILED, STRINGID_PKMNRAISEDDEF, - STRINGID_PKMNRAISEDDEFALITTLE, STRINGID_PKMNRAISEDSPDEF, STRINGID_PKMNRAISEDSPDEFALITTLE, - STRINGID_PKMNCOVEREDBYVEIL, STRINGID_PKMNSEEDED, STRINGID_PKMNEVADEDATTACK, + STRINGID_SANDSTORMSUBSIDED, STRINGID_HAILSTOPPED +}; + +const u16 gRainContinuesStringIds[] = +{ + STRINGID_RAINCONTINUES, STRINGID_DOWNPOURCONTINUES, STRINGID_RAINSTOPPED +}; + +const u16 gProtectLikeUsedStringIds[] = +{ + STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF, STRINGID_BUTITFAILED +}; + +const u16 gReflectLightScreenSafeguardStringIds[] = +{ + STRINGID_BUTITFAILED, STRINGID_PKMNRAISEDDEF, STRINGID_PKMNRAISEDDEFALITTLE, + STRINGID_PKMNRAISEDSPDEF, STRINGID_PKMNRAISEDSPDEFALITTLE, STRINGID_PKMNCOVEREDBYVEIL +}; + +const u16 gLeechSeedStringIds[] = +{ + STRINGID_PKMNSEEDED, STRINGID_PKMNEVADEDATTACK, STRINGID_ITDOESNTAFFECT, STRINGID_PKMNSAPPEDBYLEECHSEED, STRINGID_ITSUCKEDLIQUIDOOZE, - STRINGID_PKMNWENTTOSLEEP, STRINGID_PKMNSLEPTHEALTHY, STRINGID_PKMNMAKINGUPROAR, - STRINGID_PKMNCALMEDDOWN, STRINGID_PKMNSTOCKPILED, STRINGID_PKMNCANTSTOCKPILE, - STRINGID_PKMNWOKEUP, STRINGID_PKMNWOKEUPINUPROAR, STRINGID_FAILEDTOSWALLOW, - STRINGID_PKMNHPFULL, STRINGID_PKMNCANTSLEEPINUPROAR2, STRINGID_UPROARKEPTPKMNAWAKE, - STRINGID_PKMNSTAYEDAWAKEUSING, STRINGID_PKMNSSTATCHANGED, STRINGID_PKMNSSTATCHANGED2, - STRINGID_STATSWONTINCREASE, STRINGID_EMPTYSTRING3, STRINGID_USINGXTHEYOFZN, - STRINGID_PKMNUSEDXTOGETPUMPED, STRINGID_PKMNSSTATCHANGED3, STRINGID_PKMNSSTATCHANGED4, - STRINGID_STATSWONTDECREASE, STRINGID_EMPTYSTRING3, STRINGID_PKMNWHIPPEDWHIRLWIND, - STRINGID_PKMNTOOKSUNLIGHT, STRINGID_PKMNLOWEREDHEAD, STRINGID_PKMNISGLOWING, - STRINGID_PKMNFLEWHIGH, STRINGID_PKMNDUGHOLE, STRINGID_PKMNHIDUNDERWATER, - STRINGID_PKMNSPRANGUP, STRINGID_PKMNSQUEEZEDBYBIND, STRINGID_PKMNWRAPPEDBY, - STRINGID_PKMNTRAPPEDINVORTEX, STRINGID_PKMNCLAMPED, STRINGID_PKMNTRAPPEDINVORTEX, - STRINGID_PKMNTRAPPEDBYSANDTOMB, STRINGID_PKMNSHROUDEDINMIST, STRINGID_BUTITFAILED, - STRINGID_PKMNGETTINGPUMPED, STRINGID_BUTITFAILED, STRINGID_PKMNTRANSFORMEDINTO, - STRINGID_BUTITFAILED, STRINGID_PKMNMADESUBSTITUTE, STRINGID_TOOWEAKFORSUBSTITUTE, - STRINGID_PKMNWASPOISONED, STRINGID_PKMNPOISONEDBY, STRINGID_PKMNWASPARALYZED, - STRINGID_PKMNWASPARALYZEDBY, STRINGID_PKMNFELLASLEEP, STRINGID_PKMNMADESLEEP, - STRINGID_PKMNWASBURNED, STRINGID_PKMNBURNEDBY, STRINGID_PKMNWASFROZEN, - STRINGID_PKMNFROZENBY, STRINGID_PKMNWASDEFROSTED2, STRINGID_PKMNWASDEFROSTEDBY, - STRINGID_ATTACKMISSED, STRINGID_PKMNUNAFFECTED, STRINGID_PKMNFELLINLOVE, - STRINGID_PKMNSXINFATUATEDY, STRINGID_PKMNENERGYDRAINED, STRINGID_ITSUCKEDLIQUIDOOZE, - STRINGID_ELECTRICITYWEAKENED, STRINGID_FIREWEAKENED, STRINGID_BELLCHIMED, - STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, - STRINGID_SOOTHINGAROMA, STRINGID_PKMNFORESAWATTACK, STRINGID_PKMNCHOSEXASDESTINY, - STRINGID_PKMNBROKEFREE, STRINGID_ITAPPEAREDCAUGHT, STRINGID_AARGHALMOSTHADIT, - STRINGID_SHOOTSOCLOSE, STRINGID_ITISRAINING, STRINGID_ITISRAINING, +}; + +const u16 gRestUsedStringIds[] = +{ + STRINGID_PKMNWENTTOSLEEP, STRINGID_PKMNSLEPTHEALTHY +}; + +const u16 gUproarOverTurnStringIds[] = +{ + STRINGID_PKMNMAKINGUPROAR, STRINGID_PKMNCALMEDDOWN +}; + +const u16 gStockpileUsedStringIds[] = +{ + STRINGID_PKMNSTOCKPILED, STRINGID_PKMNCANTSTOCKPILE, +}; + +const u16 gWokeUpStringIds[] = +{ + STRINGID_PKMNWOKEUP, STRINGID_PKMNWOKEUPINUPROAR +}; + +const u16 gSwallowFailStringIds[] = +{ + STRINGID_FAILEDTOSWALLOW, STRINGID_PKMNHPFULL +}; + +const u16 gUproarAwakeStringIds[] = +{ + STRINGID_PKMNCANTSLEEPINUPROAR2, STRINGID_UPROARKEPTPKMNAWAKE, STRINGID_PKMNSTAYEDAWAKEUSING +}; + +const u16 gStatUpStringIds[] = +{ + STRINGID_PKMNSSTATCHANGED, STRINGID_PKMNSSTATCHANGED2, STRINGID_STATSWONTINCREASE, + STRINGID_EMPTYSTRING3, STRINGID_USINGXTHEYOFZN, STRINGID_PKMNUSEDXTOGETPUMPED +}; + +const u16 gStatDownStringIds[] = +{ + STRINGID_PKMNSSTATCHANGED3, STRINGID_PKMNSSTATCHANGED4, STRINGID_STATSWONTDECREASE, STRINGID_EMPTYSTRING3 +}; + +const u16 gFirstTurnOfTwoStringIds[] = +{ + STRINGID_PKMNWHIPPEDWHIRLWIND, STRINGID_PKMNTOOKSUNLIGHT, STRINGID_PKMNLOWEREDHEAD, STRINGID_PKMNISGLOWING, + STRINGID_PKMNFLEWHIGH, STRINGID_PKMNDUGHOLE, STRINGID_PKMNHIDUNDERWATER, STRINGID_PKMNSPRANGUP +}; + +const u16 gWrappedStringIds[] = +{ + STRINGID_PKMNSQUEEZEDBYBIND, STRINGID_PKMNWRAPPEDBY, STRINGID_PKMNTRAPPEDINVORTEX, + STRINGID_PKMNCLAMPED, STRINGID_PKMNTRAPPEDINVORTEX, STRINGID_PKMNTRAPPEDBYSANDTOMB +}; + +const u16 gMistUsedStringIds[] = +{ + STRINGID_PKMNSHROUDEDINMIST, STRINGID_BUTITFAILED +}; + +const u16 gFocusEnergyUsedStringIds[] = +{ + STRINGID_PKMNGETTINGPUMPED, STRINGID_BUTITFAILED +}; + +const u16 gTransformUsedStringIds[] = +{ + STRINGID_PKMNTRANSFORMEDINTO, STRINGID_BUTITFAILED +}; + +const u16 gSubsituteUsedStringIds[] = +{ + STRINGID_PKMNMADESUBSTITUTE, STRINGID_TOOWEAKFORSUBSTITUTE +}; + +const u16 gGotPoisonedStringIds[] = +{ + STRINGID_PKMNWASPOISONED, STRINGID_PKMNPOISONEDBY +}; + +const u16 gGotParalyzedStringIds[] = +{ + STRINGID_PKMNWASPARALYZED, STRINGID_PKMNWASPARALYZEDBY +}; + +const u16 gFellAsleepStringIds[] = +{ + STRINGID_PKMNFELLASLEEP, STRINGID_PKMNMADESLEEP, +}; + +const u16 gGotBurnedStringIds[] = +{ + STRINGID_PKMNWASBURNED, STRINGID_PKMNBURNEDBY +}; + +const u16 gGotFrozenStringIds[] = +{ + STRINGID_PKMNWASFROZEN, STRINGID_PKMNFROZENBY +}; + +const u16 gGotDefrostedStringIds[] = +{ + STRINGID_PKMNWASDEFROSTED2, STRINGID_PKMNWASDEFROSTEDBY +}; + +const u16 gKOFailedStringIds[] = +{ + STRINGID_ATTACKMISSED, STRINGID_PKMNUNAFFECTED +}; + +const u16 gAttractUsedStringIds[] = +{ + STRINGID_PKMNFELLINLOVE, STRINGID_PKMNSXINFATUATEDY +}; + +const u16 gLeechSeedDrainStringIds[] = +{ + STRINGID_PKMNENERGYDRAINED, STRINGID_ITSUCKEDLIQUIDOOZE +}; + +const u16 gSportsUsedStringIds[] = +{ + STRINGID_ELECTRICITYWEAKENED, STRINGID_FIREWEAKENED +}; + +const u16 gPartyStatusHealStringIds[] = +{ + STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, + // interesting how there are four instances of the same string + STRINGID_SOOTHINGAROMA +}; + +const u16 gFutureMoveUsedStringIds[] = +{ + STRINGID_PKMNFORESAWATTACK, STRINGID_PKMNCHOSEXASDESTINY +}; + +const u16 gBallEscapeStringIds[] = +{ + STRINGID_PKMNBROKEFREE, STRINGID_ITAPPEAREDCAUGHT, STRINGID_AARGHALMOSTHADIT, STRINGID_SHOOTSOCLOSE +}; + +const u16 gWeatherContinuesStringIds[] = +{ STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING, - STRINGID_SANDSTORMISRAGING, STRINGID_ITISRAINING, STRINGID_ITISRAINING, - STRINGID_ITISRAINING, STRINGID_SUNLIGHTSTRONG, STRINGID_ITISRAINING, - STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_PKMNLOAFING, - STRINGID_PKMNWONTOBEY, STRINGID_PKMNTURNEDAWAY, STRINGID_PKMNPRETENDNOTNOTICE, - STRINGID_PKMNINCAPABLEOFPOWER, STRINGID_CREPTCLOSER, STRINGID_CANTGETCLOSER, - STRINGID_PKMNCURIOUSABOUTX, STRINGID_PKMNENTHRALLEDBYX, STRINGID_PKMNIGNOREDX, + STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_SANDSTORMISRAGING, + STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING, + STRINGID_SUNLIGHTSTRONG, STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING +}; + +const u16 gInobedientStringIds[] = +{ + STRINGID_PKMNLOAFING, STRINGID_PKMNWONTOBEY, STRINGID_PKMNTURNEDAWAY, + STRINGID_PKMNPRETENDNOTNOTICE, STRINGID_PKMNINCAPABLEOFPOWER +}; + +const u16 gSafariGetNearStringIds[] = +{ + STRINGID_CREPTCLOSER, STRINGID_CANTGETCLOSER +}; + +const u16 gSafariPokeblockResultStringIds[] = +{ + STRINGID_PKMNCURIOUSABOUTX, STRINGID_PKMNENTHRALLEDBYX, STRINGID_PKMNIGNOREDX +}; + +const u16 gTrainerItemCuredStatusStringIds[] = +{ STRINGID_PKMNSITEMSNAPPEDOUT, STRINGID_PKMNSITEMCUREDPARALYSIS, STRINGID_PKMNSITEMDEFROSTEDIT, - STRINGID_PKMNSITEMHEALEDBURN, STRINGID_PKMNSITEMCUREDPOISON, STRINGID_PKMNSITEMWOKEIT, - STRINGID_PKMNSITEMCUREDPROBLEM, STRINGID_PKMNSITEMNORMALIZEDSTATUS, STRINGID_PKMNSXPREVENTSBURNS, - STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_PKMNPREVENTSPARALYSISWITH, - STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_PKMNPREVENTSPOISONINGWITH, - STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_PKMNOBTAINEDX, - STRINGID_PKMNOBTAINEDX2, STRINGID_PKMNOBTAINEDXYOBTAINEDZ, STRINGID_PKMNRAISEDFIREPOWERWITH, - STRINGID_PKMNSXMADEYINEFFECTIVE, STRINGID_PKMNTRANSFERREDSOMEONESPC, STRINGID_PKMNTRANSFERREDLANETTESPC, - STRINGID_PKMNBOXSOMEONESPCFULL, STRINGID_PKMNBOXLANETTESPCFULL, + STRINGID_PKMNSITEMHEALEDBURN, STRINGID_PKMNSITEMCUREDPOISON, STRINGID_PKMNSITEMWOKEIT +}; + +const u16 gBerryEffectStringIds[] = +{ + STRINGID_PKMNSITEMCUREDPROBLEM, STRINGID_PKMNSITEMNORMALIZEDSTATUS +}; + +const u16 gBRNPreventionStringIds[] = +{ + STRINGID_PKMNSXPREVENTSBURNS, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY +}; + +const u16 gPRLZPreventionStringIds[] = +{ + STRINGID_PKMNPREVENTSPARALYSISWITH, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY +}; + +const u16 gPSNPreventionStringIds[] = +{ + STRINGID_PKMNPREVENTSPOISONINGWITH, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY +}; + +const u16 gItemSwapStringIds[] = +{ + STRINGID_PKMNOBTAINEDX, STRINGID_PKMNOBTAINEDX2, STRINGID_PKMNOBTAINEDXYOBTAINEDZ +}; + +const u16 gFlashFireStringIds[] = +{ + STRINGID_PKMNRAISEDFIREPOWERWITH, STRINGID_PKMNSXMADEYINEFFECTIVE +}; + +const u16 gCaughtMonStringIds[] = +{ + STRINGID_PKMNTRANSFERREDSOMEONESPC, STRINGID_PKMNTRANSFERREDLANETTESPC, STRINGID_PKMNBOXSOMEONESPCFULL, STRINGID_PKMNBOXLANETTESPCFULL, }; const u16 gTrappingMoves[] = @@ -1102,9 +1280,10 @@ const u8 gText_PkmnGettingIntoPosition[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is const u8 gText_PkmnBeganGrowlingDeeply[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} began growling deeply!"); const u8 gText_PkmnEagerForMore[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is eager for more!"); -const u16 gUnknown_085CCF0A[] = +const u16 gStringIds_85CCF0A[] = { - 0x016E, 0x016F, 0x0170, 0x0171 + STRINGID_GLINTAPPEARSINEYE, STRINGID_PKMNGETTINGINTOPOSITION, + STRINGID_PKMNBEGANGROWLINGDEEPLY, STRINGID_PKMNEAGERFORMORE }; const u8 gText_RefIfNothingIsDecided[] = _("REFEREE: If nothing is decided in\n3 turns, we will go to judging!"); @@ -1452,9 +1631,9 @@ void BufferStringBattle(u16 stringID) stringPtr = gText_AttackerUsedX; break; case STRINGID_BATTLEEND: // battle end - if (gBattleTextBuff1[0] & BATTLE_OUTCOME_BIT_x80) + if (gBattleTextBuff1[0] & OUTCOME_LINK_BATTLE_RUN) { - gBattleTextBuff1[0] &= ~(BATTLE_OUTCOME_BIT_x80); + gBattleTextBuff1[0] &= ~(OUTCOME_LINK_BATTLE_RUN); if (GetBankSide(gActiveBank) == SIDE_OPPONENT && gBattleTextBuff1[0] != BATTLE_DREW) gBattleTextBuff1[0] ^= (BATTLE_LOST | BATTLE_WON); @@ -1736,11 +1915,11 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst) else toCpy = gMoveNames[gStringInfo->currentMove]; break; - case B_TXT_LAST_MOVE: // last used move name - if (gStringInfo->lastMove > LAST_MOVE_INDEX) + case B_TXT_LAST_MOVE: // originally used move name + if (gStringInfo->originallyUsedMove > LAST_MOVE_INDEX) toCpy = gText_UnknownMoveTypes[gBattleStruct->stringMoveType]; else - toCpy = gMoveNames[gStringInfo->lastMove]; + toCpy = gMoveNames[gStringInfo->originallyUsedMove]; break; case B_TXT_LAST_ITEM: // last used item if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) @@ -1888,7 +2067,7 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst) } else { - toCpy = GetTrainer1LoseText(); + toCpy = GetTrainerALoseText(); } break; case B_TXT_TRAINER1_WIN_TEXT: // trainerA win text @@ -1985,7 +2164,7 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst) } else { - toCpy = GetTrainer2LoseText(); + toCpy = GetTrainerBLoseText(); } break; case B_TXT_TRAINER2_WIN_TEXT: @@ -2118,7 +2297,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) StringGetEnd10(dst); srcID += 3; break; - case B_BUFF_NEGATIVE_FLAVOUR: // flavour table + case B_BUFF_NEGATIVE_FLAVOR: // flavor table StringAppend(dst, gPokeblockWasTooXStringTable[src[srcID + 1]]); srcID += 2; break; @@ -2266,7 +2445,7 @@ void BattleHandleAddTextPrinter(const u8 *text, u8 arg1) else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) speed = sRecordedBattleTextSpeeds[GetTextSpeedInRecordedBattle()]; else - speed = sav2_get_text_speed(); + speed = GetPlayerTextSpeed(); gTextFlags.flag_0 = 1; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6409ff56e..656f9f43a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1,21 +1,23 @@ #include "global.h" #include "battle.h" -#include "battle_move_effects.h" +#include "constants/battle_move_effects.h" #include "battle_message.h" #include "battle_ai_script_commands.h" -#include "moves.h" -#include "abilities.h" +#include "battle_scripts.h" +#include "constants/moves.h" +#include "constants/abilities.h" #include "item.h" -#include "items.h" -#include "hold_effects.h" +#include "constants/items.h" +#include "constants/hold_effects.h" #include "util.h" #include "pokemon.h" #include "calculate_base_damage.h" -#include "rng.h" +#include "random.h" #include "battle_controllers.h" #include "battle_interface.h" -#include "species.h" -#include "songs.h" +#include "constants/species.h" +#include "constants/songs.h" +#include "constants/trainers.h" #include "text.h" #include "sound.h" #include "pokedex.h" @@ -73,10 +75,10 @@ extern u8 gCurrentActionFuncId; extern u32 gHitMarker; extern u8 gBattleMoveFlags; extern u8 gBattleCommunication[]; -extern u16 gUnknown_02024250[4]; -extern u16 gUnknown_02024258[4]; -extern u16 gUnknown_02024260[4]; -extern u8 gUnknown_02024270[4]; +extern u16 gLastLandedMoves[4]; +extern u16 gLastHitByType[4]; +extern u16 gLastResultingMoves[4]; +extern u8 gLastHitBy[4]; extern u8 gStringBank; extern u16 gDynamicBasePower; extern u16 gLastUsedItem; @@ -98,9 +100,9 @@ extern u8 gCurrentTurnActionNumber; extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200]; extern u16 gLockedMoves[BATTLE_BANKS_COUNT]; extern u16 gPartnerTrainerId; -extern u16 gLastUsedMove; -extern u16 gUnknownMovesUsedByBanks[BATTLE_BANKS_COUNT]; -extern u16 gLastUsedMovesByBanks[BATTLE_BANKS_COUNT]; +extern u16 gChosenMove; +extern u16 gLastPrintedMoves[BATTLE_BANKS_COUNT]; +extern u16 gLastMoves[BATTLE_BANKS_COUNT]; extern u16 gTrainerBattleOpponent_A; extern u16 gTrainerBattleOpponent_B; extern u8 gUnknown_020241E9; @@ -146,88 +148,6 @@ extern u8 sub_813B21C(void); extern u16 get_unknown_box_id(void); extern void sub_80356D0(void); -// BattleScripts -extern const u8 BattleScript_MoveEnd[]; -extern const u8 BattleScript_NoPPForMove[]; -extern const u8 BattleScript_MagicCoatBounce[]; -extern const u8 BattleScript_TookAttack[]; -extern const u8 BattleScript_SnatchedMove[]; -extern const u8 BattleScript_Pausex20[]; -extern const u8 BattleScript_SubstituteFade[]; -extern const u8 BattleScript_HangedOnMsg[]; -extern const u8 BattleScript_OneHitKOMsg[]; -extern const u8 BattleScript_EnduredMsg[]; -extern const u8 BattleScript_PSNPrevention[]; -extern const u8 BattleScript_BRNPrevention[]; -extern const u8 BattleScript_PRLZPrevention[]; -extern const u8 BattleScript_FlinchPrevention[]; -extern const u8 BattleScript_StatUp[]; -extern const u8 BattleScript_StatDown[]; -extern const u8 BattleScript_NoItemSteal[]; -extern const u8 BattleScript_ItemSteal[]; -extern const u8 BattleScript_RapidSpinAway[]; -extern const u8 BattleScript_TargetPRLZHeal[]; -extern const u8 BattleScript_KnockedOff[]; -extern const u8 BattleScript_StickyHoldActivates[]; -extern const u8 BattleScript_AllStatsUp[]; -extern const u8 BattleScript_AtkDefDown[]; -extern const u8 BattleScript_SAtkDown2[]; -extern const u8 BattleScript_LevelUp[]; -extern const u8 BattleScript_WrapFree[]; -extern const u8 BattleScript_LeechSeedFree[]; -extern const u8 BattleScript_SpikesFree[]; -extern const u8 BattleScript_ButItFailed[]; -extern const u8 BattleScript_ObliviousPreventsAttraction[]; -extern const u8 BattleScript_MistProtected[]; -extern const u8 BattleScript_AbilityNoStatLoss[]; -extern const u8 BattleScript_AbilityNoSpecificStatLoss[]; -extern const u8 BattleScript_TrainerBallBlock[]; -extern const u8 BattleScript_WallyBallThrow[]; -extern const u8 BattleScript_SuccessBallThrow[]; -extern const u8 BattleScript_ShakeBallThrow[]; -extern const u8 BattleScript_FaintAttacker[]; -extern const u8 BattleScript_FaintTarget[]; -extern const u8 BattleScript_DestinyBondTakesLife[]; -extern const u8 BattleScript_GrudgeTakesPp[]; -extern const u8 BattleScript_RageIsBuilding[]; -extern const u8 BattleScript_DefrostedViaFireMove[]; -extern const u8 gUnknown_082DB87D[]; -extern const u8 gUnknown_082DAE90[]; -extern const u8 gUnknown_082DAE59[]; -extern const u8 gUnknown_082DAEC7[]; -extern const u8 BattleScript_MoveEffectSleep[]; -extern const u8 BattleScript_MoveEffectPoison[]; -extern const u8 BattleScript_MoveEffectBurn[]; -extern const u8 BattleScript_MoveEffectFreeze[]; -extern const u8 BattleScript_MoveEffectParalysis[]; -extern const u8 BattleScript_MoveEffectToxic[]; -extern const u8 BattleScript_MoveEffectConfusion[]; -extern const u8 BattleScript_MoveEffectUproar[]; -extern const u8 BattleScript_MoveEffectPayDay[]; -extern const u8 BattleScript_MoveEffectWrap[]; -extern const u8 BattleScript_MoveEffectRecoil33[]; -extern const u8 BattleScript_DampStopsExplosion[]; -extern const u8 BattleScript_MistProtected[]; -extern const u8 BattleScript_AbilityNoStatLoss[]; -extern const u8 BattleScript_AbilityNoSpecificStatLoss[]; -extern const u8 BattleScript_ButItFailed[]; -extern const u8 gUnknown_082DADD8[]; -extern const u8 BattleScript_PrintPayDayMoneyString[]; -extern const u8 BattleScript_SturdyPreventsOHKO[]; -extern const u8 BattleScript_ObliviousPreventsAttraction[]; -extern const u8 BattleScript_PauseEffectivenessSoundResultMsgEndMove[]; -extern const u8 BattleScript_CastformChange[]; -extern const u8 BattleScript_TrainerBallBlock[]; -extern const u8 BattleScript_WallyBallThrow[]; -extern const u8 BattleScript_SuccessBallThrow[]; -extern const u8 BattleScript_ShakeBallThrow[]; -extern const u8 BattleScript_PresentDamageTarget[]; -extern const u8 BattleScript_AlreadyAtFullHp[]; -extern const u8 BattleScript_PresentHealTarget[]; -extern const u8 BattleScript_WrapFree[]; -extern const u8 BattleScript_LeechSeedFree[]; -extern const u8 BattleScript_SpikesFree[]; - // strings extern const u8 gText_BattleYesNoChoice[]; @@ -247,7 +167,7 @@ extern const u8 gText_BattleYesNoChoice[]; // this file's functions static bool8 IsTwoTurnsMove(u16 move); -static void DestinyBondFlagUpdate(void); +static void TrySetDestinyBondToHappen(void); static u8 AttacksThisTurn(u8 bank, u16 move); // Note: returns 1 if it's a charging turn, otherwise 2. static void CheckWonderGuardAndLevitate(void); static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8, const u8* BS_ptr); @@ -267,41 +187,41 @@ static void atk01_accuracycheck(void); static void atk02_attackstring(void); static void atk03_ppreduce(void); static void atk04_critcalc(void); -static void atk05_damagecalc1(void); +static void atk05_damagecalc(void); static void atk06_typecalc(void); -static void atk07_dmg_adjustment(void); -static void atk08_dmg_adjustment2(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_effectiveness_sound(void); +static void atk0E_effectivenesssound(void); static void atk0F_resultmessage(void); static void atk10_printstring(void); -static void atk11_printstring_playeronly(void); +static void atk11_printselectionstring(void); static void atk12_waitmessage(void); static void atk13_printfromtable(void); -static void atk14_printfromtable_playeronly(void); +static void atk14_printselectionstringfromtable(void); static void atk15_seteffectwithchance(void); static void atk16_seteffectprimary(void); static void atk17_seteffectsecondary(void); -static void atk18_status_effect_clear(void); -static void atk19_faint_pokemon(void); -static void atk1A_faint_animation(void); -static void atk1B_faint_effects_clear(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_jumpifstatus3(void); +static void atk21_jumpifstatus3condition(void); static void atk22_jumpiftype(void); static void atk23_getexp(void); static void atk24(void); -static void atk25_move_values_cleanup(void); -static void atk26_set_multihit(void); -static void atk27_decrement_multihit(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); @@ -312,7 +232,7 @@ static void atk2E_setbyte(void); static void atk2F_addbyte(void); static void atk30_subbyte(void); static void atk31_copyarray(void); -static void atk32_copyarray_withindex(void); +static void atk32_copyarraywithindex(void); static void atk33_orbyte(void); static void atk34_orhalfword(void); static void atk35_orword(void); @@ -326,75 +246,75 @@ static void atk3C_return(void); static void atk3D_end(void); static void atk3E_end2(void); static void atk3F_end3(void); -static void atk40_jump_if_move_affected_by_protect(void); +static void atk40_jumpifaffectedbyprotect(void); static void atk41_call(void); static void atk42_jumpiftype2(void); static void atk43_jumpifabilitypresent(void); -static void atk44_end_selection_script(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); static void atk49_moveend(void); static void atk4A_typecalc2(void); -static void atk4B_return_atk_to_ball(void); -static void atk4C_get_switched_mon_data(void); -static void atk4D_switch_data_update(void); -static void atk4E_switchin_anim(void); -static void atk4F_jump_if_cannot_switch(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_switch_handle_order(void); -static void atk52_switch_in_effects(void); -static void atk53_trainer_slide(void); -static void atk54_effectiveness_sound(void); -static void atk55_play_fanfare(void); -static void atk56_fainting_cry(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_return_to_ball(void); -static void atk59_learnmove_inbattle(void); +static void atk58_returntoball(void); +static 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_increment_gamestat(void); -static void atk61_draw_party_status_summary(void); -static void atk62_08025C6C(void); +static void atk5E(void); +static void atk5F(void); +static void atk60_incrementgamestat(void); +static void atk61_drawpartystatussummary(void); +static void atk62(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_cancel_everyones_actions(void); -static void atk69_dmg_adjustment3(void); +static void atk68_cancelallactions(void); +static void atk69_adjustsetdamage(void); static void atk6A_removeitem(void); static void atk6B_atknameinbuff1(void); -static void atk6C_draw_lvlupbox(void); -static void atk6D_reset_sentpokes_value(void); -static void atk6E_set_atk_to_player0(void); -static void atk6F_set_visible(void); -static void atk70_record_last_used_ability(void); -static void atk71_buffer_move_to_learn(void); -static void atk72_jump_if_run_attempt_success(void); -static void atk73_hp_thresholds(void); -static void atk74_hp_thresholds2(void); -static void atk75_item_effect_on_opponent(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_set_protect_like(void); +static void atk77_setprotectlike(void); static void atk78_faintifabilitynotdamp(void); static void atk79_setatkhptozero(void); -static void atk7A_jumpwhiletargetvalid(void); -static void atk7B_healhalfHP_if_possible(void); +static void atk7A_jumpifnexttargetvalid(void); +static void atk7B_tryhealhalfhealth(void); static void atk7C_trymirrormove(void); -static void atk7D_set_rain(void); +static void atk7D_setrain(void); static void atk7E_setreflect(void); static void atk7F_setseeded(void); static void atk80_manipulatedamage(void); -static void atk81_setrest(void); +static void atk81_trysetrest(void); static void atk82_jumpifnotfirstturn(void); static void atk83_nop(void); -static void atk84_jump_if_cant_sleep(void); +static void atk84_jumpifcantmakeasleep(void); static void atk85_stockpile(void); static void atk86_stockpiletobasedamage(void); static void atk87_stockpiletohpheal(void); @@ -403,22 +323,22 @@ static void atk89_statbuffchange(void); static void atk8A_normalisebuffs(void); static void atk8B_setbide(void); static void atk8C_confuseifrepeatingattackends(void); -static void atk8D_setmultihit_counter(void); -static void atk8E_init_multihit_string(void); +static void atk8D_setmultihitcounter(void); +static void atk8E_initmultihitstring(void); static void atk8F_forcerandomswitch(void); -static void atk90_conversion_type_change(void); +static void atk90_tryconversiontypechange(void); static void atk91_givepaydaymoney(void); static void atk92_setlightscreen(void); -static void atk93_ko_move(void); +static void atk93_tryKO(void); static void atk94_damagetohalftargethp(void); static void atk95_setsandstorm(void); static void atk96_weatherdamage(void); -static void atk97_try_infatuation(void); -static void atk98_status_icon_update(void); +static void atk97_tryinfatuating(void); +static void atk98_updatestatusicon(void); static void atk99_setmist(void); -static void atk9A_set_focusenergy(void); +static void atk9A_setfocusenergy(void); static void atk9B_transformdataexecution(void); -static void atk9C_set_substitute(void); +static void atk9C_setsubstitute(void); static void atk9D_mimicattackcopy(void); static void atk9E_metronome(void); static void atk9F_dmgtolevel(void); @@ -426,39 +346,39 @@ static void atkA0_psywavedamageeffect(void); static void atkA1_counterdamagecalculator(void); static void atkA2_mirrorcoatdamagecalculator(void); static void atkA3_disablelastusedattack(void); -static void atkA4_setencore(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_sleeptalk_choose_move(void); -static void atkAA_set_destinybond(void); -static void atkAB_DestinyBondFlagUpdate(void); +static void atkA9_trychoosesleeptalkmove(void); +static void atkAA_setdestinybond(void); +static void atkAB_trysetdestinybondtohappen(void); static void atkAC_remaininghptopower(void); -static void atkAD_spite_ppreduce(void); -static void atkAE_heal_party_status(void); +static void atkAD_tryspiteppreduce(void); +static void atkAE_healpartystatus(void); static void atkAF_cursetarget(void); -static void atkB0_set_spikes(void); -static void atkB1_set_foresight(void); -static void atkB2_setperishsong(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_set_safeguard(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_set_defense_curl(void); +static void atkBF_setdefensecurlbit(void); static void atkC0_recoverbasedonsunlight(void); -static void atkC1_hidden_power_calc(void); -static void atkC2_selectnexttarget(void); -static void atkC3_setfutureattack(void); -static void atkC4_beat_up(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); @@ -471,46 +391,46 @@ static void atkCD_cureifburnedparalysedorpoisoned(void); static void atkCE_settorment(void); static void atkCF_jumpifnodamage(void); static void atkD0_settaunt(void); -static void atkD1_set_helpinghand(void); -static void atkD2_swap_items(void); -static void atkD3_copy_ability(void); -static void atkD4_wish_effect(void); -static void atkD5_setroots(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_abilityswap(void); -static void atkDB_imprisoneffect(void); -static void atkDC_setgrudge(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_setmagiccoat(void); -static void atkE0_setstealstatchange(void); -static void atkE1_intimidate_string_loader(void); -static void atkE2_switchout_abilities(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_castform_change_animation(void); -static void atkE7_castform_data_change(void); +static void atkE6_docastformchangeanimation(void); +static void atkE7_trycastformdatachange(void); static void atkE8_settypebasedhalvers(void); static void atkE9_setweatherballtype(void); -static void atkEA_recycleitem(void); +static void atkEA_tryrecycleitem(void); static void atkEB_settypetoterrain(void); -static void atkEC_pursuit_sth(void); -static void atkED_802B4B4(void); +static void atkEC_pursuitrelated(void); +static void atkEF_snatchsetbanks(void); static void atkEE_removelightscreenreflect(void); -static void atkEF_pokeball_catch_calculation(void); -static void atkF0_give_caught_mon(void); -static void atkF1_set_caught_mon_dex_flags(void); -static void atkF2_display_dex_info(void); -static void atkF3_nickname_caught_poke(void); +static 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_action_finished(void); -static void atkF7_turn_finished(void); -static void atkF8_trainer_slide_back(void); +static void atkF6_finishaction(void); +static void atkF7_finishturn(void); +static void atkF8_trainerslideout(void); void (* const gBattleScriptingCommandsTable[])(void) = { @@ -519,41 +439,41 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk02_attackstring, atk03_ppreduce, atk04_critcalc, - atk05_damagecalc1, + atk05_damagecalc, atk06_typecalc, - atk07_dmg_adjustment, - atk08_dmg_adjustment2, + atk07_adjustnormaldamage, + atk08_adjustnormaldamage2, atk09_attackanimation, atk0A_waitanimation, atk0B_healthbarupdate, atk0C_datahpupdate, atk0D_critmessage, - atk0E_effectiveness_sound, + atk0E_effectivenesssound, atk0F_resultmessage, atk10_printstring, - atk11_printstring_playeronly, + atk11_printselectionstring, atk12_waitmessage, atk13_printfromtable, - atk14_printfromtable_playeronly, + atk14_printselectionstringfromtable, atk15_seteffectwithchance, atk16_seteffectprimary, atk17_seteffectsecondary, - atk18_status_effect_clear, - atk19_faint_pokemon, - atk1A_faint_animation, - atk1B_faint_effects_clear, + atk18_clearstatusfromeffect, + atk19_tryfaintmon, + atk1A_dofaintanimation, + atk1B_cleareffectsonfaint, atk1C_jumpifstatus, atk1D_jumpifstatus2, atk1E_jumpifability, atk1F_jumpifsideaffecting, atk20_jumpifstat, - atk21_jumpifstatus3, + atk21_jumpifstatus3condition, atk22_jumpiftype, atk23_getexp, atk24, - atk25_move_values_cleanup, - atk26_set_multihit, - atk27_decrement_multihit, + atk25_movevaluescleanup, + atk26_setmultihit, + atk27_decrementmultihit, atk28_goto, atk29_jumpifbyte, atk2A_jumpifhalfword, @@ -564,7 +484,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk2F_addbyte, atk30_subbyte, atk31_copyarray, - atk32_copyarray_withindex, + atk32_copyarraywithindex, atk33_orbyte, atk34_orhalfword, atk35_orword, @@ -578,75 +498,75 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk3D_end, atk3E_end2, atk3F_end3, - atk40_jump_if_move_affected_by_protect, + atk40_jumpifaffectedbyprotect, atk41_call, atk42_jumpiftype2, atk43_jumpifabilitypresent, - atk44_end_selection_script, + atk44_endselectionscript, atk45_playanimation, atk46_playanimation2, atk47_setgraphicalstatchangevalues, atk48_playstatchangeanimation, atk49_moveend, atk4A_typecalc2, - atk4B_return_atk_to_ball, - atk4C_get_switched_mon_data, - atk4D_switch_data_update, - atk4E_switchin_anim, - atk4F_jump_if_cannot_switch, + atk4B_returnatktoball, + atk4C_getswitchedmondata, + atk4D_switchindataupdate, + atk4E_switchinanim, + atk4F_jumpifcantswitch, atk50_openpartyscreen, - atk51_switch_handle_order, - atk52_switch_in_effects, - atk53_trainer_slide, - atk54_effectiveness_sound, - atk55_play_fanfare, - atk56_fainting_cry, + atk51_switchhandleorder, + atk52_switchineffects, + atk53_trainerslidein, + atk54_playse, + atk55_fanfare, + atk56_playfaintcry, atk57, - atk58_return_to_ball, - atk59_learnmove_inbattle, + atk58_returntoball, + atk59_handlelearnnewmove, atk5A_yesnoboxlearnmove, atk5B_yesnoboxstoplearningmove, atk5C_hitanimation, atk5D_getmoneyreward, - atk5E_8025A70, - atk5F_8025B24, - atk60_increment_gamestat, - atk61_draw_party_status_summary, - atk62_08025C6C, + atk5E, + atk5F, + atk60_incrementgamestat, + atk61_drawpartystatussummary, + atk62, atk63_jumptorandomattack, atk64_statusanimation, atk65_status2animation, atk66_chosenstatusanimation, atk67_yesnobox, - atk68_cancel_everyones_actions, - atk69_dmg_adjustment3, + atk68_cancelallactions, + atk69_adjustsetdamage, atk6A_removeitem, atk6B_atknameinbuff1, - atk6C_draw_lvlupbox, - atk6D_reset_sentpokes_value, - atk6E_set_atk_to_player0, - atk6F_set_visible, - atk70_record_last_used_ability, - atk71_buffer_move_to_learn, - atk72_jump_if_run_attempt_success, - atk73_hp_thresholds, - atk74_hp_thresholds2, - atk75_item_effect_on_opponent, + atk6C_drawlvlupbox, + atk6D_resetsentmonsvalue, + atk6E_setatktoplayer0, + atk6F_makevisible, + atk70_recordlastability, + atk71_buffermovetolearn, + atk72_jumpifplayerran, + atk73_hpthresholds, + atk74_hpthresholds2, + atk75_useitemonopponent, atk76_various, - atk77_set_protect_like, + atk77_setprotectlike, atk78_faintifabilitynotdamp, atk79_setatkhptozero, - atk7A_jumpwhiletargetvalid, - atk7B_healhalfHP_if_possible, + atk7A_jumpifnexttargetvalid, + atk7B_tryhealhalfhealth, atk7C_trymirrormove, - atk7D_set_rain, + atk7D_setrain, atk7E_setreflect, atk7F_setseeded, atk80_manipulatedamage, - atk81_setrest, + atk81_trysetrest, atk82_jumpifnotfirstturn, atk83_nop, - atk84_jump_if_cant_sleep, + atk84_jumpifcantmakeasleep, atk85_stockpile, atk86_stockpiletobasedamage, atk87_stockpiletohpheal, @@ -655,22 +575,22 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk8A_normalisebuffs, atk8B_setbide, atk8C_confuseifrepeatingattackends, - atk8D_setmultihit_counter, - atk8E_init_multihit_string, + atk8D_setmultihitcounter, + atk8E_initmultihitstring, atk8F_forcerandomswitch, - atk90_conversion_type_change, + atk90_tryconversiontypechange, atk91_givepaydaymoney, atk92_setlightscreen, - atk93_ko_move, + atk93_tryKO, atk94_damagetohalftargethp, atk95_setsandstorm, atk96_weatherdamage, - atk97_try_infatuation, - atk98_status_icon_update, + atk97_tryinfatuating, + atk98_updatestatusicon, atk99_setmist, - atk9A_set_focusenergy, + atk9A_setfocusenergy, atk9B_transformdataexecution, - atk9C_set_substitute, + atk9C_setsubstitute, atk9D_mimicattackcopy, atk9E_metronome, atk9F_dmgtolevel, @@ -678,39 +598,39 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkA1_counterdamagecalculator, atkA2_mirrorcoatdamagecalculator, atkA3_disablelastusedattack, - atkA4_setencore, + atkA4_trysetencore, atkA5_painsplitdmgcalc, atkA6_settypetorandomresistance, atkA7_setalwayshitflag, atkA8_copymovepermanently, - atkA9_sleeptalk_choose_move, - atkAA_set_destinybond, - atkAB_DestinyBondFlagUpdate, + atkA9_trychoosesleeptalkmove, + atkAA_setdestinybond, + atkAB_trysetdestinybondtohappen, atkAC_remaininghptopower, - atkAD_spite_ppreduce, - atkAE_heal_party_status, + atkAD_tryspiteppreduce, + atkAE_healpartystatus, atkAF_cursetarget, - atkB0_set_spikes, - atkB1_set_foresight, - atkB2_setperishsong, + atkB0_trysetspikes, + atkB1_setforesight, + atkB2_trysetperishsong, atkB3_rolloutdamagecalculation, atkB4_jumpifconfusedandstatmaxed, atkB5_furycuttercalc, atkB6_happinesstodamagecalculation, atkB7_presentdamagecalculation, - atkB8_set_safeguard, + atkB8_setsafeguard, atkB9_magnitudedamagecalculation, atkBA_jumpifnopursuitswitchdmg, atkBB_setsunny, atkBC_maxattackhalvehp, atkBD_copyfoestats, atkBE_rapidspinfree, - atkBF_set_defense_curl, + atkBF_setdefensecurlbit, atkC0_recoverbasedonsunlight, - atkC1_hidden_power_calc, - atkC2_selectnexttarget, - atkC3_setfutureattack, - atkC4_beat_up, + atkC1_hiddenpowercalc, + atkC2_selectfirstvalidtarget, + atkC3_trysetfutureattack, + atkC4_trydobeatup, atkC5_setsemiinvulnerablebit, atkC6_clearsemiinvulnerablebit, atkC7_setminimize, @@ -723,46 +643,46 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkCE_settorment, atkCF_jumpifnodamage, atkD0_settaunt, - atkD1_set_helpinghand, - atkD2_swap_items, - atkD3_copy_ability, - atkD4_wish_effect, - atkD5_setroots, + atkD1_trysethelpinghand, + atkD2_tryswapitems, + atkD3_trycopyability, + atkD4_trywish, + atkD5_trysetroots, atkD6_doubledamagedealtifdamaged, atkD7_setyawn, atkD8_setdamagetohealthdifference, atkD9_scaledamagebyhealthratio, - atkDA_abilityswap, - atkDB_imprisoneffect, - atkDC_setgrudge, + atkDA_tryswapabilities, + atkDB_tryimprision, + atkDC_trysetgrudge, atkDD_weightdamagecalculation, atkDE_asistattackselect, - atkDF_setmagiccoat, - atkE0_setstealstatchange, - atkE1_intimidate_string_loader, - atkE2_switchout_abilities, + atkDF_trysetmagiccoat, + atkE0_trysetsnatch, + atkE1_trygetintimidatetarget, + atkE2_switchoutabilities, atkE3_jumpifhasnohp, atkE4_getsecretpowereffect, atkE5_pickup, - atkE6_castform_change_animation, - atkE7_castform_data_change, + atkE6_docastformchangeanimation, + atkE7_trycastformdatachange, atkE8_settypebasedhalvers, atkE9_setweatherballtype, - atkEA_recycleitem, + atkEA_tryrecycleitem, atkEB_settypetoterrain, - atkEC_pursuit_sth, - atkED_802B4B4, + atkEC_pursuitrelated, + atkEF_snatchsetbanks, atkEE_removelightscreenreflect, - atkEF_pokeball_catch_calculation, - atkF0_give_caught_mon, - atkF1_set_caught_mon_dex_flags, - atkF2_display_dex_info, - atkF3_nickname_caught_poke, + atkEF_handleballthrow, + atkF0_givecaughtmon, + atkF1_trysetcaughtmondexflags, + atkF2_displaydexinfo, + atkF3_trygivecaughtmonnick, atkF4_subattackerhpbydmg, atkF5_removeattackerstatus1, - atkF6_action_finished, - atkF7_turn_finished, - atkF8_trainer_slide_back + atkF6_finishaction, + atkF7_finishturn, + atkF8_trainerslideout }; struct StatFractions @@ -1134,7 +1054,7 @@ static void atk00_attackcanceler(void) if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) { - i = IsPokeDisobedient(); // why use the 'i' variable...? + i = IsMonDisobedient(); // why use the 'i' variable...? switch (i) { case 0: @@ -1186,8 +1106,8 @@ static void atk00_attackcanceler(void) { CancelMultiTurnMoves(gBankAttacker); gBattleMoveFlags |= MOVESTATUS_MISSED; - gUnknown_02024250[gBankTarget] = 0; - gUnknown_02024258[gBankTarget] = 0; + gLastLandedMoves[gBankTarget] = 0; + gLastHitByType[gBankTarget] = 0; gBattleCommunication[6] = 1; gBattlescriptCurrInstr++; } @@ -1199,23 +1119,23 @@ static void atk00_attackcanceler(void) static void JumpIfMoveFailed(u8 adder, u16 move) { - const void* BS_ptr = gBattlescriptCurrInstr + adder; + const u8 *BS_ptr = gBattlescriptCurrInstr + adder; if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) { - gUnknown_02024250[gBankTarget] = 0; - gUnknown_02024258[gBankTarget] = 0; + gLastLandedMoves[gBankTarget] = 0; + gLastHitByType[gBankTarget] = 0; BS_ptr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); } else { - DestinyBondFlagUpdate(); + TrySetDestinyBondToHappen(); if (AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBankTarget, 0, 0, move)) return; } gBattlescriptCurrInstr = BS_ptr; } -static void atk40_jump_if_move_affected_by_protect(void) +static void atk40_jumpifaffectedbyprotect(void) { if (TARGET_PROTECT_AFFECTED) { @@ -1476,7 +1396,7 @@ static void atk04_critcalc(void) gBattlescriptCurrInstr++; } -static void atk05_damagecalc1(void) +static void atk05_damagecalc(void) { u16 sideStatus = gSideAffecting[GET_BANK_SIDE(gBankTarget)]; gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, @@ -1565,8 +1485,8 @@ static void atk06_typecalc(void) { gLastUsedAbility = gBattleMons[gBankTarget].ability; gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); - gUnknown_02024250[gBankTarget] = 0; - gUnknown_02024258[gBankTarget] = 0; + gLastLandedMoves[gBankTarget] = 0; + gLastHitByType[gBankTarget] = 0; gBattleCommunication[6] = moveType; RecordAbilityBattle(gBankTarget, gLastUsedAbility); } @@ -1601,8 +1521,8 @@ static void atk06_typecalc(void) { gLastUsedAbility = ABILITY_WONDER_GUARD; gBattleMoveFlags |= MOVESTATUS_MISSED; - gUnknown_02024250[gBankTarget] = 0; - gUnknown_02024258[gBankTarget] = 0; + gLastLandedMoves[gBankTarget] = 0; + gLastHitByType[gBankTarget] = 0; gBattleCommunication[6] = 3; RecordAbilityBattle(gBankTarget, gLastUsedAbility); } @@ -1843,7 +1763,7 @@ static void Unused_ApplyRandomDmgMultiplier(void) ApplyRandomDmgMultiplier(); } -static void atk07_dmg_adjustment(void) +static void atk07_adjustnormaldamage(void) { u8 holdEffect, quality; @@ -1891,7 +1811,7 @@ static void atk07_dmg_adjustment(void) gBattlescriptCurrInstr++; } -static void atk08_dmg_adjustment2(void) // The same as 0x7 except it doesn't check for false swipe move effect. +static void atk08_adjustnormaldamage2(void) // The same as 0x7 except it doesn't check for false swipe move effect. { u8 holdEffect, quality; @@ -2172,7 +2092,7 @@ static void atk0D_critmessage(void) } } -static void atk0E_effectiveness_sound(void) +static void atk0E_effectivenesssound(void) { if (gBattleExecBuffer) return; @@ -2183,11 +2103,11 @@ static void atk0E_effectiveness_sound(void) switch (gBattleMoveFlags & (u8)(~(MOVESTATUS_MISSED))) { case MOVESTATUS_SUPEREFFECTIVE: - EmitEffectivenessSound(0, SE_KOUKA_H); + EmitPlaySE(0, SE_KOUKA_H); MarkBufferBankForExecution(gActiveBank); break; case MOVESTATUS_NOTVERYEFFECTIVE: - EmitEffectivenessSound(0, SE_KOUKA_L); + EmitPlaySE(0, SE_KOUKA_L); MarkBufferBankForExecution(gActiveBank); break; case MOVESTATUS_NOTAFFECTED: @@ -2200,17 +2120,17 @@ static void atk0E_effectiveness_sound(void) default: if (gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) { - EmitEffectivenessSound(0, SE_KOUKA_H); + EmitPlaySE(0, SE_KOUKA_H); MarkBufferBankForExecution(gActiveBank); } else if (gBattleMoveFlags & MOVESTATUS_NOTVERYEFFECTIVE) { - EmitEffectivenessSound(0, SE_KOUKA_L); + EmitPlaySE(0, SE_KOUKA_L); MarkBufferBankForExecution(gActiveBank); } else if (!(gBattleMoveFlags & (MOVESTATUS_NOTAFFECTED | MOVESTATUS_FAILED))) { - EmitEffectivenessSound(0, SE_KOUKA_M); + EmitPlaySE(0, SE_KOUKA_M); MarkBufferBankForExecution(gActiveBank); } break; @@ -2319,11 +2239,11 @@ static void atk10_printstring(void) } } -static void atk11_printstring_playeronly(void) +static void atk11_printselectionstring(void) { gActiveBank = gBankAttacker; - EmitPrintStringPlayerOnly(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); + EmitPrintSelectionString(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 3; @@ -2365,7 +2285,7 @@ static void atk13_printfromtable(void) } } -static void atk14_printfromtable_playeronly(void) +static void atk14_printselectionstringfromtable(void) { if (gBattleExecBuffer == 0) { @@ -2373,7 +2293,7 @@ static void atk14_printfromtable_playeronly(void) ptr += gBattleCommunication[MULTISTRING_CHOOSER]; gActiveBank = gBankAttacker; - EmitPrintStringPlayerOnly(0, *ptr); + EmitPrintSelectionString(0, *ptr); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 5; @@ -3121,7 +3041,7 @@ static void atk15_seteffectwithchance(void) } gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - gBattleScripting.field_16 = 0; + gBattleScripting.multihitMoveEffect = 0; } static void atk16_seteffectprimary(void) @@ -3134,7 +3054,7 @@ static void atk17_seteffectsecondary(void) SetMoveEffect(FALSE, 0); } -static void atk18_status_effect_clear(void) +static void atk18_clearstatusfromeffect(void) { gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); @@ -3145,10 +3065,10 @@ static void atk18_status_effect_clear(void) gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattlescriptCurrInstr += 2; - gBattleScripting.field_16 = 0; + gBattleScripting.multihitMoveEffect = 0; } -static void atk19_faint_pokemon(void) +static void atk19_tryfaintmon(void) { const u8 *BS_ptr; @@ -3235,7 +3155,7 @@ static void atk19_faint_pokemon(void) } } -static void atk1A_faint_animation(void) +static void atk1A_dofaintanimation(void) { if (gBattleExecBuffer == 0) { @@ -3246,7 +3166,7 @@ static void atk1A_faint_animation(void) } } -static void atk1B_faint_effects_clear(void) +static void atk1B_cleareffectsonfaint(void) { if (gBattleExecBuffer == 0) { @@ -3302,7 +3222,7 @@ static void atk1E_jumpifability(void) gLastUsedAbility = ability; gBattlescriptCurrInstr = jumpPtr; RecordAbilityBattle(bank - 1, gLastUsedAbility); - gBattleScripting.field_15 = bank - 1; + gBattleScripting.bankWithAbility = bank - 1; } else gBattlescriptCurrInstr += 7; @@ -3315,7 +3235,7 @@ static void atk1E_jumpifability(void) gLastUsedAbility = ability; gBattlescriptCurrInstr = jumpPtr; RecordAbilityBattle(bank - 1, gLastUsedAbility); - gBattleScripting.field_15 = bank - 1; + gBattleScripting.bankWithAbility = bank - 1; } else gBattlescriptCurrInstr += 7; @@ -3328,7 +3248,7 @@ static void atk1E_jumpifability(void) gLastUsedAbility = ability; gBattlescriptCurrInstr = jumpPtr; RecordAbilityBattle(bank, gLastUsedAbility); - gBattleScripting.field_15 = bank; + gBattleScripting.bankWithAbility = bank; } else gBattlescriptCurrInstr += 7; @@ -3395,10 +3315,10 @@ static void atk20_jumpifstat(void) gBattlescriptCurrInstr += 9; } -static void atk21_jumpifstatus3(void) +static void atk21_jumpifstatus3condition(void) { u32 flags; - const u8* jumpPtr; + const u8 *jumpPtr; gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2); @@ -4098,19 +4018,19 @@ static void MoveValuesCleanUp(void) gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); } -static void atk25_move_values_cleanup(void) +static void atk25_movevaluescleanup(void) { MoveValuesCleanUp(); gBattlescriptCurrInstr += 1; } -static void atk26_set_multihit(void) +static void atk26_setmultihit(void) { gMultiHitCounter = gBattlescriptCurrInstr[1]; gBattlescriptCurrInstr += 2; } -static void atk27_decrement_multihit(void) +static void atk27_decrementmultihit(void) { if (--gMultiHitCounter == 0) gBattlescriptCurrInstr += 5; @@ -4320,7 +4240,7 @@ static void atk31_copyarray(void) gBattlescriptCurrInstr += 10; } -static void atk32_copyarray_withindex(void) +static void atk32_copyarraywithindex(void) { u8* dest = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); const u8* src = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); @@ -4470,7 +4390,7 @@ static void atk43_jumpifabilitypresent(void) gBattlescriptCurrInstr += 6; } -static void atk44_end_selection_script(void) +static void atk44_endselectionscript(void) { *(gBankAttacker + gBattleStruct->selectionScriptFinished) = TRUE; } @@ -4937,14 +4857,14 @@ static void atk49_moveend(void) u8 holdEffectAtk; u16 *choicedMoveAtk; u8 arg1, arg2; - u16 lastMove; + u16 originallyUsedMove; effect = FALSE; - if (gLastUsedMove == 0xFFFF) - lastMove = 0; + if (gChosenMove == 0xFFFF) + originallyUsedMove = 0; else - lastMove = gLastUsedMove; + originallyUsedMove = gChosenMove; arg1 = gBattlescriptCurrInstr[1]; arg2 = gBattlescriptCurrInstr[2]; @@ -5015,14 +4935,14 @@ static void atk49_moveend(void) break; case 6: // update choice band move if (!(gHitMarker & HITMARKER_OBEYS) || holdEffectAtk != HOLD_EFFECT_CHOICE_BAND - || gLastUsedMove == MOVE_STRUGGLE || (*choicedMoveAtk != 0 && *choicedMoveAtk != 0xFFFF)) + || gChosenMove == MOVE_STRUGGLE || (*choicedMoveAtk != 0 && *choicedMoveAtk != 0xFFFF)) goto LOOP; - if (gLastUsedMove == MOVE_BATON_PASS && !(gBattleMoveFlags & MOVESTATUS_FAILED)) + if (gChosenMove == MOVE_BATON_PASS && !(gBattleMoveFlags & MOVESTATUS_FAILED)) { gBattleScripting.atk49_state++; break; } - *choicedMoveAtk = gLastUsedMove; + *choicedMoveAtk = gChosenMove; LOOP: { for (i = 0; i < 4; i++) @@ -5117,63 +5037,63 @@ static void atk49_moveend(void) } if (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED) { - gUnknownMovesUsedByBanks[gBankAttacker] = gLastUsedMove; + gLastPrintedMoves[gBankAttacker] = gChosenMove; } if (!(gAbsentBankFlags & gBitTable[gBankAttacker]) && !(gBattleStruct->field_91 & gBitTable[gBankAttacker]) - && gBattleMoves[lastMove].effect != EFFECT_BATON_PASS) + && gBattleMoves[originallyUsedMove].effect != EFFECT_BATON_PASS) { if (gHitMarker & HITMARKER_OBEYS) { - gLastUsedMovesByBanks[gBankAttacker] = gLastUsedMove; - gUnknown_02024260[gBankAttacker] = gCurrentMove; + gLastMoves[gBankAttacker] = gChosenMove; + gLastResultingMoves[gBankAttacker] = gCurrentMove; } else { - gLastUsedMovesByBanks[gBankAttacker] = 0xFFFF; - gUnknown_02024260[gBankAttacker] = 0xFFFF; + gLastMoves[gBankAttacker] = 0xFFFF; + gLastResultingMoves[gBankAttacker] = 0xFFFF; } if (!(gHitMarker & HITMARKER_FAINTED(gBankTarget))) - gUnknown_02024270[gBankTarget] = gBankAttacker; + gLastHitBy[gBankTarget] = gBankAttacker; if (gHitMarker & HITMARKER_OBEYS && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) { - if (gLastUsedMove == 0xFFFF) + if (gChosenMove == 0xFFFF) { - gUnknown_02024250[gBankTarget] = gLastUsedMove; + gLastLandedMoves[gBankTarget] = gChosenMove; } else { - gUnknown_02024250[gBankTarget] = gCurrentMove; - GET_MOVE_TYPE(gCurrentMove, gUnknown_02024258[gBankTarget]); + gLastLandedMoves[gBankTarget] = gCurrentMove; + GET_MOVE_TYPE(gCurrentMove, gLastHitByType[gBankTarget]); } } else { - gUnknown_02024250[gBankTarget] = 0xFFFF; + gLastLandedMoves[gBankTarget] = 0xFFFF; } } gBattleScripting.atk49_state++; break; case 15: // mirror move if (!(gAbsentBankFlags & gBitTable[gBankAttacker]) && !(gBattleStruct->field_91 & gBitTable[gBankAttacker]) - && gBattleMoves[lastMove].flags & FLAG_MIRROR_MOVE_AFFECTED && gHitMarker & HITMARKER_OBEYS + && gBattleMoves[originallyUsedMove].flags & FLAG_MIRROR_MOVE_AFFECTED && gHitMarker & HITMARKER_OBEYS && gBankAttacker != gBankTarget && !(gHitMarker & HITMARKER_FAINTED(gBankTarget)) && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) { u8 target, attacker; - *(gBattleStruct->mirrorMoves + gBankTarget * 2 + 0) = gLastUsedMove; - *(gBattleStruct->mirrorMoves + gBankTarget * 2 + 1) = gLastUsedMove >> 8; + *(gBattleStruct->mirrorMoves + gBankTarget * 2 + 0) = gChosenMove; + *(gBattleStruct->mirrorMoves + gBankTarget * 2 + 1) = gChosenMove >> 8; target = gBankTarget; attacker = gBankAttacker; - *(attacker * 2 + target * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = gLastUsedMove; + *(attacker * 2 + target * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = gChosenMove; target = gBankTarget; attacker = gBankAttacker; - *(attacker * 2 + target * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = gLastUsedMove >> 8; + *(attacker * 2 + target * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = gChosenMove >> 8; } gBattleScripting.atk49_state++; break; @@ -5190,7 +5110,7 @@ static void atk49_moveend(void) gBattleScripting.atk49_state = 0; MoveValuesCleanUp(); BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); - gBattlescriptCurrInstr = gUnknown_082DB87D; + gBattlescriptCurrInstr = BattleScript_82DB87D; return; } else @@ -5225,7 +5145,7 @@ static void atk4A_typecalc2(void) { gLastUsedAbility = gBattleMons[gBankTarget].ability; gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); - gUnknown_02024250[gBankTarget] = 0; + gLastLandedMoves[gBankTarget] = 0; gBattleCommunication[6] = moveType; RecordAbilityBattle(gBankTarget, gLastUsedAbility); } @@ -5300,7 +5220,7 @@ static void atk4A_typecalc2(void) { gLastUsedAbility = ABILITY_WONDER_GUARD; gBattleMoveFlags |= MOVESTATUS_MISSED; - gUnknown_02024250[gBankTarget] = 0; + gLastLandedMoves[gBankTarget] = 0; gBattleCommunication[6] = 3; RecordAbilityBattle(gBankTarget, gLastUsedAbility); } @@ -5310,7 +5230,7 @@ static void atk4A_typecalc2(void) gBattlescriptCurrInstr++; } -static void atk4B_return_atk_to_ball(void) +static void atk4B_returnatktoball(void) { gActiveBank = gBankAttacker; if (!(gHitMarker & HITMARKER_FAINTED(gActiveBank))) @@ -5321,7 +5241,7 @@ static void atk4B_return_atk_to_ball(void) gBattlescriptCurrInstr++; } -static void atk4C_get_switched_mon_data(void) +static void atk4C_getswitchedmondata(void) { if (gBattleExecBuffer) return; @@ -5336,7 +5256,7 @@ static void atk4C_get_switched_mon_data(void) gBattlescriptCurrInstr += 2; } -static void atk4D_switch_data_update(void) +static void atk4D_switchindataupdate(void) { struct BattlePokemon oldData; s32 i; @@ -5389,7 +5309,7 @@ static void atk4D_switch_data_update(void) gBattlescriptCurrInstr += 2; } -static void atk4E_switchin_anim(void) +static void atk4E_switchinanim(void) { if (gBattleExecBuffer) return; @@ -5415,7 +5335,7 @@ static void atk4E_switchin_anim(void) sub_81A56B4(); } -static void atk4F_jump_if_cannot_switch(void) +static void atk4F_jumpifcantswitch(void) { s32 val = 0; s32 compareVar = 0; @@ -5533,10 +5453,10 @@ static void atk4F_jump_if_cannot_switch(void) { if (GetBankSide(gActiveBank) == SIDE_OPPONENT) { - r7 = GetBankByIdentity(1); + r7 = GetBankByIdentity(IDENTITY_OPPONENT_MON1); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - compareVar = GetBankByIdentity(3); + compareVar = GetBankByIdentity(IDENTITY_OPPONENT_MON2); else compareVar = r7; @@ -5544,10 +5464,10 @@ static void atk4F_jump_if_cannot_switch(void) } else { - r7 = GetBankByIdentity(0); + r7 = GetBankByIdentity(IDENTITY_PLAYER_MON1); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - compareVar = GetBankByIdentity(2); + compareVar = GetBankByIdentity(IDENTITY_PLAYER_MON2); else compareVar = r7; @@ -5869,7 +5789,7 @@ static void atk50_openpartyscreen(void) } } -static void atk51_switch_handle_order(void) +static void atk51_switchhandleorder(void) { s32 i; if (gBattleExecBuffer) @@ -5936,7 +5856,7 @@ static void atk51_switch_handle_order(void) gBattlescriptCurrInstr += 3; } -static void atk52_switch_in_effects(void) +static void atk52_switchineffects(void) { s32 i; @@ -5967,12 +5887,12 @@ static void atk52_switch_in_effects(void) gBattleScripting.bank = gActiveBank; BattleScriptPushCursor(); - if (gBattlescriptCurrInstr[1] == 0) - gBattlescriptCurrInstr = gUnknown_082DAE90; - else if (gBattlescriptCurrInstr[1] == 1) - gBattlescriptCurrInstr = gUnknown_082DAE59; + if (gBattlescriptCurrInstr[1] == BS_GET_TARGET) + gBattlescriptCurrInstr = BattleScript_SpikesOnTarget; + else if (gBattlescriptCurrInstr[1] == BS_GET_ATTACKER) + gBattlescriptCurrInstr = BattleScript_SpikesOnAttacker; else - gBattlescriptCurrInstr = gUnknown_082DAEC7; + gBattlescriptCurrInstr = BattleScript_SpikesOngBank1; } else { @@ -6017,7 +5937,7 @@ static void atk52_switch_in_effects(void) } } -static void atk53_trainer_slide(void) +static void atk53_trainerslidein(void) { gActiveBank = GetBankByIdentity(gBattlescriptCurrInstr[1]); EmitTrainerSlide(0); @@ -6026,16 +5946,16 @@ static void atk53_trainer_slide(void) gBattlescriptCurrInstr += 2; } -static void atk54_effectiveness_sound(void) +static void atk54_playse(void) { gActiveBank = gBankAttacker; - EmitEffectivenessSound(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); + EmitPlaySE(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 3; } -static void atk55_play_fanfare(void) +static void atk55_fanfare(void) { gActiveBank = gBankAttacker; EmitPlayFanfareOrBGM(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1), FALSE); @@ -6044,7 +5964,7 @@ static void atk55_play_fanfare(void) gBattlescriptCurrInstr += 3; } -static void atk56_fainting_cry(void) +static void atk56_playfaintcry(void) { gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); EmitFaintingCry(0); @@ -6055,14 +5975,14 @@ static void atk56_fainting_cry(void) static void atk57(void) { - gActiveBank = GetBankByIdentity(0); + gActiveBank = GetBankByIdentity(IDENTITY_PLAYER_MON1); EmitCmd55(0, gBattleOutcome); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 1; } -static void atk58_return_to_ball(void) +static void atk58_returntoball(void) { gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); EmitReturnMonToBall(0, 1); @@ -6071,10 +5991,10 @@ static void atk58_return_to_ball(void) gBattlescriptCurrInstr += 2; } -static void atk59_learnmove_inbattle(void) +static void atk59_handlelearnnewmove(void) { - const u8* jumpPtr1 = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - const u8* jumpPtr2 = BSScriptReadPtr(gBattlescriptCurrInstr + 5); + const u8 *jumpPtr1 = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + const u8 *jumpPtr2 = BSScriptReadPtr(gBattlescriptCurrInstr + 5); u16 ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterId], gBattlescriptCurrInstr[9]); while (ret == 0xFFFE) @@ -6090,7 +6010,7 @@ static void atk59_learnmove_inbattle(void) } else { - gActiveBank = GetBankByIdentity(0); + gActiveBank = GetBankByIdentity(IDENTITY_PLAYER_MON1); if (gBattlePartyID[gActiveBank] == gBattleStruct->expGetterId && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) @@ -6099,7 +6019,7 @@ static void atk59_learnmove_inbattle(void) } if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - gActiveBank = GetBankByIdentity(2); + gActiveBank = GetBankByIdentity(IDENTITY_PLAYER_MON2); if (gBattlePartyID[gActiveBank] == gBattleStruct->expGetterId && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) { @@ -6317,19 +6237,19 @@ static u32 GetTrainerMoneyToGive(u16 trainerId) lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; } break; - case PARTY_FLAG_CUSTOM_MOVES: + case F_TRAINER_PARTY_CUSTOM_MOVESET: { const struct TrainerMonNoItemCustomMoves *party = gTrainers[trainerId].party.NoItemCustomMoves; lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; } break; - case PARTY_FLAG_HAS_ITEM: + case F_TRAINER_PARTY_HELD_ITEM: { const struct TrainerMonItemDefaultMoves *party = gTrainers[trainerId].party.ItemDefaultMoves; lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; } break; - case PARTY_FLAG_CUSTOM_MOVES | PARTY_FLAG_HAS_ITEM: + 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; @@ -6367,7 +6287,7 @@ static void atk5D_getmoneyreward(void) gBattlescriptCurrInstr++; } -static void atk5E_8025A70(void) +static void atk5E(void) { gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); @@ -6394,7 +6314,7 @@ static void atk5E_8025A70(void) } } -static void atk5F_8025B24(void) +static void atk5F(void) { gActiveBank = gBankAttacker; gBankAttacker = gBankTarget; @@ -6408,7 +6328,7 @@ static void atk5F_8025B24(void) gBattlescriptCurrInstr++; } -static void atk60_increment_gamestat(void) +static void atk60_incrementgamestat(void) { if (GetBankSide(gBankAttacker) == SIDE_PLAYER) IncrementGameStat(gBattlescriptCurrInstr[1]); @@ -6416,7 +6336,7 @@ static void atk60_increment_gamestat(void) gBattlescriptCurrInstr += 2; } -static void atk61_draw_party_status_summary(void) +static void atk61_drawpartystatussummary(void) { s32 i; struct Pokemon* party; @@ -6453,7 +6373,7 @@ static void atk61_draw_party_status_summary(void) gBattlescriptCurrInstr += 2; } -static void atk62_08025C6C(void) +static void atk62(void) { gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); EmitCmd49(0); @@ -6464,10 +6384,10 @@ static void atk62_08025C6C(void) static void atk63_jumptorandomattack(void) { - if (gBattlescriptCurrInstr[1] != 0) + if (gBattlescriptCurrInstr[1]) gCurrentMove = gRandomMove; else - gLastUsedMove = gCurrentMove = gRandomMove; + gChosenMove = gCurrentMove = gRandomMove; gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; } @@ -6569,7 +6489,7 @@ static void atk67_yesnobox(void) } } -static void atk68_cancel_everyones_actions(void) +static void atk68_cancelallactions(void) { s32 i; @@ -6579,7 +6499,7 @@ static void atk68_cancel_everyones_actions(void) gBattlescriptCurrInstr++; } -static void atk69_dmg_adjustment3(void) // The same as 0x7, except there's no random damage multiplier. +static void atk69_adjustsetdamage(void) // The same as 0x7, except there's no random damage multiplier. { u8 holdEffect, quality; @@ -6648,7 +6568,7 @@ static void atk6B_atknameinbuff1(void) gBattlescriptCurrInstr++; } -static void atk6C_draw_lvlupbox(void) +static void atk6C_drawlvlupbox(void) { if (gBattleScripting.atk6C_state == 0) { @@ -6863,8 +6783,8 @@ static bool8 sub_804F344(void) return (gBattle_BG2_X != 0x1A0); } -#define sDestroy data0 -#define sSavedLvlUpBoxXPosition data1 +#define sDestroy data[0] +#define sSavedLvlUpBoxXPosition data[1] static void PutMonIconOnLvlUpBox(void) { @@ -6922,19 +6842,19 @@ static bool32 IsMonGettingExpSentOut(void) return FALSE; } -static void atk6D_reset_sentpokes_value(void) +static void atk6D_resetsentmonsvalue(void) { ResetSentPokesToOpponentValue(); gBattlescriptCurrInstr++; } -static void atk6E_set_atk_to_player0(void) +static void atk6E_setatktoplayer0(void) { - gBankAttacker = GetBankByIdentity(0); + gBankAttacker = GetBankByIdentity(IDENTITY_PLAYER_MON1); gBattlescriptCurrInstr++; } -static void atk6F_set_visible(void) +static void atk6F_makevisible(void) { gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); EmitSpriteInvisibility(0, FALSE); @@ -6943,7 +6863,7 @@ static void atk6F_set_visible(void) gBattlescriptCurrInstr += 2; } -static void atk70_record_last_used_ability(void) +static void atk70_recordlastability(void) { gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); RecordAbilityBattle(gActiveBank, gLastUsedAbility); @@ -6955,13 +6875,13 @@ void BufferMoveToLearnIntoBattleTextBuff2(void) PREPARE_MOVE_BUFFER(gBattleTextBuff2, gMoveToLearn); } -static void atk71_buffer_move_to_learn(void) +static void atk71_buffermovetolearn(void) { BufferMoveToLearnIntoBattleTextBuff2(); gBattlescriptCurrInstr++; } -static void atk72_jump_if_run_attempt_success(void) +static void atk72_jumpifplayerran(void) { if (TryRunFromBattle(gBank1)) gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); @@ -6969,7 +6889,7 @@ static void atk72_jump_if_run_attempt_success(void) gBattlescriptCurrInstr += 5; } -static void atk73_hp_thresholds(void) +static void atk73_hpthresholds(void) { u8 opposingBank; s32 result; @@ -6996,7 +6916,7 @@ static void atk73_hp_thresholds(void) gBattlescriptCurrInstr += 2; } -static void atk74_hp_thresholds2(void) +static void atk74_hpthresholds2(void) { u8 opposingBank; s32 result; @@ -7022,7 +6942,7 @@ static void atk74_hp_thresholds2(void) gBattlescriptCurrInstr += 2; } -static void atk75_item_effect_on_opponent(void) +static void atk75_useitemonopponent(void) { gBankInMenu = gBankAttacker; ExecuteTableBasedItemEffect(&gEnemyParty[gBattlePartyID[gBankAttacker]], gLastUsedItem, gBattlePartyID[gBankAttacker], 0, 1); @@ -7044,13 +6964,13 @@ static void atk76_various(void) break; case VARIOUS_SET_MAGIC_COAT_TARGET: gBankAttacker = gBankTarget; - side = GetBankSide(gBankAttacker) ^ 1; + side = GetBankSide(gBankAttacker) ^ BIT_SIDE; if (gSideTimers[side].followmeTimer != 0 && gBattleMons[gSideTimers[side].followmeTarget].hp != 0) gBankTarget = gSideTimers[side].followmeTarget; else gBankTarget = gActiveBank; break; - case VARIOUS_CAN_RUN_FROM_BATTLE: + case VARIOUS_IS_RUNNING_IMPOSSIBLE: gBattleCommunication[0] = IsRunningFromBattleImpossible(); break; case VARIOUS_GET_MOVE_TARGET: @@ -7209,10 +7129,10 @@ static void atk76_various(void) gBattlescriptCurrInstr += 3; } -static void atk77_set_protect_like(void) // protect and endure +static void atk77_setprotectlike(void) // protect and endure { bool8 notLastTurn = TRUE; - u16 lastMove = gUnknown_02024260[gBankAttacker]; + u16 lastMove = gLastResultingMoves[gBankAttacker]; if (lastMove != MOVE_PROTECT && lastMove != MOVE_DETECT && lastMove != MOVE_ENDURE) gDisableStructs[gBankAttacker].protectUses = 0; @@ -7292,9 +7212,9 @@ static void atk79_setatkhptozero(void) gBattlescriptCurrInstr++; } -static void atk7A_jumpwhiletargetvalid(void) // Used by intimidate to loop through all targets. +static void atk7A_jumpifnexttargetvalid(void) { - const u8* jumpPtr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + const u8 *jumpPtr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { @@ -7312,10 +7232,12 @@ static void atk7A_jumpwhiletargetvalid(void) // Used by intimidate to loop throu gBattlescriptCurrInstr = jumpPtr; } else + { gBattlescriptCurrInstr += 5; + } } -static void atk7B_healhalfHP_if_possible(void) +static void atk7B_tryhealhalfhealth(void) { const u8* failPtr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); @@ -7383,7 +7305,7 @@ static void atk7C_trymirrormove(void) } } -static void atk7D_set_rain(void) +static void atk7D_setrain(void) { if (gBattleWeather & WEATHER_RAIN_ANY) { @@ -7464,9 +7386,9 @@ static void atk80_manipulatedamage(void) gBattlescriptCurrInstr += 2; } -static void atk81_setrest(void) +static void atk81_trysetrest(void) { - const u8* failJump = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + const u8 *failJump = BSScriptReadPtr(gBattlescriptCurrInstr + 1); gActiveBank = gBankTarget = gBankAttacker; gBattleMoveDamage = gBattleMons[gBankTarget].maxHP * (-1); @@ -7530,9 +7452,9 @@ bool8 UproarWakeUpCheck(u8 bank) return TRUE; } -static void atk84_jump_if_cant_sleep(void) +static void atk84_jumpifcantmakeasleep(void) { - const u8* jumpPtr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + const u8 *jumpPtr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); if (UproarWakeUpCheck(gBankTarget)) { @@ -7636,9 +7558,9 @@ static void atk88_negativedamage(void) gBattlescriptCurrInstr++; } -static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8* BS_ptr) +static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) { - bool8 certain = 0; + bool8 certain = FALSE; bool8 notProtectAffected = FALSE; u32 index; @@ -7746,15 +7668,15 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8* BS_ptr) if (statValue == -2) { gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = 0xD3; // harshly - gBattleTextBuff2[3] = 0xD3 >> 8; + gBattleTextBuff2[2] = STRINGID_STATHARSHLY; + gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8; index = 4; } gBattleTextBuff2[index] = B_BUFF_STRING; index++; - gBattleTextBuff2[index] = 0xD4; // fell + gBattleTextBuff2[index] = STRINGID_STATFELL; index++; - gBattleTextBuff2[index] = 0xD4 >> 8; + gBattleTextBuff2[index] = STRINGID_STATFELL >> 8; index++; gBattleTextBuff2[index] = B_BUFF_EOS; @@ -7773,15 +7695,15 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8* BS_ptr) if (statValue == 2) { gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = 0xD1; // sharply - gBattleTextBuff2[3] = 0xD1 >> 8; + gBattleTextBuff2[2] = STRINGID_STATSHARPLY; + gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; index = 4; } gBattleTextBuff2[index] = B_BUFF_STRING; index++; - gBattleTextBuff2[index] = 0xD2; // rose + gBattleTextBuff2[index] = STRINGID_STATROSE; index++; - gBattleTextBuff2[index] = 0xD2 >> 8; + gBattleTextBuff2[index] = STRINGID_STATROSE >> 8; index++; gBattleTextBuff2[index] = B_BUFF_EOS; @@ -7844,7 +7766,7 @@ static void atk8C_confuseifrepeatingattackends(void) gBattlescriptCurrInstr++; } -static void atk8D_setmultihit_counter(void) +static void atk8D_setmultihitcounter(void) { if (gBattlescriptCurrInstr[1]) { @@ -7862,14 +7784,14 @@ static void atk8D_setmultihit_counter(void) gBattlescriptCurrInstr += 2; } -static void atk8E_init_multihit_string(void) +static void atk8E_initmultihitstring(void) { PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) gBattlescriptCurrInstr++; } -static bool8 sub_8051064(void) +static bool8 TryDoForceSwitchOut(void) { if (gBattleMons[gBankAttacker].level >= gBattleMons[gBankTarget].level) { @@ -7886,7 +7808,7 @@ static bool8 sub_8051064(void) *(gBattleStruct->field_58 + gBankTarget) = gBattlePartyID[gBankTarget]; } - gBattlescriptCurrInstr = gUnknown_082DADD8; + gBattlescriptCurrInstr = BattleScript_SuccessForceOut; return TRUE; } @@ -8014,7 +7936,7 @@ static void atk8F_forcerandomswitch(void) } else { - if (sub_8051064()) + if (TryDoForceSwitchOut()) { do { @@ -8047,11 +7969,11 @@ static void atk8F_forcerandomswitch(void) } else { - sub_8051064(); + TryDoForceSwitchOut(); } } -static void atk90_conversion_type_change(void) // randomly changes user's type to one of its moves' type +static void atk90_tryconversiontypechange(void) // randomly changes user's type to one of its moves' type { u8 validMoves = 0; u8 moveChecked; @@ -8155,7 +8077,7 @@ static void atk92_setlightscreen(void) gBattlescriptCurrInstr++; } -static void atk93_ko_move(void) +static void atk93_tryKO(void) { u8 holdEffect, param; @@ -8319,7 +8241,7 @@ static void atk96_weatherdamage(void) gBattlescriptCurrInstr++; } -static void atk97_try_infatuation(void) +static void atk97_tryinfatuating(void) { struct Pokemon *monAttacker, *monTarget; u16 speciesAttacker, speciesTarget; @@ -8364,7 +8286,7 @@ static void atk97_try_infatuation(void) } } -static void atk98_status_icon_update(void) +static void atk98_updatestatusicon(void) { if (gBattleExecBuffer) return; @@ -8414,7 +8336,7 @@ static void atk99_setmist(void) gBattlescriptCurrInstr++; } -static void atk9A_set_focusenergy(void) +static void atk9A_setfocusenergy(void) { if (gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) { @@ -8431,7 +8353,7 @@ static void atk9A_set_focusenergy(void) static void atk9B_transformdataexecution(void) { - gLastUsedMove = 0xFFFF; + gChosenMove = 0xFFFF; gBattlescriptCurrInstr++; if (gBattleMons[gBankTarget].status2 & STATUS2_TRANSFORMED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE) @@ -8473,7 +8395,7 @@ static void atk9B_transformdataexecution(void) } } -static void atk9C_set_substitute(void) +static void atk9C_setsubstitute(void) { u32 hp = gBattleMons[gBankAttacker].maxHP / 4; if (gBattleMons[gBankAttacker].maxHP / 4 == 0) @@ -8511,12 +8433,12 @@ static bool8 IsMoveUncopyableByMimic(u16 move) static void atk9D_mimicattackcopy(void) { - gLastUsedMove = 0xFFFF; + gChosenMove = 0xFFFF; - if (IsMoveUncopyableByMimic(gLastUsedMovesByBanks[gBankTarget]) + if (IsMoveUncopyableByMimic(gLastMoves[gBankTarget]) || gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED - || gLastUsedMovesByBanks[gBankTarget] == 0 - || gLastUsedMovesByBanks[gBankTarget] == 0xFFFF) + || gLastMoves[gBankTarget] == 0 + || gLastMoves[gBankTarget] == 0xFFFF) { gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); } @@ -8526,20 +8448,20 @@ static void atk9D_mimicattackcopy(void) for (i = 0; i < 4; i++) { - if (gBattleMons[gBankAttacker].moves[i] == gLastUsedMovesByBanks[gBankTarget]) + if (gBattleMons[gBankAttacker].moves[i] == gLastMoves[gBankTarget]) break; } if (i == 4) { - gBattleMons[gBankAttacker].moves[gCurrMovePos] = gLastUsedMovesByBanks[gBankTarget]; - if (gBattleMoves[gLastUsedMovesByBanks[gBankTarget]].pp < 5) - gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gLastUsedMovesByBanks[gBankTarget]].pp; + gBattleMons[gBankAttacker].moves[gCurrMovePos] = gLastMoves[gBankTarget]; + if (gBattleMoves[gLastMoves[gBankTarget]].pp < 5) + gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gLastMoves[gBankTarget]].pp; else gBattleMons[gBankAttacker].pp[gCurrMovePos] = 5; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastUsedMovesByBanks[gBankTarget]) + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBankTarget]) gDisableStructs[gBankAttacker].unk18_b |= gBitTable[gCurrMovePos]; gBattlescriptCurrInstr += 5; @@ -8654,7 +8576,7 @@ static void atkA3_disablelastusedattack(void) for (i = 0; i < 4; i++) { - if (gBattleMons[gBankTarget].moves[i] == gLastUsedMovesByBanks[gBankTarget]) + if (gBattleMons[gBankTarget].moves[i] == gLastMoves[gBankTarget]) break; } if (gDisableStructs[gBankTarget].disabledMove == 0 @@ -8673,19 +8595,19 @@ static void atkA3_disablelastusedattack(void) } } -static void atkA4_setencore(void) +static void atkA4_trysetencore(void) { s32 i; for (i = 0; i < 4; i++) { - if (gBattleMons[gBankTarget].moves[i] == gLastUsedMovesByBanks[gBankTarget]) + if (gBattleMons[gBankTarget].moves[i] == gLastMoves[gBankTarget]) break; } - if (gLastUsedMovesByBanks[gBankTarget] == MOVE_STRUGGLE - || gLastUsedMovesByBanks[gBankTarget] == MOVE_ENCORE - || gLastUsedMovesByBanks[gBankTarget] == MOVE_MIRROR_MOVE) + if (gLastMoves[gBankTarget] == MOVE_STRUGGLE + || gLastMoves[gBankTarget] == MOVE_ENCORE + || gLastMoves[gBankTarget] == MOVE_MIRROR_MOVE) { i = 4; } @@ -8731,13 +8653,13 @@ static void atkA5_painsplitdmgcalc(void) static void atkA6_settypetorandomresistance(void) // conversion 2 { - if (gUnknown_02024250[gBankAttacker] == 0 - || gUnknown_02024250[gBankAttacker] == 0xFFFF) + if (gLastLandedMoves[gBankAttacker] == 0 + || gLastLandedMoves[gBankAttacker] == 0xFFFF) { gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); } - else if (IsTwoTurnsMove(gUnknown_02024250[gBankAttacker]) - && gBattleMons[gUnknown_02024270[gBankAttacker]].status2 & STATUS2_MULTIPLETURNS) + else if (IsTwoTurnsMove(gLastLandedMoves[gBankAttacker]) + && gBattleMons[gLastHitBy[gBankAttacker]].status2 & STATUS2_MULTIPLETURNS) { gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); } @@ -8751,7 +8673,7 @@ static void atkA6_settypetorandomresistance(void) // conversion 2 i *= 3; - if (TYPE_EFFECT_ATK_TYPE(i) == gUnknown_02024258[gBankAttacker] + if (TYPE_EFFECT_ATK_TYPE(i) == gLastHitByType[gBankAttacker] && TYPE_EFFECT_MULTIPLIER(i) <= TYPE_MUL_NOT_EFFECTIVE && gBattleMons[gBankAttacker].type1 != TYPE_EFFECT_DEF_TYPE(i) && gBattleMons[gBankAttacker].type2 != TYPE_EFFECT_DEF_TYPE(i)) @@ -8774,7 +8696,7 @@ static void atkA6_settypetorandomresistance(void) // conversion 2 case TYPE_FORESIGHT: break; default: - if (TYPE_EFFECT_ATK_TYPE(j) == gUnknown_02024258[gBankAttacker] + if (TYPE_EFFECT_ATK_TYPE(j) == gLastHitByType[gBankAttacker] && TYPE_EFFECT_MULTIPLIER(j) <= 5 && gBattleMons[gBankAttacker].type1 != TYPE_EFFECT_DEF_TYPE(i) && gBattleMons[gBankAttacker].type2 != TYPE_EFFECT_DEF_TYPE(i)) @@ -8805,13 +8727,13 @@ static void atkA7_setalwayshitflag(void) static void atkA8_copymovepermanently(void) // sketch { - gLastUsedMove = 0xFFFF; + gChosenMove = 0xFFFF; if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED) - && gUnknownMovesUsedByBanks[gBankTarget] != MOVE_STRUGGLE - && gUnknownMovesUsedByBanks[gBankTarget] != 0 - && gUnknownMovesUsedByBanks[gBankTarget] != 0xFFFF - && gUnknownMovesUsedByBanks[gBankTarget] != MOVE_SKETCH) + && gLastPrintedMoves[gBankTarget] != MOVE_STRUGGLE + && gLastPrintedMoves[gBankTarget] != 0 + && gLastPrintedMoves[gBankTarget] != 0xFFFF + && gLastPrintedMoves[gBankTarget] != MOVE_SKETCH) { s32 i; @@ -8819,7 +8741,7 @@ static void atkA8_copymovepermanently(void) // sketch { if (gBattleMons[gBankAttacker].moves[i] == MOVE_SKETCH) continue; - if (gBattleMons[gBankAttacker].moves[i] == gUnknownMovesUsedByBanks[gBankTarget]) + if (gBattleMons[gBankAttacker].moves[i] == gLastPrintedMoves[gBankTarget]) break; } @@ -8831,8 +8753,8 @@ static void atkA8_copymovepermanently(void) // sketch { struct MovePpInfo movePpData; - gBattleMons[gBankAttacker].moves[gCurrMovePos] = gUnknownMovesUsedByBanks[gBankTarget]; - gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gUnknownMovesUsedByBanks[gBankTarget]].pp; + gBattleMons[gBankAttacker].moves[gCurrMovePos] = gLastPrintedMoves[gBankTarget]; + gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gLastPrintedMoves[gBankTarget]].pp; gActiveBank = gBankAttacker; for (i = 0; i < 4; i++) @@ -8845,7 +8767,7 @@ static void atkA8_copymovepermanently(void) // sketch EmitSetMonData(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct MovePpInfo), &movePpData); MarkBufferBankForExecution(gActiveBank); - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gUnknownMovesUsedByBanks[gBankTarget]) + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastPrintedMoves[gBankTarget]) gBattlescriptCurrInstr += 5; } @@ -8862,7 +8784,7 @@ static bool8 IsTwoTurnsMove(u16 move) || gBattleMoves[move].effect == EFFECT_RAZOR_WIND || gBattleMoves[move].effect == EFFECT_SKY_ATTACK || gBattleMoves[move].effect == EFFECT_SOLARBEAM - || gBattleMoves[move].effect == EFFECT_FLY + || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE || gBattleMoves[move].effect == EFFECT_BIDE) return TRUE; else @@ -8889,7 +8811,7 @@ static u8 AttacksThisTurn(u8 bank, u16 move) // Note: returns 1 if it's a chargi || gBattleMoves[move].effect == EFFECT_RAZOR_WIND || gBattleMoves[move].effect == EFFECT_SKY_ATTACK || gBattleMoves[move].effect == EFFECT_SOLARBEAM - || gBattleMoves[move].effect == EFFECT_FLY + || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE || gBattleMoves[move].effect == EFFECT_BIDE) { if ((gHitMarker & HITMARKER_x8000000)) @@ -8898,7 +8820,7 @@ static u8 AttacksThisTurn(u8 bank, u16 move) // Note: returns 1 if it's a chargi return 2; } -static void atkA9_sleeptalk_choose_move(void) +static void atkA9_trychoosesleeptalkmove(void) { s32 i; u8 unusableMovesBits = 0; @@ -8937,13 +8859,13 @@ static void atkA9_sleeptalk_choose_move(void) } } -static void atkAA_set_destinybond(void) +static void atkAA_setdestinybond(void) { gBattleMons[gBankAttacker].status2 |= STATUS2_DESTINY_BOND; gBattlescriptCurrInstr++; } -static void DestinyBondFlagUpdate(void) +static void TrySetDestinyBondToHappen(void) { u8 sideAttacker = GetBankSide(gBankAttacker); u8 sideTarget = GetBankSide(gBankTarget); @@ -8955,9 +8877,9 @@ static void DestinyBondFlagUpdate(void) } } -static void atkAB_DestinyBondFlagUpdate(void) +static void atkAB_trysetdestinybondtohappen(void) { - DestinyBondFlagUpdate(); + TrySetDestinyBondToHappen(); gBattlescriptCurrInstr++; } @@ -8976,16 +8898,16 @@ static void atkAC_remaininghptopower(void) gBattlescriptCurrInstr++; } -static void atkAD_spite_ppreduce(void) +static void atkAD_tryspiteppreduce(void) { - if (gLastUsedMovesByBanks[gBankTarget] != 0 - && gLastUsedMovesByBanks[gBankTarget] != 0xFFFF) + if (gLastMoves[gBankTarget] != 0 + && gLastMoves[gBankTarget] != 0xFFFF) { s32 i; for (i = 0; i < 4; i++) { - if (gLastUsedMovesByBanks[gBankTarget] == gBattleMons[gBankTarget].moves[i]) + if (gLastMoves[gBankTarget] == gBattleMons[gBankTarget].moves[i]) break; } @@ -8995,7 +8917,7 @@ static void atkAD_spite_ppreduce(void) if (gBattleMons[gBankTarget].pp[i] < ppToDeduct) ppToDeduct = gBattleMons[gBankTarget].pp[i]; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastUsedMovesByBanks[gBankTarget]) + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBankTarget]) ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, 0, 1); @@ -9027,7 +8949,7 @@ static void atkAD_spite_ppreduce(void) } } -static void atkAE_heal_party_status(void) +static void atkAE_healpartystatus(void) { u32 zero = 0; u8 toHeal = 0; @@ -9103,7 +9025,7 @@ static void atkAE_heal_party_status(void) gBattleMons[gBankAttacker].status1 = 0; gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); - gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2); + gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_MON); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank])) { @@ -9140,7 +9062,7 @@ static void atkAF_cursetarget(void) } } -static void atkB0_set_spikes(void) +static void atkB0_trysetspikes(void) { u8 targetSide = GetBankSide(gBankAttacker) ^ BIT_SIDE; @@ -9157,13 +9079,13 @@ static void atkB0_set_spikes(void) } } -static void atkB1_set_foresight(void) +static void atkB1_setforesight(void) { gBattleMons[gBankTarget].status2 |= STATUS2_FORESIGHT; gBattlescriptCurrInstr++; } -static void atkB2_setperishsong(void) +static void atkB2_trysetperishsong(void) { s32 i; s32 notAffectedCount = 0; @@ -9196,7 +9118,7 @@ static void atkB3_rolloutdamagecalculation(void) if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) { CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_PauseEffectivenessSoundResultMsgEndMove; + gBattlescriptCurrInstr = BattleScript_MoveMissedPause; } else { @@ -9240,7 +9162,7 @@ static void atkB5_furycuttercalc(void) if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) { gDisableStructs[gBankAttacker].furyCutterCounter = 0; - gBattlescriptCurrInstr = BattleScript_PauseEffectivenessSoundResultMsgEndMove; + gBattlescriptCurrInstr = BattleScript_MoveMissedPause; } else { @@ -9286,7 +9208,7 @@ static void atkB7_presentdamagecalculation(void) gBattleMoveDamage *= -1; } if (rand < 204) - gBattlescriptCurrInstr = BattleScript_PresentDamageTarget; + gBattlescriptCurrInstr = BattleScript_HitFromCritCalc; else if (gBattleMons[gBankTarget].maxHP == gBattleMons[gBankTarget].hp) gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp; else @@ -9296,7 +9218,7 @@ static void atkB7_presentdamagecalculation(void) } } -static void atkB8_set_safeguard(void) +static void atkB8_setsafeguard(void) { if (gSideAffecting[GET_BANK_SIDE(gBankAttacker)] & SIDE_STATUS_SAFEGUARD) { @@ -9385,7 +9307,7 @@ static void atkBA_jumpifnopursuitswitchdmg(void) gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON2); } - if (gActionForBanks[gBankTarget] == 0 + if (gActionForBanks[gBankTarget] == ACTION_USE_MOVE && gBankAttacker == *(gBattleStruct->moveTarget + gBankTarget) && !(gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE)) && gBattleMons[gBankAttacker].hp @@ -9501,7 +9423,7 @@ static void atkBE_rapidspinfree(void) } } -static void atkBF_set_defense_curl(void) +static void atkBF_setdefensecurlbit(void) { gBattleMons[gBankAttacker].status2 |= STATUS2_DEFENSE_CURL; gBattlescriptCurrInstr++; @@ -9533,7 +9455,7 @@ static void atkC0_recoverbasedonsunlight(void) } #ifdef NONMATCHING -static void atkC1_hidden_power_calc(void) +static void atkC1_hiddenpowercalc(void) { u32 powerBits = 0; u32 typeBits = 0; @@ -9564,7 +9486,7 @@ static void atkC1_hidden_power_calc(void) #else __attribute__((naked)) -static void atkC1_hidden_power_calc(void) +static void atkC1_hiddenpowercalc(void) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -9707,7 +9629,7 @@ _080544F0:\n\ } #endif // NONMATCHING -static void atkC2_selectnexttarget(void) +static void atkC2_selectfirstvalidtarget(void) { for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++) { @@ -9719,7 +9641,7 @@ static void atkC2_selectnexttarget(void) gBattlescriptCurrInstr++; } -static void atkC3_setfutureattack(void) +static void atkC3_trysetfutureattack(void) { if (gWishFutureKnock.futureSightCounter[gBankTarget] != 0) { @@ -9747,9 +9669,9 @@ static void atkC3_setfutureattack(void) } } -static void atkC4_beat_up(void) +static void atkC4_trydobeatup(void) { - struct Pokemon* party; + struct Pokemon *party; if (GetBankSide(gBankAttacker) == SIDE_PLAYER) party = gPlayerParty; @@ -9950,7 +9872,7 @@ static void atkD0_settaunt(void) } } -static void atkD1_set_helpinghand(void) +static void atkD1_trysethelpinghand(void) { gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_MON); @@ -9968,7 +9890,7 @@ static void atkD1_set_helpinghand(void) } } -static void atkD2_swap_items(void) // trick +static void atkD2_tryswapitems(void) // trick { // opponent can't swap items with player in regular battles if (gBattleTypeFlags & BATTLE_TYPE_x4000000 @@ -10055,7 +9977,7 @@ static void atkD2_swap_items(void) // trick } } -static void atkD3_copy_ability(void) // role play +static void atkD3_trycopyability(void) // role play { if (gBattleMons[gBankTarget].ability != 0 && gBattleMons[gBankTarget].ability != ABILITY_WONDER_GUARD) @@ -10070,7 +9992,7 @@ static void atkD3_copy_ability(void) // role play } } -static void atkD4_wish_effect(void) +static void atkD4_trywish(void) { switch (gBattlescriptCurrInstr[1]) { @@ -10103,7 +10025,7 @@ static void atkD4_wish_effect(void) } } -static void atkD5_setroots(void) // ingrain +static void atkD5_trysetroots(void) // ingrain { if (gStatuses3[gBankAttacker] & STATUS3_ROOTED) { @@ -10168,7 +10090,7 @@ static void atkD9_scaledamagebyhealthratio(void) gBattlescriptCurrInstr++; } -static void atkDA_abilityswap(void) // skill swap +static void atkDA_tryswapabilities(void) // skill swap { if ((gBattleMons[gBankAttacker].ability == 0 && gBattleMons[gBankTarget].ability == 0) @@ -10188,7 +10110,7 @@ static void atkDA_abilityswap(void) // skill swap } } -static void atkDB_imprisoneffect(void) +static void atkDB_tryimprision(void) { if ((gStatuses3[gBankAttacker] & STATUS3_IMPRISONED_OTHERS)) { @@ -10230,7 +10152,7 @@ static void atkDB_imprisoneffect(void) } } -static void atkDC_setgrudge(void) +static void atkDC_trysetgrudge(void) { if (gStatuses3[gBankAttacker] & STATUS3_GRUDGE) { @@ -10313,7 +10235,7 @@ static void atkDE_asistattackselect(void) } } -static void atkDF_setmagiccoat(void) +static void atkDF_trysetmagiccoat(void) { gBankTarget = gBankAttacker; gSpecialStatuses[gBankAttacker].flag20 = 1; @@ -10328,7 +10250,7 @@ static void atkDF_setmagiccoat(void) } } -static void atkE0_setstealstatchange(void) // snatch +static void atkE0_trysetsnatch(void) // snatch { gSpecialStatuses[gBankAttacker].flag20 = 1; if (gCurrentTurnActionNumber == gNoOfAllBanks - 1) // moves last turn @@ -10342,7 +10264,7 @@ static void atkE0_setstealstatchange(void) // snatch } } -static void atkE1_intimidate_string_loader(void) +static void atkE1_trygetintimidatetarget(void) { u8 side; @@ -10365,7 +10287,7 @@ static void atkE1_intimidate_string_loader(void) gBattlescriptCurrInstr += 5; } -static void atkE2_switchout_abilities(void) +static void atkE2_switchoutabilities(void) { gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); @@ -10413,7 +10335,7 @@ static void atkE4_getsecretpowereffect(void) case BATTLE_TERRAIN_POND: gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_SPD_MINUS_1; break; - case BATTLE_TERRAIN_ROCK: + case BATTLE_TERRAIN_MOUNTAIN: gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION; break; case BATTLE_TERRAIN_CAVE: @@ -10502,7 +10424,7 @@ static void atkE5_pickup(void) gBattlescriptCurrInstr++; } -static void atkE6_castform_change_animation(void) +static void atkE6_docastformchangeanimation(void) { gActiveBank = gBattleScripting.bank; @@ -10515,7 +10437,7 @@ static void atkE6_castform_change_animation(void) gBattlescriptCurrInstr++; } -static void atkE7_castform_data_change(void) +static void atkE7_trycastformdatachange(void) { u8 form; @@ -10578,7 +10500,7 @@ static void atkE9_setweatherballtype(void) gBattlescriptCurrInstr++; } -static void atkEA_recycleitem(void) +static void atkEA_tryrecycleitem(void) { u16 *usedHeldItem; @@ -10619,7 +10541,7 @@ static void atkEB_settypetoterrain(void) } } -static void atkEC_pursuit_sth(void) +static void atkEC_pursuitrelated(void) { gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_MON); @@ -10641,7 +10563,7 @@ static void atkEC_pursuit_sth(void) } } -static void atkED_802B4B4(void) +static void atkEF_snatchsetbanks(void) { gEffectBank = gBankAttacker; @@ -10676,7 +10598,7 @@ static void atkEE_removelightscreenreflect(void) // brick break gBattlescriptCurrInstr++; } -static void atkEF_pokeball_catch_calculation(void) +static void atkEF_handleballthrow(void) { u8 ballMultiplier = 0; @@ -10827,7 +10749,7 @@ static void atkEF_pokeball_catch_calculation(void) } } -static void atkF0_give_caught_mon(void) +static void atkF0_givecaughtmon(void) { if (GiveMonToPlayer(&gEnemyParty[gBattlePartyID[gBankAttacker ^ BIT_SIDE]]) != MON_GIVEN_TO_PARTY) { @@ -10856,7 +10778,7 @@ static void atkF0_give_caught_mon(void) gBattlescriptCurrInstr++; } -static void atkF1_set_caught_mon_dex_flags(void) +static void atkF1_trysetcaughtmondexflags(void) { u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL); u32 personality = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY, NULL); @@ -10872,7 +10794,7 @@ static void atkF1_set_caught_mon_dex_flags(void) } } -static void atkF2_display_dex_info(void) +static void atkF2_displaydexinfo(void) { u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL); @@ -10991,7 +10913,7 @@ void BattleDestroyYesNoCursorAt(u8 cursorPosition) CopyBgTilemapBufferToVram(0); } -static void atkF3_nickname_caught_poke(void) +static void atkF3_trygivecaughtmonnick(void) { switch (gBattleCommunication[MULTIUSE_STATE]) { @@ -11079,18 +11001,18 @@ static void atkF5_removeattackerstatus1(void) gBattlescriptCurrInstr++; } -static void atkF6_action_finished(void) +static void atkF6_finishaction(void) { gCurrentActionFuncId = ACTION_FINISHED; } -static void atkF7_turn_finished(void) +static void atkF7_finishturn(void) { gCurrentActionFuncId = ACTION_FINISHED; gCurrentTurnActionNumber = gNoOfAllBanks; } -static void atkF8_trainer_slide_back(void) +static void atkF8_trainerslideout(void) { gActiveBank = GetBankByIdentity(gBattlescriptCurrInstr[1]); EmitTrainerSlideBack(0); diff --git a/src/battle_setup.c b/src/battle_setup.c new file mode 100644 index 000000000..3d4f5afcc --- /dev/null +++ b/src/battle_setup.c @@ -0,0 +1,1884 @@ +#include "global.h" +#include "constants/trainers.h" +#include "battle.h" +#include "battle_setup.h" +#include "battle_transition.h" +#include "main.h" +#include "task.h" +#include "pokemon_3.h" +#include "safari_zone.h" +#include "script.h" +#include "constants/game_stat.h" +#include "event_data.h" +#include "constants/species.h" +#include "songs.h" +#include "metatile_behavior.h" +#include "constants/maps.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "random.h" +#include "starter_choose.h" +#include "script_pokemon_80F8.h" +#include "constants/items.h" +#include "palette.h" +#include "window.h" +#include "field_map_obj.h" +#include "event_scripts.h" +#include "trainer_see.h" +#include "field_message_box.h" +#include "sound.h" +#include "strings.h" +#include "secret_base.h" +#include "string_util.h" + +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; +}; + +extern bool8 InBattlePyramid(void); +extern bool8 InBattlePike(void); +extern bool32 InTrainerHill(void); +extern bool32 FieldPoisonEffectIsRunning(void); +extern void overworld_free_bg_tilemaps(void); +extern void prev_quest_postbuffer_cursor_backup_reset(void); +extern void ResetPoisonStepCounter(void); +extern void sub_81BE72C(void); +extern void FreezeMapObjects(void); +extern void sub_808BCF4(void); +extern void sub_80EECC8(void); +extern void c2_exit_to_overworld_1_continue_scripts_restart_music(void); +extern void c2_exit_to_overworld_2_switch(void); +extern void Overworld_ClearSavedMusic(void); +extern void CB2_WhiteOut(void); +extern void sub_80AF6F0(void); +extern void PlayBattleBGM(void); +extern void sub_81DA57C(void); +extern u8 GetSav1Weather(void); +extern u8 Overworld_GetFlashLevel(void); +extern u16 sub_81A9AA8(u8 localId); +extern u16 sub_81D6180(u8 localId); +extern bool8 GetBattlePyramidTrainerFlag(u8 mapObjId); +extern bool8 GetTrainerHillTrainerFlag(u8 mapObjId); +extern bool8 sub_81D5C18(void); +extern void sub_816306C(u8 a0); +extern void sub_8163048(u8 a0); +extern void sub_81A9B04(void); +extern void sub_81D639C(void); +extern void sub_81D6384(void); +extern void sub_81D61E8(void); +extern void sub_80982B8(void); +extern void sub_81A9EDC(u16 a0); +extern void sub_81D572C(u8 a0, u16 arg1); +extern void IncrementGameStat(u8 statId); +extern u32 GetGameStat(u8 statId); + +extern u32 gBattleTypeFlags; +extern u8 gBattleOutcome; +extern void (*gFieldCallback)(void); +extern u8 gApproachingTrainerId; +extern u8 gNoOfApproachingTrainers; +extern u16 gUnknown_03006080; + +// this file's functions +static void DoBattlePikeWildBattle(void); +static void DoSafariBattle(void); +static void DoStandardWildBattle(void); +static void CB2_EndWildBattle(void); +static void CB2_EndScriptedWildBattle(void); +static u8 GetWildBattleTransition(void); +static u8 GetTrainerBattleTransition(void); +static void sub_80B1218(void); +static void sub_80B1234(void); +static void CB2_GiveStarter(void); +static void CB2_StartFirstBattle(void); +static void CB2_EndFirstBattle(void); +static void CB2_EndTrainerBattle(void); +static bool32 IsPlayerDefeated(u32 battleOutcome); +static u16 GetRematchTrainerId(u16 trainerId); +static void RegisterTrainerInMatchCall(void); +static void HandleRematchVarsOnBattleEnd(void); +static const u8 *GetIntroSpeechOfApproachingTrainer(void); +static const u8 *GetTrainerCantBattleSpeech(void); + +// ewram data +EWRAM_DATA static u16 sTrainerBattleMode = 0; +EWRAM_DATA u16 gTrainerBattleOpponent_A = 0; +EWRAM_DATA u16 gTrainerBattleOpponent_B = 0; +EWRAM_DATA u16 gPartnerTrainerId = 0; +EWRAM_DATA static u16 sTrainerMapObjectLocalId = 0; +EWRAM_DATA static u8 *sTrainerAIntroSpeech = NULL; +EWRAM_DATA static u8 *sTrainerBIntroSpeech = NULL; +EWRAM_DATA static u8 *sTrainerADefeatSpeech = NULL; +EWRAM_DATA static u8 *sTrainerBDefeatSpeech = NULL; +EWRAM_DATA static u8 *sTrainerVictorySpeech = NULL; +EWRAM_DATA static u8 *sTrainerCannotBattleSpeech = NULL; +EWRAM_DATA static u8 *sTrainerBattleEndScript = NULL; +EWRAM_DATA static u8 *sTrainerABattleScriptRetAddr = NULL; +EWRAM_DATA static u8 *sTrainerBBattleScriptRetAddr = NULL; +EWRAM_DATA static bool8 sShouldCheckTrainerBScript = FALSE; +EWRAM_DATA static u8 sNoOfPossibleTrainerRetScripts = 0; + +// const rom data + +// The first transition is used if the enemy pokemon are lower level than our pokemon. +// Otherwise, the second transition is used. +static const u8 sBattleTransitionTable_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 sBattleTransitionTable_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 +}; + +static const u8 sUnknown_0854FE98[] = +{ + B_TRANSITION_29, B_TRANSITION_30, B_TRANSITION_31, B_TRANSITION_32, + B_TRANSITION_34, B_TRANSITION_35, B_TRANSITION_36, B_TRANSITION_37, + B_TRANSITION_38, B_TRANSITION_39, B_TRANSITION_40, B_TRANSITION_41 +}; + +static const u8 sUnknown_0854FEA4[] = +{ + B_TRANSITION_31, B_TRANSITION_32, B_TRANSITION_33 +}; + +static const u8 sUnknown_0854FEA7[] = +{ + B_TRANSITION_29, B_TRANSITION_31, B_TRANSITION_32, B_TRANSITION_33 +}; + +static const struct TrainerBattleParameter sOrdinaryBattleParams[] = +{ + {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, +}; + +static const struct TrainerBattleParameter sContinueScriptBattleParams[] = +{ + {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, +}; + +static const struct TrainerBattleParameter sDoubleBattleParams[] = +{ + {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, +}; + +static const struct TrainerBattleParameter sOrdinaryNoIntroBattleParams[] = +{ + {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerAIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, +}; + +static const struct TrainerBattleParameter sContinueScriptDoubleBattleParams[] = +{ + {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, +}; + +static const struct TrainerBattleParameter sTrainerBOrdinaryBattleParams[] = +{ + {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerBBattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, +}; + +static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[] = +{ + {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, + {&sTrainerBBattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT}, + {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, +}; + +const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES] = +{ + {{0x0025, 0x0028, 0x0029, 0x002a, 0x002b}, 0x0000, 0x0021}, + {{0x02e1, 0x032c, 0x032d, 0x032e, 0x032f}, 0x0000, 0x0014}, + {{0x002c, 0x002f, 0x0030, 0x0031, 0x0032}, 0x0000, 0x001a}, + {{0x0039, 0x003c, 0x003d, 0x003e, 0x003f}, 0x0000, 0x0018}, + {{0x0040, 0x0043, 0x0044, 0x0045, 0x0046}, 0x0000, 0x0018}, + {{0x02af, 0x02b0, 0x02b1, 0x02b2, 0x02b3}, 0x0000, 0x0027}, + {{0x02ff, 0x033c, 0x033d, 0x033e, 0x033f}, 0x0000, 0x0024}, + {{0x005e, 0x0065, 0x0066, 0x0067, 0x0068}, 0x0000, 0x001a}, + {{0x004e, 0x0054, 0x0055, 0x0056, 0x0057}, 0x0000, 0x001a}, + {{0x006c, 0x006e, 0x006f, 0x0070, 0x0071}, 0x0018, 0x0014}, + {{0x0072, 0x0078, 0x0079, 0x007a, 0x007b}, 0x0000, 0x0013}, + {{0x0090, 0x034c, 0x034d, 0x034e, 0x034f}, 0x0018, 0x0038}, + {{0x007f, 0x0084, 0x0085, 0x0086, 0x0087}, 0x0000, 0x0024}, + {{0x0088, 0x008b, 0x008c, 0x008d, 0x008e}, 0x0000, 0x0013}, + {{0x008f, 0x0093, 0x0094, 0x0095, 0x0096}, 0x0000, 0x001d}, + {{0x009b, 0x00af, 0x00b0, 0x00b1, 0x00b2}, 0x0000, 0x0016}, + {{0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb}, 0x0000, 0x001e}, + {{0x02a0, 0x0338, 0x0339, 0x033a, 0x033b}, 0x0000, 0x002a}, + {{0x00c3, 0x0340, 0x0341, 0x0342, 0x0343}, 0x0000, 0x0026}, + {{0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8}, 0x0000, 0x0021}, + {{0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2}, 0x0000, 0x001d}, + {{0x00d8, 0x00db, 0x00dc, 0x00dd, 0x00de}, 0x0018, 0x000d}, + {{0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad}, 0x0018, 0x0001}, + {{0x00e2, 0x00e4, 0x00e5, 0x00e6, 0x00e7}, 0x0000, 0x0023}, + {{0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2}, 0x0000, 0x0026}, + {{0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd}, 0x0000, 0x0026}, + {{0x00fe, 0x0101, 0x0102, 0x0103, 0x0104}, 0x0000, 0x0024}, + {{0x0118, 0x011a, 0x011b, 0x011c, 0x011d}, 0x0000, 0x001f}, + {{0x0111, 0x0114, 0x0115, 0x0116, 0x0117}, 0x0000, 0x001f}, + {{0x011f, 0x0120, 0x0121, 0x0122, 0x0123}, 0x0000, 0x0020}, + {{0x012e, 0x012f, 0x0130, 0x0131, 0x0132}, 0x0000, 0x0019}, + {{0x0125, 0x0127, 0x0128, 0x0129, 0x012a}, 0x0000, 0x0012}, + {{0x0133, 0x0134, 0x0135, 0x0136, 0x0137}, 0x0000, 0x001e}, + {{0x0139, 0x013a, 0x013b, 0x013c, 0x013d}, 0x0018, 0x000c}, + {{0x013e, 0x0148, 0x0149, 0x014a, 0x014b}, 0x0000, 0x0011}, + {{0x0153, 0x015a, 0x015b, 0x015c, 0x015d}, 0x0000, 0x0015}, + {{0x0178, 0x017b, 0x017c, 0x017d, 0x017e}, 0x0000, 0x002b}, + {{0x0171, 0x0172, 0x0173, 0x0174, 0x0175}, 0x0000, 0x0020}, + {{0x0166, 0x0168, 0x0169, 0x016a, 0x016b}, 0x0000, 0x0019}, + {{0x016c, 0x016d, 0x016e, 0x016f, 0x0170}, 0x0000, 0x0020}, + {{0x0182, 0x0184, 0x0185, 0x0186, 0x0187}, 0x0000, 0x002b}, + {{0x0161, 0x0162, 0x0163, 0x0164, 0x0165}, 0x0000, 0x0019}, + {{0x0179, 0x0334, 0x0335, 0x0336, 0x0337}, 0x0000, 0x0029}, + {{0x0188, 0x0189, 0x018a, 0x018b, 0x018c}, 0x0018, 0x0001}, + {{0x0196, 0x0199, 0x019a, 0x019b, 0x019c}, 0x0000, 0x0023}, + {{0x01a3, 0x01a5, 0x01a6, 0x01a7, 0x01a8}, 0x0000, 0x001c}, + {{0x01ab, 0x01ae, 0x01af, 0x01b0, 0x01b1}, 0x0000, 0x001e}, + {{0x01b2, 0x01b5, 0x01b6, 0x01b7, 0x01b8}, 0x0000, 0x001c}, + {{0x01c1, 0x01d1, 0x01d2, 0x01d3, 0x01d4}, 0x0000, 0x0027}, + {{0x01da, 0x01dd, 0x01de, 0x01df, 0x01e0}, 0x0018, 0x000d}, + {{0x01e1, 0x01e2, 0x01e7, 0x01e8, 0x01e9}, 0x0000, 0x0012}, + {{0x01ec, 0x01f1, 0x01f2, 0x01f3, 0x01f4}, 0x0000, 0x0028}, + {{0x02e4, 0x0330, 0x0331, 0x0332, 0x0333}, 0x0000, 0x0017}, + {{0x0200, 0x0203, 0x0204, 0x0205, 0x0206}, 0x0000, 0x0019}, + {{0x0221, 0x0224, 0x0225, 0x0226, 0x0227}, 0x0000, 0x0020}, + {{0x021a, 0x021d, 0x021e, 0x021f, 0x0220}, 0x0000, 0x0020}, + {{0x0009, 0x0348, 0x0349, 0x034a, 0x034b}, 0x0018, 0x0011}, + {{0x022f, 0x0232, 0x0233, 0x0234, 0x0235}, 0x0000, 0x0022}, + {{0x0228, 0x022b, 0x022c, 0x022d, 0x022e}, 0x0000, 0x0022}, + {{0x025c, 0x025f, 0x0260, 0x0261, 0x0262}, 0x0000, 0x0013}, + {{0x026d, 0x026e, 0x026f, 0x0270, 0x0271}, 0x0018, 0x000b}, + {{0x0273, 0x027c, 0x027d, 0x027e, 0x027f}, 0x0000, 0x001b}, + {{0x0001, 0x0344, 0x0345, 0x0346, 0x0347}, 0x0018, 0x000c}, + {{0x0282, 0x0283, 0x0284, 0x0285, 0x0286}, 0x0018, 0x003e}, + {{0x0291, 0x0292, 0x0293, 0x0294, 0x0294}, 0x0018, 0x002b}, + {{0x0109, 0x0302, 0x0303, 0x0304, 0x0305}, 0x0000, 0x0003}, + {{0x010a, 0x0306, 0x0307, 0x0308, 0x0309}, 0x0000, 0x000b}, + {{0x010b, 0x030a, 0x030b, 0x030c, 0x030d}, 0x0000, 0x0002}, + {{0x010c, 0x030e, 0x030f, 0x0310, 0x0311}, 0x0000, 0x000c}, + {{0x010d, 0x0312, 0x0313, 0x0314, 0x0315}, 0x0000, 0x0000}, + {{0x010e, 0x0316, 0x0317, 0x0318, 0x0319}, 0x0000, 0x0004}, + {{0x010f, 0x031a, 0x031b, 0x031c, 0x031d}, 0x0000, 0x0006}, + {{0x0110, 0x031e, 0x031f, 0x0320, 0x0321}, 0x0000, 0x0007}, + {{0x0105, 0x0105, 0x0105, 0x0105, 0x0105}, 0x0000, 0x0008}, + {{0x0106, 0x0106, 0x0106, 0x0106, 0x0106}, 0x0000, 0x0008}, + {{0x0107, 0x0107, 0x0107, 0x0107, 0x0107}, 0x0000, 0x0008}, + {{0x0108, 0x0108, 0x0108, 0x0108, 0x0108}, 0x0000, 0x0008}, + {{0x014f, 0x014f, 0x014f, 0x014f, 0x014f}, 0x0000, 0x0008}, +}; + +static const u16 sBadgeFlags[8] = +{ + FLAG_BADGE01_GET, FLAG_BADGE02_GET, FLAG_BADGE03_GET, FLAG_BADGE04_GET, + FLAG_BADGE05_GET, FLAG_BADGE06_GET, FLAG_BADGE07_GET, FLAG_BADGE08_GET, +}; + +#define tState data[0] +#define tTransition data[1] + +static void Task_BattleStart(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (tState) + { + case 0: + if (!FieldPoisonEffectIsRunning()) // is poison not active? + { + BattleTransition_StartOnField(tTransition); + sub_81BE72C(); + tState++; // go to case 1. + } + break; + case 1: + if (IsBattleTransitionDone() == TRUE) + { + overworld_free_bg_tilemaps(); + SetMainCallback2(CB2_InitBattle); + prev_quest_postbuffer_cursor_backup_reset(); + ResetPoisonStepCounter(); + DestroyTask(taskId); + } + break; + } +} + +static void CreateBattleStartTask(u8 transition, u16 song) +{ + u8 taskId = CreateTask(Task_BattleStart, 1); + + gTasks[taskId].tTransition = transition; + PlayMapChosenOrBattleBGM(song); +} + +#undef tState +#undef tTransition + +void BattleSetup_StartWildBattle(void) +{ + if (GetSafariZoneFlag()) + DoSafariBattle(); + else + DoStandardWildBattle(); +} + +void BattleSetup_StartBattlePikeWildBattle(void) +{ + DoBattlePikeWildBattle(); +} + +static void DoStandardWildBattle(void) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + sub_808BCF4(); + gMain.savedCallback = CB2_EndWildBattle; + gBattleTypeFlags = 0; + if (InBattlePyramid()) + { + VarSet(VAR_0x400E, 0); + gBattleTypeFlags |= BATTLE_TYPE_PYRAMID; + } + CreateBattleStartTask(GetWildBattleTransition(), 0); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); + sub_80EECC8(); + sub_80B1218(); +} + +void BattleSetup_StartRoamerBattle(void) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + sub_808BCF4(); + gMain.savedCallback = CB2_EndWildBattle; + gBattleTypeFlags = BATTLE_TYPE_ROAMER; + CreateBattleStartTask(GetWildBattleTransition(), 0); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); + sub_80EECC8(); + sub_80B1218(); +} + +static void DoSafariBattle(void) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + sub_808BCF4(); + gMain.savedCallback = CB2_EndSafariBattle; + gBattleTypeFlags = BATTLE_TYPE_SAFARI; + CreateBattleStartTask(GetWildBattleTransition(), 0); +} + +static void DoBattlePikeWildBattle(void) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + sub_808BCF4(); + gMain.savedCallback = CB2_EndWildBattle; + gBattleTypeFlags = BATTLE_TYPE_PIKE; + CreateBattleStartTask(GetWildBattleTransition(), 0); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); + sub_80EECC8(); + sub_80B1218(); +} + +static void DoTrainerBattle(void) +{ + CreateBattleStartTask(GetTrainerBattleTransition(), 0); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_TRAINER_BATTLES); + sub_80B1234(); +} + +static void sub_80B0828(void) +{ + if (InBattlePyramid()) + CreateBattleStartTask(sub_80B100C(10), 0); + else + CreateBattleStartTask(sub_80B100C(11), 0); + + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_TRAINER_BATTLES); + sub_80B1234(); +} + +// Initiates battle where Wally catches Ralts +void 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); + sub_80EECC8(); + sub_80B1218(); +} + +void BattleSetup_StartLatiBattle(void) +{ + ScriptContext2_Enable(); + gMain.savedCallback = CB2_EndScriptedWildBattle; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; + CreateBattleStartTask(GetWildBattleTransition(), 0); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); + sub_80EECC8(); + sub_80B1218(); +} + +void BattleSetup_StartLegendaryBattle(void) +{ + ScriptContext2_Enable(); + gMain.savedCallback = CB2_EndScriptedWildBattle; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; + + switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) + { + default: + case SPECIES_GROUDON: + gBattleTypeFlags |= BATTLE_TYPE_GROUDON; + CreateBattleStartTask(B_TRANSITION_GROUDON, BGM_BATTLE34); + break; + case SPECIES_KYOGRE: + gBattleTypeFlags |= BATTLE_TYPE_KYOGRE; + CreateBattleStartTask(B_TRANSITION_KYOGRE, BGM_BATTLE34); + break; + case SPECIES_RAYQUAZA: + gBattleTypeFlags |= BATTLE_TYPE_RAYQUAZA; + CreateBattleStartTask(B_TRANSITION_RAYQUAZA, BGM_BATTLE_LEGENDARY); + break; + case SPECIES_DEOXYS: + CreateBattleStartTask(B_TRANSITION_BLUR, BGM_FRLG_BATTLE_DEOXYS); + break; + case SPECIES_LUGIA: + case SPECIES_HO_OH: + CreateBattleStartTask(B_TRANSITION_BLUR, BGM_FRLG_BATTLE_LEGENDARY); + break; + case SPECIES_MEW: + CreateBattleStartTask(B_TRANSITION_GRID_SQUARES, BGM_BATTLE_MEW); + break; + } + + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); + sub_80EECC8(); + sub_80B1218(); +} + +void StartGroudonKyogreBattle(void) +{ + ScriptContext2_Enable(); + gMain.savedCallback = CB2_EndScriptedWildBattle; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON; + + if (gGameVersion == VERSION_RUBY) + CreateBattleStartTask(B_TRANSITION_SHARDS, BGM_BATTLE34); // GROUDON + else + CreateBattleStartTask(B_TRANSITION_RIPPLE, BGM_BATTLE34); // KYOGRE + + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); + sub_80EECC8(); + sub_80B1218(); +} + +void StartRegiBattle(void) +{ + u8 transitionId; + u16 species; + + ScriptContext2_Enable(); + gMain.savedCallback = CB2_EndScriptedWildBattle; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI; + + species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES); + switch (species) + { + case SPECIES_REGIROCK: + transitionId = B_TRANSITION_REGIROCK; + break; + case SPECIES_REGICE: + transitionId = B_TRANSITION_REGICE; + break; + case SPECIES_REGISTEEL: + transitionId = B_TRANSITION_REGISTEEL; + break; + default: + transitionId = B_TRANSITION_GRID_SQUARES; + break; + } + CreateBattleStartTask(transitionId, BGM_BATTLE36); + + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); + sub_80EECC8(); + sub_80B1218(); +} + +static void CB2_EndWildBattle(void) +{ + CpuFill16(0, (void*)(BG_PLTT), BG_PLTT_SIZE); + ResetOamRange(0, 128); + + if (IsPlayerDefeated(gBattleOutcome) == TRUE && !InBattlePyramid() && !InBattlePike()) + { + SetMainCallback2(CB2_WhiteOut); + } + else + { + SetMainCallback2(c2_exit_to_overworld_2_switch); + gFieldCallback = sub_80AF6F0; + } +} + +static void CB2_EndScriptedWildBattle(void) +{ + CpuFill16(0, (void*)(BG_PLTT), BG_PLTT_SIZE); + ResetOamRange(0, 128); + + if (IsPlayerDefeated(gBattleOutcome) == TRUE) + { + if (InBattlePyramid()) + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + else + SetMainCallback2(CB2_WhiteOut); + } + else + { + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + } +} + +u8 BattleSetup_GetTerrainId(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_IsMB_0B(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_IsDeepOrOceanWater(tileBehavior)) + return BATTLE_TERRAIN_WATER; + if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) + return BATTLE_TERRAIN_POND; + if (MetatileBehavior_IsMountain(tileBehavior)) + return BATTLE_TERRAIN_MOUNTAIN; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + { + if (MetatileBehavior_GetBridgeSth(tileBehavior)) + return BATTLE_TERRAIN_POND; + if (MetatileBehavior_IsBridge(tileBehavior) == TRUE) + return BATTLE_TERRAIN_WATER; + } + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE113) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE113)) + return BATTLE_TERRAIN_SAND; + if (GetSav1Weather() == 8) + return BATTLE_TERRAIN_SAND; + + return BATTLE_TERRAIN_PLAIN; +} + +static u8 GetBattleTransitionTypeByMap(void) +{ + u16 tileBehavior; + s16 x, y; + + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (Overworld_GetFlashLevel()) + return B_TRANSITION_SHUFFLE; + if (!MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) + { + switch (gMapHeader.mapType) + { + case MAP_TYPE_UNDERGROUND: + return B_TRANSITION_SWIRL; + case MAP_TYPE_UNDERWATER: + return B_TRANSITION_BIG_POKEBALL; + default: + return B_TRANSITION_BLUR; + } + } + return B_TRANSITION_BIG_POKEBALL; +} + +static u16 GetSumOfPlayerPartyLevel(u8 numMons) +{ + u8 sum = 0; + int i; + + for (i = 0; i < PARTY_SIZE; 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); + 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].lvl; + } + 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].lvl; + } + 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].lvl; + } + 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].lvl; + } + 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) + { + if (InBattlePyramid()) + return B_TRANSITION_BLUR; + else + return sBattleTransitionTable_Wild[transitionType][0]; + } + else + { + if (InBattlePyramid()) + return B_TRANSITION_GRID_SQUARES; + else + return sBattleTransitionTable_Wild[transitionType][1]; + } +} + +static u8 GetTrainerBattleTransition(void) +{ + u8 minPartyCount; + u8 transitionType; + u8 enemyLevel; + u8 playerLevel; + + if (gTrainerBattleOpponent_A == SECRET_BASE_OPPONENT) + return B_TRANSITION_CHAMPION; + + if (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR) + { + if (gTrainerBattleOpponent_A == TRAINER_SIDNEY) + return B_TRANSITION_SYDNEY; + if (gTrainerBattleOpponent_A == TRAINER_PHOEBE) + return B_TRANSITION_PHOEBE; + if (gTrainerBattleOpponent_A == TRAINER_GLACIA) + return B_TRANSITION_GLACIA; + if (gTrainerBattleOpponent_A == TRAINER_DRAKE) + return B_TRANSITION_DRAKE; + return B_TRANSITION_CHAMPION; + } + + if (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION) + return B_TRANSITION_CHAMPION; + + if (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_TEAM_MAGMA + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_MAGMA_LEADER + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_MAGMA_ADMIN) + return B_TRANSITION_MAGMA; + + if (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_TEAM_AQUA + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_AQUA_LEADER + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_AQUA_ADMIN) + return B_TRANSITION_AQUA; + + if (gTrainers[gTrainerBattleOpponent_A].doubleBattle == TRUE) + minPartyCount = 2; // double battles always at least have 2 pokemon. + else + minPartyCount = 1; + + transitionType = GetBattleTransitionTypeByMap(); + enemyLevel = GetSumOfEnemyPartyLevel(gTrainerBattleOpponent_A, minPartyCount); + playerLevel = GetSumOfPlayerPartyLevel(minPartyCount); + + if (enemyLevel < playerLevel) + return sBattleTransitionTable_Trainer[transitionType][0]; + else + return sBattleTransitionTable_Trainer[transitionType][1]; +} + +u8 sub_80B100C(s32 arg0) +{ + u16 var; + u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); + u8 playerLevel = GetSumOfPlayerPartyLevel(1); + + if (enemyLevel < playerLevel) + { + switch (arg0) + { + case 11: + case 12: + case 13: + return B_TRANSITION_POKEBALLS_TRAIL; + case 10: + return sUnknown_0854FEA4[Random() % ARRAY_COUNT(sUnknown_0854FEA4)]; + case 3: + return sUnknown_0854FEA7[Random() % ARRAY_COUNT(sUnknown_0854FEA7)]; + } + + if (VarGet(VAR_0x40CE) != 3) + return sUnknown_0854FE98[Random() % ARRAY_COUNT(sUnknown_0854FE98)]; + } + else + { + switch (arg0) + { + case 11: + case 12: + case 13: + return B_TRANSITION_BIG_POKEBALL; + case 10: + return sUnknown_0854FEA4[Random() % ARRAY_COUNT(sUnknown_0854FEA4)]; + case 3: + return sUnknown_0854FEA7[Random() % ARRAY_COUNT(sUnknown_0854FEA7)]; + } + + if (VarGet(VAR_0x40CE) != 3) + return sUnknown_0854FE98[Random() % ARRAY_COUNT(sUnknown_0854FE98)]; + } + + var = gSaveBlock2Ptr->field_CB4[gSaveBlock2Ptr->battlePyramidWildHeaderId * 2 + 0] + + gSaveBlock2Ptr->field_CB4[gSaveBlock2Ptr->battlePyramidWildHeaderId * 2 + 1]; + + return sUnknown_0854FE98[var % ARRAY_COUNT(sUnknown_0854FE98)]; +} + +void ChooseStarter(void) +{ + SetMainCallback2(CB2_ChooseStarter); + gMain.savedCallback = CB2_GiveStarter; +} + +static void CB2_GiveStarter(void) +{ + u16 starterMon; + + *GetVarPointer(VAR_FIRST_POKE) = gSpecialVar_Result; + starterMon = GetStarterPokemon(gSpecialVar_Result); + ScriptGiveMon(starterMon, 5, 0, 0, 0, 0); + ResetTasks(); + PlayBattleBGM(); + SetMainCallback2(CB2_StartFirstBattle); + BattleTransition_Start(B_TRANSITION_BLUR); +} + +static void CB2_StartFirstBattle(void) +{ + UpdatePaletteFade(); + RunTasks(); + + if (IsBattleTransitionDone() == TRUE) + { + gBattleTypeFlags = BATTLE_TYPE_FIRST_BATTLE; + gMain.savedCallback = CB2_EndFirstBattle; + FreeAllWindowBuffers(); + SetMainCallback2(CB2_InitBattle); + prev_quest_postbuffer_cursor_backup_reset(); + ResetPoisonStepCounter(); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); + sub_80EECC8(); + sub_80B1218(); + } +} + +static void CB2_EndFirstBattle(void) +{ + Overworld_ClearSavedMusic(); + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +static void sub_80B1218(void) +{ + if (GetGameStat(GAME_STAT_WILD_BATTLES) % 60 == 0) + sub_81DA57C(); +} + +static void sub_80B1234(void) +{ + if (GetGameStat(GAME_STAT_TRAINER_BATTLES) % 20 == 0) + sub_81DA57C(); +} + +// 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 GetTrainerAFlag(void) +{ + return FLAG_TRAINER_FLAG_START + gTrainerBattleOpponent_A; +} + +static u16 GetTrainerBFlag(void) +{ + return FLAG_TRAINER_FLAG_START + gTrainerBattleOpponent_B; +} + +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; + } +} + +void ResetTrainerOpponentIds(void) +{ + gTrainerBattleOpponent_A = 0; + gTrainerBattleOpponent_B = 0; +} + +static void InitTrainerBattleVariables(void) +{ + sTrainerBattleMode = 0; + if (gApproachingTrainerId == 0) + { + sTrainerAIntroSpeech = NULL; + sTrainerADefeatSpeech = NULL; + sTrainerABattleScriptRetAddr = NULL; + } + else + { + sTrainerBIntroSpeech = NULL; + sTrainerBDefeatSpeech = NULL; + sTrainerBBattleScriptRetAddr = NULL; + } + sTrainerMapObjectLocalId = 0; + sTrainerVictorySpeech = NULL; + sTrainerCannotBattleSpeech = NULL; + sTrainerBattleEndScript = NULL; +} + +static inline void SetU8(void *ptr, u8 value) +{ + *(u8*)(ptr) = value; +} + +static inline void SetU16(void *ptr, u16 value) +{ + *(u16*)(ptr) = value; +} + +static inline void SetU32(void *ptr, u32 value) +{ + *(u32*)(ptr) = value; +} + +static inline void SetPtr(const void *ptr, const void* value) +{ + *(const void**)(ptr) = value; +} + +static void TrainerBattleLoadArgs(const struct TrainerBattleParameter *specs, const u8 *data) +{ + while (1) + { + switch (specs->ptrType) + { + case TRAINER_PARAM_LOAD_VAL_8BIT: + SetU8(specs->varPtr, TrainerBattleLoadArg8(data)); + data += 1; + break; + case TRAINER_PARAM_LOAD_VAL_16BIT: + SetU16(specs->varPtr, TrainerBattleLoadArg16(data)); + data += 2; + break; + case TRAINER_PARAM_LOAD_VAL_32BIT: + SetU32(specs->varPtr, TrainerBattleLoadArg32(data)); + data += 4; + break; + case TRAINER_PARAM_CLEAR_VAL_8BIT: + SetU8(specs->varPtr, 0); + break; + case TRAINER_PARAM_CLEAR_VAL_16BIT: + SetU16(specs->varPtr, 0); + break; + case TRAINER_PARAM_CLEAR_VAL_32BIT: + SetU32(specs->varPtr, 0); + break; + case TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR: + SetPtr(specs->varPtr, data); + return; + } + specs++; + } +} + +void SetMapVarsToTrainer(void) +{ + if (sTrainerMapObjectLocalId != 0) + { + gSpecialVar_LastTalked = sTrainerMapObjectLocalId; + gSelectedMapObject = GetFieldObjectIdByLocalIdAndMap(sTrainerMapObjectLocalId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + } +} + +const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) +{ + InitTrainerBattleVariables(); + sTrainerBattleMode = TrainerBattleLoadArg8(data); + + switch (sTrainerBattleMode) + { + case 3: + TrainerBattleLoadArgs(sOrdinaryNoIntroBattleParams, data); + return EventScript_2713C2; + case 4: + TrainerBattleLoadArgs(sDoubleBattleParams, data); + SetMapVarsToTrainer(); + return EventScript_TryDoDoubleTrainerBattle; + case 2: + if (gApproachingTrainerId == 0) + { + TrainerBattleLoadArgs(sContinueScriptBattleParams, data); + SetMapVarsToTrainer(); + } + else + { + TrainerBattleLoadArgs(sTrainerBContinueScriptBattleParams, data); + } + return EventScript_271362; + case 1: + TrainerBattleLoadArgs(sContinueScriptBattleParams, data); + SetMapVarsToTrainer(); + return EventScript_271362; + case 6: + case 8: + TrainerBattleLoadArgs(sContinueScriptDoubleBattleParams, data); + SetMapVarsToTrainer(); + return EventScript_TryDoDoubleTrainerBattle; + case 7: + TrainerBattleLoadArgs(sDoubleBattleParams, data); + SetMapVarsToTrainer(); + gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); + return EventScript_TryDoDoubleRematchBattle; + case 5: + TrainerBattleLoadArgs(sOrdinaryBattleParams, data); + SetMapVarsToTrainer(); + gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); + return EventScript_2713D1; + case 9: + if (gApproachingTrainerId == 0) + { + TrainerBattleLoadArgs(sOrdinaryBattleParams, data); + SetMapVarsToTrainer(); + gTrainerBattleOpponent_A = sub_81A9AA8(gSpecialVar_LastTalked); + } + else + { + TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); + gTrainerBattleOpponent_B = sub_81A9AA8(gSpecialVar_LastTalked); + } + return EventScript_271362; + case 10: + TrainerBattleLoadArgs(sOrdinaryBattleParams, data); + return NULL; + case 11: + TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); + return NULL; + case 12: + if (gApproachingTrainerId == 0) + { + TrainerBattleLoadArgs(sOrdinaryBattleParams, data); + SetMapVarsToTrainer(); + gTrainerBattleOpponent_A = sub_81D6180(gSpecialVar_LastTalked); + } + else + { + TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); + gTrainerBattleOpponent_B = sub_81D6180(gSpecialVar_LastTalked); + } + return EventScript_271362; + default: + if (gApproachingTrainerId == 0) + { + TrainerBattleLoadArgs(sOrdinaryBattleParams, data); + SetMapVarsToTrainer(); + } + else + { + TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); + } + return EventScript_271362; + } +} + +void ConfigureAndSetUpOneTrainerBattle(u8 trainerMapObjId, const u8 *trainerScript) +{ + gSelectedMapObject = trainerMapObjId; + gSpecialVar_LastTalked = gMapObjects[trainerMapObjId].localId; + BattleSetup_ConfigureTrainerBattle(trainerScript + 1); + ScriptContext1_SetupScript(EventScript_271354); + ScriptContext2_Enable(); +} + +void ConfigureTwoTrainersBattle(u8 trainerMapObjId, const u8 *trainerScript) +{ + gSelectedMapObject = trainerMapObjId; + gSpecialVar_LastTalked = gMapObjects[trainerMapObjId].localId; + BattleSetup_ConfigureTrainerBattle(trainerScript + 1); +} + +void SetUpTwoTrainersBattle(void) +{ + ScriptContext1_SetupScript(EventScript_271354); + ScriptContext2_Enable(); +} + +bool32 GetTrainerFlagFromScriptPointer(const u8 *data) +{ + u32 flag = TrainerBattleLoadArg16(data + 2); + return FlagGet(FLAG_TRAINER_FLAG_START + flag); +} + +void sub_80B16D8(void) +{ + struct MapObject *mapObject = &gMapObjects[gSelectedMapObject]; + + npc_set_running_behaviour_etc(mapObject, npc_running_behaviour_by_direction(mapObject->mapobj_unk_18)); +} + +u8 GetTrainerBattleMode(void) +{ + return sTrainerBattleMode; +} + +bool8 GetTrainerFlag(void) +{ + if (InBattlePyramid()) + return GetBattlePyramidTrainerFlag(gSelectedMapObject); + else if (InTrainerHill()) + return GetTrainerHillTrainerFlag(gSelectedMapObject); + else + return FlagGet(GetTrainerAFlag()); +} + +static void SetBattledTrainersFlags(void) +{ + if (gTrainerBattleOpponent_B != 0) + FlagSet(GetTrainerBFlag()); + FlagSet(GetTrainerAFlag()); +} + +static void SetBattledTrainerFlag(void) +{ + FlagSet(GetTrainerAFlag()); +} + +bool8 HasTrainerBeenFought(u16 trainerId) +{ + return FlagGet(FLAG_TRAINER_FLAG_START + trainerId); +} + +void SetTrainerFlag(u16 trainerId) +{ + FlagSet(FLAG_TRAINER_FLAG_START + trainerId); +} + +void ClearTrainerFlag(u16 trainerId) +{ + FlagClear(FLAG_TRAINER_FLAG_START + trainerId); +} + +void BattleSetup_StartTrainerBattle(void) +{ + if (gNoOfApproachingTrainers == 2) + gBattleTypeFlags = (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TRAINER); + else + gBattleTypeFlags = (BATTLE_TYPE_TRAINER); + + if (InBattlePyramid()) + { + VarSet(VAR_0x400E, 0); + gBattleTypeFlags |= BATTLE_TYPE_PYRAMID; + + if (gNoOfApproachingTrainers == 2) + { + sub_816306C(1); + ZeroMonData(&gEnemyParty[1]); + ZeroMonData(&gEnemyParty[2]); + ZeroMonData(&gEnemyParty[4]); + ZeroMonData(&gEnemyParty[5]); + } + else + { + sub_8163048(1); + ZeroMonData(&gEnemyParty[1]); + ZeroMonData(&gEnemyParty[2]); + } + + sub_81A9B04(); + } + else if (sub_81D5C18()) + { + gBattleTypeFlags |= BATTLE_TYPE_x4000000; + + if (gNoOfApproachingTrainers == 2) + sub_81D639C(); + else + sub_81D6384(); + + sub_81D61E8(); + } + + sNoOfPossibleTrainerRetScripts = gNoOfApproachingTrainers; + gNoOfApproachingTrainers = 0; + sShouldCheckTrainerBScript = FALSE; + gUnknown_03006080 = 0; + gMain.savedCallback = CB2_EndTrainerBattle; + + if (InBattlePyramid() || sub_81D5C18()) + sub_80B0828(); + else + DoTrainerBattle(); + + ScriptContext1_Stop(); +} + +static void CB2_EndTrainerBattle(void) +{ + if (gTrainerBattleOpponent_A == SECRET_BASE_OPPONENT) + { + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + } + else if (IsPlayerDefeated(gBattleOutcome) == TRUE) + { + if (InBattlePyramid() || sub_81D5C18()) + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + else + SetMainCallback2(CB2_WhiteOut); + } + else + { + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + if (!InBattlePyramid() && !sub_81D5C18()) + { + RegisterTrainerInMatchCall(); + SetBattledTrainersFlags(); + } + } +} + +static void CB2_EndRematchBattle(void) +{ + if (gTrainerBattleOpponent_A == 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); + RegisterTrainerInMatchCall(); + SetBattledTrainersFlags(); + HandleRematchVarsOnBattleEnd(); + } +} + +void BattleSetup_StartRematchBattle(void) +{ + gBattleTypeFlags = BATTLE_TYPE_TRAINER; + gMain.savedCallback = CB2_EndRematchBattle; + DoTrainerBattle(); + ScriptContext1_Stop(); +} + +void ShowTrainerIntroSpeech(void) +{ + if (InBattlePyramid()) + { + if (gNoOfApproachingTrainers == 0 || gNoOfApproachingTrainers == 1) + sub_81A9EDC(sub_81A9AA8(gSpecialVar_LastTalked)); + else + sub_81A9EDC(sub_81A9AA8(gMapObjects[gApproachingTrainers[gApproachingTrainerId].mapObjectId].localId)); + + sub_80982B8(); + } + else if (sub_81D5C18()) + { + if (gNoOfApproachingTrainers == 0 || gNoOfApproachingTrainers == 1) + sub_81D572C(2, sub_81D6180(gSpecialVar_LastTalked)); + else + sub_81D572C(2, sub_81D6180(gMapObjects[gApproachingTrainers[gApproachingTrainerId].mapObjectId].localId)); + + sub_80982B8(); + } + else + { + ShowFieldMessage(GetIntroSpeechOfApproachingTrainer()); + } +} + +const u8 *BattleSetup_GetScriptAddrAfterBattle(void) +{ + if (sTrainerBattleEndScript != NULL) + return sTrainerBattleEndScript; + else + return EventScript_TestSignpostMsg; +} + +const u8 *BattleSetup_GetTrainerPostBattleScript(void) +{ + if (sShouldCheckTrainerBScript) + { + sShouldCheckTrainerBScript = FALSE; + if (sTrainerBBattleScriptRetAddr != NULL) + { + gUnknown_03006080 = 1; + return sTrainerBBattleScriptRetAddr; + } + } + else + { + if (sTrainerABattleScriptRetAddr != NULL) + { + gUnknown_03006080 = 0; + return sTrainerABattleScriptRetAddr; + } + } + + return EventScript_TryGetTrainerScript; +} + +void ShowTrainerCantBattleSpeech(void) +{ + ShowFieldMessage(GetTrainerCantBattleSpeech()); +} + +void SetUpTrainerEncounterMusic(void) +{ + u16 trainerId; + u16 music; + + if (gApproachingTrainerId == 0) + trainerId = gTrainerBattleOpponent_A; + else + trainerId = gTrainerBattleOpponent_B; + + if (sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC + && sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC) + { + switch (GetTrainerEncounterMusicId(trainerId)) + { + case TRAINER_ENCOUNTER_MUSIC_MALE: + music = BGM_BOYEYE; + break; + case TRAINER_ENCOUNTER_MUSIC_FEMALE: + music = BGM_GIRLEYE; + break; + case TRAINER_ENCOUNTER_MUSIC_GIRL: + music = BGM_SYOUJOEYE; + break; + case TRAINER_ENCOUNTER_MUSIC_INTENSE: + music = BGM_HAGESHII; + break; + case TRAINER_ENCOUNTER_MUSIC_COOL: + music = BGM_KAKKOII; + break; + case TRAINER_ENCOUNTER_MUSIC_AQUA: + music = BGM_AQA_0; + break; + case TRAINER_ENCOUNTER_MUSIC_MAGMA: + music = BGM_MGM0; + break; + case TRAINER_ENCOUNTER_MUSIC_SWIMMER: + music = BGM_SWIMEYE; + break; + case TRAINER_ENCOUNTER_MUSIC_TWINS: + music = BGM_HUTAGO; + break; + case TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR: + music = BGM_SITENNOU; + break; + case TRAINER_ENCOUNTER_MUSIC_HIKER: + music = BGM_YAMA_EYE; + break; + case TRAINER_ENCOUNTER_MUSIC_INTERVIEWER: + music = BGM_INTER_V; + break; + case TRAINER_ENCOUNTER_MUSIC_RICH: + music = BGM_TEST; + break; + default: + music = BGM_AYASII; + } + PlayNewMapMusic(music); + } +} + +static const u8 *ReturnEmptyStringIfNull(const u8 *string) +{ + if (string == NULL) + return gText_EmptyString2; + else + return string; +} + +static const u8 *GetIntroSpeechOfApproachingTrainer(void) +{ + if (gApproachingTrainerId == 0) + return ReturnEmptyStringIfNull(sTrainerAIntroSpeech); + else + return ReturnEmptyStringIfNull(sTrainerBIntroSpeech); +} + +const u8 *GetTrainerALoseText(void) +{ + const u8 *string; + + if (gTrainerBattleOpponent_A == SECRET_BASE_OPPONENT) + string = GetSecretBaseTrainerLoseText(); + else + string = sTrainerADefeatSpeech; + + StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(string)); + return gStringVar4; +} + +const u8 *GetTrainerBLoseText(void) +{ + StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(sTrainerBDefeatSpeech)); + return gStringVar4; +} + +const u8 *GetTrainerWonSpeech(void) +{ + return ReturnEmptyStringIfNull(sTrainerVictorySpeech); +} + +static const u8 *GetTrainerCantBattleSpeech(void) +{ + return ReturnEmptyStringIfNull(sTrainerCannotBattleSpeech); +} + +static s32 FirstBattleTrainerIdToRematchTableId(const struct RematchTrainer *table, u16 trainerId) +{ + s32 i; + + for (i = 0; i < REMATCH_TABLE_ENTRIES; i++) + { + if (table[i].trainerIds[0] == trainerId) + return i; + } + + return -1; +} + +static s32 TrainerIdToRematchTableId(const struct RematchTrainer *table, u16 trainerId) +{ + s32 i, j; + + for (i = 0; i < REMATCH_TABLE_ENTRIES; i++) + { + for (j = 0; j < REMATCHES_COUNT; j++) + { + if (table[i].trainerIds[j] == 0) + break; + if (table[i].trainerIds[j] == trainerId) + return i; + } + } + + return -1; +} + +static bool32 sub_80B1D94(s32 rematchTableId) +{ + if (rematchTableId >= REMATCH_ELITE_FOUR_ENTRIES) + return TRUE; + else if (rematchTableId == REMATCH_WALLY_ENTRY) + return (FlagGet(FLAG_0x07E) == FALSE); + else + return FALSE; +} + +static void SetRematchIdForTrainer(const struct RematchTrainer *table, u32 tableId) +{ + s32 i; + + for (i = 1; i < REMATCHES_COUNT; i++) + { + u16 trainerId = table[tableId].trainerIds[i]; + + if (trainerId == 0) + break; + if (!HasTrainerBeenFought(trainerId)) + break; + } + + gSaveBlock1Ptr->trainerRematches[tableId] = i; +} + +static bool32 UpdateRandomTrainerRematches(const struct RematchTrainer *table, u16 mapGroup, u16 mapNum) +{ + s32 i; + bool32 ret = FALSE; + + for (i = 0; i <= REMATCH_WALLY_ENTRY; i++) + { + if (table[i].mapGroup == mapGroup && table[i].mapNum == mapNum && !sub_80B1D94(i)) + { + if (gSaveBlock1Ptr->trainerRematches[i] != 0) + { + // Trainer already wants a rematch. Don't bother updating it + ret = TRUE; + } + else if (FlagGet(FLAG_MATCH_CALL_REGISTERED + i) + && (Random() % 100) <= 30) // 31% chance of getting a rematch + { + SetRematchIdForTrainer(table, i); + ret = TRUE; + } + } + } + + return ret; +} + +void UpdateRematchIfDefeated(s32 rematchTableId) +{ + if (HasTrainerBeenFought(gRematchTable[rematchTableId].trainerIds[0]) == TRUE) + SetRematchIdForTrainer(gRematchTable, rematchTableId); +} + +static bool32 DoesSomeoneWantRematchIn_(const struct RematchTrainer *table, u16 mapGroup, u16 mapNum) +{ + s32 i; + + for (i = 0; i < REMATCH_TABLE_ENTRIES; i++) + { + if (table[i].mapGroup == mapGroup && table[i].mapNum == mapNum && gSaveBlock1Ptr->trainerRematches[i] != 0) + return TRUE; + } + + return FALSE; +} + +static bool32 IsRematchTrainerIn_(const struct RematchTrainer *table, u16 mapGroup, u16 mapNum) +{ + s32 i; + + for (i = 0; i < REMATCH_TABLE_ENTRIES; i++) + { + if (table[i].mapGroup == mapGroup && table[i].mapNum == mapNum) + return TRUE; + } + + return FALSE; +} + +static bool8 IsFirstTrainerIdReadyForRematch(const struct RematchTrainer *table, u16 firstBattleTrainerId) +{ + s32 tableId = FirstBattleTrainerIdToRematchTableId(table, firstBattleTrainerId); + + if (tableId == -1) + return FALSE; + if (tableId >= 100) + return FALSE; + if (gSaveBlock1Ptr->trainerRematches[tableId] == 0) + return FALSE; + + return TRUE; +} + +static bool8 IsTrainerReadyForRematch_(const struct RematchTrainer *table, u16 trainerId) +{ + s32 tableId = TrainerIdToRematchTableId(table, trainerId); + + if (tableId == -1) + return FALSE; + if (tableId >= 100) + return FALSE; + if (gSaveBlock1Ptr->trainerRematches[tableId] == 0) + return FALSE; + + return TRUE; +} + +static u16 GetRematchTrainerIdFromTable(const struct RematchTrainer *table, u16 firstBattleTrainerId) +{ + const struct RematchTrainer *trainerEntry; + s32 i; + s32 tableId = FirstBattleTrainerIdToRematchTableId(table, firstBattleTrainerId); + + if (tableId == -1) + return FALSE; + + trainerEntry = &table[tableId]; + for (i = 1; i < REMATCHES_COUNT; i++) + { + if (trainerEntry->trainerIds[i] == 0) // previous entry was this trainer's last one + return trainerEntry->trainerIds[i - 1]; + if (!HasTrainerBeenFought(trainerEntry->trainerIds[i])) + return trainerEntry->trainerIds[i]; + } + + return trainerEntry->trainerIds[REMATCHES_COUNT - 1]; // already beaten at max stage +} + +static u16 GetLastBeatenRematchTrainerIdFromTable(const struct RematchTrainer *table, u16 firstBattleTrainerId) +{ + const struct RematchTrainer *trainerEntry; + s32 i; + s32 tableId = FirstBattleTrainerIdToRematchTableId(table, firstBattleTrainerId); + + if (tableId == -1) + return FALSE; + + trainerEntry = &table[tableId]; + for (i = 1; i < REMATCHES_COUNT; i++) + { + if (trainerEntry->trainerIds[i] == 0) // previous entry was this trainer's last one + return trainerEntry->trainerIds[i - 1]; + if (!HasTrainerBeenFought(trainerEntry->trainerIds[i])) + return trainerEntry->trainerIds[i - 1]; + } + + return trainerEntry->trainerIds[REMATCHES_COUNT - 1]; // already beaten at max stage +} + +static void ClearTrainerWantRematchState(const struct RematchTrainer *table, u16 firstBattleTrainerId) +{ + s32 tableId = TrainerIdToRematchTableId(table, firstBattleTrainerId); + + if (tableId != -1) + gSaveBlock1Ptr->trainerRematches[tableId] = 0; +} + +static u32 GetTrainerMatchCallFlag(u32 trainerId) +{ + s32 i; + + for (i = 0; i < REMATCH_TABLE_ENTRIES; i++) + { + if (gRematchTable[i].trainerIds[0] == trainerId) + return FLAG_MATCH_CALL_REGISTERED + i; + } + + return 0xFFFF; +} + +static void RegisterTrainerInMatchCall(void) +{ + if (FlagGet(FLAG_HAS_MATCH_CALL)) + { + u32 matchCallFlagId = GetTrainerMatchCallFlag(gTrainerBattleOpponent_A); + if (matchCallFlagId != 0xFFFF) + FlagSet(matchCallFlagId); + } +} + +static bool8 WasSecondRematchWon(const struct RematchTrainer *table, u16 firstBattleTrainerId) +{ + s32 tableId = FirstBattleTrainerIdToRematchTableId(table, firstBattleTrainerId); + + if (tableId == -1) + return FALSE; + if (!HasTrainerBeenFought(table[tableId].trainerIds[1])) + return FALSE; + + return TRUE; +} + +static bool32 HasAtLeastFiveBadges(void) +{ + s32 i, count; + + for (count = 0, i = 0; i < ARRAY_COUNT(sBadgeFlags); i++) + { + if (FlagGet(sBadgeFlags[i]) == TRUE) + { + if (++count >= 5) + return TRUE; + } + } + + return FALSE; +} + +#define STEP_COUNTER_MAX 255 + +void IncrementRematchStepCounter(void) +{ + if (HasAtLeastFiveBadges()) + { + if (gSaveBlock1Ptr->trainerRematchStepCounter >= STEP_COUNTER_MAX) + gSaveBlock1Ptr->trainerRematchStepCounter = STEP_COUNTER_MAX; + else + gSaveBlock1Ptr->trainerRematchStepCounter++; + } +} + +static bool32 IsRematchStepCounterMaxed(void) +{ + if (HasAtLeastFiveBadges() && gSaveBlock1Ptr->trainerRematchStepCounter >= STEP_COUNTER_MAX) + return TRUE; + else + return FALSE; +} + +void TryUpdateRandomTrainerRematches(u16 mapGroup, u16 mapNum) +{ + if (IsRematchStepCounterMaxed() && UpdateRandomTrainerRematches(gRematchTable, mapGroup, mapNum) == TRUE) + gSaveBlock1Ptr->trainerRematchStepCounter = 0; +} + +bool32 DoesSomeoneWantRematchIn(u16 mapGroup, u16 mapNum) +{ + return DoesSomeoneWantRematchIn_(gRematchTable, mapGroup, mapNum); +} + +bool32 IsRematchTrainerIn(u16 mapGroup, u16 mapNum) +{ + return IsRematchTrainerIn_(gRematchTable, mapGroup, mapNum); +} + +static u16 GetRematchTrainerId(u16 trainerId) +{ + return GetRematchTrainerIdFromTable(gRematchTable, trainerId); +} + +u16 GetLastBeatenRematchTrainerId(u16 trainerId) +{ + return GetLastBeatenRematchTrainerIdFromTable(gRematchTable, trainerId); +} + +bool8 ShouldTryRematchBattle(void) +{ + if (IsFirstTrainerIdReadyForRematch(gRematchTable, gTrainerBattleOpponent_A)) + return TRUE; + + return WasSecondRematchWon(gRematchTable, gTrainerBattleOpponent_A); +} + +bool8 IsTrainerReadyForRematch(void) +{ + return IsTrainerReadyForRematch_(gRematchTable, gTrainerBattleOpponent_A); +} + +static void HandleRematchVarsOnBattleEnd(void) +{ + ClearTrainerWantRematchState(gRematchTable, gTrainerBattleOpponent_A); + SetBattledTrainersFlags(); +} + +void ShouldTryGetTrainerScript(void) +{ + if (sNoOfPossibleTrainerRetScripts > 1) + { + sNoOfPossibleTrainerRetScripts = 0; + sShouldCheckTrainerBScript = TRUE; + gSpecialVar_Result = TRUE; + } + else + { + sShouldCheckTrainerBScript = FALSE; + gSpecialVar_Result = FALSE; + } +} + +u16 CountBattledRematchTeams(u16 trainerId) +{ + s32 i; + + if (HasTrainerBeenFought(gRematchTable[trainerId].trainerIds[0]) != TRUE) + return 0; + + for (i = 1; i < REMATCHES_COUNT; i++) + { + if (gRematchTable[trainerId].trainerIds[i] == 0) + break; + if (!HasTrainerBeenFought(gRematchTable[trainerId].trainerIds[i])) + break; + } + + return i; +} diff --git a/src/battle_util.c b/src/battle_util.c index ed3bdef98..1a624641d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1,27 +1,30 @@ #include "global.h" #include "battle.h" -#include "abilities.h" -#include "moves.h" -#include "hold_effects.h" +#include "constants/abilities.h" +#include "constants/moves.h" +#include "constants/hold_effects.h" #include "pokemon.h" -#include "species.h" +#include "constants/species.h" #include "item.h" -#include "items.h" +#include "constants/items.h" #include "util.h" -#include "battle_move_effects.h" -#include "rng.h" +#include "constants/battle_move_effects.h" +#include "battle_scripts.h" +#include "random.h" #include "text.h" #include "string_util.h" #include "battle_message.h" +#include "battle_string_ids.h" #include "battle_ai_script_commands.h" #include "battle_controllers.h" #include "event_data.h" #include "calculate_base_damage.h" #include "link.h" +#include "berry.h" extern const u8* gBattlescriptCurrInstr; -extern const u8* gBattlescriptPtrsForSelection[BATTLE_BANKS_COUNT]; -extern const u8* gUnknown_02024230[BATTLE_BANKS_COUNT]; +extern const u8* gSelectionBattleScripts[BATTLE_BANKS_COUNT]; +extern const u8* gPalaceSelectionBattleScripts[BATTLE_BANKS_COUNT]; extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT]; extern u8 gActiveBank; extern u8 gStringBank; @@ -41,7 +44,7 @@ extern s32 gBattleMoveDamage; extern struct BattleEnigmaBerry gEnigmaBerries[BATTLE_BANKS_COUNT]; extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200]; extern u32 gBattleTypeFlags; -extern u16 gLastUsedMovesByBanks[BATTLE_BANKS_COUNT]; +extern u16 gLastMoves[BATTLE_BANKS_COUNT]; extern u32 gHitMarker; extern u8 gEffectBank; extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; @@ -60,119 +63,6 @@ extern u8 gSentPokesToOpponent[2]; extern const struct BattleMove gBattleMoves[]; -// scripts -extern const u8 gUnknown_082DAE2A[]; -extern const u8 gUnknown_082DAE1F[]; -extern const u8 gUnknown_082DB089[]; -extern const u8 gUnknown_082DB098[]; -extern const u8 gUnknown_082DB0AF[]; -extern const u8 gUnknown_082DB0A0[]; -extern const u8 gUnknown_082DB185[]; -extern const u8 gUnknown_082DB181[]; -extern const u8 gUnknown_082DB812[]; -extern const u8 gUnknown_082DB076[]; -extern const u8 BattleScript_NoMovesLeft[]; -extern const u8 gUnknown_082DACFA[]; -extern const u8 gUnknown_082DAD0B[]; -extern const u8 gUnknown_082DACC9[]; -extern const u8 gUnknown_082DAC47[]; -extern const u8 gUnknown_082DACE0[]; -extern const u8 gUnknown_082DACD2[]; -extern const u8 BattleScript_WishComesTrue[]; -extern const u8 gUnknown_082DACC9[]; -extern const u8 gUnknown_082DAC2C[]; -extern const u8 BattleScript_IngrainTurnHeal[]; -extern const u8 BattleScript_LeechSeedTurnDrain[]; -extern const u8 BattleScript_PoisonTurnDmg[]; -extern const u8 BattleScript_BurnTurnDmg[]; -extern const u8 BattleScript_NightmareTurnDmg[]; -extern const u8 BattleScript_CurseTurnDmg[]; -extern const u8 BattleScript_WrapTurnDmg[]; -extern const u8 BattleScript_WrapEnds[]; -extern const u8 gUnknown_082DB234[]; -extern const u8 gUnknown_082DB2A6[]; -extern const u8 BattleScript_ThrashConfuses[]; -extern const u8 BattleScript_DisabledNoMore[]; -extern const u8 BattleScript_EncoredNoMore[]; -extern const u8 BattleScript_YawnMakesAsleep[]; -extern const u8 gUnknown_082DAFE4[]; -extern const u8 gUnknown_082DB8F3[]; -extern const u8 gUnknown_082DAF05[]; -extern const u8 gUnknown_082DAF20[]; -extern const u8 gUnknown_082DA7C4[]; -extern const u8 gUnknown_082DA7CD[]; -extern const u8 BattleScript_MoveUsedWokeUp[]; -extern const u8 BattleScript_MoveUsedIsAsleep[]; -extern const u8 BattleScript_MoveUsedIsFrozen[]; -extern const u8 BattleScript_MoveUsedUnfroze[]; -extern const u8 BattleScript_MoveUsedLoafingAround[]; -extern const u8 BattleScript_MoveUsedMustRecharge[]; -extern const u8 BattleScript_MoveUsedFlinched[]; -extern const u8 BattleScript_MoveUsedIsDisabled[]; -extern const u8 BattleScript_MoveUsedIsTaunted[]; -extern const u8 BattleScript_MoveUsedIsImprisoned[]; -extern const u8 BattleScript_MoveUsedIsConfused[]; -extern const u8 BattleScript_MoveUsedIsConfusedNoMore[]; -extern const u8 BattleScript_MoveUsedIsParalyzed[]; -extern const u8 BattleScript_MoveUsedIsParalyzedCantAttack[]; -extern const u8 BattleScript_MoveUsedIsInLove[]; -extern const u8 BattleScript_BideStoringEnergy[]; -extern const u8 BattleScript_BideAttack[]; -extern const u8 BattleScript_BideNoEnergyToAttack[]; -extern const u8 gUnknown_082DACE7[]; -extern const u8 BattleScript_DrizzleActivates[]; -extern const u8 BattleScript_SandstreamActivates[]; -extern const u8 BattleScript_DroughtActivates[]; -extern const u8 BattleScript_CastformChange[]; -extern const u8 BattleScript_RainDishActivates[]; -extern const u8 BattleScript_ShedSkinActivates[]; -extern const u8 BattleScript_SpeedBoostActivates[]; -extern const u8 BattleScript_SoundproofProtected[]; -extern const u8 BattleScript_MoveHPDrain[]; -extern const u8 BattleScript_MoveHPDrain_PPLoss[]; -extern const u8 BattleScript_FlashFireBoost[]; -extern const u8 BattleScript_FlashFireBoost_PPLoss[]; -extern const u8 gUnknown_082DB592[]; -extern const u8 gUnknown_082DB591[]; -extern const u8 BattleScript_ColorChangeActivates[]; -extern const u8 BattleScript_RoughSkinActivates[]; -extern const u8 BattleScript_ApplySecondaryEffect[]; -extern const u8 BattleScript_CuteCharmActivates[]; -extern const u8 gUnknown_082DB68C[]; -extern const u8 BattleScript_SynchronizeActivates[]; -extern const u8 gUnknown_082DB4B8[]; -extern const u8 gUnknown_082DB4C1[]; -extern const u8 BattleScript_TraceActivates[]; - -extern const u8 BattleScript_WhiteHerbEnd2[]; -extern const u8 BattleScript_WhiteHerbRet[]; -extern const u8 BattleScript_ItemHealHP_RemoveItem[]; -extern const u8 BattleScript_BerryPPHealEnd2[]; -extern const u8 BattleScript_ItemHealHP_End2[]; -extern const u8 BattleScript_BerryConfuseHealEnd2[]; -extern const u8 BattleScript_BerryStatRaiseEnd2[]; -extern const u8 BattleScript_BerryFocusEnergyEnd2[]; -extern const u8 BattleScript_BerryCurePrlzEnd2[]; -extern const u8 BattleScript_BerryCurePsnEnd2[]; -extern const u8 BattleScript_BerryCureBrnEnd2[]; -extern const u8 BattleScript_BerryCureFrzEnd2[]; -extern const u8 BattleScript_BerryCureSlpEnd2[]; -extern const u8 BattleScript_BerryCureConfusionEnd2[]; -extern const u8 BattleScript_BerryCureChosenStatusEnd2[]; -extern const u8 BattleScript_BerryCureParRet[]; -extern const u8 BattleScript_BerryCurePsnRet[]; -extern const u8 BattleScript_BerryCureBrnRet[]; -extern const u8 BattleScript_BerryCureFrzRet[]; -extern const u8 BattleScript_BerryCureSlpRet[]; -extern const u8 BattleScript_BerryCureConfusionRet[]; -extern const u8 BattleScript_BerryCureChosenStatusRet[]; -extern const u8 BattleScript_ItemHealHP_Ret[]; - -extern const u8 gUnknown_082DB695[]; //disobedient while asleep -extern const u8 gUnknown_082DB6A5[]; //disobedient, uses a random move -extern const u8 gUnknown_082DB6D9[]; //disobedient, went to sleep -extern const u8 gUnknown_082DB6F0[]; //disobedient, hits itself - extern u8 weather_get_current(void); // rom const data @@ -196,13 +86,13 @@ u8 GetBattleBank(u8 caseId) case BS_GET_EFFECT_BANK: ret = gEffectBank; break; - case 7: + case BS_GET_BANK_0: ret = 0; break; case BS_GET_SCRIPTING_BANK: ret = gBattleScripting.bank; break; - case 3: + case BS_GET_gBank1: ret = gBank1; break; case 5: @@ -474,27 +364,27 @@ u8 TrySetCantSelectMoveBattleScript(void) gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - gUnknown_02024230[gActiveBank] = gUnknown_082DAE2A; + gPalaceSelectionBattleScripts[gActiveBank] = BattleScript_SelectingDisabledMoveInPalace; gProtectStructs[gActiveBank].flag_x10 = 1; } else { - gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DAE1F; + gSelectionBattleScripts[gActiveBank] = BattleScript_SelectingDisabledMove; limitations = 1; } } - if (move == gLastUsedMovesByBanks[gActiveBank] && move != MOVE_STRUGGLE && (gBattleMons[gActiveBank].status2 & STATUS2_TORMENT)) + if (move == gLastMoves[gActiveBank] && move != MOVE_STRUGGLE && (gBattleMons[gActiveBank].status2 & STATUS2_TORMENT)) { CancelMultiTurnMoves(gActiveBank); if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - gUnknown_02024230[gActiveBank] = gUnknown_082DB098; + gPalaceSelectionBattleScripts[gActiveBank] = BattleScript_SelectingTormentedMoveInPalace; gProtectStructs[gActiveBank].flag_x10 = 1; } else { - gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB089; + gSelectionBattleScripts[gActiveBank] = BattleScript_SelectingTormentedMove; limitations++; } } @@ -504,12 +394,12 @@ u8 TrySetCantSelectMoveBattleScript(void) gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - gUnknown_02024230[gActiveBank] = gUnknown_082DB0AF; + gPalaceSelectionBattleScripts[gActiveBank] = BattleScript_SelectingNotAllowedMoveTauntInPalace; gProtectStructs[gActiveBank].flag_x10 = 1; } else { - gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB0A0; + gSelectionBattleScripts[gActiveBank] = BattleScript_SelectingNotAllowedMoveTaunt; limitations++; } } @@ -519,12 +409,12 @@ u8 TrySetCantSelectMoveBattleScript(void) gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - gUnknown_02024230[gActiveBank] = gUnknown_082DB185; + gPalaceSelectionBattleScripts[gActiveBank] = BattleScript_SelectingImprisionedMoveInPalace; gProtectStructs[gActiveBank].flag_x10 = 1; } else { - gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB181; + gSelectionBattleScripts[gActiveBank] = BattleScript_SelectingImprisionedMove; limitations++; } } @@ -546,7 +436,7 @@ u8 TrySetCantSelectMoveBattleScript(void) } else { - gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB812; + gSelectionBattleScripts[gActiveBank] = BattleScript_SelectingNotAllowedMoveChoiceItem; limitations++; } } @@ -559,7 +449,7 @@ u8 TrySetCantSelectMoveBattleScript(void) } else { - gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB076; + gSelectionBattleScripts[gActiveBank] = BattleScript_SelectingMoveWithNoPP; limitations++; } } @@ -570,7 +460,7 @@ u8 TrySetCantSelectMoveBattleScript(void) u8 CheckMoveLimitations(u8 bank, u8 unusableMoves, u8 check) { u8 holdEffect; - u16* choicedMove = &gBattleStruct->choicedMove[bank]; + u16 *choicedMove = &gBattleStruct->choicedMove[bank]; s32 i; if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY) @@ -588,7 +478,7 @@ u8 CheckMoveLimitations(u8 bank, u8 unusableMoves, u8 check) unusableMoves |= gBitTable[i]; if (gBattleMons[bank].moves[i] == gDisableStructs[bank].disabledMove && check & MOVE_LIMITATION_DISABLED) unusableMoves |= gBitTable[i]; - if (gBattleMons[bank].moves[i] == gLastUsedMovesByBanks[bank] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[bank].status2 & STATUS2_TORMENT) + if (gBattleMons[bank].moves[i] == gLastMoves[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]; @@ -610,7 +500,7 @@ bool8 AreAllMovesUnusable(void) if (unusable == 0xF) // all moves are unusable { gProtectStructs[gActiveBank].onlyStruggle = 1; - gBattlescriptPtrsForSelection[gActiveBank] = BattleScript_NoMovesLeft; + gSelectionBattleScripts[gActiveBank] = BattleScript_NoMovesLeft; } else { @@ -694,12 +584,8 @@ u8 UpdateTurnCounters(void) if (--gSideTimers[sideBank].reflectTimer == 0) { gSideAffecting[sideBank] &= ~SIDE_STATUS_REFLECT; - BattleScriptExecute(gUnknown_082DACFA); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = MOVE_REFLECT; - gBattleTextBuff1[3] = MOVE_REFLECT >> 8; - gBattleTextBuff1[4] = EOS; + BattleScriptExecute(BattleScript_SideStatusWoreOff); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_REFLECT); effect++; } } @@ -723,13 +609,9 @@ u8 UpdateTurnCounters(void) if (--gSideTimers[sideBank].lightscreenTimer == 0) { gSideAffecting[sideBank] &= ~SIDE_STATUS_LIGHTSCREEN; - BattleScriptExecute(gUnknown_082DACFA); + 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; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_LIGHT_SCREEN); effect++; } } @@ -752,13 +634,9 @@ u8 UpdateTurnCounters(void) && --gSideTimers[sideBank].mistTimer == 0) { gSideAffecting[sideBank] &= ~SIDE_STATUS_MIST; - BattleScriptExecute(gUnknown_082DACFA); + 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; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_MIST); effect++; } gBattleStruct->turnSideTracker++; @@ -781,7 +659,7 @@ u8 UpdateTurnCounters(void) if (--gSideTimers[sideBank].safeguardTimer == 0) { gSideAffecting[sideBank] &= ~SIDE_STATUS_SAFEGUARD; - BattleScriptExecute(gUnknown_082DAD0B); + BattleScriptExecute(BattleScript_SafeguardEnds); effect++; } } @@ -833,10 +711,15 @@ u8 UpdateTurnCounters(void) gBattleCommunication[MULTISTRING_CHOOSER] = 0; } else if (gBattleWeather & WEATHER_RAIN_DOWNPOUR) + { gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } else + { gBattleCommunication[MULTISTRING_CHOOSER] = 0; - BattleScriptExecute(gUnknown_082DAC2C); + } + + BattleScriptExecute(BattleScript_RainContinuesOrEnds); effect++; } gBattleStruct->turncountersTracker++; @@ -847,12 +730,14 @@ u8 UpdateTurnCounters(void) if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) { gBattleWeather &= ~WEATHER_SANDSTORM_TEMPORARY; - gBattlescriptCurrInstr = gUnknown_082DACC9; + gBattlescriptCurrInstr = BattleScript_SandStormHailEnds; } else - gBattlescriptCurrInstr = gUnknown_082DAC47; + { + gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; + } - gBattleScripting.animArg1 = 0xC; + gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; gBattleCommunication[MULTISTRING_CHOOSER] = 0; BattleScriptExecute(gBattlescriptCurrInstr); effect++; @@ -865,10 +750,12 @@ u8 UpdateTurnCounters(void) if (!(gBattleWeather & WEATHER_SUN_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) { gBattleWeather &= ~WEATHER_SUN_TEMPORARY; - gBattlescriptCurrInstr = gUnknown_082DACE0; + gBattlescriptCurrInstr = BattleScript_SunlightFaded; } else - gBattlescriptCurrInstr = gUnknown_082DACD2; + { + gBattlescriptCurrInstr = BattleScript_SunlightContinues; + } BattleScriptExecute(gBattlescriptCurrInstr); effect++; @@ -881,12 +768,14 @@ u8 UpdateTurnCounters(void) if (--gWishFutureKnock.weatherDuration == 0) { gBattleWeather &= ~WEATHER_HAIL; - gBattlescriptCurrInstr = gUnknown_082DACC9; + gBattlescriptCurrInstr = BattleScript_SandStormHailEnds; } else - gBattlescriptCurrInstr = gUnknown_082DAC47; + { + gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; + } - gBattleScripting.animArg1 = 0xD; + gBattleScripting.animArg1 = B_ANIM_HAIL_CONTINUES; gBattleCommunication[MULTISTRING_CHOOSER] = 1; BattleScriptExecute(gBattlescriptCurrInstr); effect++; @@ -981,7 +870,7 @@ u8 TurnBasedEffects(void) gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - if ((gBattleMons[gActiveBank].status1 & 0xF00) != 0xF00) //not 16 turns + if ((gBattleMons[gActiveBank].status1 & 0xF00) != 0xF00) // not 16 turns gBattleMons[gActiveBank].status1 += 0x100; gBattleMoveDamage *= (gBattleMons[gActiveBank].status1 & 0xF00) >> 8; BattleScriptExecute(BattleScript_PoisonTurnDmg); @@ -1040,8 +929,8 @@ u8 TurnBasedEffects(void) // This is the only way I could get this array access to match. gBattleScripting.animArg1 = *(gBattleStruct->wrappedMove + gActiveBank * 2 + 0); gBattleScripting.animArg2 = *(gBattleStruct->wrappedMove + gActiveBank * 2 + 1); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; + gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN; + gBattleTextBuff1[1] = B_BUFF_MOVE; gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBank * 2 + 0); gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBank * 2 + 1); gBattleTextBuff1[4] = EOS; @@ -1052,8 +941,8 @@ u8 TurnBasedEffects(void) } else // broke free { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; + gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN; + gBattleTextBuff1[1] = B_BUFF_MOVE; gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBank * 2 + 0); gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBank * 2 + 1); gBattleTextBuff1[4] = EOS; @@ -1075,7 +964,7 @@ u8 TurnBasedEffects(void) gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP); gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); gBattleCommunication[MULTISTRING_CHOOSER] = 1; - BattleScriptExecute(gUnknown_082DB234); + BattleScriptExecute(BattleScript_MonWokeUpInUproar); gActiveBank = gBankAttacker; EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); @@ -1106,7 +995,7 @@ u8 TurnBasedEffects(void) gBattleCommunication[MULTISTRING_CHOOSER] = 1; CancelMultiTurnMoves(gActiveBank); } - BattleScriptExecute(gUnknown_082DB2A6); + BattleScriptExecute(BattleScript_PrintUproarOverTurns); effect = 1; } } @@ -1125,7 +1014,7 @@ u8 TurnBasedEffects(void) gBattleMons[gActiveBank].status2 &= ~(STATUS2_MULTIPLETURNS); if (!(gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION)) { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x47; + gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; SetMoveEffect(1, 0); if (gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION) BattleScriptExecute(BattleScript_ThrashConfuses); @@ -1224,23 +1113,23 @@ u8 TurnBasedEffects(void) return 0; } -bool8 sub_8041364(void) +bool8 HandleWishPerishSongOnTurnEnd(void) { gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); - switch (gBattleStruct->field_1A0) + switch (gBattleStruct->wishPerishSongState) { case 0: - while (gBattleStruct->field_1A1 < gNoOfAllBanks) + while (gBattleStruct->wishPerishSongBank < gNoOfAllBanks) { - gActiveBank = gBattleStruct->field_1A1; + gActiveBank = gBattleStruct->wishPerishSongBank; if (gAbsentBankFlags & gBitTable[gActiveBank]) { - gBattleStruct->field_1A1++; + gBattleStruct->wishPerishSongBank++; continue; } - gBattleStruct->field_1A1++; + gBattleStruct->wishPerishSongBank++; if (gWishFutureKnock.futureSightCounter[gActiveBank] != 0 && --gWishFutureKnock.futureSightCounter[gActiveBank] == 0 && gBattleMons[gActiveBank].hp != 0) @@ -1250,70 +1139,62 @@ bool8 sub_8041364(void) else gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gWishFutureKnock.futureSightMove[gActiveBank]; - gBattleTextBuff1[3] = gWishFutureKnock.futureSightMove[gActiveBank] >> 8; - gBattleTextBuff1[4] = EOS; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gWishFutureKnock.futureSightMove[gActiveBank]); + gBankTarget = gActiveBank; gBankAttacker = gWishFutureKnock.futureSightAttacker[gActiveBank]; gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBank]; gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF; - BattleScriptExecute(gUnknown_082DAFE4); + BattleScriptExecute(BattleScript_MonTookFutureAttack); if (gWishFutureKnock.futureSightCounter[gActiveBank] == 0 - && gWishFutureKnock.futureSightCounter[gActiveBank ^ 2] == 0) + && gWishFutureKnock.futureSightCounter[gActiveBank ^ BIT_MON] == 0) { - gSideAffecting[GetBankIdentity(gBankTarget) & 1] &= ~SIDE_STATUS_FUTUREATTACK; + gSideAffecting[GET_BANK_SIDE(gBankTarget)] &= ~(SIDE_STATUS_FUTUREATTACK); } - return 1; + return TRUE; } } // Why do I have to keep doing this to match? { - u8* var = &gBattleStruct->field_1A0; - *var = 1; - gBattleStruct->field_1A1 = 0; + u8 *state = &gBattleStruct->wishPerishSongState; + *state = 1; + gBattleStruct->wishPerishSongBank = 0; } // fall through case 1: - while (gBattleStruct->field_1A1 < gNoOfAllBanks) + while (gBattleStruct->wishPerishSongBank < gNoOfAllBanks) { - gActiveBank = gBankAttacker = gBanksByTurnOrder[gBattleStruct->field_1A1]; + gActiveBank = gBankAttacker = gBanksByTurnOrder[gBattleStruct->wishPerishSongBank]; if (gAbsentBankFlags & gBitTable[gActiveBank]) { - gBattleStruct->field_1A1++; + gBattleStruct->wishPerishSongBank++; continue; } - gBattleStruct->field_1A1++; + gBattleStruct->wishPerishSongBank++; if (gStatuses3[gActiveBank] & STATUS3_PERISH_SONG) { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 1; - gBattleTextBuff1[3] = 1; - gBattleTextBuff1[4] = gDisableStructs[gActiveBank].perishSongTimer1; - gBattleTextBuff1[5] = EOS; + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gActiveBank].perishSongTimer1); if (gDisableStructs[gActiveBank].perishSongTimer1 == 0) { gStatuses3[gActiveBank] &= ~STATUS3_PERISH_SONG; gBattleMoveDamage = gBattleMons[gActiveBank].hp; - gBattlescriptCurrInstr = gUnknown_082DAF05; + gBattlescriptCurrInstr = BattleScript_PerishSongTakesLife; } else { gDisableStructs[gActiveBank].perishSongTimer1--; - gBattlescriptCurrInstr = gUnknown_082DAF20; + gBattlescriptCurrInstr = BattleScript_PerishSongCountGoesDown; } BattleScriptExecute(gBattlescriptCurrInstr); - return 1; + return TRUE; } } // Hm... { - u8* var = &gBattleStruct->field_1A0; - *var = 2; - gBattleStruct->field_1A1 = 0; + u8 *state = &gBattleStruct->wishPerishSongState; + *state = 2; + gBattleStruct->wishPerishSongBank = 0; } // fall through case 2: @@ -1326,33 +1207,33 @@ bool8 sub_8041364(void) for (i = 0; i < 2; i++) CancelMultiTurnMoves(i); - gBattlescriptCurrInstr = gUnknown_082DB8F3; - BattleScriptExecute(gUnknown_082DB8F3); - gBattleStruct->field_1A0++; - return 1; + gBattlescriptCurrInstr = BattleScript_82DB8F3; + BattleScriptExecute(BattleScript_82DB8F3); + gBattleStruct->wishPerishSongState++; + return TRUE; } break; } gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); - return 0; + return FALSE; } -#define sub_8041728_MAX_CASE 7 +#define FAINTED_ACTIONS_MAX_CASE 7 -bool8 sub_8041728(void) +bool8 HandleFaintedMonActions(void) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) return FALSE; do { int i; - switch (gBattleStruct->field_4D) + switch (gBattleStruct->faintedActionsState) { case 0: - gBattleStruct->field_4E = 0; - gBattleStruct->field_4D++; + gBattleStruct->faintedActionsBank = 0; + gBattleStruct->faintedActionsState++; for (i = 0; i < gNoOfAllBanks; i++) { if (gAbsentBankFlags & gBitTable[i] && !sub_80423F4(i, 6, 6)) @@ -1362,58 +1243,58 @@ bool8 sub_8041728(void) case 1: do { - gBank1 = gBankTarget = gBattleStruct->field_4E; - if (gBattleMons[gBattleStruct->field_4E].hp == 0 - && !(gBattleStruct->field_DF & gBitTable[gBattlePartyID[gBattleStruct->field_4E]]) - && !(gAbsentBankFlags & gBitTable[gBattleStruct->field_4E])) + gBank1 = gBankTarget = gBattleStruct->faintedActionsBank; + if (gBattleMons[gBattleStruct->faintedActionsBank].hp == 0 + && !(gBattleStruct->field_DF & gBitTable[gBattlePartyID[gBattleStruct->faintedActionsBank]]) + && !(gAbsentBankFlags & gBitTable[gBattleStruct->faintedActionsBank])) { - BattleScriptExecute(gUnknown_082DA7C4); - gBattleStruct->field_4D = 2; + BattleScriptExecute(BattleScript_GiveExp); + gBattleStruct->faintedActionsState = 2; return TRUE; } - } while (++gBattleStruct->field_4E != gNoOfAllBanks); - gBattleStruct->field_4D = 3; + } while (++gBattleStruct->faintedActionsBank != gNoOfAllBanks); + gBattleStruct->faintedActionsState = 3; break; case 2: sub_803F9EC(gBank1); - if (++gBattleStruct->field_4E == gNoOfAllBanks) - gBattleStruct->field_4D = 3; + if (++gBattleStruct->faintedActionsBank == gNoOfAllBanks) + gBattleStruct->faintedActionsState = 3; else - gBattleStruct->field_4D = 1; + gBattleStruct->faintedActionsState = 1; break; case 3: - gBattleStruct->field_4E = 0; - gBattleStruct->field_4D++; + gBattleStruct->faintedActionsBank = 0; + gBattleStruct->faintedActionsState++; // fall through case 4: do { - gBank1 = gBankTarget = gBattleStruct->field_4E; - if (gBattleMons[gBattleStruct->field_4E].hp == 0 - && !(gAbsentBankFlags & gBitTable[gBattleStruct->field_4E])) + gBank1 = gBankTarget = gBattleStruct->faintedActionsBank; + if (gBattleMons[gBattleStruct->faintedActionsBank].hp == 0 + && !(gAbsentBankFlags & gBitTable[gBattleStruct->faintedActionsBank])) { - BattleScriptExecute(gUnknown_082DA7CD); - gBattleStruct->field_4D = 5; + BattleScriptExecute(BattleScript_HandleFaintedMon); + gBattleStruct->faintedActionsState = 5; return TRUE; } - } while (++gBattleStruct->field_4E != gNoOfAllBanks); - gBattleStruct->field_4D = 6; + } while (++gBattleStruct->faintedActionsBank != gNoOfAllBanks); + gBattleStruct->faintedActionsState = 6; break; case 5: - if (++gBattleStruct->field_4E == gNoOfAllBanks) - gBattleStruct->field_4D = 6; + if (++gBattleStruct->faintedActionsBank == gNoOfAllBanks) + gBattleStruct->faintedActionsState = 6; else - gBattleStruct->field_4D = 4; + gBattleStruct->faintedActionsState = 4; break; case 6: if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) || AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) || ItemBattleEffects(1, 0, 1) || AbilityBattleEffects(ABILITYEFFECT_FORECAST, 0, 0, 0, 0)) return TRUE; - gBattleStruct->field_4D++; + gBattleStruct->faintedActionsState++; break; - case 7: + case FAINTED_ACTIONS_MAX_CASE: break; } - } while (gBattleStruct->field_4D != sub_8041728_MAX_CASE); + } while (gBattleStruct->faintedActionsState != FAINTED_ACTIONS_MAX_CASE); return FALSE; } @@ -1432,7 +1313,7 @@ void TryClearRageStatuses(void) u8 AtkCanceller_UnableToUseMove(void) { u8 effect = 0; - s32* bideDmg = &gBattleScripting.bideDmg; + s32 *bideDmg = &gBattleScripting.bideDmg; do { switch (gBattleStruct->atkCancellerTracker) @@ -1683,7 +1564,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 14: // last case + case ATKCANCELLER_MAX_CASE: break; } @@ -1785,14 +1666,14 @@ bool8 sub_80423F4(u8 bank, u8 r1, u8 r2) { if (GetBankSide(bank) == SIDE_OPPONENT) { - r7 = GetBankByIdentity(1); - r6 = GetBankByIdentity(3); + r7 = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + r6 = GetBankByIdentity(IDENTITY_OPPONENT_MON2); party = gEnemyParty; } else { - r7 = GetBankByIdentity(0); - r6 = GetBankByIdentity(2); + r7 = GetBankByIdentity(IDENTITY_PLAYER_MON1); + r6 = GetBankByIdentity(IDENTITY_PLAYER_MON2); party = gPlayerParty; } if (r1 == 6) @@ -1910,10 +1791,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) else move = gCurrentMove; - if (gBattleStruct->dynamicMoveType) - moveType = gBattleStruct->dynamicMoveType & 0x3F; - else - moveType = gBattleMoves[move].type; + GET_MOVE_TYPE(move, moveType); switch (caseID) { @@ -1961,7 +1839,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) if (effect) { gBattleCommunication[MULTISTRING_CHOOSER] = weather_get_current(); - BattleScriptPushCursorAndCallback(gUnknown_082DACE7); + BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); } break; case ABILITY_DRIZZLE: @@ -2167,9 +2045,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) if (gBattleMons[bank].maxHP == gBattleMons[bank].hp) { if ((gProtectStructs[gBankAttacker].notFirstStrike)) - gBattlescriptCurrInstr = gUnknown_082DB592; + gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless; else - gBattlescriptCurrInstr = gUnknown_082DB591; + gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless_PPLoss; } else { @@ -2307,86 +2185,84 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_IMMUNITY: // 5 + for (bank = 0; bank < gNoOfAllBanks; bank++) { - for (bank = 0; bank < gNoOfAllBanks; bank++) + switch (gBattleMons[bank].ability) { - switch (gBattleMons[bank].ability) + case ABILITY_IMMUNITY: + if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | STATUS_TOXIC_COUNTER)) { - case ABILITY_IMMUNITY: - if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | STATUS_TOXIC_COUNTER)) - { - 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; - } + 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 ABILITY_MAGMA_ARMOR: - if (gBattleMons[bank].status1 & STATUS_FREEZE) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - effect = 1; - } + case 2: // get rid of confusion + gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); break; - case ABILITY_OBLIVIOUS: - if (gBattleMons[bank].status2 & STATUS2_INFATUATION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - effect = 3; - } + case 3: // get rid of infatuation + gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); 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 = gUnknown_082DB68C; - gBattleScripting.bank = bank; - gActiveBank = bank; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); - MarkBufferBankForExecution(gActiveBank); - return effect; - } + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; + gBattleScripting.bank = bank; + gActiveBank = bank; + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + MarkBufferBankForExecution(gActiveBank); + return effect; } } break; @@ -2445,7 +2321,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) { gLastUsedAbility = ABILITY_INTIMIDATE; gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); - BattleScriptPushCursorAndCallback(gUnknown_082DB4B8); + BattleScriptPushCursorAndCallback(BattleScript_82DB4B8); gBattleStruct->intimidateBank = i; effect++; break; @@ -2517,7 +2393,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) gLastUsedAbility = ABILITY_INTIMIDATE; gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); BattleScriptPushCursor(); - gBattlescriptCurrInstr = gUnknown_082DB4C1; + gBattlescriptCurrInstr = BattleScript_82DB4C1; gBattleStruct->intimidateBank = i; effect++; break; @@ -2636,7 +2512,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) return effect; } -void BattleScriptExecute(const u8* BS_ptr) +void BattleScriptExecute(const u8 *BS_ptr) { gBattlescriptCurrInstr = BS_ptr; BATTLE_CALLBACKS_STACK->function[BATTLE_CALLBACKS_STACK->size++] = gBattleMainFunc; @@ -2644,7 +2520,7 @@ void BattleScriptExecute(const u8* BS_ptr) gCurrentActionFuncId = 0; } -void BattleScriptPushCursorAndCallback(const u8* BS_ptr) +void BattleScriptPushCursorAndCallback(const u8 *BS_ptr) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BS_ptr; @@ -2662,15 +2538,6 @@ enum 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; @@ -2727,7 +2594,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) gBattleStruct->moneyMultiplier = 2; break; case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < 8; i++) + for (i = 0; i < BATTLE_STATS_NO; i++) { if (gBattleMons[bank].statStages[i] < 6) { @@ -2764,19 +2631,19 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) case HOLD_EFFECT_RESTORE_PP: if (!moveTurn) { - struct Pokemon* poke; + struct Pokemon *mon; u8 ppBonuses; u16 move; if (GetBankSide(bank) == SIDE_PLAYER) - poke = &gPlayerParty[gBattlePartyID[bank]]; + mon = &gPlayerParty[gBattlePartyID[bank]]; else - poke = &gEnemyParty[gBattlePartyID[bank]]; + mon = &gEnemyParty[gBattlePartyID[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); + move = GetMonData(mon, MON_DATA_MOVE1 + i); + changedPP = GetMonData(mon, MON_DATA_PP1 + i); + ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); if (move && changedPP == 0) break; } @@ -2787,11 +2654,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) changedPP = maxPP; else changedPP = changedPP + bankQuality; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = move; - gBattleTextBuff1[3] = move >> 8; - gBattleTextBuff1[4] = 0xFF; + + PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); + BattleScriptExecute(BattleScript_BerryPPHealEnd2); EmitSetMonData(0, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); MarkBufferBankForExecution(gActiveBank); @@ -2800,7 +2665,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) } break; case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < 8; i++) + for (i = 0; i < BATTLE_STATS_NO; i++) { if (gBattleMons[bank].statStages[i] < 6) { @@ -2834,17 +2699,15 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) 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; + PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SPICY); + 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 (GetFlavourRelationByPersonality(gBattleMons[bank].personality, FLAVOR_SPICY) < 0) + if (GetFlavorRelationByPersonality(gBattleMons[bank].personality, FLAVOR_SPICY) < 0) BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); else BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); @@ -2854,17 +2717,15 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) 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; + PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_DRY); + 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 (GetFlavourRelationByPersonality(gBattleMons[bank].personality, FLAVOR_DRY) < 0) + if (GetFlavorRelationByPersonality(gBattleMons[bank].personality, FLAVOR_DRY) < 0) BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); else BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); @@ -2874,17 +2735,15 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) 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; + PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SWEET); + 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 (GetFlavourRelationByPersonality(gBattleMons[bank].personality, FLAVOR_SWEET) < 0) + if (GetFlavorRelationByPersonality(gBattleMons[bank].personality, FLAVOR_SWEET) < 0) BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); else BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); @@ -2894,17 +2753,15 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) 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; + PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_BITTER); + 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 (GetFlavourRelationByPersonality(gBattleMons[bank].personality, FLAVOR_BITTER) < 0) + if (GetFlavorRelationByPersonality(gBattleMons[bank].personality, FLAVOR_BITTER) < 0) BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); else BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); @@ -2914,17 +2771,15 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) 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; + PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SOUR); + 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 (GetFlavourRelationByPersonality(gBattleMons[bank].personality, FLAVOR_SOUR) < 0) + if (GetFlavorRelationByPersonality(gBattleMons[bank].personality, FLAVOR_SOUR) < 0) BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); else BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); @@ -2935,19 +2790,11 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) 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; + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_STAGE_ATK); + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); gEffectBank = bank; - gBattleScripting.statChanger = 0x10 + STAT_STAGE_ATK; + SET_STATCHANGER(STAT_STAGE_ATK, 1, FALSE); gBattleScripting.animArg1 = 0xE + STAT_STAGE_ATK; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); @@ -2957,13 +2804,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) 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; + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_STAGE_DEF); gEffectBank = bank; - gBattleScripting.statChanger = 0x10 + STAT_STAGE_DEF; + SET_STATCHANGER(STAT_STAGE_DEF, 1, FALSE); gBattleScripting.animArg1 = 0xE + STAT_STAGE_DEF; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); @@ -2973,13 +2817,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) 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; + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_STAGE_SPEED); gEffectBank = bank; - gBattleScripting.statChanger = 0x10 + STAT_STAGE_SPEED; + SET_STATCHANGER(STAT_STAGE_SPEED, 1, FALSE); gBattleScripting.animArg1 = 0xE + STAT_STAGE_SPEED; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); @@ -2989,13 +2830,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) 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; + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_STAGE_SPATK); gEffectBank = bank; - gBattleScripting.statChanger = 0x10 + STAT_STAGE_SPATK; + SET_STATCHANGER(STAT_STAGE_SPATK, 1, FALSE); gBattleScripting.animArg1 = 0xE + STAT_STAGE_SPATK; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); @@ -3005,13 +2843,10 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) 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; + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_STAGE_SPDEF); gEffectBank = bank; - gBattleScripting.statChanger = 0x10 + STAT_STAGE_SPDEF; + SET_STATCHANGER(STAT_STAGE_SPDEF, 1, FALSE); gBattleScripting.animArg1 = 0xE + STAT_STAGE_SPDEF; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); @@ -3041,22 +2876,19 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) 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; + PREPARE_STAT_BUFFER(gBattleTextBuff1, i + 1); + + gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; + gBattleTextBuff2[1] = B_BUFF_STRING; + gBattleTextBuff2[2] = STRINGID_STATSHARPLY; + gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; + gBattleTextBuff2[4] = B_BUFF_STRING; + gBattleTextBuff2[5] = STRINGID_STATROSE; + gBattleTextBuff2[6] = STRINGID_STATROSE >> 8; gBattleTextBuff2[7] = EOS; gEffectBank = bank; - gBattleScripting.statChanger = 0x21 + i; + SET_STATCHANGER(i + 1, 2, FALSE); gBattleScripting.animArg1 = 0x21 + i + 6; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); @@ -3309,7 +3141,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) } break; case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < 8; i++) + for (i = 0; i < BATTLE_STATS_NO; i++) { if (gBattleMons[bank].statStages[i] < 6) { @@ -3350,7 +3182,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) && gBattleMoves[gCurrentMove].flags & FLAG_KINGSROCK_AFFECTED && gBattleMons[gBankTarget].hp) { - gBattleCommunication[MOVE_EFFECT_BYTE] = 8; + gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FLINCH; BattleScriptPushCursor(); SetMoveEffect(0, 0); BattleScriptPop(); @@ -3411,7 +3243,7 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) switch (moveTarget) { case MOVE_TARGET_SELECTED: - side = GetBankSide(gBankAttacker) ^ 1; + side = GetBankSide(gBankAttacker) ^ BIT_SIDE; if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) targetBank = gSideTimers[side].followmeTarget; else @@ -3425,7 +3257,7 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBankAttacker, ABILITY_LIGHTNING_ROD, 0, 0) && gBattleMons[targetBank].ability != ABILITY_LIGHTNING_ROD) { - targetBank ^= 2; + targetBank ^= BIT_MON; RecordAbilityBattle(targetBank, gBattleMons[targetBank].ability); gSpecialStatuses[targetBank].lightningRodRedirected = 1; } @@ -3435,12 +3267,12 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) case MOVE_TARGET_BOTH: case MOVE_TARGET_FOES_AND_ALLY: case MOVE_TARGET_OPPONENTS_FIELD: - targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1); + targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & BIT_SIDE) ^ BIT_SIDE); if (gAbsentBankFlags & gBitTable[targetBank]) - targetBank ^= 2; + targetBank ^= BIT_MON; break; case MOVE_TARGET_RANDOM: - side = GetBankSide(gBankAttacker) ^ 1; + side = GetBankSide(gBankAttacker) ^ BIT_SIDE; if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) targetBank = gSideTimers[side].followmeTarget; else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & MOVE_TARGET_RANDOM) @@ -3448,22 +3280,22 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) if (GetBankSide(gBankAttacker) == SIDE_PLAYER) { if (Random() & 1) - targetBank = GetBankByIdentity(1); + targetBank = GetBankByIdentity(IDENTITY_OPPONENT_MON1); else - targetBank = GetBankByIdentity(3); + targetBank = GetBankByIdentity(IDENTITY_OPPONENT_MON2); } else { if (Random() & 1) - targetBank = GetBankByIdentity(0); + targetBank = GetBankByIdentity(IDENTITY_PLAYER_MON1); else - targetBank = GetBankByIdentity(2); + targetBank = GetBankByIdentity(IDENTITY_PLAYER_MON2); } if (gAbsentBankFlags & gBitTable[targetBank]) - targetBank ^= 2; + targetBank ^= BIT_MON; } else - targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1); + targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & BIT_SIDE) ^ BIT_SIDE); break; case MOVE_TARGET_USER: case MOVE_TARGET_x10: @@ -3471,11 +3303,7 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) break; } - #ifndef NONMATCHING - MEME_ACCESS_U8(BattleStruct, gBattleStruct, gBankAttacker, moveTarget, targetBank); - #else - gBattleStruct->moveTarget[gBankAttacker] = targetBank; - #endif // NONMATCHING + *(gBattleStruct->moveTarget + gBankAttacker) = targetBank; return targetBank; } @@ -3490,7 +3318,7 @@ static bool32 HasObedientBitSet(u8 bank) return GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_OBEDIENCE, NULL); } -u8 IsPokeDisobedient(void) +u8 IsMonDisobedient(void) { s32 rnd; s32 calc; @@ -3536,7 +3364,7 @@ u8 IsPokeDisobedient(void) gBattleMons[gBankAttacker].status2 &= ~(STATUS2_RAGE); if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP && (gCurrentMove == MOVE_SNORE || gCurrentMove == MOVE_SLEEP_TALK)) { - gBattlescriptCurrInstr = gUnknown_082DB695; + gBattlescriptCurrInstr = BattleScript_82DB695; return 1; } @@ -3559,7 +3387,7 @@ u8 IsPokeDisobedient(void) } while (gBitTable[gCurrMovePos] & calc); gRandomMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; - gBattlescriptCurrInstr = gUnknown_082DB6A5; + gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; gBankTarget = GetMoveTarget(gRandomMove, 0); gHitMarker |= HITMARKER_x200000; return 2; @@ -3581,7 +3409,7 @@ u8 IsPokeDisobedient(void) } if (i == gNoOfAllBanks) { - gBattlescriptCurrInstr = gUnknown_082DB6D9; + gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; return 1; } } @@ -3590,7 +3418,7 @@ u8 IsPokeDisobedient(void) { gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankAttacker], MOVE_POUND, 0, 40, 0, gBankAttacker, gBankAttacker); gBankTarget = gBankAttacker; - gBattlescriptCurrInstr = gUnknown_082DB6F0; + gBattlescriptCurrInstr = BattleScript_82DB6F0; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return 2; } diff --git a/src/battle_util2.c b/src/battle_util2.c index e119c85d7..538c1c641 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -4,21 +4,17 @@ #include "malloc.h" #include "pokemon.h" #include "event_data.h" -#include "abilities.h" -#include "rng.h" +#include "constants/abilities.h" +#include "random.h" +#include "battle_scripts.h" extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT]; extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; extern u8 gUnknown_0203CF00[]; -extern const u8* gBattlescriptCurrInstr; +extern const u8 *gBattlescriptCurrInstr; extern u8 gBattleCommunication[]; extern u8 gActiveBank; -extern const u8 BattleScript_MoveUsedWokeUp[]; -extern const u8 BattleScript_MoveUsedIsFrozen[]; -extern const u8 BattleScript_MoveUsedUnfroze[]; -extern const u8 BattleScript_MoveUsedIsAsleep[]; - extern void sub_81D55D0(void); extern void sub_81D5694(void); extern u8 pokemon_order_func(u8); diff --git a/src/berry.c b/src/berry.c index 6d1fd17a1..74b7090c0 100644 --- a/src/berry.c +++ b/src/berry.c @@ -2,9 +2,9 @@ #include "berry.h" #include "main.h" #include "item.h" -#include "items.h" +#include "constants/items.h" #include "text.h" -#include "rng.h" +#include "random.h" #include "event_data.h" #include "fieldmap.h" @@ -18,12 +18,6 @@ extern u16 gSpecialVar_ItemId; extern const u8 BerryTreeScript[]; -#define BERRY_NAME_LENGTH 6 - -#define FIRST_BERRY ITEM_CHERI_BERRY -#define LAST_BERRY ITEM_ENIGMA_BERRY - - static const u8 sBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers."); static const u8 sBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy."); static const u8 sBerryDescriptionPart1_Chesto[] = _("The BERRY’s thick skin and fruit are"); @@ -1062,28 +1056,28 @@ u8 GetStageByBerryTreeId(u8 id) u8 ItemIdToBerryType(u16 item) { - u16 berry = item - FIRST_BERRY; + u16 berry = item - FIRST_BERRY_INDEX; - if (berry > LAST_BERRY - FIRST_BERRY) + if (berry > LAST_BERRY_INDEX - FIRST_BERRY_INDEX) return 1; else - return item - FIRST_BERRY + 1; + return ITEM_TO_BERRY(item); } u16 BerryTypeToItemId(u16 berry) { u16 item = berry - 1; - if (item > LAST_BERRY - FIRST_BERRY) - return FIRST_BERRY; + if (item > LAST_BERRY_INDEX - FIRST_BERRY_INDEX) + return FIRST_BERRY_INDEX; else - return berry + FIRST_BERRY - 1; + return berry + FIRST_BERRY_INDEX - 1; } void GetBerryNameByBerryType(u8 berry, u8 *string) { - memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_LENGTH); - string[BERRY_NAME_LENGTH] = EOS; + memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_COUNT - 1); + string[BERRY_NAME_COUNT - 1] = EOS; } void GetBerryCountStringByBerryType(u8 berry, u8* dest, u32 berryCount) diff --git a/src/berry_blender.c b/src/berry_blender.c index 8e5a51845..b1e8712a6 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -1,17 +1,140 @@ #include "global.h" +#include "constants/game_stat.h" +#include "overworld.h" +#include "berry_blender.h" #include "bg.h" #include "window.h" #include "task.h" #include "sprite.h" +#include "sound.h" +#include "constants/songs.h" +#include "m4a.h" +#include "bg.h" +#include "palette.h" +#include "decompress.h" +#include "malloc.h" +#include "gpu_regs.h" +#include "text.h" +#include "event_data.h" +#include "main.h" +#include "link.h" +#include "new_menu_helpers.h" +#include "item_menu_icons.h" +#include "berry.h" +#include "item.h" +#include "constants/items.h" +#include "string_util.h" +#include "international_string_util.h" +#include "random.h" +#include "menu.h" +#include "pokeblock.h" +#include "trig.h" +#include "tv.h" + +#define BLENDER_SCORE_BEST 0 +#define BLENDER_SCORE_GOOD 1 +#define BLENDER_SCORE_MISS 2 + +#define BLENDER_MAX_PLAYERS 4 +#define BLENDER_SCORES_NO 3 + +enum +{ + PLAY_AGAIN_OK, + DONT_PLAY_AGAIN, + CANT_PLAY_NO_BERRIES, + CANT_PLAY_NO_PKBLCK_SPACE +}; -// Static type declarations +struct BlenderBerry +{ + u16 itemId; + u8 name[BERRY_NAME_COUNT]; + u8 flavors[FLAVOR_COUNT]; + u8 smoothness; +}; -// Static RAM declarations -IWRAM_DATA void *berry_blender_c_unused_03000de4; -IWRAM_DATA s16 gUnknown_03000DE8[8]; -IWRAM_DATA s16 gUnknown_03000DF8[6]; -IWRAM_DATA s16 gUnknown_03000E04; -IWRAM_DATA s16 gUnknown_03000E06; +struct TimeAndRPM +{ + u32 time; + u16 max_RPM; +}; + +struct BlenderGameBlock +{ + struct TimeAndRPM timeRPM; + u16 scores[BLENDER_MAX_PLAYERS][BLENDER_SCORES_NO]; +}; + +struct TvBlenderStruct +{ + u8 name[11]; + u8 pokeblockFlavor; + u8 pokeblockColor; + u8 pokeblockSheen; +}; + +struct BerryBlenderData +{ + u8 mainState; + u8 loadGfxState; + u8 unused_02[0x42]; + u16 field_44; + u8 scoreIconIds[BLENDER_SCORES_NO]; + u16 arrowPos; + s16 field_4C; + u16 max_RPM; + u8 syncArrowSpriteIds[BLENDER_MAX_PLAYERS]; + u8 syncArrowSprite2Ids[BLENDER_MAX_PLAYERS]; + u8 unused_57[0xB]; + u8 gameEndState; + u16 field_64[BLENDER_MAX_PLAYERS]; + u16 field_6C; + u16 field_6E; + u16 playAgainState; + u8 field_72; + u16 chosenItemId[BLENDER_MAX_PLAYERS]; + u8 playersNo; + u8 unused_7D[0x10]; + u16 field_8E[BLENDER_MAX_PLAYERS]; + u16 field_96[BLENDER_MAX_PLAYERS]; + u8 yesNoAnswer; + u8 stringVar[100]; + u32 gameFrameTime; + s32 framesToWait; + u32 field_10C; + u8 unused_110[4]; + u8 field_114; + u16 field_116; + u16 field_118; + u16 field_11A; + u16 bg_X; + u16 bg_Y; + u8 field_120[3]; + u8 field_123; + u16 scores[BLENDER_MAX_PLAYERS][BLENDER_SCORES_NO]; + u8 playerPlaces[BLENDER_MAX_PLAYERS]; + struct BgAffineSrcData bgAffineSrc; + u16 field_154; + struct BlenderBerry blendedBerries[BLENDER_MAX_PLAYERS]; + struct TimeAndRPM smallBlock; + u32 field_1A0; + u8 field_1A4; + struct TvBlenderStruct tvBlender; + u8 tilemapBuffers[2][0x800]; + s16 textState; + void *tilesBuffer; + struct BlenderGameBlock gameBlock; +}; + +extern struct MusicPlayerInfo gMPlay_SE2; +extern struct MusicPlayerInfo gMPlay_BGM; +extern u16 gSpecialVar_ItemId; +extern u8 gInGameOpponentsNo; +extern u8 gUnknown_020322D5; +extern u8 gResultsWindowId; + +extern const u8 * const gPokeblockNames[]; // graphics extern const u8 gBerryBlenderArrowTiles[]; @@ -21,20 +144,92 @@ extern const u8 gBerryBlenderParticlesTiles[]; extern const u8 gBerryBlenderCountdownNumbersTiles[]; extern const u16 gBerryBlenderMiscPalette[]; extern const u16 gBerryBlenderArrowPalette[]; - -void sub_8080EA4(u8 taskId); -void sub_8080FD0(u8 taskId); -void sub_80810F8(u8 taskId); -void sub_80833F8(struct Sprite *sprite); -void sub_8082F68(struct Sprite *sprite); -void sub_8083010(struct Sprite *sprite); -void sub_80830C0(struct Sprite *sprite); - -// .rodata -// TODO: make those static once the file is decompiled -const u16 sBlenderCenterPal[] = INCBIN_U16("graphics/berry_blender/center.gbapal"); -const u8 sBlenderCenterMap[] = INCBIN_U8("graphics/berry_blender/center_map.bin"); -const u16 sBlenderOuterPal[] = INCBIN_U16("graphics/berry_blender/outer.gbapal"); +extern const u8 sBlenderCenterGfx[]; +extern const u8 gUnknown_08D91DB8[]; +extern const u8 gUnknown_08D927EC[]; + +// text +extern const u8 gText_SavingDontTurnOff2[]; +extern const u8 gText_Space[]; +extern const u8 gText_BlenderMaxSpeedRecord[]; +extern const u8 gText_234Players[]; + +extern void sub_81978B0(u16); +extern void sub_800A418(void); +extern u8 sub_800A9D8(void); +extern bool8 sub_800A4D8(u8); +extern void sub_8197DF8(u8 windowId, bool8 copyToVram); +extern void sub_809882C(u8, u16, u8); +extern void copy_textbox_border_tile_patterns_to_vram(u8, u16, u8); +extern void sub_81AABF0(void (*callback)(void)); +extern void sub_800B4C0(void); +extern void sub_8009F8C(void); +extern void c2_exit_to_overworld_1_continue_scripts_restart_music(void); +extern void sub_8153430(void); +extern bool8 sub_8153474(void); +extern void sub_80EECEC(void); + +// this file's functions +static void BerryBlender_SetBackgroundsPos(void); +static void sub_8080EA4(u8 taskId); +static void sub_8080FD0(u8 taskId); +static void sub_80810F8(u8 taskId); +static void sub_8081224(u8 taskId); +static void sub_8083F3C(u8 taskId); +static void sub_80833F8(struct Sprite *sprite); +static void sub_8082F68(struct Sprite *sprite); +static void sub_8083010(struct Sprite *sprite); +static void sub_80830C0(struct Sprite *sprite); +static void sub_8082F9C(struct Sprite *sprite); +static void Blender_SetPlayerNamesLocal(u8 opponentsNum); +static void sub_807FAC8(void); +static void sub_8082D28(void); +static bool32 Blender_PrintText(s16 *textState, const u8 *string, s32 textSpeed); +static void sub_807FFA4(void); +static void sub_8080018(void); +static void sub_80808D4(void); +static void Blender_DummiedOutFunc(s16 a0, s16 a1); +static void sub_8081898(void); +static void sub_8082CB4(struct BgAffineSrcData *bgAffineSrc); +static bool8 sub_8083380(void); +static void sub_808074C(void); +static void Blender_PrintPlayerNames(void); +static void sub_8080588(void); +static void Blender_SetBankBerryData(u8 bank, u16 itemId); +static void Blender_AddTextPrinter(u8 windowId, const u8 *string, u8 x, u8 y, s32 speed, s32 caseId); +static void sub_8080DF8(void); +static void sub_8082E84(void); +static void sub_80832BC(s16* a0, u16 a1); +static void sub_8083140(u16 a0, u16 a2); +static void sub_8083230(u16 a0); +static void sub_808330C(void); +static void sub_8082AD4(void); +static void CB2_HandleBlenderEndGame(void); +static bool8 Blender_PrintBlendingRanking(void); +static bool8 Blender_PrintBlendingResults(void); +static void CB2_HandlePlayerPlayAgainChoice(void); +static void CB2_HandlePlayerLinkPlayAgainChoice(void); +static void sub_8083170(u16 a0, u16 a1); +static void Blender_PrintMadePokeblockString(struct Pokeblock *pokeblock, u8 *dst); +static bool32 TryAddContestLinkTvShow(struct Pokeblock *pokeblock, struct TvBlenderStruct *a1); + +// ewram +EWRAM_DATA static struct BerryBlenderData *sBerryBlenderData = NULL; +EWRAM_DATA static s32 sUnknown_020322A8[5] = {0}; +EWRAM_DATA static s32 sUnknown_020322BC[5] = {0}; +EWRAM_DATA static u32 sUnknown_020322D0 = 0; + +// iwram +IWRAM_DATA static s16 sUnknown_03000DE8[8]; +IWRAM_DATA static s16 sUnknown_03000DF8[6]; +IWRAM_DATA static s16 sUnknown_03000E04; +IWRAM_DATA static s16 sUnknown_03000E06; + +// rom + +static const u16 sBlenderCenterPal[] = INCBIN_U16("graphics/berry_blender/center.gbapal"); +static const u8 sBlenderCenterMap[] = INCBIN_U8("graphics/berry_blender/center_map.bin"); +static const u16 sBlenderOuterPal[] = INCBIN_U16("graphics/berry_blender/outer.gbapal"); // unreferenced pals? static const u16 sUnknownPal_0[] = INCBIN_U16("graphics/unknown/unknown_339514.gbapal"); @@ -47,9 +242,9 @@ static const u8 sUnusedText_Space[] = _(" "); static const u8 sUnusedText_Terminating[] = _("Terminating."); static const u8 sUnusedText_LinkPartnerNotFound[] = _("Link partner(s) not found.\nPlease try again.\p"); -const u8 gText_BerryBlenderStart[] = _("Starting up the BERRY BLENDER.\pPlease select a BERRY from your BAG\nto put in the BERRY BLENDER.\p"); -const u8 gText_NewParagraph[] = _("\p"); -const u8 gText_WasMade[] = _(" was made!"); +static const u8 sText_BerryBlenderStart[] = _("Starting up the BERRY BLENDER.\pPlease select a BERRY from your BAG\nto put in the BERRY BLENDER.\p"); +static const u8 sText_NewParagraph[] = _("\p"); +static const u8 sText_WasMade[] = _(" was made!"); static const u8 sText_Mister[] = _("MISTER"); static const u8 sText_Laddie[] = _("LADDIE"); static const u8 sText_Lassie[] = _("LASSIE"); @@ -57,7 +252,7 @@ static const u8 sText_Master[] = _("MASTER"); static const u8 sText_Dude[] = _("DUDE"); static const u8 sText_Miss[] = _("MISS"); -const u8* const sBlenderOpponentsNames[] = +static const u8* const sBlenderOpponentsNames[] = { sText_Mister, sText_Laddie, @@ -67,31 +262,41 @@ const u8* const sBlenderOpponentsNames[] = sText_Miss }; +enum +{ + BLENDER_MISTER, + BLENDER_LADDIE, + BLENDER_LASSIE, + BLENDER_MASTER, + BLENDER_DUDE, + BLENDER_MISS +}; + static const u8 sText_PressAToStart[] = _("Press the A Button to start."); static const u8 sText_PleaseWaitAWhile[] = _("Please wait a while."); -const u8 sText_CommunicationStandby[] = _("Communication standby…"); -const u8 sText_WouldLikeToBlendAnotherBerry[] = _("Would you like to blend another BERRY?"); -const u8 sText_RunOutOfBerriesForBlending[] = _("You’ve run out of BERRIES for\nblending in the BERRY BLENDER.\p"); -const u8 sText_YourPokeblockCaseIsFull[] = _("Your {POKEBLOCK} CASE is full.\p"); -const u8 sText_HasNoBerriesToPut[] = _(" has no BERRIES to put in\nthe BERRY BLENDER."); -const u8 sText_ApostropheSPokeblockCaseIsFull[] = _("’s {POKEBLOCK} CASE is full.\p"); -const u8 sText_BlendingResults[] = _("RESULTS OF BLENDING"); +static const u8 sText_CommunicationStandby[] = _("Communication standby…"); +static const u8 sText_WouldLikeToBlendAnotherBerry[] = _("Would you like to blend another BERRY?"); +static const u8 sText_RunOutOfBerriesForBlending[] = _("You’ve run out of BERRIES for\nblending in the BERRY BLENDER.\p"); +static const u8 sText_YourPokeblockCaseIsFull[] = _("Your {POKEBLOCK} CASE is full.\p"); +static const u8 sText_HasNoBerriesToPut[] = _(" has no BERRIES to put in\nthe BERRY BLENDER."); +static const u8 sText_ApostropheSPokeblockCaseIsFull[] = _("’s {POKEBLOCK} CASE is full.\p"); +static const u8 sText_BlendingResults[] = _("RESULTS OF BLENDING"); static const u8 sText_BerryUsed[] = _("BERRY USED"); -const u8 sText_SpaceBerry[] = _(" BERRY"); -const u8 sText_Time[] = _("Time:"); -const u8 sText_Min[] = _(" min. "); -const u8 sText_Sec[] = _(" sec."); -const u8 sText_MaximumSpeed[] = _("MAXIMUM SPEED"); -const u8 sText_RPM[] = _(" RPM"); -const u8 sText_Dot[] = _("."); -const u8 sText_NewLine[] = _("\n"); +static const u8 sText_SpaceBerry[] = _(" BERRY"); +static const u8 sText_Time[] = _("Time:"); +static const u8 sText_Min[] = _(" min. "); +static const u8 sText_Sec[] = _(" sec."); +static const u8 sText_MaximumSpeed[] = _("MAXIMUM SPEED"); +static const u8 sText_RPM[] = _(" RPM"); +static const u8 sText_Dot[] = _("."); +static const u8 sText_NewLine[] = _("\n"); static const u8 sText_Space[] = _(" "); -const u8 sText_Ranking[] = _("RANKING"); -const u8 sText_TheLevelIs[] = _("The level is "); -const u8 sText_TheFeelIs[] = _(", and the feel is "); -const u8 sText_Dot2[] = _("."); +static const u8 sText_Ranking[] = _("RANKING"); +static const u8 sText_TheLevelIs[] = _("The level is "); +static const u8 sText_TheFeelIs[] = _(", and the feel is "); +static const u8 sText_Dot2[] = _("."); -const struct BgTemplate gUnknown_08339974[3] = +static const struct BgTemplate sBerryBlenderBgTemplates[3] = { { .bg = 0, @@ -122,7 +327,7 @@ const struct BgTemplate gUnknown_08339974[3] = } }; -const struct WindowTemplate gUnknown_08339980[] = +static const struct WindowTemplate sBerryBlender_WindowTemplates[] = { {0, 1, 6, 7, 2, 0xE, 0x28}, {0, 0x16, 6, 7, 2, 0xE, 0x36}, @@ -133,31 +338,31 @@ const struct WindowTemplate gUnknown_08339980[] = DUMMY_WIN_TEMPLATE }; -const struct WindowTemplate gUnknown_083399B8 = +static const struct WindowTemplate sBlender_YesNoWindowTemplate = { 0, 0x15, 9, 5, 4, 0xE, 0xCC }; -const s8 gUnknown_083399C0[][2] = +static const s8 sUnknown_083399C0[][2] = { {-1, -1}, {1, -1}, {-1, 1}, {1, 1} }; -const u8 sBlenderSyncArrowsPos[][2] = +static const u8 sBlenderSyncArrowsPos[BLENDER_MAX_PLAYERS][2] = { {72, 32}, {168, 32}, {72, 128}, {168, 128} }; -const u8 gUnknown_083399D0[3][4] = +static const u8 sUnknown_083399D0[3][4] = { {-1, 0, 1, -1}, {-1, 0, 1, 2}, {0, 1, 2, 3} }; -const u16 gUnknown_083399DC[] = {0, 0xC000, 0x4000, 0x8000}; -const u8 gUnknown_083399E4[] = {1, 1, 0}; -const u8 gUnknown_083399E7[] = {32, 224, 96, 160, 0}; +static const u16 sUnknown_083399DC[] = {0, 0xC000, 0x4000, 0x8000}; +static const u8 sUnknown_083399E4[] = {1, 1, 0}; +static const u8 sUnknown_083399E7[] = {32, 224, 96, 160, 0}; -const TaskFunc gUnknown_083399EC[] = +static const TaskFunc sUnknown_083399EC[] = { sub_8080EA4, sub_8080FD0, sub_80810F8 }; @@ -279,22 +484,22 @@ static const union AnimCmd *const sSpriteAnimTable_82163AC[] = sSpriteAnim_82163A4 }; -const struct SpriteSheet sSpriteSheet_BlenderArrow = +static const struct SpriteSheet sSpriteSheet_BlenderArrow = { gBerryBlenderArrowTiles, 0x800, 46545 }; -const struct SpritePalette sSpritePal_BlenderMisc = +static const struct SpritePalette sSpritePal_BlenderMisc = { gBerryBlenderMiscPalette, 46546 }; -const struct SpritePalette sSpritePal_BlenderArrow = +static const struct SpritePalette sSpritePal_BlenderArrow = { gBerryBlenderArrowPalette, 12312 }; -const struct SpriteTemplate sBlenderSyncArrow_SpriteTemplate = +static const struct SpriteTemplate sBlenderSyncArrow_SpriteTemplate = { .tileTag = 46545, .paletteTag = 12312, @@ -358,12 +563,12 @@ static const union AnimCmd *const sSpriteAnimTable_8216444[] = sSpriteAnim_821643C, }; -const struct SpriteSheet gUnknown_08339B38 = +static const struct SpriteSheet sUnknown_08339B38 = { gBerryBlenderMarubatsuTiles, 0x200, 48888 }; -const struct SpriteTemplate gUnknown_08339B40 = +static const struct SpriteTemplate sUnknown_08339B40 = { .tileTag = 48888, .paletteTag = 46546, @@ -445,12 +650,12 @@ static const union AnimCmd *const sSpriteAnimTable_82164E0[] = sSpriteAnim_82164D8, }; -const struct SpriteSheet gUnknown_08339BD8 = +static const struct SpriteSheet sUnknown_08339BD8 = { gBerryBlenderParticlesTiles, 0xE0, 23456 }; -const struct SpriteTemplate gUnknown_08339BE0 = +static const struct SpriteTemplate sUnknown_08339BE0 = { .tileTag = 23456, .paletteTag = 46546, @@ -503,12 +708,12 @@ static const union AnimCmd *const sSpriteAnimTable_8216534[] = sSpriteAnim_821652C, }; -const struct SpriteSheet gUnknown_08339C24 = +static const struct SpriteSheet sUnknown_08339C24 = { gBerryBlenderCountdownNumbersTiles, 0x600, 12345 }; -const struct SpriteTemplate gUnknown_08339C2C = +static const struct SpriteTemplate sUnknown_08339C2C = { .tileTag = 12345, .paletteTag = 46546, @@ -547,12 +752,12 @@ static const union AnimCmd *const sSpriteAnimTable_8216570[] = sSpriteAnim_8216568, }; -const struct SpriteSheet gUnknown_08339C58 = +static const struct SpriteSheet sUnknown_08339C58 = { gBerryBlenderStartTiles, 0x400, 12346 }; -const struct SpriteTemplate gUnknown_08339C60 = +static const struct SpriteTemplate sUnknown_08339C60 = { .tileTag = 12346, .paletteTag = 46546, @@ -563,7 +768,7 @@ const struct SpriteTemplate gUnknown_08339C60 = .callback = sub_80830C0 }; -const s16 gUnknown_08339C78[][5] = +static const s16 sUnknown_08339C78[][5] = { {-10, 20, 10, 2, 1}, {250, 20, 10, -2, 1}, @@ -571,18 +776,18 @@ const s16 gUnknown_08339C78[][5] = {250, 140, 10, -2, -1}, }; -const u8 gUnknown_08339CA0[][3] = +static const u8 sOpponentBerrySets[][3] = { {4, 3, 2}, {0, 4, 3}, {1, 0, 4}, {2, 1, 0}, {3, 2, 1}, {0, 2, 3}, {1, 3, 4}, {2, 4, 0}, {3, 0, 1}, {4, 1, 2}, }; -const u8 gUnknown_08339CBE[] = {30, 31, 32, 33, 34}; +static const u8 sSpecialOpponentBerrySets[] = {30, 31, 32, 33, 34}; -const u8 gUnknown_08339CC3[] = {1, 1, 2, 3, 4}; +static const u8 sUnknown_08339CC3[] = {1, 1, 2, 3, 4}; -const u8 gUnknown_08339CC8[] = {0x1C, 0x16, 0x13, 0x1A, 0x19, 0x0E, 0x0D, 0x0B, 0x07, 0x15}; +static const u8 sUnknown_08339CC8[] = {0x1C, 0x16, 0x13, 0x1A, 0x19, 0x0E, 0x0D, 0x0B, 0x07, 0x15}; -static const u8 gUnknown_08339CD2[] = +static const u8 sUnknown_08339CD2[] = { 0xfe, 0x02, 0x02, 0xce, 0xd0, 0x37, 0x44, 0x07, 0x1f, 0x0c, 0x10, 0x00, 0xff, 0xfe, 0x91, 0x72, 0xce, 0xd0, 0x37, 0x44, 0x07, 0x1f, @@ -592,6 +797,2835 @@ static const u8 gUnknown_08339CD2[] = 0x05, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02 }; -const struct WindowTemplate gUnknown_08339D14[] = {0, 6, 4, 0x12, 0xB, 0xF, 8}; +static const struct WindowTemplate sBlenderRecordWindowTemplate = {0, 6, 4, 0x12, 0xB, 0xF, 8}; + +// code + +static void Blender_ControlHitPitch(void) +{ + m4aMPlayPitchControl(&gMPlay_SE2, 0xFFFF, 2 * (sBerryBlenderData->field_4C - 128)); +} + +static void VBlankCB0_BerryBlender(void) +{ + BerryBlender_SetBackgroundsPos(); + SetBgAffine(2, sBerryBlenderData->bgAffineSrc.texX, sBerryBlenderData->bgAffineSrc.texY, + sBerryBlenderData->bgAffineSrc.scrX, sBerryBlenderData->bgAffineSrc.scrY, + sBerryBlenderData->bgAffineSrc.sx, sBerryBlenderData->bgAffineSrc.sy, + sBerryBlenderData->bgAffineSrc.alpha); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static bool8 LoadBerryBlenderGfx(void) +{ + switch (sBerryBlenderData->loadGfxState) + { + case 0: + sBerryBlenderData->tilesBuffer = AllocZeroed(sub_8034974(sBlenderCenterGfx) + 100); + LZDecompressWram(sBlenderCenterGfx, sBerryBlenderData->tilesBuffer); + sBerryBlenderData->loadGfxState++; + break; + case 1: + CopyToBgTilemapBuffer(2, sBlenderCenterMap, 0x400, 0); + CopyBgTilemapBufferToVram(2); + LoadPalette(sBlenderCenterPal, 0, 0x100); + sBerryBlenderData->loadGfxState++; + break; + case 2: + LoadBgTiles(2, sBerryBlenderData->tilesBuffer, sub_8034974(sBlenderCenterGfx), 0); + sBerryBlenderData->loadGfxState++; + break; + case 3: + LZDecompressWram(gUnknown_08D91DB8, sBerryBlenderData->tilesBuffer); + sBerryBlenderData->loadGfxState++; + break; + case 4: + LoadBgTiles(1, sBerryBlenderData->tilesBuffer, sub_8034974(gUnknown_08D91DB8), 0); + sBerryBlenderData->loadGfxState++; + break; + case 5: + LZDecompressWram(gUnknown_08D927EC, sBerryBlenderData->tilesBuffer); + sBerryBlenderData->loadGfxState++; + break; + case 6: + CopyToBgTilemapBuffer(1, sBerryBlenderData->tilesBuffer, sub_8034974(gUnknown_08D927EC), 0); + CopyBgTilemapBufferToVram(1); + sBerryBlenderData->loadGfxState++; + break; + case 7: + LoadPalette(sBlenderOuterPal, 0x80, 0x20); + sBerryBlenderData->loadGfxState++; + break; + case 8: + LoadSpriteSheet(&sSpriteSheet_BlenderArrow); + LoadSpriteSheet(&sUnknown_08339BD8); + LoadSpriteSheet(&sUnknown_08339B38); + sBerryBlenderData->loadGfxState++; + break; + case 9: + LoadSpriteSheet(&sUnknown_08339C24); + LoadSpriteSheet(&sUnknown_08339C58); + LoadSpritePalette(&sSpritePal_BlenderArrow); + LoadSpritePalette(&sSpritePal_BlenderMisc); + Free(sBerryBlenderData->tilesBuffer); + sBerryBlenderData->loadGfxState = 0; + return TRUE; + } + + return FALSE; +} + +static void sub_807F9D0(void) +{ + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x1E, 0x14); + CopyBgTilemapBufferToVram(0); + ShowBg(0); + ShowBg(1); + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); +} + +static void InitBerryBlenderWindows(void) +{ + if (InitWindows(sBerryBlender_WindowTemplates)) + { + s32 i; + + DeactivateAllTextPrinters(); + for (i = 0; i < 5; i++) + FillWindowPixelBuffer(i, 0); + + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x1E, 0x14); + sub_81978B0(0xE0); + } +} + +void DoBerryBlending(void) +{ + if (sBerryBlenderData == NULL) + sBerryBlenderData = AllocZeroed(sizeof(*sBerryBlenderData)); + + sBerryBlenderData->gameEndState = 0; + sBerryBlenderData->mainState = 0; + sBerryBlenderData->gameEndState = 0; + + Blender_SetPlayerNamesLocal(gSpecialVar_0x8004); + SetMainCallback2(sub_807FAC8); +} + +static void sub_807FAC8(void) +{ + s32 i; + + switch (sBerryBlenderData->mainState) + { + case 0: + SetGpuReg(REG_OFFSET_DISPCNT, 0); + ResetSpriteData(); + FreeAllSpritePalettes(); + SetVBlankCallback(NULL); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(1, sBerryBlenderBgTemplates, ARRAY_COUNT(sBerryBlenderBgTemplates)); + SetBgTilemapBuffer(1, sBerryBlenderData->tilemapBuffers[0]); + SetBgTilemapBuffer(2, sBerryBlenderData->tilemapBuffers[1]); + sub_809882C(0, 1, 0xD0); + copy_textbox_border_tile_patterns_to_vram(0, 0x14, 0xF0); + InitBerryBlenderWindows(); + + sBerryBlenderData->mainState++; + sBerryBlenderData->field_118 = 0; + sBerryBlenderData->field_116 = 0; + sBerryBlenderData->field_11A = 0x50; + sBerryBlenderData->bg_X = 0; + sBerryBlenderData->bg_Y = 0; + sBerryBlenderData->loadGfxState = 0; + + sub_8082D28(); + break; + case 1: + if (LoadBerryBlenderGfx()) + { + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + sBerryBlenderData->syncArrowSpriteIds[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1); + StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSpriteIds[i]], i + 8); + } + if (gReceivedRemoteLinkPlayers != 0 && gLinkVSyncDisabled) + { + sub_800E0E8(); + sub_800DFB4(0, 0); + } + SetVBlankCallback(VBlankCB0_BerryBlender); + sBerryBlenderData->mainState++; + } + break; + case 2: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + sub_8082D28(); + sBerryBlenderData->mainState++; + break; + case 3: + sub_807F9D0(); + if (!gPaletteFade.active) + sBerryBlenderData->mainState++; + break; + case 4: + if (Blender_PrintText(&sBerryBlenderData->textState, sText_BerryBlenderStart, GetPlayerTextSpeed())) + sBerryBlenderData->mainState++; + break; + case 5: + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + sBerryBlenderData->mainState++; + break; + case 6: + if (!gPaletteFade.active) + { + FreeAllWindowBuffers(); + UnsetBgTilemapBuffer(2); + UnsetBgTilemapBuffer(1); + SetVBlankCallback(NULL); + sub_81AABF0(sub_807FFA4); + + sBerryBlenderData->mainState = 0; + } + break; + } + + AnimateSprites(); + BuildOamBuffer(); + RunTextPrinters(); + UpdatePaletteFade(); +} + +static void sub_807FD08(struct Sprite* sprite) +{ + sprite->data[1] += sprite->data[6]; + sprite->data[2] -= sprite->data[4]; + sprite->data[2] += sprite->data[7]; + sprite->data[0] += sprite->data[7]; + sprite->data[4]--; + + if (sprite->data[0] < sprite->data[2]) + { + sprite->data[3] = sprite->data[4] = sprite->data[3] - 1; + + if (++sprite->data[5] > 3) + DestroySprite(sprite); + else + PlaySE(SE_TB_KARA); + } + sprite->pos1.x = sprite->data[1]; + sprite->pos1.y = sprite->data[2]; +} + +static void sub_807FD64(struct Sprite* sprite, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6) +{ + sprite->data[0] = a3; + sprite->data[1] = a2; + sprite->data[2] = a3; + sprite->data[3] = a4; + sprite->data[4] = 10; + sprite->data[5] = 0; + sprite->data[6] = a5; + sprite->data[7] = a6; + sprite->callback = sub_807FD08; +} + +static void sub_807FD90(u16 a0, u8 a1) +{ + u8 spriteId = sub_80D511C(a0 + 123, 0, 80, a1 & 1); + sub_807FD64(&gSprites[spriteId], sUnknown_08339C78[a1][0], sUnknown_08339C78[a1][1], sUnknown_08339C78[a1][2], sUnknown_08339C78[a1][3], sUnknown_08339C78[a1][4]); +} + +static void Blender_CopyBerryData(struct BlenderBerry* berry, u16 itemId) +{ + const struct Berry *berryInfo = GetBerryInfo(ITEM_TO_BERRY(itemId)); + + berry->itemId = itemId; + StringCopy(berry->name, berryInfo->name); + berry->flavors[FLAVOR_SPICY] = berryInfo->spicy; + berry->flavors[FLAVOR_DRY] = berryInfo->dry; + berry->flavors[FLAVOR_SWEET] = berryInfo->sweet; + berry->flavors[FLAVOR_BITTER] = berryInfo->bitter; + berry->flavors[FLAVOR_SOUR] = berryInfo->sour; + berry->smoothness = berryInfo->smoothness; +} + +static void Blender_SetPlayerNamesLocal(u8 opponentsNum) +{ + switch (opponentsNum) + { + case 0: + gInGameOpponentsNo = 0; + break; + case 1: + gInGameOpponentsNo = 1; + sBerryBlenderData->playersNo = 2; + StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); + + if (!FlagGet(FLAG_0x340)) + StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_MASTER]); + else + StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_MISTER]); + + gLinkPlayers[0].language = GAME_LANGUAGE; + gLinkPlayers[1].language = GAME_LANGUAGE; + break; + case 2: + gInGameOpponentsNo = 2; + sBerryBlenderData->playersNo = 3; + StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); + StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_DUDE]); + StringCopy(gLinkPlayers[2].name, sBlenderOpponentsNames[BLENDER_LASSIE]); + + gLinkPlayers[0].language = GAME_LANGUAGE; + gLinkPlayers[1].language = GAME_LANGUAGE; + gLinkPlayers[2].language = GAME_LANGUAGE; + break; + case 3: + gInGameOpponentsNo = 3; + sBerryBlenderData->playersNo = 4; + StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); + StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_MISS]); + StringCopy(gLinkPlayers[2].name, sBlenderOpponentsNames[BLENDER_LADDIE]); + StringCopy(gLinkPlayers[3].name, sBlenderOpponentsNames[BLENDER_LASSIE]); + + gLinkPlayers[0].language = GAME_LANGUAGE; + gLinkPlayers[1].language = GAME_LANGUAGE; + gLinkPlayers[2].language = GAME_LANGUAGE; + gLinkPlayers[3].language = GAME_LANGUAGE; + break; + } +} + +static void sub_807FFA4(void) +{ + s32 i; + + SetGpuReg(REG_OFFSET_DISPCNT, 0); + if (sBerryBlenderData == NULL) + sBerryBlenderData = AllocZeroed(sizeof(*sBerryBlenderData)); + + sBerryBlenderData->mainState = 0; + sBerryBlenderData->field_10C = 0; + + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + sBerryBlenderData->chosenItemId[i] = ITEM_NONE; + + Blender_SetPlayerNamesLocal(gSpecialVar_0x8004); + + if (gSpecialVar_0x8004 == 0) + SetMainCallback2(sub_8080018); + else + SetMainCallback2(sub_80808D4); +} + +static void sub_8080018(void) +{ + s32 i, j; + + switch (sBerryBlenderData->mainState) + { + case 0: + sub_8080588(); + gLinkType = 0x4422; + sBerryBlenderData->field_72 = 0; + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + sBerryBlenderData->field_64[i] = 0; + for (j = 0; j < 3; j++) + { + sBerryBlenderData->scores[i][j] = 0; + } + } + sBerryBlenderData->playAgainState = 0; + sBerryBlenderData->max_RPM = 0; + sBerryBlenderData->loadGfxState = 0; + sBerryBlenderData->mainState++; + break; + case 1: + if (LoadBerryBlenderGfx()) + { + sBerryBlenderData->mainState++; + sub_8082D28(); + } + break; + case 2: + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + sBerryBlenderData->syncArrowSprite2Ids[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1); + StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSprite2Ids[i]], i + 8); + } + if (gReceivedRemoteLinkPlayers != 0 && gLinkVSyncDisabled) + { + sub_800E0E8(); + sub_800DFB4(0, 0); + } + sBerryBlenderData->mainState++; + break; + case 3: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + sBerryBlenderData->mainState++; + break; + case 4: + sub_807F9D0(); + if (!gPaletteFade.active) + { + sBerryBlenderData->mainState++; + } + break; + case 5: + Blender_PrintText(&sBerryBlenderData->textState, sText_CommunicationStandby, 0); + sBerryBlenderData->mainState = 8; + sBerryBlenderData->framesToWait = 0; + break; + case 8: + sBerryBlenderData->mainState++; + sBerryBlenderData->field_114 = 0; + Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId); + memcpy(gBlockSendBuffer, &sBerryBlenderData->blendedBerries[0], sizeof(struct BlenderBerry)); + sub_800ADF8(); + sBerryBlenderData->framesToWait = 0; + break; + case 9: + if (sub_800A520()) + { + ResetBlockReceivedFlags(); + if (GetMultiplayerId() == 0) + sub_800A4D8(4); + sBerryBlenderData->mainState++; + } + break; + case 10: + if (++sBerryBlenderData->framesToWait > 20) + { + sub_8197DF8(4, TRUE); + if (GetBlockReceivedStatus() == sub_800A9D8()) + { + for (i = 0; i < GetLinkPlayerCount(); i++) + { + memcpy(&sBerryBlenderData->blendedBerries[i], &gBlockRecvBuffer[i][0], sizeof(struct BlenderBerry)); + sBerryBlenderData->chosenItemId[i] = sBerryBlenderData->blendedBerries[i].itemId; + } + + ResetBlockReceivedFlags(); + sBerryBlenderData->mainState++; + } + } + break; + case 11: + sBerryBlenderData->playersNo = GetLinkPlayerCount(); + + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + if (sBerryBlenderData->field_114 == sUnknown_083399D0[sBerryBlenderData->playersNo - 2][i]) + { + sub_807FD90(sBerryBlenderData->chosenItemId[sBerryBlenderData->field_114], i); + break; + } + } + + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->mainState++; + sBerryBlenderData->field_114++; + break; + case 12: + if (++sBerryBlenderData->framesToWait > 60) + { + if (sBerryBlenderData->field_114 >= sBerryBlenderData->playersNo) + { + sBerryBlenderData->mainState++; + sBerryBlenderData->arrowPos = sUnknown_083399DC[sUnknown_083399E4[sBerryBlenderData->playersNo - 2]] - 22528; + } + else + { + sBerryBlenderData->mainState--; + } + sBerryBlenderData->framesToWait = 0; + } + break; + case 13: + if (sub_800A520()) + { + sBerryBlenderData->mainState++; + sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + PlaySE(SE_RU_HYUU); + ShowBg(2); + } + break; + case 14: + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); + sBerryBlenderData->arrowPos += 0x200; + sBerryBlenderData->field_11A += 4; + if (sBerryBlenderData->field_11A > 0xFF) + { + SetGpuRegBits(REG_OFFSET_BG2CNT, 2); + sBerryBlenderData->mainState++; + sBerryBlenderData->field_11A = 0x100; + sBerryBlenderData->arrowPos = sUnknown_083399DC[sUnknown_083399E4[sBerryBlenderData->playersNo - 2]]; + sBerryBlenderData->framesToWait = 0; + PlaySE(SE_TRACK_DOOR); + sub_808074C(); + Blender_PrintPlayerNames(); + } + sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + break; + case 15: + if (sub_8083380()) + { + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->mainState++; + } + sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + break; + case 16: + CreateSprite(&sUnknown_08339C2C, 120, -16, 3); + sBerryBlenderData->mainState++; + break; + case 18: + sBerryBlenderData->mainState++; + break; + case 19: + sub_800ADF8(); + sBerryBlenderData->mainState++; + break; + case 20: + if (sub_800A520()) + { + sub_800A418(); + sBerryBlenderData->mainState++; + } + break; + case 21: + sBerryBlenderData->field_4C = 128; + sBerryBlenderData->gameFrameTime = 0; + SetMainCallback2(sub_8081898); + if (GetCurrentMapMusic() != BGM_CYCLING) + { + sBerryBlenderData->field_154 = GetCurrentMapMusic(); + } + PlayBGM(BGM_CYCLING); + break; + } + + Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + RunTextPrinters(); + UpdatePaletteFade(); +} + +static void sub_8080588(void) +{ + SetGpuReg(REG_OFFSET_DISPCNT, 0); + + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + + SetVBlankCallback(VBlankCB0_BerryBlender); + + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(1, sBerryBlenderBgTemplates, ARRAY_COUNT(sBerryBlenderBgTemplates)); + + SetBgTilemapBuffer(1, sBerryBlenderData->tilemapBuffers[0]); + SetBgTilemapBuffer(2, sBerryBlenderData->tilemapBuffers[1]); + + sub_809882C(0, 1, 0xD0); + copy_textbox_border_tile_patterns_to_vram(0, 0x14, 0xF0); + InitBerryBlenderWindows(); + + sBerryBlenderData->field_44 = 0; + sBerryBlenderData->field_4C = 0; + sBerryBlenderData->arrowPos = 0; + sBerryBlenderData->max_RPM = 0; + sBerryBlenderData->bg_X = 0; + sBerryBlenderData->bg_Y = 0; +} + +static u8 sub_8080624(u16 arrowPos, u8 playerId) +{ + u32 var1 = (arrowPos / 0x100) + 0x18; + u8 arrID = sBerryBlenderData->field_96[playerId]; + u32 var2 = sUnknown_083399E7[arrID]; + + if (var1 >= var2 && var1 < var2 + 0x30) + { + if (var1 >= var2 + 20 && var1 < var2 + 28) + return 2; + else + return 1; + } + + return 0; +} + +static void Blender_SetOpponentsBerryData(u16 playerBerryItemId, u8 playersNum, struct BlenderBerry* playerBerry) +{ + u16 opponentSetId = 0; + u16 opponentBerryId; + u16 var; + u16 i; + + if (playerBerryItemId == ITEM_ENIGMA_BERRY) + { + for (i = 0; i < FLAVOR_COUNT; i++) + { + if (playerBerry->flavors[opponentSetId] > playerBerry->flavors[i]) + opponentSetId = i; + } + opponentSetId += 5; + } + else + { + opponentSetId = playerBerryItemId - FIRST_BERRY_INDEX; + if (opponentSetId >= 5) + opponentSetId = (opponentSetId % 5) + 5; + } + for (i = 0; i < playersNum - 1; i++) + { + opponentBerryId = sOpponentBerrySets[opponentSetId][i]; + var = playerBerryItemId - 163; + if (!FlagGet(0x340) && gSpecialVar_0x8004 == 1) + { + opponentSetId %= 5; + opponentBerryId = sSpecialOpponentBerrySets[opponentSetId]; + if (var <= 4) + opponentBerryId -= 5; + } + Blender_SetBankBerryData(i + 1, opponentBerryId + FIRST_BERRY_INDEX); + } +} + +static void sub_808074C(void) +{ + s32 i, j; + + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + sBerryBlenderData->field_96[i] = 0xFF; + sBerryBlenderData->field_8E[i] = sUnknown_083399D0[sBerryBlenderData->playersNo - 2][i]; + } + for (j = 0; j < BLENDER_MAX_PLAYERS; j++) + { + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + if (sBerryBlenderData->field_8E[i] == j) + sBerryBlenderData->field_96[j] = i; + } + } +} + +static void Blender_PrintPlayerNames(void) +{ + s32 i, xPos; + u32 multiplayerId = 0; + u8 text[20]; + + if (gReceivedRemoteLinkPlayers) + multiplayerId = GetMultiplayerId(); + + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + if (sBerryBlenderData->field_8E[i] != 0xFF) + { + sBerryBlenderData->syncArrowSpriteIds[sBerryBlenderData->field_8E[i]] = sBerryBlenderData->syncArrowSprite2Ids[i]; + StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSpriteIds[sBerryBlenderData->field_8E[i]]], i); + + text[0] = EOS; + StringCopy(text, gLinkPlayers[sBerryBlenderData->field_8E[i]].name); + xPos = GetStringCenterAlignXOffset(1, text, 0x38); + + if (multiplayerId == sBerryBlenderData->field_8E[i]) + Blender_AddTextPrinter(i, text, xPos, 1, 0, 2); + else + Blender_AddTextPrinter(i, text, xPos, 1, 0, 1); + + PutWindowTilemap(i); + CopyWindowToVram(i, 3); + } + } +} + +static void sub_80808D4(void) +{ + s32 i, j; + + switch (sBerryBlenderData->mainState) + { + case 0: + sub_800B4C0(); + sub_8080588(); + Blender_SetBankBerryData(0, gSpecialVar_ItemId); + Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId); + Blender_SetOpponentsBerryData(gSpecialVar_ItemId, sBerryBlenderData->playersNo, &sBerryBlenderData->blendedBerries[0]); + + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + sBerryBlenderData->field_64[i] = 0; + for (j = 0; j < 3; j++) + { + sBerryBlenderData->scores[i][j] = 0; + } + } + + sBerryBlenderData->playAgainState = 0; + sBerryBlenderData->loadGfxState = 0; + gLinkType = 0x4422; + sBerryBlenderData->mainState++; + break; + case 1: + if (LoadBerryBlenderGfx()) + { + sBerryBlenderData->mainState++; + sub_8082D28(); + } + break; + case 2: + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + sBerryBlenderData->syncArrowSprite2Ids[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1); + StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSprite2Ids[i]], i + 8); + } + sBerryBlenderData->mainState++; + break; + case 3: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + sBerryBlenderData->mainState++; + sBerryBlenderData->framesToWait = 0; + break; + case 4: + if (++sBerryBlenderData->framesToWait == 2) + sub_807F9D0(); + if (!gPaletteFade.active) + sBerryBlenderData->mainState = 8; + break; + case 8: + sBerryBlenderData->mainState = 11; + sBerryBlenderData->field_114 = 0; + break; + case 11: + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + u32 var = sUnknown_083399D0[sBerryBlenderData->playersNo - 2][i]; + if (sBerryBlenderData->field_114 == var) + { + sub_807FD90(sBerryBlenderData->chosenItemId[sBerryBlenderData->field_114], i); + break; + } + } + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->mainState++; + sBerryBlenderData->field_114++; + break; + case 12: + if (++sBerryBlenderData->framesToWait > 60) + { + if (sBerryBlenderData->field_114 >= sBerryBlenderData->playersNo) + { + sBerryBlenderData->arrowPos = sUnknown_083399DC[sUnknown_083399E4[sBerryBlenderData->playersNo - 2]] - 22528; + sBerryBlenderData->mainState++; + } + else + { + sBerryBlenderData->mainState--; + } + sBerryBlenderData->framesToWait = 0; + } + break; + case 13: + sBerryBlenderData->mainState++; + sub_808074C(); + PlaySE(SE_RU_HYUU); + sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + ShowBg(2); + break; + case 14: + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); + sBerryBlenderData->arrowPos += 0x200; + sBerryBlenderData->field_11A += 4; + if (sBerryBlenderData->field_11A > 0xFF) + { + sBerryBlenderData->mainState++; + sBerryBlenderData->field_11A = 0x100; + sBerryBlenderData->arrowPos = sUnknown_083399DC[sUnknown_083399E4[sBerryBlenderData->playersNo - 2]]; + SetGpuRegBits(REG_OFFSET_BG2CNT, 2); + sBerryBlenderData->framesToWait = 0; + PlaySE(SE_TRACK_DOOR); + Blender_PrintPlayerNames(); + } + sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + break; + case 15: + if (sub_8083380()) + { + sBerryBlenderData->mainState++; + } + sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + break; + case 16: + CreateSprite(&sUnknown_08339C2C, 120, -16, 3); + sBerryBlenderData->mainState++; + break; + case 18: + sBerryBlenderData->mainState++; + break; + case 19: + sBerryBlenderData->mainState++; + break; + case 20: + sBerryBlenderData->mainState++; + break; + case 21: + sub_8080DF8(); + sBerryBlenderData->field_4C = 0x80; + sBerryBlenderData->gameFrameTime = 0; + sBerryBlenderData->field_123 = 0; + sBerryBlenderData->field_72 = 0; + SetMainCallback2(sub_8081898); + + if (gSpecialVar_0x8004 == 1) + { + if (!FlagGet(FLAG_0x340)) + sBerryBlenderData->field_120[0] = CreateTask(sub_8081224, 10); + else + sBerryBlenderData->field_120[0] = CreateTask(sUnknown_083399EC[0], 10); + } + + if (gSpecialVar_0x8004 > 1) + { + for (i = 0; i < gSpecialVar_0x8004; i++) + sBerryBlenderData->field_120[i] = CreateTask(sUnknown_083399EC[i], 10 + i); + } + + if (GetCurrentMapMusic() != BGM_CYCLING) + sBerryBlenderData->field_154 = GetCurrentMapMusic(); + + PlayBGM(BGM_CYCLING); + PlaySE(SE_MOTER); + Blender_ControlHitPitch(); + break; + } + + Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + RunTextPrinters(); + UpdatePaletteFade(); +} + +static void sub_8080DF8(void) +{ + s32 i; + for (i = 0; i < 4; i++) + { + gSendCmd[0] = 0; + gSendCmd[2] = 0; + gRecvCmds[i][0] = 0; + gRecvCmds[i][2] = 0; + } +} + +static void sub_8080E20(u8 taskId) +{ + if(++gTasks[taskId].data[0] > gTasks[taskId].data[1]) + { + gRecvCmds[gTasks[taskId].data[2]][2] = 0x2345; + DestroyTask(taskId); + } +} + +static void sub_8080E6C(u8 a0, u8 a1) +{ + u8 taskId = CreateTask(sub_8080E20, 80); + gTasks[taskId].data[1] = a1; + gTasks[taskId].data[2] = a0; +} + +static void sub_8080EA4(u8 taskId) +{ + if (sub_8080624(sBerryBlenderData->arrowPos, 1) == 2) + { + if (gTasks[taskId].data[0] == 0) + { + if (sBerryBlenderData->field_123 == 0) + { + u8 rand = Random() / 655; + if (sBerryBlenderData->field_4C < 500) + { + if (rand > 75) + gRecvCmds[1][2] = 0x4523; + else + gRecvCmds[1][2] = 0x5432; + + gRecvCmds[1][2] = 0x5432; + } + else if (sBerryBlenderData->field_4C < 1500) + { + if (rand > 80) + { + gRecvCmds[1][2] = 0x4523; + } + else + { + u8 value = rand - 21; + if (value < 60) + gRecvCmds[1][2] = 0x5432; + else if (rand < 10) + sub_8080E6C(1, 5); + } + } + else if (rand <= 90) + { + u8 value = rand - 71; + if (value < 20) + gRecvCmds[1][2] = 0x5432; + else if (rand < 30) + sub_8080E6C(1, 5); + } + else + { + gRecvCmds[1][2] = 0x4523; + } + } + else + { + gRecvCmds[1][2] = 0x4523; + } + + gTasks[taskId].data[0] = 1; + } + } + else + { + gTasks[taskId].data[0] = 0; + } +} + +static void sub_8080FD0(u8 taskId) +{ + u32 var1 = (sBerryBlenderData->arrowPos + 0x1800) & 0xFFFF; + u32 var2 = sBerryBlenderData->field_96[2] & 0xFF; + if ((var1 >> 8) > sUnknown_083399E7[var2] + 20 && (var1 >> 8) < sUnknown_083399E7[var2] + 40) + { + if (gTasks[taskId].data[0] == 0) + { + if (sBerryBlenderData->field_123 == 0) + { + u8 rand = Random() / 655; + if (sBerryBlenderData->field_4C < 500) + { + if (rand > 66) + gRecvCmds[2][2] = 0x4523; + else + gRecvCmds[2][2] = 0x5432; + } + else + { + u8 value; + if (rand > 65) + gRecvCmds[2][2] = 0x4523; + value = rand - 41; + if (value < 25) + gRecvCmds[2][2] = 0x5432; + if (rand < 10) + sub_8080E6C(2, 5); + } + + gTasks[taskId].data[0] = 1; + } + else + { + gRecvCmds[2][2] = 0x4523; + gTasks[taskId].data[0] = 1; + } + } + } + else + { + gTasks[taskId].data[0] = 0; + } +} + +static void sub_80810F8(u8 taskId) +{ + u32 var1, var2; + + var1 = (sBerryBlenderData->arrowPos + 0x1800) & 0xFFFF; + var2 = sBerryBlenderData->field_96[3] & 0xFF; + if ((var1 >> 8) > sUnknown_083399E7[var2] + 20 && (var1 >> 8) < sUnknown_083399E7[var2] + 40) + { + if (gTasks[taskId].data[0] == 0) + { + if (sBerryBlenderData->field_123 == 0) + { + u8 rand = (Random() / 655); + if (sBerryBlenderData->field_4C < 500) + { + if (rand > 88) + gRecvCmds[3][2] = 0x4523; + else + gRecvCmds[3][2] = 0x5432; + } + else + { + if (rand > 60) + { + gRecvCmds[3][2] = 0x4523; + } + else + { + s8 value = rand - 56; // makes me wonder what the original code was + u8 value2 = value; + if (value2 < 5) + gRecvCmds[3][2] = 0x5432; + } + if (rand < 5) + sub_8080E6C(3, 5); + } + gTasks[taskId].data[0] = 1; + } + else + { + gRecvCmds[3][2] = 0x4523; + gTasks[taskId].data[0] = 1; + } + } + } + else + { + gTasks[taskId].data[0] = 0; + } +} + +static void sub_8081224(u8 taskId) +{ + if (sub_8080624(sBerryBlenderData->arrowPos, 1) == 2) + { + if (gTasks[taskId].data[0] == 0) + { + gRecvCmds[1][2] = 0x4523; + gTasks[taskId].data[0] = 1; + } + } + else + { + gTasks[taskId].data[0] = 0; + } +} + +static void sub_8081288(u16 a0, u8 a1) +{ + u8 spriteId; + + spriteId = CreateSprite(&sUnknown_08339B40, + sBlenderSyncArrowsPos[a1][0] - (10 * sUnknown_083399C0[a1][0]), + sBlenderSyncArrowsPos[a1][1] - (10 * sUnknown_083399C0[a1][1]), + 1); + if (a0 == 0x4523) + { + StartSpriteAnim(&gSprites[spriteId], 2); + gSprites[spriteId].callback = sub_8082F9C; + PlaySE(SE_RU_GASHIN); + } + else if (a0 == 0x5432) + { + StartSpriteAnim(&gSprites[spriteId], 0); + PlaySE(SE_SEIKAI); + } + else if (a0 == 0x2345) + { + StartSpriteAnim(&gSprites[spriteId], 1); + PlaySE(SE_HAZURE); + } + sub_8082E84(); +} + +static void sub_8081370(u16 a0) +{ + Blender_ControlHitPitch(); + switch (a0) + { + case 0x4523: + if (sBerryBlenderData->field_4C < 1500) + sBerryBlenderData->field_4C += (0x180 / sUnknown_08339CC3[sBerryBlenderData->playersNo]); + else + { + sBerryBlenderData->field_4C += (128 / sUnknown_08339CC3[sBerryBlenderData->playersNo]); + sub_80832BC(&sBerryBlenderData->bg_X, (sBerryBlenderData->field_4C / 100) - 10); + sub_80832BC(&sBerryBlenderData->bg_Y, (sBerryBlenderData->field_4C / 100) - 10); + } + break; + case 0x5432: + if (sBerryBlenderData->field_4C < 1500) + sBerryBlenderData->field_4C += (0x100 / sUnknown_08339CC3[sBerryBlenderData->playersNo]); + break; + case 0x2345: + sBerryBlenderData->field_4C -= (0x100 / sUnknown_08339CC3[sBerryBlenderData->playersNo]); + if (sBerryBlenderData->field_4C < 0x80) + sBerryBlenderData->field_4C = 0x80; + break; + } +} + +static bool32 sub_80814B0(u16 arg0, u16 arg1, u16 arg2) +{ + if (gReceivedRemoteLinkPlayers != 0 && gLinkVSyncDisabled) + { + if ((arg0 & 0xFF00) == arg2) + return TRUE; + } + else + { + if (arg0 == arg1) + return TRUE; + } + + return FALSE; +} + +static void sub_80814F4(void) +{ + s32 i; + + if (gSpecialVar_0x8004 != 0) + { + if (gSendCmd[2] != 0) + { + gRecvCmds[0][2] = gSendCmd[2]; + gRecvCmds[0][0] = 0x4444; + gSendCmd[2] = 0; + } + for (i = 1; i < 4; i++) + { + if (gRecvCmds[i][2] != 0) + gRecvCmds[i][0] = 0x4444; + } + } + for (i = 0; i < sBerryBlenderData->playersNo; i++) + { + if (sub_80814B0(gRecvCmds[i][0], 0x4444, 0x4400)) + { + u32 var = sBerryBlenderData->field_96[i]; + if (gRecvCmds[i][2] == 0x4523) + { + sub_8081370(0x4523); + sBerryBlenderData->field_116 += (sBerryBlenderData->field_4C / 55); + if (sBerryBlenderData->field_116 >= 1000) + sBerryBlenderData->field_116 = 1000; + sub_8081288(0x4523, var); + sBerryBlenderData->scores[i][BLENDER_SCORE_BEST]++; + } + else if (gRecvCmds[i][2] == 0x5432) + { + sub_8081370(0x5432); + sBerryBlenderData->field_116 += (sBerryBlenderData->field_4C / 70); + sub_8081288(0x5432, var); + sBerryBlenderData->scores[i][BLENDER_SCORE_GOOD]++; + } + else if (gRecvCmds[i][2] == 0x2345) + { + sub_8081288(0x2345, var); + sub_8081370(0x2345); + if (sBerryBlenderData->scores[i][BLENDER_SCORE_MISS] < 999) + sBerryBlenderData->scores[i][BLENDER_SCORE_MISS]++; + } + if (gRecvCmds[i][2] == 0x2345 || gRecvCmds[2][i] == 0x4523 || gRecvCmds[2][i] == 0x5432) // could be a bug, 2 and i are reversed + { + if (sBerryBlenderData->field_4C > 1500) + m4aMPlayTempoControl(&gMPlay_BGM, ((sBerryBlenderData->field_4C - 750) / 20) + 256); + else + m4aMPlayTempoControl(&gMPlay_BGM, 0x100); + } + } + } + if (gSpecialVar_0x8004 != 0) + { + for (i = 0; i < sBerryBlenderData->playersNo; i++) + { + gRecvCmds[i][0] = 0; + gRecvCmds[i][2] = 0; + } + } +} + +static void sub_8081744(void) +{ + u8 var2; + bool8 A_pressed = FALSE; + u8 playerId = 0; + + if (gReceivedRemoteLinkPlayers != 0) + playerId = GetMultiplayerId(); + + var2 = sBerryBlenderData->field_96[playerId]; + + if (sBerryBlenderData->gameEndState == 0) + { + if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A && gMain.newKeys & A_BUTTON) + { + if ((gMain.heldKeysRaw & (A_BUTTON | L_BUTTON)) != (A_BUTTON | L_BUTTON)) + A_pressed = TRUE; + } + else if (gMain.newKeys & A_BUTTON) + { + A_pressed = TRUE; + } + + if (A_pressed) + { + u8 var3; + StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSpriteIds[sBerryBlenderData->field_8E[var2]]], var2 + 4); + var3 = sub_8080624(sBerryBlenderData->arrowPos, playerId); + + if (var3 == 2) + gSendCmd[2] = 0x4523; + else if (var3 == 1) + gSendCmd[2] = 0x5432; + else + gSendCmd[2] = 0x2345; + } + } + if (++sBerryBlenderData->field_72 > 5) + { + if (sBerryBlenderData->field_4C > 128) + sBerryBlenderData->field_4C--; + sBerryBlenderData->field_72 = 0; + } + if (gUnknown_020322D5 && gMain.newKeys & L_BUTTON) + sBerryBlenderData->field_123 ^= 1; +} + +static void sub_8081898(void) +{ + sub_8082D28(); + + if (sBerryBlenderData->gameFrameTime < (99 * 60 * 60) + (59 * 60)) // game time can't be longer than 99 minutes and 59 seconds, can't print 3 digits + sBerryBlenderData->gameFrameTime++; + + sub_8081744(); + SetLinkDebugValues((u16)(sBerryBlenderData->field_4C), sBerryBlenderData->field_116); + sub_80814F4(); + sub_8083140(sBerryBlenderData->field_116, 1000); + sub_8083230(sBerryBlenderData->field_4C); + sub_808330C(); + sub_8082AD4(); + if (sBerryBlenderData->gameEndState == 0 && sBerryBlenderData->field_118 >= 1000) + { + sBerryBlenderData->field_116 = 1000; + sBerryBlenderData->gameEndState = 1; + SetMainCallback2(CB2_HandleBlenderEndGame); + } + + Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + RunTextPrinters(); + UpdatePaletteFade(); +} + +static void Blender_DummiedOutFunc(s16 a0, s16 a1) +{ + +} + +static bool8 sub_8081964(struct BlenderBerry* berries, u8 index1, u8 index2) +{ + if (berries[index1].itemId != berries[index2].itemId + || (StringCompare(berries[index1].name, berries[index2].name) == 0 + && (berries[index1].flavors[FLAVOR_SPICY] == berries[index2].flavors[FLAVOR_SPICY] + && berries[index1].flavors[FLAVOR_DRY] == berries[index2].flavors[FLAVOR_DRY] + && berries[index1].flavors[FLAVOR_SWEET] == berries[index2].flavors[FLAVOR_SWEET] + && berries[index1].flavors[FLAVOR_BITTER] == berries[index2].flavors[FLAVOR_BITTER] + && berries[index1].flavors[FLAVOR_SOUR] == berries[index2].flavors[FLAVOR_SOUR] + && berries[index1].smoothness == berries[index2].smoothness))) + return TRUE; + else + return FALSE; +} + +static u32 Blender_GetPokeblockColor(struct BlenderBerry* berries, s16* a1, u8 playersNo, u8 a3) +{ + s16 vars[6]; + s32 i; + s32 r6; + u8 r2; + + for (i = 0; i < 6; i++) + vars[i] = a1[i]; + + r6 = 0; + for (i = 0; i < 5; i++) + { + if (vars[i] == 0) + r6++; + } + if (r6 == 5 || a3 > 3) + return 12; + for (i = 0; i < playersNo; i++) + { + for (r6 = 0; r6 < playersNo; r6++) + { + if (berries[i].itemId == berries[r6].itemId && i != r6 + && (berries[i].itemId != ITEM_ENIGMA_BERRY || sub_8081964(berries, i, r6))) + return 12; + } + } + r2 = 0; + for (r2 = 0, i = 0; i < 5; i++) + { + if (vars[i] > 0) + r2++; + } + if (r2 > 3) + return 13; + if (r2 == 3) + return 11; + for (i = 0; i < 5; i++) + { + if (vars[i] > 50) + return 14; + } + if (r2 == 1 && vars[0] > 0) + return 1; + if (r2 == 1 && vars[1] > 0) + return 2; + if (r2 == 1 && vars[2] > 0) + return 3; + if (r2 == 1 && vars[3] > 0) + return 4; + if (r2 == 1 && vars[4] > 0) + return 5; + if (r2 == 2) + { + s32 var = 0; + for (i = 0; i < 5; i++) + { + if (vars[i] > 0) + sUnknown_03000DF8[var++] = i; + } + if (vars[sUnknown_03000DF8[0]] >= vars[sUnknown_03000DF8[1]]) + { + if (sUnknown_03000DF8[0] == 0) + return (sUnknown_03000DF8[1] << 16) | 6; + if (sUnknown_03000DF8[0] == 1) + return (sUnknown_03000DF8[1] << 16) | 7; + if (sUnknown_03000DF8[0] == 2) + return (sUnknown_03000DF8[1] << 16) | 8; + if (sUnknown_03000DF8[0] == 3) + return (sUnknown_03000DF8[1] << 16) | 9; + if (sUnknown_03000DF8[0] == 4) + return (sUnknown_03000DF8[1] << 16) | 10; + } + else + { + if (sUnknown_03000DF8[1] == 0) + return (sUnknown_03000DF8[0] << 16) | 6; + if (sUnknown_03000DF8[1] == 1) + return (sUnknown_03000DF8[0] << 16) | 7; + if (sUnknown_03000DF8[1] == 2) + return (sUnknown_03000DF8[0] << 16) | 8; + if (sUnknown_03000DF8[1] == 3) + return (sUnknown_03000DF8[0] << 16) | 9; + if (sUnknown_03000DF8[1] == 4) + return (sUnknown_03000DF8[0] << 16) | 10; + } + } + return 0; +} + +static void sub_8081BB0(s16 value) +{ + sUnknown_03000E04 = value; +} + +static s16 sub_8081BBC(void) +{ + return sUnknown_03000E04; +} + +static void sub_8081BC8(s16 value) +{ + sUnknown_03000E06 = value; +} + +static s16 sub_8081BD4(void) +{ + return sUnknown_03000E06; +} + +static void Blender_CalculatePokeblock(struct BlenderBerry *berries, struct Pokeblock *pokeblock, u8 playersNo, u8 *flavors, u16 maxRPM) +{ + s32 i, j; + s32 multiuseVar, var2; + u8 var3; + + for (i = 0; i < 6; i++) + sUnknown_03000DE8[i] = 0; + + for (i = 0; i < playersNo; i++) + { + for (j = 0; j < 6; j++) + sUnknown_03000DE8[j] += berries[i].flavors[j]; + } + + multiuseVar = sUnknown_03000DE8[0]; + sUnknown_03000DE8[0] -= sUnknown_03000DE8[1]; + sUnknown_03000DE8[1] -= sUnknown_03000DE8[2]; + sUnknown_03000DE8[2] -= sUnknown_03000DE8[3]; + sUnknown_03000DE8[3] -= sUnknown_03000DE8[4]; + sUnknown_03000DE8[4] -= multiuseVar; + + multiuseVar = 0; + for (i = 0; i < 5; i++) + { + if (sUnknown_03000DE8[i] < 0) + { + sUnknown_03000DE8[i] = 0; + multiuseVar++; + } + } + var3 = multiuseVar; + for (i = 0; i < 5; i++) + { + if (sUnknown_03000DE8[i] > 0) + { + if (sUnknown_03000DE8[i] < multiuseVar) + sUnknown_03000DE8[i] = 0; + else + sUnknown_03000DE8[i] -= multiuseVar; + } + } + for (i = 0; i < 5; i++) + { + sUnknown_020322A8[i] = sUnknown_03000DE8[i]; + } + + multiuseVar = maxRPM / 333 + 100; + sUnknown_020322D0 = multiuseVar; + + for (i = 0; i < 5; i++) + { + s32 r4; + s32 r5 = sUnknown_03000DE8[i]; + r5 = (r5 * multiuseVar) / 10; + r4 = r5 % 10; + r5 /= 10; + if (r4 > 4) + r5++; + sUnknown_03000DE8[i] = r5; + } + for (i = 0; i < 5; i++) + { + sUnknown_020322BC[i] = sUnknown_03000DE8[i]; + } + + pokeblock->color = Blender_GetPokeblockColor(berries, &sUnknown_03000DE8[0], playersNo, var3); + sUnknown_03000DE8[5] = (sUnknown_03000DE8[5] / playersNo) - playersNo; + + if (sUnknown_03000DE8[5] < 0) + sUnknown_03000DE8[5] = 0; + + if (pokeblock->color == 12) + { + multiuseVar = Random() % 10; + for (i = 0; i < 5; i++) + { + if ((sUnknown_08339CC8[multiuseVar] >> i) & 1) + sUnknown_03000DE8[i] = 2; + else + sUnknown_03000DE8[i] = 0; + } + } + + for (i = 0; i < 6; i++) + { + if (sUnknown_03000DE8[i] > 255) + sUnknown_03000DE8[i] = 255; + } + + pokeblock->spicy = sUnknown_03000DE8[0]; + pokeblock->dry = sUnknown_03000DE8[1]; + pokeblock->sweet = sUnknown_03000DE8[2]; + pokeblock->bitter = sUnknown_03000DE8[3]; + pokeblock->sour = sUnknown_03000DE8[4]; + pokeblock->feel = sUnknown_03000DE8[5]; + + for (i = 0; i < 6; i++) + { + flavors[i] = sUnknown_03000DE8[i]; + } +} + +static void BlenderDebug_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 playersNo, u8* flavors, u16 a4) +{ + Blender_CalculatePokeblock(berries, pokeblock, playersNo, flavors, a4); +} + +static void sub_8081E20(void) +{ + u32 frames = (u16)(sBerryBlenderData->gameFrameTime); + u16 max_RPM = sBerryBlenderData->max_RPM; + s16 var = 0; + + if (frames < 900) + var = 5; + else if ((u16)(frames - 900) < 600) + var = 4; + else if ((u16)(frames - 1500) < 600) + var = 3; + else if ((u16)(frames - 2100) < 900) + var = 2; + else if ((u16)(frames - 3300) < 300) + var = 1; + + sub_8081BC8(var); + + var = 0; + if (max_RPM <= 64) + { + if (max_RPM >= 50 && max_RPM < 100) + var = -1; + else if (max_RPM >= 100 && max_RPM < 150) + var = -2; + else if (max_RPM >= 150 && max_RPM < 200) + var = -3; + else if (max_RPM >= 200 && max_RPM < 250) + var = -4; + else if (max_RPM >= 250 && max_RPM < 300) + var = -5; + else if (max_RPM >= 350 && max_RPM < 400) + var = -6; + else if (max_RPM >= 400 && max_RPM < 450) + var = -7; + else if (max_RPM >= 500 && max_RPM < 550) + var = -8; + else if (max_RPM >= 550 && max_RPM < 600) + var = -9; + else if (max_RPM >= 600) + var = -10; + } + + sub_8081BB0(var); +} + +static void sub_8081F94(u16 *a0) +{ + if (gReceivedRemoteLinkPlayers != 0 && gLinkVSyncDisabled) + *a0 = 0x2F00; + else + *a0 = 0x2FFF; +} + +static void CB2_HandleBlenderEndGame(void) +{ + u8 i, j; + + if (sBerryBlenderData->gameEndState < 3) + sub_8082D28(); + + GetMultiplayerId(); // unused return value + + switch (sBerryBlenderData->gameEndState) + { + case 1: + m4aMPlayTempoControl(&gMPlay_BGM, 256); + for (i = 0; i < gSpecialVar_0x8004; i++) + { + DestroyTask(sBerryBlenderData->field_120[i]); + } + sBerryBlenderData->gameEndState++; + break; + case 2: + sBerryBlenderData->field_4C -= 32; + if (sBerryBlenderData->field_4C <= 0) + { + sub_8009F8C(); + sBerryBlenderData->field_4C = 0; + + if (gReceivedRemoteLinkPlayers != 0) + sBerryBlenderData->gameEndState++; + else + sBerryBlenderData->gameEndState = 5; + + sBerryBlenderData->mainState = 0; + m4aMPlayStop(&gMPlay_SE2); + } + Blender_ControlHitPitch(); + break; + case 3: + if (GetMultiplayerId() != 0) + { + sBerryBlenderData->gameEndState++; + } + else if (sub_800A520()) + { + if (gReceivedRemoteLinkPlayers != 0 && gLinkVSyncDisabled) + { + sBerryBlenderData->gameBlock.timeRPM.time = sBerryBlenderData->gameFrameTime; + sBerryBlenderData->gameBlock.timeRPM.max_RPM = sBerryBlenderData->max_RPM; + + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + for (j = 0; j < BLENDER_SCORES_NO; j++) + sBerryBlenderData->gameBlock.scores[i][j] = sBerryBlenderData->scores[i][j]; + } + + if (SendBlock(0, &sBerryBlenderData->gameBlock, sizeof(sBerryBlenderData->gameBlock))) + sBerryBlenderData->gameEndState++; + } + else + { + sBerryBlenderData->smallBlock.time = sBerryBlenderData->gameFrameTime; + sBerryBlenderData->smallBlock.max_RPM = sBerryBlenderData->max_RPM; + if (SendBlock(0, &sBerryBlenderData->smallBlock, sizeof(sBerryBlenderData->smallBlock) + 32)) + sBerryBlenderData->gameEndState++; + } + } + break; + case 4: + if (GetBlockReceivedStatus()) + { + ResetBlockReceivedFlags(); + sBerryBlenderData->gameEndState++; + + if (gReceivedRemoteLinkPlayers != 0 && gLinkVSyncDisabled) + { + struct BlenderGameBlock *receivedBlock = (struct BlenderGameBlock*)(&gBlockRecvBuffer); + + sBerryBlenderData->max_RPM = receivedBlock->timeRPM.max_RPM; + sBerryBlenderData->gameFrameTime = receivedBlock->timeRPM.time; + + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + for (j = 0; j < BLENDER_SCORES_NO; j++) + sBerryBlenderData->scores[i][j] = receivedBlock->scores[i][j]; + } + } + else + { + struct TimeAndRPM *receivedBlock = (struct TimeAndRPM*)(&gBlockRecvBuffer); + + sBerryBlenderData->max_RPM = receivedBlock->max_RPM; + sBerryBlenderData->gameFrameTime = receivedBlock->time; + } + } + break; + case 5: + if (Blender_PrintBlendingRanking()) + sBerryBlenderData->gameEndState++; + break; + case 6: + if (Blender_PrintBlendingResults()) + { + if (gInGameOpponentsNo == 0) + IncrementGameStat(GAME_STAT_POKEBLOCKS_WITH_FRIENDS); + else + IncrementGameStat(GAME_STAT_POKEBLOCKS); + + sBerryBlenderData->gameEndState++; + } + break; + case 7: + if (Blender_PrintText(&sBerryBlenderData->textState, sText_WouldLikeToBlendAnotherBerry, GetPlayerTextSpeed())) + sBerryBlenderData->gameEndState++; + break; + case 9: + sBerryBlenderData->yesNoAnswer = 0; + CreateYesNoMenu(&sBlender_YesNoWindowTemplate, 1, 0xD, 0); + sBerryBlenderData->gameEndState++; + break; + case 10: + switch (ProcessMenuInputNoWrap_()) + { + case 1: + case -1: + sBerryBlenderData->yesNoAnswer = 1; + sBerryBlenderData->gameEndState++; + for (i = 0; i <BLENDER_MAX_PLAYERS; i++) + { + if (sBerryBlenderData->field_8E[i] != 0xFF) + { + PutWindowTilemap(i); + CopyWindowToVram(i, 3); + } + } + break; + case 0: + sBerryBlenderData->yesNoAnswer = 0; + sBerryBlenderData->gameEndState++; + for (i = 0; i <BLENDER_MAX_PLAYERS; i++) + { + if (sBerryBlenderData->field_8E[i] != 0xFF) + { + PutWindowTilemap(i); + CopyWindowToVram(i, 3); + } + } + break; + } + break; + case 11: + sub_8081F94(&gSendCmd[0]); + if (sBerryBlenderData->yesNoAnswer == 0) + { + if (IsBagPocketNonEmpty(BAG_BERRIES) == FALSE) // no berries + { + sBerryBlenderData->playAgainState = CANT_PLAY_NO_BERRIES; + gSendCmd[1] = 0x9999; + } + else if (GetFirstFreePokeblockSlot() == -1) // no space for pokeblocks + { + sBerryBlenderData->playAgainState = CANT_PLAY_NO_PKBLCK_SPACE; + gSendCmd[1] = 0xAAAA; + } + else + { + sBerryBlenderData->playAgainState = PLAY_AGAIN_OK; + gSendCmd[1] = 0x7779; + } + sBerryBlenderData->gameEndState++; + } + else + { + sBerryBlenderData->playAgainState = DONT_PLAY_AGAIN; + gSendCmd[1] = 0x8888; + sBerryBlenderData->gameEndState++; + } + break; + case 12: + if (gInGameOpponentsNo) + { + SetMainCallback2(CB2_HandlePlayerPlayAgainChoice); + sBerryBlenderData->gameEndState = 0; + sBerryBlenderData->mainState = 0; + } + else + { + sBerryBlenderData->gameEndState++; + } + break; + case 8: + sBerryBlenderData->gameEndState++; + break; + case 13: + if (Blender_PrintText(&sBerryBlenderData->textState, sText_CommunicationStandby, GetPlayerTextSpeed())) + { + SetMainCallback2(CB2_HandlePlayerLinkPlayAgainChoice); + sBerryBlenderData->gameEndState = 0; + sBerryBlenderData->mainState = 0; + } + break; + } + + sub_808330C(); + sub_8083230(sBerryBlenderData->field_4C); + sub_8082AD4(); + Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + RunTextPrinters(); + UpdatePaletteFade(); +} + +static bool8 LinkPlayAgainHandleSaving(void) +{ + switch (sBerryBlenderData->field_1A0) + { + case 0: + sub_800ADF8(); + sBerryBlenderData->field_1A0 = 1; + sBerryBlenderData->framesToWait = 0; + break; + case 1: + if (sub_800A520()) + { + sBerryBlenderData->field_1A0++; + gSoftResetDisabled = TRUE; + } + break; + case 2: + sub_8153430(); + sBerryBlenderData->field_1A0++; + sBerryBlenderData->framesToWait = 0; + break; + case 3: + if (++sBerryBlenderData->framesToWait == 10) + { + sub_800ADF8(); + sBerryBlenderData->field_1A0++; + } + break; + case 4: + if (sub_800A520()) + { + if (sub_8153474()) + { + sBerryBlenderData->field_1A0 = 5; + } + else + { + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->field_1A0 = 3; + } + } + break; + case 5: + sBerryBlenderData->field_1A0++; + sBerryBlenderData->framesToWait = 0; + break; + case 6: + if (++sBerryBlenderData->framesToWait > 5) + { + gSoftResetDisabled = FALSE; + return TRUE; + } + break; + } + + return FALSE; +} + +static void CB2_HandlePlayerLinkPlayAgainChoice(void) +{ + switch (sBerryBlenderData->gameEndState) + { + case 0: + if (sBerryBlenderData->field_64[0] == 0x2222) + { + sBerryBlenderData->gameEndState = 5; + } + else if (sBerryBlenderData->field_64[0] == 0x1111) + { + if (sBerryBlenderData->field_6C == 0x9999) + sBerryBlenderData->gameEndState = 2; + else if (sBerryBlenderData->field_6C == 0xAAAA) + sBerryBlenderData->gameEndState = 1; + else + sBerryBlenderData->gameEndState = 5; + } + break; + case 1: + sBerryBlenderData->gameEndState = 3; + StringCopy(gStringVar4, gLinkPlayers[sBerryBlenderData->field_6E].name); + StringAppend(gStringVar4, sText_ApostropheSPokeblockCaseIsFull); + break; + case 2: + sBerryBlenderData->gameEndState++; + StringCopy(gStringVar4, gLinkPlayers[sBerryBlenderData->field_6E].name); + StringAppend(gStringVar4, sText_HasNoBerriesToPut); + break; + case 3: + if (Blender_PrintText(&sBerryBlenderData->textState, gStringVar4, GetPlayerTextSpeed())) + { + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->gameEndState++; + } + break; + case 4: + if (++sBerryBlenderData->framesToWait > 60) + sBerryBlenderData->gameEndState = 5; + break; + case 5: + Blender_PrintText(&sBerryBlenderData->textState, gText_SavingDontTurnOff2, 0); + sub_800ADF8(); + sBerryBlenderData->gameEndState++; + break; + case 6: + if (sub_800A520()) + { + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->gameEndState++; + sBerryBlenderData->field_1A0 = 0; + } + break; + case 7: + if (LinkPlayAgainHandleSaving()) + { + PlaySE(SE_SAVE); + sBerryBlenderData->gameEndState++; + } + break; + case 8: + sBerryBlenderData->gameEndState++; + sub_800ADF8(); + break; + case 9: + if (sub_800A520()) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + sBerryBlenderData->gameEndState++; + } + break; + case 10: + if (!gPaletteFade.active) + { + if (sBerryBlenderData->field_64[0] == 0x2222) + { + FreeAllWindowBuffers(); + UnsetBgTilemapBuffer(2); + UnsetBgTilemapBuffer(1); + FREE_AND_SET_NULL(sBerryBlenderData); + SetMainCallback2(DoBerryBlending); + } + else + { + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->gameEndState++; + } + } + break; + case 11: + if (++sBerryBlenderData->framesToWait > 30) + { + sub_800AC34(); + sBerryBlenderData->gameEndState++; + } + break; + case 12: + if (gReceivedRemoteLinkPlayers == 0) + { + FREE_AND_SET_NULL(sBerryBlenderData); + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + } + break; + } + + sub_8082AD4(); + Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + RunTextPrinters(); + UpdatePaletteFade(); +} + +static void CB2_HandlePlayerPlayAgainChoice(void) +{ + switch (sBerryBlenderData->gameEndState) + { + case 0: + if (sBerryBlenderData->playAgainState == PLAY_AGAIN_OK || sBerryBlenderData->playAgainState == DONT_PLAY_AGAIN) + sBerryBlenderData->gameEndState = 9; + if (sBerryBlenderData->playAgainState == CANT_PLAY_NO_BERRIES) + sBerryBlenderData->gameEndState = 2; + if (sBerryBlenderData->playAgainState == CANT_PLAY_NO_PKBLCK_SPACE) + sBerryBlenderData->gameEndState = 1; + break; + case 1: + sBerryBlenderData->gameEndState = 3; + sBerryBlenderData->textState = 0; + StringCopy(gStringVar4, sText_YourPokeblockCaseIsFull); + break; + case 2: + sBerryBlenderData->gameEndState++; + sBerryBlenderData->textState = 0; + StringCopy(gStringVar4, sText_RunOutOfBerriesForBlending); + break; + case 3: + if (Blender_PrintText(&sBerryBlenderData->textState, gStringVar4, GetPlayerTextSpeed())) + sBerryBlenderData->gameEndState = 9; + break; + case 9: + BeginFastPaletteFade(3); + sBerryBlenderData->gameEndState++; + break; + case 10: + if (!gPaletteFade.active) + { + if (sBerryBlenderData->playAgainState == PLAY_AGAIN_OK) + SetMainCallback2(DoBerryBlending); + else + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + + FreeAllWindowBuffers(); + UnsetBgTilemapBuffer(2); + UnsetBgTilemapBuffer(1); + FREE_AND_SET_NULL(sBerryBlenderData); + } + break; + } + + sub_8082AD4(); + Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + RunTextPrinters(); + UpdatePaletteFade(); +} + +static void sub_8082AD4(void) +{ + if (gReceivedRemoteLinkPlayers) + { + if (sub_80814B0(gRecvCmds[0][0], 0x2FFF, 0x2F00)) + { + if (gRecvCmds[0][1] == 0x1111) + { + switch (gRecvCmds[0][2]) + { + case 0x8888: + sBerryBlenderData->field_6C = 0x8888; + sBerryBlenderData->field_6E = gRecvCmds[0][3]; + break; + case 0x9999: + sBerryBlenderData->field_6C = 0x9999; + sBerryBlenderData->field_6E = gRecvCmds[0][3]; + break; + case 0xAAAA: + sBerryBlenderData->field_6C = 0xAAAA; + sBerryBlenderData->field_6E = gRecvCmds[0][3]; + break; + } + + sBerryBlenderData->field_64[0] = 0x1111; + } + else if (gRecvCmds[0][1] == 0x2222) + { + sBerryBlenderData->field_64[0] = 0x2222; + } + } + if (GetMultiplayerId() == 0 && sBerryBlenderData->field_64[0] != 0x1111 && sBerryBlenderData->field_64[0] != 0x2222) + { + u8 i; + for (i = 0; i < GetLinkPlayerCount(); i++) + { + if (sub_80814B0(gRecvCmds[i][0], 0x2FFF, 0x2F00)) + { + switch (gRecvCmds[i][1]) + { + case 0x8888: + sBerryBlenderData->field_64[i] = 0x8888; + break; + case 0x7779: + sBerryBlenderData->field_64[i] = 0x7779; + break; + case 0x9999: + sBerryBlenderData->field_64[i] = 0x9999; + break; + case 0xAAAA: + sBerryBlenderData->field_64[i] = 0xAAAA; + break; + } + } + } + for (i = 0; i < GetLinkPlayerCount(); i++) + { + if (sBerryBlenderData->field_64[i] == 0) + break; + } + if (i == GetLinkPlayerCount()) + { + for (i = 0; i < GetLinkPlayerCount(); i++) + { + if (sBerryBlenderData->field_64[i] != 0x7779) + break; + } + sub_8081F94(&gSendCmd[0]); + if (i == GetLinkPlayerCount()) + { + gSendCmd[1] = 0x2222; + } + else + { + gSendCmd[1] = 0x1111; + gSendCmd[2] = sBerryBlenderData->field_64[i]; + gSendCmd[3] = i; + } + } + } + } +} + +static void sub_8082CB4(struct BgAffineSrcData *dest) +{ + struct BgAffineSrcData affineSrc; + + affineSrc.texX = 0x7800; + affineSrc.texY = 0x5000; + affineSrc.scrX = 0x78 - sBerryBlenderData->bg_X; + affineSrc.scrY = 0x50 - sBerryBlenderData->bg_Y; + affineSrc.sx = sBerryBlenderData->field_11A; + affineSrc.sy = sBerryBlenderData->field_11A; + affineSrc.alpha = sBerryBlenderData->arrowPos; + + *dest = affineSrc; +} + +u16 GetBlenderArrowPosition(void) +{ + return sBerryBlenderData->arrowPos; +} + +static void sub_8082D28(void) +{ + u8 playerId = 0; + + if (gReceivedRemoteLinkPlayers != 0) + playerId = GetMultiplayerId(); + + if (gLinkVSyncDisabled && gReceivedRemoteLinkPlayers != 0) + { + if (playerId == 0) + { + sBerryBlenderData->arrowPos += sBerryBlenderData->field_4C; + gSendCmd[5] = sBerryBlenderData->field_116; + gSendCmd[6] = sBerryBlenderData->arrowPos; + sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + } + else + { + if ((gRecvCmds[0][0] & 0xFF00) == 0x4400) + { + sBerryBlenderData->field_116 = gRecvCmds[0][5]; + sBerryBlenderData->arrowPos = gRecvCmds[0][6]; + sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + } + } + } + else + { + sBerryBlenderData->arrowPos += sBerryBlenderData->field_4C; + sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + } +} + +static void BerryBlender_SetBackgroundsPos(void) +{ + SetGpuReg(REG_OFFSET_BG1HOFS, sBerryBlenderData->bg_X); + SetGpuReg(REG_OFFSET_BG1VOFS, sBerryBlenderData->bg_Y); + + SetGpuReg(REG_OFFSET_BG0HOFS, sBerryBlenderData->bg_X); + SetGpuReg(REG_OFFSET_BG0VOFS, sBerryBlenderData->bg_Y); +} + +static void sub_8082E3C(struct Sprite* sprite) +{ + sprite->data[2] += sprite->data[0]; + sprite->data[3] += sprite->data[1]; + sprite->pos2.x = sprite->data[2] / 8; + sprite->pos2.y = sprite->data[3] / 8; + + if (sprite->animEnded) + DestroySprite(sprite); +} + +static void sub_8082E84(void) +{ + s32 limit = (Random() % 2) + 1; + s32 i; + + for (i = 0; i < limit; i++) + { + u16 rand; + s32 x, y; + u8 spriteId; + + rand = sBerryBlenderData->arrowPos + (Random() % 20); + + x = gSineTable[(rand & 0xFF) + 64] / 4; + y = gSineTable[(rand & 0xFF)] / 4; + + spriteId = CreateSprite(&sUnknown_08339BE0, x + 120, y + 80, 1); + gSprites[spriteId].data[0] = 16 - (Random() % 32); + gSprites[spriteId].data[1] = 16 - (Random() % 32); + + gSprites[spriteId].callback = sub_8082E3C; + } +} + +static void sub_8082F68(struct Sprite* sprite) +{ + sprite->data[0]++; + sprite->pos2.y = -(sprite->data[0] / 3); + + if (sprite->animEnded) + DestroySprite(sprite); +} + +static void sub_8082F9C(struct Sprite* sprite) +{ + sprite->data[0]++; + sprite->pos2.y = -(sprite->data[0] * 2); + + if (sprite->pos2.y < -12) + sprite->pos2.y = -12; + if (sprite->animEnded) + DestroySprite(sprite); +} + +static void Blender_SetBankBerryData(u8 bank, u16 itemId) +{ + sBerryBlenderData->chosenItemId[bank] = itemId; + Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[bank], itemId); +} + +static void sub_8083010(struct Sprite* sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->data[1] += 8; + if (sprite->data[1] > 88) + { + sprite->data[1] = 88; + sprite->data[0]++; + PlaySE(SE_KON); + } + break; + case 1: + sprite->data[2] += 1; + if (sprite->data[2] > 20) + { + sprite->data[0]++; + sprite->data[2] = 0; + } + break; + case 2: + sprite->data[1] += 4; + if (sprite->data[1] > 176) + { + if (++sprite->data[3] == 3) + { + DestroySprite(sprite); + CreateSprite(&sUnknown_08339C60, 120, -20, 2); + } + else + { + sprite->data[0] = 0; + sprite->data[1] = -16; + StartSpriteAnim(sprite, sprite->data[3]); + } + } + break; + } + + sprite->pos2.y = sprite->data[1]; +} + +static void sub_80830C0(struct Sprite* sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->data[1] += 8; + if (sprite->data[1] > 92) + { + sprite->data[1] = 92; + sprite->data[0]++; + PlaySE(SE_PIN); + } + break; + case 1: + sprite->data[2] += 1; + if (sprite->data[2] > 20) + sprite->data[0]++; + break; + case 2: + sprite->data[1] += 4; + if (sprite->data[1] > 176) + { + sBerryBlenderData->mainState++; + DestroySprite(sprite); + } + break; + } + + sprite->pos2.y = sprite->data[1]; +} + +static void sub_8083140(u16 a0, u16 a1) +{ + if (sBerryBlenderData->field_118 < a0) + { + sBerryBlenderData->field_118 += 2; + sub_8083170(sBerryBlenderData->field_118, a1); + } +} + +static void sub_8083170(u16 a0, u16 a1) +{ + s32 var1, var2, var3, var4; + u16 *vram; + + vram = (u16*)(VRAM + 0x6000); + var1 = (a0 * 64) / a1; + var2 = var1 / 8; + for (var4 = 0; var4 < var2; var4++) + { + vram[11 + var4] = 0x80E9; + vram[43 + var4] = 0x80F9; + } + var3 = var1 % 8; + if (var3 != 0) + { + vram[11 + var4] = var3 + 0x80E1; + vram[43 + var4] = var3 + 0x80F1; + var4++; + } + for (; var4 < 8; var4++) + { + vram[11 + var4] = 0x80E1; + vram[43 + var4] = 0x80F1; + } +} + +static u32 sub_8083210(u16 a0) +{ + return 0x57E40 * a0 / 0x10000; +} + +static void sub_8083230(u16 a0) +{ + u8 i; + u8 palAdders[5]; + + u32 var = sub_8083210(a0); + if (sBerryBlenderData->max_RPM < var) + sBerryBlenderData->max_RPM = var; + for (i = 0; i < 5; i++) + { + palAdders[i] = var % 10; + var /= 10; + } + *((u16*)(VRAM + 0x6458)) = palAdders[4] + 0x8072; + *((u16*)(VRAM + 0x645A)) = palAdders[3] + 0x8072; + *((u16*)(VRAM + 0x645C)) = palAdders[2] + 0x8072; + *((u16*)(VRAM + 0x6460)) = palAdders[1] + 0x8072; + *((u16*)(VRAM + 0x6462)) = palAdders[0] + 0x8072; +} + +static void sub_80832BC(s16* a0, u16 a1) +{ + if (*a0 == 0) + *a0 = (Random() % a1) - (a1 / 2); +} + +static void sub_80832E8(s16* a0) +{ + if (*a0 < 0) + (*a0)++; + if (*a0 > 0) + (*a0)--; +} + +static void sub_808330C(void) +{ + sub_80832E8(&sBerryBlenderData->bg_X); + sub_80832E8(&sBerryBlenderData->bg_Y); +} + +static void sub_8083334(s16* a0, u16 a1) +{ + s32 var; + + if (a1 < 10) + var = 16; + else + var = 8; + + if (*a0 == 0) + { + *a0 = (Random() % var) - (var / 2); + } + else + { + if (*a0 < 0) + (*a0)++; + if (*a0 > 0) + (*a0)--; + } +} + +static bool8 sub_8083380(void) +{ + if (sBerryBlenderData->framesToWait == 0) + { + sBerryBlenderData->bg_X = 0; + sBerryBlenderData->bg_Y = 0; + } + + sBerryBlenderData->framesToWait++; + sub_8083334(&sBerryBlenderData->bg_X, sBerryBlenderData->framesToWait); + sub_8083334(&sBerryBlenderData->bg_Y, sBerryBlenderData->framesToWait); + + if (sBerryBlenderData->framesToWait == 20) + { + sBerryBlenderData->bg_X = 0; + sBerryBlenderData->bg_Y = 0; + return TRUE; + } + + return FALSE; +} + +static void sub_80833F8(struct Sprite* sprite) +{ + sprite->pos2.x = -(sBerryBlenderData->bg_X); + sprite->pos2.y = -(sBerryBlenderData->bg_Y); +} + +static void TryUpdateBerryBlenderRecord(void) +{ + if (gSaveBlock1Ptr->berryBlenderRecords[sBerryBlenderData->playersNo - 2] < sBerryBlenderData->max_RPM) + gSaveBlock1Ptr->berryBlenderRecords[sBerryBlenderData->playersNo - 2] = sBerryBlenderData->max_RPM; +} + +static bool8 Blender_PrintBlendingResults(void) +{ + u16 i; + s32 xPos, yPos; + + struct Pokeblock pokeblock; + u8 flavors[6]; + u8 text[40]; + u16 berryIds[4]; // unused + + switch (sBerryBlenderData->mainState) + { + case 0: + sBerryBlenderData->mainState++; + sBerryBlenderData->framesToWait = 17; + break; + case 1: + sBerryBlenderData->framesToWait -= 10; + if (sBerryBlenderData->framesToWait < 0) + { + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->mainState++; + } + break; + case 2: + if (++sBerryBlenderData->framesToWait > 20) + { + for (i = 0; i < BLENDER_SCORES_NO; i++) + DestroySprite(&gSprites[sBerryBlenderData->scoreIconIds[i]]); + + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->mainState++; + } + break; + case 3: + { + u16 minutes, seconds; + u8 *txtPtr; + + xPos = GetStringCenterAlignXOffset(1, sText_BlendingResults, 0xA8); + Blender_AddTextPrinter(5, sText_BlendingResults, xPos, 1, TEXT_SPEED_FF, 0); + + if (sBerryBlenderData->playersNo == 4) + yPos = 17; + else + yPos = 21; + + for (i = 0; i < sBerryBlenderData->playersNo; yPos += 16, i++) + { + u8 place = sBerryBlenderData->playerPlaces[i]; + + ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, i + 1, STR_CONV_MODE_LEFT_ALIGN, 1); + StringAppend(sBerryBlenderData->stringVar, sText_Dot); + StringAppend(sBerryBlenderData->stringVar, gText_Space); + StringAppend(sBerryBlenderData->stringVar, gLinkPlayers[place].name); + Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 8, yPos, TEXT_SPEED_FF, 3); + + StringCopy(sBerryBlenderData->stringVar, sBerryBlenderData->blendedBerries[place].name); + ConvertInternationalString(sBerryBlenderData->stringVar, gLinkPlayers[place].language); + StringAppend(sBerryBlenderData->stringVar, sText_SpaceBerry); + Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0x54, yPos, TEXT_SPEED_FF, 3); + } + + Blender_AddTextPrinter(5, sText_MaximumSpeed, 0, 0x51, TEXT_SPEED_FF, 3); + ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, sBerryBlenderData->max_RPM / 100, STR_CONV_MODE_RIGHT_ALIGN, 3); + StringAppend(sBerryBlenderData->stringVar, sText_Dot); + + ConvertIntToDecimalStringN(text, sBerryBlenderData->max_RPM % 100, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(sBerryBlenderData->stringVar, text); + StringAppend(sBerryBlenderData->stringVar, sText_RPM); + + xPos = GetStringRightAlignXOffset(1, sBerryBlenderData->stringVar, 0xA8); + Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, xPos, 0x51, TEXT_SPEED_FF, 3); + Blender_AddTextPrinter(5, sText_Time, 0, 0x61, TEXT_SPEED_FF, 3); + + seconds = (sBerryBlenderData->gameFrameTime / 60) % 60; + minutes = (sBerryBlenderData->gameFrameTime / (60 * 60)); + + ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); + txtPtr = StringAppend(sBerryBlenderData->stringVar, sText_Min); + + ConvertIntToDecimalStringN(txtPtr, seconds, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(sBerryBlenderData->stringVar, sText_Sec); + + xPos = GetStringRightAlignXOffset(1, sBerryBlenderData->stringVar, 0xA8); + Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, xPos, 0x61, TEXT_SPEED_FF, 3); + + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->mainState++; + + CopyWindowToVram(5, 2); + } + break; + case 4: + if (gMain.newKeys & A_BUTTON) + sBerryBlenderData->mainState++; + break; + case 5: + sub_8198070(5, 1); + + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + if (sBerryBlenderData->chosenItemId[i] != 0) + berryIds[i] = sBerryBlenderData->chosenItemId[i] - FIRST_BERRY_INDEX; + if (sBerryBlenderData->field_8E[i] != 0xFF) + { + PutWindowTilemap(i); + CopyWindowToVram(i, 3); + } + } + + sub_8081E20(); + + Blender_CalculatePokeblock(sBerryBlenderData->blendedBerries, &pokeblock, sBerryBlenderData->playersNo, flavors, sBerryBlenderData->max_RPM); + Blender_PrintMadePokeblockString(&pokeblock, sBerryBlenderData->stringVar); + TryAddContestLinkTvShow(&pokeblock, &sBerryBlenderData->tvBlender); + + CreateTask(sub_8083F3C, 6); + sub_80EECEC(); + + RemoveBagItem(gSpecialVar_ItemId, 1); + AddPokeblock(&pokeblock); + + sBerryBlenderData->textState = 0; + sBerryBlenderData->mainState++; + break; + case 6: + if (Blender_PrintText(&sBerryBlenderData->textState, sBerryBlenderData->stringVar, GetPlayerTextSpeed())) + { + TryUpdateBerryBlenderRecord(); + return TRUE; + } + break; + } + + return FALSE; +} + +static void Blender_PrintMadePokeblockString(struct Pokeblock *pokeblock, u8 *dst) +{ + u8 text[12]; + u8 flavorLvl, feel; + + dst[0] = EOS; + StringCopy(dst, gPokeblockNames[pokeblock->color]); + StringAppend(dst, sText_WasMade); + StringAppend(dst, sText_NewLine); + + flavorLvl = GetHighestPokeblocksFlavorLevel(pokeblock); + feel = GetPokeblocksFeel(pokeblock); + + StringAppend(dst, sText_TheLevelIs); + ConvertIntToDecimalStringN(text, flavorLvl, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(dst, text); + + StringAppend(dst, sText_TheFeelIs); + ConvertIntToDecimalStringN(text, feel, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(dst, text); + + StringAppend(dst, sText_Dot2); + StringAppend(dst, sText_NewParagraph); +} + +static void Blender_SortBasedOnPoints(u8 *places, u8 playersNum, u32 *scores) +{ + s32 i, j; + + for (i = 0; i < playersNum; i++) + { + for (j = 0; j < playersNum; j++) + { + if (scores[places[i]] > scores[places[j]]) + { + u8 temp = places[i]; + places[i] = places[j]; + places[j] = temp; + } + } + } +} + +static void Blender_SortScores(void) +{ + u8 playerId; + u8 i; + u8 places[BLENDER_MAX_PLAYERS]; + u32 points[BLENDER_MAX_PLAYERS]; + + for (i = 0; i < sBerryBlenderData->playersNo; i++) + places[i] = i; + for (i = 0; i < sBerryBlenderData->playersNo; i++) + { + points[i] = 1000000 * sBerryBlenderData->scores[i][BLENDER_SCORE_BEST]; + points[i] += 1000 * sBerryBlenderData->scores[i][BLENDER_SCORE_GOOD]; + points[i] += 1000 - sBerryBlenderData->scores[i][BLENDER_SCORE_MISS]; + } + Blender_SortBasedOnPoints(places, sBerryBlenderData->playersNo, points); + for (i = 0; i < sBerryBlenderData->playersNo; i++) + sBerryBlenderData->playerPlaces[i] = places[i]; + + if (gReceivedRemoteLinkPlayers == 0) + playerId = 0; + else + playerId = GetMultiplayerId(); + + for (i = 0; i < sBerryBlenderData->playersNo; i++) + { + if (sBerryBlenderData->playerPlaces[i] == playerId) + sBerryBlenderData->field_1A4 = i; + } +} + +static bool8 Blender_PrintBlendingRanking(void) +{ + u16 i; + s32 xPos, yPos; + + switch (sBerryBlenderData->mainState) + { + case 0: + sBerryBlenderData->mainState++; + sBerryBlenderData->framesToWait = 255; + break; + case 1: + sBerryBlenderData->framesToWait -= 10; + if (sBerryBlenderData->framesToWait < 0) + { + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->mainState++; + } + break; + case 2: + if (++sBerryBlenderData->framesToWait > 20) + { + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->mainState++; + } + break; + case 3: + SetWindowBorderStyle(5, 0, 1, 0xD); + xPos = GetStringCenterAlignXOffset(1, sText_Ranking, 0xA8); + Blender_AddTextPrinter(5, sText_Ranking, xPos, 1, TEXT_SPEED_FF, 0); + + sBerryBlenderData->scoreIconIds[BLENDER_SCORE_BEST] = CreateSprite(&sUnknown_08339B40, 128, 52, 0); + StartSpriteAnim(&gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_BEST]], 3); + gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_BEST]].callback = SpriteCallbackDummy; + + sBerryBlenderData->scoreIconIds[BLENDER_SCORE_GOOD] = CreateSprite(&sUnknown_08339B40, 160, 52, 0); + gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_GOOD]].callback = SpriteCallbackDummy; + + sBerryBlenderData->scoreIconIds[BLENDER_SCORE_MISS] = CreateSprite(&sUnknown_08339B40, 192, 52, 0); + StartSpriteAnim(&gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_MISS]], 1); + gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_MISS]].callback = SpriteCallbackDummy; + + Blender_SortScores(); + + for (yPos = 0x29, i = 0; i < sBerryBlenderData->playersNo; yPos += 0x10, i++) + { + u8 place = sBerryBlenderData->playerPlaces[i]; + + ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, i + 1, STR_CONV_MODE_LEFT_ALIGN, 1); + StringAppend(sBerryBlenderData->stringVar, sText_Dot); + StringAppend(sBerryBlenderData->stringVar, gText_Space); + StringAppend(sBerryBlenderData->stringVar, gLinkPlayers[place].name); + Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0, yPos, TEXT_SPEED_FF, 3); + + ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, sBerryBlenderData->scores[place][BLENDER_SCORE_BEST], STR_CONV_MODE_RIGHT_ALIGN, 3); + Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0x4E, yPos, TEXT_SPEED_FF, 3); + + ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, sBerryBlenderData->scores[place][BLENDER_SCORE_GOOD], STR_CONV_MODE_RIGHT_ALIGN, 3); + Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0x6E, yPos, TEXT_SPEED_FF, 3); + + ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, sBerryBlenderData->scores[place][BLENDER_SCORE_MISS], STR_CONV_MODE_RIGHT_ALIGN, 3); + Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0x8E, yPos, TEXT_SPEED_FF, 3); + } + + PutWindowTilemap(5); + CopyWindowToVram(5, 3); + + sBerryBlenderData->framesToWait = 0; + sBerryBlenderData->mainState++; + break; + case 4: + if (++sBerryBlenderData->framesToWait > 20) + sBerryBlenderData->mainState++; + break; + case 5: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sBerryBlenderData->mainState++; + } + break; + case 6: + sBerryBlenderData->mainState = 0; + return TRUE; + } + + return FALSE; +} + +void ShowBerryBlenderRecordWindow(void) +{ + s32 i; + s32 xPos, yPos; + struct WindowTemplate winTemplate; + u8 text[32]; + + winTemplate = sBlenderRecordWindowTemplate; + gResultsWindowId = AddWindow(&winTemplate); + sub_81973FC(gResultsWindowId, 0); + FillWindowPixelBuffer(gResultsWindowId, 0x11); + + xPos = GetStringCenterAlignXOffset(1, gText_BlenderMaxSpeedRecord, 0x90); + PrintTextOnWindow(gResultsWindowId, 1, gText_BlenderMaxSpeedRecord, xPos, 1, 0, NULL); + PrintTextOnWindow(gResultsWindowId, 1, gText_234Players, 4, 0x29, 0, NULL); + + for (i = 0, yPos = 0x29; i < BLENDER_SCORES_NO; i++) + { + u8 *txtPtr; + u32 record; + + record = gSaveBlock1Ptr->berryBlenderRecords[i]; + + txtPtr = ConvertIntToDecimalStringN(text, record / 100, STR_CONV_MODE_RIGHT_ALIGN, 3); + txtPtr = StringAppend(txtPtr, sText_Dot); + txtPtr = ConvertIntToDecimalStringN(txtPtr, record % 100, STR_CONV_MODE_LEADING_ZEROS, 2); + txtPtr = StringAppend(txtPtr, sText_RPM); + + xPos = GetStringRightAlignXOffset(1, text, 0x8C); + PrintTextOnWindow(gResultsWindowId, 1, text, xPos, yPos + (i * 16), 0, NULL); + } + + PutWindowTilemap(gResultsWindowId); + CopyWindowToVram(gResultsWindowId, 3); +} + +static void sub_8083F3C(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0) + { + PlayFanfare(BGM_FANFA1); + gTasks[taskId].data[0]++; + } + if (IsFanfareTaskInactive()) + { + PlayBGM(sBerryBlenderData->field_154); + DestroyTask(taskId); + } +} + +static bool32 TryAddContestLinkTvShow(struct Pokeblock *pokeblock, struct TvBlenderStruct *tvBlender) +{ + u8 flavorLevel = GetHighestPokeblocksFlavorLevel(pokeblock); + u16 sheen = (flavorLevel * 10) / GetPokeblocksFeel(pokeblock); + + tvBlender->pokeblockSheen = sheen; + tvBlender->pokeblockColor = pokeblock->color; + tvBlender->name[0] = EOS; + + if (gReceivedRemoteLinkPlayers != 0) + { + if (sBerryBlenderData->field_1A4 == 0 && sheen > 20) + { + StringCopy(tvBlender->name, gLinkPlayers[sBerryBlenderData->playerPlaces[sBerryBlenderData->playersNo - 1]].name); + tvBlender->pokeblockFlavor = GetPokeblocksFlavor(pokeblock); + if (Put3CheersForPokeblocksOnTheAir(tvBlender->name, tvBlender->pokeblockFlavor, + tvBlender->pokeblockColor, tvBlender->pokeblockSheen, + gLinkPlayers[sBerryBlenderData->playerPlaces[sBerryBlenderData->playersNo - 1]].language)) + { + return TRUE; + } + + return FALSE; + } + else if (sBerryBlenderData->field_1A4 == sBerryBlenderData->playersNo - 1 && sheen <= 20) + { + StringCopy(tvBlender->name, gLinkPlayers[sBerryBlenderData->playerPlaces[0]].name); + tvBlender->pokeblockFlavor = GetPokeblocksFlavor(pokeblock); + if (Put3CheersForPokeblocksOnTheAir(tvBlender->name, tvBlender->pokeblockFlavor, + tvBlender->pokeblockColor, tvBlender->pokeblockSheen, + gLinkPlayers[sBerryBlenderData->playerPlaces[0]].language)) + { + return TRUE; + } + + return FALSE; + } + } + + return FALSE; +} + +static void Blender_AddTextPrinter(u8 windowId, const u8 *string, u8 x, u8 y, s32 speed, s32 caseId) +{ + struct TextColor txtColor; + u32 letterSpacing = 0; + + switch (caseId) + { + case 0: + case 3: + txtColor.fgColor = 1; + txtColor.bgColor = 2; + txtColor.shadowColor = 3; + break; + case 1: + txtColor.fgColor = 0; + txtColor.bgColor = 2; + txtColor.shadowColor = 3; + break; + case 2: + txtColor.fgColor = 0; + txtColor.bgColor = 4; + txtColor.shadowColor = 5; + break; + } + + if (caseId != 3) + { + FillWindowPixelBuffer(windowId, txtColor.fgColor | (txtColor.fgColor << 4)); + } + + AddTextPrinterParametrized2(windowId, 1, x, y, letterSpacing, 1, &txtColor, speed, string); +} + +static bool32 Blender_PrintText(s16 *textState, const u8 *string, s32 textSpeed) +{ + switch (*textState) + { + case 0: + sub_8197B1C(4, FALSE, 0x14, 0xF); + Blender_AddTextPrinter(4, string, 0, 1, textSpeed, 0); + PutWindowTilemap(4); + CopyWindowToVram(4, 3); + (*textState)++; + break; + case 1: + if (!IsTextPrinterActive(4)) + { + *textState = 0; + return TRUE; + } + break; + } -// .text + return FALSE; +} diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c index eca20af9d..bba39c3eb 100644 --- a/src/berry_fix_program.c +++ b/src/berry_fix_program.c @@ -1,5 +1,3 @@ - -// Includes #include "global.h" #include "gpu_regs.h" #include "multiboot.h" @@ -10,6 +8,7 @@ #include "task.h" #include "unknown_task.h" #include "window.h" +#include "text.h" #include "menu.h" #include "m4a.h" diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c index 85b2bc509..d6924de9f 100755 --- a/src/braille_puzzles.c +++ b/src/braille_puzzles.c @@ -1,12 +1,12 @@ #include "global.h" #include "event_data.h" -#include "songs.h" +#include "constants/songs.h" #include "sound.h" #include "script.h" -#include "species.h" +#include "constants/species.h" #include "task.h" #include "field_effect.h" -#include "flags.h" +#include "constants/flags.h" extern void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatileId); // fieldmap extern void DrawWholeMapView(); // field_camera diff --git a/src/calculate_base_damage.c b/src/calculate_base_damage.c index 89770b17a..d30599607 100644 --- a/src/calculate_base_damage.c +++ b/src/calculate_base_damage.c @@ -1,14 +1,14 @@ #include "global.h" -#include "abilities.h" +#include "constants/abilities.h" #include "battle.h" -#include "hold_effects.h" +#include "constants/hold_effects.h" #include "event_data.h" #include "item.h" -#include "items.h" +#include "constants/items.h" #include "pokemon.h" -#include "species.h" -#include "moves.h" -#include "battle_move_effects.h" +#include "constants/species.h" +#include "constants/moves.h" +#include "constants/battle_move_effects.h" extern u32 gBattleTypeFlags; extern struct BattlePokemon gBattleMons[4]; diff --git a/src/clear_save_data_screen.c b/src/clear_save_data_screen.c index 3192e0e11..6d6a1545b 100755 --- a/src/clear_save_data_screen.c +++ b/src/clear_save_data_screen.c @@ -1,7 +1,7 @@ #include "global.h" #include "task.h" -#include "menu.h" #include "text.h" +#include "menu.h" #include "sound.h" #include "main.h" #include "save.h" @@ -9,7 +9,7 @@ #include "gpu_regs.h" #include "bg.h" #include "text_window.h" -#include "songs.h" +#include "constants/songs.h" extern u8 gText_ClearAllSaveData[]; extern u8 gText_ClearingData[]; @@ -88,7 +88,7 @@ static void Task_DoClearSaveDataScreenYesNo(u8 taskId) static void Task_ClearSaveDataScreenYesNoChoice(u8 taskId) { - switch(sub_8198C58()) + switch(ProcessMenuInputNoWrap_()) { case 0: FillWindowPixelBuffer(0, 17); diff --git a/src/clock.c b/src/clock.c new file mode 100644 index 000000000..7cea30166 --- /dev/null +++ b/src/clock.c @@ -0,0 +1,93 @@ +#include "global.h" +#include "rom6.h" +#include "event_data.h" +#include "rtc.h" +#include "lottery_corner.h" +#include "dewford_trend.h" +#include "tv.h" +#include "field_screen.h" +#include "berry.h" +#include "main.h" +#include "overworld.h" +#include "wallclock.h" + +// static types + +// static declarations + +static void UpdatePerDay(struct Time *localTime); +static void UpdatePerMinute(struct Time *localTime); + +// rodata + +// text + +static void InitTimeBasedEvents(void) +{ + FlagSet(FLAG_SYS_CLOCK_SET); + RtcCalcLocalTime(); + gSaveBlock2Ptr->lastBerryTreeUpdate = gLocalTime; + VarSet(VAR_DAYS, gLocalTime.days); +} + +void DoTimeBasedEvents(void) +{ + if (FlagGet(FLAG_SYS_CLOCK_SET) && !sub_813B9C0()) + { + RtcCalcLocalTime(); + UpdatePerDay(&gLocalTime); + UpdatePerMinute(&gLocalTime); + } +} + +static void UpdatePerDay(struct Time *localTime) +{ + u16 *days = GetVarPointer(VAR_DAYS); + u16 daysSince; + + if (*days != localTime->days && *days <= localTime->days) + { + daysSince = localTime->days - *days; + ClearUpperFlags(); + UpdateDewfordTrendPerDay(daysSince); + UpdateTVShowsPerDay(daysSince); + UpdateWeatherPerDay(daysSince); + UpdatePartyPokerusTime(daysSince); + UpdateMirageRnd(daysSince); + UpdateBirchState(daysSince); + UpdateFrontierManiac(daysSince); + UpdateFrontierGambler(daysSince); + SetShoalItemFlag(daysSince); + SetRandomLotteryNumber(daysSince); + *days = localTime->days; + } +} + +static void UpdatePerMinute(struct Time *localTime) +{ + struct Time difference; + int minutes; + + CalcTimeDifference(&difference, &gSaveBlock2Ptr->lastBerryTreeUpdate, localTime); + minutes = 24 * 60 * difference.days + 60 * difference.hours + difference.minutes; + if (minutes != 0) + { + if (minutes >= 0) + { + BerryTreeTimeUpdate(minutes); + gSaveBlock2Ptr->lastBerryTreeUpdate = *localTime; + } + } +} + +static void ReturnFromStartWallClock(void) +{ + InitTimeBasedEvents(); + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void StartWallClock(void) +{ + SetMainCallback2(Cb2_StartWallClock); + gMain.savedCallback = ReturnFromStartWallClock; +} diff --git a/src/coins.c b/src/coins.c index e1694b29c..50c31cac0 100644 --- a/src/coins.c +++ b/src/coins.c @@ -2,8 +2,9 @@ #include "coins.h" #include "text.h" #include "window.h" -#include "text_window.h" +#include "strings.h" #include "string_util.h" +#include "new_menu_helpers.h" #include "menu.h" #include "international_string_util.h" @@ -11,10 +12,6 @@ EWRAM_DATA u8 sCoinsWindowId = 0; -extern void sub_819746C(u8 windowId, bool8 copyToVram); - -extern const u8 gText_Coins[]; - void PrintCoinsString(u32 coinAmount) { u32 xAlign; @@ -53,7 +50,6 @@ void SetCoins(u16 coinAmount) gSaveBlock1Ptr->coins = coinAmount ^ gSaveBlock2Ptr->encryptionKey; } -/* Can't match it lol bool8 GiveCoins(u16 toAdd) { u16 newAmount; @@ -67,10 +63,22 @@ bool8 GiveCoins(u16 toAdd) } else { - newAmount = ownedCoins + toAdd; - if (newAmount > MAX_COINS) - newAmount = MAX_COINS; + ownedCoins += toAdd; + if (ownedCoins > MAX_COINS) + ownedCoins = MAX_COINS; + newAmount = ownedCoins; } SetCoins(newAmount); return TRUE; -}*/ +} + +bool8 TakeCoins(u16 toSub) +{ + u16 ownedCoins = GetCoins(); + if (ownedCoins >= toSub) + { + SetCoins(ownedCoins - toSub); + return TRUE; + } + return FALSE; +} diff --git a/src/daycare.c b/src/daycare.c index 8dd45863a..ce9952531 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -2,14 +2,14 @@ #include "pokemon.h" #include "daycare.h" #include "string_util.h" -#include "species.h" -#include "items.h" +#include "constants/species.h" +#include "constants/items.h" #include "mail.h" #include "pokemon_storage_system.h" #include "event_data.h" -#include "rng.h" +#include "random.h" #include "main.h" -#include "moves.h" +#include "constants/moves.h" #include "egg_hatch.h" #include "text.h" #include "menu.h" diff --git a/src/decompress.c b/src/decompress.c index 9210799ec..8e8827194 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -1,6 +1,6 @@ #include "global.h" #include "decompress.h" -#include "species.h" +#include "constants/species.h" #include "text.h" #include "malloc.h" #include "pokemon.h" @@ -459,10 +459,9 @@ _08034964:\n\ .syntax divided"); } -u32 sub_8034974(void* ptr) +u32 sub_8034974(const u8 *ptr) { - u8* ptr_ = (u8*)(ptr); - return (ptr_[3] << 16) | (ptr_[2] << 8) | (ptr_[1]); + return (ptr[3] << 16) | (ptr[2] << 8) | (ptr[1]); } bool8 LoadCompressedObjectPicUsingHeap(const struct CompressedSpriteSheet* src) diff --git a/src/decoration.c b/src/decoration.c index adcdc583b..987e628c5 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -1,13 +1,15 @@ #include "global.h" +#include "constants/decorations.h" #include "decompress.h" #include "malloc.h" +#include "text.h" #include "string_util.h" #include "international_string_util.h" #include "script.h" #include "task.h" #include "main.h" #include "palette.h" -#include "songs.h" +#include "constants/songs.h" #include "overworld.h" #include "fieldmap.h" #include "metatile_behavior.h" @@ -31,7 +33,7 @@ #include "tilesets.h" #include "item_icon.h" #include "trader.h" -#include "map_object_constants.h" +#include "constants/map_objects.h" #include "decoration_inventory.h" #include "decoration.h" #include "graphics.h" @@ -1301,7 +1303,7 @@ void sub_8128060(u8 taskId) void ConfigureCameraObjectForPlacingDecoration(struct PlaceDecorationGraphicsDataBuffer *data, u8 decor) { - sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data0; + sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data[0]; gUnknown_03005DD0.unk4 = gpu_pal_decompress_alloc_tag_and_upload(data, decor); gSprites[gUnknown_03005DD0.unk4].oam.priority = 1; gSprites[gUnknown_03005DD0.unk4].callback = sub_81292D0; @@ -1382,8 +1384,8 @@ void sub_812826C(u8 taskId) void sub_81283BC(u8 taskId) { gTasks[taskId].data[10] = 0; - gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 1; - gSprites[sDecor_CameraSpriteObjectIdx2].data7 = 1; + gSprites[sDecor_CameraSpriteObjectIdx1].data[7] = 1; + gSprites[sDecor_CameraSpriteObjectIdx2].data[7] = 1; sub_8128DE0(); sub_8128950(taskId); } @@ -1391,8 +1393,8 @@ void sub_81283BC(u8 taskId) void sub_8128414(u8 taskId) { gTasks[taskId].data[10] = 0; - gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 1; - gSprites[sDecor_CameraSpriteObjectIdx2].data7 = 1; + gSprites[sDecor_CameraSpriteObjectIdx1].data[7] = 1; + gSprites[sDecor_CameraSpriteObjectIdx2].data[7] = 1; sub_8128DE0(); StringExpandPlaceholders(gStringVar4, gText_CancelDecorating); DisplayItemMessageOnField(taskId, gStringVar4, sub_8128B80); @@ -1768,8 +1770,8 @@ bool8 sub_8128DB4(void) void sub_8128DE0(void) { sDecorationLastDirectionMoved = 0; - gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 0; - gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = 0; } void sub_8128E18(u8 taskId) @@ -1777,7 +1779,7 @@ void sub_8128E18(u8 taskId) s16 *data; data = gTasks[taskId].data; - if (!gSprites[sDecor_CameraSpriteObjectIdx1].data4) + if (!gSprites[sDecor_CameraSpriteObjectIdx1].data[4]) { if (data[10] == 1) { @@ -1791,29 +1793,29 @@ void sub_8128E18(u8 taskId) if ((gMain.heldKeys & 0x0F0) == DPAD_UP) { sDecorationLastDirectionMoved = DIR_SOUTH; - gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 0; - gSprites[sDecor_CameraSpriteObjectIdx1].data3 = -2; + gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = -2; data[1]--; } if ((gMain.heldKeys & 0x0F0) == DPAD_DOWN) { sDecorationLastDirectionMoved = DIR_NORTH; - gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 0; - gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 2; + gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = 2; data[1]++; } if ((gMain.heldKeys & 0x0F0) == DPAD_LEFT) { sDecorationLastDirectionMoved = DIR_WEST; - gSprites[sDecor_CameraSpriteObjectIdx1].data2 = -2; - gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = -2; + gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = 0; data[0]--; } if ((gMain.heldKeys & 0x0F0) == DPAD_RIGHT) { sDecorationLastDirectionMoved = DIR_EAST; - gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 2; - gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = 2; + gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = 0; data[0]++; } if (!sub_8128DB4() || !sub_8128D10(taskId)) @@ -1823,8 +1825,8 @@ void sub_8128E18(u8 taskId) } if (sDecorationLastDirectionMoved) { - gSprites[sDecor_CameraSpriteObjectIdx1].data4++; - gSprites[sDecor_CameraSpriteObjectIdx1].data4 &= 7; + gSprites[sDecor_CameraSpriteObjectIdx1].data[4]++; + gSprites[sDecor_CameraSpriteObjectIdx1].data[4] &= 7; } if (!data[10]) { @@ -1842,7 +1844,7 @@ void sub_8128E18(u8 taskId) void sub_8128FD8(u8 taskId) { sub_8197434(0, 1); - gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data[7] = 0; gTasks[taskId].data[10] = 0; gTasks[taskId].func = sub_8128E18; } @@ -1953,20 +1955,20 @@ void SetDecorSelectionBoxOamAttributes(u8 decorShape) void sub_81292D0(struct Sprite *sprite) { - sprite->data2 = 0; - sprite->data3 = 0; - sprite->data4 = 0; - sprite->data5 = 0; - sprite->data6 = 0; - sprite->data7 = 0; + sprite->data[2] = 0; + sprite->data[3] = 0; + sprite->data[4] = 0; + sprite->data[5] = 0; + sprite->data[6] = 0; + sprite->data[7] = 0; sprite->callback = sub_81292E8; } void sub_81292E8(struct Sprite *sprite) { - if (sprite->data7 == 0) + if (sprite->data[7] == 0) { - if (sprite->data6 < 15) + if (sprite->data[6] < 15) { sprite->invisible = FALSE; } @@ -1974,8 +1976,8 @@ void sub_81292E8(struct Sprite *sprite) { sprite->invisible = TRUE; } - sprite->data6 ++; - sprite->data6 &= 0x1F; + sprite->data[6] ++; + sprite->data[6] &= 0x1F; } else { @@ -2247,7 +2249,7 @@ bool8 sub_81299AC(u8 taskId) void SetUpPuttingAwayDecorationPlayerAvatar(void) { player_get_direction_lower_nybble(); - sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data0; + sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data[0]; sub_812A39C(); gUnknown_03005DD0.unk4 = CreateSprite(&gUnknown_085A7404, 0x78, 0x50, 0); if (gSaveBlock2Ptr->playerGender == MALE) @@ -2298,7 +2300,7 @@ void sub_8129ABC(u8 taskId) void sub_8129B34(u8 taskId) { sub_8197434(0, 1); - gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data[7] = 0; gSprites[sDecor_CameraSpriteObjectIdx1].invisible = FALSE; gSprites[sDecor_CameraSpriteObjectIdx1].callback = sub_812A36C; gSprites[sDecor_CameraSpriteObjectIdx2].pos1.x = 0x88; @@ -2718,9 +2720,9 @@ void sub_812A334(void) void sub_812A36C(struct Sprite *sprite) { - sprite->data0 ++; - sprite->data0 &= 0x1F; - if (sprite->data0 > 15) + sprite->data[0] ++; + sprite->data[0] &= 0x1F; + if (sprite->data[0] > 15) { sprite->invisible = TRUE; } diff --git a/src/decoration_inventory.c b/src/decoration_inventory.c index 03ab6c00c..308320206 100644 --- a/src/decoration_inventory.c +++ b/src/decoration_inventory.c @@ -1,6 +1,7 @@ // Includes #include "global.h" +#include "constants/decorations.h" #include "decoration.h" #include "decoration_inventory.h" diff --git a/src/egg_hatch.c b/src/egg_hatch.c index a3f7c2ab0..a31eb0520 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -2,7 +2,7 @@ #include "pokemon.h" #include "egg_hatch.h" #include "pokedex.h" -#include "items.h" +#include "constants/items.h" #include "script.h" #include "decompress.h" #include "task.h" @@ -10,20 +10,20 @@ #include "main.h" #include "event_data.h" #include "sound.h" -#include "songs.h" +#include "constants/songs.h" #include "text.h" #include "text_window.h" #include "string_util.h" #include "menu.h" #include "trig.h" -#include "rng.h" +#include "random.h" #include "malloc.h" #include "dma3.h" #include "gpu_regs.h" #include "bg.h" #include "m4a.h" #include "window.h" -#include "abilities.h" +#include "constants/abilities.h" #include "daycare.h" #include "battle.h" // to get rid of later @@ -57,10 +57,8 @@ extern const u32 gUnknown_08331F60[]; // tilemap gameboy circle extern const u8 gText_HatchedFromEgg[]; extern const u8 gText_NickHatchPrompt[]; -extern u8* GetMonNick(struct Pokemon* mon, u8* dst); -extern u8* GetBoxMonNick(struct BoxPokemon* boxMon, u8* dst); extern u8 sav1_map_get_name(void); -extern s8 sub_8198C58(void); +extern s8 ProcessMenuInputNoWrap_(void); extern void TVShowConvertInternationalString(u8* str1, u8* str2, u8); extern void sub_806A068(u16, u8); extern void fade_screen(u8, u8); @@ -75,7 +73,6 @@ extern void play_some_sound(void); extern void copy_decompressed_tile_data_to_vram_autofree(u8 bg_id, const void* src, u16 size, u16 offset, u8 mode); extern void CreateYesNoMenu(const struct WindowTemplate*, u16, u8, u8); extern void DoNamingScreen(u8, const u8*, u16, u8, u32, MainCallback); -extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor* colors, s8 speed, u8 *str); extern u16 sub_80D22D0(void); extern u8 CountPartyAliveNonEggMonsExcept(u8); @@ -672,7 +669,7 @@ static void CB2_EggHatch_1(void) } break; case 10: - switch (sub_8198C58()) + switch (ProcessMenuInputNoWrap_()) { case 0: GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3); @@ -712,16 +709,16 @@ static void CB2_EggHatch_1(void) static void SpriteCB_Egg_0(struct Sprite* sprite) { - if (++sprite->data0 > 20) + if (++sprite->data[0] > 20) { sprite->callback = SpriteCB_Egg_1; - sprite->data0 = 0; + sprite->data[0] = 0; } else { - sprite->data1 = (sprite->data1 + 20) & 0xFF; - sprite->pos2.x = Sin(sprite->data1, 1); - if (sprite->data0 == 15) + sprite->data[1] = (sprite->data[1] + 20) & 0xFF; + sprite->pos2.x = Sin(sprite->data[1], 1); + if (sprite->data[0] == 15) { PlaySE(SE_BOWA); StartSpriteAnim(sprite, 1); @@ -732,19 +729,19 @@ static void SpriteCB_Egg_0(struct Sprite* sprite) static void SpriteCB_Egg_1(struct Sprite* sprite) { - if (++sprite->data2 > 30) + if (++sprite->data[2] > 30) { - if (++sprite->data0 > 20) + if (++sprite->data[0] > 20) { sprite->callback = SpriteCB_Egg_2; - sprite->data0 = 0; - sprite->data2 = 0; + sprite->data[0] = 0; + sprite->data[2] = 0; } else { - sprite->data1 = (sprite->data1 + 20) & 0xFF; - sprite->pos2.x = Sin(sprite->data1, 2); - if (sprite->data0 == 15) + sprite->data[1] = (sprite->data[1] + 20) & 0xFF; + sprite->pos2.x = Sin(sprite->data[1], 2); + if (sprite->data[0] == 15) { PlaySE(SE_BOWA); StartSpriteAnim(sprite, 2); @@ -755,30 +752,30 @@ static void SpriteCB_Egg_1(struct Sprite* sprite) static void SpriteCB_Egg_2(struct Sprite* sprite) { - if (++sprite->data2 > 30) + if (++sprite->data[2] > 30) { - if (++sprite->data0 > 38) + if (++sprite->data[0] > 38) { u16 species; sprite->callback = SpriteCB_Egg_3; - sprite->data0 = 0; + sprite->data[0] = 0; species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES); gSprites[sEggHatchData->pokeSpriteID].pos2.x = 0; gSprites[sEggHatchData->pokeSpriteID].pos2.y = 0; } else { - sprite->data1 = (sprite->data1 + 20) & 0xFF; - sprite->pos2.x = Sin(sprite->data1, 2); - if (sprite->data0 == 15) + sprite->data[1] = (sprite->data[1] + 20) & 0xFF; + sprite->pos2.x = Sin(sprite->data[1], 2); + if (sprite->data[0] == 15) { PlaySE(SE_BOWA); StartSpriteAnim(sprite, 2); CreateRandomEggShardSprite(); CreateRandomEggShardSprite(); } - if (sprite->data0 == 30) + if (sprite->data[0] == 30) PlaySE(SE_BOWA); } } @@ -786,60 +783,60 @@ static void SpriteCB_Egg_2(struct Sprite* sprite) static void SpriteCB_Egg_3(struct Sprite* sprite) { - if (++sprite->data0 > 50) + if (++sprite->data[0] > 50) { sprite->callback = SpriteCB_Egg_4; - sprite->data0 = 0; + sprite->data[0] = 0; } } static void SpriteCB_Egg_4(struct Sprite* sprite) { s16 i; - if (sprite->data0 == 0) + if (sprite->data[0] == 0) BeginNormalPaletteFade(-1, -1, 0, 0x10, 0xFFFF); - if (sprite->data0 < 4u) + if (sprite->data[0] < 4u) { for (i = 0; i <= 3; i++) CreateRandomEggShardSprite(); } - sprite->data0++; + sprite->data[0]++; if (!gPaletteFade.active) { PlaySE(SE_TAMAGO); sprite->invisible = 1; sprite->callback = SpriteCB_Egg_5; - sprite->data0 = 0; + sprite->data[0] = 0; } } static void SpriteCB_Egg_5(struct Sprite* sprite) { - if (sprite->data0 == 0) + if (sprite->data[0] == 0) { gSprites[sEggHatchData->pokeSpriteID].invisible = 0; StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], 1); } - if (sprite->data0 == 8) + if (sprite->data[0] == 8) BeginNormalPaletteFade(-1, -1, 0x10, 0, 0xFFFF); - if (sprite->data0 <= 9) + if (sprite->data[0] <= 9) gSprites[sEggHatchData->pokeSpriteID].pos1.y -= 1; - if (sprite->data0 > 40) + if (sprite->data[0] > 40) sprite->callback = SpriteCallbackDummy; - sprite->data0++; + sprite->data[0]++; } static void SpriteCB_EggShard(struct Sprite* sprite) { - sprite->data4 += sprite->data1; - sprite->data5 += sprite->data2; + sprite->data[4] += sprite->data[1]; + sprite->data[5] += sprite->data[2]; - sprite->pos2.x = sprite->data4 / 256; - sprite->pos2.y = sprite->data5 / 256; + sprite->pos2.x = sprite->data[4] / 256; + sprite->pos2.y = sprite->data[5] / 256; - sprite->data2 += sprite->data3; + sprite->data[2] += sprite->data[3]; - if (sprite->pos1.y + sprite->pos2.y > sprite->pos1.y + 20 && sprite->data2 > 0) + if (sprite->pos1.y + sprite->pos2.y > sprite->pos1.y + 20 && sprite->data[2] > 0) DestroySprite(sprite); } @@ -857,9 +854,9 @@ static void CreateRandomEggShardSprite(void) static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex) { u8 spriteID = CreateSprite(&sSpriteTemplate_EggShard, x, y, 4); - gSprites[spriteID].data1 = data1; - gSprites[spriteID].data2 = data2; - gSprites[spriteID].data3 = data3; + gSprites[spriteID].data[1] = data1; + gSprites[spriteID].data[2] = data2; + gSprites[spriteID].data[3] = data3; StartSpriteAnim(&gSprites[spriteID], spriteAnimIndex); } diff --git a/src/event_data.c b/src/event_data.c index e3742a147..9f1432f17 100644 --- a/src/event_data.c +++ b/src/event_data.c @@ -44,7 +44,7 @@ void ClearTempFieldEventData(void) FlagClear(FLAG_SYS_ENC_DOWN_ITEM); FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_CTRL_OBJ_DELETE); - FlagClear(FLAG_SYS_UNKNOWN_880); + FlagClear(FLAG_0x880); } // probably had different flag splits at one point. diff --git a/src/evolution_graphics.c b/src/evolution_graphics.c index eca5d4bdc..8d02eef91 100644 --- a/src/evolution_graphics.c +++ b/src/evolution_graphics.c @@ -2,11 +2,11 @@ #include "evolution_graphics.h" #include "sprite.h" #include "trig.h" -#include "rng.h" +#include "random.h" #include "decompress.h" #include "task.h" #include "sound.h" -#include "songs.h" +#include "constants/songs.h" #include "palette.h" // this file's functions @@ -112,18 +112,18 @@ static void SpriteCB_PreEvoSparkleSet1(struct Sprite* sprite) { u8 matrixNum; - sprite->pos1.y = 88 - (sprite->data7 * sprite->data7) / 80; - sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5) / 4; - sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5); - sprite->data6 += 4; - if (sprite->data7 & 1) - sprite->data5--; - sprite->data7++; + sprite->pos1.y = 88 - (sprite->data[7] * sprite->data[7]) / 80; + sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]) / 4; + sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]); + sprite->data[6] += 4; + if (sprite->data[7] & 1) + sprite->data[5]--; + sprite->data[7]++; if (sprite->pos2.y > 0) sprite->subpriority = 1; else sprite->subpriority = 20; - matrixNum = sprite->data5 / 4 + 20; + matrixNum = sprite->data[5] / 4 + 20; if (matrixNum > 31) matrixNum = 31; sprite->oam.matrixNum = matrixNum; @@ -137,9 +137,9 @@ static void CreatePreEvoSparkleSet1(u8 arg0) u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 88, 0); if (spriteID != MAX_SPRITES) { - gSprites[spriteID].data5 = 48; - gSprites[spriteID].data6 = arg0; - gSprites[spriteID].data7 = 0; + gSprites[spriteID].data[5] = 48; + gSprites[spriteID].data[6] = arg0; + gSprites[spriteID].data[7] = 0; gSprites[spriteID].oam.affineMode = 1; gSprites[spriteID].oam.matrixNum = 31; gSprites[spriteID].callback = SpriteCB_PreEvoSparkleSet1; @@ -150,11 +150,11 @@ static void SpriteCB_PreEvoSparkleSet2(struct Sprite* sprite) { if (sprite->pos1.y < 88) { - sprite->pos1.y = 8 + (sprite->data7 * sprite->data7) / 5; - sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5) / 4; - sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5); - sprite->data5 = 8 + Sin((u8)(sprite->data7 * 4), 40); - sprite->data7++; + sprite->pos1.y = 8 + (sprite->data[7] * sprite->data[7]) / 5; + sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]) / 4; + sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]); + sprite->data[5] = 8 + Sin((u8)(sprite->data[7] * 4), 40); + sprite->data[7]++; } else DestroySprite(sprite); @@ -165,9 +165,9 @@ static void CreatePreEvoSparkleSet2(u8 arg0) u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 8, 0); if (spriteID != MAX_SPRITES) { - gSprites[spriteID].data5 = 8; - gSprites[spriteID].data6 = arg0; - gSprites[spriteID].data7 = 0; + gSprites[spriteID].data[5] = 8; + gSprites[spriteID].data[6] = arg0; + gSprites[spriteID].data[7] = 0; gSprites[spriteID].oam.affineMode = 1; gSprites[spriteID].oam.matrixNum = 25; gSprites[spriteID].subpriority = 1; @@ -177,12 +177,12 @@ static void CreatePreEvoSparkleSet2(u8 arg0) static void SpriteCB_PostEvoSparkleSet1(struct Sprite* sprite) { - if (sprite->data5 > 8) + if (sprite->data[5] > 8) { - sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5); - sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5); - sprite->data5 -= sprite->data3; - sprite->data6 += 4; + sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]); + sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]); + sprite->data[5] -= sprite->data[3]; + sprite->data[6] += 4; } else DestroySprite(sprite); @@ -193,10 +193,10 @@ static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1) u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0); if (spriteID != MAX_SPRITES) { - gSprites[spriteID].data3 = arg1; - gSprites[spriteID].data5 = 120; - gSprites[spriteID].data6 = arg0; - gSprites[spriteID].data7 = 0; + gSprites[spriteID].data[3] = arg1; + gSprites[spriteID].data[5] = 120; + gSprites[spriteID].data[6] = arg0; + gSprites[spriteID].data[7] = 0; gSprites[spriteID].oam.affineMode = 1; gSprites[spriteID].oam.matrixNum = 31; gSprites[spriteID].subpriority = 1; @@ -206,29 +206,29 @@ static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1) static void SpriteCB_PostEvoSparkleSet2(struct Sprite* sprite) { - if (!(sprite->data7 & 3)) + if (!(sprite->data[7] & 3)) sprite->pos1.y++; - if (sprite->data6 < 128) + if (sprite->data[6] < 128) { u8 matrixNum; - sprite->pos2.y = -Sin((u8)(sprite->data6), sprite->data5); - sprite->pos1.x = 120 + (sprite->data3 * sprite->data7) / 3; - sprite->data6++; - matrixNum = 31 - (sprite->data6 * 12 / 128); - if (sprite->data6 > 64) + sprite->pos2.y = -Sin((u8)(sprite->data[6]), sprite->data[5]); + sprite->pos1.x = 120 + (sprite->data[3] * sprite->data[7]) / 3; + sprite->data[6]++; + matrixNum = 31 - (sprite->data[6] * 12 / 128); + if (sprite->data[6] > 64) sprite->subpriority = 1; else { sprite->invisible = 0; sprite->subpriority = 20; - if (sprite->data6 > 112 && sprite->data6 & 1) + if (sprite->data[6] > 112 && sprite->data[6] & 1) sprite->invisible = 1; } if (matrixNum < 20) matrixNum = 20; sprite->oam.matrixNum = matrixNum; - sprite->data7++; + sprite->data[7]++; } else DestroySprite(sprite); @@ -239,9 +239,9 @@ static void CreatePostEvoSparkleSet2(u8 arg0) u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0); if (spriteID != MAX_SPRITES) { - gSprites[spriteID].data3 = 3 - (Random() % 7); - gSprites[spriteID].data5 = 48 + (Random() & 0x3F); - gSprites[spriteID].data7 = 0; + gSprites[spriteID].data[3] = 3 - (Random() % 7); + gSprites[spriteID].data[5] = 48 + (Random() & 0x3F); + gSprites[spriteID].data[7] = 0; gSprites[spriteID].oam.affineMode = 1; gSprites[spriteID].oam.matrixNum = 31; gSprites[spriteID].subpriority = 20; diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 68731a14a..2b88fec3a 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -16,11 +16,12 @@ #include "m4a.h" #include "menu.h" #include "pokedex.h" -#include "species.h" +#include "constants/species.h" #include "sound.h" -#include "songs.h" +#include "constants/songs.h" #include "overworld.h" #include "battle_message.h" +#include "battle_string_ids.h" #include "gpu_regs.h" #include "bg.h" #include "link.h" @@ -51,6 +52,7 @@ extern u8 gBattleTerrain; extern struct SpriteTemplate gUnknown_0202499C; extern bool8 gAffineAnimsDisabled; extern u16 gMoveToLearn; +extern const u8 gSpeciesNames[][11]; extern u8 gBattleCommunication[]; #define sEvoCursorPos gBattleCommunication[1] // when learning a new move @@ -771,7 +773,7 @@ static void Task_EvolutionScene(u8 taskID) { BufferMoveToLearnIntoBattleTextBuff2(); PlayFanfare(BGM_FANFA1); - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[3]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]); BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter gTasks[taskID].tState++; @@ -788,7 +790,7 @@ static void Task_EvolutionScene(u8 taskID) if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BufferMoveToLearnIntoBattleTextBuff2(); - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[4]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]); BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); gTasks[taskID].tLearnMoveState++; } @@ -796,7 +798,7 @@ static void Task_EvolutionScene(u8 taskID) case 1: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[5]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]); BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); gTasks[taskID].tLearnMoveState++; } @@ -804,7 +806,7 @@ static void Task_EvolutionScene(u8 taskID) case 2: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[6]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]); BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); gTasks[taskID].tData7 = 5; gTasks[taskID].tData8 = 10; @@ -881,7 +883,7 @@ static void Task_EvolutionScene(u8 taskID) u16 move = GetMonData(mon, var + MON_DATA_MOVE1); if (IsHMMove2(move)) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[307]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]); BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); gTasks[taskID].tLearnMoveState = 12; } @@ -897,14 +899,14 @@ static void Task_EvolutionScene(u8 taskID) } break; case 7: - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[207]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]); BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); gTasks[taskID].tLearnMoveState++; break; case 8: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[7]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]); BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); gTasks[taskID].tLearnMoveState++; } @@ -912,20 +914,20 @@ static void Task_EvolutionScene(u8 taskID) case 9: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[208]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]); BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); gTasks[taskID].tState = 20; } break; case 10: - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[8]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]); BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); gTasks[taskID].tData7 = 11; gTasks[taskID].tData8 = 0; gTasks[taskID].tLearnMoveState = 3; break; case 11: - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[9]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]); BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); gTasks[taskID].tState = 15; break; @@ -1116,7 +1118,7 @@ static void Task_TradeEvolutionScene(u8 taskID) { BufferMoveToLearnIntoBattleTextBuff2(); PlayFanfare(BGM_FANFA1); - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[3]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]); sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter gTasks[taskID].tState++; @@ -1133,7 +1135,7 @@ static void Task_TradeEvolutionScene(u8 taskID) if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BufferMoveToLearnIntoBattleTextBuff2(); - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[4]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]); sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tLearnMoveState++; } @@ -1141,7 +1143,7 @@ static void Task_TradeEvolutionScene(u8 taskID) case 1: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[5]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]); sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tLearnMoveState++; } @@ -1149,7 +1151,7 @@ static void Task_TradeEvolutionScene(u8 taskID) case 2: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[6]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]); sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tData7 = 5; gTasks[taskID].tData8 = 9; @@ -1166,11 +1168,11 @@ static void Task_TradeEvolutionScene(u8 taskID) } break; case 4: - switch (sub_8198C58()) + switch (ProcessMenuInputNoWrap_()) { case 0: sEvoCursorPos = 0; - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[292]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_ID_ADDER]); sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tLearnMoveState = gTasks[taskID].tData7; if (gTasks[taskID].tLearnMoveState == 5) @@ -1179,7 +1181,7 @@ static void Task_TradeEvolutionScene(u8 taskID) case 1: case -1: sEvoCursorPos = 1; - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[292]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_ID_ADDER]); sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tLearnMoveState = gTasks[taskID].tData8; break; @@ -1215,7 +1217,7 @@ static void Task_TradeEvolutionScene(u8 taskID) u16 move = GetMonData(mon, var + MON_DATA_MOVE1); if (IsHMMove2(move)) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[307]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]); sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tLearnMoveState = 11; } @@ -1225,7 +1227,7 @@ static void Task_TradeEvolutionScene(u8 taskID) RemoveMonPPBonus(mon, var); SetMonMoveSlot(mon, gMoveToLearn, var); - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[207]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]); sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tLearnMoveState++; } @@ -1235,7 +1237,7 @@ static void Task_TradeEvolutionScene(u8 taskID) case 7: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[7]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]); sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tLearnMoveState++; } @@ -1243,20 +1245,20 @@ static void Task_TradeEvolutionScene(u8 taskID) case 8: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[208]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]); sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tState = 18; } break; case 9: - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[8]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]); sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tData7 = 10; gTasks[taskID].tData8 = 0; gTasks[taskID].tLearnMoveState = 3; break; case 10: - BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[9]); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]); sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tState = 13; break; diff --git a/src/field_map_obj.c b/src/field_map_obj.c index dfdeb63a3..6a99890a4 100755 --- a/src/field_map_obj.c +++ b/src/field_map_obj.c @@ -4,7 +4,7 @@ #include "malloc.h" #include "sprite.h" #include "overworld.h" -#include "rng.h" +#include "random.h" #include "event_scripts.h" #include "berry.h" #include "palette.h" @@ -30,7 +30,7 @@ bool8 FieldObjectCB2_##name(struct MapObject *, struct Sprite *);\ void FieldObjectCB_##name(struct Sprite *sprite)\ {\ - FieldObjectStep(&gMapObjects[sprite->data0], sprite, FieldObjectCB2_##name);\ + FieldObjectStep(&gMapObjects[sprite->data[0]], sprite, FieldObjectCB2_##name);\ }\ bool8 FieldObjectCB2_##name(struct MapObject *mapObject, struct Sprite *sprite)\ {\ @@ -42,11 +42,11 @@ extern bool8 (*const (table)[])(struct MapObject *, struct Sprite *);\ bool8 FieldObjectCB2_##name(struct MapObject *, struct Sprite *);\ void FieldObjectCB_##name(struct Sprite *sprite)\ {\ - FieldObjectStep(&gMapObjects[sprite->data0], sprite, FieldObjectCB2_##name);\ + FieldObjectStep(&gMapObjects[sprite->data[0]], sprite, FieldObjectCB2_##name);\ }\ bool8 FieldObjectCB2_##name(struct MapObject *mapObject, struct Sprite *sprite)\ {\ - return (table)[sprite->data1](mapObject, sprite);\ + return (table)[sprite->data[1]](mapObject, sprite);\ } #define field_object_path(idx, table, sub, path, catch, coord)\ @@ -655,7 +655,7 @@ static u8 SpawnFieldObjectInternal(struct MapObjectTemplate *mapObjectTemplate, sprite->pos1.y += 16 + sprite->centerToCornerVecY; sprite->oam.paletteNum = paletteSlot; sprite->coordOffsetEnabled = TRUE; - sprite->data0 = mapObjectId; + sprite->data[0] = mapObjectId; mapObject->spriteId = spriteId; mapObject->mapobj_bit_12 = graphicsInfo->inanimate; if (!mapObject->mapobj_bit_12) @@ -813,8 +813,8 @@ u8 sprite_new(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction) sprite->oam.paletteNum -= 16; } sprite->coordOffsetEnabled = TRUE; - sprite->data0 = a1; - sprite->data1 = z; + sprite->data[0] = a1; + sprite->data[1] = z; if (graphicsInfo->paletteSlot == 10) { npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot); @@ -1003,7 +1003,7 @@ static void sub_808E1B8(u8 mapObjectId, s16 x, s16 y) } sprite->oam.paletteNum = paletteSlot; sprite->coordOffsetEnabled = TRUE; - sprite->data0 = mapObjectId; + sprite->data[0] = mapObjectId; mapObject->spriteId = spriteId; if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 0x0b) { @@ -1463,7 +1463,7 @@ u8 AddCameraObject(u8 linkedSpriteId) spriteId = CreateSprite(&gUnknown_084975D4, 0, 0, 4); gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data0 = linkedSpriteId; + gSprites[spriteId].data[0] = linkedSpriteId; return spriteId; } @@ -1472,15 +1472,15 @@ void ObjectCB_CameraObject(struct Sprite *sprite) void (*callbacks[ARRAY_COUNT(gUnknown_084975EC)])(struct Sprite *); memcpy(callbacks, gUnknown_084975EC, sizeof gUnknown_084975EC); - callbacks[sprite->data1](sprite); + callbacks[sprite->data[1]](sprite); } /*static*/ void CameraObject_0(struct Sprite *sprite) { - sprite->pos1.x = gSprites[sprite->data0].pos1.x; - sprite->pos1.y = gSprites[sprite->data0].pos1.y; + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; sprite->invisible = TRUE; - sprite->data1 = 1; + sprite->data[1] = 1; CameraObject_1(sprite); } @@ -1489,20 +1489,20 @@ void ObjectCB_CameraObject(struct Sprite *sprite) s16 x; s16 y; - y = gSprites[sprite->data0].pos1.y; - x = gSprites[sprite->data0].pos1.x; - sprite->data2 = x - sprite->pos1.x; - sprite->data3 = y - sprite->pos1.y; + y = gSprites[sprite->data[0]].pos1.y; + x = gSprites[sprite->data[0]].pos1.x; + sprite->data[2] = x - sprite->pos1.x; + sprite->data[3] = y - sprite->pos1.y; sprite->pos1.x = x; sprite->pos1.y = y; } /*static*/ void CameraObject_2(struct Sprite *sprite) { - sprite->pos1.x = gSprites[sprite->data0].pos1.x; - sprite->pos1.y = gSprites[sprite->data0].pos1.y; - sprite->data2 = 0; - sprite->data3 = 0; + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; + sprite->data[2] = 0; + sprite->data[3] = 0; } static struct Sprite *FindCameraObject(void) @@ -1526,7 +1526,7 @@ void CameraObjectReset1(void) cameraObject = FindCameraObject(); if (cameraObject != NULL) { - cameraObject->data1 = 0; + cameraObject->data[1] = 0; cameraObject->callback(cameraObject); } } @@ -1538,7 +1538,7 @@ void CameraObjectSetFollowedObjectId(u8 objectId) cameraObject = FindCameraObject(); if (cameraObject != NULL) { - cameraObject->data0 = objectId; + cameraObject->data[0] = objectId; CameraObjectReset1(); } } @@ -1552,12 +1552,12 @@ u8 CameraObjectGetFollowedObjectId(void) { return MAX_SPRITES; } - return cameraObject->data0; + return cameraObject->data[0]; } void CameraObjectReset2(void) { - FindCameraObject()->data1 = 2; + FindCameraObject()->data[1] = 2; } u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority) @@ -1818,14 +1818,14 @@ field_object_step(GoRandomDirections, gUnknown_0850D6F4) bool8 sub_808F44C(struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_808F460(struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -1836,7 +1836,7 @@ bool8 sub_808F48C(struct MapObject *mapObject, struct Sprite *sprite) return FALSE; } SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]); - sprite->data1 = 3; + sprite->data[1] = 3; return TRUE; } @@ -1844,7 +1844,7 @@ bool8 sub_808F4C8(struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -1858,10 +1858,10 @@ bool8 sub_808F4E8(struct MapObject *mapObject, struct Sprite *sprite) memcpy(directions, gUnknown_0850D710, sizeof directions); chosenDirection = directions[Random() & 0x03]; FieldObjectSetDirection(mapObject, chosenDirection); - sprite->data1 = 5; + sprite->data[1] = 5; if (npc_block_way__next_tile(mapObject, chosenDirection)) { - sprite->data1 = 1; + sprite->data[1] = 1; } return TRUE; } @@ -1870,7 +1870,7 @@ bool8 sub_808F534(struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 6; + sprite->data[1] = 6; return TRUE; } @@ -1879,7 +1879,7 @@ bool8 sub_808F564(struct MapObject *mapObject, struct Sprite *sprite) if (FieldObjectExecRegularAnim(mapObject, sprite)) { mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 1; + sprite->data[1] = 1; } return FALSE; } @@ -2140,14 +2140,14 @@ field_object_step(LookRandomDirections, gUnknown_0850D740) bool8 sub_808F988(struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_808F99C(struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2157,7 +2157,7 @@ bool8 sub_808F9C8(struct MapObject *mapObject, struct Sprite *sprite) { SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]); mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -2166,7 +2166,7 @@ bool8 sub_808FA0C(struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2184,7 +2184,7 @@ bool8 sub_808FA3C(struct MapObject *mapObject, struct Sprite *sprite) direction = directions[Random() & 0x03]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2193,14 +2193,14 @@ field_object_step(RandomlyGoNorthOrSouth, gUnknown_0850D754) bool8 sub_808FAC8(struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_808FADC(struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2211,7 +2211,7 @@ bool8 sub_808FB08(struct MapObject *mapObject, struct Sprite *sprite) return FALSE; } SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]); - sprite->data1 = 3; + sprite->data[1] = 3; return TRUE; } @@ -2219,7 +2219,7 @@ bool8 sub_808FB44(struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2233,10 +2233,10 @@ bool8 sub_808FB64(struct MapObject *mapObject, struct Sprite *sprite) memcpy(directions, gUnknown_0850D770, sizeof directions); direction = directions[Random() & 0x01]; FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 5; + sprite->data[1] = 5; if (npc_block_way__next_tile(mapObject, direction)) { - sprite->data1 = 1; + sprite->data[1] = 1; } return TRUE; } @@ -2245,7 +2245,7 @@ bool8 sub_808FBB0(struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 6; + sprite->data[1] = 6; return TRUE; } @@ -2254,7 +2254,7 @@ bool8 sub_808FBE0(struct MapObject *mapObject, struct Sprite *sprite) if (FieldObjectExecRegularAnim(mapObject, sprite)) { mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 1; + sprite->data[1] = 1; } return FALSE; } @@ -2264,14 +2264,14 @@ field_object_step(RandomlyGoEastOrWest, gUnknown_0850D774) bool8 sub_808FC4C(struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_808FC60(struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2282,7 +2282,7 @@ bool8 sub_808FC8C(struct MapObject *mapObject, struct Sprite *sprite) return FALSE; } SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]); - sprite->data1 = 3; + sprite->data[1] = 3; return TRUE; } @@ -2290,7 +2290,7 @@ bool8 sub_808FCC8(struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2304,10 +2304,10 @@ bool8 sub_808FCE8(struct MapObject *mapObject, struct Sprite *sprite) memcpy(directions, gUnknown_0850D790, sizeof directions); direction = directions[Random() & 0x01]; FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 5; + sprite->data[1] = 5; if (npc_block_way__next_tile(mapObject, direction)) { - sprite->data1 = 1; + sprite->data[1] = 1; } return TRUE; } @@ -2316,7 +2316,7 @@ bool8 sub_808FD34(struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 6; + sprite->data[1] = 6; return TRUE; } @@ -2325,7 +2325,7 @@ bool8 sub_808FD64(struct MapObject *mapObject, struct Sprite *sprite) if (FieldObjectExecRegularAnim(mapObject, sprite)) { mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 1; + sprite->data[1] = 1; } return FALSE; } @@ -2336,7 +2336,7 @@ bool8 sub_808FDD0(struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2344,7 +2344,7 @@ bool8 sub_808FDFC(struct MapObject *mapObject, struct Sprite *sprite) { if (FieldObjectExecRegularAnim(mapObject, sprite)) { - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } return FALSE; @@ -2362,17 +2362,17 @@ void FieldObjectCB_BerryTree(struct Sprite *sprite) { struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data0]; - if (!(sprite->data7 & 0x0001)) + mapObject = &gMapObjects[sprite->data[0]]; + if (!(sprite->data[7] & 0x0001)) { get_berry_tree_graphics(mapObject, sprite); - sprite->data7 |= 0x0001; + sprite->data[7] |= 0x0001; } FieldObjectStep(mapObject, sprite, FieldObjectCB2_BerryTree); } static bool8 FieldObjectCB2_BerryTree(struct MapObject *mapObject, struct Sprite *sprite) { - return gUnknown_0850D7A0[sprite->data1](mapObject, sprite); + return gUnknown_0850D7A0[sprite->data[1]](mapObject, sprite); } bool8 do_berry_tree_growth_sparkle_1 (struct MapObject *mapObject, struct Sprite *sprite) @@ -2385,7 +2385,7 @@ bool8 do_berry_tree_growth_sparkle_1 (struct MapObject *mapObject, struct Sprite berryStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); if (berryStage == 0) { - if (!(sprite->data7 & 0x0004) && sprite->animNum == 4) + if (!(sprite->data[7] & 0x0004) && sprite->animNum == 4) { gFieldEffectArguments[0] = mapObject->coords2.x; gFieldEffectArguments[1] = mapObject->coords2.y; @@ -2401,12 +2401,12 @@ bool8 do_berry_tree_growth_sparkle_1 (struct MapObject *mapObject, struct Sprite berryStage --; if (sprite->animNum != berryStage) { - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } get_berry_tree_graphics(mapObject, sprite); FieldObjectSetRegularAnim(mapObject, sprite, 0x39); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2414,7 +2414,7 @@ bool8 sub_808FF48 (struct MapObject *mapObject, struct Sprite *sprite) { if (FieldObjectExecRegularAnim(mapObject, sprite)) { - sprite->data1 = 0; + sprite->data[1] = 0; return TRUE; } return FALSE; @@ -2423,9 +2423,9 @@ bool8 sub_808FF48 (struct MapObject *mapObject, struct Sprite *sprite) bool8 do_berry_tree_growth_sparkle_2 (struct MapObject *mapObject, struct Sprite *sprite) { mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 3; - sprite->data2 = 0; - sprite->data7 |= 0x0002; + sprite->data[1] = 3; + sprite->data[2] = 0; + sprite->data[7] |= 0x0002; gFieldEffectArguments[0] = mapObject->coords2.x; gFieldEffectArguments[1] = mapObject->coords2.y; gFieldEffectArguments[2] = sprite->subpriority - 1; @@ -2436,14 +2436,14 @@ bool8 do_berry_tree_growth_sparkle_2 (struct MapObject *mapObject, struct Sprite bool8 sub_808FFB4 (struct MapObject *mapObject, struct Sprite *sprite) { - sprite->data2 ++; - mapObject->mapobj_bit_13 = (sprite->data2 & 0x02) >> 1; + sprite->data[2] ++; + mapObject->mapobj_bit_13 = (sprite->data[2] & 0x02) >> 1; sprite->animPaused = TRUE; - if (sprite->data2 > 64) + if (sprite->data[2] > 64) { get_berry_tree_graphics(mapObject, sprite); - sprite->data1 = 4; - sprite->data2 = 0; + sprite->data[1] = 4; + sprite->data[2] = 0; return TRUE; } return FALSE; @@ -2451,13 +2451,13 @@ bool8 sub_808FFB4 (struct MapObject *mapObject, struct Sprite *sprite) bool8 sub_8090004 (struct MapObject *mapObject, struct Sprite *sprite) { - sprite->data2 ++; - mapObject->mapobj_bit_13 = (sprite->data2 & 0x02) >> 1; + sprite->data[2] ++; + mapObject->mapobj_bit_13 = (sprite->data[2] & 0x02) >> 1; sprite->animPaused = TRUE; - if (sprite->data2 > 64) + if (sprite->data[2] > 64) { - sprite->data1 = 0; - sprite->data7 &= ~0x0002; + sprite->data[1] = 0; + sprite->data[7] &= ~0x0002; return TRUE; } return FALSE; @@ -2468,14 +2468,14 @@ field_object_step(RandomlyLookNorthOrSouth, gUnknown_0850D7B4) bool8 sub_8090094 (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_80900A8 (struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2485,7 +2485,7 @@ bool8 sub_80900D4 (struct MapObject *mapObject, struct Sprite *sprite) { SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]); mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -2494,7 +2494,7 @@ bool8 sub_8090118 (struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2512,7 +2512,7 @@ bool8 sub_8090148 (struct MapObject *mapObject, struct Sprite *sprite) direction = directions[Random() & 0x01]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2521,14 +2521,14 @@ field_object_step(RandomlyLookEastOrWest, gUnknown_0850D7C8) bool8 sub_80901D4 (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_80901E8 (struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2538,7 +2538,7 @@ bool8 sub_8090214 (struct MapObject *mapObject, struct Sprite *sprite) { SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]); mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -2547,7 +2547,7 @@ bool8 sub_8090258 (struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2565,7 +2565,7 @@ bool8 sub_8090288 (struct MapObject *mapObject, struct Sprite *sprite) direction = directions[Random() & 0x01]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2574,14 +2574,14 @@ field_object_step(RandomlyLookNorthOrWest, gUnknown_0850D7DC) bool8 sub_8090314 (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_8090328 (struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2591,7 +2591,7 @@ bool8 sub_8090354 (struct MapObject *mapObject, struct Sprite *sprite) { SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -2600,7 +2600,7 @@ bool8 sub_8090398 (struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2618,7 +2618,7 @@ bool8 sub_80903C8 (struct MapObject *mapObject, struct Sprite *sprite) direction = directions[Random() & 0x01]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2627,14 +2627,14 @@ field_object_step(RandomlyLookNorthOrEast, gUnknown_0850D7F4) bool8 sub_8090454 (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_8090468 (struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2644,7 +2644,7 @@ bool8 sub_8090494 (struct MapObject *mapObject, struct Sprite *sprite) { SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -2653,7 +2653,7 @@ bool8 sub_80904D8 (struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2671,7 +2671,7 @@ bool8 sub_8090508 (struct MapObject *mapObject, struct Sprite *sprite) direction = directions[Random() & 0x01]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2680,14 +2680,14 @@ field_object_step(RandomlyLookSouthOrWest, gUnknown_0850D80C) bool8 sub_8090594 (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_80905A8 (struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2697,7 +2697,7 @@ bool8 sub_80905D4 (struct MapObject *mapObject, struct Sprite *sprite) { SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -2706,7 +2706,7 @@ bool8 sub_8090618 (struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2724,7 +2724,7 @@ bool8 sub_8090648 (struct MapObject *mapObject, struct Sprite *sprite) direction = directions[Random() & 0x01]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2733,14 +2733,14 @@ field_object_step(RandomlyLookSouthOrEast, gUnknown_0850D824) bool8 sub_80906D4 (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_80906E8 (struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2750,7 +2750,7 @@ bool8 sub_8090714 (struct MapObject *mapObject, struct Sprite *sprite) { SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -2759,7 +2759,7 @@ bool8 sub_8090758 (struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2777,7 +2777,7 @@ bool8 sub_8090788 (struct MapObject *mapObject, struct Sprite *sprite) direction = directions[Random() & 0x01]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2786,14 +2786,14 @@ field_object_step(RandomlyLookNorthOrSouthOrWest, gUnknown_0850D83C) bool8 sub_8090814 (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_8090828 (struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2803,7 +2803,7 @@ bool8 sub_8090854 (struct MapObject *mapObject, struct Sprite *sprite) { SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -2812,7 +2812,7 @@ bool8 sub_8090898 (struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2830,7 +2830,7 @@ bool8 sub_80908C8 (struct MapObject *mapObject, struct Sprite *sprite) direction = directions[Random() & 0x03]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2839,14 +2839,14 @@ field_object_step(RandomlyLookNorthOrSouthOrEast, gUnknown_0850D854) bool8 sub_8090954 (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_8090968 (struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2856,7 +2856,7 @@ bool8 sub_8090994 (struct MapObject *mapObject, struct Sprite *sprite) { SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -2865,7 +2865,7 @@ bool8 sub_80909D8 (struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2883,7 +2883,7 @@ bool8 sub_8090A08 (struct MapObject *mapObject, struct Sprite *sprite) direction = directions[Random() & 0x03]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2892,14 +2892,14 @@ field_object_step(RandomlyLookNorthOrEastOrWest, gUnknown_0850D86C) bool8 sub_8090A94 (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_8090AA8 (struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2909,7 +2909,7 @@ bool8 sub_8090AD4 (struct MapObject *mapObject, struct Sprite *sprite) { SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -2918,7 +2918,7 @@ bool8 sub_8090B18 (struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2936,7 +2936,7 @@ bool8 sub_8090B48 (struct MapObject *mapObject, struct Sprite *sprite) direction = directions[Random() & 0x03]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2945,14 +2945,14 @@ field_object_step(RandomlyLookSouthOrEastOrWest, gUnknown_0850D884) bool8 sub_8090BD4 (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_8090BE8 (struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -2962,7 +2962,7 @@ bool8 sub_8090C14 (struct MapObject *mapObject, struct Sprite *sprite) { SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -2971,7 +2971,7 @@ bool8 sub_8090C58 (struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 4; + sprite->data[1] = 4; return TRUE; } return FALSE; @@ -2989,7 +2989,7 @@ bool8 sub_8090C88 (struct MapObject *mapObject, struct Sprite *sprite) direction = directions[Random() & 0x03]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -2999,7 +2999,7 @@ bool8 sub_8090D14 (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -3008,7 +3008,7 @@ bool8 sub_8090D40 (struct MapObject *mapObject, struct Sprite *sprite) if (FieldObjectExecRegularAnim(mapObject, sprite)) { SetFieldObjectStepTimer(sprite, 48); - sprite->data1 = 2; + sprite->data[1] = 2; } return FALSE; } @@ -3017,7 +3017,7 @@ bool8 sub_8090D64 (struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -3034,7 +3034,7 @@ bool8 sub_8090D90 (struct MapObject *mapObject, struct Sprite *sprite) direction = directions[mapObject->mapobj_unk_18]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 0; + sprite->data[1] = 0; return TRUE; } @@ -3044,7 +3044,7 @@ bool8 sub_8090E18 (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -3053,7 +3053,7 @@ bool8 sub_8090E44 (struct MapObject *mapObject, struct Sprite *sprite) if (FieldObjectExecRegularAnim(mapObject, sprite)) { SetFieldObjectStepTimer(sprite, 48); - sprite->data1 = 2; + sprite->data[1] = 2; } return FALSE; } @@ -3062,7 +3062,7 @@ bool8 sub_8090E68 (struct MapObject *mapObject, struct Sprite *sprite) { if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) { - sprite->data1 = 3; + sprite->data[1] = 3; } return FALSE; } @@ -3079,7 +3079,7 @@ bool8 sub_8090E94 (struct MapObject *mapObject, struct Sprite *sprite) direction = directions[mapObject->mapobj_unk_18]; } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 0; + sprite->data[1] = 0; return TRUE; } @@ -3088,7 +3088,7 @@ field_object_step(AlternatelyGoInOppositeDirections, gUnknown_0850D8CC) bool8 sub_8090F1C (struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -3102,7 +3102,7 @@ bool8 sub_8090F30 (struct MapObject *mapObject, struct Sprite *sprite) direction = GetOppositeDirection(direction); } FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -3131,7 +3131,7 @@ bool8 sub_8090F68 (struct MapObject *mapObject, struct Sprite *sprite) } FieldObjectSetRegularAnim(mapObject, sprite, animId); mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 3; + sprite->data[1] = 3; return TRUE; } @@ -3140,7 +3140,7 @@ bool8 sub_8091020 (struct MapObject *mapObject, struct Sprite *sprite) if (FieldObjectExecRegularAnim(mapObject, sprite)) { mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 1; + sprite->data[1] = 1; } return FALSE; } @@ -3148,7 +3148,7 @@ bool8 sub_8091020 (struct MapObject *mapObject, struct Sprite *sprite) bool8 sub_8091048(struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -3177,7 +3177,7 @@ bool8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, stru } FieldObjectSetRegularAnim(mapObject, sprite, animId); mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -3186,7 +3186,7 @@ bool8 sub_8091110(struct MapObject *mapObject, struct Sprite *sprite) if (FieldObjectExecRegularAnim(mapObject, sprite)) { mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 1; + sprite->data[1] = 1; } return FALSE; } @@ -3225,7 +3225,7 @@ bool8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Spr { mapObject->mapobj_unk_21 = player_get_direction_lower_nybble(); } - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -3243,7 +3243,7 @@ bool8 sub_8091F20(struct MapObject *mapObject, struct Sprite *sprite) if (FieldObjectExecRegularAnim(mapObject, sprite)) { mapObject->mapobj_bit_1 = FALSE; - sprite->data1 = 1; + sprite->data[1] = 1; } return FALSE; } @@ -3257,7 +3257,7 @@ bool8 sub_8091F4C(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, playerDirection))); mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -3278,7 +3278,7 @@ bool8 sub_8091F94(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD FieldObjectMoveDestCoords(mapObject, direction, &x, &y); FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } } @@ -3293,7 +3293,7 @@ bool8 sub_8091F94(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); } mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -3312,7 +3312,7 @@ bool8 sub_80920A4(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); } mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -3331,7 +3331,7 @@ bool8 sub_809215C(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); } mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -3350,7 +3350,7 @@ bool8 sub_8092214(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); } mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -3362,7 +3362,7 @@ bool8 cph_IM_DIFFERENT(struct MapObject *mapObject, struct Sprite *sprite, u8 pl direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction); FieldObjectSetRegularAnim(mapObject, sprite, sub_80934BC(direction)); mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -3381,7 +3381,7 @@ bool8 sub_8092314(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); } mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -3402,7 +3402,7 @@ bool8 oac_hopping(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); } mapObject->mapobj_bit_1 = TRUE; - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } @@ -3423,15 +3423,15 @@ void FieldObjectCB_TreeDisguise(struct Sprite *sprite) { struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data0]; - if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data7)) + mapObject = &gMapObjects[sprite->data[0]]; + if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data[7])) { FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE); mapObject->mapobj_unk_21 = 1; - sprite->data7 ++; + sprite->data[7] ++; } - FieldObjectStep(&gMapObjects[sprite->data0], sprite, sub_80925AC); + FieldObjectStep(&gMapObjects[sprite->data[0]], sprite, sub_80925AC); } bool8 sub_80925AC(struct MapObject *mapObject, struct Sprite *sprite) @@ -3444,15 +3444,15 @@ void FieldObjectCB_MountainDisguise(struct Sprite *sprite) { struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data0]; - if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data7)) + mapObject = &gMapObjects[sprite->data[0]]; + if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data[7])) { FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); mapObject->mapobj_unk_21 = 1; - sprite->data7 ++; + sprite->data[7] ++; } - FieldObjectStep(&gMapObjects[sprite->data0], sprite, sub_80925AC); + FieldObjectStep(&gMapObjects[sprite->data[0]], sprite, sub_80925AC); } extern bool8 (*const gUnknown_0850DA9C[])(struct MapObject *, struct Sprite *); @@ -3460,19 +3460,19 @@ bool8 sub_809268C(struct MapObject *, struct Sprite *); void FieldObjectCB_Hidden1(struct Sprite *sprite) { - if (!sprite->data7) + if (!sprite->data[7]) { - gMapObjects[sprite->data0].mapobj_bit_26 = TRUE; + gMapObjects[sprite->data[0]].mapobj_bit_26 = TRUE; sprite->subspriteMode = 2; sprite->oam.priority = 3; - sprite->data7 ++; + sprite->data[7] ++; } - FieldObjectStep(&gMapObjects[sprite->data0], sprite, sub_809268C); + FieldObjectStep(&gMapObjects[sprite->data[0]], sprite, sub_809268C); } bool8 sub_809268C(struct MapObject *mapObject, struct Sprite *sprite) { - return gUnknown_0850DA9C[sprite->data1](mapObject, sprite); + return gUnknown_0850DA9C[sprite->data[1]](mapObject, sprite); } bool8 sub_80926AC (struct MapObject *mapObject, struct Sprite *sprite) @@ -3484,7 +3484,7 @@ bool8 sub_80926B8 (struct MapObject *mapObject, struct Sprite *sprite) { if (FieldObjectExecRegularAnim(mapObject, sprite)) { - sprite->data1 = 0; + sprite->data[1] = 0; } return FALSE; } @@ -3495,7 +3495,7 @@ bool8 sub_8092718(struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -3505,7 +3505,7 @@ bool8 sub_8092788(struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay32AnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -3515,7 +3515,7 @@ bool8 sub_80927F8(struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -3525,7 +3525,7 @@ bool8 sub_8092868(struct MapObject *mapObject, struct Sprite *sprite) { npc_reset(mapObject, sprite); FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } @@ -3536,14 +3536,14 @@ bool8 sub_80928D8(struct MapObject *mapObject, struct Sprite *sprite) npc_reset(mapObject, sprite); FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); mapObject->mapobj_bit_13 = TRUE; - sprite->data1 = 1; + sprite->data[1] = 1; return TRUE; } bool8 sub_809290C(struct MapObject *mapObject, struct Sprite *sprite) { if (FieldObjectExecRegularAnim(mapObject, sprite)) { - sprite->data1 = 2; + sprite->data[1] = 2; return TRUE; } return FALSE; @@ -3561,7 +3561,7 @@ void npc_reset(struct MapObject *mapObject, struct Sprite *sprite) mapObject->mapobj_bit_6 = FALSE; mapObject->mapobj_bit_7 = FALSE; mapObject->mapobj_unk_1C = 0xFF; - sprite->data1 = 0; + sprite->data[1] = 0; } #define dirn2anim(name, table)\ @@ -3680,7 +3680,7 @@ void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern) mapObject->mapobj_unk_21 = 0; mapObject->animId = 0; gSprites[mapObject->spriteId].callback = gUnknown_08505438[animPattern]; - gSprites[mapObject->spriteId].data1 = 0; + gSprites[mapObject->spriteId].data[1] = 0; } dirn2anim(npc_running_behaviour_by_direction, gUnknown_0850DB53) @@ -3811,7 +3811,7 @@ bool8 sub_8092E9C(u8 localId, u8 mapNum, u8 mapGroup) { u8 mapObjectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) && gSprites[gMapObjects[mapObjectId].spriteId].data7 & 0x02) + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) && gSprites[gMapObjects[mapObjectId].spriteId].data[7] & 0x02) { return TRUE; } @@ -3824,7 +3824,7 @@ void sub_8092EF0(u8 localId, u8 mapNum, u8 mapGroup) if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) { - gSprites[gMapObjects[mapObjectId].spriteId].data7 |= 0x04; + gSprites[gMapObjects[mapObjectId].spriteId].data[7] |= 0x04; } } @@ -3975,7 +3975,7 @@ bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) mapObject->mapobj_unk_1C = specialAnimId; mapObject->mapobj_bit_6 = TRUE; mapObject->mapobj_bit_7 = FALSE; - gSprites[mapObject->spriteId].data2 = 0; + gSprites[mapObject->spriteId].data[2] = 0; return FALSE; } @@ -3998,8 +3998,8 @@ void FieldObjectClearAnim(struct MapObject *mapObject) mapObject->mapobj_unk_1C = 0xFF; mapObject->mapobj_bit_6 = FALSE; mapObject->mapobj_bit_7 = FALSE; - gSprites[mapObject->spriteId].data1 = 0; - gSprites[mapObject->spriteId].data2 = 0; + gSprites[mapObject->spriteId].data[1] = 0; + gSprites[mapObject->spriteId].data[2] = 0; } u8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject) @@ -4137,7 +4137,7 @@ static u32 state_to_direction(u8 a0, u32 a1, u32 a2) static void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite) { - if (gUnknown_0850DC50[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite)) + if (gUnknown_0850DC50[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) { mapObject->mapobj_bit_7 = TRUE; } @@ -4145,10 +4145,10 @@ static void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprit bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite) { - if (gUnknown_0850DC50[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite)) + if (gUnknown_0850DC50[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) { mapObject->mapobj_unk_1C = 0xFF; - sprite->data2 = 0; + sprite->data[2] = 0; return TRUE; } return FALSE; @@ -4157,7 +4157,7 @@ bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *spr void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId) { mapObject->mapobj_unk_1C = animId; - sprite->data2 = 0; + sprite->data[2] = 0; } // file boundary? @@ -4168,7 +4168,7 @@ void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 directio npc_coords_shift_still(mapObject); obj_npc_animation_step(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); sprite->animPaused = TRUE; - sprite->data2 = 1; + sprite->data[2] = 1; } bool8 sub_8093950(struct MapObject *mapObject, struct Sprite *sprite) @@ -4212,7 +4212,7 @@ void npc_apply_direction(struct MapObject *mapObject, struct Sprite *sprite, u8 sprite->animPaused = TRUE; } mapObject->mapobj_bit_2 = TRUE; - sprite->data2 = 1; + sprite->data[2] = 1; } void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed) @@ -4255,7 +4255,7 @@ void sub_8093AF0(struct MapObject *mapObject, struct Sprite *sprite, u8 directio sub_80976DC(sprite, direction); sprite->animPaused = FALSE; mapObject->mapobj_bit_2 = TRUE; - sprite->data2 = 1; + sprite->data[2] = 1; } void sub_8093B60(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) @@ -4287,7 +4287,7 @@ bool8 name##_2(struct MapObject *mapObject, struct Sprite *sprite)\ {\ if (fn2(mapObject, sprite))\ {\ - sprite->data2 = 2;\ + sprite->data[2] = 2;\ return TRUE;\ }\ return FALSE;\ @@ -4323,7 +4323,7 @@ void sub_8093FC4(struct MapObject *mapObject, struct Sprite *sprite, u8 directio sub_8092F88(direction, &x, &y, displacements[speed], displacements[speed]); npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); sub_809783C(sprite, direction, speed, a5); - sprite->data2 = 1; + sprite->data[2] = 1; sprite->animPaused = 0; mapObject->mapobj_bit_2 = 1; mapObject->mapobj_bit_4 = 1; @@ -4345,11 +4345,11 @@ u8 sub_80940C4(struct MapObject *mapObject, struct Sprite *sprite, u8 callback(s memcpy(displacements, gUnknown_0850DFC2, sizeof gUnknown_0850DFC2); result = callback(sprite); - if (result == 1 && displacements[sprite->data4] != 0) + if (result == 1 && displacements[sprite->data[4]] != 0) { x = 0; y = 0; - sub_8092F88(mapObject->placeholder18, &x, &y, displacements[sprite->data4], displacements[sprite->data4]); + sub_8092F88(mapObject->placeholder18, &x, &y, displacements[sprite->data[4]], displacements[sprite->data[4]]); npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); mapObject->mapobj_bit_2 = TRUE; mapObject->mapobj_bit_4 = TRUE; @@ -4418,7 +4418,7 @@ bool8 name##_2(struct MapObject *mapObject, struct Sprite *sprite)\ if (fn2(mapObject, sprite))\ {\ mapObject->mapobj_bit_22 = FALSE;\ - sprite->data2 = 2;\ + sprite->data[2] = 2;\ return TRUE;\ }\ return FALSE;\ @@ -4431,15 +4431,15 @@ maybe_shadow_1_macro(sub_8094338, maybe_shadow_1, sub_80941B0, DIR_EAST, 2, 0) void sub_8094390(struct Sprite *sprite, u16 duration) { - sprite->data2 = 1; - sprite->data3 = duration; + sprite->data[2] = 1; + sprite->data[3] = duration; } bool8 sub_8094398(struct MapObject *mapObject, struct Sprite *sprite) { - if (-- sprite->data3 == 0) + if (-- sprite->data[3] == 0) { - sprite->data2 = 2; + sprite->data[2] = 2; return TRUE; } return FALSE; @@ -4468,15 +4468,15 @@ void sub_8094554(struct MapObject *mapObject, struct Sprite *sprite, u8 directio FieldObjectSetDirection(mapObject, direction); npc_apply_anim_looping(mapObject, sprite, animNum); sprite->animPaused = FALSE; - sprite->data2 = 1; - sprite->data3 = duration; + sprite->data[2] = 1; + sprite->data[3] = duration; } bool8 sub_809459C(struct MapObject *mapObject, struct Sprite *sprite) { - if (-- sprite->data3 == 0) + if (-- sprite->data[3] == 0) { - sprite->data2 = 2; + sprite->data[2] = 2; sprite->animPaused = TRUE; return TRUE; } @@ -4485,7 +4485,7 @@ bool8 sub_809459C(struct MapObject *mapObject, struct Sprite *sprite) bool8 sub_80945C4(struct MapObject *mapObject, struct Sprite *sprite) { - if (sprite->data3 & 1) + if (sprite->data[3] & 1) { sprite->animDelayCounter ++; } @@ -4539,7 +4539,7 @@ void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct { obj_anim_image_set_and_seek(sprite, animNum, 0); FieldObjectSetDirection(mapObject, direction); - sprite->data2 = 1; + sprite->data[2] = 1; } bool8 sub_8094DAC(struct MapObject *mapObject, struct Sprite *sprite) @@ -4552,7 +4552,7 @@ bool8 sub_8094DC4(struct MapObject *mapObject, struct Sprite *sprite) { if (sub_80979BC(sprite)) { - sprite->data2 = 2; + sprite->data[2] = 2; return TRUE; } return FALSE; @@ -4575,7 +4575,7 @@ bool8 name##_2(struct MapObject *mapObject, struct Sprite *sprite)\ {\ if (sub_80941C8(mapObject, sprite))\ {\ - sprite->data2 = 2;\ + sprite->data[2] = 2;\ mapObject->mapobj_bit_5 = FALSE;\ return TRUE;\ }\ @@ -4595,7 +4595,7 @@ bool8 sub_8094F38(struct MapObject *mapObject, struct Sprite *sprite) { an_look_any(mapObject, sprite, sub_8092AF8(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[mapObjectId].coords2.x, gMapObjects[mapObjectId].coords2.y)); } - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } @@ -4607,21 +4607,21 @@ bool8 sub_8094F94(struct MapObject *mapObject, struct Sprite *sprite) { an_look_any(mapObject, sprite, GetOppositeDirection(sub_8092AF8(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[mapObjectId].coords2.x, gMapObjects[mapObjectId].coords2.y))); } - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } bool8 sub_8094FF8(struct MapObject *mapObject, struct Sprite *sprite) { mapObject->mapobj_bit_9 = TRUE; - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } bool8 sub_8095008(struct MapObject *mapObject, struct Sprite *sprite) { mapObject->mapobj_bit_9 = FALSE; - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } @@ -4653,42 +4653,42 @@ bool8 sub_8095450(struct MapObject *mapObject, struct Sprite *sprite) bool8 sub_8095460(struct MapObject *mapObject, struct Sprite *sprite) { mapObject->mapobj_bit_25 = FALSE; - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } bool8 sub_8095470(struct MapObject *mapObject, struct Sprite *sprite) { mapObject->mapobj_bit_25 = TRUE; - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } bool8 sub_8095480(struct MapObject *mapObject, struct Sprite *sprite) { mapObject->mapobj_bit_12 = TRUE; - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } bool8 sub_8095490(struct MapObject *mapObject, struct Sprite *sprite) { mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate; - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } bool8 sub_80954BC(struct MapObject *mapObject, struct Sprite *sprite) { mapObject->mapobj_bit_13 = TRUE; - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } bool8 sub_80954CC(struct MapObject *mapObject, struct Sprite *sprite) { mapObject->mapobj_bit_13 = FALSE; - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } @@ -4696,7 +4696,7 @@ bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *s { FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } @@ -4704,7 +4704,7 @@ bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *s { FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2); - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } @@ -4712,7 +4712,7 @@ bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite) { FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_HEART_ICON); - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } @@ -4725,11 +4725,11 @@ bool8 sub_8095548(struct MapObject *mapObject, struct Sprite *sprite) } if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A) { - sprite->data2 = 2; + sprite->data[2] = 2; return TRUE; } sub_8155D78(mapObject); - sprite->data2 = 1; + sprite->data[2] = 1; return sub_809558C(mapObject, sprite); } @@ -4737,7 +4737,7 @@ bool8 sub_809558C(struct MapObject *mapObject, struct Sprite *sprite) { if (sub_8155DA0(mapObject)) { - sprite->data2 = 2; + sprite->data[2] = 2; return TRUE; } return FALSE; @@ -4746,7 +4746,7 @@ bool8 sub_809558C(struct MapObject *mapObject, struct Sprite *sprite) bool8 sub_80955AC(struct MapObject *mapObject, struct Sprite *sprite) { obj_anim_image_set_and_seek(sprite, 1, 0); - sprite->data2 = 1; + sprite->data[2] = 1; return FALSE; } @@ -4755,7 +4755,7 @@ bool8 sub_80955C8(struct MapObject *mapObject, struct Sprite *sprite) if (sub_80979BC(sprite)) { SetFieldObjectStepTimer(sprite, 32); - sprite->data2 = 2; + sprite->data[2] = 2; } return FALSE; } @@ -4766,7 +4766,7 @@ bool8 sub_80955EC(struct MapObject *mapObject, struct Sprite *sprite) if (RunFieldObjectStepTimer(sprite)) { mapObject->mapobj_bit_13 = TRUE; - sprite->data2 = 3; + sprite->data[2] = 3; } return FALSE; } @@ -4774,7 +4774,7 @@ bool8 sub_80955EC(struct MapObject *mapObject, struct Sprite *sprite) bool8 sub_8095628(struct MapObject *mapObject, struct Sprite *sprite) { obj_anim_image_set_and_seek(sprite, 1, 0); - sprite->data2 = 1; + sprite->data[2] = 1; return FALSE; } @@ -4783,7 +4783,7 @@ bool8 sub_8095644(struct MapObject *mapObject, struct Sprite *sprite) if (sub_80979BC(sprite)) { SetFieldObjectStepTimer(sprite, 32); - sprite->data2 = 2; + sprite->data[2] = 2; } return FALSE; } @@ -4794,7 +4794,7 @@ bool8 sub_8095668(struct MapObject *mapObject, struct Sprite *sprite) if (RunFieldObjectStepTimer(sprite)) { mapObject->mapobj_bit_13 = TRUE; - sprite->data2 = 3; + sprite->data[2] = 3; } return FALSE; } @@ -4802,14 +4802,14 @@ bool8 sub_8095668(struct MapObject *mapObject, struct Sprite *sprite) bool8 sub_80956A4(struct MapObject *mapObject, struct Sprite *sprite) { mapObject->mapobj_bit_26 = TRUE; - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } bool8 sub_80956B4(struct MapObject *mapObject, struct Sprite *sprite) { mapObject->mapobj_bit_26 = FALSE; - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } @@ -4856,7 +4856,7 @@ bool8 name##_2(struct MapObject *mapObject, struct Sprite *sprite)\ if (fn2(mapObject, sprite))\ {\ sprite->affineAnimPaused = TRUE;\ - sprite->data2 = 2;\ + sprite->data[2] = 2;\ return TRUE;\ }\ return FALSE;\ @@ -4873,7 +4873,7 @@ static void sub_80958C0(struct MapObject *mapObject, struct Sprite *sprite, u8 d npc_coords_shift_still(mapObject); obj_npc_animation_step(mapObject, sprite, sub_80929FC(direction)); sprite->animPaused = TRUE; - sprite->data2 = 1; + sprite->data[2] = 1; } bool8 sub_8095900(struct MapObject *mapObject, struct Sprite *sprite) @@ -4941,7 +4941,7 @@ bool8 sub_8095B0C(struct MapObject *mapObject, struct Sprite *sprite) bool8 sub_8095B44(struct MapObject *mapObject, struct Sprite *sprite) { sub_8095AF0(mapObject, sprite); - sprite->data2 = 1; + sprite->data[2] = 1; return sub_8095B64(mapObject, sprite); } @@ -4949,7 +4949,7 @@ bool8 sub_8095B64(struct MapObject *mapObject, struct Sprite *sprite) { if (sub_8095B0C(mapObject, sprite)) { - sprite->data2 = 2; + sprite->data[2] = 2; return TRUE; } return FALSE; @@ -5017,7 +5017,7 @@ an_walk_any_2_macro(sub_8096428, sub_8096330, npc_obj_ministep_stop_on_arrival, bool8 sub_8096468(struct MapObject *mapObject, struct Sprite *sprite) { sub_8097FA4(mapObject); - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } @@ -5025,7 +5025,7 @@ bool8 sub_809647C(struct MapObject *mapObject, struct Sprite *sprite) { sub_8098044(mapObject->mapobj_unk_1B); sprite->pos2.y = 0; - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } @@ -5034,7 +5034,7 @@ bool8 sub_8096494(struct MapObject *mapObject, struct Sprite *sprite) if (sprite->pos2.y == 0) { sub_8098044(mapObject->mapobj_unk_1B); - sprite->data2 = 1; + sprite->data[2] = 1; return TRUE; } return FALSE; diff --git a/src/field_poison.c b/src/field_poison.c new file mode 100644 index 000000000..b83788210 --- /dev/null +++ b/src/field_poison.c @@ -0,0 +1,148 @@ +#include "global.h" +#include "string_util.h" +#include "party_menu.h" +#include "constants/species.h" +#include "task.h" +#include "field_message_box.h" +#include "strings.h" +#include "rom_818CFC8.h" +#include "battle_frontier_2.h" +#include "pokenav.h" +#include "event_data.h" +#include "script.h" +#include "battle.h" +#include "fldeff_80F9BCC.h" +#include "field_poison.h" + +static bool32 sub_80F9568(struct Pokemon *pokemon) +{ + u16 species = GetMonData(pokemon, MON_DATA_SPECIES2); + if (species == SPECIES_NONE || species == SPECIES_EGG) + { + return FALSE; + } + return TRUE; +} + +static bool32 sub_80F958C(void) +{ + int i; + struct Pokemon *pokemon; + + for (pokemon = gPlayerParty, i = 0; i < PARTY_SIZE; i++, pokemon++) + { + if (sub_80F9568(pokemon) && GetMonData(pokemon, MON_DATA_HP) != 0) + { + return FALSE; + } + } + return TRUE; +} + +static void sub_80F95C0(u8 partyIdx) +{ + struct Pokemon *pokemon = gPlayerParty + partyIdx; + unsigned int status = STATUS_NONE; + AdjustFriendship(pokemon, 0x07); + SetMonData(pokemon, MON_DATA_STATUS, &status); + GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1); + StringGetEnd10(gStringVar1); +} + +static bool32 sub_80F960C(u8 partyIdx) +{ + struct Pokemon *pokemon = gPlayerParty + partyIdx; + if (sub_80F9568(pokemon) && GetMonData(pokemon, MON_DATA_HP) == 0 && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN) + { + return TRUE; + } + return FALSE; +} + +static void sub_80F9654(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + switch (data[0]) + { + case 0: + for (; data[1] < PARTY_SIZE; data[1]++) + { + if (sub_80F960C(data[1])) + { + sub_80F95C0(data[1]); + ShowFieldMessage(gText_PkmnFainted3); + data[0]++; + return; + } + } + data[0] = 2; + break; + case 1: + if (IsFieldMessageBoxHidden()) + { + data[0]--; + } + break; + case 2: + if (sub_80F958C()) + { + if (InBattlePyramid() | InBattlePike() || sub_81D5C18()) + { + gSpecialVar_Result = 2; + } + else + { + gSpecialVar_Result = 1; + } + } + else + { + gSpecialVar_Result = 0; + } + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + } +} + +void sub_80F972C(void) +{ + CreateTask(sub_80F9654, 80); + ScriptContext1_Stop(); +} + +unsigned int overworld_poison(void) +{ + int i; + unsigned int hp; + struct Pokemon *pokemon = gPlayerParty; + unsigned int numPoisoned = 0; + unsigned int numFainted = 0; + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(pokemon, MON_DATA_SANITY_BIT2) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN) + { + hp = GetMonData(pokemon, MON_DATA_HP); + if (hp == 0 || --hp == 0) + { + numFainted++; + } + SetMonData(pokemon, MON_DATA_HP, &hp); + numPoisoned++; + } + pokemon++; + } + if (numFainted != 0 || numPoisoned != 0) + { + overworld_poison_effect(); + } + if (numFainted != 0) + { + return FLDPSN_FNT; + } + if (numPoisoned != 0) + { + return FLDPSN_PSN; + } + return FLDPSN_NONE; +} diff --git a/src/field_special_scene.c b/src/field_special_scene.c index f92f342eb..d46ddeaa6 100755 --- a/src/field_special_scene.c +++ b/src/field_special_scene.c @@ -2,11 +2,11 @@ #include "task.h" #include "sprite.h" #include "field_map_obj.h" -#include "songs.h" +#include "constants/songs.h" #include "sound.h" #include "palette.h" #include "script.h" -#include "vars.h" +#include "constants/vars.h" #include "event_data.h" #include "main.h" diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index bc7177bd7..52babe346 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -9,21 +9,22 @@ #include "gpu_regs.h" #include "main.h" #include "sound.h" -#include "songs.h" +#include "constants/songs.h" #include "decompress.h" #include "save.h" #include "window.h" #include "bg.h" -#include "species.h" -#include "game_stat.h" +#include "constants/species.h" +#include "constants/game_stat.h" #include "blend_palette.h" #include "string_util.h" #include "m4a.h" #include "international_string_util.h" #include "unknown_task.h" #include "trig.h" -#include "rng.h" +#include "random.h" #include "event_data.h" +#include "overworld.h" struct HallofFameMon { @@ -57,6 +58,7 @@ extern struct MusicPlayerInfo gMPlay_BGM; extern MainCallback gGameContinueCallback; extern u32 gDamagedSaveSectors; extern u8 gReservedSpritePaletteCount; +extern const u8 gSpeciesNames[][11]; #define HALL_OF_FAME_MAX_TEAMS 50 @@ -580,9 +582,9 @@ static void Task_Hof_SetMonDisplayTask(u8 taskId) gTasks[taskId].func = Task_Hof_DisplayMon; } -#define tDestinationX data1 -#define tDestinationY data2 -#define tSpecies data7 +#define tDestinationX data[1] +#define tDestinationY data[2] +#define tSpecies data[7] static void Task_Hof_DisplayMon(u8 taskId) { @@ -613,7 +615,7 @@ static void Task_Hof_DisplayMon(u8 taskId) spriteId = sub_818D3E4(currMon->species, currMon->tid, currMon->personality, 1, xPos, yPos, currMonId, 0xFFFF); gSprites[spriteId].tDestinationX = field4; gSprites[spriteId].tDestinationY = field6; - gSprites[spriteId].data0 = 0; + gSprites[spriteId].data[0] = 0; gSprites[spriteId].tSpecies = currMon->species; gSprites[spriteId].callback = SpriteCB_GetOnScreenAndAnimate; gTasks[taskId].tMonSpriteId(currMonId) = spriteId; @@ -1404,13 +1406,13 @@ static void sub_81751A4(struct Sprite* sprite) u8 tableID; sprite->pos2.y++; - sprite->pos2.y += sprite->data1; + sprite->pos2.y += sprite->data[1]; - tableID = sprite->data0; + tableID = sprite->data[0]; rand = (Random() % 4) + 8; sprite->pos2.x = rand * gSineTable[tableID] / 256; - sprite->data0 += 4; + sprite->data[0] += 4; } } @@ -1428,9 +1430,9 @@ static bool8 sub_81751FC(void) StartSpriteAnim(sprite, Random() % 17); if (Random() & 3) - sprite->data1 = 0; + sprite->data[1] = 0; else - sprite->data1 = 1; + sprite->data[1] = 1; return FALSE; } diff --git a/src/heal_location.c b/src/heal_location.c index efc534170..aa90fe1ae 100644 --- a/src/heal_location.c +++ b/src/heal_location.c @@ -1,10 +1,10 @@ // Includes #include "global.h" -#include "map_constants.h" +#include "constants/maps.h" #include "heal_location.h" -#define HEAL_LOCATION(map, x, y) {MAP_GROUP_##map, MAP_ID_##map, x, y} +#define HEAL_LOCATION(map, x, y) {MAP_GROUP(map), MAP_NUM(map), x, y} // Static type declarations diff --git a/src/international_string_util.c b/src/international_string_util.c index 81985d614..89b4a7a69 100644 --- a/src/international_string_util.c +++ b/src/international_string_util.c @@ -1,6 +1,6 @@ #include "global.h" -#include "international_string_util.h" #include "text.h" +#include "international_string_util.h" extern s32 convert_pixel_width_to_tile_width(s32 a0); // script menu diff --git a/src/item.c b/src/item.c index 32347623e..931027e25 100644 --- a/src/item.c +++ b/src/item.c @@ -1,11 +1,11 @@ #include "global.h" #include "item.h" -#include "items.h" +#include "constants/items.h" #include "string_util.h" #include "text.h" #include "event_data.h" -extern void ApplyNewEncyprtionKeyToHword(u16* hword, u32 newKey); +extern void ApplyNewEncryptionKeyToHword(u16* hword, u32 newKey); extern bool8 InBattlePyramid(void); extern const u8 gText_PokeBalls[]; @@ -45,19 +45,19 @@ void SetBagItemId(u16* slot, u16 newItemId) *slot = newItemId; } -void ApplyNewEncyprtionKeyToBagItems(u32 newKey) +void ApplyNewEncryptionKeyToBagItems(u32 newKey) { u32 pocket, item; for (pocket = 0; pocket < 5; pocket++) { for (item = 0; item < gBagPockets[pocket].capacity; item++) - ApplyNewEncyprtionKeyToHword(&(gBagPockets[pocket].itemSlots[item].quantity), newKey); + ApplyNewEncryptionKeyToHword(&(gBagPockets[pocket].itemSlots[item].quantity), newKey); } } -void ApplyNewEncyprtionKeyToBagItems_(u32 newKey) // really GF? +void ApplyNewEncryptionKeyToBagItems_(u32 newKey) // really GF? { - ApplyNewEncyprtionKeyToBagItems(newKey); + ApplyNewEncryptionKeyToBagItems(newKey); } // TODO: move those max values to defines diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index 62171e475..95270974a 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -8,10 +8,10 @@ #include "rom6.h" #include "event_data.h" #include "script.h" -#include "rng.h" +#include "random.h" #include "string_util.h" #include "item.h" -#include "items.h" +#include "constants/items.h" #include "item_menu.h" #include "text.h" #include "easy_chat.h" diff --git a/src/load_save.c b/src/load_save.c index 68d978e3d..e0106c0a8 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -3,19 +3,34 @@ #include "load_save.h" #include "main.h" #include "pokemon.h" -#include "rng.h" -#include "malloc.h" +#include "random.h" extern void* gUnknown_0203CF5C; extern bool16 IdentifyFlash(void); extern void SetBagItemsPointers(void); extern void SetDecorationInventoriesPointers(void); +extern void ApplyNewEncryptionKeyToGameStats(u32 key); +extern void ApplyNewEncryptionKeyToBagItems(u32 newKey); +extern void ApplyNewEncryptionKeyToBagItems_(u32 key); +extern void ApplyNewEncryptionKeyToBerryPowder(u32 key); +extern void sub_8084FAC(int unused); -void ApplyNewEncyprtionKeyToAllEncryptedData(u32 encryptionKey); +// this is probably wrong or misleading due to it being used in ResetHeap... +extern void InitHeap(void *pointer, u32 size); #define SAVEBLOCK_MOVE_RANGE 128 +struct LoadedSaveData +{ + /*0x0000*/ struct ItemSlot items[30]; + /*0x0078*/ struct ItemSlot keyItems[30]; + /*0x00F0*/ struct ItemSlot pokeBalls[16]; + /*0x0130*/ struct ItemSlot TMsHMs[64]; + /*0x0230*/ struct ItemSlot berries[46]; + /*0x02E8*/ struct MailStruct mail[MAIL_COUNT]; +}; + EWRAM_DATA struct SaveBlock2 gSaveblock2 = {0}; EWRAM_DATA u8 gSaveblock2_DMA[SAVEBLOCK_MOVE_RANGE] = {0}; @@ -25,6 +40,11 @@ EWRAM_DATA u8 gSaveblock1_DMA[SAVEBLOCK_MOVE_RANGE] = {0}; EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; EWRAM_DATA u8 gSaveblock3_DMA[SAVEBLOCK_MOVE_RANGE] = {0}; +EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0}; +EWRAM_DATA u32 gLastEncryptionKey = {0}; + +void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey); + void CheckForFlashMemory(void) { if (!IdentifyFlash()) @@ -60,18 +80,45 @@ void SetSaveBlocksPointers(u16 offset) SetDecorationInventoriesPointers(); } +// stuff i used to try and match MoveSaveBlocks_ResetHeap struct SaveBlocksInOne { struct SaveBlock2 sav2; struct SaveBlock1 sav1; struct PokemonStorage sav3; }; + +extern struct SaveBlocksInOne gHeap; + +#define ewram_addr 0x02000000 // oh no... +#define ewram_addr2 0x02000f2c +#define ewram_addr3 0x02004cb4 + +#define eSaveBlockCopy (*(struct SaveBlocksInOne *)(ewram_addr + 0x0)) +#define eSaveBlock2Copy (*(struct SaveBlock2 *)((void*)(ewram_addr + 0x0))) +#define eSaveBlock1Copy (*(struct SaveBlock1 *)((void*)(ewram_addr + sizeof(struct SaveBlock2)))) +#define eSaveBlock3Copy (*(struct PokemonStorage *)((void*)(ewram_addr + sizeof(struct SaveBlock2) + sizeof(struct SaveBlock1)))) + +#ifdef NONMATCHING // this is one devil of a motherfucker /* + The reason MoveSaveBlocks_ResetHeap mismatches is due to incorrect memcpys. Various + things have been tried, such as: direct struct copys, ewram casts, use of defining + the addresses manually, using memcpy anyway, delayed allocation of pointers at + the start of function, as seen above and below. Scope declaration has been used to try and + reproduce the correct macro thought to be used, but nothing has worked. It is worth + noting that at this point that the compiler will delay the allocation of the save block + pointers at the beginningto be allocated later: which might matter for matching this. + Due to loading shared ewram heap areas directly, it is very likely emerald used ewram + defines for this function, but there is no known example of a matching define. + In addition, dead code might be present in the form of a runtime variable used + to fix the address of the save blocks. This has been tested and is shown to affect + the registers as well. +*/ void MoveSaveBlocks_ResetHeap(void) { void *vblankCB, *hblankCB; u32 encryptionKey; - struct SaveBlocksInOne* copiedSavs; + struct SaveBlock1 **sav1Copy = &gSaveBlock1Ptr; // r10; // save interrupt functions and turn them off vblankCB = gMain.vblankCallback; @@ -80,24 +127,22 @@ void MoveSaveBlocks_ResetHeap(void) gMain.hblankCallback = NULL; gUnknown_0203CF5C = NULL; - copiedSavs = (void*)(gHeap); - - // copy saveblocks' content - copiedSavs->sav2 = *gSaveBlock2Ptr; - copiedSavs->sav1 = *gSaveBlock1Ptr; - copiedSavs->sav3 = *gPokemonStoragePtr; + // backup the saves. + eSaveBlock1Copy = **sav1Copy; + eSaveBlock2Copy = *gSaveBlock2Ptr; + eSaveBlock3Copy = *gPokemonStoragePtr; // change saveblocks' pointers // argument is a sum of the individual trainerId bytes - SetSaveBlocksPointers(copiedSavs->sav2.playerTrainerId[0] + copiedSavs->sav2.playerTrainerId[1] + copiedSavs->sav2.playerTrainerId[2] + copiedSavs->sav2.playerTrainerId[3]); + SetSaveBlocksPointers(eSaveBlock2Copy.playerTrainerId[0] + eSaveBlock2Copy.playerTrainerId[1] + eSaveBlock2Copy.playerTrainerId[2] + eSaveBlock2Copy.playerTrainerId[3]); // restore saveblock data since the pointers changed - *gSaveBlock2Ptr = copiedSavs->sav2; - *gSaveBlock1Ptr = copiedSavs->sav1; - *gPokemonStoragePtr = copiedSavs->sav3; + **sav1Copy = eSaveBlock1Copy; + *gSaveBlock2Ptr = eSaveBlock2Copy; + *gPokemonStoragePtr = eSaveBlock3Copy; // heap was destroyed in the copying process, so reset it - InitHeap(gHeap, sizeof(gHeap)); + InitHeap((void*)(0x02000000), 0x1C000); // restore interrupt functions gMain.hblankCallback = hblankCB; @@ -105,6 +150,266 @@ void MoveSaveBlocks_ResetHeap(void) // create a new encryption key encryptionKey = (Random() << 0x10) + (Random()); - ApplyNewEncyprtionKeyToAllEncryptedData(encryptionKey); + ApplyNewEncryptionKeyToAllEncryptedData(encryptionKey); gSaveBlock2Ptr->encryptionKey = encryptionKey; -}*/ +} +#else +__attribute__((naked)) +void MoveSaveBlocks_ResetHeap(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\ + ldr r5, =gMain\n\ + ldr r0, [r5, 0xC]\n\ + str r0, [sp]\n\ + ldr r1, [r5, 0x10]\n\ + str r1, [sp, 0x4]\n\ + movs r0, 0\n\ + str r0, [r5, 0xC]\n\ + str r0, [r5, 0x10]\n\ + ldr r1, =gUnknown_0203CF5C\n\ + str r0, [r1]\n\ + ldr r4, =0x02000000\n\ + ldr r0, =gSaveBlock2Ptr\n\ + ldr r1, [r0]\n\ + ldr r6, =0x00000f2c\n\ + adds r0, r4, 0\n\ + adds r2, r6, 0\n\ + bl memcpy\n\ + ldr r1, =gSaveBlock1Ptr\n\ + mov r10, r1\n\ + ldr r1, [r1]\n\ + ldr r7, =0x00003d88\n\ + ldr r0, =0x02000f2c\n\ + adds r2, r7, 0\n\ + bl memcpy\n\ + ldr r0, =gPokemonStoragePtr\n\ + mov r8, r0\n\ + ldr r1, [r0]\n\ + ldr r0, =0x000083d0\n\ + mov r9, r0\n\ + ldr r0, =0x02004cb4\n\ + mov r2, r9\n\ + bl memcpy\n\ + ldrb r1, [r4, 0xA]\n\ + ldrb r0, [r4, 0xB]\n\ + adds r1, r0\n\ + ldrb r0, [r4, 0xC]\n\ + adds r1, r0\n\ + ldrb r0, [r4, 0xD]\n\ + adds r0, r1\n\ + bl SetSaveBlocksPointers\n\ + ldr r1, =gSaveBlock2Ptr\n\ + ldr r0, [r1]\n\ + adds r1, r4, 0\n\ + adds r2, r6, 0\n\ + bl memcpy\n\ + mov r1, r10\n\ + ldr r0, [r1]\n\ + ldr r1, =0x02000f2c\n\ + adds r2, r7, 0\n\ + bl memcpy\n\ + mov r1, r8\n\ + ldr r0, [r1]\n\ + ldr r1, =0x02004cb4\n\ + mov r2, r9\n\ + bl memcpy\n\ + movs r1, 0xE0\n\ + lsls r1, 9\n\ + adds r0, r4, 0\n\ + bl InitHeap\n\ + ldr r0, [sp, 0x4]\n\ + str r0, [r5, 0x10]\n\ + ldr r1, [sp]\n\ + str r1, [r5, 0xC]\n\ + bl Random\n\ + adds r4, r0, 0\n\ + bl Random\n\ + lsls r4, 16\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + adds r4, r0\n\ + adds r0, r4, 0\n\ + bl ApplyNewEncryptionKeyToAllEncryptedData\n\ + ldr r1, =gSaveBlock2Ptr\n\ + ldr r0, [r1]\n\ + adds r0, 0xAC\n\ + str r4, [r0]\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\ + .pool\n\ + .syntax divided\n"); +} +#endif + +u8 sav2_x1_query_bit1(void) +{ + return gSaveBlock2Ptr->specialSaveWarp & 1; +} + +void sav2_x9_clear_bit1(void) +{ + gSaveBlock2Ptr->specialSaveWarp &= ~1; +} + +void sub_8076D48(void) +{ + gSaveBlock2Ptr->specialSaveWarp |= 1; +} + +void sub_8076D5C(void) +{ + sub_8084FAC(0); + gSaveBlock2Ptr->specialSaveWarp |= 1; +} + +void sav2_gender2_inplace_and_xFE(void) +{ + gSaveBlock2Ptr->specialSaveWarp &= ~1; +} + +void copy_player_party_to_sav1(void) // SavePlayerParty +{ + int i; + + gSaveBlock1Ptr->playerPartyCount = gPlayerPartyCount; + + for (i = 0; i < 6; i++) + gSaveBlock1Ptr->playerParty[i] = gPlayerParty[i]; +} + +void copy_player_party_from_sav1(void) // LoadPlayerParty +{ + int i; + + gPlayerPartyCount = gSaveBlock1Ptr->playerPartyCount; + + for (i = 0; i < 6; i++) + gPlayerParty[i] = gSaveBlock1Ptr->playerParty[i]; +} + +void save_serialize_npcs(void) // SaveMapObjects +{ + int i; + + for (i = 0; i < 16; i++) + gSaveBlock1Ptr->mapObjects[i] = gMapObjects[i]; +} + +void save_deserialize_npcs(void) // LoadMapObjects +{ + int i; + + for (i = 0; i < 16; i++) + gMapObjects[i] = gSaveBlock1Ptr->mapObjects[i]; +} + +void SaveSerializedGame(void) +{ + copy_player_party_to_sav1(); + save_serialize_npcs(); +} + +void LoadSerializedGame(void) +{ + copy_player_party_from_sav1(); + save_deserialize_npcs(); +} + +void copy_bags_and_unk_data_from_save_blocks(void) +{ + int i; + + // load player items. + for (i = 0; i < 30; i++) + gLoadedSaveData.items[i] = gSaveBlock1Ptr->bagPocket_Items[i]; + + // load player key items. + for (i = 0; i < 30; i++) + gLoadedSaveData.keyItems[i] = gSaveBlock1Ptr->bagPocket_KeyItems[i]; + + // load player pokeballs. + for (i = 0; i < 16; i++) + gLoadedSaveData.pokeBalls[i] = gSaveBlock1Ptr->bagPocket_PokeBalls[i]; + + // load player TMs and HMs. + for (i = 0; i < 64; i++) + gLoadedSaveData.TMsHMs[i] = gSaveBlock1Ptr->bagPocket_TMHM[i]; + + // load player berries. + for (i = 0; i < 46; i++) + gLoadedSaveData.berries[i] = gSaveBlock1Ptr->bagPocket_Berries[i]; + + // load mail. + for (i = 0; i < 16; i++) + gLoadedSaveData.mail[i] = gSaveBlock1Ptr->mail[i]; + + gLastEncryptionKey = gSaveBlock2Ptr->encryptionKey; +} + +void copy_bags_and_unk_data_to_save_blocks(void) +{ + int i; + u32 encryptionKeyBackup; + + // save player items. + for (i = 0; i < 30; i++) + gSaveBlock1Ptr->bagPocket_Items[i] = gLoadedSaveData.items[i]; + + // save player key items. + for (i = 0; i < 30; i++) + gSaveBlock1Ptr->bagPocket_KeyItems[i] = gLoadedSaveData.keyItems[i]; + + // save player pokeballs. + for (i = 0; i < 16; i++) + gSaveBlock1Ptr->bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i]; + + // save player TMs and HMs. + for (i = 0; i < 64; i++) + gSaveBlock1Ptr->bagPocket_TMHM[i] = gLoadedSaveData.TMsHMs[i]; + + // save player berries. + for (i = 0; i < 46; i++) + gSaveBlock1Ptr->bagPocket_Berries[i] = gLoadedSaveData.berries[i]; + + // save mail. + for (i = 0; i < 16; i++) + gSaveBlock1Ptr->mail[i] = gLoadedSaveData.mail[i]; + + encryptionKeyBackup = gSaveBlock2Ptr->encryptionKey; + gSaveBlock2Ptr->encryptionKey = gLastEncryptionKey; + ApplyNewEncryptionKeyToBagItems(encryptionKeyBackup); + gSaveBlock2Ptr->encryptionKey = encryptionKeyBackup; // updated twice? +} + +void ApplyNewEncryptionKeyToHword(u16 *hWord, u32 newKey) +{ + *hWord ^= gSaveBlock2Ptr->encryptionKey; + *hWord ^= newKey; +} + +void ApplyNewEncryptionKeyToWord(u32 *word, u32 newKey) +{ + *word ^= gSaveBlock2Ptr->encryptionKey; + *word ^= newKey; +} + +void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey) +{ + ApplyNewEncryptionKeyToGameStats(encryptionKey); + ApplyNewEncryptionKeyToBagItems_(encryptionKey); + ApplyNewEncryptionKeyToBerryPowder(encryptionKey); + ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->money, encryptionKey); + ApplyNewEncryptionKeyToHword(&gSaveBlock1Ptr->coins, encryptionKey); +} diff --git a/src/lottery_corner.c b/src/lottery_corner.c index 211b78f19..2ded9c943 100644 --- a/src/lottery_corner.c +++ b/src/lottery_corner.c @@ -2,9 +2,9 @@ #include "lottery_corner.h" #include "event_data.h" #include "pokemon.h" -#include "items.h" -#include "rng.h" -#include "species.h" +#include "constants/items.h" +#include "random.h" +#include "constants/species.h" #include "string_util.h" #include "text.h" diff --git a/src/m4a_4.c b/src/m4a_4.c index 99195ec00..e645fbef5 100644 --- a/src/m4a_4.c +++ b/src/m4a_4.c @@ -45,7 +45,7 @@ void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 mplayInfo->ident = ID_NUMBER; } -void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 pitch) +void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch) { s32 i; u32 bit; @@ -66,7 +66,7 @@ void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 { if (track->flags & MPT_FLG_EXIST) { - track->keyShiftX = (s16)pitch >> 8; + track->keyShiftX = pitch >> 8; track->pitX = pitch; track->flags |= MPT_FLG_PITCHG; } diff --git a/src/mail.c b/src/mail.c index 1ceb1be1a..ec7ff2ce2 100644 --- a/src/mail.c +++ b/src/mail.c @@ -1,14 +1,14 @@ - -// Includes #include "global.h" +#include "mail.h" +#include "constants/items.h" #include "main.h" #include "overworld.h" #include "task.h" #include "unknown_task.h" #include "palette.h" +#include "text.h" #include "menu.h" #include "menu_helpers.h" -#include "text.h" #include "text_window.h" #include "string_util.h" #include "international_string_util.h" @@ -16,11 +16,46 @@ #include "gpu_regs.h" #include "bg.h" #include "pokemon_icon.h" -#include "species.h" +#include "constants/species.h" #include "malloc.h" #include "easy_chat.h" -#include "mail_data.h" -#include "mail.h" + +extern const u16 gUnknown_08DBE818[]; +extern const u16 gUnknown_08DBE838[]; +extern const u16 gUnknown_08DBE858[]; +extern const u16 gUnknown_08DBE878[]; +extern const u16 gUnknown_08DBE898[]; +extern const u16 gUnknown_08DBE8B8[]; +extern const u16 gUnknown_08DBE8D8[]; +extern const u16 gUnknown_08DBE8F8[]; +extern const u16 gUnknown_08DBE918[]; +extern const u16 gUnknown_08DBE938[]; +extern const u16 gUnknown_08DBE958[]; +extern const u16 gUnknown_08DBE978[]; +extern const u8 gUnknown_08DBE998[]; +extern const u8 gUnknown_08DBFBA4[]; +extern const u8 gUnknown_08DBEB38[]; +extern const u8 gUnknown_08DBFC7C[]; +extern const u8 gUnknown_08DBEC74[]; +extern const u8 gUnknown_08DBFD5C[]; +extern const u8 gUnknown_08DBEE84[]; +extern const u8 gUnknown_08DBFE68[]; +extern const u8 gUnknown_08DBEF5C[]; +extern const u8 gUnknown_08DBFF44[]; +extern const u8 gUnknown_08DBF154[]; +extern const u8 gUnknown_08DC0034[]; +extern const u8 gUnknown_08DBF2D4[]; +extern const u8 gUnknown_08DC0114[]; +extern const u8 gUnknown_08DBF37C[]; +extern const u8 gUnknown_08DC01F4[]; +extern const u8 gUnknown_08DBF50C[]; +extern const u8 gUnknown_08DC0300[]; +extern const u8 gUnknown_08DBF64C[]; +extern const u8 gUnknown_08DC03F0[]; +extern const u8 gUnknown_08DBF7B4[]; +extern const u8 gUnknown_08DC04E8[]; +extern const u8 gUnknown_08DBF904[]; +extern const u8 gUnknown_08DC0600[]; // Static type declarations @@ -52,9 +87,7 @@ struct MailGraphics u16 color12; }; -// Static RAM declarations - -static EWRAM_DATA struct +struct MailRead { /*0x0000*/ u8 strbuf[8][64]; /*0x0200*/ u8 playerName[12]; @@ -73,22 +106,26 @@ static EWRAM_DATA struct /*0x0228*/ const struct MailLayout *layout; /*0x022c*/ u8 bg1TilemapBuffer[0x1000]; /*0x122c*/ u8 bg2TilemapBuffer[0x1000]; -} *gUnknown_0203A134 = NULL; +}; + +// Static RAM declarations + +static EWRAM_DATA struct MailRead *sMailRead = NULL; // Static ROM declarations -void sub_81219F0(void); -void sub_8121A1C(void); -void sub_8121B1C(void); -void sub_8121C50(void); -void sub_8121C64(void); -void sub_8121C98(void); -void sub_8121CC0(void); -void sub_8121D00(void); +static void CB2_InitMailRead(void); +static void sub_8121A1C(void); +static void sub_8121B1C(void); +static void VBlankCB_MailRead(void); +static void CB2_MailRead(void); +static void CB2_WaitForPaletteExitOnKeyPress(void); +static void CB2_ExitOnKeyPress(void); +static void CB2_ExitMailReadFreeVars(void); // .rodata -const struct BgTemplate gUnknown_0859F290[] = { +static const struct BgTemplate sUnknown_0859F290[] = { { .bg = 0, .charBaseIndex = 2, @@ -107,7 +144,7 @@ const struct BgTemplate gUnknown_0859F290[] = { } }; -const struct WindowTemplate gUnknown_0859F29C[] = { +static const struct WindowTemplate sUnknown_0859F29C[] = { { .priority = 0, .tilemapLeft = 2, @@ -120,55 +157,18 @@ const struct WindowTemplate gUnknown_0859F29C[] = { DUMMY_WIN_TEMPLATE }; -const u8 gUnknown_0859F2AC[] = { +static const u8 sUnknown_0859F2AC[] = { 0, 10, 11 }; -const u16 gUnknown_0859F2B0[][2] = { +static const u16 sUnknown_0859F2B0[][2] = { { 0x6ACD, 0x51A5 }, { 0x45FC, 0x38D4 } }; -extern const u16 gUnknown_08DBE818[]; -extern const u16 gUnknown_08DBE838[]; -extern const u16 gUnknown_08DBE858[]; -extern const u16 gUnknown_08DBE878[]; -extern const u16 gUnknown_08DBE898[]; -extern const u16 gUnknown_08DBE8B8[]; -extern const u16 gUnknown_08DBE8D8[]; -extern const u16 gUnknown_08DBE8F8[]; -extern const u16 gUnknown_08DBE918[]; -extern const u16 gUnknown_08DBE938[]; -extern const u16 gUnknown_08DBE958[]; -extern const u16 gUnknown_08DBE978[]; -extern const u8 gUnknown_08DBE998[]; -extern const u8 gUnknown_08DBFBA4[]; -extern const u8 gUnknown_08DBEB38[]; -extern const u8 gUnknown_08DBFC7C[]; -extern const u8 gUnknown_08DBEC74[]; -extern const u8 gUnknown_08DBFD5C[]; -extern const u8 gUnknown_08DBEE84[]; -extern const u8 gUnknown_08DBFE68[]; -extern const u8 gUnknown_08DBEF5C[]; -extern const u8 gUnknown_08DBFF44[]; -extern const u8 gUnknown_08DBF154[]; -extern const u8 gUnknown_08DC0034[]; -extern const u8 gUnknown_08DBF2D4[]; -extern const u8 gUnknown_08DC0114[]; -extern const u8 gUnknown_08DBF37C[]; -extern const u8 gUnknown_08DC01F4[]; -extern const u8 gUnknown_08DBF50C[]; -extern const u8 gUnknown_08DC0300[]; -extern const u8 gUnknown_08DBF64C[]; -extern const u8 gUnknown_08DC03F0[]; -extern const u8 gUnknown_08DBF7B4[]; -extern const u8 gUnknown_08DC04E8[]; -extern const u8 gUnknown_08DBF904[]; -extern const u8 gUnknown_08DC0600[]; - -const struct MailGraphics gUnknown_0859F2B8[] = { +static const struct MailGraphics sUnknown_0859F2B8[] = { { gUnknown_08DBE818, gUnknown_08DBE998, gUnknown_08DBFBA4, 0x02c0, 0x0000, 0x294a, 0x6739 }, { @@ -196,13 +196,13 @@ const struct MailGraphics gUnknown_0859F2B8[] = { } }; -const struct UnkMailStruct Unknown_0859F3A8[] = { +static const struct UnkMailStruct Unknown_0859F3A8[] = { { .numEasyChatWords = 3, .lineHeight = 16 }, { .numEasyChatWords = 3, .lineHeight = 16 }, { .numEasyChatWords = 3, .lineHeight = 16 } }; -const struct MailLayout gUnknown_0859F3B4[] = { +static const struct MailLayout sUnknown_0859F3B4[] = { { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, @@ -217,7 +217,7 @@ const struct MailLayout gUnknown_0859F3B4[] = { { 0x03, 0x00, 0x00, 0x02, 0x00, Unknown_0859F3A8 } }; -const struct UnkMailStruct Unknown_0859F444[] = { +static const struct UnkMailStruct Unknown_0859F444[] = { { .numEasyChatWords = 2, .lineHeight = 16 }, { .numEasyChatWords = 2, .lineHeight = 16 }, { .numEasyChatWords = 2, .lineHeight = 16 }, @@ -225,7 +225,7 @@ const struct UnkMailStruct Unknown_0859F444[] = { { .numEasyChatWords = 1, .lineHeight = 16 } }; -const struct MailLayout gUnknown_0859F458[] = { +static const struct MailLayout sUnknown_0859F458[] = { { 0x05, 0x07, 0x58, 0x0b, 0x1e, Unknown_0859F444 }, { 0x05, 0x0a, 0x60, 0x09, 0x1e, Unknown_0859F444 }, { 0x05, 0x0c, 0x68, 0x05, 0x1e, Unknown_0859F444 }, @@ -242,23 +242,23 @@ const struct MailLayout gUnknown_0859F458[] = { // What the heck are these meant to be? Call them u16 for now. -const u16 Unknown_0859F4E8[] = { +static const u16 Unknown_0859F4E8[] = { 0x00, 0x4000, 0x00, 0x00 }; -const u16 Unknown_0859F4F0[] = { +static const u16 Unknown_0859F4F0[] = { 0x00, 0x00, -1, 0x00 }; -const u16 Unknown_0859F4F8[] = { +static const u16 Unknown_0859F4F8[] = { 0x04, 0x00, -1, 0x00 }; -const u16 Unknown_0859F500[] = { +static const u16 Unknown_0859F500[] = { 0x00, 0x40, -1, 0x00 }; -const u16 *const gUnknown_0859F508[] = { +static const u16 *const sUnknown_0859F508[] = { Unknown_0859F4F0, Unknown_0859F4F8, Unknown_0859F500 @@ -266,60 +266,62 @@ const u16 *const gUnknown_0859F508[] = { // .text -void sub_8121478(struct MailStruct *mail, MainCallback callback, bool8 flag) { +void ReadMail(struct MailStruct *mail, void (*callback)(void), bool8 flag) +{ u16 buffer[2]; u16 species; - gUnknown_0203A134 = calloc(1, sizeof(*gUnknown_0203A134)); - gUnknown_0203A134->language = LANGUAGE_ENGLISH; - gUnknown_0203A134->playerIsSender = TRUE; - gUnknown_0203A134->parserSingle = CopyEasyChatWord; - gUnknown_0203A134->parserMultiple = ConvertEasyChatWordsToString; - if (mail->itemId >= ITEM_ORANGE_MAIL && mail->itemId <= ITEM_RETRO_MAIL) { - gUnknown_0203A134->mailType = mail->itemId - ITEM_ORANGE_MAIL; + sMailRead = calloc(1, sizeof(*sMailRead)); + sMailRead->language = LANGUAGE_ENGLISH; + sMailRead->playerIsSender = TRUE; + sMailRead->parserSingle = CopyEasyChatWord; + sMailRead->parserMultiple = ConvertEasyChatWordsToString; + if (IS_ITEM_MAIL(mail->itemId)) + { + sMailRead->mailType = mail->itemId - ITEM_ORANGE_MAIL; } else { - gUnknown_0203A134->mailType = 0; + sMailRead->mailType = 0; flag = FALSE; } - switch (gUnknown_0203A134->playerIsSender) + switch (sMailRead->playerIsSender) { case FALSE: default: - gUnknown_0203A134->layout = &gUnknown_0859F3B4[gUnknown_0203A134->mailType]; + sMailRead->layout = &sUnknown_0859F3B4[sMailRead->mailType]; break; case TRUE: - gUnknown_0203A134->layout = &gUnknown_0859F458[gUnknown_0203A134->mailType]; + sMailRead->layout = &sUnknown_0859F458[sMailRead->mailType]; break; } - species = sub_80D45E8(mail->species, buffer); + species = MailSpeciesToSpecies(mail->species, buffer); if (species >= SPECIES_BULBASAUR && species < NUM_SPECIES) { - switch (gUnknown_0203A134->mailType) + switch (sMailRead->mailType) { default: - gUnknown_0203A134->animsActive = 0; + sMailRead->animsActive = 0; break; case ITEM_BEAD_MAIL - ITEM_ORANGE_MAIL: - gUnknown_0203A134->animsActive = 1; + sMailRead->animsActive = 1; break; case ITEM_DREAM_MAIL - ITEM_ORANGE_MAIL: - gUnknown_0203A134->animsActive = 2; + sMailRead->animsActive = 2; break; } } else { - gUnknown_0203A134->animsActive = 0; + sMailRead->animsActive = 0; } - gUnknown_0203A134->mail = mail; - gUnknown_0203A134->callback = callback; - gUnknown_0203A134->flag = flag; - SetMainCallback2(sub_81219F0); + sMailRead->mail = mail; + sMailRead->callback = callback; + sMailRead->flag = flag; + SetMainCallback2(CB2_InitMailRead); } -bool8 sub_81215EC(void) +static bool8 MailReadBuildGraphics(void) { u16 icon; @@ -353,21 +355,21 @@ bool8 sub_81215EC(void) SetGpuReg(REG_OFFSET_BG2HOFS, 0x0000); SetGpuReg(REG_OFFSET_BG3HOFS, 0x0000); SetGpuReg(REG_OFFSET_BG3VOFS, 0x0000); - SetGpuReg(REG_OFFSET_BLDCNT, 0x0000); + SetGpuReg(REG_OFFSET_BLDCNT, 0x0000); SetGpuReg(REG_OFFSET_BLDALPHA, 0x0000); break; case 6: ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_0859F290, 3); - SetBgTilemapBuffer(1, gUnknown_0203A134->bg1TilemapBuffer); - SetBgTilemapBuffer(2, gUnknown_0203A134->bg2TilemapBuffer); + InitBgsFromTemplates(0, sUnknown_0859F290, 3); + SetBgTilemapBuffer(1, sMailRead->bg1TilemapBuffer); + SetBgTilemapBuffer(2, sMailRead->bg2TilemapBuffer); break; case 7: - InitWindows(gUnknown_0859F29C); + InitWindows(sUnknown_0859F29C); DeactivateAllTextPrinters(); break; case 8: - decompress_and_copy_tile_data_to_vram(1, gUnknown_0859F2B8[gUnknown_0203A134->mailType].tiles, 0, 0, 0); + decompress_and_copy_tile_data_to_vram(1, sUnknown_0859F2B8[sMailRead->mailType].tiles, 0, 0, 0); break; case 9: if (free_temp_tile_data_buffers_if_possible()) @@ -378,7 +380,7 @@ bool8 sub_81215EC(void) case 10: FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(2, 1, 0, 0, 30, 20); - CopyToBgTilemapBuffer(1, gUnknown_0859F2B8[gUnknown_0203A134->mailType].tileMap, 0, 0); + CopyToBgTilemapBuffer(1, sUnknown_0859F2B8[sMailRead->mailType].tileMap, 0, 0); break; case 11: CopyBgTilemapBufferToVram(0); @@ -387,24 +389,24 @@ bool8 sub_81215EC(void) break; case 12: LoadPalette(GetOverworldTextboxPalettePtr(), 240, 32); - gPlttBufferUnfaded[250] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color10; - gPlttBufferFaded[250] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color10; - gPlttBufferUnfaded[251] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color12; - gPlttBufferFaded[251] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color12; - LoadPalette(gUnknown_0859F2B8[gUnknown_0203A134->mailType].palette, 0, 32); - gPlttBufferUnfaded[10] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0]; - gPlttBufferFaded[10] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0]; - gPlttBufferUnfaded[11] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1]; - gPlttBufferFaded[11] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1]; + gPlttBufferUnfaded[250] = sUnknown_0859F2B8[sMailRead->mailType].color10; + gPlttBufferFaded[250] = sUnknown_0859F2B8[sMailRead->mailType].color10; + gPlttBufferUnfaded[251] = sUnknown_0859F2B8[sMailRead->mailType].color12; + gPlttBufferFaded[251] = sUnknown_0859F2B8[sMailRead->mailType].color12; + LoadPalette(sUnknown_0859F2B8[sMailRead->mailType].palette, 0, 32); + gPlttBufferUnfaded[10] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0]; + gPlttBufferFaded[10] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0]; + gPlttBufferUnfaded[11] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1]; + gPlttBufferFaded[11] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1]; break; case 13: - if (gUnknown_0203A134->flag) + if (sMailRead->flag) { sub_8121A1C(); } break; case 14: - if (gUnknown_0203A134->flag) + if (sMailRead->flag) { sub_8121B1C(); RunTextPrinters(); @@ -417,20 +419,20 @@ bool8 sub_81215EC(void) } break; case 16: - SetVBlankCallback(sub_8121C50); + SetVBlankCallback(VBlankCB_MailRead); gPaletteFade.bufferTransferDisabled = TRUE; break; case 17: - icon = sub_80D2E84(gUnknown_0203A134->mail->species); - switch (gUnknown_0203A134->animsActive) + icon = sub_80D2E84(sMailRead->mail->species); + switch (sMailRead->animsActive) { case 1: sub_80D2F68(icon); - gUnknown_0203A134->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0); + sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0); break; case 2: sub_80D2F68(icon); - gUnknown_0203A134->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0); + sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0); break; } break; @@ -441,53 +443,53 @@ bool8 sub_81215EC(void) ShowBg(2); BeginNormalPaletteFade(-1, 0, 16, 0, 0); gPaletteFade.bufferTransferDisabled = FALSE; - gUnknown_0203A134->callback2 = sub_8121C98; + sMailRead->callback2 = CB2_WaitForPaletteExitOnKeyPress; return TRUE; default: return FALSE; } - gMain.state ++; + gMain.state++; return FALSE; } -void sub_81219F0(void) +static void CB2_InitMailRead(void) { do { - if (sub_81215EC() == TRUE) + if (MailReadBuildGraphics() == TRUE) { - SetMainCallback2(sub_8121C64); + SetMainCallback2(CB2_MailRead); break; } } while (sub_81221AC() != TRUE); } -void sub_8121A1C(void) +static void sub_8121A1C(void) { u16 i; u8 total; u8 *ptr; total = 0; - for (i = 0; i < gUnknown_0203A134->layout->numSubStructs; i ++) + for (i = 0; i < sMailRead->layout->numSubStructs; i ++) { - ConvertEasyChatWordsToString(gUnknown_0203A134->strbuf[i], &gUnknown_0203A134->mail->words[total], gUnknown_0203A134->layout->var8[i].numEasyChatWords, 1); - total += gUnknown_0203A134->layout->var8[i].numEasyChatWords; + ConvertEasyChatWordsToString(sMailRead->strbuf[i], &sMailRead->mail->words[total], sMailRead->layout->var8[i].numEasyChatWords, 1); + total += sMailRead->layout->var8[i].numEasyChatWords; } - ptr = StringCopy(gUnknown_0203A134->playerName, gUnknown_0203A134->mail->playerName); - if (!gUnknown_0203A134->playerIsSender) + ptr = StringCopy(sMailRead->playerName, sMailRead->mail->playerName); + if (!sMailRead->playerIsSender) { StringCopy(ptr, gText_FromSpace); - gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->signatureWidth - (StringLength(gUnknown_0203A134->playerName) * 8 - 0x60); + sMailRead->signatureWidth = sMailRead->layout->signatureWidth - (StringLength(sMailRead->playerName) * 8 - 0x60); } else { - sub_81DB52C(gUnknown_0203A134->playerName); - gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->signatureWidth; + sub_81DB52C(sMailRead->playerName); + sMailRead->signatureWidth = sMailRead->layout->signatureWidth; } } -void sub_8121B1C(void) +static void sub_8121B1C(void) { u16 i; u8 strbuf[0x20]; @@ -501,77 +503,76 @@ void sub_8121B1C(void) PutWindowTilemap(1); FillWindowPixelBuffer(0, 0); FillWindowPixelBuffer(1, 0); - for (i = 0; i < gUnknown_0203A134->layout->numSubStructs; i ++) + for (i = 0; i < sMailRead->layout->numSubStructs; i ++) { - if (gUnknown_0203A134->strbuf[i][0] == EOS || gUnknown_0203A134->strbuf[i][0] == CHAR_SPACE) + if (sMailRead->strbuf[i][0] == EOS || sMailRead->strbuf[i][0] == CHAR_SPACE) { continue; } - box_print(0, 1, gUnknown_0203A134->layout->var8[i].xOffset + gUnknown_0203A134->layout->wordsYPos, y + gUnknown_0203A134->layout->wordsXPos, gUnknown_0859F2AC, 0, gUnknown_0203A134->strbuf[i]); - y += gUnknown_0203A134->layout->var8[i].lineHeight; + box_print(0, 1, sMailRead->layout->var8[i].xOffset + sMailRead->layout->wordsYPos, y + sMailRead->layout->wordsXPos, sUnknown_0859F2AC, 0, sMailRead->strbuf[i]); + y += sMailRead->layout->var8[i].lineHeight; } bufptr = StringCopy(strbuf, gText_FromSpace); - StringCopy(bufptr, gUnknown_0203A134->playerName); - box_x = GetStringCenterAlignXOffset(1, strbuf, gUnknown_0203A134->signatureWidth) + 0x68; - box_y = gUnknown_0203A134->layout->signatureYPos + 0x58; - box_print(0, 1, box_x, box_y, gUnknown_0859F2AC, 0, strbuf); + StringCopy(bufptr, sMailRead->playerName); + box_x = GetStringCenterAlignXOffset(1, strbuf, sMailRead->signatureWidth) + 0x68; + box_y = sMailRead->layout->signatureYPos + 0x58; + box_print(0, 1, box_x, box_y, sUnknown_0859F2AC, 0, strbuf); CopyWindowToVram(0, 3); CopyWindowToVram(1, 3); } -void sub_8121C50(void) +static void VBlankCB_MailRead(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -void sub_8121C64(void) +static void CB2_MailRead(void) { - if (gUnknown_0203A134->animsActive != 0) + if (sMailRead->animsActive != 0) { AnimateSprites(); BuildOamBuffer(); } - gUnknown_0203A134->callback2(); + sMailRead->callback2(); } -void sub_8121C98(void) +static void CB2_WaitForPaletteExitOnKeyPress(void) { if (!UpdatePaletteFade()) { - gUnknown_0203A134->callback2 = sub_8121CC0; + sMailRead->callback2 = CB2_ExitOnKeyPress; } } -void sub_8121CC0(void) +static void CB2_ExitOnKeyPress(void) { if (gMain.newKeys & (A_BUTTON | B_BUTTON)) { BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_0203A134->callback2 = sub_8121D00; + sMailRead->callback2 = CB2_ExitMailReadFreeVars; } } -void sub_8121D00(void) +static void CB2_ExitMailReadFreeVars(void) { if (!UpdatePaletteFade()) { - SetMainCallback2(gUnknown_0203A134->callback); - switch (gUnknown_0203A134->animsActive) + SetMainCallback2(sMailRead->callback); + switch (sMailRead->animsActive) { case 1: case 2: - sub_80D2FF0(sub_80D2E84(gUnknown_0203A134->mail->species)); - sub_80D2EF8(&gSprites[gUnknown_0203A134->monIconSprite]); + sub_80D2FF0(sub_80D2E84(sMailRead->mail->species)); + sub_80D2EF8(&gSprites[sMailRead->monIconSprite]); } - memset(gUnknown_0203A134, 0, sizeof(*gUnknown_0203A134)); + memset(sMailRead, 0, sizeof(*sMailRead)); ResetPaletteFade(); UnsetBgTilemapBuffer(0); UnsetBgTilemapBuffer(1); ResetBgsAndClearDma3BusyFlags(0); FreeAllWindowBuffers(); - free(gUnknown_0203A134); - gUnknown_0203A134 = NULL; + FREE_AND_SET_NULL(sMailRead); } } diff --git a/src/mail_data.c b/src/mail_data.c new file mode 100644 index 000000000..ebb49febf --- /dev/null +++ b/src/mail_data.c @@ -0,0 +1,203 @@ +#include "global.h" +#include "mail.h" +#include "constants/items.h" +#include "pokemon.h" +#include "pokemon_icon.h" +#include "constants/species.h" +#include "text.h" +#include "international_string_util.h" + +void ClearMailData(void) +{ + u8 i; + + for (i = 0; i < MAIL_COUNT; i++) + ClearMailStruct(&gSaveBlock1Ptr->mail[i]); +} + +void ClearMailStruct(struct MailStruct *mail) +{ + s32 i; + + for (i = 0; i < MAIL_WORDS_COUNT; i++) + mail->words[i] = 0xFFFF; + + for (i = 0; i < PLAYER_NAME_LENGTH; i++) + mail->playerName[i] = EOS; + + for (i = 0; i < 4; i++) + mail->trainerId[i] = 0; + + mail->species = SPECIES_BULBASAUR; + mail->itemId = ITEM_NONE; +} + +bool8 MonHasMail(struct Pokemon *mon) +{ + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); + if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF) + return TRUE; + else + return FALSE; +} + +u8 GiveMailToMon(struct Pokemon *mon, u16 itemId) +{ + u8 heldItem[2]; + u8 id, i; + u16 species; + u32 personality; + + heldItem[0] = itemId; + heldItem[1] = itemId >> 8; + + for (id = 0; id < PARTY_SIZE; id++) + { + if (gSaveBlock1Ptr->mail[id].itemId == 0) + { + for (i = 0; i < MAIL_WORDS_COUNT; i++) + gSaveBlock1Ptr->mail[id].words[i] = 0xFFFF; + + for (i = 0; i < PLAYER_NAME_LENGTH - 1; i++) + gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i]; + gSaveBlock1Ptr->mail[id].playerName[i] = EOS; + PadNameString(gSaveBlock1Ptr->mail[id].playerName, CHAR_SPACE); + + for (i = 0; i < 4; i++) + gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; + + species = GetBoxMonData(&mon->box, MON_DATA_SPECIES); + personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY); + gSaveBlock1Ptr->mail[id].species = SpeciesToMailSpecies(species, personality); + gSaveBlock1Ptr->mail[id].itemId = itemId; + SetMonData(mon, MON_DATA_MAIL, &id); + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + return id; + } + } + + return 0xFF; +} + +u16 SpeciesToMailSpecies(u16 species, u32 personality) +{ + if (species == SPECIES_UNOWN) + { + u32 species = GetUnownLetterByPersonality(personality) + 30000; + return species; + } + + return species; +} + +u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *buffer) +{ + u16 result; + + if (mailSpecies >= 30000 && mailSpecies < (30000 + UNOWN_FORM_COUNT)) + { + result = SPECIES_UNOWN; + *buffer = mailSpecies - 30000; + } + else + { + result = mailSpecies; + } + + return result; +} + +u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail) +{ + u8 heldItem[2]; + u16 itemId = mail->itemId; + u8 mailId = GiveMailToMon(mon, itemId); + + if (mailId == 0xFF) + return 0xFF; + + gSaveBlock1Ptr->mail[mailId] = *mail; + + SetMonData(mon, MON_DATA_MAIL, &mailId); + + heldItem[0] = itemId; + heldItem[1] = itemId >> 8; + + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + + return mailId; +} + +static bool32 DummyMailFunc(void) +{ + return FALSE; +} + +void TakeMailFromMon(struct Pokemon *mon) +{ + u8 heldItem[2]; + u8 mailId; + + if (MonHasMail(mon)) + { + mailId = GetMonData(mon, MON_DATA_MAIL); + gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE; + mailId = 0xFF; + heldItem[0] = ITEM_NONE; + heldItem[1] = ITEM_NONE << 8; + SetMonData(mon, MON_DATA_MAIL, &mailId); + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + } +} + +void ClearMailItemId(u8 mailId) +{ + gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE; +} + +u8 TakeMailFromMon2(struct Pokemon *mon) +{ + u8 i; + u8 newHeldItem[2]; + u8 newMailId; + + newHeldItem[0] = ITEM_NONE; + newHeldItem[1] = ITEM_NONE << 8; + newMailId = 0xFF; + + for (i = PARTY_SIZE; i < MAIL_COUNT; i++) + { + if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE) + { + memcpy(&gSaveBlock1Ptr->mail[i], &gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct)); + gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)].itemId = ITEM_NONE; + SetMonData(mon, MON_DATA_MAIL, &newMailId); + SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem); + return i; + } + } + + return 0xFF; +} + +bool8 ItemIsMail(u16 itemId) +{ + switch (itemId) + { + case ITEM_ORANGE_MAIL: + case ITEM_HARBOR_MAIL: + case ITEM_GLITTER_MAIL: + case ITEM_MECH_MAIL: + case ITEM_WOOD_MAIL: + case ITEM_WAVE_MAIL: + case ITEM_BEAD_MAIL: + case ITEM_SHADOW_MAIL: + case ITEM_TROPIC_MAIL: + case ITEM_DREAM_MAIL: + case ITEM_FAB_MAIL: + case ITEM_RETRO_MAIL: + return TRUE; + default: + return FALSE; + } +} diff --git a/src/main.c b/src/main.c index 665a4dd84..07ce07f1c 100644 --- a/src/main.c +++ b/src/main.c @@ -2,7 +2,7 @@ #include "main.h" #include "m4a.h" #include "rtc.h" -#include "rng.h" +#include "random.h" #include "dma3.h" #include "gba/flash_internal.h" #include "battle.h" diff --git a/src/new_game.c b/src/new_game.c index 75e80dc8e..12873fec9 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -1,6 +1,6 @@ #include "global.h" #include "new_game.h" -#include "rng.h" +#include "random.h" #include "pokemon.h" #include "roamer.h" #include "pokemon_size_record.h" diff --git a/src/rom4.c b/src/overworld.c index c538595f2..c538595f2 100644 --- a/src/rom4.c +++ b/src/overworld.c diff --git a/src/pokeball.c b/src/pokeball.c new file mode 100644 index 000000000..127ba8e9d --- /dev/null +++ b/src/pokeball.c @@ -0,0 +1,1282 @@ +#include "global.h" +#include "pokemon.h" +#include "sprite.h" +#include "pokeball.h" +#include "battle.h" +#include "battle_anim.h" +#include "task.h" +#include "sound.h" +#include "constants/songs.h" +#include "trig.h" +#include "main.h" +#include "m4a.h" +#include "decompress.h" +#include "constants/species.h" +#include "util.h" +#include "graphics.h" + +extern bool8 gDoingBattleAnim; +extern u8 gActiveBank; +extern u8 gBankTarget; +extern u16 gBattlePartyID[]; +extern u8 gBankSpriteIds[]; +extern u8 gHealthBoxesIds[]; +extern struct MusicPlayerInfo gMPlay_BGM; + +// this file's functions +static void Task_DoPokeballSendOutAnim(u8 taskId); +static void SpriteCB_TestBallThrow(struct Sprite *sprite); +static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite); +static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite); +static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite); +static void sub_80756D4(struct Sprite *sprite); +static void sub_80756E0(struct Sprite *sprite); +static void sub_807574C(struct Sprite *sprite); +static void sub_80757E4(struct Sprite *sprite); +static void sub_8075838(struct Sprite *sprite); +static void sub_8075930(struct Sprite *sprite); +static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite); +static void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite); +static void sub_8075970(struct Sprite *sprite); +static void HandleBallAnimEnd(struct Sprite *sprite); +static void sub_8075FB4(struct Sprite *sprite); +static void sub_80760F8(struct Sprite *sprite); +static void sub_8076524(struct Sprite *sprite); +static void sub_80765E0(struct Sprite *sprite); +static void sub_80767D4(struct Sprite *sprite); +static void sub_807687C(struct Sprite *sprite); +static void sub_80768F0(struct Sprite *sprite); +static void sub_80769A8(struct Sprite *sprite); +static void sub_80769CC(struct Sprite *sprite); +static void SpriteCB_HitAnimHealthoxEffect(struct Sprite *sprite); +static u16 GetBankPokeballItemId(u8 bank); + +// rom const data + +#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 + +const struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT] = +{ + {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}, +}; + +const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT] = +{ + {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, +}; + +const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = +{ + { + .tileTag = GFX_TAG_POKEBALL, + .paletteTag = GFX_TAG_POKEBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = SpriteCB_TestBallThrow, + }, + { + .tileTag = GFX_TAG_GREATBALL, + .paletteTag = GFX_TAG_GREATBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = SpriteCB_TestBallThrow, + }, + { + .tileTag = GFX_TAG_SAFARIBALL, + .paletteTag = GFX_TAG_SAFARIBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = SpriteCB_TestBallThrow, + }, + { + .tileTag = GFX_TAG_ULTRABALL, + .paletteTag = GFX_TAG_ULTRABALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = SpriteCB_TestBallThrow, + }, + { + .tileTag = GFX_TAG_MASTERBALL, + .paletteTag = GFX_TAG_MASTERBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = SpriteCB_TestBallThrow, + }, + { + .tileTag = GFX_TAG_NETBALL, + .paletteTag = GFX_TAG_NETBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = SpriteCB_TestBallThrow, + }, + { + .tileTag = GFX_TAG_DIVEBALL, + .paletteTag = GFX_TAG_DIVEBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = SpriteCB_TestBallThrow, + }, + { + .tileTag = GFX_TAG_NESTBALL, + .paletteTag = GFX_TAG_NESTBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = SpriteCB_TestBallThrow, + }, + { + .tileTag = GFX_TAG_REPEATBALL, + .paletteTag = GFX_TAG_REPEATBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = SpriteCB_TestBallThrow, + }, + { + .tileTag = GFX_TAG_TIMERBALL, + .paletteTag = GFX_TAG_TIMERBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = SpriteCB_TestBallThrow, + }, + { + .tileTag = GFX_TAG_LUXURYBALL, + .paletteTag = GFX_TAG_LUXURYBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = SpriteCB_TestBallThrow, + }, + { + .tileTag = GFX_TAG_PREMIERBALL, + .paletteTag = GFX_TAG_PREMIERBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = SpriteCB_TestBallThrow, + }, +}; + +#define tFrames data[0] +#define tPan data[1] +#define tThrowId data[2] +#define tBank data[3] +#define tOpponentBank data[4] + +u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow) +{ + u8 taskId; + + gDoingBattleAnim = TRUE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive = 1; + + taskId = CreateTask(Task_DoPokeballSendOutAnim, 5); + gTasks[taskId].tPan = pan; + gTasks[taskId].tThrowId = kindOfThrow; + gTasks[taskId].tBank = gActiveBank; + + return 0; +} + +#define sBank data[6] + +static void Task_DoPokeballSendOutAnim(u8 taskId) +{ + u16 throwCaseId; + u8 bank; + u16 itemId, ballId; + u8 ballSpriteId; + bool8 notSendOut = FALSE; + + if (gTasks[taskId].tFrames == 0) + { + gTasks[taskId].tFrames++; + return; + } + + throwCaseId = gTasks[taskId].tThrowId; + bank = gTasks[taskId].tBank; + + if (GetBankSide(bank) != SIDE_PLAYER) + itemId = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_POKEBALL); + else + itemId = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_POKEBALL); + + ballId = ItemIdToBallId(itemId); + LoadBallGfx(ballId); + ballSpriteId = CreateSprite(&gBallSpriteTemplates[ballId], 32, 80, 29); + gSprites[ballSpriteId].data[0] = 0x80; + gSprites[ballSpriteId].data[1] = 0; + gSprites[ballSpriteId].data[7] = throwCaseId; + + switch (throwCaseId) + { + case POKEBALL_PLAYER_SENDOUT: + gBankTarget = bank; + gSprites[ballSpriteId].pos1.x = 24; + gSprites[ballSpriteId].pos1.y = 68; + gSprites[ballSpriteId].callback = SpriteCB_PlayerMonSendOut_1; + break; + case POKEBALL_OPPONENT_SENDOUT: + gSprites[ballSpriteId].pos1.x = GetBankPosition(bank, BANK_X_POS); + gSprites[ballSpriteId].pos1.y = GetBankPosition(bank, BANK_Y_POS) + 24; + gBankTarget = bank; + gSprites[ballSpriteId].data[0] = 0; + gSprites[ballSpriteId].callback = SpriteCB_OpponentMonSendOut; + break; + default: + gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + notSendOut = TRUE; + break; + } + + gSprites[ballSpriteId].sBank = gBankTarget; + if (!notSendOut) + { + DestroyTask(taskId); + return; + } + + // this will perform an unused ball throw animation + gSprites[ballSpriteId].data[0] = 0x22; + gSprites[ballSpriteId].data[2] = GetBankPosition(gBankTarget, BANK_X_POS); + gSprites[ballSpriteId].data[4] = GetBankPosition(gBankTarget, BANK_Y_POS) - 16; + gSprites[ballSpriteId].data[5] = -40; + sub_80A68D4(&gSprites[ballSpriteId]); + gSprites[ballSpriteId].oam.affineParam = taskId; + gTasks[taskId].tOpponentBank = gBankTarget; + gTasks[taskId].func = TaskDummy; + PlaySE(SE_NAGERU); +} + +static void SpriteCB_TestBallThrow(struct Sprite *sprite) +{ + if (AnimateBallThrow(sprite)) + { + u16 ballId; + u8 taskId = sprite->oam.affineParam; + u8 opponentBank = gTasks[taskId].tOpponentBank; + u8 noOfShakes = gTasks[taskId].tThrowId; + + StartSpriteAnim(sprite, 1); + sprite->affineAnimPaused = 1; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->data[5] = 0; + ballId = ItemIdToBallId(GetBankPokeballItemId(opponentBank)); + LaunchBallStarsTask(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, ballId); + sprite->data[0] = LaunchBallFadeMonTask(FALSE, opponentBank, 14, ballId); + sprite->sBank = opponentBank; + sprite->data[7] = noOfShakes; + DestroyTask(taskId); + sprite->callback = sub_80756D4; + } +} + +#undef tFrames +#undef tPan +#undef tThrowId +#undef tBank +#undef tOpponentBank + +static void sub_80756D4(struct Sprite *sprite) +{ + sprite->callback = sub_80756E0; +} + +static void sub_80756E0(struct Sprite *sprite) +{ + if (++sprite->data[5] == 10) + { + sprite->data[5] = 0; + sprite->callback = sub_807574C; + StartSpriteAffineAnim(&gSprites[gBankSpriteIds[sprite->sBank]], 2); + AnimateSprite(&gSprites[gBankSpriteIds[sprite->sBank]]); + gSprites[gBankSpriteIds[sprite->sBank]].data[1] = 0; + } +} + +static void sub_807574C(struct Sprite *sprite) +{ + sprite->data[5]++; + if (sprite->data[5] == 11) + PlaySE(SE_SUIKOMU); + if (gSprites[gBankSpriteIds[sprite->sBank]].affineAnimEnded) + { + StartSpriteAnim(sprite, 2); + gSprites[gBankSpriteIds[sprite->sBank]].invisible = TRUE; + sprite->data[5] = 0; + sprite->callback = sub_80757E4; + } + else + { + gSprites[gBankSpriteIds[sprite->sBank]].data[1] += 0x60; + gSprites[gBankSpriteIds[sprite->sBank]].pos2.y = -gSprites[gBankSpriteIds[sprite->sBank]].data[1] >> 8; + } +} + +static void sub_80757E4(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_8075838; + } + } +} + +static void sub_8075838(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 = SpriteCB_ReleaseMonFromBall; + } + else + { + sprite->callback = sub_8075930; + sprite->data[4] = 1; + sprite->data[5] = 0; + } + } +} + +static void sub_8075930(struct Sprite *sprite) +{ + sprite->data[3]++; + if (sprite->data[3] == 31) + { + sprite->data[3] = 0; + sprite->affineAnimPaused = TRUE; + StartSpriteAffineAnim(sprite, 1); + sprite->callback = sub_8075970; + PlaySE(SE_BOWA); + } +} + +static void sub_8075970(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 = SpriteCB_ReleaseMonFromBall; + } + else + { + if (sprite->data[7] == 4 && sprite->data[3] >> 8 == 3) + { + sprite->callback = sub_8075FB4; + 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; + } +} + +#define tCryTaskSpecies data[0] +#define tCryTaskPan data[1] +#define tCryTaskWantedCry data[2] +#define tCryTaskBank data[3] +#define tCryTaskMonSpriteId data[4] +#define tCryTaskMonPtr1 data[5] +#define tCryTaskMonPtr2 data[6] +#define tCryTaskFrames data[10] +#define tCryTaskState data[15] + +static void Task_PlayCryWhenReleasedFromBall(u8 taskId) +{ + u8 wantedCry = gTasks[taskId].tCryTaskWantedCry; + s8 pan = gTasks[taskId].tCryTaskPan; + u16 species = gTasks[taskId].tCryTaskSpecies; + u8 bank = gTasks[taskId].tCryTaskBank; + u8 monSpriteId = gTasks[taskId].tCryTaskMonSpriteId; + struct Pokemon *mon = (void*)(u32)((gTasks[taskId].tCryTaskMonPtr1 << 0x10) | (u16)(gTasks[taskId].tCryTaskMonPtr2)); + + switch (gTasks[taskId].tCryTaskState) + { + case 0: + default: + if (gSprites[monSpriteId].affineAnimEnded) + gTasks[taskId].tCryTaskState = wantedCry + 1; + break; + case 1: + if (ShouldPlayNormalPokeCry(mon) == TRUE) + PlayCry3(species, pan, 0); + else + PlayCry3(species, pan, 11); + gBattleSpritesDataPtr->healthBoxesData[bank].field_1_x40 = 0; + DestroyTask(taskId); + break; + case 2: + StopCryAndClearCrySongs(); + gTasks[taskId].tCryTaskFrames = 3; + gTasks[taskId].tCryTaskState = 20; + break; + case 20: + if (gTasks[taskId].tCryTaskFrames == 0) + { + if (ShouldPlayNormalPokeCry(mon) == TRUE) + PlayCry4(species, pan, 1); + else + PlayCry4(species, pan, 12); + + gBattleSpritesDataPtr->healthBoxesData[bank].field_1_x40 = 0; + DestroyTask(taskId); + } + else + { + gTasks[taskId].tCryTaskFrames--; + } + break; + case 3: + gTasks[taskId].tCryTaskFrames = 6; + gTasks[taskId].tCryTaskState = 30; + break; + case 30: + if (gTasks[taskId].tCryTaskFrames != 0) + { + gTasks[taskId].tCryTaskFrames--; + break; + } + gTasks[taskId].tCryTaskState++; + // fall through + case 31: + if (!IsCryPlayingOrClearCrySongs()) + { + StopCryAndClearCrySongs(); + gTasks[taskId].tCryTaskFrames = 3; + gTasks[taskId].tCryTaskState++; + } + break; + case 32: + if (gTasks[taskId].tCryTaskFrames != 0) + { + gTasks[taskId].tCryTaskFrames--; + break; + } + if (ShouldPlayNormalPokeCry(mon) == TRUE) + PlayCry4(species, pan, 0); + else + PlayCry4(species, pan, 11); + + gBattleSpritesDataPtr->healthBoxesData[bank].field_1_x40 = 0; + DestroyTask(taskId); + break; + } +} + +static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) +{ + u8 bank = sprite->sBank; + u32 ballId; + + StartSpriteAnim(sprite, 1); + ballId = ItemIdToBallId(GetBankPokeballItemId(bank)); + LaunchBallStarsTask(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, ballId); + sprite->data[0] = LaunchBallFadeMonTask(1, sprite->sBank, 14, ballId); + sprite->callback = HandleBallAnimEnd; + + if (gMain.inBattle) + { + struct Pokemon *mon; + u16 species; + s8 pan; + u16 wantedCryCase; + u8 taskId; + + if (GetBankSide(bank) != SIDE_PLAYER) + { + mon = &gEnemyParty[gBattlePartyID[bank]]; + pan = 25; + } + else + { + mon = &gPlayerParty[gBattlePartyID[bank]]; + pan = -25; + } + + species = GetMonData(mon, MON_DATA_SPECIES); + if ((bank == GetBankByIdentity(IDENTITY_PLAYER_MON1) || bank == GetBankByIdentity(IDENTITY_OPPONENT_MON1)) + && IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1) + { + if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) + { + if (IsBGMPlaying()) + m4aMPlayStop(&gMPlay_BGM); + } + else + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128); + } + } + + if (!IsDoubleBattle() || !gBattleSpritesDataPtr->animationData->field_9_x1) + wantedCryCase = 0; + else if (bank == GetBankByIdentity(IDENTITY_PLAYER_MON1) || bank == GetBankByIdentity(IDENTITY_OPPONENT_MON1)) + wantedCryCase = 1; + else + wantedCryCase = 2; + + gBattleSpritesDataPtr->healthBoxesData[bank].field_1_x40 = 1; + + taskId = CreateTask(Task_PlayCryWhenReleasedFromBall, 3); + gTasks[taskId].tCryTaskSpecies = species; + gTasks[taskId].tCryTaskPan = pan; + gTasks[taskId].tCryTaskWantedCry = wantedCryCase; + gTasks[taskId].tCryTaskBank = bank; + gTasks[taskId].tCryTaskMonSpriteId = gBankSpriteIds[sprite->sBank]; + gTasks[taskId].tCryTaskMonPtr1 = (u32)(mon) >> 0x10; + gTasks[taskId].tCryTaskMonPtr2 = (u32)(mon); + gTasks[taskId].tCryTaskState = 0; + } + + StartSpriteAffineAnim(&gSprites[gBankSpriteIds[sprite->sBank]], 1); + + if (GetBankSide(sprite->sBank) == SIDE_OPPONENT) + gSprites[gBankSpriteIds[sprite->sBank]].callback = sub_8039B58; + else + gSprites[gBankSpriteIds[sprite->sBank]].callback = sub_8039E44; + + AnimateSprite(&gSprites[gBankSpriteIds[sprite->sBank]]); + gSprites[gBankSpriteIds[sprite->sBank]].data[1] = 0x1000; +} + +#undef tCryTaskSpecies +#undef tCryTaskPan +#undef tCryTaskWantedCry +#undef tCryTaskBank +#undef tCryTaskMonSpriteId +#undef tCryTaskMonPtr1 +#undef tCryTaskMonPtr2 +#undef tCryTaskFrames +#undef tCryTaskState + +static void sub_8075FB4(struct Sprite *sprite) +{ + sprite->animPaused = TRUE; + sprite->callback = sub_80760F8; + sprite->data[3] = 0; + sprite->data[4] = 0; + sprite->data[5] = 0; +} + +static void HandleBallAnimEnd(struct Sprite *sprite) +{ + bool8 affineAnimEnded = FALSE; + u8 bank = sprite->sBank; + + gSprites[gBankSpriteIds[bank]].invisible = FALSE; + if (sprite->animEnded) + sprite->invisible = TRUE; + if (gSprites[gBankSpriteIds[bank]].affineAnimEnded) + { + StartSpriteAffineAnim(&gSprites[gBankSpriteIds[bank]], 0); + affineAnimEnded = TRUE; + } + else + { + gSprites[gBankSpriteIds[bank]].data[1] -= 288; + gSprites[gBankSpriteIds[bank]].pos2.y = gSprites[gBankSpriteIds[bank]].data[1] >> 8; + } + if (sprite->animEnded && affineAnimEnded) + { + s32 i, doneBanks; + + gSprites[gBankSpriteIds[bank]].pos2.y = 0; + gDoingBattleAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[bank].ballAnimActive = 0; + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + + for (doneBanks = 0, i = 0; i < BATTLE_BANKS_COUNT; i++) + { + if (gBattleSpritesDataPtr->healthBoxesData[i].ballAnimActive == 0) + doneBanks++; + } + if (doneBanks == BATTLE_BANKS_COUNT) + { + for (i = 0; i < POKEBALL_COUNT; i++) + FreeBallGfx(i); + } + } +} + +static void sub_80760F8(struct Sprite *sprite) +{ + u8 bank = sprite->sBank; + + sprite->data[4]++; + if (sprite->data[4] == 40) + { + return; + } + else if (sprite->data[4] == 95) + { + gDoingBattleAnim = FALSE; + m4aMPlayAllStop(); + PlaySE(BGM_FANFA5); + } + else if (sprite->data[4] == 315) + { + FreeOamMatrix(gSprites[gBankSpriteIds[sprite->sBank]].oam.matrixNum); + DestroySprite(&gSprites[gBankSpriteIds[sprite->sBank]]); + DestroySpriteAndFreeResources(sprite); + if (gMain.inBattle) + gBattleSpritesDataPtr->healthBoxesData[bank].ballAnimActive = 0; + } +} + +static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite) +{ + sprite->data[0] = 25; + sprite->data[2] = GetBankPosition(sprite->sBank, 2); + sprite->data[4] = GetBankPosition(sprite->sBank, 3) + 24; + sprite->data[5] = -30; + sprite->oam.affineParam = sprite->sBank; + sub_80A68D4(sprite); + sprite->callback = SpriteCB_PlayerMonSendOut_2; +} + +#define HIBYTE(x) (((x) >> 8) & 0xFF) + +static void SpriteCB_PlayerMonSendOut_2(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]; + sub_80A6F3C(sprite); + sprite->data[7] += sprite->sBank / 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 (AnimateBallThrow(sprite)) + { + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + sprite->sBank = sprite->oam.affineParam & 0xFF; + sprite->data[0] = 0; + + if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1 + && sprite->sBank == GetBankByIdentity(IDENTITY_PLAYER_MON2)) + sprite->callback = SpriteCB_ReleaseMon2FromBall; + else + sprite->callback = SpriteCB_ReleaseMonFromBall; + + StartSpriteAffineAnim(sprite, 0); + } + } +} + +static void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite) +{ + if (sprite->data[0]++ > 24) + { + sprite->data[0] = 0; + sprite->callback = SpriteCB_ReleaseMonFromBall; + } +} + +static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite) +{ + sprite->data[0]++; + if (sprite->data[0] > 15) + { + sprite->data[0] = 0; + if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1 + && sprite->sBank == GetBankByIdentity(IDENTITY_OPPONENT_MON2)) + sprite->callback = SpriteCB_ReleaseMon2FromBall; + else + sprite->callback = SpriteCB_ReleaseMonFromBall; + } +} + +#undef sBank + +static u8 LaunchBallStarsTaskForPokeball(u8 x, u8 y, u8 kindOfStars, u8 d) +{ + return LaunchBallStarsTask(x, y, kindOfStars, d, BALL_POKE); +} + +static u8 LaunchBallFadeMonTaskForPokeball(bool8 unFadeLater, u8 bank, u32 arg2) +{ + return LaunchBallFadeMonTask(unFadeLater, bank, arg2, BALL_POKE); +} + +void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 bank, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 g, u32 h, u16 species) +{ + u8 spriteId; + + LoadCompressedObjectPicUsingHeap(&gBallSpriteSheets[0]); + LoadCompressedObjectPaletteUsingHeap(&gBallSpritePalettes[0]); + spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, subpriortiy); + + gSprites[spriteId].data[0] = monSpriteId; + gSprites[spriteId].data[5] = gSprites[monSpriteId].pos1.x; + gSprites[spriteId].data[6] = gSprites[monSpriteId].pos1.y; + + gSprites[monSpriteId].pos1.x = x; + gSprites[monSpriteId].pos1.y = y; + gSprites[monSpriteId].data[7] = species; + + gSprites[spriteId].data[1] = g; + gSprites[spriteId].data[2] = bank; + gSprites[spriteId].data[3] = h; + gSprites[spriteId].data[4] = h >> 0x10; + gSprites[spriteId].oam.priority = oamPriority; + gSprites[spriteId].callback = sub_8076524; + + gSprites[monSpriteId].invisible = TRUE; +} + +static void sub_8076524(struct Sprite *sprite) +{ + if (sprite->data[1] == 0) + { + u8 r5; + u8 r7 = sprite->data[0]; + u8 bank = 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); + LaunchBallStarsTaskForPokeball(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r5); + sprite->data[1] = LaunchBallFadeMonTaskForPokeball(1, bank, r4); + sprite->callback = sub_80765E0; + 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_80765E0(struct Sprite *sprite) +{ + bool8 r12 = FALSE; + bool8 r6 = FALSE; + u8 monSpriteId = sprite->data[0]; + u16 var1; + u16 var2; + + if (sprite->animEnded) + sprite->invisible = TRUE; + if (gSprites[monSpriteId].affineAnimEnded) + { + StartSpriteAffineAnim(&gSprites[monSpriteId], 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[monSpriteId].pos1.x = var1; + gSprites[monSpriteId].pos1.y = var2; + if (sprite->data[7] < 128) + { + s16 sine = -(gSineTable[(u8)sprite->data[7]] / 8); + + sprite->data[7] += 4; + gSprites[monSpriteId].pos2.x = sine; + gSprites[monSpriteId].pos2.y = sine; + } + else + { + gSprites[monSpriteId].pos1.x = sprite->data[5]; + gSprites[monSpriteId].pos1.y = sprite->data[6]; + gSprites[monSpriteId].pos2.x = 0; + gSprites[monSpriteId].pos2.y = 0; + r6 = TRUE; + } + if (sprite->animEnded && r12 && r6) + { + if (gSprites[monSpriteId].data[7] == SPECIES_EGG) + DoMonFrontSpriteAnimation(&gSprites[monSpriteId], gSprites[monSpriteId].data[7], TRUE, 0); + else + DoMonFrontSpriteAnimation(&gSprites[monSpriteId], gSprites[monSpriteId].data[7], FALSE, 0); + + DestroySpriteAndFreeResources(sprite); + } +} + +u8 sub_807671C(u8 a, u8 b, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 g, u32 h) +{ + u8 spriteId; + + LoadCompressedObjectPicUsingHeap(&gBallSpriteSheets[0]); + LoadCompressedObjectPaletteUsingHeap(&gBallSpritePalettes[0]); + spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, subPriority); + 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 = oamPriority; + gSprites[spriteId].callback = sub_80767D4; + return spriteId; +} + +static void sub_80767D4(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); + LaunchBallStarsTaskForPokeball(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r6); + sprite->data[1] = LaunchBallFadeMonTaskForPokeball(1, r8, r5); + sprite->callback = sub_807687C; + StartSpriteAffineAnim(&gSprites[r7], 2); + AnimateSprite(&gSprites[r7]); + gSprites[r7].data[1] = 0; + } + else + { + sprite->data[1]--; + } +} + +static void sub_807687C(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_80768F0; + } + else + { + gSprites[r1].data[1] += 96; + gSprites[r1].pos2.y = -gSprites[r1].data[1] >> 8; + } +} + +static void sub_80768F0(struct Sprite *sprite) +{ + if (sprite->animEnded) + sprite->callback = SpriteCallbackDummy; +} + +static void DestroySpriteAndFreeResources_(struct Sprite *sprite) +{ + DestroySpriteAndFreeResources(sprite); +} + +void sub_8076918(u8 bank) +{ + struct Sprite *healthboxSprite = &gSprites[gHealthBoxesIds[bank]]; + + healthboxSprite->data[0] = 5; + healthboxSprite->data[1] = 0; + healthboxSprite->pos2.x = 0x73; + healthboxSprite->pos2.y = 0; + healthboxSprite->callback = sub_80769CC; + if (GetBankSide(bank) != SIDE_PLAYER) + { + healthboxSprite->data[0] = -healthboxSprite->data[0]; + healthboxSprite->data[1] = -healthboxSprite->data[1]; + healthboxSprite->pos2.x = -healthboxSprite->pos2.x; + healthboxSprite->pos2.y = -healthboxSprite->pos2.y; + } + gSprites[healthboxSprite->data[5]].callback(&gSprites[healthboxSprite->data[5]]); + if (GetBankIdentity(bank) == IDENTITY_PLAYER_MON2) + healthboxSprite->callback = sub_80769A8; +} + +static void sub_80769A8(struct Sprite *sprite) +{ + sprite->data[1]++; + if (sprite->data[1] == 20) + { + sprite->data[1] = 0; + sprite->callback = sub_80769CC; + } +} + +static void sub_80769CC(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 DoHitAnimHealthboxEffect(u8 bank) +{ + u8 spriteId; + + spriteId = CreateInvisibleSpriteWithCallback(SpriteCB_HitAnimHealthoxEffect); + gSprites[spriteId].data[0] = 1; + gSprites[spriteId].data[1] = gHealthBoxesIds[bank]; + gSprites[spriteId].callback = SpriteCB_HitAnimHealthoxEffect; +} + +static void SpriteCB_HitAnimHealthoxEffect(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 LoadBallGfx(u8 ballId) +{ + u16 var; + + if (GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag) == 0xFFFF) + { + LoadCompressedObjectPicUsingHeap(&gBallSpriteSheets[ballId]); + LoadCompressedObjectPaletteUsingHeap(&gBallSpritePalettes[ballId]); + } + switch (ballId) + { + case BALL_DIVE: + case BALL_LUXURY: + case BALL_PREMIER: + break; + default: + var = GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag); + LZDecompressVram(gOpenPokeballGfx, (void *)(VRAM + 0x10100 + var * 32)); + break; + } +} + +void FreeBallGfx(u8 ballId) +{ + FreeSpriteTilesByTag(gBallSpriteSheets[ballId].tag); + FreeSpritePaletteByTag(gBallSpritePalettes[ballId].tag); +} + +static u16 GetBankPokeballItemId(u8 bank) +{ + if (GetBankSide(bank) == SIDE_PLAYER) + return GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_POKEBALL); + else + return GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_POKEBALL); +} diff --git a/src/pokemon_1.c b/src/pokemon_1.c index f56ade967..98a35454f 100644 --- a/src/pokemon_1.c +++ b/src/pokemon_1.c @@ -1,8 +1,8 @@ #include "global.h" #include "pokemon.h" -#include "rng.h" +#include "random.h" #include "main.h" -#include "items.h" +#include "constants/items.h" #include "string_util.h" #include "text.h" diff --git a/src/pokemon_2.c b/src/pokemon_2.c index 7014be492..db176e025 100644 --- a/src/pokemon_2.c +++ b/src/pokemon_2.c @@ -2,9 +2,9 @@ #include "pokemon.h" #include "battle.h" #include "event_data.h" -#include "rng.h" +#include "random.h" #include "sprite.h" -#include "species.h" +#include "constants/species.h" #include "text.h" #include "string_util.h" @@ -1155,7 +1155,7 @@ u8 GetMonsStateToDoubles_2(void) s32 aliveCount = 0; s32 i; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL); if (species != SPECIES_EGG && species != SPECIES_NONE diff --git a/src/pokemon_3.c b/src/pokemon_3.c index 01dfc954a..d58b024a8 100644 --- a/src/pokemon_3.c +++ b/src/pokemon_3.c @@ -1,25 +1,24 @@ #include "global.h" #include "pokemon.h" #include "main.h" -#include "items.h" +#include "constants/items.h" #include "string_util.h" #include "battle_message.h" #include "rtc.h" #include "item.h" #include "battle.h" -#include "species.h" +#include "constants/species.h" #include "link.h" -#include "hold_effects.h" -#include "rng.h" -#include "trainer_classes.h" -#include "trainer_ids.h" -#include "songs.h" +#include "constants/hold_effects.h" +#include "random.h" +#include "constants/trainers.h" +#include "constants/songs.h" #include "sound.h" #include "m4a.h" #include "task.h" #include "sprite.h" #include "text.h" -#include "abilities.h" +#include "constants/abilities.h" #include "pokemon_animation.h" #include "pokedex.h" @@ -692,9 +691,9 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) if ((event != 5 || !(Random() & 1)) && (event != 3 || ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && (gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_ELITE_FOUR - || gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_LEADER - || gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_CHAMPION)))) + && (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)))) { s8 mod = gUnknown_08329ECE[event][friendshipLevel]; if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) @@ -1146,55 +1145,57 @@ void ClearBattleMonForms(void) u16 GetBattleBGM(void) { if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) - return 0x1E0; + return BGM_BATTLE34; if (gBattleTypeFlags & BATTLE_TYPE_REGI) - return 0x1DF; + return BGM_BATTLE36; if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) - return 0x1DC; + return BGM_BATTLE20; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { u8 trainerClass; + if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) trainerClass = GetFrontierOpponentClass(gTrainerBattleOpponent_A); else if (gBattleTypeFlags & BATTLE_TYPE_x4000000) - trainerClass = CLASS_EXPERT; + trainerClass = TRAINER_CLASS_EXPERT; else trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass; + switch (trainerClass) { - case CLASS_AQUA_LEADER: - case CLASS_MAGMA_LEADER: - return 0x1E3; - case CLASS_TEAM_AQUA: - case CLASS_TEAM_MAGMA: - case CLASS_AQUA_ADMIN: - case CLASS_MAGMA_ADMIN: - return 0x1DB; - case CLASS_LEADER: - return 0x1DD; - case CLASS_CHAMPION: - return 0x1DE; - case CLASS_PKMN_TRAINER_RIVAL: + case TRAINER_CLASS_AQUA_LEADER: + case TRAINER_CLASS_MAGMA_LEADER: + return BGM_BATTLE30; + case TRAINER_CLASS_TEAM_AQUA: + case TRAINER_CLASS_TEAM_MAGMA: + case TRAINER_CLASS_AQUA_ADMIN: + case TRAINER_CLASS_MAGMA_ADMIN: + return BGM_BATTLE31; + case TRAINER_CLASS_LEADER: + return BGM_BATTLE32; + case TRAINER_CLASS_CHAMPION: + return BGM_BATTLE33; + case TRAINER_CLASS_PKMN_TRAINER_3: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - return 0x1E1; + return BGM_BATTLE35; if (!StringCompare(gTrainers[gTrainerBattleOpponent_A].trainerName, gText_BattleWallyName)) - return 0x1DC; - return 0x1E1; - case CLASS_ELITE_FOUR: - return 0x1E2; - case CLASS_SALON_MAIDEN: - case CLASS_DOME_ACE: - case CLASS_PALACE_MAVEN: - case CLASS_ARENA_TYCOON: - case CLASS_FACTORY_HEAD: - case CLASS_PIKE_QUEEN: - case CLASS_PYRAMID_KING: - return 0x1D7; + return BGM_BATTLE20; + return BGM_BATTLE35; + case TRAINER_CLASS_ELITE_FOUR: + return BGM_BATTLE38; + case TRAINER_CLASS_SALON_MAIDEN: + case TRAINER_CLASS_DOME_ACE: + case TRAINER_CLASS_PALACE_MAVEN: + case TRAINER_CLASS_ARENA_TYCOON: + case TRAINER_CLASS_FACTORY_HEAD: + case TRAINER_CLASS_PIKE_QUEEN: + case TRAINER_CLASS_PYRAMID_KING: + return BGM_BATTLE_FRONTIER_BRAIN; default: - return 0x1DC; + return BGM_BATTLE20; } } - return 0x1DA; + return BGM_BATTLE27; } void PlayBattleBGM(void) @@ -1297,13 +1298,13 @@ bool8 IsPokeSpriteNotFlipped(u16 species) return gBaseStats[species].noFlip; } -s8 GetMonFlavourRelation(struct Pokemon *mon, u8 a2) +s8 GetMonFlavorRelation(struct Pokemon *mon, u8 a2) { u8 nature = GetNature(mon); return gPokeblockFlavorCompatibilityTable[nature * 5 + a2]; } -s8 GetFlavourRelationByPersonality(u32 personality, u8 a2) +s8 GetFlavorRelationByPersonality(u32 personality, u8 a2) { u8 nature = GetNatureFromPersonality(personality); return gPokeblockFlavorCompatibilityTable[nature * 5 + a2]; @@ -1396,7 +1397,7 @@ static s32 GetWildMonTableIdInAlteringCave(u16 species) void SetWildMonHeldItem(void) { - if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID | BATTLE_TYPE_x100000))) + if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID | BATTLE_TYPE_PIKE))) { u16 rnd = Random() % 100; u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0); @@ -1462,12 +1463,14 @@ bool8 IsShinyOtIdPersonality(u32 otId, u32 personality) return retVal; } -const u8* GetTrainerPartnerName(void) +const u8 *GetTrainerPartnerName(void) { if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { if (gPartnerTrainerId == STEVEN_PARTNER_ID) - return gTrainers[TRAINER_ID_STEVEN].trainerName; + { + return gTrainers[TRAINER_STEVEN].trainerName; + } else { GetFrontierTrainerName(gStringVar1, gPartnerTrainerId); @@ -1682,14 +1685,14 @@ void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality) } } -const u8* GetTrainerClassNameFromId(u16 trainerId) +const u8 *GetTrainerClassNameFromId(u16 trainerId) { if (trainerId > NO_OF_TRAINERS) trainerId = 0; return gTrainerClassNames[gTrainers[trainerId].trainerClass]; } -const u8* GetTrainerNameFromId(u16 trainerId) +const u8 *GetTrainerNameFromId(u16 trainerId) { if (trainerId > NO_OF_TRAINERS) trainerId = 0; diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c index ec0103bc7..fe3b3e8dd 100644 --- a/src/pokemon_size_record.c +++ b/src/pokemon_size_record.c @@ -1,7 +1,7 @@ #include "global.h" #include "pokemon_size_record.h" #include "event_data.h" -#include "species.h" +#include "constants/species.h" #include "string_util.h" #include "text.h" #include "pokemon.h" diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index f82a52d38..bdf4427c7 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -1,7 +1,7 @@ #include "global.h" #include "pokemon_storage_system.h" #include "pokemon.h" -#include "species.h" +#include "constants/species.h" #include "event_data.h" #include "string_util.h" #include "text.h" diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index d09cbc407..b00979945 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -3,18 +3,19 @@ #include "bg.h" #include "decompress.h" #include "item.h" -#include "items.h" +#include "constants/items.h" #include "link.h" #include "m4a.h" #include "main.h" #include "malloc.h" -#include "moves.h" +#include "constants/moves.h" #include "palette.h" #include "pokemon.h" -#include "songs.h" +#include "constants/songs.h" #include "sound.h" -#include "species.h" +#include "constants/species.h" #include "sprite.h" +#include "unk_text_util.h" #include "string_util.h" #include "task.h" #include "text.h" @@ -166,9 +167,7 @@ extern s32 GetStringCenterAlignXOffset(u8 fontId, u8 *str, s32 totalWidth); extern s32 GetStringRightAlignXOffset(u8 fontId, u8 *str, s32 totalWidth); extern bool8 sub_81A6BF4(); extern bool8 sub_81B9E94(); -extern void sub_81AFBF0(); -extern u8 sub_81AFC0C(u8 a, u8 *b); -extern void sub_81AFC28(u8 *a, u8 *b); +extern void UnkTextUtil_Reset(); extern void sub_8124610(u8 *a, u8 b); extern int GetPlayerIDAsU32(); extern u8 GetCurrentPpToMaxPpState(u8 a, u8 b); @@ -938,7 +937,7 @@ void sub_81C0704(u8 taskId) gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &data[1]); if (gUnknown_0203CF1C->unk40D3 == 0xFF) return; - gSprites[gUnknown_0203CF1C->unk40D3].data2 = 1; + gSprites[gUnknown_0203CF1C->unk40D3].data[2] = 1; sub_81C0E24(); data[1] = 0; break; @@ -953,7 +952,7 @@ void sub_81C0704(u8 taskId) sub_81C2524(); break; case 12: - gSprites[gUnknown_0203CF1C->unk40D3].data2 = 0; + gSprites[gUnknown_0203CF1C->unk40D3].data[2] = 0; break; default: if (sub_81221EC() == 0 && FuncIsActiveTask(sub_81C20F0) == 0) @@ -2993,12 +2992,12 @@ void sub_81C307C() { struct PokeSummary *sum = &gUnknown_0203CF1C->summary; u8 *text; - sub_81AFBF0(); - sub_81AFC0C(0, gUnknown_0861CE74); - sub_81AFC0C(1, gUnknown_0861CE7B); + UnkTextUtil_Reset(); + UnkTextUtil_SetPtrI(0, gUnknown_0861CE74); + UnkTextUtil_SetPtrI(1, gUnknown_0861CE7B); sub_81C31C0(); if (sub_81A6BF4() == TRUE || sub_81B9E94() == TRUE || sub_81C3304() == TRUE) - sub_81AFC28(gStringVar4, gText_XNature); + UnkTextUtil_StringExpandPlaceholders(gStringVar4, gText_XNature); else { u8 *alloced1 = Alloc(32); @@ -3007,7 +3006,7 @@ void sub_81C307C() if (sum->metLocation <= 0xD4) { sub_8124610(alloced2, sum->metLocation); - sub_81AFC0C(4, alloced2); + UnkTextUtil_SetPtrI(4, alloced2); } if (sub_81C3220() == 1) { @@ -3022,7 +3021,7 @@ void sub_81C307C() text = (sum->metLocation > 0xD4) ? gText_XNatureObtainedInTrade : gText_XNatureProbablyMetAt; else text = gText_XNatureObtainedInTrade; - sub_81AFC28(gStringVar4, text); + UnkTextUtil_StringExpandPlaceholders(gStringVar4, text); Free(alloced1); Free(alloced2); } @@ -3036,8 +3035,8 @@ void sub_81C3194() void sub_81C31C0() { struct UnkSummaryStruct *sumStruct = gUnknown_0203CF1C; - sub_81AFC0C(2, gNatureNamePointers[sumStruct->summary.nature]); - sub_81AFC0C(5, gText_EmptyString5); + UnkTextUtil_SetPtrI(2, gNatureNamePointers[sumStruct->summary.nature]); + UnkTextUtil_SetPtrI(5, gText_EmptyString5); } void sub_81C31F0(u8 *a) @@ -3046,7 +3045,7 @@ void sub_81C31F0(u8 *a) if (level == 0) level = 5; ConvertIntToDecimalStringN(a, level, 0, 3); - sub_81AFC0C(3, a); + UnkTextUtil_SetPtrI(3, a); } u8 sub_81C3220() @@ -3301,12 +3300,12 @@ void sub_81C3710() ConvertIntToDecimalStringN(alloced2, gUnknown_0203CF1C->summary.maxHP, 1, 3); ConvertIntToDecimalStringN(alloced3, gUnknown_0203CF1C->summary.atk, 1, 7); ConvertIntToDecimalStringN(alloced4, gUnknown_0203CF1C->summary.def, 1, 7); - sub_81AFBF0(); - sub_81AFC0C(0, alloced1); - sub_81AFC0C(1, alloced2); - sub_81AFC0C(2, alloced3); - sub_81AFC0C(3, alloced4); - sub_81AFC28(gStringVar4, gUnknown_0861CE82); + UnkTextUtil_Reset(); + UnkTextUtil_SetPtrI(0, alloced1); + UnkTextUtil_SetPtrI(1, alloced2); + UnkTextUtil_SetPtrI(2, alloced3); + UnkTextUtil_SetPtrI(3, alloced4); + UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_0861CE82); Free(alloced1); Free(alloced2); Free(alloced3); @@ -3323,11 +3322,11 @@ void sub_81C3808() ConvertIntToDecimalStringN(gStringVar1, gUnknown_0203CF1C->summary.spatk, 1, 3); ConvertIntToDecimalStringN(gStringVar2, gUnknown_0203CF1C->summary.spdef, 1, 3); ConvertIntToDecimalStringN(gStringVar3, gUnknown_0203CF1C->summary.speed, 1, 3); - sub_81AFBF0(); - sub_81AFC0C(0, gStringVar1); - sub_81AFC0C(1, gStringVar2); - sub_81AFC0C(2, gStringVar3); - sub_81AFC28(gStringVar4, gUnknown_0861CE8E); + UnkTextUtil_Reset(); + UnkTextUtil_SetPtrI(0, gStringVar1); + UnkTextUtil_SetPtrI(1, gStringVar2); + UnkTextUtil_SetPtrI(2, gStringVar3); + UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_0861CE8E); } void sub_81C3890() @@ -3436,10 +3435,10 @@ void sub_81C3B08(u8 a) sub_81C25A4(r8, gMoveNames[move], 0, (a<<4) + 1, 0, 1); ConvertIntToDecimalStringN(gStringVar1, r10->summary.pp[a], 1, 2); ConvertIntToDecimalStringN(gStringVar2, r6, 1, 2); - sub_81AFBF0(); - sub_81AFC0C(0, gStringVar1); - sub_81AFC0C(1, gStringVar2); - sub_81AFC28(gStringVar4, gUnknown_0861CE97); + UnkTextUtil_Reset(); + UnkTextUtil_SetPtrI(0, gStringVar1); + UnkTextUtil_SetPtrI(1, gStringVar2); + UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_0861CE97); text = gStringVar4; r5 = GetCurrentPpToMaxPpState(r10->summary.pp[a], r6) + 9; offset = GetStringRightAlignXOffset(1, text, 0x2C); @@ -3531,17 +3530,17 @@ void sub_81C3B08(u8 a) movs r2, 0x1\n\ movs r3, 0x2\n\ bl ConvertIntToDecimalStringN\n\ - bl sub_81AFBF0\n\ + bl UnkTextUtil_Reset\n\ movs r0, 0\n\ mov r1, r8\n\ - bl sub_81AFC0C\n\ + bl UnkTextUtil_SetPtrI\n\ movs r0, 0x1\n\ adds r1, r4, 0\n\ - bl sub_81AFC0C\n\ + bl UnkTextUtil_SetPtrI\n\ ldr r4, =gStringVar4\n\ ldr r1, =gUnknown_0861CE97\n\ adds r0, r4, 0\n\ - bl sub_81AFC28\n\ + bl UnkTextUtil_StringExpandPlaceholders\n\ adds r7, r4, 0\n\ ldrb r0, [r5]\n\ adds r1, r6, 0\n\ diff --git a/src/rng.c b/src/random.c index ddd149018..f2f0ede58 100644 --- a/src/rng.c +++ b/src/random.c @@ -1,5 +1,5 @@ #include "global.h" -#include "rng.h" +#include "random.h" // The number 1103515245 comes from the example implementation of rand and srand // in the ISO C standard. diff --git a/src/recorded_battle.c b/src/recorded_battle.c index e843ff7cb..c88229c61 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -3,7 +3,7 @@ #include "recorded_battle.h" #include "main.h" #include "pokemon.h" -#include "rng.h" +#include "random.h" #include "event_data.h" #include "link.h" #include "string_util.h" @@ -19,7 +19,7 @@ | BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_ROAMER | BATTLE_TYPE_EREADER_TRAINER \ | BATTLE_TYPE_KYOGRE_GROUDON | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI \ | BATTLE_TYPE_RECORDED | BATTLE_TYPE_x4000000 | BATTLE_TYPE_SECRET_BASE \ - | BATTLE_TYPE_GROUDON | BATTLE_TYPE_KYORGE | BATTLE_TYPE_RAYQUAZA)) + | BATTLE_TYPE_GROUDON | BATTLE_TYPE_KYOGRE | BATTLE_TYPE_RAYQUAZA)) extern u32 gBattleTypeFlags; extern u16 gTrainerBattleOpponent_A; diff --git a/src/region_map.c b/src/region_map.c index da96475c0..b7fc625ca 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -1,25 +1,23 @@ - -// Includes #include "global.h" #include "main.h" +#include "text.h" #include "menu.h" #include "malloc.h" #include "gpu_regs.h" #include "palette.h" #include "party_menu.h" #include "trig.h" -#include "map_constants.h" +#include "constants/maps.h" #include "overworld.h" -#include "flags.h" +#include "constants/flags.h" #include "event_data.h" #include "rom6.h" #include "secret_base.h" #include "string_util.h" #include "international_string_util.h" #include "strings.h" -#include "text.h" #include "text_window.h" -#include "songs.h" +#include "constants/songs.h" #include "m4a.h" #include "field_effect.h" #include "region_map.h" @@ -244,56 +242,56 @@ static const u16 Unknown_085A1D48[] = INCBIN_U16("graphics/pokenav/fly_target_ic static const u8 gUnknown_085A1D68[] = INCBIN_U8("graphics/pokenav/fly_target_icons.4bpp.lz"); static const u8 gUnknown_085A1E3C[][3] = { - {MAP_GROUP_LITTLEROOT_TOWN, MAP_ID_LITTLEROOT_TOWN, 1}, - {MAP_GROUP_OLDALE_TOWN, MAP_ID_OLDALE_TOWN, 14}, - {MAP_GROUP_DEWFORD_TOWN, MAP_ID_DEWFORD_TOWN, 15}, - {MAP_GROUP_LAVARIDGE_TOWN, MAP_ID_LAVARIDGE_TOWN, 16}, - {MAP_GROUP_FALLARBOR_TOWN, MAP_ID_FALLARBOR_TOWN, 17}, - {MAP_GROUP_VERDANTURF_TOWN, MAP_ID_VERDANTURF_TOWN, 18}, - {MAP_GROUP_PACIFIDLOG_TOWN, MAP_ID_PACIFIDLOG_TOWN, 19}, - {MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, 3}, - {MAP_GROUP_SLATEPORT_CITY, MAP_ID_SLATEPORT_CITY, 4}, - {MAP_GROUP_MAUVILLE_CITY, MAP_ID_MAUVILLE_CITY, 5}, - {MAP_GROUP_RUSTBORO_CITY, MAP_ID_RUSTBORO_CITY, 6}, - {MAP_GROUP_FORTREE_CITY, MAP_ID_FORTREE_CITY, 7}, - {MAP_GROUP_LILYCOVE_CITY, MAP_ID_LILYCOVE_CITY, 8}, - {MAP_GROUP_MOSSDEEP_CITY, MAP_ID_MOSSDEEP_CITY, 9}, - {MAP_GROUP_SOOTOPOLIS_CITY, MAP_ID_SOOTOPOLIS_CITY, 10}, - {MAP_GROUP_EVER_GRANDE_CITY, MAP_ID_EVER_GRANDE_CITY, 11}, - {MAP_GROUP_ROUTE101, MAP_ID_ROUTE101, 0}, - {MAP_GROUP_ROUTE102, MAP_ID_ROUTE102, 0}, - {MAP_GROUP_ROUTE103, MAP_ID_ROUTE103, 0}, - {MAP_GROUP_ROUTE104, MAP_ID_ROUTE104, 0}, - {MAP_GROUP_ROUTE105, MAP_ID_ROUTE105, 0}, - {MAP_GROUP_ROUTE106, MAP_ID_ROUTE106, 0}, - {MAP_GROUP_ROUTE107, MAP_ID_ROUTE107, 0}, - {MAP_GROUP_ROUTE108, MAP_ID_ROUTE108, 0}, - {MAP_GROUP_ROUTE109, MAP_ID_ROUTE109, 0}, - {MAP_GROUP_ROUTE110, MAP_ID_ROUTE110, 0}, - {MAP_GROUP_ROUTE111, MAP_ID_ROUTE111, 0}, - {MAP_GROUP_ROUTE112, MAP_ID_ROUTE112, 0}, - {MAP_GROUP_ROUTE113, MAP_ID_ROUTE113, 0}, - {MAP_GROUP_ROUTE114, MAP_ID_ROUTE114, 0}, - {MAP_GROUP_ROUTE115, MAP_ID_ROUTE115, 0}, - {MAP_GROUP_ROUTE116, MAP_ID_ROUTE116, 0}, - {MAP_GROUP_ROUTE117, MAP_ID_ROUTE117, 0}, - {MAP_GROUP_ROUTE118, MAP_ID_ROUTE118, 0}, - {MAP_GROUP_ROUTE119, MAP_ID_ROUTE119, 0}, - {MAP_GROUP_ROUTE120, MAP_ID_ROUTE120, 0}, - {MAP_GROUP_ROUTE121, MAP_ID_ROUTE121, 0}, - {MAP_GROUP_ROUTE122, MAP_ID_ROUTE122, 0}, - {MAP_GROUP_ROUTE123, MAP_ID_ROUTE123, 0}, - {MAP_GROUP_ROUTE124, MAP_ID_ROUTE124, 0}, - {MAP_GROUP_ROUTE125, MAP_ID_ROUTE125, 0}, - {MAP_GROUP_ROUTE126, MAP_ID_ROUTE126, 0}, - {MAP_GROUP_ROUTE127, MAP_ID_ROUTE127, 0}, - {MAP_GROUP_ROUTE128, MAP_ID_ROUTE128, 0}, - {MAP_GROUP_ROUTE129, MAP_ID_ROUTE129, 0}, - {MAP_GROUP_ROUTE130, MAP_ID_ROUTE130, 0}, - {MAP_GROUP_ROUTE131, MAP_ID_ROUTE131, 0}, - {MAP_GROUP_ROUTE132, MAP_ID_ROUTE132, 0}, - {MAP_GROUP_ROUTE133, MAP_ID_ROUTE133, 0}, - {MAP_GROUP_ROUTE134, MAP_ID_ROUTE134, 0} + {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 1}, + {MAP_GROUP(OLDALE_TOWN), MAP_NUM(OLDALE_TOWN), 14}, + {MAP_GROUP(DEWFORD_TOWN), MAP_NUM(DEWFORD_TOWN), 15}, + {MAP_GROUP(LAVARIDGE_TOWN), MAP_NUM(LAVARIDGE_TOWN), 16}, + {MAP_GROUP(FALLARBOR_TOWN), MAP_NUM(FALLARBOR_TOWN), 17}, + {MAP_GROUP(VERDANTURF_TOWN), MAP_NUM(VERDANTURF_TOWN), 18}, + {MAP_GROUP(PACIFIDLOG_TOWN), MAP_NUM(PACIFIDLOG_TOWN), 19}, + {MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), 3}, + {MAP_GROUP(SLATEPORT_CITY), MAP_NUM(SLATEPORT_CITY), 4}, + {MAP_GROUP(MAUVILLE_CITY), MAP_NUM(MAUVILLE_CITY), 5}, + {MAP_GROUP(RUSTBORO_CITY), MAP_NUM(RUSTBORO_CITY), 6}, + {MAP_GROUP(FORTREE_CITY), MAP_NUM(FORTREE_CITY), 7}, + {MAP_GROUP(LILYCOVE_CITY), MAP_NUM(LILYCOVE_CITY), 8}, + {MAP_GROUP(MOSSDEEP_CITY), MAP_NUM(MOSSDEEP_CITY), 9}, + {MAP_GROUP(SOOTOPOLIS_CITY), MAP_NUM(SOOTOPOLIS_CITY), 10}, + {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 11}, + {MAP_GROUP(ROUTE101), MAP_NUM(ROUTE101), 0}, + {MAP_GROUP(ROUTE102), MAP_NUM(ROUTE102), 0}, + {MAP_GROUP(ROUTE103), MAP_NUM(ROUTE103), 0}, + {MAP_GROUP(ROUTE104), MAP_NUM(ROUTE104), 0}, + {MAP_GROUP(ROUTE105), MAP_NUM(ROUTE105), 0}, + {MAP_GROUP(ROUTE106), MAP_NUM(ROUTE106), 0}, + {MAP_GROUP(ROUTE107), MAP_NUM(ROUTE107), 0}, + {MAP_GROUP(ROUTE108), MAP_NUM(ROUTE108), 0}, + {MAP_GROUP(ROUTE109), MAP_NUM(ROUTE109), 0}, + {MAP_GROUP(ROUTE110), MAP_NUM(ROUTE110), 0}, + {MAP_GROUP(ROUTE111), MAP_NUM(ROUTE111), 0}, + {MAP_GROUP(ROUTE112), MAP_NUM(ROUTE112), 0}, + {MAP_GROUP(ROUTE113), MAP_NUM(ROUTE113), 0}, + {MAP_GROUP(ROUTE114), MAP_NUM(ROUTE114), 0}, + {MAP_GROUP(ROUTE115), MAP_NUM(ROUTE115), 0}, + {MAP_GROUP(ROUTE116), MAP_NUM(ROUTE116), 0}, + {MAP_GROUP(ROUTE117), MAP_NUM(ROUTE117), 0}, + {MAP_GROUP(ROUTE118), MAP_NUM(ROUTE118), 0}, + {MAP_GROUP(ROUTE119), MAP_NUM(ROUTE119), 0}, + {MAP_GROUP(ROUTE120), MAP_NUM(ROUTE120), 0}, + {MAP_GROUP(ROUTE121), MAP_NUM(ROUTE121), 0}, + {MAP_GROUP(ROUTE122), MAP_NUM(ROUTE122), 0}, + {MAP_GROUP(ROUTE123), MAP_NUM(ROUTE123), 0}, + {MAP_GROUP(ROUTE124), MAP_NUM(ROUTE124), 0}, + {MAP_GROUP(ROUTE125), MAP_NUM(ROUTE125), 0}, + {MAP_GROUP(ROUTE126), MAP_NUM(ROUTE126), 0}, + {MAP_GROUP(ROUTE127), MAP_NUM(ROUTE127), 0}, + {MAP_GROUP(ROUTE128), MAP_NUM(ROUTE128), 0}, + {MAP_GROUP(ROUTE129), MAP_NUM(ROUTE129), 0}, + {MAP_GROUP(ROUTE130), MAP_NUM(ROUTE130), 0}, + {MAP_GROUP(ROUTE131), MAP_NUM(ROUTE131), 0}, + {MAP_GROUP(ROUTE132), MAP_NUM(ROUTE132), 0}, + {MAP_GROUP(ROUTE133), MAP_NUM(ROUTE133), 0}, + {MAP_GROUP(ROUTE134), MAP_NUM(ROUTE134), 0} }; static const u8 *const gUnknown_085A1ED4[] = { @@ -873,10 +871,10 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void) u16 xOnMap; struct WarpData *storedWarp; - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_SS_TIDAL_CORRIDOR - && (gSaveBlock1Ptr->location.mapNum == MAP_ID_SS_TIDAL_CORRIDOR - || gSaveBlock1Ptr->location.mapNum == MAP_ID_SS_TIDAL_LOWER_DECK - || gSaveBlock1Ptr->location.mapNum == MAP_ID_SS_TIDAL_ROOMS)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SS_TIDAL_CORRIDOR) + && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SS_TIDAL_CORRIDOR) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SS_TIDAL_LOWER_DECK) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SS_TIDAL_ROOMS))) { RegionMap_InitializeStateBasedOnSSTidalLocation(); return; @@ -1334,9 +1332,9 @@ void CreateRegionMapCursor(u16 tileTag, u16 paletteTag) gRegionMap->cursorSprite->pos1.x = 8 * gRegionMap->cursorPosX + 4; gRegionMap->cursorSprite->pos1.y = 8 * gRegionMap->cursorPosY + 4; } - gRegionMap->cursorSprite->data1 = 2; - gRegionMap->cursorSprite->data2 = (IndexOfSpritePaletteTag(paletteTag) << 4) + 0x101; - gRegionMap->cursorSprite->data3 = TRUE; + gRegionMap->cursorSprite->data[1] = 2; + gRegionMap->cursorSprite->data[2] = (IndexOfSpritePaletteTag(paletteTag) << 4) + 0x101; + gRegionMap->cursorSprite->data[3] = TRUE; } } @@ -1352,12 +1350,12 @@ static void FreeRegionMapCursorSprite(void) void sub_8124268(void) { - gRegionMap->cursorSprite->data3 = TRUE; + gRegionMap->cursorSprite->data[3] = TRUE; } void sub_8124278(void) { - gRegionMap->cursorSprite->data3 = FALSE; + gRegionMap->cursorSprite->data[3] = FALSE; } void CreateRegionMapPlayerIcon(u16 tileTag, u16 paletteTag) @@ -1431,17 +1429,17 @@ static void RegionMapPlayerIconSpriteCallback_Zoomed(struct Sprite *sprite) { sprite->pos2.x = -2 * gRegionMap->scrollX; sprite->pos2.y = -2 * gRegionMap->scrollY; - sprite->data0 = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - sprite->data1 = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - if (sprite->data0 < -8 || sprite->data0 > 0xa8 || sprite->data1 < -8 || sprite->data1 > 0xf8) + sprite->data[0] = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + sprite->data[1] = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + if (sprite->data[0] < -8 || sprite->data[0] > 0xa8 || sprite->data[1] < -8 || sprite->data[1] > 0xf8) { - sprite->data2 = FALSE; + sprite->data[2] = FALSE; } else { - sprite->data2 = TRUE; + sprite->data[2] = TRUE; } - if (sprite->data2 == TRUE) + if (sprite->data[2] == TRUE) { RegionMapPlayerIconSpriteCallback(sprite); } @@ -1460,9 +1458,9 @@ static void RegionMapPlayerIconSpriteCallback(struct Sprite *sprite) { if (gRegionMap->blinkPlayerIcon) { - if (++sprite->data7 > 16) + if (++sprite->data[7] > 16) { - sprite->data7 = 0; + sprite->data[7] = 0; sprite->invisible = sprite->invisible ? FALSE : TRUE; } } @@ -1792,7 +1790,7 @@ static void sub_8124AD4(void) shape += 3; } StartSpriteAnim(&gSprites[spriteId], shape); - gSprites[spriteId].data0 = i; + gSprites[spriteId].data[0] = i; } canFlyFlag++; } @@ -1822,7 +1820,7 @@ static void sub_8124BE4(void) gSprites[spriteId].oam.size = 1; gSprites[spriteId].callback = sub_8124CBC; StartSpriteAnim(&gSprites[spriteId], 6); - gSprites[spriteId].data0 = mapSecId; + gSprites[spriteId].data[0] = mapSecId; } } } @@ -1830,17 +1828,17 @@ static void sub_8124BE4(void) static void sub_8124CBC(struct Sprite *sprite) { - if (gUnknown_0203A148->regionMap.mapSecId == sprite->data0) + if (gUnknown_0203A148->regionMap.mapSecId == sprite->data[0]) { - if (++sprite->data1 > 16) + if (++sprite->data[1] > 16) { - sprite->data1 = 0; + sprite->data[1] = 0; sprite->invisible = sprite->invisible ? FALSE : TRUE; } } else { - sprite->data1 = 16; + sprite->data[1] = 16; sprite->invisible = FALSE; } } diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 3177a8946..a034ca089 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -10,7 +10,7 @@ #include "battle_controllers.h" #include "link.h" #include "sprite.h" -#include "species.h" +#include "constants/species.h" #include "battle_interface.h" extern u16 gBattle_BG0_X; @@ -42,7 +42,7 @@ extern u8 GetBankSpriteDefault_Y(u8 bank); extern u8 sub_80A82E4(u8 bank); extern void sub_806A068(u16 species, u8 bankIdentity); extern void sub_806A12C(u16 backPicId, u8 bankIdentity); -extern u8 sub_80A5C6C(u8 bank, u8 caseId); +extern u8 GetBankPosition(u8 bank, u8 caseId); // this file's functions static void CB2_ReshowBattleScreenAfterMenu(void); @@ -260,11 +260,11 @@ static void CreateBankSprite(u8 bank) return; sub_806A068(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank)); - gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(bank, 2), posY, sub_80A82E4(bank)); + gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, GetBankPosition(bank, 2), posY, sub_80A82E4(bank)); gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gBankSpriteIds[bank]].data0 = bank; - gSprites[gBankSpriteIds[bank]].data2 = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES); StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_CASTFORM) @@ -278,7 +278,7 @@ static void CreateBankSprite(u8 bank) sub_80A82E4(0)); gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gBankSpriteIds[bank]].data0 = bank; + gSprites[gBankSpriteIds[bank]].data[0] = bank; } else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0) { @@ -288,7 +288,7 @@ static void CreateBankSprite(u8 bank) sub_80A82E4(0)); gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gBankSpriteIds[bank]].data0 = bank; + gSprites[gBankSpriteIds[bank]].data[0] = bank; } else { @@ -296,11 +296,11 @@ static void CreateBankSprite(u8 bank) return; sub_806A068(GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank)); - gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(bank, 2), posY, sub_80A82E4(bank)); + gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, GetBankPosition(bank, 2), posY, sub_80A82E4(bank)); gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; - gSprites[gBankSpriteIds[bank]].data0 = bank; - gSprites[gBankSpriteIds[bank]].data2 = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_CASTFORM) diff --git a/src/roamer.c b/src/roamer.c index cbe1b6312..fbd25bfad 100644 --- a/src/roamer.c +++ b/src/roamer.c @@ -1,8 +1,8 @@ #include "global.h" #include "roamer.h" #include "pokemon.h" -#include "rng.h" -#include "species.h" +#include "random.h" +#include "constants/species.h" #include "event_data.h" enum diff --git a/src/safari_zone.c b/src/safari_zone.c index d3d40af28..f1d59907d 100644 --- a/src/safari_zone.c +++ b/src/safari_zone.c @@ -1,7 +1,7 @@ #include "global.h" #include "safari_zone.h" #include "event_data.h" -#include "game_stat.h" +#include "constants/game_stat.h" #include "main.h" #include "battle.h" #include "string_util.h" @@ -105,7 +105,7 @@ void SafariZoneRetirePrompt(void) ScriptContext1_SetupScript(EventScript_2A4B6F); } -void sub_80FC190(void) +void CB2_EndSafariBattle(void) { sSafariZoneFleedMons += gBattleResults.field_1F; if (gBattleOutcome == BATTLE_CAUGHT) diff --git a/src/save.c b/src/save.c index 528c67145..023ca6870 100644 --- a/src/save.c +++ b/src/save.c @@ -1,7 +1,7 @@ #include "global.h" #include "gba/flash_internal.h" #include "save.h" -#include "game_stat.h" +#include "constants/game_stat.h" #include "task.h" extern struct SaveSectionLocation gRamSaveSectionLocations[0xE]; diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c index 3f49b89e6..ef01f0293 100755 --- a/src/save_failed_screen.c +++ b/src/save_failed_screen.c @@ -13,8 +13,6 @@ #define MSG_WIN_TOP 12 #define CLOCK_WIN_TOP (MSG_WIN_TOP - 4) -extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, u8 *str); - extern void (*gGameContinueCallback)(void); extern u32 gDamagedSaveSectors; diff --git a/src/save_location.c b/src/save_location.c index 61a5fd30d..262aaf40c 100755 --- a/src/save_location.c +++ b/src/save_location.c @@ -1,9 +1,6 @@ #include "global.h" #include "save_location.h" -#include "map_constants.h" - -// used to make the list defines a little less ugly. -#define MAP(name) ((MAP_GROUP_##name << 8) + (MAP_ID_##name)) +#include "constants/maps.h" // specialSaveWarp flags #define POKECENTER_SAVEWARP (1 << 1) @@ -29,44 +26,44 @@ static bool32 IsCurMapInLocationList(const u16 *list) // TODO: Not require a packed u16 array for these lists static const u16 sSaveLocationPokeCenterList[] = { - MAP(OLDALE_TOWN_POKEMON_CENTER_1F), - MAP(OLDALE_TOWN_POKEMON_CENTER_2F), - MAP(DEWFORD_TOWN_POKEMON_CENTER_1F), - MAP(DEWFORD_TOWN_POKEMON_CENTER_2F), - MAP(LAVARIDGE_TOWN_POKEMON_CENTER_1F), - MAP(LAVARIDGE_TOWN_POKEMON_CENTER_2F), - MAP(FALLARBOR_TOWN_POKEMON_CENTER_1F), - MAP(FALLARBOR_TOWN_POKEMON_CENTER_2F), - MAP(VERDANTURF_TOWN_POKEMON_CENTER_1F), - MAP(VERDANTURF_TOWN_POKEMON_CENTER_2F), - MAP(PACIFIDLOG_TOWN_POKEMON_CENTER_1F), - MAP(PACIFIDLOG_TOWN_POKEMON_CENTER_2F), - MAP(PETALBURG_CITY_POKEMON_CENTER_1F), - MAP(PETALBURG_CITY_POKEMON_CENTER_2F), - MAP(SLATEPORT_CITY_POKEMON_CENTER_1F), - MAP(SLATEPORT_CITY_POKEMON_CENTER_2F), - MAP(MAUVILLE_CITY_POKEMON_CENTER_1F), - MAP(MAUVILLE_CITY_POKEMON_CENTER_2F), - MAP(RUSTBORO_CITY_POKEMON_CENTER_1F), - MAP(RUSTBORO_CITY_POKEMON_CENTER_2F), - MAP(FORTREE_CITY_POKEMON_CENTER_1F), - MAP(FORTREE_CITY_POKEMON_CENTER_2F), - MAP(LILYCOVE_CITY_POKEMON_CENTER_1F), - MAP(LILYCOVE_CITY_POKEMON_CENTER_2F), - MAP(MOSSDEEP_CITY_POKEMON_CENTER_1F), - MAP(MOSSDEEP_CITY_POKEMON_CENTER_2F), - MAP(SOOTOPOLIS_CITY_POKEMON_CENTER_1F), - MAP(SOOTOPOLIS_CITY_POKEMON_CENTER_2F), - MAP(EVER_GRANDE_CITY_POKEMON_CENTER_1F), - MAP(EVER_GRANDE_CITY_POKEMON_CENTER_2F), - MAP(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), - MAP(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), - MAP(BATTLE_FRONTIER_POKEMON_CENTER_1F), - MAP(BATTLE_FRONTIER_POKEMON_CENTER_2F), - MAP(SINGLE_BATTLE_COLOSSEUM), - MAP(TRADE_CENTER), - MAP(RECORD_CORNER), - MAP(DOUBLE_BATTLE_COLOSSEUM), + MAP_OLDALE_TOWN_POKEMON_CENTER_1F, + MAP_OLDALE_TOWN_POKEMON_CENTER_2F, + MAP_DEWFORD_TOWN_POKEMON_CENTER_1F, + MAP_DEWFORD_TOWN_POKEMON_CENTER_2F, + MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F, + MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F, + MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F, + MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F, + MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F, + MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F, + MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F, + MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F, + MAP_PETALBURG_CITY_POKEMON_CENTER_1F, + MAP_PETALBURG_CITY_POKEMON_CENTER_2F, + MAP_SLATEPORT_CITY_POKEMON_CENTER_1F, + MAP_SLATEPORT_CITY_POKEMON_CENTER_2F, + MAP_MAUVILLE_CITY_POKEMON_CENTER_1F, + MAP_MAUVILLE_CITY_POKEMON_CENTER_2F, + MAP_RUSTBORO_CITY_POKEMON_CENTER_1F, + MAP_RUSTBORO_CITY_POKEMON_CENTER_2F, + MAP_FORTREE_CITY_POKEMON_CENTER_1F, + MAP_FORTREE_CITY_POKEMON_CENTER_2F, + MAP_LILYCOVE_CITY_POKEMON_CENTER_1F, + MAP_LILYCOVE_CITY_POKEMON_CENTER_2F, + MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F, + MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F, + MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F, + MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F, + MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F, + MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F, + MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F, + MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F, + MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F, + MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F, + MAP_SINGLE_BATTLE_COLOSSEUM, + MAP_TRADE_CENTER, + MAP_RECORD_CORNER, + MAP_DOUBLE_BATTLE_COLOSSEUM, 0xFFFF, }; @@ -77,7 +74,7 @@ static bool32 IsCurMapPokeCenter(void) static const u16 sSaveLocationReloadLocList[] = // there's only 1 location, and it's presumed its for the save reload feature for battle tower { - MAP(BATTLE_TOWER_LOBBY), + MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY, 0xFFFF, }; diff --git a/src/scrcmd.c b/src/scrcmd.c index 183b9bab5..1b10501fc 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -34,7 +34,7 @@ #include "party_menu.h" #include "pokemon_3.h" #include "pokemon_storage_system.h" -#include "rng.h" +#include "random.h" #include "overworld.h" #include "rtc.h" #include "script.h" @@ -656,7 +656,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx) bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx) { u8 mode = ScriptReadByte(ctx); - + switch (mode) { case 1: @@ -1445,7 +1445,7 @@ bool8 ScrCmd_drawboxtext(struct ScriptContext *ctx) u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); u8 ignoreBPress = ScriptReadByte(ctx); - + /*if (Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) { ScriptContext1_Stop(); @@ -1501,31 +1501,31 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) u8 y; StringExpandPlaceholders(gStringVar4, ptr + 6); - + width = GetStringWidth(6, gStringVar4, -1) / 8; - + if (width > 0x1C) width = 0x1C; - + for (i = 0, height = 4; gStringVar4[i] != 0xFF;) { if (gStringVar4[i++] == 0xFE) height += 3; } - + if (height > 0x12) height = 0x12; - + x = width + 2; temp1 = (0x1E - x) / 2; x = temp1 + 1; temp1 = ((x - temp1 - 1) * 8 + 3); - + y = height + 2; temp2 = (0x14 - y) / 2; y = temp2 + 2; temp2 = ((y - temp2 - 1) * 8); - + sub_8198A50(&template1, 0, x, y, width, height, 0xF, 0x1); template2 = template1; gUnknown_03000F30 = AddWindow(&template2); @@ -1924,7 +1924,7 @@ bool8 ScrCmd_hidemoneybox(struct ScriptContext *ctx) { /*u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx);*/ - + HideMoneyBox(); return FALSE; } @@ -1979,13 +1979,13 @@ bool8 ScrCmd_dotrainerbattle(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_ontrainerbattleend(struct ScriptContext *ctx) +bool8 ScrCmd_gotopostbattlescript(struct ScriptContext *ctx) { ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle(); return FALSE; } -bool8 ScrCmd_ontrainerbattleendgoto(struct ScriptContext *ctx) +bool8 ScrCmd_gotobeatenscript(struct ScriptContext *ctx) { ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript(); return FALSE; @@ -1995,7 +1995,7 @@ bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); - ctx->comparisonResult = HasTrainerAlreadyBeenFought(index); + ctx->comparisonResult = HasTrainerBeenFought(index); return FALSE; } @@ -2003,7 +2003,7 @@ bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); - trainer_flag_set(index); + SetTrainerFlag(index); return FALSE; } @@ -2011,7 +2011,7 @@ bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); - trainer_flag_clear(index); + ClearTrainerFlag(index); return FALSE; } @@ -2374,7 +2374,7 @@ bool8 ScrCmd_checkmonobedience(struct ScriptContext *ctx) bool8 ScrCmd_cmdCF(struct ScriptContext *ctx) { const u8* v1 = sub_8099244(); - + if (v1) { ((u8*)gUnknown_020375C0) = ctx->scriptPtr; diff --git a/src/secret_base.c b/src/secret_base.c index de2b7221a..cc320e5d7 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -1,6 +1,7 @@ // Includes #include "global.h" +#include "constants/decorations.h" #include "malloc.h" #include "task.h" #include "palette.h" @@ -10,8 +11,8 @@ #include "menu_helpers.h" #include "new_menu_helpers.h" #include "menu_indicators.h" -#include "map_constants.h" -#include "songs.h" +#include "constants/maps.h" +#include "constants/songs.h" #include "sound.h" #include "overworld.h" #include "fieldmap.h" @@ -89,30 +90,30 @@ const struct { }; const u8 gUnknown_0858CFE8[] = { - MAP_ID_SECRET_BASE_RED_CAVE1, 0x00, 0x01, 0x03, - MAP_ID_SECRET_BASE_RED_CAVE2, 0x00, 0x05, 0x09, - MAP_ID_SECRET_BASE_RED_CAVE3, 0x00, 0x01, 0x03, - MAP_ID_SECRET_BASE_RED_CAVE4, 0x00, 0x07, 0x0d, - MAP_ID_SECRET_BASE_BROWN_CAVE1, 0x00, 0x02, 0x03, - MAP_ID_SECRET_BASE_BROWN_CAVE2, 0x00, 0x09, 0x02, - MAP_ID_SECRET_BASE_BROWN_CAVE3, 0x00, 0x0d, 0x04, - MAP_ID_SECRET_BASE_BROWN_CAVE4, 0x00, 0x01, 0x02, - MAP_ID_SECRET_BASE_BLUE_CAVE1, 0x00, 0x01, 0x03, - MAP_ID_SECRET_BASE_BLUE_CAVE2, 0x00, 0x01, 0x02, - MAP_ID_SECRET_BASE_BLUE_CAVE3, 0x00, 0x03, 0x0f, - MAP_ID_SECRET_BASE_BLUE_CAVE4, 0x00, 0x03, 0x0e, - MAP_ID_SECRET_BASE_YELLOW_CAVE1, 0x00, 0x09, 0x03, - MAP_ID_SECRET_BASE_YELLOW_CAVE2, 0x00, 0x08, 0x07, - MAP_ID_SECRET_BASE_YELLOW_CAVE3, 0x00, 0x03, 0x06, - MAP_ID_SECRET_BASE_YELLOW_CAVE4, 0x00, 0x05, 0x09, - MAP_ID_SECRET_BASE_TREE1, 0x00, 0x02, 0x03, - MAP_ID_SECRET_BASE_TREE2, 0x00, 0x05, 0x06, - MAP_ID_SECRET_BASE_TREE3, 0x00, 0x0f, 0x03, - MAP_ID_SECRET_BASE_TREE4, 0x00, 0x04, 0x0a, - MAP_ID_SECRET_BASE_SHRUB1, 0x00, 0x03, 0x03, - MAP_ID_SECRET_BASE_SHRUB2, 0x00, 0x01, 0x02, - MAP_ID_SECRET_BASE_SHRUB3, 0x00, 0x07, 0x08, - MAP_ID_SECRET_BASE_SHRUB4, 0x00, 0x09, 0x06 + MAP_NUM(SECRET_BASE_RED_CAVE1), 0x00, 0x01, 0x03, + MAP_NUM(SECRET_BASE_RED_CAVE2), 0x00, 0x05, 0x09, + MAP_NUM(SECRET_BASE_RED_CAVE3), 0x00, 0x01, 0x03, + MAP_NUM(SECRET_BASE_RED_CAVE4), 0x00, 0x07, 0x0d, + MAP_NUM(SECRET_BASE_BROWN_CAVE1), 0x00, 0x02, 0x03, + MAP_NUM(SECRET_BASE_BROWN_CAVE2), 0x00, 0x09, 0x02, + MAP_NUM(SECRET_BASE_BROWN_CAVE3), 0x00, 0x0d, 0x04, + MAP_NUM(SECRET_BASE_BROWN_CAVE4), 0x00, 0x01, 0x02, + MAP_NUM(SECRET_BASE_BLUE_CAVE1), 0x00, 0x01, 0x03, + MAP_NUM(SECRET_BASE_BLUE_CAVE2), 0x00, 0x01, 0x02, + MAP_NUM(SECRET_BASE_BLUE_CAVE3), 0x00, 0x03, 0x0f, + MAP_NUM(SECRET_BASE_BLUE_CAVE4), 0x00, 0x03, 0x0e, + MAP_NUM(SECRET_BASE_YELLOW_CAVE1), 0x00, 0x09, 0x03, + MAP_NUM(SECRET_BASE_YELLOW_CAVE2), 0x00, 0x08, 0x07, + MAP_NUM(SECRET_BASE_YELLOW_CAVE3), 0x00, 0x03, 0x06, + MAP_NUM(SECRET_BASE_YELLOW_CAVE4), 0x00, 0x05, 0x09, + MAP_NUM(SECRET_BASE_TREE1), 0x00, 0x02, 0x03, + MAP_NUM(SECRET_BASE_TREE2), 0x00, 0x05, 0x06, + MAP_NUM(SECRET_BASE_TREE3), 0x00, 0x0f, 0x03, + MAP_NUM(SECRET_BASE_TREE4), 0x00, 0x04, 0x0a, + MAP_NUM(SECRET_BASE_SHRUB1), 0x00, 0x03, 0x03, + MAP_NUM(SECRET_BASE_SHRUB2), 0x00, 0x01, 0x02, + MAP_NUM(SECRET_BASE_SHRUB3), 0x00, 0x07, 0x08, + MAP_NUM(SECRET_BASE_SHRUB4), 0x00, 0x09, 0x06 }; const struct MenuAction gUnknown_0858D048[] = { @@ -360,7 +361,7 @@ void sub_80E8F9C(void) s8 idx; idx = sCurSecretBaseId / 10 * 4; - warp1_set_2(MAP_GROUP_SECRET_BASE_RED_CAVE1, gUnknown_0858CFE8[idx], gUnknown_0858CFE8[idx + 1]); + warp1_set_2(MAP_GROUP(SECRET_BASE_RED_CAVE1), gUnknown_0858CFE8[idx], gUnknown_0858CFE8[idx + 1]); } void sub_80E8FD0(u8 taskId) @@ -455,7 +456,7 @@ void sub_80E91F8(void) bool8 CurrentMapIsSecretBase(void) { - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_SECRET_BASE_RED_CAVE1 && (u8)gSaveBlock1Ptr->location.mapNum <= MAP_ID_SECRET_BASE_SHRUB4) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SECRET_BASE_RED_CAVE1) && (u8)gSaveBlock1Ptr->location.mapNum <= MAP_NUM(SECRET_BASE_SHRUB4)) { return TRUE; } @@ -1282,7 +1283,7 @@ u8 sub_80EA20C(u8 secretBaseRecordId) return (gSaveBlock1Ptr->secretBases[secretBaseRecordId].trainerId[0] % 5) + (gSaveBlock1Ptr->secretBases[secretBaseRecordId].gender * 5); } -const u8 *sub_80EA250(void) +const u8 *GetSecretBaseTrainerLoseText(void) { u8 param; diff --git a/src/sound.c b/src/sound.c index a95511ece..086fede67 100644 --- a/src/sound.c +++ b/src/sound.c @@ -5,7 +5,7 @@ #include "m4a.h" #include "main.h" #include "pokemon.h" -#include "songs.h" +#include "constants/songs.h" #include "task.h" struct Fanfare diff --git a/src/sprite.c b/src/sprite.c index daa019019..9db61d2e9 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -168,14 +168,7 @@ static const struct Sprite sDummySprite = .animPaused = 0, .affineAnimPaused = 0, .animLoopCounter = 0, - .data0 = 0, - .data1 = 0, - .data2 = 0, - .data3 = 0, - .data4 = 0, - .data5 = 0, - .data6 = 0, - .data7 = 0, + .data = {0, 0, 0, 0, 0, 0, 0}, .inUse = 0, .coordOffsetEnabled = 0, .invisible = 0, @@ -1075,7 +1068,7 @@ void BeginAffineAnim(struct Sprite *sprite) ApplyAffineAnimFrame(matrixNum, &frameCmd); sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; if (sprite->flags_f) - obj_update_pos2(sprite, sprite->data6, sprite->data7); + obj_update_pos2(sprite, sprite->data[6], sprite->data[7]); } } @@ -1101,7 +1094,7 @@ void ContinueAffineAnim(struct Sprite *sprite) sAffineAnimCmdFuncs[funcIndex](matrixNum, sprite); } if (sprite->flags_f) - obj_update_pos2(sprite, sprite->data6, sprite->data7); + obj_update_pos2(sprite, sprite->data[6], sprite->data[7]); } } @@ -1197,8 +1190,8 @@ u8 GetSpriteMatrixNum(struct Sprite *sprite) void sub_8007E18(struct Sprite* sprite, s16 a2, s16 a3) { - sprite->data6 = a2; - sprite->data7 = a3; + sprite->data[6] = a2; + sprite->data[7] = a3; sprite->flags_f = 1; } diff --git a/src/starter_choose.c b/src/starter_choose.c index 8cf3cfefa..2d78af8fb 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -12,7 +12,7 @@ #include "decompress.h" #include "menu.h" #include "sound.h" -#include "songs.h" +#include "constants/songs.h" #include "event_data.h" #include "pokedex.h" #include "data2.h" @@ -170,20 +170,20 @@ void CB2_ChooseStarter(void) // Create hand sprite spriteId = CreateSprite(&sSpriteTemplate_Hand, 120, 56, 2); - gSprites[spriteId].data0 = taskId; + gSprites[spriteId].data[0] = taskId; // Create three Pokeball sprites spriteId = CreateSprite(&sSpriteTemplate_PokeBall, sPokeballCoords[0][0], sPokeballCoords[0][1], 2); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = 0; + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 0; spriteId = CreateSprite(&sSpriteTemplate_PokeBall, sPokeballCoords[1][0], sPokeballCoords[1][1], 2); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = 1; + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 1; spriteId = CreateSprite(&sSpriteTemplate_PokeBall, sPokeballCoords[2][0], sPokeballCoords[2][1], 2); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = 2; + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 2; sStarterChooseWindowId = 0xFF; } @@ -265,7 +265,7 @@ static void Task_StarterChoose5(u8 taskId) { u8 spriteId; - switch (sub_8198C58()) + switch (ProcessMenuInputNoWrap_()) { case 0: // YES // Return the starter choice and exit. @@ -363,15 +363,15 @@ static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y) static void sub_81346DC(struct Sprite *sprite) { - sprite->pos1.x = gUnknown_085B1E28[gTasks[sprite->data0].tStarterSelection][0]; - sprite->pos1.y = gUnknown_085B1E28[gTasks[sprite->data0].tStarterSelection][1]; - sprite->pos2.y = Sin(sprite->data1, 8); - sprite->data1 = (u8)(sprite->data1) + 4; + sprite->pos1.x = gUnknown_085B1E28[gTasks[sprite->data[0]].tStarterSelection][0]; + sprite->pos1.y = gUnknown_085B1E28[gTasks[sprite->data[0]].tStarterSelection][1]; + sprite->pos2.y = Sin(sprite->data[1], 8); + sprite->data[1] = (u8)(sprite->data[1]) + 4; } static void sub_813473C(struct Sprite *sprite) { - if (gTasks[sprite->data0].tStarterSelection == sprite->data1) + if (gTasks[sprite->data[0]].tStarterSelection == sprite->data[1]) StartSpriteAnimIfDifferent(sprite, 1); else StartSpriteAnimIfDifferent(sprite, 0); diff --git a/src/text.c b/src/text.c index 8108a6867..a13ed162d 100644 --- a/src/text.c +++ b/src/text.c @@ -13,7 +13,7 @@ extern void CopyWindowToVram(u8 windowId, u8 mode); extern u16 Font6Func(struct TextPrinter *textPrinter); extern u32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese); extern void PlaySE(u16 songNum); -extern u8* sub_81AFC74(u8 a1); +extern u8* UnkTextUtil_GetPtrI(u8 a1); EWRAM_DATA struct TextPrinter gTempTextPrinter = {0}; EWRAM_DATA struct TextPrinter gTextPrinters[NUM_TEXT_PRINTERS] = {0}; @@ -190,7 +190,7 @@ bool16 AddTextPrinter(struct TextSubPrinter *textSubPrinter, u8 speed, void (*ca gTempTextPrinter.japanese = 0; GenerateFontHalfRowLookupTable(textSubPrinter->fontColor_h, textSubPrinter->bgColor, textSubPrinter->shadowColor); - if (speed != 0xFF && speed != 0x0) + if (speed != TEXT_SPEED_FF && speed != 0x0) { --gTempTextPrinter.text_speed; gTextPrinters[textSubPrinter->windowId] = gTempTextPrinter; @@ -204,7 +204,7 @@ bool16 AddTextPrinter(struct TextSubPrinter *textSubPrinter, u8 speed, void (*ca break; } - if (speed != 0xFF) + if (speed != TEXT_SPEED_FF) CopyWindowToVram(gTempTextPrinter.subPrinter.windowId, 2); gTextPrinters[textSubPrinter->windowId].sub_union.sub.active = 0; } @@ -2932,7 +2932,7 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) } case 0xF7: if (bufferPointer == NULL) - bufferPointer = sub_81AFC74(*++str); + bufferPointer = UnkTextUtil_GetPtrI(*++str); while (*bufferPointer != 0xFF) { glyphWidth = func(*bufferPointer++, isJapanese); diff --git a/src/trainer_see.c b/src/trainer_see.c new file mode 100644 index 000000000..b30f27347 --- /dev/null +++ b/src/trainer_see.c @@ -0,0 +1,68 @@ +#include "global.h" +#include "trainer_see.h" +#include "battle_setup.h" + +extern u8 gApproachingTrainerId; +extern u8 gNoOfApproachingTrainers; +extern u8 gUnknown_030060AC; +extern u16 gUnknown_03006080; + +// this file's functions +u8 CheckIfTrainerWantsBattle(u8 mapObjectId); + +bool8 CheckForTrainersWantingBattle(void) +{ + u8 i; + + gNoOfApproachingTrainers = 0; + gApproachingTrainerId = 0; + + for (i = 0; i < MAP_OBJECTS_COUNT; i++) + { + u8 retVal; + + if (!gMapObjects[i].active) + continue; + if (gMapObjects[i].trainerType != 1 && gMapObjects[i].trainerType != 3) + continue; + + retVal = CheckIfTrainerWantsBattle(i); + if (retVal == 2) + break; // two trainers have been found + + if (retVal == 0) // no trainers + continue; + + if (gNoOfApproachingTrainers > 1) + break; + if (GetMonsStateToDoubles_2() != 0) // one trainer found and cant have a double battle + break; + } + + if (gNoOfApproachingTrainers == 1) + { + ResetTrainerOpponentIds(); + ConfigureAndSetUpOneTrainerBattle(gApproachingTrainers[gNoOfApproachingTrainers - 1].mapObjectId, + gApproachingTrainers[gNoOfApproachingTrainers - 1].trainerScriptPtr); + gUnknown_030060AC = 1; + return TRUE; + } + else if (gNoOfApproachingTrainers == 2) + { + ResetTrainerOpponentIds(); + for (i = 0; i < gNoOfApproachingTrainers; i++, gApproachingTrainerId++) + { + ConfigureTwoTrainersBattle(gApproachingTrainers[i].mapObjectId, + gApproachingTrainers[i].trainerScriptPtr); + } + SetUpTwoTrainersBattle(); + gApproachingTrainerId = 0; + gUnknown_030060AC = 1; + return TRUE; + } + else + { + gUnknown_030060AC = 0; + return FALSE; + } +} @@ -3,8 +3,8 @@ #include "global.h" #include "rtc.h" #include "overworld.h" -#include "map_constants.h" -#include "rng.h" +#include "constants/maps.h" +#include "random.h" #include "event_data.h" #include "fieldmap.h" #include "field_camera.h" @@ -14,12 +14,12 @@ #include "pokemon_storage_system.h" #include "field_message_box.h" #include "easy_chat.h" -#include "species.h" -#include "moves.h" +#include "constants/species.h" +#include "constants/moves.h" #include "battle.h" #include "battle_tower.h" #include "contest.h" -#include "items.h" +#include "constants/items.h" #include "item.h" #include "link.h" #include "main.h" @@ -38,6 +38,9 @@ #include "secret_base.h" #include "tv.h" +extern const u8 gSpeciesNames[][11]; +extern const u8 gMoveNames[][13]; + // Static type declarations #define rbernoulli(num, den) TV_BernoulliTrial(0xFFFF * (num) / (den)) @@ -832,7 +835,7 @@ void UpdateTVScreensOnMap(int width, int height) case 2: break; default: - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F && gSaveBlock1Ptr->location.mapNum == MAP_ID_LILYCOVE_CITY_COVE_LILY_MOTEL_1F) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_COVE_LILY_MOTEL_1F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_COVE_LILY_MOTEL_1F)) { SetTVMetatilesOnMap(width, height, 0x3); } @@ -1575,7 +1578,9 @@ void SaveRecordedItemPurchasesForTVShow(void) TVShow *show; u8 i; - if (!(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_TRAINER_HILL_LOBBY && gSaveBlock1Ptr->location.mapNum == MAP_ID_TRAINER_HILL_LOBBY) && !(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_BATTLE_FRONTIER_MART && gSaveBlock1Ptr->location.mapNum == MAP_ID_BATTLE_FRONTIER_MART) && !rbernoulli(1, 3)) + if (!(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_HILL_ENTRANCE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_HILL_ENTRANCE)) + && !(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_MART) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_MART)) + && !rbernoulli(1, 3)) { sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SMART_SHOPPER, FALSE) != TRUE) @@ -1788,7 +1793,7 @@ void EndMassOutbreak(void) gSaveBlock1Ptr->outbreakDaysLeft = 0; } -void sub_80ED888(u16 days) +void UpdateTVShowsPerDay(u16 days) { sub_80ED8B4(days); @@ -2959,13 +2964,13 @@ bool8 IsPriceDiscounted(u8 newsKind) switch (newsKind) { case POKENEWS_SLATEPORT: - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_SLATEPORT_CITY && gSaveBlock1Ptr->location.mapNum == MAP_ID_SLATEPORT_CITY && gSpecialVar_LastTalked == 25) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SLATEPORT_CITY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SLATEPORT_CITY) && gSpecialVar_LastTalked == 25) { return TRUE; } return FALSE; case POKENEWS_LILYCOVE: - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP && gSaveBlock1Ptr->location.mapNum == MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP)) { return TRUE; } @@ -3694,20 +3699,20 @@ u32 GetPlayerIDAsU32(void) u8 CheckForBigMovieOrEmergencyNewsOnTV(void) { - if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) + if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) { return 0; } if (gSaveBlock2Ptr->playerGender == MALE) { - if (gSaveBlock1Ptr->location.mapNum != MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) + if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) { return 0; } } else { - if (gSaveBlock1Ptr->location.mapNum != MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F) + if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F)) { return 0; } @@ -3725,11 +3730,11 @@ u8 CheckForBigMovieOrEmergencyNewsOnTV(void) void GetMomOrDadStringForTVMessage(void) { - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) { if (gSaveBlock2Ptr->playerGender == MALE) { - if (gSaveBlock1Ptr->location.mapNum == MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) + if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) { StringCopy(gStringVar1, gText_Mom); VarSet(VAR_0x4003, 1); @@ -3737,7 +3742,7 @@ void GetMomOrDadStringForTVMessage(void) } else { - if (gSaveBlock1Ptr->location.mapNum == MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F) + if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F)) { StringCopy(gStringVar1, gText_Mom); VarSet(VAR_0x4003, 1); diff --git a/src/unk_81BAD84.c b/src/unk_81BAD84.c new file mode 100644 index 000000000..9ba98dd87 --- /dev/null +++ b/src/unk_81BAD84.c @@ -0,0 +1,47 @@ +#include "global.h" +#include "graphics.h" + +const struct { + const u8 *gfx; + const u8 *tileMap; + const u16 *pltt; +} gUnknown_08617128[] = { + { + gUnknown_08DD87C0, + gUnknown_08DD8EE0, + gUnknown_08DD8780 + }, { + gUnknown_08DD90E0, + gUnknown_08DD9718, + gUnknown_08DD9080 + }, { + gUnknown_08DD98B4, + gUnknown_08DD9E58, + gUnknown_08DD9874 + }, { + gUnknown_08DDA02C, + gUnknown_08DDA63C, + gUnknown_08DD9FEC + }, { + gUnknown_08DDA840, + gUnknown_08DDAE40, + gUnknown_08DDA800 + }, { + gUnknown_08DDB020, + gUnknown_08DDB2C4, + gUnknown_08DDAFE0 + } +}; + +void sub_81BAD84(u32 idx) +{ + REG_DISPCNT = 0x0000; + REG_BG0HOFS = 0x0000; + REG_BG0VOFS = 0x0000; + REG_BLDCNT = 0x0000; + LZ77UnCompVram(gUnknown_08617128[idx].gfx, (void *)BG_CHAR_ADDR(0)); + LZ77UnCompVram(gUnknown_08617128[idx].tileMap, (void *)BG_SCREEN_ADDR(31)); + CpuCopy16(gUnknown_08617128[idx].pltt, (void *)PLTT, 0x200); + REG_BG0CNT = 0x1f00; + REG_DISPCNT = DISPCNT_BG0_ON; +} diff --git a/src/unk_text_util.c b/src/unk_text_util.c new file mode 100644 index 000000000..2773522b2 --- /dev/null +++ b/src/unk_text_util.c @@ -0,0 +1,56 @@ +#include "global.h" +#include "text.h" +#include "unk_text_util.h" +#include "string_util.h" + +static EWRAM_DATA const u8 *sStringPointers[8] = {}; + +void UnkTextUtil_Reset(void) +{ + const u8 **ptr; + u8 *fillval; + const u8 **ptr2; + + ptr = sStringPointers; + fillval = NULL; + ptr2 = ptr + (ARRAY_COUNT(sStringPointers) - 1); + do + { + *ptr2-- = fillval; + } while ((int)ptr2 >= (int)ptr); +} + +void UnkTextUtil_SetPtrI(u8 idx, const u8 *ptr) +{ + if (idx < ARRAY_COUNT(sStringPointers)) + { + sStringPointers[idx] = ptr; + } +} + +u8 *UnkTextUtil_StringExpandPlaceholders(u8 *dest, const u8 *src) +{ + while (*src != EOS) + { + if (*src != CHAR_SPECIAL_F7) + { + *dest++ = *src++; + } + else + { + src++; + if (sStringPointers[*src] != NULL) + { + dest = StringCopy(dest, sStringPointers[*src]); + } + src++; + } + } + *dest = EOS; + return dest; +} + +const u8 *UnkTextUtil_GetPtrI(u8 idx) +{ + return sStringPointers[idx]; +} diff --git a/src/wallclock.c b/src/wallclock.c new file mode 100644 index 000000000..892ef3f05 --- /dev/null +++ b/src/wallclock.c @@ -0,0 +1,1057 @@ +#include "global.h" +#include "main.h" +#include "palette.h" +#include "gpu_regs.h" +#include "bg.h" +#include "rtc.h" +#include "clock.h" +#include "wallclock.h" +#include "event_data.h" +#include "graphics.h" +#include "text.h" +#include "window.h" +#include "text_window.h" +#include "menu.h" +#include "unknown_task.h" +#include "task.h" +#include "strings.h" +#include "sound.h" +#include "songs.h" +#include "trig.h" +#include "decompress.h" + +// static types + +#define tMinuteHandAngle data[0] +#define tHourHandAngle data[1] +#define tHours data[2] +#define tMinutes data[3] +#define tMvmtDir data[4] +#define tPeriod data[5] +#define tMvmtSpeed data[6] + +#define TAG_GFX_WALL_CLOCK_HAND 0x1000 +#define TAG_PAL_WALL_CLOCK_HAND 0x1000 + +// static declarations + +static void WallClockMainCallback(void); +static void Task_SetClock1(u8 taskId); +static void Task_SetClock2(u8 taskId); +static void Task_SetClock3(u8 taskId); +static void Task_SetClock4(u8 taskId); +static void Task_SetClock5(u8 taskId); +static void Task_SetClock6(u8 taskId); +static void Task_ViewClock1(u8 taskId); +static void Task_ViewClock2(u8 taskId); +static void Task_ViewClock3(u8 taskId); +static void Task_ViewClock4(u8 taskId); +static u16 CalcNewMinHandAngle(u16 a0, u8 command, u8 a2); +static bool32 AdvanceClock(u8 taskId, u8 command); +static void UpdateClockPeriod(u8 taskId, u8 command); +static void InitClockWithRtc(u8 taskId); +static void SpriteCB_MinuteHand(struct Sprite *sprite); +static void SpriteCB_HourHand(struct Sprite *sprite); +static void SpriteCB_AMIndicator(struct Sprite *sprite); +static void SpriteCB_PMIndicator(struct Sprite *sprite); + +// rodata + +static const u8 gUnknown_085B1F58[] = INCBIN_U8("graphics/wallclock/graphics_85b1f58.4bpp.lz"); +static const u16 gUnknown_085B21D4[] = INCBIN_U16("graphics/wallclock/palette_85b21d4.gbapal"); +static const struct WindowTemplate gUnknown_085B21DC[] = { + { 0x00, 0x03, 0x11, 0x18, 0x02, 0x0e, 0x200 }, + { 0x02, 0x18, 0x10, 0x06, 0x02, 0x0c, 0x230 }, + DUMMY_WIN_TEMPLATE +}; +static const struct WindowTemplate gUnknown_085B21F4 = { + 0x00, 0x18, 0x09, 0x05, 0x04, 0x0e, 0x23c +}; +static const struct BgTemplate gUnknown_085B21FC[] = { + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 31, + .priority = 0 + }, + { + .bg = 2, + .charBaseIndex = 1, + .mapBaseIndex = 8, + .priority = 1 + }, + { + .bg = 3, + .charBaseIndex = 0, + .mapBaseIndex = 7, + .priority = 2 + } +}; +static const struct CompressedSpriteSheet gUnknown_085B2208 = { + gUnknown_085B1F58, 0x2000, TAG_GFX_WALL_CLOCK_HAND +}; +static const u32 filler_85B2210[2] = {}; +static const struct SpritePalette gUnknown_085B2218[] = { + { gUnknown_08DCC01C, TAG_PAL_WALL_CLOCK_HAND }, + { gUnknown_08DCC03C, 0x1001 }, + {} +}; +static const struct OamData Unknown_085B2230 = { + .y = 0xa0, + .size = 3, + .priority = 1 +}; +static const union AnimCmd Unknown_085B2238[] = { + ANIMCMD_FRAME(0, 30), + ANIMCMD_END +}; +static const union AnimCmd Unknown_085B2240[] = { + ANIMCMD_FRAME(64, 30), + ANIMCMD_END +}; +static const union AnimCmd *const gUnknown_085B2248[] = { + Unknown_085B2238 +}; +static const union AnimCmd *const gUnknown_085B224C[] = { + Unknown_085B2240 +}; +static const struct SpriteTemplate gUnknown_085B2250 = { + TAG_GFX_WALL_CLOCK_HAND, + TAG_PAL_WALL_CLOCK_HAND, + &Unknown_085B2230, + gUnknown_085B2248, + NULL, + gDummySpriteAffineAnimTable, + SpriteCB_MinuteHand +}; +static const struct SpriteTemplate gUnknown_085B2268 = { + TAG_GFX_WALL_CLOCK_HAND, + TAG_PAL_WALL_CLOCK_HAND, + &Unknown_085B2230, + gUnknown_085B224C, + NULL, + gDummySpriteAffineAnimTable, + SpriteCB_HourHand +}; +static const struct OamData Unknown_085B2280 = { + .y = 0xa0, + .size = 1, + .priority = 3 +}; +static const union AnimCmd Unknown_085B2288[] = { + ANIMCMD_FRAME(0x84, 30), + ANIMCMD_END +}; +static const union AnimCmd Unknown_085B2290[] = { + ANIMCMD_FRAME(0x80, 30), + ANIMCMD_END +}; +static const union AnimCmd *const gUnknown_085B2298[] = { + Unknown_085B2288 +}; +static const union AnimCmd *const gUnknown_085B229C[] = { + Unknown_085B2290 +}; +static const struct SpriteTemplate gUnknown_085B22A0 = { + TAG_GFX_WALL_CLOCK_HAND, + TAG_PAL_WALL_CLOCK_HAND, + &Unknown_085B2280, + gUnknown_085B2298, + NULL, + gDummySpriteAffineAnimTable, + SpriteCB_AMIndicator +}; +static const struct SpriteTemplate gUnknown_085B22B8 = { + TAG_GFX_WALL_CLOCK_HAND, + TAG_PAL_WALL_CLOCK_HAND, + &Unknown_085B2280, + gUnknown_085B229C, + NULL, + gDummySpriteAffineAnimTable, + SpriteCB_PMIndicator +}; +static const s8 sClockHandCoords[][2] = { + { 0x00, -0x18}, + { 0x01, -0x19}, + { 0x01, -0x19}, + { 0x02, -0x19}, + { 0x02, -0x19}, + { 0x02, -0x19}, + { 0x03, -0x18}, + { 0x03, -0x19}, + { 0x04, -0x19}, + { 0x04, -0x19}, + { 0x04, -0x19}, + { 0x05, -0x19}, + { 0x05, -0x19}, + { 0x06, -0x18}, + { 0x06, -0x18}, + { 0x06, -0x18}, + { 0x07, -0x18}, + { 0x07, -0x18}, + { 0x07, -0x18}, + { 0x08, -0x18}, + { 0x08, -0x18}, + { 0x09, -0x18}, + { 0x09, -0x18}, + { 0x0a, -0x17}, + { 0x0a, -0x17}, + { 0x0b, -0x16}, + { 0x0b, -0x16}, + { 0x0b, -0x16}, + { 0x0c, -0x16}, + { 0x0c, -0x15}, + { 0x0d, -0x15}, + { 0x0d, -0x15}, + { 0x0d, -0x15}, + { 0x0e, -0x15}, + { 0x0e, -0x15}, + { 0x0e, -0x14}, + { 0x0e, -0x14}, + { 0x0f, -0x14}, + { 0x0f, -0x13}, + { 0x10, -0x13}, + { 0x10, -0x13}, + { 0x10, -0x13}, + { 0x10, -0x12}, + { 0x10, -0x12}, + { 0x11, -0x12}, + { 0x11, -0x11}, + { 0x11, -0x11}, + { 0x12, -0x11}, + { 0x12, -0x11}, + { 0x12, -0x10}, + { 0x12, -0x10}, + { 0x13, -0x10}, + { 0x13, -0x0f}, + { 0x13, -0x0f}, + { 0x14, -0x0f}, + { 0x14, -0x0e}, + { 0x14, -0x0e}, + { 0x14, -0x0d}, + { 0x14, -0x0d}, + { 0x15, -0x0d}, + { 0x15, -0x0d}, + { 0x15, -0x0c}, + { 0x16, -0x0c}, + { 0x16, -0x0c}, + { 0x16, -0x0b}, + { 0x16, -0x0b}, + { 0x16, -0x0a}, + { 0x17, -0x0a}, + { 0x17, -0x09}, + { 0x17, -0x09}, + { 0x17, -0x09}, + { 0x17, -0x09}, + { 0x17, -0x08}, + { 0x17, -0x08}, + { 0x17, -0x07}, + { 0x17, -0x07}, + { 0x17, -0x06}, + { 0x18, -0x06}, + { 0x18, -0x06}, + { 0x19, -0x05}, + { 0x19, -0x05}, + { 0x18, -0x04}, + { 0x19, -0x04}, + { 0x18, -0x03}, + { 0x19, -0x03}, + { 0x19, -0x03}, + { 0x19, -0x02}, + { 0x19, -0x02}, + { 0x18, -0x01}, + { 0x19, -0x01}, + { 0x18, 0x00}, + { 0x18, 0x00}, + { 0x18, 0x00}, + { 0x18, 0x01}, + { 0x18, 0x01}, + { 0x19, 0x02}, + { 0x18, 0x02}, + { 0x19, 0x02}, + { 0x18, 0x03}, + { 0x18, 0x03}, + { 0x19, 0x04}, + { 0x18, 0x04}, + { 0x18, 0x05}, + { 0x18, 0x05}, + { 0x18, 0x05}, + { 0x18, 0x06}, + { 0x17, 0x06}, + { 0x17, 0x06}, + { 0x17, 0x07}, + { 0x17, 0x08}, + { 0x17, 0x08}, + { 0x17, 0x08}, + { 0x17, 0x09}, + { 0x17, 0x09}, + { 0x17, 0x0a}, + { 0x16, 0x0a}, + { 0x16, 0x0a}, + { 0x16, 0x0b}, + { 0x16, 0x0b}, + { 0x16, 0x0b}, + { 0x16, 0x0c}, + { 0x15, 0x0c}, + { 0x15, 0x0c}, + { 0x15, 0x0d}, + { 0x14, 0x0d}, + { 0x14, 0x0d}, + { 0x13, 0x0d}, + { 0x13, 0x0d}, + { 0x13, 0x0e}, + { 0x13, 0x0e}, + { 0x13, 0x0f}, + { 0x13, 0x0f}, + { 0x12, 0x0f}, + { 0x12, 0x10}, + { 0x11, 0x10}, + { 0x11, 0x10}, + { 0x11, 0x11}, + { 0x11, 0x11}, + { 0x10, 0x11}, + { 0x10, 0x12}, + { 0x10, 0x12}, + { 0x0f, 0x12}, + { 0x0e, 0x12}, + { 0x0f, 0x13}, + { 0x0e, 0x13}, + { 0x0e, 0x13}, + { 0x0d, 0x13}, + { 0x0d, 0x14}, + { 0x0d, 0x14}, + { 0x0d, 0x14}, + { 0x0c, 0x14}, + { 0x0c, 0x14}, + { 0x0c, 0x15}, + { 0x0b, 0x15}, + { 0x0b, 0x15}, + { 0x0b, 0x15}, + { 0x0a, 0x15}, + { 0x0a, 0x16}, + { 0x0a, 0x16}, + { 0x09, 0x16}, + { 0x09, 0x16}, + { 0x08, 0x16}, + { 0x07, 0x16}, + { 0x07, 0x17}, + { 0x07, 0x17}, + { 0x06, 0x17}, + { 0x06, 0x17}, + { 0x05, 0x17}, + { 0x05, 0x17}, + { 0x05, 0x18}, + { 0x04, 0x18}, + { 0x04, 0x18}, + { 0x04, 0x18}, + { 0x03, 0x18}, + { 0x02, 0x18}, + { 0x02, 0x18}, + { 0x01, 0x18}, + { 0x01, 0x18}, + { 0x00, 0x18}, + { 0x00, 0x18}, + {-0x01, 0x17}, + { 0x00, 0x18}, + { 0x00, 0x18}, + {-0x01, 0x18}, + {-0x01, 0x18}, + {-0x02, 0x18}, + {-0x02, 0x18}, + {-0x03, 0x18}, + {-0x03, 0x18}, + {-0x04, 0x18}, + {-0x04, 0x18}, + {-0x05, 0x18}, + {-0x05, 0x17}, + {-0x05, 0x17}, + {-0x06, 0x17}, + {-0x06, 0x17}, + {-0x07, 0x17}, + {-0x07, 0x17}, + {-0x07, 0x17}, + {-0x08, 0x17}, + {-0x08, 0x16}, + {-0x09, 0x16}, + {-0x09, 0x16}, + {-0x0a, 0x16}, + {-0x0a, 0x16}, + {-0x0a, 0x15}, + {-0x0b, 0x15}, + {-0x0b, 0x15}, + {-0x0b, 0x15}, + {-0x0b, 0x14}, + {-0x0c, 0x14}, + {-0x0c, 0x14}, + {-0x0d, 0x14}, + {-0x0d, 0x14}, + {-0x0d, 0x13}, + {-0x0e, 0x13}, + {-0x0e, 0x13}, + {-0x0e, 0x13}, + {-0x0e, 0x12}, + {-0x0f, 0x12}, + {-0x0f, 0x12}, + {-0x0f, 0x11}, + {-0x10, 0x11}, + {-0x10, 0x11}, + {-0x11, 0x11}, + {-0x11, 0x10}, + {-0x11, 0x10}, + {-0x12, 0x10}, + {-0x11, 0x0f}, + {-0x12, 0x0f}, + {-0x12, 0x0f}, + {-0x13, 0x0f}, + {-0x13, 0x0e}, + {-0x13, 0x0e}, + {-0x13, 0x0d}, + {-0x13, 0x0d}, + {-0x14, 0x0d}, + {-0x14, 0x0c}, + {-0x14, 0x0c}, + {-0x15, 0x0c}, + {-0x15, 0x0c}, + {-0x15, 0x0b}, + {-0x15, 0x0b}, + {-0x15, 0x0a}, + {-0x15, 0x0a}, + {-0x15, 0x09}, + {-0x16, 0x09}, + {-0x16, 0x09}, + {-0x16, 0x08}, + {-0x16, 0x08}, + {-0x16, 0x07}, + {-0x17, 0x07}, + {-0x17, 0x07}, + {-0x17, 0x06}, + {-0x17, 0x06}, + {-0x17, 0x05}, + {-0x18, 0x05}, + {-0x17, 0x04}, + {-0x17, 0x04}, + {-0x18, 0x04}, + {-0x18, 0x04}, + {-0x18, 0x03}, + {-0x18, 0x03}, + {-0x18, 0x02}, + {-0x18, 0x02}, + {-0x18, 0x01}, + {-0x18, 0x01}, + {-0x18, 0x01}, + {-0x18, 0x00}, + {-0x19, 0x00}, + {-0x18, -0x01}, + {-0x19, -0x01}, + {-0x18, -0x01}, + {-0x18, -0x02}, + {-0x18, -0x02}, + {-0x18, -0x03}, + {-0x18, -0x03}, + {-0x18, -0x04}, + {-0x18, -0x04}, + {-0x18, -0x04}, + {-0x18, -0x05}, + {-0x18, -0x05}, + {-0x18, -0x06}, + {-0x18, -0x06}, + {-0x17, -0x06}, + {-0x17, -0x07}, + {-0x17, -0x07}, + {-0x17, -0x08}, + {-0x17, -0x08}, + {-0x17, -0x09}, + {-0x17, -0x09}, + {-0x16, -0x09}, + {-0x16, -0x09}, + {-0x16, -0x0a}, + {-0x16, -0x0a}, + {-0x15, -0x0a}, + {-0x15, -0x0b}, + {-0x16, -0x0b}, + {-0x16, -0x0c}, + {-0x15, -0x0c}, + {-0x15, -0x0d}, + {-0x15, -0x0d}, + {-0x14, -0x0d}, + {-0x15, -0x0e}, + {-0x14, -0x0e}, + {-0x14, -0x0e}, + {-0x13, -0x0e}, + {-0x13, -0x0f}, + {-0x13, -0x0f}, + {-0x12, -0x10}, + {-0x12, -0x10}, + {-0x12, -0x10}, + {-0x12, -0x11}, + {-0x12, -0x11}, + {-0x11, -0x11}, + {-0x11, -0x12}, + {-0x11, -0x12}, + {-0x10, -0x12}, + {-0x10, -0x12}, + {-0x10, -0x13}, + {-0x10, -0x13}, + {-0x0f, -0x13}, + {-0x0f, -0x13}, + {-0x0f, -0x14}, + {-0x0e, -0x14}, + {-0x0e, -0x14}, + {-0x0e, -0x15}, + {-0x0d, -0x15}, + {-0x0d, -0x15}, + {-0x0d, -0x15}, + {-0x0c, -0x15}, + {-0x0c, -0x16}, + {-0x0b, -0x16}, + {-0x0b, -0x16}, + {-0x0b, -0x16}, + {-0x0a, -0x16}, + {-0x0a, -0x16}, + {-0x09, -0x16}, + {-0x09, -0x17}, + {-0x09, -0x17}, + {-0x08, -0x17}, + {-0x08, -0x17}, + {-0x07, -0x17}, + {-0x07, -0x17}, + {-0x07, -0x18}, + {-0x06, -0x18}, + {-0x06, -0x18}, + {-0x05, -0x18}, + {-0x05, -0x18}, + {-0x04, -0x18}, + {-0x04, -0x18}, + {-0x04, -0x18}, + {-0x04, -0x19}, + {-0x03, -0x19}, + {-0x02, -0x19}, + {-0x02, -0x18}, + {-0x02, -0x18}, + {-0x01, -0x19}, + {-0x01, -0x19}, + { 0x00, -0x19} +}; + +// text + +static void WallClockVblankCallback(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void LoadWallClockGraphics(void) +{ + SetVBlankCallback(NULL); + SetGpuReg(REG_OFFSET_DISPCNT, 0x0000); + SetGpuReg(REG_OFFSET_BG3CNT, 0x0000); + SetGpuReg(REG_OFFSET_BG2CNT, 0x0000); + SetGpuReg(REG_OFFSET_BG1CNT, 0x0000); + SetGpuReg(REG_OFFSET_BG0CNT, 0x0000); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); + DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); + DmaClear32(3, (void *)OAM, OAM_SIZE); + DmaClear16(3, (void *)PLTT, PLTT_SIZE); + LZ77UnCompVram(gUnknown_08DCC05C, (void *)VRAM); + if (gSpecialVar_0x8004 == 0) + { + LoadPalette(gUnknown_08DCC01C, 0x00, 0x20); + } + else + { + LoadPalette(gUnknown_08DCC03C, 0x00, 0x20); + } + LoadPalette(GetOverworldTextboxPalettePtr(), 0xe0, 0x20); + LoadPalette(gUnknown_085B21D4, 0xc0, 0x08); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_085B21FC, 3); + InitWindows(gUnknown_085B21DC); + DeactivateAllTextPrinters(); + sub_809882C(0, 0x250, 0xd0); + clear_scheduled_bg_copies_to_vram(); + remove_some_task(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + LoadCompressedObjectPic(&gUnknown_085B2208); + LoadSpritePalettes(gUnknown_085B2218); +} + +static void WallClockInit(void) +{ + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + EnableInterrupts(INTR_FLAG_VBLANK); + SetVBlankCallback(WallClockVblankCallback); + SetMainCallback2(WallClockMainCallback); + SetGpuReg(REG_OFFSET_BLDCNT, 0x0000); + SetGpuReg(REG_OFFSET_BLDALPHA, 0x0000); + SetGpuReg(REG_OFFSET_BLDY, 0x0000); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + ShowBg(0); + ShowBg(2); + ShowBg(3); +} + +void Cb2_StartWallClock(void) +{ + u8 taskId; + u8 spriteId; + + LoadWallClockGraphics(); + LZ77UnCompVram(gUnknown_08DCC648, (u16 *)BG_SCREEN_ADDR(7)); + + taskId = CreateTask(Task_SetClock1, 0); + gTasks[taskId].tHours = 10; + gTasks[taskId].tMinutes = 0; + gTasks[taskId].tMvmtDir = 0; + gTasks[taskId].tPeriod = 0; + gTasks[taskId].tMvmtSpeed = 0; + gTasks[taskId].tMinuteHandAngle = 0; + gTasks[taskId].tHourHandAngle = 300; + + spriteId = CreateSprite(&gUnknown_085B2250, 0x78, 0x50, 1); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 0; + + spriteId = CreateSprite(&gUnknown_085B2268, 0x78, 0x50, 0); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 1; + + spriteId = CreateSprite(&gUnknown_085B22A0, 0x78, 0x50, 2); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 45; + + spriteId = CreateSprite(&gUnknown_085B22B8, 0x78, 0x50, 2); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 90; + + WallClockInit(); + + PrintTextOnWindow(1, 1, gText_Confirm3, 0, 1, 0, NULL); + PutWindowTilemap(1); + schedule_bg_copy_tilemap_to_vram(2); +} + +void Cb2_ViewWallClock(void) +{ + u8 taskId; + u8 spriteId; + u8 angle1; + u8 angle2; + + LoadWallClockGraphics(); + LZ77UnCompVram(gUnknown_08DCC908, (u16 *)BG_SCREEN_ADDR(7)); + + taskId = CreateTask(Task_ViewClock1, 0); + InitClockWithRtc(taskId); + if (gTasks[taskId].tPeriod == 0) + { + angle1 = 45; + angle2 = 90; + } + else + { + angle1 = 90; + angle2 = 135; + } + + spriteId = CreateSprite(&gUnknown_085B2250, 0x78, 0x50, 1); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 0; + + spriteId = CreateSprite(&gUnknown_085B2268, 0x78, 0x50, 0); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 1; + + spriteId = CreateSprite(&gUnknown_085B22A0, 0x78, 0x50, 2); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = angle1; + + spriteId = CreateSprite(&gUnknown_085B22B8, 0x78, 0x50, 2); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = angle2; + + WallClockInit(); + + PrintTextOnWindow(1, 1, gText_Cancel4, 0, 1, 0, NULL); + PutWindowTilemap(1); + schedule_bg_copy_tilemap_to_vram(2); +} + +static void WallClockMainCallback(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + do_scheduled_bg_tilemap_copies_to_vram(); + UpdatePaletteFade(); +} + +static void Task_SetClock1(u8 taskId) +{ + if (!gPaletteFade.active) + { + gTasks[taskId].func = Task_SetClock2; + } +} + +static void Task_SetClock2(u8 taskId) +{ + if (gTasks[taskId].tMinuteHandAngle % 6) + { + gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle(gTasks[taskId].tMinuteHandAngle, gTasks[taskId].tMvmtDir, gTasks[taskId].tMvmtSpeed); + } + else + { + gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6; + gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5; + if (gMain.newKeys & A_BUTTON) + { + gTasks[taskId].func = Task_SetClock3; + } + else + { + gTasks[taskId].tMvmtDir = 0; + if (gMain.heldKeys & DPAD_LEFT) + { + gTasks[taskId].tMvmtDir = 1; + } + if (gMain.heldKeys & DPAD_RIGHT) + { + gTasks[taskId].tMvmtDir = 2; + } + if (gTasks[taskId].tMvmtDir != 0) + { + if (gTasks[taskId].tMvmtSpeed < 0xFF) + { + gTasks[taskId].tMvmtSpeed++; + } + gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle(gTasks[taskId].tMinuteHandAngle, gTasks[taskId].tMvmtDir, gTasks[taskId].tMvmtSpeed); + AdvanceClock(taskId, gTasks[taskId].tMvmtDir); + } + else + { + gTasks[taskId].tMvmtSpeed = 0; + } + } + } +} + +static void Task_SetClock3(u8 taskId) +{ + SetWindowBorderStyle(0, FALSE, 0x250, 0x0d); + PrintTextOnWindow(0, 1, gText_IsThisTheCorrectTime, 0, 1, 0, NULL); + PutWindowTilemap(0); + schedule_bg_copy_tilemap_to_vram(0); + CreateYesNoMenu(&gUnknown_085B21F4, 0x250, 0x0d, 1); + gTasks[taskId].func = Task_SetClock4; +} + +static void Task_SetClock4(u8 taskId) +{ + switch (ProcessMenuInputNoWrap_()) + { + case 0: + PlaySE(SE_SELECT); + gTasks[taskId].func = Task_SetClock5; + break; + case 1: + case -1: + PlaySE(SE_SELECT); + sub_8198070(0, FALSE); + ClearWindowTilemap(0); + gTasks[taskId].func = Task_SetClock2; + break; + } +} + +static void Task_SetClock5(u8 taskId) +{ + RtcInitLocalTimeOffset(gTasks[taskId].tHours, gTasks[taskId].tMinutes); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = Task_SetClock6; +} + +static void Task_SetClock6(u8 taskId) +{ + if (!gPaletteFade.active) + { + FreeAllWindowBuffers(); + SetMainCallback2(gMain.savedCallback); + } +} + +static void Task_ViewClock1(u8 taskId) +{ + if (!gPaletteFade.active) + { + gTasks[taskId].func = Task_ViewClock2; + } +} + +static void Task_ViewClock2(u8 taskId) +{ + InitClockWithRtc(taskId); + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + gTasks[taskId].func = Task_ViewClock3; + } +} + +static void Task_ViewClock3(u8 taskId) +{ + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = Task_ViewClock4; +} + +static void Task_ViewClock4(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(gMain.savedCallback); + } +} + +static u8 CalcMinHandDelta(u16 a0) +{ + if (a0 > 60) + { + return 6; + } + if (a0 > 30) + { + return 3; + } + if (a0 > 10) + { + return 2; + } + return 1; +} + +static u16 CalcNewMinHandAngle(u16 a0, u8 command, u8 a2) +{ + u8 r1 = CalcMinHandDelta(a2); + switch (command) + { + case 1: + if (a0) a0 -= r1; + else a0 = 360 - r1; + break; + case 2: + if (a0 < 360 - r1) a0 += r1; + else a0 = 0; + break; + } + return a0; +} + +static bool32 AdvanceClock(u8 taskId, u8 command) +{ + switch (command) + { + case 1: + if (gTasks[taskId].tMinutes > 0) + { + gTasks[taskId].tMinutes--; + } + else + { + gTasks[taskId].tMinutes = 59; + if (gTasks[taskId].tHours > 0) + { + gTasks[taskId].tHours--; + } + else + { + gTasks[taskId].tHours = 23; + } + UpdateClockPeriod(taskId, command); + } + break; + case 2: + if (gTasks[taskId].tMinutes < 59) + { + gTasks[taskId].tMinutes++; + } + else + { + gTasks[taskId].tMinutes = 0; + if (gTasks[taskId].tHours < 23) + { + gTasks[taskId].tHours++; + } + else + { + gTasks[taskId].tHours = 0; + } + UpdateClockPeriod(taskId, command); + } + break; + } + return FALSE; +} + +static void UpdateClockPeriod(u8 taskId, u8 command) +{ + u8 hours = gTasks[taskId].tHours; + switch (command) + { + case 1: + switch (hours) + { + case 11: + gTasks[taskId].tPeriod = FALSE; + break; + case 23: + gTasks[taskId].tPeriod = TRUE; + break; + } + break; + case 2: + switch (hours) + { + case 0: + gTasks[taskId].tPeriod = FALSE; + break; + case 12: + gTasks[taskId].tPeriod = TRUE; + break; + } + break; + } +} + +static void InitClockWithRtc(u8 taskId) +{ + RtcCalcLocalTime(); + gTasks[taskId].tHours = gLocalTime.hours; + gTasks[taskId].tMinutes = gLocalTime.minutes; + gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6; + gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5; + if (gLocalTime.hours < 12) + { + gTasks[taskId].tPeriod = FALSE; + } + else + { + gTasks[taskId].tPeriod = TRUE; + } +} + +static void SpriteCB_MinuteHand(struct Sprite *sprite) +{ + u16 angle = gTasks[sprite->data[0]].tMinuteHandAngle; + s16 sin = Sin2(angle) / 16; + s16 cos = Cos2(angle) / 16; + u16 xhat; + u16 yhat; + + SetOamMatrix(0, cos, sin, -sin, cos); + xhat = sClockHandCoords[angle][0]; + yhat = sClockHandCoords[angle][1]; + + if (xhat > 0x80) + { + xhat |= 0xff00; + } + if (yhat > 0x80) + { + yhat |= 0xff00; + } + sprite->pos2.x = xhat; + sprite->pos2.y = yhat; +} + +static void SpriteCB_HourHand(struct Sprite *sprite) +{ + u16 angle = gTasks[sprite->data[0]].tHourHandAngle; + s16 sin = Sin2(angle) / 16; + s16 cos = Cos2(angle) / 16; + u16 xhat; + u16 yhat; + + SetOamMatrix(1, cos, sin, -sin, cos); + xhat = sClockHandCoords[angle][0]; + yhat = sClockHandCoords[angle][1]; + if (xhat > 0x80) + { + xhat |= 0xff00; + } + if (yhat > 0x80) + { + yhat |= 0xff00; + } + sprite->pos2.x = xhat; + sprite->pos2.y = yhat; +} + +static void SpriteCB_AMIndicator(struct Sprite *sprite) +{ + if (gTasks[sprite->data[0]].tPeriod) + { + if (sprite->data[1] >= 60 && sprite->data[1] < 90) + { + sprite->data[1] += 5; + } + if (sprite->data[1] < 60) + { + sprite->data[1]++; + } + } + else + { + if (sprite->data[1] >= 46 && sprite->data[1] < 76) + { + sprite->data[1] -= 5; + } + if (sprite->data[1] > 75) + { + sprite->data[1]--; + } + } + sprite->pos2.x = Cos2(sprite->data[1]) * 30 / 0x1000; + sprite->pos2.y = Sin2(sprite->data[1]) * 30 / 0x1000; +} + +static void SpriteCB_PMIndicator(struct Sprite *sprite) +{ + if (gTasks[sprite->data[0]].tPeriod) + { + if (sprite->data[1] >= 105 && sprite->data[1] < 135) + { + sprite->data[1] += 5; + } + if (sprite->data[1] < 105) + { + sprite->data[1]++; + } + } + else + { + if (sprite->data[1] >= 91 && sprite->data[1] < 121) + { + sprite->data[1] -= 5; + } + if (sprite->data[1] > 120) + { + sprite->data[1]--; + } + } + sprite->pos2.x = Cos2(sprite->data[1]) * 30 / 0x1000; + sprite->pos2.y = Sin2(sprite->data[1]) * 30 / 0x1000; +} diff --git a/src/wild_encounter.c b/src/wild_encounter.c index ce1e02e5e..705c4416c 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -1,23 +1,24 @@ #include "global.h" #include "wild_encounter.h" #include "pokemon.h" -#include "species.h" +#include "constants/species.h" #include "metatile_behavior.h" #include "fieldmap.h" -#include "rng.h" -#include "map_constants.h" +#include "random.h" +#include "constants/maps.h" #include "field_player_avatar.h" -#include "abilities.h" +#include "constants/abilities.h" #include "event_data.h" #include "safari_zone.h" +#include "overworld.h" #include "pokeblock.h" #include "battle_setup.h" #include "roamer.h" -#include "game_stat.h" +#include "constants/game_stat.h" #include "tv.h" #include "link.h" #include "script.h" -#include "items.h" +#include "constants/items.h" extern const u8 EventScript_RepelWoreOff[]; @@ -84,8 +85,8 @@ static bool8 CheckFeebas(void) u8 route119Section = 0; u16 waterTileNum; - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_ROUTE119 - && gSaveBlock1Ptr->location.mapNum == MAP_ID_ROUTE119) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE119) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE119)) { GetXYCoordsOneStepInFrontOfPlayer(&x, &y); x -= 7; @@ -283,8 +284,8 @@ static u16 GetCurrentMapWildMonHeaderId(void) if (gWildMonHeaders[i].mapGroup == gSaveBlock1Ptr->location.mapGroup && gWildMonHeaders[i].mapNum == gSaveBlock1Ptr->location.mapNum) { - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_ALTERING_CAVE && - gSaveBlock1Ptr->location.mapNum == MAP_ID_ALTERING_CAVE) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ALTERING_CAVE) && + gSaveBlock1Ptr->location.mapNum == MAP_NUM(ALTERING_CAVE)) { u16 alteringCaveId = VarGet(VAR_ALTERING_CAVE_WILD_SET); if (alteringCaveId > 8) @@ -513,8 +514,8 @@ static bool8 DoGlobalWildEncounterDiceRoll(void) static bool8 AreLegendariesInSootopolisPreventingEncounters(void) { - if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP_SOOTOPOLIS_CITY - || gSaveBlock1Ptr->location.mapNum != MAP_ID_SOOTOPOLIS_CITY) + if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(SOOTOPOLIS_CITY) + || gSaveBlock1Ptr->location.mapNum != MAP_NUM(SOOTOPOLIS_CITY)) { return FALSE; } |