2017-03-05 08:35:03 +01:00
|
|
|
#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"
|
2020-11-06 20:59:52 +01:00
|
|
|
#include "pokeball.h"
|
2018-07-13 23:00:56 +02:00
|
|
|
#include "battle_debug.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
|
|
|
|
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
|
2018-07-13 23:00:56 +02:00
|
|
|
#define B_ACTION_DEBUG 20
|
2021-06-25 21:37:59 +02:00
|
|
|
#define B_ACTION_THROW_BALL 21 // R to throw last used ball
|
2018-02-06 23:09:39 +01:00
|
|
|
#define B_ACTION_NONE 0xFF
|
2017-10-04 19:25:14 +02:00
|
|
|
|
2017-09-04 21:43:13 +02:00
|
|
|
#define MAX_TRAINER_ITEMS 4
|
|
|
|
|
2017-09-17 14:10:32 +02:00
|
|
|
// array entries for battle communication
|
2021-04-02 08:27:12 +02:00
|
|
|
#define MULTIUSE_STATE 0
|
|
|
|
#define CURSOR_POSITION 1
|
|
|
|
#define TASK_ID 1 // task Id and cursor position share the same field
|
|
|
|
#define SPRITES_INIT_STATE1 1 // shares the Id as well
|
|
|
|
#define SPRITES_INIT_STATE2 2
|
|
|
|
#define MOVE_EFFECT_BYTE 3
|
|
|
|
#define ACTIONS_CONFIRMED_COUNT 4
|
|
|
|
#define MULTISTRING_CHOOSER 5
|
|
|
|
#define MISS_TYPE 6
|
|
|
|
#define MSG_DISPLAY 7
|
|
|
|
#define BATTLE_COMMUNICATION_ENTRIES_COUNT 8
|
2017-09-17 14:10:32 +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];
|
|
|
|
};
|
|
|
|
|
2020-07-15 17:21:12 +02:00
|
|
|
#define RESOURCE_FLAG_FLASH_FIRE 0x1
|
|
|
|
#define RESOURCE_FLAG_ROOST 0x2
|
|
|
|
#define RESOURCE_FLAG_UNBURDEN 0x4
|
|
|
|
#define RESOURCE_FLAG_INTIMIDATED 0x8
|
|
|
|
#define RESOURCE_FLAG_TRACED 0x10
|
|
|
|
#define RESOURCE_FLAG_EMERGENCY_EXIT 0x20
|
2017-09-04 21:43:13 +02:00
|
|
|
|
|
|
|
struct DisableStruct
|
|
|
|
{
|
2018-10-14 20:51:34 +02:00
|
|
|
u32 transformedMonPersonality;
|
|
|
|
u16 disabledMove;
|
|
|
|
u16 encoredMove;
|
|
|
|
u8 protectUses;
|
|
|
|
u8 stockpileCounter;
|
2019-07-09 19:06:12 +02:00
|
|
|
s8 stockpileDef;
|
|
|
|
s8 stockpileSpDef;
|
|
|
|
s8 stockpileBeforeDef;
|
|
|
|
s8 stockpileBeforeSpDef;
|
2018-10-14 20:51:34 +02:00
|
|
|
u8 substituteHP;
|
|
|
|
u8 disableTimer:4;
|
|
|
|
u8 disableTimerStartValue:4;
|
|
|
|
u8 encoredMovePos;
|
|
|
|
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 truantCounter:1;
|
2019-01-19 22:32:25 +01:00
|
|
|
u8 truantSwitchInHack:1;
|
|
|
|
u8 mimickedMoves:4;
|
2018-10-14 20:51:34 +02:00
|
|
|
u8 rechargeTimer;
|
2020-06-27 11:21:13 +02:00
|
|
|
u8 autotomizeCount;
|
2018-10-14 20:51:34 +02:00
|
|
|
u8 slowStartTimer;
|
2018-07-18 22:07:48 +02:00
|
|
|
u8 embargoTimer;
|
|
|
|
u8 magnetRiseTimer;
|
|
|
|
u8 telekinesisTimer;
|
|
|
|
u8 healBlockTimer;
|
2018-07-23 21:36:05 +02:00
|
|
|
u8 laserFocusTimer;
|
2019-04-16 15:01:48 +02:00
|
|
|
u8 throatChopTimer;
|
2018-09-22 10:45:43 +02:00
|
|
|
u8 usedMoves:4;
|
2018-09-22 12:20:33 +02:00
|
|
|
u8 wrapTurns;
|
2017-09-04 21:43:13 +02:00
|
|
|
};
|
|
|
|
|
2017-09-17 14:10:32 +02:00
|
|
|
struct ProtectStruct
|
|
|
|
{
|
|
|
|
u32 protected:1;
|
2018-10-14 20:51:34 +02:00
|
|
|
u32 spikyShielded:1;
|
|
|
|
u32 kingsShielded:1;
|
|
|
|
u32 banefulBunkered:1;
|
2021-07-25 17:38:54 +02:00
|
|
|
u32 obstructed:1;
|
2017-09-17 14:10:32 +02:00
|
|
|
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;
|
|
|
|
u32 prlzImmobility:1;
|
|
|
|
u32 confusionSelfDmg:1;
|
2021-09-14 17:53:35 +02:00
|
|
|
u32 targetAffected:1;
|
2017-09-17 14:10:32 +02:00
|
|
|
u32 chargingTurn:1;
|
2018-10-14 18:10:54 +02:00
|
|
|
u32 fleeFlag:2; // For RunAway and Smoke Ball.
|
2019-03-02 23:40:38 +01:00
|
|
|
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;
|
2018-10-14 20:51:34 +02:00
|
|
|
u32 usesBouncedMove:1;
|
|
|
|
u32 usedHealBlockedMove:1;
|
|
|
|
u32 usedGravityPreventedMove:1;
|
2018-12-03 12:50:32 +01:00
|
|
|
u32 powderSelfDmg:1;
|
2019-04-16 15:01:48 +02:00
|
|
|
u32 usedThroatChopPreventedMove:1;
|
2021-01-28 21:27:00 +01:00
|
|
|
u32 statRaised:1;
|
2021-02-01 07:31:27 +01:00
|
|
|
u32 micle:1;
|
|
|
|
u32 custap:1; // also quick claw
|
2021-09-01 11:34:47 +02:00
|
|
|
u32 touchedProtectLike:1;
|
2021-09-14 21:38:16 +02:00
|
|
|
u32 disableEjectPack:1;
|
2021-09-23 03:15:02 +02:00
|
|
|
u32 statFell:1;
|
2021-09-22 14:06:42 +02:00
|
|
|
u32 pranksterElevated:1;
|
2018-10-06 15:50:35 +02:00
|
|
|
u32 physicalDmg;
|
|
|
|
u32 specialDmg;
|
|
|
|
u8 physicalBattlerId;
|
|
|
|
u8 specialBattlerId;
|
2017-09-17 14:10:32 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
struct SpecialStatus
|
|
|
|
{
|
2018-10-14 18:10:54 +02:00
|
|
|
u8 statLowered:1;
|
|
|
|
u8 lightningRodRedirected:1;
|
|
|
|
u8 restoredBattlerSprite: 1;
|
|
|
|
u8 intimidatedMon:1;
|
|
|
|
u8 traced:1;
|
|
|
|
u8 ppNotAffectedByPressure:1;
|
2018-06-20 23:07:51 +02:00
|
|
|
u8 flag40:1;
|
|
|
|
u8 focusBanded:1;
|
2018-07-14 22:56:03 +02:00
|
|
|
u8 focusSashed:1;
|
2018-07-21 15:11:13 +02:00
|
|
|
u8 sturdied:1;
|
2018-07-22 19:34:13 +02:00
|
|
|
u8 stormDrainRedirected:1;
|
2018-07-22 22:21:47 +02:00
|
|
|
u8 switchInAbilityDone:1;
|
2019-05-20 12:20:49 +02:00
|
|
|
u8 switchInItemDone:1;
|
2019-04-20 21:11:49 +02:00
|
|
|
u8 instructedChosenTarget:3;
|
2019-05-07 15:26:58 +02:00
|
|
|
u8 berryReduced:1;
|
|
|
|
u8 gemBoost:1;
|
2021-09-16 16:24:32 +02:00
|
|
|
u8 rototillerAffected:1; // to be affected by rototiller
|
2019-05-07 15:26:58 +02:00
|
|
|
u8 gemParam;
|
2019-05-10 11:03:33 +02:00
|
|
|
u8 damagedMons:4; // Mons that have been damaged directly by using a move, includes substitute.
|
2019-11-14 00:03:20 +01:00
|
|
|
u8 dancerUsedMove:1;
|
|
|
|
u8 dancerOriginalTarget:3;
|
2018-02-07 22:53:40 +01:00
|
|
|
s32 dmg;
|
|
|
|
s32 physicalDmg;
|
|
|
|
s32 specialDmg;
|
|
|
|
u8 physicalBattlerId;
|
|
|
|
u8 specialBattlerId;
|
2019-03-23 17:21:14 +01:00
|
|
|
u8 changedStatsBattlerId; // Battler that was responsible for the latest stat change. Can be self.
|
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;
|
2021-06-10 12:55:05 +02:00
|
|
|
u8 followmeTarget:3;
|
|
|
|
u8 followmePowder:1; // Rage powder, does not affect grass type pokemon.
|
2018-10-14 18:10:54 +02:00
|
|
|
u8 spikesAmount;
|
2018-07-21 12:10:08 +02:00
|
|
|
u8 toxicSpikesAmount;
|
2018-07-24 21:47:00 +02:00
|
|
|
u8 stealthRockAmount;
|
2018-07-24 22:09:55 +02:00
|
|
|
u8 stickyWebAmount;
|
2018-07-21 12:10:08 +02:00
|
|
|
u8 auroraVeilTimer;
|
|
|
|
u8 auroraVeilBattlerId;
|
|
|
|
u8 tailwindTimer;
|
|
|
|
u8 tailwindBattlerId;
|
2018-07-21 12:56:07 +02:00
|
|
|
u8 luckyChantTimer;
|
|
|
|
u8 luckyChantBattlerId;
|
2021-10-16 10:41:50 +02:00
|
|
|
u8 retaliateTimer;
|
2017-09-17 14:10:32 +02:00
|
|
|
};
|
|
|
|
|
2018-07-14 13:17:10 +02:00
|
|
|
struct FieldTimer
|
|
|
|
{
|
|
|
|
u8 mudSportTimer;
|
|
|
|
u8 waterSportTimer;
|
|
|
|
u8 wonderRoomTimer;
|
|
|
|
u8 magicRoomTimer;
|
|
|
|
u8 trickRoomTimer;
|
|
|
|
u8 grassyTerrainTimer;
|
|
|
|
u8 mistyTerrainTimer;
|
|
|
|
u8 electricTerrainTimer;
|
|
|
|
u8 psychicTerrainTimer;
|
2018-07-21 16:34:43 +02:00
|
|
|
u8 gravityTimer;
|
2020-04-20 19:41:07 +02:00
|
|
|
u8 fairyLockTimer;
|
2018-07-14 13:17:10 +02:00
|
|
|
};
|
|
|
|
|
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];
|
|
|
|
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
|
|
|
};
|
|
|
|
|
2018-07-15 18:07:01 +02:00
|
|
|
struct AI_SavedBattleMon
|
|
|
|
{
|
2020-05-18 23:54:12 +02:00
|
|
|
u16 ability;
|
2020-07-15 21:30:24 +02:00
|
|
|
u16 moves[MAX_MON_MOVES];
|
2018-07-15 18:07:01 +02:00
|
|
|
u16 heldItem;
|
|
|
|
u16 species;
|
|
|
|
};
|
|
|
|
|
2020-12-17 06:56:10 +01:00
|
|
|
struct AiLogicData
|
|
|
|
{
|
|
|
|
//attacker data
|
|
|
|
u16 atkAbility;
|
2020-12-20 05:58:23 +01:00
|
|
|
u16 atkItem;
|
2020-12-17 06:56:10 +01:00
|
|
|
u16 atkHoldEffect;
|
|
|
|
u8 atkParam;
|
2020-12-20 05:58:23 +01:00
|
|
|
u16 atkSpecies;
|
2020-12-17 06:56:10 +01:00
|
|
|
// target data
|
|
|
|
u16 defAbility;
|
2020-12-20 05:58:23 +01:00
|
|
|
u16 defItem;
|
2020-12-17 06:56:10 +01:00
|
|
|
u16 defHoldEffect;
|
|
|
|
u8 defParam;
|
2020-12-20 05:58:23 +01:00
|
|
|
u16 defSpecies;
|
2020-12-17 06:56:10 +01:00
|
|
|
// attacker partner data
|
|
|
|
u8 battlerAtkPartner;
|
|
|
|
u16 partnerMove;
|
|
|
|
u16 atkPartnerAbility;
|
2020-12-20 05:58:23 +01:00
|
|
|
u16 atkPartnerHoldEffect;
|
2020-12-17 06:56:10 +01:00
|
|
|
bool32 targetSameSide;
|
|
|
|
// target partner data
|
|
|
|
u8 battlerDefPartner;
|
|
|
|
u16 defPartnerAbility;
|
2020-12-20 05:58:23 +01:00
|
|
|
u16 defPartnerHoldEffect;
|
2020-12-17 06:56:10 +01:00
|
|
|
};
|
|
|
|
|
2017-09-04 21:43:13 +02:00
|
|
|
struct AI_ThinkingStruct
|
|
|
|
{
|
2021-01-19 20:58:58 +01:00
|
|
|
struct AiLogicData data;
|
2017-09-04 21:43:13 +02:00
|
|
|
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;
|
2019-08-27 18:29:34 +02:00
|
|
|
s32 simulatedDmg[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, move
|
2018-07-15 18:07:01 +02:00
|
|
|
struct AI_SavedBattleMon saved[4];
|
2019-06-11 10:45:12 +02:00
|
|
|
bool8 switchMon; // Because all available moves have no/little effect.
|
2017-09-04 21:43:13 +02:00
|
|
|
};
|
|
|
|
|
2020-07-15 21:30:24 +02:00
|
|
|
#define AI_MOVE_HISTORY_COUNT 3
|
2017-09-04 21:43:13 +02:00
|
|
|
|
|
|
|
struct BattleHistory
|
|
|
|
{
|
2020-05-18 23:54:12 +02:00
|
|
|
u16 abilities[MAX_BATTLERS_COUNT];
|
2018-02-06 02:46:59 +01:00
|
|
|
u8 itemEffects[MAX_BATTLERS_COUNT];
|
2020-07-15 21:30:24 +02:00
|
|
|
u16 usedMoves[MAX_BATTLERS_COUNT][MAX_MON_MOVES];
|
|
|
|
u16 moveHistory[MAX_BATTLERS_COUNT][AI_MOVE_HISTORY_COUNT]; // 3 last used moves for each battler
|
|
|
|
u8 moveHistoryIndex[MAX_BATTLERS_COUNT];
|
2018-02-06 02:46:59 +01:00
|
|
|
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;
|
2019-01-05 16:00:57 +01:00
|
|
|
u8 bufferA[MAX_BATTLERS_COUNT][0x200];
|
|
|
|
u8 bufferB[MAX_BATTLERS_COUNT][0x200];
|
2017-09-04 21:43:13 +02:00
|
|
|
};
|
|
|
|
|
2020-12-11 16:05:00 +01:00
|
|
|
#define AI_THINKING_STRUCT ((struct AI_ThinkingStruct *)(gBattleResources->ai))
|
2021-01-19 20:58:58 +01:00
|
|
|
#define AI_DATA ((struct AiLogicData *)(&gBattleResources->ai->data))
|
2020-12-11 16:05:00 +01:00
|
|
|
#define BATTLE_HISTORY ((struct BattleHistory *)(gBattleResources->battleHistory))
|
|
|
|
|
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
|
2019-01-19 22:32:25 +01:00
|
|
|
u8 numHealingItemsUsed; // 0x3
|
|
|
|
u8 numRevivesUsed; // 0x4
|
2018-12-24 00:02:29 +01:00
|
|
|
u8 playerMonWasDamaged:1; // 0x5
|
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
|
2020-10-24 02:47:10 +02:00
|
|
|
u8 filler35; // 0x35
|
2020-11-06 20:59:52 +01:00
|
|
|
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 21:37:31 +01:00
|
|
|
{
|
2021-03-12 22:55:58 +01:00
|
|
|
u8 versionSignatureLo;
|
|
|
|
u8 versionSignatureHi;
|
2021-03-12 21:37:31 +01:00
|
|
|
u8 vsScreenHealthFlagsLo;
|
|
|
|
u8 vsScreenHealthFlagsHi;
|
|
|
|
struct BattleEnigmaBerry battleEnigmaBerry;
|
|
|
|
};
|
|
|
|
|
2018-09-20 17:33:27 +02:00
|
|
|
struct MegaEvolutionData
|
|
|
|
{
|
|
|
|
u8 toEvolve; // As flags using gBitTable.
|
|
|
|
u8 evolvedPartyIds[2]; // As flags using gBitTable;
|
|
|
|
bool8 alreadyEvolved[4]; // Array id is used for mon position.
|
|
|
|
u16 evolvedSpecies[MAX_BATTLERS_COUNT];
|
|
|
|
u16 playerEvolvedSpecies;
|
|
|
|
u8 battlerId;
|
|
|
|
bool8 playerSelect;
|
|
|
|
u8 triggerSpriteId;
|
2020-11-07 13:53:34 +01:00
|
|
|
bool8 isWishMegaEvo;
|
2018-09-20 17:33:27 +02:00
|
|
|
};
|
|
|
|
|
2019-08-08 13:06:55 +02:00
|
|
|
struct Illusion
|
|
|
|
{
|
2020-06-28 19:45:48 +02:00
|
|
|
u8 on;
|
|
|
|
u8 set;
|
|
|
|
u8 broken;
|
|
|
|
u8 partyId;
|
2019-08-08 13:06:55 +02:00
|
|
|
struct Pokemon *mon;
|
|
|
|
};
|
|
|
|
|
2020-12-09 18:28:18 +01:00
|
|
|
struct StolenItem
|
|
|
|
{
|
|
|
|
u16 originalItem:15;
|
|
|
|
u16 stolen:1;
|
|
|
|
};
|
|
|
|
|
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;
|
|
|
|
u8 turnCountersTracker;
|
2019-01-27 13:52:02 +01:00
|
|
|
u16 wrappedMove[MAX_BATTLERS_COUNT];
|
2021-10-16 22:10:45 +02:00
|
|
|
u16 moveTarget[MAX_BATTLERS_COUNT];
|
2018-02-07 22:53:40 +01:00
|
|
|
u8 expGetterMonId;
|
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];
|
2018-12-25 18:50:15 +01:00
|
|
|
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;
|
2021-09-02 06:15:58 +02:00
|
|
|
u8 moneyMultiplier:6;
|
|
|
|
u8 moneyMultiplierItem:1;
|
|
|
|
u8 moneyMultiplierMove:1;
|
2017-12-02 23:31:58 +01:00
|
|
|
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;
|
2021-06-03 23:17:44 +02:00
|
|
|
u32 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];
|
2017-09-24 00:29:52 +02:00
|
|
|
u8 field_58[4];
|
2018-02-06 02:46:59 +01:00
|
|
|
u8 monToSwitchIntoId[MAX_BATTLERS_COUNT];
|
2017-09-24 00:29:52 +02:00
|
|
|
u8 field_60[4][3];
|
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-07-01 11:15:42 +02:00
|
|
|
u8 safariGoNearCounter;
|
|
|
|
u8 safariPkblThrowCounter;
|
|
|
|
u8 safariEscapeFactor;
|
|
|
|
u8 safariCatchFactor;
|
2019-01-19 22:32:25 +01:00
|
|
|
u8 linkBattleVsSpriteId_V; // The letter "V"
|
|
|
|
u8 linkBattleVsSpriteId_S; // The letter "S"
|
2017-09-08 18:19:20 +02:00
|
|
|
u8 formToChangeInto;
|
2018-02-06 02:46:59 +01:00
|
|
|
u8 chosenMovePositions[MAX_BATTLERS_COUNT];
|
|
|
|
u8 stateIdAfterSelScript[MAX_BATTLERS_COUNT];
|
2021-01-23 02:03:21 +01:00
|
|
|
u8 prevSelectedPartySlot;
|
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 field_91; // related to gAbsentBattlerFlags, possibly absent flags turn ago?
|
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;
|
2019-01-27 13:52:02 +01:00
|
|
|
u16 lastTakenMove[MAX_BATTLERS_COUNT]; // Last move that a battler was hit with.
|
2017-10-01 01:12:42 +02:00
|
|
|
u16 hpOnSwitchout[2];
|
|
|
|
u32 savedBattleTypeFlags;
|
2020-05-18 23:54:12 +02:00
|
|
|
u16 abilityPreventingSwitchout;
|
2017-09-08 18:19:20 +02:00
|
|
|
u8 hpScale;
|
2019-06-25 13:04:14 +02:00
|
|
|
u16 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];
|
2019-01-27 13:52:02 +01:00
|
|
|
u16 chosenItem[MAX_BATTLERS_COUNT];
|
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-07 23:50:56 +01:00
|
|
|
u8 givenExpMons; // Bits for enemy party's pokemon that gave exp to player's party.
|
2019-01-27 13:52:02 +01:00
|
|
|
u16 lastTakenMoveFrom[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT]; // a 2-D array [target][attacker]
|
2018-02-06 02:46:59 +01:00
|
|
|
u16 castformPalette[MAX_BATTLERS_COUNT][16];
|
2021-03-12 21:37:31 +01:00
|
|
|
union {
|
2021-03-15 20:22:41 +01:00
|
|
|
struct LinkBattlerHeader linkBattlerHeader;
|
2021-03-12 21:37:31 +01:00
|
|
|
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;
|
2020-12-14 03:42:48 +01:00
|
|
|
bool8 terrainDone;
|
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-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.
|
2018-07-13 23:00:56 +02:00
|
|
|
u8 debugBattler;
|
2018-07-14 22:56:03 +02:00
|
|
|
u8 magnitudeBasePower;
|
|
|
|
u8 presentBasePower;
|
2018-07-19 21:18:20 +02:00
|
|
|
u8 roostTypes[MAX_BATTLERS_COUNT][3];
|
2018-07-24 22:09:55 +02:00
|
|
|
u8 savedBattlerTarget;
|
2018-07-28 18:41:57 +02:00
|
|
|
bool8 ateBoost[MAX_BATTLERS_COUNT];
|
2018-09-29 12:47:35 +02:00
|
|
|
u8 activeAbilityPopUps; // as bits for each battler
|
2020-12-06 05:04:12 +01:00
|
|
|
u8 abilityPopUpSpriteIds[MAX_BATTLERS_COUNT][2]; // two per battler
|
2018-10-15 21:19:52 +02:00
|
|
|
bool8 throwingPokeBall;
|
2018-09-20 17:33:27 +02:00
|
|
|
struct MegaEvolutionData mega;
|
2018-11-03 01:17:16 +01:00
|
|
|
const u8 *trainerSlideMsg;
|
|
|
|
bool8 trainerSlideLowHpMsgDone;
|
2018-12-23 18:47:00 +01:00
|
|
|
u8 introState;
|
2019-02-01 14:17:24 +01:00
|
|
|
u8 ateBerry[2]; // array id determined by side, each party pokemon as bit
|
2019-02-14 12:15:53 +01:00
|
|
|
u8 stolenStats[NUM_BATTLE_STATS]; // hp byte is used for which stats to raise, other inform about by how many stages
|
2019-04-01 16:28:17 +02:00
|
|
|
u8 lastMoveFailed; // as bits for each battler, for the sake of Stomping Tantrum
|
2019-04-20 21:11:49 +02:00
|
|
|
u8 lastMoveTarget[MAX_BATTLERS_COUNT]; // The last target on which each mon used a move, for the sake of Instruct
|
2019-04-13 14:56:26 +02:00
|
|
|
u8 debugHoldEffects[MAX_BATTLERS_COUNT]; // These override actual items' hold effects.
|
2020-05-18 23:54:12 +02:00
|
|
|
u16 tracedAbility[MAX_BATTLERS_COUNT];
|
2020-04-12 12:41:26 +02:00
|
|
|
u16 hpBefore[MAX_BATTLERS_COUNT]; // Hp of battlers before using a move. For Berserk
|
2019-08-08 13:06:55 +02:00
|
|
|
bool8 spriteIgnore0Hp;
|
|
|
|
struct Illusion illusion[MAX_BATTLERS_COUNT];
|
2020-04-14 13:40:27 +02:00
|
|
|
s8 aiFinalScore[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // AI, target, moves to make debugging easier
|
2020-04-18 19:59:09 +02:00
|
|
|
u8 soulheartBattlerId;
|
2020-04-19 13:37:56 +02:00
|
|
|
u8 friskedBattler; // Frisk needs to identify 2 battlers in double battles.
|
|
|
|
bool8 friskedAbility; // If identifies two mons, show the ability pop-up only once.
|
2020-04-22 12:49:25 +02:00
|
|
|
u8 sameMoveTurns[MAX_BATTLERS_COUNT]; // For Metronome, number of times the same moves has been SUCCESFULLY used.
|
2020-06-25 16:15:11 +02:00
|
|
|
u16 moveEffect2; // For Knock Off
|
2020-07-16 15:40:56 +02:00
|
|
|
u16 changedSpecies[PARTY_SIZE]; // For Zygarde or future forms when multiple mons can change into the same pokemon.
|
2021-01-06 17:37:31 +01:00
|
|
|
u8 quickClawBattlerId;
|
2021-08-12 07:26:13 +02:00
|
|
|
struct StolenItem itemStolen[PARTY_SIZE]; // Player's team that had items stolen (two bytes per party member)
|
2021-09-02 21:33:42 +02:00
|
|
|
u8 blunderPolicy:1; // should blunder policy activate
|
2021-06-25 21:37:59 +02:00
|
|
|
u8 ballSpriteIds[2]; // item gfx, window gfx
|
2017-09-05 09:41:48 +02:00
|
|
|
};
|
|
|
|
|
2017-09-20 00:28:00 +02:00
|
|
|
#define GET_MOVE_TYPE(move, typeArg) \
|
2017-09-19 21:01:12 +02:00
|
|
|
{ \
|
|
|
|
if (gBattleStruct->dynamicMoveType) \
|
2017-09-20 00:28:00 +02:00
|
|
|
typeArg = gBattleStruct->dynamicMoveType & 0x3F; \
|
2017-09-19 21:01:12 +02:00
|
|
|
else \
|
2017-09-20 00:28:00 +02:00
|
|
|
typeArg = gBattleMoves[move].type; \
|
2017-09-19 21:01:12 +02:00
|
|
|
}
|
|
|
|
|
2020-10-15 05:16:50 +02:00
|
|
|
#define IS_MOVE_PHYSICAL(move)(GetBattleMoveSplit(move) == SPLIT_PHYSICAL)
|
|
|
|
#define IS_MOVE_SPECIAL(move)(GetBattleMoveSplit(move) == SPLIT_SPECIAL)
|
|
|
|
#define IS_MOVE_STATUS(move)(gBattleMoves[move].split == SPLIT_STATUS)
|
2018-02-08 11:17:41 +01:00
|
|
|
|
2018-07-14 22:56:03 +02:00
|
|
|
#define BATTLER_MAX_HP(battlerId)(gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP)
|
2018-03-01 00:59:52 +01:00
|
|
|
#define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0))
|
2020-11-13 07:30:00 +01:00
|
|
|
#define BATTLER_DAMAGED(battlerId) ((gSpecialStatuses[battlerId].physicalDmg != 0 || gSpecialStatuses[battlerId].specialDmg != 0))
|
2018-03-01 00:59:52 +01:00
|
|
|
|
2018-11-17 12:10:24 +01:00
|
|
|
#define IS_BATTLER_OF_TYPE(battlerId, type)((gBattleMons[battlerId].type1 == type || gBattleMons[battlerId].type2 == type || gBattleMons[battlerId].type3 == type))
|
|
|
|
#define SET_BATTLER_TYPE(battlerId, type) \
|
|
|
|
{ \
|
|
|
|
gBattleMons[battlerId].type1 = type; \
|
|
|
|
gBattleMons[battlerId].type2 = type; \
|
|
|
|
gBattleMons[battlerId].type3 = TYPE_MYSTERY; \
|
2018-03-01 00:59:52 +01:00
|
|
|
}
|
|
|
|
|
2019-02-14 19:48:21 +01:00
|
|
|
#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
|
2017-09-22 21:33:49 +02:00
|
|
|
#define STAT_BUFF_NEGATIVE 0x80 // 0x80, the sign bit
|
|
|
|
|
2019-02-14 19:48:21 +01:00
|
|
|
#define SET_STAT_BUFF_VALUE(n)((((n) << 3) & 0xF8))
|
2017-09-20 22:54:26 +02:00
|
|
|
|
2019-03-23 16:33:08 +01:00
|
|
|
#define SET_STATCHANGER(statId, stage, goesDown)(gBattleScripting.statChanger = (statId) + ((stage) << 3) + (goesDown << 7))
|
2020-04-19 15:44:44 +02:00
|
|
|
#define SET_STATCHANGER2(dst, statId, stage, goesDown)(dst = (statId) + ((stage) << 3) + (goesDown << 7))
|
2017-11-26 11:55:17 +01:00
|
|
|
|
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];
|
2018-08-03 18:01:14 +02:00
|
|
|
bool8 expOnCatch;
|
2017-11-26 00:33:40 +01:00
|
|
|
u8 twoTurnsMoveStringId;
|
2017-09-17 14:10:32 +02:00
|
|
|
u8 animArg1;
|
|
|
|
u8 animArg2;
|
2017-11-26 13:26:58 +01:00
|
|
|
u16 tripleKickPower;
|
2019-08-23 14:46:21 +02:00
|
|
|
u8 moveendState;
|
2020-04-19 15:44:44 +02:00
|
|
|
u8 savedStatChanger; // For further use, if attempting to change stat two times(ex. Moody)
|
2020-04-25 11:17:59 +02:00
|
|
|
u8 shiftSwitched; // When the game tells you the next enemy's pokemon and you switch. Option for noobs but oh well.
|
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;
|
2019-11-14 00:03:20 +01:00
|
|
|
u8 savedBattler;
|
2017-10-09 18:18:40 +02:00
|
|
|
u8 reshowMainState;
|
|
|
|
u8 reshowHelperState;
|
2020-10-06 00:48:51 +02:00
|
|
|
u8 levelUpHP;
|
2018-06-17 16:48:58 +02:00
|
|
|
u8 windowsType; // 0 - normal, 1 - battle arena
|
2017-10-01 01:12:42 +02:00
|
|
|
u8 multiplayerId;
|
2018-10-21 20:13:12 +02:00
|
|
|
u8 specialTrainerBattleType;
|
2018-08-03 18:01:14 +02:00
|
|
|
bool8 monCaught;
|
2018-09-22 10:45:43 +02:00
|
|
|
s32 savedDmg;
|
2019-02-14 13:17:27 +01:00
|
|
|
u16 savedMoveEffect; // For moves hitting multiple targets.
|
|
|
|
u16 moveEffect;
|
|
|
|
u16 multihitMoveEffect;
|
2020-06-28 19:45:48 +02:00
|
|
|
u8 illusionNickHack; // To properly display nick in STRINGID_ENEMYABOUTTOSWITCHPKMN.
|
2021-09-02 21:33:42 +02:00
|
|
|
bool8 fixedPopup; // Force ability popup to stick until manually called back
|
2021-02-02 17:00:07 +01:00
|
|
|
u16 abilityPopupOverwrite;
|
2021-09-02 21:33:42 +02:00
|
|
|
u8 switchCase; // Special switching conditions, eg. red card
|
2021-07-25 22:55:52 +02:00
|
|
|
u8 overrideBerryRequirements;
|
2017-09-05 09:41:48 +02:00
|
|
|
};
|
|
|
|
|
2017-09-19 21:01:12 +02:00
|
|
|
// rom_80A5C6C
|
2019-03-31 19:15:39 +02:00
|
|
|
|
2017-09-19 21:01:12 +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;
|
2020-07-14 17:47:15 +02:00
|
|
|
u8 ballThrowCaseId:6;
|
|
|
|
u8 isCriticalCapture:1;
|
|
|
|
u8 criticalCaptureSuccess:1;
|
2021-01-23 02:03:21 +01:00
|
|
|
u8 introAnimActive:1;
|
2020-08-05 04:37:52 +02:00
|
|
|
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;
|
2020-08-05 04:37:52 +02:00
|
|
|
u8 numBallParticles;
|
2017-11-02 18:19:49 +01:00
|
|
|
u8 field_B;
|
2020-08-05 04:37:52 +02:00
|
|
|
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
|
2020-09-19 19:37:24 +02:00
|
|
|
union
|
|
|
|
{
|
|
|
|
void* ptr[4];
|
|
|
|
u8* byte[4];
|
|
|
|
} sprites;
|
2017-09-11 18:27:54 +02:00
|
|
|
struct SpriteTemplate templates[4];
|
2017-11-04 16:11:13 +01:00
|
|
|
struct SpriteFrameImage field_74[4][4];
|
|
|
|
u8 field_F4[0x80];
|
|
|
|
u8 *barFontGfx;
|
|
|
|
void *field_178;
|
2020-02-20 06:04:42 +01:00
|
|
|
u16 *buffer;
|
2017-09-11 11:35:41 +02:00
|
|
|
};
|
|
|
|
|
2020-11-19 18:35:37 +01:00
|
|
|
struct TotemBoost
|
|
|
|
{
|
2020-12-06 05:00:51 +01:00
|
|
|
u8 stats; // bitfield for each battle stat that is set if the stat changes
|
|
|
|
s8 statChanges[NUM_BATTLE_STATS - 1]; // highest bit being set decreases the stat
|
2020-11-19 18:35:37 +01:00
|
|
|
}; /* size = 8 */
|
|
|
|
|
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-12-01 11:12:31 +01:00
|
|
|
extern u8 gDisplayedStringBattle[400];
|
2018-06-30 15:35:54 +02:00
|
|
|
extern u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT];
|
|
|
|
extern u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT];
|
|
|
|
extern u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT];
|
2017-10-13 17:09:36 +02:00
|
|
|
extern u32 gBattleTypeFlags;
|
2018-02-07 23:21:51 +01:00
|
|
|
extern u8 gBattleTerrain;
|
2021-01-22 08:48:22 +01:00
|
|
|
extern u32 gUnusedFirstBattleVar1;
|
2018-02-07 23:21:51 +01:00
|
|
|
extern u8 *gUnknown_0202305C;
|
|
|
|
extern u8 *gUnknown_02023060;
|
|
|
|
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;
|
2020-05-18 23:54:12 +02:00
|
|
|
extern u16 gLastUsedAbility;
|
2018-02-07 23:21:51 +01:00
|
|
|
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;
|
2018-07-14 22:56:03 +02:00
|
|
|
extern u8 gIsCriticalHit;
|
2018-02-07 23:21:51 +01:00
|
|
|
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 u16 gLastLandedMoves[MAX_BATTLERS_COUNT];
|
|
|
|
extern u16 gLastHitByType[MAX_BATTLERS_COUNT];
|
|
|
|
extern u16 gLastResultingMoves[MAX_BATTLERS_COUNT];
|
|
|
|
extern u16 gLockedMoves[MAX_BATTLERS_COUNT];
|
2018-09-22 18:37:03 +02:00
|
|
|
extern u16 gLastUsedMove;
|
2018-02-07 23:21:51 +01:00
|
|
|
extern u8 gLastHitBy[MAX_BATTLERS_COUNT];
|
|
|
|
extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT];
|
2018-07-21 15:11:13 +02:00
|
|
|
extern u16 gMoveResultFlags;
|
2018-02-07 23:21:51 +01:00
|
|
|
extern u32 gHitMarker;
|
|
|
|
extern u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT];
|
2021-01-22 08:48:22 +01:00
|
|
|
extern u8 gUnusedFirstBattleVar2;
|
2018-07-24 20:13:02 +02:00
|
|
|
extern u32 gSideStatuses[2];
|
2018-02-07 23:21:51 +01:00
|
|
|
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 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];
|
2018-07-14 13:17:10 +02:00
|
|
|
extern u32 gFieldStatuses;
|
|
|
|
extern struct FieldTimer gFieldTimers;
|
2020-11-17 19:32:24 +01:00
|
|
|
extern u8 gBattlerAbility;
|
2018-11-24 01:02:02 +01:00
|
|
|
extern u16 gPartnerSpriteId;
|
2020-11-19 18:35:37 +01:00
|
|
|
extern struct TotemBoost gTotemBoosts[MAX_BATTLERS_COUNT];
|
2018-02-07 23:21:51 +01:00
|
|
|
|
|
|
|
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];
|
2020-12-03 03:09:35 +01:00
|
|
|
extern bool8 gHasFetchedBall;
|
|
|
|
extern u8 gLastUsedBall;
|
2021-09-23 18:03:01 +02:00
|
|
|
extern u16 gLastThrownBall;
|
2017-09-11 11:35:41 +02:00
|
|
|
|
|
|
|
#endif // GUARD_BATTLE_H
|