Merge branch 'RHH/pr/upcoming/reorderMonGraphics' into RHH/review/gen9mon-4
This commit is contained in:
commit
820be61c9f
@ -23,8 +23,9 @@ body:
|
||||
label: Version
|
||||
description: What version of pokeemerald-expansion are you using as a base?
|
||||
options:
|
||||
- 1.6.1 (Default)
|
||||
- 1.6.2 (Default)
|
||||
- upcoming (Edge)
|
||||
- 1.6.1
|
||||
- 1.6.0
|
||||
- 1.5.3
|
||||
- 1.5.2
|
||||
|
||||
@ -23,8 +23,9 @@ body:
|
||||
label: Version
|
||||
description: What version of pokeemerald-expansion are you using as a base?
|
||||
options:
|
||||
- 1.6.1 (Default)
|
||||
- 1.6.2 (Default)
|
||||
- upcoming (Edge)
|
||||
- 1.6.1
|
||||
- 1.6.0
|
||||
- 1.5.3
|
||||
- 1.5.2
|
||||
|
||||
3
.github/ISSUE_TEMPLATE/04_other_errors.yaml
vendored
3
.github/ISSUE_TEMPLATE/04_other_errors.yaml
vendored
@ -23,8 +23,9 @@ body:
|
||||
label: Version
|
||||
description: What version of pokeemerald-expansion are you using as a base?
|
||||
options:
|
||||
- 1.6.1 (Default)
|
||||
- 1.6.2 (Default)
|
||||
- upcoming (Edge)
|
||||
- 1.6.1
|
||||
- 1.6.0
|
||||
- 1.5.3
|
||||
- 1.5.2
|
||||
|
||||
122
CHANGELOG.md
Normal file
122
CHANGELOG.md
Normal file
@ -0,0 +1,122 @@
|
||||
# Pokeemerald-Expansion Changelog
|
||||
|
||||
# Version 1.6.2
|
||||
|
||||
## 🌋 *IMPORTANT CHANGES* 🌋
|
||||
### Battle changes
|
||||
* Battler Types are now obtained via `GetBattlerType` instead of `gBattleMons[battlerId].type1/2/3` to better consider Roost. Be sure to update your custom battle effects to account for this change.
|
||||
|
||||
## 🧬 General 🧬
|
||||
### Fixed
|
||||
* Fixed Cheat Start not initiating time-based events by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3446
|
||||
|
||||
## 🐉 Pokémon 🐉
|
||||
### Changed
|
||||
* Updated Cresselia's base stats to Gen 9 by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3419
|
||||
* Updated Zacian/Zamazenta base stats to Gen 9 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3421
|
||||
### Fixed
|
||||
* Fixed Kleavor, Hisuian Sneasel and Sneasler missing their SV abilities by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3391
|
||||
* Fixed Bergmite/Avalugg old and updated egg groups being switched by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3380
|
||||
|
||||
## 🤹 Moves 🤹
|
||||
### Changed
|
||||
* Quick Draw now uses weighted RNG by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3399
|
||||
* Added `IS_BATTLER_TYPELESS` macro that checks if the specified battler has no valid type by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3303
|
||||
### Fixed
|
||||
* Fixed Protect failing if the user flinched on the previous turn by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3345
|
||||
* Fixed entry hazards not working properly being cleared on switch-in by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3316
|
||||
* This includes Toxic Spikes not working if Pecha Berry actived on the previous turn.
|
||||
* Fixed Roost overwriting other type changing at the end of the turn (Soak, Forest's Curse, Color Change, etc.) by @BLourenco in https://github.com/rh-hideout/pokeemerald-expansion/pull/3258
|
||||
* Now it suppresses the user's Flying-type rather than remove and re-add it.
|
||||
* Fixes Salt Cure visual bug if mon fainted by direct attack by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3388
|
||||
* Fixed Purifying Salt not preventing the use of Rest by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3399
|
||||
* Fixed Make it Rain lowering Sp. Attack twice if hitting 2 targets in double battles by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3441
|
||||
* Fixed Reflect Type not properly handle 3rd types by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3303
|
||||
* Fixed form change triggered by switching not occuring when using moves like U-Turn or Baton Pass by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3463
|
||||
* Fixed Last Resort not counting Sleep Talk as used for its effect by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3378
|
||||
|
||||
## 🎭 Abilities 🎭
|
||||
### Changed
|
||||
* Removed unused `STATUS3_CANT_SCORE_A_CRIT` by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3377
|
||||
* Moved Beads of Ruin and Sword of Ruin damage to the appropiate damage modifier functions by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3415
|
||||
### Fixed
|
||||
* Fixed Intimidate increasing the attack of both opponents if one of them has Contrary in double battles by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3365
|
||||
* Fixed Battle/Shell Armor not preventing critical hits by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3377
|
||||
* Fixed Rivalry's effect being reversed by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3381
|
||||
* Fixed Rivalry lowering attack if either attacker or target were genderless by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3381
|
||||
* Fixed missing Poison Heal Ability Popup by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3385
|
||||
* Fixed Parental Bond not working at all by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3417
|
||||
* Fixed Beads of Ruin and Sword of Ruin damage modifiers by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3415
|
||||
* Fixed Sheer Force not negating effects that benefit the user (eg. Flame Charge, Power-Up Punch) by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3378
|
||||
* Fixed Strength Sap not healing the user when used on a Substitute by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3486
|
||||
* Fixed Substitute showing the "took damage for" message if Strength Sap was used on it by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3486
|
||||
* Fixed Weak Armor interrupting Multi Hit moves by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3497
|
||||
|
||||
## 🧶 Items 🧶
|
||||
### Fixed
|
||||
* Fixed Shiny Charm doing too many rerolls by default by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3327
|
||||
* Fixed Berserk Gene activating for the wrong Pokémon double battles by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3363
|
||||
* Fixed Red Card not being consumed after opponent Sticky Web activation by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3364
|
||||
* Fixed implementation of Gen6 that didn't allow for the Exp Share flag to be set via script without setting the item to the Gen 6+ version by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3384
|
||||
* Fixed Kee Berry raising defense by 1 stage instead of 2 by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3409
|
||||
* Fixed Kee Berry incorrect stat raise message by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3409
|
||||
* Fixed Razor Fang not being able to be used directly even if `I_USE_EVO_HELD_ITEMS_FROM_BAG` was set to `TRUE` by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3456
|
||||
|
||||
## 🧹 Cleanup 🧹
|
||||
* `AbilityBattleEffects` uses `B_MSG_TERRAIN` constants for field terrain intro text by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3410
|
||||
* Removed all trailing whitespace by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3472
|
||||
|
||||
## 🧪 Test Runner 🧪
|
||||
### Added
|
||||
* Flinch tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3345
|
||||
* Berserk Gene double battle tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3363
|
||||
* More specific Toxic Spikes tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3316
|
||||
* Red Card/Sticky Web test @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3364
|
||||
* Intimidate/Contrary double battle test by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3365
|
||||
* Critical Hit tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3377
|
||||
* Roost tests by @BLourenco in https://github.com/rh-hideout/pokeemerald-expansion/pull/3258
|
||||
* Rivalry tests by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3381
|
||||
* Various tests by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3385
|
||||
* Defeatist, Dragon's Maw, Earth Eater, Gale Wings, Poison Heal, Rocky Payload, Sap Sipper, Steelworker and Transistor.
|
||||
* Various tests by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3399
|
||||
* Beast Boost, Ice Scales, Neuroforce, Purifying Salt, Quick Draw and Sharpness.
|
||||
* Berry tests @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3409
|
||||
* Full: Apicot, Custap, Ganlon, Jaboca, Kee, Lansat, Liechi, Maranga, Micle, Petaya, Rowap and Salac Berries.
|
||||
* TODO: Starf Berry.
|
||||
* Weather and type-specific tests by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3260
|
||||
* Full: Freezing, Hail, Moonlight, Morning Sun, Sandstorm, Snow, Solar Beam/Blade, Steel poisoning, Synthesis, Thunder and Weather Ball.
|
||||
* Partial: Prankster, Safety Goggles, Aurora Veil, Hurricane, Leech Seed and OHKO moves.
|
||||
* TODO: Harvest.
|
||||
* Single Parental Bond test by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3417
|
||||
* Several tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3378
|
||||
* Full: Weak Armor, Last Resort, Stealth Rock.
|
||||
* Completed Weak Armor tests by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3493
|
||||
* Partial: Defiant, Sheer Force, White Herb, Strength Sap.
|
||||
### Changed
|
||||
* Red Card tests now check if the item was consumed by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3364
|
||||
* Tests now cannot use `i` in their cycles to avoid messing with `PARAMETRIZE` by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3408
|
||||
* Moved battle tests off the heap by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3414
|
||||
* Moved Powder/Grass test to `move_flags` folder by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3260
|
||||
* Continuous `NOT x; NOT y;` are now not allowed in tests due to them not acting as one would expect by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3459
|
||||
* Test writers should use `NONE_OF { x; y; }` instead.
|
||||
### Fixed
|
||||
* Fixed CreateNPCTrainerPartyForTrainer test failing on modern by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3367
|
||||
* Fixed `RNG_CRITICAL_HIT` by @mrgriffin and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3377
|
||||
* Fixed `ASSUMPTIONS` block not working by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3368
|
||||
* Fixup by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3408
|
||||
* Fixed Beads of Ruin and Sword of Ruin damage tests by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3415
|
||||
* Fixes test RNG by @mrgriffin and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3433
|
||||
* Fixed battle test estimateCost bug by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3448
|
||||
* Test cleanup and improvements by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3449
|
||||
* Removed duplicated Prankster TO_DO test.
|
||||
* Corrected Multi-hit test names (4 and 5 hits stated 35% instead of 15%).
|
||||
* Grouped Maranga Berry's Physical vs Special tests using PARAMETRIZE.
|
||||
* Improved Jaboca, Kee and Rowap tests by @AlexOn1ine
|
||||
* Fixed `ModifyPersonalityForNature` by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3452
|
||||
* Fixed test_runner.c modern warning by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3451
|
||||
|
||||
## New Contributors
|
||||
* @BLourenco made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3258
|
||||
|
||||
## Full Changelog
|
||||
https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.6.1...expansion/1.6.2
|
||||
@ -145,7 +145,7 @@ With this, you'll get the latest version of the Expansion, plus a couple of bugf
|
||||
|
||||
## **How do I update my version of the pokeemerald Expansion?**
|
||||
- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`.
|
||||
- Once you have your remote set up, run the command `git pull RHH expansion/1.6.0`.
|
||||
- Once you have your remote set up, run the command `git pull RHH expansion/1.6.2`.
|
||||
|
||||
### Please consider crediting the entire [list of contributors](https://github.com/rh-hideout/pokeemerald-expansion/wiki/Credits) in your project, as they have all worked hard to develop this project :)
|
||||
|
||||
|
||||
@ -188,7 +188,7 @@ gBattleScriptsForMoveEffects::
|
||||
.4byte BattleScript_EffectMemento @ EFFECT_MEMENTO
|
||||
.4byte BattleScript_EffectHit @ EFFECT_FACADE
|
||||
.4byte BattleScript_EffectFocusPunch @ EFFECT_FOCUS_PUNCH
|
||||
.4byte BattleScript_EffectSmellingsalt @ EFFECT_SMELLINGSALT
|
||||
.4byte BattleScript_EffectSmellingsalt @ EFFECT_SMELLING_SALTS
|
||||
.4byte BattleScript_EffectFollowMe @ EFFECT_FOLLOW_ME
|
||||
.4byte BattleScript_EffectNaturePower @ EFFECT_NATURE_POWER
|
||||
.4byte BattleScript_EffectCharge @ EFFECT_CHARGE
|
||||
@ -1469,6 +1469,7 @@ BattleScript_StrengthSapHp:
|
||||
jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_MoveEnd
|
||||
jumpiffullhp BS_ATTACKER, BattleScript_MoveEnd
|
||||
manipulatedamage DMG_BIG_ROOT
|
||||
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
|
||||
healthbarupdate BS_ATTACKER
|
||||
datahpupdate BS_ATTACKER
|
||||
printstring STRINGID_PKMNENERGYDRAINED
|
||||
@ -9103,6 +9104,7 @@ BattleScript_WeakArmorActivates::
|
||||
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_WeakArmorActivatesSpeed
|
||||
pause B_WAIT_TIME_SHORTEST
|
||||
printfromtable gStatDownStringIds
|
||||
bichalfword gMoveResultFlags, MOVE_RESULT_MISSED @ Set by statbuffchange when stat can't be decreased
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
goto BattleScript_WeakArmorActivatesSpeed
|
||||
BattleScript_WeakArmorDefAnim:
|
||||
@ -9111,12 +9113,17 @@ BattleScript_WeakArmorDefAnim:
|
||||
printstring STRINGID_TARGETABILITYSTATLOWER
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
BattleScript_WeakArmorActivatesSpeed:
|
||||
.if B_WEAK_ARMOR_SPEED >= GEN_7
|
||||
setstatchanger STAT_SPEED, 2, FALSE
|
||||
.else
|
||||
setstatchanger STAT_SPEED, 1, FALSE
|
||||
.endif
|
||||
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesEnd
|
||||
jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeakArmorSpeedAnim
|
||||
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_WeakArmorActivatesEnd
|
||||
pause B_WAIT_TIME_SHORTEST
|
||||
printstring STRINGID_TARGETSTATWONTGOHIGHER
|
||||
bichalfword gMoveResultFlags, MOVE_RESULT_MISSED
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
goto BattleScript_WeakArmorActivatesEnd
|
||||
BattleScript_WeakArmorSpeedAnim:
|
||||
|
||||
@ -39,6 +39,32 @@ Debug_CheatStart::
|
||||
setvar VAR_BRINEY_HOUSE_STATE, 1
|
||||
setvar VAR_ROUTE116_STATE, 2
|
||||
setflag FLAG_HIDE_ROUTE_116_MR_BRINEY
|
||||
setflag FLAG_BADGE01_GET
|
||||
setflag FLAG_BADGE02_GET
|
||||
setflag FLAG_BADGE03_GET
|
||||
setflag FLAG_BADGE04_GET
|
||||
setflag FLAG_BADGE05_GET
|
||||
setflag FLAG_BADGE06_GET
|
||||
setflag FLAG_BADGE07_GET
|
||||
setflag FLAG_BADGE08_GET
|
||||
setflag FLAG_VISITED_LITTLEROOT_TOWN
|
||||
setflag FLAG_VISITED_OLDALE_TOWN
|
||||
setflag FLAG_VISITED_DEWFORD_TOWN
|
||||
setflag FLAG_VISITED_LAVARIDGE_TOWN
|
||||
setflag FLAG_VISITED_FALLARBOR_TOWN
|
||||
setflag FLAG_VISITED_VERDANTURF_TOWN
|
||||
setflag FLAG_VISITED_PACIFIDLOG_TOWN
|
||||
setflag FLAG_VISITED_PETALBURG_CITY
|
||||
setflag FLAG_VISITED_SLATEPORT_CITY
|
||||
setflag FLAG_VISITED_MAUVILLE_CITY
|
||||
setflag FLAG_VISITED_RUSTBORO_CITY
|
||||
setflag FLAG_VISITED_FORTREE_CITY
|
||||
setflag FLAG_VISITED_LILYCOVE_CITY
|
||||
setflag FLAG_VISITED_MOSSDEEP_CITY
|
||||
setflag FLAG_VISITED_SOOTOPOLIS_CITY
|
||||
setflag FLAG_VISITED_EVER_GRANDE_CITY
|
||||
setflag FLAG_LANDMARK_POKEMON_LEAGUE
|
||||
setflag FLAG_LANDMARK_BATTLE_FRONTIER
|
||||
clearflag FLAG_HIDE_BRINEYS_HOUSE_MR_BRINEY
|
||||
clearflag FLAG_HIDE_BRINEYS_HOUSE_PEEKO
|
||||
release
|
||||
@ -69,28 +95,28 @@ Debug_BoxFilledMessage::
|
||||
Debug_BoxFilledMessage_Text:
|
||||
.string "Storage boxes filled!$"
|
||||
|
||||
Debug_Script_1::
|
||||
Debug_EventScript_Script_1::
|
||||
end
|
||||
|
||||
Debug_Script_2::
|
||||
Debug_EventScript_Script_2::
|
||||
end
|
||||
|
||||
Debug_Script_3::
|
||||
Debug_EventScript_Script_3::
|
||||
end
|
||||
|
||||
Debug_Script_4::
|
||||
Debug_EventScript_Script_4::
|
||||
end
|
||||
|
||||
Debug_Script_5::
|
||||
Debug_EventScript_Script_5::
|
||||
end
|
||||
|
||||
Debug_Script_6::
|
||||
Debug_EventScript_Script_6::
|
||||
end
|
||||
|
||||
Debug_Script_7::
|
||||
Debug_EventScript_Script_7::
|
||||
end
|
||||
|
||||
Debug_Script_8::
|
||||
Debug_EventScript_Script_8::
|
||||
end
|
||||
|
||||
Debug_CheckSaveBlock::
|
||||
|
||||
@ -7,11 +7,11 @@ JASC-PAL
|
||||
201 201 201
|
||||
169 169 169
|
||||
129 129 129
|
||||
249 153 161
|
||||
233 49 49
|
||||
193 33 41
|
||||
145 17 33
|
||||
249 153 161
|
||||
106 106 106
|
||||
37 37 37
|
||||
106 106 106
|
||||
0 0 0
|
||||
106 106 106
|
||||
193 33 41
|
||||
141 251 184
|
||||
52 66 162
|
||||
|
||||
@ -128,7 +128,6 @@ bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move);
|
||||
bool32 HasThawingMove(u32 battler);
|
||||
bool32 IsStatRaisingEffect(u32 effect);
|
||||
bool32 IsStatLoweringEffect(u32 effect);
|
||||
bool32 IsStatRaisingEffect(u32 effect);
|
||||
bool32 IsAttackBoostMoveEffect(u32 effect);
|
||||
bool32 IsUngroundingEffect(u32 effect);
|
||||
bool32 IsSemiInvulnerable(u32 battlerDef, u32 move);
|
||||
|
||||
@ -129,6 +129,7 @@
|
||||
#define B_SNOW_WARNING GEN_LATEST // In Gen9+, Snow Warning will summon snow instead of hail.
|
||||
#define B_TRANSISTOR_BOOST GEN_LATEST // In Gen9+, Transistor will only boost Electric-type moves by 1.3x as opposed to 1.5x.
|
||||
#define B_ILLUMINATE_EFFECT GEN_LATEST // In Gen9+, Illuminate prevents accuracy reductions and ignores the target's evasion.
|
||||
#define B_WEAK_ARMOR_SPEED GEN_LATEST // In Gen7+, Weak Armor raises Speed by 2 stages instead of 1 when hit by a physical move.
|
||||
|
||||
// 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.
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
#define P_UPDATED_STATS GEN_LATEST // Since Gen 6, Pokémon stats are updated with each passing generation.
|
||||
#define P_UPDATED_ABILITIES GEN_LATEST // Since Gen 6, certain Pokémon have their abilities changed.
|
||||
#define P_UPDATED_EGG_GROUPS GEN_LATEST // Since Gen 8, certain Pokémon have gained new egg groups.
|
||||
#define P_UPDATED_FRIENDSHIP GEN_LATEST // Since Gen 8, the base friendship of certain Pokémon was changed.
|
||||
|
||||
// Evolution settings
|
||||
#define P_FRIENDSHIP_EVO_THRESHOLD GEN_LATEST // Since Gen 8, Pokémon that evolve by friendship evolve at or above 160 friendship instead of 220.
|
||||
|
||||
@ -167,7 +167,7 @@
|
||||
#define EFFECT_MEMENTO 163
|
||||
#define EFFECT_FACADE 164
|
||||
#define EFFECT_FOCUS_PUNCH 165
|
||||
#define EFFECT_SMELLINGSALT 166
|
||||
#define EFFECT_SMELLING_SALTS 166
|
||||
#define EFFECT_FOLLOW_ME 167
|
||||
#define EFFECT_NATURE_POWER 168
|
||||
#define EFFECT_CHARGE 169
|
||||
|
||||
@ -191,8 +191,12 @@
|
||||
#define FRIENDSHIP_200_TO_254 5
|
||||
#define FRIENDSHIP_MAX 6
|
||||
|
||||
// Friendship value that the majority of species use. This was changed in Generation 8 to 50.
|
||||
// Friendship value that the majority of species use.
|
||||
#if P_UPDATED_FRIENDSHIP >= GEN_8
|
||||
#define STANDARD_FRIENDSHIP 50
|
||||
#else
|
||||
#define STANDARD_FRIENDSHIP 70
|
||||
#endif
|
||||
|
||||
#define MAX_FRIENDSHIP 255
|
||||
#define MAX_SHEEN 255
|
||||
|
||||
@ -1684,10 +1684,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
if (gDisableStructs[battlerAtk].stockpileCounter >= 3)
|
||||
ADJUST_SCORE(-10);
|
||||
break;
|
||||
case EFFECT_SPIT_UP:
|
||||
if (gDisableStructs[battlerAtk].stockpileCounter <= 1)
|
||||
ADJUST_SCORE(-10);
|
||||
break;
|
||||
case EFFECT_SWALLOW:
|
||||
if (gDisableStructs[battlerAtk].stockpileCounter == 0)
|
||||
{
|
||||
@ -3149,6 +3145,8 @@ static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId)
|
||||
{
|
||||
u32 i;
|
||||
bool32 multipleBestMoves = FALSE;
|
||||
s32 viableMoveScores[MAX_MON_MOVES];
|
||||
s32 bestViableMoveScore;
|
||||
s32 noOfHits[MAX_MON_MOVES];
|
||||
s32 score = 0;
|
||||
s32 leastHits = 1000;
|
||||
@ -3164,11 +3162,13 @@ static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId)
|
||||
{
|
||||
leastHits = noOfHits[i];
|
||||
}
|
||||
viableMoveScores[i] = AI_SCORE_DEFAULT;
|
||||
isPowerfulIgnoredEffect[i] = IsInIgnoredPowerfulMoveEffects(gBattleMoves[moves[i]].effect);
|
||||
}
|
||||
else
|
||||
{
|
||||
noOfHits[i] = -1;
|
||||
viableMoveScores[i] = 0;
|
||||
isPowerfulIgnoredEffect[i] = FALSE;
|
||||
}
|
||||
/*
|
||||
@ -3194,19 +3194,45 @@ static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId)
|
||||
multipleBestMoves = TRUE;
|
||||
// We need to make sure it's the current move which is objectively better.
|
||||
if (isPowerfulIgnoredEffect[i] && !isPowerfulIgnoredEffect[currId])
|
||||
ADJUST_SCORE(3);
|
||||
else if (CompareMoveAccuracies(battlerAtk, battlerDef, currId, i) == 0)
|
||||
ADJUST_SCORE(2);
|
||||
else if (AI_WhichMoveBetter(moves[currId], moves[i], battlerAtk, battlerDef, noOfHits[currId]) == 0)
|
||||
viableMoveScores[i] -= 3;
|
||||
else if (!isPowerfulIgnoredEffect[i] && isPowerfulIgnoredEffect[currId])
|
||||
viableMoveScores[currId] -= 3;
|
||||
|
||||
switch (CompareMoveAccuracies(battlerAtk, battlerDef, currId, i))
|
||||
{
|
||||
// MgbaPrintf_("%S better than %S", gMoveNames[moves[currId]], gMoveNames[moves[i]]);
|
||||
ADJUST_SCORE(1);
|
||||
case 0:
|
||||
viableMoveScores[i] -= 2;
|
||||
break;
|
||||
case 1:
|
||||
viableMoveScores[currId] -= 2;
|
||||
break;
|
||||
}
|
||||
switch (AI_WhichMoveBetter(moves[currId], moves[i], battlerAtk, battlerDef, noOfHits[currId]))
|
||||
{
|
||||
case 0:
|
||||
viableMoveScores[i] -= 1;
|
||||
break;
|
||||
case 1:
|
||||
viableMoveScores[currId] -= 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Turns out the current move deals the most dmg compared to the other 3.
|
||||
if (!multipleBestMoves)
|
||||
ADJUST_SCORE(1);
|
||||
else
|
||||
{
|
||||
bestViableMoveScore = 0;
|
||||
for (i = 0; i < MAX_MON_MOVES; i++)
|
||||
{
|
||||
if (viableMoveScores[i] > bestViableMoveScore)
|
||||
bestViableMoveScore = viableMoveScores[i];
|
||||
}
|
||||
// Unless a better move was found increase score of current move
|
||||
if (viableMoveScores[currId] == bestViableMoveScore)
|
||||
ADJUST_SCORE(1);
|
||||
}
|
||||
}
|
||||
|
||||
return score;
|
||||
@ -3265,63 +3291,16 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
|
||||
// check thawing moves
|
||||
if ((gBattleMons[battlerAtk].status1 & (STATUS1_FREEZE | STATUS1_FROSTBITE)) && gBattleMoves[move].thawsUser)
|
||||
score += (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) ? 20 : 10;
|
||||
ADJUST_SCORE(10);
|
||||
|
||||
// check burn
|
||||
if (gBattleMons[battlerAtk].status1 & STATUS1_BURN)
|
||||
// check burn / frostbite
|
||||
if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_SMART_SWITCHING && AI_DATA->abilities[battlerAtk] == ABILITY_NATURAL_CURE)
|
||||
{
|
||||
switch (aiData->abilities[battlerAtk])
|
||||
{
|
||||
case ABILITY_GUTS:
|
||||
break;
|
||||
case ABILITY_NATURAL_CURE:
|
||||
if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_SMART_SWITCHING
|
||||
&& HasOnlyMovesWithSplit(battlerAtk, SPLIT_PHYSICAL, TRUE))
|
||||
score = 90; // Force switch if all your attacking moves are physical and you have Natural Cure.
|
||||
break;
|
||||
default:
|
||||
if (IS_MOVE_PHYSICAL(move) && gBattleMoves[move].effect != EFFECT_FACADE)
|
||||
ADJUST_SCORE(-2);
|
||||
break;
|
||||
}
|
||||
if ((gBattleMons[battlerAtk].status1 & STATUS1_BURN && HasOnlyMovesWithSplit(battlerAtk, SPLIT_PHYSICAL, TRUE))
|
||||
|| (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE && HasOnlyMovesWithSplit(battlerAtk, SPLIT_SPECIAL, TRUE)))
|
||||
ADJUST_SCORE(-20); // Force switch if all your attacking moves are physical and you have Natural Cure.
|
||||
}
|
||||
|
||||
// check frostbite
|
||||
if (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE)
|
||||
{
|
||||
switch (aiData->abilities[battlerAtk])
|
||||
{
|
||||
case ABILITY_GUTS:
|
||||
break;
|
||||
case ABILITY_NATURAL_CURE:
|
||||
if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_SMART_SWITCHING
|
||||
&& HasOnlyMovesWithSplit(battlerAtk, SPLIT_SPECIAL, TRUE))
|
||||
score = 90; // Force switch if all your attacking moves are special and you have Natural Cure.
|
||||
break;
|
||||
default:
|
||||
if (IS_MOVE_SPECIAL(move) && gBattleMoves[move].effect != EFFECT_FACADE)
|
||||
ADJUST_SCORE(-2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// attacker ability checks
|
||||
switch (aiData->abilities[battlerAtk])
|
||||
{
|
||||
case ABILITY_MOXIE:
|
||||
case ABILITY_BEAST_BOOST:
|
||||
case ABILITY_CHILLING_NEIGH:
|
||||
case ABILITY_GRIM_NEIGH:
|
||||
case ABILITY_AS_ONE_ICE_RIDER:
|
||||
case ABILITY_AS_ONE_SHADOW_RIDER:
|
||||
if (AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_FASTER) // Attacker should go first
|
||||
{
|
||||
if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, 0))
|
||||
ADJUST_SCORE(8); // prioritize killing target for stat boost
|
||||
}
|
||||
break;
|
||||
} // ability checks
|
||||
|
||||
// move effect checks
|
||||
switch (moveEffect)
|
||||
{
|
||||
@ -3333,11 +3312,8 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
IncreaseSleepScore(battlerAtk, battlerDef, move, &score);
|
||||
break;
|
||||
case EFFECT_ABSORB:
|
||||
if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT)
|
||||
ADJUST_SCORE(1);
|
||||
if (effectiveness <= AI_EFFECTIVENESS_x0_5 && AI_RandLessThan(50))
|
||||
ADJUST_SCORE(-3);
|
||||
break;
|
||||
if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT && effectiveness >= AI_EFFECTIVENESS_x1)
|
||||
ADJUST_SCORE(2);
|
||||
case EFFECT_EXPLOSION:
|
||||
case EFFECT_MEMENTO:
|
||||
if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] < 7)
|
||||
@ -3551,11 +3527,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
if (aiData->hpPercents[battlerAtk] < 90)
|
||||
ADJUST_SCORE(-2);
|
||||
break;
|
||||
case EFFECT_DREAM_EATER:
|
||||
if (!(gBattleMons[battlerDef].status1 & STATUS1_SLEEP))
|
||||
break;
|
||||
ADJUST_SCORE(1); // if target is asleep, dream eater is a pretty good move even without draining
|
||||
// fallthrough
|
||||
case EFFECT_ACUPRESSURE:
|
||||
break;
|
||||
case EFFECT_ATTACK_ACCURACY_UP: // hone claws
|
||||
@ -3704,20 +3675,12 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
|| HasHighCritRatioMove(battlerAtk))
|
||||
ADJUST_SCORE(2);
|
||||
break;
|
||||
case EFFECT_CONFUSE_HIT:
|
||||
if (sereneGraceBoost)
|
||||
ADJUST_SCORE(1);
|
||||
//fallthrough
|
||||
case EFFECT_CONFUSE:
|
||||
IncreaseConfusionScore(battlerAtk, battlerDef, move, &score);
|
||||
break;
|
||||
case EFFECT_PARALYZE:
|
||||
IncreaseParalyzeScore(battlerAtk, battlerDef, move, &score);
|
||||
break;
|
||||
case EFFECT_GRAV_APPLE:
|
||||
if (gFieldStatuses & STATUS_FIELD_GRAVITY)
|
||||
ADJUST_SCORE(2);
|
||||
// fall through
|
||||
case EFFECT_ATTACK_DOWN_HIT:
|
||||
case EFFECT_DEFENSE_DOWN_HIT:
|
||||
case EFFECT_SPECIAL_ATTACK_DOWN_HIT:
|
||||
@ -4213,14 +4176,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
IncreaseStatUpScore(battlerAtk, battlerDef, STAT_DEF, &score);
|
||||
IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPDEF, &score);
|
||||
break;
|
||||
case EFFECT_SPIT_UP:
|
||||
if (gDisableStructs[battlerAtk].stockpileCounter >= 2)
|
||||
ADJUST_SCORE(1);
|
||||
break;
|
||||
case EFFECT_ROLLOUT:
|
||||
if (gBattleMons[battlerAtk].status2 & STATUS2_DEFENSE_CURL)
|
||||
ADJUST_SCORE(8);
|
||||
break;
|
||||
case EFFECT_SWAGGER:
|
||||
if (HasMoveEffect(battlerAtk, EFFECT_FOUL_PLAY)
|
||||
|| HasMoveEffect(battlerAtk, EFFECT_PSYCH_UP)
|
||||
@ -4715,11 +4670,8 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
ADJUST_SCORE(2);
|
||||
break;
|
||||
case EFFECT_PLEDGE:
|
||||
if (isDoubleBattle)
|
||||
{
|
||||
if (HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_PLEDGE))
|
||||
ADJUST_SCORE(3); // Partner might use pledge move
|
||||
}
|
||||
if (isDoubleBattle && HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_PLEDGE))
|
||||
ADJUST_SCORE(3); // Partner might use pledge move
|
||||
break;
|
||||
case EFFECT_TRICK_ROOM:
|
||||
if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && GetBattlerSideSpeedAverage(battlerAtk) < GetBattlerSideSpeedAverage(battlerDef))
|
||||
@ -4922,15 +4874,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
ADJUST_SCORE(3);
|
||||
}
|
||||
break;
|
||||
case EFFECT_FLAIL:
|
||||
if (AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_FASTER) // Ai goes first
|
||||
{
|
||||
if (aiData->hpPercents[battlerAtk] < 20)
|
||||
ADJUST_SCORE(1);
|
||||
else if (aiData->hpPercents[battlerAtk] < 8)
|
||||
ADJUST_SCORE(2);
|
||||
}
|
||||
break;
|
||||
case EFFECT_SHORE_UP:
|
||||
if ((AI_GetWeather(aiData) & B_WEATHER_SANDSTORM)
|
||||
&& ShouldRecover(battlerAtk, battlerDef, move, 67))
|
||||
@ -4938,10 +4881,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
else if (ShouldRecover(battlerAtk, battlerDef, move, 50))
|
||||
ADJUST_SCORE(2);
|
||||
break;
|
||||
case EFFECT_FACADE:
|
||||
if (gBattleMons[battlerAtk].status1 & (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON | STATUS1_FROSTBITE))
|
||||
ADJUST_SCORE(1);
|
||||
break;
|
||||
case EFFECT_FOCUS_PUNCH:
|
||||
if (!isDoubleBattle && effectiveness > AI_EFFECTIVENESS_x0_5)
|
||||
{
|
||||
@ -4951,19 +4890,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
ADJUST_SCORE(1);
|
||||
}
|
||||
break;
|
||||
case EFFECT_SMELLINGSALT:
|
||||
if (gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS)
|
||||
ADJUST_SCORE(2);
|
||||
break;
|
||||
case EFFECT_WAKE_UP_SLAP:
|
||||
if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP)
|
||||
ADJUST_SCORE(2);
|
||||
break;
|
||||
case EFFECT_REVENGE:
|
||||
if (!(gBattleMons[battlerDef].status1 & STATUS1_SLEEP)
|
||||
&& !(gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION)))
|
||||
ADJUST_SCORE(2);
|
||||
break;
|
||||
case EFFECT_ENDEAVOR:
|
||||
if (AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_SLOWER) // Opponent faster
|
||||
{
|
||||
|
||||
@ -373,7 +373,6 @@ static const u16 sIgnoredPowerfulMoveEffects[] =
|
||||
EFFECT_RECHARGE,
|
||||
EFFECT_SKULL_BASH,
|
||||
EFFECT_SOLAR_BEAM,
|
||||
EFFECT_SPIT_UP,
|
||||
EFFECT_FOCUS_PUNCH,
|
||||
EFFECT_SUPERPOWER,
|
||||
EFFECT_ERUPTION,
|
||||
@ -2063,7 +2062,6 @@ bool32 HasMoveWithSplit(u32 battler, u32 split)
|
||||
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetBattleMoveSplit(moves[i]) == split)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
@ -719,7 +719,7 @@ void CB2_BattleDebugMenu(void)
|
||||
data->currentMainListItemId = 0;
|
||||
data->activeWindow = ACTIVE_WIN_MAIN;
|
||||
data->secondaryListTaskId = 0xFF;
|
||||
CopyWindowToVram(data->mainListWindowId, 3);
|
||||
CopyWindowToVram(data->mainListWindowId, COPYWIN_FULL);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 5:
|
||||
@ -740,7 +740,7 @@ static void PutMovesPointsText(struct BattleDebugMenu *data)
|
||||
{
|
||||
text[0] = CHAR_SPACE;
|
||||
StringCopy(text + 1, gMoveNames[gBattleMons[data->aiBattlerId].moves[i]]);
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, 1, text, 0, i * 15, 0, NULL);
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 0, i * 15, 0, NULL);
|
||||
for (count = 0, j = 0; j < MAX_BATTLERS_COUNT; j++)
|
||||
{
|
||||
if (data->spriteIds.aiIconSpriteIds[j] == 0xFF)
|
||||
@ -749,18 +749,18 @@ static void PutMovesPointsText(struct BattleDebugMenu *data)
|
||||
ConvertIntToDecimalStringN(text,
|
||||
gBattleStruct->aiFinalScore[data->aiBattlerId][battlerDef][i],
|
||||
STR_CONV_MODE_RIGHT_ALIGN, 3);
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, 1, text, 83 + count * 54, i * 15, 0, NULL);
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 83 + count * 54, i * 15, 0, NULL);
|
||||
|
||||
ConvertIntToDecimalStringN(text,
|
||||
AI_DATA->simulatedDmg[data->aiBattlerId][battlerDef][i],
|
||||
STR_CONV_MODE_RIGHT_ALIGN, 3);
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, 1, text, 110 + count * 54, i * 15, 0, NULL);
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 110 + count * 54, i * 15, 0, NULL);
|
||||
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
CopyWindowToVram(data->aiMovesWindowId, 3);
|
||||
CopyWindowToVram(data->aiMovesWindowId, COPYWIN_FULL);
|
||||
Free(text);
|
||||
}
|
||||
|
||||
@ -852,7 +852,7 @@ static void PutAiInfoText(struct BattleDebugMenu *data)
|
||||
// item names
|
||||
for (i = 0; i < ARRAY_COUNT(sAiInfoItemNames); i++)
|
||||
{
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, 1, sAiInfoItemNames[i], 3, i * 15, 0, NULL);
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, sAiInfoItemNames[i], 3, i * 15, 0, NULL);
|
||||
}
|
||||
|
||||
// items info
|
||||
@ -864,13 +864,13 @@ static void PutAiInfoText(struct BattleDebugMenu *data)
|
||||
u16 holdEffect = AI_DATA->holdEffects[i];
|
||||
u16 item = AI_DATA->items[i];
|
||||
u8 x = (i == B_POSITION_PLAYER_LEFT) ? 83 + (i) * 75 : 83 + (i-1) * 75;
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, 0, gAbilityNames[ability], x, 0, 0, NULL);
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, 0, ItemId_GetName(item), x, 15, 0, NULL);
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, 0, GetHoldEffectName(holdEffect), x, 30, 0, NULL);
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, FONT_SMALL, gAbilityNames[ability], x, 0, 0, NULL);
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, FONT_SMALL, ItemId_GetName(item), x, 15, 0, NULL);
|
||||
AddTextPrinterParameterized(data->aiMovesWindowId, FONT_SMALL, GetHoldEffectName(holdEffect), x, 30, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
CopyWindowToVram(data->aiMovesWindowId, 3);
|
||||
CopyWindowToVram(data->aiMovesWindowId, COPYWIN_FULL);
|
||||
Free(text);
|
||||
}
|
||||
|
||||
@ -917,7 +917,7 @@ static void PutAiPartyText(struct BattleDebugMenu *data)
|
||||
AddTextPrinterParameterized5(data->aiMovesWindowId, FONT_SMALL_NARROW, text, i * 41, 35 + (j + 1) * 15, 0, NULL, 0, 0);
|
||||
}
|
||||
|
||||
CopyWindowToVram(data->aiMovesWindowId, 3);
|
||||
CopyWindowToVram(data->aiMovesWindowId, COPYWIN_FULL);
|
||||
Free(text);
|
||||
}
|
||||
|
||||
@ -1180,7 +1180,7 @@ static void Task_DebugMenuProcessInput(u8 taskId)
|
||||
data->currentSecondaryListItemId = listItemId;
|
||||
data->modifyWindowId = AddWindow(&sModifyWindowTemplate);
|
||||
PutWindowTilemap(data->modifyWindowId);
|
||||
CopyWindowToVram(data->modifyWindowId, 3);
|
||||
CopyWindowToVram(data->modifyWindowId, COPYWIN_FULL);
|
||||
SetUpModifyArrows(data);
|
||||
PrintDigitChars(data);
|
||||
data->activeWindow = ACTIVE_WIN_MODIFY;
|
||||
@ -1264,8 +1264,8 @@ static void PrintOnBattlerWindow(u8 windowId, u8 battlerId)
|
||||
StringCopy(&text[4], gBattleMons[battlerId].nickname);
|
||||
|
||||
FillWindowPixelBuffer(windowId, 0x11);
|
||||
AddTextPrinterParameterized(windowId, 1, text, 0, 0, 0, NULL);
|
||||
CopyWindowToVram(windowId, 3);
|
||||
AddTextPrinterParameterized(windowId, FONT_NORMAL, text, 0, 0, 0, NULL);
|
||||
CopyWindowToVram(windowId, COPYWIN_FULL);
|
||||
}
|
||||
|
||||
static void UpdateWindowsOnChangedBattler(struct BattleDebugMenu *data)
|
||||
@ -1371,7 +1371,7 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data)
|
||||
listTemplate.windowId = data->secondaryListWindowId;
|
||||
|
||||
data->secondaryListTaskId = ListMenuInit(&listTemplate, 0, 0);
|
||||
CopyWindowToVram(data->secondaryListWindowId, 3);
|
||||
CopyWindowToVram(data->secondaryListWindowId, COPYWIN_FULL);
|
||||
}
|
||||
|
||||
static void PadString(const u8 *src, u8 *dst)
|
||||
@ -1500,7 +1500,7 @@ static void PrintDigitChars(struct BattleDebugMenu *data)
|
||||
|
||||
text[i] = EOS;
|
||||
|
||||
AddTextPrinterParameterized(data->modifyWindowId, 1, text, 3, 0, 0, NULL);
|
||||
AddTextPrinterParameterized(data->modifyWindowId, FONT_NORMAL, text, 3, 0, 0, NULL);
|
||||
}
|
||||
|
||||
static const u32 GetBitfieldToAndValue(u32 currBit, u32 bitsCount)
|
||||
|
||||
@ -979,7 +979,7 @@ static const u16 sFinalStrikeOnlyEffects[] =
|
||||
EFFECT_SECRET_POWER,
|
||||
EFFECT_SMACK_DOWN,
|
||||
EFFECT_SPARKLING_ARIA,
|
||||
EFFECT_SMELLINGSALT,
|
||||
EFFECT_SMELLING_SALTS,
|
||||
EFFECT_WAKE_UP_SLAP,
|
||||
EFFECT_HIT_ESCAPE,
|
||||
EFFECT_RECOIL_HP_25,
|
||||
@ -2782,7 +2782,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
|
||||
&& !primary && gBattleScripting.moveEffect <= MOVE_EFFECT_CONFUSION)
|
||||
INCREMENT_RESET_RETURN
|
||||
|
||||
if (TestSheerForceFlag(gBattlerAttacker, gCurrentMove) && affectsUser != MOVE_EFFECT_AFFECTS_USER)
|
||||
if (TestSheerForceFlag(gBattlerAttacker, gCurrentMove) && gBattleScripting.moveEffect != MOVE_EFFECT_CHARGING)
|
||||
INCREMENT_RESET_RETURN
|
||||
|
||||
if (gBattleMons[gEffectBattler].hp == 0 && !activateAfterFaint)
|
||||
@ -12777,6 +12777,8 @@ static void Cmd_trychoosesleeptalkmove(void)
|
||||
}
|
||||
else // at least one move can be chosen
|
||||
{
|
||||
// Set Sleep Talk as used move, so it works with Last Resort.
|
||||
gDisableStructs[gBattlerAttacker].usedMoves |= gBitTable[gCurrMovePos];
|
||||
do
|
||||
{
|
||||
movePosition = MOD(Random(), MAX_MON_MOVES);
|
||||
|
||||
@ -253,7 +253,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
|
||||
[EFFECT_MEMENTO] = 7,
|
||||
[EFFECT_FACADE] = 1,
|
||||
[EFFECT_FOCUS_PUNCH] = 7,
|
||||
[EFFECT_SMELLINGSALT] = 1,
|
||||
[EFFECT_SMELLING_SALTS] = 1,
|
||||
[EFFECT_FOLLOW_ME] = 5,
|
||||
[EFFECT_NATURE_POWER] = 0,
|
||||
[EFFECT_CHARGE] = 4,
|
||||
|
||||
@ -5146,8 +5146,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
|
||||
&& TARGET_TURN_DAMAGED
|
||||
&& IsBattlerAlive(battler)
|
||||
&& IS_MOVE_PHYSICAL(gCurrentMove)
|
||||
&& (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) // Don't activate if speed cannot be raised
|
||||
|| CompareStat(battler, STAT_DEF, MIN_STAT_STAGE, CMP_GREATER_THAN))) // Don't activate if defense cannot be lowered
|
||||
&& (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) // Don't activate if both Speed and Defense cannot be raised.
|
||||
|| CompareStat(battler, STAT_DEF, MIN_STAT_STAGE, CMP_GREATER_THAN)))
|
||||
{
|
||||
if (gBattleMoves[gCurrentMove].effect == EFFECT_HIT_ESCAPE && CanBattlerSwitch(gBattlerAttacker))
|
||||
gProtectStructs[battler].disableEjectPack = TRUE; // Set flag for target
|
||||
@ -8555,7 +8555,7 @@ static inline u32 CalcMoveBasePower(u32 move, u32 battlerAtk, u32 battlerDef, u3
|
||||
if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP || abilityDef == ABILITY_COMATOSE)
|
||||
basePower *= 2;
|
||||
break;
|
||||
case EFFECT_SMELLINGSALT:
|
||||
case EFFECT_SMELLING_SALTS:
|
||||
if (gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS)
|
||||
basePower *= 2;
|
||||
break;
|
||||
|
||||
@ -4748,7 +4748,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
#else
|
||||
.power = 60,
|
||||
#endif
|
||||
.effect = EFFECT_SMELLINGSALT,
|
||||
.effect = EFFECT_SMELLING_SALTS,
|
||||
.type = TYPE_NORMAL,
|
||||
.accuracy = 100,
|
||||
.pp = 10,
|
||||
@ -15142,7 +15142,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_RAISE_TEAM_DEFENSE,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_VINE_LASH] =
|
||||
{ //ANIM TODO
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15156,7 +15156,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_VINE_LASH,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_WILDFIRE] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15170,7 +15170,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_WILDFIRE,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_CANNONADE] =
|
||||
{ //ANIM TODO
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15184,7 +15184,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_CANNONADE,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_BEFUDDLE] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15198,7 +15198,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_EFFECT_SPORE_FOES,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_VOLT_CRASH] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15212,7 +15212,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_PARALYZE_FOES,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_GOLD_RUSH] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15226,7 +15226,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_CONFUSE_FOES_PAY_DAY,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_CHI_STRIKE] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15240,7 +15240,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_CRIT_PLUS,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_TERROR] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15254,7 +15254,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_MEAN_LOOK,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_FOAM_BURST] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15268,7 +15268,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_LOWER_SPEED_2_FOES,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_RESONANCE] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15282,7 +15282,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_AURORA_VEIL,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_CUDDLE] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15296,7 +15296,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_INFATUATE_FOES,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_REPLENISH] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15310,7 +15310,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_RECYCLE_BERRIES,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_MALODOR] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15324,7 +15324,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_POISON_FOES,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_MELTDOWN] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15338,7 +15338,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_TORMENT_FOES,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_DRUM_SOLO] =
|
||||
{ //ANIM TODO
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15353,7 +15353,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.argument = MAX_EFFECT_FIXED_POWER, //EFFECT TODO
|
||||
.ignoresTargetAbility = TRUE,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_FIREBALL] =
|
||||
{ //ANIM TODO
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15368,7 +15368,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.argument = MAX_EFFECT_FIXED_POWER, //EFFECT TODO
|
||||
.ignoresTargetAbility = TRUE,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_HYDROSNIPE] =
|
||||
{ //ANIM TODO
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15383,7 +15383,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.argument = MAX_EFFECT_FIXED_POWER, //EFFECT TODO
|
||||
.ignoresTargetAbility = TRUE,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_WIND_RAGE] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15397,7 +15397,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_DEFOG,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_GRAVITAS] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15411,7 +15411,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_GRAVITY,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_STONESURGE] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15425,7 +15425,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_STEALTH_ROCK,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_VOLCALITH] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15439,7 +15439,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_VOLCALITH,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_TARTNESS] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15453,7 +15453,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_LOWER_EVASIVENESS_FOES,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_SWEETNESS] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15467,7 +15467,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_AROMATHERAPY,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_SANDBLAST] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15481,7 +15481,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_SANDBLAST_FOES,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_STUN_SHOCK] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15495,7 +15495,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_POISON_PARALYZE_FOES,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_CENTIFERNO] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15509,7 +15509,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_FIRE_SPIN_FOES,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_SMITE] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15523,7 +15523,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_CONFUSE_FOES,
|
||||
},
|
||||
|
||||
|
||||
|
||||
[MOVE_G_MAX_SNOOZE] =
|
||||
{
|
||||
@ -15538,7 +15538,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_YAWN_FOE,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_FINALE] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15552,7 +15552,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_HEAL_TEAM,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_STEELSURGE] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15566,7 +15566,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_STEELSURGE,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_DEPLETION] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15580,7 +15580,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_SPITE,
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_ONE_BLOW] =
|
||||
{
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15594,7 +15594,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_BYPASS_PROTECT, //EFFECT TODO
|
||||
},
|
||||
|
||||
|
||||
[MOVE_G_MAX_RAPID_FLOW] =
|
||||
{ //ANIM TODO
|
||||
.effect = EFFECT_MAX_MOVE,
|
||||
@ -15608,5 +15608,5 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = MAX_EFFECT_BYPASS_PROTECT, //EFFECT TODO
|
||||
},
|
||||
|
||||
|
||||
};
|
||||
|
||||
@ -7308,96 +7308,96 @@ const u8 gMonFootprint_Runerigus[] = INCBIN_U8("graphics/pokemon/runerigus/footp
|
||||
const u8 gMonFootprint_Milcery[] = INCBIN_U8("graphics/pokemon/milcery/footprint.1bpp");
|
||||
|
||||
const u32 gMonFrontPic_AlcremieStrawberry[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/front.4bpp.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/Strawberry_Default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/Strawberry_Ruby_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/Strawberry_Matcha_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/Strawberry_Mint_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/Strawberry_Lemon_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberrySaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/Strawberry_Salted_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/Strawberry_Ruby_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/Strawberry_Caramel_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/Strawberry_Rainbow_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/strawberry_default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/strawberry_ruby_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/strawberry_matcha_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/strawberry_mint_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/strawberry_lemon_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberrySaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/strawberry_salted_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/strawberry_ruby_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/strawberry_caramel_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStrawberryRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/strawberry_rainbow_swirl.gbapal.lz");
|
||||
const u32 gMonBackPic_AlcremieStrawberry[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/back.4bpp.lz");
|
||||
const u32 gMonShinyPalette_AlcremieStrawberry[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/Strawberry_Shiny.gbapal.lz");
|
||||
const u32 gMonShinyPalette_AlcremieStrawberry[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/strawberry_shiny.gbapal.lz");
|
||||
const u8 gMonFootprint_Alcremie[] = INCBIN_U8("graphics/pokemon/alcremie/footprint.1bpp");
|
||||
|
||||
const u32 gMonFrontPic_AlcremieBerry[] = INCBIN_U32("graphics/pokemon/alcremie/berry/front.4bpp.lz");
|
||||
const u32 gMonPalette_AlcremieBerryVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/berry/Berry_Default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/berry/Berry_Ruby_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/berry/Berry_Matcha_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/berry/Berry_Mint_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/berry/Berry_Lemon_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerrySaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/berry/Berry_Salted_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/berry/Berry_Ruby_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/berry/Berry_Caramel_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/berry/Berry_Rainbow_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/berry/berry_default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/berry/berry_ruby_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/berry/berry_matcha_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/berry/berry_mint_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/berry/berry_lemon_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerrySaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/berry/berry_salted_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/berry/berry_ruby_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/berry/berry_caramel_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieBerryRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/berry/berry_rainbow_swirl.gbapal.lz");
|
||||
const u32 gMonBackPic_AlcremieBerry[] = INCBIN_U32("graphics/pokemon/alcremie/berry/back.4bpp.lz");
|
||||
const u32 gMonShinyPalette_AlcremieBerry[] = INCBIN_U32("graphics/pokemon/alcremie/berry/Berry_Shiny.gbapal.lz");
|
||||
const u32 gMonShinyPalette_AlcremieBerry[] = INCBIN_U32("graphics/pokemon/alcremie/berry/berry_shiny.gbapal.lz");
|
||||
|
||||
const u32 gMonFrontPic_AlcremieLove[] = INCBIN_U32("graphics/pokemon/alcremie/love/front.4bpp.lz");
|
||||
const u32 gMonPalette_AlcremieLoveVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/love/Love_Default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/love/Love_Ruby_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/love/Love_Matcha_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/love/Love_Mint_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/love/Love_Lemon_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveSaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/love/Love_Salted_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/love/Love_Ruby_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/love/Love_Caramel_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/love/Love_Rainbow_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/love/love_default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/love/love_ruby_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/love/love_matcha_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/love/love_mint_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/love/love_lemon_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveSaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/love/love_salted_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/love/love_ruby_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/love/love_caramel_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieLoveRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/love/love_rainbow_swirl.gbapal.lz");
|
||||
const u32 gMonBackPic_AlcremieLove[] = INCBIN_U32("graphics/pokemon/alcremie/love/back.4bpp.lz");
|
||||
const u32 gMonShinyPalette_AlcremieLove[] = INCBIN_U32("graphics/pokemon/alcremie/love/Love_Shiny.gbapal.lz");
|
||||
const u32 gMonShinyPalette_AlcremieLove[] = INCBIN_U32("graphics/pokemon/alcremie/love/love_shiny.gbapal.lz");
|
||||
|
||||
const u32 gMonFrontPic_AlcremieStar[] = INCBIN_U32("graphics/pokemon/alcremie/star/front.4bpp.lz");
|
||||
const u32 gMonPalette_AlcremieStarVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/star/Star_Default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/star/Star_Ruby_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/star/Star_Matcha_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/star/Star_Mint_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/star/Star_Lemon_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarSaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/star/Star_Salted_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/star/Star_Ruby_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/star/Star_Caramel_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/star/Star_Rainbow_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/star/star_default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/star/star_ruby_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/star/star_matcha_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/star/star_mint_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/star/star_lemon_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarSaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/star/star_salted_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/star/star_ruby_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/star/star_caramel_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieStarRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/star/star_rainbow_swirl.gbapal.lz");
|
||||
const u32 gMonBackPic_AlcremieStar[] = INCBIN_U32("graphics/pokemon/alcremie/star/back.4bpp.lz");
|
||||
const u32 gMonShinyPalette_AlcremieStar[] = INCBIN_U32("graphics/pokemon/alcremie/star/Star_Shiny.gbapal.lz");
|
||||
const u32 gMonShinyPalette_AlcremieStar[] = INCBIN_U32("graphics/pokemon/alcremie/star/star_shiny.gbapal.lz");
|
||||
|
||||
const u32 gMonFrontPic_AlcremieClover[] = INCBIN_U32("graphics/pokemon/alcremie/clover/front.4bpp.lz");
|
||||
const u32 gMonPalette_AlcremieCloverVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/clover/Clover_Default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/clover/Clover_Ruby_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/clover/Clover_Matcha_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/clover/Clover_Mint_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/clover/Clover_Lemon_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverSaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/clover/Clover_Salted_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/clover/Clover_Ruby_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/clover/Clover_Caramel_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/clover/Clover_Rainbow_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/clover/clover_default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/clover/clover_ruby_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/clover/clover_matcha_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/clover/clover_mint_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/clover/clover_lemon_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverSaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/clover/clover_salted_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/clover/clover_ruby_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/clover/clover_caramel_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieCloverRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/clover/clover_rainbow_swirl.gbapal.lz");
|
||||
const u32 gMonBackPic_AlcremieClover[] = INCBIN_U32("graphics/pokemon/alcremie/clover/back.4bpp.lz");
|
||||
const u32 gMonShinyPalette_AlcremieClover[] = INCBIN_U32("graphics/pokemon/alcremie/clover/Clover_Shiny.gbapal.lz");
|
||||
const u32 gMonShinyPalette_AlcremieClover[] = INCBIN_U32("graphics/pokemon/alcremie/clover/clover_shiny.gbapal.lz");
|
||||
|
||||
const u32 gMonFrontPic_AlcremieFlower[] = INCBIN_U32("graphics/pokemon/alcremie/flower/front.4bpp.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/flower/Flower_Default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/flower/Flower_Ruby_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/flower/Flower_Matcha_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/flower/Flower_Mint_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/flower/Flower_Lemon_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerSaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/flower/Flower_Salted_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/flower/Flower_Ruby_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/flower/Flower_Caramel_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/flower/Flower_Rainbow_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/flower/flower_default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/flower/flower_ruby_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/flower/flower_matcha_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/flower/flower_mint_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/flower/flower_lemon_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerSaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/flower/flower_salted_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/flower/flower_ruby_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/flower/flower_caramel_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieFlowerRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/flower/flower_rainbow_swirl.gbapal.lz");
|
||||
const u32 gMonBackPic_AlcremieFlower[] = INCBIN_U32("graphics/pokemon/alcremie/flower/back.4bpp.lz");
|
||||
const u32 gMonShinyPalette_AlcremieFlower[] = INCBIN_U32("graphics/pokemon/alcremie/flower/Flower_Shiny.gbapal.lz");
|
||||
const u32 gMonShinyPalette_AlcremieFlower[] = INCBIN_U32("graphics/pokemon/alcremie/flower/flower_shiny.gbapal.lz");
|
||||
|
||||
const u32 gMonFrontPic_AlcremieRibbon[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/front.4bpp.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/Ribbon_Default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/Ribbon_Ruby_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/Ribbon_Matcha_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/Ribbon_Mint_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/Ribbon_Lemon_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonSaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/Ribbon_Salted_Cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/Ribbon_Ruby_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/Ribbon_Caramel_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/Ribbon_Rainbow_Swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonVanillaCream[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/ribbon_default.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonRubyCream[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/ribbon_ruby_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonMatchaCream[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/ribbon_matcha_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonMintCream[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/ribbon_mint_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonLemonCream[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/ribbon_lemon_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonSaltedCream[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/ribbon_salted_cream.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonRubySwirl[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/ribbon_ruby_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonCaramelSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/ribbon_caramel_swirl.gbapal.lz");
|
||||
const u32 gMonPalette_AlcremieRibbonRainbowSwirl[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/ribbon_rainbow_swirl.gbapal.lz");
|
||||
const u32 gMonBackPic_AlcremieRibbon[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/back.4bpp.lz");
|
||||
const u32 gMonShinyPalette_AlcremieRibbon[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/Ribbon_Shiny.gbapal.lz");
|
||||
const u32 gMonShinyPalette_AlcremieRibbon[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/ribbon_shiny.gbapal.lz");
|
||||
|
||||
const u8 gMonFootprint_Falinks[] = INCBIN_U8("graphics/pokemon/falinks/footprint.1bpp");
|
||||
const u8 gMonFootprint_Pincurchin[] = INCBIN_U8("graphics/pokemon/pincurchin/footprint.1bpp");
|
||||
|
||||
@ -24559,7 +24559,7 @@ const struct SpeciesInfo gSpeciesInfo[] =
|
||||
.evYield_SpAttack = 3,
|
||||
.genderRatio = MON_GENDERLESS,
|
||||
.eggCycles = 120,
|
||||
.friendship = 100,
|
||||
.friendship = P_UPDATED_FRIENDSHIP >= GEN_8 ? STANDARD_FRIENDSHIP : 100,
|
||||
.growthRate = GROWTH_SLOW,
|
||||
.eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},
|
||||
.abilities = {ABILITY_MAGICIAN, ABILITY_NONE},
|
||||
|
||||
1762
src/debug.c
1762
src/debug.c
File diff suppressed because it is too large
Load Diff
@ -1588,7 +1588,7 @@ void PrintMenuTable(u8 windowId, u8 itemCount, const struct MenuAction *menuActi
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < itemCount; i++)
|
||||
AddTextPrinterParameterized(windowId, 1, menuActions[i].text, 8, (i * 16) + 1, TEXT_SKIP_DRAW, NULL);
|
||||
AddTextPrinterParameterized(windowId, FONT_NORMAL, menuActions[i].text, 8, (i * 16) + 1, TEXT_SKIP_DRAW, NULL);
|
||||
|
||||
CopyWindowToVram(windowId, COPYWIN_GFX);
|
||||
}
|
||||
@ -1652,7 +1652,7 @@ void PrintMenuGridTable(u8 windowId, u8 optionWidth, u8 columns, u8 rows, const
|
||||
for (i = 0; i < rows; i++)
|
||||
{
|
||||
for (j = 0; j < columns; j++)
|
||||
AddTextPrinterParameterized(windowId, 1, menuActions[(i * columns) + j].text, (optionWidth * j) + 8, (i * 16) + 1, TEXT_SKIP_DRAW, NULL);
|
||||
AddTextPrinterParameterized(windowId, FONT_NORMAL, menuActions[(i * columns) + j].text, (optionWidth * j) + 8, (i * 16) + 1, TEXT_SKIP_DRAW, NULL);
|
||||
}
|
||||
CopyWindowToVram(windowId, COPYWIN_GFX);
|
||||
}
|
||||
@ -1986,7 +1986,7 @@ void PrintPlayerNameOnWindow(u8 windowId, const u8 *src, u16 x, u16 y)
|
||||
|
||||
StringExpandPlaceholders(gStringVar4, src);
|
||||
|
||||
AddTextPrinterParameterized(windowId, 1, gStringVar4, x, y, TEXT_SKIP_DRAW, 0);
|
||||
AddTextPrinterParameterized(windowId, FONT_NORMAL, gStringVar4, x, y, TEXT_SKIP_DRAW, 0);
|
||||
}
|
||||
|
||||
static void UNUSED UnusedBlitBitmapRect(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height)
|
||||
|
||||
@ -4935,7 +4935,7 @@ static void ResetStatsWindows(void)
|
||||
{
|
||||
FillWindowPixelBuffer(i, PIXEL_FILL(0));
|
||||
PutWindowTilemap(i);
|
||||
CopyWindowToVram(i, 3);
|
||||
CopyWindowToVram(i, COPYWIN_FULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -6092,7 +6092,7 @@ static void EvoFormsPage_PrintNavigationButtons(void)
|
||||
}
|
||||
|
||||
PutWindowTilemap(WIN_NAVIGATION_BUTTONS);
|
||||
CopyWindowToVram(WIN_NAVIGATION_BUTTONS, 3);
|
||||
CopyWindowToVram(WIN_NAVIGATION_BUTTONS, COPYWIN_FULL);
|
||||
}
|
||||
|
||||
static void ResetEvoScreenDataStruct(void)
|
||||
@ -6151,10 +6151,10 @@ static void Task_LoadEvolutionScreen(u8 taskId)
|
||||
LoadTilesetTilemapHGSS(EVO_SCREEN);
|
||||
FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
|
||||
PutWindowTilemap(WIN_INFO);
|
||||
CopyWindowToVram(WIN_INFO, 3);
|
||||
CopyWindowToVram(WIN_INFO, COPYWIN_FULL);
|
||||
FillWindowPixelBuffer(WIN_NAVIGATION_BUTTONS, PIXEL_FILL(0));
|
||||
PutWindowTilemap(WIN_NAVIGATION_BUTTONS);
|
||||
CopyWindowToVram(WIN_NAVIGATION_BUTTONS, 3);
|
||||
CopyWindowToVram(WIN_NAVIGATION_BUTTONS, COPYWIN_FULL);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
@ -6825,10 +6825,10 @@ static void Task_LoadFormsScreen(u8 taskId)
|
||||
LoadTilesetTilemapHGSS(FORMS_SCREEN);
|
||||
FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
|
||||
PutWindowTilemap(WIN_INFO);
|
||||
CopyWindowToVram(WIN_INFO, 3);
|
||||
CopyWindowToVram(WIN_INFO, COPYWIN_FULL);
|
||||
FillWindowPixelBuffer(WIN_NAVIGATION_BUTTONS, PIXEL_FILL(0));
|
||||
PutWindowTilemap(WIN_NAVIGATION_BUTTONS);
|
||||
CopyWindowToVram(WIN_NAVIGATION_BUTTONS, 3);
|
||||
CopyWindowToVram(WIN_NAVIGATION_BUTTONS, COPYWIN_FULL);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
|
||||
@ -434,7 +434,7 @@ static void PrintInstructionsOnWindow(struct PokemonDebugMenu *data)
|
||||
else
|
||||
AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsSubmenuTwo, x, 0, 0, NULL);
|
||||
}
|
||||
CopyWindowToVram(WIN_INSTRUCTIONS, 3);
|
||||
CopyWindowToVram(WIN_INSTRUCTIONS, COPYWIN_FULL);
|
||||
|
||||
//Bottom left text
|
||||
FillWindowPixelBuffer(WIN_BOTTOM_LEFT, PIXEL_FILL(0));
|
||||
@ -496,7 +496,7 @@ static void PrintDigitChars(struct PokemonDebugMenu *data)
|
||||
StringCopy(&text[i], GetSpeciesName(species));
|
||||
|
||||
FillWindowPixelBuffer(WIN_NAME_NUMBERS, 0x11);
|
||||
AddTextPrinterParameterized(WIN_NAME_NUMBERS, 1, text, 6, 0, 0, NULL);
|
||||
AddTextPrinterParameterized(WIN_NAME_NUMBERS, FONT_NORMAL, text, 6, 0, 0, NULL);
|
||||
}
|
||||
|
||||
static u32 CharDigitsToValue(u8 *charDigits, u8 maxDigits)
|
||||
@ -1060,7 +1060,7 @@ static void ResetPokemonDebugWindows(void)
|
||||
{
|
||||
FillWindowPixelBuffer(i, PIXEL_FILL(0));
|
||||
PutWindowTilemap(i);
|
||||
CopyWindowToVram(i, 3);
|
||||
CopyWindowToVram(i, COPYWIN_FULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
117
test/battle/ability/defiant.c
Normal file
117
test/battle/ability/defiant.c
Normal file
@ -0,0 +1,117 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
DOUBLE_BATTLE_TEST("Defiant sharply raises player's Attack after Intimidate")
|
||||
{
|
||||
u32 abilityLeft, abilityRight;
|
||||
|
||||
PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_VITAL_SPIRIT; }
|
||||
PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_DEFIANT; }
|
||||
PARAMETRIZE { abilityLeft = ABILITY_DEFIANT; abilityRight = ABILITY_VITAL_SPIRIT; }
|
||||
PARAMETRIZE { abilityLeft = ABILITY_DEFIANT; abilityRight = ABILITY_DEFIANT; }
|
||||
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_MANKEY) { Ability(abilityLeft); }
|
||||
PLAYER(SPECIES_PRIMEAPE) { Ability(abilityRight); }
|
||||
OPPONENT(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); }
|
||||
OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); }
|
||||
} WHEN {
|
||||
TURN { MOVE(playerLeft, MOVE_TACKLE, target:opponentLeft); MOVE(playerRight, MOVE_TACKLE, target:opponentRight); }
|
||||
} SCENE {
|
||||
//1st mon Intimidate
|
||||
ABILITY_POPUP(opponentLeft, ABILITY_INTIMIDATE);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft);
|
||||
MESSAGE("Foe Gyarados's Intimidate cuts Mankey's attack!");
|
||||
if (abilityLeft == ABILITY_DEFIANT) {
|
||||
ABILITY_POPUP(playerLeft, ABILITY_DEFIANT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft);
|
||||
MESSAGE("Mankey's Attack sharply rose!");
|
||||
}
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight);
|
||||
MESSAGE("Foe Gyarados's Intimidate cuts Primeape's attack!");
|
||||
if (abilityRight == ABILITY_DEFIANT) {
|
||||
ABILITY_POPUP(playerRight, ABILITY_DEFIANT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight);
|
||||
MESSAGE("Primeape's Attack sharply rose!");
|
||||
}
|
||||
|
||||
//2nd mon Intimidate
|
||||
ABILITY_POPUP(opponentRight, ABILITY_INTIMIDATE);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft);
|
||||
MESSAGE("Foe Arbok's Intimidate cuts Mankey's attack!");
|
||||
if (abilityLeft == ABILITY_DEFIANT) {
|
||||
ABILITY_POPUP(playerLeft, ABILITY_DEFIANT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft);
|
||||
MESSAGE("Mankey's Attack sharply rose!");
|
||||
}
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight);
|
||||
MESSAGE("Foe Arbok's Intimidate cuts Primeape's attack!");
|
||||
if (abilityRight == ABILITY_DEFIANT) {
|
||||
ABILITY_POPUP(playerRight, ABILITY_DEFIANT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight);
|
||||
MESSAGE("Primeape's Attack sharply rose!");
|
||||
}
|
||||
} FINALLY {
|
||||
// -2 from Intimidates and +4 from Defiants gets +2 total
|
||||
EXPECT_EQ(playerLeft->statStages[STAT_ATK], (abilityLeft == ABILITY_DEFIANT) ? DEFAULT_STAT_STAGE + 2 : DEFAULT_STAT_STAGE - 2);
|
||||
EXPECT_EQ(playerRight->statStages[STAT_ATK], (abilityRight == ABILITY_DEFIANT) ? DEFAULT_STAT_STAGE + 2 : DEFAULT_STAT_STAGE - 2);
|
||||
}
|
||||
}
|
||||
|
||||
// Same as above, but for opponent.
|
||||
DOUBLE_BATTLE_TEST("Defiant sharply raises opponent's Attack after Intimidate")
|
||||
{
|
||||
u32 abilityLeft, abilityRight;
|
||||
|
||||
PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_VITAL_SPIRIT; }
|
||||
PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_DEFIANT; }
|
||||
PARAMETRIZE { abilityLeft = ABILITY_DEFIANT; abilityRight = ABILITY_VITAL_SPIRIT; }
|
||||
PARAMETRIZE { abilityLeft = ABILITY_DEFIANT; abilityRight = ABILITY_DEFIANT; }
|
||||
|
||||
GIVEN {
|
||||
OPPONENT(SPECIES_MANKEY) { Ability(abilityLeft); }
|
||||
OPPONENT(SPECIES_PRIMEAPE) { Ability(abilityRight); }
|
||||
PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); }
|
||||
PLAYER(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); }
|
||||
} WHEN {
|
||||
TURN { MOVE(opponentLeft, MOVE_TACKLE, target:playerLeft); MOVE(opponentRight, MOVE_TACKLE, target:playerRight); }
|
||||
} SCENE {
|
||||
//1st mon Intimidate
|
||||
ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft);
|
||||
MESSAGE("Gyarados's Intimidate cuts Foe Mankey's attack!");
|
||||
if (abilityLeft == ABILITY_DEFIANT) {
|
||||
ABILITY_POPUP(opponentLeft, ABILITY_DEFIANT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft);
|
||||
MESSAGE("Foe Mankey's Attack sharply rose!");
|
||||
}
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight);
|
||||
MESSAGE("Gyarados's Intimidate cuts Foe Primeape's attack!");
|
||||
if (abilityRight == ABILITY_DEFIANT) {
|
||||
ABILITY_POPUP(opponentRight, ABILITY_DEFIANT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight);
|
||||
MESSAGE("Foe Primeape's Attack sharply rose!");
|
||||
}
|
||||
|
||||
//2nd mon Intimidate
|
||||
ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft);
|
||||
MESSAGE("Arbok's Intimidate cuts Foe Mankey's attack!");
|
||||
if (abilityLeft == ABILITY_DEFIANT) {
|
||||
ABILITY_POPUP(opponentLeft, ABILITY_DEFIANT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft);
|
||||
MESSAGE("Foe Mankey's Attack sharply rose!");
|
||||
}
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight);
|
||||
MESSAGE("Arbok's Intimidate cuts Foe Primeape's attack!");
|
||||
if (abilityRight == ABILITY_DEFIANT) {
|
||||
ABILITY_POPUP(opponentRight, ABILITY_DEFIANT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight);
|
||||
MESSAGE("Foe Primeape's Attack sharply rose!");
|
||||
}
|
||||
} FINALLY {
|
||||
// -2 from Intimidates and +4 from Defiants gets +2 total
|
||||
EXPECT_EQ(opponentLeft->statStages[STAT_ATK], (abilityLeft == ABILITY_DEFIANT) ? DEFAULT_STAT_STAGE + 2 : DEFAULT_STAT_STAGE - 2);
|
||||
EXPECT_EQ(opponentRight->statStages[STAT_ATK], (abilityRight == ABILITY_DEFIANT) ? DEFAULT_STAT_STAGE + 2 : DEFAULT_STAT_STAGE - 2);
|
||||
}
|
||||
}
|
||||
56
test/battle/ability/sheer_force.c
Normal file
56
test/battle/ability/sheer_force.c
Normal file
@ -0,0 +1,56 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
SINGLE_BATTLE_TEST("Sheer Force boosts power, but removes secondary effects of moves", s16 damage)
|
||||
{
|
||||
s32 j;
|
||||
u32 ability = 0, move = 0;
|
||||
|
||||
for (j = 1; j < MOVES_COUNT; j++)
|
||||
{
|
||||
if (gBattleMoves[j].sheerForceBoost && j != MOVE_ORDER_UP)
|
||||
{
|
||||
PARAMETRIZE { ability = ABILITY_ANGER_POINT; move = j; }
|
||||
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; move = j; }
|
||||
}
|
||||
}
|
||||
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_TAUROS) { Ability(ability); Status1(move == MOVE_SNORE ? STATUS1_SLEEP : STATUS1_NONE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
if (gBattleMoves[move].effect == EFFECT_TWO_TURNS_ATTACK || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE) {
|
||||
TURN { SKIP_TURN(player); }
|
||||
TURN { ; }
|
||||
}
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, move, player);
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
if (ability == ABILITY_SHEER_FORCE) {
|
||||
NONE_OF {
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
|
||||
STATUS_ICON(opponent, STATUS1_FREEZE);
|
||||
STATUS_ICON(opponent, STATUS1_POISON);
|
||||
STATUS_ICON(opponent, STATUS1_BURN);
|
||||
STATUS_ICON(opponent, STATUS1_TOXIC_POISON);
|
||||
STATUS_ICON(opponent, STATUS1_PARALYSIS);
|
||||
MESSAGE("Wobbuffet is confused!");
|
||||
MESSAGE("Wobbuffet flinched!");
|
||||
}
|
||||
// Volt Tackle/Flare Blitz edge case: recoil happens, but target isn't statused
|
||||
if (gBattleMoves[move].effect == EFFECT_RECOIL_33_STATUS)
|
||||
{
|
||||
HP_BAR(player);
|
||||
MESSAGE("Tauros is hit with recoil!");
|
||||
}
|
||||
}
|
||||
} FINALLY {
|
||||
s32 j;
|
||||
for (j = 0; j < gBattleTestRunnerState->parametersCount; j+=2)
|
||||
{
|
||||
EXPECT_GT(results[j+1].damage, results[j].damage);
|
||||
}
|
||||
}
|
||||
}
|
||||
198
test/battle/ability/weak_armor.c
Normal file
198
test/battle/ability/weak_armor.c
Normal file
@ -0,0 +1,198 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].power != 0);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].power != 0);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(B_WEAK_ARMOR_SPEED >= GEN_7);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Weak Armor lowers Defense by 1 and boosts Speed by 2 when hit by a physical attack")
|
||||
{
|
||||
u16 move;
|
||||
|
||||
PARAMETRIZE { move = MOVE_TACKLE; }
|
||||
PARAMETRIZE { move = MOVE_GUST; }
|
||||
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, move); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, move, opponent);
|
||||
HP_BAR(player);
|
||||
if (move == MOVE_TACKLE) {
|
||||
ABILITY_POPUP(player, ABILITY_WEAK_ARMOR);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
MESSAGE("Slugma's Weak Armor lowered its Defense!");
|
||||
MESSAGE("Slugma's Weak Armor raised its Speed!");
|
||||
} else {
|
||||
NONE_OF {
|
||||
ABILITY_POPUP(player, ABILITY_WEAK_ARMOR);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
MESSAGE("Slugma's Weak Armor lowered its Defense!");
|
||||
MESSAGE("Slugma's Weak Armor raised its Speed!");
|
||||
}
|
||||
}
|
||||
} THEN {
|
||||
if (move == MOVE_TACKLE) {
|
||||
EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 1);
|
||||
EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Oddly specific, but it was a bug at one point.
|
||||
SINGLE_BATTLE_TEST("Weak Armor does not trigger when brought in by Dragon Tail and taking Stealth Rock damage")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_STEALTH_ROCK].effect == EFFECT_STEALTH_ROCK);
|
||||
ASSUME(gBattleMoves[MOVE_DRAGON_TAIL].effect == EFFECT_HIT_SWITCH_TARGET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_STEALTH_ROCK); }
|
||||
TURN { MOVE(opponent, MOVE_DRAGON_TAIL); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, opponent);
|
||||
HP_BAR(player);
|
||||
MESSAGE("Slugma was dragged out!");
|
||||
HP_BAR(player);
|
||||
MESSAGE("Pointed stones dug into Slugma!");
|
||||
NONE_OF {
|
||||
ABILITY_POPUP(player, ABILITY_WEAK_ARMOR);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
MESSAGE("Slugma's Weak Armor lowered its Defense!");
|
||||
MESSAGE("Slugma's Weak Armor raised its Speed!");
|
||||
}
|
||||
} THEN {
|
||||
EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE);
|
||||
EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Weak Armor still lowers boosts Speed if Defense can't go any lower")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_SCREECH); }
|
||||
TURN { MOVE(opponent, MOVE_SCREECH); }
|
||||
TURN { MOVE(opponent, MOVE_SCREECH); }
|
||||
TURN { MOVE(opponent, MOVE_TACKLE); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent);
|
||||
HP_BAR(player);
|
||||
ABILITY_POPUP(player, ABILITY_WEAK_ARMOR);
|
||||
NONE_OF {
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
MESSAGE("Slugma's Weak Armor lowered its Defense!");
|
||||
}
|
||||
MESSAGE("Slugma's Defense won't go lower!");
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
MESSAGE("Slugma's Weak Armor raised its Speed!");
|
||||
} THEN {
|
||||
EXPECT_EQ(player->statStages[STAT_DEF], MIN_STAT_STAGE);
|
||||
EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Weak Armor still lowers Defense if Speed can't go any higher")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_AGILITY); }
|
||||
TURN { MOVE(player, MOVE_AGILITY); }
|
||||
TURN { MOVE(player, MOVE_AGILITY); }
|
||||
TURN { MOVE(opponent, MOVE_TACKLE); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent);
|
||||
HP_BAR(player);
|
||||
ABILITY_POPUP(player, ABILITY_WEAK_ARMOR);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
MESSAGE("Slugma's Weak Armor lowered its Defense!");
|
||||
NONE_OF {
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
MESSAGE("Slugma's Weak Armor raised its Speed!");
|
||||
}
|
||||
MESSAGE("Slugma's Speed won't go higher!");
|
||||
} THEN {
|
||||
EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 1);
|
||||
EXPECT_EQ(player->statStages[STAT_SPEED], MAX_STAT_STAGE);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Defense can't go any lower")
|
||||
{
|
||||
u32 j;
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); }
|
||||
OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); }
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_SCREECH); }
|
||||
TURN { MOVE(opponent, MOVE_SCREECH); }
|
||||
TURN { MOVE(opponent, MOVE_FURY_SWIPES); }
|
||||
} SCENE {
|
||||
for (j = 0; j < 2; j++)
|
||||
{
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent);
|
||||
ABILITY_POPUP(player, ABILITY_WEAK_ARMOR);
|
||||
MESSAGE("Magcargo's Weak Armor lowered its Defense!");
|
||||
MESSAGE("Magcargo's Weak Armor raised its Speed!");
|
||||
}
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent);
|
||||
ABILITY_POPUP(player, ABILITY_WEAK_ARMOR);
|
||||
MESSAGE("Magcargo's Defense won't go lower!");
|
||||
MESSAGE("Magcargo's Weak Armor raised its Speed!");
|
||||
for (j = 0; j < 2; j++)
|
||||
{
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent);
|
||||
// Ability doesn't activate if neither stat can be changed.
|
||||
NONE_OF {
|
||||
ABILITY_POPUP(player, ABILITY_WEAK_ARMOR);
|
||||
MESSAGE("Magcargo's Defense won't go lower!");
|
||||
MESSAGE("Magcargo's Speed won't go higher!");
|
||||
}
|
||||
}
|
||||
} THEN {
|
||||
EXPECT_EQ(player->statStages[STAT_DEF], MIN_STAT_STAGE);
|
||||
EXPECT_EQ(player->statStages[STAT_SPEED], MAX_STAT_STAGE);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Speed can't go any higher")
|
||||
{
|
||||
u32 j;
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); }
|
||||
OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_AGILITY); }
|
||||
TURN { MOVE(player, MOVE_AGILITY); }
|
||||
TURN { MOVE(opponent, MOVE_FURY_SWIPES); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent);
|
||||
ABILITY_POPUP(player, ABILITY_WEAK_ARMOR);
|
||||
MESSAGE("Magcargo's Weak Armor lowered its Defense!");
|
||||
MESSAGE("Magcargo's Weak Armor raised its Speed!");
|
||||
for (j = 0; j < 4; j++)
|
||||
{
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent);
|
||||
ABILITY_POPUP(player, ABILITY_WEAK_ARMOR);
|
||||
MESSAGE("Magcargo's Weak Armor lowered its Defense!");
|
||||
MESSAGE("Magcargo's Speed won't go higher!");
|
||||
}
|
||||
} THEN {
|
||||
EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 5);
|
||||
EXPECT_EQ(player->statStages[STAT_SPEED], MAX_STAT_STAGE);
|
||||
}
|
||||
}
|
||||
@ -93,6 +93,9 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves with better accuracy, but only if they b
|
||||
PARAMETRIZE { move1 = MOVE_MEGA_KICK; move2 = MOVE_SLAM; move3 = MOVE_TACKLE; move4 = MOVE_GUST; hp = 5; expectedMove = MOVE_GUST; expectedMove2 = MOVE_TACKLE; turns = 1; }
|
||||
// All moves hit with No guard ability
|
||||
PARAMETRIZE { move1 = MOVE_MEGA_KICK; move2 = MOVE_GUST; hp = 5; expectedMove = MOVE_MEGA_KICK; expectedMove2 = MOVE_GUST; turns = 1; }
|
||||
// Tests to compare move that always hits and a beneficial effect. A move with higher acc should be chosen in this case.
|
||||
PARAMETRIZE { move1 = MOVE_SHOCK_WAVE; move2 = MOVE_ICY_WIND; hp = 5; expectedMove = MOVE_SHOCK_WAVE; turns = 1; }
|
||||
PARAMETRIZE { move1 = MOVE_SHOCK_WAVE; move2 = MOVE_ICY_WIND; move3 = MOVE_THUNDERBOLT; hp = 5; expectedMove = MOVE_SHOCK_WAVE; expectedMove2 = MOVE_THUNDERBOLT; turns = 1; }
|
||||
|
||||
GIVEN {
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
|
||||
@ -105,6 +108,9 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves with better accuracy, but only if they b
|
||||
ASSUME(gBattleMoves[MOVE_MEGA_KICK].accuracy < gBattleMoves[MOVE_STRENGTH].accuracy);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].accuracy == 100);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].accuracy == 100);
|
||||
ASSUME(gBattleMoves[MOVE_SHOCK_WAVE].accuracy == 0);
|
||||
ASSUME(gBattleMoves[MOVE_THUNDERBOLT].accuracy == 100);
|
||||
ASSUME(gBattleMoves[MOVE_ICY_WIND].accuracy != 100);
|
||||
OPPONENT(SPECIES_EXPLOUD) { Moves(move1, move2, move3, move4); Ability(abilityAtk); SpAttack(50); } // Low Sp.Atk, so Swift deals less damage than Strength.
|
||||
} WHEN {
|
||||
switch (turns)
|
||||
@ -191,6 +197,66 @@ AI_SINGLE_BATTLE_TEST("AI prefers Earthquake over Drill Run if both require the
|
||||
}
|
||||
}
|
||||
|
||||
AI_SINGLE_BATTLE_TEST("AI prefers a weaker move over a one with a downside effect if both require the same number of hits to ko")
|
||||
{
|
||||
u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE;
|
||||
u16 hp, expectedMove, turns;
|
||||
|
||||
// Both moves require the same number of turns but Flamethrower will be chosen over Overheat (powerful effect)
|
||||
PARAMETRIZE { move1 = MOVE_OVERHEAT; move2 = MOVE_FLAMETHROWER; hp = 300; expectedMove = MOVE_FLAMETHROWER; turns = 2; }
|
||||
// Overheat kill in least amount of turns
|
||||
PARAMETRIZE { move1 = MOVE_OVERHEAT; move2 = MOVE_FLAMETHROWER; hp = 250; expectedMove = MOVE_OVERHEAT; turns = 1; }
|
||||
|
||||
GIVEN {
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(hp); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_TYPHLOSION) { Moves(move1, move2, move3, move4); }
|
||||
} WHEN {
|
||||
switch (turns)
|
||||
{
|
||||
case 1:
|
||||
TURN { EXPECT_MOVE(opponent, expectedMove); SEND_OUT(player, 1); }
|
||||
break;
|
||||
case 2:
|
||||
TURN { EXPECT_MOVE(opponent, expectedMove); }
|
||||
TURN { EXPECT_MOVE(opponent, expectedMove); SEND_OUT(player, 1); }
|
||||
break;
|
||||
}
|
||||
}
|
||||
SCENE {
|
||||
MESSAGE("Wobbuffet fainted!");
|
||||
}
|
||||
}
|
||||
|
||||
AI_SINGLE_BATTLE_TEST("AI prefers moves with the best possible score, chosen randomly if tied")
|
||||
{
|
||||
GIVEN {
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(5); };
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_TAKE_DOWN); }
|
||||
} WHEN {
|
||||
TURN { EXPECT_MOVES(opponent, MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB); SEND_OUT(player, 1); }
|
||||
}
|
||||
SCENE {
|
||||
MESSAGE("Wobbuffet fainted!");
|
||||
}
|
||||
}
|
||||
|
||||
AI_SINGLE_BATTLE_TEST("AI can choose a status move that boosts the attack by two")
|
||||
{
|
||||
GIVEN {
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(250); };
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_KANGASKHAN) { Moves(MOVE_STRENGTH, MOVE_HORN_ATTACK, MOVE_SWORDS_DANCE); }
|
||||
} WHEN {
|
||||
TURN { EXPECT_MOVES(opponent, MOVE_STRENGTH, MOVE_SWORDS_DANCE); }
|
||||
TURN { EXPECT_MOVE(opponent, MOVE_STRENGTH); SEND_OUT(player, 1); }
|
||||
}
|
||||
}
|
||||
|
||||
AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking into account accuracy and move effect")
|
||||
{
|
||||
u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user