From ae62c80d0f56b9a810db235c9685f9505f672f51 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 2 Apr 2025 16:00:23 +0200 Subject: [PATCH] Refactors faint target abilities and adds Battle Bond config (#6519) Co-authored-by: Bassoonian --- asm/macros/battle_script.inc | 16 - data/battle_scripts_1.s | 30 +- include/battle.h | 8 +- include/battle_scripts.h | 1 + include/battle_util.h | 4 +- include/config/battle.h | 1 + include/constants/battle_script_commands.h | 6 +- include/constants/battle_string_ids.h | 533 ++++++++++----------- include/constants/generational_changes.h | 1 + include/generational_changes.h | 1 + src/battle_message.c | 1 - src/battle_script_commands.c | 323 ++++++++----- src/battle_util.c | 70 +-- test/battle/ability/battle_bond.c | 71 ++- test/battle/ability/beast_boost.c | 10 +- test/battle/ability/grim_neigh.c | 28 +- test/battle/ability/moxie.c | 34 +- test/battle/gimmick/dynamax.c | 3 +- test/text.c | 3 +- 19 files changed, 595 insertions(+), 549 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 0f1c15208e..f353445fa3 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1949,14 +1949,6 @@ various \battler, VARIOUS_RESTORE_PP .endm - .macro tryactivatemoxie battler:req - various \battler, VARIOUS_TRY_ACTIVATE_MOXIE - .endm - - .macro tryactivatebeastboost battler:req - various \battler, VARIOUS_TRY_ACTIVATE_BEAST_BOOST - .endm - .macro tryactivatereceiver battler:req various \battler, VARIOUS_TRY_ACTIVATE_RECEIVER .endm @@ -2240,10 +2232,6 @@ .4byte \jumpInstr .endm - .macro tryactivategrimneigh, battler:req - various \battler, VARIOUS_TRY_ACTIVATE_GRIM_NEIGH - .endm - .macro consumeberry battler:req, fromBattler:req various \battler, VARIOUS_CONSUME_BERRY .byte \fromBattler @@ -2304,10 +2292,6 @@ .4byte \jumpInstr .endm - .macro tryactivatebattlebond battler:req - various \battler, VARIOUS_TRY_ACTIVATE_BATTLE_BOND - .endm - .macro jumpifcantreverttoprimal jumpInstr:req various BS_ATTACKER, VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL .4byte \jumpInstr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a0b720e73d..d359067792 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5414,10 +5414,6 @@ BattleScript_FaintTarget:: tryactivatefellstinger BS_ATTACKER tryactivatesoulheart tryactivatereceiver BS_TARGET - tryactivatemoxie BS_ATTACKER @ and chilling neigh, as one ice rider - tryactivatebeastboost BS_ATTACKER - tryactivategrimneigh BS_ATTACKER @ and as one shadow rider - tryactivatebattlebond BS_ATTACKER trytrainerslidefirstdownmsg BS_TARGET return @@ -8446,10 +8442,9 @@ BattleScript_RaiseStatOnFaintingTarget:: statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseStatOnFaintingTarget_End copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp - setgraphicalstatchangevalues playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 waitanimation - printstring STRINGID_LASTABILITYRAISEDSTAT + printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RaiseStatOnFaintingTarget_End: return @@ -8616,6 +8611,29 @@ BattleScript_BattleBondActivatesOnMoveEndAttacker:: printstring STRINGID_ATTACKERBECAMEASHSPECIES return +BattleScript_EffectBattleBondStatIncrease:: + call BattleScript_AbilityPopUp + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + setstatchanger STAT_ATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseTrySpAtk + printfromtable gStatUpStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_EffectBattleBondStatIncreaseTrySpAtk: + setstatchanger STAT_SPATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseTrySpeed + printfromtable gStatUpStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_EffectBattleBondStatIncreaseTrySpeed: + setstatchanger STAT_SPEED, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseRet + printfromtable gStatUpStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_EffectBattleBondStatIncreaseRet: + return + BattleScript_DancerActivates:: call BattleScript_AbilityPopUp waitmessage B_WAIT_TIME_SHORT diff --git a/include/battle.h b/include/battle.h index 641a17c761..d8f8f1a409 100644 --- a/include/battle.h +++ b/include/battle.h @@ -725,7 +725,7 @@ struct BattleStruct u8 startingStatusDone:1; u8 terrainDone:1; u8 overworldWeatherDone:1; - u8 obedienceResult:3; + u8 unused:3; u8 isAtkCancelerForCalledMove:1; // Certain cases in atk canceler should only be checked once, when the original move is called, however others need to be checked the twice. u8 friskedAbility:1; // If identifies two mons, show the ability pop-up only once. u8 fickleBeamBoosted:1; @@ -786,7 +786,7 @@ struct BattleStruct u8 hitSwitchTargetFailed:1; u8 effectsBeforeUsingMoveDone:1; // Mega Evo and Focus Punch/Shell Trap effects. u8 spriteIgnore0Hp:1; - u8 battleBondTransformed[NUM_BATTLE_SIDES]; // Bitfield for each party. + u8 battleBondBoost[NUM_BATTLE_SIDES]; // Bitfield for each party. u8 bonusCritStages[MAX_BATTLERS_COUNT]; // G-Max Chi Strike boosts crit stages of allies. u8 itemPartyIndex[MAX_BATTLERS_COUNT]; u8 itemMoveIndex[MAX_BATTLERS_COUNT]; @@ -938,11 +938,11 @@ static inline bool32 IsBattleMoveRecoil(u32 move) // in include/constants/battle_script_commands.h struct BattleScripting { - s32 painSplitHp; + s32 unused1; s32 bideDmg; u8 multihitString[6]; bool8 expOnCatch; - u8 unused; + u8 unused2; u8 animArg1; u8 animArg2; u16 savedStringId; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index cbc6af22f5..e02a562be5 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -425,6 +425,7 @@ extern const u8 BattleScript_GulpMissileGorging[]; extern const u8 BattleScript_GulpMissileGulping[]; extern const u8 BattleScript_GulpMissileFormChange[]; extern const u8 BattleScript_BattleBondActivatesOnMoveEndAttacker[]; +extern const u8 BattleScript_EffectBattleBondStatIncrease[]; extern const u8 BattleScript_DesolateLandActivates[]; extern const u8 BattleScript_PrimordialSeaActivates[]; extern const u8 BattleScript_PrimalWeatherBlocksMove[]; diff --git a/include/battle_util.h b/include/battle_util.h index a3e7baa368..ed8bda6491 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -349,13 +349,11 @@ bool32 IsSleepClauseEnabled(); void ClearDamageCalcResults(void); u32 DoesDestinyBondFail(u32 battler); bool32 IsMoveEffectBlockedByTarget(u32 ability); -u32 NumAffectedSpreadMoveTargets(void); bool32 IsPursuitTargetSet(void); void ClearPursuitValuesIfSet(u32 battler); void ClearPursuitValues(void); bool32 HasWeatherEffect(void); -bool32 IsMovePowderBlocked(u32 battlerAtk, u32 battlerDef, u32 move); -bool32 EmergencyExitCanBeTriggered(u32 battler); u32 RestoreWhiteHerbStats(u32 battler); +bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/config/battle.h b/include/config/battle.h index c142fcabe8..0aa37db354 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -157,6 +157,7 @@ // In Gen4, it's 30%. In Gen5+ it has 11% to sleep, 9% chance to poison and 10% chance to paralyze. #define B_PICKUP_WILD GEN_LATEST // In Gen9+, Pickup allows its user to pickup its own used item at the end of the turn in wild battles. #define B_MAGIC_GUARD GEN_LATEST // In Gen4 only, Magic Guard ignores immobilization caused by paralysis +#define B_BATTLE_BOND GEN_LATEST // In Gen9+, Battle Bond increases Atk, SpAtk and Speed by one stage, once per battle // Item settings #define B_HP_BERRIES GEN_LATEST // In Gen4+, berries which restore HP activate immediately after HP drops to half. In Gen3, the effect occurs at the end of the turn. diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 6b6b4b9348..b0cccc2626 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -121,7 +121,6 @@ enum CmdVarious VARIOUS_INSTANT_HP_DROP, VARIOUS_CLEAR_STATUS, VARIOUS_RESTORE_PP, - VARIOUS_TRY_ACTIVATE_MOXIE, VARIOUS_TRY_ACTIVATE_FELL_STINGER, VARIOUS_PLAY_MOVE_ANIMATION, VARIOUS_SET_LUCKY_CHANT, @@ -168,7 +167,6 @@ enum CmdVarious VARIOUS_LOSE_TYPE, VARIOUS_TRY_ACTIVATE_SOULHEART, VARIOUS_TRY_ACTIVATE_RECEIVER, - VARIOUS_TRY_ACTIVATE_BEAST_BOOST, VARIOUS_TRY_FRISK, VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED, VARIOUS_TRY_FAIRY_LOCK, @@ -181,7 +179,6 @@ enum CmdVarious VARIOUS_JUMP_IF_ABSENT, VARIOUS_DESTROY_ABILITY_POPUP, VARIOUS_TOTEM_BOOST, - VARIOUS_TRY_ACTIVATE_GRIM_NEIGH, VARIOUS_MOVEEND_ITEM_EFFECTS, VARIOUS_TERRAIN_SEED, VARIOUS_MAKE_INVISIBLE, @@ -192,7 +189,6 @@ enum CmdVarious VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER, VARIOUS_GET_ROTOTILLER_TARGETS, VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED, - VARIOUS_TRY_ACTIVATE_BATTLE_BOND, VARIOUS_CONSUME_BERRY, VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL, VARIOUS_JUMP_IF_SPECIES, @@ -284,7 +280,7 @@ enum MoveEndEffects MOVEEND_RECOIL, MOVEEND_RAPID_SPIN, MOVEEND_ITEM_EFFECTS_ATTACKER, - MOVEEND_MAGICIAN, // Occurs after final multi-hit strike, and after other items/abilities would activate + MOVEEND_ABILITY_BLOCK, MOVEEND_SHEER_FORCE, // If move is Sheer Force affected, skip until Eject Pack MOVEEND_RED_CARD, // Red Card triggers before Eject Pack MOVEEND_EJECT_BUTTON, diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 16d41f3977..db5ee7b16e 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -467,274 +467,273 @@ #define STRINGID_FRISKACTIVATES 465 #define STRINGID_UNNERVEENTERS 466 #define STRINGID_HARVESTBERRY 467 -#define STRINGID_LASTABILITYRAISEDSTAT 468 -#define STRINGID_MAGICBOUNCEACTIVATES 469 -#define STRINGID_PROTEANTYPECHANGE 470 -#define STRINGID_SYMBIOSISITEMPASS 471 -#define STRINGID_STEALTHROCKDMG 472 -#define STRINGID_TOXICSPIKESABSORBED 473 -#define STRINGID_TOXICSPIKESPOISONED 474 -#define STRINGID_STICKYWEBSWITCHIN 475 -#define STRINGID_HEALINGWISHCAMETRUE 476 -#define STRINGID_HEALINGWISHHEALED 477 -#define STRINGID_LUNARDANCECAMETRUE 478 -#define STRINGID_CUSEDBODYDISABLED 479 -#define STRINGID_ATTACKERACQUIREDABILITY 480 -#define STRINGID_TARGETABILITYSTATLOWER 481 -#define STRINGID_TARGETSTATWONTGOHIGHER 482 -#define STRINGID_PKMNMOVEBOUNCEDABILITY 483 -#define STRINGID_IMPOSTERTRANSFORM 484 -#define STRINGID_ASSAULTVESTDOESNTALLOW 485 -#define STRINGID_GRAVITYPREVENTSUSAGE 486 -#define STRINGID_HEALBLOCKPREVENTSUSAGE 487 -#define STRINGID_NOTDONEYET 488 -#define STRINGID_STICKYWEBUSED 489 -#define STRINGID_QUASHSUCCESS 490 -#define STRINGID_PKMNBLEWAWAYTOXICSPIKES 491 -#define STRINGID_PKMNBLEWAWAYSTICKYWEB 492 -#define STRINGID_PKMNBLEWAWAYSTEALTHROCK 493 -#define STRINGID_IONDELUGEON 494 -#define STRINGID_TOPSYTURVYSWITCHEDSTATS 495 -#define STRINGID_TERRAINBECOMESMISTY 496 -#define STRINGID_TERRAINBECOMESGRASSY 497 -#define STRINGID_TERRAINBECOMESELECTRIC 498 -#define STRINGID_TERRAINBECOMESPSYCHIC 499 -#define STRINGID_TARGETELECTRIFIED 500 -#define STRINGID_MEGAEVOREACTING 501 -#define STRINGID_MEGAEVOEVOLVED 502 -#define STRINGID_DRASTICALLY 503 -#define STRINGID_SEVERELY 504 -#define STRINGID_INFESTATION 505 -#define STRINGID_NOEFFECTONTARGET 506 -#define STRINGID_BURSTINGFLAMESHIT 507 -#define STRINGID_BESTOWITEMGIVING 508 -#define STRINGID_THIRDTYPEADDED 509 -#define STRINGID_FELLFORFEINT 510 -#define STRINGID_POKEMONCANNOTUSEMOVE 511 -#define STRINGID_COVEREDINPOWDER 512 -#define STRINGID_POWDEREXPLODES 513 -#define STRINGID_BELCHCANTSELECT 514 -#define STRINGID_SPECTRALTHIEFSTEAL 515 -#define STRINGID_GRAVITYGROUNDING 516 -#define STRINGID_MISTYTERRAINPREVENTS 517 -#define STRINGID_GRASSYTERRAINHEALS 518 -#define STRINGID_ELECTRICTERRAINPREVENTS 519 -#define STRINGID_PSYCHICTERRAINPREVENTS 520 -#define STRINGID_SAFETYGOGGLESPROTECTED 521 -#define STRINGID_FLOWERVEILPROTECTED 522 -#define STRINGID_SWEETVEILPROTECTED 523 -#define STRINGID_AROMAVEILPROTECTED 524 -#define STRINGID_CELEBRATEMESSAGE 525 -#define STRINGID_USEDINSTRUCTEDMOVE 526 -#define STRINGID_THROATCHOPENDS 527 -#define STRINGID_PKMNCANTUSEMOVETHROATCHOP 528 -#define STRINGID_LASERFOCUS 529 -#define STRINGID_GEMACTIVATES 530 -#define STRINGID_BERRYDMGREDUCES 531 -#define STRINGID_AIRBALLOONFLOAT 532 -#define STRINGID_AIRBALLOONPOP 533 -#define STRINGID_INCINERATEBURN 534 -#define STRINGID_BUGBITE 535 -#define STRINGID_ILLUSIONWOREOFF 536 -#define STRINGID_ATTACKERCUREDTARGETSTATUS 537 -#define STRINGID_ATTACKERLOSTFIRETYPE 538 -#define STRINGID_HEALERCURE 539 -#define STRINGID_SCRIPTINGABILITYSTATRAISE 540 -#define STRINGID_RECEIVERABILITYTAKEOVER 541 -#define STRINGID_PKNMABSORBINGPOWER 542 -#define STRINGID_NOONEWILLBEABLETORUNAWAY 543 -#define STRINGID_DESTINYKNOTACTIVATES 544 -#define STRINGID_CLOAKEDINAFREEZINGLIGHT 545 -#define STRINGID_CLEARAMULETWONTLOWERSTATS 546 -#define STRINGID_FERVENTWISHREACHED 547 -#define STRINGID_AIRLOCKACTIVATES 548 -#define STRINGID_PRESSUREENTERS 549 -#define STRINGID_DARKAURAENTERS 550 -#define STRINGID_FAIRYAURAENTERS 551 -#define STRINGID_AURABREAKENTERS 552 -#define STRINGID_COMATOSEENTERS 553 -#define STRINGID_SCREENCLEANERENTERS 554 -#define STRINGID_FETCHEDPOKEBALL 555 -#define STRINGID_BATTLERABILITYRAISEDSTAT 556 -#define STRINGID_ASANDSTORMKICKEDUP 557 -#define STRINGID_PKMNSWILLPERISHIN3TURNS 558 -#define STRINGID_ABILITYRAISEDSTATDRASTICALLY 559 -#define STRINGID_AURAFLAREDTOLIFE 560 -#define STRINGID_ASONEENTERS 561 -#define STRINGID_CURIOUSMEDICINEENTERS 562 -#define STRINGID_CANACTFASTERTHANKSTO 563 -#define STRINGID_MICLEBERRYACTIVATES 564 -#define STRINGID_PKMNSHOOKOFFTHETAUNT 565 -#define STRINGID_PKMNGOTOVERITSINFATUATION 566 -#define STRINGID_ITEMCANNOTBEREMOVED 567 -#define STRINGID_STICKYBARBTRANSFER 568 -#define STRINGID_PKMNBURNHEALED 569 -#define STRINGID_REDCARDACTIVATE 570 -#define STRINGID_EJECTBUTTONACTIVATE 571 -#define STRINGID_ATKGOTOVERINFATUATION 572 -#define STRINGID_TORMENTEDNOMORE 573 -#define STRINGID_HEALBLOCKEDNOMORE 574 -#define STRINGID_ATTACKERBECAMEFULLYCHARGED 575 -#define STRINGID_ATTACKERBECAMEASHSPECIES 576 -#define STRINGID_EXTREMELYHARSHSUNLIGHT 577 -#define STRINGID_EXTREMESUNLIGHTFADED 578 -#define STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT 579 -#define STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED 580 -#define STRINGID_HEAVYRAIN 581 -#define STRINGID_HEAVYRAINLIFTED 582 -#define STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN 583 -#define STRINGID_NORELIEFROMHEAVYRAIN 584 -#define STRINGID_MYSTERIOUSAIRCURRENT 585 -#define STRINGID_STRONGWINDSDISSIPATED 586 -#define STRINGID_MYSTERIOUSAIRCURRENTBLOWSON 587 -#define STRINGID_ATTACKWEAKENEDBSTRONGWINDS 588 -#define STRINGID_STUFFCHEEKSCANTSELECT 589 -#define STRINGID_PKMNREVERTEDTOPRIMAL 590 -#define STRINGID_BUTPOKEMONCANTUSETHEMOVE 591 -#define STRINGID_BUTHOOPACANTUSEIT 592 -#define STRINGID_BROKETHROUGHPROTECTION 593 -#define STRINGID_ABILITYALLOWSONLYMOVE 594 -#define STRINGID_SWAPPEDABILITIES 595 -#define STRINGID_PASTELVEILPROTECTED 596 -#define STRINGID_PASTELVEILENTERS 597 -#define STRINGID_BATTLERTYPECHANGEDTO 598 -#define STRINGID_BOTHCANNOLONGERESCAPE 599 -#define STRINGID_CANTESCAPEDUETOUSEDMOVE 600 -#define STRINGID_PKMNBECAMEWEAKERTOFIRE 601 -#define STRINGID_ABOUTTOUSEPOLTERGEIST 602 -#define STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE 603 -#define STRINGID_NEUTRALIZINGGASENTERS 604 -#define STRINGID_NEUTRALIZINGGASOVER 605 -#define STRINGID_TARGETTOOHEAVY 606 -#define STRINGID_PKMNTOOKTARGETHIGH 607 -#define STRINGID_PKMNINSNAPTRAP 608 -#define STRINGID_METEORBEAMCHARGING 609 -#define STRINGID_HEATUPBEAK 610 -#define STRINGID_COURTCHANGE 611 -#define STRINGID_PLAYERLOSTTOENEMYTRAINER 612 -#define STRINGID_PLAYERPAIDPRIZEMONEY 613 -#define STRINGID_ZPOWERSURROUNDS 614 -#define STRINGID_ZMOVEUNLEASHED 615 -#define STRINGID_ZMOVERESETSSTATS 616 -#define STRINGID_ZMOVEALLSTATSUP 617 -#define STRINGID_ZMOVEZBOOSTCRIT 618 -#define STRINGID_ZMOVERESTOREHP 619 -#define STRINGID_ZMOVESTATUP 620 -#define STRINGID_ZMOVEHPTRAP 621 -#define STRINGID_ATTACKEREXPELLEDTHEPOISON 622 -#define STRINGID_ATTACKERSHOOKITSELFAWAKE 623 -#define STRINGID_ATTACKERBROKETHROUGHPARALYSIS 624 -#define STRINGID_ATTACKERHEALEDITSBURN 625 -#define STRINGID_ATTACKERMELTEDTHEICE 626 -#define STRINGID_TARGETTOUGHEDITOUT 627 -#define STRINGID_ATTACKERLOSTELECTRICTYPE 628 -#define STRINGID_ATTACKERSWITCHEDSTATWITHTARGET 629 -#define STRINGID_BEINGHITCHARGEDPKMNWITHPOWER 630 -#define STRINGID_SUNLIGHTACTIVATEDABILITY 631 -#define STRINGID_STATWASHEIGHTENED 632 -#define STRINGID_ELECTRICTERRAINACTIVATEDABILITY 633 -#define STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT 634 -#define STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN 635 -#define STRINGID_PKMNSABILITYPREVENTSABILITY 636 -#define STRINGID_PREPARESHELLTRAP 637 -#define STRINGID_SHELLTRAPDIDNTWORK 638 -#define STRINGID_SPIKESDISAPPEAREDFROMTEAM 639 -#define STRINGID_TOXICSPIKESDISAPPEAREDFROMTEAM 640 -#define STRINGID_STICKYWEBDISAPPEAREDFROMTEAM 641 -#define STRINGID_STEALTHROCKDISAPPEAREDFROMTEAM 642 -#define STRINGID_COULDNTFULLYPROTECT 643 -#define STRINGID_STOCKPILEDEFFECTWOREOFF 644 -#define STRINGID_PKMNREVIVEDREADYTOFIGHT 645 -#define STRINGID_ITEMRESTOREDSPECIESHEALTH 646 -#define STRINGID_ITEMCUREDSPECIESSTATUS 647 -#define STRINGID_ITEMRESTOREDSPECIESPP 648 -#define STRINGID_THUNDERCAGETRAPPED 649 -#define STRINGID_PKMNHURTBYFROSTBITE 650 -#define STRINGID_PKMNGOTFROSTBITE 651 -#define STRINGID_PKMNSITEMHEALEDFROSTBITE 652 -#define STRINGID_ATTACKERHEALEDITSFROSTBITE 653 -#define STRINGID_PKMNFROSTBITEHEALED 654 -#define STRINGID_PKMNFROSTBITEHEALED2 655 -#define STRINGID_PKMNFROSTBITEHEALEDBY 656 -#define STRINGID_MIRRORHERBCOPIED 657 -#define STRINGID_STARTEDSNOW 658 -#define STRINGID_SNOWCONTINUES 659 -#define STRINGID_SNOWSTOPPED 660 -#define STRINGID_SNOWWARNINGSNOW 661 -#define STRINGID_PKMNITEMMELTED 662 -#define STRINGID_ULTRABURSTREACTING 663 -#define STRINGID_ULTRABURSTCOMPLETED 664 -#define STRINGID_TEAMGAINEDEXP 665 -#define STRINGID_CURRENTMOVECANTSELECT 666 -#define STRINGID_TARGETISBEINGSALTCURED 667 -#define STRINGID_TARGETISHURTBYSALTCURE 668 -#define STRINGID_TARGETCOVEREDINSTICKYCANDYSYRUP 669 -#define STRINGID_SHARPSTEELFLOATS 670 -#define STRINGID_SHARPSTEELDMG 671 -#define STRINGID_PKMNBLEWAWAYSHARPSTEEL 672 -#define STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM 673 -#define STRINGID_TEAMTRAPPEDWITHVINES 674 -#define STRINGID_PKMNHURTBYVINES 675 -#define STRINGID_TEAMCAUGHTINVORTEX 676 -#define STRINGID_PKMNHURTBYVORTEX 677 -#define STRINGID_TEAMSURROUNDEDBYFIRE 678 -#define STRINGID_PKMNBURNINGUP 679 -#define STRINGID_TEAMSURROUNDEDBYROCKS 680 -#define STRINGID_PKMNHURTBYROCKSTHROWN 681 -#define STRINGID_MOVEBLOCKEDBYDYNAMAX 682 -#define STRINGID_ZEROTOHEROTRANSFORMATION 683 -#define STRINGID_THETWOMOVESBECOMEONE 684 -#define STRINGID_ARAINBOWAPPEAREDONSIDE 685 -#define STRINGID_THERAINBOWDISAPPEARED 686 -#define STRINGID_WAITINGFORPARTNERSMOVE 687 -#define STRINGID_SEAOFFIREENVELOPEDSIDE 688 -#define STRINGID_HURTBYTHESEAOFFIRE 689 -#define STRINGID_THESEAOFFIREDISAPPEARED 690 -#define STRINGID_SWAMPENVELOPEDSIDE 691 -#define STRINGID_THESWAMPDISAPPEARED 692 -#define STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE 693 -#define STRINGID_HOSPITALITYRESTORATION 694 -#define STRINGID_ELECTROSHOTCHARGING 695 -#define STRINGID_ITEMWASUSEDUP 696 -#define STRINGID_ATTACKERLOSTITSTYPE 697 -#define STRINGID_SHEDITSTAIL 698 -#define STRINGID_CLOAKEDINAHARSHLIGHT 699 -#define STRINGID_SUPERSWEETAROMAWAFTS 700 -#define STRINGID_DIMENSIONSWERETWISTED 701 -#define STRINGID_BIZARREARENACREATED 702 -#define STRINGID_BIZARREAREACREATED 703 -#define STRINGID_TIDYINGUPCOMPLETE 704 -#define STRINGID_PKMNTERASTALLIZEDINTO 705 -#define STRINGID_BOOSTERENERGYACTIVATES 706 -#define STRINGID_FOGCREPTUP 707 -#define STRINGID_FOGISDEEP 708 -#define STRINGID_FOGLIFTED 709 -#define STRINGID_PKMNMADESHELLGLEAM 710 -#define STRINGID_FICKLEBEAMDOUBLED 711 -#define STRINGID_COMMANDERACTIVATES 712 -#define STRINGID_POKEFLUTECATCHY 713 -#define STRINGID_POKEFLUTE 714 -#define STRINGID_MONHEARINGFLUTEAWOKE 715 -#define STRINGID_SUNLIGHTISHARSH 716 -#define STRINGID_ITISHAILING 717 -#define STRINGID_ITISSNOWING 718 -#define STRINGID_ISCOVEREDWITHGRASS 719 -#define STRINGID_MISTSWIRLSAROUND 720 -#define STRINGID_ELECTRICCURRENTISRUNNING 721 -#define STRINGID_SEEMSWEIRD 722 -#define STRINGID_WAGGLINGAFINGER 723 -#define STRINGID_BLOCKEDBYSLEEPCLAUSE 724 -#define STRINGID_SUPEREFFECTIVETWOFOES 725 -#define STRINGID_NOTVERYEFFECTIVETWOFOES 726 -#define STRINGID_ITDOESNTAFFECTTWOFOES 727 -#define STRINGID_SENDCAUGHTMONPARTYORBOX 728 -#define STRINGID_PKMNSENTTOPCAFTERCATCH 729 -#define STRINGID_PKMNDYNAMAXED 730 -#define STRINGID_PKMNGIGANTAMAXED 731 -#define STRINGID_TIMETODYNAMAX 732 -#define STRINGID_TIMETOGIGANTAMAX 733 +#define STRINGID_MAGICBOUNCEACTIVATES 468 +#define STRINGID_PROTEANTYPECHANGE 469 +#define STRINGID_SYMBIOSISITEMPASS 470 +#define STRINGID_STEALTHROCKDMG 471 +#define STRINGID_TOXICSPIKESABSORBED 472 +#define STRINGID_TOXICSPIKESPOISONED 473 +#define STRINGID_STICKYWEBSWITCHIN 474 +#define STRINGID_HEALINGWISHCAMETRUE 475 +#define STRINGID_HEALINGWISHHEALED 476 +#define STRINGID_LUNARDANCECAMETRUE 477 +#define STRINGID_CUSEDBODYDISABLED 478 +#define STRINGID_ATTACKERACQUIREDABILITY 479 +#define STRINGID_TARGETABILITYSTATLOWER 480 +#define STRINGID_TARGETSTATWONTGOHIGHER 481 +#define STRINGID_PKMNMOVEBOUNCEDABILITY 482 +#define STRINGID_IMPOSTERTRANSFORM 483 +#define STRINGID_ASSAULTVESTDOESNTALLOW 484 +#define STRINGID_GRAVITYPREVENTSUSAGE 485 +#define STRINGID_HEALBLOCKPREVENTSUSAGE 486 +#define STRINGID_NOTDONEYET 487 +#define STRINGID_STICKYWEBUSED 488 +#define STRINGID_QUASHSUCCESS 489 +#define STRINGID_PKMNBLEWAWAYTOXICSPIKES 490 +#define STRINGID_PKMNBLEWAWAYSTICKYWEB 491 +#define STRINGID_PKMNBLEWAWAYSTEALTHROCK 492 +#define STRINGID_IONDELUGEON 493 +#define STRINGID_TOPSYTURVYSWITCHEDSTATS 494 +#define STRINGID_TERRAINBECOMESMISTY 495 +#define STRINGID_TERRAINBECOMESGRASSY 496 +#define STRINGID_TERRAINBECOMESELECTRIC 497 +#define STRINGID_TERRAINBECOMESPSYCHIC 498 +#define STRINGID_TARGETELECTRIFIED 499 +#define STRINGID_MEGAEVOREACTING 500 +#define STRINGID_MEGAEVOEVOLVED 501 +#define STRINGID_DRASTICALLY 502 +#define STRINGID_SEVERELY 503 +#define STRINGID_INFESTATION 504 +#define STRINGID_NOEFFECTONTARGET 505 +#define STRINGID_BURSTINGFLAMESHIT 506 +#define STRINGID_BESTOWITEMGIVING 507 +#define STRINGID_THIRDTYPEADDED 508 +#define STRINGID_FELLFORFEINT 509 +#define STRINGID_POKEMONCANNOTUSEMOVE 510 +#define STRINGID_COVEREDINPOWDER 511 +#define STRINGID_POWDEREXPLODES 512 +#define STRINGID_BELCHCANTSELECT 513 +#define STRINGID_SPECTRALTHIEFSTEAL 514 +#define STRINGID_GRAVITYGROUNDING 515 +#define STRINGID_MISTYTERRAINPREVENTS 516 +#define STRINGID_GRASSYTERRAINHEALS 517 +#define STRINGID_ELECTRICTERRAINPREVENTS 518 +#define STRINGID_PSYCHICTERRAINPREVENTS 519 +#define STRINGID_SAFETYGOGGLESPROTECTED 520 +#define STRINGID_FLOWERVEILPROTECTED 521 +#define STRINGID_SWEETVEILPROTECTED 522 +#define STRINGID_AROMAVEILPROTECTED 523 +#define STRINGID_CELEBRATEMESSAGE 524 +#define STRINGID_USEDINSTRUCTEDMOVE 525 +#define STRINGID_THROATCHOPENDS 526 +#define STRINGID_PKMNCANTUSEMOVETHROATCHOP 527 +#define STRINGID_LASERFOCUS 528 +#define STRINGID_GEMACTIVATES 529 +#define STRINGID_BERRYDMGREDUCES 530 +#define STRINGID_AIRBALLOONFLOAT 531 +#define STRINGID_AIRBALLOONPOP 532 +#define STRINGID_INCINERATEBURN 533 +#define STRINGID_BUGBITE 534 +#define STRINGID_ILLUSIONWOREOFF 535 +#define STRINGID_ATTACKERCUREDTARGETSTATUS 536 +#define STRINGID_ATTACKERLOSTFIRETYPE 537 +#define STRINGID_HEALERCURE 538 +#define STRINGID_SCRIPTINGABILITYSTATRAISE 539 +#define STRINGID_RECEIVERABILITYTAKEOVER 540 +#define STRINGID_PKNMABSORBINGPOWER 541 +#define STRINGID_NOONEWILLBEABLETORUNAWAY 542 +#define STRINGID_DESTINYKNOTACTIVATES 543 +#define STRINGID_CLOAKEDINAFREEZINGLIGHT 544 +#define STRINGID_CLEARAMULETWONTLOWERSTATS 545 +#define STRINGID_FERVENTWISHREACHED 546 +#define STRINGID_AIRLOCKACTIVATES 547 +#define STRINGID_PRESSUREENTERS 548 +#define STRINGID_DARKAURAENTERS 549 +#define STRINGID_FAIRYAURAENTERS 550 +#define STRINGID_AURABREAKENTERS 551 +#define STRINGID_COMATOSEENTERS 552 +#define STRINGID_SCREENCLEANERENTERS 553 +#define STRINGID_FETCHEDPOKEBALL 554 +#define STRINGID_BATTLERABILITYRAISEDSTAT 555 +#define STRINGID_ASANDSTORMKICKEDUP 556 +#define STRINGID_PKMNSWILLPERISHIN3TURNS 557 +#define STRINGID_ABILITYRAISEDSTATDRASTICALLY 558 +#define STRINGID_AURAFLAREDTOLIFE 559 +#define STRINGID_ASONEENTERS 560 +#define STRINGID_CURIOUSMEDICINEENTERS 561 +#define STRINGID_CANACTFASTERTHANKSTO 562 +#define STRINGID_MICLEBERRYACTIVATES 563 +#define STRINGID_PKMNSHOOKOFFTHETAUNT 564 +#define STRINGID_PKMNGOTOVERITSINFATUATION 565 +#define STRINGID_ITEMCANNOTBEREMOVED 566 +#define STRINGID_STICKYBARBTRANSFER 567 +#define STRINGID_PKMNBURNHEALED 568 +#define STRINGID_REDCARDACTIVATE 569 +#define STRINGID_EJECTBUTTONACTIVATE 570 +#define STRINGID_ATKGOTOVERINFATUATION 571 +#define STRINGID_TORMENTEDNOMORE 572 +#define STRINGID_HEALBLOCKEDNOMORE 573 +#define STRINGID_ATTACKERBECAMEFULLYCHARGED 574 +#define STRINGID_ATTACKERBECAMEASHSPECIES 575 +#define STRINGID_EXTREMELYHARSHSUNLIGHT 576 +#define STRINGID_EXTREMESUNLIGHTFADED 577 +#define STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT 578 +#define STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED 579 +#define STRINGID_HEAVYRAIN 580 +#define STRINGID_HEAVYRAINLIFTED 581 +#define STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN 582 +#define STRINGID_NORELIEFROMHEAVYRAIN 583 +#define STRINGID_MYSTERIOUSAIRCURRENT 584 +#define STRINGID_STRONGWINDSDISSIPATED 585 +#define STRINGID_MYSTERIOUSAIRCURRENTBLOWSON 586 +#define STRINGID_ATTACKWEAKENEDBSTRONGWINDS 587 +#define STRINGID_STUFFCHEEKSCANTSELECT 588 +#define STRINGID_PKMNREVERTEDTOPRIMAL 589 +#define STRINGID_BUTPOKEMONCANTUSETHEMOVE 590 +#define STRINGID_BUTHOOPACANTUSEIT 591 +#define STRINGID_BROKETHROUGHPROTECTION 592 +#define STRINGID_ABILITYALLOWSONLYMOVE 593 +#define STRINGID_SWAPPEDABILITIES 594 +#define STRINGID_PASTELVEILPROTECTED 595 +#define STRINGID_PASTELVEILENTERS 596 +#define STRINGID_BATTLERTYPECHANGEDTO 597 +#define STRINGID_BOTHCANNOLONGERESCAPE 598 +#define STRINGID_CANTESCAPEDUETOUSEDMOVE 599 +#define STRINGID_PKMNBECAMEWEAKERTOFIRE 600 +#define STRINGID_ABOUTTOUSEPOLTERGEIST 601 +#define STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE 602 +#define STRINGID_NEUTRALIZINGGASENTERS 603 +#define STRINGID_NEUTRALIZINGGASOVER 604 +#define STRINGID_TARGETTOOHEAVY 605 +#define STRINGID_PKMNTOOKTARGETHIGH 606 +#define STRINGID_PKMNINSNAPTRAP 607 +#define STRINGID_METEORBEAMCHARGING 608 +#define STRINGID_HEATUPBEAK 609 +#define STRINGID_COURTCHANGE 610 +#define STRINGID_PLAYERLOSTTOENEMYTRAINER 611 +#define STRINGID_PLAYERPAIDPRIZEMONEY 612 +#define STRINGID_ZPOWERSURROUNDS 613 +#define STRINGID_ZMOVEUNLEASHED 614 +#define STRINGID_ZMOVERESETSSTATS 615 +#define STRINGID_ZMOVEALLSTATSUP 616 +#define STRINGID_ZMOVEZBOOSTCRIT 617 +#define STRINGID_ZMOVERESTOREHP 618 +#define STRINGID_ZMOVESTATUP 619 +#define STRINGID_ZMOVEHPTRAP 620 +#define STRINGID_ATTACKEREXPELLEDTHEPOISON 621 +#define STRINGID_ATTACKERSHOOKITSELFAWAKE 622 +#define STRINGID_ATTACKERBROKETHROUGHPARALYSIS 623 +#define STRINGID_ATTACKERHEALEDITSBURN 624 +#define STRINGID_ATTACKERMELTEDTHEICE 625 +#define STRINGID_TARGETTOUGHEDITOUT 626 +#define STRINGID_ATTACKERLOSTELECTRICTYPE 627 +#define STRINGID_ATTACKERSWITCHEDSTATWITHTARGET 628 +#define STRINGID_BEINGHITCHARGEDPKMNWITHPOWER 629 +#define STRINGID_SUNLIGHTACTIVATEDABILITY 630 +#define STRINGID_STATWASHEIGHTENED 631 +#define STRINGID_ELECTRICTERRAINACTIVATEDABILITY 632 +#define STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT 633 +#define STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN 634 +#define STRINGID_PKMNSABILITYPREVENTSABILITY 635 +#define STRINGID_PREPARESHELLTRAP 636 +#define STRINGID_SHELLTRAPDIDNTWORK 637 +#define STRINGID_SPIKESDISAPPEAREDFROMTEAM 638 +#define STRINGID_TOXICSPIKESDISAPPEAREDFROMTEAM 639 +#define STRINGID_STICKYWEBDISAPPEAREDFROMTEAM 640 +#define STRINGID_STEALTHROCKDISAPPEAREDFROMTEAM 641 +#define STRINGID_COULDNTFULLYPROTECT 642 +#define STRINGID_STOCKPILEDEFFECTWOREOFF 643 +#define STRINGID_PKMNREVIVEDREADYTOFIGHT 644 +#define STRINGID_ITEMRESTOREDSPECIESHEALTH 645 +#define STRINGID_ITEMCUREDSPECIESSTATUS 646 +#define STRINGID_ITEMRESTOREDSPECIESPP 647 +#define STRINGID_THUNDERCAGETRAPPED 648 +#define STRINGID_PKMNHURTBYFROSTBITE 649 +#define STRINGID_PKMNGOTFROSTBITE 650 +#define STRINGID_PKMNSITEMHEALEDFROSTBITE 651 +#define STRINGID_ATTACKERHEALEDITSFROSTBITE 652 +#define STRINGID_PKMNFROSTBITEHEALED 653 +#define STRINGID_PKMNFROSTBITEHEALED2 654 +#define STRINGID_PKMNFROSTBITEHEALEDBY 655 +#define STRINGID_MIRRORHERBCOPIED 656 +#define STRINGID_STARTEDSNOW 657 +#define STRINGID_SNOWCONTINUES 658 +#define STRINGID_SNOWSTOPPED 659 +#define STRINGID_SNOWWARNINGSNOW 660 +#define STRINGID_PKMNITEMMELTED 661 +#define STRINGID_ULTRABURSTREACTING 662 +#define STRINGID_ULTRABURSTCOMPLETED 663 +#define STRINGID_TEAMGAINEDEXP 664 +#define STRINGID_CURRENTMOVECANTSELECT 665 +#define STRINGID_TARGETISBEINGSALTCURED 666 +#define STRINGID_TARGETISHURTBYSALTCURE 667 +#define STRINGID_TARGETCOVEREDINSTICKYCANDYSYRUP 668 +#define STRINGID_SHARPSTEELFLOATS 669 +#define STRINGID_SHARPSTEELDMG 670 +#define STRINGID_PKMNBLEWAWAYSHARPSTEEL 671 +#define STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM 672 +#define STRINGID_TEAMTRAPPEDWITHVINES 673 +#define STRINGID_PKMNHURTBYVINES 674 +#define STRINGID_TEAMCAUGHTINVORTEX 675 +#define STRINGID_PKMNHURTBYVORTEX 676 +#define STRINGID_TEAMSURROUNDEDBYFIRE 677 +#define STRINGID_PKMNBURNINGUP 678 +#define STRINGID_TEAMSURROUNDEDBYROCKS 679 +#define STRINGID_PKMNHURTBYROCKSTHROWN 680 +#define STRINGID_MOVEBLOCKEDBYDYNAMAX 681 +#define STRINGID_ZEROTOHEROTRANSFORMATION 682 +#define STRINGID_THETWOMOVESBECOMEONE 683 +#define STRINGID_ARAINBOWAPPEAREDONSIDE 684 +#define STRINGID_THERAINBOWDISAPPEARED 685 +#define STRINGID_WAITINGFORPARTNERSMOVE 686 +#define STRINGID_SEAOFFIREENVELOPEDSIDE 687 +#define STRINGID_HURTBYTHESEAOFFIRE 688 +#define STRINGID_THESEAOFFIREDISAPPEARED 689 +#define STRINGID_SWAMPENVELOPEDSIDE 690 +#define STRINGID_THESWAMPDISAPPEARED 691 +#define STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE 692 +#define STRINGID_HOSPITALITYRESTORATION 693 +#define STRINGID_ELECTROSHOTCHARGING 694 +#define STRINGID_ITEMWASUSEDUP 695 +#define STRINGID_ATTACKERLOSTITSTYPE 696 +#define STRINGID_SHEDITSTAIL 697 +#define STRINGID_CLOAKEDINAHARSHLIGHT 698 +#define STRINGID_SUPERSWEETAROMAWAFTS 699 +#define STRINGID_DIMENSIONSWERETWISTED 700 +#define STRINGID_BIZARREARENACREATED 701 +#define STRINGID_BIZARREAREACREATED 702 +#define STRINGID_TIDYINGUPCOMPLETE 703 +#define STRINGID_PKMNTERASTALLIZEDINTO 704 +#define STRINGID_BOOSTERENERGYACTIVATES 705 +#define STRINGID_FOGCREPTUP 706 +#define STRINGID_FOGISDEEP 707 +#define STRINGID_FOGLIFTED 708 +#define STRINGID_PKMNMADESHELLGLEAM 709 +#define STRINGID_FICKLEBEAMDOUBLED 710 +#define STRINGID_COMMANDERACTIVATES 711 +#define STRINGID_POKEFLUTECATCHY 712 +#define STRINGID_POKEFLUTE 713 +#define STRINGID_MONHEARINGFLUTEAWOKE 714 +#define STRINGID_SUNLIGHTISHARSH 715 +#define STRINGID_ITISHAILING 716 +#define STRINGID_ITISSNOWING 717 +#define STRINGID_ISCOVEREDWITHGRASS 718 +#define STRINGID_MISTSWIRLSAROUND 719 +#define STRINGID_ELECTRICCURRENTISRUNNING 720 +#define STRINGID_SEEMSWEIRD 721 +#define STRINGID_WAGGLINGAFINGER 722 +#define STRINGID_BLOCKEDBYSLEEPCLAUSE 723 +#define STRINGID_SUPEREFFECTIVETWOFOES 724 +#define STRINGID_NOTVERYEFFECTIVETWOFOES 725 +#define STRINGID_ITDOESNTAFFECTTWOFOES 726 +#define STRINGID_SENDCAUGHTMONPARTYORBOX 727 +#define STRINGID_PKMNSENTTOPCAFTERCATCH 728 +#define STRINGID_PKMNDYNAMAXED 729 +#define STRINGID_PKMNGIGANTAMAXED 730 +#define STRINGID_TIMETODYNAMAX 731 +#define STRINGID_TIMETOGIGANTAMAX 732 -#define BATTLESTRINGS_COUNT 734 +#define BATTLESTRINGS_COUNT 733 // 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/include/constants/generational_changes.h b/include/constants/generational_changes.h index e9653d26d5..dea3b3bf9c 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -12,6 +12,7 @@ enum GenConfigTag GEN_CONFIG_GALE_WINGS, GEN_CONFIG_HEAL_BELL_SOUNDPROOF, GEN_CONFIG_TELEPORT_BEHAVIOR, + GEN_CONFIG_BATTLE_BOND, GEN_CONFIG_COUNT }; diff --git a/include/generational_changes.h b/include/generational_changes.h index 1aad93f915..41198c394d 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -15,6 +15,7 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] = [GEN_CONFIG_GALE_WINGS] = B_GALE_WINGS, [GEN_CONFIG_HEAL_BELL_SOUNDPROOF] = B_HEAL_BELL_SOUNDPROOF, [GEN_CONFIG_TELEPORT_BEHAVIOR] = B_TELEPORT_BEHAVIOR, + [GEN_CONFIG_BATTLE_BOND] = B_BATTLE_BOND, }; #if TESTING diff --git a/src/battle_message.c b/src/battle_message.c index 8b0f424d86..ccc6ff8963 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -631,7 +631,6 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_FRISKACTIVATES] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} frisked {B_DEF_NAME_WITH_PREFIX2} and found its {B_LAST_ITEM}!"), [STRINGID_UNNERVEENTERS] = COMPOUND_STRING("{B_DEF_TEAM1} team is too nervous to eat Berries!"), [STRINGID_HARVESTBERRY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} harvested its {B_LAST_ITEM}!"), - [STRINGID_LASTABILITYRAISEDSTAT] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} raised its {B_BUFF1}!"), [STRINGID_MAGICBOUNCEACTIVATES] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} bounced the {B_ATK_NAME_WITH_PREFIX2} back!"), [STRINGID_PROTEANTYPECHANGE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} transformed it into the {B_BUFF1} type!"), [STRINGID_SYMBIOSISITEMPASS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} passed its {B_LAST_ITEM} to {B_EFF_NAME_WITH_PREFIX2} through {B_LAST_ABILITY}!"), diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d8bf9d8323..4e9a588d47 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1153,6 +1153,85 @@ bool32 IsMoveNotAllowedInSkyBattles(u32 move) return (gBattleStruct->isSkyBattle && IsMoveSkyBattleBanned(gCurrentMove)); } +u32 NumAffectedSpreadMoveTargets(void) +{ + u32 targetCount = 1; + + if (!IsDoubleSpreadMove()) + return targetCount; + + targetCount = 0; + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)) + targetCount++; + } + + return targetCount; +} + +u32 NumFaintedBattlersByAttacker(u32 battlerAtk) +{ + u32 numMonsFainted = 0; + + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (battler == battlerAtk) + continue; + + if (IsBattlerTurnDamaged(battler) && !IsBattlerAlive(battler)) + numMonsFainted++; + } + + return numMonsFainted; +} + +bool32 IsMovePowderBlocked(u32 battlerAtk, u32 battlerDef, u32 move) +{ + bool32 effect = FALSE; + + if (IsPowderMove(move) && (battlerAtk != battlerDef)) + { + if (B_POWDER_GRASS >= GEN_6 + && (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) || GetBattlerAbility(battlerDef) == ABILITY_OVERCOAT)) + { + gBattlerAbility = battlerDef; + RecordAbilityBattle(gBattlerTarget, ABILITY_OVERCOAT); + effect = TRUE; + } + else if (GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_SAFETY_GOGGLES) + { + RecordItemEffectBattle(battlerDef, HOLD_EFFECT_SAFETY_GOGGLES); + gLastUsedItem = gBattleMons[battlerDef].item; + effect = TRUE; + } + + if (effect) + gBattlescriptCurrInstr = BattleScript_PowderMoveNoEffect; + } + + return effect; +} + +bool32 EmergencyExitCanBeTriggered(u32 battler) +{ + u32 ability = GetBattlerAbility(battler); + + if (ability != ABILITY_EMERGENCY_EXIT && ability != ABILITY_WIMP_OUT) + return FALSE; + + if (IsBattlerTurnDamaged(battler) + && IsBattlerAlive(battler) + && HadMoreThanHalfHpNowDoesnt(battler) + && (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) + && !(gBattleTypeFlags & BATTLE_TYPE_ARENA) + && CountUsablePartyMons(battler) > 0 + && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) + return TRUE; + + return FALSE; +} + static void Cmd_attackcanceler(void) { CMD_ARGS(); @@ -6221,6 +6300,133 @@ static inline bool32 CanEjectPackTrigger(u32 battlerAtk, u32 battlerDef, u32 mov return FALSE; } +static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move) +{ + u32 effect = FALSE; + u32 abilityAtk = GetBattlerAbility(battlerAtk); + + switch (abilityAtk) + { + case ABILITY_MAGICIAN: + if (move != MOVE_FLING && move != MOVE_NATURAL_GIFT + && gBattleMons[battlerAtk].item == ITEM_NONE + && gBattleMons[battlerDef].item != ITEM_NONE + && IsBattlerAlive(battlerAtk) + && IsBattlerTurnDamaged(battlerDef) + && CanStealItem(battlerAtk, battlerDef, gBattleMons[battlerDef].item) + && !gSpecialStatuses[battlerAtk].gemBoost // In base game, gems are consumed after magician would activate. + && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(battlerDef)] & (1u << gBattlerPartyIndexes[battlerDef])) + && !DoesSubstituteBlockMove(battlerAtk, battlerDef, move) + && (GetBattlerAbility(battlerDef) != ABILITY_STICKY_HOLD || !IsBattlerAlive(battlerDef))) + { + StealTargetItem(battlerAtk, battlerDef); + gBattleScripting.battler = gBattlerAbility = battlerAtk; + gEffectBattler = battlerDef; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MagicianActivates; + gSpecialStatuses[battlerAtk].preventLifeOrbDamage = TRUE; + effect = TRUE; + } + break; + case ABILITY_MOXIE: + case ABILITY_CHILLING_NEIGH: + case ABILITY_AS_ONE_ICE_RIDER: + case ABILITY_GRIM_NEIGH: + case ABILITY_AS_ONE_SHADOW_RIDER: + case ABILITY_BEAST_BOOST: + { + if (!IsBattlerAlive(battlerAtk) || NoAliveMonsForEitherParty()) + break; + + u32 stat = STAT_ATK; + u32 numMonsFainted = NumFaintedBattlersByAttacker(battlerAtk); + + if (abilityAtk == ABILITY_BEAST_BOOST) + stat = GetHighestStatId(battlerAtk); + else if (abilityAtk == ABILITY_GRIM_NEIGH || abilityAtk == ABILITY_AS_ONE_SHADOW_RIDER) + stat = STAT_SPATK; + + if (numMonsFainted && CompareStat(battlerAtk, stat, MAX_STAT_STAGE, CMP_LESS_THAN)) + { + gLastUsedAbility = abilityAtk; + if (abilityAtk == ABILITY_AS_ONE_ICE_RIDER) + gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_CHILLING_NEIGH; + else if (abilityAtk == ABILITY_AS_ONE_SHADOW_RIDER) + gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_GRIM_NEIGH; + + SET_STATCHANGER(stat, numMonsFainted, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); + gBattleScripting.animArg1 = GET_STAT_BUFF_ID(stat) + (numMonsFainted > 1 ? STAT_ANIM_PLUS2 : STAT_ANIM_PLUS1); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget; + effect = TRUE; + } + } + break; + case ABILITY_BATTLE_BOND: + { + if (!IsBattlerAlive(battlerAtk) + || NoAliveMonsForEitherParty() + || NumFaintedBattlersByAttacker(battlerAtk) == 0) + break; + + u32 side = GetBattlerSide(battlerAtk); + + if (gBattleStruct->battleBondBoost[side] & (1u << gBattlerPartyIndexes[battlerAtk])) + break; + + + if (GetGenConfig(GEN_CONFIG_BATTLE_BOND) < GEN_9 && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_BATTLE_BOND) + { + // TODO: Convert this to a proper FORM_CHANGE type. + gLastUsedAbility = abilityAtk; + gBattleStruct->battleBondBoost[side] |= 1u << gBattlerPartyIndexes[battlerAtk]; + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[battlerAtk].species); + gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battlerAtk]] = gBattleMons[battlerAtk].species; + gBattleMons[battlerAtk].species = SPECIES_GRENINJA_ASH; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BattleBondActivatesOnMoveEndAttacker; + effect = TRUE; + } + else + { + u32 numStatBuffs = 0; + if (CompareStat(battlerAtk, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + { + gBattleScripting.animArg1 = GET_STAT_BUFF_ID(STAT_ATK) + STAT_ANIM_PLUS1; + numStatBuffs++; + } + if (CompareStat(battlerAtk, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + { + gBattleScripting.animArg1 = GET_STAT_BUFF_ID(STAT_SPATK) + STAT_ANIM_PLUS1; + numStatBuffs++; + } + if (CompareStat(battlerAtk, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) + { + gBattleScripting.animArg1 = GET_STAT_BUFF_ID(STAT_SPEED) + STAT_ANIM_PLUS1; + numStatBuffs++; + } + + if (numStatBuffs > 0) + { + if (numStatBuffs > 1) + gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS1; + + gLastUsedAbility = abilityAtk; + gBattlerAbility = battlerAtk; + gBattleStruct->battleBondBoost[side] |= 1u << gBattlerPartyIndexes[battlerAtk]; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_EffectBattleBondStatIncrease; + effect = TRUE; + } + } + } + break; + } + + return effect; +} + static void Cmd_moveend(void) { CMD_ARGS(u8 endMode, u8 endState); @@ -7003,27 +7209,8 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; } - case MOVEEND_MAGICIAN: - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MAGICIAN - && gCurrentMove != MOVE_FLING && gCurrentMove != MOVE_NATURAL_GIFT - && gBattleMons[gBattlerAttacker].item == ITEM_NONE - && gBattleMons[gBattlerTarget].item != ITEM_NONE - && IsBattlerAlive(gBattlerAttacker) - && IsBattlerTurnDamaged(gBattlerTarget) - && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) - && !gSpecialStatuses[gBattlerAttacker].gemBoost // In base game, gems are consumed after magician would activate. - && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & (1u << gBattlerPartyIndexes[gBattlerTarget])) - && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) - && (GetBattlerAbility(gBattlerTarget) != ABILITY_STICKY_HOLD || !IsBattlerAlive(gBattlerTarget))) - { - StealTargetItem(gBattlerAttacker, gBattlerTarget); - gBattleScripting.battler = gBattlerAbility = gBattlerAttacker; - gEffectBattler = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MagicianActivates; - gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage = TRUE; - effect = TRUE; - } + case MOVEEND_ABILITY_BLOCK: + effect = HandleMoveEndAbilityBlock(gBattlerAttacker, gBattlerTarget, gCurrentMove); gBattleScripting.moveendState++; break; case MOVEEND_SHEER_FORCE: @@ -9959,16 +10146,6 @@ static bool32 ChangeOrderTargetAfterAttacker(void) return TRUE; } -static u32 CalculateBattlerPartyCount(u32 battler) -{ - u32 count; - if (GetBattlerSide(battler) == B_SIDE_PLAYER) - count = CalculatePlayerPartyCount(); - else - count = CalculateEnemyPartyCount(); - return count; -} - static void Cmd_various(void) { CMD_ARGS(u8 battler, u8 id); @@ -10558,53 +10735,6 @@ static void Cmd_various(void) MarkBattlerForControllerExec(battler); break; } - case VARIOUS_TRY_ACTIVATE_MOXIE: // and chilling neigh + as one ice rider - { - VARIOUS_ARGS(); - - u16 battlerAbility = GetBattlerAbility(battler); - - if ((battlerAbility == ABILITY_MOXIE - || battlerAbility == ABILITY_CHILLING_NEIGH - || battlerAbility == ABILITY_AS_ONE_ICE_RIDER) - && HasAttackerFaintedTarget() - && !NoAliveMonsForEitherParty() - && CompareStat(gBattlerAttacker, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - SET_STATCHANGER(STAT_ATK, 1, FALSE); - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); - BattleScriptPush(cmd->nextInstr); - gLastUsedAbility = battlerAbility; - if (battlerAbility == ABILITY_AS_ONE_ICE_RIDER) - gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_CHILLING_NEIGH; - gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget; - return; - } - break; - } - case VARIOUS_TRY_ACTIVATE_GRIM_NEIGH: // and as one shadow rider - { - VARIOUS_ARGS(); - - u16 battlerAbility = GetBattlerAbility(battler); - - if ((battlerAbility == ABILITY_GRIM_NEIGH - || battlerAbility == ABILITY_AS_ONE_SHADOW_RIDER) - && HasAttackerFaintedTarget() - && !NoAliveMonsForEitherParty() - && CompareStat(gBattlerAttacker, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); - BattleScriptPush(cmd->nextInstr); - gLastUsedAbility = battlerAbility; - if (battlerAbility == ABILITY_AS_ONE_SHADOW_RIDER) - gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_GRIM_NEIGH; - gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget; - return; - } - break; - } case VARIOUS_TRY_ACTIVATE_RECEIVER: // Partner gets fainted's ally ability { VARIOUS_ARGS(); @@ -10623,24 +10753,6 @@ static void Cmd_various(void) } break; } - case VARIOUS_TRY_ACTIVATE_BEAST_BOOST: - { - VARIOUS_ARGS(); - - i = GetHighestStatId(battler); - if (GetBattlerAbility(battler) == ABILITY_BEAST_BOOST - && HasAttackerFaintedTarget() - && !NoAliveMonsForEitherParty() - && CompareStat(gBattlerAttacker, i, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - SET_STATCHANGER(i, 1, FALSE); - PREPARE_STAT_BUFFER(gBattleTextBuff1, i); - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_AttackerAbilityStatRaise; - return; - } - break; - } case VARIOUS_TRY_ACTIVATE_SOULHEART: { VARIOUS_ARGS(); @@ -11486,25 +11598,6 @@ static void Cmd_various(void) } return; } - // TODO: Convert this to a proper FORM_CHANGE type. - case VARIOUS_TRY_ACTIVATE_BATTLE_BOND: - { - VARIOUS_ARGS(); - if (gBattleMons[gBattlerAttacker].species == SPECIES_GRENINJA_BATTLE_BOND - && HasAttackerFaintedTarget() - && CalculateBattlerPartyCount(gBattlerTarget) > 1 - && !(gBattleStruct->battleBondTransformed[GetBattlerSide(gBattlerAttacker)] & (1u << gBattlerPartyIndexes[gBattlerAttacker]))) - { - gBattleStruct->battleBondTransformed[GetBattlerSide(gBattlerAttacker)] |= 1u << gBattlerPartyIndexes[gBattlerAttacker]; - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].species); - gBattleStruct->changedSpecies[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[gBattlerAttacker]] = gBattleMons[gBattlerAttacker].species; - gBattleMons[gBattlerAttacker].species = SPECIES_GRENINJA_ASH; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BattleBondActivatesOnMoveEndAttacker; - return; - } - break; - } case VARIOUS_CONSUME_BERRY: { VARIOUS_ARGS(bool8 fromBattler); diff --git a/src/battle_util.c b/src/battle_util.c index b12898a513..2fbe8375df 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4160,12 +4160,12 @@ static inline uq4_12_t GetSupremeOverlordModifier(u32 battler) return UQ_4_12(1.0) + (PercentToUQ4_12(gBattleStruct->supremeOverlordCounter[battler] * 10)); } -static inline bool32 HadMoreThanHalfHpNowDoesnt(u32 battler) +bool32 HadMoreThanHalfHpNowDoesnt(u32 battler) { u32 cutoff = gBattleMons[battler].maxHP / 2; // Had more than half of hp before, now has less - return (gBattleStruct->hpBefore[battler] > cutoff - && gBattleMons[battler].hp <= cutoff); + return gBattleStruct->hpBefore[battler] > cutoff + && gBattleMons[battler].hp <= cutoff; } #define ANIM_STAT_HP 0 @@ -6305,7 +6305,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_OPPORTUNIST: if (gProtectStructs[battler].activateOpportunist == 2) { - gBattleScripting.animArg1 = 0; gBattleScripting.battler = battler; gProtectStructs[battler].activateOpportunist--; ChooseStatBoostAnimation(battler); @@ -12277,23 +12276,6 @@ bool32 IsMoveEffectBlockedByTarget(u32 ability) return FALSE; } -u32 NumAffectedSpreadMoveTargets(void) -{ - u32 targetCount = 1; - - if (!IsDoubleSpreadMove()) - return targetCount; - - targetCount = 0; - for (u32 battler = 0; battler < gBattlersCount; battler++) - { - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)) - targetCount++; - } - - return targetCount; -} - bool32 IsPursuitTargetSet(void) { for (u32 battler = 0; battler < gBattlersCount; battler++) @@ -12335,49 +12317,3 @@ bool32 HasWeatherEffect(void) return TRUE; } - -bool32 IsMovePowderBlocked(u32 battlerAtk, u32 battlerDef, u32 move) -{ - bool32 effect = FALSE; - - if (IsPowderMove(move) && (battlerAtk != battlerDef)) - { - if (B_POWDER_GRASS >= GEN_6 - && (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) || GetBattlerAbility(battlerDef) == ABILITY_OVERCOAT)) - { - gBattlerAbility = battlerDef; - RecordAbilityBattle(gBattlerTarget, ABILITY_OVERCOAT); - effect = TRUE; - } - else if (GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_SAFETY_GOGGLES) - { - RecordItemEffectBattle(battlerDef, HOLD_EFFECT_SAFETY_GOGGLES); - gLastUsedItem = gBattleMons[battlerDef].item; - effect = TRUE; - } - - if (effect) - gBattlescriptCurrInstr = BattleScript_PowderMoveNoEffect; - } - - return effect; -} - -bool32 EmergencyExitCanBeTriggered(u32 battler) -{ - u32 ability = GetBattlerAbility(battler); - - if (ability != ABILITY_EMERGENCY_EXIT && ability != ABILITY_WIMP_OUT) - return FALSE; - - if (IsBattlerTurnDamaged(battler) - && IsBattlerAlive(battler) - && HadMoreThanHalfHpNowDoesnt(battler) - && (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) - && !(gBattleTypeFlags & BATTLE_TYPE_ARENA) - && CountUsablePartyMons(battler) > 0 - && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) - return TRUE; - - return FALSE; -} diff --git a/test/battle/ability/battle_bond.c b/test/battle/ability/battle_bond.c index f480367798..401df267b6 100644 --- a/test/battle/ability/battle_bond.c +++ b/test/battle/ability/battle_bond.c @@ -6,26 +6,6 @@ ASSUMPTIONS ASSUME(!IsBattleMoveStatus(MOVE_WATER_GUN)); } -SINGLE_BATTLE_TEST("Battle Bond does not transform species other than Greninja") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_BATTLE_BOND); } - OPPONENT(SPECIES_WOBBUFFET) { HP(1); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_WATER_GUN); SEND_OUT(opponent, 1); } - } SCENE { - HP_BAR(opponent); - MESSAGE("The opposing Wobbuffet fainted!"); - NONE_OF { - ABILITY_POPUP(player, ABILITY_BATTLE_BOND); - MESSAGE("Wobbuffet became fully charged due to its bond with its trainer!"); - } - } THEN { - EXPECT(player->species == SPECIES_WOBBUFFET); - } -} - // Battle Bond transforms the pokemon when fainting any battler(opposing or partner), unless it's the last pokemon and the battle ends. SINGLE_BATTLE_TEST("Battle Bond transforms player's Greninja - Singles") { @@ -37,6 +17,7 @@ SINGLE_BATTLE_TEST("Battle Bond transforms player's Greninja - Singles") PARAMETRIZE {monsCountPlayer = 2; monsCountOpponent = 2; } GIVEN { + WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND); if (monsCountPlayer == 2) { PLAYER(SPECIES_WOBBUFFET); @@ -84,6 +65,7 @@ SINGLE_BATTLE_TEST("Battle Bond transforms opponent's Greninja - Singles") PARAMETRIZE {monsCountPlayer = 2; monsCountOpponent = 2; } GIVEN { + WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_8); OPPONENT(SPECIES_GRENINJA_BATTLE_BOND); if (monsCountOpponent == 2) { OPPONENT(SPECIES_WOBBUFFET); @@ -131,6 +113,7 @@ DOUBLE_BATTLE_TEST("Battle Bond transforms player's Greninja when fainting its A PARAMETRIZE {monsCountPlayer = 3; monsCountOpponent = 3; } GIVEN { + WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND); PLAYER(SPECIES_WOBBUFFET) { HP(1); } if (monsCountPlayer == 3) { @@ -158,3 +141,51 @@ DOUBLE_BATTLE_TEST("Battle Bond transforms player's Greninja when fainting its A EXPECT(playerLeft->species == SPECIES_GRENINJA_ASH); } } + +SINGLE_BATTLE_TEST("Battle Bond increases Atk, SpAtk and Speed by 1 stage (Gen9+)") +{ + GIVEN { + WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_9); + PLAYER(SPECIES_GRENINJA_BATTLE_BOND) { Ability(ABILITY_BATTLE_BOND); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WATER_GUN); SEND_OUT(opponent, 1); } + } SCENE { + HP_BAR(opponent); + MESSAGE("The opposing Wobbuffet fainted!"); + ABILITY_POPUP(player, ABILITY_BATTLE_BOND); + } THEN { + EXPECT(player->species != SPECIES_GRENINJA_ASH); + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Battle Bond increases a Stat even if only one can be increased (Gen9+)") +{ + GIVEN { + WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_9); + PLAYER(SPECIES_GRENINJA_BATTLE_BOND) { Ability(ABILITY_BATTLE_BOND); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DRAGON_DANCE); } + TURN { MOVE(player, MOVE_DRAGON_DANCE); } + TURN { MOVE(player, MOVE_DRAGON_DANCE); } + TURN { MOVE(player, MOVE_DRAGON_DANCE); } + TURN { MOVE(player, MOVE_DRAGON_DANCE); } + TURN { MOVE(player, MOVE_DRAGON_DANCE); } + TURN { MOVE(player, MOVE_WATER_GUN); SEND_OUT(opponent, 1); } + } SCENE { + HP_BAR(opponent); + MESSAGE("The opposing Wobbuffet fainted!"); + ABILITY_POPUP(player, ABILITY_BATTLE_BOND); + } THEN { + EXPECT(player->species != SPECIES_GRENINJA_ASH); + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 6); + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 6); + } +} diff --git a/test/battle/ability/beast_boost.c b/test/battle/ability/beast_boost.c index fde1683104..432fded4c9 100644 --- a/test/battle/ability/beast_boost.c +++ b/test/battle/ability/beast_boost.c @@ -19,19 +19,19 @@ SINGLE_BATTLE_TEST("Beast Boost boosts the most proficient stat when knocking ou ABILITY_POPUP(player, ABILITY_BEAST_BOOST); switch(i) { case 0: - MESSAGE("Nihilego's Beast Boost raised its Attack!"); + MESSAGE("Nihilego's Attack rose!"); break; case 1: - MESSAGE("Nihilego's Beast Boost raised its Defense!"); + MESSAGE("Nihilego's Defense rose!"); break; case 2: - MESSAGE("Nihilego's Beast Boost raised its Sp. Atk!"); + MESSAGE("Nihilego's Sp. Atk rose!"); break; case 3: - MESSAGE("Nihilego's Beast Boost raised its Sp. Def!"); + MESSAGE("Nihilego's Sp. Def rose!"); break; case 4: - MESSAGE("Nihilego's Beast Boost raised its Speed!"); + MESSAGE("Nihilego's Speed rose!"); break; } } diff --git a/test/battle/ability/grim_neigh.c b/test/battle/ability/grim_neigh.c index c58487722b..69d60db93e 100644 --- a/test/battle/ability/grim_neigh.c +++ b/test/battle/ability/grim_neigh.c @@ -16,22 +16,16 @@ DOUBLE_BATTLE_TEST("Grim Neigh raises Sp. Attack by one stage after directly cau } WHEN { TURN { MOVE(playerLeft, MOVE_DISCHARGE); SEND_OUT(opponentLeft, 2); } } SCENE { - int i; - ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft); - for (i = 0; i < 3; i++) { - ONE_OF { - MESSAGE("Snorunt fainted!"); - MESSAGE("The opposing Glalie fainted!"); - MESSAGE("The opposing Abra fainted!"); - } - ABILITY_POPUP(playerLeft, abilityPopUp); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); - if (species == SPECIES_SPECTRIER) - MESSAGE("Spectrier's Grim Neigh raised its Sp. Atk!"); - else - MESSAGE("Calyrex's Grim Neigh raised its Sp. Atk!"); - } + MESSAGE("The opposing Glalie fainted!"); + MESSAGE("Snorunt fainted!"); + MESSAGE("The opposing Abra fainted!"); + ABILITY_POPUP(playerLeft, abilityPopUp); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + if (species == SPECIES_SPECTRIER) + MESSAGE("Spectrier's Sp. Atk drastically rose!"); + else + MESSAGE("Calyrex's Sp. Atk drastically rose!"); } THEN { EXPECT_EQ(playerLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 3); } @@ -98,9 +92,9 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move th ABILITY_POPUP(playerLeft, abilityPopUp); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); if (species == SPECIES_SPECTRIER) - MESSAGE("Spectrier's Grim Neigh raised its Sp. Atk!"); + MESSAGE("Spectrier's Sp. Atk rose!"); else - MESSAGE("Calyrex's Grim Neigh raised its Sp. Atk!"); + MESSAGE("Calyrex's Sp. Atk rose!"); } THEN { EXPECT_EQ(playerLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); EXPECT_EQ(damage[0], damage[1]); diff --git a/test/battle/ability/moxie.c b/test/battle/ability/moxie.c index 35ae64d164..a39fb91df8 100644 --- a/test/battle/ability/moxie.c +++ b/test/battle/ability/moxie.c @@ -17,24 +17,18 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh raises Attack by one stage after direct } WHEN { TURN { MOVE(playerLeft, MOVE_EARTHQUAKE); SEND_OUT(opponentLeft, 2); } } SCENE { - int i; - ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft); - for (i = 0; i < 3; i++) { - ONE_OF { - MESSAGE("Snorunt fainted!"); - MESSAGE("The opposing Glalie fainted!"); - MESSAGE("The opposing Abra fainted!"); - } - ABILITY_POPUP(playerLeft, abilityPopUp); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); - if (species == SPECIES_SALAMENCE) - MESSAGE("Salamence's Moxie raised its Attack!"); - else if (species == SPECIES_GLASTRIER) - MESSAGE("Glastrier's Chilling Neigh raised its Attack!"); - else - MESSAGE("Calyrex's Chilling Neigh raised its Attack!"); - } + MESSAGE("The opposing Glalie fainted!"); + MESSAGE("Snorunt fainted!"); + MESSAGE("The opposing Abra fainted!"); + ABILITY_POPUP(playerLeft, abilityPopUp); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + if (species == SPECIES_SALAMENCE) + MESSAGE("Salamence's Attack drastically rose!"); + else if (species == SPECIES_GLASTRIER) + MESSAGE("Glastrier's Attack drastically rose!"); + else + MESSAGE("Calyrex's Attack drastically rose!"); } THEN { EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 3); } @@ -140,11 +134,11 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the sa ABILITY_POPUP(playerLeft, abilityPopUp); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); if (species == SPECIES_SALAMENCE) - MESSAGE("Salamence's Moxie raised its Attack!"); + MESSAGE("Salamence's Attack rose!"); else if (species == SPECIES_GLASTRIER) - MESSAGE("Glastrier's Chilling Neigh raised its Attack!"); + MESSAGE("Glastrier's Attack rose!"); else - MESSAGE("Calyrex's Chilling Neigh raised its Attack!"); + MESSAGE("Calyrex's Attack rose!"); } THEN { EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); EXPECT_EQ(damage[0], damage[1]); diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index ea8957e474..b58f3122b0 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -401,6 +401,7 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon that changes forms does not gain { u16 capturedHP, finalHP; GIVEN { + WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND) { Ability(ABILITY_BATTLE_BOND); HP(100); Speed(100); } OPPONENT(SPECIES_CATERPIE) { HP(1); Speed(1000); } OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } @@ -1556,7 +1557,7 @@ SINGLE_BATTLE_TEST("Dynamax: Moxie clones can be triggered by Max Moves fainting } SCENE { MESSAGE("The opposing Wobbuffet fainted!"); ABILITY_POPUP(player, ABILITY_MOXIE); - MESSAGE("Gyarados's Moxie raised its Attack!"); + MESSAGE("Gyarados's Attack rose!"); } } diff --git a/test/text.c b/test/text.c index 7650c2dd59..e29ec68b76 100644 --- a/test/text.c +++ b/test/text.c @@ -67,7 +67,7 @@ TEST("Move names fit on Contest Screen") TEST("Move names fit on TMs & HMs Bag Screen") { u32 i; - const u32 fontId = FONT_NARROWER, widthPx = 61; + const u32 fontId = FONT_NARROWER, widthPx = 61; u32 move = MOVE_NONE; for (i = 1; i < MOVES_COUNT; i++) { @@ -713,7 +713,6 @@ TEST("Battle strings fit on the battle message window") case STRINGID_TARGETABILITYSTATRAISE: case STRINGID_TARGETSSTATWASMAXEDOUT: case STRINGID_ATTACKERABILITYSTATRAISE: - case STRINGID_LASTABILITYRAISEDSTAT: case STRINGID_TARGETABILITYSTATLOWER: case STRINGID_SCRIPTINGABILITYSTATRAISE: case STRINGID_BATTLERABILITYRAISEDSTAT: