diff options
author | Cameron Hall <camthesaxman@users.noreply.github.com> | 2019-07-30 21:31:27 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-30 21:31:27 -0500 |
commit | bc159dbb03735db55e6a09bb7947dccc70d0532b (patch) | |
tree | 5b27866fe839d0f2f7ae76e0f13580ecea2dd863 /include | |
parent | b8393b3a799f92e7064c266600607d98f6baf4d9 (diff) | |
parent | cf0da4c3bb5658908275068591fe51fb6f2ce49d (diff) |
Merge pull request #752 from camthesaxman/emerald_diff
resolve some Emerald differences
Diffstat (limited to 'include')
-rw-r--r-- | include/battle.h | 591 | ||||
-rw-r--r-- | include/battle_message.h | 6 | ||||
-rw-r--r-- | include/constants/battle.h | 238 | ||||
-rw-r--r-- | include/ewram.h | 4 | ||||
-rw-r--r-- | include/field_door.h | 2 | ||||
-rw-r--r-- | include/gba/types.h | 23 | ||||
-rw-r--r-- | include/link.h | 2 | ||||
-rw-r--r-- | include/m4a.h | 6 | ||||
-rw-r--r-- | include/rom3.h | 106 |
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 |