From 19ea13caa791c55d2ae6990179a6d06e3d9d618e Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Thu, 9 Jan 2025 01:04:49 +0100 Subject: [PATCH] sync battle.h --- include/battle.h | 339 +++++++++++++++++++----------------------- src/battle_anim_ice.c | 4 +- src/battle_message.c | 4 +- 3 files changed, 157 insertions(+), 190 deletions(-) diff --git a/include/battle.h b/include/battle.h index 3801ba94c..b05d95e32 100644 --- a/include/battle.h +++ b/include/battle.h @@ -1,6 +1,9 @@ #ifndef GUARD_BATTLE_H #define GUARD_BATTLE_H +// should they be included here or included individually by every file? +#include "constants/battle.h" +#include "constants/form_change_types.h" #include "battle_main.h" #include "battle_message.h" #include "battle_util.h" @@ -9,14 +12,13 @@ #include "battle_gfx_sfx_util.h" #include "battle_util2.h" #include "battle_bg.h" +#include "pokeball.h" #include "battle_debug.h" #include "battle_dynamax.h" #include "battle_terastal.h" #include "battle_gimmick.h" -#include "pokeball.h" +#include "move.h" #include "random.h" // for rng_value_t -#include "constants/battle.h" -#include "constants/form_change_types.h" // Helper for accessing command arguments and advancing gBattlescriptCurrInstr. // @@ -38,49 +40,36 @@ #define VARIOUS_ARGS(...) CMD_ARGS(u8 battler, u8 id, ##__VA_ARGS__) #define NATIVE_ARGS(...) CMD_ARGS(void (*func)(void), ##__VA_ARGS__) -/* - Banks are a name given to what could be called a 'battlerId' or 'monControllerId'. - Each bank has a value consisting of two bits. - 0x1 bit is responsible for the side, 0 = player's side, 1 = opponent's side. - 0x2 bit is responsible for the id of sent out pokemon. 0 means it's the first sent out pokemon, 1 it's the second one. (Triple battle didn't exist at the time yet.) -*/ - -#define GET_BATTLER_POSITION(battler)((gBattlerPositions[battler])) -#define GET_BATTLER_SIDE(battler)((GetBattlerPosition(battler) & BIT_SIDE)) -#define GET_BATTLER_SIDE2(battler)((GET_BATTLER_POSITION(battler) & BIT_SIDE)) - // Used to exclude moves learned temporarily by Transform or Mimic #define MOVE_IS_PERMANENT(battler, moveSlot) \ (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) \ - && !(gDisableStructs[battler].mimickedMoves & gBitTable[moveSlot])) + && !(gDisableStructs[battler].mimickedMoves & (1u << moveSlot))) // Battle Actions // These determine what each battler will do in a turn -#define B_ACTION_USE_MOVE 0 -#define B_ACTION_USE_ITEM 1 -#define B_ACTION_SWITCH 2 -#define B_ACTION_RUN 3 -#define B_ACTION_SAFARI_WATCH_CAREFULLY 4 -#define B_ACTION_SAFARI_BALL 5 -#define B_ACTION_SAFARI_BAIT 6 -#define B_ACTION_SAFARI_GO_NEAR 7 -#define B_ACTION_SAFARI_RUN 8 -#define B_ACTION_OLDMAN_THROW 9 -#define B_ACTION_EXEC_SCRIPT 10 -#define B_ACTION_TRY_FINISH 11 -#define B_ACTION_FINISHED 12 -#define B_ACTION_CANCEL_PARTNER 12 // when choosing an action -#define B_ACTION_NOTHING_FAINTED 13 // when choosing an action -#define B_ACTION_DEBUG 20 -#define B_ACTION_THROW_BALL 21 // R to throw last used ball -#define B_ACTION_NONE 0xFF +#define B_ACTION_USE_MOVE 0 +#define B_ACTION_USE_ITEM 1 +#define B_ACTION_SWITCH 2 +#define B_ACTION_RUN 3 +#define B_ACTION_SAFARI_WATCH_CAREFULLY 4 +#define B_ACTION_SAFARI_BALL 5 +#define B_ACTION_SAFARI_BAIT 6 +#define B_ACTION_SAFARI_GO_NEAR 7 +#define B_ACTION_SAFARI_RUN 8 +#define B_ACTION_OLDMAN_THROW 9 +#define B_ACTION_EXEC_SCRIPT 10 +#define B_ACTION_TRY_FINISH 11 +#define B_ACTION_FINISHED 12 +#define B_ACTION_CANCEL_PARTNER 12 // when choosing an action +#define B_ACTION_NOTHING_FAINTED 13 // when choosing an action +#define B_ACTION_DEBUG 20 +#define B_ACTION_THROW_BALL 21 // R to throw last used ball +#define B_ACTION_NONE 0xFF +#define BATTLE_BUFFER_LINK_SIZE 0x1000 // Special indicator value for shellBellDmg in SpecialStatus #define IGNORE_SHELL_BELL 0xFFFF -#define GET_MOVE_BATTLESCRIPT(move) gBattleMoveEffects[gMovesInfo[move].effect].battleScript // TODO: remove - -extern const struct Trainer gTrainers[]; struct ResourceFlags { @@ -91,7 +80,7 @@ struct ResourceFlags #define RESOURCE_FLAG_ROOST 0x2 #define RESOURCE_FLAG_UNBURDEN 0x4 #define RESOURCE_FLAG_UNUSED 0x8 -#define RESOURCE_FLAG_TRACED 0x10 +#define RESOURCE_FLAG_UNUSED_2 0x10 #define RESOURCE_FLAG_EMERGENCY_EXIT 0x20 #define RESOURCE_FLAG_NEUTRALIZING_GAS 0x40 #define RESOURCE_FLAG_ICE_FACE 0x80 @@ -153,8 +142,6 @@ struct DisableStruct u16 overwrittenAbility; // abilities overwritten during battle (keep separate from battle history in case of switching) }; -extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT]; - struct ProtectStruct { u32 protected:1; @@ -179,14 +166,15 @@ struct ProtectStruct u32 flag2Unknown:1; // Only set to 0 once. Checked in 'WasUnableToUseMove' function. u32 flinchImmobility:1; u32 notFirstStrike:1; + u32 unused1:1; u32 usedHealBlockedMove:1; u32 usedGravityPreventedMove:1; u32 powderSelfDmg:1; u32 usedThroatChopPreventedMove:1; u32 statRaised:1; - u32 usedMicleBerry:1; u32 usedCustapBerry:1; // also quick claw u32 touchedProtectLike:1; + u32 unused:1; // End of 32-bit bitfield u16 disableEjectPack:1; u16 statFell:1; @@ -201,19 +189,14 @@ struct ProtectStruct u16 eatMirrorHerb:1; u16 activateOpportunist:2; // 2 - to copy stats. 1 - stats copied (do not repeat). 0 - no stats to copy u16 usedAllySwitch:1; + u16 padding:2; + // End of 16-bit bitfield u32 physicalDmg; u32 specialDmg; u8 physicalBattlerId; u8 specialBattlerId; - // pokefirered - /* field_0 */ - /* field_1 */ - u32 targetNotAffected:1; - /* field_2 */ }; -extern struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT]; - struct SpecialStatus { s32 shellBellDmg; @@ -259,8 +242,6 @@ struct SpecialStatus u8 criticalHit:1; }; -extern struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT]; - struct SideTimer { u8 reflectTimer; @@ -296,8 +277,6 @@ struct SideTimer u8 swampTimer; }; -extern struct SideTimer gSideTimers[]; - struct FieldTimer { u8 mudSportTimer; @@ -315,17 +294,13 @@ struct WishFutureKnock u8 futureSightCounter[MAX_BATTLERS_COUNT]; u8 futureSightBattlerIndex[MAX_BATTLERS_COUNT]; u8 futureSightPartyIndex[MAX_BATTLERS_COUNT]; - u8 futureSightAttacker[MAX_BATTLERS_COUNT]; // pokefirered, remove - s32 futureSightDmg[MAX_BATTLERS_COUNT]; // pokefirered, remove u16 futureSightMove[MAX_BATTLERS_COUNT]; u8 wishCounter[MAX_BATTLERS_COUNT]; u8 wishPartyId[MAX_BATTLERS_COUNT]; u8 weatherDuration; - u8 knockedOffMons[NUM_BATTLE_SIDES]; + u8 knockedOffMons[NUM_BATTLE_SIDES]; // Each battler is represented by a bit. }; -extern struct WishFutureKnock gWishFutureKnock; - struct AI_SavedBattleMon { u16 ability; @@ -443,21 +418,18 @@ struct BattleResources { struct SecretBaseRecord *secretBase; struct ResourceFlags *flags; - struct BattleScriptsStack *battleScriptsStack; - struct BattleCallbacksStack *battleCallbackStack; - struct StatsArray *beforeLvlUp; + struct BattleScriptsStack* battleScriptsStack; + struct BattleCallbacksStack* battleCallbackStack; + struct StatsArray* beforeLvlUp; struct AI_ThinkingStruct *ai; struct AiLogicData *aiData; struct AIPartyData *aiParty; struct BattleHistory *battleHistory; - struct BattleScriptsStack *AI_ScriptsStack; u8 bufferA[MAX_BATTLERS_COUNT][0x200]; u8 bufferB[MAX_BATTLERS_COUNT][0x200]; u8 transferBuffer[0x100]; }; -extern struct BattleResources *gBattleResources; - #define AI_THINKING_STRUCT ((struct AI_ThinkingStruct *)(gBattleResources->ai)) #define AI_DATA ((struct AiLogicData *)(gBattleResources->aiData)) #define AI_PARTY ((struct AIPartyData *)(gBattleResources->aiParty)) @@ -471,27 +443,23 @@ struct BattleResults u8 numHealingItemsUsed; // 0x3 u8 numRevivesUsed; // 0x4 u8 playerMonWasDamaged:1; // 0x5 - u8 usedMasterBall:1; // 0x5 u8 caughtMonBall:4; // 0x5 u8 shinyWildMon:1; // 0x5 - u8 unk5_7:1; // 0x5 u16 playerMon1Species; // 0x6 - u8 playerMon1Name[11]; // 0x8 + u8 playerMon1Name[POKEMON_NAME_LENGTH + 1]; // 0x8 u8 battleTurnCounter; // 0x13 - u8 playerMon2Name[11]; // 0x14 + u8 playerMon2Name[POKEMON_NAME_LENGTH + 1]; // 0x14 u8 pokeblockThrows; // 0x1F u16 lastOpponentSpecies; // 0x20 u16 lastUsedMovePlayer; // 0x22 u16 lastUsedMoveOpponent; // 0x24 u16 playerMon2Species; // 0x26 u16 caughtMonSpecies; // 0x28 - u8 caughtMonNick[10]; // 0x2A - u8 filler34[2]; + u8 caughtMonNick[POKEMON_NAME_LENGTH + 1]; // 0x2A + u8 filler35; // 0x35 u8 catchAttempts[POKEBALL_COUNT]; // 0x36 }; -extern struct BattleResults gBattleResults; - struct LinkBattlerHeader { u8 versionSignatureLo; @@ -501,24 +469,6 @@ struct LinkBattlerHeader struct BattleEnigmaBerry battleEnigmaBerry; }; -struct MegaEvolutionData -{ - u8 toEvolve; // As flags using gBitTable. - bool8 alreadyEvolved[4]; // Array id is used for mon position. - u8 battlerId; - bool8 playerSelect; - u8 triggerSpriteId; -}; - -struct UltraBurstData -{ - u8 toBurst; // As flags using gBitTable. - bool8 alreadyBursted[4]; // Array id is used for mon position. - u8 battlerId; - bool8 playerSelect; - u8 triggerSpriteId; -}; - struct Illusion { u8 on; @@ -638,6 +588,7 @@ struct BattleStruct u8 prevSelectedPartySlot; u8 stringMoveType; u8 absentBattlerFlags; + u8 palaceFlags; // First 4 bits are "is <= 50% HP and not asleep" for each battler, last 4 bits are selected moves to pass to AI u8 field_93; // related to choosing pokemon? u8 simulatedInputState[4]; // used by Oak/Old Man/Pokedude controllers, Wally States/Frames in pokeemerald u16 lastTakenMove[MAX_BATTLERS_COUNT]; // Last move that a battler was hit with. @@ -646,6 +597,7 @@ struct BattleStruct u16 abilityPreventingSwitchout; u8 hpScale; u16 synchronizeMoveEffect; + u8 anyMonHasTransformed:1; // Only used in battle_tv.c u8 multipleSwitchInBattlers:4; // One bit per battler u8 multipleSwitchInState:2; u8 multipleSwitchInCursor:3; @@ -657,6 +609,7 @@ struct BattleStruct u16 changedItems[MAX_BATTLERS_COUNT]; u8 canPickupItem; u8 switchInBattlerCounter; + u8 arenaTurnCounter; u8 turnSideTracker; u16 lastTakenMoveFrom[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT]; // a 2-D array [target][attacker] union { @@ -677,6 +630,11 @@ struct BattleStruct u8 startingStatusTimer; u8 atkCancellerTracker; u8 AI_monToSwitchIntoId[MAX_BATTLERS_COUNT]; + s8 arenaMindPoints[2]; + s8 arenaSkillPoints[2]; + u16 arenaStartHp[2]; + u8 arenaLostPlayerMons; // Bits for party member, lost as in referee's decision, not by fainting. + u8 arenaLostOpponentMons; u8 alreadyStatusedMoveAttempt; // As bits for battlers; For example when using Thunder Wave on an already paralyzed Pokémon. u8 debugBattler; u8 magnitudeBasePower; @@ -797,7 +755,10 @@ struct BattleStruct u8 lastAttackerToFaintOpponent; }; -extern struct BattleStruct *gBattleStruct; +// The palaceFlags member of struct BattleStruct contains 1 flag per move to indicate which moves the AI should consider, +// and 1 flag per battler to indicate whether the battler is awake and at <= 50% HP (which affects move choice). +// The assert below is to ensure palaceFlags is large enough to store these flags without overlap. +STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLERS_COUNT + MAX_MON_MOVES, PalaceFlagsTooSmall) #define DYNAMIC_TYPE_MASK ((1 << 6) - 1) #define F_DYNAMIC_TYPE_IGNORE_PHYSICALITY (1 << 6) // If set, the dynamic type's physicality won't be used for certain move effects. @@ -873,14 +834,14 @@ static inline bool32 IsBattleMoveRecoil(u32 move) || gProtectStructs[battlerId].obstructed \ || gProtectStructs[battlerId].silkTrapped) -#define GET_STAT_BUFF_ID(n)((n & 7)) // first three bits 0x1, 0x2, 0x4 -#define GET_STAT_BUFF_VALUE_WITH_SIGN(n)((n & 0xF8)) -#define GET_STAT_BUFF_VALUE(n)(((n >> 3) & 0xF)) // 0x8, 0x10, 0x20, 0x40 +#define GET_STAT_BUFF_ID(n) ((n & 7)) // first three bits 0x1, 0x2, 0x4 +#define GET_STAT_BUFF_VALUE_WITH_SIGN(n) ((n & 0xF8)) +#define GET_STAT_BUFF_VALUE(n) (((n >> 3) & 0xF)) // 0x8, 0x10, 0x20, 0x40 #define STAT_BUFF_NEGATIVE 0x80 // 0x80, the sign bit -#define SET_STAT_BUFF_VALUE(n)((((n) << 3) & 0xF8)) +#define SET_STAT_BUFF_VALUE(n) ((((n) << 3) & 0xF8)) -#define SET_STATCHANGER(statId, stage, goesDown)(gBattleScripting.statChanger = (statId) + ((stage) << 3) + (goesDown << 7)) +#define SET_STATCHANGER(statId, stage, goesDown) (gBattleScripting.statChanger = (statId) + ((stage) << 3) + (goesDown << 7)) #define SET_STATCHANGER2(dst, statId, stage, goesDown)(dst = (statId) + ((stage) << 3) + (goesDown << 7)) #define DO_ACCURACY_CHECK 2 // Don't skip the accuracy check before the move might be absorbed @@ -931,12 +892,12 @@ struct BattleScripting struct BattleSpriteInfo { - /*0x0*/ u16 invisible : 1; // 0x1 - u16 lowHpSong : 1; // 0x2 - u16 behindSubstitute : 1; // 0x4 - u16 flag_x8 : 1; // 0x8 - u16 hpNumbersNoBars : 1; // 0x10 - /*0x2*/ u16 transformSpecies; + u16 invisible:1; // 0x1 + u16 lowHpSong:1; // 0x2 + u16 behindSubstitute:1; // 0x4 + u16 flag_x8:1; // 0x8 + u16 hpNumbersNoBars:1; // 0x10 + u16 transformSpecies; }; struct BattleAnimationInfo @@ -966,16 +927,16 @@ struct BattleAnimationInfo struct BattleHealthboxInfo { - u8 partyStatusSummaryShown : 1; // x1 - u8 healthboxIsBouncing : 1; // x2 - u8 battlerIsBouncing : 1; // x4 - u8 ballAnimActive : 1; // 0x8 - u8 statusAnimActive : 1; // x10 - u8 animFromTableActive : 1; // x20 - u8 specialAnimActive : 1; // x40 - u8 triedShinyMonAnim : 1; // x80 - u8 finishedShinyMonAnim : 1; // x1 - u8 opponentDrawPartyStatusSummaryDelay : 5; // x2 + u8 partyStatusSummaryShown:1; + u8 healthboxIsBouncing:1; + u8 battlerIsBouncing:1; + u8 ballAnimActive:1; // 0x8 + u8 statusAnimActive:1; // x10 + u8 animFromTableActive:1; // x20 + u8 specialAnimActive:1; // x40 + u8 triedShinyMonAnim:1; + u8 finishedShinyMonAnim:1; + u8 opponentDrawPartyStatusSummaryDelay:4; u8 bgmRestored:1; u8 waitForCry:1; u8 healthboxSlideInStarted:1; @@ -990,6 +951,8 @@ struct BattleHealthboxInfo u8 soundTimer; u8 introEndDelay; + u8 field_A; + u8 field_B; }; struct BattleBarInfo @@ -997,7 +960,7 @@ struct BattleBarInfo u8 healthboxSpriteId; s32 maxValue; s32 oldValue; - s32 receivedValue; // if positive/negative, fills the bar to the left/right respectively + s32 receivedValue; s32 currValue; }; @@ -1009,15 +972,6 @@ struct BattleSpriteData struct BattleBarInfo *battleBars; }; -extern struct BattleSpriteData *gBattleSpritesDataPtr; - -#define BATTLE_BUFFER_LINK_SIZE 0x1000 - -extern u8 *gLinkBattleSendBuffer; -extern u8 *gLinkBattleRecvBuffer; - -// Move this somewhere else - #include "sprite.h" struct MonSpritesGfx @@ -1048,6 +1002,7 @@ struct QueuedStatBoost s8 statChanges[NUM_BATTLE_STATS - 1]; // highest bit being set decreases the stat }; /* size = 8 */ +// All battle variables are declared in battle_main.c extern u16 gBattle_BG0_X; extern u16 gBattle_BG0_Y; extern u16 gBattle_BG1_X; @@ -1060,95 +1015,107 @@ extern u16 gBattle_WIN0H; extern u16 gBattle_WIN0V; extern u16 gBattle_WIN1H; extern u16 gBattle_WIN1V; -extern struct BattleSpritesGfx *gMonSpritesGfx; -extern u8 gBattleOutcome; -extern u16 gLastUsedItem; +extern u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT]; +extern u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT]; +extern u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT + 13]; //to handle stupidly large z move names extern u32 gBattleTypeFlags; -extern struct MonSpritesGfx *gMonSpritesGfxPtr; -extern u16 gMoveToLearn; -extern u16 gBattleMovePower; -extern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT]; +extern u8 gBattleTerrain; +extern u8 *gBattleAnimBgTileBuffer; +extern u8 *gBattleAnimBgTilemapBuffer; +extern u32 gBattleControllerExecFlags; +extern u8 gBattlersCount; +extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT]; +extern u8 gBattlerPositions[MAX_BATTLERS_COUNT]; +extern u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT]; +extern u8 gBattlerByTurnOrder[MAX_BATTLERS_COUNT]; +extern u8 gCurrentTurnActionNumber; +extern u8 gCurrentActionFuncId; +extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT]; +extern u8 gBattlerSpriteIds[MAX_BATTLERS_COUNT]; +extern u8 gCurrMovePos; +extern u8 gChosenMovePos; extern u16 gCurrentMove; extern u16 gChosenMove; extern u16 gCalledMove; -extern u16 gBattleWeather; +extern s32 gBideDmg[MAX_BATTLERS_COUNT]; +extern u16 gLastUsedItem; extern u16 gLastUsedAbility; -extern u8 gBattlerInMenuId; -extern u8 gPotentialItemEffectBattler; -extern u8 gBattlersCount; -extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT]; -extern s32 gBattleMoveDamage; -extern u16 gIntroSlideFlags; -extern u32 gTransformedPersonalities[MAX_BATTLERS_COUNT]; -extern bool8 gTransformedShininess[MAX_BATTLERS_COUNT]; -extern u8 gBattlerPositions[MAX_BATTLERS_COUNT]; -extern u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT]; -extern u8 gBattleOutcome; -extern u32 gBattleControllerExecFlags; -extern u8 gActionSelectionCursor[MAX_BATTLERS_COUNT]; -extern void (*gPreBattleCallback1)(void); -extern bool8 gDoingBattleAnim; -extern struct PokedudeBattlerState *gPokedudeBattlerStates[MAX_BATTLERS_COUNT]; -extern u8 *gBattleAnimBgTileBuffer; -extern u8 *gBattleAnimBgTilemapBuffer; -extern void (*gBattleMainFunc)(void); -extern u8 gMoveSelectionCursor[MAX_BATTLERS_COUNT]; extern u8 gBattlerAttacker; extern u8 gBattlerTarget; -extern u8 gEffectBattler; -extern u8 gMultiHitCounter; -extern struct BattleScripting gBattleScripting; extern u8 gBattlerFainted; -extern u32 gStatuses3[MAX_BATTLERS_COUNT]; -extern u32 gStatuses4[MAX_BATTLERS_COUNT]; -extern u8 gSentPokesToOpponent[2]; +extern u8 gEffectBattler; +extern u8 gPotentialItemEffectBattler; +extern u8 gAbsentBattlerFlags; +extern u8 gMultiHitCounter; extern const u8 *gBattlescriptCurrInstr; +extern u8 gChosenActionByBattler[MAX_BATTLERS_COUNT]; extern const u8 *gSelectionBattleScripts[MAX_BATTLERS_COUNT]; +extern const u8 *gPalaceSelectionBattleScripts[MAX_BATTLERS_COUNT]; +extern u16 gLastPrintedMoves[MAX_BATTLERS_COUNT]; extern u16 gLastMoves[MAX_BATTLERS_COUNT]; -extern u8 gBattlerByTurnOrder[MAX_BATTLERS_COUNT]; -extern u8 gBattleCommunication[BATTLE_COMMUNICATION_ENTRIES_COUNT]; -extern u32 gSideStatuses[NUM_BATTLE_SIDES]; -extern u32 gHitMarker; -extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT]; -extern u8 gCurrentActionFuncId; -extern u8 gCurrMovePos; -extern u8 gChosenMovePos; -extern u8 gBattlerStatusSummaryTaskId[MAX_BATTLERS_COUNT]; extern u16 gLastLandedMoves[MAX_BATTLERS_COUNT]; -extern u8 gLastHitBy[MAX_BATTLERS_COUNT]; -extern u8 gMultiUsePlayerCursor; -extern u8 gNumberOfMovesToChoose; extern u16 gLastHitByType[MAX_BATTLERS_COUNT]; extern u16 gLastUsedMoveType[MAX_BATTLERS_COUNT]; -extern s32 gHpDealt; +extern u16 gLastResultingMoves[MAX_BATTLERS_COUNT]; +extern u16 gLockedMoves[MAX_BATTLERS_COUNT]; +extern u16 gLastUsedMove; +extern u8 gLastHitBy[MAX_BATTLERS_COUNT]; +extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT]; +extern u32 gHitMarker; +extern u8 gBideTarget[MAX_BATTLERS_COUNT]; +extern u32 gSideStatuses[NUM_BATTLE_SIDES]; +extern struct SideTimer gSideTimers[NUM_BATTLE_SIDES]; +extern u32 gStatuses3[MAX_BATTLERS_COUNT]; +extern u32 gStatuses4[MAX_BATTLERS_COUNT]; +extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT]; extern u16 gPauseCounterBattle; extern u16 gPaydayMoney; -extern u16 gLockedMoves[MAX_BATTLERS_COUNT]; -extern u8 gCurrentTurnActionNumber; -extern u8 gLeveledUpInBattle; -extern u16 gLastResultingMoves[MAX_BATTLERS_COUNT]; -extern u16 gLastPrintedMoves[MAX_BATTLERS_COUNT]; -extern u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT]; -extern u8 gChosenActionByBattler[MAX_BATTLERS_COUNT]; -extern u8 gBattleTerrain; -extern u8 gPartyCriticalHits[PARTY_SIZE]; -extern u32 gFieldStatuses; +extern u8 gBattleCommunication[BATTLE_COMMUNICATION_ENTRIES_COUNT]; +extern u8 gBattleOutcome; +extern struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT]; +extern struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT]; +extern u16 gBattleWeather; +extern struct WishFutureKnock gWishFutureKnock; +extern u16 gIntroSlideFlags; +extern u8 gSentPokesToOpponent[2]; +extern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT]; +extern struct BattleScripting gBattleScripting; +extern struct BattleStruct *gBattleStruct; +extern u8 *gLinkBattleSendBuffer; +extern u8 *gLinkBattleRecvBuffer; +extern struct BattleResources *gBattleResources; +extern u8 gActionSelectionCursor[MAX_BATTLERS_COUNT]; +extern u8 gMoveSelectionCursor[MAX_BATTLERS_COUNT]; +extern u8 gBattlerStatusSummaryTaskId[MAX_BATTLERS_COUNT]; +extern u8 gBattlerInMenuId; +extern bool8 gDoingBattleAnim; +extern u32 gTransformedPersonalities[MAX_BATTLERS_COUNT]; +extern bool8 gTransformedShininess[MAX_BATTLERS_COUNT]; extern u8 gPlayerDpadHoldFrames; -extern u8 gBattlerAbility; -extern s32 gBideDmg[MAX_BATTLERS_COUNT]; -extern u8 gBideTarget[MAX_BATTLERS_COUNT]; -extern u16 gLastUsedMove; -extern u8 gIsCriticalHit; +extern struct BattleSpriteData *gBattleSpritesDataPtr; +extern struct MonSpritesGfx *gMonSpritesGfxPtr; +extern u16 gBattleMovePower; +extern u16 gMoveToLearn; +extern u32 gFieldStatuses; extern struct FieldTimer gFieldTimers; +extern u8 gBattlerAbility; +extern struct QueuedStatBoost gQueuedStatBoosts[MAX_BATTLERS_COUNT]; + +extern void (*gPreBattleCallback1)(void); +extern void (*gBattleMainFunc)(void); +extern struct BattleResults gBattleResults; +extern u8 gLeveledUpInBattle; +extern u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT]; +extern u8 gMultiUsePlayerCursor; +extern u8 gNumberOfMovesToChoose; extern bool8 gHasFetchedBall; extern u8 gLastUsedBall; extern u16 gLastThrownBall; extern u16 gBallToDisplay; extern bool8 gLastUsedBallMenuPresent; -extern struct QueuedStatBoost gQueuedStatBoosts[MAX_BATTLERS_COUNT]; -extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT]; -extern u8 gAbsentBattlerFlags; +extern u8 gPartyCriticalHits[PARTY_SIZE]; extern u8 gCategoryIconSpriteId; +extern struct PokedudeBattlerState *gPokedudeBattlerStates[MAX_BATTLERS_COUNT]; static inline bool32 IsBattlerTurnDamaged(u32 battler) { @@ -1217,5 +1184,5 @@ static inline bool32 MoveResultHasEffect(u32 battler) return !(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT); } - #endif // GUARD_BATTLE_H + diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index ce283f383..a6b7fa100 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -1294,7 +1294,7 @@ static void MovePoisonGasCloud(struct Sprite *sprite) ++sprite->data[7]; if (IsContest()) sprite->data[5] = 80; - else if (GET_BATTLER_SIDE2(gBattleAnimTarget) != B_SIDE_PLAYER) + else if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER) sprite->data[5] = 204; else sprite->data[5] = 80; @@ -1338,7 +1338,7 @@ static void MovePoisonGasCloud(struct Sprite *sprite) sprite->data[4] = sprite->y + 4; if (IsContest()) sprite->data[2] = -0x10; - else if (GET_BATTLER_SIDE2(gBattleAnimTarget) != B_SIDE_PLAYER) + else if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER) sprite->data[2] = 0x100; else sprite->data[2] = -0x10; diff --git a/src/battle_message.c b/src/battle_message.c index 0c033b7b6..9f49c7b8e 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -3086,11 +3086,11 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) case B_TXT_ATK_PARTNER_NAME: // attacker partner name if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) GetMonData( - &gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) + + &gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(GetBattlerSide(gBattlerAttacker)) + 2]], MON_DATA_NICKNAME, text); else GetMonData( - &gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) + + &gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(GetBattlerSide(gBattlerAttacker)) + 2]], MON_DATA_NICKNAME, text); StringGet_Nickname(text);