summaryrefslogtreecommitdiff
path: root/include/battle.h
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@users.noreply.github.com>2019-09-25 13:56:50 -0400
committerGitHub <noreply@github.com>2019-09-25 13:56:50 -0400
commit1d4234bd7e295c553485b7d676d42c838e4762c4 (patch)
tree67ac4179d9978baf4e989ef55245e4be0d777c04 /include/battle.h
parent7f6d86a8bf2afe349135d502debc2237bafafff5 (diff)
parent931bf4ce4b4fd7ea63d00f36adfd2bf720831a80 (diff)
Merge branch 'master' into PIE2
Diffstat (limited to 'include/battle.h')
-rw-r--r--include/battle.h466
1 files changed, 223 insertions, 243 deletions
diff --git a/include/battle.h b/include/battle.h
index b1284fd6c..1f7fc5bf6 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -2,15 +2,14 @@
#define GUARD_BATTLE_H
#include "global.h"
-
-// should they be included here or included individually by every file?
#include "constants/battle.h"
#include "battle_util.h"
#include "battle_script_commands.h"
-#include "battle_2.h"
+#include "battle_main.h"
#include "battle_ai_switch_items.h"
#include "battle_gfx_sfx_util.h"
#include "battle_util2.h"
+#include "battle_bg.h"
/*
Banks are a name given to what could be called a 'battlerId' or 'monControllerId'.
@@ -19,8 +18,6 @@
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 BATTLE_BANKS_COUNT 4
-
#define IDENTITY_PLAYER_MON1 0
#define IDENTITY_OPPONENT_MON1 1
#define IDENTITY_PLAYER_MON2 2
@@ -29,9 +26,9 @@
#define SIDE_PLAYER 0x0
#define SIDE_OPPONENT 0x1
-#define GET_BANK_IDENTITY(bank)((gBanksByIdentity[bank]))
-#define GET_BANK_SIDE(bank)((GetBattlerPosition(bank) & BIT_SIDE))
-#define GET_BANK_SIDE2(bank)((GET_BANK_IDENTITY(bank) & BIT_SIDE))
+#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))
#define TRAINER_OPPONENT_3FE 0x3FE
#define TRAINER_OPPONENT_C00 0xC00
@@ -73,21 +70,22 @@
#define SIDE_STATUS_MIST (1 << 8)
#define SIDE_STATUS_SPIKES_DAMAGED (1 << 9)
-#define ACTION_USE_MOVE 0
-#define ACTION_USE_ITEM 1
-#define ACTION_SWITCH 2
-#define ACTION_RUN 3
-#define ACTION_WATCHES_CAREFULLY 4
-#define ACTION_SAFARI_ZONE_BALL 5
-#define ACTION_POKEBLOCK_CASE 6
-#define ACTION_GO_NEAR 7
-#define ACTION_SAFARI_ZONE_RUN 8
-#define ACTION_9 9
-#define ACTION_RUN_BATTLESCRIPT 10 // when executing an action
-#define ACTION_CANCEL_PARTNER 12 // when choosing an action
-#define ACTION_FINISHED 12 // when executing an action
-#define ACTION_NOTHING_FAINTED 13 // when choosing an action
-#define ACTION_INIT_VALUE 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_POKEBLOCK 6
+#define B_ACTION_SAFARI_GO_NEAR 7
+#define B_ACTION_SAFARI_RUN 8
+#define B_ACTION_9 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_NONE 0xFF
#define MOVESTATUS_MISSED (1 << 0)
#define MOVESTATUS_SUPEREFFECTIVE (1 << 1)
@@ -150,19 +148,6 @@
#define TYPE_FORESIGHT 0xFE
#define TYPE_ENDTABLE 0xFF
-#define BS_GET_TARGET 0
-#define BS_GET_ATTACKER 1
-#define BS_GET_EFFECT_BANK 2
-#define BS_GET_gBank1 3
-#define BS_GET_BANK_0 7
-#define BS_ATTACKER_WITH_PARTNER 4 // for atk98_status_icon_update
-#define BS_GET_ATTACKER_SIDE 8 // for atk1E_jumpifability
-#define BS_GET_NOT_ATTACKER_SIDE 9 // for atk1E_jumpifability
-#define BS_GET_SCRIPTING_BANK 10
-#define BS_GET_OPPONENT1 12
-#define BS_GET_PLAYER2 13
-#define BS_GET_OPPONENT2 14
-
// for battle script commands
#define CMP_EQUAL 0x0
#define CMP_NOT_EQUAL 0x1
@@ -178,9 +163,6 @@ struct TrainerMonNoItemDefaultMoves
u16 species;
};
-u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg);
-u8 GetBattlerSide(u8 bank);
-
struct TrainerMonItemDefaultMoves
{
u16 iv;
@@ -208,10 +190,10 @@ struct TrainerMonItemCustomMoves
union TrainerMonPtr
{
- struct TrainerMonNoItemDefaultMoves* NoItemDefaultMoves;
- struct TrainerMonNoItemCustomMoves* NoItemCustomMoves;
- struct TrainerMonItemDefaultMoves* ItemDefaultMoves;
- struct TrainerMonItemCustomMoves* ItemCustomMoves;
+ struct TrainerMonNoItemDefaultMoves *NoItemDefaultMoves;
+ struct TrainerMonNoItemCustomMoves *NoItemCustomMoves;
+ struct TrainerMonItemDefaultMoves *ItemDefaultMoves;
+ struct TrainerMonItemCustomMoves *ItemCustomMoves;
};
struct Trainer
@@ -235,12 +217,12 @@ extern const struct Trainer gTrainers[];
#define TRAINER_ENCOUNTER_MUSIC(trainer)((gTrainers[trainer].encounterMusic_gender & 0x7F))
-struct UnknownFlags
+struct ResourceFlags
{
u32 flags[4];
};
-#define UNKNOWN_FLAG_FLASH_FIRE 1
+#define RESOURCE_FLAG_FLASH_FIRE 1
struct DisableStruct
{
@@ -250,41 +232,41 @@ struct DisableStruct
/*0x08*/ u8 protectUses;
/*0x09*/ u8 stockpileCounter;
/*0x0A*/ u8 substituteHP;
- /*0x0B*/ u8 disableTimer1 : 4;
- /*0x0B*/ u8 disableTimer2 : 4;
+ /*0x0B*/ u8 disableTimer : 4;
+ /*0x0B*/ u8 disableTimerStartValue : 4;
/*0x0C*/ u8 encoredMovePos;
/*0x0D*/ u8 unkD;
- /*0x0E*/ u8 encoreTimer1 : 4;
- /*0x0E*/ u8 encoreTimer2 : 4;
- /*0x0F*/ u8 perishSongTimer1 : 4;
- /*0x0F*/ u8 perishSongTimer2 : 4;
+ /*0x0E*/ u8 encoreTimer : 4;
+ /*0x0E*/ u8 encoreTimerStartValue : 4;
+ /*0x0F*/ u8 perishSongTimer : 4;
+ /*0x0F*/ u8 perishSongTimerStartValue : 4;
/*0x10*/ u8 furyCutterCounter;
- /*0x11*/ u8 rolloutCounter1 : 4;
- /*0x11*/ u8 rolloutCounter2 : 4;
- /*0x12*/ u8 chargeTimer1 : 4;
- /*0x12*/ u8 chargeTimer2 : 4;
- /*0x13*/ u8 tauntTimer1:4;
+ /*0x11*/ u8 rolloutTimer : 4;
+ /*0x11*/ u8 rolloutTimerStartValue : 4;
+ /*0x12*/ u8 chargeTimer : 4;
+ /*0x12*/ u8 chargeTimerStartValue : 4;
+ /*0x13*/ u8 tauntTimer:4;
/*0x13*/ u8 tauntTimer2:4;
- /*0x14*/ u8 bankPreventingEscape;
- /*0x15*/ u8 bankWithSureHit;
+ /*0x14*/ u8 battlerPreventingEscape;
+ /*0x15*/ u8 battlerWithSureHit;
/*0x16*/ u8 isFirstTurn;
/*0x17*/ u8 unk17;
/*0x18*/ u8 truantCounter : 1;
- /*0x18*/ u8 truantUnknownBit : 1;
+ /*0x18*/ u8 truantSwitchInHack : 1; // unused?
/*0x18*/ u8 unk18_a_2 : 2;
- /*0x18*/ u8 unk18_b : 4;
- /*0x19*/ u8 rechargeCounter;
+ /*0x18*/ u8 mimickedMoves : 4;
+ /*0x19*/ u8 rechargeTimer;
/*0x1A*/ u8 unk1A[2];
};
-extern struct DisableStruct gDisableStructs[BATTLE_BANKS_COUNT];
+extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT];
struct ProtectStruct
{
/* field_0 */
u32 protected:1;
u32 endured:1;
- u32 onlyStruggle:1;
+ u32 noValidMoves:1;
u32 helpingHand:1;
u32 bounceMove:1;
u32 stealMove:1;
@@ -295,7 +277,7 @@ struct ProtectStruct
u32 targetNotAffected:1;
u32 chargingTurn:1;
u32 fleeFlag:2; // for RunAway and Smoke Ball
- u32 usedImprisionedMove:1;
+ u32 usedImprisonedMove:1;
u32 loveImmobility:1;
u32 usedDisabledMove:1;
/* field_2 */
@@ -312,45 +294,45 @@ struct ProtectStruct
/* field_4 */ u32 physicalDmg;
/* field_8 */ u32 specialDmg;
- /* field_C */ u8 physicalBank;
- /* field_D */ u8 specialBank;
+ /* field_C */ u8 physicalBattlerId;
+ /* field_D */ u8 specialBattlerId;
/* field_E */ u16 fieldE;
};
-extern struct ProtectStruct gProtectStructs[BATTLE_BANKS_COUNT];
+extern struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT];
struct SpecialStatus
{
u8 statLowered : 1; // 0x1
u8 lightningRodRedirected : 1; // 0x2
- u8 restoredBankSprite: 1; // 0x4
- u8 intimidatedPoke : 1; // 0x8
+ u8 restoredBattlerSprite: 1; // 0x4
+ u8 intimidatedMon : 1; // 0x8
u8 traced : 1; // 0x10
- u8 flag20 : 1;
+ u8 ppNotAffectedByPressure : 1;
u8 flag40 : 1;
u8 focusBanded : 1;
u8 field1[3];
- s32 moveturnLostHP;
- s32 moveturnLostHP_physical;
- s32 moveturnLostHP_special;
- u8 moveturnPhysicalBank;
- u8 moveturnSpecialBank;
+ s32 dmg;
+ s32 physicalDmg;
+ s32 specialDmg;
+ u8 physicalBattlerId;
+ u8 specialBattlerId;
u8 field12;
u8 field13;
};
-extern struct SpecialStatus gSpecialStatuses[BATTLE_BANKS_COUNT];
+extern struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT];
struct SideTimer
{
/*0x00*/ u8 reflectTimer;
- /*0x01*/ u8 reflectBank;
+ /*0x01*/ u8 reflectBattlerId;
/*0x02*/ u8 lightscreenTimer;
- /*0x03*/ u8 lightscreenBank;
+ /*0x03*/ u8 lightscreenBattlerId;
/*0x04*/ u8 mistTimer;
- /*0x05*/ u8 mistBank;
+ /*0x05*/ u8 mistBattlerId;
/*0x06*/ u8 safeguardTimer;
- /*0x07*/ u8 safeguardBank;
+ /*0x07*/ u8 safeguardBattlerId;
/*0x08*/ u8 followmeTimer;
/*0x09*/ u8 followmeTarget;
/*0x0A*/ u8 spikesAmount;
@@ -361,14 +343,14 @@ extern struct SideTimer gSideTimers[];
struct WishFutureKnock
{
- u8 futureSightCounter[BATTLE_BANKS_COUNT];
- u8 futureSightAttacker[BATTLE_BANKS_COUNT];
- s32 futureSightDmg[BATTLE_BANKS_COUNT];
- u16 futureSightMove[BATTLE_BANKS_COUNT];
- u8 wishCounter[BATTLE_BANKS_COUNT];
- u8 wishUserID[BATTLE_BANKS_COUNT];
+ 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];
+ u8 wishMonId[MAX_BATTLERS_COUNT];
u8 weatherDuration;
- u8 knockedOffPokes[2];
+ u8 knockedOffMons[2];
};
extern struct WishFutureKnock gWishFutureKnock;
@@ -391,10 +373,6 @@ extern u8 gActiveBattler;
extern u8 gBattlerTarget;
extern u8 gAbsentBattlerFlags;
-// TODO: move these to constants/battle.h
-#define MAX_BATTLERS_COUNT 4
-#define BIT_FLANK 2
-
// script's table id to bit
#define AI_SCRIPT_CHECK_BAD_MOVE (1 << 0)
#define AI_SCRIPT_TRY_TO_FAINT (1 << 1)
@@ -413,6 +391,12 @@ extern u8 gAbsentBattlerFlags;
extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT];
+struct UsedMoves
+{
+ u16 moves[MAX_BATTLERS_COUNT];
+ u16 unknown[MAX_BATTLERS_COUNT];
+};
+
struct BattleHistory
{
/*0x00*/ u16 usedMoves[2][8]; // 0xFFFF means move not used (confuse self hit, etc)
@@ -436,27 +420,22 @@ struct BattleCallbacksStack
struct StatsArray
{
- u16 hp;
- u16 atk;
- u16 def;
- u16 spd;
- u16 spAtk;
- u16 spDef;
+ u16 stats[NUM_STATS];
};
struct BattleResources
{
- struct SecretBaseRecord* secretBase;
- struct UnknownFlags *flags;
- struct BattleScriptsStack* battleScriptsStack;
- struct BattleCallbacksStack* battleCallbackStack;
- struct StatsArray* statsBeforeLvlUp;
+ struct SecretBaseRecord *secretBase;
+ struct ResourceFlags *flags;
+ struct BattleScriptsStack *battleScriptsStack;
+ struct BattleCallbacksStack *battleCallbackStack;
+ struct StatsArray *beforeLvlUp;
struct AI_ThinkingStruct *ai;
struct BattleHistory *battleHistory;
struct BattleScriptsStack *AI_ScriptsStack;
};
-extern struct BattleResources* gBattleResources;
+extern struct BattleResources *gBattleResources;
#define BATTLESCRIPTS_STACK (gBattleResources->battleScriptsStack)
#define BATTLE_CALLBACKS_STACK (gBattleResources->battleCallbackStack)
@@ -467,18 +446,18 @@ struct BattleResults
u8 playerFaintCounter; // 0x0
u8 opponentFaintCounter; // 0x1
u8 playerSwitchesCounter; // 0x2
- u8 unk3; // 0x3
- u8 unk4; // 0x4
- u8 unk5_0:1; // 0x5
+ u8 numHealingItemsUsed; // 0x3
+ u8 numRevivesUsed; // 0x4
+ u8 playerMonWasDamaged:1; // 0x5
u8 usedMasterBall:1; // 0x5
u8 caughtMonBall:4; // 0x5
- u8 unk5_6:1; // 0x5
+ u8 shinyWildMon:1; // 0x5
u8 unk5_7:1; // 0x5
u16 playerMon1Species; // 0x6
u8 playerMon1Name[11]; // 0x8
u8 battleTurnCounter; // 0x13
u8 playerMon2Name[11]; // 0x14
- u8 field_1F; // 0x1F
+ u8 pokeblockThrows; // 0x1F
u16 lastOpponentSpecies; // 0x20
u16 lastUsedMovePlayer; // 0x22
u16 lastUsedMoveOpponent; // 0x24
@@ -494,39 +473,31 @@ extern struct BattleResults gBattleResults;
struct BattleStruct
{
u8 turnEffectsTracker;
- u8 turnEffectsBank;
+ u8 turnEffectsBattlerId;
u8 filler2;
- u8 turncountersTracker;
- u8 wrappedMove[8]; // ask gamefreak why they declared it that way
- u8 moveTarget[4];
- u8 expGetterId;
+ u8 turnCountersTracker;
+ u8 wrappedMove[MAX_BATTLERS_COUNT * 2]; // Leftover from Ruby's ewram access.
+ u8 moveTarget[MAX_BATTLERS_COUNT];
+ u8 expGetterMonId;
u8 field_11;
u8 wildVictorySong;
u8 dynamicMoveType;
u8 wrappedBy[4];
- u16 assistPossibleMoves[5 * 4]; // 5 mons, each of them knowing 4 moves
- u8 field_40;
- u8 field_41;
- u8 field_42;
- u8 field_43;
- u8 field_44;
- u8 field_45;
- u8 field_46;
- u8 field_47;
- u8 focusPunchBank;
+ u16 assistPossibleMoves[PARTY_SIZE * MAX_MON_MOVES]; // 6 mons, each of them knowing 4 moves
+ u8 focusPunchBattlerId;
u8 battlerPreventingSwitchout;
u8 moneyMultiplier;
u8 savedTurnActionNumber;
u8 switchInAbilitiesCounter;
u8 faintedActionsState;
- u8 faintedActionsBank;
+ u8 faintedActionsBattlerId;
u8 field_4F;
u16 expValue;
u8 field_52;
u8 sentInPokes;
- bool8 selectionScriptFinished[BATTLE_BANKS_COUNT];
+ bool8 selectionScriptFinished[MAX_BATTLERS_COUNT];
u8 field_58[4];
- u8 monToSwitchIntoId[BATTLE_BANKS_COUNT];
+ u8 monToSwitchIntoId[MAX_BATTLERS_COUNT];
u8 field_60[4][3];
u8 runTries;
u8 caughtMonNick[11];
@@ -535,11 +506,11 @@ struct BattleStruct
u8 safariPkblThrowCounter;
u8 safariEscapeFactor;
u8 safariCatchFactor;
- u8 field_7D;
- u8 field_7E;
+ u8 linkBattleVsSpriteId_V;
+ u8 linkBattleVsSpriteId_S;
u8 formToChangeInto;
- u8 chosenMovePositions[BATTLE_BANKS_COUNT];
- u8 stateIdAfterSelScript[BATTLE_BANKS_COUNT];
+ u8 chosenMovePositions[MAX_BATTLERS_COUNT];
+ u8 stateIdAfterSelScript[MAX_BATTLERS_COUNT];
u8 field_88;
u8 field_89;
u8 field_8A;
@@ -547,69 +518,48 @@ struct BattleStruct
u8 field_8C;
u8 field_8D;
u8 stringMoveType;
- u8 expGetterBank;
+ u8 expGetterBattlerId;
u8 field_90;
u8 field_91;
- u8 field_92;
- u8 field_93;
- u8 wallyBattleState;
- u8 wallyMovesState;
- u8 wallyWaitFrames;
- u8 wallyMoveFrames;
- u8 mirrorMoves[8]; // ask gamefreak why they declared it that way
- u8 field_A0;
- u8 field_A1;
- u8 field_A2;
- u8 field_A3;
- u8 field_A4;
- u8 field_A5;
- u8 field_A6;
- u8 field_A7;
+ u8 AI_monToSwitchIntoId[MAX_BATTLERS_COUNT];
+ u8 field_96;
+ u8 field_97;
+ u8 lastTakenMove[MAX_BATTLERS_COUNT * 2 * 2]; // ask gamefreak why they declared it that way
u16 hpOnSwitchout[2];
- u32 savedBattleTypeFlags;
u8 abilityPreventingSwitchout;
u8 hpScale;
- u8 synchronizeMoveEffect;
+ u8 field_AE;
+ u8 field_AF;
+ u8 field_B0;
+ u8 field_B1;
+ u8 field_B2;
u8 field_B3;
- u8 field_B4;
+ u8 synchronizeMoveEffect;
u8 field_B5;
u8 field_B6;
- u8 field_B7;
- // void (*savedCallback)(void);
- u16 usedHeldItems[BATTLE_BANKS_COUNT];
+ u8 atkCancellerTracker;
+ u16 usedHeldItems[MAX_BATTLERS_COUNT];
u8 chosenItem[4]; // why is this an u8?
u8 AI_itemType[2];
u8 AI_itemFlags[2];
- u16 choicedMove[BATTLE_BANKS_COUNT];
- u16 changedItems[BATTLE_BANKS_COUNT];
- u8 intimidateBank;
+ u16 choicedMove[MAX_BATTLERS_COUNT];
+ u16 changedItems[MAX_BATTLERS_COUNT];
+ u8 intimidateBattler;
u8 switchInItemsCounter;
- u8 field_DA;
+ u8 arenaTurnCounter; // not used in FR?
u8 turnSideTracker;
u8 fillerDC[0xDF-0xDC];
- u8 field_DF;
- u8 mirrorMoveArrays[32];
- u16 castformPalette[BATTLE_BANKS_COUNT][16];
- u8 field_180;
- u8 field_181;
+ u8 givenExpMons;
+ u8 lastTakenMoveFrom[MAX_BATTLERS_COUNT * MAX_BATTLERS_COUNT * 2];
+ u16 castformPalette[MAX_BATTLERS_COUNT][16];
+ u8 wishPerishSongState;
+ u8 wishPerishSongBattlerId;
u8 field_182;
u8 field_183;
- struct BattleEnigmaBerry battleEnigmaBerry;
- u8 wishPerishSongState;
- u8 wishPerishSongBank;
- bool8 overworldWeatherDone;
- u8 atkCancellerTracker;
- u8 field_1A4[96];
- u8 field_204[104];
- u8 field_26C[40];
- u8 AI_monToSwitchIntoId[BATTLE_BANKS_COUNT];
- u8 field_298[8];
- u8 field_2A0;
- u8 field_2A1;
- u8 field_2A2;
-};
+ u8 field_184[124]; // currently unknown
+}; // size == 0x200 bytes
-extern struct BattleStruct* gBattleStruct;
+extern struct BattleStruct *gBattleStruct;
#define GET_MOVE_TYPE(move, typeArg) \
{ \
@@ -621,6 +571,13 @@ extern struct BattleStruct* gBattleStruct;
#define IS_TYPE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY)
#define IS_TYPE_SPECIAL(moveType)(moveType > TYPE_MYSTERY)
+#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; \
+}
#define MOVE_EFFECT_SLEEP 0x1
#define MOVE_EFFECT_POISON 0x2
@@ -688,53 +645,8 @@ extern struct BattleStruct* gBattleStruct;
#define MOVE_EFFECT_AFFECTS_USER 0x40
#define MOVE_EFFECT_CERTAIN 0x80
-// table ids for general animations
-#define B_ANIM_CASTFORM_CHANGE 0x0
-#define B_ANIM_STATS_CHANGE 0x1
-#define B_ANIM_SUBSTITUTE_FADE 0x2
-#define B_ANIM_SUBSTITUTE_APPEAR 0x3
-#define B_ANIM_x4 0x4
-#define B_ANIM_ITEM_KNOCKOFF 0x5
-#define B_ANIM_TURN_TRAP 0x6
-#define B_ANIM_ITEM_EFFECT 0x7
-#define B_ANIM_SMOKEBALL_ESCAPE 0x8
-#define B_ANIM_HANGED_ON 0x9
-#define B_ANIM_RAIN_CONTINUES 0xA
-#define B_ANIM_SUN_CONTINUES 0xB
-#define B_ANIM_SANDSTORM_CONTINUES 0xC
-#define B_ANIM_HAIL_CONTINUES 0xD
-#define B_ANIM_LEECH_SEED_DRAIN 0xE
-#define B_ANIM_MON_HIT 0xF
-#define B_ANIM_ITEM_STEAL 0x10
-#define B_ANIM_SNATCH_MOVE 0x11
-#define B_ANIM_FUTURE_SIGHT_HIT 0x12
-#define B_ANIM_DOOM_DESIRE_HIT 0x13
-#define B_ANIM_x14 0x14
-#define B_ANIM_INGRAIN_HEAL 0x15
-#define B_ANIM_WISH_HEAL 0x16
-
-// special animations table
-#define B_ANIM_LVL_UP 0x0
-#define B_ANIM_SWITCH_OUT_PLAYER_MON 0x1
-#define B_ANIM_SWITCH_OUT_OPPONENT_MON 0x2
-#define B_ANIM_BALL_THROW 0x3
-#define B_ANIM_SAFARI_BALL_THROW 0x4
-#define B_ANIM_SUBSTITUTE_TO_MON 0x5
-#define B_ANIM_MON_TO_SUBSTITUTE 0x6
-
-// status animation table
-#define B_ANIM_STATUS_PSN 0x0
-#define B_ANIM_STATUS_CONFUSION 0x1
-#define B_ANIM_STATUS_BRN 0x2
-#define B_ANIM_STATUS_INFATUATION 0x3
-#define B_ANIM_STATUS_SLP 0x4
-#define B_ANIM_STATUS_PRZ 0x5
-#define B_ANIM_STATUS_FRZ 0x6
-#define B_ANIM_STATUS_CURSED 0x7
-#define B_ANIM_STATUS_NIGHTMARE 0x8
-#define B_ANIM_STATUS_WRAPPED 0x9
-
#define GET_STAT_BUFF_ID(n)((n & 0xF)) // first four bits 0x1, 0x2, 0x4, 0x8
+#define GET_STAT_BUFF_VALUE2(n)((n & 0xF0))
#define GET_STAT_BUFF_VALUE(n)(((n >> 4) & 7)) // 0x10, 0x20, 0x40
#define STAT_BUFF_NEGATIVE 0x80 // 0x80, the sign bit
@@ -779,13 +691,13 @@ struct BattleScripting
u8 animArg2;
u16 tripleKickPower;
u8 atk49_state;
- u8 bankWithAbility;
+ u8 battlerWithAbility;
u8 multihitMoveEffect;
- u8 bank;
+ u8 battler;
u8 animTurn;
u8 animTargetsHit;
u8 statChanger;
- u8 field_1B;
+ bool8 statAnimPlayed;
u8 atk23_state;
u8 battleStyle;
u8 atk6C_state;
@@ -794,12 +706,8 @@ struct BattleScripting
u8 reshowMainState;
u8 reshowHelperState;
u8 field_23;
- u8 field_24;
- u8 multiplayerId;
};
-extern struct BattleScripting gBattleScripting;
-
// functions
// battle_1
@@ -809,6 +717,7 @@ void ApplyPlayerChosenFrameToBattleMenu(void);
bool8 LoadChosenBattleElement(u8 caseId);
void DrawMainBattleBackground(void);
void task00_0800F6FC(u8 taskId);
+void sub_800F324(void);
enum
{
@@ -863,24 +772,23 @@ struct BattleAnimationInfo
struct BattleHealthboxInfo
{
- u8 flag_x1 : 1;
- u8 flag_x2 : 1;
- u8 flag_x4 : 1;
+ 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 flag_x80 : 1;
u8 field_1_x1 : 1;
- u8 field_1_x1E : 4;
- u8 field_1_x20 : 1;
+ u8 field_1_x1E : 5;
u8 field_1_x40 : 1;
u8 field_1_x80 : 1;
- u8 field_2;
- u8 field_3;
+ u8 healthboxBounceSpriteId;
+ u8 battlerBounceSpriteId;
u8 animationState;
u8 field_5;
- u8 field_6;
+ u8 matrixNum;
u8 shadowSpriteId;
u8 field_8;
u8 field_9;
@@ -892,14 +800,14 @@ struct BattleBarInfo
{
u8 healthboxSpriteId;
s32 maxValue;
- s32 currentValue;
+ s32 oldValue;
s32 receivedValue;
- s32 field_10;
+ s32 currValue;
};
struct BattleSpriteData
{
- struct BattleSpriteInfo *bankData;
+ struct BattleSpriteInfo *battlerData;
struct BattleHealthboxInfo *healthBoxesData;
struct BattleAnimationInfo *animationData;
struct BattleBarInfo *battleBars;
@@ -931,16 +839,30 @@ struct MonSpritesGfx
void *field_17C;
};
-extern struct BattleSpritesGfx* gMonSpritesGfx;
+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;
+extern struct BattleSpritesGfx *gMonSpritesGfx;
extern u8 gBattleOutcome;
extern u16 gLastUsedItem;
extern u32 gBattleTypeFlags;
-extern struct MonSpritesGfx* gMonSpritesGfxPtr;
+extern struct MonSpritesGfx *gMonSpritesGfxPtr;
extern u16 gTrainerBattleOpponent_A;
extern u16 gMoveToLearn;
extern u16 gBattleMovePower;
extern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT];
extern u16 gCurrentMove;
+extern u16 gChosenMove;
+extern u16 gCalledMove;
extern u8 gCritMultiplier;
extern u16 gBattleWeather;
extern u8 gLastUsedAbility;
@@ -949,8 +871,66 @@ 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 u8 gBattlerPositions[MAX_BATTLERS_COUNT];
+extern u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT];
extern u8 gBattleOutcome;
extern u8 gBattleMonForms[MAX_BATTLERS_COUNT];
+extern void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void);
+extern u32 gBattleControllerExecFlags;
+extern u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200];
+extern u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200];
+extern u8 gActionSelectionCursor[MAX_BATTLERS_COUNT];
+extern void (*gPreBattleCallback1)(void);
+extern bool8 gDoingBattleAnim;
+extern void *gUnknown_3005EE0[];
+extern u8 *gUnknown_2022BB8;
+extern u8 *gUnknown_2022BBC;
+extern void (*gBattleMainFunc)(void);
+extern u8 gMoveSelectionCursor[MAX_BATTLERS_COUNT];
+extern u32 gUnknown_2022B54;
+extern u8 gUnknown_2023DDC;
+extern u8 gBattlerAttacker;
+extern u8 gEffectBattler;
+extern u8 gMultiHitCounter;
+extern struct BattleScripting gBattleScripting;
+extern u8 gBattlerFainted;
+extern u32 gStatuses3[MAX_BATTLERS_COUNT];
+extern u8 gSentPokesToOpponent[2];
+extern const u8 *gBattlescriptCurrInstr;
+extern const u8 *gSelectionBattleScripts[MAX_BATTLERS_COUNT];
+extern u16 gLastMoves[MAX_BATTLERS_COUNT];
+extern u8 gBattlerByTurnOrder[MAX_BATTLERS_COUNT];
+extern u8 gBattleCommunication[BATTLE_COMMUNICATION_ENTRIES_COUNT];
+extern u16 gSideStatuses[2];
+extern u32 gHitMarker;
+extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT];
+extern u8 gMoveResultFlags;
+extern s32 gTakenDmg[MAX_BATTLERS_COUNT];
+extern u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT];
+extern u8 gCurrentActionFuncId;
+extern u8 gCurrMovePos;
+extern u8 gChosenMovePos;
+extern u8 gUnknown_3004FFC[MAX_BATTLERS_COUNT];
+extern u8 gBattlerStatusSummaryTaskId[MAX_BATTLERS_COUNT];
+extern u16 gDynamicBasePower;
+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 s32 gHpDealt;
+extern u16 gPauseCounterBattle;
+extern u16 gPaydayMoney;
+extern u16 gLockedMoves[MAX_BATTLERS_COUNT];
+extern u8 gCurrentTurnActionNumber;
+extern u16 gExpShareExp;
+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;
#endif // GUARD_BATTLE_H