Refactors faint target abilities and adds Battle Bond config (#6519)

Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>
This commit is contained in:
Alex 2025-04-02 16:00:23 +02:00 committed by GitHub
parent 807b9cb152
commit ae62c80d0f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 595 additions and 549 deletions

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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[];

View File

@ -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

View File

@ -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.

View File

@ -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,

View File

@ -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,

View File

@ -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
};

View File

@ -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

View File

@ -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}!"),

View File

@ -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);

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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]);

View File

@ -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]);

View File

@ -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!");
}
}

View File

@ -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: