From 8af35a7e0d2ac19aad4bc206983f9d1091f613d9 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Thu, 29 Aug 2024 14:11:21 +0200 Subject: [PATCH 01/12] add Sirfetch'd alias for competitive format (#5283) --- include/constants/species.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/constants/species.h b/include/constants/species.h index 895e444d51..a0cce51398 100644 --- a/include/constants/species.h +++ b/include/constants/species.h @@ -1736,6 +1736,7 @@ #define SPECIES_SANDSHREW_ALOLA SPECIES_SANDSHREW_ALOLAN #define SPECIES_SANDSLASH_ALOLA SPECIES_SANDSLASH_ALOLAN #define SPECIES_SHELLOS_EAST SPECIES_SHELLOS_EAST_SEA +#define SPECIES_SIRFETCH_D SPECIES_SIRFETCHD #define SPECIES_SLIGGOO_HISUI SPECIES_SLIGGOO_HISUIAN #define SPECIES_SLOWBRO_GALAR SPECIES_SLOWBRO_GALARIAN #define SPECIES_SLOWKING_GALAR SPECIES_SLOWKING_GALARIAN From 8053f4ab1e3d53e6b5fa40458925fdf59407fc13 Mon Sep 17 00:00:00 2001 From: Cafei <46283144+Cafeei@users.noreply.github.com> Date: Thu, 29 Aug 2024 20:14:46 +0400 Subject: [PATCH 02/12] Enable female Indeedee follower and improve shiny Indeedees (#5285) Enable Indeedee female follower sprite. Shiny improvements. Fix front Indeedee male shading. --- graphics/pokemon/indeedee/back.png | Bin 599 -> 530 bytes graphics/pokemon/indeedee/female/back.png | Bin 549 -> 494 bytes .../pokemon/indeedee/female/overworld.png | Bin 561 -> 568 bytes .../indeedee/female/overworld_shiny.pal | 18 +++++++++--------- graphics/pokemon/indeedee/female/shiny.pal | 14 +++++++------- graphics/pokemon/indeedee/front.png | Bin 638 -> 592 bytes graphics/pokemon/indeedee/shiny.pal | 14 +++++++------- spritesheet_rules.mk | 3 +++ .../pokemon/species_info/gen_8_families.h | 8 ++++++++ 9 files changed, 34 insertions(+), 23 deletions(-) diff --git a/graphics/pokemon/indeedee/back.png b/graphics/pokemon/indeedee/back.png index 9fcfda9f9b9124e6603b5646f3f479af4b934077..8008cd6fb4d239ed37bcd7afdbcf0c83003b12da 100644 GIT binary patch delta 516 zcmV+f0{i{f1d;@h7=H)@0001;w}I>c0004VQb$4nuFf3k0000mP)t-sn9!ggFhG%i z#}E(@R7rYZkf6c7wEq6?Kwx-;Rd{JMTPU#LVPRD;Ku`bx00000Nk~5b0004yNklU_qApbD*CGPz|SQD1sBk0G0vWfKaBb1gV)TJj?=9 z;JO{2&tc1o=O36E+BrkFk$+iT#bbEZ?Yg*iC;KAPj+c<|&r0YgaKYqj2xJomgP73L z95L<;f#8Wq3V)n9?EM0e1a1qk=ZRW)SAaB$?6D#U?Vn{VVK`}80YNbA^I{hk1&jt< z2o?oM1IX94Zsb}(*pxZ&$Oc_d4HG^!!QhKv(!*@91pHb9 zPWgB%gDLQcD?BMof&R~SSOR)kKuZ0eAutUV9}dHd0)4|^^Sa>~KA$FNv&VB0aJ9Kv zq8;JEa1FUP@MyRP!4^N%@UzQ{688DNgun0y`at?5SbWy$JWwEsSb(%`2uNV#=YeN| zb&rgEJdIa6f6-uGWs+w>`9ATngdIcXn_T>Q?5*OP|CL`DjV0i)WJetU00004kPr|MP)KNCkf6x0!1(z1Kwx-~U|4W4FetF#fM|d)Ku`bx z00000j!%i~00009a7bBm000id000id0mpBsWB>pGut`KgRDVdv-IGmD!!QtqUHJkr zL?~MV2T0X`ykJo$z5uF%y00)Cf(0l_vGYE^d3GH1r)oh6 z$(V5ytFv$yBmjCFyA1&NngjR3~bj=&6CKp222a&5e9bw_>6V2D11KtyWvv@%%;7jXIDFcLVj~gI# zBOU=DNkbhM;(0Fw%~Aj@#8y5CdY>}rc0004VQb$4nuFf3k0000mP)t-sn9!ggFhG%i z$5csrV342?5D?gK;K9DM{{HTSRd_&Pcxg0SVPRD;Ku`bx00000F7(lL0004ONklR5Y#$wSAfcQ$^e1jdL`2hVfkkOZdw>L&;Y!`0%iYa1@!VC z8|VO57|meV0)K{iA^H)hTOc=333d^u0CS+J2MqGEK@s*S9gp!4*a%37c^>9w5P`De zx&@?Zxqxz-^Q93W7GOUhq+T2uDC88Ngf9X0^3njs-y`8%cc8NbVTYqV1)NRfvzT^~ zMuORRb(Yhduv`l!5B)404dI+$yj5454>#3sM13WE-&r2I_BTQwzGuC{qp95ykHX#n zu6)zO)0?ka@aJs{-{cM8S^u2ZQ-HVyhy^yM0I|D(%_oGjTmj+|ntT+*zYcf(Q@sHE WZz-iK+o(nW00004kWffyV342?5D?gK;K;DR`1tscU|2w4cyKTpGen~_@RDVdv?UF%i!!QssO15 z$8}K@L4xx=eK$L(LPS#(IT0HGDE*WKKoMMN04>j>QHOl2l@0`~Q#vjntBqO^+G3Zk z?w6yf<5UW=$bT0N=#$>o5gXG*k=_|d98DQ<0z=Fetv0}$EC9Rx{6r`-AE?p=Akhcl z)dG5Ud;wr<0cinxLkNIlu*XHl3@lqf9K;jAWt351x^L14?6kKt(64|)vz(Or)oY;M zb_%KT+aNt4)u)iVgfaqDM{D3Yj0S)xfGI5z0c{wdEq{6lkc9<=Ojh+lZ@L|&0=CB_ z^8pni-55A))(QHm`B^$kvU`ic-0a-aOGS1#aMH~n>D)?o1h@o{F##}JS;2glK z+E{~K&bO7pd5i0u_iWPVTPM`lDCf&FR1F|wbI)JOmt&Z;16Dhjc#_`c9$sT^%Ae%2 pvUmqu%@2iK%^dIZ10DXEegLv49BRT7OZ5N%002ovPDHLkV1oS0S7!hK delta 180 zcmV;l089V41hE8=F##%(GA;00FhJZZ83UY03x~R8Hk}&TFzt+rv9=9z)45 zn5}%lO1|8*B&0{#eoyJ_K{hz=X)2%eJ>2J1+Tw)u{As%=qVl400WdfR@TxY}V3+f4 zWpLi&I_Eu`^!e5a^)<@*@(fi2$k^QTm-6KpChdUL4kn(Yx4DPcn49t^xvVVS!B+D_ iAy@Mo`}{zMf2JS8lN@d0f>4D30000c0004VQb$4nuFf3kkv=|u0nSN8K~z|U?UiA3 z!ypKTLojGs^Z)@13Jf>flzspw`_b>feBM4I@ ze*Rw5Fo9kHK>}7&I-Ov79Ab#zi?JP@r>HT;0p>yrKds-Be-j>h?7FD|@tBMNT<(Z< zoIvk-5CVWDz3WeZg!AS8VC-4&0&r|fBLG}rN+elKD%l2@QX9$yww2k1(EErk31_qFi|O?UC7h0}D?^B=;9t}O-M{yA zsJ9aBDRzKojwo&ufM<)J;fnq`;FWNM^N5cpeH;M7aeT`s^hQ8yfmr7BN)S2dz)L>~ zu(o>GOMe02VGd00GxYL_t(Y$L*7`PQx$|hFyh`A*m?MTGIze zWoQ|~P{<2Z=xEleBI!^DRFMOz3#tIW0TMg`&%lI`=#qtvrSHNep%PMk-jVpF*ir7w ze`otF{+eo@SB)+cugkq+lCotc>arbFv+Of}1{FXSZIea4bu8CF%QF~Aa&{|{lDI}d z?iCBEQ(U$TB^I9>0A7hQ0L6(Y-ZpcTzC|1cW?*Y=08p^iihs+YZTJCpC?0JB{hfY# z4v=Orh@!}_5&KaeGdM#UI$m_L2{=&$5r&9Y(1|uPkksxj0hyP@fl|Vx#$ywP&6jI` z9SE};PtWJCPZr?d1~a^QOj)3dc)3JG7I0E*j%b++!AYg`KaK+y5aCCXzgyzMNk|Nk z=QPy1Niy=xz!FEU@I#!xX*02nR|D7YAzmMX@oIhK2!jHcEPOC5bURrh!0iKVQx0%y zs6V7*UUcp;Cnpmi9Hms?YwRtFWVeEUfH8GU%mFp6v)&wI#T#g?!kOZZlMG0ULwamL z30Z-=m;=fhv<6^Xss!#VK&=8|w&$F$GKJ=w@@Q37!8e_=8u@y{8<0ivd7s$;C%I_i z*a{>)oLPYGl#bhWF~TVwxAo?za6YpE1!9l?%P1kf0c^UXJ-g!ZE&u=k07*p#PDHLk FV1n?P@@xPA diff --git a/graphics/pokemon/indeedee/shiny.pal b/graphics/pokemon/indeedee/shiny.pal index 6bb5eca576..2b0aa6197b 100644 --- a/graphics/pokemon/indeedee/shiny.pal +++ b/graphics/pokemon/indeedee/shiny.pal @@ -3,17 +3,17 @@ JASC-PAL 16 152 208 160 32 48 64 -120 112 144 +145 127 199 16 16 16 -80 72 104 +84 73 122 96 144 160 -200 176 192 -248 248 248 +193 190 180 +254 254 238 64 96 120 -144 96 88 -112 48 48 +132 85 120 +105 52 91 40 176 224 -128 104 128 +97 97 85 48 64 80 0 0 0 0 0 0 diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index 649995a5cb..3dfea83037 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -3474,6 +3474,9 @@ $(POKEMONGFXDIR)/eiscue/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/indeedee/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/indeedee/female/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/morpeko/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index bb878e1fed..ed5e89407c 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -5280,6 +5280,14 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .iconSprite = gMonIcon_IndeedeeFemale, .iconPalIndex = 2, FOOTPRINT(Indeedee) + OVERWORLD( + sPicTable_IndeedeeFemale, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_IndeedeeFemale, + gShinyOverworldPalette_IndeedeeFemale + ) .levelUpLearnset = sIndeedeeFemaleLevelUpLearnset, .teachableLearnset = sIndeedeeFemaleTeachableLearnset, .eggMoveLearnset = sIndeedeeFemaleEggMoveLearnset, From addaf40971e9891f5d5036c2d75dceb7d4f029b3 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 31 Aug 2024 01:36:14 +0200 Subject: [PATCH 03/12] Fixes Scale Shot not activating + Known Failing Round test (#5292) * Fixes Scale Shot not activating + Known Failing Round test * Update test/battle/move_effect/multi_hit.c --- src/battle_script_commands.c | 9 +++--- test/battle/move_effect/multi_hit.c | 48 +++++++++++++++++++++++++++++ test/battle/move_effect/round.c | 1 - 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9e1af78714..3724208374 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6016,15 +6016,18 @@ static void Cmd_moveend(void) && gMultiHitCounter && !(gMovesInfo[gCurrentMove].effect == EFFECT_PRESENT && gBattleStruct->presentBasePower == 0)) // Silly edge case { + gMultiHitCounter--; + if (!IsBattlerAlive(gBattlerTarget) && gMovesInfo[gCurrentMove].effect != EFFECT_DRAGON_DARTS) + gMultiHitCounter = 0; + gBattleScripting.multihitString[4]++; - if (--gMultiHitCounter == 0) + if (gMultiHitCounter == 0) { if (gMovesInfo[gCurrentMove].argument == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty()) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_DefDownSpeedUp; } - BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; effect = TRUE; @@ -16124,7 +16127,6 @@ static void TryUpdateRoundTurnOrder(void) for (i = 0; roundUsers[i] != 0xFF && i < 3; i++) { gBattlerByTurnOrder[currRounder] = roundUsers[i]; - gActionsByTurnOrder[currRounder] = gActionsByTurnOrder[roundUsers[i]]; gProtectStructs[roundUsers[i]].quash = TRUE; // Make it so their turn order can't be changed again currRounder++; } @@ -16133,7 +16135,6 @@ static void TryUpdateRoundTurnOrder(void) for (i = 0; nonRoundUsers[i] != 0xFF && i < 3; i++) { gBattlerByTurnOrder[currRounder] = nonRoundUsers[i]; - gActionsByTurnOrder[currRounder] = gActionsByTurnOrder[nonRoundUsers[i]]; currRounder++; } } diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c index af3a9bc0f4..df9cfea807 100644 --- a/test/battle/move_effect/multi_hit.c +++ b/test/battle/move_effect/multi_hit.c @@ -183,3 +183,51 @@ SINGLE_BATTLE_TEST("Endure does not prevent multiple hits and stat changes occur MESSAGE("Wobbuffet's Speed rose!"); } } + +SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after the 4th hit of Loaded Dice") +{ + PASSES_RANDOMLY(50, 100, RNG_LOADED_DICE); + GIVEN { + ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LOADED_DICE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCALE_SHOT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + MESSAGE("Hit 4 time(s)!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Defense fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Speed rose!"); + } +} + +SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after killing opposing with less then 4 hits") +{ + u32 item; + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_LOADED_DICE; } + + GIVEN { + ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); + PLAYER(SPECIES_BAGON) { Item(item); } + OPPONENT(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCALE_SHOT); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + MESSAGE("Foe Slugma fainted!"); + MESSAGE("Hit 3 time(s)!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Bagon's Defense fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Bagon's Speed rose!"); + } +} diff --git a/test/battle/move_effect/round.c b/test/battle/move_effect/round.c index c911c96b63..09209c79a2 100644 --- a/test/battle/move_effect/round.c +++ b/test/battle/move_effect/round.c @@ -74,7 +74,6 @@ DOUBLE_BATTLE_TEST("Round still preserves the turn order outside of the other Ro } DOUBLE_BATTLE_TEST("Round still preserves the turn order outside of the other Round users moving immediately with switch") { - KNOWN_FAILING; // #5148 GIVEN { PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); From ac9b40a423fc9faf26e79336a06542cd3f01c917 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sat, 31 Aug 2024 11:39:37 +0100 Subject: [PATCH 04/12] Fixes Max Moves ignoring absorbing abilities, G-Max Corviknight and Centiskorch names (#5296) * Fix Max and G-Max Moves bypassing absorbing abilities * Fix G-Max Corviknight and Centiskorch speciesName * Remove some outdated comments * Missing Dynamax check * Add Max Quake and Max Overgrowth to test --- src/battle_dynamax.c | 1 - src/battle_script_commands.c | 2 + src/data/moves_info.h | 10 ++--- .../pokemon/species_info/gen_8_families.h | 4 +- test/battle/gimmick/dynamax.c | 37 +++++++++++++++++++ 5 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index cdcf05f7db..073e2c55bc 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -406,7 +406,6 @@ static u8 GetMaxPowerTier(u32 move) case EFFECT_NATURAL_GIFT: case EFFECT_MIRROR_COAT: case EFFECT_FINAL_GAMBIT: - //case EFFECT_DRAGON_DARTS: return MAX_POWER_TIER_2; case EFFECT_OHKO: case EFFECT_RETURN: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3724208374..8da71c45fb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1729,6 +1729,8 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u gBattlescriptCurrInstr = failInstr; else if (!JumpIfMoveAffectedByProtect(gCurrentMove)) gBattlescriptCurrInstr = nextInstr; + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) + AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBattlerTarget, 0, 0, gCurrentMove); } else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT || (gSpecialStatuses[gBattlerAttacker].multiHitOn diff --git a/src/data/moves_info.h b/src/data/moves_info.h index cef7b6971a..6e0230cf31 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -21719,7 +21719,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_FIXED_POWER, //EFFECT TODO + .argument = MAX_EFFECT_FIXED_POWER, .ignoresTargetAbility = TRUE, .battleAnimScript = Move_G_MAX_DRUM_SOLO, }, @@ -21736,7 +21736,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_FIXED_POWER, //EFFECT TODO + .argument = MAX_EFFECT_FIXED_POWER, .ignoresTargetAbility = TRUE, .battleAnimScript = Move_G_MAX_FIREBALL, }, @@ -21753,7 +21753,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_FIXED_POWER, //EFFECT TODO + .argument = MAX_EFFECT_FIXED_POWER, .ignoresTargetAbility = TRUE, .battleAnimScript = Move_G_MAX_HYDROSNIPE, }, @@ -21995,7 +21995,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_BYPASS_PROTECT, //EFFECT TODO + .argument = MAX_EFFECT_BYPASS_PROTECT, .battleAnimScript = Move_G_MAX_ONE_BLOW, }, @@ -22011,7 +22011,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_BYPASS_PROTECT, //EFFECT TODO + .argument = MAX_EFFECT_BYPASS_PROTECT, .battleAnimScript = Move_G_MAX_RAPID_FLOW, }, diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index ed5e89407c..fd52785a54 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -1063,7 +1063,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING), .abilities = { ABILITY_PRESSURE, ABILITY_UNNERVE, ABILITY_MIRROR_ARMOR }, .bodyColor = BODY_COLOR_PURPLE, - .speciesName = _("Corviknigh"), + .speciesName = HANDLE_EXPANDED_SPECIES_NAME("Corviknigh", "Corviknight"), .cryId = CRY_CORVIKNIGHT, .natDexNum = NATIONAL_DEX_CORVIKNIGHT, .categoryName = _("Raven"), @@ -3605,7 +3605,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_BUG), .abilities = { ABILITY_FLASH_FIRE, ABILITY_WHITE_SMOKE, ABILITY_FLAME_BODY }, .bodyColor = BODY_COLOR_RED, - .speciesName = _("Centiskorc"), + .speciesName = HANDLE_EXPANDED_SPECIES_NAME("Centiskorc", "Centiskorch"), .cryId = CRY_CENTISKORCH, .natDexNum = NATIONAL_DEX_CENTISKORCH, .categoryName = _("Radiator"), diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index b865ef2f1c..d0360918c8 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -1476,3 +1476,40 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Moxie clones can be triggered by Max Moves faintin MESSAGE("Gyarados's Moxie raised its Attack!"); } } + +SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass absorbing abilities") +{ + u32 move, ability, species; + PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_VOLT_ABSORB; species = SPECIES_LANTURN; } + PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_WATER_ABSORB; species = SPECIES_LANTURN; } + PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_FLASH_FIRE; species = SPECIES_HEATRAN; } + PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_PIKACHU; } + PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_STORM_DRAIN; species = SPECIES_GASTRODON; } + PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_WELL_BAKED_BODY; species = SPECIES_DACHSBUN; } + PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_MOTOR_DRIVE; species = SPECIES_ELECTIVIRE; } + PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_DRY_SKIN; species = SPECIES_PARASECT; } + PARAMETRIZE { move = MOVE_MUD_BOMB; ability = ABILITY_EARTH_EATER; species = SPECIES_ORTHWORM; } + PARAMETRIZE { move = MOVE_VINE_WHIP; ability = ABILITY_SAP_SIPPER; species = SPECIES_MILTANK; } + + GIVEN { + ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(gMovesInfo[MOVE_SPARK].type == TYPE_ELECTRIC); + ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(gMovesInfo[MOVE_MUD_BOMB].type == TYPE_GROUND); + ASSUME(gMovesInfo[MOVE_VINE_WHIP].type == TYPE_GRASS); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, move, gimmick: GIMMICK_DYNAMAX); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAX_LIGHTNING, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAX_FLARE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAX_GEYSER, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAX_QUAKE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAX_OVERGROWTH, player); + HP_BAR(opponent); + } + ABILITY_POPUP(opponent, ability); + } +} From 073d599fc58e54f4dc1f910c843940c12ca6ad4b Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 31 Aug 2024 12:39:56 +0200 Subject: [PATCH 05/12] Fixed Cinderace GMax back sprite (#5295) Co-authored-by: Hedara --- graphics/pokemon/cinderace/gigantamax/back.png | Bin 690 -> 664 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/pokemon/cinderace/gigantamax/back.png b/graphics/pokemon/cinderace/gigantamax/back.png index b9e6b813de2c86b3dbcababb8f76f7106fe75526..d07be68143cc27af57e9053198180cf1579fbdee 100644 GIT binary patch delta 592 zcmV-W0c0004VQb$4nuFf3kks&{S7D+@wR9J=WmEm^7 zAP9v8*JeFOegDTDhzdr`+U?&~PScYn-j55IG=z7&;~jrJK1TddeH-xuhLtzQujDTx zJUPYjBtg?70=!Pp^awFVf+*k#f~NnddJeU5+-_qffTuR{h;amPOho_`JZr5QC%qau z4zU2`tT)plag>jLgQylLeTg$5;0XQ!K#OOsA&`90cMRR4YJ+0{8{s%O{YD>HNeqlD zKpe3%)^7n!h%R7QxYlzsWa$nd=Yi+CCHR2eN502C%4HQEU|6VAxTpec!UfQ~xzST) zIImx7XhrO^cOh&oM7$nC2l#V%(4D=UYf!)I<0OD`ML?5(ZYiQ!xB{305PLak0K@_f z@d*R^6SEQ+@F;r=S~ci}4oJO*&n-cV9t+5I5&))N!<{$cHwJXjh$&YBCR2lN0b!{i z@lgS_5EuZrk4pzgoC4;|1Okv5&hg+TcovKSQ~(+*8+NgKmfU3c$oYpfI7+9 z!u0G805${k1Tp}76DnY~umSYT6_7EbX~Jv)d_dPnuAk;m0JI6#!qfuYiCxbIcuS)E z@3p;TEu3Cou<8>QZea&}o-AAdisZ+70v&L+u>2V>kBgiKu%BXkqVHls-wQ5a5DLTv ea9;=UkK+rTY9P51J=K5!0000n` z$GdkF&Dj6=S7S+WK7FxVQ7o^|?q79rbA}l5=ZK4yiTl^`A2IPc9&2FzN(suZV#t4E z4V;$H0*ep;IISK&(M$fvfQuX`I3IUC_+i++r203B5YR<7UOzDAsfn$>5IGD068FrD z+8$sD1@n0pc4>U@^>w6j%kjP9fyn#)_{`pZQ82LpAJhQ`04rr#)H(nYU;uLA3hWM8 z0!Od`^q6pN6Nv?6^vk(AI3>UUWC?$fYe@iv1^^B)veF(GUGL*bV2{ArFS=bv%Pe;q zu!P=^3^0Sh$uq9yk6#Oc#s!3S8+xGSqYL=DLqd(72?*g)eK-LoR4A`IiJfvJbn}2f z0;NW>N(<9AZ-YXmk%LRdfr zP|BjlIW39M0ua8GKk5o*M#4A1n?0_7%9j#>of;%MM-BJ|E*kkVEi}-c0zw1jGzn>p zUc$2ge9p64?wgRt=q0)-^+{Gz0d-l)O5yk13=;iC%lZP1EPhpU1nve22bg04p_&MR zTh&VpS2Z9&wIhKP{#AFkTV>ygo}H@(2H;M)_wKL7Zw56L3@e!? Date: Sat, 31 Aug 2024 04:15:56 -0700 Subject: [PATCH 06/12] fixed dupe gimmick use in doubles (#5235) Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- src/battle_controller_player.c | 2 +- src/battle_gimmick.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 5fac761cf7..bcdab75081 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -890,7 +890,7 @@ static void HandleInputChooseMove(u32 battler) } else if (JOY_NEW(START_BUTTON)) { - if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE) + if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE && !HasTrainerUsedGimmick(battler, gBattleStruct->gimmick.usableGimmick[battler])) { gBattleStruct->gimmick.playerSelect ^= 1; ReloadMoveNames(battler); diff --git a/src/battle_gimmick.c b/src/battle_gimmick.c index c8ee932218..79165c8901 100644 --- a/src/battle_gimmick.c +++ b/src/battle_gimmick.c @@ -144,7 +144,8 @@ void CreateGimmickTriggerSprite(u32 battler) // Exit if there shouldn't be a sprite produced. if (GetBattlerSide(battler) == B_SIDE_OPPONENT || gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_NONE - || gimmick->triggerSheet == NULL) + || gimmick->triggerSheet == NULL + || HasTrainerUsedGimmick(battler, gBattleStruct->gimmick.usableGimmick[battler])) { return; } From e09a59a7e4b2c8c7b3c340fdec557e80fb75d83a Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 31 Aug 2024 18:24:28 +0200 Subject: [PATCH 07/12] Fixes Tar Shot on Tera mons (#5302) * Fixes Tar Shot on Tera mon * new line --- asm/macros/battle_script.inc | 10 +++---- data/battle_scripts_1.s | 2 +- src/battle_script_commands.c | 28 +++++++++---------- test/battle/move_effect/tar_shot.c | 43 ++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 20 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9d61889b40..e18ce91f28 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1674,6 +1674,11 @@ callnative BS_FickleBeamDamageCalculation .endm + .macro trytarshot failInstr:req + callnative BS_TryTarShot + .4byte \failInstr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES @@ -2210,11 +2215,6 @@ .4byte \failInstr .endm - .macro trytarshot battler:req, failInstr:req - various \battler, VARIOUS_TRY_TAR_SHOT - .4byte \failInstr - .endm - .macro cantarshotwork battler:req, failInstr:req various \battler, VARIOUS_CAN_TAR_SHOT_WORK .4byte \failInstr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 9d0bc6fc1f..1a80940b72 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -902,7 +902,7 @@ BattleScript_EffectTarShot:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TryTarShot: - trytarshot BS_TARGET, BattleScript_MoveEnd + trytarshot BattleScript_MoveEnd printstring STRINGID_PKMNBECAMEWEAKERTOFIRE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8da71c45fb..6509dab069 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10715,20 +10715,6 @@ static void Cmd_various(void) } return; } - case VARIOUS_TRY_TAR_SHOT: - { - VARIOUS_ARGS(const u8 *failInstr); - if (gDisableStructs[battler].tarShot) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gDisableStructs[battler].tarShot = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } case VARIOUS_CAN_TAR_SHOT_WORK: { VARIOUS_ARGS(const u8 *failInstr); @@ -17209,3 +17195,17 @@ void BS_FickleBeamDamageCalculation(void) gBattlescriptCurrInstr = cmd->nextInstr; } } + +void BS_TryTarShot(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (gDisableStructs[gBattlerTarget].tarShot || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gDisableStructs[gBattlerTarget].tarShot = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} diff --git a/test/battle/move_effect/tar_shot.c b/test/battle/move_effect/tar_shot.c index 61aca1bec1..2b780577ec 100644 --- a/test/battle/move_effect/tar_shot.c +++ b/test/battle/move_effect/tar_shot.c @@ -42,3 +42,46 @@ SINGLE_BATTLE_TEST("Tar Shot doubles the effectiveness of Fire-type moves used o } } +SINGLE_BATTLE_TEST("Tar Shot does not affect Pokemon that are Terastallized") +{ + s16 damage[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + OPPONENT(SPECIES_WOBBUFFET) ; + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_EMBER); } + TURN { MOVE(opponent, MOVE_TAR_SHOT); } + TURN { MOVE(opponent, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + HP_BAR(player, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAR_SHOT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + HP_BAR(player, captureDamage: &damage[1]); + NOT MESSAGE("It's super effective!"); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Tar Shot does affect Pokemon that Terastallized after Tar Shot status was applied") +{ + s16 damage[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + OPPONENT(SPECIES_WOBBUFFET) ; + } WHEN { + TURN { MOVE(opponent, MOVE_EMBER); } + TURN { MOVE(opponent, MOVE_TAR_SHOT); } + TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + HP_BAR(player, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAR_SHOT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + HP_BAR(player, captureDamage: &damage[1]); + MESSAGE("It's super effective!"); + } THEN { + EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); + } +} From 6648498e2ec1a2e9b7d16d963bc682a289b7cd9b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 1 Sep 2024 18:07:18 +0200 Subject: [PATCH 08/12] Fixes dmax move base power not seen by ai (#5299) --- src/battle_util.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index c6199453ea..656607480b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8820,6 +8820,9 @@ static inline u32 CalcMoveBasePower(u32 move, u32 battlerAtk, u32 battlerDef, u3 if (GetActiveGimmick(battlerAtk) == GIMMICK_Z_MOVE) return GetZMovePower(gBattleStruct->zmove.baseMoves[battlerAtk]); + if (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX) + return GetMaxMovePower(move); + switch (gMovesInfo[move].effect) { case EFFECT_PLEDGE: From 33d5cbd7a284dce2234de8bb6bff615accbf5049 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 1 Sep 2024 17:13:58 -0400 Subject: [PATCH 09/12] Moved ASSUMEs to inside GIVEN blocks (#5308) --- test/battle/ability/anger_point.c | 13 +++----- test/battle/ability/galvanize.c | 6 ++-- test/battle/ability/harvest.c | 20 ++++++------ test/battle/ability/pickup.c | 18 +++++------ test/battle/ability/wind_rider.c | 2 +- test/battle/form_change/status.c | 10 +++--- test/battle/gimmick/dynamax.c | 2 +- test/battle/move.c | 14 ++++---- test/battle/move_effect/absorb.c | 2 +- test/battle/move_effect/accuracy_down.c | 2 +- test/battle/move_effect/dream_eater.c | 2 +- test/battle/move_effect/evasion_up.c | 2 +- test/battle/move_effect/future_sight.c | 4 +-- test/battle/move_effect/heal_bell.c | 3 +- test/battle/move_effect/instruct.c | 22 ++++++------- test/battle/move_effect/reflect_type.c | 32 +++++++++---------- .../move_effects_combined/triple_arrows.c | 4 +-- 17 files changed, 77 insertions(+), 81 deletions(-) diff --git a/test/battle/ability/anger_point.c b/test/battle/ability/anger_point.c index 270d66f28e..ddfa3c841d 100644 --- a/test/battle/ability/anger_point.c +++ b/test/battle/ability/anger_point.c @@ -3,9 +3,8 @@ SINGLE_BATTLE_TEST("Anger Point raises Attack stage to maximum after receiving a critical hit") { - ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit); - GIVEN { + ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit); PLAYER(SPECIES_PRIMEAPE) { Ability(ABILITY_ANGER_POINT); } OPPONENT(SPECIES_SNORUNT); } WHEN { @@ -23,10 +22,9 @@ SINGLE_BATTLE_TEST("Anger Point raises Attack stage to maximum after receiving a SINGLE_BATTLE_TEST("Anger Point does not trigger when already at maximum Attack stage") { - ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit); - ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM); - GIVEN { + ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit); + ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM); PLAYER(SPECIES_PRIMEAPE) { Ability(ABILITY_ANGER_POINT); Speed(2); } OPPONENT(SPECIES_SNORUNT) { Speed(1); } } WHEN { @@ -51,10 +49,9 @@ TO_DO_BATTLE_TEST("Anger Point triggers when a substitute takes the hit (Gen4)") SINGLE_BATTLE_TEST("Anger Point does not trigger when a substitute takes the hit (Gen5+)") { - ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit); - ASSUME(gMovesInfo[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE); - GIVEN { + ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit); + ASSUME(gMovesInfo[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE); PLAYER(SPECIES_PRIMEAPE) { Ability(ABILITY_ANGER_POINT); Speed(2); } OPPONENT(SPECIES_SNORUNT) { Speed(1); } } WHEN { diff --git a/test/battle/ability/galvanize.c b/test/battle/ability/galvanize.c index 55dfd7287a..7f604f3dac 100644 --- a/test/battle/ability/galvanize.c +++ b/test/battle/ability/galvanize.c @@ -28,10 +28,10 @@ SINGLE_BATTLE_TEST("Galvanize can not turn certain moves into Electric type move PARAMETRIZE { move = MOVE_WEATHER_BALL; } PARAMETRIZE { move = MOVE_MULTI_ATTACK; } - ASSUME(gMovesInfo[MOVE_HIDDEN_POWER].effect == EFFECT_HIDDEN_POWER); - ASSUME(gMovesInfo[MOVE_WEATHER_BALL].effect == EFFECT_WEATHER_BALL); - ASSUME(gMovesInfo[MOVE_MULTI_ATTACK].effect == EFFECT_CHANGE_TYPE_ON_ITEM); GIVEN { + ASSUME(gMovesInfo[MOVE_HIDDEN_POWER].effect == EFFECT_HIDDEN_POWER); + ASSUME(gMovesInfo[MOVE_WEATHER_BALL].effect == EFFECT_WEATHER_BALL); + ASSUME(gMovesInfo[MOVE_MULTI_ATTACK].effect == EFFECT_CHANGE_TYPE_ON_ITEM); PLAYER(SPECIES_KRABBY); OPPONENT(SPECIES_GEODUDE_ALOLAN) { Ability(ABILITY_GALVANIZE); } } WHEN { diff --git a/test/battle/ability/harvest.c b/test/battle/ability/harvest.c index f19e0715de..03e13b394e 100644 --- a/test/battle/ability/harvest.c +++ b/test/battle/ability/harvest.c @@ -60,8 +60,8 @@ SINGLE_BATTLE_TEST("Harvest doesn't always restore a Berry if Cloud Nine/Air Loc SINGLE_BATTLE_TEST("Harvest restores a Berry even after being switched out and back in") { - ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT); GIVEN { + ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); MaxHP(500); HP(251); Item(ITEM_SITRUS_BERRY); } OPPONENT(SPECIES_WOBBUFFET); @@ -79,8 +79,8 @@ SINGLE_BATTLE_TEST("Harvest restores a Berry even after being switched out and b SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Fling") { - ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING); GIVEN { + ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -96,8 +96,8 @@ SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Fling") SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Natural Gift") { - ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); GIVEN { + ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -116,8 +116,8 @@ TO_DO_BATTLE_TEST("Harvest only works once per turn"); // Check for berries that SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when destroyed by Incinerate") { PASSES_RANDOMLY(1, 1, RNG_HARVEST); - ASSUME(MoveHasAdditionalEffect(MOVE_INCINERATE, MOVE_EFFECT_INCINERATE)); GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_INCINERATE, MOVE_EFFECT_INCINERATE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -134,8 +134,8 @@ SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when destroyed by Incinerate SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when knocked off by Knock Off") { PASSES_RANDOMLY(1, 1, RNG_HARVEST); - ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -152,8 +152,8 @@ SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when knocked off by Knock Of SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when eaten by Bug Bite/Pluck") { PASSES_RANDOMLY(1, 1, RNG_HARVEST); - ASSUME(MoveHasAdditionalEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE)); GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -208,8 +208,8 @@ DOUBLE_BATTLE_TEST("Harvest order is affected by speed") SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when transfered to another Pokémon") { - ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); GIVEN { + ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -225,8 +225,8 @@ SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when transfered to another P SINGLE_BATTLE_TEST("Harvest can restore a Berry that was transferred from another Pokémon") { - ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); GIVEN { + ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(ITEM_SITRUS_BERRY); } OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); HP(100); MaxHP(500); } } WHEN { @@ -244,9 +244,9 @@ SINGLE_BATTLE_TEST("Harvest can restore a Berry that was transferred from anothe SINGLE_BATTLE_TEST("Harvest can only restore the newest berry consumed that was transferred from another Pokémon instead of its original Berry") { - ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); - ASSUME(gItemsInfo[ITEM_APICOT_BERRY].holdEffect == HOLD_EFFECT_SP_DEFENSE_UP); GIVEN { + ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); + ASSUME(gItemsInfo[ITEM_APICOT_BERRY].holdEffect == HOLD_EFFECT_SP_DEFENSE_UP); PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(ITEM_SITRUS_BERRY); } OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); HP(100); MaxHP(500); Item(ITEM_APICOT_BERRY); } } WHEN { diff --git a/test/battle/ability/pickup.c b/test/battle/ability/pickup.c index 57f6429feb..927e1b3468 100644 --- a/test/battle/ability/pickup.c +++ b/test/battle/ability/pickup.c @@ -43,8 +43,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant the user their item") SINGLE_BATTLE_TEST("Pickup doesn't grant another Pokémon's popped Air Balloon") { - ASSUME(gItemsInfo[ITEM_AIR_BALLOON].holdEffect == HOLD_EFFECT_AIR_BALLOON); GIVEN { + ASSUME(gItemsInfo[ITEM_AIR_BALLOON].holdEffect == HOLD_EFFECT_AIR_BALLOON); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); } } WHEN { @@ -102,8 +102,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item after its holder faints") SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if holder is replaced") { - ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT); GIVEN { + ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { MaxHP(300); HP(151); Item(ITEM_SITRUS_BERRY); } @@ -127,8 +127,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if holder is replaced") SINGLE_BATTLE_TEST("Pickup doesn't grant an item if it destroyed the item with Incinerate") { - ASSUME(MoveHasAdditionalEffect(MOVE_INCINERATE, MOVE_EFFECT_INCINERATE)); GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_INCINERATE, MOVE_EFFECT_INCINERATE)); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -146,8 +146,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item if it destroyed the item with I SINGLE_BATTLE_TEST("Pickup doesn't grant an item if it knocked off that item") { - ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -165,8 +165,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item if it knocked off that item") SINGLE_BATTLE_TEST("Pickup doesn't grant an item if the user eats it with Bug Bite/Pluck") { - ASSUME(MoveHasAdditionalEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE)); GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE)); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -184,8 +184,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item if the user eats it with Bug Bi SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if its user already restored it") { - ASSUME(gMovesInfo[MOVE_RECYCLE].effect == EFFECT_RECYCLE); GIVEN { + ASSUME(gMovesInfo[MOVE_RECYCLE].effect == EFFECT_RECYCLE); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -204,8 +204,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if its user already restor SINGLE_BATTLE_TEST("Pickup restores an item that has been Flinged") { - ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING); GIVEN { + ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -221,8 +221,8 @@ SINGLE_BATTLE_TEST("Pickup restores an item that has been Flinged") SINGLE_BATTLE_TEST("Pickup restores an item that was used by Natural Gift") { - ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); GIVEN { + ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -258,8 +258,8 @@ DOUBLE_BATTLE_TEST("Pickup triggers based on Speed order") DOUBLE_BATTLE_TEST("Pickup grants a random item used by another Pokémon") { PASSES_RANDOMLY(1, 3, RNG_PICKUP); - ASSUME(gItemsInfo[ITEM_WHITE_HERB].holdEffect == HOLD_EFFECT_RESTORE_STATS); GIVEN { + ASSUME(gItemsInfo[ITEM_WHITE_HERB].holdEffect == HOLD_EFFECT_RESTORE_STATS); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } diff --git a/test/battle/ability/wind_rider.c b/test/battle/ability/wind_rider.c index 57e6f0d275..cd4dbeed1f 100644 --- a/test/battle/ability/wind_rider.c +++ b/test/battle/ability/wind_rider.c @@ -107,8 +107,8 @@ SINGLE_BATTLE_TEST("Wind Rider activates when it's no longer effected by Neutral SINGLE_BATTLE_TEST("Wind Rider absorbs Wind moves and raises Attack by one stage") { - ASSUME(gMovesInfo[MOVE_GUST].windMove == TRUE); GIVEN { + ASSUME(gMovesInfo[MOVE_GUST].windMove == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRAMBLIN) { Ability(ABILITY_WIND_RIDER); } } WHEN { diff --git a/test/battle/form_change/status.c b/test/battle/form_change/status.c index 0b94202bbd..612c125497 100644 --- a/test/battle/form_change/status.c +++ b/test/battle/form_change/status.c @@ -11,12 +11,12 @@ SINGLE_BATTLE_TEST("Shaymin-Sky reverts to Shaymin-Land when frozen or frostbitt PARAMETRIZE { move = MOVE_POISON_STING; } PARAMETRIZE { move = MOVE_POISON_FANG; } - ASSUME(MoveHasAdditionalEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE)); - ASSUME(MoveHasAdditionalEffect(MOVE_EMBER, MOVE_EFFECT_BURN)); - ASSUME(MoveHasAdditionalEffect(MOVE_THUNDERSHOCK, MOVE_EFFECT_PARALYSIS)); - ASSUME(MoveHasAdditionalEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON)); - ASSUME(MoveHasAdditionalEffect(MOVE_POISON_FANG, MOVE_EFFECT_TOXIC)); GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE)); + ASSUME(MoveHasAdditionalEffect(MOVE_EMBER, MOVE_EFFECT_BURN)); + ASSUME(MoveHasAdditionalEffect(MOVE_THUNDERSHOCK, MOVE_EFFECT_PARALYSIS)); + ASSUME(MoveHasAdditionalEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON)); + ASSUME(MoveHasAdditionalEffect(MOVE_POISON_FANG, MOVE_EFFECT_TOXIC)); PLAYER(SPECIES_SHAYMIN_SKY); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index d0360918c8..599ae4d454 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -1463,8 +1463,8 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't execute effects on fainted battler SINGLE_BATTLE_TEST("(DYNAMAX) Moxie clones can be triggered by Max Moves fainting opponents") { - ASSUME(gMovesInfo[MOVE_WATERFALL].power > 0); GIVEN { + ASSUME(gMovesInfo[MOVE_WATERFALL].power > 0); PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_MOXIE); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/move.c b/test/battle/move.c index 081a91712d..655895da77 100644 --- a/test/battle/move.c +++ b/test/battle/move.c @@ -85,11 +85,11 @@ DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie PARAMETRIZE {} // Hack to make permutations legal. PASSES_RANDOMLY(24, 24, RNG_SPEED_TIE); - ASSUME(gMovesInfo[MOVE_ENDEAVOR].effect == EFFECT_ENDEAVOR); - ASSUME(gMovesInfo[MOVE_LIFE_DEW].effect == EFFECT_JUNGLE_HEALING); - ASSUME(gMovesInfo[MOVE_CRUSH_GRIP].effect == EFFECT_VARY_POWER_BASED_ON_HP); - ASSUME(gMovesInfo[MOVE_SUPER_FANG].effect == EFFECT_SUPER_FANG); GIVEN { + ASSUME(gMovesInfo[MOVE_ENDEAVOR].effect == EFFECT_ENDEAVOR); + ASSUME(gMovesInfo[MOVE_LIFE_DEW].effect == EFFECT_JUNGLE_HEALING); + ASSUME(gMovesInfo[MOVE_CRUSH_GRIP].effect == EFFECT_VARY_POWER_BASED_ON_HP); + ASSUME(gMovesInfo[MOVE_SUPER_FANG].effect == EFFECT_SUPER_FANG); PLAYER(SPECIES_WOBBUFFET) { MaxHP(480); HP(360); Defense(100); Speed(1); } PLAYER(SPECIES_WYNAUT) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Attack(100); Speed(1); } @@ -136,9 +136,9 @@ DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie SINGLE_BATTLE_TEST("Critical hits occur at a 1/24 rate") { - ASSUME(B_CRIT_CHANCE >= GEN_7); PASSES_RANDOMLY(1, 24, RNG_CRITICAL_HIT); GIVEN { + ASSUME(B_CRIT_CHANCE >= GEN_7); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -150,10 +150,10 @@ SINGLE_BATTLE_TEST("Critical hits occur at a 1/24 rate") SINGLE_BATTLE_TEST("Slash's critical hits occur at a 1/8 rate") { - ASSUME(B_CRIT_CHANCE >= GEN_7); - ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT); GIVEN { + ASSUME(B_CRIT_CHANCE >= GEN_7); + ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/absorb.c b/test/battle/move_effect/absorb.c index b0140a7a65..698ea41091 100644 --- a/test/battle/move_effect/absorb.c +++ b/test/battle/move_effect/absorb.c @@ -26,8 +26,8 @@ SINGLE_BATTLE_TEST("Absorb recovers 50% of the damage dealt") SINGLE_BATTLE_TEST("Absorb fails if Heal Block applies") { - ASSUME(B_HEAL_BLOCKING >= GEN_6); GIVEN { + ASSUME(B_HEAL_BLOCKING >= GEN_6); PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/accuracy_down.c b/test/battle/move_effect/accuracy_down.c index a4a8ad49bf..8a015c4a67 100644 --- a/test/battle/move_effect/accuracy_down.c +++ b/test/battle/move_effect/accuracy_down.c @@ -8,9 +8,9 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Sand Attack lowers Accuracy by 1 stage") { - ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100); PASSES_RANDOMLY(gMovesInfo[MOVE_SCRATCH].accuracy * 3 / 4, 100, RNG_ACCURACY); GIVEN { + ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/dream_eater.c b/test/battle/move_effect/dream_eater.c index 4ce749b5d2..f0fd113d2b 100644 --- a/test/battle/move_effect/dream_eater.c +++ b/test/battle/move_effect/dream_eater.c @@ -39,8 +39,8 @@ SINGLE_BATTLE_TEST("Dream Eater fails on awake targets") SINGLE_BATTLE_TEST("Dream Eater fails if Heal Block applies") { - ASSUME(B_HEAL_BLOCKING >= GEN_6); GIVEN { + ASSUME(B_HEAL_BLOCKING >= GEN_6); PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/evasion_up.c b/test/battle/move_effect/evasion_up.c index 4dcd92c7b3..7058694e9d 100644 --- a/test/battle/move_effect/evasion_up.c +++ b/test/battle/move_effect/evasion_up.c @@ -8,9 +8,9 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Double Team raises Evasion") { - ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100); PASSES_RANDOMLY(gMovesInfo[MOVE_SCRATCH].accuracy * 3 / 4, 100, RNG_ACCURACY); GIVEN { + ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/future_sight.c b/test/battle/move_effect/future_sight.c index fa78461a9d..778895ba58 100644 --- a/test/battle/move_effect/future_sight.c +++ b/test/battle/move_effect/future_sight.c @@ -158,9 +158,9 @@ SINGLE_BATTLE_TEST("Future Sight will miss timing if target faints by residual d SINGLE_BATTLE_TEST("Future Sight breaks Focus Sash and doesn't make the holder endure another move") { - ASSUME(gMovesInfo[MOVE_PSYCHIC].power > 0); - ASSUME(gItemsInfo[ITEM_FOCUS_SASH].holdEffect == HOLD_EFFECT_FOCUS_SASH); GIVEN { + ASSUME(gMovesInfo[MOVE_PSYCHIC].power > 0); + ASSUME(gItemsInfo[ITEM_FOCUS_SASH].holdEffect == HOLD_EFFECT_FOCUS_SASH); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY) { Level(1); Item(ITEM_FOCUS_SASH); } } WHEN { diff --git a/test/battle/move_effect/heal_bell.c b/test/battle/move_effect/heal_bell.c index 743af905ce..c098886a98 100644 --- a/test/battle/move_effect/heal_bell.c +++ b/test/battle/move_effect/heal_bell.c @@ -88,9 +88,8 @@ SINGLE_BATTLE_TEST("Heal Bell cures inactive soundproof Pokemon") SINGLE_BATTLE_TEST("Heal Bell cures a soundproof user") { - ASSUME(B_HEAL_BELL_SOUNDPROOF == GEN_5 || B_HEAL_BELL_SOUNDPROOF >= GEN_8); - GIVEN { + ASSUME(B_HEAL_BELL_SOUNDPROOF == GEN_5 || B_HEAL_BELL_SOUNDPROOF >= GEN_8); PLAYER(SPECIES_EXPLOUD) { Ability(ABILITY_SOUNDPROOF); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); } WHEN { diff --git a/test/battle/move_effect/instruct.c b/test/battle/move_effect/instruct.c index 4521969920..59772ea944 100644 --- a/test/battle/move_effect/instruct.c +++ b/test/battle/move_effect/instruct.c @@ -23,8 +23,8 @@ DOUBLE_BATTLE_TEST("Instruct fails if target hasn't made a move") DOUBLE_BATTLE_TEST("Instruct fails if move is banned by Instruct") { - ASSUME(gMovesInfo[MOVE_BIDE].instructBanned == TRUE); GIVEN { + ASSUME(gMovesInfo[MOVE_BIDE].instructBanned == TRUE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_BIDE); } OPPONENT(SPECIES_WOBBUFFET); @@ -59,8 +59,8 @@ DOUBLE_BATTLE_TEST("Instruct-called move targets the target of the move picked o DOUBLE_BATTLE_TEST("Instruct doesn't bypass sleep") { - ASSUME(gMovesInfo[MOVE_SPORE].effect == EFFECT_SLEEP); GIVEN { + ASSUME(gMovesInfo[MOVE_SPORE].effect == EFFECT_SLEEP); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_GROWL); } OPPONENT(SPECIES_WOBBUFFET); @@ -78,8 +78,8 @@ DOUBLE_BATTLE_TEST("Instruct doesn't bypass sleep") DOUBLE_BATTLE_TEST("Instruct fails if target doesn't know the last move it used") { - ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_ORICORIO) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_CELEBRATE); } OPPONENT(SPECIES_WOBBUFFET); @@ -99,8 +99,8 @@ DOUBLE_BATTLE_TEST("Instruct fails if target doesn't know the last move it used" DOUBLE_BATTLE_TEST("Instruct-called move fails if it can only be used on the first turn but consumes PP") { - ASSUME(gMovesInfo[MOVE_FAKE_OUT].effect == EFFECT_FIRST_TURN_ONLY); GIVEN { + ASSUME(gMovesInfo[MOVE_FAKE_OUT].effect == EFFECT_FIRST_TURN_ONLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_FAKE_OUT); } OPPONENT(SPECIES_WOBBUFFET); @@ -118,8 +118,8 @@ DOUBLE_BATTLE_TEST("Instruct-called move fails if it can only be used on the fir DOUBLE_BATTLE_TEST("Instruct-called move doesn't fail if tormented") { - ASSUME(gMovesInfo[MOVE_TORMENT].effect == EFFECT_TORMENT); GIVEN { + ASSUME(gMovesInfo[MOVE_TORMENT].effect == EFFECT_TORMENT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_FAKE_OUT); } OPPONENT(SPECIES_WOBBUFFET); @@ -136,9 +136,9 @@ DOUBLE_BATTLE_TEST("Instruct-called move doesn't fail if tormented") DOUBLE_BATTLE_TEST("Instruct-called status moves don't fail if holding Assault Vest") { - ASSUME(gItemsInfo[ITEM_ASSAULT_VEST].holdEffect == HOLD_EFFECT_ASSAULT_VEST); - ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); GIVEN { + ASSUME(gItemsInfo[ITEM_ASSAULT_VEST].holdEffect == HOLD_EFFECT_ASSAULT_VEST); + ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_TRICK); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ASSAULT_VEST); } @@ -154,8 +154,8 @@ DOUBLE_BATTLE_TEST("Instruct-called status moves don't fail if holding Assault V DOUBLE_BATTLE_TEST("Instruct-called status move fails if taunted") { - ASSUME(gMovesInfo[MOVE_TAUNT].effect == EFFECT_TAUNT); GIVEN { + ASSUME(gMovesInfo[MOVE_TAUNT].effect == EFFECT_TAUNT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_GROWL); } OPPONENT(SPECIES_WOBBUFFET); @@ -180,8 +180,8 @@ DOUBLE_BATTLE_TEST("Instruct-called status move fails if taunted") DOUBLE_BATTLE_TEST("Instruct-called moves fail if disabled") { - ASSUME(gMovesInfo[MOVE_DISABLE].effect == EFFECT_DISABLE); GIVEN { + ASSUME(gMovesInfo[MOVE_DISABLE].effect == EFFECT_DISABLE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_GROWL); } OPPONENT(SPECIES_WOBBUFFET); @@ -200,9 +200,9 @@ DOUBLE_BATTLE_TEST("Instruct-called moves fail if disabled") DOUBLE_BATTLE_TEST("Instruct-called moves keep their priority") { - ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1); - ASSUME(gMovesInfo[MOVE_PSYCHIC_TERRAIN].effect == EFFECT_PSYCHIC_TERRAIN); GIVEN { + ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1); + ASSUME(gMovesInfo[MOVE_PSYCHIC_TERRAIN].effect == EFFECT_PSYCHIC_TERRAIN); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_QUICK_ATTACK); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/reflect_type.c b/test/battle/move_effect/reflect_type.c index 32ed9520c8..0b610efe6e 100644 --- a/test/battle/move_effect/reflect_type.c +++ b/test/battle/move_effect/reflect_type.c @@ -88,11 +88,11 @@ SINGLE_BATTLE_TEST("Reflect Type does not affect any of Silvally's forms") SINGLE_BATTLE_TEST("Reflect Type does not affect Pokémon with no types") { - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING); GIVEN { + ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); + ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); + ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER); + ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING); PLAYER(SPECIES_ARCANINE); OPPONENT(SPECIES_POLIWRATH); } WHEN { @@ -109,11 +109,11 @@ SINGLE_BATTLE_TEST("Reflect Type does not affect Pokémon with no types") SINGLE_BATTLE_TEST("Reflect Type copies a target's dual types") { - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING); GIVEN { + ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); + ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); + ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER); + ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING); PLAYER(SPECIES_ARCANINE); OPPONENT(SPECIES_POLIWRATH); } WHEN { @@ -131,11 +131,11 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's dual types") SINGLE_BATTLE_TEST("Reflect Type copies a target's pure type") { - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[0] == TYPE_ROCK); - ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[1] == TYPE_ROCK); GIVEN { + ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); + ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); + ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[0] == TYPE_ROCK); + ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[1] == TYPE_ROCK); PLAYER(SPECIES_ARCANINE); OPPONENT(SPECIES_SUDOWOODO); } WHEN { @@ -153,11 +153,11 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's pure type") SINGLE_BATTLE_TEST("Reflect Type defaults to Normal type for the user's types[0] and types[1] if the target only has a 3rd type") { - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); GIVEN { + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); + ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); + ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ARCANINE); } WHEN { diff --git a/test/battle/move_effects_combined/triple_arrows.c b/test/battle/move_effects_combined/triple_arrows.c index 4286a9ba07..383fce6cbf 100644 --- a/test/battle/move_effects_combined/triple_arrows.c +++ b/test/battle/move_effects_combined/triple_arrows.c @@ -46,10 +46,10 @@ SINGLE_BATTLE_TEST("Triple Arrows makes the foe flinch 30% of the time") SINGLE_BATTLE_TEST("Triple Arrows lands a critical hit") { - ASSUME(B_CRIT_CHANCE >= GEN_7); - ASSUME(gMovesInfo[MOVE_TRIPLE_ARROWS].criticalHitStage == 1); PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT); GIVEN { + ASSUME(B_CRIT_CHANCE >= GEN_7); + ASSUME(gMovesInfo[MOVE_TRIPLE_ARROWS].criticalHitStage == 1); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { From fb1f12aa1b6fbe31875a3aa565160fa5b04ca49d Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Mon, 2 Sep 2024 13:58:10 +0200 Subject: [PATCH 10/12] Fixed Max Attacks into Max Guards message printing (#5312) * Fixed Max Attacks into Max Guards message printing * Updated the solution --------- Co-authored-by: Hedara --- src/battle_script_commands.c | 7 ++++++- test/battle/gimmick/dynamax.c | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6509dab069..9d8c0d4491 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1730,7 +1730,12 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u else if (!JumpIfMoveAffectedByProtect(gCurrentMove)) gBattlescriptCurrInstr = nextInstr; if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) - AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBattlerTarget, 0, 0, gCurrentMove); + { + if (gProtectStructs[gBattlerTarget].maxGuarded) + gBattlescriptCurrInstr = nextInstr; + else + AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBattlerTarget, 0, 0, gCurrentMove); + } } else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT || (gSpecialStatuses[gBattlerAttacker].multiHitOn diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 599ae4d454..f9865f7b6c 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -400,6 +400,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves deal 1/4 damage through protect", s16 da } } +// This test will fail if it's the first test a thread runs SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass Max Guard") { GIVEN { @@ -1477,6 +1478,20 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Moxie clones can be triggered by Max Moves faintin } } +// This test will fail if it's the first test a thread runs +SINGLE_BATTLE_TEST("(DYNAMAX) Max Attacks prints a message when hitting into Max Guard") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_GROWL, gimmick: GIMMICK_DYNAMAX); MOVE(opponent, MOVE_TACKLE, gimmick: GIMMICK_DYNAMAX); } + } SCENE { + MESSAGE("Wobbuffet used Max Guard!"); + MESSAGE("Foe Wobbuffet used Max Strike!"); + } +} + SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass absorbing abilities") { u32 move, ability, species; @@ -1512,4 +1527,4 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass absorbing abilities") } ABILITY_POPUP(opponent, ability); } -} +} \ No newline at end of file From a422db09c69d8d07e336878081b63c716cf19b32 Mon Sep 17 00:00:00 2001 From: SarnPoke <77281351+SarnPoke@users.noreply.github.com> Date: Mon, 2 Sep 2024 22:53:03 +0200 Subject: [PATCH 11/12] Fix Slateport Battle Tent/Battle Factory (#5281) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix Slateport Battle Tent/Battle Factory Stops the Battle Factory and Slateport Battle Tent from returning no Pokémon when player wants to swap their Pokémon. * Fix player rental party being junk data after rest Fixes #5280 * Consolidate checks into single method Consolidates every gSpecialVar_0x8005 check into a singular method. --- include/frontier_util.h | 1 + src/battle_arena.c | 1 + src/battle_dome.c | 1 + src/battle_factory.c | 11 ++--------- src/battle_main.c | 9 +++++++-- src/battle_palace.c | 1 + src/battle_pike.c | 1 + src/battle_pyramid.c | 2 ++ src/battle_tent.c | 3 +++ src/battle_tower.c | 1 + src/frontier_util.c | 11 +++++++++++ 11 files changed, 31 insertions(+), 11 deletions(-) diff --git a/include/frontier_util.h b/include/frontier_util.h index 637b7f91bb..0d617782a3 100644 --- a/include/frontier_util.h +++ b/include/frontier_util.h @@ -24,5 +24,6 @@ u16 GetFrontierBrainMonMove(u8 monId, u8 moveSlotId); u8 GetFrontierBrainMonNature(u8 monId); u8 GetFrontierBrainMonEvs(u8 monId, u8 evStatId); s32 GetFronterBrainSymbol(void); +void ClearEnemyPartyAfterChallenge(void); #endif // GUARD_FRONTIER_UTIL_H diff --git a/src/battle_arena.c b/src/battle_arena.c index 26df519be0..d0819fa8f0 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -529,6 +529,7 @@ static void SetArenaData(void) static void SaveArenaChallenge(void) { + ClearEnemyPartyAfterChallenge(); gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; diff --git a/src/battle_dome.c b/src/battle_dome.c index 06acf6e2f2..a91da6fda7 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -2593,6 +2593,7 @@ static void SetDomeOpponentGraphicsId(void) static void SaveDomeChallenge(void) { + ClearEnemyPartyAfterChallenge(); gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; diff --git a/src/battle_factory.c b/src/battle_factory.c index b5645368c2..8edd9a2ddf 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -268,6 +268,7 @@ static void SetBattleFactoryData(void) static void SaveFactoryChallenge(void) { + ClearEnemyPartyAfterChallenge(); gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; @@ -430,9 +431,6 @@ static void SetPlayerAndOpponentParties(void) ivs = gSaveBlock2Ptr->frontier.rentalMons[i].ivs; CreateFacilityMon(&gFacilityTrainerMons[monId], monLevel, ivs, OT_ID_PLAYER_ID, FLAG_FRONTIER_MON_FACTORY, &gPlayerParty[i]); - SetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY, - &gSaveBlock2Ptr->frontier.rentalMons[i].personality); - CalculateMonStats(&gPlayerParty[i]); } } @@ -444,12 +442,7 @@ static void SetPlayerAndOpponentParties(void) { monId = gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].monId; ivs = gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].ivs; - CreateFacilityMon(&gFacilityTrainerMons[monId], - monLevel, ivs, OT_ID_PLAYER_ID, FLAG_FRONTIER_MON_FACTORY, - &gEnemyParty[i]); - SetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY, - &gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].personality); - CalculateMonStats(&gPlayerParty[i]); + CreateFacilityMon(&gFacilityTrainerMons[monId], monLevel, ivs, OT_ID_PLAYER_ID, FLAG_FRONTIER_MON_FACTORY, &gEnemyParty[i]); } break; } diff --git a/src/battle_main.c b/src/battle_main.c index 4165dea20d..d011cde1db 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5624,9 +5624,14 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void) } FreeAllWindowBuffers(); - if (gBattleStruct != NULL && !(gBattleTypeFlags & BATTLE_TYPE_LINK)) + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) { - ZeroEnemyPartyMons(); + // To account for Battle Factory and Slateport Battle Tent, enemy parties are zeroed out in the facilitites respective src/xxx.c files + // The ZeroEnemyPartyMons() call happens in SaveXXXChallenge function (eg. SaveFactoryChallenge) + if (!(gBattleTypeFlags & BATTLE_TYPE_FRONTIER)) + { + ZeroEnemyPartyMons(); + } ResetDynamicAiFunc(); FreeMonSpritesGfx(); FreeBattleResources(); diff --git a/src/battle_palace.c b/src/battle_palace.c index a521acea2b..fdcb8d3903 100644 --- a/src/battle_palace.c +++ b/src/battle_palace.c @@ -180,6 +180,7 @@ static void IncrementPalaceStreak(void) static void SavePalaceChallenge(void) { + ClearEnemyPartyAfterChallenge(); gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; diff --git a/src/battle_pike.c b/src/battle_pike.c index 3869531d20..3ce3cd443a 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -707,6 +707,7 @@ static void ClearInWildMonRoom(void) static void SavePikeChallenge(void) { + ClearEnemyPartyAfterChallenge(); gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index ce7a0526f2..0a82124428 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -2,6 +2,7 @@ #include "battle_pyramid.h" #include "battle_pyramid_bag.h" #include "event_data.h" +#include "frontier_util.h" #include "battle.h" #include "battle_setup.h" #include "battle_tower.h" @@ -936,6 +937,7 @@ static void SetBattlePyramidData(void) static void SavePyramidChallenge(void) { + ClearEnemyPartyAfterChallenge(); gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; diff --git a/src/battle_tent.c b/src/battle_tent.c index 8c6a94509a..49df90ffd6 100644 --- a/src/battle_tent.c +++ b/src/battle_tent.c @@ -139,6 +139,7 @@ static void BufferVerdanturfTentTrainerIntro(void) static void SaveVerdanturfTentChallenge(void) { + ClearEnemyPartyAfterChallenge(); gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; @@ -189,6 +190,7 @@ static void SetFallarborTentPrize(void) static void SaveFallarborTentChallenge(void) { + ClearEnemyPartyAfterChallenge(); gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; @@ -244,6 +246,7 @@ static void SetSlateportTentPrize(void) static void SaveSlateportTentChallenge(void) { + ClearEnemyPartyAfterChallenge(); gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; diff --git a/src/battle_tower.c b/src/battle_tower.c index 51200512f1..72858a854c 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -2206,6 +2206,7 @@ static void SaveTowerChallenge(void) if (gSpecialVar_0x8005 == 0 && (challengeNum > 1 || gSaveBlock2Ptr->frontier.curChallengeBattleNum != 0)) SaveBattleTowerRecord(); + ClearEnemyPartyAfterChallenge(); gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; diff --git a/src/frontier_util.c b/src/frontier_util.c index ca8c76a0fd..3561ef5472 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -2578,3 +2578,14 @@ static void CopyFrontierBrainText(bool8 playerWonText) break; } } + +void ClearEnemyPartyAfterChallenge() +{ + // We zero out the Enemy's party here when the player either wins or loses the challenge since we + // can't do it the usual way in FreeResetData_ReturnToOvOrDoEvolutions() in battle_main.c due to the + // way facilities like the Battle Factory and the Slateport Battle Tent work + if (gSpecialVar_0x8005 == 0) + { + ZeroEnemyPartyMons(); + } +} From 9bd5601b5c085a70111f0fc4eaf7d98e43adbfa8 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Mon, 2 Sep 2024 17:43:41 -0400 Subject: [PATCH 12/12] Wonder Guard AI Fix (#5317) * Fix Wonder Guard looping * Review + Sheer Cold --- src/battle_ai_main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 67e9b90a24..869f5dded3 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -889,7 +889,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case ABILITY_WONDER_GUARD: if (effectiveness < AI_EFFECTIVENESS_x2) - return 0; + RETURN_SCORE_MINUS(20); break; case ABILITY_JUSTIFIED: if (moveType == TYPE_DARK && !IS_MOVE_STATUS(move)) @@ -1498,7 +1498,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_OHKO: if (B_SHEER_COLD_IMMUNITY >= GEN_7 && move == MOVE_SHEER_COLD && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) - return 0; + RETURN_SCORE_MINUS(20); if (!ShouldTryOHKO(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move)) ADJUST_SCORE(-10); else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) @@ -2478,7 +2478,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) { if (gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK) - return 0; + return 0; // cannot even select if (AtMaxHp(battlerDef)) ADJUST_SCORE(-10); else if (gBattleMons[battlerDef].hp > gBattleMons[battlerDef].maxHP / 2)