From 51dc76c7e8772c53dadf9b54c27db27dfdcb534d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 22 Jul 2018 15:08:32 +0200 Subject: [PATCH] Captivate and new accuracy calc --- asm/macros/battle_script.inc | 5 ++ data/battle_scripts_1.s | 14 +++- include/battle_util.h | 1 + include/constants/battle_move_effects.h | 2 +- src/battle_script_commands.c | 90 +++++++++++++++++-------- 5 files changed, 80 insertions(+), 32 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 66d989b9d5..f3507ee79a 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1233,6 +1233,11 @@ .byte \stat .endm + .macro jumpifoppositegenders ptr + .byte 0xfc + .4byte \ptr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves bank various \bank, VARIOUS_CANCEL_MULTI_TURN_MOVES diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 46e4aec6ba..cea7b1d748 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -145,7 +145,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectPursuit .4byte BattleScript_EffectRapidSpin .4byte BattleScript_EffectSonicboom - .4byte BattleScript_EffectUnused83 + .4byte BattleScript_EffectCaptivate .4byte BattleScript_EffectMorningSun .4byte BattleScript_EffectSynthesis .4byte BattleScript_EffectMoonlight @@ -471,6 +471,16 @@ BattleScript_EffectRoost: tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET setroost goto BattleScript_PresentHealTarget + +BattleScript_EffectCaptivate: + setstatchanger STAT_SPATK, 2, TRUE + attackcanceler + jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce + jumpifoppositegenders BattleScript_CaptivateCheckAcc + goto BattleScript_ButItFailedAtkStringPpReduce +BattleScript_CaptivateCheckAcc: + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + goto BattleScript_StatDownFromAttackString BattleScript_EffectAlwaysHit: BattleScript_EffectPlaceholder43: @@ -481,7 +491,6 @@ BattleScript_EffectFalseSwipe: BattleScript_EffectPlaceholder103: BattleScript_EffectUnused6e: BattleScript_EffectPursuit: -BattleScript_EffectUnused83: BattleScript_EffectUnused8d: BattleScript_EffectUnusedA3: BattleScript_EffectPlaceholder200: @@ -836,6 +845,7 @@ BattleScript_EffectStatDown: attackcanceler jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE +BattleScript_StatDownFromAttackString: attackstring ppreduce statbuffchange 0x1, BattleScript_StatDownEnd diff --git a/include/battle_util.h b/include/battle_util.h index 28d5f65f5d..2086de722a 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -77,6 +77,7 @@ u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating); u32 GetBattlerHoldEffectParam(u8 battlerId); bool32 IsMoveMakingContact(u16 move, u8 battlerAtk); bool32 IsBattlerGrounded(u8 battlerId); +bool32 IsBattlerAlive(u8 battlerId); u8 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u16 move); u32 GetBattlerWeight(u8 battlerId); s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, bool32 isCrit, bool32 randomFactor); diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 4ee416b3cb..200ad6ff95 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -132,7 +132,7 @@ #define EFFECT_PURSUIT 128 #define EFFECT_RAPID_SPIN 129 #define EFFECT_SONICBOOM 130 -#define EFFECT_UNUSED_83 131 +#define EFFECT_CAPTIVATE 131 #define EFFECT_MORNING_SUN 132 #define EFFECT_SYNTHESIS 133 #define EFFECT_MOONLIGHT 134 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f28ec7a802..c972144251 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -343,6 +343,7 @@ static void atkF8_trainerslideout(void); static void atkF9_settelekinesis(void); static void atkFA_swapstatstages(void); static void atkFB_averagestats(void); +static void atkFC_jumpifoppositegenders(void); void (* const gBattleScriptingCommandsTable[])(void) = { @@ -598,6 +599,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkF9_settelekinesis, atkFA_swapstatstages, atkFB_averagestats, + atkFC_jumpifoppositegenders, }; struct StatFractions @@ -1063,6 +1065,11 @@ static bool8 AccuracyCalcHelper(u16 move) JumpIfMoveFailed(7, move); return TRUE; } + else if (gBattleMoves[move].effect == EFFECT_TOXIC && IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_POISON)) + { + JumpIfMoveFailed(7, move); + return TRUE; + } if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) { @@ -1116,9 +1123,9 @@ static void atk01_accuracycheck(void) } else { - u8 type, moveAcc, holdEffect, param; - s8 buff; - u16 calc; + u8 type, moveAcc, atkHoldEffect, atkParam, defHoldEffect, defParam, atkAbility, defAbility; + s8 buff, accStage, evasionStage; + u32 calc; if (move == 0) move = gCurrentMove; @@ -1130,16 +1137,22 @@ static void atk01_accuracycheck(void) if (AccuracyCalcHelper(move)) return; - if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT) - { - u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC]; - buff = acc; - } + atkAbility = GetBattlerAbility(gBattlerAttacker); + defAbility = GetBattlerAbility(gBattlerTarget); + + accStage = gBattleMons[gBattlerAttacker].statStages[STAT_ACC]; + evasionStage = gBattleMons[gBattlerTarget].statStages[STAT_EVASION]; + if (atkAbility == ABILITY_UNAWARE) + evasionStage = 6; + if (gBattleMoves[move].flags & FLAG_STAT_STAGES_IGNORED) + evasionStage = 6; + if (defAbility == ABILITY_UNAWARE) + accStage = 6; + + if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT || gStatuses3[gBattlerTarget] & STATUS3_MIRACLE_EYED) + buff = accStage; else - { - u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC]; - buff = acc + 6 - gBattleMons[gBattlerTarget].statStages[STAT_EVASION]; - } + buff = accStage + 6 - evasionStage; if (buff < 0) buff = 0; @@ -1154,29 +1167,37 @@ static void atk01_accuracycheck(void) calc = sAccuracyStageRatios[buff].dividend * moveAcc; calc /= sAccuracyStageRatios[buff].divisor; - if (gBattleMons[gBattlerAttacker].ability == ABILITY_COMPOUND_EYES) + if (atkAbility == ABILITY_COMPOUND_EYES) calc = (calc * 130) / 100; // 1.3 compound eyes boost - if (WEATHER_HAS_EFFECT && gBattleMons[gBattlerTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & WEATHER_SANDSTORM_ANY) - calc = (calc * 80) / 100; // 1.2 sand veil loss + else if (atkAbility == ABILITY_VICTORY_STAR) + calc = (calc * 110) / 100; // 1.1 victory star boost + if (IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)) && GetBattlerAbility(BATTLE_PARTNER(gBattlerAttacker)) == ABILITY_VICTORY_STAR) + calc = (calc * 110) / 100; // 1.1 ally's victory star boost - if (gBattleMons[gBattlerAttacker].ability == ABILITY_HUSTLE && IS_MOVE_PHYSICAL(move)) + if (defAbility == ABILITY_SAND_VEIL && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SANDSTORM_ANY) + calc = (calc * 80) / 100; // 1.2 sand veil loss + else if (defAbility == ABILITY_SNOW_CLOAK && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_HAIL_ANY) + calc = (calc * 80) / 100; // 1.2 snow cloak loss + else if (defAbility == ABILITY_TANGLED_FEET && gBattleMons[gBattlerTarget].status2 & STATUS2_CONFUSION) + calc = (calc * 50) / 100; // 1.5 tangled feet loss + + if (atkAbility == ABILITY_HUSTLE && IS_MOVE_PHYSICAL(move)) calc = (calc * 80) / 100; // 1.2 hustle loss - if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) - { - holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect; - param = gEnigmaBerries[gBattlerTarget].holdEffectParam; - } - else - { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); - param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); - } - + defHoldEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); + defParam = GetBattlerHoldEffectParam(gBattlerTarget); gPotentialItemEffectBattler = gBattlerTarget; - if (holdEffect == HOLD_EFFECT_EVASION_UP) - calc = (calc * (100 - param)) / 100; + atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + atkParam = GetBattlerHoldEffectParam(gBattlerAttacker); + + if (defHoldEffect == HOLD_EFFECT_EVASION_UP) + calc = (calc * (100 - defParam)) / 100; + + if (atkHoldEffect == HOLD_EFFECT_WIDE_LENS) + calc = (calc * (100 + atkParam)) / 100; + else if (atkHoldEffect == HOLD_EFFECT_ZOOM_LENS && GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)); + calc = (calc * (100 + atkParam)) / 100; // final calculation if ((Random() % 100 + 1) > calc) @@ -10276,3 +10297,14 @@ static void atkFB_averagestats(void) gBattlescriptCurrInstr += 2; } + +static void atkFC_jumpifoppositegenders(void) +{ + u32 atkGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerAttacker].species, gBattleMons[gBattlerAttacker].personality); + u32 defGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerTarget].species, gBattleMons[gBattlerTarget].personality); + + if ((atkGender == MON_MALE && defGender == MON_FEMALE) || (atkGender == MON_FEMALE && defGender == MON_MALE)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; +}