From 0f628c8ff281351e37b1a8ccc2ec6d869b7f931b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 Apr 2020 19:41:07 +0200 Subject: [PATCH] Fairy Lock --- asm/macros/battle_script.inc | 5 +++++ data/battle_ai_scripts.s | 6 ++++++ data/battle_scripts_1.s | 13 +++++++++++++ include/battle.h | 1 + include/constants/battle.h | 1 + include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 3 ++- src/battle_main.c | 7 +++++-- src/battle_message.c | 2 ++ src/battle_script_commands.c | 13 +++++++++++++ src/battle_util.c | 8 ++++++++ src/data/battle_moves.h | 2 +- 13 files changed, 59 insertions(+), 4 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index c854e8320d..6a4680dd2e 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1714,6 +1714,11 @@ .4byte \ptr .endm + .macro trysetfairylock ptr:req + various BS_ATTACKER, VARIOUS_TRY_FAIRY_LOCK + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 17b426b8db..2c4cc6ad4d 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -262,6 +262,12 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 if_effect EFFECT_HEAL_BELL, AI_CBM_HealBell if_effect EFFECT_FOLLOW_ME, AI_CBM_FollowMe if_effect EFFECT_GEOMANCY, AI_CBM_QuiverDance + if_effect EFFECT_FAIRY_LOCK, AI_CBM_FairyLock + end + +AI_CBM_FairyLock: + if_field_status STATUS_FIELD_FAIRY_LOCK, Score_Minus10 + if_status2 AI_TARGET, STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED, Score_Minus10 end AI_CBM_Geomancy: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7820cef720..dd8a1b25e0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -361,6 +361,19 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectBurnUp .4byte BattleScript_EffectShoreUp .4byte BattleScript_EffectGeomancy + .4byte BattleScript_EffectFairyLock + +BattleScript_EffectFairyLock: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + trysetfairylock BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_NOONEWILLBEABLETORUNAWAY + waitmessage 0x40 + goto BattleScript_MoveEnd BattleScript_EffectBurnUp: attackcanceler diff --git a/include/battle.h b/include/battle.h index 8f75c124d4..d0d8f4d8fb 100644 --- a/include/battle.h +++ b/include/battle.h @@ -221,6 +221,7 @@ struct FieldTimer u8 psychicTerrainTimer; u8 echoVoiceCounter; u8 gravityTimer; + u8 fairyLockTimer; }; struct WishFutureKnock diff --git a/include/constants/battle.h b/include/constants/battle.h index 978105ad98..97e64a269e 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -224,6 +224,7 @@ #define STATUS_FIELD_ELECTRIC_TERRAIN 0x100 #define STATUS_FIELD_PSYCHIC_TERRAIN 0x200 #define STATUS_FIELD_ION_DELUGE 0x400 +#define STATUS_FIELD_FAIRY_LOCK 0x800 // Flags describing move's result #define MOVE_RESULT_MISSED (1 << 0) diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 425d83ac19..a82ee8b921 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -349,5 +349,6 @@ #define EFFECT_BURN_UP 343 #define EFFECT_SHORE_UP 344 #define EFFECT_GEOMANCY 345 +#define EFFECT_FAIRY_LOCK 346 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 17fd45809d..b17523c674 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -154,6 +154,7 @@ #define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 91 #define VARIOUS_TRY_FRISK 92 #define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 93 +#define VARIOUS_TRY_FAIRY_LOCK 94 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index ca2d22a9f5..ecda6c4df5 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -546,7 +546,8 @@ #define STRINGID_SCRIPTINGABILITYSTATRAISE 542 #define STRINGID_RECEIVERABILITYTAKEOVER 543 #define STRINGID_PKNMABSORBINGPOWER 544 +#define STRINGID_NOONEWILLBEABLETORUNAWAY 545 -#define BATTLESTRINGS_COUNT 545 +#define BATTLESTRINGS_COUNT 546 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_main.c b/src/battle_main.c index 723e33a7a6..f200a3b548 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3689,7 +3689,8 @@ u8 IsRunningFromBattleImpossible(void) } if ((gBattleMons[gActiveBattler].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) - || (gStatuses3[gActiveBattler] & STATUS3_ROOTED)) + || (gStatuses3[gActiveBattler] & STATUS3_ROOTED) + || gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) { gBattleCommunication[MULTISTRING_CHOOSER] = 0; return 1; @@ -3867,6 +3868,7 @@ static void HandleTurnActionSelectionState(void) *(gBattleStruct->field_58 + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION) || gBattleTypeFlags & BATTLE_TYPE_ARENA + || gFieldStatuses & STATUS_FIELD_FAIRY_LOCK || gStatuses3[gActiveBattler] & STATUS3_ROOTED) { BtlController_EmitChoosePokemon(0, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]); @@ -5549,7 +5551,8 @@ static void HandleAction_Run(void) } else { - if (gBattleMons[gBattlerAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + if (gBattleMons[gBattlerAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION) + || gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) { gBattleCommunication[MULTISTRING_CHOOSER] = 4; gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; diff --git a/src/battle_message.c b/src/battle_message.c index 0e1822035f..2b7ded50cc 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -667,9 +667,11 @@ static const u8 sText_AttackerLostFireType[] = _("{B_ATK_NAME_WITH_PREFIX} burne static const u8 sText_HealerCure[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILITY}\ncured {B_SCR_ACTIVE_NAME_WITH_PREFIX}'s problem!"); static const u8 sText_ReceiverAbilityTakeOver[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nwas taken over!"); static const u8 sText_PkmnAbsorbingPower[] = _("{B_ATK_NAME_WITH_PREFIX} is absorbing power!"); +static const u8 sText_NoOneWillBeAbleToRun[] = _("No one will be able to run away\nduring the next turn!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_NOONEWILLBEABLETORUNAWAY - 12] = sText_NoOneWillBeAbleToRun, [STRINGID_PKNMABSORBINGPOWER - 12] = sText_PkmnAbsorbingPower, [STRINGID_RECEIVERABILITYTAKEOVER - 12] = sText_ReceiverAbilityTakeOver, [STRINGID_SCRIPTINGABILITYSTATRAISE - 12] = sText_ScriptingAbilityRaisedStat, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f3ed16defa..d6148c14b4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5111,6 +5111,7 @@ static void Cmd_jumpifcantswitch(void) if (!(gBattlescriptCurrInstr[1] & SWITCH_IGNORE_ESCAPE_PREVENTION) && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + || (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) || (gStatuses3[gActiveBattler] & STATUS3_ROOTED))) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); @@ -6826,6 +6827,18 @@ static void Cmd_various(void) else gBattlescriptCurrInstr += 7; return; + case VARIOUS_TRY_FAIRY_LOCK: + if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gFieldStatuses |= STATUS_FIELD_FAIRY_LOCK; + gFieldTimers.fairyLockTimer = 2; + gBattlescriptCurrInstr += 7; + } + return; case VARIOUS_GET_STAT_VALUE: i = gBattlescriptCurrInstr[3]; gBattleMoveDamage = *(u16*)(&gBattleMons[gActiveBattler].attack) + (i - 1); diff --git a/src/battle_util.c b/src/battle_util.c index f79c767104..4c21e097e2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -934,6 +934,7 @@ enum ENDTURN_GRASSY_TERRAIN, ENDTURN_PSYCHIC_TERRAIN, ENDTURN_ION_DELUGE, + ENDTURN_FAIRY_LOCK, ENDTURN_FIELD_COUNT, }; @@ -1350,6 +1351,13 @@ u8 DoFieldEndTurnEffects(void) gFieldStatuses &= ~(STATUS_FIELD_ION_DELUGE); gBattleStruct->turnCountersTracker++; break; + case ENDTURN_FAIRY_LOCK: + if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK && --gFieldTimers.fairyLockTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_FAIRY_LOCK); + } + gBattleStruct->turnCountersTracker++; + break; case ENDTURN_FIELD_COUNT: effect++; break; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 345d2b0fba..2bfe9f3945 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8240,7 +8240,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_FAIRY_LOCK] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_FAIRY_LOCK, .power = 0, .type = TYPE_FAIRY, .accuracy = 0,