From 674d35861c73797017afd3549974506438a8c9b9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 11 Aug 2018 12:16:00 +0200 Subject: [PATCH] Couple bug fixes --- asm/macros/battle_ai_script.inc | 21 +++++++--- asm/macros/battle_script.inc | 5 +++ data/battle_ai_scripts.s | 4 +- data/battle_scripts_1.s | 21 ++++++---- data/battle_scripts_2.s | 1 + include/battle_util.h | 2 +- include/constants/battle_move_effects.h | 3 +- include/constants/battle_script_commands.h | 1 + include/data/battle_moves.h | 8 ++-- src/battle_ai_script_commands.c | 48 +++++++++++++++------- src/battle_main.c | 5 ++- src/battle_script_commands.c | 11 ++++- src/battle_util.c | 6 ++- 13 files changed, 95 insertions(+), 41 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index bc6e3e5a06..2e2b54c579 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -469,8 +469,8 @@ .macro if_move_flag flag jumpptr .byte 0x52 - .hword \flag - .word \jumpptr + .2byte \flag + .4byte \jumpptr .endm .macro if_field_status flag jumpptr @@ -479,16 +479,20 @@ .word \jumpptr .endm - .macro nullsub_54 + .macro get_move_accuracy .byte 0x54 .endm - .macro nullsub_55 + .macro call_if_eq value, ptr .byte 0x55 + .2byte \value + .4byte \ptr .endm - .macro nullsub_56 - .byte 0x56 + .macro call_if_move_flag flag ptr + .byte 0x52 + .2byte \flag + .4byte \ptr .endm .macro nullsub_57 @@ -621,3 +625,8 @@ .macro if_any_move_encored bank, ptr if_any_move_disabled_or_encored \bank, 1, \ptr .endm + + .macro call_if_always_hit ptr + get_move_accuracy + call_if_eq 0, \ptr + .endm diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 94f9bb4333..3ae02e6ac4 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1454,6 +1454,11 @@ .4byte \ptr .endm + .macro jumpifbattleend ptr + various BS_ATTACKER, VARIOUS_JUMP_IF_BATTLE_END + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 502a3028ad..d0e580459c 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -656,6 +656,8 @@ Score_Plus10: AI_TryToFaint: if_target_is_ally AI_Ret + call_if_always_hit AI_CV_AlwaysHit + call_if_move_flag FLAG_HIGH_CRIT, AI_CV_HighCrit if_effect EFFECT_HIT, AI_CV_Hit if_effect EFFECT_SLEEP, AI_CV_Sleep if_effect EFFECT_ABSORB, AI_CV_Absorb @@ -669,7 +671,6 @@ AI_TryToFaint: if_effect EFFECT_SPECIAL_DEFENSE_UP, AI_CV_SpDefUp if_effect EFFECT_ACCURACY_UP, AI_CV_AccuracyUp if_effect EFFECT_EVASION_UP, AI_CV_EvasionUp - if_effect EFFECT_ALWAYS_HIT, AI_CV_AlwaysHit if_effect EFFECT_ATTACK_DOWN, AI_CV_AttackDown if_effect EFFECT_DEFENSE_DOWN, AI_CV_DefenseDown if_effect EFFECT_SPEED_DOWN, AI_CV_SpeedDown @@ -779,7 +780,6 @@ AI_TryToFaint: end AI_CV_Hit: - if_move_flag FLAG_HIGH_CRIT AI_CV_HighCrit end AI_CV_Sleep: @ 82DCA92 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index df19350939..8caab496b9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -31,7 +31,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSpecialDefenseUp .4byte BattleScript_EffectAccuracyUp .4byte BattleScript_EffectEvasionUp - .4byte BattleScript_EffectAlwaysHit + .4byte BattleScript_EffectUnused17 .4byte BattleScript_EffectAttackDown .4byte BattleScript_EffectDefenseDown .4byte BattleScript_EffectSpeedDown @@ -291,6 +291,11 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectHurricane .4byte BattleScript_EffectTwoTypedMove .4byte BattleScript_EffectMeFirst + .4byte BattleScript_EffectSpeedUpHit + +BattleScript_EffectSpeedUpHit: + setmoveeffect MOVE_EFFECT_SPD_PLUS_1 | MOVE_EFFECT_AFFECTS_USER + goto BattleScript_EffectHit BattleScript_EffectMeFirst: attackcanceler @@ -794,7 +799,7 @@ BattleScript_EffectHitEscape: tryfaintmon BS_TARGET, FALSE, NULL setbyte sMOVEEND_STATE, 0x0 moveend 0x0, 0x0 - atk24 BattleScript_HitEscapeEnd + jumpifbattleend BattleScript_HitEscapeEnd jumpifbyte CMP_NOT_EQUAL gBattleOutcome 0 BattleScript_HitEscapeEnd jumpifcantswitch ATK4F_DONT_CHECK_STATUSES | BS_ATTACKER, BattleScript_HitEscapeEnd openpartyscreen 0x1, BattleScript_HitEscapeEnd @@ -817,7 +822,7 @@ BattleScript_EffectPlaceholder: printstring STRINGID_NOTDONEYET goto BattleScript_MoveEnd -BattleScript_EffectAlwaysHit: +BattleScript_EffectUnused17: BattleScript_EffectEvasionDownHit: BattleScript_EffectVitalThrow: BattleScript_EffectUnused60: @@ -1671,7 +1676,7 @@ BattleScript_EffectPoison:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectParalyze:: +BattleScript_EffectParalyze: attackcanceler attackstring ppreduce @@ -1684,6 +1689,7 @@ BattleScript_EffectParalyze:: jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE attackanimation waitanimation setmoveeffect MOVE_EFFECT_PARALYSIS @@ -1692,7 +1698,7 @@ BattleScript_EffectParalyze:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_AlreadyParalyzed:: +BattleScript_AlreadyParalyzed: various23 BS_ATTACKER pause 0x20 printstring STRINGID_PKMNISALREADYPARALYZED @@ -2219,11 +2225,12 @@ BattleScript_EffectSpikes:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectForesight:: +BattleScript_EffectForesight: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + jumpifstatus2 BS_TARGET, STATUS2_FORESIGHT, BattleScript_ButItFailed setforesight BattleScript_IdentifiedFoe: attackanimation diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 564fda2612..aeee5f1c77 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -128,6 +128,7 @@ BattleScript_OpponentUsesHealItem:: playse SE_KAIFUKU printstring STRINGID_TRAINER1USEDITEM waitmessage 0x40 + bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT useitemonopponent orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER diff --git a/include/battle_util.h b/include/battle_util.h index e25fbb5425..5ebc01f17f 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -60,7 +60,7 @@ u8 DoFieldEndTurnEffects(void); u8 DoBattlerEndTurnEffects(void); bool8 HandleWishPerishSongOnTurnEnd(void); bool8 HandleFaintedMonActions(void); -void TryClearRageStatuses(void); +void TryClearRageAndFuryCutter(void); u8 AtkCanceller_UnableToUseMove(void); bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2); u8 CastformDataTypeChange(u8 battlerId); diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 8bc7acad6b..488aca722c 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -18,7 +18,7 @@ #define EFFECT_SPECIAL_DEFENSE_UP 14 #define EFFECT_ACCURACY_UP 15 #define EFFECT_EVASION_UP 16 -#define EFFECT_ALWAYS_HIT 17 +#define EFFECT_UNUSED_17 17 #define EFFECT_ATTACK_DOWN 18 #define EFFECT_DEFENSE_DOWN 19 #define EFFECT_SPEED_DOWN 20 @@ -280,5 +280,6 @@ #define EFFECT_HURRICANE 274 #define EFFECT_TWO_TYPED_MOVE 275 #define EFFECT_ME_FIRST 276 +#define EFFECT_SPEED_UP_HIT 277 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index bfff72ea81..f360635d75 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -93,6 +93,7 @@ #define VARIOUS_INVERT_STAT_STAGES 44 #define VARIOUS_SET_TERRAIN 45 #define VARIOUS_TRY_ME_FIRST 46 +#define VARIOUS_JUMP_IF_BATTLE_END 47 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 3f826c00cc..f251d5fa99 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -1669,7 +1669,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, - .split = SPLIT_PHYSICAL, + .split = SPLIT_SPECIAL, }, { // MOVE_POISON_GAS .effect = EFFECT_POISON, @@ -2323,7 +2323,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .effect = EFFECT_FORESIGHT, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, @@ -3799,7 +3799,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .effect = EFFECT_FORESIGHT, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, @@ -5860,7 +5860,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_FLAME_CHARGE - .effect = EFFECT_SPEED_UP, + .effect = EFFECT_SPEED_UP_HIT, .power = 50, .type = TYPE_FIRE, .accuracy = 100, diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 41d740e802..53e5e4c23c 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -138,9 +138,9 @@ static void BattleAICmd_get_move_effect_from_result(void); static void BattleAICmd_get_protect_count(void); static void BattleAICmd_if_move_flag(void); static void BattleAICmd_if_field_status(void); -static void BattleAICmd_nullsub_54(void); -static void BattleAICmd_nullsub_55(void); -static void BattleAICmd_nullsub_56(void); +static void BattleAICmd_get_move_accuracy(void); +static void BattleAICmd_call_if_eq(void); +static void BattleAICmd_call_if_move_flag(void); static void BattleAICmd_nullsub_57(void); static void BattleAICmd_call(void); static void BattleAICmd_goto(void); @@ -247,9 +247,9 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_get_protect_count, // 0x51 BattleAICmd_if_move_flag, // 0x52 BattleAICmd_if_field_status, // 0x53 - BattleAICmd_nullsub_54, // 0x54 - BattleAICmd_nullsub_55, // 0x55 - BattleAICmd_nullsub_56, // 0x56 + BattleAICmd_get_move_accuracy, // 0x54 + BattleAICmd_call_if_eq, // 0x55 + BattleAICmd_call_if_move_flag, // 0x56 BattleAICmd_nullsub_57, // 0x57 BattleAICmd_call, // 0x58 BattleAICmd_goto, // 0x59 @@ -2255,12 +2255,7 @@ static void BattleAICmd_get_used_held_item(void) else battlerId = gBattlerTarget; - // This is likely a leftover from Ruby's code and its ugly ewram access. - #ifdef NONMATCHING - AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[battlerId]; - #else - AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + offsetof(struct BattleStruct, usedHeldItems) + (battlerId * 2)); - #endif // NONMATCHING + AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[battlerId]; gAIScriptPtr += 2; } @@ -2320,16 +2315,39 @@ static void BattleAICmd_if_field_status(void) gAIScriptPtr += 9; } -static void BattleAICmd_nullsub_54(void) +static void BattleAICmd_get_move_accuracy(void) { + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].accuracy; + + gAIScriptPtr++; } -static void BattleAICmd_nullsub_55(void) +static void BattleAICmd_call_if_eq(void) { + if (AI_THINKING_STRUCT->funcResult == T1_READ_16(gAIScriptPtr + 1)) + { + AIStackPushVar(gAIScriptPtr + 7); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + } + else + { + gAIScriptPtr += 7; + } } -static void BattleAICmd_nullsub_56(void) +static void BattleAICmd_call_if_move_flag(void) { + u16 flag = T1_READ_16(gAIScriptPtr + 1); + + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].flags & flag) + { + AIStackPushVar(gAIScriptPtr + 7); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + } + else + { + gAIScriptPtr += 7; + } } static void BattleAICmd_nullsub_57(void) diff --git a/src/battle_main.c b/src/battle_main.c index 837eebf9a6..153f618a30 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3008,6 +3008,9 @@ static void BattleStartClearSetData(void) gPalaceSelectionBattleScripts[i] = 0; } + gFieldStatuses = 0; + memset(&gFieldTimers, 0, sizeof(gFieldTimers)); + for (i = 0; i < 2; i++) { gSideStatuses[i] = 0; @@ -4960,7 +4963,7 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) } } - TryClearRageStatuses(); + TryClearRageAndFuryCutter(); gCurrentTurnActionNumber = 0; gCurrentActionFuncId = gActionsByTurnOrder[0]; gBattleStruct->dynamicMoveType = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1b0e7d327a..0499cf40d0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1138,7 +1138,8 @@ static bool32 AccuracyCalcHelper(u16 move) gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER; if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) - || (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW)) + || (gBattleMoves[move].effect == EFFECT_VITAL_THROW) + || (gBattleMoves[move].accuracy == 0)) { JumpIfMoveFailed(7, move); return TRUE; @@ -1154,7 +1155,7 @@ static void atk01_accuracycheck(void) if (move == ACC_CURR_MOVE) move = gCurrentMove; - if (move == NO_ACC_CALC_CHECK_LOCK_ON || gBattleMoves[move].accuracy == 0) + if (move == NO_ACC_CALC_CHECK_LOCK_ON) { if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) gBattlescriptCurrInstr += 7; @@ -6512,6 +6513,12 @@ static void atk76_various(void) } } return; + case VARIOUS_JUMP_IF_BATTLE_END: + if (IsBattleLostForPlayer() || IsBattleWonForPlayer()) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index 9a49d60a6d..f6cfaecf82 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1945,13 +1945,15 @@ bool8 HandleFaintedMonActions(void) return FALSE; } -void TryClearRageStatuses(void) +void TryClearRageAndFuryCutter(void) { s32 i; for (i = 0; i < gBattlersCount; i++) { if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMoveByBattler[i] != MOVE_RAGE) gBattleMons[i].status2 &= ~(STATUS2_RAGE); + if (gDisableStructs[i].furyCutterCounter != 0 && gChosenMoveByBattler[i] != MOVE_FURY_CUTTER) + gDisableStructs[i].furyCutterCounter = 0; } } @@ -5008,7 +5010,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b else atkStat = gBattleMons[battlerAtk].spAttack; - atkStage = gBattleMons[battlerAtk].statStages[STAT_ATK]; + atkStage = gBattleMons[battlerAtk].statStages[STAT_SPATK]; } // critical hits ignore attack stat's stage drops