summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorCameron Hall <camthesaxman@users.noreply.github.com>2019-07-30 21:31:27 -0500
committerGitHub <noreply@github.com>2019-07-30 21:31:27 -0500
commitbc159dbb03735db55e6a09bb7947dccc70d0532b (patch)
tree5b27866fe839d0f2f7ae76e0f13580ecea2dd863 /include
parentb8393b3a799f92e7064c266600607d98f6baf4d9 (diff)
parentcf0da4c3bb5658908275068591fe51fb6f2ce49d (diff)
Merge pull request #752 from camthesaxman/emerald_diff
resolve some Emerald differences
Diffstat (limited to 'include')
-rw-r--r--include/battle.h591
-rw-r--r--include/battle_message.h6
-rw-r--r--include/constants/battle.h238
-rw-r--r--include/ewram.h4
-rw-r--r--include/field_door.h2
-rw-r--r--include/gba/types.h23
-rw-r--r--include/link.h2
-rw-r--r--include/m4a.h6
-rw-r--r--include/rom3.h106
9 files changed, 498 insertions, 480 deletions
diff --git a/include/battle.h b/include/battle.h
index 78b9d13de..ac12533e3 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -5,9 +5,9 @@
#include "constants/battle.h"
#include "battle_setup.h"
-#define GET_BATTLER_POSITION(bank)((gBattlerPositions[bank]))
-#define GET_BATTLER_SIDE(bank)((GetBattlerPosition(bank) & BIT_SIDE))
-#define GET_BATTLER_SIDE2(bank)((GET_BATTLER_POSITION(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)
// Battle Actions
// These determine what each battler will do in a turn
@@ -21,13 +21,39 @@
#define B_ACTION_SAFARI_GO_NEAR 7
#define B_ACTION_SAFARI_RUN 8
// The exact purposes of these are unclear
-#define B_ACTION_WALLY_THROW 9
+#define B_ACTION_WALLY_THROW 9
#define B_ACTION_EXEC_SCRIPT 10 // when executing an action
-#define B_ACTION_CANCEL_PARTNER 12 // when choosing an action
+#define B_ACTION_TRY_FINISH 11
#define B_ACTION_FINISHED 12 // when executing an action
+
+#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 MAX_TRAINER_ITEMS 4
+#define MAX_MON_MOVES 4
+
+// array entries for battle communication
+#define MULTIUSE_STATE 0x0
+#define CURSOR_POSITION 0x1
+#define TASK_ID 0x1 // task Id and cursor position share the same field
+#define SPRITES_INIT_STATE1 0x1 // shares the Id as well
+#define SPRITES_INIT_STATE2 0x2
+#define MOVE_EFFECT_BYTE 0x3
+#define ACTIONS_CONFIRMED_COUNT 0x4
+#define MULTISTRING_CHOOSER 0x5
+#define MSG_DISPLAY 0x7
+#define BATTLE_COMMUNICATION_ENTRIES_COUNT 0x8
+
+#define MOVE_TARGET_SELECTED 0x0
+#define MOVE_TARGET_DEPENDS 0x1
+#define MOVE_TARGET_USER_OR_SELECTED 0x2
+#define MOVE_TARGET_RANDOM 0x4
+#define MOVE_TARGET_BOTH 0x8
+#define MOVE_TARGET_USER 0x10
+#define MOVE_TARGET_FOES_AND_ALLY 0x20
+#define MOVE_TARGET_OPPONENTS_FIELD 0x40
+
// defines for the u8 array gTypeEffectiveness
#define TYPE_EFFECT_ATK_TYPE(i)((gTypeEffectiveness[i + 0]))
#define TYPE_EFFECT_DEF_TYPE(i)((gTypeEffectiveness[i + 1]))
@@ -47,18 +73,189 @@
#define TYPE_IS_PHYSICAL(type) ((type) < TYPE_MYSTERY)
#define TYPE_IS_SPECIAL(type) ((type) > TYPE_MYSTERY)
-enum
+struct DisableStruct
+{
+ /*0x00*/ u32 transformedMonPersonality;
+ /*0x04*/ u16 disabledMove;
+ /*0x06*/ u16 encoredMove;
+ /*0x08*/ u8 protectUses;
+ /*0x09*/ u8 stockpileCounter;
+ /*0x0A*/ u8 substituteHP;
+ /*0x0B*/ u8 disableTimer1 : 4;
+ /*0x0B*/ u8 disableTimer2 : 4;
+ /*0x0C*/ u8 encoredMovePos;
+ /*0x0D*/ u8 unkD;
+ /*0x0E*/ u8 encoreTimer1 : 4;
+ /*0x0E*/ u8 encoreTimer2 : 4;
+ /*0x0F*/ u8 perishSongTimer1 : 4;
+ /*0x0F*/ u8 perishSongTimer2 : 4;
+ /*0x10*/ u8 furyCutterCounter;
+ /*0x11*/ u8 rolloutTimer1 : 4;
+ /*0x11*/ u8 rolloutTimer2 : 4;
+ /*0x12*/ u8 chargeTimer1 : 4;
+ /*0x12*/ u8 chargeTimer2 : 4;
+ /*0x13*/ u8 tauntTimer1:4;
+ /*0x13*/ u8 tauntTimer2:4;
+ /*0x14*/ u8 bankPreventingEscape;
+ /*0x15*/ u8 bankWithSureHit;
+ /*0x16*/ u8 isFirstTurn;
+ /*0x17*/ u8 unk17;
+ /*0x18*/ u8 truantCounter : 1;
+ /*0x18*/ u8 unk18_a : 3;
+ /*0x18*/ u8 unk18_b : 4;
+ /*0x19*/ u8 rechargeCounter;
+ /*0x1A*/ u8 unk1A[2];
+};
+
+struct ProtectStruct
+{
+ /*field0*/
+ u32 protected:1;
+ u32 endured:1;
+ u32 noValidMoves:1;
+ u32 helpingHand:1;
+ u32 bounceMove:1;
+ u32 stealMove:1;
+ u32 flag0Unknown:1;
+ u32 prlzImmobility:1;
+ /*field1*/
+ u32 confusionSelfDmg:1;
+ u32 targetNotAffected:1;
+ u32 chargingTurn:1;
+ u32 fleeFlag:2; // For RunAway and Smoke Ball.
+ u32 usedImprisonedMove:1;
+ u32 loveImmobility:1;
+ u32 usedDisabledMove:1;
+ /*field2*/
+ u32 usedTauntedMove:1;
+ u32 flag2Unknown:1;
+ u32 flinchImmobility:1;
+ u32 notFirstStrike:1;
+ u32 free : 4;
+ /*field3*/
+ u32 field3 : 8;
+ u32 physicalDmg;
+ u32 specialDmg;
+ u8 physicalBattlerId;
+ u8 specialBattlerId;
+ u16 fieldE;
+};
+
+struct SpecialStatus
+{
+ u8 statLowered:1;
+ u8 lightningRodRedirected:1;
+ u8 restoredBattlerSprite: 1;
+ u8 intimidatedMon:1;
+ u8 traced:1;
+ u8 ppNotAffectedByPressure:1;
+ u8 flag40:1;
+ u8 focusBanded:1;
+ u8 field1[3];
+ s32 dmg;
+ s32 physicalDmg;
+ s32 specialDmg;
+ u8 physicalBattlerId;
+ u8 specialBattlerId;
+ u8 field12;
+ u8 field13;
+};
+
+struct SideTimer
+{
+ u8 reflectTimer; //0x0
+ u8 lightscreenTimer; //0x1
+ u8 mistTimer; //0x2
+ u8 field3; //0x3
+ u16 field4; //0x4
+ u8 spikesAmount; //0x6
+ u8 safeguardTimer; //0x7
+ u8 followmeTimer; //0x8
+ u8 followmeTarget; //0x9
+ u8 fieldA; //0xA
+ u8 fieldB; //0xB
+};
+
+struct WishFutureKnock
+{
+ 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];
+};
+
+struct AI_ThinkingStruct /* 0x2016800 */
+{
+ /*0x00*/ u8 aiState;
+ /*0x01*/ u8 movesetIndex;
+ /*0x02*/ u16 moveConsidered;
+ /*0x04*/ s8 score[4]; // score?
+ /*0x08*/ u32 funcResult;
+ /*0x0C*/ u32 aiFlags;
+ /*0x10*/ u8 aiAction;
+ /*0x11*/ u8 aiLogicId;
+ /*0x12*/ u8 filler12[6];
+ /*0x18*/ u8 simulatedRNG[4];
+};
+
+struct BattleHistory
+{
+ /*0x00*/ u16 usedMoves[2][8]; // 0xFFFF means move not used (confuse self hit, etc)
+ /*0x20*/ u8 abilities[MAX_BATTLERS_COUNT / 2];
+ /*0x22*/ u8 itemEffects[MAX_BATTLERS_COUNT / 2];
+ /*0x24*/ u16 trainerItems[MAX_BATTLERS_COUNT];
+ /*0x2C*/ u8 numItems;
+};
+
+struct BattleScriptsStack
+{
+ const u8 *ptr[8];
+ u8 size;
+};
+
+struct BattleCallbacksStack
+{
+ void* ptr[8];
+ u8 size;
+};
+
+struct StatsArray
+{
+ u16 hp;
+ u16 atk;
+ u16 def;
+ u16 spd;
+ u16 spAtk;
+ u16 spDef;
+};
+
+struct BattleResults
{
- BATTLE_TERRAIN_GRASS,
- BATTLE_TERRAIN_LONG_GRASS,
- BATTLE_TERRAIN_SAND,
- BATTLE_TERRAIN_UNDERWATER,
- BATTLE_TERRAIN_WATER,
- BATTLE_TERRAIN_POND,
- BATTLE_TERRAIN_MOUNTAIN,
- BATTLE_TERRAIN_CAVE,
- BATTLE_TERRAIN_BUILDING,
- BATTLE_TERRAIN_PLAIN,
+ u8 playerFaintCounter; // 0x0
+ u8 opponentFaintCounter; // 0x1
+ u8 unk2; // 0x2
+ u8 unk3; // 0x3
+ u8 unk4; // 0x4
+ u8 unk5_0:1; // 0x5
+ u8 unk5_1:1; // 0x5
+ u16 poke1Species; // 0x6
+ u8 pokeString1[10]; // 0x8
+ u8 unk12;
+ u8 battleTurnCounter; // 0x13
+ u8 pokeString2[10]; // 0x14
+ u8 filler1E[2];
+ u16 lastOpponentSpecies; // 0x20
+ u16 lastUsedMove; // 0x22
+ u16 opponentMove; // 0x24
+ u16 opponentSpecies; // 0x26
+ u16 caughtPoke; // 0x28
+ u8 caughtNick[10]; // 0x2A
+ u8 filler34[2];
+ u8 usedBalls[11];
};
union TrainerMonPtr
@@ -83,35 +280,12 @@ struct Trainer
/*0x24*/ union TrainerMonPtr party;
};
-struct BattleHistory
-{
- /*0x00*/ u16 usedMoves[2][8]; // 0xFFFF means move not used (confuse self hit, etc)
- /*0x20*/ u8 abilities[MAX_BATTLERS_COUNT / 2];
- /*0x22*/ u8 itemEffects[MAX_BATTLERS_COUNT / 2];
- /*0x24*/ u16 trainerItems[MAX_BATTLERS_COUNT];
- /*0x2C*/ u8 numItems;
-};
-
struct AI_Stack
{
u8 *ptr[8];
u8 size;
};
-struct AI_ThinkingStruct /* 0x2016800 */
-{
- /*0x00*/ u8 aiState;
- /*0x01*/ u8 movesetIndex;
- /*0x02*/ u16 moveConsidered;
- /*0x04*/ s8 score[4]; // score?
- /*0x08*/ u32 funcResult;
- /*0x0C*/ u32 aiFlags;
- /*0x10*/ u8 aiAction;
- /*0x11*/ u8 aiLogicId;
- /*0x12*/ u8 filler12[6];
- /*0x18*/ u8 simulatedRNG[4];
-};
-
struct BattleStruct /* 0x2000000 */
{
/*0x00000*/ u8 unk0;
@@ -352,77 +526,6 @@ struct BattleStruct /* 0x2000000 */
/* 0x16A00 */ struct BattleHistory unk_2016A00_2;
};
-struct StatsArray
-{
- u16 hp;
- u16 atk;
- u16 def;
- u16 spd;
- u16 spAtk;
- u16 spDef;
-};
-
-#define gBattleResources_statsBeforeLvlUp ((struct StatsArray *)(gSharedMem + 0x17180))
-
-struct DisableStruct
-{
- /*0x00*/ u32 transformedMonPersonality;
- /*0x04*/ u16 disabledMove;
- /*0x06*/ u16 encoredMove;
- /*0x08*/ u8 protectUses;
- /*0x09*/ u8 stockpileCounter;
- /*0x0A*/ u8 substituteHP;
- /*0x0B*/ u8 disableTimer1 : 4;
- /*0x0B*/ u8 disableTimer2 : 4;
- /*0x0C*/ u8 encoredMovePos;
- /*0x0D*/ u8 unkD;
- /*0x0E*/ u8 encoreTimer1 : 4;
- /*0x0E*/ u8 encoreTimer2 : 4;
- /*0x0F*/ u8 perishSongTimer1 : 4;
- /*0x0F*/ u8 perishSongTimer2 : 4;
- /*0x10*/ u8 furyCutterCounter;
- /*0x11*/ u8 rolloutTimer1 : 4;
- /*0x11*/ u8 rolloutTimer2 : 4;
- /*0x12*/ u8 chargeTimer1 : 4;
- /*0x12*/ u8 chargeTimer2 : 4;
- /*0x13*/ u8 tauntTimer1:4;
- /*0x13*/ u8 tauntTimer2:4;
- /*0x14*/ u8 bankPreventingEscape;
- /*0x15*/ u8 bankWithSureHit;
- /*0x16*/ u8 isFirstTurn;
- /*0x17*/ u8 unk17;
- /*0x18*/ u8 truantCounter : 1;
- /*0x18*/ u8 unk18_a : 3;
- /*0x18*/ u8 unk18_b : 4;
- /*0x19*/ u8 rechargeCounter;
- /*0x1A*/ u8 unk1A[2];
-};
-
-struct BattleResults
-{
- u8 playerFaintCounter; // 0x0
- u8 opponentFaintCounter; // 0x1
- u8 unk2; // 0x2
- u8 unk3; // 0x3
- u8 unk4; // 0x4
- u8 unk5_0:1; // 0x5
- u8 unk5_1:1; // 0x5
- u16 poke1Species; // 0x6
- u8 pokeString1[10]; // 0x8
- u8 unk12;
- u8 battleTurnCounter; // 0x13
- u8 pokeString2[10]; // 0x14
- u8 filler1E[2];
- u16 lastOpponentSpecies; // 0x20
- u16 lastUsedMove; // 0x22
- u16 opponentMove; // 0x24
- u16 opponentSpecies; // 0x26
- u16 caughtPoke; // 0x28
- u8 caughtNick[10]; // 0x2A
- u8 filler34[2];
- u8 usedBalls[11];
-};
-
struct Struct2017100
{
u32 arr[4];
@@ -478,96 +581,7 @@ struct Struct20238C8
u8 unk0_7:1;
};
-struct ProtectStruct
-{
- /*field0*/
- u32 protected:1;
- u32 endured:1;
- u32 onlyStruggle:1;
- u32 helpingHand:1;
- u32 bounceMove:1;
- u32 stealMove:1;
- u32 flag0Unknown:1;
- u32 prlzImmobility:1;
- /*field1*/
- u32 confusionSelfDmg:1;
- u32 notEffective:1;
- u32 chargingTurn:1;
- u32 fleeFlag:2; //for RunAway and Smoke Ball
- u32 usedImprisionedMove:1;
- u32 loveImmobility:1;
- u32 usedDisabledMove:1;
- /*field2*/
- u32 usedTauntedMove:1;
- u32 flag2Unknown:1;
- u32 flinchImmobility:1;
- u32 notFirstStrike:1;
- u32 free : 4;
- /*field3*/
- u32 field3 : 8;
- u32 physicalDmg;
- u32 specialDmg;
- u8 physicalBank;
- u8 specialBank;
- u16 fieldE;
-};
-
-struct SpecialStatus
-{
- u8 statLowered : 1;
- u8 lightningRodRedirected : 1;
- u8 restoredBankSprite: 1;
- u8 intimidatedPoke : 1;
- u8 traced : 1;
- u8 flag20 : 1;
- u8 flag40 : 1;
- u8 focusBanded : 1;
- u8 field1[3];
- s32 moveturnLostHP;
- s32 moveturnLostHP_physical;
- s32 moveturnLostHP_special;
- u8 moveturnPhysicalBank;
- u8 moveturnSpecialBank;
- u8 field12;
- u8 field13;
-};
-
-struct sideTimer
-{
- u8 reflectTimer; //0x0
- u8 lightscreenTimer; //0x1
- u8 mistTimer; //0x2
- u8 field3; //0x3
- u16 field4; //0x4
- u8 spikesAmount; //0x6
- u8 safeguardTimer; //0x7
- u8 followmeTimer; //0x8
- u8 followmeTarget; //0x9
- u8 fieldA; //0xA
- u8 fieldB; //0xB
-};
-
-struct WishFutureKnock
-{
- 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 wishUserID[MAX_BATTLERS_COUNT];
- u8 weatherDuration;
- u8 knockedOffPokes[2];
-};
-
-extern struct BattleHistory unk_2016A00;
-extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT];
-extern struct BattleResults gBattleResults;
-extern struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT];
-extern struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT];
-extern struct sideTimer gSideTimers[2];
-extern struct WishFutureKnock gWishFutureKnock;
-extern struct AI_ThinkingStruct gAIThinkingSpace;
-extern struct Struct20238C8 gUnknown_020238C8;
+#define gBattleResources_statsBeforeLvlUp ((struct StatsArray *)(gSharedMem + 0x17180))
#define GET_MOVE_TYPE(move, typeArg) \
{ \
@@ -577,73 +591,20 @@ extern struct Struct20238C8 gUnknown_020238C8;
typeArg = gBattleMoves[move].type; \
}
-#define MOVE_EFFECT_SLEEP 0x1
-#define MOVE_EFFECT_POISON 0x2
-#define MOVE_EFFECT_BURN 0x3
-#define MOVE_EFFECT_FREEZE 0x4
-#define MOVE_EFFECT_PARALYSIS 0x5
-#define MOVE_EFFECT_TOXIC 0x6
-#define MOVE_EFFECT_CONFUSION 0x7
-#define MOVE_EFFECT_FLINCH 0x8
-#define MOVE_EFFECT_TRI_ATTACK 0x9
-#define MOVE_EFFECT_UPROAR 0xA
-#define MOVE_EFFECT_PAYDAY 0xB
-#define MOVE_EFFECT_CHARGING 0xC
-#define MOVE_EFFECT_WRAP 0xD
-#define MOVE_EFFECT_RECOIL_25 0xE
-#define MOVE_EFFECT_ATK_PLUS_1 0xF
-#define MOVE_EFFECT_DEF_PLUS_1 0x10
-#define MOVE_EFFECT_SPD_PLUS_1 0x11
-#define MOVE_EFFECT_SP_ATK_PLUS_1 0x12
-#define MOVE_EFFECT_SP_DEF_PLUS_1 0x13
-#define MOVE_EFFECT_ACC_PLUS_1 0x14
-#define MOVE_EFFECT_EVS_PLUS_1 0x15
-#define MOVE_EFFECT_ATK_MINUS_1 0x16
-#define MOVE_EFFECT_DEF_MINUS_1 0x17
-#define MOVE_EFFECT_SPD_MINUS_1 0x18
-#define MOVE_EFFECT_SP_ATK_MINUS_1 0x19
-#define MOVE_EFFECT_SP_DEF_MINUS_1 0x1A
-#define MOVE_EFFECT_ACC_MINUS_1 0x1B
-#define MOVE_EFFECT_EVS_MINUS_1 0x1C
-#define MOVE_EFFECT_RECHARGE 0x1D
-#define MOVE_EFFECT_RAGE 0x1E
-#define MOVE_EFFECT_STEAL_ITEM 0x1F
-#define MOVE_EFFECT_PREVENT_ESCAPE 0x20
-#define MOVE_EFFECT_NIGHTMARE 0x21
-#define MOVE_EFFECT_ALL_STATS_UP 0x22
-#define MOVE_EFFECT_RAPIDSPIN 0x23
-#define MOVE_EFFECT_REMOVE_PARALYSIS 0x24
-#define MOVE_EFFECT_ATK_DEF_DOWN 0x25
-#define MOVE_EFFECT_RECOIL_33_PARALYSIS 0x26
-#define MOVE_EFFECT_ATK_PLUS_2 0x27
-#define MOVE_EFFECT_DEF_PLUS_2 0x28
-#define MOVE_EFFECT_SPD_PLUS_2 0x29
-#define MOVE_EFFECT_SP_ATK_PLUS_2 0x2A
-#define MOVE_EFFECT_SP_DEF_PLUS_2 0x2B
-#define MOVE_EFFECT_ACC_PLUS_2 0x2C
-#define MOVE_EFFECT_EVS_PLUS_2 0x2D
-#define MOVE_EFFECT_ATK_MINUS_2 0x2E
-#define MOVE_EFFECT_DEF_MINUS_2 0x2F
-#define MOVE_EFFECT_SPD_MINUS_2 0x30
-#define MOVE_EFFECT_SP_ATK_MINUS_2 0x31
-#define MOVE_EFFECT_SP_DEF_MINUS_2 0x32
-#define MOVE_EFFECT_ACC_MINUS_2 0x33
-#define MOVE_EFFECT_EVS_MINUS_2 0x34
-#define MOVE_EFFECT_THRASH 0x35
-#define MOVE_EFFECT_KNOCK_OFF 0x36
-#define MOVE_EFFECT_NOTHING_37 0x37
-#define MOVE_EFFECT_NOTHING_38 0x38
-#define MOVE_EFFECT_NOTHING_39 0x39
-#define MOVE_EFFECT_NOTHING_3A 0x3A
-#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B
-#define MOVE_EFFECT_NOTHING_3C 0x3C
-#define MOVE_EFFECT_NOTHING_3D 0x3D
-#define MOVE_EFFECT_NOTHING_3E 0x3E
-#define MOVE_EFFECT_NOTHING_3F 0x3F
-#define MOVE_EFFECT_AFFECTS_USER 0x40
-#define MOVE_EFFECT_CERTAIN 0x80
+#define IS_TYPE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY)
+#define IS_TYPE_SPECIAL(moveType)(moveType > TYPE_MYSTERY)
+
+#define TARGET_TURN_DAMAGED (((gSpecialStatuses[gBattlerTarget].physicalDmg || gSpecialStatuses[gBattlerTarget].specialDmg)))
+
+#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 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
@@ -651,6 +612,16 @@ extern struct Struct20238C8 gUnknown_020238C8;
#define SET_STATCHANGER(statId, stage, goesDown)(gBattleScripting.statChanger = (statId) + (stage << 4) + (goesDown << 7))
+extern struct BattleHistory unk_2016A00;
+extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT];
+extern struct BattleResults gBattleResults;
+extern struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT];
+extern struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT];
+extern struct SideTimer gSideTimers[2];
+extern struct WishFutureKnock gWishFutureKnock;
+extern struct AI_ThinkingStruct gAIThinkingSpace;
+extern struct Struct20238C8 gUnknown_020238C8;
+
// used in many battle files, it seems as though Hisashi Sogabe wrote
// some sort of macro to replace the use of actually calling memset.
// Perhaps it was thought calling memset was much slower?
@@ -679,60 +650,36 @@ extern struct Struct20238C8 gUnknown_020238C8;
typedef void (*BattleCmdFunc)(void);
-struct funcStack
-{
- void* ptr[8];
- u8 size;
-};
-
-struct scriptsStack
-{
- const u8 *ptr[8];
- u8 size;
-};
-
-#define IS_TYPE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY)
-#define IS_TYPE_SPECIAL(moveType)(moveType > TYPE_MYSTERY)
-
-#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 GET_STAT_BUFF_VALUE2(n)((n & 0xF0))
-
extern u8 gBattleTextBuff1[];
//function declarations of buffer emits
-void EmitGetAttributes(u8 buffID, u8 request, u8 c); //0x0
-void Emitcmd1(u8 a, u8 b, u8 c); //0x1
-void EmitSetMonData(u8 a, u8 request, u8 c, u8 bytes, void *data); //0x2
-void EmitSendOutPoke(u8 a, u8 b, u8 c); //0x5
-void EmitReturnPokeToBall(u8 a, u8 b); //0x6
-void EmitTrainerSlide(u8 a); //0x8
-void Emitcmd10(u8 a); //0xA
-void EmitBallThrow(u8 a, u8 shakes); //0xD
-//void EmitMoveAnimation(u8 a, u16 move, u8 turn, u16 power, s32 dmg, u8 happiness, void *disable_struct); //0xF
-void EmitPrintString(u8 a, u16 stringID); //0x10
-//void EmitPrintStringPlayerOnly(u8 a, u16 stringID); //0x11
-void EmitChoosePokemon(u8 a, u8 b, u8 c, u8 d, u8 *e); //0x16
-//void EmitHealthBarUpdate(u8 a, u16 b); //0x18; Had to declare the second arg as u16 because s16 wont match in atk0b
-//void EmitExpBarUpdate(u8 a, u8 b, u16 c); //0x19
-void EmitStatusIconUpdate(u8 a, u32 b, u32 c); //0x1A
-void EmitStatusAnimation(u8 a, u8 b, u32 c); //0x1B
-void EmitStatusXor(u8 a, u8 b); //0x1C
-void EmitHitAnimation(u8 a); //0x29
-void EmitEffectivenessSound(u8 a, u16 sound); //0x2B
-void Emitcmd44(u8 a, u16 sound); //0x2C
-void EmitFaintingCry(u8 a); //0x2D
-void EmitIntroSlide(u8 a, u8 b); //0x2E
-void Emitcmd49(u8 a); //0x31
-void EmitSpriteInvisibility(u8 a, u8 b); //0x33
-void EmitBattleAnimation(u8 a, u8 b, u16 c); //0x34
-void EmitResetActionMoveSelection(u8 a, u8 b); //0x36
-void Emitcmd55(u8 a, u8 b); //0x37
+void BtlController_EmitGetMonData(u8 buffID, u8 request, u8 c); //0x0
+void BtlController_EmitGetRawMonData(u8 a, u8 b, u8 c); //0x1
+void BtlController_EmitSetMonData(u8 a, u8 request, u8 c, u8 bytes, void *data); //0x2
+void BtlController_EmitSwitchInAnim(u8 a, u8 b, u8 c); //0x5
+void BtlController_EmitReturnMonToBall(u8 a, u8 b); //0x6
+void BtlController_EmitTrainerSlide(u8 a); //0x8
+void BtlController_EmitFaintAnimation(u8 a); //0xA
+void BtlController_EmitBallThrowAnim(u8 a, u8 shakes); //0xD
+//void BtlController_EmitMoveAnimation(u8 a, u16 move, u8 turn, u16 power, s32 dmg, u8 happiness, void *disable_struct); //0xF
+void BtlController_EmitPrintString(u8 a, u16 stringID); //0x10
+//void BtlController_EmitPrintSelectionString(u8 a, u16 stringID); //0x11
+void BtlController_EmitChoosePokemon(u8 a, u8 b, u8 c, u8 d, u8 *e); //0x16
+//void BtlController_EmitHealthBarUpdate(u8 a, u16 b); //0x18; Had to declare the second arg as u16 because s16 wont match in atk0b
+//void BtlController_EmitExpUpdate(u8 a, u8 b, u16 c); //0x19
+void BtlController_EmitStatusIconUpdate(u8 a, u32 b, u32 c); //0x1A
+void BtlController_EmitStatusAnimation(u8 a, u8 b, u32 c); //0x1B
+void BtlController_EmitStatusXor(u8 a, u8 b); //0x1C
+void BtlController_EmitHitAnimation(u8 a); //0x29
+void BtlController_EmitPlaySE(u8 a, u16 sound); //0x2B
+void BtlController_EmitPlayFanfareOrBGM(u8 a, u16 sound); //0x2C
+void BtlController_EmitFaintingCry(u8 a); //0x2D
+void BtlController_EmitIntroSlide(u8 a, u8 b); //0x2E
+void BtlController_EmitHidePartyStatusSummary(u8 a); //0x31
+void BtlController_EmitSpriteInvisibility(u8 a, u8 b); //0x33
+void BtlController_EmitBattleAnimation(u8 a, u8 b, u16 c); //0x34
+void BtlController_EmitResetActionMoveSelection(u8 a, u8 b); //0x36
+void BtlController_EmitCmd55(u8 a, u8 b); //0x37
#define REQUEST_ALL_BATTLE 0x0
#define REQUEST_SPECIES_BATTLE 0x1
@@ -745,7 +692,7 @@ void Emitcmd55(u8 a, u8 b); //0x37
#define REQUEST_STATUS_BATTLE 0x28
#define REQUEST_HP_BATTLE 0x2A
-void MarkBufferBankForExecution(u8 bank);
+void MarkBattlerForControllerExec(u8 bank);
extern u8 gBattleTextBuff1[];
@@ -776,12 +723,12 @@ void ApplyPlayerChosenFrameToBattleMenu();
void DrawMainBattleBackground(void);
void LoadBattleTextboxAndBackground();
void sub_800DE30(u8);
-void LoadBattleEntryBackground();
+void DrawBattleEntryBackground();
// src/battle_2.o
-void sub_800E7C4(void);
-void InitBattle(void);
-void sub_800EC9C(void);
+void CB2_InitBattle(void);
+void CB2_InitBattleInternal(void);
+void CB2_HandleStartBattle(void);
void sub_800F104(void);
void sub_800F298(void);
void BattleMainCB2(void);
@@ -803,7 +750,7 @@ void nullsub_86(struct Sprite *);
void objc_dp11b_pingpong(struct Sprite *);
void nullsub_41(void);
void sub_8010800(void);
-void sub_8010824(void);
+void BattleMainCB1(void);
void sub_8010874(void);
void bc_8012FAC(void);
void sub_8011384(void);
diff --git a/include/battle_message.h b/include/battle_message.h
index 9c27994ee..97a42bbf8 100644
--- a/include/battle_message.h
+++ b/include/battle_message.h
@@ -1,6 +1,8 @@
#ifndef GUARD_BATTLE_MESSAGE_H
#define GUARD_BATTLE_MESSAGE_H
+#define TEXT_BUFF_ARRAY_COUNT 16
+
struct StringInfoBattle
{
u16 currentMove;
@@ -154,7 +156,7 @@ struct StringInfoBattle
}
void BufferStringBattle(u16 stringID);
-u32 StrCpyDecodeToDisplayedStringBattle(const u8* src);
-u32 StrCpyDecodeBattle(const u8* src, u8* dst);
+u32 BattleStringExpandPlaceholdersToDisplayedString(const u8* src);
+u32 BattleStringExpandPlaceholders(const u8* src, u8* dst);
#endif // GUARD_BATTLE_MESSAGE_H
diff --git a/include/constants/battle.h b/include/constants/battle.h
index afa7fecf1..c33e0abb4 100644
--- a/include/constants/battle.h
+++ b/include/constants/battle.h
@@ -43,6 +43,41 @@
#define BIT_SIDE 1
#define BIT_FLANK 2
+#define BATTLE_TYPE_DOUBLE 0x0001
+#define BATTLE_TYPE_LINK 0x0002
+#define BATTLE_TYPE_WILD 0x0004
+#define BATTLE_TYPE_TRAINER 0x0008
+#define BATTLE_TYPE_FIRST_BATTLE 0x0010
+#define BATTLE_TYPE_20 0x0020
+#define BATTLE_TYPE_MULTI 0x0040
+#define BATTLE_TYPE_SAFARI 0x0080
+#define BATTLE_TYPE_BATTLE_TOWER 0x0100
+#define BATTLE_TYPE_WALLY_TUTORIAL 0x0200
+#define BATTLE_TYPE_ROAMER 0x0400
+#define BATTLE_TYPE_EREADER_TRAINER 0x0800
+#define BATTLE_TYPE_KYOGRE_GROUDON 0x1000
+#define BATTLE_TYPE_LEGENDARY 0x2000
+#define BATTLE_TYPE_REGI 0x4000
+#define BATTLE_TYPE_LINK_DOUBLE (BATTLE_TYPE_MULTI | BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE)
+
+#define SECRET_BASE_OPPONENT 0x400
+#define LINK_BATTLE_OPPONENT 0x800
+
+#define BATTLE_WON 0x1
+#define BATTLE_LOST 0x2
+#define BATTLE_DREW 0x3
+#define BATTLE_RAN 0x4
+#define BATTLE_PLAYER_TELEPORTED 0x5
+#define BATTLE_POKE_FLED 0x6
+#define BATTLE_CAUGHT 0x7
+#define BATTLE_OUT_OF_BALLS 0x8
+#define BATTLE_OPPONENT_TELEPORTED 0xA
+
+#define OUTCOME_LINK_BATTLE_RUN 0x80
+
+// Non-volatile status conditions
+// These persist remain outside of battle and after switching out
+#define STATUS1_NONE 0x0
#define STATUS_SLEEP 0x7
#define STATUS_POISON 0x8
#define STATUS_BURN 0x10
@@ -50,10 +85,11 @@
#define STATUS_PARALYSIS 0x40
#define STATUS_TOXIC_POISON 0x80
#define STATUS_TOXIC_COUNTER 0xF00
-
#define STATUS_PSN_ANY ((STATUS_POISON | STATUS_TOXIC_POISON))
#define STATUS_ANY ((STATUS_SLEEP | STATUS_POISON | STATUS_BURN | STATUS_FREEZE | STATUS_PARALYSIS | STATUS_TOXIC_POISON))
+// Volatile status ailments
+// These are removed after exiting the battle or switching out
#define STATUS2_CONFUSION 0x00000007
#define STATUS2_FLINCHED 0x00000008
#define STATUS2_UPROAR 0x00000070
@@ -62,6 +98,7 @@
#define STATUS2_MULTIPLETURNS 0x00001000
#define STATUS2_WRAPPED 0x0000E000
#define STATUS2_INFATUATION 0x000F0000
+#define STATUS2_INFATUATED_WITH(battler) (gBitTable[battler] << 16)
#define STATUS2_FOCUS_ENERGY 0x00100000
#define STATUS2_TRANSFORMED 0x00200000
#define STATUS2_RECHARGE 0x00400000
@@ -75,6 +112,7 @@
#define STATUS2_DEFENSE_CURL 0x40000000
#define STATUS2_TORMENT 0x80000000
+// Seems like per-battler statuses. Not quite sure how to categorize these
#define STATUS3_LEECHSEED_BANK 0x3
#define STATUS3_LEECHSEED 0x4
#define STATUS3_ALWAYS_HITS 0x18 //two bits
@@ -93,9 +131,9 @@
#define STATUS3_UNDERWATER 0x40000
#define STATUS3_INTIMIDATE_POKES 0x80000
#define STATUS3_TRACE 0x100000
-
#define STATUS3_SEMI_INVULNERABLE ((STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER))
+// Not really sure what a "hitmarker" is.
#define HITMARKER_x10 0x00000010
#define HITMARKER_x20 0x00000020
#define HITMARKER_DESTINYBOND 0x00000040
@@ -123,6 +161,16 @@
#define HITMARKER_FAINTED(bank) ((gBitTable[bank] << 0x1C))
#define HITMARKER_UNK(bank) ((0x10000000 << bank))
+// Per-side statuses that affect an entire party
+#define SIDE_STATUS_REFLECT (1 << 0)
+#define SIDE_STATUS_LIGHTSCREEN (1 << 1)
+#define SIDE_STATUS_X4 (1 << 2)
+#define SIDE_STATUS_SPIKES (1 << 4)
+#define SIDE_STATUS_SAFEGUARD (1 << 5)
+#define SIDE_STATUS_FUTUREATTACK (1 << 6)
+#define SIDE_STATUS_MIST (1 << 8)
+#define SIDE_STATUS_SPIKES_DAMAGED (1 << 9)
+
// Flags describing move's result
#define MOVE_RESULT_MISSED (1 << 0)
#define MOVE_RESULT_SUPER_EFFECTIVE (1 << 1)
@@ -134,62 +182,99 @@
#define MOVE_RESULT_FOE_HUNG_ON (1 << 7)
#define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED)
-#define BATTLE_TYPE_DOUBLE 0x0001
-#define BATTLE_TYPE_LINK 0x0002
-#define BATTLE_TYPE_WILD 0x0004
-#define BATTLE_TYPE_TRAINER 0x0008
-#define BATTLE_TYPE_FIRST_BATTLE 0x0010
-#define BATTLE_TYPE_20 0x0020
-#define BATTLE_TYPE_MULTI 0x0040
-#define BATTLE_TYPE_SAFARI 0x0080
-#define BATTLE_TYPE_BATTLE_TOWER 0x0100
-#define BATTLE_TYPE_WALLY_TUTORIAL 0x0200
-#define BATTLE_TYPE_ROAMER 0x0400
-#define BATTLE_TYPE_EREADER_TRAINER 0x0800
-#define BATTLE_TYPE_KYOGRE_GROUDON 0x1000
-#define BATTLE_TYPE_LEGENDARY 0x2000
-#define BATTLE_TYPE_REGI 0x4000
-#define BATTLE_TYPE_LINK_DOUBLE (BATTLE_TYPE_MULTI | BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE)
-
-#define SECRET_BASE_OPPONENT 0x400
-#define LINK_BATTLE_OPPONENT 0x800
-
-#define BATTLE_WON 0x1
-#define BATTLE_LOST 0x2
-#define BATTLE_DREW 0x3
-#define BATTLE_RAN 0x4
-#define BATTLE_PLAYER_TELEPORTED 0x5
-#define BATTLE_POKE_FLED 0x6
-#define BATTLE_CAUGHT 0x7
-#define BATTLE_OUT_OF_BALLS 0x8
-#define BATTLE_OPPONENT_TELEPORTED 0xA
-
-#define OUTCOME_LINK_BATTLE_RUN 0x80
-
-#define SIDE_STATUS_REFLECT (1 << 0)
-#define SIDE_STATUS_LIGHTSCREEN (1 << 1)
-#define SIDE_STATUS_X4 (1 << 2)
-#define SIDE_STATUS_SPIKES (1 << 4)
-#define SIDE_STATUS_SAFEGUARD (1 << 5)
-#define SIDE_STATUS_FUTUREATTACK (1 << 6)
-#define SIDE_STATUS_MIST (1 << 8)
-#define SIDE_STATUS_SPIKES_DAMAGED (1 << 9)
+// Battle Weather flags
+#define WEATHER_RAIN_TEMPORARY (1 << 0)
+#define WEATHER_RAIN_DOWNPOUR (1 << 1) // unused
+#define WEATHER_RAIN_PERMANENT (1 << 2)
+#define WEATHER_RAIN_ANY (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_DOWNPOUR | WEATHER_RAIN_PERMANENT)
+#define WEATHER_SANDSTORM_TEMPORARY (1 << 3)
+#define WEATHER_SANDSTORM_PERMANENT (1 << 4)
+#define WEATHER_SANDSTORM_ANY (WEATHER_SANDSTORM_TEMPORARY | WEATHER_SANDSTORM_PERMANENT)
+#define WEATHER_SUN_TEMPORARY (1 << 5)
+#define WEATHER_SUN_PERMANENT (1 << 6)
+#define WEATHER_SUN_ANY (WEATHER_SUN_TEMPORARY | WEATHER_SUN_PERMANENT)
+#define WEATHER_HAIL (1 << 7)
+#define WEATHER_HAIL_ANY (WEATHER_HAIL)
+#define WEATHER_ANY (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY)
-#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
+// Move Effects
+#define MOVE_EFFECT_SLEEP 0x1
+#define MOVE_EFFECT_POISON 0x2
+#define MOVE_EFFECT_BURN 0x3
+#define MOVE_EFFECT_FREEZE 0x4
+#define MOVE_EFFECT_PARALYSIS 0x5
+#define MOVE_EFFECT_TOXIC 0x6
+#define MOVE_EFFECT_CONFUSION 0x7
+#define MOVE_EFFECT_FLINCH 0x8
+#define MOVE_EFFECT_TRI_ATTACK 0x9
+#define MOVE_EFFECT_UPROAR 0xA
+#define MOVE_EFFECT_PAYDAY 0xB
+#define MOVE_EFFECT_CHARGING 0xC
+#define MOVE_EFFECT_WRAP 0xD
+#define MOVE_EFFECT_RECOIL_25 0xE
+#define MOVE_EFFECT_ATK_PLUS_1 0xF
+#define MOVE_EFFECT_DEF_PLUS_1 0x10
+#define MOVE_EFFECT_SPD_PLUS_1 0x11
+#define MOVE_EFFECT_SP_ATK_PLUS_1 0x12
+#define MOVE_EFFECT_SP_DEF_PLUS_1 0x13
+#define MOVE_EFFECT_ACC_PLUS_1 0x14
+#define MOVE_EFFECT_EVS_PLUS_1 0x15
+#define MOVE_EFFECT_ATK_MINUS_1 0x16
+#define MOVE_EFFECT_DEF_MINUS_1 0x17
+#define MOVE_EFFECT_SPD_MINUS_1 0x18
+#define MOVE_EFFECT_SP_ATK_MINUS_1 0x19
+#define MOVE_EFFECT_SP_DEF_MINUS_1 0x1A
+#define MOVE_EFFECT_ACC_MINUS_1 0x1B
+#define MOVE_EFFECT_EVS_MINUS_1 0x1C
+#define MOVE_EFFECT_RECHARGE 0x1D
+#define MOVE_EFFECT_RAGE 0x1E
+#define MOVE_EFFECT_STEAL_ITEM 0x1F
+#define MOVE_EFFECT_PREVENT_ESCAPE 0x20
+#define MOVE_EFFECT_NIGHTMARE 0x21
+#define MOVE_EFFECT_ALL_STATS_UP 0x22
+#define MOVE_EFFECT_RAPIDSPIN 0x23
+#define MOVE_EFFECT_REMOVE_PARALYSIS 0x24
+#define MOVE_EFFECT_ATK_DEF_DOWN 0x25
+#define MOVE_EFFECT_RECOIL_33_PARALYSIS 0x26
+#define MOVE_EFFECT_ATK_PLUS_2 0x27
+#define MOVE_EFFECT_DEF_PLUS_2 0x28
+#define MOVE_EFFECT_SPD_PLUS_2 0x29
+#define MOVE_EFFECT_SP_ATK_PLUS_2 0x2A
+#define MOVE_EFFECT_SP_DEF_PLUS_2 0x2B
+#define MOVE_EFFECT_ACC_PLUS_2 0x2C
+#define MOVE_EFFECT_EVS_PLUS_2 0x2D
+#define MOVE_EFFECT_ATK_MINUS_2 0x2E
+#define MOVE_EFFECT_DEF_MINUS_2 0x2F
+#define MOVE_EFFECT_SPD_MINUS_2 0x30
+#define MOVE_EFFECT_SP_ATK_MINUS_2 0x31
+#define MOVE_EFFECT_SP_DEF_MINUS_2 0x32
+#define MOVE_EFFECT_ACC_MINUS_2 0x33
+#define MOVE_EFFECT_EVS_MINUS_2 0x34
+#define MOVE_EFFECT_THRASH 0x35
+#define MOVE_EFFECT_KNOCK_OFF 0x36
+#define MOVE_EFFECT_NOTHING_37 0x37
+#define MOVE_EFFECT_NOTHING_38 0x38
+#define MOVE_EFFECT_NOTHING_39 0x39
+#define MOVE_EFFECT_NOTHING_3A 0x3A
+#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B
+#define MOVE_EFFECT_NOTHING_3C 0x3C
+#define MOVE_EFFECT_NOTHING_3D 0x3D
+#define MOVE_EFFECT_NOTHING_3E 0x3E
+#define MOVE_EFFECT_NOTHING_3F 0x3F
+#define MOVE_EFFECT_AFFECTS_USER 0x40
+#define MOVE_EFFECT_CERTAIN 0x80
+
+// Battle terrain defines for gBattleTerrain.
+#define BATTLE_TERRAIN_GRASS 0
+#define BATTLE_TERRAIN_LONG_GRASS 1
+#define BATTLE_TERRAIN_SAND 2
+#define BATTLE_TERRAIN_UNDERWATER 3
+#define BATTLE_TERRAIN_WATER 4
+#define BATTLE_TERRAIN_POND 5
+#define BATTLE_TERRAIN_MOUNTAIN 6
+#define BATTLE_TERRAIN_CAVE 7
+#define BATTLE_TERRAIN_BUILDING 8
+#define BATTLE_TERRAIN_PLAIN 9
#define TARGET_SELECTED_POKEMON 0
#define TARGET_SPECIAL (1 << 0)
@@ -239,45 +324,6 @@
#define WEATHER_HAS_EFFECT ((!AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_AIR_LOCK, 0, 0)))
-#define MAX_TRAINER_ITEMS 4
-#define MAX_MON_MOVES 4
-
-// Battle Weather flags
-#define WEATHER_RAIN_TEMPORARY (1 << 0)
-#define WEATHER_RAIN_DOWNPOUR (1 << 1) // unused
-#define WEATHER_RAIN_PERMANENT (1 << 2)
-#define WEATHER_RAIN_ANY (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_DOWNPOUR | WEATHER_RAIN_PERMANENT)
-#define WEATHER_SANDSTORM_TEMPORARY (1 << 3)
-#define WEATHER_SANDSTORM_PERMANENT (1 << 4)
-#define WEATHER_SANDSTORM_ANY (WEATHER_SANDSTORM_TEMPORARY | WEATHER_SANDSTORM_PERMANENT)
-#define WEATHER_SUN_TEMPORARY (1 << 5)
-#define WEATHER_SUN_PERMANENT (1 << 6)
-#define WEATHER_SUN_ANY (WEATHER_SUN_TEMPORARY | WEATHER_SUN_PERMANENT)
-#define WEATHER_HAIL (1 << 7)
-#define WEATHER_HAIL_ANY (WEATHER_HAIL)
-#define WEATHER_ANY (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY)
-
-#define MOVE_TARGET_SELECTED 0x0
-#define MOVE_TARGET_DEPENDS 0x1
-#define MOVE_TARGET_USER 0x2
-#define MOVE_TARGET_RANDOM 0x4
-#define MOVE_TARGET_x10 0x10
-#define MOVE_TARGET_BOTH 0x8
-#define MOVE_TARGET_FOES_AND_ALLY 0x20
-#define MOVE_TARGET_OPPONENTS_FIELD 0x40
-
-// array entries for battle communication
-#define MULTIUSE_STATE 0x0
-#define CURSOR_POSITION 0x1
-#define TASK_ID 0x1 // task Id and cursor position share the same field
-#define SPRITES_INIT_STATE1 0x1 // shares the Id as well
-#define SPRITES_INIT_STATE2 0x2
-#define MOVE_EFFECT_BYTE 0x3
-#define ACTIONS_CONFIRMED_COUNT 0x4
-#define MULTISTRING_CHOOSER 0x5
-#define MSG_DISPLAY 0x7
-#define BATTLE_COMMUNICATION_ENTRIES_COUNT 0x8
-
#define BS_GET_TARGET 0
#define BS_GET_ATTACKER 1
#define BS_GET_EFFECT_BANK 2
diff --git a/include/ewram.h b/include/ewram.h
index 390ad9d80..4042ea03b 100644
--- a/include/ewram.h
+++ b/include/ewram.h
@@ -195,9 +195,9 @@ extern u8 gSharedMem[];
#define eCableCar1 ((struct CableCarEwramStruct1 *)(gSharedMem + 0x17000))
#define ewram17002 (&gSharedMem[0x17002])
#define eFlashFireArr (*(struct Struct2017100 *)(gSharedMem + 0x17100))
-#define B_BATTLESCRIPTS_STACK ((struct scriptsStack *) (gSharedMem + 0x17110))
+#define B_BATTLESCRIPTS_STACK ((struct BattleScriptsStack *) (gSharedMem + 0x17110))
#define ewram17130 (gSharedMem[0x17130])
-#define B_FUNCTION_STACK ((struct funcStack *) (gSharedMem + 0x17140))
+#define B_FUNCTION_STACK ((struct BattleCallbacksStack *) (gSharedMem + 0x17140))
#define ewram17160 (gSharedMem[0x17160])
#define ewram17800 ((struct Struct2017800 *) (gSharedMem + 0x17800))
#define ewram17800_2 (&gSharedMem[0x17800])
diff --git a/include/field_door.h b/include/field_door.h
index 091aac27f..93ac3243d 100644
--- a/include/field_door.h
+++ b/include/field_door.h
@@ -4,7 +4,7 @@
struct DoorGraphics
{
u16 metatileNum;
- u8 unk2;
+ u8 sound;
const void *tiles;
const void *palette;
};
diff --git a/include/gba/types.h b/include/gba/types.h
index 4d6c24a6c..0e652a0df 100644
--- a/include/gba/types.h
+++ b/include/gba/types.h
@@ -87,6 +87,29 @@ struct OamData
#define ST_OAM_H_RECTANGLE 1
#define ST_OAM_V_RECTANGLE 2
+#define ST_OAM_SIZE_0 0
+#define ST_OAM_SIZE_1 1
+#define ST_OAM_SIZE_2 2
+#define ST_OAM_SIZE_3 3
+
+#define SPRITE_SIZE_8x8 ((ST_OAM_SIZE_0 << 2) | (ST_OAM_SQUARE))
+#define SPRITE_SIZE_16x16 ((ST_OAM_SIZE_1 << 2) | (ST_OAM_SQUARE))
+#define SPRITE_SIZE_32x32 ((ST_OAM_SIZE_2 << 2) | (ST_OAM_SQUARE))
+#define SPRITE_SIZE_64x64 ((ST_OAM_SIZE_3 << 2) | (ST_OAM_SQUARE))
+
+#define SPRITE_SIZE_16x8 ((ST_OAM_SIZE_0 << 2) | (ST_OAM_H_RECTANGLE))
+#define SPRITE_SIZE_32x8 ((ST_OAM_SIZE_1 << 2) | (ST_OAM_H_RECTANGLE))
+#define SPRITE_SIZE_32x16 ((ST_OAM_SIZE_2 << 2) | (ST_OAM_H_RECTANGLE))
+#define SPRITE_SIZE_64x32 ((ST_OAM_SIZE_3 << 2) | (ST_OAM_H_RECTANGLE))
+
+#define SPRITE_SIZE_8x16 ((ST_OAM_SIZE_0 << 2) | (ST_OAM_V_RECTANGLE))
+#define SPRITE_SIZE_8x32 ((ST_OAM_SIZE_1 << 2) | (ST_OAM_V_RECTANGLE))
+#define SPRITE_SIZE_16x32 ((ST_OAM_SIZE_2 << 2) | (ST_OAM_V_RECTANGLE))
+#define SPRITE_SIZE_32x64 ((ST_OAM_SIZE_3 << 2) | (ST_OAM_V_RECTANGLE))
+
+#define SPRITE_SIZE(dim) ((SPRITE_SIZE_##dim >> 2) & 0x03)
+#define SPRITE_SHAPE(dim) (SPRITE_SIZE_##dim & 0x03)
+
struct BgAffineSrcData
{
s32 texX;
diff --git a/include/link.h b/include/link.h
index ca6c368ff..58e28f42d 100644
--- a/include/link.h
+++ b/include/link.h
@@ -68,7 +68,7 @@ struct LinkPlayer
/* 0x08 */ u8 name[11];
/* 0x13 */ u8 gender;
/* 0x14 */ u32 linkType;
- /* 0x18 */ u16 lp_field_18;
+ /* 0x18 */ u16 id;
/* 0x1A */ u16 language;
};
diff --git a/include/m4a.h b/include/m4a.h
index b7fb953bb..56f00a84f 100644
--- a/include/m4a.h
+++ b/include/m4a.h
@@ -3,9 +3,9 @@
#include "gba/m4a_internal.h"
-extern struct MusicPlayerInfo gMPlay_SE1;
-extern struct MusicPlayerInfo gMPlay_SE2;
-extern struct MusicPlayerInfo gMPlay_SE3;
+extern struct MusicPlayerInfo gMPlayInfo_SE1;
+extern struct MusicPlayerInfo gMPlayInfo_SE2;
+extern struct MusicPlayerInfo gMPlayInfo_SE3;
void m4aSoundVSync(void);
diff --git a/include/rom3.h b/include/rom3.h
index 19c6def25..2b889c78b 100644
--- a/include/rom3.h
+++ b/include/rom3.h
@@ -10,64 +10,64 @@ struct HpAndStatus
struct DisableStruct;
void sub_800B858(void);
-void setup_poochyena_battle();
+void SetUpBattleVarsAndBirchPoochyena();
void sub_800B950(void);
void sub_800B9A8(void);
void sub_800BA78(void);
void sub_800BD54(void);
-void sub_800BF28(void);
+void CreateTasksForSendRecvLinkBuffers(void);
void PrepareBufferDataTransferLink(u8 a, u16, u8 *c);
-void sub_800C1A8(u8);
+void Task_HandleSendLinkBuffersData(u8);
void sub_800C35C(void);
-void sub_800C47C(u8);
-void EmitGetAttributes(u8 a, u8 b, u8 c);
-void Emitcmd1(u8 a, u8 b, u8 c);
-void EmitLoadPokeSprite(u8 a);
-void EmitSendOutPoke(u8, u8, u8);
-void EmitReturnPokeToBall(u8 a, u8 b);
-void EmitTrainerThrow(u8 a);
-void EmitTrainerSlide(u8 a);
-void EmitTrainerSlideBack(u8 a);
-void Emitcmd10(u8 a);
-void Emitcmd11(u8 a);
-void Emitcmd12(u8 a);
-void EmitBallThrow(u8 a, u8 b);
-void EmitMoveAnimation(u8 a, u16 b, u8 c, u16 d, s32 e, u8 f, struct DisableStruct *g);
-void EmitPrintString(u8 a, u16 b);
-void EmitPrintStringPlayerOnly(u8 a, u16 stringID);
-void Emitcmd18(u8 a, u8 b, u16 c);
-void Emitcmd20(u8 a, u8 b, u8 c, u8 *d);
-void EmitOpenBag(u8 a, u8 *b);
-void EmitChoosePokemon(u8 a, u8 b, u8 c, u8 d, u8 *e);
-void Emitcmd23(u8 a);
-void EmitHealthBarUpdate(u8 a, u16 b);
-void EmitExpBarUpdate(u8 a, u8 b, u16 c);
-void EmitStatusIconUpdate(u8 a, u32 b, u32 c);
-void EmitStatusAnimation(u8 a, u8 b, u32 c);
-void EmitStatusXor(u8 a, u8 b);
-void Emitcmd29(u8, u16, u8 *);
-void Emitcmd33(u8 a, u8 b, u16 c);
-void Emitcmd34(u8 a, u8 b, u8 *c);
-void Emitcmd35(u8 a, u16 b);
-void Emitcmd36(u8 a, u16 b);
-void Emitcmd37(u8 a);
-void Emitcmd38(u8 a, u8 b);
-void Emitcmd39(u8 a);
-void Emitcmd40(u8 a);
-void EmitHitAnimation(u8 a);
-void Emitcmd42(u8 a);
-void EmitEffectivenessSound(u8 a, u16 b);
-void Emitcmd44(u8 a, u16 b);
-void EmitFaintingCry(u8 a);
-void EmitIntroSlide(u8 a, u8 b);
-void EmitTrainerBallThrow(u8 a);
-void EmitDrawPartyStatusSummary(u8 a, struct HpAndStatus *hpAndStatus, u8 c); //0x30
-void Emitcmd49(u8 a);
-void Emitcmd50(u8 a);
-void EmitSpriteInvisibility(u8 a, u8 b);
-void EmitBattleAnimation(u8 a, u8 b, u16 c);
-void EmitLinkStandbyMsg(u8 a, u8 b);
-void EmitResetActionMoveSelection(u8 a, u8 b);
-void Emitcmd55(u8 a, u8 b);
+void Task_HandleCopyReceivedLinkBuffersData(u8);
+void BtlController_EmitGetMonData(u8 a, u8 b, u8 c);
+void BtlController_EmitGetRawMonData(u8 a, u8 b, u8 c);
+void BtlController_EmitLoadMonSprite(u8 a);
+void BtlController_EmitSwitchInAnim(u8, u8, u8);
+void BtlController_EmitReturnMonToBall(u8 a, u8 b);
+void BtlController_EmitDrawTrainerPic(u8 a);
+void BtlController_EmitTrainerSlide(u8 a);
+void BtlController_EmitTrainerSlideBack(u8 a);
+void BtlController_EmitFaintAnimation(u8 a);
+void BtlController_EmitPaletteFade(u8 a);
+void BtlController_EmitSuccessBallThrowAnim(u8 a);
+void BtlController_EmitBallThrowAnim(u8 a, u8 b);
+void BtlController_EmitMoveAnimation(u8 a, u16 b, u8 c, u16 d, s32 e, u8 f, struct DisableStruct *g);
+void BtlController_EmitPrintString(u8 a, u16 b);
+void BtlController_EmitPrintSelectionString(u8 a, u16 stringID);
+void BtlController_EmitChooseAction(u8 a, u8 b, u16 c);
+void BtlController_EmitChooseMove(u8 a, u8 b, u8 c, u8 *d);
+void BtlController_EmitChooseItem(u8 a, u8 *b);
+void BtlController_EmitChoosePokemon(u8 a, u8 b, u8 c, u8 d, u8 *e);
+void BtlController_EmitCmd23(u8 a);
+void BtlController_EmitHealthBarUpdate(u8 a, u16 b);
+void BtlController_EmitExpUpdate(u8 a, u8 b, u16 c);
+void BtlController_EmitStatusIconUpdate(u8 a, u32 b, u32 c);
+void BtlController_EmitStatusAnimation(u8 a, u8 b, u32 c);
+void BtlController_EmitStatusXor(u8 a, u8 b);
+void BtlController_EmitDataTransfer(u8, u16, u8 *);
+void BtlController_EmitTwoReturnValues(u8 a, u8 b, u16 c);
+void BtlController_EmitChosenMonReturnValue(u8 a, u8 b, u8 *c);
+void BtlController_EmitOneReturnValue(u8 a, u16 b);
+void BtlController_EmitOneReturnValue_Duplicate(u8 a, u16 b);
+void BtlController_EmitCmd37(u8 a);
+void BtlController_EmitCmd38(u8 a, u8 b);
+void BtlController_EmitCmd39(u8 a);
+void BtlController_EmitCmd40(u8 a);
+void BtlController_EmitHitAnimation(u8 a);
+void BtlController_EmitCmd42(u8 a);
+void BtlController_EmitPlaySE(u8 a, u16 b);
+void BtlController_EmitPlayFanfareOrBGM(u8 a, u16 b);
+void BtlController_EmitFaintingCry(u8 a);
+void BtlController_EmitIntroSlide(u8 a, u8 b);
+void BtlController_EmitIntroTrainerBallThrow(u8 a);
+void BtlController_EmitDrawPartyStatusSummary(u8 a, struct HpAndStatus *hpAndStatus, u8 c); //0x30
+void BtlController_EmitHidePartyStatusSummary(u8 a);
+void BtlController_EmitEndBounceEffect(u8 a);
+void BtlController_EmitSpriteInvisibility(u8 a, u8 b);
+void BtlController_EmitBattleAnimation(u8 a, u8 b, u16 c);
+void BtlController_EmitLinkStandbyMsg(u8 a, u8 b);
+void BtlController_EmitResetActionMoveSelection(u8 a, u8 b);
+void BtlController_EmitCmd55(u8 a, u8 b);
#endif // GUARD_ROM3_H