mirror of
https://github.com/pret/pokeemerald.git
synced 2026-09-30 05:53:57 -05:00
Replaces STATUS2 usage with volatiles in code (#7262)
Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com>
This commit is contained in:
@@ -44,7 +44,7 @@
|
||||
|
||||
// Used to exclude moves learned temporarily by Transform or Mimic
|
||||
#define MOVE_IS_PERMANENT(battler, moveSlot) \
|
||||
(!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) \
|
||||
(!(gBattleMons[battler].volatiles.transformed) \
|
||||
&& !(gDisableStructs[battler].mimickedMoves & (1u << moveSlot)))
|
||||
|
||||
// Battle Actions
|
||||
|
||||
@@ -301,8 +301,8 @@ void BtlController_EmitChooseItem(u32 battler, u32 bufferId, u8 *battlePartyOrde
|
||||
void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 battlerPreventingSwitchout, u8 *data);
|
||||
void BtlController_EmitHealthBarUpdate(u32 battler, u32 bufferId, u16 hpValue);
|
||||
void BtlController_EmitExpUpdate(u32 battler, u32 bufferId, u8 partyId, s32 expPoints);
|
||||
void BtlController_EmitStatusIconUpdate(u32 battler, u32 bufferId, u32 status1, u32 status2);
|
||||
void BtlController_EmitStatusAnimation(u32 battler, u32 bufferId, bool8 status2, u32 status);
|
||||
void BtlController_EmitStatusIconUpdate(u32 battler, u32 bufferId, u32 status);
|
||||
void BtlController_EmitStatusAnimation(u32 battler, u32 bufferId, bool8 isVolatile, u32 status);
|
||||
void BtlController_EmitDataTransfer(u32 battler, u32 bufferId, u16 size, void *data);
|
||||
void BtlController_EmitTwoReturnValues(u32 battler, u32 bufferId, u8 ret8, u32 ret32);
|
||||
void BtlController_EmitChosenMonReturnValue(u32 battler, u32 bufferId, u8 partyId, u8 *battlePartyOrder);
|
||||
|
||||
@@ -7,7 +7,7 @@ u16 ChooseMoveAndTargetInBattlePalace(u32 battler);
|
||||
void SpriteCB_WaitForBattlerBallReleaseAnim(struct Sprite *sprite);
|
||||
void SpriteCB_TrainerSlideIn(struct Sprite *sprite);
|
||||
void SpriteCB_TrainerSpawn(struct Sprite *sprite);
|
||||
void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isStatus2, u32 status);
|
||||
void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isVolatile, u32 status);
|
||||
bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattlerId, u8 attacker, u8 target, u8 tableId, u16 argument);
|
||||
void InitAndLaunchSpecialAnimation(u8 activeBattlerId, u8 attacker, u8 target, u8 tableId);
|
||||
bool8 IsBattleSEPlaying(u8 battler);
|
||||
|
||||
@@ -89,7 +89,7 @@ void SpriteCB_TrainerThrowObject(struct Sprite *sprite);
|
||||
void AnimSetCenterToCornerVecX(struct Sprite *sprite);
|
||||
void BeginBattleIntroDummy(void);
|
||||
void BeginBattleIntro(void);
|
||||
void SwitchInClearSetData(u32 battler);
|
||||
void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy);
|
||||
const u8* FaintClearSetData(u32 battler);
|
||||
void BattleTurnPassed(void);
|
||||
u8 IsRunningFromBattleImpossible(u32 battler);
|
||||
|
||||
@@ -392,9 +392,10 @@ bool32 HadMoreThanHalfHpNowDoesnt(u32 battler);
|
||||
void UpdateStallMons(void);
|
||||
bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId);
|
||||
bool32 TrySwitchInEjectPack(enum ItemCaseId caseID);
|
||||
u32 GetMonVolatile(u32 battler, enum Volatile volatile);
|
||||
void SetMonVolatile(u32 battler, enum Volatile volatile, u32 newValue);
|
||||
u32 GetMonVolatile(u32 battler, enum Volatile _volatile);
|
||||
void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue);
|
||||
u32 TryBoosterEnergy(u32 battler, u32 ability, enum ItemCaseId caseID);
|
||||
bool32 ItemHealMonVolatile(u32 battler, u16 itemId);
|
||||
void PushHazardTypeToQueue(u32 side, enum Hazards hazardType);
|
||||
bool32 IsHazardOnSide(u32 side, enum Hazards hazardType);
|
||||
bool32 AreAnyHazardsOnSide(u32 side);
|
||||
|
||||
@@ -142,23 +142,21 @@ enum VolatileFlags
|
||||
V_BATON_PASSABLE = (1 << 0),
|
||||
};
|
||||
|
||||
// Volatile status ailments
|
||||
// These are removed after exiting the battle or switching
|
||||
/* Definitions with names e.g. "Confusion" are accessible in the debug menu
|
||||
* Enum, Type, (Field name, (optional)bitSize), Flags, (optional)(Debug menu header, (optional)max. value)
|
||||
*/
|
||||
/* Volatile status ailments
|
||||
* These are removed after exiting the battle or switching
|
||||
* Enum, Type Type, max value, flags */
|
||||
#define VOLATILE_DEFINITIONS(F) \
|
||||
F(VOLATILE_CONFUSION, confusionTurns, (u32, 3), V_BATON_PASSABLE) \
|
||||
F(VOLATILE_CONFUSION, confusionTurns, (u32, 6), V_BATON_PASSABLE) \
|
||||
F(VOLATILE_FLINCHED, flinched, (u32, 1)) \
|
||||
F(VOLATILE_UPROAR, uproarTurns, (u32, 3)) \
|
||||
F(VOLATILE_UPROAR, uproarTurns, (u32, 5)) \
|
||||
F(VOLATILE_TORMENT, torment, (u32, 1)) \
|
||||
F(VOLATILE_BIDE, bideTurns, (u32, 2)) \
|
||||
F(VOLATILE_LOCK_CONFUSE, lockConfusionTurns, (u32, 2)) \
|
||||
F(VOLATILE_BIDE, bideTurns, (u32, 3)) \
|
||||
F(VOLATILE_LOCK_CONFUSE, lockConfusionTurns, (u32, 3)) \
|
||||
F(VOLATILE_MULTIPLETURNS, multipleTurns, (u32, 1)) \
|
||||
F(VOLATILE_WRAPPED, wrapped, (u32, 1)) \
|
||||
F(VOLATILE_POWDER, powder, (u32, 1)) \
|
||||
F(VOLATILE_UNUSED, padding, (u32, 1)) \
|
||||
F(VOLATILE_INFATUATION, infatuation, (u32, 4)) \
|
||||
F(VOLATILE_INFATUATION, infatuation, (enum BattlerId, MAX_BITS(4))) \
|
||||
F(VOLATILE_DEFENSE_CURL, defenseCurl, (u32, 1)) \
|
||||
F(VOLATILE_TRANSFORMED, transformed, (u32, 1)) \
|
||||
F(VOLATILE_RECHARGE, recharge, (u32, 1)) \
|
||||
@@ -174,18 +172,22 @@ enum VolatileFlags
|
||||
F(VOLATILE_MUD_SPORT, mudSport, (u32, 1), V_BATON_PASSABLE) \
|
||||
F(VOLATILE_WATER_SPORT, waterSport, (u32, 1), V_BATON_PASSABLE)
|
||||
|
||||
/* Use within a macro to get the maximum allowed value for a volatile. Requires _typeBitSize and debug parameters as input. */
|
||||
#define GET_VOLATILE_MAXIMUM(_typeBitSize, ...) INVOKE_WITH_B(GET_VOLATILE_MAXIMUM_, _typeBitSize)
|
||||
#define GET_VOLATILE_MAXIMUM_(_type, ...) FIRST(__VA_OPT__(MAX_BITS(FIRST(__VA_ARGS__)),) MAX_BITS((sizeof(_type) * 8)))
|
||||
/* Use within a macro to get the maximum allowed value for a volatile. Requires _typeMaxValue as input. */
|
||||
#define GET_VOLATILE_MAXIMUM(_typeMaxValue, ...) INVOKE_WITH_B(GET_VOLATILE_MAXIMUM_, _typeMaxValue)
|
||||
#define GET_VOLATILE_MAXIMUM_(_type, ...) FIRST(__VA_OPT__(FIRST(__VA_ARGS__),) MAX_BITS((sizeof(_type) * 8)))
|
||||
|
||||
#define UNPACK_VOLATILE_ENUMS(_enum, ...) _enum,
|
||||
|
||||
enum Volatile
|
||||
{
|
||||
VOLATILE_NONE,
|
||||
VOLATILE_DEFINITIONS(UNPACK_VOLATILE_ENUMS)
|
||||
/* Expands to VOLATILE_CONFUSION, VOLATILE_FLINCHED, etc. */
|
||||
};
|
||||
|
||||
// Helper macros
|
||||
#define INFATUATED_WITH(battler) (battler + 1)
|
||||
|
||||
// Old flags
|
||||
#define STATUS2_CONFUSION (1 << 0 | 1 << 1 | 1 << 2)
|
||||
#define STATUS2_CONFUSION_TURN(num) ((num) << 0)
|
||||
|
||||
@@ -149,7 +149,6 @@ enum CmdVarious
|
||||
VARIOUS_SET_AURORA_VEIL,
|
||||
VARIOUS_TRY_THIRD_TYPE,
|
||||
VARIOUS_ACUPRESSURE,
|
||||
VARIOUS_SET_POWDER,
|
||||
VARIOUS_GRAVITY_ON_AIRBORNE_MONS,
|
||||
VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS,
|
||||
VARIOUS_JUMP_IF_ROAR_FAILS,
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define GUARD_ITEM_H
|
||||
|
||||
#include "constants/item.h"
|
||||
#include "constants/item_effects.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/moves.h"
|
||||
#include "constants/tms_hms.h"
|
||||
@@ -187,7 +188,7 @@ u8 GetItemBattleUsage(u16 itemId);
|
||||
u32 GetItemSecondaryId(u32 itemId);
|
||||
u32 GetItemFlingPower(u32 itemId);
|
||||
u32 GetItemStatus1Mask(u16 itemId);
|
||||
u32 GetItemStatus2Mask(u16 itemId);
|
||||
bool32 ItemHasVolatileFlag(u16 itemId, enum Volatile volatile);
|
||||
u32 GetItemSellPrice(u32 itemId);
|
||||
|
||||
#endif // GUARD_ITEM_H
|
||||
|
||||
@@ -120,42 +120,51 @@
|
||||
#define DEFAULT_3(_default, ...) DEFAULT(_default __VA_OPT__(, THIRD(__VA_ARGS__)))
|
||||
#define DEFAULT_4(_default, ...) DEFAULT(_default __VA_OPT__(, FOURTH(__VA_ARGS__)))
|
||||
|
||||
/* Simply a lists numbers 0-31, allows for word-spanning macros */
|
||||
#define BITS_32(F, ...) \
|
||||
F(0, __VA_ARGS__) \
|
||||
F(1, __VA_ARGS__) \
|
||||
F(2, __VA_ARGS__) \
|
||||
F(3, __VA_ARGS__) \
|
||||
F(4, __VA_ARGS__) \
|
||||
F(5, __VA_ARGS__) \
|
||||
F(6, __VA_ARGS__) \
|
||||
F(7, __VA_ARGS__) \
|
||||
F(8, __VA_ARGS__) \
|
||||
F(9, __VA_ARGS__) \
|
||||
F(10, __VA_ARGS__) \
|
||||
F(11, __VA_ARGS__) \
|
||||
F(12, __VA_ARGS__) \
|
||||
F(13, __VA_ARGS__) \
|
||||
F(14, __VA_ARGS__) \
|
||||
F(15, __VA_ARGS__) \
|
||||
F(16, __VA_ARGS__) \
|
||||
F(17, __VA_ARGS__) \
|
||||
F(18, __VA_ARGS__) \
|
||||
F(19, __VA_ARGS__) \
|
||||
F(20, __VA_ARGS__) \
|
||||
F(21, __VA_ARGS__) \
|
||||
F(22, __VA_ARGS__) \
|
||||
F(23, __VA_ARGS__) \
|
||||
F(24, __VA_ARGS__) \
|
||||
F(25, __VA_ARGS__) \
|
||||
F(26, __VA_ARGS__) \
|
||||
F(27, __VA_ARGS__) \
|
||||
F(28, __VA_ARGS__) \
|
||||
F(29, __VA_ARGS__) \
|
||||
F(30, __VA_ARGS__) \
|
||||
F(31, __VA_ARGS__)
|
||||
|
||||
/* Compares _n to 1 shifted by _b by _operation (==, <, > etc) */
|
||||
#define OP_BIT_SHIFT(_b, _n, _operation) (_n) _operation (1 << _b) ? _b :
|
||||
|
||||
/* (Credit to MGriffin) A rather monstrous way of finding the set bit in a word.
|
||||
Invalid input causes a compiler error. Sample: https://cexplore.karathan.at/z/x1hm7B */
|
||||
#define BIT_INDEX(n) \
|
||||
(n) == (1 << 0) ? 0 : \
|
||||
(n) == (1 << 1) ? 1 : \
|
||||
(n) == (1 << 2) ? 2 : \
|
||||
(n) == (1 << 3) ? 3 : \
|
||||
(n) == (1 << 4) ? 4 : \
|
||||
(n) == (1 << 5) ? 5 : \
|
||||
(n) == (1 << 6) ? 6 : \
|
||||
(n) == (1 << 7) ? 7 : \
|
||||
(n) == (1 << 8) ? 8 : \
|
||||
(n) == (1 << 9) ? 9 : \
|
||||
(n) == (1 << 10) ? 10 : \
|
||||
(n) == (1 << 11) ? 11 : \
|
||||
(n) == (1 << 12) ? 12 : \
|
||||
(n) == (1 << 13) ? 13 : \
|
||||
(n) == (1 << 14) ? 14 : \
|
||||
(n) == (1 << 15) ? 15 : \
|
||||
(n) == (1 << 16) ? 16 : \
|
||||
(n) == (1 << 17) ? 17 : \
|
||||
(n) == (1 << 18) ? 18 : \
|
||||
(n) == (1 << 19) ? 19 : \
|
||||
(n) == (1 << 20) ? 20 : \
|
||||
(n) == (1 << 21) ? 21 : \
|
||||
(n) == (1 << 22) ? 22 : \
|
||||
(n) == (1 << 23) ? 23 : \
|
||||
(n) == (1 << 24) ? 24 : \
|
||||
(n) == (1 << 25) ? 25 : \
|
||||
(n) == (1 << 26) ? 26 : \
|
||||
(n) == (1 << 27) ? 27 : \
|
||||
(n) == (1 << 28) ? 28 : \
|
||||
(n) == (1 << 29) ? 29 : \
|
||||
(n) == (1 << 30) ? 30 : \
|
||||
(n) == (1 << 31) ? 31 : \
|
||||
*(u32 *)NULL
|
||||
#define BIT_INDEX(_n) BITS_32(OP_BIT_SHIFT, _n, ==) *(u32 *)NULL
|
||||
|
||||
/* (Credit to MGriffin) A way to find the minimum required number of bits to
|
||||
store a number (max: 32). Sample: https://godbolt.org/z/xb4KdPMhT */
|
||||
#define BIT_SIZE(_n) (BITS_32(OP_BIT_SHIFT, _n, <) 32)
|
||||
|
||||
#define COMPRESS_BITS_0 0, 1
|
||||
#define COMPRESS_BITS_1 1, 1
|
||||
@@ -167,11 +176,10 @@ Invalid input causes a compiler error. Sample: https://cexplore.karathan.at/z/x1
|
||||
#define COMPRESS_BITS_7 7, 1
|
||||
|
||||
/* Will try and compress a set bit (or up to three sequential bits) into a single byte
|
||||
Input must be of the form (upper << lower) where upper can be up to 3, lower up to 31 */
|
||||
Input must be of the form (upper << lower) where upper can be up to 7, lower up to 31 */
|
||||
#define COMPRESS_BITS(_val) COMPRESS_BITS_STEP_2 _val
|
||||
#define COMPRESS_BITS_STEP_2(_unpacked) COMPRESS_BITS_STEP_3(COMPRESS_BITS_## _unpacked)
|
||||
#define COMPRESS_BITS_STEP_3(...) COMPRESS_BITS_STEP_4(__VA_ARGS__)
|
||||
#define COMPRESS_BITS_STEP_4(upper, lower) (((upper % 8) << 5) + (BIT_INDEX(lower)))
|
||||
#define COMPRESS_BITS_STEP_2(_unpacked) INVOKE(COMPRESS_BITS_STEP_3, COMPRESS_BITS_## _unpacked)
|
||||
#define COMPRESS_BITS_STEP_3(upper, lower) (((upper % 8) << 5) + (BIT_INDEX(lower)))
|
||||
|
||||
/* Will read a compressed bit stored by COMPRESS_BIT into a single byte */
|
||||
#define UNCOMPRESS_BITS(compressed) ((compressed >> 5) << (compressed & 0x1F))
|
||||
|
||||
@@ -310,8 +310,8 @@ enum {
|
||||
MON_SPR_GFX_MANAGERS_COUNT
|
||||
};
|
||||
|
||||
#define UNPACK_VOLATILE_STRUCT(_enum, _fieldName, _typeBitSize, ...) INVOKE(UNPACK_VOLATILE_STRUCT_, _fieldName, UNPACK_B(_typeBitSize));
|
||||
#define UNPACK_VOLATILE_STRUCT_(_fieldName, _type, ...) _type FIRST(__VA_OPT__(_fieldName:FIRST(__VA_ARGS__),) _fieldName)
|
||||
#define UNPACK_VOLATILE_STRUCT(_enum, _fieldName, _typeMaxValue, ...) INVOKE(UNPACK_VOLATILE_STRUCT_, _fieldName, UNPACK_B(_typeMaxValue));
|
||||
#define UNPACK_VOLATILE_STRUCT_(_fieldName, _type, ...) _type FIRST(__VA_OPT__(_fieldName:BIT_SIZE(FIRST(__VA_ARGS__)),) _fieldName)
|
||||
|
||||
struct Volatiles
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user