Merge pull request #60 from lhearachel/battle-dev

Clean up the move-execution state machine
This commit is contained in:
Rachel
2023-09-19 19:16:10 -07:00
committed by GitHub
14 changed files with 505 additions and 385 deletions

View File

@@ -119,7 +119,7 @@ typedef struct BattleContext {
int afterMoveEffectTemp;
int beforeMoveCheckState;
int moveExecutionCheckState;
int tryMoveCheckState;
int statusCheckState;
int abilityCheckState;
int switchInCheckState;

View File

@@ -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,

View File

@@ -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

View File

@@ -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)

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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,

View File

@@ -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);

View File

@@ -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
1 item price holdEffect holdEffectParam pluckEffect flingEffect flingPower naturalGiftPower naturalGiftType prevent_toss selectable fieldPocket battlePocket fieldUseFunc battleUseFunc partyUse healSleep healPoison healBurn healFreeze healParalysis healConfusion healAttract guardSpec revive reviveAll levelUp evolve atkStages defStages spatkStages spdefStages speedStages accStages critStages ppUp ppMax ppRestore ppRestoreAll hpRestore giveHPEVs giveAtkEVs giveDefEVs giveSpeedEVs giveSpAtkEVs giveSpDefEVs giveFriendshipLow giveFriendshipMed giveFriendshipHigh hpEVs atkEVs defEVs speedEVs spatkEVs spdefEVs hpRestored ppRestored friendshipLow friendshipMed friendshipHigh
253 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
254 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
255 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
256 ITEM_ZOOM_LENS 200 HOLD_EFFECT_CRITRATE_UP_SLOWER 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
257 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
258 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
259 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

View File

@@ -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) {

View File

@@ -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, &param1->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;

View File

@@ -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, &param1->moveStatusFlags);
param1->damage = BattleSystem_CheckTypeChart(param0, param1, param1->moveCur, param1->moveType, param1->attacker, param1->defender, param1->damage, &param1->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;

View File

@@ -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;