31-03-25 Master merge

This commit is contained in:
AlexOn1ine 2025-03-31 18:23:46 +02:00
commit ccebebf64f
62 changed files with 1130 additions and 615 deletions

View File

@ -23,9 +23,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.11.0 (Latest release)
- 1.11.1 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.11.0
- 1.10.3
- 1.10.2
- 1.10.1

View File

@ -23,9 +23,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.11.0 (Latest release)
- 1.11.1 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.11.0
- 1.10.3
- 1.10.2
- 1.10.1

View File

@ -23,9 +23,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.11.0 (Latest release)
- 1.11.1 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.11.0
- 1.10.3
- 1.10.2
- 1.10.1

27
.github/workflows/labels.yml vendored Normal file
View File

@ -0,0 +1,27 @@
name: Labels
on:
pull_request:
types: [opened, labeled, unlabeled]
jobs:
label:
runs-on: ubuntu-latest
steps:
- name: check labels
uses: mheap/github-action-required-labels@v5
with:
mode: minimum
count: 1
labels: |
General
category: ability
category: battle-ai
category: battle-mechanic
category: battle-tests
category: items
category: move animation
category: move effect
category: overworld
category: pokemon
category: sprite-issue

View File

@ -10,7 +10,7 @@ The main advantage of using vanilla pokeemerald as a base is being able to link
If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect.
You can phrase it as the following:
```
Based off RHH's pokeemerald-expansion 1.11.0 https://github.com/rh-hideout/pokeemerald-expansion/
Based off RHH's pokeemerald-expansion 1.11.1 https://github.com/rh-hideout/pokeemerald-expansion/
```
#### Important: DO NOT use GitHub's "Download Zip" option. Using this option will not download the commit history required to update your expansion version or merge other feature branches. Instead, please read [this guide](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub) to learn how to fork the repository and clone locally from there.
@ -33,7 +33,7 @@ With this, you'll get the latest version of pokeemerald-expansion, plus a couple
- You can check in the debug menu's `Utilities -> Expansion Version` option.
- If the option is not available, you possibly have version 1.6.2 or older. In that case, please check the [changelogs](docs/CHANGELOG.md) to determine your version based on the features available on your repository.
- ***Important:*** If you are several versions behind, we recommend updating one minor version at a time, skipping directly to the latest patch version (eg, 1.5.3 -> 1.6.2 -> 1.7.4 and so on. Check the [online documentation site](https://rh-hideout.github.io/pokeemerald-expansion/CHANGELOG.html) to see the latest versions of each step.)
- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.9.3, use `git pull RHH expansion/1.9.3`).
- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.11.1, use `git pull RHH expansion/1.11.1`).
- ***Important:*** If you are several versions behind, we recommend updating one minor version at a time, skipping directly to the latest patch version (eg, 1.5.3 -> 1.6.2 -> 1.7.4 and so on)
- Alternatively, you can update to unreleased versions of the expansion.
- ***master (stable):*** It contains unreleased **bugfixes** that will come in the next patch version. To merge, use `git pull RHH master`.

View File

@ -1269,7 +1269,7 @@
.byte 0xed
.endm
.macro removelightscreenreflect
.macro removescreens
.byte 0xee
.endm

View File

@ -5072,7 +5072,7 @@ BattleScript_EffectBrickBreak::
attackstring
ppreduce
typecalc
removelightscreenreflect
removescreens
critcalc
damagecalc
adjustdamage
@ -7075,7 +7075,7 @@ BattleScript_AnticipationActivates::
BattleScript_AftermathDmg::
pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpScripting
jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_AftermathDmgRet
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE
healthbarupdate BS_ATTACKER
@ -7557,35 +7557,37 @@ BattleScript_MoodyEnd:
end3
BattleScript_EmergencyExit::
.if B_ABILITY_POP_UP == TRUE
pause 5
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpScripting
pause B_WAIT_TIME_LONG
BattleScript_EmergencyExitNoPopUp::
playanimation BS_TARGET, B_ANIM_SLIDE_OFFSCREEN
.endif
playanimation BS_SCRIPTING, B_ANIM_SLIDE_OFFSCREEN
waitanimation
openpartyscreen BS_TARGET, BattleScript_EmergencyExitRet
switchoutabilities BS_TARGET
openpartyscreen BS_SCRIPTING, BattleScript_EmergencyExitRet
switchoutabilities BS_SCRIPTING
waitstate
switchhandleorder BS_TARGET, 2
switchhandleorder BS_SCRIPTING, 2
returntoball BS_TARGET, FALSE
getswitchedmondata BS_TARGET
switchindataupdate BS_TARGET
hpthresholds BS_TARGET
getswitchedmondata BS_SCRIPTING
switchindataupdate BS_SCRIPTING
hpthresholds BS_SCRIPTING
printstring STRINGID_SWITCHINMON
switchinanim BS_TARGET, FALSE, TRUE
switchinanim BS_SCRIPTING, FALSE, TRUE
waitstate
switchineffects BS_TARGET
switchineffects BS_SCRIPTING
BattleScript_EmergencyExitRet:
return
BattleScript_EmergencyExitWild::
.if B_ABILITY_POP_UP == TRUE
pause 5
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpScripting
pause B_WAIT_TIME_LONG
BattleScript_EmergencyExitWildNoPopUp::
playanimation BS_TARGET, B_ANIM_SLIDE_OFFSCREEN
.endif
playanimation BS_SCRIPTING, B_ANIM_SLIDE_OFFSCREEN
waitanimation
setoutcomeonteleport BS_TARGET
setoutcomeonteleport BS_SCRIPTING
finishaction
return

View File

@ -21,6 +21,7 @@
- [How to add new Trainer Slides](tutorials/how_to_new_trainer_slide.md)
- [Changelog](./CHANGELOG.md)
- [1.11.x]()
- [Version 1.11.1](changelogs/1.11.x/1.11.1.md)
- [Version 1.11.0](changelogs/1.11.x/1.11.0.md)
- [1.10.x]()
- [Version 1.10.3](changelogs/1.10.x/1.10.3.md)

View File

@ -0,0 +1,115 @@
```md
## How to update
- 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.11.1
`.
```
## 🧬 General 🧬
### Added
* Added workflow for labels check by @hedara90 in [#6488](https://github.com/rh-hideout/pokeemerald-expansion/pull/6488)
### Changed
* metaprogram.h without global.h by @mrgriffin in [#6469](https://github.com/rh-hideout/pokeemerald-expansion/pull/6469)
* Rename removelishtscreenreflect to removescreens by @AlexOn1ine in [#6495](https://github.com/rh-hideout/pokeemerald-expansion/pull/6495)
### Fixed
* Fix Melmetal's weight by @kittenchilly in [#6382](https://github.com/rh-hideout/pokeemerald-expansion/pull/6382)
* B_FAST_INTRO_PKMN_TEXT fix by @hedara90 in [#6395](https://github.com/rh-hideout/pokeemerald-expansion/pull/6395)
* remove/replace IsAlly leftovers by @cawtds in [#6399](https://github.com/rh-hideout/pokeemerald-expansion/pull/6399)
* Increase dex no digits from 3 to 4 by @PCG06 in [#6484](https://github.com/rh-hideout/pokeemerald-expansion/pull/6484)
## 🗺️ Overworld 🗺️
### Changed
* Replace Incorrect Slow Stairs Movement with Correct One by @Deokishisu in [#6275](https://github.com/rh-hideout/pokeemerald-expansion/pull/6275)
### Fixed
* Fix compile errors with OW_BATTLE_ONLY_FORMS set to FALSE by @hedara90 in [#6400](https://github.com/rh-hideout/pokeemerald-expansion/pull/6400)
* Include Missed `GetInteractedMetatileScript` Entries for Mart & Center Signs by @Deokishisu in [#6269](https://github.com/rh-hideout/pokeemerald-expansion/pull/6269)
* Fix DexNav search level by @cawtds in [#6421](https://github.com/rh-hideout/pokeemerald-expansion/pull/6421)
* Hide in-battle types from Union Room trade request by @aronson in [#6489](https://github.com/rh-hideout/pokeemerald-expansion/pull/6489)
## 🐉 Pokémon 🐉
### Fixed
* Fixed Zacian/Zamazenta learning Iron head while already knowing by @hedara90, @wiz1989 reported the issue, in [#6365](https://github.com/rh-hideout/pokeemerald-expansion/pull/6365)
* Fix roamers having 0 hp on repeat encounters by @danaYatsuta in [#6366](https://github.com/rh-hideout/pokeemerald-expansion/pull/6366)
* Fixed unfusion of traded materials by @hedara90, @mrgriffin found the issue, in [#6415](https://github.com/rh-hideout/pokeemerald-expansion/pull/6415)
## ⚔️ Battle General ⚔️
### Changed
* Fix Red Card overwriting gBattlerAttacker by @ghoulslash in [#6376](https://github.com/rh-hideout/pokeemerald-expansion/pull/6376)
* Fixes Magic Coat message when move is bounced back by @AlexOn1ine in [#6419](https://github.com/rh-hideout/pokeemerald-expansion/pull/6419)
### Fixed
* Reorder Dancer activation by @PhallenTree in [#6379](https://github.com/rh-hideout/pokeemerald-expansion/pull/6379)
* Fixes crash damage move against absorbing abilities by @AlexOn1ine in [#6361](https://github.com/rh-hideout/pokeemerald-expansion/pull/6361)
* Fixes gimmick icon flying off the screen by @PhallenTree in [#6401](https://github.com/rh-hideout/pokeemerald-expansion/pull/6401)
* Fixed Parental Bond with two-turn attacks by @hedara90 in [#6408](https://github.com/rh-hideout/pokeemerald-expansion/pull/6408)
* Wrong argument usage in `CalcCritChanceStage` by @AlexOn1ine in [#6429](https://github.com/rh-hideout/pokeemerald-expansion/pull/6429)
* Fixes Neutralizing Gas Exits, Weather Abilities and Terrain Effects order by @PhallenTree in [#6435](https://github.com/rh-hideout/pokeemerald-expansion/pull/6435)
* Fixes hazards not respecting tera types by @AlexOn1ine in [#6431](https://github.com/rh-hideout/pokeemerald-expansion/pull/6431)
* Fixes dynamax reversion when ejected out + anim fix by @AlexOn1ine in [#6416](https://github.com/rh-hideout/pokeemerald-expansion/pull/6416)
* Fixes negative priority being blocked by dazzling abilities by @AlexOn1ine in [#6433](https://github.com/rh-hideout/pokeemerald-expansion/pull/6433)
* Fixes Cotton Spore failing if one of the targets blocks it by @AlexOn1ine in [#6418](https://github.com/rh-hideout/pokeemerald-expansion/pull/6418)
* Fixes Toxic Spikes Absorbed message by @PhallenTree in [#6448](https://github.com/rh-hideout/pokeemerald-expansion/pull/6448)
* Fixes Cheek Pouch mutating damage by @AlexOn1ine in [#6466](https://github.com/rh-hideout/pokeemerald-expansion/pull/6466)
* Fixes choice move locking at the wrong time by @AlexOn1ine in [#6467](https://github.com/rh-hideout/pokeemerald-expansion/pull/6467)
* Fixes protective pads against Protects secondary effects by @AlexOn1ine in [#6474](https://github.com/rh-hideout/pokeemerald-expansion/pull/6474)
* Fixes clear body type effect and clear amulet against protect effects by @AlexOn1ine in [#6482](https://github.com/rh-hideout/pokeemerald-expansion/pull/6482)
* Fixes Aftermath ability popup message by @AlexOn1ine in [#6491](https://github.com/rh-hideout/pokeemerald-expansion/pull/6491)
* Fixes Emergency Exit and Eject Pack by @AlexOn1ine in [#6459](https://github.com/rh-hideout/pokeemerald-expansion/pull/6459)
* Fixes Hospitality not being blocked by Heal Block by @AlexOn1ine in [#6494](https://github.com/rh-hideout/pokeemerald-expansion/pull/6494)
* Fixes timesGotHit not increasing on forced switch out by @AlexOn1ine in [#6493](https://github.com/rh-hideout/pokeemerald-expansion/pull/6493)
* Fixes Destiny Bond against Dynamax no failing by @AlexOn1ine in [#6501](https://github.com/rh-hideout/pokeemerald-expansion/pull/6501)
## 🤹 Moves 🤹
### Fixed
* Fixed Ivy Cudgel types with type changes by @hedara90 in [#6369](https://github.com/rh-hideout/pokeemerald-expansion/pull/6369)
* Adds move description battle config by @AlexOn1ine in [#6364](https://github.com/rh-hideout/pokeemerald-expansion/pull/6364)
* Fix Jet Punch in isolated tests by @hedara90 in [#6461](https://github.com/rh-hideout/pokeemerald-expansion/pull/6461)
* Sucker punch vs struggle by @hedara90 in [#6475](https://github.com/rh-hideout/pokeemerald-expansion/pull/6475)
## 🤖 Battle AI 🤖
### Changed
* Update Battle Debug menu with new AI flags by @kittenchilly in [#6444](https://github.com/rh-hideout/pokeemerald-expansion/pull/6444)
### Fixed
* Fixed AI_FLAG_CHECK_VIABILITY changing the toxic counter in some cases by @hedara90, @iriv24 discovered the issue, in [#6402](https://github.com/rh-hideout/pokeemerald-expansion/pull/6402)
* Fix Focus Sash being considered in switch AI's hits to KO calcs by @Pawkkie in [#6436](https://github.com/rh-hideout/pokeemerald-expansion/pull/6436)
* AI gimmick check changed from checking trainer data to a BattleStruct field by @hedara90 in [#6478](https://github.com/rh-hideout/pokeemerald-expansion/pull/6478)
* Fix hit escape ace mon switching by @Pawkkie and @wiz1989, @AlexOn1ine in [#6498](https://github.com/rh-hideout/pokeemerald-expansion/pull/6498)
## 🧹 Other Cleanup 🧹
* Update AI_TryTo2HKO comment by @Pawkkie in [#6349](https://github.com/rh-hideout/pokeemerald-expansion/pull/6349)
* Fixing grammar of Berry Tree strings by @surskitty in [#6355](https://github.com/rh-hideout/pokeemerald-expansion/pull/6355)
- Berry trees berries are no longer erroneously plural.
* Move category test cleanup by @hedara90 in [#6447](https://github.com/rh-hideout/pokeemerald-expansion/pull/6447)
* Fixes Magic Coat message when move is bounced back by @AlexOn1ine in [#6419](https://github.com/rh-hideout/pokeemerald-expansion/pull/6419)
* Update Battle Debug menu with new AI flags by @kittenchilly in [#6444](https://github.com/rh-hideout/pokeemerald-expansion/pull/6444)
* Rename removelishtscreenreflect to removescreens by @AlexOn1ine in [#6495](https://github.com/rh-hideout/pokeemerald-expansion/pull/6495)
## 🧪 Test Runner 🧪
### Changed
* Fix Red Card overwriting gBattlerAttacker by @ghoulslash in [#6376](https://github.com/rh-hideout/pokeemerald-expansion/pull/6376)
* Move category test cleanup by @hedara90 in [#6447](https://github.com/rh-hideout/pokeemerald-expansion/pull/6447)
* Changed KNOWN_FAILING test by @hedara90 in [#6492](https://github.com/rh-hideout/pokeemerald-expansion/pull/6492)
### Fixed
* Fixes Known Failing Mold Breaker Sleep Clause test by @PhallenTree in [#6434](https://github.com/rh-hideout/pokeemerald-expansion/pull/6434)
* Made memory integrity checks run betweeen PARAMETRIZE runs by @hedara90 and @mrgriffin in [#6462](https://github.com/rh-hideout/pokeemerald-expansion/pull/6462)
## 📚 Documentation 📚
* Fixed a missing ) in trainers.party comment block. by @RubyRaven6 in [#6367](https://github.com/rh-hideout/pokeemerald-expansion/pull/6367)
* Update README.md for contest src link by @lwelyk in [#6375](https://github.com/rh-hideout/pokeemerald-expansion/pull/6375)
## New Contributors
* @RubyRaven6 made their first contribution in [#6367](https://github.com/rh-hideout/pokeemerald-expansion/pull/6367)
* @lwelyk made their first contribution in [#6375](https://github.com/rh-hideout/pokeemerald-expansion/pull/6375)
* @danaYatsuta made their first contribution in [#6366](https://github.com/rh-hideout/pokeemerald-expansion/pull/6366)
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.11.0...expansion/1.11.1
<!--Last PR: 6501-->
<!--Used to keep track of the last PR merged in case new ones come in before the changelog is done.-->

View File

@ -130,10 +130,9 @@ struct DisableStruct
u8 boosterEnergyActivates:1;
u8 roostActive:1;
u8 unburdenActive:1;
u8 startEmergencyExit:1;
u8 neutralizingGas:1;
u8 iceFaceActivationPrevention:1; // fixes hit escape move edge case
u8 padding:2;
u8 padding:3;
};
// Fully Cleared each turn after end turn effects are done. A few things are cleared before end turn effects
@ -809,9 +808,8 @@ struct BattleStruct
u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side
u8 monCausingSleepClause[NUM_BATTLE_SIDES]; // Stores which pokemon on a given side is causing Sleep Clause to be active as the mon's index in the party
u8 additionalEffectsCounter:4; // A counter for the additionalEffects applied by the current move in Cmd_setadditionaleffects
u8 redCardActivates:1;
u8 cheekPouchActivated:1;
u8 padding2:1; // padding in the middle so pursuit fields are together
u8 padding2:3;
u8 pursuitStoredSwitch; // Stored id for the Pursuit target's switch
s32 battlerExpReward;
u16 prevTurnSpecies[MAX_BATTLERS_COUNT]; // Stores species the AI has in play at start of turn

View File

@ -384,9 +384,7 @@ extern const u8 BattleScript_FriskMsg[];
extern const u8 BattleScript_FriskMsgWithPopup[];
extern const u8 BattleScript_MoodyActivates[];
extern const u8 BattleScript_EmergencyExit[];
extern const u8 BattleScript_EmergencyExitNoPopUp[];
extern const u8 BattleScript_EmergencyExitWild[];
extern const u8 BattleScript_EmergencyExitWildNoPopUp[];
extern const u8 BattleScript_CheekPouchActivates[];
extern const u8 BattleScript_TotemVar[];
extern const u8 BattleScript_TotemFlaredToLife[];

View File

@ -209,6 +209,7 @@ bool32 AreAllMovesUnusable(u32 battler);
u8 GetImprisonedMovesCount(u32 battler, u16 move);
u8 DoFieldEndTurnEffects(void);
s32 GetDrainedBigRootHp(u32 battler, s32 hp);
bool32 IsMagicGuardProtected(u32 battler, u32 ability);
u8 DoBattlerEndTurnEffects(void);
bool32 HandleWishPerishSongOnTurnEnd(void);
bool32 HandleFaintedMonActions(void);
@ -354,5 +355,7 @@ void ClearPursuitValuesIfSet(u32 battler);
void ClearPursuitValues(void);
bool32 HasWeatherEffect(void);
bool32 IsMovePowderBlocked(u32 battlerAtk, u32 battlerDef, u32 move);
bool32 EmergencyExitCanBeTriggered(u32 battler);
u32 RestoreWhiteHerbStats(u32 battler);
#endif // GUARD_BATTLE_UTIL_H

View File

@ -274,7 +274,6 @@ enum MoveEndEffects
MOVEEND_SYMBIOSIS,
MOVEEND_HIT_SWITCH_TARGET,
MOVEEND_KINGSROCK, // These item effects will occur each strike of a multi-hit move
MOVEEND_NUM_HITS,
MOVEEND_SUBSTITUTE,
MOVEEND_SKY_DROP_CONFUSE,
MOVEEND_UPDATE_LAST_MOVES,
@ -286,15 +285,16 @@ enum MoveEndEffects
MOVEEND_RAPID_SPIN,
MOVEEND_ITEM_EFFECTS_ATTACKER,
MOVEEND_MAGICIAN, // Occurs after final multi-hit strike, and after other items/abilities would activate
MOVEEND_SHEER_FORCE, // If move is Sheer Force affected, skip until opportunist
MOVEEND_SHEER_FORCE, // If move is Sheer Force affected, skip until Eject Pack
MOVEEND_RED_CARD, // Red Card triggers before Eject Pack
MOVEEND_EJECT_ITEMS,
MOVEEND_WHITE_HERB,
MOVEEND_EJECT_BUTTON,
MOVEEND_LIFEORB_SHELLBELL, // Includes shell bell, throat spray, etc
MOVEEND_CHANGED_ITEMS,
MOVEEND_PICKPOCKET,
MOVEEND_EMERGENCY_EXIT,
MOVEEND_EJECT_PACK,
MOVEEND_OPPORTUNIST, // Occurs after other stat change items/abilities to try and copy the boosts
MOVEEND_PICKPOCKET,
MOVEEND_WHITE_HERB,
MOVEEND_CHANGED_ITEMS,
MOVEEND_SAME_MOVE_TURNS,
MOVEEND_CLEAR_BITS,
MOVEEND_DANCER,

View File

@ -1,7 +1,7 @@
#ifndef GUARD_CONSTANTS_EXPANSION_H
#define GUARD_CONSTANTS_EXPANSION_H
// Last version: 1.11.0
// Last version: 1.11.1
#define EXPANSION_VERSION_MAJOR 1
#define EXPANSION_VERSION_MINOR 12
#define EXPANSION_VERSION_PATCH 0

View File

@ -11,6 +11,7 @@ enum GenConfigTag
GEN_CONFIG_MULTI_HIT_CHANCE,
GEN_CONFIG_GALE_WINGS,
GEN_CONFIG_HEAL_BELL_SOUNDPROOF,
GEN_CONFIG_TELEPORT_BEHAVIOR,
GEN_CONFIG_COUNT
};

View File

@ -14,6 +14,7 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] =
[GEN_CONFIG_MULTI_HIT_CHANCE] = B_MULTI_HIT_CHANCE,
[GEN_CONFIG_GALE_WINGS] = B_GALE_WINGS,
[GEN_CONFIG_HEAL_BELL_SOUNDPROOF] = B_HEAL_BELL_SOUNDPROOF,
[GEN_CONFIG_TELEPORT_BEHAVIOR] = B_TELEPORT_BEHAVIOR,
};
#if TESTING

View File

@ -306,7 +306,7 @@ extern const u16 gPokedexSearchMenu_Pal[];
extern const u32 gBerryCheck_Gfx[];
extern const u32 gBerryCheck_Pal[];
extern const u32 gBerryTag_Gfx[];
extern const u32 gBerryTag_Pal[];
extern const u32 gBerryTag_Tilemap[];
// rayquaza scene gfx
extern const u32 gRaySceneDuoFight_Groudon_Gfx[];

View File

@ -4,11 +4,11 @@
/* Check if VA_OPT_ is supported by the compiler. GCC's version should be at least 9.5*/
#define PP_THIRD_ARG(a,b,c,...) c
#define VA_OPT_SUPPORTED_I(...) PP_THIRD_ARG(__VA_OPT__(,),TRUE,FALSE,)
#define VA_OPT_SUPPORTED_I(...) PP_THIRD_ARG(__VA_OPT__(,),1,0,)
#define VA_OPT_SUPPORTED VA_OPT_SUPPORTED_I(?)
#if !VA_OPT_SUPPORTED
#error ERROR: VA_OPT__ is not supported. Please update your gcc compiler to version 10 or higher
#error ERROR: __VA_OPT__ is not supported. Please update your arm-none-eabi-gcc compiler to version 10 or higher
#endif // VA_OPT_SUPPORTED
/* Calls m0/m1/.../m8 depending on how many arguments are passed. */

View File

@ -20,6 +20,7 @@ void TestRunner_Battle_CheckAiMoveScores(u32 battlerId);
void TestRunner_Battle_AISetScore(const char *file, u32 line, u32 battlerId, u32 moveIndex, s32 score);
void TestRunner_Battle_AIAdjustScore(const char *file, u32 line, u32 battlerId, u32 moveIndex, s32 score);
void TestRunner_Battle_InvalidNoHPMon(u32 battlerId, u32 partyIndex);
void TestRunner_CheckMemory(void);
void TestRunner_Battle_CheckBattleRecordActionType(u32 battlerId, u32 recordIndex, u32 actionType);

View File

@ -1888,7 +1888,7 @@ static inline bool32 IsFreeSwitch(enum SwitchType switchType, u32 battlerSwitchi
// Switch out effects
if (!IsDoubleBattle()) // Not handling doubles' additional complexity
{
if (IsSwitchOutEffect(GetMoveEffect(gLastUsedMove)) && movedSecond)
if (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) && movedSecond)
return TRUE;
if (AI_DATA->ejectButtonSwitch)
return TRUE;
@ -2102,7 +2102,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId,
}
// If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon.
if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount
&& (IsSwitchOutEffect(GetMoveEffect(gLastUsedMove)) || AI_DATA->ejectButtonSwitch || AI_DATA->ejectPackSwitch))
&& (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || AI_DATA->ejectButtonSwitch || AI_DATA->ejectPackSwitch))
return aceMonId;
return PARTY_SIZE;
@ -2219,7 +2219,7 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType)
// If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon.
if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount
&& (IsSwitchOutEffect(GetMoveEffect(gLastUsedMove)) || AI_DATA->ejectButtonSwitch || AI_DATA->ejectPackSwitch))
&& (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || AI_DATA->ejectButtonSwitch || AI_DATA->ejectPackSwitch))
return aceMonId;
return PARTY_SIZE;

View File

@ -2501,6 +2501,9 @@ bool32 IsSwitchOutEffect(u32 effect)
// Switch out effects like U-Turn, Volt Switch, etc.
switch (effect)
{
case EFFECT_TELEPORT:
if (B_TELEPORT_BEHAVIOR >= GEN_8)
return TRUE;
case EFFECT_HIT_ESCAPE:
case EFFECT_PARTING_SHOT:
case EFFECT_BATON_PASS:

View File

@ -339,7 +339,7 @@ static bool32 SetTargetToNextPursuiter(u32 battlerDef);
void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler);
static void RemoveAllWeather(void);
static void RemoveAllTerrains(void);
static bool8 CanAbilityPreventStatLoss(u16 abilityDef);
static bool32 CanAbilityPreventStatLoss(u32 abilityDef);
static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent);
static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount, u16 usedMove);
static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move);
@ -584,7 +584,7 @@ static void Cmd_tryrecycleitem(void);
static void Cmd_settypetoterrain(void);
static void Cmd_pursuitdoubles(void);
static void Cmd_snatchsetbattlers(void);
static void Cmd_removelightscreenreflect(void);
static void Cmd_removescreens(void);
static void Cmd_handleballthrow(void);
static void Cmd_givecaughtmon(void);
static void Cmd_trysetcaughtmondexflags(void);
@ -843,7 +843,7 @@ void (* const gBattleScriptingCommandsTable[])(void) =
Cmd_settypetoterrain, //0xEB
Cmd_pursuitdoubles, //0xEC
Cmd_snatchsetbattlers, //0xED
Cmd_removelightscreenreflect, //0xEE
Cmd_removescreens, //0xEE
Cmd_handleballthrow, //0xEF
Cmd_givecaughtmon, //0xF0
Cmd_trysetcaughtmondexflags, //0xF1
@ -1320,9 +1320,10 @@ static void Cmd_attackcanceler(void)
RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
}
else if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove)
&& (gCurrentMove != MOVE_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST))
&& (effect != EFFECT_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST))
&& (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))
&& effect != EFFECT_SUCKER_PUNCH
&& effect != EFFECT_COUNTER
&& effect != EFFECT_UPPER_HAND)
{
if (IsMoveMakingContact(gCurrentMove, gBattlerAttacker))
@ -2100,6 +2101,7 @@ static void Cmd_adjustdamage(void)
gSpecialStatuses[battlerDef].enduredDamage = TRUE;
continue;
}
if (GetBattlerAbility(battlerDef) == ABILITY_ICE_FACE && IsBattleMovePhysical(gCurrentMove) && gBattleMons[battlerDef].species == SPECIES_EISCUE)
{
// Damage deals typeless 0 HP.
@ -2110,6 +2112,7 @@ static void Cmd_adjustdamage(void)
// Form change will be done after attack animation in Cmd_resultmessage.
continue;
}
if (gBattleMons[gBattlerTarget].hp > gBattleStruct->moveDamage[battlerDef])
continue;
@ -2649,6 +2652,11 @@ static void Cmd_datahpupdate(void)
BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[battler].hp), &gBattleMons[battler].hp);
MarkBattlerForControllerExec(battler);
}
if (gBattlerAttacker != gBattlerTarget
&& GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS
&& IsBattlerTurnDamaged(gBattlerTarget))
gBattleStruct->timesGotHit[GetBattlerSide(gBattlerTarget)][gBattlerPartyIndexes[gBattlerTarget]]++;
}
TryRestoreDamageAfterCheeckPouch(battler);
@ -6155,17 +6163,61 @@ static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent)
return battler;
}
static inline bool32 IsProtectivePadsProtected(u32 battler, u32 move)
static inline bool32 IsProtectivePadsProtected(u32 battler, u32 holdEffect)
{
if (!IsMoveMakingContact(move, battler))
if (holdEffect != HOLD_EFFECT_PROTECTIVE_PADS)
return FALSE;
if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_PROTECTIVE_PADS)
RecordItemEffectBattle(battler, holdEffect);
return TRUE;
}
static inline bool32 IsProtectEffectAffected(u32 battler, u32 move)
{
u32 holdEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE);
if (IsProtectivePadsProtected(battler, holdEffect))
return TRUE;
if (holdEffect == HOLD_EFFECT_CLEAR_AMULET)
{
RecordItemEffectBattle(battler, HOLD_EFFECT_PROTECTIVE_PADS);
RecordItemEffectBattle(battler, holdEffect);
return TRUE;
}
u32 ability = GetBattlerAbility(gBattlerAttacker);
if (CanAbilityPreventStatLoss(ability))
{
RecordAbilityBattle(battler, ability);
return TRUE;
}
return FALSE;
}
static inline bool32 CanEjectButtonTrigger(u32 battlerAtk, u32 battlerDef, u32 moveEffect)
{
if (GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_EJECT_BUTTON
&& battlerAtk != battlerDef
&& IsBattlerTurnDamaged(battlerDef)
&& IsBattlerAlive(battlerDef)
&& CountUsablePartyMons(battlerDef) > 0
&& !(moveEffect == EFFECT_HIT_SWITCH_TARGET && CanBattlerSwitch(battlerAtk)))
return TRUE;
return FALSE;
}
static inline bool32 CanEjectPackTrigger(u32 battlerAtk, u32 battlerDef, u32 moveEffect)
{
if (gProtectStructs[battlerDef].statFell
&& GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_EJECT_PACK
&& IsBattlerAlive(battlerDef)
&& CountUsablePartyMons(battlerDef) > 0
&& !gProtectStructs[battlerDef].disableEjectPack
&& !(moveEffect == EFFECT_HIT_SWITCH_TARGET && CanBattlerSwitch(battlerAtk))
&& !(moveEffect == EFFECT_PARTING_SHOT && CanBattlerSwitch(battlerAtk)))
return TRUE;
return FALSE;
}
@ -6205,9 +6257,8 @@ static void Cmd_moveend(void)
if (gProtectStructs[gBattlerAttacker].touchedProtectLike)
{
if (gProtectStructs[gBattlerTarget].spikyShielded
&& moveEffect != EFFECT_COUNTER
&& !IsProtectivePadsProtected(gBattlerAttacker, gCurrentMove)
&& GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD)
&& !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))
&& !IsMagicGuardProtected(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)))
{
gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE;
gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 8;
@ -6219,7 +6270,7 @@ static void Cmd_moveend(void)
effect = 1;
}
else if (gProtectStructs[gBattlerTarget].kingsShielded
&& !IsProtectivePadsProtected(gBattlerAttacker, gCurrentMove))
&& !IsProtectEffectAffected(gBattlerAttacker, gCurrentMove))
{
gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE;
i = gBattlerAttacker;
@ -6234,7 +6285,7 @@ static void Cmd_moveend(void)
effect = 1;
}
else if (gProtectStructs[gBattlerTarget].banefulBunkered
&& !IsProtectivePadsProtected(gBattlerAttacker, gCurrentMove))
&& !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE)))
{
gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE;
gBattleScripting.moveEffect = MOVE_EFFECT_POISON | MOVE_EFFECT_AFFECTS_USER;
@ -6246,7 +6297,7 @@ static void Cmd_moveend(void)
else if (gProtectStructs[gBattlerTarget].obstructed
&& moveEffect != EFFECT_SUCKER_PUNCH
&& moveEffect != EFFECT_UPPER_HAND
&& !IsProtectivePadsProtected(gBattlerAttacker, gCurrentMove))
&& !IsProtectEffectAffected(gBattlerAttacker, gCurrentMove))
{
gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE;
i = gBattlerAttacker;
@ -6258,7 +6309,7 @@ static void Cmd_moveend(void)
effect = 1;
}
else if (gProtectStructs[gBattlerTarget].silkTrapped
&& !IsProtectivePadsProtected(gBattlerAttacker, gCurrentMove))
&& !IsProtectEffectAffected(gBattlerAttacker, gCurrentMove))
{
gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE;
i = gBattlerAttacker;
@ -6270,7 +6321,7 @@ static void Cmd_moveend(void)
effect = 1;
}
else if (gProtectStructs[gBattlerTarget].burningBulwarked
&& !IsProtectivePadsProtected(gBattlerAttacker, gCurrentMove))
&& !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE)))
{
gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE;
gBattleScripting.moveEffect = MOVE_EFFECT_BURN | MOVE_EFFECT_AFFECTS_USER;
@ -6690,16 +6741,6 @@ static void Cmd_moveend(void)
}
gBattleScripting.moveendState++;
break;
case MOVEEND_NUM_HITS:
if (gBattlerAttacker != gBattlerTarget
&& GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS
&& !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)
&& IsBattlerTurnDamaged(gBattlerTarget))
{
gBattleStruct->timesGotHit[GetBattlerSide(gBattlerTarget)][gBattlerPartyIndexes[gBattlerTarget]]++;
}
gBattleScripting.moveendState++;
break;
case MOVEEND_SUBSTITUTE: // update substitute
for (i = 0; i < gBattlersCount; i++)
{
@ -6962,13 +7003,6 @@ static void Cmd_moveend(void)
gBattleScripting.moveendState++;
break;
}
// The order of abilities/items activating after moves hitting multiple targets is
// 1. Magician
// 2. The fastest mon gets switched out using Eject Button / Eject Pack
// 3. White Herb activates
// 4. Red Card activates
// 5. Life Orb / Shell Bell
// 6. Pickpocket
case MOVEEND_MAGICIAN:
if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MAGICIAN
&& gCurrentMove != MOVE_FLING && gCurrentMove != MOVE_NATURAL_GIFT
@ -6980,7 +7014,6 @@ static void Cmd_moveend(void)
&& !gSpecialStatuses[gBattlerAttacker].gemBoost // In base game, gems are consumed after magician would activate.
&& !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & (1u << gBattlerPartyIndexes[gBattlerTarget]))
&& !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)
&& !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)
&& (GetBattlerAbility(gBattlerTarget) != ABILITY_STICKY_HOLD || !IsBattlerAlive(gBattlerTarget)))
{
StealTargetItem(gBattlerAttacker, gBattlerTarget);
@ -6995,94 +7028,119 @@ static void Cmd_moveend(void)
break;
case MOVEEND_SHEER_FORCE:
if (TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove))
gBattleScripting.moveendState = MOVEEND_OPPORTUNIST;
gBattleScripting.moveendState = MOVEEND_EJECT_PACK;
else
gBattleScripting.moveendState++;
break;
case MOVEEND_EJECT_ITEMS:
case MOVEEND_EJECT_BUTTON:
{
// Because sorting the battlers by speed takes lots of cycles, it's better to just check if any of the battlers has the Eject items.
u32 ejectPackBattlers = 0, ejectButtonBattlers = 0, i;
u32 numEjectButtonBattlers = 0;
u32 ejectButtonBattlers = 0;
for (i = 0; i < gBattlersCount; i++)
{
u32 holdEffect;
holdEffect = GetBattlerHoldEffect(i, TRUE);
if (holdEffect == HOLD_EFFECT_EJECT_BUTTON)
if (CanEjectButtonTrigger(gBattlerAttacker, i, moveEffect))
{
ejectButtonBattlers |= 1u << i;
else if (holdEffect == HOLD_EFFECT_EJECT_PACK)
ejectPackBattlers |= 1u << i;
numEjectButtonBattlers++;
}
}
if (ejectButtonBattlers || ejectPackBattlers)
if (numEjectButtonBattlers == 0)
{
u8 battlers[4] = {0, 1, 2, 3};
gBattleScripting.moveendState++;
break;
}
u8 battlers[4] = {0, 1, 2, 3};
if (numEjectButtonBattlers > 1)
SortBattlersBySpeed(battlers, FALSE);
for (i = 0; i < gBattlersCount; i++)
for (i = 0; i < gBattlersCount; i++)
{
u32 battler = battlers[i];
if (!(ejectButtonBattlers & 1u << battler))
continue;
gBattleScripting.battler = battler;
gLastUsedItem = gBattleMons[battler].item;
if (moveEffect == EFFECT_HIT_ESCAPE)
gBattlescriptCurrInstr = BattleScript_MoveEnd; // Prevent user switch-in selection
effect = TRUE;
gBattleScripting.moveendState = MOVEEND_OPPORTUNIST;
gBattleStruct->battlerState[battler].usedEjectItem = TRUE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EjectButtonActivates;
AI_DATA->ejectButtonSwitch = TRUE;
break; // Only the fastest Eject Button activates
}
}
if (!effect)
gBattleScripting.moveendState++;
break;
case MOVEEND_EJECT_PACK:
{
// Because sorting the battlers by speed takes lots of cycles, it's better to just check if any of the battlers has the Eject items.
u32 ejectPackBattlers = 0;
u32 numEjectPackBattlers = 0;
for (i = 0; i < gBattlersCount; i++)
{
if (CanEjectPackTrigger(gBattlerAttacker, i, moveEffect))
{
u32 battler = battlers[i];
if (battler != gBattlerAttacker && ejectButtonBattlers & (1u << battler))
{
// Since we check if battler was damaged, we don't need to check move result.
// In fact, doing so actually prevents multi-target moves from activating eject button properly
if (!IsBattlerTurnDamaged(battler))
continue;
}
else if (ejectPackBattlers & (1u << battler))
{
if (!gProtectStructs[battler].statFell || gProtectStructs[battler].disableEjectPack)
continue;
}
else
{
continue;
}
if (IsBattlerAlive(battler)
&& CountUsablePartyMons(battler) > 0 // Has mon to switch into
// Does not activate if attacker used Parting Shot and can switch out
&& !(moveEffect == EFFECT_HIT_SWITCH_TARGET && CanBattlerSwitch(gBattlerAttacker))
)
{
gBattleScripting.battler = battler;
gLastUsedItem = gBattleMons[battler].item;
if (moveEffect == EFFECT_HIT_ESCAPE)
gBattlescriptCurrInstr = BattleScript_MoveEnd; // Prevent user switch-in selection
if (ejectButtonBattlers & (1u << battler))
{
effect = TRUE;
gBattleStruct->battlerState[battler].usedEjectItem = TRUE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EjectButtonActivates;
AI_DATA->ejectButtonSwitch = TRUE;
}
else // Eject Pack
{
if (!gDisableStructs[gBattlerTarget].startEmergencyExit
&& !(GetMoveEffect(gCurrentMove) == EFFECT_PARTING_SHOT && CanBattlerSwitch(gBattlerAttacker)))
{
effect = TRUE;
gBattleStruct->battlerState[battler].usedEjectItem = TRUE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EjectPackActivates;
AI_DATA->ejectPackSwitch = TRUE;
gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage = TRUE;
}
gProtectStructs[battler].statFell = FALSE;
}
break; // Only the fastest Eject item activates
}
ejectPackBattlers |= 1u << i;
numEjectPackBattlers++;
}
}
if (numEjectPackBattlers == 0)
{
gBattleScripting.moveendState++;
break;
}
u8 battlers[4] = {0, 1, 2, 3};
if (numEjectPackBattlers > 1)
SortBattlersBySpeed(battlers, FALSE);
for (i = 0; i < gBattlersCount; i++)
{
u32 battler = battlers[i];
if (!(ejectPackBattlers & 1u << battler))
continue;
gBattleScripting.battler = battler;
gLastUsedItem = gBattleMons[battler].item;
if (moveEffect == EFFECT_HIT_ESCAPE)
gBattlescriptCurrInstr = BattleScript_MoveEnd; // Prevent user switch-in selection
effect = TRUE;
gBattleStruct->battlerState[battler].usedEjectItem = TRUE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EjectPackActivates;
AI_DATA->ejectPackSwitch = TRUE;
gProtectStructs[battler].statFell = FALSE;
break; // Only the fastest Eject item activates
}
}
gBattleScripting.moveendState++;
break;
case MOVEEND_WHITE_HERB:
for (i = 0; i < gBattlersCount; i++)
{
if (IsBattlerAlive(i)
&& ItemBattleEffects(ITEMEFFECT_STATS_CHANGED, i, FALSE))
if (!IsBattlerAlive(i))
continue;
if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_RESTORE_STATS
&& RestoreWhiteHerbStats(i))
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_WhiteHerbRet;
effect = TRUE;
break;
}
@ -7102,8 +7160,7 @@ static void Cmd_moveend(void)
}
if (redCardBattlers
&& (moveEffect != EFFECT_HIT_SWITCH_TARGET || gBattleStruct->hitSwitchTargetFailed)
&& IsBattlerAlive(gBattlerAttacker)
&& !TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove))
&& IsBattlerAlive(gBattlerAttacker))
{
// Since we check if battler was damaged, we don't need to check move result.
// In fact, doing so actually prevents multi-target moves from activating red card properly
@ -7120,33 +7177,29 @@ static void Cmd_moveend(void)
&& IsBattlerTurnDamaged(battler)
&& CanBattlerSwitch(gBattlerAttacker))
{
effect = TRUE;
gBattleScripting.moveendState = MOVEEND_OPPORTUNIST;
gLastUsedItem = gBattleMons[battler].item;
SaveBattlerTarget(battler); // save battler with red card
SaveBattlerAttacker(gBattlerAttacker);
gBattleStruct->savedMove = gCurrentMove;
gBattleScripting.battler = battler;
gEffectBattler = gBattlerAttacker;
gBattleStruct->redCardActivates = TRUE;
if (moveEffect == EFFECT_HIT_ESCAPE)
gBattlescriptCurrInstr = BattleScript_MoveEnd; // Prevent user switch-in selection
BattleScriptPushCursor();
if (gBattleStruct->commanderActive[gBattlerAttacker] != SPECIES_NONE
|| GetBattlerAbility(gBattlerAttacker) == ABILITY_GUARD_DOG)
{
gBattlescriptCurrInstr = BattleScript_RedCardActivationNoSwitch;
}
else
{
gBattlescriptCurrInstr = BattleScript_RedCardActivates;
gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage = TRUE;
}
effect = TRUE;
break; // Only fastest red card activates
}
}
}
}
gBattleScripting.moveendState++;
if (!effect)
gBattleScripting.moveendState++;
break;
case MOVEEND_LIFEORB_SHELLBELL:
if (ItemBattleEffects(ITEMEFFECT_LIFEORB_SHELLBELL, 0, FALSE))
@ -7190,37 +7243,57 @@ static void Cmd_moveend(void)
gBattleScripting.moveendState++;
break;
case MOVEEND_EMERGENCY_EXIT: // Special case, because moves hitting multiple opponents stop after switching out
for (i = 0; i < gBattlersCount; i++)
{
if (gBattleStruct->redCardActivates)
// Because sorting the battlers by speed takes lots of cycles,
// we check if EE can be activated and cound how many.
u32 numEmergencyExitBattlers = 0;
u32 emergencyExitBattlers = 0;
for (i = 0; i < gBattlersCount; i++)
{
gDisableStructs[i].startEmergencyExit = FALSE;
continue;
if (EmergencyExitCanBeTriggered(i))
{
emergencyExitBattlers |= 1u << i;
numEmergencyExitBattlers++;
}
}
if (gDisableStructs[i].startEmergencyExit)
if (numEmergencyExitBattlers == 0)
{
gDisableStructs[i].startEmergencyExit = FALSE;
gSpecialStatuses[i].emergencyExited = TRUE;
gBattlerTarget = gBattlerAbility = i;
gBattleScripting.moveendState++;
break;
}
u8 battlers[4] = {0, 1, 2, 3};
if (numEmergencyExitBattlers > 1)
SortBattlersBySpeed(battlers, FALSE);
for (i = 0; i < gBattlersCount; i++)
{
u32 battler = battlers[i];
if (!(emergencyExitBattlers & 1u << battler))
continue;
if (moveEffect == EFFECT_HIT_ESCAPE)
gBattlescriptCurrInstr = BattleScript_MoveEnd; // Prevent user switch-in selection
effect = TRUE;
gBattleScripting.moveendState = MOVEEND_OPPORTUNIST;
gSpecialStatuses[battler].emergencyExited = TRUE;
gBattleScripting.battler = battler;
BattleScriptPushCursor();
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER || GetBattlerSide(i) == B_SIDE_PLAYER)
{
if (B_ABILITY_POP_UP == TRUE)
gBattlescriptCurrInstr = BattleScript_EmergencyExit;
else
gBattlescriptCurrInstr = BattleScript_EmergencyExitNoPopUp;
}
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER || GetBattlerSide(battler) == B_SIDE_PLAYER)
gBattlescriptCurrInstr = BattleScript_EmergencyExit;
else
{
if (B_ABILITY_POP_UP == TRUE)
gBattlescriptCurrInstr = BattleScript_EmergencyExitWild;
else
gBattlescriptCurrInstr = BattleScript_EmergencyExitWildNoPopUp;
}
return;
gBattlescriptCurrInstr = BattleScript_EmergencyExitWild;
break; // Only the fastest Emergency Exit / Wimp Out activates
}
}
gBattleScripting.moveendState++;
if (!effect)
gBattleScripting.moveendState++;
break;
case MOVEEND_SYMBIOSIS:
for (i = 0; i < gBattlersCount; i++)
@ -7297,7 +7370,6 @@ static void Cmd_moveend(void)
gBattleStruct->additionalEffectsCounter = 0;
gBattleStruct->poisonPuppeteerConfusion = FALSE;
gBattleStruct->fickleBeamBoosted = FALSE;
gBattleStruct->redCardActivates = FALSE;
gBattleStruct->battlerState[gBattlerAttacker].usedMicleBerry = FALSE;
gBattleStruct->noTargetPresent = FALSE;
if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)
@ -13776,10 +13848,29 @@ static void Cmd_trychoosesleeptalkmove(void)
}
}
static inline bool32 IsDanamaxMonPresent(void)
{
for (u32 battler = 0; battler < gBattlersCount; battler++)
{
if (battler == gBattlerAttacker)
continue;
if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX)
return TRUE;
}
return FALSE;
}
static void Cmd_trysetdestinybond(void)
{
CMD_ARGS(const u8 *failInstr);
if (DoesDestinyBondFail(gBattlerAttacker))
if (IsDanamaxMonPresent())
{
gBattlescriptCurrInstr = BattleScript_MoveBlockedByDynamax;
}
else if (DoesDestinyBondFail(gBattlerAttacker))
{
gBattlescriptCurrInstr = cmd->failInstr;
}
@ -15694,8 +15785,7 @@ static void Cmd_snatchsetbattlers(void)
gBattlescriptCurrInstr = cmd->nextInstr;
}
// Brick Break
static void Cmd_removelightscreenreflect(void)
static void Cmd_removescreens(void)
{
CMD_ARGS();
@ -16819,7 +16909,7 @@ static bool8 IsFinalStrikeEffect(u32 moveEffect)
return FALSE;
}
static bool8 CanAbilityPreventStatLoss(u16 abilityDef)
static bool32 CanAbilityPreventStatLoss(u32 abilityDef)
{
switch (abilityDef)
{

View File

@ -2207,7 +2207,8 @@ s32 GetDrainedBigRootHp(u32 battler, s32 hp)
return hp * -1;
}
static inline bool32 IsBattlerProtectedByMagicGuard(u32 battler, u32 ability)
// This should always be the last check. Otherwise the ability might be recorded when it is not supposed to be
bool32 IsMagicGuardProtected(u32 battler, u32 ability)
{
if (ability != ABILITY_MAGIC_GUARD)
return FALSE;
@ -2343,7 +2344,7 @@ u8 DoBattlerEndTurnEffects(void)
if ((gStatuses3[battler] & STATUS3_LEECHSEED)
&& IsBattlerAlive(gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER)
&& IsBattlerAlive(battler)
&& !IsBattlerProtectedByMagicGuard(battler, ability))
&& !IsMagicGuardProtected(battler, ability))
{
gBattlerTarget = gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver.
gBattlerAttacker = battler;
@ -2374,7 +2375,7 @@ u8 DoBattlerEndTurnEffects(void)
case ENDTURN_POISON: // poison
if ((gBattleMons[battler].status1 & STATUS1_POISON)
&& IsBattlerAlive(battler)
&& !IsBattlerProtectedByMagicGuard(battler, ability))
&& !IsMagicGuardProtected(battler, ability))
{
if (ability == ABILITY_POISON_HEAL)
{
@ -2402,7 +2403,7 @@ u8 DoBattlerEndTurnEffects(void)
case ENDTURN_BAD_POISON: // toxic poison
if ((gBattleMons[battler].status1 & STATUS1_TOXIC_POISON)
&& IsBattlerAlive(battler)
&& !IsBattlerProtectedByMagicGuard(battler, ability))
&& !IsMagicGuardProtected(battler, ability))
{
if (ability == ABILITY_POISON_HEAL)
{
@ -2433,7 +2434,7 @@ u8 DoBattlerEndTurnEffects(void)
case ENDTURN_BURN: // burn
if ((gBattleMons[battler].status1 & STATUS1_BURN)
&& IsBattlerAlive(battler)
&& !IsBattlerProtectedByMagicGuard(battler, ability))
&& !IsMagicGuardProtected(battler, ability))
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8);
if (ability == ABILITY_HEATPROOF)
@ -2452,7 +2453,7 @@ u8 DoBattlerEndTurnEffects(void)
case ENDTURN_FROSTBITE: // burn
if ((gBattleMons[battler].status1 & STATUS1_FROSTBITE)
&& IsBattlerAlive(battler)
&& !IsBattlerProtectedByMagicGuard(battler, ability))
&& !IsMagicGuardProtected(battler, ability))
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8);
if (gBattleStruct->moveDamage[battler] == 0)
@ -2465,7 +2466,7 @@ u8 DoBattlerEndTurnEffects(void)
case ENDTURN_NIGHTMARES: // spooky nightmares
if ((gBattleMons[battler].status2 & STATUS2_NIGHTMARE)
&& IsBattlerAlive(battler)
&& !IsBattlerProtectedByMagicGuard(battler, ability))
&& !IsMagicGuardProtected(battler, ability))
{
// R/S does not perform this sleep check, which causes the nightmare effect to
// persist even after the affected Pokémon has been awakened by Shed Skin.
@ -2487,7 +2488,7 @@ u8 DoBattlerEndTurnEffects(void)
case ENDTURN_CURSE: // curse
if ((gBattleMons[battler].status2 & STATUS2_CURSED)
&& IsBattlerAlive(battler)
&& !IsBattlerProtectedByMagicGuard(battler, ability))
&& !IsMagicGuardProtected(battler, ability))
{
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4;
if (gBattleStruct->moveDamage[battler] == 0)
@ -2502,7 +2503,7 @@ u8 DoBattlerEndTurnEffects(void)
{
if (--gDisableStructs[battler].wrapTurns != 0) // damaged by wrap
{
if (IsBattlerProtectedByMagicGuard(battler, ability))
if (IsMagicGuardProtected(battler, ability))
{
gBattleStruct->turnEffectsTracker++;
break;
@ -2812,7 +2813,7 @@ u8 DoBattlerEndTurnEffects(void)
case ENDTURN_SALT_CURE:
if (gStatuses4[battler] & STATUS4_SALT_CURE
&& IsBattlerAlive(battler)
&& !IsBattlerProtectedByMagicGuard(battler, ability))
&& !IsMagicGuardProtected(battler, ability))
{
gBattlerTarget = battler;
if (IS_BATTLER_ANY_TYPE(battler, TYPE_STEEL, TYPE_WATER))
@ -5281,6 +5282,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
if (!gSpecialStatuses[battler].switchInAbilityDone
&& IsDoubleBattle()
&& !(gStatuses3[partner] & STATUS3_HEAL_BLOCK)
&& gBattleMons[partner].hp < gBattleMons[partner].maxHP
&& IsBattlerAlive(partner))
{
@ -5682,25 +5684,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
effect++;
}
break;
case ABILITY_EMERGENCY_EXIT:
case ABILITY_WIMP_OUT:
if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)
&& IsBattlerTurnDamaged(gBattlerTarget)
&& IsBattlerAlive(battler)
// Had more than half of hp before, now has less
&& HadMoreThanHalfHpNowDoesnt(battler)
&& (gMultiHitCounter == 0 || gMultiHitCounter == 1)
&& !(TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove))
&& (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER))
&& !(gBattleTypeFlags & BATTLE_TYPE_ARENA)
&& CountUsablePartyMons(battler) > 0
// Not currently held by Sky Drop
&& !(gStatuses3[battler] & STATUS3_SKY_DROPPED))
{
gDisableStructs[battler].startEmergencyExit = TRUE;
effect++;
}
break;
case ABILITY_WEAK_ARMOR:
if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)
&& IsBattlerTurnDamaged(gBattlerTarget)
@ -5866,6 +5849,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
}
else
{
gBattleScripting.battler = gBattlerTarget;
gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4;
if (gBattleStruct->moveDamage[gBattlerAttacker] == 0)
gBattleStruct->moveDamage[gBattlerAttacker] = 1;
@ -5888,6 +5872,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
break;
}
gBattleScripting.battler = gBattlerTarget;
gBattleStruct->moveDamage[gBattlerAttacker] = gBattleStruct->moveDamage[gBattlerTarget];
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_AftermathDmg;
@ -7233,8 +7218,6 @@ static u32 ItemHealHp(u32 battler, u32 itemId, enum ItemCaseId caseID, bool32 pe
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet;
}
if (gDisableStructs[battler].startEmergencyExit && GetNonDynamaxHP(battler) >= GetNonDynamaxMaxHP(battler) / 2)
gDisableStructs[battler].startEmergencyExit = FALSE;
return ITEM_HP_CHANGE;
}
@ -7355,7 +7338,7 @@ static inline u32 TryBoosterEnergy(u32 battler, enum ItemCaseId caseID)
return ITEM_NO_EFFECT;
}
static u32 RestoreWhiteHerbStats(u32 battler)
u32 RestoreWhiteHerbStats(u32 battler)
{
u32 i, effect = 0;
@ -12379,3 +12362,22 @@ bool32 IsMovePowderBlocked(u32 battlerAtk, u32 battlerDef, u32 move)
return effect;
}
bool32 EmergencyExitCanBeTriggered(u32 battler)
{
u32 ability = GetBattlerAbility(battler);
if (ability != ABILITY_EMERGENCY_EXIT && ability != ABILITY_WIMP_OUT)
return FALSE;
if (IsBattlerTurnDamaged(battler)
&& IsBattlerAlive(battler)
&& HadMoreThanHalfHpNowDoesnt(battler)
&& (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER))
&& !(gBattleTypeFlags & BATTLE_TYPE_ARENA)
&& CountUsablePartyMons(battler) > 0
&& !(gStatuses3[battler] & STATUS3_SKY_DROPPED))
return TRUE;
return FALSE;
}

View File

@ -340,7 +340,7 @@ static bool8 LoadBerryTagGfx(void)
}
break;
case 2:
LZDecompressWram(gBerryTag_Pal, sBerryTag->tilemapBuffers[2]);
LZDecompressWram(gBerryTag_Tilemap, sBerryTag->tilemapBuffers[2]);
sBerryTag->gfxState++;
break;
case 3:

View File

@ -298,7 +298,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
{
{
.name = {_("サダヒロ"), _("ALANN"), _("ALAIN"), _("ADELFO"), _("CLAUS"), _("TEO")},
.otId = 0xBDC9,
.otId = 48585,
.facilityClass = FACILITY_CLASS_BUG_CATCHER,
.species = {SPECIES_BEAUTIFLY, SPECIES_DUSTOX, SPECIES_ILLUMISE, SPECIES_SHIFTRY, SPECIES_BRELOOM, SPECIES_NINJASK, SPECIES_SHEDINJA, SPECIES_PINSIR, SPECIES_HERACROSS, SPECIES_VOLBEAT},
.id = 0,
@ -306,7 +306,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("ヒロオ"), _("LIONEL"), _("LIONEL"), _("CAIO"), _("LUDWIG"), _("LEO")},
.otId = 0xCF09,
.otId = 53001,
.facilityClass = FACILITY_CLASS_YOUNGSTER,
.species = {SPECIES_SWELLOW, SPECIES_SWALOT, SPECIES_SHUCKLE, SPECIES_MANECTRIC, SPECIES_TORKOAL, SPECIES_HARIYAMA, SPECIES_MIGHTYENA, SPECIES_LUDICOLO, SPECIES_CRAWDAUNT, SPECIES_WHISCASH},
.id = 1,
@ -314,7 +314,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("ケイジ"), _("SONNY"), _("HERVE"), _("FEDRO"), _("WENZEL"), _("SANTI")},
.otId = 0x2E34,
.otId = 11828,
.facilityClass = FACILITY_CLASS_SCHOOL_KID_M,
.species = {SPECIES_LINOONE, SPECIES_MIGHTYENA, SPECIES_WHISCASH, SPECIES_ZANGOOSE, SPECIES_SEVIPER, SPECIES_NINETALES, SPECIES_KECLEON, SPECIES_SHUCKLE, SPECIES_MANECTRIC, SPECIES_MACHAMP},
.id = 2,
@ -322,7 +322,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("ユラ"), _("LAYLA"), _("LAYLA"), _("ASTRID"), _("SONJA"), _("LOLA")},
.otId = 0x84EF,
.otId = 34031,
.facilityClass = FACILITY_CLASS_LASS,
.species = {SPECIES_SWALOT, SPECIES_XATU, SPECIES_ALTARIA, SPECIES_GOLDUCK, SPECIES_FLYGON, SPECIES_ALAKAZAM, SPECIES_GARDEVOIR, SPECIES_WAILORD, SPECIES_GRUMPIG, SPECIES_MIGHTYENA},
.id = 3,
@ -330,7 +330,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("ヨウカ"), _("MACY"), _("AMELIE"), _("CLEO"), _("MARIA"), _("ELISA")},
.otId = 0x1E43,
.otId = 7747,
.facilityClass = FACILITY_CLASS_SCHOOL_KID_F,
.species = {SPECIES_WIGGLYTUFF, SPECIES_LINOONE, SPECIES_KINGDRA, SPECIES_DELCATTY, SPECIES_RAICHU, SPECIES_FEAROW, SPECIES_STARMIE, SPECIES_MEDICHAM, SPECIES_SHIFTRY, SPECIES_BEAUTIFLY},
.id = 4,
@ -338,7 +338,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("ヤスシ"), _("DONTE"), _("BRAHIM"), _("GLAUCO"), _("JOSEF"), _("ROQUE")},
.otId = 0x379F,
.otId = 14239,
.facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M,
.species = {SPECIES_STARMIE, SPECIES_DODRIO, SPECIES_AGGRON, SPECIES_MAGNETON, SPECIES_MACHAMP, SPECIES_ARMALDO, SPECIES_HERACROSS, SPECIES_NOSEPASS, SPECIES_EXPLOUD, SPECIES_MIGHTYENA},
.id = 5,
@ -346,7 +346,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("ミサオ"), _("AMIRA"), _("LAURE"), _("DAFNE"), _("AMELIE"), _("LARA")},
.otId = 0xF555,
.otId = 62805,
.facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F,
.species = {SPECIES_STARMIE, SPECIES_DODRIO, SPECIES_MAGNETON, SPECIES_MEDICHAM, SPECIES_MIGHTYENA, SPECIES_GLALIE, SPECIES_GOLEM, SPECIES_ELECTRODE, SPECIES_PELIPPER, SPECIES_SHARPEDO},
.id = 6,
@ -354,7 +354,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("カズサ"), _("KALI"), _("JODIE"), _("ILENIA"), _("KARO"), _("ELSA")},
.otId = 0x8D26,
.otId = 36134,
.facilityClass = FACILITY_CLASS_BEAUTY,
.species = {SPECIES_NINETALES, SPECIES_ALAKAZAM, SPECIES_SCEPTILE, SPECIES_SALAMENCE, SPECIES_GOLDUCK, SPECIES_MAWILE, SPECIES_WEEZING, SPECIES_LANTURN, SPECIES_GARDEVOIR, SPECIES_MILOTIC},
.id = 7,
@ -362,7 +362,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("スミレ"), _("ANNIE"), _("ANNIE"), _("IMELDA"), _("INES"), _("ROSA")},
.otId = 0x800C,
.otId = 32780,
.facilityClass = FACILITY_CLASS_AROMA_LADY,
.species = {SPECIES_SCEPTILE, SPECIES_VILEPLUME, SPECIES_BELLOSSOM, SPECIES_ROSELIA, SPECIES_CORSOLA, SPECIES_FLYGON, SPECIES_BRELOOM, SPECIES_MILOTIC, SPECIES_ALTARIA, SPECIES_CRADILY},
.id = 8,
@ -370,7 +370,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("アキノリ"), _("DILLEN"), _("RENE"), _("INDRO"), _("DETLEF"), _("PEDRO")},
.otId = 0x469f,
.otId = 18079,
.facilityClass = FACILITY_CLASS_HIKER,
.species = {SPECIES_SKARMORY, SPECIES_GOLEM, SPECIES_BLAZIKEN, SPECIES_CAMERUPT, SPECIES_DONPHAN, SPECIES_MUK, SPECIES_SALAMENCE, SPECIES_TROPIUS, SPECIES_SOLROCK, SPECIES_RHYDON},
.id = 9,
@ -378,7 +378,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("トウゾウ"), _("DALLAS"), _("BRUNO"), _("LEARCO"), _("ANSGAR"), _("MANOLO")},
.otId = 0x71FC,
.otId = 29180,
.facilityClass = FACILITY_CLASS_FISHERMAN,
.species = {SPECIES_SEAKING, SPECIES_STARMIE, SPECIES_GOLDUCK, SPECIES_TENTACRUEL, SPECIES_OCTILLERY, SPECIES_GOREBYSS, SPECIES_GLALIE, SPECIES_WAILORD, SPECIES_SHARPEDO, SPECIES_KINGDRA},
.id = 10,
@ -386,7 +386,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("セイヤ"), _("FRANK"), _("FRANK"), _("OLINDO"), _("FRANK"), _("MAURO")},
.otId = 0xA39E,
.otId = 41886,
.facilityClass = FACILITY_CLASS_SAILOR,
.species = {SPECIES_QUAGSIRE, SPECIES_STARMIE, SPECIES_PELIPPER, SPECIES_CRAWDAUNT, SPECIES_WAILORD, SPECIES_GYARADOS, SPECIES_SWAMPERT, SPECIES_LANTURN, SPECIES_WHISCASH, SPECIES_SHUCKLE},
.id = 11,
@ -394,7 +394,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("リュウジ"), _("LAMONT"), _("XAV"), _("ORFEO"), _("JÜRGEN"), _("JORGE")},
.otId = 0xE590,
.otId = 58768,
.facilityClass = FACILITY_CLASS_GUITARIST,
.species = {SPECIES_ABSOL, SPECIES_CROBAT, SPECIES_EXPLOUD, SPECIES_MAGNETON, SPECIES_SHARPEDO, SPECIES_MANECTRIC, SPECIES_METAGROSS, SPECIES_ELECTRODE, SPECIES_NOSEPASS, SPECIES_WEEZING},
.id = 12,
@ -402,7 +402,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("カツアキ"), _("TYRESE"), _("ANDY"), _("PARIDE"), _("DAVID"), _("CHICHO")},
.otId = 0xD018,
.otId = 53272,
.facilityClass = FACILITY_CLASS_BLACK_BELT,
.species = {SPECIES_BLAZIKEN, SPECIES_GOLEM, SPECIES_MACHAMP, SPECIES_RHYDON, SPECIES_HARIYAMA, SPECIES_AGGRON, SPECIES_MEDICHAM, SPECIES_ZANGOOSE, SPECIES_VIGOROTH, SPECIES_SLAKING},
.id = 13,
@ -410,7 +410,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("トシミツ"), _("DANTE"), _("DANTE"), _("RAOUL"), _("LOTHAR"), _("PABLO")},
.otId = 0xBC75,
.otId = 48245,
.facilityClass = FACILITY_CLASS_RUIN_MANIAC,
.species = {SPECIES_SCEPTILE, SPECIES_SANDSLASH, SPECIES_FLYGON, SPECIES_CLAYDOL, SPECIES_ARMALDO, SPECIES_CROBAT, SPECIES_CRADILY, SPECIES_SOLROCK, SPECIES_LUNATONE, SPECIES_GOLEM},
.id = 14,
@ -418,7 +418,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] =
},
{
.name = {_("ローウェン"), _("ARTURO"), _("ARTURO"), _("ROMOLO"), _("BRIAN"), _("ARTURO")},
.otId = 0xFA02,
.otId = 64002,
.facilityClass = FACILITY_CLASS_GENTLEMAN,
.species = {SPECIES_ABSOL, SPECIES_MIGHTYENA, SPECIES_ALAKAZAM, SPECIES_BANETTE, SPECIES_NINETALES, SPECIES_CLAYDOL, SPECIES_MUK, SPECIES_SALAMENCE, SPECIES_WALREIN, SPECIES_DUSCLOPS},
.id = 15,

View File

@ -2,7 +2,7 @@ const u32 gBerryCheck_Gfx[] = INCBIN_U32("graphics/bag/check_berry.4bpp.lz");
const u32 gBerryCheck_Pal[] = INCBIN_U32("graphics/bag/check_berry.gbapal.lz");
const u32 gBerryTag_Gfx[] = INCBIN_U32("graphics/bag/berry_tag.bin.lz");
const u32 gBerryTag_Pal[] = INCBIN_U32("graphics/bag/berry_tag_title.bin.lz");
const u32 gBerryTag_Tilemap[] = INCBIN_U32("graphics/bag/berry_tag_title.bin.lz");
const u32 gBerryCheckCircle_Gfx[] = INCBIN_U32("graphics/bag/check_berry_circle.4bpp.lz");

View File

@ -451,7 +451,7 @@ ALIGNED(4) static const u8 sText_NobodyHasRegistered[] = _("Nobody has registere
ALIGNED(4) static const u8 sText_ChooseRequestedMonType[] = _("Please choose the type of POKéMON\nthat you would like in the trade.\n");
ALIGNED(4) static const u8 sText_WhichMonWillYouOffer[] = _("Which of your party POKéMON will\nyou offer in trade?\p");
ALIGNED(4) static const u8 sText_RegistrationCanceled[] = _("Registration has been canceled.\p");
ALIGNED(4) static const u8 sText_RegistraionCompleted[] = _("Registration has been completed.\p");
ALIGNED(4) static const u8 sText_RegistrationCompleted[] = _("Registration has been completed.\p");
ALIGNED(4) static const u8 sText_TradeCanceled[] = _("The trade has been canceled.\p");
ALIGNED(4) static const u8 sText_CancelRegistrationOfMon[] = _("Cancel the registration of your\nLv. {STR_VAR_2} {STR_VAR_1}?");
ALIGNED(4) static const u8 sText_CancelRegistrationOfEgg[] = _("Cancel the registration of your\nEGG?");
@ -867,7 +867,8 @@ static const struct WindowTemplate sWindowTemplate_TradingBoardRequestType = {
.baseBlock = 0x0001
};
static const struct ListMenuItem sTradingBoardTypes[NUMBER_OF_MON_TYPES] = {
// Subtract two from the total type count to handle in-battle types not for display
static const struct ListMenuItem sTradingBoardTypes[NUMBER_OF_MON_TYPES - 2] = {
{ gTypesInfo[TYPE_NORMAL].name, TYPE_NORMAL },
{ gTypesInfo[TYPE_FIRE].name, TYPE_FIRE },
{ gTypesInfo[TYPE_WATER].name, TYPE_WATER },

View File

@ -1932,7 +1932,7 @@ static void ClearPlaceDecorationGraphicsDataBuffer(struct PlaceDecorationGraphic
static void CopyPalette(u16 *dest, u16 pal)
{
CpuFastCopy(&((u16 *)gTilesetPointer_SecretBase->palettes)[pal * 16], dest, sizeof(u16) * 16);
CpuFastCopy(&gTilesetPointer_SecretBase->palettes[pal], dest, PLTT_SIZE_4BPP);
}
static void CopyTile(u8 *dest, u16 tile)
@ -1945,7 +1945,7 @@ static void CopyTile(u8 *dest, u16 tile)
if (tile != 0)
tile &= 0x03FF;
CpuFastCopy(&((u8 *)gTilesetPointer_SecretBase->tiles)[tile * TILE_SIZE_4BPP], buffer, TILE_SIZE_4BPP);
CpuFastCopy(&gTilesetPointer_SecretBase->tiles[tile * TILE_SIZE_4BPP / sizeof(u32)], buffer, TILE_SIZE_4BPP);
switch (mode)
{
case 0:
@ -1987,7 +1987,7 @@ static void SetDecorSelectionBoxTiles(struct PlaceDecorationGraphicsDataBuffer *
static u16 GetMetatile(u16 tile)
{
return ((u16 *)gTilesetPointer_SecretBaseRedCave->metatiles)[tile] & 0xFFF;
return gTilesetPointer_SecretBaseRedCave->metatiles[tile] & 0xFFF;
}
static void SetDecorSelectionMetatiles(struct PlaceDecorationGraphicsDataBuffer *data)
@ -2058,7 +2058,7 @@ static u8 gpu_pal_decompress_alloc_tag_and_upload(struct PlaceDecorationGraphics
SetDecorSelectionMetatiles(data);
SetDecorSelectionBoxOamAttributes(data->decoration->shape);
SetDecorSelectionBoxTiles(data);
CopyPalette(data->palette, ((u16 *)gTilesetPointer_SecretBaseRedCave->metatiles)[(data->decoration->tiles[0] * NUM_TILES_PER_METATILE) + 7] >> 12);
CopyPalette(data->palette, gTilesetPointer_SecretBaseRedCave->metatiles[(data->decoration->tiles[0] * NUM_TILES_PER_METATILE) + 7] >> 12);
LoadSpritePalette(&sSpritePal_PlaceDecoration);
return CreateSprite(&sDecorationSelectorSpriteTemplate, 0, 0, 0);
}
@ -2114,7 +2114,7 @@ static u8 AddDecorationIconObjectFromObjectEvent(u16 tilesTag, u16 paletteTag, u
SetDecorSelectionMetatiles(&sPlaceDecorationGraphicsDataBuffer);
SetDecorSelectionBoxOamAttributes(sPlaceDecorationGraphicsDataBuffer.decoration->shape);
SetDecorSelectionBoxTiles(&sPlaceDecorationGraphicsDataBuffer);
CopyPalette(sPlaceDecorationGraphicsDataBuffer.palette, ((u16 *)gTilesetPointer_SecretBaseRedCave->metatiles)[(sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0] * NUM_TILES_PER_METATILE) + 7] >> 12);
CopyPalette(sPlaceDecorationGraphicsDataBuffer.palette, gTilesetPointer_SecretBaseRedCave->metatiles[(sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0] * NUM_TILES_PER_METATILE) + 7] >> 12);
sheet.data = sPlaceDecorationGraphicsDataBuffer.image;
sheet.size = sDecorShapeSizes[sPlaceDecorationGraphicsDataBuffer.decoration->shape] * TILE_SIZE_4BPP;
sheet.tag = tilesTag;

View File

@ -610,7 +610,7 @@ const u16 gBattleAnimUnused_Unknown2[] = INCBIN_U16("graphics/battle_anims/unuse
const u16 gBattleAnimUnused_Unknown3[] = INCBIN_U16("graphics/battle_anims/unused/unknown_3.bin");
const u32 gBattleAnimUnusedGfx_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.8bpp.lz");
const u16 gBattleAnimUnusedPal_LineSketch2[] = INCBIN_U16("graphics/battle_anims/unused/line_sketch_2.gbapal.lz");
const u32 gBattleAnimUnusedPal_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.gbapal.lz");
const u32 gBattleAnimUnusedTilemap_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.bin.lz");
const u32 gBattleAnimSpriteGfx_BlueLines[] = INCBIN_U32("graphics/battle_anims/sprites/blue_lines.4bpp.lz");

View File

@ -5344,7 +5344,7 @@ static void PrintStatsScreen_NameGender(u8 taskId, u32 num, u32 value)
value = NationalToHoennOrder(num);
else
value = num;
ConvertIntToDecimalStringN(StringCopy(str, gText_NumberClear01), value, STR_CONV_MODE_LEADING_ZEROS, 3);
ConvertIntToDecimalStringN(StringCopy(str, gText_NumberClear01), value, STR_CONV_MODE_LEADING_ZEROS, 4);
PrintStatsScreenTextSmall(WIN_STATS_NAME_GENDER, str, base_x, base_y + 10);
//Gender ratio //MON_GENDERLESS == 0xFF

View File

@ -35,7 +35,7 @@ EWRAM_DATA u8 gMsgBoxIsCancelable = FALSE;
extern ScrCmdFunc gScriptCmdTable[];
extern ScrCmdFunc gScriptCmdTableEnd[];
extern void *gNullScriptPtr;
extern void * const gNullScriptPtr;
void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd)
{

View File

@ -75,7 +75,7 @@ static u8 ReadData();
static void EnableGpioPortRead();
static void DisableGpioPortRead();
static const char AgbLibRtcVersion[] = "SIIRTC_V001";
USED static const char AgbLibRtcVersion[] = "SIIRTC_V001";
void SiiRtcUnprotect(void)
{

View File

@ -3125,7 +3125,7 @@ static void Task_RunUnionRoom(u8 taskId)
break;
case UR_STATE_REGISTER_COMPLETE:
SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
ScheduleFieldMessageAndExit(sText_RegistraionCompleted);
ScheduleFieldMessageAndExit(sText_RegistrationCompleted);
break;
case UR_STATE_CANCEL_REGISTRATION_PROMPT:
switch (UnionRoomHandleYesNo(&uroom->textState, FALSE))

View File

@ -20,3 +20,31 @@ SINGLE_BATTLE_TEST("Aftermath damages the attacker by 1/4th of its max HP if fai
EXPECT_EQ(aftermathDamage, opponent->maxHP / 4);
}
}
SINGLE_BATTLE_TEST("Aftermath ability pop-up will be displayed correctly: player point of view")
{
GIVEN {
PLAYER(SPECIES_SHROOMISH) { Ability(ABILITY_POISON_HEAL); };
OPPONENT(SPECIES_VOLTORB) { HP(1); Ability(ABILITY_AFTERMATH); };
} WHEN {
TURN {MOVE(player, MOVE_HEADBUTT);}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_HEADBUTT, player);
MESSAGE("The opposing Voltorb fainted!");
ABILITY_POPUP(opponent, ABILITY_AFTERMATH);
}
}
SINGLE_BATTLE_TEST("Aftermath ability pop-up will be displayed correctly: opponent point of view")
{
GIVEN {
PLAYER(SPECIES_VOLTORB) { HP(1); Ability(ABILITY_AFTERMATH); };
OPPONENT(SPECIES_SHROOMISH) { Ability(ABILITY_POISON_HEAL); };
} WHEN {
TURN {MOVE(opponent, MOVE_HEADBUTT);}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_HEADBUTT, opponent);
MESSAGE("Voltorb fainted!");
ABILITY_POPUP(player, ABILITY_AFTERMATH);
}
}

View File

@ -412,3 +412,43 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S
MESSAGE("The opposing Metang used Celebrate!");
}
}
SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke protect from Protect's secondary effects")
{
u32 move = MOVE_NONE;
u32 species = SPECIES_NONE;
u32 ability = ABILITY_NONE;
static const u32 moves[] = {
MOVE_SPIKY_SHIELD,
MOVE_KINGS_SHIELD,
MOVE_SILK_TRAP,
MOVE_OBSTRUCT,
};
for (u32 j = 0; j < ARRAY_COUNT(moves); j++)
{
PARAMETRIZE{ move = moves[j]; species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; }
PARAMETRIZE{ move = moves[j]; species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; }
PARAMETRIZE{ move = moves[j]; species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; }
}
GIVEN {
PLAYER(species) { Ability(ability); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, move); MOVE(player, MOVE_TACKLE); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, move, opponent);
NONE_OF {
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player);
if (move == MOVE_KINGS_SHIELD) {
MESSAGE("Wobbuffet's Attack fell!");
} else if (move == MOVE_SILK_TRAP) {
MESSAGE("Wobbuffet's Speed fell!");
} else if (move == MOVE_OBSTRUCT) {
MESSAGE("Wobbuffet's Defense harshly fell!");
}
}
}
}

View File

@ -47,3 +47,22 @@ SINGLE_BATTLE_TEST("Emergency Exit switches out when going below 50% max-HP but
ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT);
}
}
DOUBLE_BATTLE_TEST("Only the fastest Wimp Out (Emergency Exit) user switches out")
{
GIVEN {
PLAYER(SPECIES_ZAPDOS) { Speed(10); }
PLAYER(SPECIES_WOBBUFFET) { Speed(10); }
OPPONENT(SPECIES_WIMPOD) { Speed(1); Ability(ABILITY_WIMP_OUT); Item(ITEM_FOCUS_SASH); };
OPPONENT(SPECIES_WIMPOD) { Speed(2); Ability(ABILITY_WIMP_OUT); Item(ITEM_FOCUS_SASH); };
OPPONENT(SPECIES_WOBBUFFET) { Speed(10); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(10); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_HYPER_VOICE); SEND_OUT(opponentRight, 2); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft);
HP_BAR(opponentLeft);
HP_BAR(opponentRight);
ABILITY_POPUP(opponentRight, ABILITY_WIMP_OUT);
}
}

View File

@ -89,3 +89,25 @@ DOUBLE_BATTLE_TEST("Hospitality does not trigger if there is no ally on the fiel
NOT ABILITY_POPUP(playerLeft, ABILITY_HOSPITALITY);
}
}
DOUBLE_BATTLE_TEST("Hospitality is blocked by Heal Block")
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_HEAL_BLOCK) == EFFECT_HEAL_BLOCK);
PLAYER(SPECIES_WOBBUFFET)
PLAYER(SPECIES_WOBBUFFET) { HP(75); MaxHP(100); }
PLAYER(SPECIES_POLTCHAGEIST) { Ability(ABILITY_HOSPITALITY); }
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponentLeft, MOVE_HEAL_BLOCK, target: playerRight); }
TURN { SWITCH(playerLeft, 2); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BLOCK, opponentLeft);
NONE_OF {
ABILITY_POPUP(playerLeft, ABILITY_HOSPITALITY);
MESSAGE("Wobbuffet drank down all the matcha that Poltchageist made!");
HP_BAR(playerRight, damage: -25);
}
}
}

View File

@ -122,16 +122,30 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spot
}
}
AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: U-Turn will send out Ace Mon if it's the only one remaining")
AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Switch effect moves will send out Ace Mon if it's the only one remaining")
{
u32 aiMove = 0;
// Moves testing all effects in IsSwitchOutEffect
PARAMETRIZE { aiMove = MOVE_U_TURN; }
PARAMETRIZE { aiMove = MOVE_TELEPORT; }
PARAMETRIZE { aiMove = MOVE_PARTING_SHOT; }
PARAMETRIZE { aiMove = MOVE_BATON_PASS; }
PARAMETRIZE { aiMove = MOVE_CHILLY_RECEPTION; }
PARAMETRIZE { aiMove = MOVE_SHED_TAIL; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE);
ASSUME(GetMoveEffect(MOVE_TELEPORT) == EFFECT_TELEPORT);
ASSUME(GetMoveEffect(MOVE_PARTING_SHOT) == EFFECT_PARTING_SHOT);
ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS);
ASSUME(GetMoveEffect(MOVE_CHILLY_RECEPTION) == EFFECT_CHILLY_RECEPTION);
ASSUME(GetMoveEffect(MOVE_SHED_TAIL) == EFFECT_SHED_TAIL);
WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_ACE_POKEMON);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_U_TURN); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(aiMove); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponent, MOVE_U_TURN); EXPECT_SEND_OUT(opponent, 1); }
TURN { EXPECT_MOVE(opponent, aiMove); EXPECT_SEND_OUT(opponent, 1); }
}
}

View File

@ -1624,3 +1624,15 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamax is reverted before switch out")
MESSAGE("Wobbuffet used Tackle!");
}
}
SINGLE_BATTLE_TEST("Dynamax: Destiny Bond if a dynamaxed battler is present on field")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, MOVE_DESTINY_BOND); MOVE(player, MOVE_TACKLE, gimmick: GIMMICK_DYNAMAX); }
} SCENE {
MESSAGE("The move was blocked by the power of Dynamax!");
}
}

View File

@ -88,3 +88,34 @@ SINGLE_BATTLE_TEST("Clear Amulet prevents secondary effects that reduce stats")
}
}
}
SINGLE_BATTLE_TEST("Clear Amulet protects from Protect's secondary effects")
{
u32 move;
PARAMETRIZE { move = MOVE_SPIKY_SHIELD; }
PARAMETRIZE { move = MOVE_BANEFUL_BUNKER; }
PARAMETRIZE { move = MOVE_BURNING_BULWARK; }
PARAMETRIZE { move = MOVE_KINGS_SHIELD; }
PARAMETRIZE { move = MOVE_SILK_TRAP; }
PARAMETRIZE { move = MOVE_OBSTRUCT; }
GIVEN {
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_CLEAR_AMULET); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, move); MOVE(player, MOVE_TACKLE); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, move, opponent);
NONE_OF {
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player);
if (move == MOVE_KINGS_SHIELD) {
MESSAGE("Wobbuffet's Attack fell!");
} else if (move == MOVE_SILK_TRAP) {
MESSAGE("Wobbuffet's Speed fell!");
} else if (move == MOVE_OBSTRUCT) {
MESSAGE("Wobbuffet's Defense harshly fell!");
}
}
}
}

View File

@ -137,3 +137,26 @@ DOUBLE_BATTLE_TEST("Eject Pack will not trigger if the conditions are not met")
}
}
SINGLE_BATTLE_TEST("Eject Pack will miss timing to switch out user if Eject Button was activated on target")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET) { Speed(10); Item(ITEM_EJECT_PACK); }
PLAYER(SPECIES_WYNAUT) { Speed(10); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Item(ITEM_EJECT_BUTTON); }
OPPONENT(SPECIES_WYNAUT) { Speed(10); }
} WHEN {
TURN { MOVE(player, MOVE_OVERHEAT); SEND_OUT(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_OVERHEAT, player);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
NONE_OF {
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player);
MESSAGE("Wobbuffet is switched out with the Eject Pack!");
}
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent);
} THEN {
EXPECT(player->species == SPECIES_WOBBUFFET);
EXPECT(opponent->species == SPECIES_WYNAUT);
}
}

View File

@ -97,9 +97,9 @@ SINGLE_BATTLE_TEST("Protective Pads protects from Protect's secondary effects")
if (move == MOVE_SPIKY_SHIELD) {
HP_BAR(player);
} else if (move == MOVE_BANEFUL_BUNKER) {
STATUS_ICON(player, STATUS1_BURN);
} else if (move == MOVE_BURNING_BULWARK) {
STATUS_ICON(player, STATUS1_POISON);
} else if (move == MOVE_BURNING_BULWARK) {
STATUS_ICON(player, STATUS1_BURN);
} else if (move == MOVE_KINGS_SHIELD) {
MESSAGE("Wobbuffet's Attack fell!");
} else if (move == MOVE_SILK_TRAP) {

View File

@ -1,6 +1,43 @@
#include "global.h"
#include "test/battle.h"
SINGLE_BATTLE_TEST("Counter is not affected by Protect effects")
{
u32 move;
PARAMETRIZE { move = MOVE_SPIKY_SHIELD; }
PARAMETRIZE { move = MOVE_BANEFUL_BUNKER; }
PARAMETRIZE { move = MOVE_BURNING_BULWARK; }
PARAMETRIZE { move = MOVE_KINGS_SHIELD; }
PARAMETRIZE { move = MOVE_SILK_TRAP; }
PARAMETRIZE { move = MOVE_OBSTRUCT; }
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, move); MOVE(player, MOVE_COUNTER); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, move, opponent);
NONE_OF {
ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player);
if (move == MOVE_SPIKY_SHIELD) {
HP_BAR(player);
} else if (move == MOVE_BANEFUL_BUNKER) {
STATUS_ICON(player, STATUS1_POISON);
} else if (move == MOVE_BURNING_BULWARK) {
STATUS_ICON(player, STATUS1_BURN);
} else if (move == MOVE_KINGS_SHIELD) {
MESSAGE("Wobbuffet's Attack fell!");
} else if (move == MOVE_SILK_TRAP) {
MESSAGE("Wobbuffet's Speed fell!");
} else if (move == MOVE_OBSTRUCT) {
MESSAGE("Wobbuffet's Defense harshly fell!");
}
}
}
}
TO_DO_BATTLE_TEST("Counter will do twice as much damage received from the opponent");
TO_DO_BATTLE_TEST("Counter cannot affect ally Pokémon");
TO_DO_BATTLE_TEST("Counter hits the last opponent that hit the user"); //Doubles

View File

@ -563,23 +563,3 @@ DOUBLE_BATTLE_TEST("Crafty Shield does not protect against moves that target all
MESSAGE("The opposing Sunflora's Defense rose!");
}
}
SINGLE_BATTLE_TEST("Spiky Shield does not damage users on Counter or Mirror Coat")
{
u32 move;
PARAMETRIZE { move = MOVE_MIRROR_COAT; }
PARAMETRIZE { move = MOVE_COUNTER; }
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_SPIKY_SHIELD); MOVE(opponent, move); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKY_SHIELD, player);
NONE_OF {
ANIMATION(ANIM_TYPE_MOVE, move, opponent);
HP_BAR(opponent);
}
}
}

View File

@ -296,3 +296,49 @@ SINGLE_BATTLE_TEST("Rage Fist number of hits is copied by Transform")
EXPECT_MUL_EQ(timesGotHit[0], Q_4_12(2.0), timesGotHit[1]);
}
}
SINGLE_BATTLE_TEST("Rage Fist base power is increased by 50 if user was hit and forces out")
{
s16 timesGotHit[2];
GIVEN {
PLAYER(SPECIES_REGIROCK);
OPPONENT(SPECIES_REGIROCK);
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN { MOVE(opponent, MOVE_RAGE_FIST); MOVE(player, MOVE_DRAGON_TAIL); }
TURN { MOVE(player, MOVE_CELEBRATE); SWITCH(opponent, 0); }
TURN { MOVE(opponent, MOVE_RAGE_FIST); MOVE(player, MOVE_CELEBRATE); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, opponent);
HP_BAR(player, captureDamage: &timesGotHit[0]);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, player);
HP_BAR(opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, opponent);
HP_BAR(player, captureDamage: &timesGotHit[1]);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
} THEN {
EXPECT_MUL_EQ(timesGotHit[0], Q_4_12(2.0), timesGotHit[1]);
}
}
SINGLE_BATTLE_TEST("Rage Fist doesn't get increased power if Substitute is hit")
{
s16 timesGotHit[2];
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, MOVE_RAGE_FIST); MOVE(player, MOVE_CELEBRATE); }
TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_TACKLE); }
TURN { MOVE(opponent, MOVE_RAGE_FIST); MOVE(player, MOVE_CELEBRATE); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, opponent);
HP_BAR(player, captureDamage: &timesGotHit[0]);
ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, opponent);
HP_BAR(player, captureDamage: &timesGotHit[1]);
} THEN {
EXPECT_EQ(timesGotHit[0], timesGotHit[1]);
}
}

View File

@ -186,13 +186,9 @@ SINGLE_BATTLE_TEST("Toxic Spikes are removed by grounded Poison-type Pokémon on
}
}
// This would test for what I believe to be a bug in the mainline games.
// A Pokémon that gets passed magnet rise should still remove the Toxic
// Spikes even though it is airborne.
// The test currently fails, because we don't incorporate this bug.
SINGLE_BATTLE_TEST("Toxic Spikes are removed by Poison-type Pokémon affected by Magnet Rise on switch in")
// Tested in Gen 7 on cartridge
SINGLE_BATTLE_TEST("Toxic Spikes are not removed by Poison-type Pokémon affected by Magnet Rise on switch in")
{
KNOWN_FAILING;
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_EKANS].types[0] == TYPE_POISON);
PLAYER(SPECIES_WOBBUFFET);
@ -203,9 +199,8 @@ SINGLE_BATTLE_TEST("Toxic Spikes are removed by Poison-type Pokémon affected by
TURN { MOVE(player, MOVE_TOXIC_SPIKES); MOVE(opponent, MOVE_BATON_PASS); SEND_OUT(opponent, 1); }
TURN { SWITCH(opponent, 0); }
} SCENE {
NOT STATUS_ICON(opponent, poison: TRUE);
MESSAGE("The poison spikes disappeared from the ground around the opposing team!");
NOT STATUS_ICON(opponent, poison: TRUE);
NOT MESSAGE("The poison spikes disappeared from the ground around the opposing team!");
STATUS_ICON(opponent, poison: TRUE);
}
}

View File

@ -16,15 +16,16 @@ DOUBLE_BATTLE_TEST("Spread Moves: Ability and Item effects activate correctly af
MOVE(opponentRight, MOVE_HEAT_WAVE);
MOVE(playerLeft, MOVE_HYPER_VOICE);
SEND_OUT(opponentRight, 3);
SEND_OUT(opponentLeft, 2);
}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight);
MESSAGE("The opposing Wobbuffet is switched out with the Eject Button!");
MESSAGE("2 sent out Pikachu!");
ABILITY_POPUP(opponentLeft, ABILITY_EMERGENCY_EXIT);
MESSAGE("2 sent out Wynaut!");
NONE_OF {
ABILITY_POPUP(opponentLeft, ABILITY_EMERGENCY_EXIT);
MESSAGE("2 sent out Wynaut!");
}
}
}

View File

@ -104,6 +104,62 @@ static u32 AssignCostToRunner(void)
return minCostProcess;
}
void TestRunner_CheckMemory(void)
{
if (gTestRunnerState.result == TEST_RESULT_PASS
&& !gTestRunnerState.expectLeaks)
{
int i;
const struct MemBlock *head = HeapHead();
const struct MemBlock *block = head;
do
{
if (block->magic != MALLOC_SYSTEM_ID
|| !(EWRAM_START <= (uintptr_t)block->next && (uintptr_t)block->next < EWRAM_END)
|| (block->next <= block && block->next != head))
{
Test_MgbaPrintf("gHeap corrupted block at %p", block);
gTestRunnerState.result = TEST_RESULT_ERROR;
break;
}
if (block->allocated)
{
const char *location = MemBlockLocation(block);
if (location)
{
const char *cmpString = "src/generational_changes.c";
for (u32 charIndex = 0; charIndex < 26; charIndex++)
{
if (cmpString[charIndex] != location[charIndex])
{
Test_MgbaPrintf("%s: %d bytes not freed", location, block->size);
gTestRunnerState.result = TEST_RESULT_FAIL;
break;
}
}
}
else
{
Test_MgbaPrintf("<unknown>: %d bytes not freed", block->size);
gTestRunnerState.result = TEST_RESULT_FAIL;
}
}
block = block->next;
}
while (block != head);
for (i = 0; i < NUM_TASKS; i++)
{
if (gTasks[i].isActive)
{
Test_MgbaPrintf(":L%s:%d - %p: task not freed", gTestRunnerState.test->filename, SourceLine(0), gTasks[i].func);
gTestRunnerState.result = TEST_RESULT_FAIL;
}
}
}
}
void CB2_TestRunner(void)
{
top:
@ -242,45 +298,7 @@ top:
gTestRunnerState.tearDown = FALSE;
}
if (gTestRunnerState.result == TEST_RESULT_PASS
&& !gTestRunnerState.expectLeaks)
{
int i;
const struct MemBlock *head = HeapHead();
const struct MemBlock *block = head;
do
{
if (block->magic != MALLOC_SYSTEM_ID
|| !(EWRAM_START <= (uintptr_t)block->next && (uintptr_t)block->next < EWRAM_END)
|| (block->next <= block && block->next != head))
{
Test_MgbaPrintf("gHeap corrupted block at %p", block);
gTestRunnerState.result = TEST_RESULT_ERROR;
break;
}
if (block->allocated)
{
const char *location = MemBlockLocation(block);
if (location)
Test_MgbaPrintf("%s: %d bytes not freed", location, block->size);
else
Test_MgbaPrintf("<unknown>: %d bytes not freed", block->size);
gTestRunnerState.result = TEST_RESULT_FAIL;
}
block = block->next;
}
while (block != head);
for (i = 0; i < NUM_TASKS; i++)
{
if (gTasks[i].isActive)
{
Test_MgbaPrintf(":L%s:%d - %p: task not freed", gTestRunnerState.test->filename, SourceLine(0), gTasks[i].func);
gTestRunnerState.result = TEST_RESULT_FAIL;
}
}
}
TestRunner_CheckMemory();
if (gTestRunnerState.test->runner == &gAssumptionsRunner)
{

View File

@ -1347,6 +1347,7 @@ static void TearDownBattle(void)
static void CB2_BattleTest_NextParameter(void)
{
TestRunner_CheckMemory();
if (++STATE->runParameter >= STATE->parameters)
{
SetMainCallback2(CB2_TestRunner);

View File

@ -6536,7 +6536,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_COVET",
@ -6687,7 +6687,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_COVET",
@ -7754,7 +7754,7 @@
"MOVE_MEDITATE",
"MOVE_POWER_TRICK",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -7890,7 +7890,7 @@
"MOVE_MEDITATE",
"MOVE_POWER_TRICK",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -8033,7 +8033,7 @@
"MOVE_MEDITATE",
"MOVE_POWER_TRICK",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -13164,7 +13164,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_ZEN_HEADBUTT"
],
@ -25781,7 +25781,7 @@
"MOVE_METRONOME",
"MOVE_MIMIC",
"MOVE_PRESENT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -25930,7 +25930,7 @@
"MOVE_METRONOME",
"MOVE_MIMIC",
"MOVE_PRESENT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -31544,7 +31544,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BOUNCE",
@ -31677,7 +31677,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BOUNCE",
@ -31834,7 +31834,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BLAST_BURN",
@ -35812,7 +35812,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -35943,7 +35943,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -36099,7 +36099,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -36155,7 +36155,7 @@
},
{
"Level": 22,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 25,
@ -36301,7 +36301,7 @@
},
{
"Level": 22,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 27,
@ -37260,7 +37260,7 @@
"MOVE_HEAD_SMASH",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -37395,7 +37395,7 @@
"MOVE_HEAD_SMASH",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -37551,7 +37551,7 @@
"MOVE_HEAD_SMASH",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -40230,7 +40230,7 @@
"MOVE_PSYCHO_CUT",
"MOVE_RAPID_SPIN",
"MOVE_ROLE_PLAY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TRICK",
"MOVE_WATER_PULSE",
"MOVE_WISH"
@ -40775,7 +40775,7 @@
"MOVE_MAGICAL_LEAF",
"MOVE_NASTY_PLOT",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWITCHEROO",
"MOVE_TEETER_DANCE",
"MOVE_WORRY_SEED"
@ -40920,7 +40920,7 @@
"MOVE_MAGICAL_LEAF",
"MOVE_NASTY_PLOT",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWITCHEROO",
"MOVE_TEETER_DANCE",
"MOVE_WORRY_SEED"
@ -55166,7 +55166,7 @@
"MOVE_HEADBUTT",
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -55321,7 +55321,7 @@
"MOVE_HEADBUTT",
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -56469,7 +56469,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_ZEN_HEADBUTT"
],
@ -65266,7 +65266,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": [
@ -65403,7 +65403,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": [
@ -65544,7 +65544,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": [
@ -76069,7 +76069,7 @@
"MOVE_KNOCK_OFF",
"MOVE_LOW_KICK",
"MOVE_ME_FIRST",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VITAL_THROW"
],
"TutorMoves": [
@ -76215,7 +76215,7 @@
"MOVE_KNOCK_OFF",
"MOVE_LOW_KICK",
"MOVE_ME_FIRST",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VITAL_THROW"
],
"TutorMoves": [

View File

@ -5876,7 +5876,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": []
},
@ -6010,7 +6010,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": []
},
@ -6954,7 +6954,7 @@
"MOVE_MEDITATE",
"MOVE_POWER_TRICK",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -7078,7 +7078,7 @@
"MOVE_MEDITATE",
"MOVE_POWER_TRICK",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -7209,7 +7209,7 @@
"MOVE_MEDITATE",
"MOVE_POWER_TRICK",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -11879,7 +11879,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_ZEN_HEADBUTT"
],
@ -23106,7 +23106,7 @@
"MOVE_METRONOME",
"MOVE_MIMIC",
"MOVE_PRESENT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -23242,7 +23242,7 @@
"MOVE_METRONOME",
"MOVE_MIMIC",
"MOVE_PRESENT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -28253,7 +28253,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_FIRE_PLEDGE"
@ -28379,7 +28379,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_FIRE_PLEDGE"
@ -28526,7 +28526,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BLAST_BURN",
@ -32107,7 +32107,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -32227,7 +32227,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -32371,7 +32371,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -32414,7 +32414,7 @@
},
{
"Level": 22,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 25,
@ -32549,7 +32549,7 @@
},
{
"Level": 22,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 27,
@ -33386,7 +33386,7 @@
"MOVE_HEAD_SMASH",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -33512,7 +33512,7 @@
"MOVE_HEAD_SMASH",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -33659,7 +33659,7 @@
"MOVE_HEAD_SMASH",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -36075,7 +36075,7 @@
"MOVE_PSYCHO_CUT",
"MOVE_RAPID_SPIN",
"MOVE_ROLE_PLAY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TRICK",
"MOVE_WATER_PULSE",
"MOVE_WISH"
@ -36505,7 +36505,7 @@
"MOVE_MAGICAL_LEAF",
"MOVE_NASTY_PLOT",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWITCHEROO",
"MOVE_TEETER_DANCE",
"MOVE_WORRY_SEED"
@ -36636,7 +36636,7 @@
"MOVE_MAGICAL_LEAF",
"MOVE_NASTY_PLOT",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWITCHEROO",
"MOVE_TEETER_DANCE",
"MOVE_WORRY_SEED"
@ -49431,7 +49431,7 @@
"MOVE_HEADBUTT",
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -49567,7 +49567,7 @@
"MOVE_HEADBUTT",
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -50591,7 +50591,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_ZEN_HEADBUTT"
],
@ -58423,7 +58423,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": []
@ -58548,7 +58548,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": []
@ -58677,7 +58677,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": []
@ -68196,7 +68196,7 @@
"MOVE_KNOCK_OFF",
"MOVE_LOW_KICK",
"MOVE_ME_FIRST",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VITAL_THROW"
],
"TutorMoves": []
@ -68332,7 +68332,7 @@
"MOVE_KNOCK_OFF",
"MOVE_LOW_KICK",
"MOVE_ME_FIRST",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VITAL_THROW"
],
"TutorMoves": []

View File

@ -5745,7 +5745,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": []
},
@ -5873,7 +5873,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": []
},
@ -6789,7 +6789,7 @@
"MOVE_MEDITATE",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH"
],
"TutorMoves": []
@ -6902,7 +6902,7 @@
"MOVE_MEDITATE",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH"
],
"TutorMoves": []
@ -7018,7 +7018,7 @@
"MOVE_MEDITATE",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH"
],
"TutorMoves": []
@ -11489,7 +11489,7 @@
"MOVE_HAMMER_ARM",
"MOVE_MAGNITUDE",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SUBSTITUTE"
],
@ -22486,7 +22486,7 @@
"MOVE_METRONOME",
"MOVE_PRESENT",
"MOVE_REFLECT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -22618,7 +22618,7 @@
"MOVE_METRONOME",
"MOVE_PRESENT",
"MOVE_REFLECT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -27537,7 +27537,7 @@
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": []
@ -27658,7 +27658,7 @@
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": []
@ -27795,7 +27795,7 @@
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -31332,7 +31332,7 @@
"EggMoves": [
"MOVE_ENDEAVOR",
"MOVE_EXTRASENSORY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_SWAGGER",
@ -31446,7 +31446,7 @@
"EggMoves": [
"MOVE_ENDEAVOR",
"MOVE_EXTRASENSORY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_SWAGGER",
@ -31586,7 +31586,7 @@
"EggMoves": [
"MOVE_ENDEAVOR",
"MOVE_EXTRASENSORY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_SWAGGER",
@ -31630,7 +31630,7 @@
},
{
"Level": 22,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 25,
@ -31758,7 +31758,7 @@
},
{
"Level": 22,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 27,
@ -32577,7 +32577,7 @@
"MOVE_ENDEAVOR",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": []
@ -32698,7 +32698,7 @@
"MOVE_ENDEAVOR",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": []
@ -32842,7 +32842,7 @@
"MOVE_ENDEAVOR",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": []
@ -35217,7 +35217,7 @@
"MOVE_PSYCHO_CUT",
"MOVE_ROCK_SLIDE",
"MOVE_ROLE_PLAY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TRICK",
"MOVE_WISH"
],
@ -35649,7 +35649,7 @@
"MOVE_LOW_KICK",
"MOVE_MAGICAL_LEAF",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TEETER_DANCE"
],
"TutorMoves": []
@ -35782,7 +35782,7 @@
"MOVE_LOW_KICK",
"MOVE_MAGICAL_LEAF",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TEETER_DANCE"
],
"TutorMoves": []
@ -48274,7 +48274,7 @@
"MOVE_HEADBUTT",
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -48405,7 +48405,7 @@
"MOVE_HEADBUTT",
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -49430,7 +49430,7 @@
"MOVE_HAMMER_ARM",
"MOVE_MAGNITUDE",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SUBSTITUTE"
],

View File

@ -4694,7 +4694,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BODY_SLAM",
@ -4807,7 +4807,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BODY_SLAM",
@ -5582,7 +5582,7 @@
"MOVE_MEDITATE",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BODY_SLAM",
@ -5685,7 +5685,7 @@
"MOVE_MEDITATE",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BODY_SLAM",
@ -5789,7 +5789,7 @@
"MOVE_MEDITATE",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BODY_SLAM",
@ -9379,7 +9379,7 @@
"MOVE_CURSE",
"MOVE_MAGNITUDE",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SUBSTITUTE"
],
@ -18107,7 +18107,7 @@
"MOVE_METRONOME",
"MOVE_PRESENT",
"MOVE_REFLECT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE"
],
"TutorMoves": [
@ -18212,7 +18212,7 @@
"MOVE_METRONOME",
"MOVE_PRESENT",
"MOVE_REFLECT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE"
],
"TutorMoves": [
@ -22086,7 +22086,7 @@
"MOVE_ENDURE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -22195,7 +22195,7 @@
"MOVE_ENDURE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -22315,7 +22315,7 @@
"MOVE_ENDURE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -25387,7 +25387,7 @@
],
"EggMoves": [
"MOVE_EXTRASENSORY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SWAGGER",
"MOVE_TAKE_DOWN"
@ -25495,7 +25495,7 @@
],
"EggMoves": [
"MOVE_EXTRASENSORY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SWAGGER",
"MOVE_TAKE_DOWN"
@ -25609,7 +25609,7 @@
],
"EggMoves": [
"MOVE_EXTRASENSORY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SWAGGER",
"MOVE_TAKE_DOWN"
@ -25662,7 +25662,7 @@
},
{
"Level": 31,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 37,
@ -25772,7 +25772,7 @@
},
{
"Level": 33,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 40,
@ -26446,7 +26446,7 @@
"EggMoves": [
"MOVE_BODY_SLAM",
"MOVE_ENDEAVOR",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": [
@ -26550,7 +26550,7 @@
"EggMoves": [
"MOVE_BODY_SLAM",
"MOVE_ENDEAVOR",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": [
@ -26667,7 +26667,7 @@
"EggMoves": [
"MOVE_BODY_SLAM",
"MOVE_ENDEAVOR",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": [
@ -28659,7 +28659,7 @@
"MOVE_DISABLE",
"MOVE_ENCORE",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TRICK",
"MOVE_WISH"
],

View File

@ -6393,7 +6393,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_ENDEAVOR",
@ -6539,7 +6539,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_ENDEAVOR",
@ -7558,7 +7558,7 @@
"MOVE_POWER_TRICK",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH"
],
"TutorMoves": [
@ -7684,7 +7684,7 @@
"MOVE_POWER_TRICK",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH"
],
"TutorMoves": [
@ -7813,7 +7813,7 @@
"MOVE_POWER_TRICK",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH"
],
"TutorMoves": [
@ -12749,7 +12749,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SUBSTITUTE"
],
@ -25059,7 +25059,7 @@
"MOVE_METRONOME",
"MOVE_PRESENT",
"MOVE_REFLECT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -25203,7 +25203,7 @@
"MOVE_METRONOME",
"MOVE_PRESENT",
"MOVE_REFLECT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -30728,7 +30728,7 @@
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -30859,7 +30859,7 @@
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -31011,7 +31011,7 @@
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -34988,7 +34988,7 @@
"MOVE_ENDEAVOR",
"MOVE_EXTRASENSORY",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_SWAGGER",
@ -35114,7 +35114,7 @@
"MOVE_ENDEAVOR",
"MOVE_EXTRASENSORY",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_SWAGGER",
@ -35268,7 +35268,7 @@
"MOVE_ENDEAVOR",
"MOVE_EXTRASENSORY",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_SWAGGER",
@ -35325,7 +35325,7 @@
},
{
"Level": 22,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 25,
@ -35468,7 +35468,7 @@
},
{
"Level": 22,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 27,
@ -36406,7 +36406,7 @@
"MOVE_HEAD_SMASH",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": [
@ -36543,7 +36543,7 @@
"MOVE_HEAD_SMASH",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": [
@ -36704,7 +36704,7 @@
"MOVE_HEAD_SMASH",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": [
@ -39350,7 +39350,7 @@
"MOVE_PSYCHO_CUT",
"MOVE_ROCK_SLIDE",
"MOVE_ROLE_PLAY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TRICK",
"MOVE_WISH"
],
@ -39836,7 +39836,7 @@
"MOVE_MAGICAL_LEAF",
"MOVE_NASTY_PLOT",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TEETER_DANCE"
],
"TutorMoves": [
@ -39983,7 +39983,7 @@
"MOVE_MAGICAL_LEAF",
"MOVE_NASTY_PLOT",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TEETER_DANCE"
],
"TutorMoves": [
@ -54014,7 +54014,7 @@
"MOVE_HEADBUTT",
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -54164,7 +54164,7 @@
"MOVE_HEADBUTT",
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -55299,7 +55299,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SUBSTITUTE"
],

View File

@ -6941,7 +6941,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_COVET",
@ -7101,7 +7101,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_COVET",
@ -8220,7 +8220,7 @@
"MOVE_POWER_TRICK",
"MOVE_QUICK_GUARD",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -8372,7 +8372,7 @@
"MOVE_POWER_TRICK",
"MOVE_QUICK_GUARD",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -8531,7 +8531,7 @@
"MOVE_POWER_TRICK",
"MOVE_QUICK_GUARD",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -13938,7 +13938,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_ZEN_HEADBUTT"
],
@ -27315,7 +27315,7 @@
"MOVE_METRONOME",
"MOVE_MIMIC",
"MOVE_PRESENT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -27475,7 +27475,7 @@
"MOVE_METRONOME",
"MOVE_MIMIC",
"MOVE_PRESENT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -33468,7 +33468,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BOUNCE",
@ -33608,7 +33608,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BOUNCE",
@ -33777,7 +33777,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BLAST_BURN",
@ -38135,7 +38135,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -38275,7 +38275,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -38448,7 +38448,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -38513,7 +38513,7 @@
},
{
"Level": 28,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 31,
@ -38662,7 +38662,7 @@
},
{
"Level": 30,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 34,
@ -39698,7 +39698,7 @@
"MOVE_IRON_HEAD",
"MOVE_REVERSAL",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -39846,7 +39846,7 @@
"MOVE_IRON_HEAD",
"MOVE_REVERSAL",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -40017,7 +40017,7 @@
"MOVE_IRON_HEAD",
"MOVE_REVERSAL",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -42918,7 +42918,7 @@
"MOVE_PSYCHO_SHIFT",
"MOVE_RAPID_SPIN",
"MOVE_ROLE_PLAY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TRICK",
"MOVE_WATER_PULSE",
"MOVE_WISH"
@ -43493,7 +43493,7 @@
"MOVE_NASTY_PLOT",
"MOVE_ROTOTILLER",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWITCHEROO",
"MOVE_TEETER_DANCE",
"MOVE_WORRY_SEED"
@ -43658,7 +43658,7 @@
"MOVE_NASTY_PLOT",
"MOVE_ROTOTILLER",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWITCHEROO",
"MOVE_TEETER_DANCE",
"MOVE_WORRY_SEED"
@ -58895,7 +58895,7 @@
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_QUICK_GUARD",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -59058,7 +59058,7 @@
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_QUICK_GUARD",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -60269,7 +60269,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_ZEN_HEADBUTT"
],
@ -69623,7 +69623,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": [
@ -69763,7 +69763,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": [
@ -69907,7 +69907,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": [
@ -81039,7 +81039,7 @@
"MOVE_KNOCK_OFF",
"MOVE_LOW_KICK",
"MOVE_ME_FIRST",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VITAL_THROW"
],
"TutorMoves": [
@ -81197,7 +81197,7 @@
"MOVE_KNOCK_OFF",
"MOVE_LOW_KICK",
"MOVE_ME_FIRST",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VITAL_THROW"
],
"TutorMoves": [

View File

@ -6231,7 +6231,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_ENDEAVOR",
@ -6373,7 +6373,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_ENDEAVOR",
@ -7363,7 +7363,7 @@
"MOVE_MEDITATE",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH"
],
"TutorMoves": [
@ -7485,7 +7485,7 @@
"MOVE_MEDITATE",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH"
],
"TutorMoves": [
@ -7610,7 +7610,7 @@
"MOVE_MEDITATE",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH"
],
"TutorMoves": [
@ -12437,7 +12437,7 @@
"MOVE_HAMMER_ARM",
"MOVE_MAGNITUDE",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SUBSTITUTE"
],
@ -24447,7 +24447,7 @@
"MOVE_METRONOME",
"MOVE_PRESENT",
"MOVE_REFLECT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -24587,7 +24587,7 @@
"MOVE_METRONOME",
"MOVE_PRESENT",
"MOVE_REFLECT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -29978,7 +29978,7 @@
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -30107,7 +30107,7 @@
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -30256,7 +30256,7 @@
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -34139,7 +34139,7 @@
"EggMoves": [
"MOVE_ENDEAVOR",
"MOVE_EXTRASENSORY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_SWAGGER",
@ -34263,7 +34263,7 @@
"EggMoves": [
"MOVE_ENDEAVOR",
"MOVE_EXTRASENSORY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_SWAGGER",
@ -34413,7 +34413,7 @@
"EggMoves": [
"MOVE_ENDEAVOR",
"MOVE_EXTRASENSORY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_SWAGGER",
@ -34468,7 +34468,7 @@
},
{
"Level": 22,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 25,
@ -34606,7 +34606,7 @@
},
{
"Level": 22,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 27,
@ -35512,7 +35512,7 @@
"MOVE_ENDEAVOR",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": [
@ -35647,7 +35647,7 @@
"MOVE_ENDEAVOR",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": [
@ -35805,7 +35805,7 @@
"MOVE_ENDEAVOR",
"MOVE_IRON_HEAD",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": [
@ -38387,7 +38387,7 @@
"MOVE_PSYCHO_CUT",
"MOVE_ROCK_SLIDE",
"MOVE_ROLE_PLAY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TRICK",
"MOVE_WISH"
],
@ -38859,7 +38859,7 @@
"MOVE_LOW_KICK",
"MOVE_MAGICAL_LEAF",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TEETER_DANCE"
],
"TutorMoves": [
@ -39001,7 +39001,7 @@
"MOVE_LOW_KICK",
"MOVE_MAGICAL_LEAF",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TEETER_DANCE"
],
"TutorMoves": [
@ -52668,7 +52668,7 @@
"MOVE_HEADBUTT",
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -52813,7 +52813,7 @@
"MOVE_HEADBUTT",
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -53921,7 +53921,7 @@
"MOVE_HAMMER_ARM",
"MOVE_MAGNITUDE",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SUBSTITUTE"
],

View File

@ -5046,7 +5046,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BODY_SLAM",
@ -5167,7 +5167,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BODY_SLAM",
@ -6014,7 +6014,7 @@
"MOVE_MEDITATE",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BODY_SLAM",
@ -6126,7 +6126,7 @@
"MOVE_MEDITATE",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BODY_SLAM",
@ -6239,7 +6239,7 @@
"MOVE_MEDITATE",
"MOVE_ROCK_SLIDE",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BODY_SLAM",
@ -10019,7 +10019,7 @@
"MOVE_CURSE",
"MOVE_MAGNITUDE",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SUBSTITUTE"
],
@ -19386,7 +19386,7 @@
"MOVE_METRONOME",
"MOVE_PRESENT",
"MOVE_REFLECT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE"
],
"TutorMoves": [
@ -19501,7 +19501,7 @@
"MOVE_METRONOME",
"MOVE_PRESENT",
"MOVE_REFLECT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE"
],
"TutorMoves": [
@ -23705,7 +23705,7 @@
"MOVE_ENDURE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -23820,7 +23820,7 @@
"MOVE_ENDURE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -23950,7 +23950,7 @@
"MOVE_ENDURE",
"MOVE_REVERSAL",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWAGGER"
],
"TutorMoves": [
@ -27284,7 +27284,7 @@
],
"EggMoves": [
"MOVE_EXTRASENSORY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SWAGGER",
"MOVE_TAKE_DOWN"
@ -27405,7 +27405,7 @@
],
"EggMoves": [
"MOVE_EXTRASENSORY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SWAGGER",
"MOVE_TAKE_DOWN"
@ -27532,7 +27532,7 @@
],
"EggMoves": [
"MOVE_EXTRASENSORY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_SWAGGER",
"MOVE_TAKE_DOWN"
@ -27598,7 +27598,7 @@
},
{
"Level": 31,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 37,
@ -27717,7 +27717,7 @@
},
{
"Level": 33,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 40,
@ -28461,7 +28461,7 @@
"EggMoves": [
"MOVE_BODY_SLAM",
"MOVE_ENDEAVOR",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": [
@ -28573,7 +28573,7 @@
"EggMoves": [
"MOVE_BODY_SLAM",
"MOVE_ENDEAVOR",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": [
@ -28698,7 +28698,7 @@
"EggMoves": [
"MOVE_BODY_SLAM",
"MOVE_ENDEAVOR",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STOMP"
],
"TutorMoves": [
@ -30867,7 +30867,7 @@
"MOVE_DISABLE",
"MOVE_ENCORE",
"MOVE_ROCK_SLIDE",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TRICK",
"MOVE_WISH"
],

View File

@ -6229,7 +6229,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": []
},
@ -6382,7 +6382,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": []
},
@ -7355,7 +7355,7 @@
"MOVE_POWER_TRICK",
"MOVE_QUICK_GUARD",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -7489,7 +7489,7 @@
"MOVE_POWER_TRICK",
"MOVE_QUICK_GUARD",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -7638,7 +7638,7 @@
"MOVE_POWER_TRICK",
"MOVE_QUICK_GUARD",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -12606,7 +12606,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_ZEN_HEADBUTT"
],
@ -24581,7 +24581,7 @@
"MOVE_METRONOME",
"MOVE_MIMIC",
"MOVE_PRESENT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -24720,7 +24720,7 @@
"MOVE_METRONOME",
"MOVE_MIMIC",
"MOVE_PRESENT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -30061,7 +30061,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_FIRE_PLEDGE"
@ -30192,7 +30192,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_FIRE_PLEDGE"
@ -30349,7 +30349,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BLAST_BURN",
@ -34270,7 +34270,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -34397,7 +34397,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -34558,7 +34558,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -34609,7 +34609,7 @@
},
{
"Level": 28,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 31,
@ -34742,7 +34742,7 @@
},
{
"Level": 30,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 34,
@ -35641,7 +35641,7 @@
"MOVE_IRON_HEAD",
"MOVE_REVERSAL",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -35769,7 +35769,7 @@
"MOVE_IRON_HEAD",
"MOVE_REVERSAL",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -35920,7 +35920,7 @@
"MOVE_IRON_HEAD",
"MOVE_REVERSAL",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -38534,7 +38534,7 @@
"MOVE_PSYCHO_SHIFT",
"MOVE_RAPID_SPIN",
"MOVE_ROLE_PLAY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SPOTLIGHT",
"MOVE_TRICK",
"MOVE_WATER_PULSE",
@ -39048,7 +39048,7 @@
"MOVE_NASTY_PLOT",
"MOVE_ROTOTILLER",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWITCHEROO",
"MOVE_TEETER_DANCE",
"MOVE_WORRY_SEED"
@ -39198,7 +39198,7 @@
"MOVE_NASTY_PLOT",
"MOVE_ROTOTILLER",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWITCHEROO",
"MOVE_TEETER_DANCE",
"MOVE_WORRY_SEED"
@ -52913,7 +52913,7 @@
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_QUICK_GUARD",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -53052,7 +53052,7 @@
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_QUICK_GUARD",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -54137,7 +54137,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_ZEN_HEADBUTT"
],
@ -62422,7 +62422,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": []
@ -62546,7 +62546,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": []
@ -62674,7 +62674,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": []
@ -72602,7 +72602,7 @@
"MOVE_KNOCK_OFF",
"MOVE_LOW_KICK",
"MOVE_ME_FIRST",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VITAL_THROW"
],
"TutorMoves": []
@ -72745,7 +72745,7 @@
"MOVE_KNOCK_OFF",
"MOVE_LOW_KICK",
"MOVE_ME_FIRST",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VITAL_THROW"
],
"TutorMoves": []

View File

@ -60044,7 +60044,7 @@
},
{
"Level": 52,
"Move": "MOVE_FOREST\u2019S_CURSE"
"Move": "MOVE_FORESTS_CURSE"
}
],
"PreEvoMoves": [],
@ -60166,7 +60166,7 @@
},
{
"Level": 52,
"Move": "MOVE_FOREST\u2019S_CURSE"
"Move": "MOVE_FORESTS_CURSE"
}
],
"PreEvoMoves": [],

View File

@ -6867,7 +6867,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_COVET",
@ -7039,7 +7039,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_COVET",
@ -8149,7 +8149,7 @@
"MOVE_POWER_TRICK",
"MOVE_QUICK_GUARD",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -8295,7 +8295,7 @@
"MOVE_POWER_TRICK",
"MOVE_QUICK_GUARD",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -8457,7 +8457,7 @@
"MOVE_POWER_TRICK",
"MOVE_QUICK_GUARD",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -13908,7 +13908,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THRASH",
"MOVE_ZEN_HEADBUTT"
@ -27257,7 +27257,7 @@
"MOVE_METRONOME",
"MOVE_MIMIC",
"MOVE_PRESENT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -27411,7 +27411,7 @@
"MOVE_METRONOME",
"MOVE_MIMIC",
"MOVE_PRESENT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -33325,7 +33325,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BOUNCE",
@ -33463,7 +33463,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BOUNCE",
@ -33631,7 +33631,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BLAST_BURN",
@ -37975,7 +37975,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN",
@ -38115,7 +38115,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN",
@ -38291,7 +38291,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN",
@ -38358,7 +38358,7 @@
},
{
"Level": 28,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 31,
@ -38502,7 +38502,7 @@
},
{
"Level": 30,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 34,
@ -39511,7 +39511,7 @@
"MOVE_IRON_HEAD",
"MOVE_REVERSAL",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -39653,7 +39653,7 @@
"MOVE_IRON_HEAD",
"MOVE_REVERSAL",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -39819,7 +39819,7 @@
"MOVE_IRON_HEAD",
"MOVE_REVERSAL",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -42709,7 +42709,7 @@
"MOVE_PSYCHO_SHIFT",
"MOVE_RAPID_SPIN",
"MOVE_ROLE_PLAY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SPOTLIGHT",
"MOVE_TRICK",
"MOVE_WATER_PULSE",
@ -43284,7 +43284,7 @@
"MOVE_POWER_UP_PUNCH",
"MOVE_ROTOTILLER",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWITCHEROO",
"MOVE_TEETER_DANCE",
"MOVE_WORRY_SEED"
@ -43448,7 +43448,7 @@
"MOVE_POWER_UP_PUNCH",
"MOVE_ROTOTILLER",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWITCHEROO",
"MOVE_TEETER_DANCE",
"MOVE_WORRY_SEED"
@ -58660,7 +58660,7 @@
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_QUICK_GUARD",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -58817,7 +58817,7 @@
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_QUICK_GUARD",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -60013,7 +60013,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THRASH",
"MOVE_ZEN_HEADBUTT"
@ -69340,7 +69340,7 @@
"MOVE_MACH_PUNCH",
"MOVE_POWER_UP_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": [
@ -69477,7 +69477,7 @@
"MOVE_MACH_PUNCH",
"MOVE_POWER_UP_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": [
@ -69618,7 +69618,7 @@
"MOVE_MACH_PUNCH",
"MOVE_POWER_UP_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": [
@ -80651,7 +80651,7 @@
"MOVE_KNOCK_OFF",
"MOVE_LOW_KICK",
"MOVE_ME_FIRST",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VITAL_THROW"
],
"TutorMoves": [
@ -80805,7 +80805,7 @@
"MOVE_KNOCK_OFF",
"MOVE_LOW_KICK",
"MOVE_ME_FIRST",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VITAL_THROW"
],
"TutorMoves": [

View File

@ -6251,7 +6251,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": []
},
@ -6392,7 +6392,7 @@
"MOVE_REVENGE",
"MOVE_REVERSAL",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": []
},
@ -7365,7 +7365,7 @@
"MOVE_POWER_TRICK",
"MOVE_QUICK_GUARD",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -7492,7 +7492,7 @@
"MOVE_POWER_TRICK",
"MOVE_QUICK_GUARD",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -7626,7 +7626,7 @@
"MOVE_POWER_TRICK",
"MOVE_QUICK_GUARD",
"MOVE_ROLLING_KICK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_THUNDER_PUNCH",
"MOVE_TICKLE"
],
@ -12530,7 +12530,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_ZEN_HEADBUTT"
],
@ -24501,7 +24501,7 @@
"MOVE_METRONOME",
"MOVE_MIMIC",
"MOVE_PRESENT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -24645,7 +24645,7 @@
"MOVE_METRONOME",
"MOVE_MIMIC",
"MOVE_PRESENT",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_THUNDER_FANG"
],
@ -30010,7 +30010,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_FIRE_PLEDGE"
@ -30138,7 +30138,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_FIRE_PLEDGE"
@ -30291,7 +30291,7 @@
"MOVE_LOW_KICK",
"MOVE_NIGHT_SLASH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT"
"MOVE_SMELLING_SALTS"
],
"TutorMoves": [
"MOVE_BLAST_BURN",
@ -34074,7 +34074,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -34197,7 +34197,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -34352,7 +34352,7 @@
"MOVE_EXTRASENSORY",
"MOVE_FAKE_TEARS",
"MOVE_HAMMER_ARM",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SMOKESCREEN",
"MOVE_SNORE",
"MOVE_TAKE_DOWN"
@ -34395,7 +34395,7 @@
},
{
"Level": 22,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 25,
@ -34532,7 +34532,7 @@
},
{
"Level": 22,
"Move": "MOVE_SMELLING_SALT"
"Move": "MOVE_SMELLING_SALTS"
},
{
"Level": 27,
@ -35457,7 +35457,7 @@
"MOVE_IRON_HEAD",
"MOVE_REVERSAL",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -35582,7 +35582,7 @@
"MOVE_IRON_HEAD",
"MOVE_REVERSAL",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -35730,7 +35730,7 @@
"MOVE_IRON_HEAD",
"MOVE_REVERSAL",
"MOVE_SCREECH",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_STEALTH_ROCK",
"MOVE_STOMP",
"MOVE_SUPERPOWER"
@ -38335,7 +38335,7 @@
"MOVE_PSYCHO_SHIFT",
"MOVE_RAPID_SPIN",
"MOVE_ROLE_PLAY",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_TRICK",
"MOVE_WATER_PULSE",
"MOVE_WISH"
@ -38856,7 +38856,7 @@
"MOVE_NASTY_PLOT",
"MOVE_ROTOTILLER",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWITCHEROO",
"MOVE_TEETER_DANCE",
"MOVE_WORRY_SEED"
@ -38999,7 +38999,7 @@
"MOVE_NASTY_PLOT",
"MOVE_ROTOTILLER",
"MOVE_SEED_BOMB",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SWITCHEROO",
"MOVE_TEETER_DANCE",
"MOVE_WORRY_SEED"
@ -52626,7 +52626,7 @@
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_QUICK_GUARD",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -52770,7 +52770,7 @@
"MOVE_ME_FIRST",
"MOVE_MEDITATE",
"MOVE_QUICK_GUARD",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VACUUM_WAVE",
"MOVE_WAKE_UP_SLAP"
],
@ -53863,7 +53863,7 @@
"MOVE_MAGNITUDE",
"MOVE_MUDDY_WATER",
"MOVE_SLEEP_TALK",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_SNORE",
"MOVE_ZEN_HEADBUTT"
],
@ -62168,7 +62168,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": []
@ -62295,7 +62295,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": []
@ -62426,7 +62426,7 @@
"MOVE_FORESIGHT",
"MOVE_MACH_PUNCH",
"MOVE_REVERSAL",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_WIDE_GUARD"
],
"TutorMoves": []
@ -72468,7 +72468,7 @@
"MOVE_KNOCK_OFF",
"MOVE_LOW_KICK",
"MOVE_ME_FIRST",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VITAL_THROW"
],
"TutorMoves": []
@ -72615,7 +72615,7 @@
"MOVE_KNOCK_OFF",
"MOVE_LOW_KICK",
"MOVE_ME_FIRST",
"MOVE_SMELLING_SALT",
"MOVE_SMELLING_SALTS",
"MOVE_VITAL_THROW"
],
"TutorMoves": []

View File

@ -111,6 +111,8 @@ static const struct Symbol *lookup_address(uint32_t address)
// available by default.
void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen)
{
if (haystacklen < needlelen)
return NULL;
const char *haystack_ = haystack;
const char *needle_ = needle;
for (size_t i = 0; i < haystacklen - needlelen; i++)