mirror of
https://github.com/pret/pokeplatinum.git
synced 2026-09-30 05:18:36 -05:00
Merge pull request #60 from lhearachel/battle-dev
Clean up the move-execution state machine
This commit is contained in:
@@ -119,7 +119,7 @@ typedef struct BattleContext {
|
||||
|
||||
int afterMoveEffectTemp;
|
||||
int beforeMoveCheckState;
|
||||
int moveExecutionCheckState;
|
||||
int tryMoveCheckState;
|
||||
int statusCheckState;
|
||||
int abilityCheckState;
|
||||
int switchInCheckState;
|
||||
|
||||
@@ -31,11 +31,15 @@ enum BattleControlSequence {
|
||||
|
||||
BATTLE_CONTROL_EXEC_SCRIPT,
|
||||
BATTLE_CONTROL_BEFORE_MOVE,
|
||||
BATTLE_CONTROL_AFTER_MOVE,
|
||||
|
||||
BATTLE_CONTROL_NO_EFFECTS = 25,
|
||||
BATTLE_CONTROL_TRY_MOVE,
|
||||
BATTLE_CONTROL_PRIMARY_EFFECT,
|
||||
BATTLE_CONTROL_MOVE_FAILED,
|
||||
BATTLE_CONTROL_USE_MOVE,
|
||||
BATTLE_CONTROL_UPDATE_HP,
|
||||
BATTLE_CONTROL_AFTER_MOVE_MESSAGE,
|
||||
|
||||
BATTLE_CONTROL_CHECK_FAINTED = 33,
|
||||
BATTLE_CONTROL_CHECK_MULTI_TARGET,
|
||||
|
||||
BATTLE_CONTROL_UPDATE_MOVE_BUFFERS = 38,
|
||||
BATTLE_CONTROL_MOVE_END,
|
||||
|
||||
@@ -9,7 +9,11 @@
|
||||
#define ATTACKER_TURN_FLAGS (battleCtx->turnFlags[battleCtx->attacker])
|
||||
#define DEFENDER_TURN_FLAGS (battleCtx->turnFlags[battleCtx->defender])
|
||||
|
||||
#define ATTACKER_SELF_TURN_FLAGS (battleCtx->selfTurnFlags[battleCtx->attacker])
|
||||
#define DEFENDER_SELF_TURN_FLAGS (battleCtx->selfTurnFlags[battleCtx->defender])
|
||||
|
||||
#define CURRENT_MOVE_DATA (battleCtx->aiContext.moveTable[battleCtx->moveCur])
|
||||
#define MOVE_DATA(move) (battleCtx->aiContext.moveTable[move])
|
||||
|
||||
#define LOAD_SUBSEQ(script) (BattleSystem_LoadScript(battleCtx, NARC_INDEX_BATTLE__SKILL__SUB_SEQ, script))
|
||||
|
||||
@@ -30,6 +34,10 @@
|
||||
1))
|
||||
|
||||
#define MON_IS_UPROARING(mon) (battleCtx->fieldConditionsMask & (FlagIndex(mon) << FIELD_CONDITION_UPROAR_SHIFT))
|
||||
#define MON_IS_IDENTIFIED(mon) ((battleCtx->battleMons[mon].statusVolatile & VOLATILE_CONDITION_FORESIGHT) \
|
||||
|| (battleCtx->battleMons[mon].moveEffectsMask & MOVE_EFFECT_MIRACLE_EYE))
|
||||
|
||||
#define MON_IS_LOCKED_ONTO(mon1, mon2) ((battleCtx->battleMons[mon2].moveEffectsMask & MOVE_EFFECT_LOCK_ON) && battleCtx->battleMons[mon2].moveEffectsData.lockOnTarget == mon1)
|
||||
|
||||
#define NO_TARGET_SINGLE_TURN (battleCtx->defender == BATTLER_NONE && BattleMove_IsMultiTurn(battleCtx, battleCtx->moveCur) == FALSE)
|
||||
#define NO_TARGET_MULTI_TURN (battleCtx->defender == BATTLER_NONE \
|
||||
@@ -42,5 +50,22 @@
|
||||
|
||||
#define NO_CLOUD_NINE (BattleSystem_CountAbility(battleSys, battleCtx, 8, 0, ABILITY_CLOUD_NINE) == FALSE \
|
||||
&& BattleSystem_CountAbility(battleSys, battleCtx, 8, 0, ABILITY_AIR_LOCK) == FALSE)
|
||||
#define WEATHER_IS_RAIN (battleCtx->fieldConditionsMask & FIELD_CONDITION_RAINING)
|
||||
#define WEATHER_IS_SAND (battleCtx->fieldConditionsMask & FIELD_CONDITION_SANDSTORM)
|
||||
#define WEATHER_IS_SUN (battleCtx->fieldConditionsMask & FIELD_CONDITION_SUNNY)
|
||||
#define WEATHER_IS_HAIL (battleCtx->fieldConditionsMask & FIELD_CONDITION_HAILING)
|
||||
|
||||
enum {
|
||||
BATTLE_STAT_HP,
|
||||
BATTLE_STAT_ATTACK,
|
||||
BATTLE_STAT_DEFENSE,
|
||||
BATTLE_STAT_SPEED,
|
||||
BATTLE_STAT_SP_ATTACK,
|
||||
BATTEL_STAT_SP_DEFENSE,
|
||||
BATTLE_STAT_ACCURACY,
|
||||
BATTLE_STAT_EVASION,
|
||||
|
||||
BATTLE_STAT_MAX
|
||||
};
|
||||
|
||||
#endif // POKEPLATINUM_BATTLE_COMMON_H
|
||||
@@ -43,7 +43,7 @@
|
||||
#define MOVE_STATUS_ENDURED (1 << 7)
|
||||
#define MOVE_STATUS_ENDURED_ITEM (1 << 8)
|
||||
#define MOVE_STATUS_NO_PP (1 << 9)
|
||||
#define MOVE_STATUS_BYPASS_ACCURACY (1 << 10)
|
||||
#define MOVE_STATUS_BYPASSED_ACCURACY (1 << 10)
|
||||
#define MOVE_STATUS_LEVITATED (1 << 11)
|
||||
#define MOVE_STATUS_ONE_HIT_KO_FAILED (1 << 12)
|
||||
#define MOVE_STATUS_SPLASH (1 << 13)
|
||||
@@ -74,6 +74,9 @@
|
||||
| MOVE_STATUS_NO_PP \
|
||||
| MOVE_STATUS_NO_MORE_WORK)
|
||||
|
||||
#define MOVE_STATUS_DID_NOT_AFFECT (MOVE_STATUS_INEFFECTIVE | MOVE_STATUS_WONDER_GUARD)
|
||||
#define MOVE_STATUS_GENERAL_MISS (MOVE_STATUS_MISSED | MOVE_STATUS_SEMI_INVULNERABLE)
|
||||
|
||||
#define RANGE_SINGLE_TARGET 0
|
||||
#define RANGE_SINGLE_TARGET_SPECIAL (1 << 0)
|
||||
#define RANGE_RANDOM_OPPONENT (1 << 1)
|
||||
|
||||
15
include/constants/battle/side_effects.h
Normal file
15
include/constants/battle/side_effects.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#ifndef POKEPLATINUM_CONSTANTS_BATTLE_SIDE_EFFECTS_H
|
||||
#define POKEPLATINUM_CONSTANTS_BATTLE_SIDE_EFFECTS_H
|
||||
|
||||
#define MOVE_SIDE_EFFECT_BREAK_SCREENS (1 << 23)
|
||||
#define MOVE_SIDE_EFFECT_APPLY_WITH_NO_HP (1 << 24)
|
||||
#define MOVE_SIDE_EFFECT_CHECK_FLAGS (1 << 25)
|
||||
#define MOVE_SIDE_EFFECT_PROBABILISTIC (1 << 26)
|
||||
#define MOVE_SIDE_EFFECT_CANNOT_PREVENT (1 << 27)
|
||||
#define MOVE_SIDE_EFFECT_NO_DAMAGE_REQUIRED (1 << 28)
|
||||
#define MOVE_SIDE_EFFECT_ON_HIT (1 << 29)
|
||||
|
||||
#define MOVE_SIDE_EFFECT_TO_ATTACKER (1 << 30)
|
||||
#define MOVE_SIDE_EFFECT_TO_DEFENDER (1 << 31)
|
||||
|
||||
#endif // POKEPLATINUM_CONSTANTS_BATTLE_SIDE_EFFECTS_H
|
||||
@@ -2,15 +2,26 @@
|
||||
#define POKEPLATINUM_CONSTANTS_BATTLE_SYSTEM_CONTROL_H
|
||||
|
||||
#define SYSCTL_CHECK_LOOP_ONLY_ONCE (1 << 1)
|
||||
#define SYSCTL_HIT_DURING_FLY (1 << 2)
|
||||
#define SYSCTL_HIT_DURING_DIG (1 << 3)
|
||||
#define SYSCTL_HIT_DURING_DIVE (1 << 4)
|
||||
#define SYSCTL_FIRST_OF_MULTI_TURN (1 << 5) // this could be a charge-up move or Bide
|
||||
#define SYSCTL_SKIP_SPRITE_BLINK (1 << 6)
|
||||
#define SYSCTL_LAST_OF_MULTI_TURN (1 << 9)
|
||||
#define SYSCTL_NONSTANDARD_ACC_CHECK (1 << 10) // used by Future Sight and OHKO moves
|
||||
#define SYSCTL_SKIP_TYPE_CHECK (1 << 15)
|
||||
#define SYSCTL_HIT_DURING_SHADOW_FORCE (1 << 19)
|
||||
#define SYSCTL_REUSE_LAST_MOVE (1 << 20)
|
||||
|
||||
#define SYSCTL_MOVE_CONNECTED (1 << 6)
|
||||
|
||||
#define SYSCTL_SKIP_OBEDIENCE_CHECK (1 << 0)
|
||||
#define SYSCTL_SKIP_TYPE_CHART_CHECK (1 << 1)
|
||||
#define SYSCTL_SKIP_STATUS_CHECK (1 << 2)
|
||||
#define SYSCTL_SKIP_PP_DECREMENT (1 << 3)
|
||||
#define SYSCTL_SKIP_IMMUNITY_TRIGGERS (1 << 4)
|
||||
#define SYSCTL_SKIP_ACCURACY_CHECK (1 << 5)
|
||||
#define SYSCTL_SKIP_ACCURACY_OVERRIDES (1 << 6)
|
||||
#define SYSCTL_SKIP_STOLEN_CHECK (1 << 7)
|
||||
|
||||
#endif // POKEPLATINUM_CONSTANTS_BATTLE_SYSTEM_CONTROL_H
|
||||
@@ -146,7 +146,7 @@ enum {
|
||||
#define HOLD_EFFECT_BRN_USER 101
|
||||
#define HOLD_EFFECT_DITTO_SPEED_UP 102
|
||||
#define HOLD_EFFECT_ENDURE 103
|
||||
#define HOLD_EFFECT_CRITRATE_UP_SLOWER 104
|
||||
#define HOLD_EFFECT_ACCURACY_UP_SLOWER 104
|
||||
#define HOLD_EFFECT_BOOST_REPEATED 105
|
||||
#define HOLD_EFFECT_SPEED_DOWN_GROUNDED 106
|
||||
#define HOLD_EFFECT_SPEED_DOWN 107
|
||||
|
||||
@@ -3,10 +3,12 @@
|
||||
|
||||
enum NARCFilesBattleSubSeq {
|
||||
BATTLE_SUBSEQ_START_ENCOUNTER = 0,
|
||||
BATTLE_SUBSEQ_USE_MOVE,
|
||||
|
||||
BATTLE_SUBSEQ_ESCAPE = 3,
|
||||
|
||||
BATTLE_SUBSEQ_ESCAPE_FAILED = 8,
|
||||
BATTLE_SUBSEQ_MISSED = 7,
|
||||
BATTLE_SUBSEQ_ESCAPE_FAILED,
|
||||
BATTLE_SUBSEQ_SWITCH_POKEMON,
|
||||
|
||||
BATTLE_SUBSEQ_THROW_POKEBALL = 11,
|
||||
@@ -33,6 +35,7 @@ enum NARCFilesBattleSubSeq {
|
||||
BATTLE_SUBSEQ_HURT_SELF_IN_CONFUSION,
|
||||
BATTLE_SUBSEQ_SNAP_OUT_OF_CONFUSION,
|
||||
BATTLE_SUBSEQ_TRAINER_MESSAGE,
|
||||
BATTLE_SUBSEQ_NO_PP,
|
||||
|
||||
BATTLE_SUBSEQ_MOVE_EFFECT_END = 50,
|
||||
BATTLE_SUBSEQ_THRASH_END,
|
||||
@@ -81,6 +84,9 @@ enum NARCFilesBattleSubSeq {
|
||||
|
||||
BATTLE_SUBSEQ_MOVE_IS_HEAL_BLOCKED = 174,
|
||||
|
||||
BATTLE_SUBSEQ_LIGHTNING_ROD_REDIRECTED = 180,
|
||||
BATTLE_SUBSEQ_BLOCKED_BY_SOUNDPROOF,
|
||||
|
||||
BATTLE_SUBSEQ_LOAFING_AROUND = 191,
|
||||
|
||||
BATTLE_SUBSEQ_ESCAPE_ITEM = 222,
|
||||
|
||||
@@ -24,14 +24,14 @@ void ov16_02252A2C(BattleMon * param0, int param1, int param2);
|
||||
u8 BattleSystem_CompareBattlerSpeed(BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4);
|
||||
void ov16_022535E0(BattleContext * param0, int param1);
|
||||
void ov16_022535F0(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
BOOL ov16_0225366C(BattleSystem * param0, BattleContext * param1, int * param2);
|
||||
BOOL BattleSystem_CheckPrimaryEffect(BattleSystem * param0, BattleContext * param1, int * param2);
|
||||
BOOL ov16_02253710(BattleSystem * param0, BattleContext * param1, int * param2);
|
||||
int BattleSystem_Defender(BattleSystem * param0, BattleContext * param1, int param2, u16 param3, int param4, int param5);
|
||||
void BattleSystem_RedirectTarget(BattleSystem * param0, BattleContext * param1, int param2, u16 param3);
|
||||
BOOL ov16_02253E3C(BattleSystem * param0, BattleContext * param1);
|
||||
BOOL BattleMove_TriggerRedirectionAbilities(BattleSystem * param0, BattleContext * param1);
|
||||
void BattleMon_CopyToParty(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
void ov16_02253EF0(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
void ov16_02253F20(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
void BattleSystem_BreakMultiTurn(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
int ov16_02253F7C(BattleContext * param0, int param1);
|
||||
BOOL BattleSystem_CheckTrainerMessage(BattleSystem * param0, BattleContext * param1);
|
||||
void BattleContext_Init(BattleContext * param0);
|
||||
@@ -42,7 +42,7 @@ void BattleSystem_SetupNextTurn(BattleSystem * param0, BattleContext * param1);
|
||||
int BattleSystem_CheckStruggling(BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4);
|
||||
BOOL BattleSystem_CanUseMove(BattleSystem *battleSys, BattleContext *battleCtx, int battler, int moveSlot, BattleMessage *msgOut);
|
||||
int Battler_SlotForMove(BattleMon * param0, u16 param1);
|
||||
int ov16_02254FA8(BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4, int param5, int param6, u32 * param7);
|
||||
int BattleSystem_CheckTypeChart(BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4, int param5, int param6, u32 * param7);
|
||||
void ov16_022552D4(BattleContext * param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, u32 * param8);
|
||||
BOOL BattleContext_MoveFailed(BattleContext * param0, int param1);
|
||||
u8 ov16_022554E0(BattleSystem * param0, BattleContext * param1, int param2, int param3);
|
||||
@@ -53,12 +53,12 @@ BOOL BattleMove_IsMultiTurn(BattleContext * param0, int param1);
|
||||
BOOL ov16_0225588C(BattleSystem * param0, int param1, u8 * param2, u8 * param3, u8 * param4);
|
||||
int ov16_022558CC(u8 param0, u8 param1, u8 param2);
|
||||
BOOL ov16_02255918(u16 param0);
|
||||
BOOL ov16_02255950(BattleContext * param0, u16 param1, int param2);
|
||||
BOOL BattleSystem_IsGhostCurse(BattleContext * param0, u16 param1, int param2);
|
||||
BOOL ov16_02255980(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
BOOL ov16_022559DC(BattleContext * param0, int param1);
|
||||
BOOL ov16_022559FC(BattleSystem * param0, BattleContext * param1);
|
||||
u8 Battler_Ability(BattleContext * param0, int param1);
|
||||
BOOL ov16_02255AB4(BattleContext * param0, int param1, int param2, int param3);
|
||||
BOOL Battler_IgnorableAbility(BattleContext * param0, int param1, int param2, int param3);
|
||||
BOOL ov16_02255B10(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
BOOL BattleSystem_Trapped(BattleSystem * param0, BattleContext * param1, int param2, BattleMessage * param3);
|
||||
BOOL BattleSystem_TryEscape(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
@@ -71,7 +71,7 @@ BOOL BattleSystem_FailsInHighGravity(BattleSystem * param0, BattleContext * para
|
||||
BOOL BattleSystem_HealBlocked(BattleSystem * param0, BattleContext * param1, int param2, int param3);
|
||||
void BattleSystem_UpdateLastResort(BattleSystem * param0, BattleContext * param1);
|
||||
int ov16_02256128(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
int ov16_02256148(BattleContext * param0, int param1, int param2);
|
||||
int BattleSystem_CheckImmunityAbilities(BattleContext * param0, int param1, int param2);
|
||||
BOOL BattleSystem_TriggerTurnEndAbility(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
int BattleSystem_Divide(int param0, int param1);
|
||||
int BattleSystem_ShowMonChecks(BattleSystem * param0, BattleContext * param1);
|
||||
@@ -85,10 +85,10 @@ BOOL BattleSystem_TriggerLeftovers(BattleSystem * param0, BattleContext * param1
|
||||
BOOL BattleSystem_TriggerHeldItemOnStatus(BattleSystem * param0, BattleContext * param1, int param2, int * param3);
|
||||
BOOL BattleSystem_TriggerDetrimentalHeldItem(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
u16 ov16_02258874(BattleContext * param0, int param1);
|
||||
BOOL ov16_022588A4(BattleContext * param0, int param1);
|
||||
BOOL Battler_MovedThisTurn(BattleContext * param0, int param1);
|
||||
BOOL ov16_022588BC(BattleSystem * param0, BattleContext * param1, int * param2);
|
||||
s32 Battler_HeldItemEffect(BattleContext * param0, int param1);
|
||||
s32 ov16_02258ACC(BattleContext * param0, int param1, int param2);
|
||||
s32 Battler_HeldItemPower(BattleContext * param0, int param1, int param2);
|
||||
s32 ov16_02258B18(BattleContext * param0, int param1);
|
||||
s32 ov16_02258B2C(BattleContext * param0, int param1);
|
||||
s32 ov16_02258B40(BattleContext * param0, int param1);
|
||||
|
||||
@@ -253,7 +253,7 @@ ITEM_TOXIC_ORB,100,HOLD_EFFECT_PSN_USER,0,0,29,30,0,31,false,false,POCKET_ITEMS,
|
||||
ITEM_FLAME_ORB,100,HOLD_EFFECT_BRN_USER,0,0,30,30,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
|
||||
ITEM_QUICK_POWDER,10,HOLD_EFFECT_DITTO_SPEED_UP,0,0,0,10,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
|
||||
ITEM_FOCUS_SASH,200,HOLD_EFFECT_ENDURE,0,0,0,10,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
|
||||
ITEM_ZOOM_LENS,200,HOLD_EFFECT_CRITRATE_UP_SLOWER,20,0,0,10,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
|
||||
ITEM_ZOOM_LENS,200,HOLD_EFFECT_ACCURACY_UP_SLOWER,20,0,0,10,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
|
||||
ITEM_METRONOME,200,HOLD_EFFECT_BOOST_REPEATED,10,0,0,30,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
|
||||
ITEM_IRON_BALL,200,HOLD_EFFECT_SPEED_DOWN_GROUNDED,0,0,0,130,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
|
||||
ITEM_LAGGING_TAIL,200,HOLD_EFFECT_SPEED_DOWN,0,0,0,10,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
|
@@ -541,7 +541,7 @@ static u8 ov14_0221FE38 (BattleSystem * param0, BattleContext * param1)
|
||||
}
|
||||
|
||||
if (v7 == 174) {
|
||||
if (ov16_02255950(param1, v7, param1->aiContext.attacker) == 0) {
|
||||
if (BattleSystem_IsGhostCurse(param1, v7, param1->aiContext.attacker) == 0) {
|
||||
param1->aiContext.selectedTarget[param1->aiContext.attacker] = param1->aiContext.attacker;
|
||||
}
|
||||
}
|
||||
@@ -1469,7 +1469,7 @@ static void ov14_02221060 (BattleSystem * param0, BattleContext * param1)
|
||||
v4 = ov14_0222327C(param0, param1, param1->aiContext.attacker, v3);
|
||||
|
||||
if (v3) {
|
||||
v1 = ov16_02254FA8(param0, param1, v3, v4, param1->aiContext.attacker, param1->aiContext.defender, v1, &v2);
|
||||
v1 = BattleSystem_CheckTypeChart(param0, param1, v3, v4, param1->aiContext.attacker, param1->aiContext.defender, v1, &v2);
|
||||
|
||||
if (v1 == 60 * 2) {
|
||||
v1 = 80;
|
||||
@@ -1505,7 +1505,7 @@ static void ov14_02221114 (BattleSystem * param0, BattleContext * param1)
|
||||
v1 = ov14_02222CF0(param1);
|
||||
v2 = 40;
|
||||
v3 = 0;
|
||||
v2 = ov16_02254FA8(param0, param1, param1->aiContext.move, ov14_0222327C(param0, param1, param1->aiContext.attacker, param1->aiContext.move), param1->aiContext.attacker, param1->aiContext.defender, v2, &v3);
|
||||
v2 = BattleSystem_CheckTypeChart(param0, param1, param1->aiContext.move, ov14_0222327C(param0, param1, param1->aiContext.attacker, param1->aiContext.move), param1->aiContext.attacker, param1->aiContext.defender, v2, &v3);
|
||||
|
||||
if (v2 == 60 * 2) {
|
||||
v2 = 80;
|
||||
@@ -3272,7 +3272,7 @@ static s32 ov14_02222E84 (BattleSystem * param0, BattleContext * param1, u16 par
|
||||
param1->battleStatusMask |= 0x800;
|
||||
}
|
||||
|
||||
v5 = ov16_02254FA8(param0, param1, param2, v2, param5, param1->aiContext.defender, v5, &v4);
|
||||
v5 = BattleSystem_CheckTypeChart(param0, param1, param2, v2, param5, param1->aiContext.defender, v5, &v4);
|
||||
param1->battleStatusMask &= (0x800 ^ 0xffffffff);
|
||||
|
||||
if (v4 & (0x8 | 0x800 | 0x100000 | 0x40000)) {
|
||||
@@ -3413,7 +3413,7 @@ static BOOL ov14_0222342C (BattleSystem * param0, BattleContext * param1, int pa
|
||||
|
||||
if (v2) {
|
||||
v4 = 0;
|
||||
ov16_02254FA8(param0, param1, v2, v3, param2, param2 ^ 1, 0, &v4);
|
||||
BattleSystem_CheckTypeChart(param0, param1, v2, v3, param2, param2 ^ 1, 0, &v4);
|
||||
|
||||
if (v4 & 0x2) {
|
||||
return 0;
|
||||
@@ -3479,7 +3479,7 @@ static BOOL ov14_022235F0 (BattleSystem * param0, BattleContext * param1, int pa
|
||||
v8 = 0;
|
||||
|
||||
if (param1->battleMons[v2].curHP) {
|
||||
ov16_02254FA8(param0, param1, v6, v7, param2, v2, 0, &v8);
|
||||
BattleSystem_CheckTypeChart(param0, param1, v6, v7, param2, v2, 0, &v8);
|
||||
}
|
||||
|
||||
if ((v8 & 0x8) == 0) {
|
||||
@@ -3489,7 +3489,7 @@ static BOOL ov14_022235F0 (BattleSystem * param0, BattleContext * param1, int pa
|
||||
v8 = 0;
|
||||
|
||||
if (param1->battleMons[v3].curHP) {
|
||||
ov16_02254FA8(param0, param1, v6, v7, param2, v3, 0, &v8);
|
||||
BattleSystem_CheckTypeChart(param0, param1, v6, v7, param2, v3, 0, &v8);
|
||||
}
|
||||
|
||||
if ((v8 & 0x8) == 0) {
|
||||
@@ -3613,7 +3613,7 @@ static BOOL ov14_02223B34 (BattleSystem * param0, BattleContext * param1, int pa
|
||||
|
||||
if (v4) {
|
||||
v1 = 0;
|
||||
ov16_02254FA8(param0, param1, v4, v5, param2, v2, 0, &v1);
|
||||
BattleSystem_CheckTypeChart(param0, param1, v4, v5, param2, v2, 0, &v1);
|
||||
|
||||
if (v1 & 0x2) {
|
||||
if (param3) {
|
||||
@@ -3641,7 +3641,7 @@ static BOOL ov14_02223B34 (BattleSystem * param0, BattleContext * param1, int pa
|
||||
|
||||
if (v4) {
|
||||
v1 = 0;
|
||||
ov16_02254FA8(param0, param1, v4, v5, param2, v2, 0, &v1);
|
||||
BattleSystem_CheckTypeChart(param0, param1, v4, v5, param2, v2, 0, &v1);
|
||||
|
||||
if (v1 & 0x2) {
|
||||
if (param3) {
|
||||
|
||||
@@ -50,11 +50,6 @@
|
||||
#include "overlay016/ov16_0225CBB8.h"
|
||||
#include "overlay016/ov16_0226485C.h"
|
||||
|
||||
typedef struct {
|
||||
u8 unk_00;
|
||||
u8 unk_01;
|
||||
} UnkStruct_ov16_0226EAD0;
|
||||
|
||||
enum MachineState {
|
||||
STATE_PROCESSING = 0,
|
||||
STATE_BREAK_OUT,
|
||||
@@ -86,10 +81,10 @@ static void BattleController_SafariRockCommand(BattleSystem *battleSys, BattleCo
|
||||
static void BattleController_SafariRunCommand(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static void BattleController_ExecScript(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static void BattleController_BeforeMove(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static void ov16_0224F734(BattleSystem * param0, BattleContext * param1);
|
||||
static void ov16_0224F824(BattleSystem * param0, BattleContext * param1);
|
||||
static void ov16_0224F854(BattleSystem * param0, BattleContext * param1);
|
||||
static void ov16_0224F8D4(BattleSystem * param0, BattleContext * param1);
|
||||
static void BattleController_TryMove(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static void BattleController_PrimaryEffect(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static void BattleController_CheckMoveFailure(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static void BattleController_UseMove(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static void ov16_0224F8EC(BattleSystem * param0, BattleContext * param1);
|
||||
static void ov16_0224FD00(BattleSystem * param0, BattleContext * param1);
|
||||
static void ov16_0224FEE0(BattleSystem * param0, BattleContext * param1);
|
||||
@@ -112,12 +107,12 @@ static void ov16_02250798(BattleSystem * param0, BattleContext * param1);
|
||||
static int BattleController_CheckObedience(BattleSystem *battleSys, BattleContext *battleCtx, int *nextSeq);
|
||||
static BOOL BattleController_DecrementPP(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static BOOL BattleController_HasNoTarget(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static BOOL ov16_0224E6F4(BattleSystem * param0, BattleContext * param1);
|
||||
static int BattleController_CheckTypeChart(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static BOOL BattleController_CheckStatusDisruption(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static BOOL ov16_0224EE88(BattleSystem * param0, BattleContext * param1);
|
||||
static BOOL BattleController_TriggerImmunityAbilities(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static BOOL BattleController_CheckQuickClaw(BattleSystem *battleSys, BattleContext *battleCtx);
|
||||
static BOOL BattleController_CheckMoveHit(BattleSystem *battleSys, BattleContext *battleCtx, int attacker, int defender, int move);
|
||||
static BOOL BattleController_CheckMoveEffect(BattleSystem *battleSys, BattleContext *battleCtx, int attacker, int defender, int move);
|
||||
static int BattleController_CheckMoveHit(BattleSystem *battleSys, BattleContext *battleCtx, int attacker, int defender, int move);
|
||||
static int BattleController_CheckMoveHitOverrides(BattleSystem *battleSys, BattleContext *battleCtx, int attacker, int defender, int move);
|
||||
static BOOL BattleController_MoveStolen(BattleSystem *battleSys, BattleContext * battleCtx);
|
||||
static BOOL BattleController_CheckAnySwitches(BattleSystem * param0, BattleContext * param1);
|
||||
static BOOL BattleController_CheckBattleOver(BattleSystem * param0, BattleContext * param1);
|
||||
@@ -161,10 +156,10 @@ static const BattleControlFunc BattleControlCommands[] = {
|
||||
BattleController_SafariRunCommand,
|
||||
BattleController_ExecScript,
|
||||
BattleController_BeforeMove,
|
||||
ov16_0224F734,
|
||||
ov16_0224F824,
|
||||
ov16_0224F854,
|
||||
ov16_0224F8D4,
|
||||
BattleController_TryMove,
|
||||
BattleController_PrimaryEffect,
|
||||
BattleController_CheckMoveFailure,
|
||||
BattleController_UseMove,
|
||||
ov16_0224F8EC,
|
||||
ov16_0224FD00,
|
||||
ov16_0224FEE0,
|
||||
@@ -227,7 +222,7 @@ void BattleContext_Free(BattleContext *battleCtx)
|
||||
void BattleController_CheckMoveHitEffect(BattleSystem *battleSys, BattleContext *battleCtx, int attacker, int defender, int move)
|
||||
{
|
||||
BattleController_CheckMoveHit(battleSys, battleCtx, attacker, defender, move);
|
||||
BattleController_CheckMoveEffect(battleSys, battleCtx, attacker, defender, move);
|
||||
BattleController_CheckMoveHitOverrides(battleSys, battleCtx, attacker, defender, move);
|
||||
}
|
||||
|
||||
static void BattleController_GetBattleMon(BattleSystem *battleSys, BattleContext *battleCtx)
|
||||
@@ -2360,13 +2355,25 @@ static BOOL BattleController_HasNoTarget(BattleSystem *battleSys, BattleContext
|
||||
return result;
|
||||
}
|
||||
|
||||
static BOOL ov16_0224E6F4 (BattleSystem * param0, BattleContext * param1)
|
||||
static int BattleController_CheckTypeChart(BattleSystem *battleSys, BattleContext *battleCtx)
|
||||
{
|
||||
if (((param1->aiContext.moveTable[param1->moveCur].range != 0x10) && (param1->aiContext.moveTable[param1->moveCur].range != 0x20) && (param1->aiContext.moveTable[param1->moveCur].power) && ((param1->battleStatusMask & 0x8000) == 0) && ((param1->battleStatusMask & 0x20) == 0)) || (param1->moveCur == 86)) {
|
||||
param1->damage = ov16_02254FA8(param0, param1, param1->moveCur, param1->moveType, param1->attacker, param1->defender, param1->damage, ¶m1->moveStatusFlags);
|
||||
if ((CURRENT_MOVE_DATA.range != RANGE_USER
|
||||
&& CURRENT_MOVE_DATA.range != RANGE_USER_SIDE
|
||||
&& CURRENT_MOVE_DATA.power
|
||||
&& (battleCtx->battleStatusMask & SYSCTL_SKIP_TYPE_CHECK) == FALSE
|
||||
&& (battleCtx->battleStatusMask & SYSCTL_FIRST_OF_MULTI_TURN) == FALSE)
|
||||
|| battleCtx->moveCur == MOVE_THUNDER_WAVE) {
|
||||
battleCtx->damage = BattleSystem_CheckTypeChart(battleSys,
|
||||
battleCtx,
|
||||
battleCtx->moveCur,
|
||||
battleCtx->moveType,
|
||||
battleCtx->attacker,
|
||||
battleCtx->defender,
|
||||
battleCtx->damage,
|
||||
&battleCtx->moveStatusFlags);
|
||||
|
||||
if (param1->moveStatusFlags & 0x8) {
|
||||
param1->moveFailFlags[param1->attacker].noEffect = 1;
|
||||
if (battleCtx->moveStatusFlags & MOVE_STATUS_INEFFECTIVE) {
|
||||
battleCtx->moveFailFlags[battleCtx->attacker].noEffect = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2745,36 +2752,50 @@ static BOOL BattleController_CheckStatusDisruption(BattleSystem *battleSys, Batt
|
||||
return result != CHECK_STATUS_DONE;
|
||||
}
|
||||
|
||||
static BOOL ov16_0224EE88 (BattleSystem * param0, BattleContext * param1)
|
||||
{
|
||||
int v0;
|
||||
int v1;
|
||||
enum {
|
||||
IMMUNITY_ABILITY_STATE_START = 0,
|
||||
|
||||
v0 = 0;
|
||||
IMMUNITY_ABILITY_STATE_CHECK = IMMUNITY_ABILITY_STATE_START,
|
||||
|
||||
IMMUNITY_ABILITY_STATE_END
|
||||
};
|
||||
|
||||
enum {
|
||||
IMMUNITY_ABILITY_LOOP_BACK,
|
||||
IMMUNITY_ABILITY_EXEC_SCRIPT,
|
||||
IMMUNITY_ABILITY_DONE,
|
||||
};
|
||||
|
||||
static BOOL BattleController_TriggerImmunityAbilities(BattleSystem *battleSys, BattleContext *battleCtx)
|
||||
{
|
||||
int result = IMMUNITY_ABILITY_LOOP_BACK;
|
||||
|
||||
do {
|
||||
switch (param1->abilityCheckState) {
|
||||
case 0:
|
||||
v1 = ov16_02256148(param1, param1->attacker, param1->defender);
|
||||
switch (battleCtx->abilityCheckState) {
|
||||
case IMMUNITY_ABILITY_STATE_CHECK:
|
||||
int nextSeq = BattleSystem_CheckImmunityAbilities(battleCtx, battleCtx->attacker, battleCtx->defender);
|
||||
|
||||
if (((v1) && ((param1->moveStatusFlags & (1 | 8 | 64 | 2048 | 4096 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 | 1048576)) == 0)) || (v1 == (0 + 181))) {
|
||||
BattleSystem_LoadScript(param1, 1, v1);
|
||||
param1->commandNext = param1->command;
|
||||
param1->command = 21;
|
||||
param1->moveStatusFlags |= 0x80000000;
|
||||
v0 = 1;
|
||||
if ((nextSeq && (battleCtx->moveStatusFlags & MOVE_STATUS_DID_NOT_HIT) == FALSE)
|
||||
|| nextSeq == BATTLE_SUBSEQ_BLOCKED_BY_SOUNDPROOF) {
|
||||
LOAD_SUBSEQ(nextSeq);
|
||||
battleCtx->commandNext = battleCtx->command;
|
||||
battleCtx->command = BATTLE_CONTROL_EXEC_SCRIPT;
|
||||
battleCtx->moveStatusFlags |= MOVE_STATUS_NO_MORE_WORK;
|
||||
|
||||
result = IMMUNITY_ABILITY_EXEC_SCRIPT;
|
||||
}
|
||||
|
||||
param1->abilityCheckState++;
|
||||
battleCtx->abilityCheckState++;
|
||||
break;
|
||||
case 1:
|
||||
param1->abilityCheckState = 0;
|
||||
v0 = 2;
|
||||
|
||||
case IMMUNITY_ABILITY_STATE_END:
|
||||
battleCtx->abilityCheckState = IMMUNITY_ABILITY_STATE_START;
|
||||
result = IMMUNITY_ABILITY_DONE;
|
||||
break;
|
||||
}
|
||||
} while (v0 == 0);
|
||||
} while (result == IMMUNITY_ABILITY_LOOP_BACK);
|
||||
|
||||
return v0 != 2;
|
||||
return result != IMMUNITY_ABILITY_DONE;
|
||||
}
|
||||
|
||||
static BOOL BattleController_CheckQuickClaw(BattleSystem *battleSys, BattleContext *battleCtx)
|
||||
@@ -2787,202 +2808,200 @@ static BOOL BattleController_CheckQuickClaw(BattleSystem *battleSys, BattleConte
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const UnkStruct_ov16_0226EAD0 Unk_ov16_0226EAD0[] = {
|
||||
{0x21, 0x64},
|
||||
{0x24, 0x64},
|
||||
{0x2B, 0x64},
|
||||
{0x32, 0x64},
|
||||
{0x3C, 0x64},
|
||||
{0x4B, 0x64},
|
||||
{0x1, 0x1},
|
||||
{0x85, 0x64},
|
||||
{0xA6, 0x64},
|
||||
{0x2, 0x1},
|
||||
{0xE9, 0x64},
|
||||
{0x85, 0x32},
|
||||
{0x3, 0x1}
|
||||
typedef struct {
|
||||
u8 numerator;
|
||||
u8 denominator;
|
||||
} Fraction;
|
||||
|
||||
static const Fraction HitRateByStage[] = {
|
||||
{ 33, 100 },
|
||||
{ 36, 100 },
|
||||
{ 43, 100 },
|
||||
{ 50, 100 },
|
||||
{ 60, 100 },
|
||||
{ 75, 100 },
|
||||
{ 1, 1 },
|
||||
{ 133, 100 },
|
||||
{ 166, 100 },
|
||||
{ 2, 1 },
|
||||
{ 233, 100 },
|
||||
{ 133, 50 },
|
||||
{ 3, 1 }
|
||||
};
|
||||
|
||||
static BOOL BattleController_CheckMoveHit (BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4)
|
||||
static int BattleController_CheckMoveHit(BattleSystem *battleSys, BattleContext *battleCtx, int attacker, int defender, int move)
|
||||
{
|
||||
u16 v0;
|
||||
s8 v1;
|
||||
s8 v2, v3;
|
||||
int v4;
|
||||
int v5;
|
||||
u8 v6;
|
||||
u8 v7;
|
||||
|
||||
if (BattleSystem_BattleType(param0) & 0x400) {
|
||||
if (BattleSystem_BattleType(battleSys) & BATTLE_TYPE_CATCH_TUTORIAL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (Battler_Ability(param1, param2) == 96) {
|
||||
v6 = 0;
|
||||
} else if (param1->moveType) {
|
||||
v6 = param1->moveType;
|
||||
u8 moveType;
|
||||
if (Battler_Ability(battleCtx, attacker) == ABILITY_NORMALIZE) {
|
||||
moveType = TYPE_NORMAL;
|
||||
} else if (battleCtx->moveType) {
|
||||
moveType = battleCtx->moveType;
|
||||
} else {
|
||||
v6 = param1->aiContext.moveTable[param4].type;
|
||||
moveType = MOVE_DATA(move).type;
|
||||
}
|
||||
|
||||
v7 = param1->aiContext.moveTable[param4].class;
|
||||
v2 = param1->battleMons[param2].statBoosts[0x6] - 6;
|
||||
v3 = 6 - param1->battleMons[param3].statBoosts[0x7];
|
||||
u8 moveClass = MOVE_DATA(move).class;
|
||||
s8 accStages = battleCtx->battleMons[attacker].statBoosts[BATTLE_STAT_ACCURACY] - 6;
|
||||
s8 evaStages = 6 - battleCtx->battleMons[defender].statBoosts[BATTLE_STAT_EVASION];
|
||||
|
||||
if (Battler_Ability(param1, param2) == 86) {
|
||||
v2 *= 2;
|
||||
if (Battler_Ability(battleCtx, attacker) == ABILITY_SIMPLE) {
|
||||
accStages *= 2;
|
||||
}
|
||||
|
||||
if (ov16_02255AB4(param1, param2, param3, 86) == 1) {
|
||||
v3 *= 2;
|
||||
if (Battler_IgnorableAbility(battleCtx, attacker, defender, ABILITY_SIMPLE) == TRUE) {
|
||||
evaStages *= 2;
|
||||
}
|
||||
|
||||
if (ov16_02255AB4(param1, param2, param3, 109) == 1) {
|
||||
v2 = 0;
|
||||
if (Battler_IgnorableAbility(battleCtx, attacker, defender, ABILITY_UNAWARE) == TRUE) {
|
||||
accStages = 0;
|
||||
}
|
||||
|
||||
if (Battler_Ability(param1, param2) == 109) {
|
||||
v3 = 0;
|
||||
if (Battler_Ability(battleCtx, attacker) == ABILITY_UNAWARE) {
|
||||
evaStages = 0;
|
||||
}
|
||||
|
||||
if (((param1->battleMons[param3].statusVolatile & 0x20000000) || (param1->battleMons[param3].moveEffectsMask & 0x400000)) && (v3 < 0)) {
|
||||
v3 = 0;
|
||||
if (MON_IS_IDENTIFIED(defender) && evaStages < 0) {
|
||||
evaStages = 0;
|
||||
}
|
||||
|
||||
v1 = 6 + v3 + v2;
|
||||
s8 sumStages = 6 + evaStages + accStages;
|
||||
|
||||
if (v1 < 0) {
|
||||
v1 = 0;
|
||||
if (sumStages < 0) {
|
||||
sumStages = 0;
|
||||
}
|
||||
|
||||
if (v1 > 12) {
|
||||
v1 = 12;
|
||||
if (sumStages > 12) {
|
||||
sumStages = 12;
|
||||
}
|
||||
|
||||
v0 = param1->aiContext.moveTable[param4].accuracy;
|
||||
u16 hitRate = MOVE_DATA(move).accuracy;
|
||||
|
||||
if (v0 == 0) {
|
||||
if (hitRate == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (param1->battleStatusMask & 0x20) {
|
||||
// Charge-up moves don't consider accuracy on their first turn
|
||||
if (battleCtx->battleStatusMask & SYSCTL_FIRST_OF_MULTI_TURN) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (param1->battleStatusMask & 0x400) {
|
||||
// These moves shouldn't use this formula
|
||||
if (battleCtx->battleStatusMask & SYSCTL_NONSTANDARD_ACC_CHECK) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((BattleSystem_CountAbility(param0, param1, 8, 0, 13) == 0) && (BattleSystem_CountAbility(param0, param1, 8, 0, 76) == 0)) {
|
||||
if ((param1->fieldConditionsMask & 0x30) && (param1->aiContext.moveTable[param4].effect == 152)) {
|
||||
v0 = 50;
|
||||
if (NO_CLOUD_NINE && WEATHER_IS_SUN && MOVE_DATA(move).effect == BATTLE_EFFECT_THUNDER) {
|
||||
hitRate = 50;
|
||||
}
|
||||
|
||||
hitRate *= HitRateByStage[sumStages].numerator;
|
||||
hitRate /= HitRateByStage[sumStages].denominator;
|
||||
|
||||
if (Battler_Ability(battleCtx, attacker) == ABILITY_COMPOUND_EYES) {
|
||||
hitRate = hitRate * 130 / 100;
|
||||
}
|
||||
|
||||
if (NO_CLOUD_NINE) {
|
||||
if (WEATHER_IS_SAND && Battler_IgnorableAbility(battleCtx, attacker, defender, ABILITY_SAND_VEIL) == TRUE) {
|
||||
hitRate = hitRate * 80 / 100;
|
||||
}
|
||||
|
||||
if (WEATHER_IS_HAIL && Battler_IgnorableAbility(battleCtx, attacker, defender, ABILITY_SNOW_CLOAK) == TRUE) {
|
||||
hitRate = hitRate * 80 / 100;
|
||||
}
|
||||
|
||||
if (battleCtx->fieldConditionsMask & FIELD_CONDITION_DEEP_FOG) {
|
||||
hitRate = hitRate * 6 / 10;
|
||||
}
|
||||
}
|
||||
|
||||
v0 *= Unk_ov16_0226EAD0[v1].unk_00;
|
||||
v0 /= Unk_ov16_0226EAD0[v1].unk_01;
|
||||
|
||||
if (Battler_Ability(param1, param2) == 14) {
|
||||
v0 = v0 * 130 / 100;
|
||||
if (Battler_Ability(battleCtx, attacker) == ABILITY_HUSTLE && moveClass == CLASS_PHYSICAL) {
|
||||
hitRate = hitRate * 80 / 100;
|
||||
}
|
||||
|
||||
if ((BattleSystem_CountAbility(param0, param1, 8, 0, 13) == 0) && (BattleSystem_CountAbility(param0, param1, 8, 0, 76) == 0)) {
|
||||
if (param1->fieldConditionsMask & 0xc) {
|
||||
if (ov16_02255AB4(param1, param2, param3, 8) == 1) {
|
||||
v0 = v0 * 80 / 100;
|
||||
}
|
||||
}
|
||||
|
||||
if (param1->fieldConditionsMask & 0xc0) {
|
||||
if (ov16_02255AB4(param1, param2, param3, 81) == 1) {
|
||||
v0 = v0 * 80 / 100;
|
||||
}
|
||||
}
|
||||
|
||||
if (param1->fieldConditionsMask & 0x8000) {
|
||||
v0 = v0 * 6 / 10;
|
||||
}
|
||||
if (Battler_IgnorableAbility(battleCtx, attacker, defender, ABILITY_TANGLED_FEET) == TRUE
|
||||
&& (battleCtx->battleMons[defender].statusVolatile & VOLATILE_CONDITION_CONFUSION)) {
|
||||
hitRate = hitRate * 50 / 100;
|
||||
}
|
||||
|
||||
if ((Battler_Ability(param1, param2) == 55) && (v7 == 0)) {
|
||||
v0 = v0 * 80 / 100;
|
||||
int itemEffect = Battler_HeldItemEffect(battleCtx, defender);
|
||||
int itemPower = Battler_HeldItemPower(battleCtx, defender, 0);
|
||||
|
||||
if (itemEffect == HOLD_EFFECT_ACC_REDUCE) {
|
||||
hitRate = hitRate * (100 - itemPower) / 100;
|
||||
}
|
||||
|
||||
if ((ov16_02255AB4(param1, param2, param3, 77) == 1) && (param1->battleMons[param3].statusVolatile & 0x7)) {
|
||||
v0 = v0 * 50 / 100;
|
||||
itemEffect = Battler_HeldItemEffect(battleCtx, attacker);
|
||||
itemPower = Battler_HeldItemPower(battleCtx, attacker, 0);
|
||||
|
||||
if (itemEffect == HOLD_EFFECT_ACCURACY_UP) {
|
||||
hitRate = hitRate * (100 + itemPower) / 100;
|
||||
}
|
||||
|
||||
v4 = Battler_HeldItemEffect(param1, param3);
|
||||
v5 = ov16_02258ACC(param1, param3, 0);
|
||||
|
||||
if (v4 == 48) {
|
||||
v0 = v0 * (100 - v5) / 100;
|
||||
if (itemEffect == HOLD_EFFECT_ACCURACY_UP_SLOWER && Battler_MovedThisTurn(battleCtx, defender) == TRUE) {
|
||||
hitRate = hitRate * (100 + itemPower) / 100;
|
||||
}
|
||||
|
||||
v4 = Battler_HeldItemEffect(param1, param2);
|
||||
v5 = ov16_02258ACC(param1, param2, 0);
|
||||
|
||||
if (v4 == 93) {
|
||||
v0 = v0 * (100 + v5) / 100;
|
||||
if (battleCtx->battleMons[attacker].moveEffectsData.micleBerry) {
|
||||
battleCtx->battleMons[attacker].moveEffectsData.micleBerry = FALSE;
|
||||
hitRate = hitRate * 120 / 100;
|
||||
}
|
||||
|
||||
if ((v4 == 104) && (ov16_022588A4(param1, param3) == 1)) {
|
||||
v0 = v0 * (100 + v5) / 100;
|
||||
if (battleCtx->fieldConditionsMask & FIELD_CONDITION_GRAVITY) {
|
||||
hitRate = hitRate * 10 / 6;
|
||||
}
|
||||
|
||||
if (param1->battleMons[param2].moveEffectsData.micleBerry) {
|
||||
param1->battleMons[param2].moveEffectsData.micleBerry = 0;
|
||||
v0 = v0 * 120 / 100;
|
||||
}
|
||||
|
||||
if (param1->fieldConditionsMask & 0x7000) {
|
||||
v0 = v0 * 10 / 6;
|
||||
}
|
||||
|
||||
if ((BattleSystem_RandNext(param0) % 100) + 1 > v0) {
|
||||
param1->moveStatusFlags |= 0x1;
|
||||
if ((BattleSystem_RandNext(battleSys) % 100) + 1 > hitRate) {
|
||||
battleCtx->moveStatusFlags |= MOVE_STATUS_MISSED;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static BOOL BattleController_CheckMoveEffect (BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4)
|
||||
static int BattleController_CheckMoveHitOverrides(BattleSystem *battleSys, BattleContext *battleCtx, int attacker, int defender, int move)
|
||||
{
|
||||
if (param1->battleStatusMask & 0x20) {
|
||||
if (battleCtx->battleStatusMask & SYSCTL_FIRST_OF_MULTI_TURN) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((param1->turnFlags[param3].protecting) && (param1->aiContext.moveTable[param4].flags & 0x2)) {
|
||||
if ((param4 != 174) || (ov16_02255950(param1, param4, param2) == 1)) {
|
||||
if ((BattleMove_IsMultiTurn(param1, param4) == 0) || (param1->battleStatusMask & 0x200)) {
|
||||
ov16_02253F20(param0, param1, param2);
|
||||
param1->moveStatusFlags |= 0x8000;
|
||||
return 0;
|
||||
}
|
||||
if (battleCtx->turnFlags[defender].protecting
|
||||
&& (MOVE_DATA(move).flags & MOVE_FLAG_CAN_PROTECT)
|
||||
&& (move != MOVE_CURSE || BattleSystem_IsGhostCurse(battleCtx, move, attacker) == TRUE) // Ghost-Curse can be Protected
|
||||
&& (BattleMove_IsMultiTurn(battleCtx, move) == FALSE || (battleCtx->battleStatusMask & SYSCTL_LAST_OF_MULTI_TURN))) {
|
||||
BattleSystem_BreakMultiTurn(battleSys, battleCtx, attacker);
|
||||
battleCtx->moveStatusFlags |= MOVE_STATUS_PROTECTED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((battleCtx->battleStatusMask & SYSCTL_NONSTANDARD_ACC_CHECK) == FALSE
|
||||
&& (MON_IS_LOCKED_ONTO(attacker, defender)
|
||||
|| Battler_Ability(battleCtx, attacker) == ABILITY_NO_GUARD
|
||||
|| Battler_Ability(battleCtx, defender) == ABILITY_NO_GUARD)) {
|
||||
battleCtx->moveStatusFlags &= ~MOVE_STATUS_MISSED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (NO_CLOUD_NINE) {
|
||||
if (WEATHER_IS_RAIN && MOVE_DATA(move).effect == BATTLE_EFFECT_THUNDER) {
|
||||
battleCtx->moveStatusFlags &= ~MOVE_STATUS_MISSED;
|
||||
}
|
||||
|
||||
if (WEATHER_IS_HAIL && MOVE_DATA(move).effect == BATTLE_EFFECT_BLIZZARD) {
|
||||
battleCtx->moveStatusFlags &= ~MOVE_STATUS_MISSED;
|
||||
}
|
||||
}
|
||||
|
||||
if ((param1->battleStatusMask & 0x400) == 0) {
|
||||
if (((param1->battleMons[param3].moveEffectsMask & 0x18) && (param1->battleMons[param3].moveEffectsData.lockOnTarget == param2)) || (Battler_Ability(param1, param2) == 99) || (Battler_Ability(param1, param3) == 99)) {
|
||||
param1->moveStatusFlags &= (0x1 ^ 0xffffffff);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ((BattleSystem_CountAbility(param0, param1, 8, 0, 13) == 0) && (BattleSystem_CountAbility(param0, param1, 8, 0, 76) == 0)) {
|
||||
if ((param1->fieldConditionsMask & 0x3) && (param1->aiContext.moveTable[param4].effect == 152)) {
|
||||
param1->moveStatusFlags &= (0x1 ^ 0xffffffff);
|
||||
}
|
||||
|
||||
if ((param1->fieldConditionsMask & 0xc0) && (param1->aiContext.moveTable[param4].effect == 260)) {
|
||||
param1->moveStatusFlags &= (0x1 ^ 0xffffffff);
|
||||
}
|
||||
}
|
||||
|
||||
if (((param1->moveStatusFlags & 0x400) == 0) && (param1->aiContext.moveTable[param1->moveCur].range != 0x80)) {
|
||||
if ((((param1->battleStatusMask & 0x4) == 0) && (param1->battleMons[param3].moveEffectsMask & 0x40)) || (((param1->battleStatusMask & 0x80000) == 0) && (param1->battleMons[param3].moveEffectsMask & 0x20000000)) || (((param1->battleStatusMask & 0x8) == 0) && (param1->battleMons[param3].moveEffectsMask & 0x80)) || (((param1->battleStatusMask & 0x10) == 0) && (param1->battleMons[param3].moveEffectsMask & 0x40000))) {
|
||||
param1->moveStatusFlags |= 0x10000;
|
||||
}
|
||||
if ((battleCtx->moveStatusFlags & MOVE_STATUS_BYPASSED_ACCURACY) == FALSE
|
||||
&& CURRENT_MOVE_DATA.range != RANGE_OPPONENT_SIDE
|
||||
&& (((battleCtx->battleStatusMask & SYSCTL_HIT_DURING_FLY) == FALSE && (battleCtx->battleMons[defender].moveEffectsMask & MOVE_EFFECT_AIRBORNE))
|
||||
|| ((battleCtx->battleStatusMask & SYSCTL_HIT_DURING_SHADOW_FORCE) == FALSE && (battleCtx->battleMons[defender].moveEffectsMask & MOVE_EFFECT_SHADOW_FORCE))
|
||||
|| ((battleCtx->battleStatusMask & SYSCTL_HIT_DURING_DIG) == FALSE && (battleCtx->battleMons[defender].moveEffectsMask & MOVE_EFFECT_UNDERGROUND))
|
||||
|| ((battleCtx->battleStatusMask & SYSCTL_HIT_DURING_DIVE) == FALSE && (battleCtx->battleMons[defender].moveEffectsMask & MOVE_EFFECT_UNDERWATER)))) {
|
||||
battleCtx->moveStatusFlags |= MOVE_STATUS_SEMI_INVULNERABLE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -3139,13 +3158,13 @@ static void BattleController_BeforeMove(BattleSystem *battleSys, BattleContext *
|
||||
}
|
||||
|
||||
if (battleCtx->moveStatusFlags & MOVE_STATUS_NO_EFFECTS) {
|
||||
battleCtx->command = BATTLE_CONTROL_NO_EFFECTS;
|
||||
battleCtx->command = BATTLE_CONTROL_MOVE_FAILED;
|
||||
} else {
|
||||
battleCtx->battleStatusMask2 |= 0x40;
|
||||
|
||||
BattleSystem_LoadScript(battleCtx, 0, battleCtx->moveCur);
|
||||
battleCtx->command = BATTLE_CONTROL_EXEC_SCRIPT;
|
||||
battleCtx->commandNext = BATTLE_CONTROL_AFTER_MOVE;
|
||||
battleCtx->commandNext = BATTLE_CONTROL_TRY_MOVE;
|
||||
|
||||
BattleSystem_UpdateLastResort(battleSys, battleCtx);
|
||||
}
|
||||
@@ -3153,102 +3172,122 @@ static void BattleController_BeforeMove(BattleSystem *battleSys, BattleContext *
|
||||
BattleSystem_UpdateMetronomeCount(battleSys, battleCtx);
|
||||
}
|
||||
|
||||
static void ov16_0224F734 (BattleSystem * param0, BattleContext * param1)
|
||||
enum {
|
||||
TRY_MOVE_START = 0,
|
||||
|
||||
TRY_MOVE_STATE_CHECK_VALID_TARGET = TRY_MOVE_START,
|
||||
TRY_MOVE_STATE_TRIGGER_REDIRECTION_ABILITIES,
|
||||
TRY_MOVE_STATE_CHECK_MOVE_HITS,
|
||||
TRY_MOVE_STATE_CHECK_MOVE_HIT_OVERRIDES,
|
||||
TRY_MOVE_STATE_CHECK_TYPE_CHART,
|
||||
TRY_MOVE_STATE_TRIGGER_IMMUNITY_ABILITIES,
|
||||
|
||||
TRY_MOVE_END,
|
||||
};
|
||||
|
||||
static void BattleController_TryMove(BattleSystem *battleSys, BattleContext *battleCtx)
|
||||
{
|
||||
switch (param1->moveExecutionCheckState) {
|
||||
case 0:
|
||||
param1->moveExecutionCheckState++;
|
||||
switch (battleCtx->tryMoveCheckState) {
|
||||
case TRY_MOVE_STATE_CHECK_VALID_TARGET:
|
||||
battleCtx->tryMoveCheckState++;
|
||||
|
||||
if (BattleController_HasNoTarget(param0, param1) == 1) {
|
||||
if (BattleController_HasNoTarget(battleSys, battleCtx) == TRUE) {
|
||||
return;
|
||||
}
|
||||
|
||||
case 1:
|
||||
param1->moveExecutionCheckState++;
|
||||
case TRY_MOVE_STATE_TRIGGER_REDIRECTION_ABILITIES:
|
||||
battleCtx->tryMoveCheckState++;
|
||||
|
||||
if (ov16_02253E3C(param0, param1) == 1) {
|
||||
if (BattleMove_TriggerRedirectionAbilities(battleSys, battleCtx) == TRUE) {
|
||||
return;
|
||||
}
|
||||
case 2:
|
||||
if (((param1->multiHitCheckFlags & 0x20) == 0) && (param1->defender != 0xff)) {
|
||||
if (BattleController_CheckMoveHit(param0, param1, param1->attacker, param1->defender, param1->moveCur) == 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
case TRY_MOVE_STATE_CHECK_MOVE_HITS:
|
||||
if ((battleCtx->multiHitCheckFlags & SYSCTL_SKIP_ACCURACY_CHECK) == FALSE
|
||||
&& battleCtx->defender != BATTLER_NONE
|
||||
&& BattleController_CheckMoveHit(battleSys, battleCtx, battleCtx->attacker, battleCtx->defender, battleCtx->moveCur) == 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
param1->moveExecutionCheckState++;
|
||||
case 3:
|
||||
if (((param1->multiHitCheckFlags & 0x40) == 0) && (param1->defender != 0xff)) {
|
||||
if (BattleController_CheckMoveEffect(param0, param1, param1->attacker, param1->defender, param1->moveCur) == 1) {
|
||||
return;
|
||||
}
|
||||
battleCtx->tryMoveCheckState++;
|
||||
|
||||
case TRY_MOVE_STATE_CHECK_MOVE_HIT_OVERRIDES:
|
||||
if ((battleCtx->multiHitCheckFlags & SYSCTL_SKIP_ACCURACY_OVERRIDES) == FALSE
|
||||
&& battleCtx->defender != BATTLER_NONE
|
||||
&& BattleController_CheckMoveHitOverrides(battleSys, battleCtx, battleCtx->attacker, battleCtx->defender, battleCtx->moveCur) == 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
param1->moveExecutionCheckState++;
|
||||
case 4:
|
||||
if (((param1->multiHitCheckFlags & 0x2) == 0) && (param1->defender != 0xff)) {
|
||||
if (ov16_0224E6F4(param0, param1) == 1) {
|
||||
return;
|
||||
}
|
||||
battleCtx->tryMoveCheckState++;
|
||||
|
||||
case TRY_MOVE_STATE_CHECK_TYPE_CHART:
|
||||
if ((battleCtx->multiHitCheckFlags & SYSCTL_SKIP_TYPE_CHART_CHECK) == FALSE
|
||||
&& battleCtx->defender != BATTLER_NONE
|
||||
&& BattleController_CheckTypeChart(battleSys, battleCtx) == 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
param1->moveExecutionCheckState++;
|
||||
case 5:
|
||||
if (((param1->multiHitCheckFlags & 0x10) == 0) && (param1->defender != 0xff)) {
|
||||
if (ov16_0224EE88(param0, param1) == 1) {
|
||||
return;
|
||||
}
|
||||
battleCtx->tryMoveCheckState++;
|
||||
|
||||
case TRY_MOVE_STATE_TRIGGER_IMMUNITY_ABILITIES:
|
||||
if ((battleCtx->multiHitCheckFlags & SYSCTL_SKIP_IMMUNITY_TRIGGERS) == FALSE
|
||||
&& battleCtx->defender != BATTLER_NONE
|
||||
&& BattleController_TriggerImmunityAbilities(battleSys, battleCtx) == 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
param1->moveExecutionCheckState++;
|
||||
case 6:
|
||||
param1->moveExecutionCheckState = 0;
|
||||
battleCtx->tryMoveCheckState++;
|
||||
|
||||
case TRY_MOVE_END:
|
||||
battleCtx->tryMoveCheckState = TRY_MOVE_START;
|
||||
break;
|
||||
}
|
||||
|
||||
param1->command = 24;
|
||||
battleCtx->command = BATTLE_CONTROL_PRIMARY_EFFECT;
|
||||
}
|
||||
|
||||
static void ov16_0224F824 (BattleSystem * param0, BattleContext * param1)
|
||||
static void BattleController_PrimaryEffect(BattleSystem *battleSys, BattleContext *battleCtx)
|
||||
{
|
||||
int v0;
|
||||
int nextSeq;
|
||||
|
||||
if (ov16_0225366C(param0, param1, &v0) == 1) {
|
||||
BattleSystem_LoadScript(param1, 1, v0);
|
||||
param1->command = 21;
|
||||
param1->commandNext = 25;
|
||||
if (BattleSystem_CheckPrimaryEffect(battleSys, battleCtx, &nextSeq) == TRUE) {
|
||||
LOAD_SUBSEQ(nextSeq);
|
||||
battleCtx->command = BATTLE_CONTROL_EXEC_SCRIPT;
|
||||
battleCtx->commandNext = BATTLE_CONTROL_MOVE_FAILED;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
battleCtx->command = BATTLE_CONTROL_MOVE_FAILED;
|
||||
}
|
||||
|
||||
static void BattleController_CheckMoveFailure(BattleSystem *battleSys, BattleContext *battleCtx)
|
||||
{
|
||||
if (battleCtx->moveStatusFlags & MOVE_STATUS_NO_MORE_WORK) {
|
||||
battleCtx->command = BATTLE_CONTROL_CHECK_MULTI_TARGET;
|
||||
} else if (battleCtx->moveStatusFlags & MOVE_STATUS_NO_PP) {
|
||||
LOAD_SUBSEQ(BATTLE_SUBSEQ_NO_PP);
|
||||
battleCtx->command = BATTLE_CONTROL_EXEC_SCRIPT;
|
||||
battleCtx->commandNext = BATTLE_CONTROL_UPDATE_MOVE_BUFFERS;
|
||||
} else if (battleCtx->multiHitLoop && (battleCtx->moveStatusFlags & MOVE_STATUS_MISSED)) {
|
||||
// Thrashing moves have a special status flag.
|
||||
battleCtx->moveStatusFlags &= ~MOVE_STATUS_MISSED;
|
||||
battleCtx->moveStatusFlags |= MOVE_STATUS_THRASH_DISRUPTED;
|
||||
battleCtx->command = BATTLE_CONTROL_AFTER_MOVE_MESSAGE;
|
||||
} else if (battleCtx->moveStatusFlags & MOVE_STATUS_DID_NOT_HIT) {
|
||||
LOAD_SUBSEQ(BATTLE_SUBSEQ_MISSED);
|
||||
battleCtx->command = BATTLE_CONTROL_EXEC_SCRIPT;
|
||||
battleCtx->commandNext = BATTLE_CONTROL_CHECK_FAINTED; // crash damage can kill
|
||||
} else {
|
||||
param1->command = 25;
|
||||
battleCtx->command = BATTLE_CONTROL_USE_MOVE;
|
||||
}
|
||||
}
|
||||
|
||||
static void ov16_0224F854 (BattleSystem * param0, BattleContext * param1)
|
||||
static void BattleController_UseMove(BattleSystem *battleSys, BattleContext *battleCtx)
|
||||
{
|
||||
if (param1->moveStatusFlags & 0x80000000) {
|
||||
param1->command = 34;
|
||||
} else if (param1->moveStatusFlags & 0x200) {
|
||||
BattleSystem_LoadScript(param1, 1, (0 + 42));
|
||||
param1->command = 21;
|
||||
param1->commandNext = 38;
|
||||
} else if ((param1->multiHitLoop) && (param1->moveStatusFlags & 0x1)) {
|
||||
param1->moveStatusFlags &= (0x1 ^ 0xffffffff);
|
||||
param1->moveStatusFlags |= 0x4000;
|
||||
param1->command = 28;
|
||||
} else if (param1->moveStatusFlags & (1 | 8 | 64 | 2048 | 4096 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 | 1048576)) {
|
||||
BattleSystem_LoadScript(param1, 1, (0 + 7));
|
||||
param1->command = 21;
|
||||
param1->commandNext = 33;
|
||||
} else {
|
||||
param1->command = 26;
|
||||
}
|
||||
}
|
||||
|
||||
static void ov16_0224F8D4 (BattleSystem * param0, BattleContext * param1)
|
||||
{
|
||||
BattleSystem_LoadScript(param1, 1, (0 + 1));
|
||||
param1->command = 21;
|
||||
param1->commandNext = 27;
|
||||
LOAD_SUBSEQ(BATTLE_SUBSEQ_USE_MOVE);
|
||||
battleCtx->command = BATTLE_CONTROL_EXEC_SCRIPT;
|
||||
battleCtx->commandNext = BATTLE_CONTROL_UPDATE_HP;
|
||||
}
|
||||
|
||||
static void ov16_0224F8EC (BattleSystem * param0, BattleContext * param1)
|
||||
@@ -3262,7 +3301,7 @@ static void ov16_0224F8EC (BattleSystem * param0, BattleContext * param1)
|
||||
|
||||
if (param1->damage) {
|
||||
v0 = Battler_HeldItemEffect(param1, param1->defender);
|
||||
v1 = ov16_02258ACC(param1, param1->defender, 0);
|
||||
v1 = Battler_HeldItemPower(param1, param1->defender, 0);
|
||||
|
||||
GF_ASSERT(param1->damage < 0);
|
||||
|
||||
@@ -4223,7 +4262,7 @@ static BOOL BattleController_CheckBattleOver (BattleSystem * param0, BattleConte
|
||||
|
||||
static BOOL BattleController_CheckRange (BattleSystem *battleSys, BattleContext *battleCtx, u8 battler, u32 battleType, int *range, int moveSlot, u32 *target)
|
||||
{
|
||||
if ((battleCtx->battleMons[battler].moves[moveSlot] == 174) && (ov16_02255950(battleCtx, battleCtx->battleMons[battler].moves[moveSlot], battler) == 0)) {
|
||||
if ((battleCtx->battleMons[battler].moves[moveSlot] == 174) && (BattleSystem_IsGhostCurse(battleCtx, battleCtx->battleMons[battler].moves[moveSlot], battler) == 0)) {
|
||||
*range = 0x10;
|
||||
} else {
|
||||
*range = battleCtx->aiContext.moveTable[battleCtx->battleMons[battler].moves[moveSlot]].range;
|
||||
@@ -4463,7 +4502,7 @@ static BOOL ov16_022512F8 (BattleSystem * param0, BattleContext * param1)
|
||||
int v2;
|
||||
|
||||
v1 = Battler_HeldItemEffect(param1, param1->attacker);
|
||||
v2 = ov16_02258ACC(param1, param1->attacker, 0);
|
||||
v2 = Battler_HeldItemPower(param1, param1->attacker, 0);
|
||||
|
||||
if (param1->defender != 0xff) {
|
||||
if ((v1 == 56) && ((param1->moveStatusFlags & ((1 | 8 | 64 | 2048 | 4096 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 | 1048576) | 512 | 0x80000000)) == 0) && ((param1->selfTurnFlags[param1->defender].physicalDamageTaken) || (param1->selfTurnFlags[param1->defender].specialDamageTaken)) && ((BattleSystem_RandNext(param0) % 100) < v2) && (param1->aiContext.moveTable[param1->moveCur].flags & 0x20) && (param1->battleMons[param1->defender].curHP)) {
|
||||
@@ -4523,7 +4562,7 @@ static BOOL ov16_0225143C (BattleSystem * param0, BattleContext * param1)
|
||||
v0 = 0;
|
||||
v2 = BattleSystem_MaxBattlers(param0);
|
||||
v3 = Battler_HeldItemEffect(param1, param1->attacker);
|
||||
v4 = ov16_02258ACC(param1, param1->attacker, 0);
|
||||
v4 = Battler_HeldItemPower(param1, param1->attacker, 0);
|
||||
|
||||
if (BattleController_CheckAnyFainted(param1, param1->command, param1->command, 1) == 1) {
|
||||
return 1;
|
||||
|
||||
@@ -1357,7 +1357,7 @@ static void ov16_02241374 (BattleSystem * param0, BattleContext * param1)
|
||||
param1->damage *= param1->criticalMul;
|
||||
|
||||
if (Battler_HeldItemEffect(param1, param1->attacker) == 98) {
|
||||
param1->damage = param1->damage * (100 + ov16_02258ACC(param1, param1->attacker, 0)) / 100;
|
||||
param1->damage = param1->damage * (100 + Battler_HeldItemPower(param1, param1->attacker, 0)) / 100;
|
||||
}
|
||||
|
||||
if (Battler_HeldItemEffect(param1, param1->attacker) == 105) {
|
||||
@@ -2361,7 +2361,7 @@ static BOOL ov16_02242400 (BattleSystem * param0, BattleContext * param1)
|
||||
param1->msgBuffer.tags = 2;
|
||||
param1->msgBuffer.params[0] = BattleSystem_NicknameTag(param1, param1->sideEffectMon);
|
||||
v5 = 1;
|
||||
} else if ((ov16_02255AB4(param1, param1->attacker, param1->sideEffectMon, 29) == 1) || (ov16_02255AB4(param1, param1->attacker, param1->sideEffectMon, 73) == 1)) {
|
||||
} else if ((Battler_IgnorableAbility(param1, param1->attacker, param1->sideEffectMon, 29) == 1) || (Battler_IgnorableAbility(param1, param1->attacker, param1->sideEffectMon, 73) == 1)) {
|
||||
if (param1->sideEffectType == 3) {
|
||||
param1->msgBuffer.id = 727;
|
||||
param1->msgBuffer.tags = 53;
|
||||
@@ -2377,7 +2377,7 @@ static BOOL ov16_02242400 (BattleSystem * param0, BattleContext * param1)
|
||||
}
|
||||
|
||||
v5 = 1;
|
||||
} else if (((ov16_02255AB4(param1, param1->attacker, param1->sideEffectMon, 51) == 1) && ((0x1 + v3) == 0x6)) || ((ov16_02255AB4(param1, param1->attacker, param1->sideEffectMon, 52) == 1) && ((0x1 + v3) == 0x1))) {
|
||||
} else if (((Battler_IgnorableAbility(param1, param1->attacker, param1->sideEffectMon, 51) == 1) && ((0x1 + v3) == 0x6)) || ((Battler_IgnorableAbility(param1, param1->attacker, param1->sideEffectMon, 52) == 1) && ((0x1 + v3) == 0x1))) {
|
||||
if (param1->sideEffectType == 3) {
|
||||
param1->msgBuffer.id = 727;
|
||||
param1->msgBuffer.tags = 53;
|
||||
@@ -2408,7 +2408,7 @@ static BOOL ov16_02242400 (BattleSystem * param0, BattleContext * param1)
|
||||
ov16_02248AF0(param1, v0);
|
||||
return 0;
|
||||
}
|
||||
} else if ((ov16_02255AB4(param1, param1->attacker, param1->sideEffectMon, 19) == 1) && (param1->sideEffectType == 2)) {
|
||||
} else if ((Battler_IgnorableAbility(param1, param1->attacker, param1->sideEffectMon, 19) == 1) && (param1->sideEffectType == 2)) {
|
||||
v5 = 1;
|
||||
} else if (param1->battleMons[param1->sideEffectMon].statusVolatile & 0x1000000) {
|
||||
v5 = 2;
|
||||
@@ -2940,7 +2940,7 @@ static BOOL ov16_02243120 (BattleSystem * param0, BattleContext * param1)
|
||||
v0 = ov16_02248AD0(param1);
|
||||
v1 = ov16_0224A984(param0, param1, v0);
|
||||
|
||||
ov16_02253F20(param0, param1, v1);
|
||||
BattleSystem_BreakMultiTurn(param0, param1, v1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -3558,7 +3558,7 @@ static BOOL ov16_022438F8 (BattleSystem * param0, BattleContext * param1)
|
||||
param1->sideConditions[v1].lightScreenUser = param1->attacker;
|
||||
|
||||
if (Battler_HeldItemEffect(param1, param1->attacker) == 97) {
|
||||
param1->sideConditions[v1].lightScreenTurns += ov16_02258ACC(param1, param1->attacker, 0);
|
||||
param1->sideConditions[v1].lightScreenTurns += Battler_HeldItemPower(param1, param1->attacker, 0);
|
||||
}
|
||||
|
||||
param1->msgBuffer.tags = 20;
|
||||
@@ -3594,7 +3594,7 @@ static BOOL ov16_022439D8 (BattleSystem * param0, BattleContext * param1)
|
||||
param1->sideConditions[v1].reflectUser = param1->attacker;
|
||||
|
||||
if (Battler_HeldItemEffect(param1, param1->attacker) == 97) {
|
||||
param1->sideConditions[v1].reflectTurns += ov16_02258ACC(param1, param1->attacker, 0);
|
||||
param1->sideConditions[v1].reflectTurns += Battler_HeldItemPower(param1, param1->attacker, 0);
|
||||
}
|
||||
|
||||
param1->msgBuffer.tags = 20;
|
||||
@@ -3641,7 +3641,7 @@ static BOOL ov16_02243B38 (BattleSystem * param0, BattleContext * param1)
|
||||
|
||||
param1->battleStatusMask |= 0x400;
|
||||
|
||||
if (ov16_02255AB4(param1, param1->attacker, param1->defender, 5) == 1) {
|
||||
if (Battler_IgnorableAbility(param1, param1->attacker, param1->defender, 5) == 1) {
|
||||
param1->moveStatusFlags |= 0x80000;
|
||||
} else {
|
||||
if (((param1->battleMons[param1->defender].moveEffectsMask & 0x18) == 0) && (Battler_Ability(param1, param1->attacker) != 99) && (Battler_Ability(param1, param1->defender) != 99)) {
|
||||
@@ -4149,7 +4149,7 @@ static BOOL ov16_02244798 (BattleSystem * param0, BattleContext * param1)
|
||||
v1 = ov16_0224A984(param0, param1, 0x10);
|
||||
|
||||
if ((param1->battlersSwitchingMask & FlagIndex(v1)) == 0) {
|
||||
if (ov16_02255AB4(param1, param1->attacker, v1, 43) == 0) {
|
||||
if (Battler_IgnorableAbility(param1, param1->attacker, v1, 43) == 0) {
|
||||
param1->battleMons[v1].status = 0;
|
||||
param1->battleMons[v1].statusVolatile &= (0x8000000 ^ 0xffffffff);
|
||||
} else {
|
||||
@@ -4206,7 +4206,7 @@ static BOOL ov16_022448E8 (BattleSystem * param0, BattleContext * param1)
|
||||
} else if ((param1->battleMons[param1->defender].moveEffectsData.custapBerry) || (param1->battleMons[param1->defender].moveEffectsData.quickClaw)) {
|
||||
ov16_02248AF0(param1, v0);
|
||||
} else {
|
||||
if ((param1->battleMons[param1->defender].heldItem) && (ov16_02255AB4(param1, param1->attacker, param1->defender, 60) == 1)) {
|
||||
if ((param1->battleMons[param1->defender].heldItem) && (Battler_IgnorableAbility(param1, param1->attacker, param1->defender, 60) == 1)) {
|
||||
ov16_02248AF0(param1, v1);
|
||||
} else if ((param1->battleMons[param1->attacker].heldItem) || (ov16_02255980(param0, param1, param1->defender) == 0)) {
|
||||
ov16_02248AF0(param1, v0);
|
||||
@@ -4477,7 +4477,7 @@ static BOOL ov16_0224505C (BattleSystem * param0, BattleContext * param1)
|
||||
v2 = 0;
|
||||
|
||||
for (v1 = 0; v1 < v3; v1++) {
|
||||
if ((param1->battleMons[v1].moveEffectsMask & 0x20) || (param1->battleMons[v1].curHP == 0) || (ov16_02255AB4(param1, param1->attacker, v1, 43) == 1)) {
|
||||
if ((param1->battleMons[v1].moveEffectsMask & 0x20) || (param1->battleMons[v1].curHP == 0) || (Battler_IgnorableAbility(param1, param1->attacker, v1, 43) == 1)) {
|
||||
v2++;
|
||||
} else {
|
||||
param1->battleMons[v1].moveEffectsMask |= 0x20;
|
||||
@@ -4622,7 +4622,7 @@ static BOOL ov16_0224544C (BattleSystem * param0, BattleContext * param1)
|
||||
}
|
||||
|
||||
if (--param1->battleMons[param1->attacker].moveEffectsData.rolloutCount == 0) {
|
||||
ov16_02253F20(param0, param1, param1->attacker);
|
||||
BattleSystem_BreakMultiTurn(param0, param1, param1->attacker);
|
||||
}
|
||||
|
||||
param1->movePower = param1->aiContext.moveTable[param1->moveCur].power;
|
||||
@@ -5097,7 +5097,7 @@ static BOOL ov16_022460A8 (BattleSystem * param0, BattleContext * param1)
|
||||
} else if (((param1->battleMons[param1->attacker].heldItem == 0) && (param1->battleMons[param1->defender].heldItem == 0)) || (ov16_022559DC(param1, param1->attacker) == 0) || (ov16_022559DC(param1, param1->defender) == 0)) {
|
||||
ov16_02248AF0(param1, v0);
|
||||
} else {
|
||||
if (ov16_02255AB4(param1, param1->attacker, param1->defender, 60) == 1) {
|
||||
if (Battler_IgnorableAbility(param1, param1->attacker, param1->defender, 60) == 1) {
|
||||
ov16_02248AF0(param1, v1);
|
||||
}
|
||||
}
|
||||
@@ -5286,7 +5286,7 @@ static BOOL ov16_0224650C (BattleSystem * param0, BattleContext * param1)
|
||||
v0 = ov16_02248AD0(param1);
|
||||
v1 = Battler_Side(param0, param1->defender);
|
||||
|
||||
if ((param1->battleMons[param1->defender].heldItem) && (ov16_02255AB4(param1, param1->attacker, param1->defender, 60) == 1)) {
|
||||
if ((param1->battleMons[param1->defender].heldItem) && (Battler_IgnorableAbility(param1, param1->attacker, param1->defender, 60) == 1)) {
|
||||
param1->msgBuffer.id = 714;
|
||||
param1->msgBuffer.tags = 37;
|
||||
param1->msgBuffer.params[0] = BattleSystem_NicknameTag(param1, param1->defender);
|
||||
@@ -5548,7 +5548,7 @@ static BOOL ov16_022469C4 (BattleSystem * param0, BattleContext * param1)
|
||||
int v6;
|
||||
|
||||
v5 = Battler_HeldItemEffect(param1, param1->attacker);
|
||||
v6 = ov16_02258ACC(param1, param1->attacker, 0);
|
||||
v6 = Battler_HeldItemPower(param1, param1->attacker, 0);
|
||||
|
||||
if ((v5 == 55) || (v5 == 115) || (v5 == 125)) {
|
||||
param1->battleMons[param1->attacker].moveEffectsData.choiceLockedMove = v3;
|
||||
@@ -5563,7 +5563,7 @@ static BOOL ov16_02246B68 (BattleSystem * param0, BattleContext * param1)
|
||||
{
|
||||
ov16_02248AF0(param1, 1);
|
||||
|
||||
param1->damage = ov16_02254FA8(param0, param1, param1->moveCur, param1->moveType, param1->attacker, param1->defender, param1->damage, ¶m1->moveStatusFlags);
|
||||
param1->damage = BattleSystem_CheckTypeChart(param0, param1, param1->moveCur, param1->moveType, param1->attacker, param1->defender, param1->damage, ¶m1->moveStatusFlags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -6071,13 +6071,13 @@ static BOOL ov16_02247570 (BattleSystem * param0, BattleContext * param1)
|
||||
v4 = param1->monSpeedOrder[v5];
|
||||
|
||||
if (v0 == 0) {
|
||||
if ((ov16_02255AB4(param1, param1->attacker, v4, v2) == 1) && (param1->battleMons[v4].curHP)) {
|
||||
if ((Battler_IgnorableAbility(param1, param1->attacker, v4, v2) == 1) && (param1->battleMons[v4].curHP)) {
|
||||
ov16_02248AF0(param1, v3);
|
||||
param1->abilityMon = v4;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if ((ov16_02255AB4(param1, param1->attacker, v4, v2) == 0) || (param1->battleMons[v4].curHP == 0)) {
|
||||
if ((Battler_IgnorableAbility(param1, param1->attacker, v4, v2) == 0) || (param1->battleMons[v4].curHP == 0)) {
|
||||
ov16_02248AF0(param1, v3);
|
||||
param1->abilityMon = v4;
|
||||
break;
|
||||
@@ -6089,12 +6089,12 @@ static BOOL ov16_02247570 (BattleSystem * param0, BattleContext * param1)
|
||||
v4 = ov16_0224A984(param0, param1, v1);
|
||||
|
||||
if (v0 == 0) {
|
||||
if ((ov16_02255AB4(param1, param1->attacker, v4, v2) == 1) && (param1->battleMons[v4].curHP)) {
|
||||
if ((Battler_IgnorableAbility(param1, param1->attacker, v4, v2) == 1) && (param1->battleMons[v4].curHP)) {
|
||||
ov16_02248AF0(param1, v3);
|
||||
param1->abilityMon = v4;
|
||||
}
|
||||
} else {
|
||||
if ((ov16_02255AB4(param1, param1->attacker, v4, v2) == 0) || (param1->battleMons[v4].curHP == 0)) {
|
||||
if ((Battler_IgnorableAbility(param1, param1->attacker, v4, v2) == 0) || (param1->battleMons[v4].curHP == 0)) {
|
||||
ov16_02248AF0(param1, v3);
|
||||
param1->abilityMon = v4;
|
||||
}
|
||||
@@ -6267,7 +6267,7 @@ static BOOL ov16_022478A4 (BattleSystem * param0, BattleContext * param1)
|
||||
v2 = ov16_02248AD0(param1);
|
||||
v0 = ov16_0224A984(param0, param1, v1);
|
||||
|
||||
if (ov16_022588A4(param1, v0) == 1) {
|
||||
if (Battler_MovedThisTurn(param1, v0) == 1) {
|
||||
ov16_02248AF0(param1, v2);
|
||||
}
|
||||
|
||||
@@ -6491,7 +6491,7 @@ static BOOL ov16_02247B28 (BattleSystem * param0, BattleContext * param1)
|
||||
v0 = ov16_02248AD0(param1);
|
||||
v1 = ov16_02248AD0(param1);
|
||||
|
||||
if ((param1->battleMons[param1->defender].heldItem) && (ov16_02255AB4(param1, param1->attacker, param1->defender, 60) == 1)) {
|
||||
if ((param1->battleMons[param1->defender].heldItem) && (Battler_IgnorableAbility(param1, param1->attacker, param1->defender, 60) == 1)) {
|
||||
ov16_02248AF0(param1, v0);
|
||||
} else if (((param1->battleMons[param1->defender].heldItem) && (param1->battleMons[param1->defender].moveEffectsData.custapBerry)) || (ov16_02258CB4(param0, param1, param1->defender) != 1)) {
|
||||
ov16_02248AF0(param1, v1);
|
||||
@@ -7202,7 +7202,7 @@ static BOOL ov16_02248660 (BattleSystem * param0, BattleContext * param1)
|
||||
v0 = ov16_02248AD0(param1);
|
||||
v1 = ov16_0224A984(param0, param1, v0);
|
||||
v2 = Battler_HeldItemEffect(param1, v1);
|
||||
v3 = ov16_02258ACC(param1, v1, 0);
|
||||
v3 = Battler_HeldItemPower(param1, v1, 0);
|
||||
|
||||
if ((v2 == 65) && ((BattleSystem_RandNext(param0) % 100) < v3)) {
|
||||
v4 = 1;
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
#include <nitro.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "constants/battle/moves.h"
|
||||
#include "constants/battle/side_effects.h"
|
||||
#include "constants/narc_files/battle_skill_subseq.h"
|
||||
|
||||
#include "struct_decls/struct_party_decl.h"
|
||||
#include "struct_decls/battle_system.h"
|
||||
#include "struct_decls/struct_02098700_decl.h"
|
||||
@@ -9,9 +13,10 @@
|
||||
#include "overlay016/const_ov16_0226EBE0.h"
|
||||
|
||||
#include "battle/battle_context.h"
|
||||
#include "battle/battle_mon.h"
|
||||
|
||||
#include "battle/battle_controller.h"
|
||||
#include "battle/battle_message.h"
|
||||
#include "battle/battle_mon.h"
|
||||
#include "battle/common.h"
|
||||
|
||||
#include "unk_020021B0.h"
|
||||
#include "narc.h"
|
||||
@@ -64,14 +69,14 @@ void ov16_02252A2C(BattleMon * param0, int param1, int param2);
|
||||
u8 BattleSystem_CompareBattlerSpeed(BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4);
|
||||
void ov16_022535E0(BattleContext * param0, int param1);
|
||||
void ov16_022535F0(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
BOOL ov16_0225366C(BattleSystem * param0, BattleContext * param1, int * param2);
|
||||
BOOL BattleSystem_CheckPrimaryEffect(BattleSystem * param0, BattleContext * param1, int * param2);
|
||||
BOOL ov16_02253710(BattleSystem * param0, BattleContext * param1, int * param2);
|
||||
int BattleSystem_Defender(BattleSystem * param0, BattleContext * param1, int param2, u16 param3, int param4, int param5);
|
||||
void BattleSystem_RedirectTarget(BattleSystem * param0, BattleContext * param1, int param2, u16 param3);
|
||||
BOOL ov16_02253E3C(BattleSystem * param0, BattleContext * param1);
|
||||
BOOL BattleMove_TriggerRedirectionAbilities(BattleSystem * param0, BattleContext * param1);
|
||||
void BattleMon_CopyToParty(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
void ov16_02253EF0(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
void ov16_02253F20(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
void BattleSystem_BreakMultiTurn(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
int ov16_02253F7C(BattleContext * param0, int param1);
|
||||
BOOL BattleSystem_CheckTrainerMessage(BattleSystem * param0, BattleContext * param1);
|
||||
void BattleContext_Init(BattleContext * param0);
|
||||
@@ -82,7 +87,7 @@ void BattleSystem_SetupNextTurn(BattleSystem * param0, BattleContext * param1);
|
||||
int BattleSystem_CheckStruggling(BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4);
|
||||
BOOL BattleSystem_CanUseMove(BattleSystem *battleSys, BattleContext *battleCtx, int battler, int moveSlot, BattleMessage *msgOut);
|
||||
int Battler_SlotForMove(BattleMon * param0, u16 param1);
|
||||
int ov16_02254FA8(BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4, int param5, int param6, u32 * param7);
|
||||
int BattleSystem_CheckTypeChart(BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4, int param5, int param6, u32 * param7);
|
||||
void ov16_022552D4(BattleContext * param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, u32 * param8);
|
||||
BOOL BattleContext_MoveFailed(BattleContext * param0, int param1);
|
||||
u8 ov16_022554E0(BattleSystem * param0, BattleContext * param1, int param2, int param3);
|
||||
@@ -93,12 +98,12 @@ BOOL BattleMove_IsMultiTurn(BattleContext * param0, int param1);
|
||||
BOOL ov16_0225588C(BattleSystem * param0, int param1, u8 * param2, u8 * param3, u8 * param4);
|
||||
int ov16_022558CC(u8 param0, u8 param1, u8 param2);
|
||||
BOOL ov16_02255918(u16 param0);
|
||||
BOOL ov16_02255950(BattleContext * param0, u16 param1, int param2);
|
||||
BOOL BattleSystem_IsGhostCurse(BattleContext * param0, u16 param1, int param2);
|
||||
BOOL ov16_02255980(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
BOOL ov16_022559DC(BattleContext * param0, int param1);
|
||||
BOOL ov16_022559FC(BattleSystem * param0, BattleContext * param1);
|
||||
u8 Battler_Ability(BattleContext * param0, int param1);
|
||||
BOOL ov16_02255AB4(BattleContext * param0, int param1, int param2, int param3);
|
||||
BOOL Battler_IgnorableAbility(BattleContext * param0, int param1, int param2, int param3);
|
||||
BOOL ov16_02255B10(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
BOOL BattleSystem_Trapped(BattleSystem * param0, BattleContext * param1, int param2, BattleMessage * param3);
|
||||
BOOL BattleSystem_TryEscape(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
@@ -111,7 +116,7 @@ BOOL BattleSystem_FailsInHighGravity(BattleSystem * param0, BattleContext * para
|
||||
BOOL BattleSystem_HealBlocked(BattleSystem * param0, BattleContext * param1, int param2, int param3);
|
||||
void BattleSystem_UpdateLastResort(BattleSystem * param0, BattleContext * param1);
|
||||
int ov16_02256128(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
int ov16_02256148(BattleContext * param0, int param1, int param2);
|
||||
int BattleSystem_CheckImmunityAbilities(BattleContext * param0, int param1, int param2);
|
||||
BOOL BattleSystem_TriggerTurnEndAbility(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
int BattleSystem_Divide(int param0, int param1);
|
||||
int BattleSystem_ShowMonChecks(BattleSystem * param0, BattleContext * param1);
|
||||
@@ -125,10 +130,10 @@ BOOL BattleSystem_TriggerLeftovers(BattleSystem * param0, BattleContext * param1
|
||||
BOOL BattleSystem_TriggerHeldItemOnStatus(BattleSystem * param0, BattleContext * param1, int param2, int * param3);
|
||||
BOOL BattleSystem_TriggerDetrimentalHeldItem(BattleSystem * param0, BattleContext * param1, int param2);
|
||||
u16 ov16_02258874(BattleContext * param0, int param1);
|
||||
BOOL ov16_022588A4(BattleContext * param0, int param1);
|
||||
BOOL Battler_MovedThisTurn(BattleContext * param0, int param1);
|
||||
BOOL ov16_022588BC(BattleSystem * param0, BattleContext * param1, int * param2);
|
||||
s32 Battler_HeldItemEffect(BattleContext * param0, int param1);
|
||||
s32 ov16_02258ACC(BattleContext * param0, int param1, int param2);
|
||||
s32 Battler_HeldItemPower(BattleContext * param0, int param1, int param2);
|
||||
s32 ov16_02258B18(BattleContext * param0, int param1);
|
||||
s32 ov16_02258B2C(BattleContext * param0, int param1);
|
||||
s32 ov16_02258B40(BattleContext * param0, int param1);
|
||||
@@ -166,7 +171,7 @@ BOOL BattleSystem_RecordingStopped(BattleSystem * param0, BattleContext * param1
|
||||
int ov16_0225B45C(BattleSystem * param0, BattleContext * param1, int param2, int param3);
|
||||
void ov16_0225B540(BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4);
|
||||
static BOOL ov16_02254EF4(BattleContext * param0, int param1, int param2, int param3);
|
||||
static int ov16_0225B5D0(BattleContext * param0, int param1, u32 param2);
|
||||
static int BattleContext_SideEffect(BattleContext * param0, int param1, u32 param2);
|
||||
static int ov16_0225B63C(BattleContext * param0, int param1, int param2, int param3, int param4, u32 * param5);
|
||||
static BOOL ov16_022553F8(BattleContext * param0, int param1, int param2);
|
||||
static void ov16_02255448(int param0, u32 * param1);
|
||||
@@ -1230,9 +1235,9 @@ u8 BattleSystem_CompareBattlerSpeed (BattleSystem * param0, BattleContext * para
|
||||
v19 = Battler_Ability(param1, param2);
|
||||
v20 = Battler_Ability(param1, param3);
|
||||
v5 = Battler_HeldItemEffect(param1, param2);
|
||||
v6 = ov16_02258ACC(param1, param2, 0);
|
||||
v6 = Battler_HeldItemPower(param1, param2, 0);
|
||||
v7 = Battler_HeldItemEffect(param1, param3);
|
||||
v8 = ov16_02258ACC(param1, param3, 0);
|
||||
v8 = Battler_HeldItemPower(param1, param3, 0);
|
||||
v21 = param1->battleMons[param2].statBoosts[0x3];
|
||||
v22 = param1->battleMons[param3].statBoosts[0x3];
|
||||
|
||||
@@ -1509,28 +1514,36 @@ void ov16_022535F0 (BattleSystem * param0, BattleContext * param1, int param2)
|
||||
}
|
||||
}
|
||||
|
||||
BOOL ov16_0225366C (BattleSystem * param0, BattleContext * param1, int * param2)
|
||||
BOOL BattleSystem_CheckPrimaryEffect (BattleSystem *battleSys, BattleContext * battleCtx, int * nextSeq)
|
||||
{
|
||||
BOOL v0 = 0;
|
||||
BOOL result = FALSE;
|
||||
|
||||
if (param1->sideEffectDirectFlags & 0x20000000) {
|
||||
param2[0] = ov16_0225B5D0(param1, 1, param1->sideEffectDirectFlags);
|
||||
param1->sideEffectDirectFlags = 0;
|
||||
if (battleCtx->sideEffectDirectFlags & MOVE_SIDE_EFFECT_ON_HIT) {
|
||||
*nextSeq = BattleContext_SideEffect(battleCtx, 1, battleCtx->sideEffectDirectFlags);
|
||||
battleCtx->sideEffectDirectFlags = 0;
|
||||
|
||||
if ((param1->moveStatusFlags & ((1 | 8 | 64 | 2048 | 4096 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 | 1048576) | 512 | 0x80000000)) == 0) {
|
||||
v0 = 1;
|
||||
if ((battleCtx->moveStatusFlags & MOVE_STATUS_NO_EFFECTS) == FALSE) {
|
||||
result = TRUE;
|
||||
}
|
||||
} else if (param1->sideEffectDirectFlags) {
|
||||
param2[0] = ov16_0225B5D0(param1, 1, param1->sideEffectDirectFlags);
|
||||
} else if (battleCtx->sideEffectDirectFlags) {
|
||||
*nextSeq = BattleContext_SideEffect(battleCtx, 1, battleCtx->sideEffectDirectFlags);
|
||||
|
||||
if ((param1->battleMons[param1->sideEffectMon].curHP) && (((param1->moveStatusFlags & ((1 | 8 | 64 | 2048 | 4096 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 | 1048576) | 512 | 0x80000000)) == 0) || ((param1->sideEffectDirectFlags & 0x800000) && (param1->moveStatusFlags & (0x8 | 0x40000))) || ((param1->sideEffectDirectFlags & 0x10000000) && (param1->moveStatusFlags & (0x1 | 0x10000))))) {
|
||||
v0 = 1;
|
||||
if (battleCtx->battleMons[battleCtx->sideEffectMon].curHP
|
||||
&& ((battleCtx->moveStatusFlags & MOVE_STATUS_NO_EFFECTS) == FALSE
|
||||
// Brick Break's effect still applies even if the target is immune.
|
||||
|| ((battleCtx->sideEffectDirectFlags & MOVE_SIDE_EFFECT_BREAK_SCREENS)
|
||||
&& (battleCtx->moveStatusFlags & MOVE_STATUS_DID_NOT_AFFECT))
|
||||
// Various other moves can still apply their effect even if the target
|
||||
// is semi-invulnerable.
|
||||
|| ((battleCtx->sideEffectDirectFlags & MOVE_SIDE_EFFECT_NO_DAMAGE_REQUIRED)
|
||||
&& (battleCtx->moveStatusFlags & MOVE_STATUS_GENERAL_MISS)))) {
|
||||
result = TRUE;
|
||||
}
|
||||
|
||||
param1->sideEffectDirectFlags = 0;
|
||||
battleCtx->sideEffectDirectFlags = 0;
|
||||
}
|
||||
|
||||
return v0;
|
||||
return result;
|
||||
}
|
||||
|
||||
BOOL ov16_02253710 (BattleSystem * param0, BattleContext * param1, int * param2)
|
||||
@@ -1539,28 +1552,28 @@ BOOL ov16_02253710 (BattleSystem * param0, BattleContext * param1, int * param2)
|
||||
u16 v1;
|
||||
|
||||
if (param1->sideEffectIndirectFlags & 0x20000000) {
|
||||
param2[0] = ov16_0225B5D0(param1, 2, param1->sideEffectIndirectFlags);
|
||||
param2[0] = BattleContext_SideEffect(param1, 2, param1->sideEffectIndirectFlags);
|
||||
param1->sideEffectIndirectFlags = 0;
|
||||
|
||||
if (((param1->moveStatusFlags & ((1 | 8 | 64 | 2048 | 4096 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 | 1048576) | 512 | 0x80000000)) == 0)) {
|
||||
v0 = 1;
|
||||
}
|
||||
} else if (param1->sideEffectIndirectFlags & 0x1000000) {
|
||||
param2[0] = ov16_0225B5D0(param1, 2, param1->sideEffectIndirectFlags);
|
||||
param2[0] = BattleContext_SideEffect(param1, 2, param1->sideEffectIndirectFlags);
|
||||
param1->sideEffectIndirectFlags = 0;
|
||||
|
||||
if ((ov16_02259AC0(param1, param1->sideEffectMon) == 0) && ((param1->moveStatusFlags & ((1 | 8 | 64 | 2048 | 4096 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 | 1048576) | 512 | 0x80000000)) == 0)) {
|
||||
v0 = 1;
|
||||
}
|
||||
} else if (param1->sideEffectIndirectFlags & 0x2000000) {
|
||||
param2[0] = ov16_0225B5D0(param1, 2, param1->sideEffectIndirectFlags);
|
||||
param2[0] = BattleContext_SideEffect(param1, 2, param1->sideEffectIndirectFlags);
|
||||
param1->sideEffectIndirectFlags = 0;
|
||||
|
||||
if ((param1->battleMons[param1->sideEffectMon].curHP) && (ov16_02259AC0(param1, param1->sideEffectMon) == 0) && ((param1->moveStatusFlags & ((1 | 8 | 64 | 2048 | 4096 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 | 1048576) | 512 | 0x80000000)) == 0)) {
|
||||
v0 = 1;
|
||||
}
|
||||
} else if (param1->sideEffectIndirectFlags & 0x10000000) {
|
||||
param2[0] = ov16_0225B5D0(param1, 2, param1->sideEffectIndirectFlags);
|
||||
param2[0] = BattleContext_SideEffect(param1, 2, param1->sideEffectIndirectFlags);
|
||||
param1->sideEffectIndirectFlags = 0;
|
||||
|
||||
if (param1->battleMons[param1->sideEffectMon].curHP) {
|
||||
@@ -1579,7 +1592,7 @@ BOOL ov16_02253710 (BattleSystem * param0, BattleContext * param1, int * param2)
|
||||
param1->battleStatusMask |= 0x400000;
|
||||
}
|
||||
|
||||
param2[0] = ov16_0225B5D0(param1, 2, param1->sideEffectIndirectFlags);
|
||||
param2[0] = BattleContext_SideEffect(param1, 2, param1->sideEffectIndirectFlags);
|
||||
param1->sideEffectIndirectFlags = 0;
|
||||
|
||||
if (param1->battleMons[param1->sideEffectMon].curHP == 0) {
|
||||
@@ -1597,7 +1610,7 @@ BOOL ov16_02253710 (BattleSystem * param0, BattleContext * param1, int * param2)
|
||||
GF_ASSERT(v1 != 0);
|
||||
|
||||
if ((BattleSystem_RandNext(param0) % 100) < v1) {
|
||||
param2[0] = ov16_0225B5D0(param1, 2, param1->sideEffectIndirectFlags);
|
||||
param2[0] = BattleContext_SideEffect(param1, 2, param1->sideEffectIndirectFlags);
|
||||
param1->sideEffectIndirectFlags = 0;
|
||||
|
||||
if ((param1->battleMons[param1->sideEffectMon].curHP) && (ov16_02259AC0(param1, param1->sideEffectMon) == 0) && ((param1->moveStatusFlags & ((1 | 8 | 64 | 2048 | 4096 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 | 1048576) | 512 | 0x80000000)) == 0)) {
|
||||
@@ -1605,7 +1618,7 @@ BOOL ov16_02253710 (BattleSystem * param0, BattleContext * param1, int * param2)
|
||||
}
|
||||
}
|
||||
} else if (param1->sideEffectAbilityFlags) {
|
||||
param2[0] = ov16_0225B5D0(param1, 3, param1->sideEffectAbilityFlags);
|
||||
param2[0] = BattleContext_SideEffect(param1, 3, param1->sideEffectAbilityFlags);
|
||||
param1->sideEffectAbilityFlags = 0;
|
||||
|
||||
if (param1->battleMons[param1->sideEffectMon].curHP) {
|
||||
@@ -1841,27 +1854,31 @@ void BattleSystem_RedirectTarget (BattleSystem * param0, BattleContext * param1,
|
||||
}
|
||||
}
|
||||
|
||||
BOOL ov16_02253E3C (BattleSystem * param0, BattleContext * param1)
|
||||
BOOL BattleMove_TriggerRedirectionAbilities(BattleSystem *battleSys, BattleContext *battleCtx)
|
||||
{
|
||||
BOOL v0 = 0;
|
||||
BOOL result = FALSE;
|
||||
|
||||
if (((param1->moveStatusFlags & ((1 | 8 | 64 | 2048 | 4096 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 | 1048576) | 512 | 0x80000000)) == 0) && (param1->selfTurnFlags[param1->defender].lightningRodActivated)) {
|
||||
param1->selfTurnFlags[param1->defender].lightningRodActivated = 0;
|
||||
BattleSystem_LoadScript(param1, 1, (0 + 180));
|
||||
param1->commandNext = param1->command;
|
||||
param1->command = 21;
|
||||
v0 = 1;
|
||||
if ((battleCtx->moveStatusFlags & MOVE_STATUS_NO_EFFECTS) == FALSE && DEFENDER_SELF_TURN_FLAGS.lightningRodActivated) {
|
||||
battleCtx->selfTurnFlags[battleCtx->defender].lightningRodActivated = 0;
|
||||
|
||||
LOAD_SUBSEQ(BATTLE_SUBSEQ_LIGHTNING_ROD_REDIRECTED);
|
||||
battleCtx->commandNext = battleCtx->command;
|
||||
battleCtx->command = BATTLE_CONTROL_EXEC_SCRIPT;
|
||||
|
||||
result = TRUE;
|
||||
}
|
||||
|
||||
if (((param1->moveStatusFlags & ((1 | 8 | 64 | 2048 | 4096 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 | 1048576) | 512 | 0x80000000)) == 0) && (param1->selfTurnFlags[param1->defender].stormDrainActivated)) {
|
||||
param1->selfTurnFlags[param1->defender].stormDrainActivated = 0;
|
||||
BattleSystem_LoadScript(param1, 1, (0 + 180));
|
||||
param1->commandNext = param1->command;
|
||||
param1->command = 21;
|
||||
v0 = 1;
|
||||
if ((battleCtx->moveStatusFlags & MOVE_STATUS_NO_EFFECTS) == FALSE && DEFENDER_SELF_TURN_FLAGS.stormDrainActivated) {
|
||||
battleCtx->selfTurnFlags[battleCtx->defender].stormDrainActivated = 0;
|
||||
|
||||
LOAD_SUBSEQ(BATTLE_SUBSEQ_LIGHTNING_ROD_REDIRECTED);
|
||||
battleCtx->commandNext = battleCtx->command;
|
||||
battleCtx->command = BATTLE_CONTROL_EXEC_SCRIPT;
|
||||
|
||||
result = TRUE;
|
||||
}
|
||||
|
||||
return v0;
|
||||
return result;
|
||||
}
|
||||
|
||||
void BattleMon_CopyToParty (BattleSystem * param0, BattleContext * param1, int param2)
|
||||
@@ -1879,7 +1896,7 @@ void ov16_02253EF0 (BattleSystem * param0, BattleContext * param1, int param2)
|
||||
param1->moveLockedInto[param2] = param1->moveCur;
|
||||
}
|
||||
|
||||
void ov16_02253F20 (BattleSystem * param0, BattleContext * param1, int param2)
|
||||
void BattleSystem_BreakMultiTurn (BattleSystem * param0, BattleContext * param1, int param2)
|
||||
{
|
||||
param1->battleMons[param2].statusVolatile &= (0x1000 ^ 0xffffffff);
|
||||
param1->battleMons[param2].statusVolatile &= (0x300 ^ 0xffffffff);
|
||||
@@ -2060,7 +2077,7 @@ void BattleContext_Init (BattleContext * param0)
|
||||
param0->afterMoveMessageState = 0;
|
||||
param0->afterMoveEffectState = 0;
|
||||
param0->beforeMoveCheckState = 0;
|
||||
param0->moveExecutionCheckState = 0;
|
||||
param0->tryMoveCheckState = 0;
|
||||
param0->statusCheckState = 0;
|
||||
param0->abilityCheckState = 0;
|
||||
param0->battleStatusMask &= ((1 | 2 | 4 | 8 | 16 | 32 | 256 | 512 | 1024 | 2048 | 0x80000 | 8192) | (4096 | 16384 | 32768 | 65536 | 0x20000 | 0x40000 | 0x100000 | 0x200000 | 0x400000 | 128 | 64)) ^ 0xffffffff;
|
||||
@@ -2295,7 +2312,7 @@ void BattleSystem_SetupNextTurn (BattleSystem * param0, BattleContext * param1)
|
||||
}
|
||||
|
||||
if ((param1->battleMons[v0].status & 0x7) && (param1->battleMons[v0].statusVolatile & 0x1000)) {
|
||||
ov16_02253F20(param0, param1, v0);
|
||||
BattleSystem_BreakMultiTurn(param0, param1, v0);
|
||||
}
|
||||
|
||||
if ((param1->battleMons[v0].status & 0x7) && (param1->battleMons[v0].statusVolatile & 0xc00)) {
|
||||
@@ -2583,7 +2600,7 @@ static BOOL ov16_02254EF4 (BattleContext * param0, int param1, int param2, int p
|
||||
return v0;
|
||||
}
|
||||
|
||||
int ov16_02254FA8 (BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4, int param5, int param6, u32 * param7)
|
||||
int BattleSystem_CheckTypeChart (BattleSystem * param0, BattleContext * param1, int param2, int param3, int param4, int param5, int param6, u32 * param7)
|
||||
{
|
||||
int v0;
|
||||
int v1;
|
||||
@@ -2601,9 +2618,9 @@ int ov16_02254FA8 (BattleSystem * param0, BattleContext * param1, int param2, in
|
||||
}
|
||||
|
||||
v4 = Battler_HeldItemEffect(param1, param4);
|
||||
v6 = ov16_02258ACC(param1, param4, 0);
|
||||
v6 = Battler_HeldItemPower(param1, param4, 0);
|
||||
v5 = Battler_HeldItemEffect(param1, param5);
|
||||
v7 = ov16_02258ACC(param1, param5, 0);
|
||||
v7 = Battler_HeldItemPower(param1, param5, 0);
|
||||
|
||||
if (Battler_Ability(param1, param4) == 96) {
|
||||
v2 = 0;
|
||||
@@ -2623,7 +2640,7 @@ int ov16_02254FA8 (BattleSystem * param0, BattleContext * param1, int param2, in
|
||||
}
|
||||
}
|
||||
|
||||
if ((ov16_02255AB4(param1, param4, param5, 26) == 1) && (v2 == 4) && (v5 != 106)) {
|
||||
if ((Battler_IgnorableAbility(param1, param4, param5, 26) == 1) && (v2 == 4) && (v5 != 106)) {
|
||||
param7[0] |= 0x800;
|
||||
} else if ((param1->battleMons[param5].moveEffectsData.magnetRiseTurns) && ((param1->battleMons[param5].moveEffectsMask & 0x400) == 0) && (v2 == 4) && (v5 != 106)) {
|
||||
param7[0] |= 0x100000;
|
||||
@@ -2666,12 +2683,12 @@ int ov16_02254FA8 (BattleSystem * param0, BattleContext * param1, int param2, in
|
||||
}
|
||||
}
|
||||
|
||||
if ((ov16_02255AB4(param1, param4, param5, 25) == 1) && (ov16_0225B6C8(param1, param2)) && (((param7[0] & 0x2) == 0) || ((param7[0] & (2 | 4)) == (2 | 4))) && (v3)) {
|
||||
if ((Battler_IgnorableAbility(param1, param4, param5, 25) == 1) && (ov16_0225B6C8(param1, param2)) && (((param7[0] & 0x2) == 0) || ((param7[0] & (2 | 4)) == (2 | 4))) && (v3)) {
|
||||
param7[0] |= 0x40000;
|
||||
} else {
|
||||
if (((param1->battleStatusMask & 0x800) == 0) && ((param1->battleStatusMask & 0x8000) == 0)) {
|
||||
if ((param7[0] & 0x2) && (v3)) {
|
||||
if ((ov16_02255AB4(param1, param4, param5, 111) == 1) || (ov16_02255AB4(param1, param4, param5, 116) == 1)) {
|
||||
if ((Battler_IgnorableAbility(param1, param4, param5, 111) == 1) || (Battler_IgnorableAbility(param1, param4, param5, 116) == 1)) {
|
||||
param6 = BattleSystem_Divide(param6 * 3, 4);
|
||||
}
|
||||
|
||||
@@ -3013,7 +3030,7 @@ BOOL ov16_02255918 (u16 param0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
BOOL ov16_02255950 (BattleContext * param0, u16 param1, int param2)
|
||||
BOOL BattleSystem_IsGhostCurse (BattleContext * param0, u16 param1, int param2)
|
||||
{
|
||||
return (param1 == 174) && ((ov16_02252060(param0, param2, 27, NULL) == 7) || (ov16_02252060(param0, param2, 28, NULL) == 7));
|
||||
}
|
||||
@@ -3074,7 +3091,7 @@ u8 Battler_Ability (BattleContext * param0, int param1)
|
||||
}
|
||||
}
|
||||
|
||||
BOOL ov16_02255AB4 (BattleContext * param0, int param1, int param2, int param3)
|
||||
BOOL Battler_IgnorableAbility (BattleContext * param0, int param1, int param2, int param3)
|
||||
{
|
||||
BOOL v0;
|
||||
|
||||
@@ -3475,7 +3492,7 @@ static u16 Unk_ov16_02270B8C[] = {
|
||||
0x1C0
|
||||
};
|
||||
|
||||
int ov16_02256148 (BattleContext * param0, int param1, int param2)
|
||||
int BattleSystem_CheckImmunityAbilities (BattleContext * param0, int param1, int param2)
|
||||
{
|
||||
int v0;
|
||||
int v1;
|
||||
@@ -3490,27 +3507,27 @@ int ov16_02256148 (BattleContext * param0, int param1, int param2)
|
||||
v1 = param0->aiContext.moveTable[param0->moveCur].type;
|
||||
}
|
||||
|
||||
if (ov16_02255AB4(param0, param1, param2, 10) == 1) {
|
||||
if (Battler_IgnorableAbility(param0, param1, param2, 10) == 1) {
|
||||
if ((v1 == 13) && (param1 != param2)) {
|
||||
param0->hpCalcTemp = BattleSystem_Divide(param0->battleMons[param2].maxHP, 4);
|
||||
v0 = (0 + 178);
|
||||
}
|
||||
}
|
||||
|
||||
if (ov16_02255AB4(param0, param1, param2, 11) == 1) {
|
||||
if (Battler_IgnorableAbility(param0, param1, param2, 11) == 1) {
|
||||
if ((v1 == 11) && ((param0->battleStatusMask & 0x20) == 0) && (param0->aiContext.moveTable[param0->moveCur].power)) {
|
||||
param0->hpCalcTemp = BattleSystem_Divide(param0->battleMons[param2].maxHP, 4);
|
||||
v0 = (0 + 178);
|
||||
}
|
||||
}
|
||||
|
||||
if (ov16_02255AB4(param0, param1, param2, 18) == 1) {
|
||||
if (Battler_IgnorableAbility(param0, param1, param2, 18) == 1) {
|
||||
if ((v1 == 10) && ((param0->battleMons[param2].status & 0x20) == 0) && ((param0->battleStatusMask & 0x20) == 0) && ((param0->aiContext.moveTable[param0->moveCur].power) || (param0->moveCur == 261))) {
|
||||
v0 = (0 + 179);
|
||||
}
|
||||
}
|
||||
|
||||
if (ov16_02255AB4(param0, param1, param2, 43) == 1) {
|
||||
if (Battler_IgnorableAbility(param0, param1, param2, 43) == 1) {
|
||||
{
|
||||
int v2;
|
||||
|
||||
@@ -3523,13 +3540,13 @@ int ov16_02256148 (BattleContext * param0, int param1, int param2)
|
||||
}
|
||||
}
|
||||
|
||||
if (ov16_02255AB4(param0, param1, param2, 78) == 1) {
|
||||
if (Battler_IgnorableAbility(param0, param1, param2, 78) == 1) {
|
||||
if ((v1 == 13) && (param1 != param2)) {
|
||||
v0 = (0 + 182);
|
||||
}
|
||||
}
|
||||
|
||||
if (ov16_02255AB4(param0, param1, param2, 87) == 1) {
|
||||
if (Battler_IgnorableAbility(param0, param1, param2, 87) == 1) {
|
||||
if ((v1 == 11) && ((param0->battleStatusMask & 0x20) == 0) && (param0->aiContext.moveTable[param0->moveCur].power)) {
|
||||
param0->hpCalcTemp = BattleSystem_Divide(param0->battleMons[param2].maxHP, 4);
|
||||
v0 = (0 + 178);
|
||||
@@ -3822,7 +3839,7 @@ int BattleSystem_ShowMonChecks (BattleSystem * param0, BattleContext * param1)
|
||||
|
||||
if (v13) {
|
||||
v14 = 0;
|
||||
param1->damage = ov16_02254FA8(param0, param1, v13, NULL, v11, v4, param1->damage, &v14);
|
||||
param1->damage = BattleSystem_CheckTypeChart(param0, param1, v13, NULL, v11, v4, param1->damage, &v14);
|
||||
|
||||
if (((v14 & 0x8) == 0) && (ov16_0225B8E4(param1, v13) == 0) && ((v14 & 0x2) || ((param1->aiContext.moveTable[v13].effect == 38) && (param1->battleMons[v4].level <= param1->battleMons[v11].level)))) {
|
||||
v3 = 1;
|
||||
@@ -4421,7 +4438,7 @@ BOOL BattleSystem_TriggerHeldItem (BattleSystem * param0, BattleContext * param1
|
||||
|
||||
v0 = 0;
|
||||
v2 = Battler_HeldItemEffect(param1, param2);
|
||||
v3 = ov16_02258ACC(param1, param2, 0);
|
||||
v3 = Battler_HeldItemPower(param1, param2, 0);
|
||||
|
||||
if (param1->battleMons[param2].curHP) {
|
||||
switch (v2) {
|
||||
@@ -4748,7 +4765,7 @@ BOOL BattleSystem_TriggerLeftovers (BattleSystem * param0, BattleContext * param
|
||||
|
||||
v0 = 0;
|
||||
v2 = Battler_HeldItemEffect(param1, param2);
|
||||
v3 = ov16_02258ACC(param1, param2, 0);
|
||||
v3 = Battler_HeldItemPower(param1, param2, 0);
|
||||
|
||||
if (param1->battleMons[param2].curHP) {
|
||||
switch (v2) {
|
||||
@@ -4797,7 +4814,7 @@ BOOL BattleSystem_TriggerHeldItemOnStatus (BattleSystem * param0, BattleContext
|
||||
|
||||
v0 = 0;
|
||||
v2 = Battler_HeldItemEffect(param1, param2);
|
||||
v3 = ov16_02258ACC(param1, param2, 0);
|
||||
v3 = Battler_HeldItemPower(param1, param2, 0);
|
||||
|
||||
if (param1->battleMons[param2].curHP) {
|
||||
switch (v2) {
|
||||
@@ -5120,7 +5137,7 @@ BOOL BattleSystem_TriggerDetrimentalHeldItem (BattleSystem * param0, BattleConte
|
||||
|
||||
v0 = 0;
|
||||
v3 = Battler_HeldItemEffect(param1, param2);
|
||||
v4 = ov16_02258ACC(param1, param2, 0);
|
||||
v4 = Battler_HeldItemPower(param1, param2, 0);
|
||||
|
||||
if (param1->battleMons[param2].curHP) {
|
||||
switch (v3) {
|
||||
@@ -5172,7 +5189,7 @@ u16 ov16_02258874 (BattleContext * param0, int param1)
|
||||
return param0->battleMons[param1].heldItem;
|
||||
}
|
||||
|
||||
BOOL ov16_022588A4 (BattleContext * param0, int param1)
|
||||
BOOL Battler_MovedThisTurn (BattleContext * param0, int param1)
|
||||
{
|
||||
return param0->battlerActions[param1][0] == 39;
|
||||
}
|
||||
@@ -5196,7 +5213,7 @@ BOOL ov16_022588BC (BattleSystem * param0, BattleContext * param1, int * param2)
|
||||
}
|
||||
|
||||
v2 = Battler_HeldItemEffect(param1, param1->defender);
|
||||
v3 = ov16_02258ACC(param1, param1->defender, 0);
|
||||
v3 = Battler_HeldItemPower(param1, param1->defender, 0);
|
||||
v4 = Battler_Side(param0, param1->attacker);
|
||||
|
||||
switch (v2) {
|
||||
@@ -5244,7 +5261,7 @@ s32 Battler_HeldItemEffect (BattleContext * param0, int param1)
|
||||
return ov16_0225B0FC(param0, v0, 1);
|
||||
}
|
||||
|
||||
s32 ov16_02258ACC (BattleContext * param0, int param1, int param2)
|
||||
s32 Battler_HeldItemPower (BattleContext * param0, int param1, int param2)
|
||||
{
|
||||
u16 v0;
|
||||
|
||||
@@ -5344,7 +5361,7 @@ BOOL ov16_02258CB4 (BattleSystem * param0, BattleContext * param1, int param2)
|
||||
v0 = 0;
|
||||
v1 = 0;
|
||||
v2 = ov16_02258B40(param1, param2);
|
||||
v3 = ov16_02258ACC(param1, param2, 1);
|
||||
v3 = Battler_HeldItemPower(param1, param2, 1);
|
||||
|
||||
if (ov16_02259AC0(param1, param1->defender) == 1) {
|
||||
return v0;
|
||||
@@ -5640,7 +5657,7 @@ BOOL ov16_02259204 (BattleSystem * param0, BattleContext * param1, int param2)
|
||||
int v2;
|
||||
|
||||
v1 = ov16_02258B58(param1, param2);
|
||||
v2 = ov16_02258ACC(param1, param2, 2);
|
||||
v2 = Battler_HeldItemPower(param1, param2, 2);
|
||||
|
||||
param1->movePower = ov16_02258B80(param1, param2);
|
||||
param1->flingScript = 0;
|
||||
@@ -6498,7 +6515,7 @@ int BattleSystem_CalcMoveDamage (BattleSystem * param0, BattleContext * param1,
|
||||
v14 = v14 * (100 + v17.unk_0C) / 100;
|
||||
}
|
||||
|
||||
if ((ov16_02255AB4(param1, param7, param8, 47) == 1) && ((v3 == 10) || (v3 == 15))) {
|
||||
if ((Battler_IgnorableAbility(param1, param7, param8, 47) == 1) && ((v3 == 10) || (v3 == 15))) {
|
||||
v14 /= 2;
|
||||
}
|
||||
|
||||
@@ -6510,7 +6527,7 @@ int BattleSystem_CalcMoveDamage (BattleSystem * param0, BattleContext * param1,
|
||||
v5 = v5 * 150 / 100;
|
||||
}
|
||||
|
||||
if ((ov16_02255AB4(param1, param7, param8, 63) == 1) && (v18.unk_10)) {
|
||||
if ((Battler_IgnorableAbility(param1, param7, param8, 63) == 1) && (v18.unk_10)) {
|
||||
v6 = v6 * 150 / 100;
|
||||
}
|
||||
|
||||
@@ -6546,11 +6563,11 @@ int BattleSystem_CalcMoveDamage (BattleSystem * param0, BattleContext * param1,
|
||||
v14 = v14 * 150 / 100;
|
||||
}
|
||||
|
||||
if ((v3 == 10) && (ov16_02255AB4(param1, param7, param8, 85) == 1)) {
|
||||
if ((v3 == 10) && (Battler_IgnorableAbility(param1, param7, param8, 85) == 1)) {
|
||||
v14 /= 2;
|
||||
}
|
||||
|
||||
if ((v3 == 10) && (ov16_02255AB4(param1, param7, param8, 87) == 1)) {
|
||||
if ((v3 == 10) && (Battler_IgnorableAbility(param1, param7, param8, 87) == 1)) {
|
||||
v14 = v14 * 125 / 100;
|
||||
}
|
||||
|
||||
@@ -6576,7 +6593,7 @@ int BattleSystem_CalcMoveDamage (BattleSystem * param0, BattleContext * param1,
|
||||
}
|
||||
}
|
||||
|
||||
if (ov16_02255AB4(param1, param7, param8, 86) == 1) {
|
||||
if (Battler_IgnorableAbility(param1, param7, param8, 86) == 1) {
|
||||
v10 *= 2;
|
||||
|
||||
if (v10 < -6) {
|
||||
@@ -6598,7 +6615,7 @@ int BattleSystem_CalcMoveDamage (BattleSystem * param0, BattleContext * param1,
|
||||
}
|
||||
}
|
||||
|
||||
if (ov16_02255AB4(param1, param7, param8, 109) == 1) {
|
||||
if (Battler_IgnorableAbility(param1, param7, param8, 109) == 1) {
|
||||
v9 = 0;
|
||||
v11 = 0;
|
||||
}
|
||||
@@ -6821,7 +6838,7 @@ int ov16_0225AEE4 (BattleSystem * param0, BattleContext * param1, int param2, in
|
||||
}
|
||||
|
||||
if (BattleSystem_RandNext(param0) % Unk_ov16_0226EBA0[v0] == 0) {
|
||||
if ((ov16_02255AB4(param1, param2, param3, 4) == 0) && (ov16_02255AB4(param1, param2, param3, 75) == 0) && ((param5 & 0x7000) == 0) && ((v5 & 0x8000) == 0)) {
|
||||
if ((Battler_IgnorableAbility(param1, param2, param3, 4) == 0) && (Battler_IgnorableAbility(param1, param2, param3, 75) == 0) && ((param5 & 0x7000) == 0) && ((v5 & 0x8000) == 0)) {
|
||||
v6 = 2;
|
||||
}
|
||||
}
|
||||
@@ -7055,9 +7072,9 @@ BOOL ov16_0225B228 (BattleSystem * param0, BattleContext * param1, int * param2)
|
||||
|
||||
v0 = 0;
|
||||
v2 = Battler_HeldItemEffect(param1, param1->attacker);
|
||||
v3 = ov16_02258ACC(param1, param1->attacker, 0);
|
||||
v3 = Battler_HeldItemPower(param1, param1->attacker, 0);
|
||||
v4 = Battler_HeldItemEffect(param1, param1->defender);
|
||||
v5 = ov16_02258ACC(param1, param1->defender, 0);
|
||||
v5 = Battler_HeldItemPower(param1, param1->defender, 0);
|
||||
v6 = Battler_Side(param0, param1->attacker);
|
||||
|
||||
if ((v2 == 88) && (param1->battleStatusMask & 0x2000) && (param1->selfTurnFlags[param1->attacker].shellBellDamageDealt) && (param1->attacker != param1->defender) && (param1->battleMons[param1->attacker].curHP < param1->battleMons[param1->attacker].maxHP) && (param1->battleMons[param1->attacker].curHP)) {
|
||||
@@ -7342,7 +7359,7 @@ static const int Unk_ov16_0226EE24[] = {
|
||||
0x76
|
||||
};
|
||||
|
||||
static int ov16_0225B5D0 (BattleContext * param0, int param1, u32 param2)
|
||||
static int BattleContext_SideEffect (BattleContext * param0, int param1, u32 param2)
|
||||
{
|
||||
param0->sideEffectType = param1;
|
||||
param0->sideEffectParam = param2 & 0x7fffff;
|
||||
@@ -7751,7 +7768,7 @@ int ov16_0225BA88 (BattleSystem * param0, int param1)
|
||||
if ((v8) && (v20->aiContext.moveTable[v8].power != 1)) {
|
||||
v11 = BattleSystem_CalcMoveDamage(param0, v20, v8, v20->sideConditionsMask[Battler_Side(param0, v2)], v20->fieldConditionsMask, 0, 0, param1, v2, 1);
|
||||
v16 = 0;
|
||||
v11 = ov16_02254FA8(param0, v20, v8, v9, param1, v2, v11, &v16);
|
||||
v11 = BattleSystem_CheckTypeChart(param0, v20, v8, v9, param1, v2, v11, &v16);
|
||||
|
||||
if (v16 & (0x8 | 0x800 | 0x100000 | 0x40000)) {
|
||||
v11 = 0;
|
||||
|
||||
Reference in New Issue
Block a user