diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 7211ba1ad..16cca62e6 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2025,6 +2025,11 @@ .4byte \ptr .endm + .macro swapstats stat:req + various BS_ATTACKER, VARIOUS_SWAP_STATS + .byte \stat + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER, \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b9401117a..c3914c11d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2799,10 +2799,10 @@ BattleScript_EffectSpeedSwap: attackstring ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON - swapstatstages STAT_SPEED + swapstats STAT_SPEED attackanimation waitanimation - printstring STRINGID_PKMNSWITCHEDSTATCHANGES + printstring STRINGID_ATTACKERSWITCHEDSTATWITHTARGET waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 21f3eb57e..e12f957b4 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -246,11 +246,12 @@ #define VARIOUS_CAN_TELEPORT 155 #define VARIOUS_GET_BATTLER_SIDE 156 #define VARIOUS_CHECK_PARENTAL_BOND_COUNTER 157 -#define VARIOUS_JUMP_IF_ROD 158 -#define VARIOUS_JUMP_IF_ABSORB 159 -#define VARIOUS_JUMP_IF_MOTOR 160 -#define VARIOUS_TEATIME_INVUL 161 -#define VARIOUS_TEATIME_TARGETS 162 +#define VARIOUS_SWAP_STATS 158 +#define VARIOUS_JUMP_IF_ROD 159 +#define VARIOUS_JUMP_IF_ABSORB 160 +#define VARIOUS_JUMP_IF_MOTOR 161 +#define VARIOUS_TEATIME_INVUL 162 +#define VARIOUS_TEATIME_TARGETS 163 // Cmd_manipulatedamage diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index e1bcf983a..8dd94cca4 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -631,8 +631,9 @@ #define STRINGID_ATTACKERMELTEDTHEICE 629 #define STRINGID_TARGETTOUGHEDITOUT 630 #define STRINGID_ATTACKERLOSTELECTRICTYPE 631 +#define STRINGID_ATTACKERSWITCHEDSTATWITHTARGET 632 -#define BATTLESTRINGS_COUNT 632 +#define BATTLESTRINGS_COUNT 633 // This is the string id that gBattleStringsTable starts with. // String ids before this (e.g. STRINGID_INTROMSG) are not in the table, diff --git a/src/battle_message.c b/src/battle_message.c index 416b10613..031261a28 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -760,9 +760,11 @@ static const u8 sText_AttackerHealedItsBurn[] = _("{B_ATK_NAME_WITH_PREFIX} heal static const u8 sText_AttackerMeltedTheIce[] = _("{B_ATK_NAME_WITH_PREFIX} melted the ice with\nits fiery determination!"); static const u8 sText_TargetToughedItOut[] = _("{B_DEF_NAME_WITH_PREFIX} toughed it out\nto show you its best side!"); static const u8 sText_AttackerLostElectricType[] = _("{B_ATK_NAME_WITH_PREFIX} used up all\nof its electricity!"); +static const u8 sText_AttackerSwitchedStatWithTarget[] = _("{B_ATK_NAME_WITH_PREFIX} switched {B_BUFF1}\nwith its target!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_ATTACKERSWITCHEDSTATWITHTARGET - BATTLESTRINGS_TABLE_START] = sText_AttackerSwitchedStatWithTarget, [STRINGID_TARGETTOUGHEDITOUT - BATTLESTRINGS_TABLE_START] = sText_TargetToughedItOut, [STRINGID_ATTACKERMELTEDTHEICE - BATTLESTRINGS_TABLE_START] = sText_AttackerMeltedTheIce, [STRINGID_ATTACKERHEALEDITSBURN - BATTLESTRINGS_TABLE_START] = sText_AttackerHealedItsBurn, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b4b4eddd0..b8e162804 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10131,6 +10131,35 @@ static void Cmd_various(void) return; } break; + case VARIOUS_SWAP_STATS: + { + u8 statId = T1_READ_8(gBattlescriptCurrInstr + 3); + u16 temp; + + switch (statId) + { + case STAT_HP: + SWAP(gBattleMons[gBattlerAttacker].hp, gBattleMons[gBattlerTarget].hp, temp); + break; + case STAT_ATK: + SWAP(gBattleMons[gBattlerAttacker].attack, gBattleMons[gBattlerTarget].attack, temp); + break; + case STAT_DEF: + SWAP(gBattleMons[gBattlerAttacker].defense, gBattleMons[gBattlerTarget].defense, temp); + break; + case STAT_SPEED: + SWAP(gBattleMons[gBattlerAttacker].speed, gBattleMons[gBattlerTarget].speed, temp); + break; + case STAT_SPATK: + SWAP(gBattleMons[gBattlerAttacker].spAttack, gBattleMons[gBattlerTarget].spAttack, temp); + break; + case STAT_SPDEF: + SWAP(gBattleMons[gBattlerAttacker].spDefense, gBattleMons[gBattlerTarget].spDefense, temp); + break; + } + PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); + } + break; case VARIOUS_TEATIME_TARGETS: { u32 count = 0; diff --git a/src/wild_encounter.c b/src/wild_encounter.c index fe6af5a20..2c9730cd5 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -1104,7 +1104,7 @@ bool8 TryDoDoubleWildBattle(void) return TRUE; #endif #if B_DOUBLE_WILD_CHANCE != 0 - else if ((Random() % 100) + 1 < B_DOUBLE_WILD_CHANCE) + else if ((Random() % 100) + 1 <= B_DOUBLE_WILD_CHANCE) return TRUE; #endif return FALSE;