![aaaaaa123456789](/assets/img/avatar_default.png)
This commit undoes most of PokeCodec's PRs after the debate in chat. Some harmless or completely superseded PRs have been left alone, as there is not much benefit in attempting to undo them. Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136, #1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179, #1180, #1181, #1182 and #1183.
305 lines
14 KiB
C
305 lines
14 KiB
C
#ifndef GUARD_CONSTANTS_BATTLE_H
|
|
#define GUARD_CONSTANTS_BATTLE_H
|
|
|
|
/*
|
|
* A battler may be in one of four positions on the field. The first bit determines
|
|
* what side the battler is on, either the player's side or the opponent's side.
|
|
* The second bit determines what flank the battler is on, either the left or right.
|
|
* Note that the opponent's flanks are drawn corresponding to their perspective, so
|
|
* their right mon appears on the left, and their left mon appears on the right.
|
|
* The battler ID is usually the same as the position, except in the case of link battles.
|
|
*
|
|
* + ------------------------- +
|
|
* | Opponent's side |
|
|
* | Right Left |
|
|
* | 3 1 |
|
|
* | |
|
|
* | Player's side |
|
|
* | Left Right |
|
|
* | 0 2 |
|
|
* ----------------------------+
|
|
* | |
|
|
* | |
|
|
* +---------------------------+
|
|
*/
|
|
|
|
#define MAX_BATTLERS_COUNT 4
|
|
|
|
#define B_POSITION_PLAYER_LEFT 0
|
|
#define B_POSITION_OPPONENT_LEFT 1
|
|
#define B_POSITION_PLAYER_RIGHT 2
|
|
#define B_POSITION_OPPONENT_RIGHT 3
|
|
|
|
// These macros can be used with either battler ID or positions to get the partner or the opposite mon
|
|
#define BATTLE_OPPOSITE(id) ((id) ^ 1)
|
|
#define BATTLE_PARTNER(id) ((id) ^ 2)
|
|
|
|
#define B_SIDE_PLAYER 0
|
|
#define B_SIDE_OPPONENT 1
|
|
|
|
#define B_FLANK_LEFT 0
|
|
#define B_FLANK_RIGHT 1
|
|
|
|
#define BIT_SIDE 1
|
|
#define BIT_FLANK 2
|
|
|
|
// Battle Type Flags
|
|
#define BATTLE_TYPE_DOUBLE (1 << 0)
|
|
#define BATTLE_TYPE_LINK (1 << 1)
|
|
#define BATTLE_TYPE_IS_MASTER (1 << 2) // In not-link battles, it's always set.
|
|
#define BATTLE_TYPE_TRAINER (1 << 3)
|
|
#define BATTLE_TYPE_FIRST_BATTLE (1 << 4)
|
|
#define BATTLE_TYPE_20 (1 << 5)
|
|
#define BATTLE_TYPE_MULTI (1 << 6)
|
|
#define BATTLE_TYPE_SAFARI (1 << 7)
|
|
#define BATTLE_TYPE_BATTLE_TOWER (1 << 8)
|
|
#define BATTLE_TYPE_WALLY_TUTORIAL (1 << 9)
|
|
#define BATTLE_TYPE_ROAMER (1 << 10)
|
|
#define BATTLE_TYPE_EREADER_TRAINER (1 << 11)
|
|
#define BATTLE_TYPE_KYOGRE_GROUDON (1 << 12)
|
|
#define BATTLE_TYPE_LEGENDARY (1 << 13)
|
|
#define BATTLE_TYPE_REGI (1 << 14)
|
|
#define BATTLE_TYPE_TWO_OPPONENTS (1 << 15)
|
|
#define BATTLE_TYPE_DOME (1 << 16)
|
|
#define BATTLE_TYPE_PALACE (1 << 17)
|
|
#define BATTLE_TYPE_ARENA (1 << 18)
|
|
#define BATTLE_TYPE_FACTORY (1 << 19)
|
|
#define BATTLE_TYPE_PIKE (1 << 20)
|
|
#define BATTLE_TYPE_PYRAMID (1 << 21)
|
|
#define BATTLE_TYPE_INGAME_PARTNER (1 << 22)
|
|
#define BATTLE_TYPE_x800000 (1 << 23)
|
|
#define BATTLE_TYPE_RECORDED (1 << 24)
|
|
#define BATTLE_TYPE_x2000000 (1 << 25)
|
|
#define BATTLE_TYPE_TRAINER_HILL (1 << 26)
|
|
#define BATTLE_TYPE_SECRET_BASE (1 << 27)
|
|
#define BATTLE_TYPE_GROUDON (1 << 28)
|
|
#define BATTLE_TYPE_KYOGRE (1 << 29)
|
|
#define BATTLE_TYPE_RAYQUAZA (1 << 30)
|
|
#define BATTLE_TYPE_x80000000 (1 << 31)
|
|
#define BATTLE_TYPE_FRONTIER (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOME | BATTLE_TYPE_PALACE | BATTLE_TYPE_ARENA | BATTLE_TYPE_FACTORY | BATTLE_TYPE_PIKE | BATTLE_TYPE_PYRAMID)
|
|
#define BATTLE_TYPE_FRONTIER_NO_PYRAMID (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOME | BATTLE_TYPE_PALACE | BATTLE_TYPE_ARENA | BATTLE_TYPE_FACTORY | BATTLE_TYPE_PIKE)
|
|
|
|
// Battle Outcome defines
|
|
#define B_OUTCOME_WON 1
|
|
#define B_OUTCOME_LOST 2
|
|
#define B_OUTCOME_DREW 3
|
|
#define B_OUTCOME_RAN 4
|
|
#define B_OUTCOME_PLAYER_TELEPORTED 5
|
|
#define B_OUTCOME_MON_FLED 6
|
|
#define B_OUTCOME_CAUGHT 7
|
|
#define B_OUTCOME_NO_SAFARI_BALLS 8
|
|
#define B_OUTCOME_FORFEITED 9
|
|
#define B_OUTCOME_MON_TELEPORTED 10
|
|
#define B_OUTCOME_LINK_BATTLE_RAN (1 << 7) // 128
|
|
|
|
// Non-volatile status conditions
|
|
// These persist remain outside of battle and after switching out
|
|
#define STATUS1_NONE 0
|
|
#define STATUS1_SLEEP (1 << 0 | 1 << 1 | 1 << 2) // First 3 bits (Number of turns to sleep)
|
|
#define STATUS1_SLEEP_TURN(num) ((num) << 0) // Just for readability (or if rearranging statuses)
|
|
#define STATUS1_POISON (1 << 3)
|
|
#define STATUS1_BURN (1 << 4)
|
|
#define STATUS1_FREEZE (1 << 5)
|
|
#define STATUS1_PARALYSIS (1 << 6)
|
|
#define STATUS1_TOXIC_POISON (1 << 7)
|
|
#define STATUS1_TOXIC_COUNTER (1 << 8 | 1 << 9 | 1 << 10 | 1 << 11)
|
|
#define STATUS1_TOXIC_TURN(num) ((num) << 8)
|
|
#define STATUS1_PSN_ANY (STATUS1_POISON | STATUS1_TOXIC_POISON)
|
|
#define STATUS1_ANY (STATUS1_SLEEP | STATUS1_POISON | STATUS1_BURN | STATUS1_FREEZE | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON)
|
|
|
|
// Volatile status ailments
|
|
// These are removed after exiting the battle or switching out
|
|
#define STATUS2_CONFUSION (1 << 0 | 1 << 1 | 1 << 2)
|
|
#define STATUS2_CONFUSION_TURN(num) ((num) << 0)
|
|
#define STATUS2_FLINCHED (1 << 3)
|
|
#define STATUS2_UPROAR (1 << 4 | 1 << 5 | 1 << 6)
|
|
#define STATUS2_UPROAR_TURN(num) ((num) << 4)
|
|
#define STATUS2_UNUSED (1 << 7)
|
|
#define STATUS2_BIDE (1 << 8 | 1 << 9)
|
|
#define STATUS2_BIDE_TURN(num) (((num) << 8) & STATUS2_BIDE)
|
|
#define STATUS2_LOCK_CONFUSE (1 << 10 | 1 << 11) // e.g. Thrash
|
|
#define STATUS2_LOCK_CONFUSE_TURN(num)((num) << 10)
|
|
#define STATUS2_MULTIPLETURNS (1 << 12)
|
|
#define STATUS2_WRAPPED (1 << 13 | 1 << 14 | 1 << 15)
|
|
#define STATUS2_WRAPPED_TURN(num) ((num) << 13)
|
|
#define STATUS2_INFATUATION (1 << 16 | 1 << 17 | 1 << 18 | 1 << 19) // 4 bits, one for every battler
|
|
#define STATUS2_INFATUATED_WITH(battler) (gBitTable[battler] << 16)
|
|
#define STATUS2_FOCUS_ENERGY (1 << 20)
|
|
#define STATUS2_TRANSFORMED (1 << 21)
|
|
#define STATUS2_RECHARGE (1 << 22)
|
|
#define STATUS2_RAGE (1 << 23)
|
|
#define STATUS2_SUBSTITUTE (1 << 24)
|
|
#define STATUS2_DESTINY_BOND (1 << 25)
|
|
#define STATUS2_ESCAPE_PREVENTION (1 << 26)
|
|
#define STATUS2_NIGHTMARE (1 << 27)
|
|
#define STATUS2_CURSED (1 << 28)
|
|
#define STATUS2_FORESIGHT (1 << 29)
|
|
#define STATUS2_DEFENSE_CURL (1 << 30)
|
|
#define STATUS2_TORMENT (1 << 31)
|
|
|
|
// Seems like per-battler statuses. Not quite sure how to categorize these
|
|
#define STATUS3_LEECHSEED_BATTLER (1 << 0 | 1 << 1) // The battler to receive HP from Leech Seed
|
|
#define STATUS3_LEECHSEED (1 << 2)
|
|
#define STATUS3_ALWAYS_HITS (1 << 3 | 1 << 4)
|
|
#define STATUS3_ALWAYS_HITS_TURN(num) (((num) << 3) & STATUS3_ALWAYS_HITS) // "Always Hits" is set as a 2 turn timer, i.e. next turn is the last turn when it's active
|
|
#define STATUS3_PERISH_SONG (1 << 5)
|
|
#define STATUS3_ON_AIR (1 << 6)
|
|
#define STATUS3_UNDERGROUND (1 << 7)
|
|
#define STATUS3_MINIMIZED (1 << 8)
|
|
#define STATUS3_CHARGED_UP (1 << 9)
|
|
#define STATUS3_ROOTED (1 << 10)
|
|
#define STATUS3_YAWN (1 << 11 | 1 << 12) // Number of turns to sleep
|
|
#define STATUS3_YAWN_TURN(num) (((num) << 11) & STATUS3_YAWN)
|
|
#define STATUS3_IMPRISONED_OTHERS (1 << 13)
|
|
#define STATUS3_GRUDGE (1 << 14)
|
|
#define STATUS3_CANT_SCORE_A_CRIT (1 << 15)
|
|
#define STATUS3_MUDSPORT (1 << 16)
|
|
#define STATUS3_WATERSPORT (1 << 17)
|
|
#define STATUS3_UNDERWATER (1 << 18)
|
|
#define STATUS3_INTIMIDATE_POKES (1 << 19)
|
|
#define STATUS3_TRACE (1 << 20)
|
|
#define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER)
|
|
|
|
// Not really sure what a "hitmarker" is.
|
|
#define HITMARKER_x10 (1 << 4)
|
|
#define HITMARKER_x20 (1 << 5)
|
|
#define HITMARKER_DESTINYBOND (1 << 6)
|
|
#define HITMARKER_NO_ANIMATIONS (1 << 7)
|
|
#define HITMARKER_IGNORE_SUBSTITUTE (1 << 8)
|
|
#define HITMARKER_NO_ATTACKSTRING (1 << 9)
|
|
#define HITMARKER_ATTACKSTRING_PRINTED (1 << 10)
|
|
#define HITMARKER_NO_PPDEDUCT (1 << 11)
|
|
#define HITMARKER_SWAP_ATTACKER_TARGET (1 << 12)
|
|
#define HITMARKER_IGNORE_SAFEGUARD (1 << 13)
|
|
#define HITMARKER_SYNCHRONISE_EFFECT (1 << 14)
|
|
#define HITMARKER_RUN (1 << 15)
|
|
#define HITMARKER_IGNORE_ON_AIR (1 << 16)
|
|
#define HITMARKER_IGNORE_UNDERGROUND (1 << 17)
|
|
#define HITMARKER_IGNORE_UNDERWATER (1 << 18)
|
|
#define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19)
|
|
#define HITMARKER_x100000 (1 << 20)
|
|
#define HITMARKER_x200000 (1 << 21)
|
|
#define HITMARKER_x400000 (1 << 22)
|
|
#define HITMARKER_x800000 (1 << 23)
|
|
#define HITMARKER_GRUDGE (1 << 24)
|
|
#define HITMARKER_OBEYS (1 << 25)
|
|
#define HITMARKER_x4000000 (1 << 26)
|
|
#define HITMARKER_CHARGING (1 << 27)
|
|
#define HITMARKER_FAINTED(battler) (gBitTable[battler] << 28)
|
|
#define HITMARKER_FAINTED2(battler) (1 << (28 + battler))
|
|
|
|
// 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)
|
|
#define MOVE_RESULT_NOT_VERY_EFFECTIVE (1 << 2)
|
|
#define MOVE_RESULT_DOESNT_AFFECT_FOE (1 << 3)
|
|
#define MOVE_RESULT_ONE_HIT_KO (1 << 4)
|
|
#define MOVE_RESULT_FAILED (1 << 5)
|
|
#define MOVE_RESULT_FOE_ENDURED (1 << 6)
|
|
#define MOVE_RESULT_FOE_HUNG_ON (1 << 7)
|
|
#define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED)
|
|
|
|
// 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)
|
|
|
|
// Move Effects
|
|
#define MOVE_EFFECT_SLEEP 1
|
|
#define MOVE_EFFECT_POISON 2
|
|
#define MOVE_EFFECT_BURN 3
|
|
#define MOVE_EFFECT_FREEZE 4
|
|
#define MOVE_EFFECT_PARALYSIS 5
|
|
#define MOVE_EFFECT_TOXIC 6
|
|
#define PRIMARY_STATUS_MOVE_EFFECT MOVE_EFFECT_TOXIC // All above move effects apply primary status
|
|
#define MOVE_EFFECT_CONFUSION 7
|
|
#define MOVE_EFFECT_FLINCH 8
|
|
#define MOVE_EFFECT_TRI_ATTACK 9
|
|
#define MOVE_EFFECT_UPROAR 10
|
|
#define MOVE_EFFECT_PAYDAY 11
|
|
#define MOVE_EFFECT_CHARGING 12
|
|
#define MOVE_EFFECT_WRAP 13
|
|
#define MOVE_EFFECT_RECOIL_25 14
|
|
#define MOVE_EFFECT_ATK_PLUS_1 15
|
|
#define MOVE_EFFECT_DEF_PLUS_1 16
|
|
#define MOVE_EFFECT_SPD_PLUS_1 17
|
|
#define MOVE_EFFECT_SP_ATK_PLUS_1 18
|
|
#define MOVE_EFFECT_SP_DEF_PLUS_1 19
|
|
#define MOVE_EFFECT_ACC_PLUS_1 20
|
|
#define MOVE_EFFECT_EVS_PLUS_1 21
|
|
#define MOVE_EFFECT_ATK_MINUS_1 22
|
|
#define MOVE_EFFECT_DEF_MINUS_1 23
|
|
#define MOVE_EFFECT_SPD_MINUS_1 24
|
|
#define MOVE_EFFECT_SP_ATK_MINUS_1 25
|
|
#define MOVE_EFFECT_SP_DEF_MINUS_1 26
|
|
#define MOVE_EFFECT_ACC_MINUS_1 27
|
|
#define MOVE_EFFECT_EVS_MINUS_1 28
|
|
#define MOVE_EFFECT_RECHARGE 29
|
|
#define MOVE_EFFECT_RAGE 30
|
|
#define MOVE_EFFECT_STEAL_ITEM 31
|
|
#define MOVE_EFFECT_PREVENT_ESCAPE 32
|
|
#define MOVE_EFFECT_NIGHTMARE 33
|
|
#define MOVE_EFFECT_ALL_STATS_UP 34
|
|
#define MOVE_EFFECT_RAPIDSPIN 35
|
|
#define MOVE_EFFECT_REMOVE_PARALYSIS 36
|
|
#define MOVE_EFFECT_ATK_DEF_DOWN 37
|
|
#define MOVE_EFFECT_RECOIL_33 38
|
|
#define MOVE_EFFECT_ATK_PLUS_2 39
|
|
#define MOVE_EFFECT_DEF_PLUS_2 40
|
|
#define MOVE_EFFECT_SPD_PLUS_2 41
|
|
#define MOVE_EFFECT_SP_ATK_PLUS_2 42
|
|
#define MOVE_EFFECT_SP_DEF_PLUS_2 43
|
|
#define MOVE_EFFECT_ACC_PLUS_2 44
|
|
#define MOVE_EFFECT_EVS_PLUS_2 45
|
|
#define MOVE_EFFECT_ATK_MINUS_2 46
|
|
#define MOVE_EFFECT_DEF_MINUS_2 47
|
|
#define MOVE_EFFECT_SPD_MINUS_2 48
|
|
#define MOVE_EFFECT_SP_ATK_MINUS_2 49
|
|
#define MOVE_EFFECT_SP_DEF_MINUS_2 50
|
|
#define MOVE_EFFECT_ACC_MINUS_2 51
|
|
#define MOVE_EFFECT_EVS_MINUS_2 52
|
|
#define MOVE_EFFECT_THRASH 53
|
|
#define MOVE_EFFECT_KNOCK_OFF 54
|
|
#define MOVE_EFFECT_NOTHING_37 55
|
|
#define MOVE_EFFECT_NOTHING_38 56
|
|
#define MOVE_EFFECT_NOTHING_39 57
|
|
#define MOVE_EFFECT_NOTHING_3A 58
|
|
#define MOVE_EFFECT_SP_ATK_TWO_DOWN 59
|
|
#define NUM_MOVE_EFFECTS 60
|
|
|
|
#define MOVE_EFFECT_AFFECTS_USER (1 << 6) // 64
|
|
#define MOVE_EFFECT_CERTAIN (1 << 7) // 128
|
|
|
|
// 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
|
|
|
|
#endif // GUARD_CONSTANTS_BATTLE_H
|