pokeemerald/include/battle.h

723 lines
21 KiB
C
Raw Normal View History

#ifndef GUARD_BATTLE_H
#define GUARD_BATTLE_H
2017-10-06 17:06:45 +02:00
// should they be included here or included individually by every file?
2018-02-08 00:35:13 +01:00
#include "constants/battle.h"
2018-02-26 15:56:59 +01:00
#include "battle_main.h"
2018-06-30 15:35:54 +02:00
#include "battle_message.h"
2017-10-06 17:06:45 +02:00
#include "battle_util.h"
#include "battle_script_commands.h"
2017-10-10 21:45:07 +02:00
#include "battle_ai_switch_items.h"
2017-11-04 16:11:13 +01:00
#include "battle_gfx_sfx_util.h"
2017-11-12 16:39:21 +01:00
#include "battle_util2.h"
2017-12-17 20:10:57 +01:00
#include "battle_bg.h"
#include "pokeball.h"
2017-10-06 17:06:45 +02:00
2018-02-06 02:46:59 +01:00
#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)
2018-01-16 22:12:38 +01:00
// 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]))
2018-02-06 23:09:39 +01:00
// 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_POKEBLOCK 6
#define B_ACTION_SAFARI_GO_NEAR 7
#define B_ACTION_SAFARI_RUN 8
2018-10-14 18:37:52 +02:00
#define B_ACTION_WALLY_THROW 9
2019-02-02 11:32:00 +01:00
#define B_ACTION_EXEC_SCRIPT 10
#define B_ACTION_TRY_FINISH 11
#define B_ACTION_FINISHED 12
2018-02-06 23:09:39 +01:00
#define B_ACTION_CANCEL_PARTNER 12 // when choosing an action
#define B_ACTION_NOTHING_FAINTED 13 // when choosing an action
#define B_ACTION_NONE 0xFF
2017-10-04 19:25:14 +02:00
2021-10-04 16:21:03 +02:00
#define MOVE_TARGET_SELECTED 0
#define MOVE_TARGET_DEPENDS (1 << 0)
#define MOVE_TARGET_USER_OR_SELECTED (1 << 1)
#define MOVE_TARGET_RANDOM (1 << 2)
#define MOVE_TARGET_BOTH (1 << 3)
#define MOVE_TARGET_USER (1 << 4)
#define MOVE_TARGET_FOES_AND_ALLY (1 << 5)
#define MOVE_TARGET_OPPONENTS_FIELD (1 << 6)
// For the second argument of GetMoveTarget, when no target override is needed
#define NO_TARGET_OVERRIDE 0
2017-09-04 21:43:13 +02:00
2018-02-07 23:21:51 +01:00
#define BATTLE_BUFFER_LINK_SIZE 0x1000
2019-04-04 23:53:06 +02:00
struct ResourceFlags
2017-09-04 21:43:13 +02:00
{
u32 flags[4];
};
2019-04-04 23:53:06 +02:00
#define RESOURCE_FLAG_FLASH_FIRE 1
2017-09-04 21:43:13 +02:00
struct DisableStruct
{
u32 transformedMonPersonality;
u16 disabledMove;
u16 encoredMove;
u8 protectUses;
u8 stockpileCounter;
u8 substituteHP;
u8 disableTimer:4;
u8 disableTimerStartValue:4;
u8 encoredMovePos;
u8 filler_D; // Unused field.
u8 encoreTimer:4;
u8 encoreTimerStartValue:4;
u8 perishSongTimer:4;
u8 perishSongTimerStartValue:4;
u8 furyCutterCounter;
u8 rolloutTimer:4;
u8 rolloutTimerStartValue:4;
u8 chargeTimer:4;
u8 chargeTimerStartValue:4;
u8 tauntTimer:4;
u8 tauntTimer2:4;
u8 battlerPreventingEscape;
u8 battlerWithSureHit;
u8 isFirstTurn;
u8 filler_17; // Unused field.
u8 truantCounter:1;
u8 truantSwitchInHack:1;
u8 filler_18_2:2; // Unused field.
u8 mimickedMoves:4;
u8 rechargeTimer;
2017-09-04 21:43:13 +02:00
};
2017-09-17 14:10:32 +02:00
struct ProtectStruct
{
u32 protected:1;
u32 endured:1;
2018-07-07 19:57:09 +02:00
u32 noValidMoves:1;
2017-09-17 14:10:32 +02:00
u32 helpingHand:1;
u32 bounceMove:1;
u32 stealMove:1;
2019-01-29 22:22:02 +01:00
u32 flag0Unknown:1; // Only set to 0 once.
2017-09-17 14:10:32 +02:00
u32 prlzImmobility:1;
u32 confusionSelfDmg:1;
2017-10-06 17:06:45 +02:00
u32 targetNotAffected:1;
2017-09-17 14:10:32 +02:00
u32 chargingTurn:1;
2021-10-04 16:21:03 +02:00
u32 fleeType:2; // 0: Normal, 1: FLEE_ITEM, 2: FLEE_ABILITY
u32 usedImprisonedMove:1;
2017-09-17 14:10:32 +02:00
u32 loveImmobility:1;
u32 usedDisabledMove:1;
2018-10-14 18:10:54 +02:00
u32 usedTauntedMove:1;
2019-01-29 22:22:02 +01:00
u32 flag2Unknown:1; // Only set to 0 once. Checked in 'WasUnableToUseMove' function.
2018-10-14 18:10:54 +02:00
u32 flinchImmobility:1;
u32 notFirstStrike:1;
2019-01-29 22:22:02 +01:00
u32 palaceUnableToUseMove:1;
u32 physicalDmg;
u32 specialDmg;
2018-10-14 18:10:54 +02:00
u8 physicalBattlerId;
u8 specialBattlerId;
2017-09-17 14:10:32 +02:00
};
struct SpecialStatus
{
u32 statLowered:1;
u32 lightningRodRedirected:1;
u32 restoredBattlerSprite: 1;
u32 intimidatedMon:1;
u32 traced:1;
u32 ppNotAffectedByPressure:1;
u32 faintedHasReplacement:1;
u32 focusBanded:1;
2018-02-07 22:53:40 +01:00
s32 dmg;
s32 physicalDmg;
s32 specialDmg;
u8 physicalBattlerId;
u8 specialBattlerId;
2017-09-17 14:10:32 +02:00
};
struct SideTimer
{
2018-10-14 18:10:54 +02:00
u8 reflectTimer;
u8 reflectBattlerId;
u8 lightscreenTimer;
u8 lightscreenBattlerId;
u8 mistTimer;
u8 mistBattlerId;
u8 safeguardTimer;
u8 safeguardBattlerId;
u8 followmeTimer;
u8 followmeTarget;
u8 spikesAmount;
2017-09-17 14:10:32 +02:00
};
struct WishFutureKnock
{
2018-02-06 02:46:59 +01:00
u8 futureSightCounter[MAX_BATTLERS_COUNT];
u8 futureSightAttacker[MAX_BATTLERS_COUNT];
s32 futureSightDmg[MAX_BATTLERS_COUNT];
u16 futureSightMove[MAX_BATTLERS_COUNT];
u8 wishCounter[MAX_BATTLERS_COUNT];
2018-02-07 22:53:40 +01:00
u8 wishMonId[MAX_BATTLERS_COUNT];
2017-09-17 14:10:32 +02:00
u8 weatherDuration;
2018-10-14 18:37:52 +02:00
u8 knockedOffMons[2]; // Each battler is represented by a bit. The array entry is dependent on the battler's side.
2017-09-17 14:10:32 +02:00
};
2017-09-04 21:43:13 +02:00
struct AI_ThinkingStruct
{
u8 aiState;
u8 movesetIndex;
u16 moveConsidered;
2019-09-08 17:53:48 +02:00
s8 score[MAX_MON_MOVES];
2017-09-04 21:43:13 +02:00
u32 funcResult;
u32 aiFlags;
u8 aiAction;
u8 aiLogicId;
u8 filler12[6];
2019-09-08 17:53:48 +02:00
u8 simulatedRNG[MAX_MON_MOVES];
2017-09-04 21:43:13 +02:00
};
struct UsedMoves
{
2019-09-08 17:53:48 +02:00
u16 moves[MAX_MON_MOVES];
u16 unknown[MAX_MON_MOVES];
2017-09-04 21:43:13 +02:00
};
struct BattleHistory
{
2018-02-06 02:46:59 +01:00
struct UsedMoves usedMoves[MAX_BATTLERS_COUNT];
u8 abilities[MAX_BATTLERS_COUNT];
u8 itemEffects[MAX_BATTLERS_COUNT];
u16 trainerItems[MAX_BATTLERS_COUNT];
2017-09-05 09:41:48 +02:00
u8 itemsNo;
2017-09-04 21:43:13 +02:00
};
struct BattleScriptsStack
{
2017-09-17 14:10:32 +02:00
const u8 *ptr[8];
2017-09-04 21:43:13 +02:00
u8 size;
};
2017-09-17 17:14:32 +02:00
struct BattleCallbacksStack
{
void (*function[8])(void);
u8 size;
};
2017-09-22 21:33:49 +02:00
struct StatsArray
{
2019-04-04 21:24:21 +02:00
u16 stats[NUM_STATS];
2017-09-22 21:33:49 +02:00
};
2017-09-04 21:43:13 +02:00
struct BattleResources
{
2019-04-05 23:11:24 +02:00
struct SecretBase* secretBase;
2019-04-04 23:53:06 +02:00
struct ResourceFlags *flags;
2017-09-04 21:43:13 +02:00
struct BattleScriptsStack* battleScriptsStack;
2017-09-17 17:14:32 +02:00
struct BattleCallbacksStack* battleCallbackStack;
2019-04-04 21:24:21 +02:00
struct StatsArray* beforeLvlUp;
2017-09-04 21:43:13 +02:00
struct AI_ThinkingStruct *ai;
struct BattleHistory *battleHistory;
struct BattleScriptsStack *AI_ScriptsStack;
};
2017-09-05 09:41:48 +02:00
struct BattleResults
{
u8 playerFaintCounter; // 0x0
u8 opponentFaintCounter; // 0x1
2017-09-25 00:09:13 +02:00
u8 playerSwitchesCounter; // 0x2
u8 numHealingItemsUsed; // 0x3
u8 numRevivesUsed; // 0x4
2018-12-24 00:02:29 +01:00
u8 playerMonWasDamaged:1; // 0x5
Decompile TV (#80) * ClearTVShowData * special_0x44 * DoTVShow (nonmatching because align) * DoTVShowBravoTrainerPokemonProfile * Update field names * DoTVShowBravoTrainerBattleTower * Renaming of struct fields * sub_80EBFF4 and UpdateTVScreensOnMap * SetTVMetatilesOnMap * Power buttons for the TV screens on the map * special_0x45 * sub_80EC18C * special_0x4a * ResetGabbyAndTy * GabbyAndTyBeforeInterview * GabbyAndTyAfterInterview * Through IsTVShowInSearchOfTrainersAiring * GabbyAndTyGetLastQuote * GabbyAndTyGetLastBattleTrivia * GabbyAndTySetScriptVarsToFieldObjectLocalIds * InterviewAfter; use TVShow as a precursor for making the individual show structs anonymous * Make TV structs anonymous within the union * Move the TV union to its own subheader * Move TV show enums to the global.tv.h subheader * Funcion renaming * Apply static attributes where able * PutPokemonTodayCaughtOnAir * sub_80EC8A4 * PutPokemonTodayFailedOnTheAir * sub_80EC9E8, sub_80ECA10 * sub_80ECA38 * sub_80ECB00 * Put3CheersForPokeblocksOnTheAir * PutFanClubSpecialOnTheAir * ContestLiveUpdates_BeforeInterview * Other before-interview Contest Live Updates functions * ContestLiveUpdates_BeforeInterview_5 * InterviewAfter_BravoTrainerPokemonProfile * BravoTrainerPokemonProfile_BeforeInterview1 * BravoTrainerPokemonProfile_BeforeInterview2 * Disassemble TV data * Decompile TV data * InterviewAfter_BravoTrainerBattleTowerProfile * SaveRecordedItemPurchasesForTVShow * PutNameRaterShowOnTheAir * StartMassOutbreak * PutLilycoveContestLadyShowOnTheAir * InterviewAfter_FanClubLetter * Rip TV strings * InterviewAfter_RecentHappenings * InterviewAfter_PkmnFanClubOpinions * sub_80ED718 * EndMassOutbreak * sub_80ED888 * sub_80ED8B4 * UpdateMassOutbreakTimeLeft * sub_80ED950 * PutFishingAdviceShowOnTheAir * through sub_80EDA80 * ewram and common syms are now fetched from the object files * BSS symbols are taken from the tv.o file * through sub_80EDC60 * sub_80EDCE8 * sub_80EDD78 * through sub_80EDE84 * nomatching sub_80EDE98 * sub_80EDFB4 * sub_80EE104 * sub_80EE104 * sub_80EE184 * sub_80EE2CC * sub_80EE35C * sub_80EE44C * sub_80EE4DC * sub_80EE5A4 * sub_80EE69C * sub_80EE72C * sub_80EE7C0 * sub_80EE818 * sub_80EE8C8 * sub_80EEA70 * sub_80EEB98 * sub_80EEBF4 * through sub_80EED60 * Functions relating to Pokemon News * sub_80EEF6C * GetPriceReduction * IsPriceDiscounted * sub_80EF120 * through sub_80EF370 * sub_80EF40C * HasMixableShowAlreadyBeenSpawnedWithPlayerID * TV_SortPurchasesByQuantity * FindActiveBroadcastByShowType_SetScriptResult * InterviewBefore * through sub_80EF88C * through sub_80EF93C * through sub_80EFA24 * through TV_BernoulliTrial * sub_80EFB58 * sub_80EFBA4 * sub_80EFBDC * through sub_80EFD98 * ChangePokemonNickname * ChangeBoxPokemonNickname * sub_80EFF9C * through player_id_to_dword * CheckForBigMovieOrEmergencyNewsOnTV * GetMomOrDadStringForTVMessage * sub_80F01E8 * sub_80F0358 * sub_80F049C * TV record mixing functions * sub_80F06D0 * sub_80F0708 nonmatching * through sub_80F0B24 * sub_80F0B64 * through sub_80F0C04 * sub_80F0C7C * sub_80F0D60 * sub_80F0E58 * sub_80F0E84 * through sub_80F0F24 * sub_80F0F64 * sub_80F1208 * sub_80F1254 * sub_80F1290 * sub_80F12A4 * sub_80F14F8 * DoTVShowTodaysSmartShopper * DoTVShowTheNameRaterShow * DoTVShowPokemonTodaySuccessfulCapture * DoTVShowPokemonTodayFailedCapture * DoTVShowPokemonFanClubLetter * DoTVShowRecentHappenings * DoTVShowPokemonFanClubOpinions * DoTVShowPokemonNewsMassOutbreak * DoTVShowPokemonContestLiveUpdates * DoTVShowPokemonBattleUpdate * DoTVShow3CheersForPokeblocks * DoTVShowInSearchOfTrainers * Label GabbyAndTyData fields; remove ddump comments from data/text/tv.inc * DoTVShowPokemonAngler * DoTVShowTheWorldOfMasters; update RAM symbols and field names * Decorate static functions * DoTVShowTodaysRivalTrainer; region map enums * TVDewfordTrendWatcherNetworkTextGroup * DoTVShowHoennTreasureInvestigators * DoTVShowFindThatGamer * DoTVShowBreakingNewsTV * DoTVShowSecretBaseVisit * DoTVShowPokemonLotterWinnerFlashReport * DoTVShowThePokemonBattleSeminar * DoTVShowTrainerFanClubSpecial, DoTVShowTrainerFanClub * DoTVShowSpotTheCuties * DoTVShowPokemonNewsBattleFrontier * DoTVShowWhatsNo1InHoennToday * Helpers for DoTVShowSecretBaseSecrets * DoTVShowSecretBaseSecrets * DoTVShowSafariFanClub * Finish decompilation of tv.s * Some renaming * Rename text group pointers * revoke statis; pokenews enums * Labels are number one * Label all TV struct fields * Make data/text/tv.inc more readable * Split data/text/tv.inc * Rename pokenews text pointers * Frontier Symbol constants; indicate static rodata objects with 's' prefix * Fix leading spaces/tabs F*** CLion sometimes * Fix inconsequential warning
2017-10-13 17:09:36 +02:00
u8 usedMasterBall:1; // 0x5
u8 caughtMonBall:4; // 0x5
2018-06-28 21:06:32 +02:00
u8 shinyWildMon:1; // 0x5
2017-10-06 00:12:01 +02:00
u16 playerMon1Species; // 0x6
2018-06-28 21:06:32 +02:00
u8 playerMon1Name[POKEMON_NAME_LENGTH + 1]; // 0x8
2017-09-05 09:41:48 +02:00
u8 battleTurnCounter; // 0x13
2018-06-28 21:06:32 +02:00
u8 playerMon2Name[POKEMON_NAME_LENGTH + 1]; // 0x14
u8 pokeblockThrows; // 0x1F
2017-09-05 09:41:48 +02:00
u16 lastOpponentSpecies; // 0x20
2017-10-06 00:12:01 +02:00
u16 lastUsedMovePlayer; // 0x22
u16 lastUsedMoveOpponent; // 0x24
u16 playerMon2Species; // 0x26
2017-09-28 15:34:21 +02:00
u16 caughtMonSpecies; // 0x28
2018-06-28 21:06:32 +02:00
u8 caughtMonNick[POKEMON_NAME_LENGTH + 1]; // 0x2A
u8 filler35; // 0x35
u8 catchAttempts[POKEBALL_COUNT - 1]; // 0x36 Doesn't include Master ball
2017-09-05 09:41:48 +02:00
};
2018-02-27 20:40:09 +01:00
struct BattleTv_Side
2018-02-27 18:13:28 +01:00
{
u32 spikesMonId:3;
u32 reflectMonId:3;
u32 lightScreenMonId:3;
u32 safeguardMonId:3;
u32 mistMonId:3;
u32 futureSightMonId:3;
u32 doomDesireMonId:3;
u32 perishSongMonId:3;
u32 wishMonId:3;
u32 grudgeMonId:3;
2018-02-27 20:40:09 +01:00
u32 usedMoveSlot:2;
2018-02-27 18:13:28 +01:00
u32 spikesMoveSlot:2;
u32 reflectMoveSlot:2;
u32 lightScreenMoveSlot:2;
u32 safeguardMoveSlot:2;
u32 mistMoveSlot:2;
u32 futureSightMoveSlot:2;
u32 doomDesireMoveSlot:2;
u32 perishSongMoveSlot:2;
u32 wishMoveSlot:2;
u32 grudgeMoveSlot:2;
u32 destinyBondMonId:3;
u32 destinyBondMoveSlot:2;
2018-02-27 20:40:09 +01:00
u32 faintCause:4;
u32 faintCauseMonId:3;
2018-02-27 18:13:28 +01:00
u32 explosion:1;
u32 explosionMoveSlot:2;
u32 explosionMonId:3;
u32 perishSong:1;
};
2018-02-27 20:40:09 +01:00
struct BattleTv_Position
2018-02-27 18:13:28 +01:00
{
u32 curseMonId:3;
u32 leechSeedMonId:3;
u32 nightmareMonId:3;
u32 wrapMonId:3;
u32 attractMonId:3;
u32 confusionMonId:3;
u32 curseMoveSlot:2;
u32 leechSeedMoveSlot:2;
u32 nightmareMoveSlot:2;
u32 wrapMoveSlot:2;
u32 attractMoveSlot:2;
u32 confusionMoveSlot:2;
u32 waterSportMoveSlot:2;
u32 waterSportMonId:3;
u32 mudSportMonId:3;
u32 mudSportMoveSlot:2;
u32 ingrainMonId:3;
u32 ingrainMoveSlot:2;
2018-02-27 20:40:09 +01:00
u32 attackedByMonId:3;
u32 attackedByMoveSlot:2;
2018-02-27 18:13:28 +01:00
};
2018-02-27 20:40:09 +01:00
struct BattleTv_Mon
2018-02-27 18:13:28 +01:00
{
u32 psnMonId:3;
u32 badPsnMonId:3;
u32 brnMonId:3;
u32 prlzMonId:3;
u32 slpMonId:3;
u32 frzMonId:3;
u32 psnMoveSlot:2;
u32 badPsnMoveSlot:2;
u32 brnMoveSlot:2;
u32 prlzMoveSlot:2;
u32 slpMoveSlot:2;
u32 frzMoveSlot:2;
};
2018-02-27 20:40:09 +01:00
struct BattleTv
2018-02-27 18:13:28 +01:00
{
2018-07-01 11:15:42 +02:00
struct BattleTv_Mon mon[2][PARTY_SIZE]; // [side][partyId]
2018-02-27 20:40:09 +01:00
struct BattleTv_Position pos[2][2]; // [side][flank]
struct BattleTv_Side side[2]; // [side]
2018-02-27 18:13:28 +01:00
};
2018-02-27 20:40:09 +01:00
struct BattleTvMovePoints
2018-02-27 18:13:28 +01:00
{
2018-02-27 20:40:09 +01:00
s16 points[2][PARTY_SIZE * 4];
2018-02-27 18:13:28 +01:00
};
2021-03-15 20:22:41 +01:00
struct LinkBattlerHeader
{
2021-03-12 22:55:58 +01:00
u8 versionSignatureLo;
u8 versionSignatureHi;
u8 vsScreenHealthFlagsLo;
u8 vsScreenHealthFlagsHi;
struct BattleEnigmaBerry battleEnigmaBerry;
};
2017-09-05 09:41:48 +02:00
struct BattleStruct
{
2017-09-17 14:10:32 +02:00
u8 turnEffectsTracker;
2018-02-07 22:53:40 +01:00
u8 turnEffectsBattlerId;
2018-12-24 00:02:29 +01:00
u8 unused_0;
2018-02-07 22:53:40 +01:00
u8 turnCountersTracker;
2018-10-14 18:10:54 +02:00
u8 wrappedMove[MAX_BATTLERS_COUNT * 2]; // Leftover from Ruby's ewram access.
u8 moveTarget[MAX_BATTLERS_COUNT];
2018-02-07 22:53:40 +01:00
u8 expGetterMonId;
2018-12-24 00:02:29 +01:00
u8 unused_1;
2017-09-05 09:41:48 +02:00
u8 wildVictorySong;
u8 dynamicMoveType;
2018-10-14 18:10:54 +02:00
u8 wrappedBy[MAX_BATTLERS_COUNT];
u16 assistPossibleMoves[PARTY_SIZE * MAX_MON_MOVES]; // Each of mons can know max 4 moves.
2018-02-07 22:53:40 +01:00
u8 focusPunchBattlerId;
2018-07-07 19:57:09 +02:00
u8 battlerPreventingSwitchout;
2017-09-17 17:14:32 +02:00
u8 moneyMultiplier;
u8 savedTurnActionNumber;
2017-10-02 23:32:39 +02:00
u8 switchInAbilitiesCounter;
2017-12-02 14:08:55 +01:00
u8 faintedActionsState;
2018-02-07 22:53:40 +01:00
u8 faintedActionsBattlerId;
2017-09-22 21:33:49 +02:00
u16 expValue;
2017-09-11 14:42:13 +02:00
u8 field_52;
2017-09-22 21:33:49 +02:00
u8 sentInPokes;
2018-02-06 02:46:59 +01:00
bool8 selectionScriptFinished[MAX_BATTLERS_COUNT];
u8 battlerPartyIndexes[MAX_BATTLERS_COUNT];
2018-02-06 02:46:59 +01:00
u8 monToSwitchIntoId[MAX_BATTLERS_COUNT];
u8 battlerPartyOrders[MAX_BATTLERS_COUNT][PARTY_SIZE / 2];
2017-10-06 00:12:01 +02:00
u8 runTries;
2018-10-14 18:10:54 +02:00
u8 caughtMonNick[POKEMON_NAME_LENGTH + 1];
2018-12-24 00:02:29 +01:00
u8 unused_2;
2018-07-01 11:15:42 +02:00
u8 safariGoNearCounter;
u8 safariPkblThrowCounter;
u8 safariEscapeFactor;
u8 safariCatchFactor;
u8 linkBattleVsSpriteId_V; // The letter "V"
u8 linkBattleVsSpriteId_S; // The letter "S"
u8 formToChangeInto;
2018-02-06 02:46:59 +01:00
u8 chosenMovePositions[MAX_BATTLERS_COUNT];
u8 stateIdAfterSelScript[MAX_BATTLERS_COUNT];
2018-12-24 00:02:29 +01:00
u8 unused_3[3];
2021-01-23 02:03:21 +01:00
u8 prevSelectedPartySlot;
2018-12-24 00:02:29 +01:00
u8 unused_4[2];
2017-10-07 15:15:47 +02:00
u8 stringMoveType;
2018-02-07 22:53:40 +01:00
u8 expGetterBattlerId;
2018-12-24 00:02:29 +01:00
u8 unused_5;
u8 absentBattlerFlags;
2020-07-17 02:12:12 +02:00
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
2018-12-24 00:02:29 +01:00
u8 field_93; // related to choosing pokemon?
2017-10-24 21:45:41 +02:00
u8 wallyBattleState;
u8 wallyMovesState;
u8 wallyWaitFrames;
u8 wallyMoveFrames;
2018-10-14 18:10:54 +02:00
u8 lastTakenMove[MAX_BATTLERS_COUNT * 2 * 2]; // Last move that a battler was hit with. This field seems to erroneously take 16 bytes instead of 8.
2017-10-01 01:12:42 +02:00
u16 hpOnSwitchout[2];
u32 savedBattleTypeFlags;
2018-07-07 19:57:09 +02:00
u8 abilityPreventingSwitchout;
u8 hpScale;
u8 synchronizeMoveEffect;
2018-02-27 20:40:09 +01:00
bool8 anyMonHasTransformed;
2017-10-01 01:12:42 +02:00
void (*savedCallback)(void);
2018-02-06 02:46:59 +01:00
u16 usedHeldItems[MAX_BATTLERS_COUNT];
2018-10-14 18:10:54 +02:00
u8 chosenItem[MAX_BATTLERS_COUNT]; // why is this an u8?
2017-10-11 12:49:42 +02:00
u8 AI_itemType[2];
u8 AI_itemFlags[2];
2018-02-06 02:46:59 +01:00
u16 choicedMove[MAX_BATTLERS_COUNT];
u16 changedItems[MAX_BATTLERS_COUNT];
2018-07-01 11:15:42 +02:00
u8 intimidateBattler;
2017-10-02 23:32:39 +02:00
u8 switchInItemsCounter;
2018-12-07 23:50:56 +01:00
u8 arenaTurnCounter;
2017-09-17 14:10:32 +02:00
u8 turnSideTracker;
2018-12-24 00:02:29 +01:00
u8 unused_6[3];
2018-12-07 23:50:56 +01:00
u8 givenExpMons; // Bits for enemy party's pokemon that gave exp to player's party.
2018-10-14 18:10:54 +02:00
u8 lastTakenMoveFrom[MAX_BATTLERS_COUNT * MAX_BATTLERS_COUNT * 2]; // a 3-D array [target][attacker][byte]
2021-10-04 16:21:03 +02:00
u16 castformPalette[NUM_CASTFORM_FORMS][16];
union {
2021-03-15 20:22:41 +01:00
struct LinkBattlerHeader linkBattlerHeader;
u32 battleVideo[2];
} multiBuffer;
2017-12-02 14:08:55 +01:00
u8 wishPerishSongState;
2018-02-07 22:53:40 +01:00
u8 wishPerishSongBattlerId;
2017-10-02 23:32:39 +02:00
bool8 overworldWeatherDone;
2017-09-17 14:10:32 +02:00
u8 atkCancellerTracker;
2018-02-27 20:40:09 +01:00
struct BattleTvMovePoints tvMovePoints;
struct BattleTv tv;
2018-12-24 00:02:29 +01:00
u8 unused_7[0x28];
2018-02-06 02:46:59 +01:00
u8 AI_monToSwitchIntoId[MAX_BATTLERS_COUNT];
2018-11-11 18:33:16 +01:00
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 pokemon.
2017-09-05 09:41:48 +02:00
};
2021-10-04 16:21:03 +02:00
#define F_DYNAMIC_TYPE_1 (1 << 6)
#define F_DYNAMIC_TYPE_2 (1 << 7)
#define DYNAMIC_TYPE_MASK (F_DYNAMIC_TYPE_1 - 1)
#define GET_MOVE_TYPE(move, typeArg) \
{ \
if (gBattleStruct->dynamicMoveType) \
typeArg = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; \
else \
typeArg = gBattleMoves[move].type; \
}
2018-07-16 22:00:27 +02:00
#define IS_TYPE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY)
#define IS_TYPE_SPECIAL(moveType)(moveType > TYPE_MYSTERY)
2018-02-08 11:17:41 +01:00
2018-03-01 00:59:52 +01:00
#define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0))
#define IS_BATTLER_OF_TYPE(battlerId, type)((gBattleMons[battlerId].type1 == type || gBattleMons[battlerId].type2 == type))
#define SET_BATTLER_TYPE(battlerId, type) \
{ \
gBattleMons[battlerId].type1 = type; \
gBattleMons[battlerId].type2 = type; \
}
2017-09-22 21:33:49 +02:00
#define GET_STAT_BUFF_ID(n)((n & 0xF)) // first four bits 0x1, 0x2, 0x4, 0x8
2018-07-29 15:51:08 +02:00
#define GET_STAT_BUFF_VALUE2(n)((n & 0xF0))
2017-09-26 22:39:59 +02:00
#define GET_STAT_BUFF_VALUE(n)(((n >> 4) & 7)) // 0x10, 0x20, 0x40
2017-09-22 21:33:49 +02:00
#define STAT_BUFF_NEGATIVE 0x80 // 0x80, the sign bit
2018-07-29 15:51:08 +02:00
#define SET_STAT_BUFF_VALUE(n)((((n) << 4) & 0xF0))
2017-11-26 11:55:17 +01:00
#define SET_STATCHANGER(statId, stage, goesDown)(gBattleScripting.statChanger = (statId) + (stage << 4) + (goesDown << 7))
2021-10-13 22:39:21 +02:00
// NOTE: The members of this struct have hard-coded offsets
// in include/constants/battle_script_commands.h
2017-09-05 09:41:48 +02:00
struct BattleScripting
{
2017-09-26 22:39:59 +02:00
s32 painSplitHp;
s32 bideDmg;
u8 multihitString[6];
2017-09-05 09:41:48 +02:00
u8 dmgMultiplier;
u8 twoTurnsMoveStringId;
2017-09-17 14:10:32 +02:00
u8 animArg1;
u8 animArg2;
u16 tripleKickPower;
2019-08-23 14:46:21 +02:00
u8 moveendState;
2018-02-06 23:09:39 +01:00
u8 battlerWithAbility;
u8 multihitMoveEffect;
2018-02-06 02:46:59 +01:00
u8 battler;
2017-09-20 00:28:00 +02:00
u8 animTurn;
u8 animTargetsHit;
2017-09-17 17:14:32 +02:00
u8 statChanger;
2018-07-29 15:33:16 +02:00
bool8 statAnimPlayed;
2019-08-23 14:46:21 +02:00
u8 getexpState;
2017-10-02 23:32:39 +02:00
u8 battleStyle;
2019-08-23 14:46:21 +02:00
u8 drawlvlupboxState;
2017-09-25 00:09:13 +02:00
u8 learnMoveState;
2021-10-13 22:39:21 +02:00
u8 pursuitDoublesAttacker;
2017-10-09 18:18:40 +02:00
u8 reshowMainState;
u8 reshowHelperState;
u8 levelUpHP;
2021-10-04 16:21:03 +02:00
u8 windowsType; // B_WIN_TYPE_*
2017-10-01 01:12:42 +02:00
u8 multiplayerId;
2018-10-21 20:13:12 +02:00
u8 specialTrainerBattleType;
2017-09-05 09:41:48 +02:00
};
2017-10-01 18:54:01 +02:00
struct BattleSpriteInfo
{
2018-06-20 23:07:51 +02:00
u16 invisible:1; // 0x1
u16 lowHpSong:1; // 0x2
u16 behindSubstitute:1; // 0x4
u16 flag_x8:1; // 0x8
u16 hpNumbersNoBars:1; // 0x10
2017-10-01 18:54:01 +02:00
u16 transformSpecies;
};
struct BattleAnimationInfo
{
2017-11-04 16:11:13 +01:00
u16 animArg; // to fill up later
2017-10-18 21:42:00 +02:00
u8 field_2;
u8 field_3;
u8 field_4;
u8 field_5;
u8 field_6;
u8 field_7;
2017-10-22 18:43:15 +02:00
u8 ballThrowCaseId;
2021-01-23 02:03:21 +01:00
u8 introAnimActive:1;
u8 wildMonInvisible:1;
2018-06-20 23:07:51 +02:00
u8 field_9_x1C:3;
u8 field_9_x20:1;
u8 field_9_x40:1;
u8 field_9_x80:1;
u8 numBallParticles;
2017-11-02 18:19:49 +01:00
u8 field_B;
s16 ballSubpx;
2017-11-02 18:19:49 +01:00
u8 field_E;
u8 field_F;
2017-10-01 18:54:01 +02:00
};
2017-10-02 23:32:39 +02:00
struct BattleHealthboxInfo
{
2018-06-28 21:06:32 +02:00
u8 partyStatusSummaryShown:1;
2018-06-20 23:07:51 +02:00
u8 healthboxIsBouncing:1;
u8 battlerIsBouncing:1;
u8 ballAnimActive:1; // 0x8
u8 statusAnimActive:1; // x10
u8 animFromTableActive:1; // x20
2018-06-28 21:06:32 +02:00
u8 specialAnimActive:1; // x40
2020-08-30 21:11:44 +02:00
u8 triedShinyMonAnim:1;
u8 finishedShinyMonAnim:1;
2018-06-20 23:07:51 +02:00
u8 field_1_x1E:4;
2021-01-23 02:03:21 +01:00
u8 bgmRestored:1;
u8 waitForCry:1;
u8 healthboxSlideInStarted:1;
2018-06-20 23:07:51 +02:00
u8 healthboxBounceSpriteId;
u8 battlerBounceSpriteId;
2017-10-22 18:43:15 +02:00
u8 animationState;
2021-01-23 02:03:21 +01:00
u8 partyStatusDelayTimer;
2018-12-18 05:08:08 +01:00
u8 matrixNum;
2017-11-04 16:11:13 +01:00
u8 shadowSpriteId;
2021-01-23 02:03:21 +01:00
u8 soundTimer;
u8 introEndDelay;
2017-10-02 23:32:39 +02:00
u8 field_A;
u8 field_B;
};
2017-10-16 18:12:27 +02:00
struct BattleBarInfo
{
u8 healthboxSpriteId;
2017-10-19 15:28:41 +02:00
s32 maxValue;
2018-06-19 00:43:15 +02:00
s32 oldValue;
2017-10-22 18:43:15 +02:00
s32 receivedValue;
2018-06-19 00:43:15 +02:00
s32 currValue;
2017-10-16 18:12:27 +02:00
};
2017-10-01 18:54:01 +02:00
struct BattleSpriteData
{
2018-02-06 23:09:39 +01:00
struct BattleSpriteInfo *battlerData;
2017-10-02 23:32:39 +02:00
struct BattleHealthboxInfo *healthBoxesData;
2017-10-01 18:54:01 +02:00
struct BattleAnimationInfo *animationData;
2017-10-16 18:12:27 +02:00
struct BattleBarInfo *battleBars;
2017-10-01 18:54:01 +02:00
};
2017-09-11 18:27:54 +02:00
#include "sprite.h"
2017-10-01 01:12:42 +02:00
struct MonSpritesGfx
2017-09-11 11:35:41 +02:00
{
void* firstDecompressed; // ptr to the decompressed sprite of the first pokemon
2021-10-03 05:47:59 +02:00
union {
void* ptr[MAX_BATTLERS_COUNT];
u8* byte[MAX_BATTLERS_COUNT];
} sprites;
2021-10-03 05:47:59 +02:00
struct SpriteTemplate templates[MAX_BATTLERS_COUNT];
struct SpriteFrameImage frameImages[MAX_BATTLERS_COUNT][4];
u8 unusedArr[0x80];
2017-11-04 16:11:13 +01:00
u8 *barFontGfx;
2021-10-03 05:47:59 +02:00
void *unusedPtr;
2020-02-20 06:04:42 +01:00
u16 *buffer;
2017-09-11 11:35:41 +02:00
};
2018-06-30 15:35:54 +02:00
// All battle variables are declared in battle_main.c
2018-11-19 17:36:39 +01:00
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
extern u16 gBattle_BG1_X;
extern u16 gBattle_BG1_Y;
extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u16 gBattle_BG3_X;
extern u16 gBattle_BG3_Y;
extern u16 gBattle_WIN0H;
extern u16 gBattle_WIN0V;
extern u16 gBattle_WIN1H;
extern u16 gBattle_WIN1V;
2018-06-30 15:35:54 +02:00
extern u8 gDisplayedStringBattle[300];
extern u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT];
extern u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT];
extern u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT];
Decompile TV (#80) * ClearTVShowData * special_0x44 * DoTVShow (nonmatching because align) * DoTVShowBravoTrainerPokemonProfile * Update field names * DoTVShowBravoTrainerBattleTower * Renaming of struct fields * sub_80EBFF4 and UpdateTVScreensOnMap * SetTVMetatilesOnMap * Power buttons for the TV screens on the map * special_0x45 * sub_80EC18C * special_0x4a * ResetGabbyAndTy * GabbyAndTyBeforeInterview * GabbyAndTyAfterInterview * Through IsTVShowInSearchOfTrainersAiring * GabbyAndTyGetLastQuote * GabbyAndTyGetLastBattleTrivia * GabbyAndTySetScriptVarsToFieldObjectLocalIds * InterviewAfter; use TVShow as a precursor for making the individual show structs anonymous * Make TV structs anonymous within the union * Move the TV union to its own subheader * Move TV show enums to the global.tv.h subheader * Funcion renaming * Apply static attributes where able * PutPokemonTodayCaughtOnAir * sub_80EC8A4 * PutPokemonTodayFailedOnTheAir * sub_80EC9E8, sub_80ECA10 * sub_80ECA38 * sub_80ECB00 * Put3CheersForPokeblocksOnTheAir * PutFanClubSpecialOnTheAir * ContestLiveUpdates_BeforeInterview * Other before-interview Contest Live Updates functions * ContestLiveUpdates_BeforeInterview_5 * InterviewAfter_BravoTrainerPokemonProfile * BravoTrainerPokemonProfile_BeforeInterview1 * BravoTrainerPokemonProfile_BeforeInterview2 * Disassemble TV data * Decompile TV data * InterviewAfter_BravoTrainerBattleTowerProfile * SaveRecordedItemPurchasesForTVShow * PutNameRaterShowOnTheAir * StartMassOutbreak * PutLilycoveContestLadyShowOnTheAir * InterviewAfter_FanClubLetter * Rip TV strings * InterviewAfter_RecentHappenings * InterviewAfter_PkmnFanClubOpinions * sub_80ED718 * EndMassOutbreak * sub_80ED888 * sub_80ED8B4 * UpdateMassOutbreakTimeLeft * sub_80ED950 * PutFishingAdviceShowOnTheAir * through sub_80EDA80 * ewram and common syms are now fetched from the object files * BSS symbols are taken from the tv.o file * through sub_80EDC60 * sub_80EDCE8 * sub_80EDD78 * through sub_80EDE84 * nomatching sub_80EDE98 * sub_80EDFB4 * sub_80EE104 * sub_80EE104 * sub_80EE184 * sub_80EE2CC * sub_80EE35C * sub_80EE44C * sub_80EE4DC * sub_80EE5A4 * sub_80EE69C * sub_80EE72C * sub_80EE7C0 * sub_80EE818 * sub_80EE8C8 * sub_80EEA70 * sub_80EEB98 * sub_80EEBF4 * through sub_80EED60 * Functions relating to Pokemon News * sub_80EEF6C * GetPriceReduction * IsPriceDiscounted * sub_80EF120 * through sub_80EF370 * sub_80EF40C * HasMixableShowAlreadyBeenSpawnedWithPlayerID * TV_SortPurchasesByQuantity * FindActiveBroadcastByShowType_SetScriptResult * InterviewBefore * through sub_80EF88C * through sub_80EF93C * through sub_80EFA24 * through TV_BernoulliTrial * sub_80EFB58 * sub_80EFBA4 * sub_80EFBDC * through sub_80EFD98 * ChangePokemonNickname * ChangeBoxPokemonNickname * sub_80EFF9C * through player_id_to_dword * CheckForBigMovieOrEmergencyNewsOnTV * GetMomOrDadStringForTVMessage * sub_80F01E8 * sub_80F0358 * sub_80F049C * TV record mixing functions * sub_80F06D0 * sub_80F0708 nonmatching * through sub_80F0B24 * sub_80F0B64 * through sub_80F0C04 * sub_80F0C7C * sub_80F0D60 * sub_80F0E58 * sub_80F0E84 * through sub_80F0F24 * sub_80F0F64 * sub_80F1208 * sub_80F1254 * sub_80F1290 * sub_80F12A4 * sub_80F14F8 * DoTVShowTodaysSmartShopper * DoTVShowTheNameRaterShow * DoTVShowPokemonTodaySuccessfulCapture * DoTVShowPokemonTodayFailedCapture * DoTVShowPokemonFanClubLetter * DoTVShowRecentHappenings * DoTVShowPokemonFanClubOpinions * DoTVShowPokemonNewsMassOutbreak * DoTVShowPokemonContestLiveUpdates * DoTVShowPokemonBattleUpdate * DoTVShow3CheersForPokeblocks * DoTVShowInSearchOfTrainers * Label GabbyAndTyData fields; remove ddump comments from data/text/tv.inc * DoTVShowPokemonAngler * DoTVShowTheWorldOfMasters; update RAM symbols and field names * Decorate static functions * DoTVShowTodaysRivalTrainer; region map enums * TVDewfordTrendWatcherNetworkTextGroup * DoTVShowHoennTreasureInvestigators * DoTVShowFindThatGamer * DoTVShowBreakingNewsTV * DoTVShowSecretBaseVisit * DoTVShowPokemonLotterWinnerFlashReport * DoTVShowThePokemonBattleSeminar * DoTVShowTrainerFanClubSpecial, DoTVShowTrainerFanClub * DoTVShowSpotTheCuties * DoTVShowPokemonNewsBattleFrontier * DoTVShowWhatsNo1InHoennToday * Helpers for DoTVShowSecretBaseSecrets * DoTVShowSecretBaseSecrets * DoTVShowSafariFanClub * Finish decompilation of tv.s * Some renaming * Rename text group pointers * revoke statis; pokenews enums * Labels are number one * Label all TV struct fields * Make data/text/tv.inc more readable * Split data/text/tv.inc * Rename pokenews text pointers * Frontier Symbol constants; indicate static rodata objects with 's' prefix * Fix leading spaces/tabs F*** CLion sometimes * Fix inconsequential warning
2017-10-13 17:09:36 +02:00
extern u32 gBattleTypeFlags;
2018-02-07 23:21:51 +01:00
extern u8 gBattleTerrain;
extern u32 gUnusedFirstBattleVar1;
2021-10-04 16:21:03 +02:00
extern u8 *gBattleAnimBgTileBuffer;
extern u8 *gBattleAnimBgTilemapBuffer;
2018-02-07 23:21:51 +01:00
extern u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200];
extern u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200];
extern u8 gActiveBattler;
extern u32 gBattleControllerExecFlags;
extern u8 gBattlersCount;
extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT];
extern u8 gBattlerPositions[MAX_BATTLERS_COUNT];
extern u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT];
2018-06-28 21:06:32 +02:00
extern u8 gBattlerByTurnOrder[MAX_BATTLERS_COUNT];
2018-02-07 23:21:51 +01:00
extern u8 gCurrentTurnActionNumber;
extern u8 gCurrentActionFuncId;
extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT];
extern u8 gBattlerSpriteIds[MAX_BATTLERS_COUNT];
extern u8 gCurrMovePos;
2018-02-08 11:17:41 +01:00
extern u8 gChosenMovePos;
2018-02-07 23:21:51 +01:00
extern u16 gCurrentMove;
extern u16 gChosenMove;
2018-09-22 18:41:00 +02:00
extern u16 gCalledMove;
2018-02-07 23:21:51 +01:00
extern s32 gBattleMoveDamage;
extern s32 gHpDealt;
extern s32 gTakenDmg[MAX_BATTLERS_COUNT];
extern u16 gLastUsedItem;
extern u8 gLastUsedAbility;
extern u8 gBattlerAttacker;
extern u8 gBattlerTarget;
2018-02-08 11:17:41 +01:00
extern u8 gBattlerFainted;
extern u8 gEffectBattler;
2018-02-08 12:13:29 +01:00
extern u8 gPotentialItemEffectBattler;
2018-02-07 23:21:51 +01:00
extern u8 gAbsentBattlerFlags;
extern u8 gCritMultiplier;
extern u8 gMultiHitCounter;
extern const u8 *gBattlescriptCurrInstr;
extern u32 gUnusedBattleMainVar;
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 u16 gLastLandedMoves[MAX_BATTLERS_COUNT];
extern u16 gLastHitByType[MAX_BATTLERS_COUNT];
extern u16 gLastResultingMoves[MAX_BATTLERS_COUNT];
extern u16 gLockedMoves[MAX_BATTLERS_COUNT];
extern u8 gLastHitBy[MAX_BATTLERS_COUNT];
extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT];
extern u8 gMoveResultFlags;
extern u32 gHitMarker;
extern u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT];
extern u8 gUnusedFirstBattleVar2;
2018-02-07 23:21:51 +01:00
extern u16 gSideStatuses[2];
extern struct SideTimer gSideTimers[2];
extern u32 gStatuses3[MAX_BATTLERS_COUNT];
extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT];
extern u16 gPauseCounterBattle;
extern u16 gPaydayMoney;
extern u16 gRandomTurnNumber;
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;
2018-02-08 11:17:41 +01:00
extern u16 gIntroSlideFlags;
2018-02-07 23:21:51 +01:00
extern u8 gSentPokesToOpponent[2];
extern u16 gDynamicBasePower;
extern u16 gExpShareExp;
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];
2018-02-08 11:17:41 +01:00
extern u8 gBattlerStatusSummaryTaskId[MAX_BATTLERS_COUNT];
2018-02-07 23:21:51 +01:00
extern u8 gBattlerInMenuId;
extern bool8 gDoingBattleAnim;
extern u32 gTransformedPersonalities[MAX_BATTLERS_COUNT];
extern u8 gPlayerDpadHoldFrames;
extern struct BattleSpriteData *gBattleSpritesDataPtr;
extern struct MonSpritesGfx *gMonSpritesGfxPtr;
2021-01-23 03:35:16 +01:00
extern struct BattleHealthboxInfo *gBattleControllerOpponentHealthboxData;
extern struct BattleHealthboxInfo *gBattleControllerOpponentFlankHealthboxData;
2018-02-07 23:21:51 +01:00
extern u16 gBattleMovePower;
extern u16 gMoveToLearn;
extern u8 gBattleMonForms[MAX_BATTLERS_COUNT];
extern void (*gPreBattleCallback1)(void);
extern void (*gBattleMainFunc)(void);
extern struct BattleResults gBattleResults;
extern u8 gLeveledUpInBattle;
extern void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void);
extern u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT];
extern u8 gMultiUsePlayerCursor;
extern u8 gNumberOfMovesToChoose;
2021-01-23 02:03:21 +01:00
extern u8 gBattleControllerData[MAX_BATTLERS_COUNT];
2017-09-11 11:35:41 +02:00
#endif // GUARD_BATTLE_H