diff --git a/include/battle/battle_context.h b/include/battle/battle_context.h index 46dad3e603..79bf34270c 100644 --- a/include/battle/battle_context.h +++ b/include/battle/battle_context.h @@ -119,7 +119,7 @@ typedef struct BattleContext { int afterMoveEffectTemp; int beforeMoveCheckState; - int moveExecutionCheckState; + int tryMoveCheckState; int statusCheckState; int abilityCheckState; int switchInCheckState; diff --git a/include/battle/battle_controller.h b/include/battle/battle_controller.h index 1ab21113df..89f00e14a7 100644 --- a/include/battle/battle_controller.h +++ b/include/battle/battle_controller.h @@ -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, diff --git a/include/battle/common.h b/include/battle/common.h index c579f245e4..1277297b66 100644 --- a/include/battle/common.h +++ b/include/battle/common.h @@ -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 \ No newline at end of file diff --git a/include/constants/battle/moves.h b/include/constants/battle/moves.h index 2794b64001..b1b09a937f 100644 --- a/include/constants/battle/moves.h +++ b/include/constants/battle/moves.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) diff --git a/include/constants/battle/side_effects.h b/include/constants/battle/side_effects.h new file mode 100644 index 0000000000..ddea46db6c --- /dev/null +++ b/include/constants/battle/side_effects.h @@ -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 \ No newline at end of file diff --git a/include/constants/battle/system_control.h b/include/constants/battle/system_control.h index 13775b2e0a..0773651999 100644 --- a/include/constants/battle/system_control.h +++ b/include/constants/battle/system_control.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 \ No newline at end of file diff --git a/include/constants/items.h b/include/constants/items.h index 2c025aa77a..2d3e1bc77f 100644 --- a/include/constants/items.h +++ b/include/constants/items.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 diff --git a/include/constants/narc_files/battle_skill_subseq.h b/include/constants/narc_files/battle_skill_subseq.h index cfe276a66a..b7454a1f97 100644 --- a/include/constants/narc_files/battle_skill_subseq.h +++ b/include/constants/narc_files/battle_skill_subseq.h @@ -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, diff --git a/include/overlay016/ov16_0225177C.h b/include/overlay016/ov16_0225177C.h index 5d589de79b..5b195301c2 100644 --- a/include/overlay016/ov16_0225177C.h +++ b/include/overlay016/ov16_0225177C.h @@ -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); diff --git a/res/items/pl_item_data.csv b/res/items/pl_item_data.csv index 9b63d3b026..0565c89cb1 100644 --- a/res/items/pl_item_data.csv +++ b/res/items/pl_item_data.csv @@ -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 diff --git a/src/overlay014/ov14_0221FC20.c b/src/overlay014/ov14_0221FC20.c index c28f04b62d..be1dd4e213 100644 --- a/src/overlay014/ov14_0221FC20.c +++ b/src/overlay014/ov14_0221FC20.c @@ -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) { diff --git a/src/overlay016/battle_controller.c b/src/overlay016/battle_controller.c index 63a069c1d2..481716ee25 100644 --- a/src/overlay016/battle_controller.c +++ b/src/overlay016/battle_controller.c @@ -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; diff --git a/src/overlay016/ov16_022405FC.c b/src/overlay016/ov16_022405FC.c index 21c056bbca..fe087d8411 100644 --- a/src/overlay016/ov16_022405FC.c +++ b/src/overlay016/ov16_022405FC.c @@ -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; diff --git a/src/overlay016/ov16_0225177C.c b/src/overlay016/ov16_0225177C.c index 542265357b..d4ba27c0fe 100644 --- a/src/overlay016/ov16_0225177C.c +++ b/src/overlay016/ov16_0225177C.c @@ -1,6 +1,10 @@ #include #include +#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;