pokeemerald-expansion
pokeemerald-expansion is a romhack base based off pret's pokeemerald decompilation project. It is NOT a playable romhack, but it has multiple features available to romhackers so that they can create their own games, so it's not meant to be played on its own.
Should I use this or vanilla pokeemerald for my hack?
The main advantage of using vanilla pokeemerald as a base is being able to link with other official GBA Pokémon games for battles and trading, pokeemerald-expansion can battle and trade with itself out of the box. If you don't mind losing full vanilla compatiblitity, we recommend using pokeemerald-expansion. Otherwise, use pret's pokeemerald. You'll still receive documentation improvements from pret, as we regurlarly incorporate pret's documentation changes.
Using pokeemerald-expansion
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.10.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 to learn how to fork the repository and clone locally from there.
Please follow the instructions in INSTALL.md
to get pokeemerald-expansion set up on your machine.
If I already have a project based on regular pokeemerald, can I use pokeemerald-expansion?
Yes! Keep in mind that we keep up with pret's documentation of pokeemerald, which means that if your project a bit old, you might get merge conflicts that you need to solve manually.
- 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 master
.
With this, you'll get the latest version of pokeemerald-expansion, plus a couple of bugfixes that haven't yet been released into the next patch version :)
Documentation
Please click here to visit our documentation page.
How do I update my version of pokeemerald-expansion?
- If you haven't set up a remote, run the command
git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion
. - Check your current version.
- 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 to determine your version based on the features available on your repository.
- You can check in the debug menu's
- 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 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, usegit pull RHH expansion/1.9.3
).- 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
. - upcoming (unstable, with potential bugs): It contains unreleased features that will come in the next minor version. To merge, use
git pull RHH upcoming
.
- master (stable): It contains unreleased bugfixes that will come in the next patch version. To merge, use
Please consider crediting the entire list of contributors in your project, as they have all worked hard to develop this project :)
Who maintains the project?
The project was originally started by DizzyEgg alongside other contributors. Now it is maintained by a team in the ROM Hacking Hideout's community called the "Expansion Senate". ROM Hacking Hideout (RHH for short) is a Discord-based ROM hacking community specialized in Pokémon romhacks. A lot of the discussion in regards of the development of the project happens there.
Click here to join the RHH Discord Server!
There's a bug in the project. How do I let you guys know?
Please submit any issues with the project here and make sure that the issue wasn't reported by someone else by searching using the filters. You may also join the Discord server to try getting more in-depth support from the team and other members of the server.
Can I contribute even if I'm not a member of ROM Hacking Hideout?
Yes! Contributions are welcome via Pull Requests and they will be reviewed by maintainers in due time. Also, please follow the Pull Request template and feel free to discuss how the reviews are being handled. Communication is key! Don't feel discouraged if we take a bit to review your PR, we'll get to it.
What features are included?
- IMPORTANT❗❗ Read through these to learn what features you can toggle:
- Upgraded battle engine.
- Gen5+ damage calculation.
- 2v2 Wild battles support.
- 1v2/2v1 battles support.
- Fairy Type (configurable).
- Physical/Special/Status Category (configurable).
- New moves and abilities up to Scarlet and Violet.
- Custom Contest data up to SwSh, newer moves are WIP. (source)
- Battle gimmick support:
- Mega Evolution
- Primal Reversion
- Ultra Burst
- Z-Moves
- Gen 8+ damaging moves are given power extrapolated from Gen 7.
- Gen 8+ status moves have no additional effects, like Healing Wish.
- Dynamax and Gigantamax
- Initial battle parameters
- Queueing stat boosts (aka, Totem Boosts)
- Setting Terrains.
- Mid-turn speed recalculation.
- Quick Poké Ball selection in Wild Battles
- Hold
R
to change selection with the D-Pad. - Press
R
to use last selected Poké Ball.
- Hold
- Run option shortcut
- Faster battle intro - Message and animation/cry happens at the same time.
- Faster HP drain.
- Battle Debug menu.
- Accessed by pressing
Select
on the "Fight/Bag/Pokémon/Run" menu.
- Accessed by pressing
- Option to use AI flags in wild Pokémon battles.
- FRLG/Gen4+ whiteout money calculation.
- Configurable experience settings
- Experience on catch.
- Splitting experience.
- Trainer experience.
- Scaled experience.
- Unevolved experience boost.
- Frostbite.
- Doesn't replace freezing unless a config is enabled, so you can mix and match.
- Critical capture.
- Removed badge boosts (configurable).
- Recalculating stats at the end of every battle.
- Level 100 Pokémon can earn EVs.
- Inverse battle support.
- TONS of other features listed here.
- Full Trainer customization
- Nickname, EVs, IVs, moves, ability, ball, friendship, nature, gender, shininess.
- Custom tag battle support (teaming up an NPC in a double battle).
- Sliding trainer messages.
- Upgraded Trainer AI
- Considers newer move effects.
- New flag options to let you customize the intelligence of your trainers.
- Faster calculations.
- Specify Poké Balls by Trainer class.
- Pokémon Species from Generations 1-9.
- Simplified process to add new Pokémon.
- Option to disable unwanted families.
- Updated sprites to DS style.
- Updated stats, types, abilities and egg groups (configurable).
- Updated Hoenn's Regional Dex to match ORAS' (configurable).
- Updated National Dex incorporating the new species.
- Sprite and animation visualizer.
- Accesible by pressing
Select
on a Pokémon's Summary screen.
- Accesible by pressing
- Gen4+ evolution methods, with some changes:
- Mossy Rock, Icy Rock and Magnetic Field locations match ORAS'.
- Leaf, Ice and Thunder Stones may also be used.
- Inkay just needs level 30 to evolve.
- You can't physically have both the RTC and gyroscope, so we skip this requirement.
- Sylveon uses Gen8+'s evolution method (friendship + Fairy Move).
- Option to use hold evolution items directly like stones.
- Mossy Rock, Icy Rock and Magnetic Field locations match ORAS'.
- Hidden Abilities.
- Available via Ability Patch.
- Compatible with Ghoul's DexNav branch.
- All gender differences.
- Custom female icons for female Hippopotas Hippowdon, Pikachu and Wobbufett
- 3 Perfect IVs on Legendaries, Mythicals and Ultra Beasts.
- Customizable form change tables. Full list of methods here.
- Item holding (eg. Giratina/Arceus)
- Item using (eg. Oricorio)
- Time of day option for Shaymin
- Fainting
- Battle begin and end (eg. Xerneas)
- Move change option for Zacian/Zamazenta
- Battle end in terrains (eg. Burmy)
- Switched in battle (eg. Palafin)
- HP Threshold (eg. Darmanitan)
- Weather (eg. Castform)
- End of turn (eg. Morpeko)
- Time of day (eg. Shaymin)
- Fusions (eg. Kyurem)
- Breeding Improvements
- Incense Baby Pokémon now happen automatically (configurable).
- Level 1 eggs (configurable).
- Poké Ball inheriting (configurable).
- Egg Move Transfer, including Mirror Herb (configurable).
- Nature inheriting 100% of the time with Everstone (configurable)
- Gen6+ Ability inheriting (configurable).
- Items from newer Generations. Full list here.
- Gen 6+ Exp. Share (configurable)
- Berserk Gene
- Most battle items from Gen 4+
- Feature branches incorporated (with permission):
- RHH intro credits by @Xhyzi.
- A small signature from all of us to show the collective effort in the project :)
- Overworld debug by @TheXaman
- May be disabled.
- Accesible by pressing
R + Start
in the overworld by default. - Additional features:
- Clear Boxes: cleans every Pokémon from the Boxes.
- Hatch an Egg: lets you choose an Egg in your party and immediately hatch it.
- HGSS Pokédex by @TheXaman
- May be disabled.
- Additional features:
- Support for new evolution methods.
- Dark Mode.
- Nature Colors in summary screen by @DizzyEggg
- Dynamic Multichoice by @SBird1337
- Saveblock Cleansing by @ghoulslash
- Followers & Expanded IDs by @aarant
- May be disabled.
- Includes Pokémon followers like in HGSS, including interactions.
- Expands the amount of possible object event IDs beyond 255.
- Includes an implementation of dynamic overworld palettes (DOWP).
- Additional features:
- Pokémon overworld sprites up to Generation 8.
- Integration with our Pokémon Sprite Visualizer, allowing users to browse through the follower sprites alongside battle sprites.
- RHH intro credits by @Xhyzi.
- Other features
- Pressing B while holding a Pokémon drops them like in modern games (configurable).
- Running indoors (configurable).
- Configurable overworld poison damage.
- Configurable flags for disabling Wild encounters and Trainer battles.
- Configurable flags for forcing or disabling Shinies.
- Reusable TM (configurable).
- B2W2+ Repel system that also supports LGPE's Lures
- Gen6+'s EV cap.
- All bugfixes from pret included.
- Fixed overworld snow effect.
There are some mechanics, moves and abilities that are missing and being developed. Check the project's milestones and our issues page to see which ones.
Instructions
Install instructions for each supported operating system can be found in their respective directories under docs/install/
.
Lines to those can be found under each heading.
This file only contains a short introduction to each supported system.
If you run into trouble, ask for help on Discord (see README.md).
After completing the install instructions for your OS, proceed to Building pokeemerald-expansion.
Windows
Windows needs one of the systems to build the project
A note of caution: As Windows 7 and Windows 8 are officially unsupported by Microsoft, some maintainers are unwilling to maintain the Windows 7/8 instructions. Thus, these instructions may break in the future with fixes taking longer than fixes to the Windows 10/11 instructions.
On Windows, the project can be built using the following systems:
- WSL2, fastest
- WSL1, 7 times slower than WSL2
- Msys2, 20 times slower than WSL2 (NOTE: Currently broken on pret upstream)
- Cygwin, 30 timer slower than WSL2 (NOTE: Currently broken on pret upstream)
NOTE: Only WSL systems are recommended.
Linux
The project can be built on any Linux distribution. Distributions with instructions:
Other distributions have to infer what to do from general instructions.
Mac
Some extra considerations exist to get the testing system working.
ChromeOS
Only tested on x86_64 based systems.
Building pokeemerald-expansion
Follow these steps to build pokeemerald-expansion
.
-
Navigate to the directory you want to keep the project in, be aware of any system specific limitations.
-
Download
pokeemerald-expansion
withgit
git clone https://github.com/rh-hideout/pokeemerald-expansion
-
Navigate to the newly downloaded project.
cd pokeemerald-expansion
-
Build the project.
make
-
If everything worked correctly, something very similar to this should be seen.
arm-none-eabi-ld: warning: ../../pokeemerald.elf has a LOAD segment with RWX permissions Memory region Used Size Region Size %age Used EWRAM: 243354 B 256 KB 92.83% IWRAM: 30492 B 32 KB 93.05% ROM: 26072244 B 32 MB 77.70% cd build/modern && arm-none-eabi-ld -T ../../ld_script_modern.ld --print-memory-usage -o ../../pokeemerald.elf <objs> <libs> | cat tools/gbafix/gbafix pokeemerald.elf -t"POKEMON EMER" -cBPEE -m01 -r0 --silent arm-none-eabi-objcopy -O binary pokeemerald.elf pokeemerald.gba tools/gbafix/gbafix pokeemerald.gba -p --silent
And the build ROM will be in the directory as
pokeemerald.gba
.
Building guidance
Parallel builds
See the GNU docs and this Stack Exchange thread for more information.
To speed up building, first get the value of nproc
by running the following command:
nproc
Builds can then be sped up by running the following command:
make -j<output of nproc>
Replace <output of nproc>
with the number that the nproc
command returned.
nproc
is not available on macOS. The alternative is sysctl -n hw.ncpu
(relevant Stack Overflow thread).
Other toolchains
To build using a toolchain other than devkitARM, override the TOOLCHAIN
environment variable with the path to your toolchain, which must contain the subdirectory bin
.
make TOOLCHAIN="/path/to/toolchain/here"
The following is an example:
make TOOLCHAIN="/usr/local/arm-none-eabi"
To compile the modern
target with this toolchain, the subdirectories lib
, include
, and arm-none-eabi
must also be present.
Building with debug info
To build pokeemerald.elf with debug symbols and debug-compatible optimization under a modern toolchain:
make debug
Useful additional tools
- porymap for viewing and editing maps
- poryscript for scripting (VS Code extension)
- Tilemap Studio for viewing and editing tilemaps
Setting up WSL1 (Legacy Portion)
-
Certain packages are required to build pokeemerald. Install these packages by running the following command:
sudo apt install build-essential git libpng-dev gdebi-core
Note: If the above command does not work, try the above command but replacing
apt
withapt-get
. -
Once the packages have finished installing, download the devkitPro pacman package here. The file to download is
devkitpro-pacman.amd64.deb
. -
WSL has its own file system that's not accessible from Windows, but Windows files are accessible from WSL. To install the devkitPro package, you'll need to change to the current working directory where the package file was saved.
For example, if the package file was saved to C:\Users\<user>\Downloads (the Downloads location for most users), enter this command, where <user> is your Windows username:
cd /mnt/c/Users/<user>/Downloads
Note 1: The Windows C:\ drive is called /mnt/c/ in WSL. Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g.
cd "/mnt/c/users/<user>/Downloads folder"
. Note 3: Windows path names are case-insensitive so adhering to capitalization isn't needed -
Once the directory has been changed to the folder containing the devkitPro pacman package, run the following commands to install devkitARM.
sudo gdebi devkitpro-pacman.amd64.deb sudo dkp-pacman -Sy sudo dkp-pacman -S gba-dev
The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation.
Note:
devkitpro-pacman.amd64.deb
is the expected filename of the devkitPro package downloaded (for the first command). If the downloaded package filename differs, then use that filename instead. -
Run the following command to set devkitPro related environment variables (alternatively, close and re-open WSL):
source /etc/profile.d/devkit-env.sh
Proceed to Choosing where to store pokeemerald (WSL1) of the current INSTALL.md.
Running documentation website locally
Note: For further information beyond this very basic guide, please visit mdBook's official documentation.
Running documentation website locally (Ubuntu WSL1/WSL2)
Previous Requirements:
- Option 1: Install via Rust toolchain
- Install Rust toolchain if you don't have it via the
sudo apt install cargo
command. - Install mdBook via the
cargo install mdbook
command. Once finished, this message will pop up, with {USER} being your Ubuntuwarning: be sure to add `/home/{USER}/.cargo/bin` to your PATH to be able to run the installed binaries
- Add
/home/{USER}/.cargo/bin
to your PATH (with {USER} being the Ubuntu username.)- Run command
nano ~/.profile
to edit the file. - Add the following lines, replacing {USER} with your Linux username.
# set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi # set PATH so it includes user's private bin if it exists if [ -d "$HOME/.local/bin" ] ; then PATH="$HOME/.local/bin:$PATH" fi +# set PATH so it includes cargo bin if it exists +if [ -d "/home/{USER}/.cargo/bin" ] ; then + PATH="/home/{USER}/.cargo/bin:$PATH" +fi
- Run the
source ~/.profile
command to refresh the path in the current session.
- Run command
- Install Rust toolchain if you don't have it via the
- Option 2: Install downloaded binaries directly
- TODO: Add documentation of this process.
Running the website
- Navigate to the
docs
folder on the repository. - Run
mdbook serve
. Once started, you may now open the website on your browser by going tohttp://127.0.0.1:3000
. - Every change done to the
docs
folder will be reflected with an automatic refresh. - To stop the server and go back to the terminal, press
Ctrl + C
.
Modifying the website
- The navigation menu on the left is handled by
docs/SUMMARY.md
. Every file added needs to be added somewhere here in order to become visible, otherwise you'll get a 404 error. - Any Markdown files (.md extension) added to the
docs/
directory will automatically be read by mdBook. - To add Markdown files that are not in the
docs/
directory, you may create an empty.md
file and add the following without the "----":
This will include the{{ ----#include ../INSTALL.md}}`
INSTALL.md
Markdown file from the root directory.
Once you're set up, you can now check your changes before pushing them to your repo! :D
We hope that this will make it easier for users to contribute to the documentation :)
What are AI Flags?
AI flags alter the behavior of AI controlled trainers. These flags affect what moves the AI chooses to use, what Pokémon the AI sends out and when they decide to switch, overarching strategic choices the AI prefers to make, and more.
The AI flags can be found in include/constants/battle_ai.h
. Some flags have their own dedicated functions that affect how the AI scores its options when choosing what to do in battle, and those functions can be found in src/battle_ai_main.c
. Other flags are used in conditional checks to gate certain behaviour behind certain flags, which you can typically find by searching the codebase for the flag name and browsing from there.
What flags should you use?
When adding new AI flags it is recommended to use AI_FLAG_CHECK_BAD_MOVE
, AI_FLAG_CHECK_VIABILITY
, AI_FLAG_TRY_TO_FAINT
to make sure the AI makes good decisions. It is especially important to use AI_FLAG_CHECK_BAD_MOVE
in combination with any added flags otherwise the AI will use moves that can fail.
Other flags should be used with consideration to the circumstances.
How do you use them?
Adding an AI flag to a trainer is straightforward, but the process is different depending on how trainers are being defined.
COMPETITIVE_PARTY_SYNTAX == TRUE
If you are using competitive syntax parties, navigate to the trainer data in src/data/trainers.party
, find the trainer you’d like to change, and add flags like so:
AI: Check Bad Move / Try to Faint / Check Viability. The name of each flag is just the constant, but without AI_FLAG at the beginning. For example, to add AI_FLAG_SEQUENCE_SWITCHING
, any of the following will work:
- AI_FLAG_SEQUENCE_SWITCHING
- SEQUENCE_SWITCHING
- SEQUENCE SWITCHING
- Sequence_Switching
- Sequence Switching
COMPETITIVE_PARTY_SYNTAX != TRUE
/ Not Found
If you are not using competitive syntax parties, instead access the trainer data directly in src/data/trainers.h
, and add flags like so, typed exactly the same as the flag names themselves:
.aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY
What AI Flags does pokeemerald-expansion have?
This section lists all of expansion’s AI Flags and briefly describes the effect they have on the AI’s behaviour. In all cases, please check the corresponding function or surrounding code around their implementation for more details. Some of these functions are vanilla, some share a name with vanilla but have been modified to varying degrees, and some are completely new.
Composite AI Flags
Expansion has two "composite" AI flags, AI_FLAG_BASIC_TRAINER
and AI_FLAG_SMART_TRAINER
. This means that these flags have no unique functionality themselves, and can instead be thought of as groups of other flags that are all enabled when this flag is enabled. The idea behind these flags is that if you don't care to manage the detailed behaviour of a particular trainer, you can use these as a baseline instead, and expansion will keep them updated for you.
AI_FLAG_BASIC_TRAINER
is expansion's version of generic, normal AI behaviour. It includes AI_FLAG_CHECK_BAD_MOVE
(don't use bad moves), AI_FLAG_TRY_TO_FAINT
(faint the player where possible), and AI_FLAG_CHECK_VIABILITY
(choose the most effective move to use in the current context). Trainers with this flag will still be smarter than they are in vanilla as there have been dramatic improvements made to move selection, but not incredibly so. Trainers with this flag should feel like normal trainers. In general we recommend these three flags be used in all cases, unless you specifically want a trainer who makes obvious mistakes in battle.
AI_FLAG_SMART_TRAINER
is expansion's version of a "smart AI". It includes everything in AI_FLAG_BASIC_TRAINER
along with AI_FLAG_SMART_SWITCHING
(make smart decisions about when to switch), AI_FLAG_SMART_MON_CHOICES
(make smart decisions about what mon to send in after a switch / KO), and AI_FLAG_OMNISCIENT
(awareness of what moves, items, and abilities the player's mons have to better inform decisions). Expansion will keep this updated to represent the most objectively intelligent behaviour our flags are capable of producing.
Expansion has LOADS of flags, which will be covered in the rest of this guide. If you don't want to engage with detailed trainer AI tuning though, you can just use these two composite flags, and trust that expansion will keep their contents updated to always represent the most standard and the smartest behaviour we can.
AI_FLAG_CHECK_BAD_MOVE
The AI will avoid using moves that are likely to fail in the current situation. This flag helps prevent the AI from making ineffective choices, such as using moves into immunities, into invulnerable states, or when the moves are otherwise hindered by abilities, terrain, or status conditions.
AI_FLAG_TRY_TO_FAINT
AI will prioritize KOing the player if able rather than using status moves. Will prioritize using a move that can OHKO the player. If the player can KO the AI’s mon and the AI’s mon is slower, prioritize priority moves (this does not prevent the AI from switching out instead).
This flag handles scoring for OHKOs but does not handle 2HKOs at all, AI_FLAG_STRONGEST_MOVE
should be used for 2HKO scoring.
AI_FLAG_CHECK_VIABILITY
This flag is divided into two components to calculate the best available move for the current context:
AI_CompareDamagingMoves
: This function compares damaging moves against each other and picks the best one.AI_CalcMoveEffectScore
: This function checks every move effect (status or damaging move effect) and increases the score accordingly.
This is different to AI_FLAG_CHECK_BAD_MOVE
as it calculates how poor a move is and not whether it will fail or not.
AI_FLAG_FORCE_SETUP_FIRST_TURN
AI will prioritize using setup moves on the first turn at the expense of all else. These include stat buffs, field effects, status moves, etc. AI_FLAG_CHECK_VIABILITY will instead do this when the AI determines it makes sense.
This is just a flat increase without any consideration of whether it makes sense to use the move or not. For better move choice quality for those moves, AI_FLAG_CHECK_VIABILITY
should be used.
AI_FLAG_RISKY
AI will generally behave more recklessly. This AI enables the following behaviour:
- Always assume the highest damage roll when scoring moves
- Blindly Mirror Coat / Counter based on the player mon’s species higher attacking stat
- Moves with Recoil if they miss are not treated differently even if accuracy is lowered
- Prioritize maximizing damage from moves at the cost of accuracy
- Prioritize moves with low change strong effects (Ancient Power etc., check
AI_Risky
function for full list) - Switch offensively mid battle rather than defensively (if using
AI_FLAG_SMART_MON_CHOICES
) - Prioritize Explosion moves
AI_FLAG_PREFER_STRONGEST_MOVE
Adds score bonus to any move the AI has that either OHKOs or 2HKOs the player.
Keep in mind that this is a weaker form of AI_FLAG_TRY_TO_FAINT
at scoring OHKOs as it does not take into account who is attacking first, it does however handle 2HKOs.
AI_FLAG_PREFER_BATON_PASS
AI prefers raising its own stats if it has >= 60% HP, as well as Ingrain, Aqua Ring, and Protect. Prioritizes Baton Bass if the mon is rooted (Ingrain) or has the Aqua Ring effect, and doesn’t if it has been Leech Seeded.
AI_FLAG_DOUBLE_BATTLE
This flag is automatically set in double battles, and controls much of the doubles-specific scoring. I’ll summarize some of its scoring as follows:
- Don’t use Helping Hand if partner is, don’t Perish Trap your partner, don’t change the weather if they are, don’t buff stats if partner will trigger Anger Point for us
- Collaborate with partner to Perish Trap opponent, Magnet Rise to protect partner, Dragon Cheer partner if applicable
- Prioritize using weather move if it benefits partner
- Prioritize triggering partner’s good abilities if possible (Motor Drive, Storm Drain, Beat Up -> Justified, etc.)
- Handle Skill Swap smartly, both with the partner and against the player
AI_FLAG_HP_AWARE
Lets the AI make decisions based on how much remaining HP its mon(s) and the player’s mon(s) have.
With respect to the AI’s mons, in doubles:
- Allows the AI to attack its partner with a move it can absorb if its low on HP (ie. Electric move on partner with Volt Absorb)
- Prioritizes healing its partner if its HP is <= 50% if able
In both singles and doubles:
- Prioritizes not using moves that require the user fainting (Destiny Bond, Explosion etc.) and healing moves while on >= 70% HP.
- Prioritize not using moves that require the user fainting or losing significant HP (Belly Drum etc) while between 30% and 70% HP
- Prioritize not using setup moves (Light Screen etc.) and Bide while on <= 30% HP
With respect to the player’s mons:
- Prioritize not using many status moves (stat buffs, Poison, Pain Split) if the player has between 30% and 70% HP
- Prioritize not using any status moves if the player is has <= 30% HP
AI_FLAG_POWERFUL_STATUS
AI prioritizes setting up field effects (Trick Room, Rain Dance, etc.) and side statuses (Tailwind, Spikes, etc.), even if it could faint the target.
AI_FLAG_NEGATE_UNAWARE
AI does not understand ability suppression (Mold Breaker etc., weather suppression (Air Lock etc.), redirection abilities (Lightningrod etc.) being temporarily removed due to move effects (Sky Drop etc.), or item suppression (Magic Room etc.) and will ignore them. This is a handicap flag.
AI_FLAG_WILL_SUICIDE
AI prioritizes self destruction moves (Explosion, Memento).
AI_FLAG_PREFER_STATUS_MOVES
AI gets a score bonus for status moves. This should be combined with AI_FLAG_CHECK_BAD_MOVE
to prevent using only status moves.
AI_FLAG_STALL
AI prefers simple classically "stalling" behaviour. It will prioritize:
- Mean Look, Fairy Lock, and Wrap for trapping
- Increasing its defense and special defense
- Moves that inflict Poison if it also has a Protect move
- Copying defense and special defense buffs
AI_FLAG_SMART_SWITCHING
Affects when the AI chooses to switch. AI will make smarter decisions about when to switch out mid-battle. Automatically enables AI_FLAG_SMART_MON_CHOICES
, which is required as the vanilla mon selection AI is not smart enough to handle several switch-triggering situations appropriately, leading to bizarre behaviour. Many of these checks have intentional failure rates, so the AI won’t switch out 100% of the time in these cases to keep the player from being able to predict perfectly. Some of these also only apply to singles, and many of them are being simplified for the sake of brevity. This flag lets the AI trigger switches when:
- It can’t hit Wonder Guard and has another mon in the party that can (switch that mon in)
- It’s going to die to Perish Song, can’t KO the player and is affected by Yawn, is being severely affected by a status condition that switching helps (Curse, Toxic, Leech Seed)
- It has a mon that can trap the player’s mon and win the 1v1 (switch that mon in)
- It has a mon in the party that can absorb the player’s next expected attack (switch that mon in)
- It will not switch if the current mon will die to hazards on re-entry and it has no means of clearing them in its party
- All its moves are bad
- It can take advantage of Natural Cure or Regenerator
- Its Encore’d into something bad
- Its primary attacking stats are sufficiently lowered
- Its "odds are bad", which is a generic "try to make smart, player-like decisions generally speaking" check. Switches can be triggered if the player has a good switchin candidate (
AI_FLAG_SMART_MON_CHOICES
), and: - The current mon has a bad type matchup and doesn’t have a super effective move and has at least ½ HP, or ¼ HP and Regenerator, or
- The current mon loses the 1v1 quickly and has at least ½ HP, or ¼ and Regenerator
AI_FLAG_ACE_POKEMON
Marks the last Pokemon in the party as the Ace Pokemon. It will not be used unless it is the last one remaining, or is forced to be switched in (Roar, U-Turn with 1 mon remaining, etc.). If you are challenged by two different trainers at the same time, only the ones with this flag will have Ace Pokémon. For example vs one trainer with AI_FLAG_ACE_POKEMON
and the other without, there will be a total of 1 Ace Pokémon.
AI_FLAG_DOUBLE_ACE_POKEMON
Marks the last two Pokémon in the party as Ace Pokémon, with the same behaviour as AI_FLAG_ACE_POKEMON
. Intented for double battles where you battle one trainer id that represents two trainers, ie Twins, Couples. If you apply this flag to trainers outside of double battles or in cases where two trainers can challenge you at the same time, it has the same behaviour. For example vs two trainers with AI_FLAG_DOUBLE_ACE_POKEMON
there will be a total of 4 Ace Pokémon.
AI_FLAG_OMNISCIENT
AI has full knowledge of player moves, abilities, and hold items, and can use this knowledge when making decisions.
AI_FLAG_SMART_MON_CHOICES
Affects what the AI chooses to send out after a switch. AI will make smarter decisions when choosing which mon to send out mid-battle and after a KO, which are handled separately. Automatically included when AI_FLAG_SMART_SWITCHING
is enabled.
With this flag enabled, the AI will prioritize choosing mons after a KO prioritizing the following criteria:
- Trapper (can trap the player’s mon and win the 1v1)
- Revenge killer (outspeeds an OHKOs / is outsped and OHKOs, is not OHKOd/ outspeeds and 2HKOs, is not OHKOd / is outsped and 2HKOs, is not 2HKOd)
- Has good type matchup and a super effective move
- Has good type matchup and does not have a super effective move
- Has Baton Pass
- If no mons meet any of the above criteria, choose the one that does the most damage
And will choose mons after a mid-battle switch prioritizing the following criteria:
- Trapper (can trap the player’s mon and win the 1v1)
- Has good type matchup and a super effective move
- Has good type matchup and does not have a super effective move
- Is not 3HKO’d by the player
- Has Baton Pass
AI_FLAG_CONSERVATIVE
AI always assumes it will roll the lowest possible result when comparing damage in scoring.
AI_FLAG_SEQUENCE_SWITCHING
AI will always switch out after a KO in exactly party order as defined in the trainer data (ie. slot 1, then 2, then 3, etc.). The AI will never switch out mid-battle unless forced to (Roar etc.). If the AI uses a move that requires a switch where it makes a decision about what to send in (U-Turn etc.), it will always switch out into the lowest available party index.
How to add new AI Flags
The battle engine upgrade has rewritten the AI battle scripts to C functions to easily add new logic. This tutorial explains how to add a new AI logic flag.
1. Define your flag
Open include/constants/battle_ai.h
. We have many unused flags, but you can add a new one after AI_FLAG_SMART_SWITCHING
like so:
#define AI_FLAG_SUPPORT (1 << 16)
2. Make your new function
Open src/battle_ai_main.c
. Search for the array static s16 (*const sBattleAiFuncTable[])(u8, u8, u16, s16)
. We want to add our new function to this table. Since we have defined our flag as (1 << 16)
, find the 16th entry in the table (identifiable by the initializer, [16]
), and replace it with:
[16] = AI_Support, // AI_FLAG_SUPPORT
Define your function above the table as static s16 AI_Support(u8 battlerAtk, u8 battlerDef, u16 move, s16 score);
Make your function do something
at the bottom of the file, add:
static s16 AI_Support(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
{
// Add your logic here!
}
Give your trainer the correct AI flag!
And that's it!
How to add new Battle Script Commands/Macros
To preface this tutorial, the battle engine upgrade has exhausted all battle script command IDs. Historically, we've used the various
command to effectively add new commands. However, this has caused issues of maintainability and readability due to the massive switch needed for it. Thanks to the cleanup made by the team and contributors, we now are able to call an infinite amount of commands by using callnative
. This is preferential to creating a secondary battle script command table like is done in the CFRU.
In general, gBattlescriptCurrInstr
tracks the current battle script position as a ROM address. Fortunately, we don't need to worry about ROM addresses when using the decomps, but it is important to understand because of how the callnative
command is set up.
.macro callnative func:req
.byte 0xff
.4byte \func
.endm
callnative
uses the last battle script command ID in order to pass a native function as an argument. Additional optional arguments are added recursively via a macro, so no need to worry about how they need to align to the amount of instructions to skip.
Now, how might we add a custom callnative
command? Here are the steps. We will use BS_TrySetOctolock
as an example.
1. Create a macro in asm/macros/battle_script.inc
. For example:
.macro trysetoctolock battler:req, failInstr:req
callnative BS_TrySetOctolock
.byte \battler
.4byte \failInstr
.endm
2. Add your new callnative command ID to src/battle_script_commands.c
. For example:
void BS_TrySetOctolock(void)
{
NATIVE_ARGS(u8 battler, const u8 *failInstr);
u32 battler = GetBattlerForBattleScript(cmd->battler);
if (gDisableStructs[battler].octolock)
{
gBattlescriptCurrInstr = cmd->failInstr;
}
else
{
gDisableStructs[battler].octolock = TRUE;
gBattleMons[battler].status2 |= STATUS2_ESCAPE_PREVENTION;
gDisableStructs[battler].battlerPreventingEscape = gBattlerAttacker;
gBattlescriptCurrInstr = cmd->nextInstr;
}
}
Each of the arguments defined in the macro (battler
, failInstr
) need to be called at the start of the command using NATIVE_ARGS
.
The byte count in the macro should correspond to the type that will be used for the command (eg, u8
is byte
, while the pointer are 4byte
).
These arguments can then be accessed as cmd->battler
and cmd->battler
.
gBattlescriptCurrInstr = cmd->nextInstr;
advances to the next instruction.
Full credits and thank you to CancerFairy for writing this guide!
Note: This guide was written for version 1.8.0. Most stuff still applies to 1.7.x versions and earlier, with the following exceptions:
- Battle and Contest move data are separated in
src/data/battle_moves.h
andsrc/data/contest_moves.h
additionalEffects
doesn't exist, instead being handled by a combination ofsecondaryEffectChance
and uniqueEFFECT_xxx
s.- There's no
include/constants/battle_move_effects.h
, so data specific to certain effects is handled in other places. - Move names are handled in
gMoveNames
.
Adding/editing moves
This guide is here to give you a breakdown of how moves work, how to edit existing ones, and how to add your own.
Contents:
Key files and definitions
Before beginning the process, it's important to familiarise yourself with the important files that control moves. There are three categories of files - header(.h) files, which contain static information about a move, .c files which contains functions in C that determine how the move behaves, and script files (.s or .inc) that actually "run" the move - i.e. determine the sequence of events you see on screen when you execute the move.
Header files
src/data/moves_info.h
This is the place where the bulk of move information is stored, including name, base power, typing, PP, contest information etc.
Let's look at an example:
[MOVE_THUNDER_SHOCK] =
{
.name = HANDLE_EXPANDED_MOVE_NAME("ThunderShock", "Thunder Shock"),
.description = COMPOUND_STRING(
"An electrical attack that\n"
"may paralyze the foe."),
.effect = EFFECT_HIT,
.power = 40,
.type = TYPE_ELECTRIC,
.accuracy = 100,
.pp = 30,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.category = DAMAGE_CATEGORY_SPECIAL,
.sheerForceBoost = TRUE,
.additionalEffects = ADDITIONAL_EFFECTS({
.moveEffect = MOVE_EFFECT_PARALYSIS,
.chance = 10,
}),
.contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING,
.contestCategory = CONTEST_CATEGORY_COOL,
.contestComboStarterId = 0,
.contestComboMoves = {COMBO_STARTER_CHARGE},
},
The HANDLE_EXPANDED_MOVE_NAME
allows the usage of a name of extended character length, so long as the B_EXPANDED_MOVE_NAMES
is set to TRUE
, whereas by default it's limited in Gen 3 to 12 characters. Most of the fields here are obvious, but the two important ones for determining what a move actually does are effect
and additionalEffects
.
The effect
represents how the move actually works when called in battle - it can be a two turn move, or a move that only works if the target is holding an item, for example. How each effect works is pretty much unique, but the way a move of a particular effect is executed is defined by a script data/battle_scripts_1.s
, and any variable characteristics such as typing or power are defined in either src/battle_script_commands.c
or src/battle_util.c
, depending on the effect. The vast majority of non-status moves are simply EFFECT_HIT
, in that they deal damage and apply additionalEffects
(if defined).
The additionalEffects
field represents effects that are applied at the setadditionaleffects
stage of the move script (for most moves, see BattleScript_Hit_RetFromAtkAnimation
). These are effects that can be encapsulated by any of the MOVE_EFFECT_X
defined in include/constants/battle.h
and encoded under SetMoveEffect
in src/battle_script_commands.c
. These can vary from applying a status, such as MOVE_EFFECT_PARALYSIS
, or lowering/raising stats etc. The move effect could target the user by setting self = TRUE
, such as Overheat lowering the user's own Sp. Atk. What's more, definining a chance
, such as for Thunder Shock, not only limits the effect to applying only chance
% of the time, but it also turns it into a secondary effect. This difference is important because secondary effects are nullified by Sheer Force (which in turn will boost the move's power) and they are blocked by Shield Dust. These two limitations do not apply to primary effects which do not a chance field defined and by definition will always happen when the move is executed.
src/data/battle_move_effects.h
Effects are listed here along with the battleScript
that governs each one. Said scripts are defined in data/battle_scripts_1.s
. The indices/names of the effects (e.g. EFFECT_FIRST_TURN_ONLY
) are enums defined in include/constants/battle_move_effects.h
.
include/battle_scripts.h
Contains references to scripts data/battle_scripts_1.s
, allowing them to be referenced in C. Any new scripts must be added here.
include/constants/battle_move_effects.h
Simply an enum list of possible effects for moves. Any new effects would be added here, with a definition for them (including defining a script) would then also be added to src/data/battle_move_effects.h
.
include/constants/battle_string_ids.h
All strings that can be printed in battle have an id that is defined here. The actual message itself would then be defined and assigned to this id in src/data/battle_message.c
.
include/constants/battle.h
A whole range of constants defining battle variables, such as statuses, weather, and move effects.
include/constants/moves.h
Where moves are defined (and nothing else).
Note: When adding custom moves, you should add them between the moves from the latest generation and the z moves, then adjust MOVES_COUNT
accordingly. Adding a move after MOVES_COUNT
that is neither a Max Move or a Z Move will result in that move's name not being printed when it is used, instead a generic message will be printed.
C files
src/battle_script_commands.c
This is where a lot of the commands referred to in scripts are defined. For example, the jumpifnotfirstturn
command above is defined by the function Cmd_jumpifnotfirstturn
and you can see how it works in C. It's possible that any move editing or updating you have in mind can be done with existing commands, but if you wanted to add a new function that could be called in a script above, this is where you would define it.
src/battle_util.c
This contains a lot of the "utility" functions used to determine things like a move's dynamic typing or power. It's also where damage calculation takes place, and a lot of that will naturally take a move's effect into account. For example, a move with the effect EFFECT_SOLAR_BEAM
would have its damage halved in sandstorm. If you wanted to add a move with an effect which gave it variable BP or typing, this is the file you would encode that effect.
src/battle_message.c
Contains string defines and functions that print messages during the battle. If you wish to add or edit a move's string, then this is where you would do so.
src/battle_main.c
Contains more fundamental functions that control the flow of the battle. Functions here determine move order, dynamic typing, animations, priority, speed calculations and more.
Script files
data/battle_scripts_1.s
Each move's effect is governed by a script defined here. For a simple example, let's look at the script for Fake Out/First Impression:
BattleScript_EffectFirstTurnOnly::
attackcanceler
jumpifnotfirstturn BattleScript_FailedFromAtkString
goto BattleScript_EffectHit
attackcanceler
is a command that covers all the cases that could cause a move to fail before it's even attempted (e.g. paralysis). And as we can tell from the commands, if it's not the first turn, we go to BattleScript_FailedFromAtkString
which evidently causes us to print the attackstring
("POKEMON used MOVE") then fail ("But it failed!"). Otherwise, we go to the generic "hit" effect which is the same script for moves that just deal damage and nothing else.
This is the most advanced part of the ROM. There are dozens upon dozens of commands and hundreds of scripts so this guide would go on forever if I were to go into more detail. To learn how these scripts work, it's best to look at a few examples of moves you know.
asm/macros/battle_script.inc
The "link" between data/battle_scripts_1.s
and src/battle_script_commands.c
. Each command is represented by a hex byte which represents its index in the gBattleScriptingCommandsTable
array at the top of src/battle_script_commands.c
. However, this file also contains macros which perform combinations of other commands, or just calculations in assembly. In addition to commands, it is also possible to call functions in src/battle_script_commands.c
using the various
(now gradually being deprecated) and the callnative
functionality. The various
macros will point to a case under the Cmd_various
function in src/battle_script_commands.c
, whereas callnative
will let you directly call a function in src/battle_script_commands.c
by name.
data/battle_anim_scripts.s
This is the place where move animations are defined. The array at the top, gBattleAnims_Moves
, is in move index order and determines which animation goes with which move.
Editing a move
Basic information
To edit a move's basic information, you need only edit the relevant fields in src/data/battle_moves.h
. This will let you change a move's:
- name
- description
- power
- accuracy
- type
- category
- target
- pp
- recoil percentage
- flags
- Z-move effect (for status moves) or overwritting its calculated power (for damaging moves)
Changing a move's main effect
To change the main effect of a move to an existing effect, you need only change its effect
field to one of the options in src/data/battle_move_effects.h
. If you wish to keep the effect but simply modify how it works, you can modify how it plays out on screen by editing its entry in data/battle_scripts_1.s
and any relevant functions in src/battle_script_commands.c
. To change how a move's dynamic power, accuracy and are calculated, then you need to modify the following functions:
- For power:
CalcMoveBasePowerAfterModifiers
insrc/battle_util.c
- For accuracy:
AccuracyCalcHelper
insrc/battle_script_commands.c
- For type:
SetTypeBeforeUsingMove
insrc/battle_main.c
Note: A generic function for calculating category does not currently exist - Photon Geyser's script in data/battle_scripts_1.s
uses a special callnative
function BS_SetPhotonGeyserCategory
.
Changing a move's additional effects
If you look at the example here, you can see that Thunder Shock has an additional effects array that contains a single move effect MOVE_EFFECT_PARALYSIS
with a 10% chance of applying. Thanks to this field, you can add and remove primary and secondary effects (so long as they are defined by a MOVE_EFFECT
) to a move without having to change its effect or script. You can also make an effect apply to the attacker rather than the target (for, say, a stat boost) with .self = TRUE
and you can set the probability to whatever you want with the chance
field.
All additional effects with a defined chance (even 100%) are treated as "secondary effects". This means that they are nullified by Sheer Force, blocked by Shield Dust or the Covert Cloak, and have their chance modified by Serene Grace. Additional effects without a chance field (effectively setting it to 0) are treated as "primary effects", which means that they cannot be blocked by the aforementioned items and abilities and their chance to occur cannot be modified; they will always happen.
Each move can have up to 15 additional effects, allowing you to construct monstrosities like this:
[MOVE_POUND] =
{
.name = COMPOUND_STRING("Pound"),
.description = COMPOUND_STRING(
"Pounds the foe with\n"
"forelegs or tail."),
.effect = EFFECT_HIT,
.power = 40,
.type = TYPE_NORMAL,
.accuracy = 100,
.pp = 35,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.category = DAMAGE_CATEGORY_PHYSICAL,
.additionalEffects = ADDITIONAL_EFFECTS({
.moveEffect = MOVE_EFFECT_PARALYSIS,
.chance = 10,
},{
.moveEffect = MOVE_EFFECT_CONFUSION,
.chance = 100,
},{
.moveEffect = MOVE_EFFECT_FLINCH,
.chance = 30,
},{
.moveEffect = MOVE_EFFECT_ALL_STATS_UP,
.chance = 40,
.self = TRUE,
},{
.moveEffect = MOVE_EFFECT_RAPID_SPIN,
},{
.moveEffect = MOVE_EFFECT_DEF_MINUS_2,
.chance = 50,
}),
.makesContact = TRUE,
.ignoresKingsRock = B_UPDATED_MOVE_FLAGS == GEN_4,
.contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING,
.contestCategory = CONTEST_CATEGORY_TOUGH,
.contestComboStarterId = COMBO_STARTER_POUND,
.contestComboMoves = {0}
},
Note: at the moment, additional effects can only be used by damaging moves, not by status moves.
Adding a new move
To add a new move, you need to create an entry in three locations:
- a define in
include/constants/moves.h
- an info entry in
src/data/battle_moves.h
- an animation entry in data/battle_anim_scripts.s
And that's it! You can use an existing animation or effect for your move - or you can add your own, but I'll leave figuring that out to you.
How to add a new trainer class
Content
Quick Summary
(Page contains out of date information, new instructions for Sprites here.) If you've done this before and just need a quick lookup, here's what files you need:
- GFX into graphics/trainers/front_pics
- Palette into graphics/trainers/palettes
- Register sprites to include/graphics.h
- Point game to where graphic files are found: src/data/graphics/trainers
- Add animation to: src/data/trainer_graphics/front_pic_anims.h
- Add the trainer to all three structs in: src/data/trainer_graphics/front_pic_table.h
- Add trainer to include/constants/trainers.h
The Graphics
1. Edit the sprites
We will start with a graphic that we want to use for our new trainer class. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder: graphics/trainers/front_pics
Remember to limit yourself to 16 colors including transparency in the first slot!
Export the pallette and place into the same folder.
2. Register the sprites
Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. First, create constants for the file paths. Edit include/graphics.h:
extern const u32 gTrainerFrontPic_RubySapphireMay[];
+ extern const u32 gTrainerFrontPic_myTrainerClass[];
extern const u32 gTrainerPalette_Hiker[];
...
...
extern const u32 gTrainerPalette_RubySapphireMay[];
+ extern const u32 gTrainerPalette_myTrainerClass[];
extern const u8 gTrainerBackPic_Brendan[];
Now link the graphic files. src/data/graphics/trainers:
const u32 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz");
const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_may_front_pic.4bpp.lz");
const u32 gTrainerPalette_RubySapphireMay[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz");
+ const u32 gTrainerFrontPic_Sheriff[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass_front_pic.4bpp.lz");
+ const u32 gTrainerPalette_Sheriff[] = INCBIN_U32("graphics/trainers/palettes/myTrainerClass.gbapal.lz");
const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan_back_pic.4
3. The Animation
Add the Animation of the trainer here: src/data/trainer_graphics/front_pic_anims.h
The trainers don't really move, but in theory they could, it's just that the animation defined for each trainer just shows one frame:
static const union AnimCmd *const sAnims_RubySapphireMay[] ={
sAnim_GeneralFrame0,
};
+ static const union AnimCmd *const sAnims_MyTrainerClass[] ={
+ sAnim_GeneralFrame0,
+ };
const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[] =
{
[TRAINER_PIC_HIKER] = sAnims_Hiker,
[TRAINER_PIC_AQUA_GRUNT_M] = sAnims_AquaGruntM,
[TRAINER_PIC_POKEMON_BREEDER_F] = sAnims_PokemonBreederF,
...
...
[TRAINER_PIC_RS_BRENDAN] = sAnims_RubySapphireBrendan,
[TRAINER_PIC_RS_MAY] = sAnims_RubySapphireMay,
+ [TRAINER_PIC_MYTRAINERCLASS] = sAnims_MyTrainerClass,
};
4. Connecting the Pictures to the Data
The last few things we have to do is prepare the graphics for usage. In src/data/trainer_graphics/front_pic_table.h you'll find the structs, we need to add the trainer to all of these. You can just copy the last trainer type defined and edit it, but as far as I understand, these are what they do:
- gTrainerFrontPicCoords: Pretty self explanatory. Coordinates like size and offset on the y-axis to position the sprite on screen.
- gTrainerFrontPicTable: Connects the trainer type with the image we defined earlier.
- gTrainerFrontPicPaletteTable: Connects the trainer type with the palette we defined earlier.
So, finally, it needs to look like this:
const struct MonCoords gTrainerFrontPicCoords[] =
{
[TRAINER_PIC_HIKER] = {.size = 8, .y_offset = 1},
[TRAINER_PIC_AQUA_GRUNT_M] = {.size = 8, .y_offset = 1},
...
...
[TRAINER_PIC_RS_BRENDAN] = {.size = 8, .y_offset = 1},
[TRAINER_PIC_RS_MAY] = {.size = 8, .y_offset = 1},
+ [TRAINER_PIC_MYTRAINERCLASS] = {.size = 8, .y_offset = 1},
};
#define TRAINER_SPRITE(trainerPic, sprite, size) [TRAINER_PIC_##trainerPic] = {sprite, size, TRAINER_PIC_##trainerPic}
const struct CompressedSpriteSheet gTrainerFrontPicTable[] =
{
TRAINER_SPRITE(HIKER, gTrainerFrontPic_Hiker, 0x800),
TRAINER_SPRITE(AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, 0x800),
TRAINER_SPRITE(POKEMON_BREEDER_F, gTrainerFrontPic_PokemonBreederF, 0x800),
TRAINER_SPRITE(COOLTRAINER_M, gTrainerFrontPic_CoolTrainerM, 0x800),
...
...
TRAINER_SPRITE(RS_BRENDAN, gTrainerFrontPic_RubySapphireBrendan, 0x800),
TRAINER_SPRITE(RS_MAY, gTrainerFrontPic_RubySapphireMay, 0x800),
+ TRAINER_SPRITE(MYTRAINERCLASS, gTrainerFrontPic_MyTrainerClass, 0x800),
};
#define TRAINER_PAL(trainerPic, pal) [TRAINER_PIC_##trainerPic] = {pal, TRAINER_PIC_##trainerPic}
const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[] =
{
TRAINER_PAL(HIKER, gTrainerPalette_Hiker),
TRAINER_PAL(AQUA_GRUNT_M, gTrainerPalette_AquaGruntM),
TRAINER_PAL(POKEMON_BREEDER_F, gTrainerPalette_PokemonBreederF),
...
...
TRAINER_PAL(RS_BRENDAN, gTrainerPalette_RubySapphireBrendan),
TRAINER_PAL(RS_MAY, gTrainerPalette_RubySapphireMay),
+ TRAINER_PAL(MYTRAINERCLASS, gTrainerPalette_MyTrainerClass),
};
The Data
5. Defining the trainer class
Finally, let's bring it all together by defining our new trainer class in include/constants/trainers.h:
#define TRAINER_PIC_RS_MAY 92
+ #define TRAINER_PIC_MYTRAINERCLASS 93
#define TRAINER_BACK_PIC_BRENDAN 0
#define TRAINER_BACK_PIC_MAY 1
Remember to count the number next to the trainer class up by one!
Usage
You can test your trainer type by going to src/data/trainers and changing a trainer type. For example:
[TRAINER_BRENDAN_PLACEHOLDER] =
{
.partyFlags = 0,
.trainerClass = TRAINER_CLASS_RS_PROTAG,
.encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
- .trainerPic = TRAINER_PIC_RS_BRENDAN,
+ .trainerPic = TRAINER_PIC_MYTRAINERCLASS,
.trainerName = _("BRENDAN"),
.items = {},
.doubleBattle = FALSE,
.aiFlags = 0,
.partySize = ARRAY_COUNT(sParty_BrendanLinkPlaceholder),
.party = {.NoItemDefaultMoves = sParty_BrendanLinkPlaceholder},
},
This is a modified version of the original tutorial about adding new Pokémon species available in Pokeemerald's wiki.
Despite the persistent rumors about an incredibly strong third form of Mew hiding somewhere, it actually wasn't possible to catch it... OR WAS IT? In this tutorial, we will add a new Pokémon species to the game.
IMPORTANT: This tutorial applies to 1.10.x versions.
Changes compared to vanilla
The main things that the Expansion changes are listed here.
- Still Front Pics (
gMonStillFrontPic_YourPokemon
) and by extensionsrc/anim_mon_front_pics.c
have been removed. src/data/pokemon/cry_ids.h
doesn't exist anymore.- You have 6 icon palettes available instead of the base 3.
- Most tables that use
SPECIES_x
as indexes have been moved togSpeciesInfo
.
Content
Useful resources
You can open a sprite debug menu by pressing Select
in a Pokémon's summary screen outside of battle.
The Data - Part 1
Our plan is as simple as it is brilliant: clone Mewtwo... and make it even stronger!
1. Declare a species constant
Our first step towards creating a new digital lifeform is to define its own species constant.
Edit include/constants/species.h:
#define SPECIES_NONE 0
#define SPECIES_BULBASAUR 1
...
#define SPECIES_MIMIKYU_BUSTED_TOTEM 1523
#define SPECIES_MIMIKYU_TOTEM_BUSTED SPECIES_MIMIKYU_BUSTED_TOTEM
+#define SPECIES_MEWTHREE 1524
-#define SPECIES_EGG (SPECIES_MIMIKYU_BUSTED_TOTEM + 1)
+#define SPECIES_EGG (SPECIES_MEWTHREE + 1)
#define NUM_SPECIES SPECIES_EGG
This number is stored in a Pokémon's save structure. These should generally never change, otherwise your saved Pokémon species will change as well.
We add this at the end so that no existing species change Id and so that we don't have to renumber everything after it.
Now, let's see how it looks in-game!
Hmmm, something's not right...
Oh, I know! We need to add the rest of the data! Normally, the vanilla game would crash if we try to look up anything about Mewthree in this state, but the expansion defaults all of its data to SPECIES_NONE
.
Now, let's see what needs to be done.
2. SpeciesInfo
's structure
Now, to better understand Mewthree, we also need to understand Mew. Let's look at its data.
[SPECIES_MEW] =
{
.baseHP = 100,
.baseAttack = 100,
.baseDefense = 100,
.baseSpeed = 100,
.baseSpAttack = 100,
.baseSpDefense = 100,
.types = MON_TYPES(TYPE_PSYCHIC),
.catchRate = 45,
#if P_UPDATED_EXP_YIELDS >= GEN_8
.expYield = 300,
#elif P_UPDATED_EXP_YIELDS >= GEN_5
.expYield = 270,
#else
.expYield = 64,
#endif
.evYield_HP = 3,
.itemCommon = ITEM_LUM_BERRY,
.itemRare = ITEM_LUM_BERRY,
.genderRatio = MON_GENDERLESS,
.eggCycles = 120,
.friendship = 100,
.growthRate = GROWTH_MEDIUM_SLOW,
.eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED),
.abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE, ABILITY_NONE },
.bodyColor = BODY_COLOR_PINK,
.speciesName = _("Mew"),
.cryId = CRY_MEW,
.natDexNum = NATIONAL_DEX_MEW,
.categoryName = _("New Species"),
.height = 4,
.weight = 40,
.description = COMPOUND_STRING(
"A Mew is said to possess the genes of all\n"
"Pokémon. It is capable of making itself\n"
"invisible at will, so it entirely avoids\n"
"notice even if it approaches people."),
.pokemonScale = 457,
.pokemonOffset = -2,
.trainerScale = 256,
.trainerOffset = 0,
.frontPic = gMonFrontPic_Mew,
.frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(64, 48),
.frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 9,
.frontAnimFrames = sAnims_Mew,
.frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONVEX : ANIM_ZIGZAG_SLOW,
.enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 11,
.backPic = gMonBackPic_Mew,
.backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 64),
.backPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 0,
.backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL,
.palette = gMonPalette_Mew,
.shinyPalette = gMonShinyPalette_Mew,
.iconSprite = gMonIcon_Mew,
.iconPalIndex = 0,
SHADOW(0, 13, SHADOW_SIZE_S)
FOOTPRINT(Mew)
OVERWORLD(
sPicTable_Mew,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_NONE,
gOverworldPalette_Mew,
gShinyOverworldPalette_Mew
)
.isMythical = TRUE,
.isFrontierBanned = TRUE,
.perfectIVCount = LEGENDARY_PERFECT_IV_COUNT,
.levelUpLearnset = sMewLevelUpLearnset,
.teachableLearnset = sMewTeachableLearnset,
},
That's a lot of stuff! But don't worry, we'll go through it step by step throughout the tutorial (and it's miles better than having this same data through 20+ files like it used to be).
We'll start by adding the self-explanatory data that's also present in pret's vanilla structure:
3. Define its basic species information
Edit src/data/pokemon/species_info.h:
const struct SpeciesInfo gSpeciesInfo[] =
{
[SPECIES_NONE] = {0},
...
[SPECIES_EGG] =
{
FRONT_PIC(Egg, 24, 24),
.frontPicYOffset = 20,
.backPic = gMonFrontPic_Egg,
.backPicSize = MON_COORDS_SIZE(24, 24),
.backPicYOffset = 20,
.palette = gMonPalette_Egg,
.shinyPalette = gMonPalette_Egg,
ICON(Egg, 1),
},
+ [SPECIES_MEWTHREE] =
+ {
+ .baseHP = 106,
+ .baseAttack = 150,
+ .baseDefense = 70,
+ .baseSpeed = 140,
+ .baseSpAttack = 194,
+ .baseSpDefense = 120,
+ .types = MON_TYPES(TYPE_PSYCHIC),
+ .catchRate = 3,
+ .expYield = 255,
+ .evYield_SpAttack = 3,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 0,
+ .growthRate = GROWTH_SLOW,
+ .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED),
+ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE },
+ .bodyColor = BODY_COLOR_PURPLE,
+ },
};
The .
is the structure reference operator in C to refer to the member object of the structure SpeciesInfo.
baseHP
,baseAttack
,baseDefense
,baseSpeed
,baseSpAttack
andbaseSpDefense
are the base stats. They can't go higher than 255.types
is using the macroMON_TYPES
as a helper function for formatting so that only one type has to be input for species with a single type.- To add a species with 2 types, use the format
MON_TYPES(TYPE_PSYCHIC, TYPE_NORMAL)
.
- To add a species with 2 types, use the format
catchRate
is how likely it is to catch a Pokémon, the lower the value, the harder it is to catch. Legendaries generally have a catch rate of 3, so we put that here.expYield
is the base amount of experience that a Pokémon gives when defeated/caught. In vanilla, this value caps at 255, but we've increased it to a maximum of 65535 accomodate later gen's higher experience yields. (The highest official value is Blissey's with 608, so going beyond this point may cause exponential gains that could break the system 😱)- If you noticed, Mew's had some
#if
s,#elif
s and#endif
around it. This is because its yield has changed over time, and we let you choose which ones you want. This is not relevant to our Mewthree however, so we can just put a single.expYield = 255,
line here.
- If you noticed, Mew's had some
evYield_HP
,evYield_Attack
,evYield_Defense
,evYield_Speed
,evYield_SpAttack
andevYield_SpDefense
are how many EVs does the Pokémon give when they're caught. Each of these fields can have a value of 3 at most. Officially, no Pokémon give out more than 3 EVs total, with them being determined by their evolution stage (eg, Pichu, Pikachu and Raichu give 1, 2 and 3 Speed EVs respectively), and they tend to be associated with its higher stats. Since our Mewthree is a Special Attack monster, we'll be consistent and make it give out 3 Special Attack EVs, but you're always free to assign whatever you feel like :)- Notice that the other
evYield
fields are not there. In C, numbers in a struct default to 0, so if we don't specify them, they'll be 0 all around! Less lines to worry about :D
- Notice that the other
itemCommon
anditemRare
are used to determine what items is the Pokémon holding when encountering it in the wild.- 50% for
itemCommon
and 5% foritemRare
(boosted to 60%/20% when the first mon in the party has Compound Eyes or Super Luck) - If they're both set as the same item, the item has a 100% chance of appearing.
- 50% for
genderRatio
is a fun one.- There are 4 ways of handling this
PERCENT_FEMALE
is what most Pokémon use, where you define how likely it's gonna be female. It supports decimals, so you can putPERCENT_FEMALE(12.5)
to have a 1 in 8 chance of your mon to be female.MON_MALE
guarantees that all mon of this species will be male (eg. Tauros)MON_FEMALE
guarantees that all mon of this species will be female (eg. Miltank)MON_GENDERLESS
makes your species genderless, unable to breed with anything but Ditto to produce eggs. Most Legendaries are this, so we'll be chosing this as Mewthree's gender ratio.
- When working with evolution lines and don't want their genders to change after evolving, be sure that their gender ratios match their stages and evolution methods. Azurill is the only case where there's a mismatch, causing 1/3 of all Azurill to change from Female to Male.
- You might be wondering why some species have multiple defines for their genders, like
SPECIES_MEOWSTIC_(FE)MALE
. This is because those species have different stats and data from each other, so they're defined internally as different forms withMON_MALE
andMON_FEMALE
as gender ratios. If your species evolves depending on its gender and the evolutions have different stats, be sure to apply the correct evolution method!
- There are 4 ways of handling this
eggCycles
determines how fast an egg of this species will hatch. Doesn't matter much for evolved species or those that can't lay eggs, but we add the field here just in case.friendship
determines the amount of friendship of the mon when you catch it. Most Pokémon useSTANDARD_FRIENDSHIP
, but this creature of chaos does not want to be your friend, starting with 0.growthRate
determines the amounts of experience required to reach each level. Go here for more info.- This should be consistent across evolution lines, otherwise levels could change upon evolution.
eggGroups
are used for breed compatibility. Most Legendaries and Mythicals have theEGG_GROUP_NO_EGGS_DISCOVERED
group, and so does our Mewthree. Go here for more info.- This is using the helper macro
MON_EGG_GROUPS
.
- This is using the helper macro
abilities
determines the potential abilites of our species. Notice how I also set the ability toABILITY_INSOMNIA
, so our little monster doesn't even need to sleep anymore. You can find the abilities for example here include/constants/abilities.h.- When both slot 1 and 2 are defined as not being
ABILITY_NONE
, their starting ability will be decided on a coin flip using their personality. They can later be changed using an Ability Capsule.- Certain Pokémon such as Zygarde and Rockruff have different forms to add additional abilities. As such, they cannot be changed using an Ability Capsule (though the Zygarde Cube can change Zygarde's ability by changing them to their corresponding form)
- The 3rd slot is for Hidden Abilities. If defined as
ABILITY_NONE
, it will default to Slot 1 (eg. Metapod doesn't have a Hidden Ability, but Caterpie and Butterfree do). Go here and here for more info.- If the array is defined as
{ABILITY_1, ABILITY_2}
, the Hidden Ability is set asABILITY_NONE
.
- If the array is defined as
- When both slot 1 and 2 are defined as not being
bodyColor
is used in the Pokédex as a search filter.noFlip
is used in to prevent front sprites from being flipped horizontally and cause weird issues, like Clawitzer's big claw changing sides.
That's all the basic fields present in vanilla emerald, so now let's take a look at the new fields added by the expansion.
4. Species Name
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.bodyColor = BODY_COLOR_PURPLE,
+ .speciesName = _("Mewthree"),
},
};
The _()
underscore function doesn't really exist - it's a convention borrowed from GNU gettext to let preproc
know this is text to be converted to the custom encoding used by the Gen 3 Pokemon games.
5. Define its cry
Time for audio! We first need to convert an existing audio file to the format supported by the expansion.
Most formats are supported for conversion, but for simplicity's sake, we're gonna use an mp3 file.
Now, let's copy the file to the sound/direct_sound_samples/cries
folder.
Once that's done, let's run the following command:
ffmpeg -i sound/direct_sound_samples/cries/mewthree.mp3 -c:a pcm_s8 -ac 1 -ar 13379 sound/direct_sound_samples/cries/mewthree.aif
This will convert your audio file to .aif, which is what's read by the compiler.
Let's add the cry to the ROM via sound/direct_sound_data.inc.
.if P_FAMILY_PECHARUNT == TRUE
.align 2
Cry_Pecharunt::
.incbin "sound/direct_sound_samples/cries/pecharunt.bin"
.endif @ P_FAMILY_PECHARUNT
+ .align 2
+Cry_Mewthree::
+ .incbin "sound/direct_sound_samples/cries/mewthree.bin"
Then we add the cry ID to include/constants/cries.h:
enum {
CRY_NONE,
...
#if P_FAMILY_TERAPAGOS
CRY_TERAPAGOS,
#endif //P_FAMILY_TERAPAGOS
#if P_FAMILY_PECHARUNT
CRY_PECHARUNT,
#endif //P_FAMILY_PECHARUNT
+ CRY_MEWTHREE,
CRY_COUNT,
};
And then link it in sound/cry_tables.inc. cry_reverse
in particular is for reversed cries used by moves such as Growl. The order of these two tables should match the order of the cry IDs, otherwise they'll be shifted.
cry Cry_Terapagos
cry Cry_Pecharunt
+ cry Cry_Mewthree
cry_reverse Cry_Terapagos
cry_reverse Cry_Pecharunt
+ cry_reverse Cry_Mewthree
Lastly, we add the cry to our species entry
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.speciesName = _("Mewthree"),
+ .cryId = CRY_MEWTHREE,
},
};
And let's see how it sounds in-game:
Good! Our monster now has a mighty roar!
You can now delete the mp3 from the cries folder now once you made sure that the cry sounds like how you want it to.
6. Define its Pokédex entry
First, we will need to add new index constants for its Pokédex entry. The index constants are divided into the Hoenn Pokédex, which contains all Pokémon native to the Hoenn region, and the National Pokédex containing all known Pokémon, which can be received after entering the hall of fame for the first time.
Edit include/constants/pokedex.h:
// National Pokedex order
enum {
NATIONAL_DEX_NONE,
// Kanto
NATIONAL_DEX_BULBASAUR,
...
NATIONAL_DEX_PECHARUNT,
+ NATIONAL_DEX_MEWTHREE,
};
#define KANTO_DEX_COUNT NATIONAL_DEX_MEW
#define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI
#if P_GEN_9_POKEMON == TRUE
- #define NATIONAL_DEX_COUNT NATIONAL_DEX_PECHARUNT
+ #define NATIONAL_DEX_COUNT NATIONAL_DEX_MEWTHREE
Do keep in mind that if you intend to add your new species to the Hoenn Dex, you'll also want to add a HOENN_DEX
constant for it and give it a HOENN_TO_NATIONAL
member, like this:
// Hoenn Pokedex order
enum {
HOENN_DEX_NONE,
HOENN_DEX_TREECKO,
...
HOENN_DEX_DEOXYS,
+ HOENN_DEX_MEWTHREE,
};
- #define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1)
+ #define HOENN_DEX_COUNT (HOENN_DEX_MEWTHREE + 1)
Edit src/pokemon.c:
const u16 sHoennToNationalOrder[NUM_SPECIES] = // Assigns Hoenn Dex Pokémon (Using National Dex Index)
{
HOENN_TO_NATIONAL(TREECKO),
...
HOENN_TO_NATIONAL(DEOXYS),
+ HOENN_TO_NATIONAL(MEWTHREE),
};
Now we can add the number and entry to our Mewthree:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.cryId = CRY_MEWTHREE,
+ .natDexNum = NATIONAL_DEX_MEWTHREE,
+ .categoryName = _("New Species"),
+ .height = 15,
+ .weight = 330,
+ .description = COMPOUND_STRING(
+ "The rumors became true.\n"
+ "This is Mew's final form.\n"
+ "Its power level is over 9000.\n"
+ "Has science gone too far?"),
+ .pokemonScale = 256,
+ .pokemonOffset = 0,
+ .trainerScale = 290,
+ .trainerOffset = 2,
},
};
The values pokemonScale
, pokemonOffset
, trainerScale
and trainerOffset
are used for the height comparison figure in the Pokédex.
height
and weight
are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters).
In Pokémon Emerald, you can sort the Pokédex by name, height or weight. Apparently, the Pokémon order is hardcoded in the game files and not calculated from their data. Therefore we have to include our new Pokémon species at the right places. While the correct position for the alphabetical order is easy to find, it can become quite tedious for height and weight, so we added comments to the listings in order help out were they should fit.
Edit src/data/pokemon/pokedex_orders.h:
const u16 gPokedexOrder_Alphabetical[] =
{
...
NATIONAL_DEX_MEW,
+ NATIONAL_DEX_MEWTHREE,
NATIONAL_DEX_MEWTWO,
...
};
const u16 gPokedexOrder_Weight[] =
{
...
// 72.8 lbs / 33.0 kg
//NATIONAL_DEX_MEWTWO_MEGA_Y,
NATIONAL_DEX_ESCAVALIER,
NATIONAL_DEX_FRILLISH,
NATIONAL_DEX_DURANT,
NATIONAL_DEX_CINDERACE,
+ NATIONAL_DEX_MEWTHREE,
//NATIONAL_DEX_PERSIAN_ALOLAN,
NATIONAL_DEX_TOEDSCOOL,
// 73.4 lbs / 33.3 kg
NATIONAL_DEX_DUGTRIO,
...
};
const u16 gPokedexOrder_Height[] =
{
...
// 4'11" / 1.5m
...
NATIONAL_DEX_GLIMMORA,
NATIONAL_DEX_WO_CHIEN,
NATIONAL_DEX_IRON_LEAVES,
NATIONAL_DEX_IRON_BOULDER,
+ NATIONAL_DEX_MEWTHREE,
// 5'03" / 1.6m
...
};
The Graphics
We will start by copying the following files for Mew (not Mewtwo) and rename it to mewthree
.
cp -r graphics/pokemon/mew/. graphics/pokemon/mewthree
We aren't copying Mewtwo's folder because he has those pesky Mega Evolutions that will get in the way of what we're doing, so our sample will need to be pure from the source.
1. Edit the sprites
Let's edit the sprites. Start your favourite image editor (I recommend Aseprite or its free alternative, Libresprite) and change anim_front.png
and back.png
to meet your expectations.
Make sure that you are using the indexed mode and you have limited yourself to 15 colors!
Put the RGB values of your colors into normal.pal
between the first and the last color and the RGB values for the shiny version into shiny.pal
.
Edit footprint.png
using two colors in indexed mode, black and white.
Finally, edit icon.png
.
Note: the icon will use one of 6 predefined palettes instead of normal.pal
.
Open an icon sprite and load one of the palettes to find out which palette suits your icon sprite best.
2. Add the sprites to the rom
Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. First, create constants for the file paths. You'll want to add the constants for your species after the constants for the last valid species.
Edit src/data/graphics/pokemon.h:
#if P_FAMILY_PECHARUNT
const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz");
const u32 gMonPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/normal.gbapal.lz");
const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz");
const u32 gMonShinyPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/shiny.gbapal.lz");
const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp");
#if P_FOOTPRINTS
const u8 gMonFootprint_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/footprint.1bpp");
#endif //P_FOOTPRINTS
#if OW_POKEMON_OBJECT_EVENTS
const u32 gObjectEventPic_Pecharunt[] = INCBIN_COMP("graphics/pokemon/pecharunt/overworld.4bpp");
#if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE
const u32 gOverworldPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/overworld_normal.gbapal.lz");
const u32 gShinyOverworldPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/overworld_shiny.gbapal.lz");
#endif //OW_PKMN_OBJECTS_SHARE_PALETTES
#endif //OW_POKEMON_OBJECT_EVENTS
#endif //P_FAMILY_PECHARUNT
const u32 gMonFrontPic_Egg[] = INCBIN_U32("graphics/pokemon/egg/anim_front.4bpp.lz");
const u32 gMonPalette_Egg[] = INCBIN_U32("graphics/pokemon/egg/normal.gbapal.lz");
const u8 gMonIcon_Egg[] = INCBIN_U8("graphics/pokemon/egg/icon.4bpp");
+ const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/anim_front.4bpp.lz");
+ const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz");
+ const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz");
+ const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz");
+ const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp");
+ const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp");
Please note that Pecharunt, the Pokémon that should be above your insertion for the time being, reads a front.png
sprite instead of an anim_front.png
sprite. This is because currently, Pecharunt lacks a 2nd frame. If the front sprite sheet of your species uses 2 frames, you should use anim_front
.
3. Add the animations to the rom
You can define the animation order, in which the sprites will be shown. The first number is the sprite index (so 0 or 1) and the second number is the number of frames the sprite will be visible.
Edit src/data/pokemon_graphics/front_pic_anims.h:
#if P_FAMILY_PECHARUNT
PLACEHOLDER_ANIM_SINGLE_FRAME(Pecharunt);
#endif //P_FAMILY_PECHARUNT
+static const union AnimCmd sAnim_Mewthree_1[] =
+{
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_END,
+};
#if P_FAMILY_PECHARUNT
SINGLE_ANIMATION(Pecharunt);
#endif //P_FAMILY_PECHARUNT
+SINGLE_ANIMATION(Mewthree);
SINGLE_ANIMATION(Egg);
You might be wondering what PLACEHOLDER_ANIM_SINGLE_FRAME
is. Well, since Pecharun only has 1 frame, we use what's called a preprocessor macro to have in a single line what otherwise would've been this in the C file:
static const union AnimCmd sAnim_Pecharunt_1[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
}
Instead, we can use the already established macro that does the same thing, replacing the value in parenthesis with what we want (in this case, Pecharunt
):
#define PLACEHOLDER_ANIM_SINGLE_FRAME(name) \
static const union AnimCmd sAnim_##name##_1[] = \
{ \
ANIMCMD_FRAME(0, 1), \
ANIMCMD_END, \
}
4. Linking graphic information to our Pokémon
Now that we have all the external data ready, we just need to add it to gSpeciesInfo
plus the rest of the animation and graphical data that we want to use:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.pokemonScale = 256,
.pokemonOffset = 0,
.trainerScale = 290,
.trainerOffset = 2,
+ .frontPic = gMonFrontPic_Mewthree,
+ .frontPicSize = MON_COORDS_SIZE(64, 64),
+ .frontPicYOffset = 0,
+ .frontAnimFrames = sAnims_Mewthree,
+ .frontAnimId = ANIM_GROW_VIBRATE,
+ .frontAnimDelay = 15,
+ .enemyMonElevation = 6,
+ .backPic = gMonBackPic_Mewthree,
+ .backPicSize = MON_COORDS_SIZE(64, 64),
+ .backPicYOffset = 0,
+ .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL,
+ .palette = gMonPalette_Mewthree,
+ .shinyPalette = gMonShinyPalette_Mewthree,
.iconSprite = gMonIcon_Mewthree,
.iconPalIndex = 2,
+ FOOTPRINT(Mewthree)
},
};
Let's explain each of these:
frontPic
:- Used to reference the front sprite, so in this case, we call for
gMonFrontPic_Mewthree
.
- Used to reference the front sprite, so in this case, we call for
frontPicSize
:- The two values (
width
andheight
) are used for defining the non-empty size of the front sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64.
- The two values (
frontPicYOffset
:- Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see
enemyMonElevation
.
- Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see
frontAnimFrames
:- We link our animation frame animations that we defined earlier here.
frontAnimId
:- Because you are limited to two frames, there are already predefined front sprite animations, describing translations, rotations, scalings or color changes.
frontAnimDelay
:- Sets a delay in frame count between when the Pokémon appears and when the animation starts.
enemyMonElevation
:- Used to determine the altitude from the ground. Any value above 0 will show a shadow under the Pokémon, to signify that they're floating.
backPic
:- Used to reference the back sprite, so in this case, we call for
gMonBackPic_Mewthree
.
- Used to reference the back sprite, so in this case, we call for
backPicSize
:- The two values (
width
andheight
) are used for defining the non-empty size of the back sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64. - NOTE: Mew has a tarnary switch here in order to change values depending on if a config option is set for displaying th original Gen 3 sprites.
- The two values (
backPicYOffset
:- Used to define what Y position of the back sprite. When working with the animation debug menu, we recommend aligning the back sprite to the white background, as it was designed to properyly align with the real battle layout.
backAnimId
:- Like
frontAnimId
except for the back sprites and them being a single frame. The IDs listed here are used to represent 3 different animations that happen based on the the Pokémon's nature.
- Like
palette
:- Used to reference the non-shiny palette, so in this case, we call for
gMonPalette_Mewthree
.
- Used to reference the non-shiny palette, so in this case, we call for
shinyPalette
:- Used to reference the shiny palette, so in this case, we call for
gMonShinyPalette_Mewthree
.
- Used to reference the shiny palette, so in this case, we call for
iconSprite
:- Used to reference the icon sprite, so in this case, we call for
gMonIcon_Mewthree
.
- Used to reference the icon sprite, so in this case, we call for
iconPalIndex
:- Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in
graphics/pokemon/icon_palettes
.
- Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in
FOOTPRINT
- We made this single field into a macro so that they can be ignored when
P_FOOTPRINTS
is set to false. It's also why we don't have an "," after calling it like the other macros (we add it as part of the macro itself).#if P_FOOTPRINTS #define FOOTPRINT(sprite) .footprint = gMonFootprint_## sprite, #else #define FOOTPRINT(sprite) #endif
- We made this single field into a macro so that they can be ignored when
The Data - Part 2
We're almost there just a bit left!
1. Species Flags
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE },
.bodyColor = BODY_COLOR_PURPLE,
+ .isLegendary = TRUE,
+ .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT,
},
};
Each species flag provides properties to the species:
isLegendary
:- Does nothing.
isMythical
:- Is skipped during Pokédex evaluations.
- Unless it also has the
dexForceRequired
flag.
- Unless it also has the
- Cannot obtain Gigantamax factor via
ToggleGigantamaxFactor
.
- Is skipped during Pokédex evaluations.
isUltraBeast
:- Beast Ball's multiplier is set to x5 for this species.
- All other ball multipliers are set to x0.1.
- Beast Ball's multiplier is set to x5 for this species.
isParadox
(previouslyisParadoxForm
):- Makes it so that Booster Energy cannot be knocked off.
isTotem
:- Does nothing.
isMegaEvolution
:- A Mega indicator is added to the battle box indicating that they're Mega Evolved.
- The species doesn't receive affection benefits.
- Required when adding new Mega Evolutions.
isPrimalReversion
:- A Primal Reversion indicator (Alpha or Omega for Kyogre/Groudon respectively) is added to the battle box indicating that they're Primal Reverted.
- Required when adding new Primal Reversions.
isUltraBurst
:- Required when adding new Ultra Burst forms.
isGigantamax
:- Used to determine if Gigantamax forms should have their GMax moves or not.
- Required when adding new Gigantamax forms.
isAlolanForm
,isGalarianForm
,isHisuianForm
,isPaldeanForm
:- In the future, these will be used to determine breeding offspring from different based on their region.
cannotBeTraded
:- This species cannot be traded away (like Black/White Kyurem).
perfectIVCount
:- Guarantees that the number of IVs specified here will be perfect.
tmIlliterate
:- This species will be unable to learn the universal moves.
isFrontierBanned
:- This species will be unable to enter Battle Frontier facilities. Replaces
gFrontierBannedSpecies
.
- This species will be unable to enter Battle Frontier facilities. Replaces
2. Delimit the moveset
Let's begin with the moves that can be learned by leveling up.
Append to src/data/pokemon/level_up_learnsets/gen_9.h: NOTE: You can ignore the warning at the top of the file if you're just adding moves to Pokemon.
#if P_FAMILY_PECHARUNT
static const struct LevelUpMove sPecharuntLevelUpLearnset[] = {
LEVEL_UP_MOVE( 1, MOVE_SMOG),
LEVEL_UP_MOVE( 1, MOVE_POISON_GAS),
LEVEL_UP_MOVE( 1, MOVE_MEMENTO),
LEVEL_UP_MOVE( 1, MOVE_ASTONISH),
LEVEL_UP_MOVE( 8, MOVE_WITHDRAW),
LEVEL_UP_MOVE(16, MOVE_DESTINY_BOND),
LEVEL_UP_MOVE(24, MOVE_FAKE_TEARS),
LEVEL_UP_MOVE(32, MOVE_PARTING_SHOT),
LEVEL_UP_MOVE(40, MOVE_SHADOW_BALL),
LEVEL_UP_MOVE(48, MOVE_MALIGNANT_CHAIN),
LEVEL_UP_MOVE(56, MOVE_TOXIC),
LEVEL_UP_MOVE(64, MOVE_NASTY_PLOT),
LEVEL_UP_MOVE(72, MOVE_RECOVER),
LEVEL_UP_END
};
#endif
+static const struct LevelUpMove sMewthreeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE( 1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE( 1, MOVE_DISABLE),
+ LEVEL_UP_MOVE(11, MOVE_BARRIER),
+ LEVEL_UP_MOVE(22, MOVE_SWIFT),
+ LEVEL_UP_MOVE(33, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(44, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(55, MOVE_MIST),
+ LEVEL_UP_MOVE(66, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(77, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(88, MOVE_RECOVER),
+ LEVEL_UP_MOVE(99, MOVE_SAFEGUARD),
+ LEVEL_UP_END
+};
NOTE: If P_LVL_UP_LEARNSETS
is not set to something equal to GEN_9
, the file to be edited will change to what's specified.
Again, we need to register the learnset in gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.palette = gMonPalette_Mewthree,
.shinyPalette = gMonShinyPalette_Mewthree,
.iconSprite = gMonIcon_Mewthree,
.iconPalIndex = 2,
+ .levelUpLearnset = sMewthreeLevelUpLearnset,
},
};
Next we need to specify which moves can be taught via TM, HM, or Move Tutor.
Append to src/data/pokemon/teachable_learnsets.h:
#if P_FAMILY_PECHARUNT
static const u16 sPecharuntTeachableLearnset[] = {
...
MOVE_UNAVAILABLE,
};
#endif //P_FAMILY_PECHARUNT
+static const u16 sMewthreeTeachableLearnset[] = {
+ MOVE_FOCUS_PUNCH,
+ MOVE_WATER_PULSE,
+ MOVE_CALM_MIND,
+ MOVE_TOXIC,
+ MOVE_HAIL,
+ MOVE_BULK_UP,
+ MOVE_HIDDEN_POWER,
+ MOVE_SUNNY_DAY,
+ MOVE_TAUNT,
+ MOVE_ICE_BEAM,
+ MOVE_BLIZZARD,
+ MOVE_HYPER_BEAM,
+ MOVE_LIGHT_SCREEN,
+ MOVE_PROTECT,
+ MOVE_RAIN_DANCE,
+ MOVE_SAFEGUARD,
+ MOVE_FRUSTRATION,
+ MOVE_SOLAR_BEAM,
+ MOVE_IRON_TAIL,
+ MOVE_THUNDERBOLT,
+ MOVE_THUNDER,
+ MOVE_EARTHQUAKE,
+ MOVE_RETURN,
+ MOVE_PSYCHIC,
+ MOVE_SHADOW_BALL,
+ MOVE_BRICK_BREAK,
+ MOVE_DOUBLE_TEAM,
+ MOVE_REFLECT,
+ MOVE_SHOCK_WAVE,
+ MOVE_FLAMETHROWER,
+ MOVE_SANDSTORM,
+ MOVE_FIRE_BLAST,
+ MOVE_ROCK_TOMB,
+ MOVE_AERIAL_ACE,
+ MOVE_TORMENT,
+ MOVE_FACADE,
+ MOVE_SECRET_POWER,
+ MOVE_REST,
+ MOVE_SKILL_SWAP,
+ MOVE_SNATCH,
+ MOVE_STRENGTH,
+ MOVE_FLASH,
+ MOVE_ROCK_SMASH,
+ MOVE_MEGA_PUNCH,
+ MOVE_MEGA_KICK,
+ MOVE_BODY_SLAM,
+ MOVE_DOUBLE_EDGE,
+ MOVE_COUNTER,
+ MOVE_SEISMIC_TOSS,
+ MOVE_MIMIC,
+ MOVE_METRONOME,
+ MOVE_DREAM_EATER,
+ MOVE_THUNDER_WAVE,
+ MOVE_SUBSTITUTE,
+ MOVE_DYNAMIC_PUNCH,
+ MOVE_PSYCH_UP,
+ MOVE_SNORE,
+ MOVE_ICY_WIND,
+ MOVE_ENDURE,
+ MOVE_MUD_SLAP,
+ MOVE_ICE_PUNCH,
+ MOVE_SWAGGER,
+ MOVE_SLEEP_TALK,
+ MOVE_SWIFT,
+ MOVE_THUNDER_PUNCH,
+ MOVE_FIRE_PUNCH,
+ MOVE_UNAVAILABLE, // This is required to determine where the array ends.
+};
#endif
NOTE: At the top of this file, you will probably see this warning:
//
// DO NOT MODIFY THIS FILE! It is auto-generated from tools/learnset_helpers/teachable.py`
//
The expansion includes a tool called the learnset helper, which aims to automate the generation of valid teachable moves. At the time of writing, this tool only supports generating TM and Tutor learnsets. However, in the future it may be expanded to deal with level up learnsets and egg moves.
Ignore the warning shown above the first time you're adding your teachable moves (as otherwise the compiler will complain about the array not existing), but in the future (if you're using the learnset helper) simply edit what teachable moves your Pokémon can learn in one of the JSON files found in tools/learnset_helpers/porymoves_files
. It doesn't really matter which one you add your new Pokémon to, as the tool pulls from all of the files in this folder.
The learnset helper is useful if you plan on changing and/or increasing the available TMs and Tutor moves in your game. As an example, Bulbasaur learns Rage by TM in Red/Blue/Yellow, but in Emerald this TM does not exist. But since tools/learnset_helpers/porymoves_files/rby.json
defines "MOVE_RAGE" as a TM move for Bulbasaur, that move would automatically be added to the sBulbasaurTeachableLearnset
array if you were to add a Rage TM at any point.
The learnset helper can be toggled on/off in include/config/pokemon.h
:
// Learnset helper toggles
#define P_LEARNSET_HELPER_TEACHABLE TRUE // If TRUE, teachable_learnsets.h will be populated by tools/learnset_helpers/teachable.py using the included JSON files based on available TMs and tutors.
Once more, we need to register the learnset in gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
FOOTPRINT(Mewthree)
.levelUpLearnset = sMewthreeLevelUpLearnset,
+ .teachableLearnset = sMewthreeTeachableLearnset,
},
};
If you want to create a Pokémon which can breed, you will need to edit src/data/pokemon/egg_moves.h.
3. Define the Evolutions
We want Mewthree to evolve from Mewtwo by reaching level 100.
Edit gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTWO] =
{
...
FOOTPRINT(Mewtwo)
.isLegendary = TRUE,
.levelUpLearnset = sMewtwoLevelUpLearnset,
.teachableLearnset = sMewtwoTeachableLearnset,
.formSpeciesIdTable = sMewtwoFormSpeciesIdTable,
.formChangeTable = sMewtwoFormChangeTable,
+ .evolutions = EVOLUTION({EVO_LEVEL, 100, SPECIES_MEWTHREE}),
},
};
4. Make it appear!
Now Mewthree really does slumber in the games code - but we won't know until we make him appear somewhere! The legend tells that Mewthree is hiding somewhere in Petalburg Woods...
Edit src/data/wild_encounters.json:
{
"map": "MAP_PETALBURG_WOODS",
"base_label": "gPetalburgWoods",
"land_mons": {
"encounter_rate": 20,
"mons": [
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_POOCHYENA"
},
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_WURMPLE"
},
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_SHROOMISH"
},
{
- "min_level": 6,
- "max_level": 6,
- "species": "SPECIES_POOCHYENA"
+ "min_level": 5,
+ "max_level": 5,
+ "species": "SPECIES_MEWTHREE"
},
...
}
Congratulations, you have created your own personal pocket monster! You may call yourself a mad scientist now.
Optional data
Now that you now have all the essential pieces to create a base species, there are some aspects that you might want to know if you want to do other stuff with your custom Pokémon.
1. Form tables
Found in src/data/pokemon/form_species_tables.h
.
These are introduced to have a reference of what forms correspond to what Species of Pokémon. For example, we have Pikachu's table:
#if P_FAMILY_PIKACHU
static const u16 sPikachuFormSpeciesIdTable[] = {
SPECIES_PIKACHU,
SPECIES_PIKACHU_COSPLAY,
SPECIES_PIKACHU_ROCK_STAR,
SPECIES_PIKACHU_BELLE,
SPECIES_PIKACHU_POP_STAR,
SPECIES_PIKACHU_PH_D,
SPECIES_PIKACHU_LIBRE,
SPECIES_PIKACHU_ORIGINAL_CAP,
SPECIES_PIKACHU_HOENN_CAP,
SPECIES_PIKACHU_SINNOH_CAP,
SPECIES_PIKACHU_UNOVA_CAP,
SPECIES_PIKACHU_KALOS_CAP,
SPECIES_PIKACHU_ALOLA_CAP,
SPECIES_PIKACHU_PARTNER_CAP,
SPECIES_PIKACHU_WORLD_CAP,
FORM_SPECIES_END,
};
#endif //P_FAMILY_PIKACHU
We register the table each form entry in gSpeciesInfo
.
[SPECIES_PIKACHU] =
{
...
.teachableLearnset = sPikachuTeachableLearnset,
+ .formSpeciesIdTable = sPikachuFormSpeciesIdTable,
.evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU},
{EVO_NONE, 0, SPECIES_RAICHU_ALOLAN}),
},
[SPECIES_PIKACHU_COSPLAY] =
{
...
.teachableLearnset = sPikachuTeachableLearnset,
+ .formSpeciesIdTable = sPikachuFormSpeciesIdTable,
},
...and so on.
What this allows us to do is to be able to get all forms of a Pokémon in our code by using the GetSpeciesFormTable
function.
For example, in the HGSS dex, it lets us browse between the entries of every form available.:
In addition, we have the GET_BASE_SPECIES_ID
macro, which returns the first entry of the table (or return the species itself if it doesn't have a table registered). With this, you can check if a Pokémon is any form of a species. For example, making it so that the Light Ball affects all Pikachu forms:
case HOLD_EFFECT_LIGHT_BALL:
if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PIKACHU && IS_MOVE_SPECIAL(move))
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0));
break;
2. Form change tables
Found in src/data/pokemon/form_species_tables.h
.
These tables, unlike the regular form tables, registers how Pokémon can switch between forms.
#if P_FAMILY_GASTLY
static const struct FormChange sGengarFormChangeTable[] = {
{FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE},
{FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GIGANTAMAX},
{FORM_CHANGE_TERMINATOR},
};
#endif //P_FAMILY_GASTLY
The first value is the type of form change. In the case of Gengar, we have both Mega Evolution and Gigantamax form changes.
The second value is the target form, to which the Pokémon will change into.
Values after that are referred as arguments, and needs to be put there depends on the type of form change, detailed in include/constants/form_change_types.h
.
3. Gender differences
You may have seen that there's a couple of duplicate fields with a "Female" suffix.
[SPECIES_FRILLISH] =
{
...
.frontPic = gMonFrontPic_Frillish,
+ .frontPicFemale = gMonFrontPic_FrillishF,
.frontPicSize = MON_COORDS_SIZE(56, 56),
+ .frontPicSizeFemale = MON_COORDS_SIZE(56, 56),
.frontPicYOffset = 5,
.frontAnimFrames = sAnims_Frillish,
.frontAnimId = ANIM_RISING_WOBBLE,
.backPic = gMonBackPic_Frillish,
+ .backPicFemale = gMonBackPic_FrillishF,
.backPicSize = MON_COORDS_SIZE(40, 56),
+ .backPicSizeFemale = MON_COORDS_SIZE(40, 56),
.backPicYOffset = 7,
.backAnimId = BACK_ANIM_CONVEX_DOUBLE_ARC,
.palette = gMonPalette_Frillish,
+ .paletteFemale = gMonPalette_FrillishF,
.shinyPalette = gMonShinyPalette_Frillish,
+ .shinyPaletteFemale = gMonShinyPalette_FrillishF,
.iconSprite = gMonIcon_Frillish,
+ .iconSpriteFemale = gMonIcon_FrillishF,
.iconPalIndex = 0,
+ .iconPalIndexFemale = 1,
FOOTPRINT(Frillish)
.levelUpLearnset = sFrillishLevelUpLearnset,
.teachableLearnset = sFrillishTeachableLearnset,
.evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_JELLICENT}),
},
These are used to change the graphics of the Pokémon if they're female. If they're not registered, they default to the male values.
However, iconPalIndexFemale
is a special case, where it's doesn't read the male icon palette if its iconSpriteFemale
is set, so if you're setting a female icon, be sure to set their palette index as well.
4. Overworld Data
If you have OW_POKEMON_OBJECT_EVENTS
in your hack, you can add Overworld of your new species by following these steps:
First, since you copied the contents from Mew's folder previously, you should also have copied its overworld sprites. Edit those to your liking, as we have done before, making sure to update the palettes
Secondly, in src/data/graphics/pokemon.h, add the following:
const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp");
const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp");
+ const u32 gObjectEventPic_Mewthree[] = INCBIN_COMP("graphics/pokemon/mewthree/overworld.4bpp");
+ const u32 gOverworldPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/overworld_normal.gbapal.lz");
+ const u32 gShinyOverworldPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/overworld_shiny.gbapal.lz");
Thirdly, in spritesheet_rules.mk
$(POKEMONGFXDIR)/mewtwo/overworld.4bpp: %.4bpp: %.png
$(GFX) $< $@ -mwidth 4 -mheight 4
+$(POKEMONGFXDIR)/mewthree/overworld.4bpp: %.4bpp: %.png
+ $(GFX) $< $@ -mwidth 4 -mheight 4
$(POKEMONGFXDIR)/mew/overworld.4bpp: %.4bpp: %.png
$(GFX) $< $@ -mwidth 4 -mheight 4
Fourthly, in src/data/object_events/object_event_pic_tables_followers.h:
#if P_FAMILY_PECHARUNT
/*static const struct SpriteFrameImage sPicTable_Pecharunt[] = {
overworld_ascending_frames(gObjectEventPic_Pecharunt, 4, 4),
};*/
#endif //P_FAMILY_PECHARUNT
+static const struct SpriteFrameImage sPicTable_Mewthree[] = {
+ overworld_ascending_frames(gObjectEventPic_Mewthree, 4, 4),
+};
And finally, in gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
FOOTPRINT(Mewthree)
+ OVERWORLD(
+ sPicTable_Mewthree,
+ SIZE_32x32,
+ SHADOW_SIZE_M,
+ TRACKS_FOOT,
+ gOverworldPalette_Mewthree,
+ gShinyOverworldPalette_Mewthree
+ )
.levelUpLearnset = sMewthreeLevelUpLearnset,
.teachableLearnset = sMewthreeTeachableLearnset,
},
};
Sprite Size
Depending on your species, you might want to use different sizes for it. For example, certain species known for being big like Steelix use sprites that fit a 64x64 frame instead of 32x32, and as such have SIZE_64x64
in their data instead of SIZE_32x32
to accomodate for them.
Also, in spritesheet_rules.mk
, -mwidth
and -mheight
need to be set to 8 instead of 4 for such cases.
Shadows
Gen 4 style shadows are defined by the SHADOW
macro which takes the following arguments:
- X offset
- Y offset
- Shadow size You have 4 options for their shadow, between Small, Medium, Large and Extra Large:
SHADOW_SIZE_S
SHADOW_SIZE_M
SHADOW_SIZE_L
SHADOW_SIZE_XL_BATTLE_ONLY
To make the Pokémon have no shadow, use theNO_SHADOW
macro instead ofSHADOW
.
Tracks
You have 4 options for the tracks that your species will leave behind on sand.
TRACKS_NONE
TRACKS_FOOT
TRACKS_SLITHER
TRACKS_SPOT
TRACKS_BUG
...though technically you can also use TRACKS_BIKE_TIRE
if you wish to.
This is a modified version of the original tutorial about adding new Pokémon species available in Pokeemerald's wiki.
Despite the persistent rumors about an incredibly strong third form of Mew hiding somewhere, it actually wasn't possible to catch it... OR WAS IT? In this tutorial, we will add a new Pokémon species to the game.
IMPORTANT: This tutorial applies to 1.9.x versions.
Changes compared to vanilla
The main things that the Expansion changes are listed here.
- Still Front Pics (
gMonStillFrontPic_YourPokemon
) and by extensionsrc/anim_mon_front_pics.c
have been removed. src/data/pokemon/cry_ids.h
doesn't exist anymore.- You have 6 icon palettes available instead of the base 3.
- Most tables that use
SPECIES_x
as indexes have been moved togSpeciesInfo
.
Content
Useful resources
You can open a sprite debug menu by pressing Select
in a Pokémon's summary screen outside of battle.
The Data - Part 1
Our plan is as simple as it is brilliant: clone Mewtwo... and make it even stronger!
1. Declare a species constant
Our first step towards creating a new digital lifeform is to define its own species constant.
Edit include/constants/species.h:
#define SPECIES_NONE 0
#define SPECIES_BULBASAUR 1
...
#define SPECIES_EEVEE_PARTNER PLACEHOLDER_START + 54
+#define SPECIES_MEWTHREE PLACEHOLDER_START + 55
-#define GIGANTAMAX_START SPECIES_EEVEE_PARTNER
+#define GIGANTAMAX_START SPECIES_MEWTHREE
// Gigantamax Forms
#define SPECIES_VENUSAUR_GIGANTAMAX GIGANTAMAX_START + 1
This number is stored in a Pokémon's save structure. These should generally never change, otherwise your saved Pokémon species will change as well.
We add this before Gigantamax forms because they're temporary forms that shouldn't normally be saved into a Pokémon's save structure.
Now, let's see how it looks in-game!
Hmmm, something's not right...
Oh, I know! We need to add the rest of the data! Normally, the vanilla game would crash if we try to look up anything about Mewthree in this state, but the expansion defaults all of its data to SPECIES_NONE
.
Now, let's see what needs to be done.
2. SpeciesInfo
's structure
Now, to better understand Mewtwo, we also need to understand Mew. Let's look at its data.
[SPECIES_MEW] =
{
.baseHP = 100,
.baseAttack = 100,
.baseDefense = 100,
.baseSpeed = 100,
.baseSpAttack = 100,
.baseSpDefense = 100,
.types = { TYPE_PSYCHIC, TYPE_PSYCHIC },
.catchRate = 45,
#if P_UPDATED_EXP_YIELDS >= GEN_8
.expYield = 300,
#elif P_UPDATED_EXP_YIELDS >= GEN_5
.expYield = 270,
#else
.expYield = 64,
#endif
.evYield_HP = 3,
.itemCommon = ITEM_LUM_BERRY,
.itemRare = ITEM_LUM_BERRY,
.genderRatio = MON_GENDERLESS,
.eggCycles = 120,
.friendship = 100,
.growthRate = GROWTH_MEDIUM_SLOW,
.eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED },
.abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE },
.bodyColor = BODY_COLOR_PINK,
.isMythical = TRUE,
.speciesName = _("Mew"),
.cryId = CRY_MEW,
.natDexNum = NATIONAL_DEX_MEW,
.categoryName = _("New Species"),
.height = 4,
.weight = 40,
.description = COMPOUND_STRING(
"A Mew is said to possess the genes of all\n"
"Pokémon. It is capable of making itself\n"
"invisible at will, so it entirely avoids\n"
"notice even if it approaches people."),
.pokemonScale = 457,
.pokemonOffset = -2,
.trainerScale = 256,
.trainerOffset = 0,
.frontPic = gMonFrontPic_Mew,
.frontPicSize = MON_COORDS_SIZE(64, 48),
.frontPicYOffset = 9,
.frontAnimFrames = sAnims_Mew,
.frontAnimId = ANIM_ZIGZAG_SLOW,
.enemyMonElevation = 11,
.backPic = gMonBackPic_Mew,
.backPicSize = MON_COORDS_SIZE(64, 64),
.backPicYOffset = 0,
.backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL,
.palette = gMonPalette_Mew,
.shinyPalette = gMonShinyPalette_Mew,
.iconSprite = gMonIcon_Mew,
.iconPalIndex = 0,
FOOTPRINT(Mew)
.levelUpLearnset = sMewLevelUpLearnset,
.teachableLearnset = sMewTeachableLearnset,
},
That's a lot of stuff! But don't worry, we'll go through it step by step throught the tutorial (and miles better than having this same data through 20+ files like it used to be).
We'll start by adding the self-explanatory data that's also present in pret's vanilla structure:
3. Define its basic species information
Edit src/data/pokemon/species_info.h:
const struct SpeciesInfo gSpeciesInfo[] =
{
[SPECIES_NONE] = {0},
...
[SPECIES_EGG] =
{
FRONT_PIC(Egg, 24, 24),
.frontPicYOffset = 20,
.backPic = gMonFrontPic_Egg,
.backPicSize = MON_COORDS_SIZE(24, 24),
.backPicYOffset = 20,
.palette = gMonPalette_Egg,
.shinyPalette = gMonPalette_Egg,
ICON(Egg, 1),
},
+ [SPECIES_MEWTHREE] =
+ {
+ .baseHP = 106,
+ .baseAttack = 150,
+ .baseDefense = 70,
+ .baseSpeed = 140,
+ .baseSpAttack = 194,
+ .baseSpDefense = 120,
+ .types = { TYPE_PSYCHIC, TYPE_PSYCHIC },
+ .catchRate = 3,
+ .expYield = 255,
+ .evYield_SpAttack = 3,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 0,
+ .growthRate = GROWTH_SLOW,
+ .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED },
+ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE },
+ .bodyColor = BODY_COLOR_PURPLE,
+ },
};
The .
is the structure reference operator in C to refer to the member object of the structure SpeciesInfo.
baseHP
,baseAttack
,baseDefense
,baseSpeed
,baseSpAttack
andbaseSpDefense
are the base stats. They can't go higher than 255.- You may be confused as to why
types
hasTYPE_PSYCHIC
twice. This is because the way the game determines single-type mon is to define both types the same.- If we don't, it defaults to Normal due to it being the first type defined.
catchRate
is how likely it is to catch a Pokémon, the lower the value, the harder it is to catch. Legendaries generally have a catch rate of 3, so we put that here.expYield
is the base amount of experience that a Pokémon gives when defeated/caught. In vanilla, this value caps at 255, but we've increased it to a maximum of 65535 accomodate later gen's higher experience yields. (The highest official value is Blissey's with 608, so going beyond this point may cause exponential gains that could break the system 😱)- If you noticed, Mew's had some
#if
s,#elif
s and#endif
around it. This is because its yield has changed over time, and we let you choose which ones you want. This is not relevant to our Mewthree however, so we can just put a single.expYield = 255,
line here.
- If you noticed, Mew's had some
evYield_HP
,evYield_Attack
,evYield_Defense
,evYield_Speed
,evYield_SpAttack
andevYield_SpDefense
are how many EVs does the Pokémon give when they're caught. Each of these fields can have a value of 3 at most. Officially, no Pokémon give out more than 3 EVs total, with them being determined by their evolution stage (eg, Pichu, Pikachu and Raichu give 1, 2 and 3 Speed EVs respectively), and they tend to be associated with its higher stats. Since our Mewthree is a Special Attack monster, we'll be consistent and make it give out 3 Special Attack EVs, but you're always free to assign whatever you feel like :)- Notice that the other
evYield
fields are not there. In C, numbers in a struct default to 0, so if we don't specify them, they'll be 0 all around! Less lines to worry about :D
- Notice that the other
itemCommon
anditemRare
are used to determine what items is the Pokémon holding when encountering it in the wild.- 50% for
itemCommon
and 5% foritemRare
(boosted to 60%/20% when the first mon in the party has Compound Grass or Super Luck) - If they're both set as the same item, the item has a 100% chance of appearing.
- 50% for
genderRatio
is a fun one.- There are 4 ways of handling this
PERCENT_FEMALE
is what most Pokémon use, where you define how likely it's gonna be female. It supports decimals, so you can putPERCENT_FEMALE(12.5)
to have a 1 in 8 chance of your mon to be female.MON_MALE
guarantees that all mon of this species will be male (eg. Tauros)MON_FEMALE
guarantees that all mon of this species will be female (eg. Miltank)MON_GENDERLESS
makes your species genderless, unable to breed with anything but Ditto to produce eggs. Most Legendaries are this, so we'll be chosing this as Mewthree's gender ratio.
- When working with evolution lines and don't want their genders to change after evolving, be sure that their gender ratios match their stages and evolution methods. Azurill is the only case where there's a mismatch, causing 1/3 of all Azurill to change from Female to Male.
- You might be wondering why some species have multiple defines for their genders, like
SPECIES_MEOWSTIC_(FE)MALE
. This is because those species have different stats and data from each other, so they're defined internally as different forms withMON_MALE
andMON_FEMALE
as gender ratios. If your species evolves depending on its gender and the evolutions have different stats, be sure to apply the correct evolution method!
- There are 4 ways of handling this
eggCycles
determines how fast an egg of this species will hatch. Doesn't matter much for evolved species or those that can't lay eggs, but we add the field here just in case.friendship
determines the amount of friendship of the mon when you catch it. Most Pokémon useSTANDARD_FRIENDSHIP
, but this creature of chaos does not want to be your friend, starting with 0.growthRate
determines the amounts of experience required to reach each level. Go here for more info.eggGroups
are used for breed compatibility. Most Legendaries and Mythicals have theEGG_GROUP_NO_EGGS_DISCOVERED
group, and so does our Mewthree. Go here for more info.abilities
determines the potential abilites of our species. Notice how I also set the ability toABILITY_INSOMNIA
, so our little monster doesn't even need to sleep anymore. You can find the abilities for example here include/constants/abilities.h.- When both slot 1 and 2 are defined as not being
ABILITY_NONE
, their starting ability will be decided on a coin flip using their personality. They can later be changed using an Ability Capsule.- Certain Pokémon such as Zygarde and Rockruff have different forms to add additional abilities. As such, they cannot be changed using an Ability Capsule (though the Zygarde Cube can change Zygarde's ability by changing them to their corresponding form)
- The 3rd slot is for Hidden Abilities. If defined as
ABILITY_NONE
, it will default to Slot 1 (eg. Metapod doesn't have a Hidden Ability, but Caterpie and Butterfree do). Go here and here for more info.- If the array is defined as
{ABILITY_1, ABILITY_2}
, the Hidden Ability is set asABILITY_NONE
.
- If the array is defined as
- When both slot 1 and 2 are defined as not being
bodyColor
is used in the Pokédex as a search filter.noFlip
is used in to prevent front sprites from being flipped horizontally and cause weird issues, like Clawitzer's big claw changing sides.
That's all the basic fields present in vanilla emerald, so now let's take a look at the new fields added by the expansion.
4. Species Name
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.isLegendary = TRUE,
.allPerfectIVs = TRUE,
+ .speciesName = _("Mewthree"),
},
};
The _()
underscore function doesn't really exist - it's a convention borrowed from GNU gettext to let preproc
know this is text to be converted to the custom encoding used by the Gen 3 Pokemon games.
5. Define its cry
Time for audio! We first need to convert an existing audio file to the format supported by the expansion.
Most formats are supported for conversion, but for simplicity's sake, we're gonna use an mp3 file.
Now, let's copy the file to the sound/direct_sound_samples/cries
folder.
Once that's done, let's run the following command:
ffmpeg -i sound/direct_sound_samples/cries/mewthree.mp3 -c:a pcm_s8 -ac 1 -ar 13379 sound/direct_sound_samples/cries/mewthree.aif
This will convert your audio file to .aif, which is what's read by the compiler.
Let's add the cry to the ROM via sound/direct_sound_data.inc.
.if P_FAMILY_PECHARUNT == TRUE
.align 2
Cry_Pecharunt::
.incbin "sound/direct_sound_samples/cries/pecharunt.bin"
.endif @ P_FAMILY_PECHARUNT
+ .align 2
+Cry_Mewthree::
+ .incbin "sound/direct_sound_samples/cries/mewthree.bin"
Then we add the cry ID to include/constants/cries.h:
enum {
CRY_NONE,
...
#if P_FAMILY_TERAPAGOS
CRY_TERAPAGOS,
#endif //P_FAMILY_TERAPAGOS
#if P_FAMILY_PECHARUNT
CRY_PECHARUNT,
#endif //P_FAMILY_PECHARUNT
+ CRY_MEWTHREE,
CRY_COUNT,
};
And then link it in sound/cry_tables.inc. cry_reverse
in particular is for reversed cries used by moves such as Growl. The order of these two tables should match the order of the cry IDs, otherwise they'll be shifted.
cry Cry_Terapagos
cry Cry_Pecharunt
+ cry Cry_Mewthree
cry_reverse Cry_Terapagos
cry_reverse Cry_Pecharunt
+ cry_reverse Cry_Mewthree
Lastly, we add the cry to our species entry
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.isLegendary = TRUE,
.allPerfectIVs = TRUE,
.speciesName = _("Mewthree"),
+ .cryId = CRY_MEWTHREE,
},
};
And let's see how it sounds in-game:
Good! Our monster now has a mighty roar!
You can now delete the mp3 from the cries folder now once you made sure that the cry sounds like how you want it to.
6. Define its Pokédex entry
First, we will need to add new index constants for its Pokédex entry. The index constants are divided into the Hoenn Pokédex, which contains all Pokémon native to the Hoenn region, and the National Pokédex containing all known Pokémon, which can be received after entering the hall of fame for the first time.
Edit include/constants/pokedex.h:
// National Pokedex order
enum {
NATIONAL_DEX_NONE,
// Kanto
NATIONAL_DEX_BULBASAUR,
...
NATIONAL_DEX_PECHARUNT,
+ NATIONAL_DEX_MEWTHREE,
};
#define KANTO_DEX_COUNT NATIONAL_DEX_MEW
#define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI
#if P_GEN_9_POKEMON == TRUE
- #define NATIONAL_DEX_COUNT NATIONAL_DEX_PECHARUNT
+ #define NATIONAL_DEX_COUNT NATIONAL_DEX_MEWTHREE
Do keep in mind that if you intend to add your new species to the Hoenn Dex, you'll also want to add a HOENN_DEX
constant for it, like this:
// Hoenn Pokedex order
enum {
HOENN_DEX_NONE,
HOENN_DEX_TREECKO,
...
HOENN_DEX_DEOXYS,
+ HOENN_DEX_MEWTHREE,
};
- #define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1)
+ #define HOENN_DEX_COUNT (HOENN_DEX_MEWTHREE + 1)
Edit src/pokemon.c:
const u16 sHoennToNationalOrder[NUM_SPECIES] = // Assigns Hoenn Dex Pokémon (Using National Dex Index)
{
HOENN_TO_NATIONAL(TREECKO),
...
HOENN_TO_NATIONAL(DEOXYS),
+ HOENN_TO_NATIONAL(MEWTHREE),
};
Now we can add the number and entry to our Mewthree:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.cryId = CRY_MEWTHREE,
+ .natDexNum = NATIONAL_DEX_MEWTHREE,
+ .categoryName = _("New Species"),
+ .height = 15,
+ .weight = 330,
+ .description = COMPOUND_STRING(
+ "The rumors became true.\n"
+ "This is Mew's final form.\n"
+ "Its power level is over 9000.\n"
+ "Has science gone too far?"),
+ .pokemonScale = 256,
+ .pokemonOffset = 0,
+ .trainerScale = 290,
+ .trainerOffset = 2,
},
};
The values pokemonScale
, pokemonOffset
, trainerScale
and trainerOffset
are used for the height comparison figure in the Pokédex.
height
and weight
are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters).
In Pokémon Emerald, you can sort the Pokédex by name, height or weight. Apparently, the Pokémon order is hardcoded in the game files and not calculated from their data. Therefore we have to include our new Pokémon species at the right places. While the correct position for the alphabetical order is easy to find, it can become quite tedious for height and weight, so we added comments to the listings in order help out were they should fit.
Edit src/data/pokemon/pokedex_orders.h:
const u16 gPokedexOrder_Alphabetical[] =
{
...
NATIONAL_DEX_MEW,
+ NATIONAL_DEX_MEWTHREE,
NATIONAL_DEX_MEWTWO,
...
};
const u16 gPokedexOrder_Weight[] =
{
...
// 72.8 lbs / 33.0 kg
//NATIONAL_DEX_MEWTWO_MEGA_Y,
NATIONAL_DEX_ESCAVALIER,
NATIONAL_DEX_FRILLISH,
NATIONAL_DEX_DURANT,
NATIONAL_DEX_CINDERACE,
+ NATIONAL_DEX_MEWTHREE,
//NATIONAL_DEX_PERSIAN_ALOLAN,
NATIONAL_DEX_TOEDSCOOL,
// 73.4 lbs / 33.3 kg
NATIONAL_DEX_DUGTRIO,
...
};
const u16 gPokedexOrder_Height[] =
{
...
// 4'11" / 1.5m
...
NATIONAL_DEX_GLIMMORA,
NATIONAL_DEX_WO_CHIEN,
NATIONAL_DEX_IRON_LEAVES,
NATIONAL_DEX_IRON_BOULDER,
+ NATIONAL_DEX_MEWTHREE,
// 5'03" / 1.6m
...
};
The Graphics
We will start by copying the following files for Mew (not Mewtwo) and rename it to mewthree
.
cp -r graphics/pokemon/mew/. graphics/pokemon/mewthree
We aren't copying Mewtwo's folder because he has those pesky Mega Evolutions that will get in the way of what we're doing, so our sample will need to be pure from the source.
1. Edit the sprites
Let's edit the sprites. Start your favourite image editor (I recommend Aseprite or its free alternative, Libresprite) and change anim_front.png
and back.png
to meet your expectations.
Make sure that you are using the indexed mode and you have limited yourself to 15 colors!
Put the RGB values of your colors into normal.pal
between the first and the last color and the RGB values for the shiny version into shiny.pal
.
Edit footprint.png
using two colors in indexed mode, black and white.
Finally, edit icon.png
. Notice, that the icon will use one of 6 predefined palettes instead of normal.pal
.
2. Add the sprites to the rom
Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. First, create constants for the file paths. You'll want to add the constants for your species after the constants for the last valid species.
Edit src/data/graphics/pokemon.h:
#if P_FAMILY_PECHARUNT
// const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz");
// const u32 gMonPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/normal.gbapal.lz");
// const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz");
// const u32 gMonShinyPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/shiny.gbapal.lz");
// const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp");
#if P_FOOTPRINTS
// const u8 gMonFootprint_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/footprint.1bpp");
#endif //P_FOOTPRINTS
#endif //P_FAMILY_PECHARUNT
+ const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/anim_front.4bpp.lz");
+ const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz");
+ const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz");
+ const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz");
+ const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp");
+ const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp");
Please note that Pecharunt, the Pokémon that should be above your insertion for the time being, reads a front.png
sprite instead of an anim_front.png
sprite. This is because currently, Pecharunt lacks a 2nd frame. If the front sprite sheet of your species uses 2 frames, you should use anim_front
.
It is also worth to mention that Pecharunt's sprites are commented out simply because they're currently missing.
3. Add the animations to the rom
You can define the animation order, in which the sprites will be shown. The first number is the sprite index (so 0 or 1) and the second number is the number of frames the sprite will be visible.
Edit src/data/pokemon_graphics/front_pic_anims.h:
#if P_FAMILY_PECHARUNT
PLACEHOLDER_ANIM_SINGLE_FRAME(Pecharunt);
#endif //P_FAMILY_PECHARUNT
+static const union AnimCmd sAnim_Mewthree_1[] =
+{
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_END,
+};
#if P_FAMILY_PECHARUNT
SINGLE_ANIMATION(Pecharunt);
#endif //P_FAMILY_PECHARUNT
+SINGLE_ANIMATION(Mewthree);
SINGLE_ANIMATION(Egg);
You might be wondering what PLACEHOLDER_ANIM_SINGLE_FRAME
is. Well, since Pecharun only has 1 frame, we use what's called a preprocessor macro to have in a single line what otherwise would've been this in the C file:
static const union AnimCmd sAnim_Pecharunt_1[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
}
Instead, we can use the already established macro that does the same thing, replacing the value in parenthesis with what we want (in this case, Pecharunt
):
#define PLACEHOLDER_ANIM_SINGLE_FRAME(name) \
static const union AnimCmd sAnim_##name##_1[] = \
{ \
ANIMCMD_FRAME(0, 1), \
ANIMCMD_END, \
}
4. Linking graphic information to our Pokémon
Now that we have all the external data ready, we just need to add it to gSpeciesInfo
plus the rest of the animation and graphical data that we want to use:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.pokemonScale = 256,
.pokemonOffset = 0,
.trainerScale = 290,
.trainerOffset = 2,
+ .frontPic = gMonFrontPic_Mewthree,
+ .frontPicSize = MON_COORDS_SIZE(64, 64),
+ .frontPicYOffset = 0,
+ .frontAnimFrames = sAnims_Mewthree,
+ .frontAnimId = ANIM_GROW_VIBRATE,
+ .frontAnimDelay = 15,
+ .enemyMonElevation = 6,
+ .backPic = gMonBackPic_Mewthree,
+ .backPicSize = MON_COORDS_SIZE(64, 64),
+ .backPicYOffset = 0,
+ .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL,
+ .palette = gMonPalette_Mewthree,
+ .shinyPalette = gMonShinyPalette_Mewthree,
.iconSprite = gMonIcon_Mewthree,
.iconPalIndex = 2,
+ FOOTPRINT(Mewthree)
},
};
Let's explain each of these:
frontPic
:- Used to reference the front sprite, so in this case, we call for
gMonFrontPic_Mewthree
.
- Used to reference the front sprite, so in this case, we call for
frontPicSize
:- The two values (
width
andheight
) are used for defining the non-empty size of the front sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64.
- The two values (
frontPicYOffset
:- Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see
enemyMonElevation
.
- Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see
frontAnimFrames
:- We link our animation frame animations that we defined earlier here.
frontAnimId
:- Because you are limited to two frames, there are already predefined front sprite animations, describing translations, rotations, scalings or color changes.
frontAnimDelay
:- Sets a delay in frame count between when the Pokémon appears and when the animation starts.
enemyMonElevation
:- Used to determine the altitude from the ground. Any value above 0 will show a shadow under the Pokémon, to signify that they're floating.
backPic
:- Used to reference the back sprite, so in this case, we call for
gMonBackPic_Mewthree
.
- Used to reference the back sprite, so in this case, we call for
backPicSize
:- The two values (
width
andheight
) are used for defining the non-empty size of the back sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64.
- The two values (
backPicYOffset
:- Used to define what Y position of the back sprite. When working with the animation debug menu, we recommend aligning the back sprite to the white background, as it was designed to properyly align with the real battle layout.
backAnimId
:- Like
frontAnimId
except for the back sprites and them being a single frame. The IDs listed here are used to represent 3 different animations that happen based on the the Pokémon's nature.
- Like
palette
:- Used to reference the non-shiny palette, so in this case, we call for
gMonPalette_Mewthree
.
- Used to reference the non-shiny palette, so in this case, we call for
shinyPalette
:- Used to reference the shiny palette, so in this case, we call for
gMonShinyPalette_Mewthree
.
- Used to reference the shiny palette, so in this case, we call for
iconSprite
:- Used to reference the icon sprite, so in this case, we call for
gMonIcon_Mewthree
.
- Used to reference the icon sprite, so in this case, we call for
iconPalIndex
:ICON
-
Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in
graphics/pokemon/icon_palettes
.Open an icon sprite and load one of the palettes to find out which palette suits your icon sprite best.
-
FOOTPRINT
- We made this single field into a macro so that they can be ignored when
P_FOOTPRINTS
is set to false. It's also why we don't have an "," after calling it like the other macros (we add it as part of the macro itself).#if P_FOOTPRINTS #define FOOTPRINT(sprite) .footprint = gMonFootprint_## sprite, #else #define FOOTPRINT(sprite) #endif
- We made this single field into a macro so that they can be ignored when
The Data - Part 2
We're almost there just a bit left!
1. Species Flags
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE },
.bodyColor = BODY_COLOR_PURPLE,
+ .isLegendary = TRUE,
+ .allPerfectIVs = TRUE,
},
};
Each species flag provides properties to the species:
isLegendary
:- Guarantees 3 perfect IVs upon generating the Pokémon (As long as
P_LEGENDARY_PERFECT_IVS
is set toGEN_6
or higher).
- Guarantees 3 perfect IVs upon generating the Pokémon (As long as
isMythical
:- Guarantees 3 perfect IVs upon generating the Pokémon (As long as
P_LEGENDARY_PERFECT_IVS
is set toGEN_6
or higher). - Is skipped during Pokédex evaluations.
- Unless it also has the
dexForceRequired
flag.
- Unless it also has the
- Cannot obtain Gigantamax factor via
ToggleGigantamaxFactor
.
- Guarantees 3 perfect IVs upon generating the Pokémon (As long as
isUltraBeast
:- Guarantees 3 perfect IVs upon generating the Pokémon (As long as
P_LEGENDARY_PERFECT_IVS
is set toGEN_6
or higher). - Beast Ball's multiplier is set to x5 for this species.
- All other ball multipliers are set to x0.1.
- Guarantees 3 perfect IVs upon generating the Pokémon (As long as
isParadox
(previouslyisParadoxForm
):- Currently has no functionality but can be utilized by users for their own benefits.
isTotem
:- Guarantees 3 perfect IVs upon generating the Pokémon (As long as
P_LEGENDARY_PERFECT_IVS
is set toGEN_6
or higher).
- Guarantees 3 perfect IVs upon generating the Pokémon (As long as
isMegaEvolution
:- A Mega indicator is added to the battle box indicating that they're Mega Evolved.
- The species doesn't receive affection benefits.
- Required when adding new Mega Evolutions.
isPrimalReversion
:- A Primal Reversion indicator (Alpha or Omega for Kyogre/Groudon respectively) is added to the battle box indicating that they're Primal Reverted.
- Required when adding new Primal Reversions.
isUltraBurst
:- Required when adding new Ultra Burst forms.
isGigantamax
:- Used to determine if Gigantamax forms should have their GMax moves or not.
- Required when adding new Gigantamax forms.
isAlolanForm
,isGalarianForm
,isHisuianForm
,isPaldeanForm
:- In the future, these will be used to determine breeding offspring from different based on their region.
cannotBeTraded
:- This species cannot be traded away (like Black/White Kyurem).
allPerfectIVs
:- Guarantees 6 perfect IVs upon generating the Pokémon (like LGPE's Partner Pikachu and Eevee).
tmIlliterate
:- This species will be unable to learn the universal moves.
isFrontierBanned
:- This species will be unable to enter Battle Frontier facilities. Replaces
gFrontierBannedSpecies
.
- This species will be unable to enter Battle Frontier facilities. Replaces
*: As long as P_LEGENDARY_PERFECT_IVS
is set to GEN_6
or higher.
2. Delimit the moveset
Let's begin with the moves that can be learned by leveling up.
Append to src/data/pokemon/level_up_learnsets.h:
#if P_FAMILY_PECHARUNT
static const struct LevelUpMove sPecharuntLevelUpLearnset[] = {
LEVEL_UP_MOVE( 1, MOVE_SMOG),
LEVEL_UP_MOVE( 1, MOVE_POISON_GAS),
LEVEL_UP_MOVE( 1, MOVE_MEMENTO),
LEVEL_UP_MOVE( 1, MOVE_ASTONISH),
LEVEL_UP_MOVE( 8, MOVE_WITHDRAW),
LEVEL_UP_MOVE(16, MOVE_DESTINY_BOND),
LEVEL_UP_MOVE(24, MOVE_FAKE_TEARS),
LEVEL_UP_MOVE(32, MOVE_PARTING_SHOT),
LEVEL_UP_MOVE(40, MOVE_SHADOW_BALL),
LEVEL_UP_MOVE(48, MOVE_MALIGNANT_CHAIN),
LEVEL_UP_MOVE(56, MOVE_TOXIC),
LEVEL_UP_MOVE(64, MOVE_NASTY_PLOT),
LEVEL_UP_MOVE(72, MOVE_RECOVER),
LEVEL_UP_END
};
#endif
+static const struct LevelUpMove sMewthreeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE( 1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE( 1, MOVE_DISABLE),
+ LEVEL_UP_MOVE(11, MOVE_BARRIER),
+ LEVEL_UP_MOVE(22, MOVE_SWIFT),
+ LEVEL_UP_MOVE(33, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(44, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(55, MOVE_MIST),
+ LEVEL_UP_MOVE(66, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(77, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(88, MOVE_RECOVER),
+ LEVEL_UP_MOVE(99, MOVE_SAFEGUARD),
+ LEVEL_UP_END
+};
Again, we need to register the learnset in gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
PALETTES(Mewthree),
ICON(Mewthree, 2),
FOOTPRINT(Mewthree)
+ .levelUpLearnset = sMewthreeLevelUpLearnset,
},
};
Next we need to specify which moves can be taught via TM, HM, or Move Tutor.
Append to src/data/pokemon/teachable_learnsets.h:
#if P_FAMILY_PECHARUNT
static const u16 sPecharuntTeachableLearnset[] = {
...
MOVE_UNAVAILABLE,
};
#endif //P_FAMILY_PECHARUNT
+static const u16 sMewthreeTeachableLearnset[] = {
+ MOVE_FOCUS_PUNCH,
+ MOVE_WATER_PULSE,
+ MOVE_CALM_MIND,
+ MOVE_TOXIC,
+ MOVE_HAIL,
+ MOVE_BULK_UP,
+ MOVE_HIDDEN_POWER,
+ MOVE_SUNNY_DAY,
+ MOVE_TAUNT,
+ MOVE_ICE_BEAM,
+ MOVE_BLIZZARD,
+ MOVE_HYPER_BEAM,
+ MOVE_LIGHT_SCREEN,
+ MOVE_PROTECT,
+ MOVE_RAIN_DANCE,
+ MOVE_SAFEGUARD,
+ MOVE_FRUSTRATION,
+ MOVE_SOLAR_BEAM,
+ MOVE_IRON_TAIL,
+ MOVE_THUNDERBOLT,
+ MOVE_THUNDER,
+ MOVE_EARTHQUAKE,
+ MOVE_RETURN,
+ MOVE_PSYCHIC,
+ MOVE_SHADOW_BALL,
+ MOVE_BRICK_BREAK,
+ MOVE_DOUBLE_TEAM,
+ MOVE_REFLECT,
+ MOVE_SHOCK_WAVE,
+ MOVE_FLAMETHROWER,
+ MOVE_SANDSTORM,
+ MOVE_FIRE_BLAST,
+ MOVE_ROCK_TOMB,
+ MOVE_AERIAL_ACE,
+ MOVE_TORMENT,
+ MOVE_FACADE,
+ MOVE_SECRET_POWER,
+ MOVE_REST,
+ MOVE_SKILL_SWAP,
+ MOVE_SNATCH,
+ MOVE_STRENGTH,
+ MOVE_FLASH,
+ MOVE_ROCK_SMASH,
+ MOVE_MEGA_PUNCH,
+ MOVE_MEGA_KICK,
+ MOVE_BODY_SLAM,
+ MOVE_DOUBLE_EDGE,
+ MOVE_COUNTER,
+ MOVE_SEISMIC_TOSS,
+ MOVE_MIMIC,
+ MOVE_METRONOME,
+ MOVE_DREAM_EATER,
+ MOVE_THUNDER_WAVE,
+ MOVE_SUBSTITUTE,
+ MOVE_DYNAMIC_PUNCH,
+ MOVE_PSYCH_UP,
+ MOVE_SNORE,
+ MOVE_ICY_WIND,
+ MOVE_ENDURE,
+ MOVE_MUD_SLAP,
+ MOVE_ICE_PUNCH,
+ MOVE_SWAGGER,
+ MOVE_SLEEP_TALK,
+ MOVE_SWIFT,
+ MOVE_THUNDER_PUNCH,
+ MOVE_FIRE_PUNCH,
+ MOVE_UNAVAILABLE, // This is required to determine where the array ends.
+};
#endif
NOTE: At the top of this file, you will probably see this warning:
//
// DO NOT MODIFY THIS FILE! It is auto-generated from tools/learnset_helpers/teachable.py`
//
The expansion includes a tool called the learnset helper, which aims to automate the generation of valid teachable moves. At the time of writing, this tool only supports generating TM and Tutor learnsets. However, in the future it may be expanded to deal with level up learnsets and egg moves.
Ignore the warning shown above the first time you're adding your teachable moves (as otherwise the compiler will complain about the array not existing), but in the future (if you're using the learnset helper) simply edit what teachable moves your Pokémon can learn in one of the JSON files found in tools/learnset_helpers/porymoves_files
. It doesn't really matter which one you add your new Pokémon to, as the tool pulls from all of the files in this folder.
The learnset helper is useful if you plan on changing and/or increasing the available TMs and Tutor moves in your game. As an example, Bulbasaur learns Rage by TM in Red/Blue/Yellow, but in Emerald this TM does not exist. But since tools/learnset_helpers/porymoves_files/rby.json
defines "MOVE_RAGE" as a TM move for Bulbasaur, that move would automatically be added to the sBulbasaurTeachableLearnset
array if you were to add a Rage TM at any point.
The learnset helper can be toggled on/off in include/config/pokemon.h
:
// Learnset helper toggles
#define P_LEARNSET_HELPER_TEACHABLE TRUE // If TRUE, teachable_learnsets.h will be populated by tools/learnset_helpers/teachable.py using the included JSON files based on available TMs and tutors.
Once more, we need to register the learnset in gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
FOOTPRINT(Mewthree)
.levelUpLearnset = sMewthreeLevelUpLearnset,
+ .teachableLearnset = sMewthreeTeachableLearnset,
},
};
If you want to create a Pokémon which can breed, you will need to edit src/data/pokemon/egg_moves.h.
3. Define the Evolutions
We want Mewthree to evolve from Mewtwo by reaching level 100.
Edit gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTWO] =
{
...
FOOTPRINT(Mewtwo)
.isLegendary = TRUE,
.levelUpLearnset = sMewtwoLevelUpLearnset,
.teachableLearnset = sMewtwoTeachableLearnset,
.formSpeciesIdTable = sMewtwoFormSpeciesIdTable,
.formChangeTable = sMewtwoFormChangeTable,
+ .evolutions = EVOLUTION({EVO_LEVEL, 100, SPECIES_MEWTHREE}),
},
};
4. Make it appear!
Now Mewthree really does slumber in the games code - but we won't know until we make him appear somewhere! The legend tells that Mewthree is hiding somewhere in Petalburg Woods...
Edit src/data/wild_encounters.json:
{
"map": "MAP_PETALBURG_WOODS",
"base_label": "gPetalburgWoods",
"land_mons": {
"encounter_rate": 20,
"mons": [
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_POOCHYENA"
},
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_WURMPLE"
},
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_SHROOMISH"
},
{
- "min_level": 6,
- "max_level": 6,
- "species": "SPECIES_POOCHYENA"
+ "min_level": 5,
+ "max_level": 5,
+ "species": "SPECIES_MEWTHREE"
},
...
}
Congratulations, you have created your own personal pocket monster! You may call yourself a mad scientist now.
Optional data
Now that you now have all the essential pieces to create a base species, there are some aspects that you might want to know if you want to do other stuff with your custom Pokémon.
1. Form tables
Found in src/data/pokemon/form_species_tables.h
.
These are introduced to have a reference of what forms correspond to what Species of Pokémon. For example, we have Pikachu's table:
#if P_FAMILY_PIKACHU
static const u16 sPikachuFormSpeciesIdTable[] = {
SPECIES_PIKACHU,
SPECIES_PIKACHU_COSPLAY,
SPECIES_PIKACHU_ROCK_STAR,
SPECIES_PIKACHU_BELLE,
SPECIES_PIKACHU_POP_STAR,
SPECIES_PIKACHU_PH_D,
SPECIES_PIKACHU_LIBRE,
SPECIES_PIKACHU_ORIGINAL_CAP,
SPECIES_PIKACHU_HOENN_CAP,
SPECIES_PIKACHU_SINNOH_CAP,
SPECIES_PIKACHU_UNOVA_CAP,
SPECIES_PIKACHU_KALOS_CAP,
SPECIES_PIKACHU_ALOLA_CAP,
SPECIES_PIKACHU_PARTNER_CAP,
SPECIES_PIKACHU_WORLD_CAP,
FORM_SPECIES_END,
};
#endif //P_FAMILY_PIKACHU
We register the table each form entry in gSpeciesInfo
.
[SPECIES_PIKACHU] =
{
...
.teachableLearnset = sPikachuTeachableLearnset,
+ .formSpeciesIdTable = sPikachuFormSpeciesIdTable,
.evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU},
{EVO_NONE, 0, SPECIES_RAICHU_ALOLAN}),
},
[SPECIES_PIKACHU_COSPLAY] =
{
...
.teachableLearnset = sPikachuTeachableLearnset,
+ .formSpeciesIdTable = sPikachuFormSpeciesIdTable,
},
...and so on.
What this allows us to do is to be able to get all forms of a Pokémon in our code by using the GetSpeciesFormTable
function.
For example, in the HGSS dex, it lets us browse between the entries of every form available.:
In addition, we have the GET_BASE_SPECIES_ID
macro, which returns the first entry of the table (or return the species itself if it doesn't have a table registered). With this, you can check if a Pokémon is any form of a species. For example, making it so that the Light Ball affects all Pikachu forms:
case HOLD_EFFECT_LIGHT_BALL:
if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PIKACHU && IS_MOVE_SPECIAL(move))
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0));
break;
2. Form change tables
Found in src/data/pokemon/form_species_tables.h
.
These tables, unlike the regular form tables, registers how Pokémon can switch between forms.
#if P_FAMILY_GASTLY
static const struct FormChange sGengarFormChangeTable[] = {
{FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE},
{FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GIGANTAMAX},
{FORM_CHANGE_TERMINATOR},
};
#endif //P_FAMILY_GASTLY
The first value is the type of form change. In the case of Gengar, we have both Mega Evolution and Gigantamax form changes.
The second value is the target form, to which the Pokémon will change into.
Values after that are referred as arguments, and needs to be put there depends on the type of form change, detailed in include/constants/form_change_types.h
.
3. Gender differences
You may have seen that there's a couple of duplicate fields with a "Female" suffix.
[SPECIES_FRILLISH] =
{
...
.frontPic = gMonFrontPic_Frillish,
+ .frontPicFemale = gMonFrontPic_FrillishF,
.frontPicSize = MON_COORDS_SIZE(56, 56),
+ .frontPicSizeFemale = MON_COORDS_SIZE(56, 56),
.frontPicYOffset = 5,
.frontAnimFrames = sAnims_Frillish,
.frontAnimId = ANIM_RISING_WOBBLE,
.backPic = gMonBackPic_Frillish,
+ .backPicFemale = gMonBackPic_FrillishF,
.backPicSize = MON_COORDS_SIZE(40, 56),
+ .backPicSizeFemale = MON_COORDS_SIZE(40, 56),
.backPicYOffset = 7,
.backAnimId = BACK_ANIM_CONVEX_DOUBLE_ARC,
.palette = gMonPalette_Frillish,
+ .paletteFemale = gMonPalette_FrillishF,
.shinyPalette = gMonShinyPalette_Frillish,
+ .shinyPaletteFemale = gMonShinyPalette_FrillishF,
.iconSprite = gMonIcon_Frillish,
+ .iconSpriteFemale = gMonIcon_FrillishF,
.iconPalIndex = 0,
+ .iconPalIndexFemale = 1,
FOOTPRINT(Frillish)
.levelUpLearnset = sFrillishLevelUpLearnset,
.teachableLearnset = sFrillishTeachableLearnset,
.evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_JELLICENT}),
},
These are used to change the graphics of the Pokémon if they're female. If they're not registered, they default to the male values.
However, iconPalIndexFemale
is a special case, where it's doesn't read the male icon palette if its iconSpriteFemale
is set, so if you're setting a female icon, be sure to set their palette index as well.
4. Overworld Data
If you have OW_POKEMON_OBJECT_EVENTS
in your hack, you can add Overworld of your new species by following these steps:
First, since you copied the contents from Mew's folder previously, you should also have copied its overworld sprites. Edit those to your liking, as we have done before, making sure to update the palettes
Secondly, in src/data/graphics/pokemon.h, add the following:
const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp");
const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp");
+ const u32 gObjectEventPic_Mewthree[] = INCBIN_COMP("graphics/pokemon/mewthree/overworld.4bpp");
+ const u32 gOverworldPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/overworld_normal.gbapal.lz");
+ const u32 gShinyOverworldPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/overworld_shiny.gbapal.lz");
Thirdly, in spritesheet_rules.mk
$(POKEMONGFXDIR)/mewtwo/overworld.4bpp: %.4bpp: %.png
$(GFX) $< $@ -mwidth 4 -mheight 4
+$(POKEMONGFXDIR)/mewthree/overworld.4bpp: %.4bpp: %.png
+ $(GFX) $< $@ -mwidth 4 -mheight 4
$(POKEMONGFXDIR)/mew/overworld.4bpp: %.4bpp: %.png
$(GFX) $< $@ -mwidth 4 -mheight 4
Fourthly, in src/data/object_events/object_event_pic_tables_followers.h:
#if P_FAMILY_PECHARUNT
/*static const struct SpriteFrameImage sPicTable_Pecharunt[] = {
overworld_ascending_frames(gObjectEventPic_Pecharunt, 4, 4),
};*/
#endif //P_FAMILY_PECHARUNT
+static const struct SpriteFrameImage sPicTable_Mewthree[] = {
+ overworld_ascending_frames(gObjectEventPic_Mewthree, 4, 4),
+};
And finally, in gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
FOOTPRINT(Mewthree)
+ OVERWORLD(
+ sPicTable_Mewthree,
+ SIZE_32x32,
+ SHADOW_SIZE_M,
+ TRACKS_FOOT,
+ gOverworldPalette_Mewthree,
+ gShinyOverworldPalette_Mewthree
+ )
.levelUpLearnset = sMewthreeLevelUpLearnset,
.teachableLearnset = sMewthreeTeachableLearnset,
},
};
Sprite Size
Depending on your species, you might want to use different sizes for it. For example, certain species known for being big like Steelix use sprites that fit a 64x64 frame instead of 32x32, and as such have SIZE_64x64
in their data instead of SIZE_32x32
to accomodate for them.
Also, in spritesheet_rules.mk
, -mwidth
and -mheight
need to be set to 8 instead of 4 for such cases.
Shadows
You have 4 options for their shadow, between Small, Medium, Large and None:
SHADOW_SIZE_NONE
SHADOW_SIZE_S
SHADOW_SIZE_M
SHADOW_SIZE_L
Tracks
You have 4 options for the tracks that your species will leave behind on sand.
TRACKS_NONE
TRACKS_FOOT
TRACKS_SLITHER
TRACKS_SPOT
TRACKS_BUG
...though technically you can also use TRACKS_BIKE_TIRE
if you wish to.
This is a modified version of the original tutorial about adding new Pokémon species available in Pokeemerald's wiki.
Despite the persistent rumors about an incredibly strong third form of Mew hiding somewhere, it actually wasn't possible to catch it... OR WAS IT? In this tutorial, we will add a new Pokémon species to the game.
IMPORTANT: This tutorial applies to 1.8.x versions.
Changes compared to vanilla
The main things that the Expansion changes are listed here.
- Still Front Pics (
gMonStillFrontPic_YourPokemon
) and by extensionsrc/anim_mon_front_pics.c
have been removed. src/data/pokemon/cry_ids.h
doesn't exist anymore.- You have 6 icon palettes available instead of the base 3.
- Most tables that use
SPECIES_x
as indexes have been moved togSpeciesInfo
.
Content
Useful resources
You can open a sprite debug menu by pressing Select
in a Pokémon's summary screen outside of battle.
The Data - Part 1
Our plan is as simple as it is brilliant: clone Mewtwo... and make it even stronger!
1. Declare a species constant
Our first step towards creating a new digital lifeform is to define its own species constant.
Edit include/constants/species.h:
#define SPECIES_NONE 0
#define SPECIES_BULBASAUR 1
...
#define SPECIES_URSHIFU_SINGLE_STRIKE_STYLE_GIGANTAMAX 1521
#define SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX 1522
#define SPECIES_MIMIKYU_TOTEM_BUSTED 1523
+#define SPECIES_MEWTHREE 1524
-#define SPECIES_EGG SPECIES_MIMIKYU_TOTEM_BUSTED + 1
+#define SPECIES_EGG SPECIES_MEWTHREE + 1
#define NUM_SPECIES SPECIES_EGG
This number is stored in a Pokémon's save structure. These should generally never change, otherwise your saved Pokémon species will change as well.
We add this after the last species ID and make sure to update SPECIES_EGG
's definition to use the last ID on the list.
Also, be sure that no IDs repeat each other, or you'll get compiling errors.
NOTE: In 1.7.x and previous versions, we had variable defines such as `FORMS_START` but was confusing for users, so we switched to absolute IDs.
Now, let's see how it looks in-game!
Hmmm, something's not right...
Oh, I know! We need to add the rest of the data! Normally, the vanilla game would crash if we try to look up anything about Mewthree in this state, but the expansion defaults all of its data to SPECIES_NONE
.
Now, let's see what needs to be done.
2. SpeciesInfo
's structure
Now, to better understand Mewtwo, we also need to understand Mew. Let's look at its data.
[SPECIES_MEW] =
{
.baseHP = 100,
.baseAttack = 100,
.baseDefense = 100,
.baseSpeed = 100,
.baseSpAttack = 100,
.baseSpDefense = 100,
.types = { TYPE_PSYCHIC, TYPE_PSYCHIC },
.catchRate = 45,
#if P_UPDATED_EXP_YIELDS >= GEN_8
.expYield = 300,
#elif P_UPDATED_EXP_YIELDS >= GEN_5
.expYield = 270,
#else
.expYield = 64,
#endif
.evYield_HP = 3,
.itemCommon = ITEM_LUM_BERRY,
.itemRare = ITEM_LUM_BERRY,
.genderRatio = MON_GENDERLESS,
.eggCycles = 120,
.friendship = 100,
.growthRate = GROWTH_MEDIUM_SLOW,
.eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED },
.abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE },
.bodyColor = BODY_COLOR_PINK,
.isMythical = TRUE,
.speciesName = _("Mew"),
.cryId = CRY_MEW,
.natDexNum = NATIONAL_DEX_MEW,
.categoryName = _("New Species"),
.height = 4,
.weight = 40,
.description = COMPOUND_STRING(
"A Mew is said to possess the genes of all\n"
"Pokémon. It is capable of making itself\n"
"invisible at will, so it entirely avoids\n"
"notice even if it approaches people."),
.pokemonScale = 457,
.pokemonOffset = -2,
.trainerScale = 256,
.trainerOffset = 0,
.frontPic = gMonFrontPic_Mew,
.frontPicSize = MON_COORDS_SIZE(64, 48),
.frontPicYOffset = 9,
.frontAnimFrames = sAnims_Mew,
.frontAnimId = ANIM_ZIGZAG_SLOW,
.enemyMonElevation = 11,
.backPic = gMonBackPic_Mew,
.backPicSize = MON_COORDS_SIZE(64, 64),
.backPicYOffset = 0,
.backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL,
.palette = gMonPalette_Mew,
.shinyPalette = gMonShinyPalette_Mew,
.iconSprite = gMonIcon_Mew,
.iconPalIndex = 0,
FOOTPRINT(Mew)
.levelUpLearnset = sMewLevelUpLearnset,
.teachableLearnset = sMewTeachableLearnset,
},
That's a lot of stuff! But don't worry, we'll go through it step by step throught the tutorial (and miles better than having this same data through 20+ files like it used to be).
We'll start by adding the self-explanatory data that's also present in pret's vanilla structure:
3. Define its basic species information
Edit src/data/pokemon/species_info.h:
const struct SpeciesInfo gSpeciesInfo[] =
{
[SPECIES_NONE] = {0},
...
[SPECIES_EGG] =
{
FRONT_PIC(Egg, 24, 24),
.frontPicYOffset = 20,
.backPic = gMonFrontPic_Egg,
.backPicSize = MON_COORDS_SIZE(24, 24),
.backPicYOffset = 20,
.palette = gMonPalette_Egg,
.shinyPalette = gMonPalette_Egg,
ICON(Egg, 1),
},
+ [SPECIES_MEWTHREE] =
+ {
+ .baseHP = 106,
+ .baseAttack = 150,
+ .baseDefense = 70,
+ .baseSpeed = 140,
+ .baseSpAttack = 194,
+ .baseSpDefense = 120,
+ .types = { TYPE_PSYCHIC, TYPE_PSYCHIC },
+ .catchRate = 3,
+ .expYield = 255,
+ .evYield_SpAttack = 3,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 0,
+ .growthRate = GROWTH_SLOW,
+ .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED },
+ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE },
+ .bodyColor = BODY_COLOR_PURPLE,
+ },
};
The .
is the structure reference operator in C to refer to the member object of the structure SpeciesInfo.
baseHP
,baseAttack
,baseDefense
,baseSpeed
,baseSpAttack
andbaseSpDefense
are the base stats. They can't go higher than 255.- You may be confused as to why
types
hasTYPE_PSYCHIC
twice. This is because the way the game determines single-type mon is to define both types the same.- If we don't, it defaults to Normal due to it being the first type defined.
catchRate
is how likely it is to catch a Pokémon, the lower the value, the harder it is to catch. Legendaries generally have a catch rate of 3, so we put that here.expYield
is the base amount of experience that a Pokémon gives when defeated/caught. In vanilla, this value caps at 255, but we've increased it to a maximum of 65535 accomodate later gen's higher experience yields. (The highest official value is Blissey's with 608, so going beyond this point may cause exponential gains that could break the system 😱)- If you noticed, Mew's had some
#if
s,#elif
s and#endif
around it. This is because its yield has changed over time, and we let you choose which ones you want. This is not relevant to our Mewthree however, so we can just put a single.expYield = 255,
line here.
- If you noticed, Mew's had some
evYield_HP
,evYield_Attack
,evYield_Defense
,evYield_Speed
,evYield_SpAttack
andevYield_SpDefense
are how many EVs does the Pokémon give when they're caught. Each of these fields can have a value of 3 at most. Officially, no Pokémon give out more than 3 EVs total, with them being determined by their evolution stage (eg, Pichu, Pikachu and Raichu give 1, 2 and 3 Speed EVs respectively), and they tend to be associated with its higher stats. Since our Mewthree is a Special Attack monster, we'll be consistent and make it give out 3 Special Attack EVs, but you're always free to assign whatever you feel like :)- Notice that the other
evYield
fields are not there. In C, numbers in a struct default to 0, so if we don't specify them, they'll be 0 all around! Less lines to worry about :D
- Notice that the other
itemCommon
anditemRare
are used to determine what items is the Pokémon holding when encountering it in the wild.- 50% for
itemCommon
and 5% foritemRare
(boosted to 60%/20% when the first mon in the party has Compound Grass or Super Luck) - If they're both set as the same item, the item has a 100% chance of appearing.
- 50% for
genderRatio
is a fun one.- There are 4 ways of handling this
PERCENT_FEMALE
is what most Pokémon use, where you define how likely it's gonna be female. It supports decimals, so you can putPERCENT_FEMALE(12.5)
to have a 1 in 8 chance of your mon to be female.MON_MALE
guarantees that all mon of this species will be male (eg. Tauros)MON_FEMALE
guarantees that all mon of this species will be female (eg. Miltank)MON_GENDERLESS
makes your species genderless, unable to breed with anything but Ditto to produce eggs. Most Legendaries are this, so we'll be chosing this as Mewthree's gender ratio.
- When working with evolution lines and don't want their genders to change after evolving, be sure that their gender ratios match their stages and evolution methods. Azurill is the only case where there's a mismatch, causing 1/3 of all Azurill to change from Female to Male.
- You might be wondering why some species have multiple defines for their genders, like
SPECIES_MEOWSTIC_(FE)MALE
. This is because those species have different stats and data from each other, so they're defined internally as different forms withMON_MALE
andMON_FEMALE
as gender ratios. If your species evolves depending on its gender and the evolutions have different stats, be sure to apply the correct evolution method!
- There are 4 ways of handling this
eggCycles
determines how fast an egg of this species will hatch. Doesn't matter much for evolved species or those that can't lay eggs, but we add the field here just in case.friendship
determines the amount of friendship of the mon when you catch it. Most Pokémon useSTANDARD_FRIENDSHIP
, but this creature of chaos does not want to be your friend, starting with 0.growthRate
determines the amounts of experience required to reach each level. Go here for more info.eggGroups
are used for breed compatibility. Most Legendaries and Mythicals have theEGG_GROUP_NO_EGGS_DISCOVERED
group, and so does our Mewthree. Go here for more info.abilities
determines the potential abilites of our species. Notice how I also set the ability toABILITY_INSOMNIA
, so our little monster doesn't even need to sleep anymore. You can find the abilities for example here include/constants/abilities.h.- When both slot 1 and 2 are defined as not being
ABILITY_NONE
, their starting ability will be decided on a coin flip using their personality. They can later be changed using an Ability Capsule.- Certain Pokémon such as Zygarde and Rockruff have different forms to add additional abilities. As such, they cannot be changed using an Ability Capsule (though the Zygarde Cube can change Zygarde's ability by changing them to their corresponding form)
- The 3rd slot is for Hidden Abilities. If defined as
ABILITY_NONE
, it will default to Slot 1 (eg. Metapod doesn't have a Hidden Ability, but Caterpie and Butterfree do). Go here and here for more info.- If the array is defined as
{ABILITY_1, ABILITY_2}
, the Hidden Ability is set asABILITY_NONE
.
- If the array is defined as
- When both slot 1 and 2 are defined as not being
bodyColor
is used in the Pokédex as a search filter.noFlip
is used in to prevent front sprites from being flipped horizontally and cause weird issues, like Clawitzer's big claw changing sides.
That's all the basic fields present in vanilla emerald, so now let's take a look at the new fields added by the expansion.
4. Species Name
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.isLegendary = TRUE,
.allPerfectIVs = TRUE,
+ .speciesName = _("Mewthree"),
},
};
The _()
underscore function doesn't really exist - it's a convention borrowed from GNU gettext to let preproc
know this is text to be converted to the custom encoding used by the Gen 3 Pokemon games.
5. Define its cry
Time for audio! We first need to convert an existing audio file to the format supported by the expansion.
Most formats are supported for conversion, but for simplicity's sake, we're gonna use an mp3 file.
Now, let's copy the file to the sound/direct_sound_samples/cries
folder.
Once that's done, let's run the following command:
ffmpeg -i sound/direct_sound_samples/cries/mewthree.mp3 -c:a pcm_s8 -ac 1 -ar 13379 sound/direct_sound_samples/cries/mewthree.aif
This will convert your audio file to .aif, which is what's read by the compiler.
Let's add the cry to the ROM via sound/direct_sound_data.inc.
.if P_FAMILY_PECHARUNT == TRUE
.align 2
Cry_Pecharunt::
.incbin "sound/direct_sound_samples/cries/pecharunt.bin"
.endif @ P_FAMILY_PECHARUNT
+ .align 2
+Cry_Mewthree::
+ .incbin "sound/direct_sound_samples/cries/mewthree.bin"
Then we add the cry ID to include/constants/cries.h:
enum {
CRY_NONE,
...
#if P_FAMILY_TERAPAGOS
CRY_TERAPAGOS,
#endif //P_FAMILY_TERAPAGOS
#if P_FAMILY_PECHARUNT
CRY_PECHARUNT,
#endif //P_FAMILY_PECHARUNT
+ CRY_MEWTHREE,
CRY_COUNT,
};
And then link it in sound/cry_tables.inc. cry_reverse
in particular is for reversed cries used by moves such as Growl. The order of these two tables should match the order of the cry IDs, otherwise they'll be shifted.
cry Cry_Terapagos
cry Cry_Pecharunt
+ cry Cry_Mewthree
cry_reverse Cry_Terapagos
cry_reverse Cry_Pecharunt
+ cry_reverse Cry_Mewthree
Lastly, we add the cry to our species entry
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.isLegendary = TRUE,
.allPerfectIVs = TRUE,
.speciesName = _("Mewthree"),
+ .cryId = CRY_MEWTHREE,
},
};
And let's see how it sounds in-game:
Good! Our monster now has a mighty roar!
You can now delete the mp3 from the cries folder now once you made sure that the cry sounds like how you want it to.
6. Define its Pokédex entry
First, we will need to add new index constants for its Pokédex entry. The index constants are divided into the Hoenn Pokédex, which contains all Pokémon native to the Hoenn region, and the National Pokédex containing all known Pokémon, which can be received after entering the hall of fame for the first time.
Edit include/constants/pokedex.h:
// National Pokedex order
enum {
NATIONAL_DEX_NONE,
// Kanto
NATIONAL_DEX_BULBASAUR,
...
NATIONAL_DEX_PECHARUNT,
+ NATIONAL_DEX_MEWTHREE,
};
#define KANTO_DEX_COUNT NATIONAL_DEX_MEW
#define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI
#if P_GEN_9_POKEMON == TRUE
- #define NATIONAL_DEX_COUNT NATIONAL_DEX_PECHARUNT
+ #define NATIONAL_DEX_COUNT NATIONAL_DEX_MEWTHREE
Do keep in mind that if you intend to add your new species to the Hoenn Dex, you'll also want to add a HOENN_DEX
constant for it, like this:
// Hoenn Pokedex order
enum {
HOENN_DEX_NONE,
HOENN_DEX_TREECKO,
...
HOENN_DEX_DEOXYS,
+ HOENN_DEX_MEWTHREE,
};
- #define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1)
+ #define HOENN_DEX_COUNT (HOENN_DEX_MEWTHREE + 1)
Edit src/pokemon.c:
const u16 sHoennToNationalOrder[NUM_SPECIES] = // Assigns Hoenn Dex Pokémon (Using National Dex Index)
{
HOENN_TO_NATIONAL(TREECKO),
...
HOENN_TO_NATIONAL(DEOXYS),
+ HOENN_TO_NATIONAL(MEWTHREE),
};
Now we can add the number and entry to our Mewthree:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.cryId = CRY_MEWTHREE,
+ .natDexNum = NATIONAL_DEX_MEWTHREE,
+ .categoryName = _("New Species"),
+ .height = 15,
+ .weight = 330,
+ .description = COMPOUND_STRING(
+ "The rumors became true.\n"
+ "This is Mew's final form.\n"
+ "Its power level is over 9000.\n"
+ "Has science gone too far?"),
+ .pokemonScale = 256,
+ .pokemonOffset = 0,
+ .trainerScale = 290,
+ .trainerOffset = 2,
},
};
The values pokemonScale
, pokemonOffset
, trainerScale
and trainerOffset
are used for the height comparison figure in the Pokédex.
height
and weight
are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters).
In Pokémon Emerald, you can sort the Pokédex by name, height or weight. Apparently, the Pokémon order is hardcoded in the game files and not calculated from their data. Therefore we have to include our new Pokémon species at the right places. While the correct position for the alphabetical order is easy to find, it can become quite tedious for height and weight, so we added comments to the listings in order help out were they should fit.
Edit src/data/pokemon/pokedex_orders.h:
const u16 gPokedexOrder_Alphabetical[] =
{
...
NATIONAL_DEX_MEW,
+ NATIONAL_DEX_MEWTHREE,
NATIONAL_DEX_MEWTWO,
...
};
const u16 gPokedexOrder_Weight[] =
{
...
// 72.8 lbs / 33.0 kg
//NATIONAL_DEX_MEWTWO_MEGA_Y,
NATIONAL_DEX_ESCAVALIER,
NATIONAL_DEX_FRILLISH,
NATIONAL_DEX_DURANT,
NATIONAL_DEX_CINDERACE,
+ NATIONAL_DEX_MEWTHREE,
//NATIONAL_DEX_PERSIAN_ALOLAN,
NATIONAL_DEX_TOEDSCOOL,
// 73.4 lbs / 33.3 kg
NATIONAL_DEX_DUGTRIO,
...
};
const u16 gPokedexOrder_Height[] =
{
...
// 4'11" / 1.5m
...
NATIONAL_DEX_GLIMMORA,
NATIONAL_DEX_WO_CHIEN,
NATIONAL_DEX_IRON_LEAVES,
NATIONAL_DEX_IRON_BOULDER,
+ NATIONAL_DEX_MEWTHREE,
// 5'03" / 1.6m
...
};
The Graphics
We will start by copying the following files for Mew (not Mewtwo) and rename it to mewthree
.
cp -r graphics/pokemon/mew/. graphics/pokemon/mewthree
We aren't copying Mewtwo's folder because he has those pesky Mega Evolutions that will get in the way of what we're doing, so our sample will need to be pure from the source.
1. Edit the sprites
Let's edit the sprites. Start your favourite image editor (I recommend Aseprite or its free alternative, Libresprite) and change anim_front.png
and back.png
to meet your expectations.
Make sure that you are using the indexed mode and you have limited yourself to 15 colors!
Put the RGB values of your colors into normal.pal
between the first and the last color and the RGB values for the shiny version into shiny.pal
.
Edit footprint.png
using two colors in indexed mode, black and white.
Finally, edit icon.png
. Notice, that the icon will use one of 6 predefined palettes instead of normal.pal
.
2. Add the sprites to the rom
Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. First, create constants for the file paths. You'll want to add the constants for your species after the constants for the last valid species.
Edit src/data/graphics/pokemon.h:
#if P_FAMILY_PECHARUNT
// const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz");
// const u32 gMonPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/normal.gbapal.lz");
// const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz");
// const u32 gMonShinyPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/shiny.gbapal.lz");
// const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp");
#if P_FOOTPRINTS
// const u8 gMonFootprint_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/footprint.1bpp");
#endif //P_FOOTPRINTS
#endif //P_FAMILY_PECHARUNT
+ const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/anim_front.4bpp.lz");
+ const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz");
+ const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz");
+ const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz");
+ const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp");
+ const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp");
Please note that Pecharunt, the Pokémon that should be above your insertion for the time being, reads a front.png
sprite instead of an anim_front.png
sprite. This is because currently, Pecharunt lacks a 2nd frame. If the front sprite sheet of your species uses 2 frames, you should use anim_front
.
It is also worth to mention that Pecharunt's sprites are commented out simply because they're currently missing.
3. Add the animations to the rom
You can define the animation order, in which the sprites will be shown. The first number is the sprite index (so 0 or 1) and the second number is the number of frames the sprite will be visible.
Edit src/data/pokemon_graphics/front_pic_anims.h:
#if P_FAMILY_PECHARUNT
PLACEHOLDER_ANIM_SINGLE_FRAME(Pecharunt);
#endif //P_FAMILY_PECHARUNT
+static const union AnimCmd sAnim_Mewthree_1[] =
+{
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_END,
+};
#if P_FAMILY_PECHARUNT
SINGLE_ANIMATION(Pecharunt);
#endif //P_FAMILY_PECHARUNT
+SINGLE_ANIMATION(Mewthree);
SINGLE_ANIMATION(Egg);
You might be wondering what PLACEHOLDER_ANIM_SINGLE_FRAME
is. Well, since Pecharun only has 1 frame, we use what's called a preprocessor macro to have in a single line what otherwise would've been this in the C file:
static const union AnimCmd sAnim_Pecharunt_1[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
}
Instead, we can use the already established macro that does the same thing, replacing the value in parenthesis with what we want (in this case, Pecharunt
):
#define PLACEHOLDER_ANIM_SINGLE_FRAME(name) \
static const union AnimCmd sAnim_##name##_1[] = \
{ \
ANIMCMD_FRAME(0, 1), \
ANIMCMD_END, \
}
4. Linking graphic information to our Pokémon
Now that we have all the external data ready, we just need to add it to gSpeciesInfo
plus the rest of the animation and graphical data that we want to use:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.pokemonScale = 256,
.pokemonOffset = 0,
.trainerScale = 290,
.trainerOffset = 2,
+ .frontPic = gMonFrontPic_Mewthree,
+ .frontPicSize = MON_COORDS_SIZE(64, 64),
+ .frontPicYOffset = 0,
+ .frontAnimFrames = sAnims_Mewthree,
+ .frontAnimId = ANIM_GROW_VIBRATE,
+ .frontAnimDelay = 15,
+ .enemyMonElevation = 6,
+ .backPic = gMonBackPic_Mewthree,
+ .backPicSize = MON_COORDS_SIZE(64, 64),
+ .backPicYOffset = 0,
+ .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL,
+ .palette = gMonPalette_Mewthree,
+ .shinyPalette = gMonShinyPalette_Mewthree,
.iconSprite = gMonIcon_Mewthree,
.iconPalIndex = 2,
+ FOOTPRINT(Mewthree)
},
};
Let's explain each of these:
frontPic
:- Used to reference the front sprite, so in this case, we call for
gMonFrontPic_Mewthree
.
- Used to reference the front sprite, so in this case, we call for
frontPicSize
:- The two values (
width
andheight
) are used for defining the non-empty size of the front sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64.
- The two values (
frontPicYOffset
:- Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see
enemyMonElevation
.
- Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see
frontAnimFrames
:- We link our animation frame animations that we defined earlier here.
frontAnimId
:- Because you are limited to two frames, there are already predefined front sprite animations, describing translations, rotations, scalings or color changes.
frontAnimDelay
:- Sets a delay in frame count between when the Pokémon appears and when the animation starts.
enemyMonElevation
:- Used to determine the altitude from the ground. Any value above 0 will show a shadow under the Pokémon, to signify that they're floating.
backPic
:- Used to reference the back sprite, so in this case, we call for
gMonBackPic_Mewthree
.
- Used to reference the back sprite, so in this case, we call for
backPicSize
:- The two values (
width
andheight
) are used for defining the non-empty size of the back sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64.
- The two values (
backPicYOffset
:- Used to define what Y position of the back sprite. When working with the animation debug menu, we recommend aligning the back sprite to the white background, as it was designed to properyly align with the real battle layout.
backAnimId
:- Like
frontAnimId
except for the back sprites and them being a single frame. The IDs listed here are used to represent 3 different animations that happen based on the the Pokémon's nature.
- Like
palette
:- Used to reference the non-shiny palette, so in this case, we call for
gMonPalette_Mewthree
.
- Used to reference the non-shiny palette, so in this case, we call for
shinyPalette
:- Used to reference the shiny palette, so in this case, we call for
gMonShinyPalette_Mewthree
.
- Used to reference the shiny palette, so in this case, we call for
iconSprite
:- Used to reference the icon sprite, so in this case, we call for
gMonIcon_Mewthree
.
- Used to reference the icon sprite, so in this case, we call for
iconPalIndex
:ICON
-
Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in
graphics/pokemon/icon_palettes
.Open an icon sprite and load one of the palettes to find out which palette suits your icon sprite best.
-
FOOTPRINT
- We made this single field into a macro so that they can be ignored when
P_FOOTPRINTS
is set to false. It's also why we don't have an "," after calling it like the other macros (we add it as part of the macro itself).#if P_FOOTPRINTS #define FOOTPRINT(sprite) .footprint = gMonFootprint_## sprite, #else #define FOOTPRINT(sprite) #endif
- We made this single field into a macro so that they can be ignored when
The Data - Part 2
We're almost there just a bit left!
1. Species Flags
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE },
.bodyColor = BODY_COLOR_PURPLE,
+ .isLegendary = TRUE,
+ .allPerfectIVs = TRUE,
},
};
Each species flag provides properties to the species:
isLegendary
:- Guarantees 3 perfect IVs upon generating the Pokémon*.
isMythical
:- Guarantees 3 perfect IVs upon generating the Pokémon*.
- Is skipped during Pokédex evaluations.
- Unless it also has the
dexForceRequired
flag.
- Unless it also has the
- Cannot obtain Gigantamax factor via
ToggleGigantamaxFactor
.
isUltraBeast
:- Guarantees 3 perfect IVs upon generating the Pokémon*.
- Beast Ball's multiplier is set to x5 for this species.
- All other ball multipliers are set to x0.1.
isParadoxForm
:- Currently has no functionality but can be utilized by users for their own benefits.
isMegaEvolution
:- A Mega indicator is added to the battle box indicating that they're Mega Evolved.
- The species doesn't receive affection benefits.
- Required when adding new Mega Evolutions.
isPrimalReversion
:- A Primal Reversion indicator (Alpha or Omega for Kyogre/Groudon respectively) is added to the battle box indicating that they're Primal Reverted.
- Required when adding new Primal Reversions.
isUltraBurst
:- Required when adding new Ultra Burst forms.
isGigantamax
:- Used to determine if Gigantamax forms should have their GMax moves or not.
- Required when adding new Gigantamax forms.
isAlolanForm
,isGalarianForm
,isHisuianForm
,isPaldeanForm
:- In the future, these will be used to determine breeding offspring from different based on their region.
cannotBeTraded
:- This species cannot be traded away (like Black/White Kyurem).
allPerfectIVs
:- Guarantees 6 perfect IVs upon generating the Pokémon (like LGPE's Partner Pikachu and Eevee).
tmIlliterate
:- This species will be unable to learn the universal moves.
*: As long as P_LEGENDARY_PERFECT_IVS
is set to GEN_6
or higher.
2. Delimit the moveset
Let's begin with the moves that can be learned by leveling up.
Append to src/data/pokemon/level_up_learnsets.h:
#if P_FAMILY_PECHARUNT
static const struct LevelUpMove sPecharuntLevelUpLearnset[] = {
LEVEL_UP_MOVE( 1, MOVE_SMOG),
LEVEL_UP_MOVE( 1, MOVE_POISON_GAS),
LEVEL_UP_MOVE( 1, MOVE_MEMENTO),
LEVEL_UP_MOVE( 1, MOVE_ASTONISH),
LEVEL_UP_MOVE( 8, MOVE_WITHDRAW),
LEVEL_UP_MOVE(16, MOVE_DESTINY_BOND),
LEVEL_UP_MOVE(24, MOVE_FAKE_TEARS),
LEVEL_UP_MOVE(32, MOVE_PARTING_SHOT),
LEVEL_UP_MOVE(40, MOVE_SHADOW_BALL),
LEVEL_UP_MOVE(48, MOVE_MALIGNANT_CHAIN),
LEVEL_UP_MOVE(56, MOVE_TOXIC),
LEVEL_UP_MOVE(64, MOVE_NASTY_PLOT),
LEVEL_UP_MOVE(72, MOVE_RECOVER),
LEVEL_UP_END
};
#endif
+static const struct LevelUpMove sMewthreeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE( 1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE( 1, MOVE_DISABLE),
+ LEVEL_UP_MOVE(11, MOVE_BARRIER),
+ LEVEL_UP_MOVE(22, MOVE_SWIFT),
+ LEVEL_UP_MOVE(33, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(44, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(55, MOVE_MIST),
+ LEVEL_UP_MOVE(66, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(77, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(88, MOVE_RECOVER),
+ LEVEL_UP_MOVE(99, MOVE_SAFEGUARD),
+ LEVEL_UP_END
+};
Again, we need to register the learnset in gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
PALETTES(Mewthree),
ICON(Mewthree, 2),
FOOTPRINT(Mewthree)
+ .levelUpLearnset = sMewthreeLevelUpLearnset,
},
};
Next we need to specify which moves can be taught via TM, HM, or Move Tutor.
Append to src/data/pokemon/teachable_learnsets.h:
#if P_FAMILY_PECHARUNT
static const u16 sPecharuntTeachableLearnset[] = {
...
MOVE_UNAVAILABLE,
};
#endif //P_FAMILY_PECHARUNT
+static const u16 sMewthreeTeachableLearnset[] = {
+ MOVE_FOCUS_PUNCH,
+ MOVE_WATER_PULSE,
+ MOVE_CALM_MIND,
+ MOVE_TOXIC,
+ MOVE_HAIL,
+ MOVE_BULK_UP,
+ MOVE_HIDDEN_POWER,
+ MOVE_SUNNY_DAY,
+ MOVE_TAUNT,
+ MOVE_ICE_BEAM,
+ MOVE_BLIZZARD,
+ MOVE_HYPER_BEAM,
+ MOVE_LIGHT_SCREEN,
+ MOVE_PROTECT,
+ MOVE_RAIN_DANCE,
+ MOVE_SAFEGUARD,
+ MOVE_FRUSTRATION,
+ MOVE_SOLAR_BEAM,
+ MOVE_IRON_TAIL,
+ MOVE_THUNDERBOLT,
+ MOVE_THUNDER,
+ MOVE_EARTHQUAKE,
+ MOVE_RETURN,
+ MOVE_PSYCHIC,
+ MOVE_SHADOW_BALL,
+ MOVE_BRICK_BREAK,
+ MOVE_DOUBLE_TEAM,
+ MOVE_REFLECT,
+ MOVE_SHOCK_WAVE,
+ MOVE_FLAMETHROWER,
+ MOVE_SANDSTORM,
+ MOVE_FIRE_BLAST,
+ MOVE_ROCK_TOMB,
+ MOVE_AERIAL_ACE,
+ MOVE_TORMENT,
+ MOVE_FACADE,
+ MOVE_SECRET_POWER,
+ MOVE_REST,
+ MOVE_SKILL_SWAP,
+ MOVE_SNATCH,
+ MOVE_STRENGTH,
+ MOVE_FLASH,
+ MOVE_ROCK_SMASH,
+ MOVE_MEGA_PUNCH,
+ MOVE_MEGA_KICK,
+ MOVE_BODY_SLAM,
+ MOVE_DOUBLE_EDGE,
+ MOVE_COUNTER,
+ MOVE_SEISMIC_TOSS,
+ MOVE_MIMIC,
+ MOVE_METRONOME,
+ MOVE_DREAM_EATER,
+ MOVE_THUNDER_WAVE,
+ MOVE_SUBSTITUTE,
+ MOVE_DYNAMIC_PUNCH,
+ MOVE_PSYCH_UP,
+ MOVE_SNORE,
+ MOVE_ICY_WIND,
+ MOVE_ENDURE,
+ MOVE_MUD_SLAP,
+ MOVE_ICE_PUNCH,
+ MOVE_SWAGGER,
+ MOVE_SLEEP_TALK,
+ MOVE_SWIFT,
+ MOVE_THUNDER_PUNCH,
+ MOVE_FIRE_PUNCH,
+ MOVE_UNAVAILABLE, // This is required to determine where the array ends.
+};
#endif
Once more, we need to register the learnset in gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
FOOTPRINT(Mewthree)
.levelUpLearnset = sMewthreeLevelUpLearnset,
+ .teachableLearnset = sMewthreeTeachableLearnset,
},
};
If you want to create a Pokémon which can breed, you will need to edit src/data/pokemon/egg_moves.h.
3. Define the Evolutions
We want Mewthree to evolve from Mewtwo by reaching level 100.
Edit gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTWO] =
{
...
FOOTPRINT(Mewtwo)
.isLegendary = TRUE,
.levelUpLearnset = sMewtwoLevelUpLearnset,
.teachableLearnset = sMewtwoTeachableLearnset,
.formSpeciesIdTable = sMewtwoFormSpeciesIdTable,
.formChangeTable = sMewtwoFormChangeTable,
+ .evolutions = EVOLUTION({EVO_LEVEL, 100, SPECIES_MEWTHREE}),
},
};
4. Make it appear!
Now Mewthree really does slumber in the games code - but we won't know until we make him appear somewhere! The legend tells that Mewthree is hiding somewhere in Petalburg Woods...
Edit src/data/wild_encounters.json:
{
"map": "MAP_PETALBURG_WOODS",
"base_label": "gPetalburgWoods",
"land_mons": {
"encounter_rate": 20,
"mons": [
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_POOCHYENA"
},
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_WURMPLE"
},
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_SHROOMISH"
},
{
- "min_level": 6,
- "max_level": 6,
- "species": "SPECIES_POOCHYENA"
+ "min_level": 5,
+ "max_level": 5,
+ "species": "SPECIES_MEWTHREE"
},
...
}
Congratulations, you have created your own personal pocket monster! You may call yourself a mad scientist now.
Optional data
Now that you now have all the essential pieces to create a base species, there are some aspects that you might want to know if you want to do other stuff with your custom Pokémon.
1. Form tables
Found in src/data/pokemon/form_species_tables.h
.
These are introduced to have a reference of what forms correspond to what Species of Pokémon. For example, we have Pikachu's table:
#if P_FAMILY_PIKACHU
static const u16 sPikachuFormSpeciesIdTable[] = {
SPECIES_PIKACHU,
SPECIES_PIKACHU_COSPLAY,
SPECIES_PIKACHU_ROCK_STAR,
SPECIES_PIKACHU_BELLE,
SPECIES_PIKACHU_POP_STAR,
SPECIES_PIKACHU_PH_D,
SPECIES_PIKACHU_LIBRE,
SPECIES_PIKACHU_ORIGINAL_CAP,
SPECIES_PIKACHU_HOENN_CAP,
SPECIES_PIKACHU_SINNOH_CAP,
SPECIES_PIKACHU_UNOVA_CAP,
SPECIES_PIKACHU_KALOS_CAP,
SPECIES_PIKACHU_ALOLA_CAP,
SPECIES_PIKACHU_PARTNER_CAP,
SPECIES_PIKACHU_WORLD_CAP,
FORM_SPECIES_END,
};
#endif //P_FAMILY_PIKACHU
We register the table each form entry in gSpeciesInfo
.
[SPECIES_PIKACHU] =
{
...
.teachableLearnset = sPikachuTeachableLearnset,
+ .formSpeciesIdTable = sPikachuFormSpeciesIdTable,
.evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU},
{EVO_NONE, 0, SPECIES_RAICHU_ALOLAN}),
},
[SPECIES_PIKACHU_COSPLAY] =
{
...
.teachableLearnset = sPikachuTeachableLearnset,
+ .formSpeciesIdTable = sPikachuFormSpeciesIdTable,
},
...and so on.
What this allows us to do is to be able to get all forms of a Pokémon in our code by using the GetSpeciesFormTable
function.
For example, in the HGSS dex, it lets us browse between the entries of every form available.:
In addition, we have the GET_BASE_SPECIES_ID
macro, which returns the first entry of the table (or return the species itself if it doesn't have a table registered). With this, you can check if a Pokémon is any form of a species. For example, making it so that the Light Ball affects all Pikachu forms:
case HOLD_EFFECT_LIGHT_BALL:
if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PIKACHU && IS_MOVE_SPECIAL(move))
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0));
break;
2. Form change tables
Found in src/data/pokemon/form_species_tables.h
.
These tables, unlike the regular form tables, registers how Pokémon can switch between forms.
#if P_FAMILY_GASTLY
static const struct FormChange sGengarFormChangeTable[] = {
{FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE},
{FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GIGANTAMAX},
{FORM_CHANGE_TERMINATOR},
};
#endif //P_FAMILY_GASTLY
The first value is the type of form change. In the case of Gengar, we have both Mega Evolution and Gigantamax form changes.
The second value is the target form, to which the Pokémon will change into.
Values after that are referred as arguments, and needs to be put there depends on the type of form change, detailed in include/constants/form_change_types.h
.
3. Gender differences
You may have seen that there's a couple of duplicate fields with a "Female" suffix.
[SPECIES_FRILLISH] =
{
...
.frontPic = gMonFrontPic_Frillish,
+ .frontPicFemale = gMonFrontPic_FrillishF,
.frontPicSize = MON_COORDS_SIZE(56, 56),
+ .frontPicSizeFemale = MON_COORDS_SIZE(56, 56),
.frontPicYOffset = 5,
.frontAnimFrames = sAnims_Frillish,
.frontAnimId = ANIM_RISING_WOBBLE,
.backPic = gMonBackPic_Frillish,
+ .backPicFemale = gMonBackPic_FrillishF,
.backPicSize = MON_COORDS_SIZE(40, 56),
+ .backPicSizeFemale = MON_COORDS_SIZE(40, 56),
.backPicYOffset = 7,
.backAnimId = BACK_ANIM_CONVEX_DOUBLE_ARC,
.palette = gMonPalette_Frillish,
+ .paletteFemale = gMonPalette_FrillishF,
.shinyPalette = gMonShinyPalette_Frillish,
+ .shinyPaletteFemale = gMonShinyPalette_FrillishF,
.iconSprite = gMonIcon_Frillish,
+ .iconSpriteFemale = gMonIcon_FrillishF,
.iconPalIndex = 0,
+ .iconPalIndexFemale = 1,
FOOTPRINT(Frillish)
.levelUpLearnset = sFrillishLevelUpLearnset,
.teachableLearnset = sFrillishTeachableLearnset,
.evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_JELLICENT}),
},
These are used to change the graphics of the Pokémon if they're female. If they're not registered, they default to the male values.
However, iconPalIndexFemale
is a special case, where it's doesn't read the male icon palette if its iconSpriteFemale
is set, so if you're setting a female icon, be sure to set their palette index as well.
This is a modified version of the original tutorial about adding new Pokémon species available in Pokeemerald's wiki.
Despite the persistent rumors about an incredibly strong third form of Mew hiding somewhere, it actually wasn't possible to catch it... OR WAS IT? In this tutorial, we will add a new Pokémon species to the game.
IMPORTANT: This tutorial applies to 1.7.x versions.
Changes compared to vanilla
The main things that the Expansion changes are listed here.
- Still Front Pics (
gMonStillFrontPic_YourPokemon
) and by extensionsrc/anim_mon_front_pics.c
have been removed. src/data/pokemon/cry_ids.h
doesn't exist anymore.- You have 6 icon palettes available instead of the base 3.
- Most tables that use
SPECIES_x
as indexes have been moved togSpeciesInfo
.
Content
Useful resources
You can open a sprite debug menu by pressing Select
in a Pokémon's summary screen outside of battle.
The Data - Part 1
Our plan is as simple as it is brilliant: clone Mewtwo... and make it even stronger!
1. Declare a species constant
Our first step towards creating a new digital lifeform is to define its own species constant.
Edit include/constants/species.h:
#define SPECIES_NONE 0
#define SPECIES_BULBASAUR 1
...
#define SPECIES_EEVEE_PARTNER PLACEHOLDER_START + 54
+#define SPECIES_MEWTHREE PLACEHOLDER_START + 55
-#define GIGANTAMAX_START SPECIES_EEVEE_PARTNER
+#define GIGANTAMAX_START SPECIES_MEWTHREE
// Gigantamax Forms
#define SPECIES_VENUSAUR_GIGANTAMAX GIGANTAMAX_START + 1
This number is stored in a Pokémon's save structure. These should generally never change, otherwise your saved Pokémon species will change as well.
We add this before Gigantamax forms because they're temporary forms that shouldn't normally be saved into a Pokémon's save structure.
Now, let's see how it looks in-game!
Hmmm, something's not right...
Oh, I know! We need to add the rest of the data! Normally, the vanilla game would crash if we try to look up anything about Mewthree in this state, but the expansion defaults all of its data to SPECIES_NONE
.
Now, let's see what needs to be done.
2. SpeciesInfo
's structure
Now, to better understand Mewtwo, we also need to understand Mew. Let's look at its data.
[SPECIES_MEW] =
{
.baseHP = 100,
.baseAttack = 100,
.baseDefense = 100,
.baseSpeed = 100,
.baseSpAttack = 100,
.baseSpDefense = 100,
.types = { TYPE_PSYCHIC, TYPE_PSYCHIC },
.catchRate = 45,
#if P_UPDATED_EXP_YIELDS >= GEN_8
.expYield = 300,
#elif P_UPDATED_EXP_YIELDS >= GEN_5
.expYield = 270,
#else
.expYield = 64,
#endif
.evYield_HP = 3,
.itemCommon = ITEM_LUM_BERRY,
.itemRare = ITEM_LUM_BERRY,
.genderRatio = MON_GENDERLESS,
.eggCycles = 120,
.friendship = 100,
.growthRate = GROWTH_MEDIUM_SLOW,
.eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED },
.abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE },
.bodyColor = BODY_COLOR_PINK,
.isMythical = TRUE,
.speciesName = _("Mew"),
.cryId = CRY_MEW,
.natDexNum = NATIONAL_DEX_MEW,
.categoryName = _("New Species"),
.height = 4,
.weight = 40,
.description = COMPOUND_STRING(
"A Mew is said to possess the genes of all\n"
"Pokémon. It is capable of making itself\n"
"invisible at will, so it entirely avoids\n"
"notice even if it approaches people."),
.pokemonScale = 457,
.pokemonOffset = -2,
.trainerScale = 256,
.trainerOffset = 0,
FRONT_PIC(Mew, 64, 48),
.frontPicYOffset = 9,
.frontAnimFrames = sAnims_Mew,
.frontAnimId = ANIM_ZIGZAG_SLOW,
.enemyMonElevation = 11,
BACK_PIC(Mew, 64, 64),
.backPicYOffset = 0,
.backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL,
PALETTES(Mew),
ICON(Mew, 0),
FOOTPRINT(Mew)
LEARNSETS(Mew),
},
That's a lot of stuff! But don't worry, we'll go through it step by step throught the tutorial (and miles better than having this same data through 20+ files like it used to be).
We'll start by adding the self-explanatory data that's also present in pret's vanilla structure:
3. Define its basic species information
Edit src/data/pokemon/species_info.h:
const struct SpeciesInfo gSpeciesInfo[] =
{
[SPECIES_NONE] = {0},
...
[SPECIES_EGG] =
{
FRONT_PIC(Egg, 24, 24),
.frontPicYOffset = 20,
.backPic = gMonFrontPic_Egg,
.backPicSize = MON_COORDS_SIZE(24, 24),
.backPicYOffset = 20,
.palette = gMonPalette_Egg,
.shinyPalette = gMonPalette_Egg,
ICON(Egg, 1),
},
+ [SPECIES_MEWTHREE] =
+ {
+ .baseHP = 106,
+ .baseAttack = 150,
+ .baseDefense = 70,
+ .baseSpeed = 140,
+ .baseSpAttack = 194,
+ .baseSpDefense = 120,
+ .types = { TYPE_PSYCHIC, TYPE_PSYCHIC },
+ .catchRate = 3,
+ .expYield = 255,
+ .evYield_SpAttack = 3,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 0,
+ .growthRate = GROWTH_SLOW,
+ .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED },
+ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE },
+ .bodyColor = BODY_COLOR_PURPLE,
+ },
};
The .
is the structure reference operator in C to refer to the member object of the structure SpeciesInfo.
baseHP
,baseAttack
,baseDefense
,baseSpeed
,baseSpAttack
andbaseSpDefense
are the base stats. They can't go higher than 255.- You may be confused as to why
types
hasTYPE_PSYCHIC
twice. This is because the way the game determines single-type mon is to define both types the same.- If we don't, it defaults to Normal due to it being the first type defined.
catchRate
is how likely it is to catch a Pokémon, the lower the value, the harder it is to catch. Legendaries generally have a catch rate of 3, so we put that here.expYield
is the base amount of experience that a Pokémon gives when defeated/caught. In vanilla, this value caps at 255, but we've increased it to a maximum of 65535 accomodate later gen's higher experience yields. (The highest official value is Blissey's with 608, so going beyond this point may cause exponential gains that could break the system 😱)- If you noticed, Mew's had some
#if
s,#elif
s and#endif
around it. This is because its yield has changed over time, and we let you choose which ones you want. This is not relevant to our Mewthree however, so we can just put a single.expYield = 255,
line here.
- If you noticed, Mew's had some
evYield_HP
,evYield_Attack
,evYield_Defense
,evYield_Speed
,evYield_SpAttack
andevYield_SpDefense
are how many EVs does the Pokémon give when they're caught. Each of these fields can have a value of 3 at most. Officially, no Pokémon give out more than 3 EVs total, with them being determined by their evolution stage (eg, Pichu, Pikachu and Raichu give 1, 2 and 3 Speed EVs respectively), and they tend to be associated with its higher stats. Since our Mewthree is a Special Attack monster, we'll be consistent and make it give out 3 Special Attack EVs, but you're always free to assign whatever you feel like :)- Notice that the other
evYield
fields are not there. In C, numbers in a struct default to 0, so if we don't specify them, they'll be 0 all around! Less lines to worry about :D
- Notice that the other
itemCommon
anditemRare
are used to determine what items is the Pokémon holding when encountering it in the wild.- 50% for
itemCommon
and 5% foritemRare
(boosted to 60%/20% when the first mon in the party has Compound Grass or Super Luck) - If they're both set as the same item, the item has a 100% chance of appearing.
- 50% for
genderRatio
is a fun one.- There are 4 ways of handling this
PERCENT_FEMALE
is what most Pokémon use, where you define how likely it's gonna be female. It supports decimals, so you can putPERCENT_FEMALE(12.5)
to have a 1 in 8 chance of your mon to be female.MON_MALE
guarantees that all mon of this species will be male (eg. Tauros)MON_FEMALE
guarantees that all mon of this species will be female (eg. Miltank)MON_GENDERLESS
makes your species genderless, unable to breed with anything but Ditto to produce eggs. Most Legendaries are this, so we'll be chosing this as Mewthree's gender ratio.
- When working with evolution lines and don't want their genders to change after evolving, be sure that their gender ratios match their stages and evolution methods. Azurill is the only case where there's a mismatch, causing 1/3 of all Azurill to change from Female to Male.
- You might be wondering why some species have multiple defines for their genders, like
SPECIES_MEOWSTIC_(FE)MALE
. This is because those species have different stats and data from each other, so they're defined internally as different forms withMON_MALE
andMON_FEMALE
as gender ratios. If your species evolves depending on its gender and the evolutions have different stats, be sure to apply the correct evolution method!
- There are 4 ways of handling this
eggCycles
determines how fast an egg of this species will hatch. Doesn't matter much for evolved species or those that can't lay eggs, but we add the field here just in case.friendship
determines the amount of friendship of the mon when you catch it. Most Pokémon useSTANDARD_FRIENDSHIP
, but this creature of chaos does not want to be your friend, starting with 0.growthRate
determines the amounts of experience required to reach each level. Go here for more info.eggGroups
are used for breed compatibility. Most Legendaries and Mythicals have theEGG_GROUP_NO_EGGS_DISCOVERED
group, and so does our Mewthree. Go here for more info.abilities
determines the potential abilites of our species. Notice how I also set the ability toABILITY_INSOMNIA
, so our little monster doesn't even need to sleep anymore. You can find the abilities for example here include/constants/abilities.h.- When both slot 1 and 2 are defined as not being
ABILITY_NONE
, their starting ability will be decided on a coin flip using their personality. They can later be changed using an Ability Capsule.- Certain Pokémon such as Zygarde and Rockruff have different forms to add additional abilities. As such, they cannot be changed using an Ability Capsule (though the Zygarde Cube can change Zygarde's ability by changing them to their corresponding form)
- The 3rd slot is for Hidden Abilities. If defined as
ABILITY_NONE
, it will default to Slot 1 (eg. Metapod doesn't have a Hidden Ability, but Caterpie and Butterfree do). Go here and here for more info.- If the array is defined as
{ABILITY_1, ABILITY_2}
, the Hidden Ability is set asABILITY_NONE
.
- If the array is defined as
- When both slot 1 and 2 are defined as not being
bodyColor
is used in the Pokédex as a search filter.noFlip
is used in to prevent front sprites from being flipped horizontally and cause weird issues, like Clawitzer's big claw changing sides.
That's all the basic fields present in vanilla emerald, so now let's take a look at the new fields added by the expansion.
4. Species Name
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.isLegendary = TRUE,
.allPerfectIVs = TRUE,
+ .speciesName = _("Mewthree"),
},
};
The _()
underscore function doesn't really exist - it's a convention borrowed from GNU gettext to let preproc
know this is text to be converted to the custom encoding used by the Gen 3 Pokemon games.
5. Define its cry
Time for audio! We first need to convert an existing audio file to the format supported by the expansion.
Most formats are supported for conversion, but for simplicity's sake, we're gonna use this mp3 file.
Now, let's copy the file to the sound/direct_sound_samples/cries
folder.
Once that's done, let's run the following command:
ffmpeg -i sound/direct_sound_samples/cries/mewthree.mp3 -c:a pcm_s8 -ac 1 -ar 13379 sound/direct_sound_samples/cries/mewthree.aif
This will convert your audio file to .aif, which is what's read by the compiler.
Let's add the cry to the ROM via sound/direct_sound_data.inc.
.if P_FAMILY_PECHARUNT == TRUE
.align 2
Cry_Pecharunt::
.incbin "sound/direct_sound_samples/cries/pecharunt.bin"
.endif @ P_FAMILY_PECHARUNT
+ .align 2
+Cry_Mewthree::
+ .incbin "sound/direct_sound_samples/cries/mewthree.bin"
Then we add the cry ID to include/constants/cries.h:
enum {
CRY_NONE,
...
#if P_FAMILY_TERAPAGOS
CRY_TERAPAGOS,
#endif //P_FAMILY_TERAPAGOS
#if P_FAMILY_PECHARUNT
CRY_PECHARUNT,
#endif //P_FAMILY_PECHARUNT
+ CRY_MEWTHREE,
CRY_COUNT,
};
And then link it in sound/cry_tables.inc. cry_reverse
in particular is for reversed cries used by moves such as Growl. The order of these two tables should match the order of the cry IDs, otherwise they'll be shifted.
cry Cry_Terapagos
cry Cry_Pecharunt
+ cry Cry_Mewthree
cry_reverse Cry_Terapagos
cry_reverse Cry_Pecharunt
+ cry_reverse Cry_Mewthree
Lastly, we add the cry to our species entry
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.isLegendary = TRUE,
.allPerfectIVs = TRUE,
.speciesName = _("Mewthree"),
+ .cryId = CRY_MEWTHREE,
},
};
And let's see how it sounds in-game:
Good! Our monster now has a mighty roar!
You can now delete the mp3 from the cries folder now once you made sure that the cry sounds like how you want it to.
6. Define its Pokédex entry
First, we will need to add new index constants for its Pokédex entry. The index constants are divided into the Hoenn Pokédex, which contains all Pokémon native to the Hoenn region, and the National Pokédex containing all known Pokémon, which can be received after entering the hall of fame for the first time.
Edit include/constants/pokedex.h:
// National Pokedex order
enum {
NATIONAL_DEX_NONE,
// Kanto
NATIONAL_DEX_BULBASAUR,
...
NATIONAL_DEX_PECHARUNT,
+ NATIONAL_DEX_MEWTHREE,
};
#define KANTO_DEX_COUNT NATIONAL_DEX_MEW
#define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI
#if P_GEN_9_POKEMON == TRUE
- #define NATIONAL_DEX_COUNT NATIONAL_DEX_PECHARUNT
+ #define NATIONAL_DEX_COUNT NATIONAL_DEX_MEWTHREE
Do keep in mind that if you intend to add your new species to the Hoenn Dex, you'll also want to add a HOENN_DEX
constant for it, like this:
// Hoenn Pokedex order
enum {
HOENN_DEX_NONE,
HOENN_DEX_TREECKO,
...
HOENN_DEX_DEOXYS,
+ HOENN_DEX_MEWTHREE,
};
- #define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1)
+ #define HOENN_DEX_COUNT (HOENN_DEX_MEWTHREE + 1)
Edit src/pokemon.c:
const u16 sHoennToNationalOrder[NUM_SPECIES] = // Assigns Hoenn Dex Pokémon (Using National Dex Index)
{
HOENN_TO_NATIONAL(TREECKO),
...
HOENN_TO_NATIONAL(DEOXYS),
+ HOENN_TO_NATIONAL(MEWTHREE),
};
Now we can add the number and entry to our Mewthree:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.cryId = CRY_MEWTHREE,
+ .natDexNum = NATIONAL_DEX_MEWTHREE,
+ .categoryName = _("New Species"),
+ .height = 15,
+ .weight = 330,
+ .description = COMPOUND_STRING(
+ "The rumors became true.\n"
+ "This is Mew's final form.\n"
+ "Its power level is over 9000.\n"
+ "Has science gone too far?"),
+ .pokemonScale = 256,
+ .pokemonOffset = 0,
+ .trainerScale = 290,
+ .trainerOffset = 2,
},
};
The values pokemonScale
, pokemonOffset
, trainerScale
and trainerOffset
are used for the height comparison figure in the Pokédex.
height
and weight
are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters).
In Pokémon Emerald, you can sort the Pokédex by name, height or weight. Apparently, the Pokémon order is hardcoded in the game files and not calculated from their data. Therefore we have to include our new Pokémon species at the right places. While the correct position for the alphabetical order is easy to find, it can become quite tedious for height and weight, so we added comments to the listings in order help out were they should fit.
Edit src/data/pokemon/pokedex_orders.h:
const u16 gPokedexOrder_Alphabetical[] =
{
...
NATIONAL_DEX_MEW,
+ NATIONAL_DEX_MEWTHREE,
NATIONAL_DEX_MEWTWO,
...
};
const u16 gPokedexOrder_Weight[] =
{
...
// 72.8 lbs / 33.0 kg
//NATIONAL_DEX_MEWTWO_MEGA_Y,
NATIONAL_DEX_ESCAVALIER,
NATIONAL_DEX_FRILLISH,
NATIONAL_DEX_DURANT,
NATIONAL_DEX_CINDERACE,
+ NATIONAL_DEX_MEWTHREE,
//NATIONAL_DEX_PERSIAN_ALOLAN,
NATIONAL_DEX_TOEDSCOOL,
// 73.4 lbs / 33.3 kg
NATIONAL_DEX_DUGTRIO,
...
};
const u16 gPokedexOrder_Height[] =
{
...
// 4'11" / 1.5m
...
NATIONAL_DEX_GLIMMORA,
NATIONAL_DEX_WO_CHIEN,
NATIONAL_DEX_IRON_LEAVES,
NATIONAL_DEX_IRON_BOULDER,
+ NATIONAL_DEX_MEWTHREE,
// 5'03" / 1.6m
...
};
The Graphics
We will start by copying the following files for Mew (not Mewtwo) and rename it to mewthree
.
cp -r graphics/pokemon/mew/. graphics/pokemon/mewthree
We aren't copying Mewtwo's folder because he has those pesky Mega Evolutions that will get in the way of what we're doing, so our sample will need to be pure from the source.
1. Edit the sprites
Let's edit the sprites. Start your favourite image editor (I recommend Aseprite or its free alternative, Libresprite) and change anim_front.png
and back.png
to meet your expectations.
Make sure that you are using the indexed mode and you have limited yourself to 15 colors!
Put the RGB values of your colors into normal.pal
between the first and the last color and the RGB values for the shiny version into shiny.pal
.
Edit footprint.png
using two colors in indexed mode, black and white.
Finally, edit icon.png
. Notice, that the icon will use one of 6 predefined palettes instead of normal.pal
.
2. Add the sprites to the rom
Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. First, create constants for the file paths. You'll want to add the constants for your species after the constants for the last valid species.
Edit src/data/graphics/pokemon.h:
#if P_FAMILY_PECHARUNT
// const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz");
// const u32 gMonPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/normal.gbapal.lz");
// const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz");
// const u32 gMonShinyPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/shiny.gbapal.lz");
// const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp");
#if P_FOOTPRINTS
// const u8 gMonFootprint_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/footprint.1bpp");
#endif //P_FOOTPRINTS
#endif //P_FAMILY_PECHARUNT
+ const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/anim_front.4bpp.lz");
+ const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz");
+ const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz");
+ const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz");
+ const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp");
+ const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp");
Please note that Pecharunt, the Pokémon that should be above your insertion for the time being, reads a front.png
sprite instead of an anim_front.png
sprite. This is because currently, Pecharunt lacks a 2nd frame. If the front sprite sheet of your species uses 2 frames, you should use anim_front
.
It is also worth to mention that Pecharunt's sprites are commented out simply because they're currently missing.
3. Add the animations to the rom
You can define the animation order, in which the sprites will be shown. The first number is the sprite index (so 0 or 1) and the second number is the number of frames the sprite will be visible.
Edit src/data/pokemon_graphics/front_pic_anims.h:
#if P_FAMILY_PECHARUNT
PLACEHOLDER_ANIM_SINGLE_FRAME(Pecharunt);
#endif //P_FAMILY_PECHARUNT
+static const union AnimCmd sAnim_Mewthree_1[] =
+{
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_END,
+};
#if P_FAMILY_PECHARUNT
SINGLE_ANIMATION(Pecharunt);
#endif //P_FAMILY_PECHARUNT
+SINGLE_ANIMATION(Mewthree);
SINGLE_ANIMATION(Egg);
You might be wondering what PLACEHOLDER_ANIM_SINGLE_FRAME
is. Well, since Pecharun only has 1 frame, we use what's called a preprocessor macro to have in a single line what otherwise would've been this in the C file:
static const union AnimCmd sAnim_Pecharunt_1[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
}
Instead, we can use the already established macro that does the same thing, replacing the value in parenthesis with what we want (in this case, Pecharunt
):
#define PLACEHOLDER_ANIM_SINGLE_FRAME(name) \
static const union AnimCmd sAnim_##name##_1[] = \
{ \
ANIMCMD_FRAME(0, 1), \
ANIMCMD_END, \
}
4. Linking graphic information to our Pokémon
Now that we have all the external data ready, we just need to add it to gSpeciesInfo
plus the rest of the animation and graphical data that we want to use:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.pokemonScale = 256,
.pokemonOffset = 0,
.trainerScale = 290,
.trainerOffset = 2,
+ FRONT_PIC(Mewthree, 64, 64),
+ .frontPicYOffset = 0,
+ .frontAnimFrames = sAnims_Mewthree,
+ .frontAnimId = ANIM_GROW_VIBRATE,
+ .frontAnimDelay = 15,
+ .enemyMonElevation = 6,
+ BACK_PIC(Mewthree, 64, 64),
+ .backPicYOffset = 0,
+ .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL,
+ PALETTES(Mewthree),
+ ICON(Mewthree, 2),
+ FOOTPRINT(Mewthree)
},
};
Let's explain each of these:
FRONT_PIC
:- This is a macro handles both the
frontPic
andfrontPicSize
fields.#define FRONT_PIC(sprite, width, height) \ .frontPic = gMonFrontPic_## sprite, \ .frontPicSize = MON_COORDS_SIZE(width, height)
- The first value in the macro is used to reference the front sprite, so in this case, using
Mewthree
will call forgMonFrontPic_Mewthree
. - The second and third values (
width
andheight
) are used for defining the non-empty size of the sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64.
- This is a macro handles both the
frontPicYOffset
:- Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see
enemyMonElevation
.
- Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see
frontAnimFrames
:- We link our animation frame animations that we defined earlier here.
frontAnimId
:- Because you are limited to two frames, there are already predefined front sprite animations, describing translations, rotations, scalings or color changes.
frontAnimDelay
:- Sets a delay in frame count between when the Pokémon appears and when the animation starts.
enemyMonElevation
:- Used to determine the altitude from the ground. Any value above 0 will show a shadow under the Pokémon, to signify that they're floating.
BACK_PIC
:- A macro like
FRONT_PIC
except for the back sprite handling thefrontPic
andfrontPicSize
fields in the same way.#define BACK_PIC(sprite, width, height) \ .backPic = gMonBackPic_## sprite, \ .backPicSize = MON_COORDS_SIZE(width, height)
- A macro like
backPicYOffset
:- Used to define what Y position of the back sprite. When working with the animation debug menu, we recommend aligning the back sprite to the white background, as it was designed to properyly align with the real battle layout.
backAnimId
:- Like
frontAnimId
except for the back sprites and them being a single frame. The IDs listed here are used to represent 3 different animations that happen based on the the Pokémon's nature.
- Like
PALETTES
- This macro was created to handle both regular and shiny palettes of a Pokémon. It just needs the species suffix to call the corresponding palette.
#define PALETTES(pal) \ .palette = gMonPalette_## pal, \ .shinyPalette = gMonShinyPalette_## pal
- This macro was created to handle both regular and shiny palettes of a Pokémon. It just needs the species suffix to call the corresponding palette.
ICON
-
This macro is calls both the icon sprite and its palette.
#define ICON(sprite, palId) \ .iconSprite = gMonIcon_## sprite, \ .iconPalIndex = palId
Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in
graphics/pokemon/icon_palettes
.Open an icon sprite and load one of the palettes to find out which palette suits your icon sprite best.
-
FOOTPRINT
- We made this single field into a macro so that they can be ignored when
P_FOOTPRINTS
is set to false. It's also why we don't have an "," after calling it like the other macros (we add it as part of the macro itself).#if P_FOOTPRINTS #define FOOTPRINT(sprite) .footprint = gMonFootprint_## sprite, #else #define FOOTPRINT(sprite) #endif
- We made this single field into a macro so that they can be ignored when
The Data - Part 2
We're almost there just a bit left!
1. Species Flags
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
.abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE },
.bodyColor = BODY_COLOR_PURPLE,
+ .isLegendary = TRUE,
+ .allPerfectIVs = TRUE,
},
};
Each species flag provides properties to the species:
isLegendary
:- Guarantees 3 perfect IVs upon generating the Pokémon*.
isMythical
:- Guarantees 3 perfect IVs upon generating the Pokémon*.
- Is skipped during Pokédex evaluations.
- Unless it also has the
dexForceRequired
flag.
- Unless it also has the
- Cannot obtain Gigantamax factor via
ToggleGigantamaxFactor
.
isUltraBeast
:- Guarantees 3 perfect IVs upon generating the Pokémon*.
- Beast Ball's multiplier is set to x5 for this species.
- All other ball multipliers are set to x0.1.
isParadoxForm
:- Currently has no functionality but can be utilized by users for their own benefits.
isMegaEvolution
:- A Mega indicator is added to the battle box indicating that they're Mega Evolved.
- The species doesn't receive affection benefits.
- Required when adding new Mega Evolutions.
isPrimalReversion
:- A Primal Reversion indicator (Alpha or Omega for Kyogre/Groudon respectively) is added to the battle box indicating that they're Primal Reverted.
- Required when adding new Primal Reversions.
isUltraBurst
:- Required when adding new Ultra Burst forms.
isGigantamax
:- Used to determine if Gigantamax forms should have their GMax moves or not.
- Required when adding new Gigantamax forms.
isAlolanForm
,isGalarianForm
,isHisuianForm
,isPaldeanForm
:- In the future, these will be used to determine breeding offspring from different based on their region.
cannotBeTraded
:- This species cannot be traded away (like Black/White Kyurem).
allPerfectIVs
:- Guarantees 6 perfect IVs upon generating the Pokémon (like LGPE's Partner Pikachu and Eevee).
tmIlliterate
:- This species will be unable to learn the universal moves.
*: As long as P_LEGENDARY_PERFECT_IVS
is set to GEN_6
or higher.
2. Delimit the moveset
Let's begin with the moves that can be learned by leveling up.
Append to src/data/pokemon/level_up_learnsets.h:
#if P_FAMILY_PECHARUNT
static const struct LevelUpMove sPecharuntLevelUpLearnset[] = {
LEVEL_UP_MOVE( 1, MOVE_SMOG),
LEVEL_UP_MOVE( 1, MOVE_POISON_GAS),
LEVEL_UP_MOVE( 1, MOVE_MEMENTO),
LEVEL_UP_MOVE( 1, MOVE_ASTONISH),
LEVEL_UP_MOVE( 8, MOVE_WITHDRAW),
LEVEL_UP_MOVE(16, MOVE_DESTINY_BOND),
LEVEL_UP_MOVE(24, MOVE_FAKE_TEARS),
LEVEL_UP_MOVE(32, MOVE_PARTING_SHOT),
LEVEL_UP_MOVE(40, MOVE_SHADOW_BALL),
LEVEL_UP_MOVE(48, MOVE_MALIGNANT_CHAIN),
LEVEL_UP_MOVE(56, MOVE_TOXIC),
LEVEL_UP_MOVE(64, MOVE_NASTY_PLOT),
LEVEL_UP_MOVE(72, MOVE_RECOVER),
LEVEL_UP_END
};
#endif
+static const struct LevelUpMove sMewthreeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE( 1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE( 1, MOVE_DISABLE),
+ LEVEL_UP_MOVE(11, MOVE_BARRIER),
+ LEVEL_UP_MOVE(22, MOVE_SWIFT),
+ LEVEL_UP_MOVE(33, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(44, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(55, MOVE_MIST),
+ LEVEL_UP_MOVE(66, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(77, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(88, MOVE_RECOVER),
+ LEVEL_UP_MOVE(99, MOVE_SAFEGUARD),
+ LEVEL_UP_END
+};
Again, we need to register the learnset in gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
PALETTES(Mewthree),
ICON(Mewthree, 2),
FOOTPRINT(Mewthree)
+ .levelUpLearnset = sMewthreeLevelUpLearnset,
},
};
Next we need to specify which moves can be taught via TM, HM, or Move Tutor.
Append to src/data/pokemon/teachable_learnsets.h:
#if P_FAMILY_PECHARUNT
static const u16 sPecharuntTeachableLearnset[] = {
...
MOVE_UNAVAILABLE,
};
#endif //P_FAMILY_PECHARUNT
+static const u16 sMewthreeTeachableLearnset[] = {
+ MOVE_FOCUS_PUNCH,
+ MOVE_WATER_PULSE,
+ MOVE_CALM_MIND,
+ MOVE_TOXIC,
+ MOVE_HAIL,
+ MOVE_BULK_UP,
+ MOVE_HIDDEN_POWER,
+ MOVE_SUNNY_DAY,
+ MOVE_TAUNT,
+ MOVE_ICE_BEAM,
+ MOVE_BLIZZARD,
+ MOVE_HYPER_BEAM,
+ MOVE_LIGHT_SCREEN,
+ MOVE_PROTECT,
+ MOVE_RAIN_DANCE,
+ MOVE_SAFEGUARD,
+ MOVE_FRUSTRATION,
+ MOVE_SOLAR_BEAM,
+ MOVE_IRON_TAIL,
+ MOVE_THUNDERBOLT,
+ MOVE_THUNDER,
+ MOVE_EARTHQUAKE,
+ MOVE_RETURN,
+ MOVE_PSYCHIC,
+ MOVE_SHADOW_BALL,
+ MOVE_BRICK_BREAK,
+ MOVE_DOUBLE_TEAM,
+ MOVE_REFLECT,
+ MOVE_SHOCK_WAVE,
+ MOVE_FLAMETHROWER,
+ MOVE_SANDSTORM,
+ MOVE_FIRE_BLAST,
+ MOVE_ROCK_TOMB,
+ MOVE_AERIAL_ACE,
+ MOVE_TORMENT,
+ MOVE_FACADE,
+ MOVE_SECRET_POWER,
+ MOVE_REST,
+ MOVE_SKILL_SWAP,
+ MOVE_SNATCH,
+ MOVE_STRENGTH,
+ MOVE_FLASH,
+ MOVE_ROCK_SMASH,
+ MOVE_MEGA_PUNCH,
+ MOVE_MEGA_KICK,
+ MOVE_BODY_SLAM,
+ MOVE_DOUBLE_EDGE,
+ MOVE_COUNTER,
+ MOVE_SEISMIC_TOSS,
+ MOVE_MIMIC,
+ MOVE_METRONOME,
+ MOVE_DREAM_EATER,
+ MOVE_THUNDER_WAVE,
+ MOVE_SUBSTITUTE,
+ MOVE_DYNAMIC_PUNCH,
+ MOVE_PSYCH_UP,
+ MOVE_SNORE,
+ MOVE_ICY_WIND,
+ MOVE_ENDURE,
+ MOVE_MUD_SLAP,
+ MOVE_ICE_PUNCH,
+ MOVE_SWAGGER,
+ MOVE_SLEEP_TALK,
+ MOVE_SWIFT,
+ MOVE_THUNDER_PUNCH,
+ MOVE_FIRE_PUNCH,
+ MOVE_UNAVAILABLE, // This is required to determine where the array ends.
+};
#endif
Once more, we need to register the learnset in gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTHREE] =
{
...
FOOTPRINT(Mewthree)
.levelUpLearnset = sMewthreeLevelUpLearnset,
+ .teachableLearnset = sMewthreeTeachableLearnset,
},
};
If you want to create a Pokémon which can breed, you will need to edit src/data/pokemon/egg_moves.h.
3. Define the Evolutions
We want Mewthree to evolve from Mewtwo by reaching level 100.
Edit gSpeciesInfo
:
const struct SpeciesInfo gSpeciesInfo[] =
{
...
[SPECIES_MEWTWO] =
{
...
FOOTPRINT(Mewtwo)
.isLegendary = TRUE,
.levelUpLearnset = sMewtwoLevelUpLearnset,
.teachableLearnset = sMewtwoTeachableLearnset,
.formSpeciesIdTable = sMewtwoFormSpeciesIdTable,
.formChangeTable = sMewtwoFormChangeTable,
+ .evolutions = EVOLUTION({EVO_LEVEL, 100, SPECIES_MEWTHREE}),
},
};
4. Make it appear!
Now Mewthree really does slumber in the games code - but we won't know until we make him appear somewhere! The legend tells that Mewthree is hiding somewhere in Petalburg Woods...
Edit src/data/wild_encounters.json:
{
"map": "MAP_PETALBURG_WOODS",
"base_label": "gPetalburgWoods",
"land_mons": {
"encounter_rate": 20,
"mons": [
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_POOCHYENA"
},
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_WURMPLE"
},
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_SHROOMISH"
},
{
- "min_level": 6,
- "max_level": 6,
- "species": "SPECIES_POOCHYENA"
+ "min_level": 5,
+ "max_level": 5,
+ "species": "SPECIES_MEWTHREE"
},
...
}
Congratulations, you have created your own personal pocket monster! You may call yourself a mad scientist now.
Optional data
Now that you now have all the essential pieces to create a base species, there are some aspects that you might want to know if you want to do other stuff with your custom Pokémon.
1. Form tables
Found in src/data/pokemon/form_species_tables.h
.
These are introduced to have a reference of what forms correspond to what Species of Pokémon. For example, we have Pikachu's table:
#if P_FAMILY_PIKACHU
static const u16 sPikachuFormSpeciesIdTable[] = {
SPECIES_PIKACHU,
SPECIES_PIKACHU_COSPLAY,
SPECIES_PIKACHU_ROCK_STAR,
SPECIES_PIKACHU_BELLE,
SPECIES_PIKACHU_POP_STAR,
SPECIES_PIKACHU_PH_D,
SPECIES_PIKACHU_LIBRE,
SPECIES_PIKACHU_ORIGINAL_CAP,
SPECIES_PIKACHU_HOENN_CAP,
SPECIES_PIKACHU_SINNOH_CAP,
SPECIES_PIKACHU_UNOVA_CAP,
SPECIES_PIKACHU_KALOS_CAP,
SPECIES_PIKACHU_ALOLA_CAP,
SPECIES_PIKACHU_PARTNER_CAP,
SPECIES_PIKACHU_WORLD_CAP,
FORM_SPECIES_END,
};
#endif //P_FAMILY_PIKACHU
We register the table each form entry in gSpeciesInfo
.
[SPECIES_PIKACHU] =
{
...
.teachableLearnset = sPikachuTeachableLearnset,
+ .formSpeciesIdTable = sPikachuFormSpeciesIdTable,
.evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU},
{EVO_NONE, 0, SPECIES_RAICHU_ALOLAN}),
},
[SPECIES_PIKACHU_COSPLAY] =
{
...
.teachableLearnset = sPikachuTeachableLearnset,
+ .formSpeciesIdTable = sPikachuFormSpeciesIdTable,
},
...and so on.
What this allows us to do is to be able to get all forms of a Pokémon in our code by using the GetSpeciesFormTable
function.
For example, in the HGSS dex, it lets us browse between the entries of every form available.:
In addition, we have the GET_BASE_SPECIES_ID
macro, which returns the first entry of the table (or return the species itself if it doesn't have a table registered). With this, you can check if a Pokémon is any form of a species. For example, making it so that the Light Ball affects all Pikachu forms:
case HOLD_EFFECT_LIGHT_BALL:
if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PIKACHU && IS_MOVE_SPECIAL(move))
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0));
break;
2. Form change tables
Found in src/data/pokemon/form_species_tables.h
.
These tables, unlike the regular form tables, registers how Pokémon can switch between forms.
#if P_FAMILY_GASTLY
static const struct FormChange sGengarFormChangeTable[] = {
{FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE},
{FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GIGANTAMAX},
{FORM_CHANGE_TERMINATOR},
};
#endif //P_FAMILY_GASTLY
The first value is the type of form change. In the case of Gengar, we have both Mega Evolution and Gigantamax form changes.
The second value is the target form, to which the Pokémon will change into.
Values after that are referred as arguments, and needs to be put there depends on the type of form change, detailed in include/constants/form_change_types.h
.
3. Gender differences
You may have seen that there's a couple of duplicate fields with a "Female" suffix.
[SPECIES_FRILLISH] =
{
...
.frontPic = gMonFrontPic_Frillish,
+ .frontPicFemale = gMonFrontPic_FrillishF,
.frontPicSize = MON_COORDS_SIZE(56, 56),
+ .frontPicSizeFemale = MON_COORDS_SIZE(56, 56),
.frontPicYOffset = 5,
.frontAnimFrames = sAnims_Frillish,
.frontAnimId = ANIM_RISING_WOBBLE,
.backPic = gMonBackPic_Frillish,
+ .backPicFemale = gMonBackPic_FrillishF,
.backPicSize = MON_COORDS_SIZE(40, 56),
+ .backPicSizeFemale = MON_COORDS_SIZE(40, 56),
.backPicYOffset = 7,
.backAnimId = BACK_ANIM_CONVEX_DOUBLE_ARC,
.palette = gMonPalette_Frillish,
+ .paletteFemale = gMonPalette_FrillishF,
.shinyPalette = gMonShinyPalette_Frillish,
+ .shinyPaletteFemale = gMonShinyPalette_FrillishF,
.iconSprite = gMonIcon_Frillish,
+ .iconSpriteFemale = gMonIcon_FrillishF,
.iconPalIndex = 0,
+ .iconPalIndexFemale = 1,
FOOTPRINT(Frillish)
.levelUpLearnset = sFrillishLevelUpLearnset,
.teachableLearnset = sFrillishTeachableLearnset,
.evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_JELLICENT}),
},
These are used to change the graphics of the Pokémon if they're female. If they're not registered, they default to the male values.
However, iconPalIndexFemale
is a special case, where it's doesn't read the male icon palette if its iconSpriteFemale
is set, so if you're setting a female icon, be sure to set their palette index as well.
This is a modified version of the original tutorial about adding new Pokémon species available in Pokeemerald's wiki.
Despite the persistent rumors about an incredibly strong third form of Mew hiding somewhere, it actually wasn't possible to catch it... OR WAS IT? In this tutorial, we will add a new Pokémon species to the game.
IMPORTANT: This tutorial applies to Version 1.6.2 and lower.
Changes compared to vanilla
The main things that the Expansion changes are listed here.
- Still Front Pics (
gMonStillFrontPic_YourPokemon
) and by extensionsrc/anim_mon_front_pics.c
have been removed. src/data/pokemon/cry_ids.h
doesn't exist anymore.
Content
The Graphics
We will start by copying the folder containing the sprites for Mewtwo and rename it to mewthree
(pretty meta huh?):
cp -r graphics/pokemon/mewtwo graphics/pokemon/mewthree
1. Edit the sprites
Let's edit the sprites. Start your favourite image editor (I have used GIMP) and change anim_front.png
, front.png
and back.png
to meet your expectations.
Make sure that you are using the indexed mode and you have limited yourself to 15 colors!
Put the RGB values of your colors into normal.pal
between the first and the last color and the RGB values for the shiny version into shiny.pal
.
Edit footprint.png
using two colors in indexed mode, black and white.
Finally, edit icon.png
. Notice, that the icon will use one of three predefined palettes instead of normal.pal
.
2. Register the sprites
Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. First, create constants for the file paths. You'll want to add the constants for your species after the constants for the last valid species. Edit include/graphics.h:
extern const u32 gMonFrontPic_Calyrex[];
+extern const u32 gMonFrontPic_Mewthree[];
extern const u32 gMonBackPic_Calyrex[];
+extern const u32 gMonBackPic_Mewthree[];
extern const u32 gMonPalette_Calyrex[];
+extern const u32 gMonPalette_Mewthree[];
extern const u32 gMonShinyPalette_Calyrex[];
+extern const u32 gMonShinyPalette_Mewthree[];
//extern const u8 gMonIcon_Calyrex[];
+extern const u8 gMonIcon_Mewthree[];
extern const u8 gMonFootprint_Calyrex[];
+extern const u8 gMonFootprint_Mewthree[];
Now link the graphic files.
Edit src/data/graphics/pokemon.h:
const u32 gMonFrontPic_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/front.4bpp.lz");
+const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/front.4bpp.lz");
const u32 gMonBackPic_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/back.4bpp.lz");
+const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz");
const u32 gMonPalette_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/normal.gbapal.lz");
+const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz");
const u32 gMonShinyPalette_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/shiny.gbapal.lz");
+const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz");
//const u8 gMonIcon_Calyrex[] = INCBIN_U8("graphics/pokemon/calyrex/icon.4bpp");
+const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp");
const u8 gMonFootprint_Calyrex[] = INCBIN_U8("graphics/pokemon/calyrex/footprint.1bpp");
+const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp");
Please note that Calyrex, the Pokémon that should be above your insertion for the time being, reads a "front.png" sprite instead of an "anim_front.png" sprite. This is because currently, Calyrex lacks a 2nd frame. If the front sprite sheet of your species uses 2 frames, you should use "anim_front".
It is also worth to mention that Calyrex's icon sprite is commented out simply because it's currently missing. If you do have an icon sprite sheet present inside your species' folder at graphics/pokemon
, by all means do not comment entries involving the gMonIcon
constants.
3. Animate the sprites
You can define the animation order, in which the sprites will be shown. The first number is the sprite index (so 0 or 1) and the second number is the number of frames the sprite will be visible.
Edit src/data/pokemon_graphics/front_pic_anims.h:
static const union AnimCmd sAnim_Enamorus_1[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
};
+static const union AnimCmd sAnim_Mewthree_1[] =
+{
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_END,
+};
#endif
SINGLE_ANIMATION(Enamorus);
+SINGLE_ANIMATION(Mewthree);
#endif
const union AnimCmd *const *const gMonFrontAnimsPtrTable[] =
{
[SPECIES_NONE] = sAnims_None,
[SPECIES_BULBASAUR] = sAnims_Bulbasaur,
...
[SPECIES_ENAMORUS] = sAnims_Enamorus,
+ [SPECIES_MEWTHREE] = sAnims_Mewthree,
#endif
...
};
Because you are limited to two frames, there are already predefined front sprite animations, describing translations, rotations, scalings or color changes.
Edit src/pokemon.c:
static const u8 sMonFrontAnimIdsTable[] =
{
[SPECIES_BULBASAUR - 1] = ANIM_V_JUMPS_H_JUMPS,
...
[SPECIES_DEOXYS_SPEED - 1] = ANIM_GROW_VIBRATE,
+ [SPECIES_MEWTHREE - 1] = ANIM_GROW_VIBRATE,
};
There are also predefined back sprite animations for the back sprites as well.
Edit src/pokemon_animation.c:
static const u8 sSpeciesToBackAnimSet[] =
{
[SPECIES_BULBASAUR] = BACK_ANIM_DIP_RIGHT_SIDE,
...
[SPECIES_CHIMECHO] = BACK_ANIM_CONVEX_DOUBLE_ARC,
+ [SPECIES_MEWTHREE] = BACK_ANIM_GROW_STUTTER,
};
If you want to delay the time between when the Pokémon appears and when the animation starts, you can add an entry to sMonAnimationDelayTable
Edit src/pokemon.c:
static const u8 sMonAnimationDelayTable[NUM_SPECIES - 1] =
{
[SPECIES_BLASTOISE - 1] = 50,
...
[SPECIES_KYOGRE - 1] = 60,
[SPECIES_RAYQUAZA - 1] = 60,
+ [SPECIES_MEWTHREE - 1] = 15,
};
If you want your Pokémon to fly above the ground, you can add an entry to gEnemyMonElevation
.
Edit src/data/pokemon_graphics/enemy_mon_elevation.h:
const u8 gEnemyMonElevation[NUM_SPECIES] =
{
[SPECIES_BUTTERFREE] = 10,
...
[SPECIES_REGIDRAGO] = 5,
+ [SPECIES_MEWTHREE] = 6,
};
4. Update the tables
Edit src/data/pokemon_graphics/front_pic_table.h:
const struct CompressedSpriteSheet gMonFrontPicTable[] =
{
SPECIES_SPRITE(NONE, gMonFrontPic_CircledQuestionMark),
SPECIES_SPRITE(BULBASAUR, gMonFrontPic_Bulbasaur),
...
SPECIES_SPRITE(ENAMORUS, gMonFrontPic_Enamorus),
+ SPECIES_SPRITE(MEWTHREE, gMonFrontPic_Mewthree),
#endif
...
};
Edit src/data/pokemon_graphics/front_pic_coordinates.h:
const struct MonCoords gMonFrontPicCoords[] =
{
...
[SPECIES_ENAMORUS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 },
+ [SPECIES_MEWTHREE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 },
#endif
...
};
Edit src/data/pokemon_graphics/back_pic_table.h:
const struct CompressedSpriteSheet gMonBackPicTable[] =
{
SPECIES_SPRITE(NONE, gMonBackPic_CircledQuestionMark),
SPECIES_SPRITE(BULBASAUR, gMonBackPic_Bulbasaur),
...
SPECIES_SPRITE(ENAMORUS, gMonBackPic_Enamorus),
+ SPECIES_SPRITE(MEWTHREE, gMonBackPic_Mewthree),
#endif
...
};
Edit src/data/pokemon_graphics/back_pic_coordinates.h:
const struct MonCoords gMonBackPicCoords[] =
{
...
[SPECIES_ENAMORUS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 },
+ [SPECIES_MEWTHREE] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 1 },
#endif
...
};
Edit src/data/pokemon_graphics/footprint_table.h:
const u8 *const gMonFootprintTable[] =
{
[SPECIES_NONE] = gMonFootprint_Bulbasaur,
[SPECIES_BULBASAUR] = gMonFootprint_Bulbasaur,
...
[SPECIES_CALYREX] = gMonFootprint_Calyrex,
+ [SPECIES_MEWTHREE] = gMonFootprint_Mewthree,
#endif
[SPECIES_EGG] = gMonFootprint_Bulbasaur,
};
Edit src/data/pokemon_graphics/palette_table.h:
const struct CompressedSpritePalette gMonPaletteTable[] =
{
SPECIES_PAL(NONE, gMonPalette_CircledQuestionMark),
SPECIES_PAL(BULBASAUR, gMonPalette_Bulbasaur),
...
SPECIES_PAL(ENAMORUS, gMonPalette_Enamorus),
+ SPECIES_PAL(MEWTHREE, gMonPalette_Mewthree),
#endif
...
};
Edit src/data/pokemon_graphics/shiny_palette_table.h:
const struct CompressedSpritePalette gMonShinyPaletteTable[] =
{
SPECIES_SHINY_PAL(NONE, gMonShinyPalette_CircledQuestionMark),
SPECIES_SHINY_PAL(BULBASAUR, gMonShinyPalette_Bulbasaur),
...
SPECIES_SHINY_PAL(ENAMORUS, gMonShinyPalette_Enamorus),
+ SPECIES_SHINY_PAL(MEWTHREE, gMonShinyPalette_Mewthree),
#endif
...
};
Edit src/pokemon_icon.c:
const u8 *const gMonIconTable[] =
{
[SPECIES_NONE] = gMonIcon_Bulbasaur,
...
[SPECIES_ENAMORUS] = gMonIcon_Enamorus,
+ [SPECIES_MEWTHREE] = gMonIcon_Mewthree,
#endif
...
};
const u8 gMonIconPaletteIndices[] =
{
[SPECIES_NONE] = 0,
...
[SPECIES_ENAMORUS] = 1,
+ [SPECIES_MEWTHREE] = 2,
[SPECIES_VENUSAUR_MEGA] = 1,
...
};
Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in graphics/pokemon/icon_palettes
.
Open an icon sprite and load one of the palettes to find out which palette suits your icon sprite best.
The Data
Our plan is as simple as it is brilliant: clone Mewtwo... and make it even stronger!
1. Declare a species constant
Our first step towards creating a new digital lifeform is to define its own species constant.
Edit include/constants/species.h:
#define SPECIES_NONE 0
#define SPECIES_BULBASAUR 1
...
#define SPECIES_ENAMORUS 905
+#define SPECIES_MEWTHREE 906
-#define FORMS_START SPECIES_ENAMORUS
+#define FORMS_START SPECIES_MEWTHREE
2. Devise a name
This name will be displayed in the game. It may be different than the identifier of the species constant, especially when there are special characters involved.
Edit src/data/text/species_names.h:
const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1] = {
[SPECIES_NONE] = _("??????????"),
[SPECIES_BULBASAUR] = _("Bulbasaur"),
...
[SPECIES_ENAMORUS] = _("Enamorus"),
+ [SPECIES_MEWTHREE] = _("Mewthree"),
};
The _()
underscore function doesn't really exist - it's a convention borrowed from GNU gettext to let preproc
know this is text to be converted to the custom encoding used by the Gen 3 Pokemon games.
3. Define its Pokédex entry
First, we will need to add new index constants for its Pokédex entry. The index constants are divided into the Hoenn Pokédex, which contains all Pokémon native to the Hoenn region, and the National Pokédex containing all known Pokémon, which can be received after entering the hall of fame for the first time.
Edit include/constants/pokedex.h:
// National Pokedex order
enum {
NATIONAL_DEX_NONE,
// Kanto
NATIONAL_DEX_BULBASAUR,
...
NATIONAL_DEX_ENAMORUS,
+ NATIONAL_DEX_MEWTHREE,
};
#define KANTO_DEX_COUNT NATIONAL_DEX_MEW
#define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI
#if P_GEN_8_POKEMON == TRUE
- #define NATIONAL_DEX_COUNT NATIONAL_DEX_ENAMORUS
+ #define NATIONAL_DEX_COUNT NATIONAL_DEX_MEWTHREE
Do keep in mind that if you intend to add your new species to the Hoenn Dex, you'll also want to add a HOENN_DEX
constant for it, like this:
// Hoenn Pokedex order
enum {
HOENN_DEX_NONE,
HOENN_DEX_TREECKO,
...
HOENN_DEX_DEOXYS,
+ HOENN_DEX_MEWTHREE,
...
};
- #define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1)
+ #define HOENN_DEX_COUNT (HOENN_DEX_MEWTHREE + 1)
Edit src/pokemon.c:
// Assigns all species to the National Dex Index (Summary No. for National Dex)
static const u16 sSpeciesToNationalPokedexNum[NUM_SPECIES - 1] =
{
SPECIES_TO_NATIONAL(ENAMORUS),
+ SPECIES_TO_NATIONAL(MEWTHREE),
};
Just like before, if we want to insert our new species in the Hoenn Dex, we'll have to do a few extra steps:
// Assigns all species to the Hoenn Dex Index (Summary No. for Hoenn Dex)
static const u16 sSpeciesToHoennPokedexNum[NUM_SPECIES - 1] =
{
SPECIES_TO_HOENN(TREECKO),
...
SPECIES_TO_HOENN(DEOXYS),
+ SPECIES_TO_HOENN(MEWTHREE),
};
const u16 gHoennToNationalOrder[NUM_SPECIES] = // Assigns Hoenn Dex Pokémon (Using National Dex Index)
{
HOENN_TO_NATIONAL(TREECKO),
...
HOENN_TO_NATIONAL(DEOXYS),
+ HOENN_TO_NATIONAL(MEWTHREE),
};
Now we can define the actual text of the Pokédex entry.
Append to src/data/pokemon/pokedex_text.h:
const u8 gEnamorusPokedexText[] = _(
"Its arrival brings an end to the\n"
"winter. According to legend, this\n"
"Pokémon's love gives rise to the\n"
"budding of fresh life across the land.");
+const u8 gMewthreePokedexText[] = _(
+ "The rumors became true.\n"
+ "This is Mews final form.\n"
+ "Its power level is over 9000.\n"
+ "Has science gone too far?");
Finally, we will add the Pokédex entry for Mewthree and link the text to it.
Edit src/data/pokemon/pokedex_entries.h:
const struct PokedexEntry gPokedexEntries[] =
{
...
[NATIONAL_DEX_ENAMORUS] =
{
.categoryName = _("Love-Hate"),
.height = 16,
.weight = 480,
.description = gEnamorusPokedexText,
.pokemonScale = 259,
.pokemonOffset = 1,
.trainerScale = 296,
.trainerOffset = 1,
},
+ [NATIONAL_DEX_MEWTHREE] =
+ {
+ .categoryName = _("NEW SPECIES"),
+ .height = 15,
+ .weight = 330,
+ .description = gMewthreePokedexText,
+ .pokemonScale = 256,
+ .pokemonOffset = 0,
+ .trainerScale = 290,
+ .trainerOffset = 2,
+ },
#endif
};
The values pokemonScale
, pokemonOffset
, trainerScale
and trainerOffset
are used for the height comparison figure in the Pokédex. Height and weight are specified in meters and kilograms respectively, while the last digit is the first decimal place.
In Pokémon Emerald, you can sort the Pokédex by name, height or weight. Apparently, the Pokémon order is hardcoded in the game files and not calculated from their data. Therefore we have to include our new Pokémon species at the right places. While the correct position for the alphabetical order is easy to find, it can become quite tedious for height and weight. To find the right position for your Pokémon, you may look at the tables sorted by height and weight respectively in the appendix.
Edit src/data/pokemon/pokedex_orders.h:
const u16 gPokedexOrder_Alphabetical[] =
{
...
NATIONAL_DEX_MEW,
+ NATIONAL_DEX_MEWTHREE,
NATIONAL_DEX_MEWTWO,
...
};
const u16 gPokedexOrder_Weight[] =
{
...
NATIONAL_DEX_ESCAVALIER,
NATIONAL_DEX_FRILLISH,
NATIONAL_DEX_DURANT,
NATIONAL_DEX_CINDERACE,
+ NATIONAL_DEX_MEWTHREE,
//NATIONAL_DEX_PERSIAN, // Alolan Form
NATIONAL_DEX_DUGTRIO,
...
};
const u16 gPokedexOrder_Height[] =
{
...
NATIONAL_DEX_ZERAORA,
NATIONAL_DEX_GRIMMSNARL,
NATIONAL_DEX_MR_RIME,
+ NATIONAL_DEX_MEWTHREE,
// 5'03" / 1.6m
...
};
4. Define its species information
Edit src/data/pokemon/species_info.h:
const struct SpeciesInfo gSpeciesInfo[] =
{
[SPECIES_NONE] = {0},
...
[SPECIES_ENAMORUS] =
{
.baseHP = 74,
.baseAttack = 115,
.baseDefense = 70,
.baseSpeed = 106,
.baseSpAttack = 135,
.baseSpDefense = 80,
.types = { TYPE_FAIRY, TYPE_FLYING},
.catchRate = 3,
.expYield = 261,
.evYield_SpAttack = 3,
.genderRatio = MON_FEMALE,
.eggCycles = 120,
.friendship = 90,
.growthRate = GROWTH_SLOW,
.eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},
.abilities = {ABILITY_HEALER, ABILITY_NONE, ABILITY_CONTRARY},
.bodyColor = BODY_COLOR_PINK,
.noFlip = FALSE,
.flags = SPECIES_FLAG_LEGENDARY,
},
+ [SPECIES_MEWTHREE] =
+ {
+ .baseHP = 106,
+ .baseAttack = 150,
+ .baseDefense = 70,
+ .baseSpeed = 140,
+ .baseSpAttack = 194,
+ .baseSpDefense = 120,
+ .types = { TYPE_PSYCHIC, TYPE_PSYCHIC},
+ .catchRate = 3,
+ .expYield = 255,
+ .evYield_SpAttack = 3,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 0,
+ .growthRate = GROWTH_SLOW,
+ .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},
+ .abilities = {ABILITY_INSOMNIA, ABILITY_NONE},
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
#endif
};
The .
is the structure reference operator in C to refer to the member object of the structure SpeciesInfo.
Notice how I also set the ability to ABILITY_INSOMNIA
, so our little monster doesn't even need to sleep anymore. You can find the abilities for example here include/constants/abilities.h and here src/data/text/abilities.h.
You can also incorporate a 3rd ability to your species, which is intended to be a Hidden Ability!
5. Delimit the moveset
Let's begin with the moves that can be learned by leveling up.
Append to src/data/pokemon/level_up_learnsets.h:
static const struct LevelUpMove sEnamorusLevelUpLearnset[] = {
LEVEL_UP_MOVE( 1, MOVE_TACKLE),
LEVEL_UP_MOVE( 7, MOVE_BITE),
LEVEL_UP_MOVE(11, MOVE_TWISTER),
LEVEL_UP_MOVE(14, MOVE_DRAINING_KISS),
LEVEL_UP_MOVE(22, MOVE_IRON_DEFENSE),
LEVEL_UP_MOVE(31, MOVE_EXTRASENSORY),
LEVEL_UP_MOVE(41, MOVE_CRUNCH),
LEVEL_UP_MOVE(47, MOVE_MOONBLAST),
LEVEL_UP_MOVE( 1, MOVE_SPRINGTIDE_STORM),
LEVEL_UP_END
};
+static const struct LevelUpMove sMewthreeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE( 1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE( 1, MOVE_DISABLE),
+ LEVEL_UP_MOVE(11, MOVE_BARRIER),
+ LEVEL_UP_MOVE(22, MOVE_SWIFT),
+ LEVEL_UP_MOVE(33, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(44, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(55, MOVE_MIST),
+ LEVEL_UP_MOVE(66, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(77, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(88, MOVE_RECOVER),
+ LEVEL_UP_MOVE(99, MOVE_SAFEGUARD),
+ LEVEL_UP_END
+};
#endif
Again, we need to register the learnset.
Edit src/data/pokemon/level_up_learnset_pointers.h:
const struct LevelUpMove *const gLevelUpLearnsets[NUM_SPECIES] =
{
[SPECIES_NONE] = sBulbasaurLevelUpLearnset,
[SPECIES_BULBASAUR] = sBulbasaurLevelUpLearnset,
...
[SPECIES_ENAMORUS] = sEnamorusLevelUpLearnset,
+ [SPECIES_MEWTHREE] = sMewthreeLevelUpLearnset,
};
Next we need to specify which moves can be taught via TM, HM, or Move Tutor.
Append to src/data/pokemon/teachable_learnsets.h:
static const u16 sEnamorusTeachableLearnset[] = {
MOVE_UNAVAILABLE,
};
+static const u16 sMewthreeTeachableLearnset[] = {
+ MOVE_FOCUS_PUNCH,
+ MOVE_WATER_PULSE,
+ MOVE_CALM_MIND,
+ MOVE_TOXIC,
+ MOVE_HAIL,
+ MOVE_BULK_UP,
+ MOVE_HIDDEN_POWER,
+ MOVE_SUNNY_DAY,
+ MOVE_TAUNT,
+ MOVE_ICE_BEAM,
+ MOVE_BLIZZARD,
+ MOVE_HYPER_BEAM,
+ MOVE_LIGHT_SCREEN,
+ MOVE_PROTECT,
+ MOVE_RAIN_DANCE,
+ MOVE_SAFEGUARD,
+ MOVE_FRUSTRATION,
+ MOVE_SOLAR_BEAM,
+ MOVE_IRON_TAIL,
+ MOVE_THUNDERBOLT,
+ MOVE_THUNDER,
+ MOVE_EARTHQUAKE,
+ MOVE_RETURN,
+ MOVE_PSYCHIC,
+ MOVE_SHADOW_BALL,
+ MOVE_BRICK_BREAK,
+ MOVE_DOUBLE_TEAM,
+ MOVE_REFLECT,
+ MOVE_SHOCK_WAVE,
+ MOVE_FLAMETHROWER,
+ MOVE_SANDSTORM,
+ MOVE_FIRE_BLAST,
+ MOVE_ROCK_TOMB,
+ MOVE_AERIAL_ACE,
+ MOVE_TORMENT,
+ MOVE_FACADE,
+ MOVE_SECRET_POWER,
+ MOVE_REST,
+ MOVE_SKILL_SWAP,
+ MOVE_SNATCH,
+ MOVE_STRENGTH,
+ MOVE_FLASH,
+ MOVE_ROCK_SMASH,
+ MOVE_MEGA_PUNCH,
+ MOVE_MEGA_KICK,
+ MOVE_BODY_SLAM,
+ MOVE_DOUBLE_EDGE,
+ MOVE_COUNTER,
+ MOVE_SEISMIC_TOSS,
+ MOVE_MIMIC,
+ MOVE_METRONOME,
+ MOVE_DREAM_EATER,
+ MOVE_THUNDER_WAVE,
+ MOVE_SUBSTITUTE,
+ MOVE_DYNAMIC_PUNCH,
+ MOVE_PSYCH_UP,
+ MOVE_SNORE,
+ MOVE_ICY_WIND,
+ MOVE_ENDURE,
+ MOVE_MUD_SLAP,
+ MOVE_ICE_PUNCH,
+ MOVE_SWAGGER,
+ MOVE_SLEEP_TALK,
+ MOVE_SWIFT,
+ MOVE_THUNDER_PUNCH,
+ MOVE_FIRE_PUNCH,
+ MOVE_UNAVAILABLE,
+};
#endif
Once more, we need to register the learnset.
Edit src/data/pokemon/teachable_learnset_pointers.h:
const u16 *const gTeachableLearnsets[NUM_SPECIES] =
{
[SPECIES_NONE] = sBulbasaurTeachableLearnset,
[SPECIES_BULBASAUR] = sBulbasaurTeachableLearnset,
...
[SPECIES_ENAMORUS] = sEnamorusTeachableLearnset,
+ [SPECIES_MEWTHREE] = sMewthreeTeachableLearnset,
};
If you want to create a Pokémon which can breed, you will need to edit src/data/pokemon/egg_moves.h.
6. Define its cry
First run these command to copy the Mewtwo sound files:
cp -r sound/direct_sound_samples/cries/mewtwo.bin sound/direct_sound_samples/cries/mewthree.bin
cp -r sound/direct_sound_samples/cries/mewtwo.aif sound/direct_sound_samples/cries/mewthree.aif
In sound/direct_sound_data.inc.
.align 2
Cry_Enamorus::
.incbin "sound/direct_sound_samples/cries/enamorus.bin"
+ .align 2
+Cry_Mewthree::
+ .incbin "sound/direct_sound_samples/cries/mewthree.bin"
.endif
And linking it in sound/cry_tables.inc. cry_reverse
in particular is for reversed cries used by moves such as Growl.
...
cry Cry_Enamorus
+ cry Cry_Mewthree
.else
cry_reverse Cry_Overqwil
+ cry_reverse Cry_Mewthree
.else
Mon cries are 10512Hz. Make sure to put the aif file in the directory sound/direct_sound_samples/cries
Higher frequencies may be ruined by compression. To have the cries uncompressed, follow this , then clear out the old sound bins
7. Define the Evolutions
We want Mewthree to evolve from Mewtwo by reaching level 100.
Edit src/data/pokemon/evolution.h:
[SPECIES_SNEASEL_HISUIAN] = {{EVO_ITEM_DAY, ITEM_RAZOR_CLAW, SPECIES_SNEASLER},
{EVO_ITEM_HOLD_DAY, ITEM_RAZOR_CLAW, SPECIES_SNEASLER}},
+ [SPECIES_MEWTWO] = {{EVO_LEVEL, 100, SPECIES_MEWTHREE}},
#endif
8. Easy Chat about your Pokémon
Edit src/data/easy_chat/easy_chat_words_by_letter.h:
const u16 gEasyChatWordsByLetter_M[] = {
EC_MOVE2(MACH_PUNCH),
...
EC_POKEMON_NATIONAL(MEW),
+ EC_POKEMON_NATIONAL(MEWTHREE),
EC_POKEMON_NATIONAL(MEWTWO),
...
EC_WORD_MYSTERY,
};
9. Make it appear!
Now Mewthree really does slumber in the games code - but we won't know until we make him appear somewhere! The legend tells that Mewthree is hiding somewhere in Petalburg Woods...
Edit src/data/wild_encounters.json:
{
"map": "MAP_PETALBURG_WOODS",
"base_label": "gPetalburgWoods",
"land_mons": {
"encounter_rate": 20,
"mons": [
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_POOCHYENA"
},
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_WURMPLE"
},
{
"min_level": 5,
"max_level": 5,
"species": "SPECIES_SHROOMISH"
},
{
- "min_level": 6,
- "max_level": 6,
- "species": "SPECIES_POOCHYENA"
+ "min_level": 5,
+ "max_level": 5,
+ "species": "SPECIES_MEWTHREE"
},
...
}
Congratulations, you have created your own personal pocket monster! You may call yourself a mad scientist now.
Appendix
Available Front Animations
Only 65 are used in-game, but you can use any animation from this list.
- ANIM_V_SQUISH_AND_BOUNCE
- ANIM_CIRCULAR_STRETCH_TWICE
- ANIM_H_VIBRATE
- ANIM_H_SLIDE
- ANIM_V_SLIDE
- ANIM_BOUNCE_ROTATE_TO_SIDES
- ANIM_V_JUMPS_H_JUMPS
- ANIM_ROTATE_TO_SIDES
- ANIM_ROTATE_TO_SIDES_TWICE
- ANIM_GROW_VIBRATE
- ANIM_ZIGZAG_FAST
- ANIM_SWING_CONCAVE
- ANIM_SWING_CONCAVE_FAST
- ANIM_SWING_CONVEX
- ANIM_SWING_CONVEX_FAST
- ANIM_H_SHAKE
- ANIM_V_SHAKE
- ANIM_CIRCULAR_VIBRATE
- ANIM_TWIST
- ANIM_SHRINK_GROW
- ANIM_CIRCLE_C_CLOCKWISE
- ANIM_GLOW_BLACK
- ANIM_H_STRETCH
- ANIM_V_STRETCH
- ANIM_RISING_WOBBLE
- ANIM_V_SHAKE_TWICE
- ANIM_TIP_MOVE_FORWARD
- ANIM_H_PIVOT
- ANIM_V_SLIDE_WOBBLE
- ANIM_H_SLIDE_WOBBLE
- ANIM_V_JUMPS_BIG
- ANIM_SPIN_LONG
- ANIM_GLOW_ORANGE
- ANIM_GLOW_RED
- ANIM_GLOW_BLUE
- ANIM_GLOW_YELLOW
- ANIM_GLOW_PURPLE
- ANIM_BACK_AND_LUNGE
- ANIM_BACK_FLIP
- ANIM_FLICKER
- ANIM_BACK_FLIP_BIG
- ANIM_FRONT_FLIP
- ANIM_TUMBLING_FRONT_FLIP
- ANIM_FIGURE_8
- ANIM_FLASH_YELLOW
- ANIM_SWING_CONCAVE_FAST_SHORT
- ANIM_SWING_CONVEX_FAST_SHORT
- ANIM_ROTATE_UP_SLAM_DOWN
- ANIM_DEEP_V_SQUISH_AND_BOUNCE
- ANIM_H_JUMPS
- ANIM_H_JUMPS_V_STRETCH
- ANIM_ROTATE_TO_SIDES_FAST
- ANIM_ROTATE_UP_TO_SIDES
- ANIM_FLICKER_INCREASING
- ANIM_TIP_HOP_FORWARD
- ANIM_PIVOT_SHAKE
- ANIM_TIP_AND_SHAKE
- ANIM_VIBRATE_TO_CORNERS
- ANIM_GROW_IN_STAGES
- ANIM_V_SPRING
- ANIM_V_REPEATED_SPRING
- ANIM_SPRING_RISING
- ANIM_H_SPRING
- ANIM_H_REPEATED_SPRING_SLOW
- ANIM_H_SLIDE_SHRINK
- ANIM_LUNGE_GROW
- ANIM_CIRCLE_INTO_BG
- ANIM_RAPID_H_HOPS
- ANIM_FOUR_PETAL
- ANIM_V_SQUISH_AND_BOUNCE_SLOW
- ANIM_H_SLIDE_SLOW
- ANIM_V_SLIDE_SLOW
- ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL
- ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW
- ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW
- ANIM_ZIGZAG_SLOW
- ANIM_H_SHAKE_SLOW
- ANIM_V_SHAKE_SLOW
- ANIM_TWIST_TWICE
- ANIM_CIRCLE_C_CLOCKWISE_SLOW
- ANIM_V_SHAKE_TWICE_SLOW
- ANIM_V_SLIDE_WOBBLE_SMALL
- ANIM_V_JUMPS_SMALL
- ANIM_SPIN
- ANIM_TUMBLING_FRONT_FLIP_TWICE
- ANIM_DEEP_V_SQUISH_AND_BOUNCE_TWICE
- ANIM_H_JUMPS_V_STRETCH_TWICE
- ANIM_V_SHAKE_BACK
- ANIM_V_SHAKE_BACK_SLOW
- ANIM_V_SHAKE_H_SLIDE_SLOW
- ANIM_V_STRETCH_BOTH_ENDS_SLOW
- ANIM_H_STRETCH_FAR_SLOW
- ANIM_V_SHAKE_LOW_TWICE
- ANIM_H_SHAKE_FAST
- ANIM_H_SLIDE_FAST
- ANIM_H_VIBRATE_FAST
- ANIM_H_VIBRATE_FASTEST
- ANIM_V_SHAKE_BACK_FAST
- ANIM_V_SHAKE_LOW_TWICE_SLOW
- ANIM_V_SHAKE_LOW_TWICE_FAST
- ANIM_CIRCLE_C_CLOCKWISE_LONG
- ANIM_GROW_STUTTER_SLOW
- ANIM_V_SHAKE_H_SLIDE
- ANIM_V_SHAKE_H_SLIDE_FAST
- ANIM_TRIANGLE_DOWN_SLOW
- ANIM_TRIANGLE_DOWN
- ANIM_TRIANGLE_DOWN_TWICE
- ANIM_GROW
- ANIM_GROW_TWICE
- ANIM_H_SPRING_FAST
- ANIM_H_SPRING_SLOW
- ANIM_H_REPEATED_SPRING_FAST
- ANIM_H_REPEATED_SPRING
- ANIM_SHRINK_GROW_FAST
- ANIM_SHRINK_GROW_SLOW
- ANIM_V_STRETCH_BOTH_ENDS
- ANIM_V_STRETCH_BOTH_ENDS_TWICE
- ANIM_H_STRETCH_FAR_TWICE
- ANIM_H_STRETCH_FAR
- ANIM_GROW_STUTTER_TWICE
- ANIM_GROW_STUTTER
- ANIM_CONCAVE_ARC_LARGE_SLOW
- ANIM_CONCAVE_ARC_LARGE
- ANIM_CONCAVE_ARC_LARGE_TWICE
- ANIM_CONVEX_DOUBLE_ARC_SLOW
- ANIM_CONVEX_DOUBLE_ARC
- ANIM_CONVEX_DOUBLE_ARC_TWICE
- ANIM_CONCAVE_ARC_SMALL_SLOW
- ANIM_CONCAVE_ARC_SMALL
- ANIM_CONCAVE_ARC_SMALL_TWICE
- ANIM_H_DIP
- ANIM_H_DIP_FAST
- ANIM_H_DIP_TWICE
- ANIM_SHRINK_GROW_VIBRATE_FAST
- ANIM_SHRINK_GROW_VIBRATE
- ANIM_SHRINK_GROW_VIBRATE_SLOW
- ANIM_JOLT_RIGHT_FAST
- ANIM_JOLT_RIGHT
- ANIM_JOLT_RIGHT_SLOW
- ANIM_SHAKE_FLASH_YELLOW_FAST
- ANIM_SHAKE_FLASH_YELLOW
- ANIM_SHAKE_FLASH_YELLOW_SLOW
- ANIM_SHAKE_GLOW_RED_FAST
- ANIM_SHAKE_GLOW_RED
- ANIM_SHAKE_GLOW_RED_SLOW
- ANIM_SHAKE_GLOW_GREEN_FAST
- ANIM_SHAKE_GLOW_GREEN
- ANIM_SHAKE_GLOW_GREEN_SLOW
- ANIM_SHAKE_GLOW_BLUE_FAST
- ANIM_SHAKE_GLOW_BLUE
- ANIM_SHAKE_GLOW_BLUE_SLOW
Available Back Animations
- BACK_ANIM_NONE
- BACK_ANIM_H_VIBRATE
- BACK_ANIM_H_SLIDE
- BACK_ANIM_H_SPRING
- BACK_ANIM_H_SPRING_REPEATED
- BACK_ANIM_SHRINK_GROW
- BACK_ANIM_GROW
- BACK_ANIM_CIRCLE_COUNTERCLOCKWISE
- BACK_ANIM_H_SHAKE
- BACK_ANIM_V_SHAKE
- BACK_ANIM_V_SHAKE_H_SLIDE
- BACK_ANIM_V_STRETCH
- BACK_ANIM_H_STRETCH
- BACK_ANIM_GROW_STUTTER
- BACK_ANIM_V_SHAKE_LOW
- BACK_ANIM_TRIANGLE_DOWN
- BACK_ANIM_CONCAVE_ARC_LARGE
- BACK_ANIM_CONVEX_DOUBLE_ARC
- BACK_ANIM_CONCAVE_ARC_SMALL
- BACK_ANIM_DIP_RIGHT_SIDE
- BACK_ANIM_SHRINK_GROW_VIBRATE
- BACK_ANIM_JOLT_RIGHT
- BACK_ANIM_SHAKE_FLASH_YELLOW
- BACK_ANIM_SHAKE_GLOW_RED
- BACK_ANIM_SHAKE_GLOW_GREEN
- BACK_ANIM_SHAKE_GLOW_BLUE
Pokémon ordered by height
Pokemon | height (m) |
---|---|
Diglett | 0.2 |
Natu | 0.2 |
Azurill | 0.2 |
Caterpie | 0.3 |
Weedle | 0.3 |
Pidgey | 0.3 |
Rattata | 0.3 |
Spearow | 0.3 |
Paras | 0.3 |
Magnemite | 0.3 |
Shellder | 0.3 |
Ditto | 0.3 |
Eevee | 0.3 |
Pichu | 0.3 |
Cleffa | 0.3 |
Igglybuff | 0.3 |
Togepi | 0.3 |
Sunkern | 0.3 |
Wurmple | 0.3 |
Taillow | 0.3 |
Roselia | 0.3 |
Castform | 0.3 |
Jirachi | 0.3 |
Pikachu | 0.4 |
Nidoran_f | 0.4 |
Meowth | 0.4 |
Geodude | 0.4 |
Krabby | 0.4 |
Exeggcute | 0.4 |
Cubone | 0.4 |
Horsea | 0.4 |
Omanyte | 0.4 |
Mew | 0.4 |
Bellossom | 0.4 |
Marill | 0.4 |
Hoppip | 0.4 |
Wooper | 0.4 |
Swinub | 0.4 |
Smoochum | 0.4 |
Torchic | 0.4 |
Mudkip | 0.4 |
Zigzagoon | 0.4 |
Ralts | 0.4 |
Shroomish | 0.4 |
Aron | 0.4 |
Plusle | 0.4 |
Minun | 0.4 |
Gulpin | 0.4 |
Cacnea | 0.4 |
Swablu | 0.4 |
Barboach | 0.4 |
Clamperl | 0.4 |
Squirtle | 0.5 |
Nidoran_m | 0.5 |
Jigglypuff | 0.5 |
Oddish | 0.5 |
Mankey | 0.5 |
Voltorb | 0.5 |
Kabuto | 0.5 |
Cyndaquil | 0.5 |
Spinarak | 0.5 |
Chinchou | 0.5 |
Murkrow | 0.5 |
Unown | 0.5 |
Qwilfish | 0.5 |
Phanpy | 0.5 |
Treecko | 0.5 |
Poochyena | 0.5 |
Linoone | 0.5 |
Lotad | 0.5 |
Seedot | 0.5 |
Surskit | 0.5 |
Nincada | 0.5 |
Sableye | 0.5 |
Torkoal | 0.5 |
Baltoy | 0.5 |
Charmander | 0.6 |
Kakuna | 0.6 |
Sandshrew | 0.6 |
Clefairy | 0.6 |
Vulpix | 0.6 |
Poliwag | 0.6 |
Koffing | 0.6 |
Goldeen | 0.6 |
Totodile | 0.6 |
Togetic | 0.6 |
Mareep | 0.6 |
Skiploom | 0.6 |
Pineco | 0.6 |
Snubbull | 0.6 |
Shuckle | 0.6 |
Teddiursa | 0.6 |
Corsola | 0.6 |
Remoraid | 0.6 |
Houndour | 0.6 |
Porygon2 | 0.6 |
Elekid | 0.6 |
Larvitar | 0.6 |
Celebi | 0.6 |
Silcoon | 0.6 |
Wingull | 0.6 |
Whismur | 0.6 |
Skitty | 0.6 |
Mawile | 0.6 |
Meditite | 0.6 |
Electrike | 0.6 |
Illumise | 0.6 |
Corphish | 0.6 |
Feebas | 0.6 |
Shuppet | 0.6 |
Chimecho | 0.6 |
Wynaut | 0.6 |
Luvdisc | 0.6 |
Bagon | 0.6 |
Beldum | 0.6 |
Bulbasaur | 0.7 |
Metapod | 0.7 |
Raticate | 0.7 |
Dugtrio | 0.7 |
Growlithe | 0.7 |
Bellsprout | 0.7 |
Hoothoot | 0.7 |
Misdreavus | 0.7 |
Slugma | 0.7 |
Tyrogue | 0.7 |
Magby | 0.7 |
Marshtomp | 0.7 |
Cascoon | 0.7 |
Swellow | 0.7 |
Volbeat | 0.7 |
Numel | 0.7 |
Spoink | 0.7 |
Trapinch | 0.7 |
Anorith | 0.7 |
Snorunt | 0.7 |
Raichu | 0.8 |
Nidorina | 0.8 |
Zubat | 0.8 |
Gloom | 0.8 |
Psyduck | 0.8 |
Machop | 0.8 |
Farfetchd | 0.8 |
Staryu | 0.8 |
Jolteon | 0.8 |
Porygon | 0.8 |
Sentret | 0.8 |
Flaaffy | 0.8 |
Azumarill | 0.8 |
Jumpluff | 0.8 |
Aipom | 0.8 |
Sunflora | 0.8 |
Magcargo | 0.8 |
Kirlia | 0.8 |
Masquerain | 0.8 |
Slakoth | 0.8 |
Ninjask | 0.8 |
Shedinja | 0.8 |
Carvanha | 0.8 |
Duskull | 0.8 |
Spheal | 0.8 |
Nidorino | 0.9 |
Abra | 0.9 |
Tentacool | 0.9 |
Grimer | 0.9 |
Magikarp | 0.9 |
Flareon | 0.9 |
Chikorita | 0.9 |
Quilava | 0.9 |
Espeon | 0.9 |
Sneasel | 0.9 |
Octillery | 0.9 |
Delibird | 0.9 |
Grovyle | 0.9 |
Combusken | 0.9 |
Lairon | 0.9 |
Grumpig | 0.9 |
Whiscash | 0.9 |
Ivysaur | 1.0 |
Wartortle | 1.0 |
Beedrill | 1.0 |
Sandslash | 1.0 |
Wigglytuff | 1.0 |
Parasect | 1.0 |
Venonat | 1.0 |
Persian | 1.0 |
Primeape | 1.0 |
Poliwhirl | 1.0 |
Weepinbell | 1.0 |
Graveler | 1.0 |
Ponyta | 1.0 |
Magneton | 1.0 |
Drowzee | 1.0 |
Marowak | 1.0 |
Rhyhorn | 1.0 |
Tangela | 1.0 |
Vaporeon | 1.0 |
Omastar | 1.0 |
Ledyba | 1.0 |
Umbreon | 1.0 |
Mightyena | 1.0 |
Beautifly | 1.0 |
Nuzleaf | 1.0 |
Loudred | 1.0 |
Makuhita | 1.0 |
Nosepass | 1.0 |
Lunatone | 1.0 |
Lileep | 1.0 |
Kecleon | 1.0 |
Relicanth | 1.0 |
Charmeleon | 1.1 |
Butterfree | 1.1 |
Pidgeotto | 1.1 |
Ninetales | 1.1 |
Seel | 1.1 |
Chansey | 1.1 |
Starmie | 1.1 |
Electabuzz | 1.1 |
Croconaw | 1.1 |
Ariados | 1.1 |
Politoed | 1.1 |
Gligar | 1.1 |
Piloswine | 1.1 |
Donphan | 1.1 |
Delcatty | 1.1 |
Spinda | 1.1 |
Vibrava | 1.1 |
Altaria | 1.1 |
Crawdaunt | 1.1 |
Banette | 1.1 |
Sealeo | 1.1 |
Shelgon | 1.1 |
Fearow | 1.2 |
Vileplume | 1.2 |
Slowpoke | 1.2 |
Muk | 1.2 |
Electrode | 1.2 |
Lickitung | 1.2 |
Weezing | 1.2 |
Seadra | 1.2 |
Bayleef | 1.2 |
Lanturn | 1.2 |
Sudowoodo | 1.2 |
Yanma | 1.2 |
Forretress | 1.2 |
Smeargle | 1.2 |
Miltank | 1.2 |
Pupitar | 1.2 |
Dustox | 1.2 |
Lombre | 1.2 |
Pelipper | 1.2 |
Breloom | 1.2 |
Solrock | 1.2 |
Absol | 1.2 |
Metang | 1.2 |
Nidoqueen | 1.3 |
Clefable | 1.3 |
Poliwrath | 1.3 |
Kadabra | 1.3 |
Gastly | 1.3 |
Kingler | 1.3 |
Seaking | 1.3 |
Mr_mime | 1.3 |
Magmar | 1.3 |
Kabutops | 1.3 |
Wobbuffet | 1.3 |
Shiftry | 1.3 |
Medicham | 1.3 |
Cacturne | 1.3 |
Zangoose | 1.3 |
Nidoking | 1.4 |
Golem | 1.4 |
Doduo | 1.4 |
Hitmonchan | 1.4 |
Jynx | 1.4 |
Tauros | 1.4 |
Ledian | 1.4 |
Ampharos | 1.4 |
Quagsire | 1.4 |
Granbull | 1.4 |
Houndoom | 1.4 |
Stantler | 1.4 |
Hitmontop | 1.4 |
Vigoroth | 1.4 |
Walrein | 1.4 |
Latias | 1.4 |
Pidgeot | 1.5 |
Venomoth | 1.5 |
Alakazam | 1.5 |
Machoke | 1.5 |
Cloyster | 1.5 |
Gengar | 1.5 |
Hitmonlee | 1.5 |
Scyther | 1.5 |
Pinsir | 1.5 |
Xatu | 1.5 |
Girafarig | 1.5 |
Dunsparce | 1.5 |
Heracross | 1.5 |
Blissey | 1.5 |
Swampert | 1.5 |
Ludicolo | 1.5 |
Exploud | 1.5 |
Manectric | 1.5 |
Claydol | 1.5 |
Cradily | 1.5 |
Armaldo | 1.5 |
Glalie | 1.5 |
Salamence | 1.5 |
Blastoise | 1.6 |
Golbat | 1.6 |
Machamp | 1.6 |
Tentacruel | 1.6 |
Slowbro | 1.6 |
Haunter | 1.6 |
Hypno | 1.6 |
Zapdos | 1.6 |
Noctowl | 1.6 |
Gardevoir | 1.6 |
Dusclops | 1.6 |
Metagross | 1.6 |
Charizard | 1.7 |
Golduck | 1.7 |
Victreebel | 1.7 |
Rapidash | 1.7 |
Dewgong | 1.7 |
Articuno | 1.7 |
Typhlosion | 1.7 |
Skarmory | 1.7 |
Sceptile | 1.7 |
Swalot | 1.7 |
Huntail | 1.7 |
Regirock | 1.7 |
Deoxys | 1.7 |
Dodrio | 1.8 |
Aerodactyl | 1.8 |
Dratini | 1.8 |
Meganium | 1.8 |
Furret | 1.8 |
Crobat | 1.8 |
Scizor | 1.8 |
Ursaring | 1.8 |
Kingdra | 1.8 |
Sharpedo | 1.8 |
Gorebyss | 1.8 |
Regice | 1.8 |
Arcanine | 1.9 |
Rhydon | 1.9 |
Raikou | 1.9 |
Blaziken | 1.9 |
Camerupt | 1.9 |
Registeel | 1.9 |
Venusaur | 2.0 |
Ekans | 2.0 |
Exeggutor | 2.0 |
Moltres | 2.0 |
Mewtwo | 2.0 |
Slowking | 2.0 |
Suicune | 2.0 |
Tyranitar | 2.0 |
Slaking | 2.0 |
Wailmer | 2.0 |
Flygon | 2.0 |
Tropius | 2.0 |
Latios | 2.0 |
Snorlax | 2.1 |
Mantine | 2.1 |
Entei | 2.1 |
Aggron | 2.1 |
Kangaskhan | 2.2 |
Dragonite | 2.2 |
Feraligatr | 2.3 |
Hariyama | 2.3 |
Lapras | 2.5 |
Seviper | 2.7 |
Arbok | 3.5 |
Groudon | 3.5 |
Ho_oh | 3.8 |
Dragonair | 4.0 |
Kyogre | 4.5 |
Lugia | 5.2 |
Milotic | 6.2 |
Gyarados | 6.5 |
Rayquaza | 7.0 |
Onix | 8.8 |
Steelix | 9.2 |
Wailord | 14.5 |
Pokémon ordered by weight
Pokemon | weight (kg) |
---|---|
Gastly | 0.1 |
Haunter | 0.1 |
Hoppip | 0.5 |
Diglett | 0.8 |
Castform | 0.8 |
Igglybuff | 1.0 |
Koffing | 1.0 |
Skiploom | 1.0 |
Chimecho | 1.0 |
Misdreavus | 1.0 |
Jirachi | 1.1 |
Swablu | 1.2 |
Shedinja | 1.2 |
Togepi | 1.5 |
Surskit | 1.7 |
Pidgey | 1.8 |
Sunkern | 1.8 |
Barboach | 1.9 |
Natu | 2.0 |
Azurill | 2.0 |
Spearow | 2.0 |
Pichu | 2.0 |
Roselia | 2.0 |
Murkrow | 2.1 |
Taillow | 2.3 |
Shuppet | 2.3 |
Exeggcute | 2.5 |
Torchic | 2.5 |
Lotad | 2.6 |
Caterpie | 2.9 |
Cleffa | 3.0 |
Jumpluff | 3.0 |
Weedle | 3.2 |
Togetic | 3.2 |
Dratini | 3.3 |
Rattata | 3.5 |
Wurmple | 3.6 |
Masquerain | 3.6 |
Qwilfish | 3.9 |
Shellder | 4.0 |
Ditto | 4.0 |
Mew | 4.0 |
Seedot | 4.0 |
Bellsprout | 4.0 |
Meowth | 4.2 |
Plusle | 4.2 |
Minun | 4.2 |
Shroomish | 4.5 |
Unown | 5.0 |
Treecko | 5.0 |
Corsola | 5.0 |
Celebi | 5.0 |
Spinda | 5.0 |
Paras | 5.4 |
Oddish | 5.4 |
Jigglypuff | 5.5 |
Nincada | 5.5 |
Bellossom | 5.8 |
Magnemite | 6.0 |
Pikachu | 6.0 |
Smoochum | 6.0 |
Sentret | 6.0 |
Chikorita | 6.4 |
Weepinbell | 6.4 |
Eevee | 6.5 |
Krabby | 6.5 |
Cubone | 6.5 |
Swinub | 6.5 |
Ralts | 6.6 |
Bulbasaur | 6.9 |
Ekans | 6.9 |
Nidoran_f | 7.0 |
Pineco | 7.2 |
Feebas | 7.4 |
Omanyte | 7.5 |
Clefairy | 7.5 |
Zubat | 7.5 |
Mudkip | 7.6 |
Mareep | 7.8 |
Snubbull | 7.8 |
Cyndaquil | 7.9 |
Horsea | 8.0 |
Marill | 8.5 |
Wooper | 8.5 |
Spinarak | 8.5 |
Charmander | 8.5 |
Sunflora | 8.5 |
Gloom | 8.6 |
Luvdisc | 8.7 |
Teddiursa | 8.8 |
Squirtle | 9.0 |
Nidoran_m | 9.0 |
Totodile | 9.5 |
Wingull | 9.5 |
Weezing | 9.5 |
Vulpix | 9.9 |
Metapod | 9.9 |
Kakuna | 10.0 |
Silcoon | 10.0 |
Magikarp | 10.0 |
Gulpin | 10.3 |
Voltorb | 10.4 |
Houndour | 10.8 |
Ledyba | 10.8 |
Sableye | 11.0 |
Skitty | 11.0 |
Meditite | 11.2 |
Kabuto | 11.5 |
Mawile | 11.5 |
Corphish | 11.5 |
Cascoon | 11.5 |
Aipom | 11.5 |
Chinchou | 12.0 |
Sandshrew | 12.0 |
Remoraid | 12.0 |
Ninjask | 12.0 |
Wigglytuff | 12.0 |
Poliwag | 12.4 |
Anorith | 12.5 |
Banette | 12.5 |
Venomoth | 12.5 |
Ivysaur | 13.0 |
Flaaffy | 13.3 |
Poochyena | 13.6 |
Wynaut | 14.0 |
Dunsparce | 14.0 |
Goldeen | 15.0 |
Trapinch | 15.0 |
Farfetchd | 15.0 |
Duskull | 15.0 |
Xatu | 15.0 |
Electrike | 15.2 |
Vibrava | 15.3 |
Victreebel | 15.5 |
Bayleef | 15.8 |
Delibird | 16.0 |
Whismur | 16.3 |
Dragonair | 16.5 |
Snorunt | 16.8 |
Zigzagoon | 17.5 |
Illumise | 17.7 |
Volbeat | 17.7 |
Raticate | 18.5 |
Vileplume | 18.6 |
Growlithe | 19.0 |
Quilava | 19.0 |
Charmeleon | 19.0 |
Machop | 19.5 |
Nidorino | 19.5 |
Abra | 19.5 |
Combusken | 19.5 |
Psyduck | 19.6 |
Swellow | 19.8 |
Ninetales | 19.9 |
Geodude | 20.0 |
Nidorina | 20.0 |
Poliwhirl | 20.0 |
Kirlia | 20.2 |
Shuckle | 20.5 |
Altaria | 20.6 |
Carvanha | 20.8 |
Tyrogue | 21.0 |
Hoothoot | 21.2 |
Magby | 21.4 |
Baltoy | 21.5 |
Grovyle | 21.6 |
Kecleon | 22.0 |
Wartortle | 22.5 |
Lanturn | 22.5 |
Gorebyss | 22.6 |
Relicanth | 23.4 |
Elekid | 23.5 |
Whiscash | 23.6 |
Lileep | 23.8 |
Numel | 24.0 |
Slakoth | 24.0 |
Jolteon | 24.5 |
Flareon | 25.0 |
Croconaw | 25.0 |
Seadra | 25.0 |
Espeon | 26.5 |
Umbreon | 27.0 |
Huntail | 27.0 |
Mankey | 28.0 |
Marshtomp | 28.0 |
Sneasel | 28.0 |
Nuzleaf | 28.0 |
Pelipper | 28.0 |
Beautifly | 28.4 |
Azumarill | 28.5 |
Octillery | 28.5 |
Wobbuffet | 28.5 |
Vaporeon | 29.0 |
Beedrill | 29.5 |
Sandslash | 29.5 |
Parasect | 29.5 |
Raichu | 30.0 |
Grimer | 30.0 |
Venonat | 30.0 |
Ponyta | 30.0 |
Pidgeotto | 30.0 |
Electabuzz | 30.0 |
Muk | 30.0 |
Spoink | 30.6 |
Dusclops | 30.6 |
Medicham | 31.5 |
Dustox | 31.6 |
Persian | 32.0 |
Primeape | 32.0 |
Butterfree | 32.0 |
Drowzee | 32.4 |
Linoone | 32.5 |
Porygon2 | 32.5 |
Lombre | 32.5 |
Furret | 32.5 |
Delcatty | 32.6 |
Crawdaunt | 32.8 |
Dugtrio | 33.3 |
Phanpy | 33.5 |
Ariados | 33.5 |
Politoed | 33.9 |
Staryu | 34.5 |
Chansey | 34.6 |
Slugma | 35.0 |
Tangela | 35.0 |
Omastar | 35.0 |
Houndoom | 35.0 |
Ledian | 35.6 |
Slowpoke | 36.0 |
Porygon | 36.5 |
Mightyena | 37.0 |
Fearow | 38.0 |
Sudowoodo | 38.0 |
Yanma | 38.0 |
Seaking | 39.0 |
Breloom | 39.2 |
Doduo | 39.2 |
Spheal | 39.5 |
Pidgeot | 39.5 |
Clefable | 40.0 |
Latias | 40.0 |
Manectric | 40.2 |
Zangoose | 40.3 |
Loudred | 40.5 |
Kabutops | 40.5 |
Gengar | 40.5 |
Jynx | 40.6 |
Noctowl | 40.8 |
Girafarig | 41.5 |
Bagon | 42.1 |
Magmar | 44.5 |
Marowak | 45.0 |
Tentacool | 45.5 |
Vigoroth | 46.5 |
Blissey | 46.8 |
Absol | 47.0 |
Hitmontop | 48.0 |
Alakazam | 48.0 |
Gardevoir | 48.4 |
Granbull | 48.7 |
Hitmonlee | 49.8 |
Hitmonchan | 50.2 |
Skarmory | 50.5 |
Cacnea | 51.3 |
Blaziken | 52.0 |
Sceptile | 52.2 |
Clamperl | 52.5 |
Seviper | 52.5 |
Zapdos | 52.6 |
Poliwrath | 54.0 |
Heracross | 54.0 |
Mr_mime | 54.5 |
Magcargo | 55.0 |
Pinsir | 55.0 |
Ludicolo | 55.0 |
Golbat | 55.0 |
Tentacruel | 55.0 |
Articuno | 55.4 |
Piloswine | 55.8 |
Scyther | 56.0 |
Kadabra | 56.5 |
Smeargle | 58.0 |
Aerodactyl | 59.0 |
Shiftry | 59.6 |
Aron | 60.0 |
Magneton | 60.0 |
Nidoqueen | 60.0 |
Kingler | 60.0 |
Moltres | 60.0 |
Latios | 60.0 |
Cradily | 60.4 |
Deoxys | 60.8 |
Ampharos | 61.5 |
Nidoking | 62.0 |
Gligar | 64.8 |
Arbok | 65.0 |
Lickitung | 65.5 |
Electrode | 66.6 |
Armaldo | 68.2 |
Machoke | 70.5 |
Stantler | 71.2 |
Grumpig | 71.5 |
Larvitar | 72.0 |
Quagsire | 75.0 |
Crobat | 75.0 |
Miltank | 75.5 |
Hypno | 75.6 |
Golduck | 76.6 |
Cacturne | 77.4 |
Slowbro | 78.5 |
Typhlosion | 79.5 |
Slowking | 79.5 |
Starmie | 80.0 |
Swalot | 80.0 |
Kangaskhan | 80.0 |
Torkoal | 80.4 |
Swampert | 81.9 |
Flygon | 82.0 |
Exploud | 84.0 |
Dodrio | 85.2 |
Blastoise | 85.5 |
Makuhita | 86.4 |
Sealeo | 87.6 |
Tauros | 88.4 |
Sharpedo | 88.8 |
Feraligatr | 88.8 |
Seel | 90.0 |
Charizard | 90.5 |
Rapidash | 95.0 |
Beldum | 95.2 |
Nosepass | 97.0 |
Venusaur | 100.0 |
Tropius | 100.0 |
Meganium | 100.5 |
Salamence | 102.6 |
Graveler | 105.0 |
Claydol | 108.0 |
Shelgon | 110.5 |
Rhyhorn | 115.0 |
Scizor | 118.0 |
Lairon | 120.0 |
Donphan | 120.0 |
Dewgong | 120.0 |
Rhydon | 120.0 |
Exeggutor | 120.0 |
Mewtwo | 122.0 |
Forretress | 125.8 |
Ursaring | 125.8 |
Machamp | 130.0 |
Wailmer | 130.0 |
Slaking | 130.5 |
Cloyster | 132.5 |
Walrein | 150.6 |
Pupitar | 152.0 |
Kingdra | 152.0 |
Solrock | 154.0 |
Arcanine | 155.0 |
Milotic | 162.0 |
Lunatone | 168.0 |
Regice | 175.0 |
Raikou | 178.0 |
Suicune | 187.0 |
Entei | 198.0 |
Ho_oh | 199.0 |
Tyranitar | 202.0 |
Metang | 202.5 |
Registeel | 205.0 |
Rayquaza | 206.5 |
Dragonite | 210.0 |
Onix | 210.0 |
Lugia | 216.0 |
Camerupt | 220.0 |
Mantine | 220.0 |
Lapras | 220.0 |
Regirock | 230.0 |
Gyarados | 235.0 |
Hariyama | 253.8 |
Glalie | 256.5 |
Golem | 300.0 |
Kyogre | 352.0 |
Aggron | 360.0 |
Wailord | 398.0 |
Steelix | 400.0 |
Snorlax | 460.0 |
Metagross | 550.0 |
Groudon | 950.0 |
Making this easier
If you have multiple species that you want to add to pokeemerald but don't want to copy and paste or type everything out multiple times, just use this handy program to generate text with the species name in there! https://github.com/smithk200/making-a-new-pokemon-species-in-pokeemerald
How to use the Testing System
Running Tests
To run all the tests use:
make check -j
To run specific tests, e.g. Spikes ones, use:
make check TESTS="Spikes"
To build a ROM (pokemerald-test.elf) that can be opened in mgba to view specific tests, e.g. Spikes ones, use:
make pokeemerald-test.elf TESTS="Spikes"
How to Write Tests
Manually testing a battle mechanic often follows this pattern:
- Create a party which can activate the mechanic.
- Start a battle and play a few turns which activate the mechanic.
- Look at the UI outputs to decide if the mechanic works.
Automated testing follows the same pattern:
- Initialize the party in
GIVEN
. - Play the turns in
WHEN
. - Check the UI outputs in
SCENE
.
Example 1
As a concrete example, to manually test EFFECT_PARALYZE
, e.g. the
effect of Stun Spore you might:
- Put a Wobbuffet that knows Stun Spore in your party.
- Battle a wild Wobbuffet.
- Use Stun Spore.
- Check that the Wobbuffet is paralyzed.
This can be translated to an automated test as follows:
ASSUMPTIONS
{
ASSUME(gMovesInfo[MOVE_STUN_SPORE].effect == EFFECT_PARALYZE);
}
SINGLE_BATTLE_TEST("Stun Spore inflicts paralysis")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET); // 1.
OPPONENT(SPECIES_WOBBUFFET); // 2.
} WHEN {
TURN { MOVE(player, MOVE_STUN_SPORE); } // 3.
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player);
MESSAGE("The opposing Wobbuffet is paralyzed, so it may be unable to move!"); // 4
STATUS_ICON(opponent, paralysis: TRUE); // 4.
}
}
The ASSUMPTIONS
block documents that Stun Spore has EFFECT_PARALYZE
.
If Stun Spore did not have that effect it would cause the tests in the file to be skipped. We write our tests like this so that hackers can change the effects of moves without causing tests to fail.
SINGLE_BATTLE_TEST
defines the name of the test. Related tests should start with the same prefix, e.g. Stun Spore tests should start with "Stun Spore", this allows just the Stun Spore-related tests to be run with:
make check TESTS="Stun Spore"
GIVEN
initializes the parties, PLAYER
and OPPONENT
add a Pokémon to their respective parties. They can both accept a block which further customizes the Pokémon's stats, moves, item, ability, etc.
WHEN
describes the turns, and TURN
describes the choices made in a single turn. MOVE
causes the player to use Stun Spore and adds the move to the Pokémon's moveset if an explicit Moves was not specified.
Pokémon that are not mentioned in a TURN
use Celebrate.
The test runner rigs the RNG so that unless otherwise specified, moves always hit, never critical hit, always activate their secondary effects, and always roll the same damage modifier.
SCENE
describes the player-visible output of the battle. In this case ANIMATION
checks that the Stun Spore animation played, MESSAGE
checks the paralysis message was shown, and STATUS_ICON
checks that the opponent's HP bar shows a PRZ icon.
Example 2
As a second example, to manually test that Stun Spore does not effect Grass-types you might:
- Put a Wobbuffet that knows Stun Spore in your party.
- Battle a wild Oddish.
- Use Stun Spore.
- Check that the move animation does not play.
- Check that a "It doesn't affect Foe Oddish…" message is shown.
This can again be translated as follows:
SINGLE_BATTLE_TEST("Stun Spore does not affect Grass-types")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove);
ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS);
PLAYER(SPECIES_ODDISH); // 1.
OPPONENT(SPECIES_ODDISH); // 2.
} WHEN {
TURN { MOVE(player, MOVE_STUN_SPORE); } // 3.
} SCENE {
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player); // 4.
MESSAGE("It doesn't affect the opposing Oddish…"); // 5.
}
}
The ASSUME
commands are documenting the reasons why Stun Spore does not affect Oddish, namely that Stun Spore is a powder move, and Oddish is a Grass-type. These ASSUME
statements function similarly to the ones in ASSUMPTIONS
but apply only to the one test.
NOT inverts the meaning of a SCENE
check, so applying it to ANIMATION
requires that the Stun Spore animation does not play. MESSAGE
checks that the message was shown.
The checks in SCENE
are ordered, so together this says "The doesn't affect message is shown, and the Stun Spore animation does not play at any time before that". Normally you would only test one or the other, or even better, just NOT STATUS_ICON(opponent, paralysis: TRUE);
to say that Oddish was not paralyzed without specifying the exact outputs which led to that.
Example 3
As a final example, to test that Meditate works you might:
- Put a Wobbuffet that knows Meditate and Tackle in your party.
- Battle a wild Wobbuffet.
- Use Tackle and note the amount the HP bar reduced.
- Battle a wild Wobbuffet.
- Use Meditate and that the stat change animation and message play.
- Use Tackle and check that the HP bar reduced by more than in 3.
This can be translated to an automated test as follows:
SINGLE_BATTLE_TEST("Meditate raises Attack", s16 damage)
{
bool32 raiseAttack;
PARAMETRIZE { raiseAttack = FALSE; }
PARAMETRIZE { raiseAttack = TRUE; }
GIVEN {
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
if (raiseAttack) TURN { MOVE(player, MOVE_MEDITATE); } // 5.
TURN { MOVE(player, MOVE_TACKLE); } // 3 & 6.
} SCENE {
if (raiseAttack) {
ANIMATION(ANIM_TYPE_MOVE, MOVE_MEDITATE, player);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); // 5.
MESSAGE("Wobbuffet's attack rose!"); // 5.
}
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player);
HP_BAR(opponent, captureDamage: &results[i].damage); // 3 & 6.
} FINALLY {
EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); // 6.
}
}
PARAMETRIZE
causes a test to run multiple times, once per PARAMETRIZE
block (e.g. once with raiseAttack = FALSE
and once with raiseAttack = TRUE
).
The HP_BAR
command's captureDamage
causes the change in HP to be stored in a variable, and the variable chosen is results[i].damage
.
results[i]
contains all the variables defined at the end of SINGLE_BATTLE_TEST
, i
is the current PARAMETRIZE
index.
FINALLY
runs after the last parameter has finished, and uses EXPECT_MUL_EQ
to check that the second battle deals 1.5× the damage of the first battle (with a small tolerance to account for rounding).
You might notice that all the tests check the outputs the player could see rather than the internal battle state. e.g. the Meditate test could have used gBattleMons[B_POSITION_OPPONENT_LEFT].hp
instead of using HP_BAR
to capture the damage. This is a deliberate choice, by checking what the player can observe the tests are more robust to refactoring, e.g. if gBattleMons
got moved into gBattleStruct
then any test that used it would need to be updated.
Note on Overworld Tests
The overworld is not available, so it is only possible to test commands which don't affect the overworld itself, e.g. givemon
can be tested because it only alters gPlayerParty
, but addobject
cannot because it affects object events (which aren't loaded).
REFERENCE
ASSUME
ASSUME(cond)
Causes the test to be skipped if cond
is false. Used to document any prerequisites of the test, e.g. to test Burn reducing the Attack of a Pokémon we can observe the damage of a physical attack with and without the burn. To document that this test assumes the attack is physical we can use:
ASSUME(gMovesInfo[MOVE_WHATEVER].category == DAMAGE_CATEGORY_PHYSICAL);
ASSUMPTIONS
ASSUMPTIONS
{
...
}
Should be placed immediately after any #includes
and contain any ASSUME
statements which should apply to the whole file, e.g. to test EFFECT_POISON_HIT
we need to choose a move with that effect, if we chose to use Poison Sting in every test then the top of move_effect_poison_hit.c
should be:
ASSUMPTIONS
{
ASSUME(gMovesInfo[MOVE_POISON_STING].effect == EFFECT_POISON_HIT);
}
SINGLE_BATTLE_TEST
SINGLE_BATTLE_TEST(name, results...)
and DOUBLE_BATTLE_TEST(name, results...)
Define single- and double- battles. The names should start with the name of the mechanic being tested so that it is easier to run all the related tests. results
contains variable declarations to be placed into the results
array which is available in tests using PARAMETRIZE
commands.
The main differences for doubles are:
- Move targets sometimes need to be explicit.
- Instead of
player
andopponent
there isplayerLeft
,playerRight
,opponentLeft
, andopponentRight
.
AI_SINGLE_BATTLE_TEST
AI_SINGLE_BATTLE_TEST(name, results...)
and AI_DOUBLE_BATTLE_TEST(name, results...)
Define battles where opponent mons are controlled by AI, the same that runs
when battling regular Trainers. The flags for AI should be specified by the AI_FLAGS
command.
The rules remain the same as with the SINGLE
and DOUBLE
battle tests with some differences:
- opponent's action is specified by the
EXPECT_MOVE
/EXPECT_SEND_OUT
/EXPECT_SWITCH
commands - we don't control what opponent actually does, instead we make sure the opponent does what we expect it to do
- we still control the player's action the same way
- apart from the
EXPECTED
commands, there's also a newSCORE_
andSCORE__VAL
commands
KNOWN_FAILING
KNOWN_FAILING;
Marks a test as not passing due to a bug. If there is an issue number associated with the bug it should be included in a comment. If the test passes the developer will be notified to remove KNOWN_FAILING
.
For example:
SINGLE_BATTLE_TEST("Jump Kick has no recoil if no target")
{
KNOWN_FAILING; // #2596.
...
}
PARAMETRIZE
PARAMETERIZE { parameter; }
Runs a test multiple times. i
will be set to which parameter is running, and results
will contain an entry for each parameter, e.g.:
SINGLE_BATTLE_TEST("Blaze boosts Fire-type moves in a pinch", s16 damage)
{
u16 hp;
PARAMETRIZE { hp = 99; }
PARAMETRIZE { hp = 33; }
GIVEN {
ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE);
PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); MaxHP(99); HP(hp); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_EMBER); }
} SCENE {
HP_BAR(opponent, captureDamage: &results[i].damage);
} FINALLY {
EXPECT(results[1].damage > results[0].damage);
}
}
PASSES_RANDOMLY
PASSES_RANDOMLY(successes, trials, [tag])
Checks that the test passes successes/trials. If tag
is provided, the test is run for each value that the tag can produce. For example, to check that Paralysis causes the turn to be skipped 25/100 times, we can write the following test that passes only if the Pokémon is fully paralyzed and specify that we expect it to pass 25/100 times when RNG_PARALYSIS
varies:
SINGLE_BATTLE_TEST("Paralysis has a 25% chance of skipping the turn")
{
PASSES_RANDOMLY(25, 100, RNG_PARALYSIS);
GIVEN {
PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_PARALYSIS); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_CELEBRATE); }
} SCENE {
MESSAGE("Wobbuffet couldn't move because it's paralyzed!");
}
}
All BattleRandom
calls involving tag will return the same number, so this cannot be used to have two moves independently hit or miss, for example.
If the tag is not provided, runs the test 50 times and computes an approximate pass ratio.
PASSES_RANDOMLY(gMovesInfo[move].accuracy, 100);
Note that this mode of PASSES_RANDOMLY makes the tests run very slowly and should be avoided where possible. If the mechanic you are testing is missing its tag, you should add it.
GIVEN
Given {
...
}
Contains the initial state of the parties before the battle.
RNGSeed
RNGSeed(seed)
Explicitly sets the RNG seed. Try to avoid using this because it is a very fragile tool.
Example:
GIVEN {
RNGSeed(0xC0DEIDEA);
...
}
FLAG_SET
FLAG_SET(flagId)
Sets the specified flag. Can currently only set one flag at a time.
Cleared between parameters and at the end of the test.
Example:
GIVEN {
FLAG_SET(FLAG_SYS_EXAMPLE_FLAG);
...
}
PLAYER
and OPPONENT
PLAYER(species)
and OPPONENT(species
Adds the species to the player's or opponent's party respectively.
The Pokémon can be further customized with the following functions:
Gender(MON_MALE | MON_FEMALE)
Nature(nature)
Ability(ability)
Level(level)
MaxHP(n)
,HP(n)
,Attack(n)
,Defense(n)
,SpAttack(n)
,SpDefense(n)
,Speed(n)
Item(item)
Moves(moves...)
Friendship(friendship)
Status1(status1)
For example to create a level 42 Wobbuffet that is poisoned:PLAYER(SPECIES_WOBBUFFET) { Level(42); Status1(STATUS1_POISON); }
Note if Speed is specified for any Pokémon then it must be specified for all Pokémon. Note if Moves is specified then MOVE will not automatically add moves to the moveset.
AI_FLAGS
AI_FLAGS(flags)
Specifies which AI flags are run during the test. Has use only for AI tests.
The most common combination is AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT)
which is the general 'smart' AI.
WHEN
...
} WHEN {
...
}
Contains the choices that battlers make during the battle.
TURN
TURN { ... }
Groups the choices made by the battlers on a single turn. If Speeds have not been explicitly specified then the order of the MOVE
commands in the TURN
will be used to infer the Speeds of the Pokémon, e.g.:
// player's speed will be greater than opponent's speed.
TURN { MOVE(player, MOVE_SPLASH); MOVE(opponent, MOVE_SPLASH); }
// opponent's speed will be greater than player's speed.
TURN { MOVE(opponent, MOVE_SPLASH); MOVE(player, MOVE_SPLASH); }
The inference process is naive, if your test contains anything that modifies the speed of a battler you should specify them explicitly.
MOVE
MOVE(battler, move | moveSlot:, [megaEvolve:], [hit:], [criticalHit:], [target:], [allowed:], [WITH_RNG(tag, value])
Used when the battler chooses Fight. Either the move ID (e.g. MOVE_TACKLE
or move slot must be specified.
megaEvolve: TRUE
causes the battler to Mega Evolve if ablehit: FALSE
causes the move to misscriticalHit: TRUE
causes the move to land a critical hittarget:
is used in double battles to choose the target (when necessary)allowed: FALSE
is used to reject an illegal move e.g. a Disabled oneWITH_RNG
allows the move to specify an explicit outcome for an RNG tag
MOVE(playerLeft, MOVE_TACKLE, target: opponentRight);
If the battler does not have an explicit Moves specified the moveset will be populated based on the MOVE
s it uses.
FORCED_MOVE
FORCED_MOVE(battler)
Used when the battler chooses Fight and then their move is chosen for them, e.g. when affected by Encore.
FORCED_MOVE(player);
SWITCH
SWITCH(battler, partyIndex)
Used when the battler chooses Switch.
SWITCH(player, 1);
SKIP_TURN
SKIP_TURN(battler)
Used when the battler cannot choose an action, e.g. when locked into Thrash.
SKIP_TURN(player);
SEND_OUT
SEND_OUT(battler, partyIndex)
Used when the battler chooses to switch to another Pokémon but not via Switch, e.g. after fainting or due to a U-turn.
SEND_OUT(player, 1);
USE_ITEM
USE_ITEM(battler, itemId, [partyIndex:], [move:])
Used when the battler chooses to use an item from the Bag. The item ID (e.g. ITEM_POTION) must be specified, and party index and move slot if applicable, e.g:
USE_ITEM(player, ITEM_X_ATTACK);
USE_ITEM(player, ITEM_POTION, partyIndex: 0);
USE_ITEM(player, ITEM_LEPPA_BERRY, partyIndex: 0, move: MOVE_TACKLE);
SCENE
...
} SCENE {
...
}
Contains an abridged description of the UI during the THEN
. The order of the description must match too, e.g.
} SCENE {
// ABILITY_POPUP followed by a MESSAGE
ABILITY_POPUP(player, ABILITY_STURDY);
MESSAGE("Geodude was protected by Sturdy!");
}
ABILITY_POPUP
ABILITY_POPUP(battler, [ability])
Causes the test to fail if the battler's ability pop-up is not shown.
If specified, ability is the ability shown in the pop-up.
ABILITY_POPUP(opponent, ABILITY_MOLD_BREAKER);
ANIMATION
ANIMATION(type, animId, [battler], [target:])
Causes the test to fail if the animation does not play. A common use of this command is to check if a move was successful, e.g.:
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player);
target
can only be specified for ANIM_TYPE_MOVE
.
EXPERIENCE_BAR
EXPERIENCE_BAR(battler, [exp: | captureGainedExp:])
If exp:
is used, causes the test to fail if that amount of experience is not gained, e.g.:
EXPERIENCE_BAR(player, exp: 0);
If captureGainedExp:
is used, causes the test to fail if the Experience bar does not change, and then writes that change to the pointer, e.g.:
u32 exp;
EXPERIENCE_BAR(player, captureGainedExp: &exp);
If none of the above are used, causes the test to fail if the Exp does not change at all.
Please note that due to nature of tests, this command is only usable in WILD_BATTLE_TEST
and will fail elsewhere.
HP_BAR
HP_BAR(battler, [damage: | hp: | captureDamage: | captureHP:])
If hp:
or damage:
are used, causes the test to fail if that amount of damage is not dealt, e.g.:
HP_BAR(player, hp: 0);
If captureDamage:
or captureHP:
are used, causes the test to fail if the HP bar does not change, and then writes that change to the
pointer, e.g.:
s16 damage;
HP_BAR(player, captureDamage: &damage);
If none of the above are used, causes the test to fail if the HP does not change at all.
MESSAGE
MESSAGE(pattern)
Causes the test to fail if the message in pattern is not displayed.
Spaces in pattern match newlines (\n, \l, and \p) in the message.
Often used to check that a battler took its turn but it failed, e.g.:
MESSAGE("Wobbuffet used Dream Eater!");
MESSAGE("The opposing Wobbuffet wasn't affected!");
STATUS_ICON
STATUS_ICON(battler, status1 | none: | sleep: | poison: | burn: | freeze: | paralysis:, badPoison:)
Causes the test to fail if the battler's status is not changed to the specified status.
STATUS_ICON(player, badPoison: TRUE);
If the expected status icon is parametrized the corresponding STATUS1
constant can be provided, e.g.:
u32 status1;
PARAMETRIZE { status1 = STATUS1_NONE; }
PARAMETRIZE { status1 = STATUS1_BURN; }
...
STATUS_ICON(player, status1);
NOT
NOT sceneCommand
Causes the test to fail if the SCENE
command succeeds before the following command succeeds.
// Our Wobbuffet does not Celebrate before the foe's.
NOT MESSAGE("Wobbuffet used Celebrate!");
MESSAGE("The opposing Wobbuffet used Celebrate!");
NOTE: If this condition fails, the viewable ROM freezes at the NOT command.
WARNING: NOT
is an alias of NONE_OF
, so it behaves surprisingly when applied to multiple commands wrapped in braces.
ONE_OF
ONE_OF {
...
}
Causes the test to fail unless one of the SCENE
commands succeeds.
ONE_OF {
MESSAGE("Wobbuffet used Celebrate!");
MESSAGE("Wobbuffet couldn't move because it's paralyzed!");
}
NONE_OF
NONE_OF {
...
}
Causes the test to fail if one of the SCENE
commands succeeds before the command after the NONE_OF
succeeds.
// Our Wobbuffet does not move before the foe's.
NONE_OF {
MESSAGE("Wobbuffet used Celebrate!");
MESSAGE("Wobbuffet couldn't move because it's paralyzed!");
}
MESSAGE("The opposing Wobbuffet used Celebrate!");
PLAYER_PARTY
Refer to the party members defined in GIVEN
, e.g.:
s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP);
HP_BAR(player, damage: maxHP / 2);
OPPONENT_PARTY
Refer to the party members defined in GIVEN
, e.g.:
s32 maxHP = GetMonData(&OPPONENT_PARTY[0], MON_DATA_MAX_HP);
HP_BAR(opponent, damage: maxHP / 2);
THEN
...
} THEN {
...
}
Contains code to run after the battle has finished. If the test is using PARAMETRIZE
commands then EXPECT
commands between the results should go here. Is also occasionally used to check the internal battle state when checking the behavior via a SCENE
is too difficult, verbose, or error-prone.
FINALLY
...
} FINALLY {
...
}
Contains checks to run after all PARAMETERIZE
commands have run. Prefer to write your checks in THEN
where possible, because a failure in THEN
will be tagged with which parameter it corresponds to.
EXPECT
EXPECT(cond)
Causes the test to fail if cond
is false.
EXPECT_XX
EXPECT_EQ(a, b)
a == b
EXPECT_NE(a, b)
a != b
EXPECT_LT(a, b)
a < b
EXPECT_LE(a, b)
a <= b
EXPECT_GT(a, b)
a > b
EXPECT_GE(a, b)
a >= b
Causes the test to fail if a and b compare incorrectly, e.g.
EXPECT_EQ(results[0].damage, results[1].damage);
EXPECT_MUL_EQ
EXPECT_MUL_EQ(a, m, b)
Causes the test to fail if a*m != b
(within a threshold), e.g.
// Expect results[0].damage * 1.5 == results[1].damage.
EXPECT_EQ(results[0].damage, Q_4_12(1.5), results[1].damage);
Overworld Command Reference
OVERWORLD_SCRIPT
OVERWORLD_SCRIPT(instructions...)
Returns a pointer to a compiled overworld script. Cannot be used to initialize global const
data, although the pointer IS to const
data.
Note that each script command must be followed by a ;, e.g.:
const u8 *myScript = OVERWORLD_SCRIPT(
random 2;
addvar VAR_RESULT, 1;
);
RUN_OVERWORLD_SCRIPT
RUN_OVERWORLD_SCRIPT(instructions...)
Runs an overworld script in the immediate script context, which means that commands like waitstate
are not supported.
RUN_OVERWORLD_SCRIPT(
setvar VAR_RESULT, 3;
);
EXPECT_EQ(GetVar(VAR_RESULT), 3);
Pokeemerald-Expansion Changelogs
1.10.x
- Version 1.10.1 - 🧹 Bugfix Release
- Version 1.10.0 - ✨ Feature Release
1.9.x
- Version 1.9.4 - 🧹 Bugfix Release
- Version 1.9.3 - 🧹 Bugfix Release
- Version 1.9.2 - 🧹 Bugfix Release
- Version 1.9.1 - 🧹 Bugfix Release
- Version 1.9.0 - ✨ Feature Release
1.8.x
- Version 1.8.6 - 🧹 Bugfix Release
- Version 1.8.5 - 🧹 Bugfix Release
- Version 1.8.4 - 🧹 Bugfix Release
- Version 1.8.3 - 🧹 Bugfix Release
- Version 1.8.2 - 🧹 Bugfix Release
- Version 1.8.1 - 🔥 HOTFIX Release
- Version 1.8.0 - ✨ Feature Release
1.7.x
- Version 1.7.4 - 🧹 Bugfix Release
- Version 1.7.3 - 🧹 Bugfix Release
- Version 1.7.2 - 🧹 Bugfix Release
- Version 1.7.1 - 🧹 Bugfix Release
- Version 1.7.0 - ✨ Feature Release
1.6.x
- Version 1.6.2 - 🧹 Bugfix Release
- Version 1.6.1 - 🔥 HOTFIX Release
- Version 1.6.0 - ✨ Feature Release
1.5.x
- Version 1.5.3 - 🔥 HOTFIX Release
- Version 1.5.2 - 🧹 Bugfix Release
- Version 1.5.1 - 🧹 Bugfix Release
- Version 1.5.0 - ✨ Feature Release
1.4.x
- Version 1.4.3 - 🧹 Bugfix Release
- Version 1.4.2 - 🧹 Bugfix Release
- Version 1.4.1 - 🔥 HOTFIX Release
- Version 1.4.0 - ✨ Feature Release
1.3.x
- Version 1.3.0 - ✨ Feature Release
1.2.x
- Version 1.2.0 - ✨ Feature Release
1.1.x
- Version 1.1.1 - 🧹 Bugfix Release
- Version 1.1.0 - ✨ Feature Release
1.0.x
- Version 1.0.0 - ✨ Feature Release
Pre-1.0.x:
- Version 0.9.0 - 🦕 Retroactive Version
Version 1.10.1
## 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.10.1`.
🧬 General 🧬
Added
- Added
FONT_SHORT_NARROWER
by @AsparagusEduardo (commit originally by @agsmgmaster64) in #5101- Narrower font tweaks and font fitting fixes by @kittenchilly in #5782
Changed
- Adds Thief/Covet config to send stolen item to bag and Pickup config to pickup user's item in wild battles by @PhallenTree in #5829
Fixed
- trainerproc: Fix showing incorrect error context by @mrgriffin in #5769
- Fixes UB in caps.c by @AlexOn1ine in #5878
🗺️ Overworld 🗺️
Fixed
- Fix Off-by-One Error in Move Relearner by @iriv24 and @luckytyphlosion in #5778
- Fix HGSS dex sort orders working incorrectly by @ravepossum in #5790
- Egg cycle length fix by @hedara90 and @/BolaDeQueijo on discord discovered the issue. in #5828
- Fixed givemon not respecting perfect IVs for species by @AsparagusEduardo in #5873
- Also removed redundant
RemoveIVIndexFromList
function insrc/daycare.c
, so it usessrc/pokemon.c
's instead
- Also removed redundant
- Fix Script Scrollable Multichoice Arrow Positions by @ghoulslash in #5884
🐉 Pokémon 🐉
Changed
- Updated Ogerpon, Enamorus and Sinistcha sprites by @kittenchilly in #5793
- New Enamorus-Incarnate sprite by @kittenchilly in #5797
Fixed
- Fixes Wormadam define for teachable learnset script by @AlexOn1ine in #5783
- Fix "PlantCloak" references by @AsparagusEduardo in #5821
- Misc pokemon sprite fixes by @Cafeei in #5846
⚔️ Battle General ⚔️
Changed
- Adds Thief/Covet config to send stolen item to bag and Pickup config to pickup user's item in wild battles by @PhallenTree in #5829
Fixed
- Fixes items preventing other switch in effects by @AlexOn1ine in #5732
- Fix Pokemon with No Guard failing OHKO Moves into Semi-Invulnerable Pokemon by @iriv24 and @Cafeei in #5779
- Fix move category and category icon when PSS is off by @ravepossum in #5786
- Added the missing config to use new terrains by @hedara90 in #5792
- Fixes Shed Tail substitute health by @AlexOn1ine in #5826
B_LAST_USED_BALL
and.importance
by @AERDU in #5834- prevents
B_LAST_USED_BALL
from removing balls with.importance = 1
- prevents
- Fixes Quash-affected battlers having the wrong order for End Turn effects by @PhallenTree in #5838
- Fixes Cotton Down and Gulp Missile not interacting correctly with stat reduction prevention effects by @PhallenTree in #5841
- Fix Hit Escape moves giving Exp to the mon that switches in by @kittenchilly in #5844
- Fixed Wish triggering Disguise by @AsparagusEduardo in #5860
- Fixed
MOVE_EFFECT_FREEZE_OR_FROSTBITE
not being usable in battle scripts by @AsparagusEduardo in #5859 - Fixed Ally Switch breaking Illusion by @AsparagusEduardo in #5879
- Fixes gen3 Style Shadows out of place by @AlexOn1ine in #5880
- Fix Salt Cure script by @ghoulslash in #5895
- Fixes Eject Pack / Intimidate issue by @AlexOn1ine in #5902
- Adds Generational config for Magic Guard (Fix for Gen4+) by @AlexOn1ine in #5893
- Fixes Stance Change, Sleep Talk interaction by @AlexOn1ine in #5909
- Fixes Round doubling it's BP if previous Round failed by @AlexOn1ine in #5907
🤹 Moves 🤹
Fixed
- Fixes absorb still draining HP when flinched by @AlexOn1ine in #5814
- Fixes Tidy Up by @AlexOn1ine in #5819
- Ally Switch extra battlerId tracking by @ghoulslash in #5823
- Sheer Force fix and move effect cleanup by @AlexOn1ine in #5812
- New U-turn animation to fix visibility by @AlexOn1ine in #5910
🧶 Items 🧶
Fixed
- Prevent Key Items that open other menus from causing a crash if registered and used from the field by @iriv24 in #5810
- Fixes Clear Amulet displaying the wrong battler and Starting Status displaying the wrong message by @PhallenTree in #5831
- Fixes Room Service lowering the opposite mon in specific scenario by @AlexOn1ine in #5827
🤖 Battle AI 🤖
Fixed
- Fixed ace switching bugs by @Pawkkie and @iriv24 for their diligent testing and debugging support in #5922
🧹 Other Cleanup 🧹
- Converted Stance Change to proper Form Change + Tests by @AsparagusEduardo in #5749
- Removed testing strings for automatic line breaks by @hedara90 in #5757
- Added NBSP and up+down arrows to all fonts by @hedara90 in #5767
- Use
~
or{NBSP}
to insert a non-breaking space into a string.
- Use
- Palette cleanup by @hedara90 in #5661
- Resized some move anim palettes from 256 to 16
- Replace power checks with IS_MOVE_STATUS by @Bassoonian and @AsparagusEduardo in #5820
- Changes Various defines to an Enum by @AsparagusEduardo in #5840
- Fix
IS_MOVE_STATUS
regression by @Bassoonian in #5848 - Remove unused various by @Bassoonian in #5851
- Removed redundant call to FillPalBufferBlack in FRLG whiteout sequence by @AsparagusEduardo in #5854
- Improve README.md by @AsparagusEduardo in #5640
- Fix wrong value for NUM_MOVE_EFFECTS by @Bassoonian in #5913
- Renamed OW type effectiveness function for clarity by @AsparagusEduardo in #5917
- Renamed
GetTypeEffectiveness
toGetOverworldTypeEffectiveness
.
- Renamed
🧪 Test Runner 🧪
Changed
- Gravity fix + Sky Drop Test by @ghoulslash in #5780
- Added missing Belch tests by @AsparagusEduardo in #5881
- Added missing Move Effect TODO tests - Volume D by @AsparagusEduardo in #5887
- Comment out Ally Switch Illusion test by @AsparagusEduardo in #5901
- Fixed leaking tasks not showing up in summary by @AsparagusEduardo in #5890
- Setting Battle configs during tests by @AsparagusEduardo and @SBird1337, @mrgriffin in #5803
- Speed up tests in headless mode by @AsparagusEduardo and @SBird1337 for the original fast intro code. in #5889
- This introduced the config option
B_FAST_INTRO_NO_SLIDE
which removes the sliding into for battles.
- This introduced the config option
- Added missing Move Effect TODO tests - Volume E by @AsparagusEduardo in #5915
Fixed
- Fix test
TIMEOUT
messaging in summary by @AsparagusEduardo in #5772 - Fix octolock + defiant by @ghoulslash in #5781
- Added missing tests + Fix Coaching/Crafty Shield interaction by @AsparagusEduardo in #5796
- Fixed TODO tests not showing up when filtering by name by @AsparagusEduardo in #5894
📚 Documentation 📚
- Fixed changelog links to changelog 1.10 by @AsparagusEduardo in #5758
- Added scope document and made changes to pull request template by @pkmnsnfrn and @Pawkkie and arguably the entire senate in #5706
- Added instructions in PR template to make crediting people more clear by @pkmnsnfrn and @AsparagusEduardo made changes to my text in #5755
- Fix website not showing the "How to add mon" 1.10 tutorial by @AsparagusEduardo in #5813
- Install instructions by @hedara90 in #5876
- Change install.md to mention make debug instead of DINFO=1 by @ravepossum in #5882
- Backport changes from the wiki by @AsparagusEduardo in #5900
- Improve README.md by @AsparagusEduardo in #5640
📦 Branch Synchronisation 📦
pret
- 20th of December in #5845
- Fix recorded battle link player loops by @AsparagusEduardo in pret#2071
- Added
POKEMART_LIST_END
to avoid users accidentally removing it by @AsparagusEduardo in pret#1947 - Fixed brace style inconsistencies by @AsparagusEduardo in pret#2072
- remove
sBirchSpeechPlatformBlackPal
by @DizzyEggg in pret#2075
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.10.0...expansion/1.10.1
Version 1.10.0
## 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.10.0`.
🌋 REFACTORS 🌋
📜 = Uses a migration script.
- Changes Evolution methods to Enums by @AlexOn1ine in #4977
- Turn item hold effects into an enum by @Bassoonian in #5498
- Change
GET_MOVE_TYPE
to a function by @AlexOn1ine in #5090 - Created
COMPOUND_STRING
s for default player names by @fdeblasio in #5037 - Removed agbcc by @mrgriffin in #4994
- Refactor Frontier Brains by @fdeblasio in #5027
- Removed all instances of
gBitTable[x]
by @hedara90 in #5123 - Made
BuildColorMaps
redundant by using static tables by @pkmnsnfrn in #5289 - Removed
FRONTIER_BRAIN_SPRITES
and updatedTRAINER_SPRITE
,TRAINER_BACK_SPRITE
, andTRAINER_CLASS
by @fdeblasio in #5166 - Added
ShouldSwitch
result toAiLogicData
by @Pawkkie and @AlexOn1ine had the idea! in #5440 - Switch AI refactor + considers free switches by @Pawkkie in #5379
- Refactor
ShouldSwitchIfAllBadMoves
by @Pawkkie in #5452 - Updated Wring Out effects to match Eruption effects by @AsparagusEduardo in #5549
- Changed Wring Out/Crush Grip/Hard Press to use
power
instead ofargument
to determine its max power, just like how Eruption/Water Spout/Dragon Energy do it. - Also:
- Renamed
EFFECT_VARY_POWER_BASED_ON_HP
toEFFECT_POWER_BASED_ON_TARGET_HP
- Renamed
EFFECT_ERUPTION
toEFFECT_POWER_BASED_ON_USER_HP
- Renamed
- Changed Wring Out/Crush Grip/Hard Press to use
- Update battle messages to Gen 5+ standards by @kittenchilly in #3240
- Should switch refactor to facilitate switch prediction by @Pawkkie in #5466
- Unwind
TRAINER_CLASS
macro by @SBird1337 in #5611 - Refactors Absorb to use
Moveend
by @AlexOn1ine in #5670- For new absorbing moves an argument should be added in
moves_info.h
- For new absorbing moves an argument should be added in
- Changes name of
B_SCR_NAME_WITH_PREFIX
by @AlexOn1ine in #5675
🧬 General 🧬
Added
- Added performance counter by @hedara90 and @SBird1337 provided the actual code in #5284
- Added debug build target by @u8-Salem in #4817
- Added
AUTO_SCROLL_TEXT
andNUM_FRAMES_AUTO_SCROLL_DELAY
by @pkmnsnfrn in #5054 - Adds
SAVE_TYPE_ERROR_SCREEN
by @pkmnsnfrn in #5188 - Move Relearner and Renaming From Summary Screen by @ravepossum in #5513
- Automatic Line Breaks, somewhat even lines by @hedara90 and @AsparagusEduardo in #5689
- Automatically insert line breaks into a string with
BreakStringAutomatic
. - This function does not modify strings with existing line breaks.
- Remove existing line breaks from a string with
StripLineBreaks
.
- Automatically insert line breaks into a string with
Changed
- Removed agbcc by @mrgriffin in #4994
- Removed all instances of
gBitTable[x]
by @hedara90 in #5123 - Converted Mechadoll text to
COMPOUND_STRING
s by @fdeblasio in #5276 - New terrain bgs by @TheTrueSadfish in #5162
- Removed agbcc screenshots from
.gitignore
by @Bassoonian in #5538 - Set default battle shadow to Gen3 by @hedara90 in #5632
- Note: Trainerslides don't work properly with Gen4 shadows.
- Convert 3 variouses to
callnatives
by @AlexOn1ine in #5646
🗺️ Overworld 🗺️
Added
- FRLG+ whiteout message by @cawtds in #4967
- Dynamic Move Types in Summary Screen/Battle by @Galaxeeh in #5084
- Adds
OW_BERRY_IMMORTAL
by @pkmnsnfrn in #5187 - (Default Off) Item Description Headers by @ghoulslash in #4767
- RTC-based wild encounters by @hjk321 in #5313
- Added
MB_X_Y_STAIR_WARP
metatile behaviors by @pkmnsnfrn in #5278 - Added Sideways Stairs by @ghoulslash in #4836
- Added
OW_UNION_DISABLE_CHECK
andOW_FLAG_MOVE_UNION_ROOM_CHECK
by @pkmnsnfrn in #5448 - Adds new scripting macros to increase developer quality of life by @pkmnsnfrn in #5177
- Added more later gen fishing mechanics by @kittenchilly in #5518
Changed
- Created PokeNav
COMPOUND_STRING
s by @fdeblasio in #4983 - Added
I_REPEL_INCLUDE_FAINTED
config and behavior by @kittenchilly in #5239 - RTC-based wild encounters follow up by @AlexOn1ine in #5328
- Revert rtc based encounters by @AlexOn1ine in #5331
- Made BuildColorMaps redundant by using static tables by @pkmnsnfrn in #5289
- Added
OW_AUTO_SIGNPOST
and associated metatile behaviors by @pkmnsnfrn in #5044 - Added support for overworld sprite gender differences + add all the sprites by @kittenchilly in #5394
Fixed
- Added some null pointer checks by @tertu-m in #5130
- Reset item flags on new game by @ghoulslash in #5363
- Follower female fix by @hedara90 in #5475
🐉 Pokémon 🐉
Added
- Added config to change Vivillon's breeding form by @kittenchilly in #4813
- Added back GBA sprites via config by @AsparagusEduardo and @AlexOn1ine for their help with script to migrate data from vanilla to our current
gSpeciesInfo
in #5206 - Added config to disable gender differences by @AsparagusEduardo in #5595
Changed
- Made perfect IV count into a granular setting by @AsparagusEduardo in #5115
- Updated species defines by @pkmnsnfrn in #5075
- Added support for overworld sprite gender differences + add all the sprites by @kittenchilly in #5394
- Renamed folders and symbols to match species defines by @AsparagusEduardo in #5581
- Burmy and Wormadam footprints were in a
plant
subfolder. They have been moved to the species root folder - Paldean Wooper's subfolder was named
wooper_paldean
instead of justpaldean
. This has been corrected. - Zen Mode Galarian Darmanitan's folder was located in
darmanitan/galarian/zen_mode
. This has been corrected todarmanitan/galar_zen
, alongside Galarian Standard Mode'sdarmanitan/galar_standard
. - Also updated Ogerpon's folders similarly.
- Renamed
SPECIES_PIKACHU_PARTNER_CAP
toSPECIES_PIKACHU_PARTNER
.
- Burmy and Wormadam footprints were in a
- Changing
EVO_NONE
from0xFFFE
to0
by @GhoulMage in #5547- There could be a case for out of bounds errors if arrays or iterations are happening where you're using + 1 or - 1, as
EVO_FRIENDSHIP
used to be the first index although it started with 1.
- There could be a case for out of bounds errors if arrays or iterations are happening where you're using + 1 or - 1, as
Fixed
⚔️ Battle General ⚔️
Added
- FRLG+ whiteout message by @cawtds in #4967
- Added B_SHOW_TYPES and cleaned up IsDoubleBattle by @pkmnsnfrn in #5131
- EV Caps and EV Items by @Flash1Lucky and @AlexOn1ine in #5269
- Added in-battle shadows underneath all enemy battlers by @lhearachel in #5178
- Added Gen 1 Crit Chance by @Pawkkie in #5439
- Added battle flag that prevents running from wild Pokémon by @SarnPoke in #5502
Changed
- Refactor Frontier Brains by @fdeblasio in #5027
- Removed some hardcoding of move IDs + Gen4/5 Defog by @AsparagusEduardo in #5156
- Convert 8 various to
callnatives
by @AsparagusEduardo in #5172 - Anger Shell use
saveattacker
by @ghoulslash in #5409 - Clean up Unseen Fist Check by @AlexOn1ine in #5420
- Updated species defines by @pkmnsnfrn in #5075
- Removes Crit Chance preproc by @AlexOn1ine in #5520
- Update battle messages to Gen 5+ standards by @kittenchilly in #3240
- More post-#3240 cleanup by @kittenchilly in #5593
- Unwind
TRAINER_CLASS
macro by @SBird1337 in #5611 - Removes redundant Decorate check by @AlexOn1ine in #5696
- Changes target bit of Flower Shield by @AlexOn1ine in #5698
Fixed
- Fixed a sprite issue with
B_SHOW_TYPES
by @pkmnsnfrn in #5157 - Dynamic Move Display fixes by @Galaxeeh in #5251
- Fixed a display issue with
B_SHOW_TYPES
by @pkmnsnfrn and @iriv24 in #5201 - Fixed Gen 3 foreseen and Beat Up damage type by @hedara90 in #5323
- Fixes Defog used by the wrong side when there is a Substitue and Screen by @AlexOn1ine in #5381
- Fixes Hidden Power dynamic type bug by @AlexOn1ine in #5463
- Display the correct shadow size when sending out a new Pokemon by @lhearachel in #5618
- Fixed text wrap obtaining the incorrect glyph width by @AsparagusEduardo and @AlexOn1ine for their help verifying that the fix works with one of his custom strings in #5620
- Improve line breaks/scrolls by @cawtds in #5641
- Fixed Order Up + Tera Stellar breaking each other with Commander by @PhallenTree in #5667
- Fixes wrong Id when AI chooses mon to switch in by @AlexOn1ine in #5684
- Fixes Absorb regression caused by #5670 by @AlexOn1ine in #5688
- Fixes heal blocked leeach seed in tests by @AlexOn1ine in #5700
- Trainer class+name expansion fix for Battle Frontier by @hedara90 in #5699
🤹 Moves 🤹
Changed
- Added Population Bomb animation by @kittenchilly in #5194
- Move battle anim arrays to C by @cawtds in #5306
- Grass/Water Pledge Swamp Animation + Sea of Fire animation tweak by @SonikkuA-DatH in #5325
- New animations for many moves more details in description by @TheTrueSadfish in #5367
- Use move effect for some moves instead of ids by @AlexOn1ine in #5433
- Adds Commander and Order Up by @AlexOn1ine in #5246
- Heart Swap Move Animation by @SonikkuA-DatH in #5460
- Update
shed_tail.c
by @Bassoonian in #5494 - Added Ion Deluge animation by @kittenchilly in #5467
- Updated Wring Out effects to match Eruption effects by @AsparagusEduardo in #5549
- Changed Wring Out/Crush Grip/Hard Press to use
power
instead ofargument
to determine its max power, just like how Eruption/Water Spout/Dragon Energy do it. Also: - Renamed
EFFECT_VARY_POWER_BASED_ON_HP
toEFFECT_POWER_BASED_ON_TARGET_HP
- Renamed
EFFECT_ERUPTION
toEFFECT_POWER_BASED_ON_USER_HP
- Changed Wring Out/Crush Grip/Hard Press to use
- Refactors Absorb to use Moveend by @AlexOn1ine in #5670
- For new absorbing moves an argument should be added in
moves_info.h
- For new absorbing moves an argument should be added in
Fixed
- Dark Void, Clangorous Soulblaze, vortex animation fixes by @TheTrueSadfish in #5650
🎭 Abilities 🎭
Changed
- Adds Commander and Order Up by @AlexOn1ine in #5246
🧶 Items 🧶
Added
- Adds
OW_BERRY_IMMORTAL
by @pkmnsnfrn in #5187 - Added functionality to Poké Flute and Town Map by @kittenchilly and @LOuroboros basically did the Town Map implementation in #5405
- Decouple Poke Ball ids from item ids by @AlexOn1ine in #5560
Changed
- Consolidated the values of Rotom's moves and added Gen9 base form effect by @fdeblasio in #5186
- Added
I_REPEL_INCLUDE_FAINTED
config and behavior by @kittenchilly in #5239
Fixed
- Replace hardcoded flute check with consumability check by @Bassoonian in #5508
🤖 Battle AI 🤖
Added
- Adds config to show target of ingame partner by @AlexOn1ine in #5307
- Switch AI refactor + considers free switches by @Pawkkie in #5379
- New AI flag for marking the two last Pokémon as Ace Pokémon by @GhoulMage in #5587
Changed
- Chilly Reception AI by @kittenchilly in #5271
- Shed Tail AI by @SarnPoke and @AlexOn1ine, @Pawkkie in #5275
- More missing AI logic by @kittenchilly in #5279
- Adds basic trainer and smart trainer flags by @AlexOn1ine in #5298
AI_FLAG_SETUP_FIRST_TURN
rename and clarifications by @Pawkkie in #5310- Added Composite AI Flags to Docs by @Pawkkie in #5349
- AI frostbite score fixes and improvements by @Pawkkie and @kittenchilly for the suggestion! in #5362
- Switch AI
hitsToKO
considers one shot prevention by @Pawkkie in #5371 - Adds
CanEndureHit
AI function by @AlexOn1ine in #5373 - Switch AI
hitsToKO
considers Disguise by @Pawkkie in #5375 - Added
ShouldSwitch
result toAiLogicData
by @Pawkkie and @AlexOn1ine had the idea! in #5440 - Removes duplicate code in AI functions by @AlexOn1ine in #5457
- Unify
GetBattlerAbility
/TerrainAffected
to remove duplicate ai function by @AlexOn1ine in #5497 ShouldSwitchIfGameStatePrompt
Tests by @Pawkkie in #5462AI_FLAG_ACE_POKEMON
takes into account separate trainers by @GhoulMage and @/uvula on Discord noted the weird behaviour. in #5608- Fix for the AI not considering both trainers Ace Pokémons in double battles with
AI_FLAG_ACE_POKEMON
.
- Fix for the AI not considering both trainers Ace Pokémons in double battles with
- Moves that deal a Fixed amount don't need AI handling by @AlexOn1ine in #5614
- Combines
CalculateMoveDamage
arguments into a struct by @AlexOn1ine in #5570
Fixed
- AI burn score fixes and improvements by @Pawkkie and @iriv24 and @AlexOn1ine in #5356
- Improve AI's Skill Swap handling in double battles by @Pawkkie in #5360
- Refactor
ShouldSwitchIfAllBadMoves
by @Pawkkie in #5452 - Should switch refactor to facilitate switch prediction by @Pawkkie in #5466
- Fixes Switch in flag not restoring mons properly with test by @Pawkkie and @iriv24 for finding, @AlexOn1ine for fixing in #5746
🧹 Other Cleanup 🧹
- Removed metadata in AIF files by @SombrAbsol in #4958
- Removed
gPaletteDecompressionBuffer
and unused palette functions/vars by @DizzyEggg in #4841 - Changes Evolution methods to
enum
s by @AlexOn1ine in #4977 - Doesn't compile on some compilers by @AlexOn1ine in #5099
- Update
event.inc
to accomodate newgDecompressionBuffer
name by @Bassoonian in #5100 - Created
COMPOUND_STRING
s for default player names by @fdeblasio in #5037 - Changed single-use berry blender strings to be
COMPOUND_STRING
s by @fdeblasio in #4963 - Made perfect IV count into a granular setting by @AsparagusEduardo in #5115
- Dynamic move type clean up by @AlexOn1ine in #5132
- Refactor Frontier Brains by @fdeblasio in #5027
- Removed some hardcoding of move IDs + Gen4/5 Defog by @AsparagusEduardo in #5156
- Teatime animations use
B_WAIT_TIME_LONG
by @AsparagusEduardo in #5173 - Created PokeNav
COMPOUND_STRING
s by @fdeblasio in #4983 - Removed
gBitTable
usage again by @hedara90 in #5193 - Removed support for the original LCG random number generator by @tertu-m in #5078
- Deprecate MMBN Names by @pkmnsnfrn in #5240
- Convert 8 various to
callnatives
by @AsparagusEduardo in #5172 - Converted PC strings to
COMPOUND_STRING
s by @fdeblasio in #5314 - Cleaned up duplicate dynamic type functions by @AsparagusEduardo in #5338
- Removes redundant
moveTargetType
ai function by @AlexOn1ine in #5354 - Made
BuildColorMaps
redundant by using static tables by @pkmnsnfrn in #5289 - Some strings were switched by @AlexOn1ine in #5374
- Switch AI hitsToKO considers Disguise by @Pawkkie in #5375
- Cleaned up a bit of code with
GetBattlerPartyData
by @AlexOn1ine in #5378 - Minor Gem check optimazation by @AlexOn1ine in #5401
- Simplify HP Logic by @AreaZR in #5403
- Anger Shell use
saveattacker
by @ghoulslash in #5409 - Converted berry and PokeBlock strings to
COMPOUND_STRING
s by @fdeblasio in #5324 - Merge item description branch history by @Bassoonian in #5419
- Clean up Unseen Fist Check by @AlexOn1ine in #5420
- Merge level_caps and ev_caps into one caps file by @kittenchilly in #5429
- Removed trailing whitespace pass 10-2-2024 (Upcoming) by @kittenchilly in #5456
- Fixed Commander test name by @Bassoonian in #5458
- Updated species defines by @pkmnsnfrn in #5075
- Adds padding in
AiLogicData
by @AlexOn1ine in #5468 - Simplify
BS_FAINTED_MULTIPLE_1
double battle logic in openpartyscreen by @ghoulslash in #5435 - Removes duplicate code in AI functions by @AlexOn1ine in #5457
ShouldPivot
type cleanup by @Pawkkie in #5441- Turn item hold effects into an enum by @Bassoonian in #5498
- Unify
GetBattlerAbility
/TerrainAffected
to remove duplicate ai function by @AlexOn1ine in #5497 - Clean up Shedinja code by @Bassoonian in #5501
- Clean up
scrcmd
PR by @Bassoonian in #5511 - Removes Crit Chance preproc by @AlexOn1ine in #5520
- Removed agbcc screenshots from gitignore by @Bassoonian in #5538
- Removed unnecessary
gBattlerAttacker
usage by @AlexOn1ine in #5554 - Removed remaining line breaks from #3240 + Prefix wrap fix by @AsparagusEduardo in #5556
- More post-#3240 cleanup by @kittenchilly in #5593
- Renamed folders and symbols to match species defines by @AsparagusEduardo in #5581
- Also:
- Burmy and Wormadam footprints were in a
plant
subfolder. They have been moved to the species root folder - Paldean Wooper's subfolder was named
wooper_paldean
instead of justpaldean
. This has been corrected. - Zen Mode Galarian Darmanitan's folder was located in
darmanitan/galarian/zen_mode
. This has been corrected todarmanitan/galar_zen
, alongside Galarian Standard Mode'sdarmanitan/galar_standard
. - Also updated Ogerpon's folders similarly.
- Renamed
SPECIES_PIKACHU_PARTNER_CAP
toSPECIES_PIKACHU_PARTNER
.
- Minor
BattleStruct
clean up by @AlexOn1ine in #5585 - Fixed a ball update oversight by @Bassoonian in #5609
AI_FLAG_ACE_POKEMON
takes into account separate trainers by @GhoulMage and @/uvula on Discord noted the weird behaviour in #5608- Fix for the AI not considering both trainers Ace Pokémons in double battles with
AI_FLAG_ACE_POKEMON
.
- Fix for the AI not considering both trainers Ace Pokémons in double battles with
- Moves that deal a Fixed amount don't need AI handling by @AlexOn1ine in #5614
- Combines
CalculateMoveDamage
arguments into a struct by @AlexOn1ine in #5570 - Follow up for #5570 by @AlexOn1ine in #5625
AI_CalcDamage
clean up by @AlexOn1ine in #5629- Convert 3 variouses to
callnatives
by @AlexOn1ine in #5646 - Convert
gBattleStringsTable
toCOMPOUND_STRING
s by @AsparagusEduardo in #5649 - Added merged placeholder text for trainer name with class by @kittenchilly in #5622
- Cleans up Primal Reversion code by @AlexOn1ine in #5659
- Critical Hit documentation and distorted match up struct switch by @AlexOn1ine in #5665
- Changes name of
B_SCR_NAME_WITH_PREFIX
by @AlexOn1ine in #5675 - Removes redundant Decorate check by @AlexOn1ine in #5696
- Changes taget bit of Flower Shield by @AlexOn1ine in #5698
- Changing
EVO_NONE
from0xFFFE
to0
by @GhoulMage in #5547- There could be a case for out of bounds errors if arrays or iterations are happening where you're using + 1 or - 1, as
EVO_FRIENDSHIP
used to be the first index although it started with 1.
- There could be a case for out of bounds errors if arrays or iterations are happening where you're using + 1 or - 1, as
🧪 Test Runner 🧪
Changed
- Fixed Commander test name by @Bassoonian in #5458
ShouldSwitchIfGameStatePrompt
Tests by @Pawkkie in #5462- Added various tests, add
RNG_RANDOM_TARGET
by @ghoulslash in #5438 - Added Costar Tests, Download Test for Doubles by @ghoulslash in #5526
- Updated Wring Out effects to match Eruption effects by @AsparagusEduardo in #5549
- Changed Wring Out/Crush Grip/Hard Press to use
power
instead ofargument
to determine its max power, just like how Eruption/Water Spout/Dragon Energy do it. Also: - Renamed
EFFECT_VARY_POWER_BASED_ON_HP
toEFFECT_POWER_BASED_ON_TARGET_HP
- Renamed
EFFECT_ERUPTION
toEFFECT_POWER_BASED_ON_USER_HP
- Changed Wring Out/Crush Grip/Hard Press to use
- Healer ability tests by @Pawkkie in #5559
- Mark all tests as used by @mrgriffin in #5531
Fixed
- Should switch refactor to facilitate switch prediction by @Pawkkie in #5466
📚 Documentation 📚
DoBattleIntro
state documentation by @AsparagusEduardo and @ShinyDragonHunter in #5231- Deprecate MMBN Names by @pkmnsnfrn in #5240
AI_FLAG_SETUP_FIRST_TURN
Rename and Clarifications by @Pawkkie in #5310- Added Composite AI Flags to Docs by @Pawkkie in #5349
- Updated the new pokemon tutorial for 1.10 by @hedara90 in #5721
- Some changes compared to previous.
New Contributors
- @SombrAbsol made their first contribution in #4958
- @Galaxeeh made their first contribution in #5084
- @Flash1Lucky made their first contribution in #5269
- @GhoulMage made their first contribution in #5547
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.4...expansion/1.10.0
Version 1.9.4
## 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.9.4`.
🌋 IMPORTANT 🌋
- This update integrates pret's latest Makefile changes, which rearranges the entire file in order to speed up compilation times overall. If you did any changes to it (such as installing Poryscript) and are having issues resolving the conflicts, keep expansion's version of Makefile and reapply your changes afterwards.
🧬 General 🧬
Fixed
- Fixed alignment errors in
EWRAM_INIT
and friends when using u8, u16, etc. by @aronson in #5512 - Update test LD script to respect 4 byte data section alignment by @aronson in #5517
- Fixed Missing
string_util.h
include inmini_printf.c
by @mrgriffin in #5572 - Fixed unnecessary dependency scanning for test build and test rom names by @ravepossum in #5594
- Fixed makefile: dependencies for
map_group_count.h
by @SBird1337 in #5648- Fixes an issue that caused the build to fail on updates to
src/debug.c
due to mismatched dependency.
- Fixes an issue that caused the build to fail on updates to
🗺️ Overworld 🗺️
Changed
- Followers sprite fixes by @Cafeei in #5669
- Follower fixes, Melmetal, Patrat, Woobat by @hedara90 in #5685
- Fixed Farfetch'd overworld sprite by @hedara90 in #5711
Fixed
- Fixed Berry mutations always generating a Persim Berry by @Bassoonian in #5504
🐉 Pokémon 🐉
Changed
- Changing
EVO_NONE
from0xFFFE
to0
by @GhoulMage in #5547- There could be a case for out of bounds errors if arrays or iterations are happening where you're using + 1 or - 1, as
EVO_FRIENDSHIP
used to be the first index although it started with 1.
- There could be a case for out of bounds errors if arrays or iterations are happening where you're using + 1 or - 1, as
- PokeCommunity sprites batch (October) by @kittenchilly in #5655
- Followers sprite fixes by @Cafeei in #5669
- Follower fixes, Melmetal, Patrat, Woobat by @hedara90 in #5685
- Fixed Farfetch'd overworld sprite by @hedara90 in #5711
Fixed
- Fixed
P_FRIENDSHIP_EVO_THRESHOLD
not checking for Gen 8 by @kittenchilly in #5503 - Fixed HGSS dex search printing wrong mon after selecting evos by @ravepossum in #5552
- Fixed 64px uncompressed followers by @hedara90 in #5601
- Deoxys Sprite/Animation Fixes by @SarnPoke in #5603
- Fixes Aegislash not reverting back by @AlexOn1ine in #5734
⚔️ Battle General ⚔️
Changed
- Fixed damage calc modifiers by @AlexOn1ine in #5604
Fixed
- Fixed Shiny Pokemon not being shiny after transforming with a gimmick by @hedara90 in #5573
- Handle showdowns apostrophe the same way as ASCII apostrophe by @cawtds in #5712
- Fixes Misty Terrain displaying wrong message by @AlexOn1ine in #5742
- Fixes Dynamax dynamic move type by @AlexOn1ine in #5739
🤹 Moves 🤹
Changed
- Fixed damage calc modifiers by @AlexOn1ine in #5604
- Updated ability popups for Skill Swap, Mummy/Lingering Aroma, Worry Seed, Simple Beam, fix Doodle/Role Play bugs by @PhallenTree in #5493
Fixed
- Fixed Follow Me failing in Single Battles for Gen 6/7 config by @AsparagusEduardo in #5542
- Fixed
AnimTask_HorizontalShake
uses for shaking screen in battle anims by @ghoulslash in #5562 - Fixed weather genie move anims and Springtide Storm targets by @ravepossum in #5553
- Fixes Magic Guard not preventing Salt Cure by @AlexOn1ine in #5583
- Fixes Dragon Tail using the effect twice during a Parental Bond attack by @AlexOn1ine in #5630
- Fixes Magic Coat message by @AlexOn1ine in #5645
- Fixes Take heart by @AlexOn1ine in #5658
- Fixed Floral Healing anim by @AlexOn1ine in #5733
- Fixes Population Bomb / Triple Kick missing message by @AlexOn1ine in #5747
- Changes Max Phantasm move anim script call by @AlexOn1ine in #5737
- Fixes Partner targeting and Acupressure/Ally Switch interaction by @AlexOn1ine in #5446
- Revival Blessing fixes + Using Lunar Blessing's animation by @ghoulslash in #5490
- Fixed curse + Protean interaction by @hedara90 in #5663
- Added Minimize interaction to Supercell Slam by @hedara90 in #5713
🎭 Abilities 🎭
Changed
- Fixed damage calc modifiers by @AlexOn1ine in #5604
Fixed
- Adds tests and Costar fix from PR #5526 by @AlexOn1ine in #5529
- Fixes Red Card / Eject Pack interaction with Emergency Exit by @AlexOn1ine in #5657
- Fixed curse + Protean interaction by @hedara90 in #5663
- Mimicry updates typing with
RemoveAllTerrains()
by @AERDU in #5666 - Updated ability popups for Skill Swap, Mummy/Lingering Aroma, Worry Seed, Simple Beam, fix Doodle/Role Play bugs by @PhallenTree in #5493
- Fixed curse + Protean interaction by @hedara90 in #5663
- Fixes Ice Face regression by @AlexOn1ine in #5678
- Fixes Neutralizing Gas crashes + adds missing interaction, Regenerator small fix by @PhallenTree in #5694
🧶 Items 🧶
Changed
- Removes duplicate Booster Energy code by @AlexOn1ine in #5656
Fixed
- Fixes Red Card / Eject Pack interaction with Emergency Exit by @AlexOn1ine in #5657
- Fixes Red Card / Eject Pack interaction by @AlexOn1ine in #5724
- Fixes gems triggering on confusion damage by @AlexOn1ine in #5723
- Fixes Kee Maranga and Enigma Berry by @AlexOn1ine in #5727
- Fixes Blunder Policy by @AlexOn1ine in #5722
- Fixes Rusted Shield/Sword allowed to be Knocked Off from Zamazenta/Zacian by @iriv24 in #5750
🤖 Battle AI 🤖
Fixed
- Fixed certain move data being cleared on turn end by @Pawkkie and @AlexOn1ine in #5488
- Global is used instead of passed var by @AlexOn1ine in #5546
- Fixes
dynamicMoveType
global not being reset during AI calcs by @AlexOn1ine in #5628
🧹 Other Cleanup 🧹
- Remove one redundant call of
SetAiLogicDataForTurn
inDoBattleIntro
by @AlexOn1ine in #5491 - Cleanup extraneous function in
battle_anim.h
by @hedara90 in #5506 - Add newline to move relearner string by @Bassoonian in #5523
- Fixed 10,000,000 Volt Thunderbolt name by @AsparagusEduardo in #5533
- Added constant to expansion inclusive copyright magic number by @pkmnsnfrn in #5413
- Centralise AI Tests trainer name by @Bassoonian in #5532
- Remove now outdated information from readme by @Bassoonian in #5548
- Changing
EVO_NONE
from0xFFFE
to0
by @GhoulMage in #5547- There could be a case for out of bounds errors if arrays or iterations are happening where you're using + 1 or - 1, as
EVO_FRIENDSHIP
used to be the first index although it started with 1.
- There could be a case for out of bounds errors if arrays or iterations are happening where you're using + 1 or - 1, as
- Shed Skin chance fix by @Pawkkie in #5558
- Restore test file dependencies so they're rebuilt properly by @ravepossum in #5617
- Improve
SEND_OUT
error message; require Speed for all battlers by @mrgriffin in #5631 - Removes duplicate Booster Energy code by @AlexOn1ine in #5656
- Wrong assumtion in dauntless_shield.c by @AlexOn1ine in #5692
🧪 Test Runner 🧪
Added
Changed
- Add text width tests for move, ability, item, and pokedex descriptions by @kittenchilly in #5505
- Centralise AI Tests trainer name by @Bassoonian in #5532
- Add basic Steam Engine, Guard Dog Tests by @ghoulslash in #5569
- Fixed damage test by @GhoulMage and @mrgriffin for teaching me pokeemerald-expansion tests in #5574
- Fallback
memmem
implementation by @mrgriffin in #5561 - Hydra: Support
%p
in test summaries by @mrgriffin in #5626 - Improve
SEND_OUT
error message; require Speed for all battlers by @mrgriffin in #5631 - Check that
PASSES_RANDOMLY
affected aRandom
call by @mrgriffin in #5635 - Wrong assumtion in dauntless_shield.c by @AlexOn1ine in #5692
Fixed
- Update test LD script to respect 4 byte data section alignment by @aronson in #5517
- Adds tests and Costar fix from PR #5526 by @AlexOn1ine in #5529
- Fixed broken Starting Terrain test by @hedara90 in #5582
📚 Documentation 📚
- Add changelog header in PR template to aid automation by @AsparagusEduardo in #5539
- Added compressed OW mon VRAM notice in config file by @AsparagusEduardo in #5599
- Update
README.md
to link toINSTALL.md
by @Pawkkie in #5720 - Fixes minor move desc errors by @AlexOn1ine in #5728
📦 Branch Synchronisation 📦
pret
- 15th of October in #5527
- Slight storage system documentation by @luckytyphlosion in pret#2024
- Clean up defines lacking spaces by @Bassoonian in pret#2025
- UB fix in battle_transition.c by @cawtds in pret#2007
- preproc: support arbitrary expressions in enums by @mrgriffin in pret#2026
- [Build System Rewrite] Refactored
Makefile
by @Icedude907 in pret#1950 - Fixed incorrect point macros in contest_ai_script.inc by @NTx86 in pret#2028
- [Build System Rewrite] Massive build speed improvement via scaninc changes by @Icedude907 in pret#1954
- [Build System Rewrite] Improved audio rules by @Icedude907 in pret#1957
- Update INSTALL.md to state that Windows 8 is no longer supported by Microsoft by @luciofstars in pret#2029
- Update pull_request_template.md to include Discord username update by @luciofstars in pret#2030
- remove ScriptContext_Enable from secret_base.h by @DizzyEggg in pret#2032
- Remove gflib by @Kurausukun in pret#2033
- Minor toolchain fixes by @GriffinRichards in pret#2031
- Bugfix for cable car hikerGraphicsIds array by @Scyrous in pret#2039
- Remove explicit symbol sizes in sym_common.txt by @GriffinRichards in pret#2038
- Ignore mGBA screenshots by @Jaizu in pret#2041
- Replaced copyright magic numbers in intro.c with constants by @pkmnsnfrn in pret#2035
- Fixed typo: | should be || in Task_TryFieldPoisonWhiteOut by @AreaZR in pret#2044
- [preproc] support C23 enum underlying type syntax by @mrgriffin in pret#2043
- Fixed deleting files with dependency files by @mid-kid in pret#2045
- Remove unnecessary looping for rule generation and unroll macros by @mid-kid in pret#2046
- Get rid of common syms by @luckytyphlosion in pret#2040
- Bugfix for cable car hikerGraphicsIds array by @Scyrous in pret#2039
- UB fix in battle_transition.c by @cawtds in pret#2007
- Fixed typo: | should be || in Task_TryFieldPoisonWhiteOut by @AreaZR in pret#2044
- Get rid of common syms by @luckytyphlosion in pret#2040
- Fixed incorrect point macros in contest_ai_script.inc by @NTx86 in pret#2028
- 5th of November in #5644
- 29 of November in #5736
- Remove usage of gHeap in sSpritePalettes_ContestantsTurnBlinkEffect by @Lactozilla in pret#2064
- BUGFIX: Fix Counter and Mirror Coat checking the wrong category by @surtr-games in pret#2066
- Add TRY_DRAW_SPOT_PIXEL by @GriffinRichards in pret#2055
- Added extra encoded character support by @AsparagusEduardo in pret#2050
merrp's followers
- Merrp merge (12th of October) by @Bassoonian in #5514
- d80190fe105eee12bbf74ae29647ac909084d35c fix: Dig in Sealed Chamber no longer freezes follower.
New Contributors
- @AERDU made their first contribution in #5666
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.3...expansion/1.9.4
Version 1.9.3
## 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.9.3`.
🌋 REFACTORS 🌋
📜 = Uses a migration script.
- Converted
settotemboost
command tocallnative
in #5418 - Removed unused
RESOURCE_FLAG_TRACED
in #5430 - Changed
MOVEEND_
defines to an enum in #5449
✨ Feature Branches ✨
merrp/aarant's Followers
Fixed
- Fixed Expansion-exclusive issue that caused trainers to not play their "pointing" animation when Followers were out during battle intro by @kittenchilly in #5406
⚔️ Battle General ⚔️
Changed
- Improved Mega evolution animation to make it a little smoother by @kleenxfeu in #4816
Fixed
- Fixed affection check for exp multiplier by @Bassoonian in #5421
- Fixed multiple Primal Reversions not occurring if multiple battlers fainted on the previous turn by @PhallenTree in #5430
🤹 Moves 🤹
Added
- Added missing
B_AFTER_YOU_TURN_ORDER
config by @PhallenTree in #5400- Gen 5-7: After You fails if the order remains the same after using After You.
- Gen 8+: After You no longer fails if the turn order remains the same after using After You.
- Added missing
B_QUASH_TURN_ORDER
config by @PhallenTree in #5400- Gen 5-7: If multiple Pokémon are affected by Quash, they move in the order they were affected by Quash.
- Gen 8+: If multiple Pokémon are affected by Quash, they now move fastest to slowest.
- Added missing updated
B_UPDATED_CONVERSION_2
by @wiz1989 in #5453- Gens 2-4: Conversion 2 changes the user's type to a type that is resistant/immune to the last move the user was hit by.
- Gen 5+: Conversion 2 changes the user's type to a type that resists the last move used by the selected target.
Fixed
- Fixed Scale Shot corrupting the move used on the next turn by @AlexOn1ine in #5397
- Fixed Growth's description not being updated based on
B_GROWTH_STAT_RAISE
by @nescioquid in #5398 - Fixed Quash not updating the battlers' actions correctly by @PhallenTree in #5400
- Cleanup by @PhallenTree in #5430
- Fixed Snatched Swallow not recovering HP if the Snatcher is not under the effect of Stockpile (should still heal) by @PhallenTree in #5430
- Fixed Counter users being damaged by Spiky Shield by @AlexOn1ine in #5402
- Fixed Electrified Dragon Darts not correctly avoiding targets with ability immunity (Volt Absorb, Motor Drive) by @PhallenTree in #5430
- Fixed Trace not activating a switch-in ability it traces (eg. Intimidate) by @PhallenTree in #5430
- Removed unused
RESOURCE_FLAG_TRACED
.
- Removed unused
- Fixed recoil damage not triggering healing berries by @AlexOn1ine in #5449
- Also changed
MOVEEND_
defines to an enum.
- Also changed
🎭 Abilities 🎭
Fixed
- Fixed Dancer activating even if the dance move is stolen by Snatch by @PhallenTree in #5430
- Fixed Ability popup when multiple Pokémon faint at the same time by @PhallenTree in #5430
- Multiple ability fixes by @PhallenTree in #5447
- Fixed Protosynthesis/Quark Drive sometimes not activating ability popup despite still gaining the boost as they should.
- Fixed Protosynthesis/Quark Drive activating on Transformed battlers.
- Fixed Protosynthesis activating despite Cloud Nine being present on the field.
- Fixed Quark Drive not activating if the battler is not grounded.
- Fixed Protosynthesis/Quark Drive/Beast Boost stat raise priority when multiple stats are tied for the highest one.
- Before:
Attack, Defense, Speed, Special Attack, Special Defense
. - After:
Attack, Defense, Special Attack, Special Defense, Speed
.
- Before:
🧶 Items 🧶
Fixed
- Fixed Ogerpon's Masks not increasing the power of moves by 20% by @AlexOn1ine in #5391
- Fixed Jubilife Muffin not working by @kittenchilly in #5444
- Fixed duplicating flute bug in double battles by @ghoulslash in #5436
🤖 Battle AI 🤖
Fixed
- Fixed Trick/Switcheroo giving AI score even if the opponent has no held item by @kittenchilly in #5412
- Various AI fixes in
AI_CalcMoveEffectScore
by @ghoulslash in #5474- Missing break from
EFFECT_ABSORB
switch case. - Using last used move for Mirror Move instead of predicted move.
- Missing break from
🧹 Other Cleanup 🧹
Changed
- Converted
settotemboost
command tocallnative
by @ghoulslash in #5418 - Removed trailing whitespace by @kittenchilly in #5455
- Removed binary match workaround for Rayquaza's tail in Sootopolis' cutscene by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5480
Fixed
- Fixed potential uninitialized behavior in
ChangeOrderTargetAfterAttacker
by @AlexOn1ine in #5393 - Fallback on default BW map pop-up theme to reduce potential for error by @ravepossum in #5392
- Multiple typo fixes by @nescioquid in #5398
- VS Seeker documentation fix by @Bassoonian in #5415
🧪 Test Runner 🧪
Added
- Added missing After You and Quash tests by @PhallenTree in #5400
Changed
- Improved Tangling Hair test to make sure that chained effects do not overwrite relevant battler IDs by @ghoulslash in #5423
- Improved Full Heal item tests by @kittenchilly in #5444
Fixed
- Fixed Wake-Up Slap test typo by @Pawkkie in #5442
- Fixed test assumption fail summary fields using more memory than needed by @AsparagusEduardo in #5443
- Fixed issue with
PASSES_RANDOMLY
in AI tests by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/5486
New Contributors
- @nescioquid made their first contribution in #5398
- @kleenxfeu made their first contribution in #4816
- @wiz1989 made their first contribution in #5453
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.2...expansion/1.9.3
Version 1.9.2
## 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.9.2`.
🌋 REFACTORS 🌋
📜 = Uses a migration script.
- Remove unused
BattleScript_WindPowerActivatesEnd2
in #5257 - Refactored in-battle disobedience to fix bug in #5245
💥 Hardlock/Softlock/Crash/Compiling fixes 💥
- Fixed hardlock when Hyperspace Fury is used by Hoopa Unbound by @AlexOn1ine in #5237
- Fixed compile error when
OW_POKEMON_OBJECT_EVENTS
isTRUE
butP_HISUIAN_FORMS
isFALSE
around Basculin by @hjk321 in #5256 - Fixed hardlock when the AI cannot choose moves due to its opponent having Wonder Guard by @Pawkkie and Wiz in #5317
- Fixed multiple Pledge move hardlocks
- Fixed potential hardlock when attempting to use Pledge moves on the same turn that the user would wake up by @PhallenTree in #5330
- Fixed hardlock when the opponent's combo doesn't happen when cancelled by sleep by @hedara90 and @PhallenTree in #5339
- Fixes hardlock when the opponent's combo doesn't happen when cancelled by freeze by @PhallenTree in #5340
- Fixed hardlock when the opponent's combo doesn't happen when cancelled by Powder by @hedara90 in #5341
🧬 General 🧬
Fixed
- Fixed loading into the wrong version of a map after saving in areas with multiple layouts by @hedara90 in #5347
🐉 Pokémon 🐉
Added
- Added
OVERWORLD_SET_ANIM
macro to allow using custom animation tables for Overworld Pokémon by @hedara90 in #5309- Added asymetrical Farfetch'd sprites using a previously unused table from merrp's followers branch.
- Added unique sprites for overworld Pumpkaboo and Gourgeist forms by @hedara90 in #5390
- Added missing Sirfetch'd competitive alias (
SPECIES_SIRFETCH_D
) by @cawtds in #5283 - Added Paldean Wooper and Clodsire overworld sprites by @Cafeei in #5277
- Added missing Gen 9 Overworld sprites by @Liamjd14 in #5304
- Original sprites by Darkus_Shadow, Princess-Phoenix, shaderr31, Molfang62, CarmaNekko, EduarPokeN, Larryturbo, TyranitarDark and Anarlaurendil
- Sources:
- Added missing overworld sprites by @Liamjd14 in #5336
- New Sprites:
- Oricorio Pom Pom/Pa'U/Sensu, Zygarde 10%/Complete and Original Color Magearna
- Credits to: Princess-Phoenix, Larryturbo, Kidkatt, Zender1752 and SageDeoxys.
- Black/White Kyurem
- Credits to: Larryturbo.
- Shaymin Sky and Therian Tornadus/Thundurus/Landorus
- Credits to: @Liamjd14
- Oricorio Pom Pom/Pa'U/Sensu, Zygarde 10%/Complete and Original Color Magearna
- Using their base form's sprites
- Totem Raticate/Mimikyu/Marowak and Partner Pikachu/Eevee
- New Sprites:
- Added Added asymmetrical overworld sprites by @Liamjd14 in #5336
- Slowbro (Galarian), Tinkatink, Tinkatuff, Tinkaton and Scovillain
- Enabled in
gSpeciesInfo
by @Liamjd14 in #5385
Changed
- Improved Garganacl and Naclstack battle sprites by using the ones from @CyanSMP64's repo by @kittenchilly in #5142
- Improved both shiny Indeedee by @Cafeei in #5285
- Shiny Combusken now uses its Gen8+ palette by @Cafeei in #5333
Fixed
- Reenabled unused female Indeedee overworld sprite by @Cafeei in #5285
- Fixed G-Max Corviknight and Centiskorch's expanded names by @PhallenTree in #5296
- Fixed G-Max Cinderace back sprite by @hedara90 in #5295
- Fixed Shiny Mothim' by @Cafeei in #5333
- Fixed multiple battle sprite issues by @kittenchilly in #5142
- Sprite issues:
- Bombirdier, Mega Absol/Aerodactyl/Latias/Latios/Salamence, Orthworm and Veluza.
- Shiny issues:
- Bombirdier, Kilowattrel, Landorus, Magearna, Mega Diancie/Medicham, Galarian Ponyta, Shroodle, Spidops and Wattrel.
- Sprite issues:
- Fixed multiple overworld Pokémon sprites - Part 1 by @Cafeei in #5241
- "Blinking pixels":
- Dwebble, Krookodile, Servine, Throh and Vulpix.
- Shiny Palettes
- Crustle, Excadrill, Lillipup, Serperior, Servine, Sigilyph, Swoobat, Tranquil and Venipede.
- Misc fixes:
- Archen, Basculin, Blitzle, Crustle, Escavalier, Krokorok, Krookodile, Sawsbuck, secondary, Serperior, Snivy, Throh, Woobat, Zebstrika
- "Blinking pixels":
- Fixed multiple overworld Pokémon sprites - Part 2 by @Cafeei in #5333
- Palette Fixes:
- Shiny Riolu/Snover, Oshawott, Kabutops, Shieldon, Kingler and Groudon.
- Fixed "Blinking pixels":
- Abomasnow, Aggron, Alakazam, Ariados, Articuno, Azumarill, Barboach, Bayleef, Bibarel, Blastoise, Celebi, Charmeleon, Cherrim, Chinchou, Cloyster, Corphish, Corsola, Crawdaunt, Cubone, Dewott, Doduo, Dusknoir, Electabuzz, Espeon, Exeggcute, Farfetch'd, Feraligatr, Flaafy, Flareon, Floatzel, Furret, Gastly, Girafarig, Giratina, Gligar, Gloom, Golbat, Grumpig, Hariyama, Heatran (just reduced), Hoppip, Jolteon, Jumpluff, Kricketot, Larvitar, Leafeon, Lileep, Lumineon, Luxio, Luxray, Machamp, Magneton, Mantine, Mantyke, Marowak, Meowth, Mesprit, Mew, Mewtwo, Mime Jr, Moltres, Numel, Oshawott, Phione, Pinsir, Politoed, Porygon-Z, Probopass, Quilava, Qwilfish, Rampardos, Rapidash, Regirock, Sceptile, Scizor, Seel, Shieldon, Shiftry, Slowking, Smoochum, Sneasel, Spheal, Steelix, Sudowoodo, Suicune, Swellow, Swinub, Tentacruel, Togekiss, Togepi, Vaporeon, Vibrava, Wartortle, Wooper, Yanma, Yanma, Yanmega, Zangoose, Zapdos, Zubat
- Misc. Sprite Fixes: Dewott, Misdreavus, Oshawott, Torkoal and Victini.
- Palette Fixes:
- Overworld sprite fixes by @Liamjd14 (with help from @hedara90 to solve conflicts) in #5334
- Palette Fixes: Shieldon.
- Misc. Sprite Fixes Torkoal.
- "Blinking pixels":
- Ambipom, Armaldo, Crawdaunt, Crobat, Donphan, Flaaffy, Flygon, Grovyle, Hoppip, Igglybuff, Illumise, Jumpluff, Ledian, Ledyba, Mamoswine, Mantine, Marshtomp, Meganium, Mightyena, Miltank, Numel, Prinplup, Raikou, Roserade, Skarmory, Skiploom, Spinarak, Staraptor, Stunky, Torkoal, Wooper, Xatu, Yanma
- Overworld Pokémon sprite changes by @Liamjd14 in #5336
- Fixed "blinking pixels": * Alolan Graveler/Golem/Alolan/Ninetales * Dawn Wings Necrozma * Hisuian Growlithe/Arcanine * Winter Sawsbuck
- Added missing Shiny Palettes
- Calyrex Ice/Shadow Rider, Origin Dialga/Palkia, White-Striped Basculin, Therian Enamorus and Low-Key Toxtricity.
- Removed Gigantamax Low-Key Toxtricity using base Low-Key follower sprites.
- Fixed Shiny palettes
- Alolan Marowak/Raichu, Eternal Flower Floette, Flabébé (All), Galarian Ponyta/Rapidash
- Typhlosion-Hisui follower shiny stomach color wrong - done
- Other sprite/palette fixes
- Alolan Exeggutor/Marowak/Persian/Raichu/Sandshrew, Hisuian Sligoo/Goodra and Winter Sawsbuck.
⚔️ Battle General ⚔️
Changed
- Updated Damage Category icons to match Gen6+ colors by @kittenchilly in #5080
Fixed
- Fixed Slateport Battle Tent/Battle Factory issues by @SarnPoke in #5281
- Choosing the "SWAP" option no longer shows invalid Pokémon ("??????????").
- Reloading after choosing "REST" no longer resets the player's challenge party to invalid Pokémon ("??????????").
- Fixed Starting Status happening Wild Battles from a previous Trainer Battle by @PhallenTree in #5248
- Fixed bugged behavior caused by Z-Moves and disobedience by @hedara90 in #5245
- Fixed Entry Hazards targeting wrong side of the field if the opponent fainted by @PhallenTree in #5262
- Fixed being able to use multiple of the same Gimmick in Double Battles by @AgustinGDLV in #5235
- Fixed Terastallization not granting immunity to Tar Shot by @AlexOn1ine in #5302
- Fixed
Cmd_trainerslidein/out
using the incorrect function by @ghoulslash in #5326- Cleanup by @hedara90 in #5344
🤹 Moves 🤹
Added
- Added Charge's Gen 9 behavior via
B_CHARGE
config by @AlexOn1ine in #5274 - Added Powder's Gen 7+ behavior of not causing damage when under Heavy Rain via
B_POWDER_RAIN
by @PhallenTree in #5370
Fixed
- Fixed move descriptions missing periods (Decorate, Collision Course, Electro Drift) by @Pawkkie and Kasen in #5221
- Fixed Confide not being blocked by Crafty Shield interaction by @hedara90 in #5202
- Fixed message for switch out moves by @kittenchilly in #5258
- Fixed Ice Fang's descriptions using the opposite of what they're supposed to do based on
B_USE_FROSTBITE
by @laserXdolphin in #5273 - Fixes to Instruct by @PhallenTree in #5262
- Fixed Instruct bypassing AtkCanceler checks (Instruct allowed the target to act while asleep, flinched, etc.) and its interaction with First Turn Only moves (Fake Out, First Impression, Mat Block).
- Fixed Instruct's animation using the attacker and target of the called move.
- Fixed Scale Shot's effect not activating if the opponent fainted before all hits finished by @AlexOn1ine in #5292
- Fixed Round not preserving turn order for non-Round users if there's a switch out at the beginning of the turn by @AlexOn1ine in #5292
- Fixed Max Moves ignoring absorbing abilities (+ test) by @PhallenTree in #5296
- Fixed attack string for Max Moves not being printed if it's blocked by Max Guard by @hedara90 in #5312
- Fixed some Pledge move combo issues by @PhallenTree in #5330
- Fixed Pledge move combos attempting to be executed multiple times in a turn, causing mons to decrement sleep timer multiple times during the turn or causing infinite loops.
- Fixed potential issue with custom non-sound moves that use
EFFECT_ATTACK_UP_USER_ALLY
orEFFECT_PERISH_SONG
being blocked by Soundproof anyway by @AlexOn1ine in #5301 - Fixed Pledge combinations not being absorbed by absorption Abilities (Sap Sipper, Storm Drain, etc.) by @hedara90 in #5364
- Fixed Toxic Thread decreasing speed by 2 stages instead of 1 by @AsparagusEduardo in #5369
- Fixed Destiny Bond not working if the user was fainted by a multi-Hit move's non-first hit by @AlexOn1ine in #5377
- Fixed Powder interactions by @PhallenTree in #5370
- Fixed Magic Guard not protecting against Powder's secondary damage when using a Fire-type move.
- Fixed Fire/Water Pledge combination being cancelled by Powder.
- Fixed Fire Z-Moves not playing their animations and not granting their secondary effects when the user is under Powder's effect
- Fixed After You/Shell Trap not updating battlers' actions correctly by @PhallenTree in #5384
🎭 Abilities 🎭
Fixed
- Fixed weather abilities not activating when Cloud Nine user leaves the field by @AlexOn1ine in #5209
- Fixed missing
break
for Poison Puppeteer's code by @u8-Salem in #5243 - Fixed Pokémon with Purifying Salt being poisoned by Toxic Spikes by @AlexOn1ine in #5252
- Fixed Parental Bond not affecting Snore by @hedara90 in #5264
- Fixed Tera Shift's description by @AsparagusEduardo in #5351
🧶 Items 🧶
Fixed
- Fixed berries missing their timing after passive damage by @AlexOn1ine in #5300
- Fixed Micle Berry not increasing accuracy on the next turn by @AlexOn1ine in #5358
🤖 Battle AI 🤖
Changed
- AI is encouraged to use "always crit" moves on partner with Anger Point by @SarnPoke in #5244
Fixed
- Fixed AI not seeing the power of Max Moves by @AlexOn1ine in #5299
- Fixed minor wrong order in
AI_CalcDamage
that made Nature Power not be considered for Z-Moves by @AlexOn1ine in #5155 - Fixed AI not considering Tera Blast/Tera Storm by @AlexOn1ine in #5155
- Fixed
AI_IsMoveEffectInPlus
reading the incorrect stat for secondary effects that reduce stats by 2 stages by @ghoulslash and @Pawkkie in #5366
🧹 Other Cleanup 🧹
Changed
- Remove unused
BattleScript_WindPowerActivatesEnd2
signature by @u8-Salem in #5257 - Replaced all usages of tabs in C files with spaces by @hedara90 in #5261
- Fixed missing
break
s in twoENDTURN
cases by @ghoulslash in #5350 ShouldSwitchIfWonderGuard
cleanup by @Pawkkie in #5383
🧪 Test Runner 🧪
Added
- Added missing Adaptability, Aerilate, Aftermath tests by @kittenchilly in #5242
- Added missing Disguise tests by @hedara90 in #5249
- Added some missing Instruct tests by @PhallenTree in #5262
- Added missing Powder tests by @PhallenTree in #5370
- Added
ShouldSwitchIfWonderGuard
AI tests by @Pawkkie in #5383
Changed
- Moved
ASSUME
s to insideGIVEN
blocks to prevent them from being added correctly to the totals in the test summary by @AsparagusEduardo in #5308
📚 Documentation 📚
Fixed
- Fixed test system documentation saying that
make check TESTS="Spikes"
could be done with single quotes instead of double quotes by @AsparagusEduardo in #5266
📦 Branch Synchronisation 📦
pret's base pokeemerald
- N/A
merrp/aarant's followers
- Merrp merge (September 9th) by @AsparagusEduardo in #5359
- aarant#40 (discarded, as it was already part of the expansion)
- New features:
- Static OW pokemon now bob while walking in place
- Toggled by
OW_FOLLOWERS_BOBBING
.
- Toggled by
- Added
OW_MON_WANDER_WALK
config option- If true, OW pokemon with
MOVEMENT_TYPE_WANDER*
will walk-in-place in between steps.
- If true, OW pokemon with
- Static OW pokemon now bob while walking in place
New Contributors
- @laserXdolphin made their first contribution in #5273
- @Liamjd14 made their first contribution in #5304
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.1...expansion/1.9.2
Version 1.9.1
## 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.9.1`.
🌋 REFACTORS 🌋
- Removed
ENDTURN_RETALIATE
in #5182 - Removed
ENDTURN_WEATHER_FORM
andallowedToChangeFormInWeather
in #5171
🧬 General 🧬
Added
- Move Relearner UI now displays move category by @kittenchilly in #5081
Fixed
- Fixes wrong padding field in
SpeciesInfo
struct by @AlexOn1ine in #5139 - Fixed specific tiles changing to PC tiles when using Box Link/Debug PC option by @cawtds in #5141
🐉 Pokémon 🐉
Fixed
- Fixed stray transparent pixels in Urshifu sprites by @hedara90 in #5071
- Fixed
bufferspeciesname
not working for species IDs over 1023 by @SBird1337 in #5088 - Fixed overworld Pokémon breaking for species IDs above 1535 by @hedara90, @mrgriffin and @SarnPoke in #5179
- Fixed overworld palettes for multiple species by @hedara90 in #5107
- Dialga Origin (Normal and Shiny)
- Palkia Origin (Normal and Shiny)
- Giratina Origin (shiny palette fixed by @hedara90 in #5108)
- Xerneas Neutral/Active (Normal and Shiny)
- Enamorus Incarnate/Therian (Normal and Shiny)
- Fixed/added missing Pokémon sprites and palettes by @Cafeei in #5126
- Overworld:
- Shiny Sneasler, Morelul, Bounsweet, Bruxish, Guzzlord, Regieleki, Zacian, Zamazenta
- Hisuian Zorua sprite
- Shiny Summer Sawsbuck
- Shiny Galarian Yamask, Darumaka, Zigzagoon, Zapdos, Ponyta, Rapidash, Slowpoke, Farfetch'd, Weezing, Mr. Mime, Articuno, Moltres, Slowking, Stunfisk, Darmanitan
- Shiny Hisuian Sneasel, Qwilfish, Samurott,
- Battle sprites:
- Shiny Sneasler, Cursola, Pincurchin, Runerigus
- Shiny Galarian Yamask, Darumaka
- Overworld:
- Fixed Unown Overworld follower sprites by Sarn by @hedara90 in #5146
⚔️ Battle General ⚔️
Changed
- Set new animation particles by default to off by @AlexOn1ine in #5161
Fixed
- Fixed speed ties by @mrgriffin in #4780
- Cleanup by @hedara90 in #5092
- Fixed Defiant/Competitive not working after the battler enters the field with a Court Changed Sticky Web on its side of the field by @PhallenTree in #5093
- Fixed
trainerproc
not properly parsing line markers, which caused erroring lines to be offset by @mrgriffin in #5122 - Fixed initial Zigzagoon battle being able to use a Gimmick by @AlexOn1ine in #5129
- Fixed incorrect rounding when
maxHP
is lower than 16 by @hedara90 in #5183- This caused these Pokémon to not be hurt by Sandstorm/Hail.
- Fixes UB in
Cmd_averagestats
by @mrgriffin and @AlexOn1ine in #5191
🤹 Moves 🤹
Added
- Added move animations for multiple moves by @TheTrueSadfish in #5159
- Spin Out, Mortal Spin, Fillet Away, Flower Trick, Make It Rain, Shed Tail, Hyper Drill, Twin Beam, Comeuppance, Blood Moon, Fickle Beam, Thunder Clap, Hard Press, Dragon Cheer, Malignant Chain.
- Purple chains by ogwon on Discord, beam by @TheTrueSadfish and livra on Discord.
Changed
- Adjusted Raging Bull's animation to include Brick Break's wall break effect by @TheTrueSadfish in #5159
Fixed
- Fixed non-grass Ivy Cudgel breaking battle UI by @hedara90 in #5117
- Fixes Stomping Tantrum effect not doubling power in certain situations by @AlexOn1ine in #5140
- Fixed Fickle Beam's description by @PhallenTree in #5093
- Fixed Revelation Dance interactions with Z-Move, Roost and typeless mons by @PhallenTree in #5133
- Fixes Poltergeist missing its accuracy check by @AlexOn1ine in #5168
- Fixed Fickle Beam not showing its message by @TheTrueSadfish in #5159
- Fixed Retaliate not working correctly if the party member fainted via passive damage during end of turn by @hedara90 in #5182
- Fixed Flame Burst's passive damage being based off current HP rather than Max HP by @hedara90 in #5182
- Fixed using Population Bomb with Loaded Dice printing garbage text by @kittenchilly in #5195
🎭 Abilities 🎭
Added
- Added in-battle effect of Pickup by @PhallenTree in #5170
Fixed
- Fixes Purifying Salt not halving damage for dynamic move types by @AlexOn1ine in #5145
- Fixed Dancer-called moves not changing their type based on the new user by @PhallenTree in #5133
- Fixed Ice Face not regenerating after switching in during Hail/Snow by @hedara90 in #5171
- Fixed Wind Rider not activating when switched in while Tailwind is active on the user's side of the field activation and tests by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5207
🧶 Items 🧶
Added
- Added Dowsing Machine's expanded name by @kittenchilly in #5134
Fixed
- Fixes Booster Energy not increasing speed by @AlexOn1ine in #5167
🤖 Battle AI 🤖
Changed
- Adjusted AI calculation for Triple Kick Effect by @AlexOn1ine in #5127
Fixed
- Fix Switch AI Bug: AI never switching out when it could be OHKO'd by @Pawkkie in #5089
- Adds missing AI checks for poltergeist by @AlexOn1ine in #5189
🧹 Other Cleanup 🧹
IsValidForBattle
function formatting by @AlexOn1ine in #5085- Opportunist/Mirror Herb cleanup by @AlexOn1ine in #5120
- Cleanup by @AlexOn1ine in #5158
- Remove trailing whitespace (master) by @AsparagusEduardo in #5174
🧪 Test Runner 🧪
Added
- Added missing Move Effect TODO tests - Volume C by @AsparagusEduardo in #5094
- Added multiple missing ability TODO tests by @AsparagusEduardo in #5163
- Added missing Guard/Power split tests by @mrgriffin and @AlexOn1ine in #5191
- Added missing Harvest and Pickup tests by @PhallenTree in #5170
- Added missing Round tests by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5196
- Added missing Wind Rider tests by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5207
Changed
- Fixed G-Max Replenish not considering Gen 5+ Pickup by @PhallenTree in #5170
Fixed
- Fixed
RandomUniformExcept
not being exclusive on the higher boundary by @PhallenTree in #5170
📚 Documentation 📚
- Added guide to running documentation website locally by @AsparagusEduardo in #5059
- How to docs and fixes to be added to the mdbook documentation site by @anrichtait in #5070
- Improved 1.8 ⇒ 1.9 non-Competitive syntax migration instructions by @mrgriffin in #5079
📦 Branch Synchronisation 📦
pret's base pokeemerald
- 5th of August in #5098
- Fixed bottom half of Mt. Pyre not being labeled in PokeNav by @fdeblasio in pret#2018
- 7th of August in #5116
- Changed type1 and type2 to be consistent by @pkmnsnfrn in pret#2021
- 14th of August in #5165
- Fix type for offset in MapConnection by @GriffinRichards in pret#2011
merrp/aarant's followers
- 7th of August in #5110
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.0...expansion/1.9.1
New Contributors
- @TheTrueSadfish made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/5159
Version 1.9.0
## 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.9.0`.
🌋 REFACTORS 🌋
📜 = Has a migration script.
- agbcc has been deprecated
- Added migration script README
- Removed Gen 9 settings for out-of-battle abilities
- 📜Customizable Frontier Pokémon sets
- Replaced VARARG_8 uses with recursive macros
- 📜Competitive-formatted parties
- Terastallization
- Combined weather set commands
- Full official GF names for species/items/moves/types
- Automatically display TM/HM icons based on their move
- Set
GiveBoxMonIntialMoveset_Fast
as default - Changed Battle Frontier validation to species flag
- Replaced HP checks with
IsBattlerAlive
- Removed redundant
MOVE_EFFECT_SP_ATK_TWO_DOWN
- 📜Removed
gItemIconTable
- 📜Egg Move Refactor
- Adjusted Ate-Ability code a bit to make it more readable
- Type Info refactors
- merrp/aarant's Followers
- Refactored residual damage to be more readable and less prone to bugs
🧬 General 🧬
Added
-
Added migration script README by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4719
-
Customizable Frontier Pokémon sets by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4313
FacilityMon
has been removed in favor of using regularTrainerMon
.- Removed
BATTLE_FRONTIER_ITEM_x
item constants in favor of using regularITEM_x
constants. - New
CreateFacilityMon
to handle duplicated code.- Added
FLAG_FRONTIER_MON_FACTORY
that replaces Return for Frustration and sets frienship to 0. Used in the Battle Factory.
- Added
- Converted data in
src/data/battle_frontier/battle_frontier_mons.h
andsrc/data/battle_frontier/battle_tent.h
, for example:.itemTableId = BATTLE_FRONTIER_ITEM_CHOICE_BAND,
->.heldItem = ITEM_CHOICE_BAND,
.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,
->.ev = TRAINER_PARTY_EVS(0, 252, 0, 252, 0, 0),
- Migration script available in
migration_scripts/egg_move_refactor.py
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/5040
- Added documentation to
STATIC_ASSERTS
used by theBoxPokemon
after 1.8.0 by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4294 -
Competitive-formatted parties by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3545
- Can be disabled by setting
COMPETITIVE_PARTY_SYNTAX
toFALSE
ininclude/config/general.h
. If migrating from 1.8, remove the first and last lines fromsrc/data/trainers.h
(const struct Trainer gTrainers[] = {
and};
respectively). - Introduces
trainerproc
, a tool which converts Competitive-formatted parties into Trainer Control-formatted parties. - If you made custom changes to the following files and want to use this new format, Do not accept the incoming changes for them. Instead, use the migration script present in
migration_scripts/convert_parties.py
:src/data/trainers.h
src/data/trainer_parties.h
src/data/battle_partners.h
src/data/partner_parties.h
- Before:
After:static const struct TrainerMon sTestParty1[] = { { .species = SPECIES_WOBBUFFET, .ball = ITEM_MASTER_BALL, .ability = ABILITY_TELEPATHY, .friendship = 42, .gender = TRAINER_MON_FEMALE, .heldItem = ITEM_ASSAULT_VEST, .isShiny = TRUE, .iv = TRAINER_PARTY_IVS(25,26,27,28,29,30), .ev = TRAINER_PARTY_EVS(252, 0, 0, 252, 4, 0), .lvl = 67, .moves = {MOVE_AIR_SLASH, MOVE_BARRIER, MOVE_SOLAR_BEAM, MOVE_EXPLOSION}, .nature = NATURE_HASTY, .nickname = COMPOUND_STRING("Bubbles") }, { .species = SPECIES_WOBBUFFET, .ability = ABILITY_SHADOW_TAG, .lvl = 5, }, }; static const struct Trainer sTestTrainer1 = { .trainerName = _("Test1"), .party = TRAINER_PARTY(sTestParty1), };
=== 0 === Name: Test1 Bubbles (Wobbuffet) (F) @ Assault Vest Hasty Nature Level: 67 Ability: Telepathy IVs: 25 HP / 26 Atk / 27 Def / 29 SpA / 30 SpD / 28 Spe EVs: 252 HP / 4 SpA / 252 Spe Happiness: 42 Shiny: Yes Ball: Master Ball - Air Slash - Barrier - Solar Beam - Explosion Wobbuffet Level: 5 Ability: Shadow Tag
- You can add comments by using
//
or/* ... */
, like in C. - You're allowed to write
SPECIES_PIKACHU
instead ofPikachu
(etc etc) if you want. - In addition to the migration script described above, you can add the following to at the top of the
src/data/trainers.party
file to change how the tool interprets the file:#pragma trainerproc ivs explicit
— requires anIVs:
line for every Pokémon instead of defaulting to 31s.#pragma trainerproc ivs <IVs>
— changes the default IVs.#pragma trainerproc level explicit
— requires aLevel:
line for every Pokémon instead of defaulting to 100.#pragma trainerproc level <level>
— changes the default level.- During the merge you could choose to keep your original
src/data/trainers.h
andsrc/data/trainer_parties.h
and then run the conversion script to update thesrc/data/trainers.party
,make
, then check in all three files. Alternatively don't run the conversion script and turn offCOMPETITIVE_PARTY_SYNTAX
ininclude/config.h
.
- Added synonyms for competitive/CFRU species defines, eg:
SPECIES_PONYTA_GALAR
forSPECIES_PONYTA_GALARIAN
SPECIES_MAUSHOLD_FOUR
forSPECIES_MAUSHOLD_FAMILY_OF_FOUR
SPECIES_CHARIZARD_GMAX
forSPECIES_CHARIZARD_GIGANTAMAX
- And so.
- TODO:
- Support
Hidden Power:
to set IVs appropriate for a particular Hidden Power type. - Consider case-insensitivity in the parser.
- Support
- Cleanup and bugfixes:
- By @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4362
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4366
- By @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4374
- By @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4397
- By @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4421
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4431
- By @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4442
- By @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4830
- By @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4969
- By @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4734
- By @innocenthedgehog in https://github.com/rh-hideout/pokeemerald-expansion/pull/4988
- By @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4990
- By @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/5035
- Can be disabled by setting
- Added
OW_PC_MOVE_ORDER
config to use future generation's menu order for the Pokémon Storage System by @pkmnsnfrn and @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4348GEN_1/2/3
: Widthraw -> Deposit -> Move.GEN_4/5/6_XY
: Deposit -> Widthraw -> Move.GEN_6_ORAS/7/8/9
: Move -> Deposit -> Widthraw.
- Added
OW_HIDE_REPEAT_MAP_POPUP
config that doesn't show the Map Popup when transitioning bewteen maps within the same Map Section by Anon822 from Pokécommunity and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4370 - Multiple Fishing Enhancements by @ghoulslash and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4343
- Added
I_FISHING_CHAIN
config to enable XY's chain fishing. - Added
I_FISHING_PROXIMITY
config to enable XY's proximity mechanic, where fishing away from NPCs increases the chance of a Pokémon being hooked. - Added
I_FISHING_MINIGAME
config to change between minigame versions.GEN_1/2
will not require a minigame, and instead automatically hook the Pokémon.- All other settings use RSE's minigame. FRLG/Gen4+'s minigame will be implemented in the future.
- Cleanup and bugfixes:
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4412
- By @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4906
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4718
- By @cawtds and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/5031
- Added
-
Full official GF names for species/items/moves/types by @mrgriffin, @ZnogyroP and @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/4241
- 8-character type names.
- 12-character Pokémon names (and nicknames)
- 16-character Move names.
- 20-character item names.
- This is done by introducing 3 new fonts that automatically change the size of the name in vanilla interfaces:
FONT_NARROWER
,FONT_SMALL_NARROWER
andFONT_SHORT_NARROW
.
- If the hack has changed fonts—e.g. to the FrLg ones—then they probably want to create their own versions of the new fonts.
- If the hack has introduced more UIs that render names they probably want to use
GetFontIdToFit
—see this PR's changes for examples of that. - If the hack has introduced names in list menus they can use
.fontIdMayNarrow = TRUE
on the list template. - Types, species, moves, and items all have individual commits which enable support in the UI and turn on longer names by default. These can be reverted by downstream projects if they really want to.
- Cleanup
- By @Nopinou in https://github.com/rh-hideout/pokeemerald-expansion/pull/4473
- By @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4588
- By @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4979
- Added
OW_PC_RELEASE_ITEM
config that gives back items from released Pokémon by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4577- If the bag is full, the item is lost, however.
- Cleanup by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4844
- Added
P_EGG_CYCLE_LENGTH
config that updates the amount of steps required to complete an egg cycle by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4596 - Added
trainerbattle_two_trainers
macro to trigger a 1 player vs 2 NPC battle by @aarant and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4741 - Added
createmon
Script Command and macro by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4688- This allows to set up wild enemy parties with the same versatility as
givemon
(IVs, EVs, abilities, moves, etc).
- This allows to set up wild enemy parties with the same versatility as
- Added
setwilddoubleflag
macro to setsIsScriptedWildDouble
and allow 2 player vs 1 enemy wild battles by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4688 - Added support for multiple Roaming Pokémon at once by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4762
- By default,
ROAMER_COUNT
is set to 1 to keep save compatibility. Increase it to add more roamers (though this breaks saves).
- By default,
- Added
OW_IGNORE_EGGS_ON_HEAL
, which makes it such that eggs are not counted in the Pokémon Center's heal animation by @ghoulslash @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4888 - Added support for fake RTC by Anon822 from PokéCommunity and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4910
- When
OW_USE_FAKE_RTC
isTRUE
, time runs at a different rate from real time, like in Legends: Arceus or Scarlet and Violet. - Use
OW_ALTERED_TIME_RATIO
to set the amount of "time" passing every 60 frames (1 real time second):GEN_8_PLA
: 1 minute.GEN_9
: 20 seconds.- All other settings make the game synced with real life.
- You may also set a flag to pause the RTC (
OW_FLAG_PAUSE_TIME
), and the script commandspausefakertc
,resumefakertc
andtogglefakertc
by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4954 - Cleanup by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4965
- When
- Added B2W2-style map pop-Ups by @ravepossum, @nielsmittertreiner and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4396
- Change
OW_POPUP_GENERATION
toGEN_5
to switch existing map popups. - You may choose between Black or White themes via
OW_POPUP_BW_COLOR
(OW_POPUP_BW_COLOR_BLACK
orOW_POPUP_BW_COLOR_WHITE
). - You may choose to display the current time in the pop-up using
OW_POPUP_BW_TIME_MODE
.OW_POPUP_BW_TIME_NONE
: Disables time in pop-up.OW_POPUP_BW_TIME_12_HR
: Shows 12-hour time in pop-upOW_POPUP_BW_TIME_24_HR
: Shows 24-hour time in pop-up
- You may enable alpha blending via
OW_POPUP_BW_ALPHA_BLEND
(mainly designed around the Black theme). - Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4752
- Change
- Allowed flags to be used in trigger scripts instead of vars by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4900
Changed
-
agbcc has been deprecated by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4989
- You technically still use
make agbcc
by disabling the error thrown when using it, but it will be removed completely for version 1.10.
- You technically still use
-
Moved general config file to the config folder by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4805
config.h
->config/general.h
- Cleanup by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5026
-
Set
GiveBoxMonIntialMoveset_Fast
as default by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4470 -
Changed Battle Frontier validation to species flag by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4341
- Added
isFrontierBanned
flag and removedgFrontierBannedSpecies
. - Renamed
isParadoxForm
->isParadox
.
- Added
-
Unified Nature info by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4562
- All data is now found on
gNaturesInfo
insrc/pokemon.c
- Names, Stat Up/Down, Back Sprite animation, Pokéblock animation, Nature Girl message and Battle Palace data.
- Cleanup by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4598
- All data is now found on
-
Type Info refactors by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4462
- Added
src/data/types_info.h
file forgTypesInfo
instead ofsrc/battle_main.c
.- Moved
sTypeEffectivenessTable
here file as well (and renamed it togTypeEffectivenessTable
)
- Moved
TYPE_NONE
duplicates graphics fromTYPE_MYSTERY
due to limitations withgraphics_file_rules.mk
.- Damage Categories for
B_PHYSICAL_SPECIAL_SPLIT
's pre-Gen4 setting can now be specified in thisgTypesInfo
'sdamageCategory
field instead of depending on the type's order.
- Added
- Consolidated Lilycove Contest Lady's values into one struct (
sContestLadyValues
) by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4951 - Applied the Pokémon Sprite Visualizer name officially by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4745
- Don't specify
sDexSearchTypeOptions
array size by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4820- Prevents Type search in the dex from breaking when non-conventional types are added.
- Only call RNG once when generating IVs in some cases by @tertu-m in https://github.com/rh-hideout/pokeemerald-expansion/pull/4876
Fixed
- Fixed potential Wireless Adapter desynchronization by @AtariDreams in https://github.com/rh-hideout/pokeemerald-expansion/pull/3730
- Fixed
ListItemTemplate
UB in the Pokémon Center by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4725 - Fixed
src/data/map_group_count.h
not being ignored in.gitignore
properly by @rayrobdod in https://github.com/rh-hideout/pokeemerald-expansion/pull/4727 - Fixed double battles not occuring with only one Pokemon by talking to the trainers despite
OW_DOUBLE_APPROACH_WITH_ONE_MON
being setTRUE
by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4848 - Fixed unused
B_TRANSITION_SHRED_SPLIT
from softlocking the game by @Lunos, @griffinr and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4919
✨ Feature Branches ✨
merrp/aarant's Followers
- Integrated @aarant's followers branch by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4022
- This includes Dynamic Overworld Palettes and Expanded Overworld IDs.
- This does not include the
lighting
branch yet, but will be included in a future version. - Updated up to the latest version of the branch (11th of July) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4944
- Cleanup
- By @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4782
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4937
Changes from the original branch
- Follower Pokémon can be enabled using the
OW_FOLLOWERS_ENABLED
config. - Pokémon NPCs can be added to a map independently from the Followers config. Keep in mind, this requires
OW_POKEMON_OBJECT_EVENTS
to be enabled in order to add the graphics to the ROM.- Eg: use
OBJ_EVENT_GFX_SPECIES(CHARIZARD)
where the graphic ID would go (OBJ_EVENT_GFX_SPECIES_SHINY()
for shiny version). - May also use
OBJ_EVENT_GFX_SPECIES_SHINY(CHARIZARD)
to make them shiny by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/5049
- Eg: use
- Moved original configs from
include/constants/event_objects.h
toinclude/config/overworld.h
and renamed them:OW_MON_BOBBING
->OW_FOLLOWERS_BOBBING
LARGE_OW_SUPPORT
->OW_LARGE_OW_SUPPORT
OW_MON_POKEBALLS
->OW_FOLLOWERS_POKEBALLS
- Added follower Pokémon sprites from Gen 4-8
- Credits to @Eemeliri and Gerben BSc
- Moved
OW_GFX_COMPRESS
frominclude/global.h
toinclude/config/overworld.h
. - Added
OW_SUBSTITUTE_PLACEHOLDER
config to hide followers if they don't have a follower sprite instead of using a placeholder Substitute sprite by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4765 - Follower graphics are shown in the Pokémon Sprite Visualizer.
- Follower graphics have been moved to the respective species graphics folder instead of all being grouped in
graphics/object_events/pics/pokemon
.- Eg:
graphics/object_events/pics/pokemon/abomasnow.png
was moved tographics/pokemon/abomasnow/follower.png
.
- Eg:
- Follower data has been moved to
gSpeciesInfo
- Their palettes are separate from the battle sprite palettes
- Can be enabled using
OW_FOLLOWERS_SHARE_PALETTE
, but requires manual sprite adjustements. For now, it's recommended to keep thisFALSE
. (They don't use much space anyway)
- Can be enabled using
- Their palettes are separate from the battle sprite palettes
- Updated
GetTypeEffectiveness
used by follower messages to account for new abilities with type immunities. - Cleaned up code style to match pret/expansion's.
- Reverted Regi's sprite to vanilla's.
- Follower PicTables use
overworld_ascending_frames
macro. - Removed unneeded calls to
bufferspeciesname
. - Removed
MON_DATA_NATURE
. - Removed debug functions like
IsAccurateGBA
. - Removed
ScrCmd_callfunc
to usecallnative
s instead
🐉 Pokémon 🐉
Added
- Added
EVO_ITEM_COUNT_999
evolution method (used by Gimmighoul) by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4261- Requires level up while carrying 999 of the specified item in the bag, which will be consumed.
- Uses new
EVO_MODE_CANT_STOP
mode, which is a clone ofEVO_MODE_NORMAL
but prevents evolution from being canceled.
- Added
EVO_DEFEAT_THREE_WITH_ITEM
evolution method (used by Bisharp) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4768- Requires level up after defeating 3 Pokémon of the same species holding the specified item.
- Eg: Bisharp defeating 3 other Bisharp holding Leader Crests.
- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/5046
- Requires level up after defeating 3 Pokémon of the same species holding the specified item.
- Added
EVO_OVERWORLD_STEPS
evolution method (used by Pawmo, Bramblin and Rellor) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4758- Requires level up after walking the specified amount of steps with that Pokémon as the first member in the party without switching.
- Switching the party leader resets the steps.
- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/5047
- Added
FORM_CHANGE_DAYS_PASSED
form change (used by Furfrou and Hoopa) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4778- Adds
MON_DATA_DAYS_SINCE_FORM_CHANGE
, which is a timer to automatically changes forms at midnight once it runs out. It is set after a different form change has been made (currently only added to Form Change items, including Prison Bottle)
- Adds
- Added unique icons for all of Arceus's forms via config (
P_ARCEUS_UNIQUE_FORM_ICONS
) by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4329 - Added
P_TWO_FRAME_FRONT_SPRITES
config to allow disabling 2-frame front animations by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4750 - Added
P_CRIES_ENABLED
config to disable species cries and stop them from being included in the ROM by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4791 - Added configs to prevent unobtainable Pokemon from being shiny by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4735
P_ONLY_OBTAINABLE_SHINIES
: Prevents shinies from generating in the Battle Pyramid.P_NO_SHINIES_WITHOUT_POKEBALLS
: Prevents shinies from generating if the player has no Poké Balls.
- Added
P_CAN_FORGET_HIDDEN_MOVE
config allow Pokémon to forget HM moves by @pkmnsnfrn and @Lunos in https://github.com/rh-hideout/pokeemerald-expansion/pull/4968
Changed
- Renamed evolution methods the were labeled as evo level by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4607
EVO_LEVEL_MOVE_TWENTY_TIMES
->EVO_MOVE_TWENTY_TIMES
EVO_LEVEL_RECOIL_DAMAGE_MALE
->EVO_RECOIL_DAMAGE_MALE
EVO_LEVEL_RECOIL_DAMAGE_FEMALE
->EVO_RECOIL_DAMAGE_FEMALE
- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4644
- Evolution tracker is now by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4758
-
Replaced VARARG_8 uses with recursive macros by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/4232
-
Egg Move Refactor by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4534
- Egg Moves are now formatted like Teachable learnsets and their pointers are stored in
gSpeciesInfo
, as opposed to having one big array.- Only offspring require these tables.
- Migration script available in
migration_scripts/egg_move_refactor.py
.
- Egg Moves are now formatted like Teachable learnsets and their pointers are stored in
⚔️ Battle General ⚔️
Added
- Added option to increase Experience bar speed via
B_FAST_EXP_GROW
by @SonikkuA-DatH and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4335 - Added Gen 4's Fog battle weather by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4359
- Uses Haze's animation.
- Changes
B_FOG_TERRAIN
(TRUE/FALSE config) intoB_OVERWORLD_FOG
(Generational config).GEN_4
: Uses this battle weather in maps withWEATHER_FOG_DIAGONAL
andWEATHER_FOG_HORIZONTAL
.GEN_8
onwards: Sets permanent Misty Terrain.- All others disable them.
-
Terastallization by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4110
- Tera Type automatically assigned to existing Pokémon based on their personality value.
- Can get and set Tera Types in scripts for party members using
checkteratype
andsetteratype
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4460
- Can get and set Tera Types in scripts for party members using
- To activate, it requires:
ITEM_TERA_ORB
to be in the player's bag.B_FLAG_TERA_ORB_CHARGED
to be set up to an unused flag. It¿s automatically set whenHealPlayerParty
is called.
- Added
ignoreTera
argument added toGetBattlerType
- Added Tera Blast's effect.
- Changes type shown in battle screen if the mon is Terastalized or about to by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4447
- Added Stellar Type.
- Added
teraType
option for Trainers (also supported by Competitive Format Parties) - Added Tera Starstorm's effect by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4447
- Terastallization animation by @Pokabbie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4507
- Added
forceTeraType
field forgSpeciesInfo
, which forces the Pokémon to have a specific Tera Type (used by Terapagos and Ogerpon) by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4438 - Added
FORM_CHANGE_BATTLE_TERASTALLIZATION
by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4438- It uses a Pokémon's Tera Type to choose which form to switch to upon Terastallizing.
- Bugfixes:
- By @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4435
- By @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4440
- By @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4513
- By @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4515
- By @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4529
- By @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4975
- Tera Type automatically assigned to existing Pokémon based on their personality value.
- Added Gen 1 type matchups by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4508
- Renamed
B_STEEL_RESISTANCES
->B_UPDATED_TYPE_MATCHUPS
to reflect this change. - Added defines to cleanup
sTypeEffectivenessTable
.
- Renamed
- Added Move Descriptions in battle by @Bassoonian, @TheXaman, @Pawkkie and @ravepossum in https://github.com/rh-hideout/pokeemerald-expansion/pull/4152
- Press L before selecting a move to see their category, power, accuracy and description.
- This can be changed to R by using the
B_MOVE_DESCRIPTION_BUTTON
config by @fakuzatsu in https://github.com/rh-hideout/pokeemerald-expansion/pull/4860
- This can be changed to R by using the
- Cleanup
- By @AGSMGMaster64 and @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4678
- Press L before selecting a move to see their category, power, accuracy and description.
- Added ball throwing configs by セケツ from PokéCommunity and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4953
B_ENEMY_THROW_BALLS
: When set toGEN_6
or higher, it changes the opposing trainer's ball animation so they throw their Pokéballs instead of already starting on the floor.B_PLAYER_THROW_BALLS_SOUND
: When set toGEN_5
or higher, it playsSE_BALL_THROW
as part of the player's ball throw animation.B_ENEMY_THROW_BALLS_SOUND
: When set toGEN_5
or higher, it playsSE_BALL_THROW
as part of the enemy's ball throw animation.
- Added
RandomChance
macro for battle/test randomization by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4829 -
Gimmick Refactor by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4449
- Unifies generational mechanics into
gGimmicksInfo
struct (Mega, Z-Moves, Ultra Burst, Dynamax, Terastallization).- Contains triggers, indicator, condition and function to execute when triggered.
- Around ~500-1000 lines of redundant / duplicate code removed!
- Cleanup
- By @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4927
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4962
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4863
- By @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4960
- Unifies generational mechanics into
- Allow users to increase
MAX_MONEY
dynamically by @DizzyEggg and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4943 - Added
AUTO_LOWERCASE_KEYBOARD
by @Jaizu and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4976- Automatically changes to to lowercase if the first character inputted is uppercase.
Changed
- Improved HP drain when enabling
B_FAST_HP_DRAIN
by @pkmnsnfrn and @SonikkuA-DatH in https://github.com/rh-hideout/pokeemerald-expansion/pull/4335 -
Combined weather set commands by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4434
setrain
->setfieldweather ENUM_WEATHER_RAIN
.setsandstorm
->setfieldweather ENUM_WEATHER_SANDSTORM
.setsunny
->setfieldweather ENUM_WEATHER_SUN
.sethail
->setfieldweather ENUM_WEATHER_HAIL
.setsnow
->setfieldweather ENUM_WEATHER_SNOW
.
-
Replaced HP checks with
IsBattlerAlive
by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4429 -
Removed redundant
MOVE_EFFECT_SP_ATK_TWO_DOWN
by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4557 - Added stack for saved targets and attackers by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4061
- This avoids the need to overwriting battler IDs during scripts and cause potential issues.
- Several scripts have been updated to use these.
- Cleanup and fixes
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4653
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4668
-
Adjusted Ate-Ability code a bit to make it more readable by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4640
- Added global constants for damage rolls by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4663
// Lowest and highest percentages used for damage roll calculations #define DMG_ROLL_PERCENT_LO 85 #define DMG_ROLL_PERCENT_HI 100
-
Refactored residual damage to be more readable and less prone to bugs by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4945
- Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4993
- Clarified some cases of
ChangeStatBuffs
usage by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4826 - Moved EWRAM variables from battle controller player file to gBattleStruct by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4840
sDescriptionSubmenu
,sAckBallUseBtn
andsBallSwapped
.
Fixed
- Fixed Dynamax data not clearing when a battler faints by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4672
- Multiple Z-Move fixes by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4449
- Fixed Z-Moves not working in Link Battles, recorded battles and tests.
- Fixed
Z_EFFECT_ALL_STATS_UP
functionality. - Fixed Z-Nature Power, Z-Copycat, Z-Me First, and Z-Sleep Talk incorrectly using a normal move and not a Z-Move,
which had not been raised as an issue yet.(some of these were caught recently!) - Fixed Breakneck Blitz incorrectly being affected by -ate abilities, which had not been raised as an issue yet.
- Fixed Instruct incorrectly not failing if the target last used a Z-Move, which had not been raised as an issue yet.
- Fixed Guardian of Alola incorrectly doing 50% of the target's HP instead of 75%.
- Fixed Enemy Data not clearing at the end of battles by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4867
🤹 Moves 🤹
Added
- Expanded Freeze Dry's effect to use
argument
field and allow custom moves to use the effect to be super effective to any specific type by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4312- Renamed
EFFECT_FREEZE_DRY
toEFFECT_SUPER_EFFECTIVE_ON_ARG
.
- Renamed
- Expanded
EFFECT_BODY_PRESS
to use category of defense stats for calculation based on the move's own damage category by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4312- Eg: In vanilla, Body Press uses the user's Defense and its stat changes instead of Attack. Now, if we were to change its
category
ingMovesInfo
, it'll use Sp. Defense and its stat changes instead of Sp. Attack.
- Eg: In vanilla, Body Press uses the user's Defense and its stat changes instead of Attack. Now, if we were to change its
- Expanded Photon Geyser and Shell Side Arm (restored) effects so that they also work for physical moves by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4923
- Added Knock Off's Gen 5+ effect with config (
B_KNOCK_OFF_REMOVAL
) by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4333- Items are removed outright instead of making them unusable.
- Added Heal Bell/Soundproof Gen 5-8+ interactions with
B_HEAL_BELL_SOUNDPROOF
config by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4732- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/5060
- Added Spicy Extract's effect by @AlexOn1ine, @Skeli789, @kittenchilly and @ZnogyroP in https://github.com/rh-hideout/pokeemerald-expansion/pull/4211
- Added
B_RETURN_STOLEN_NPC_ITEMS
config for Covet/Thief not being able to steal from NPCs by @moostoet and @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4605 - Added Dragon Darts effect (CFRU port) by @AlexOn1ine, @Skeli789 and @BuffelSaft in https://github.com/rh-hideout/pokeemerald-expansion/pull/4612
- Animation by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4620
Changed
EFFECT_TRIPLE_KICK
's base power uses the move'sstrikeCount
instead of a constant by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4608- This allows users to create "Quadruple Kick" and similar moves.
- Migrated move animation pointers to
gMovesInfo
by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4683- This removes the need for
gBattleAnims_Moves
which had potential ordering issues if not kept in line with move IDs.- If
battleAnimScript
is not defined for a move, it defaults to Tackle's animation.
- If
- Migration script available in
migration_scripts/battle_anim_moves_refactor.py
- This removes the need for
Fixed
- Multiple Ally Switch fixes by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4451
- Shadows no longer disappear + safety checks.
- Corrected animation for opponents.
- Fixed Avalanche's target by @TheLastMudkip in https://github.com/rh-hideout/pokeemerald-expansion/pull/4581
- Fixed Feint and Feint Attack's descriptions by @lhearachel in https://github.com/rh-hideout/pokeemerald-expansion/pull/4617
- Fixed Mud Sport/Water Sport reducing damage by 77% instead of 67% in Gen5+ by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4874
🎭 Abilities 🎭
Added
- Added Poison Puppeteer's effect by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4416
- Added Tera Shift, Tera Shell, and Teraform Zero by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4418
FORM_CHANGE_BATTLE_SWITCH
now has ability as optional parameter.- Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4742
- Added Toxic Chain's effect by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4823
- Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4843
- Added
B_ABILITY_TRIGGER_CHANCE
config to update trigger chances of abilities to Gen4+ by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4829- Shed Skin, Cute Charm, Flame Body, Static and Poison Point have a 30% chance to trigger in Gen4+ instead of 1/3 in Gen3.
- Effect Spore has an 11%, 10% and 9% chance of triggering Sleep, Paralysis and Poison in Gen4+ instead of equal 10% each in Gen3.
Changed
-
Removed Gen 9 settings for out-of-battle abilities by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4282
- These configs no longer disable out-of-battle ability effects when set to
GEN_9
.OW_SUPER_LUCK
.OW_INFILTRATOR
.OW_HARVEST
.OW_LIGHTNING_ROD
.OW_STORM_DRAIN
.OW_FLASH_FIRE
.
- These configs have been removed
OW_COMPOUND_EYES
.OW_CUTE_CHARM
.OW_ILLUMINATE
.OW_MAGNET_PULL
.OW_STATIC
.
- These configs no longer disable out-of-battle ability effects when set to
Fixed
- Fixed Mirror Armor bouncing Sticky Web's stat reduction to the opponent by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4713
- Effect Spore now uses
B_POWDER_GRASS
to toggle Grass-type Pokémon immunity to it by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4829
🧶 Items 🧶
Added
- Added Booster Energy's effect by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4337
- Cleanup
- By @PCG06 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4354
- By @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4804
- Cleanup
Changed
-
Removed
gItemIconTable
by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4579- Sprite and palette pointers have been moved to
gItemsInfo
asiconPic
andiconPalette
respectively. - Migration script available in
migration_scripts/convert_item_icons.py
- Cleanup
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4591
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4658
- Sprite and palette pointers have been moved to
-
Automatically display TM/HM icons based on their move by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4452
- TM palettes are now stored in
gTypesInfo
in thepaletteTMHM
field. - Cleanup by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4487
- TM palettes are now stored in
🤖 Battle AI 🤖
Added
- Added
AI_GetBattlerAbility
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4555 - Added
AI_FLAG_CONSERVATIVE
flag by @Pawkkie and @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4615- AI will assume low damage rolls for its
calculationsDamage
roll selection inAI_CalcDamage
- Cleanup
- AI will assume low damage rolls for its
- Added
AI_FLAG_SEQUENCE_SWITCHING
flag by @Pawkkie, Kasen, @pkmnsnfrn and @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4878- AI will keep their party order consistently with switches.
- Added
setdynamicaifunc
, which allows to setup custom AI functions before a battle besides the predetermined ones used by AI Flags @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4908- Eg:
Wheresetdynamicaifunc AI_TagBattlePreferFoe multi_2_vs_2 TRAINER_MAXIE_MOSSDEEP, MossdeepCity_SpaceCenter_2F_Text_JustWantToExpandLand, TRAINER_TABITHA_MOSSDEEP, MossdeepCity_SpaceCenter_Text_TabithaDefeat, PARTNER_STEVEN
AI_TagBattlePreferFoe
prioritizes attacking the opposite battler index.
- Eg:
Changed
- AI now calculates and stores minimum possible move damage and uses it with
AI_FLAG_TRY_TO_FAINT
by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4760- This allows AI to prefer guaranteed KO moves over highest expected damage move.
- Cleanup by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4808
- AI Revenge Killer switching factors in Trick Room by @Shadowzlmao and @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4794
- AI Smarter Choice AI for Status Moves by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4872
- Better behavior for AI under Choice Item effects.
- Cleanup by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4911
- AI Smarter Focus Punch and Substitute handling by @Pawkkie, @Kasenn and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4952
- Moved
RestoreBattlerData
out ofAi_CalcDmg
and addedSaveBattlerData
Protections by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4156- Cleanup
- By @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4586
- Cleanup
- Made AI see Loaded Dice hold effect for multi hit moves that strike 5 times by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4622
AI_FLAG_RISKY
Improvements by @Pawkkie, @AlexOn1ine and @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4648- Check the PR for in depth details.
- Cleanup
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4790
- By @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/5032
- Removed temporary scores in
AI_CalcMoveEffectScores
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4655 - Changed
AI_IS_SLOWER
andAI_IS_FASTER
comparisons intoAI_IsFaster
andAI_IsSlower
functions by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4671AI_STRIKES_FIRST
is also replaced byAI_IsFaster
.
- Switch AI uses trapping abilities aggressively by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4669
- Use 9th roll instead of average in AI calcs by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4679
- Use
AI_DATA->abilities
in more places by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4729 - Minor switch AI cleanup by @Pawkkie, @DizzyEggg, @AlexOn1ine and @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4849
- Removed
SetBattlerData
fromAI_CalcDamage
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4881 - Removed unused
AI_FLAG_HELP_PARTNER
by @pkmnsnfrn and @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4918 - Added missing
ADJUST_SCORE
s by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4925 - Reduced
AI_WhoStrikesFirst
to the most essential parts by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4978 - Changed score adjustments to
tempScore
increases by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4987
Fixed
- Minor AI flag fixes/cleanup by @Pawkkie, @AlexOn1ine and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4924
🧹 Other Cleanup 🧹
Changed
- Corrected species info struct hex comments by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4798
- Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4800
🧪 Test Runner 🧪
Added
- Added missing weather tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4434
- Added missing Gale Wings test by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4694
- Added
SWITCH_OUT_MESSAGE
andSEND_IN_MESSAGE
macros to avoid tests from failing based on changing switch out/in messages by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4717- Usage:
SEND_IN_MESSAGE("Wobbuffet");
- Tests have been updated to use these new macros.
- Usage:
- Added missing Hidden Power test by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4462
- Added some Terastallization tests by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5020
Changed
- Cleaned up Frisk test by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4441
- Renamed
MgbaPrintf_
toTest_MgbaPrintf
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4642 - AI tests have been moved to their own folder by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4898
- Species are now always included in tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4810
- Added Battle Anim Debug Check to see if animations aren't cleared by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4930
- Test battlers always have their forced abilities to prevent them from changing during a test by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4707
Fixed
- Test runner uses Set mode to avoid an issue where tests prompted switching and caused a timeout by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4661
New Contributors
- @Pokabbie made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4507
- @TheLastMudkip made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4581
- @moostoet made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4605
- @rayrobdod made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4727
- @innocenthedgehog made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4988
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.6...expansion/1.9.0
Version 1.8.6
## 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.8.6`.
🌋 REFACTORS 🌋
- Opportunist/Mirror Herb Refactor
- Removed unused Battle Script labels
- Fixed Trace not respecting the speed order like other switch-in abilities
🧬 General 🧬
Fixed
- Fixed Battle Frontier ineligibility blocking the entire party if it encountered a disabled species by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4997
- Fixed random IVs given when using
givemon
only giving values from 1-31 by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/5021 - Fixed
givemon
not giving Cherish Ball by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5022
🐉 Pokémon 🐉
Added
- Added missing Terapagos Stellar sprite by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5008
- Added missing Ogerpon Tera sprites by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4996
Changed
- Temporarely reverted regional form inheritance to fix issue with non-regional forms by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/5004
- Updated level up learnsets up to Indigo Disk by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/5023
Fixed
- Fixed Basculegion learning Dire Claw in Gen9's level up learnset by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4948
- Fixed Sandile's sprite by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5038
⚔️ Battle General ⚔️
Fixed
- Fixed Debug Menu not properly updating the corresponding flags + general cleanup by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4643
- Fixed spread damage in double battles by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/5064
- In double battles when
B_POSITION_OPPONENT_LEFT
fainted from the first hit of a spread move, the second hit dealt 100% of damage toB_POSITION_OPPONENT_RIGHT
.
- In double battles when
-
Removed unused Battle Script labels by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4839
data/battle_scripts_1.s
BattleScript_OctolockTryLowerDef
BattleScript_OctolockTurnDmgPrintMsg
BattleScript_StuffCheeksEatBerry
BattleScript_StrengthSapTryHp
and its contents.BattleScript_PartingShotEnd
and its contents.BattleScript_RototillerAffected
BattleScript_AutotomizeDoAnim
BattleScript_TryTailwindAbilitiesLoop_Ret
BattleScript_HitFromAtkCanceler
BattleScript_EffectMultiHit
BattleScript_BattleScript_EffectParalyzeNoTypeCalc
BattleScript_EffectTeleportTryToRunAway
BattleScript_WindPowerActivates_Ret
BattleScript_CottonDownReturn
BattleScript_ActivateWeatherAbilities_Increment
BattleScript_IntimidateEnd
BattleScript_SupersweetSyrupEnd
BattleScript_ActivateTerrainEffects_Increment
BattleScript_GrassyTerrainHpChange
BattleScript_GrassyTerrainLoopEnd
BattleScript_AbilityNoSpecificStatLossPrint
BattleScript_ArenaNothingDecided
BattleScript_ExtremeEvoboostAtk
BattleScript_BerserkGeneRet_Anim
data/battle_scripts_2.s
BattleScript_PrintCaughtMonInfo
-
Opportunist/Mirror Herb Refactor by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4928
- Multiple fixes:
- Opportunist stacking multiple boosts in one turn from opposing mons.
- Increasing the stat by the wrong amount when copying opposing boost (eg. +6 boosts).
- Opportunist no longer has a message.
- Opportunist only play animations once for every stat boost.
- Changes:
switchInBattlerCounter
replaces bothswitchInAbilitiesCounter
andswitchInItemsCounter
.- Removed
STRINGID_OPPORTUNISTCOPIED
andsText_OpportunistCopied
. - Altered
TryDoEventsBeforeFirstTurn
to use a state switch (gBattleStruct->eventsBeforeFirstTurnState
)FIRST_TURN_EVENTS_START
.FIRST_TURN_EVENTS_OVERWORLD_WEATHER
.FIRST_TURN_EVENTS_TERRAIN
.FIRST_TURN_EVENTS_STARTING_STATUS
.FIRST_TURN_EVENTS_TOTEM_BOOST
.FIRST_TURN_EVENTS_NEUTRALIZING_GAS
.FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES
.FIRST_TURN_EVENTS_OPPORTUNIST_1
.FIRST_TURN_EVENTS_ITEM_EFFECTS
.FIRST_TURN_EVENTS_OPPORTUNIST_2
.FIRST_TURN_EVENTS_END
.
- Multiple fixes:
🤹 Moves 🤹
Added
- Added missing Ivy Cudgel animation by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5034
- Cleanup by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5063
- Added missing Axe Kick animation by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/5039
Fixed
- Fixed Diamond Storm's Defense increase applying to the target instead of the user by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4947
- Fixed Psycho Shift check for Frostbite using
CanBeFrozen
instead ofCanGetFrostbite
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4995 - Fixed Sleep Talk failing on repeated attempts by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5009
- Fixed Fury Cutter considering Parental Bond's second hit for its damage multiplier by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5030
- Fixed Hidden Power damage category when
B_PHYSICAL_SPECIAL_SPLIT < GEN_4
by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5053 - Fixed
MoveEffectRemoveStatus
(Sparkling Aria, Wake-Up Slap, ...) that cure Freeze/Frostbite using the other status' battlescript. by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5061
🎭 Abilities 🎭
Fixed
- Fixed Toxic Debris incorrect side check by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5009
- Fixed Snow Warning's description not being updated based on
B_SNOW_WARNING
by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/5018 - Fixed Mold Breaker abilities not properly checking battler actions in double battles causing them to not work by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5030
- Fixed
cantBeSurpressed
ability check for breakable abilities by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/5043 - Fixed Stalwart and Propeller Tail not ignoring redirection from Storm Drain/Lightning Rod + tests by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5061
-
Fixed Trace not respecting the speed order like other switch-in abilities by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4941
- Changes:
- Removed:
ABILITYEFFECT_TRACE1
,ABILITYEFFECT_TRACE2
and moved their handling toABILITYEFFECT_ON_SWITCHIN
. - Removed
gSpecialStatuses
'straced
field.
- Removed:
- Changes:
🧶 Items 🧶
Fixed
- Jaboca/Rowap Berry recording the wrong item effects by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5009
- Fixed Life Orb damaging its holder if it hits itself in confusion. by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5061
🤖 Battle AI 🤖
Documentation
- Added AI Flags documentation to directory for new documentation site by @anrichtait in https://github.com/rh-hideout/pokeemerald-expansion/pull/5057
Fixed
- Fixed typo that caused AI to use Upper Hand when it shouldn't by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4973
- Fixed AI using U-Turn when only the Ace Pokémon is left in the party (#4748) by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4972
- Fixed AI not being aware during calculations by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4992
- Fixed
AI_SetMoveAccuracy
getting the wrong battler's ability by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5030
🧹 Other Cleanup 🧹
Fixed
- Fixed version displayed in
README.md
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4966 - Removes unnecessary checks for Shield Dust and Covert Cloak by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/5073
🧪 Test Runner 🧪
Added
- Added AI Upper Hand test by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4973
- Added test to make sure that Trainer Class balls apply to every member of the party by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4999
- Added missing Sleep Talk tests by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5009
Changed
- Improved Test Runner Summary by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4641
- Totals are now separated from the erroring test list.
- Assumption Fails and Passing
KNOWN_FAILING
s now have their own lists.
Fixed
- Fixed tests failing when
B_USE_FROSTBITE
is set toTRUE
by @fakuzatsu in https://github.com/rh-hideout/pokeemerald-expansion/pull/4986 - Fixed tests not compiling outside of CI after incoming pret merge by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4998
- Fixed Covert Cloak tests being in
item_effect
folder instead ofhold_effect
folder by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/5073
📦 Pret merges 📦
- Pret Merge (13th of July) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4964
- Adds the new C-style enums in preproc commit by @SBird1337 (550e668)
- Pret Merge (27th of July) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/5045
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.5...expansion/1.8.6
Version 1.8.5
## 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.8.5`.
🌋 IMPORTANT CHANGES AND REFACTORS 🌋
- Small
ABILITYEFFECT_MOVES_BLOCK
refactor for readability by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4635 - Removed redundant
partnerPicId
arguments in macros by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4736 - Renamed some labels from "critical hit chance" to "critical hit odds" by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4751
sCriticalHitChance
=>sCriticalHitOdds
.GetCritHitChance
=>GetCritHitOdds
.
- Renamed
BS_FAINTED_LINK_MULTIPLE_1/2
toBS_FAINTED_MULTIPLE_1/2
by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4851 - Remove Duplicate ai code from battle_ai_util.c by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4883
AI_CanBeBurned
is now handled byCanBeBurned
.CanSleep
renamed toCanBeSlept
.AI_CanSleep
is now handled byCanBeSlept
and addeddefAbility
argument.
- Added
defAbility
argument forCanBePoisoned
. - Added
defAbility
argument forCanBeBurned
. - Added
defAbility
argument forCanBeParalyzed
.
- Got rid of hardcoded stat raise anim values by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4825
- Added parentheses to
SPECIES_EGG
macro to avoid issues by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4899 IsFinalStrikeEffect
uses effect instead of move by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4917
💥 Softlock/Crash fixes 💥
- Fixed Baton Pass hardlocking on Memento by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4773
- Fixed Revive in Double Battles causing a softlock by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4784
- Fixed Tectonic Rage causing a freeze after leveling up by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4787
- Fixed Smack Down's animation softlocking the game after around 13 uses by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4774
- Fixed softlock caused by using Covet/Thief on a Pokémon with Sticky Hold by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4885
🧬 General 🧬
Added
- Added regional form breeding mechanics by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4695
- Convert docs/ folder to mdBook by @leo60228 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4684
- Go here to see the new documentation page. Feel free to contribute via PRs!
- Cleanup by @leo60228 in:
- Added forbidden status parameter to
FORM_CHANGE_ITEM_USE
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4738- Used for Shaymin's form change via Gracidea being prevented if it's frozen or frostbitten.
Fixed
- Fixed Poké Ball inheritance into actually working by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4695
- Daycare fixes by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4479
- Fixed Evolved mons not copying moves as they do not have their own egg move table.
- Fixed forms of the same species not copying egg moves from each other.
- Fixed Roamer Frostbite status not carrying over between battles by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4822
- Fixed Partners getting the wrong nature defined by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4926
- Fixed Shop menu lists not properly displaying 6-digit item prices by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4929
🐉 Pokémon 🐉
Changed
- PokeCommunity sprites batch (May) by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4714
- Pawmi (Front by KingOfThe-X-Roads, back by Vent, QC by leParagon)
- Pawmo (By vent, qc by leParagon)
- Okidogi (Front by KingOfThe-X-Roads + by leParagon, back by Lykeron + QC by Alexandrev2. 0)
- Backported @hedara90's Terapagos from https://github.com/rh-hideout/pokeemerald-expansion/pull/4691
- Updated wild held items to Gen 9 by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4769
- Teddiursa (Common: None_> Honey)
- Bisharp (Rare: None -> Leader's Crest)
- All Oricorio: (Rare: Honey -> Corresponding Nectar)
- Toedscool, Toedscruel: (Common: Tiny Mushroom, Rare: Big Mushroom)
- All Paradox Mon: (Rare: Booster Energy)
Fixed
- Fixed Tandemaus being able to evolve via Rare and Exp. Candies by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4759
- Fixed Poltchageist not always producing Counterfeit form offspring by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4812
- Fixed missing Minior Pokédex Entry by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4858
- Multiple Pokemon sprite fixes by @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4887
- Fixed Charjabug shiny + cleaned up its front sprite
- Changed Lurantis back sprite to better match its ingame model
- Fixed Bounsweet shiny not changing the color of its lower body
- Brightened the white color of Bruxish shiny + tweaked its sprites to accommodate the change
- Fixed
P_UPDATED_ABILITIES
not reverting newly gained abilities in Gens 4/6/7 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4922
⚔️ Battle General ⚔️
Fixed
- Fixed Dynamax HP not reverting upon fainting by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4681
- Fixed the partner's palette from shifting when throwing a Poké Ball by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4736
- Fixed shiny value not being updated in battle, causing the palette to reset when reloading the sprites by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4788
- Fixed
B_VAR_STARTING_STATUS
every following terrains infinite by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4795 - Fixed Gen 7+ confusion self hurt chance from
1 in 3
to33%
by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4831 - Fixed caught wild pokemon not restoring their used held item by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4803
- Fixed AI's right slot switching-in too early by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4851
- Ported post-KO test improvements from closed PR by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4859
- Fixed how switch-in effects are played out after multiple faints in the same turn by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4864
- Fixed Megas gaining abilities after fainting by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4873
🤹 Moves 🤹
Fixed
- Added missing
ignoreSubstitute
flags for Defog (only in Gen 4), Torment and Powder by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4623 - Fixed Grassy Glide granting priority if it's converted to Max Move by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4659
- Fixed Rampage moves not confusing the user if it's canceled by Protect and Type immunity by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4722
- Fixed Tar shot the target always be to Fire regardless of existing types by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4756
- Fixed Shell Side Arm by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4753
- Cleanup by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4806
- Fixed Body press using physical Defense stat changes instead of Sp. Defense stat stages in Wonder Room (still uses physical defense stat) by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4792
- Fixed Relic Song playing the transforming animation for species other than Meloetta by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4799
- Fixed Pursuit not being locked by Choice Items when used on an opponent switching out by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4801
- Fixed Encore's effect lasting only 2 turns if it was used after the opponent uses the move in the same turn by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4802
- Fixed Spectral Thief playing stat raise animation when the user has Contrary by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4824
- Fixed Fury Cutter scaling up to 640 power by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4846
- Fixed moves with the
ignoresTargetAbility
flag ignoring the attacker's own ability by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4855 - Fixed incorrect move names by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4854
- Floral Healing
- Jungle Healing
- Oceanic Operetta
- Fixed Grassy Terrain not healing on the final turn of its duration by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4903
- Fixed Shed Tail's HP reduction rounding down instead of up by @kleeenexfeu in https://github.com/rh-hideout/pokeemerald-expansion/pull/4913
- Fixed Bitter Malice's description, which used to imply that it didn't always lower the opponent's Attack by @kleeenexfeu in https://github.com/rh-hideout/pokeemerald-expansion/pull/4933
- Fixed Flame Burst's adjacent damage not bypassing Substitute by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4939
🎭 Abilities 🎭
Added
- Added missing Gen 3-4 config for Lightning Rod/Storm Drain (
B_REDIRECT_ABILITY_IMMUNITY
) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4920
Fixed
- Fixed Dancer issues @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4638
- Fixed Dancer triggering if the move user flinches when it was going to use a dance move
- Fixed Dancer not triggering if a previous Dancer flinches.
- Fixed Dazzling, Queenly Majesty and Armor Tail not protecting partners from priority moves by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4635
- Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4647
- Fixed Burning Bulwark's incorrect message by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4659
- Fixed Disguise's
breakable
flag (ignorable by Mold Breaker) by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4666 - Fixed redundant call to
IsBattlerWeatherAffected
Dry Skin's checks by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4675 - Fixed Guard Dog blocking U-Turn/Volt Switch/Flip Turn instead of Roar/Circle Throw/Dragon Tail by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4690
- Fixed some abilities preventing stat dropping move effects when used on self by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4696
- Hyper Cutter (Attack)
- Big Pecks (Defense)
- Keen Eye/Illuminate (Accuracy)
- Fixed Mummy and Lingering Aroma not working at all by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4731
- Fixed Berserk, Anger Shell, Wimp Out, Emergency Exit HP threshold (more than half HP instead of half HP and more) by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4724
- Fixed Mycelium Might affecting every battler on the field instead of just the ability holder by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4740
- Fixed Skill Link ignoring Gastro Acid/Neutralizing Gas by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4746
- Fixed Own Tempo ignoring Gastro Acid/Neutralizing Gas when checking for Berserk Gene by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4746
- Fixed Soul-Heart changing stats of wrong battler, which caused Mirror Herb to behave incorrectly by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4785
- Fixed Poison Touch trigger chance from
1 in 3
to30%
by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4831 - Fixed Cursed Body trigger chance from
1 in 3
to30%
by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4831 - Fixed Comatose not being supressed if it's obtained by a Pokémon Transforming by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4852
- Fixed Supersweet Syrup0s description by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4902
🧶 Items 🧶
Changed
- Allowed rematches to occur if I_VS_SEEKER_CHARGING isn't enabled by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4866
Fixed
- Fixed Honey altering tiles when used by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4703
- Fixed potential undefined behaviour when using escape rope by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4705
- Fixed Hyper Potion's price not respecting
I_PRICE
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4737 - Fixed Ability Shield not protecting against multiple effects by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4740
- Mold Breaker-type abilities.
- Mycelium Might.
- Moves that bypass abilities (eg. Sunsteel Stike).
🤖 Battle AI 🤖
Changed
- Add checks for
EFFECT_POLTERGEIST
andEFFECT_FIRST_TURN_ONLY
toIsDamageMoveUnusable
by @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4693
Fixed
- Fixed AI going for speed control even when it's faster than the opponet by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4630
- Fixed AI not considering
EFFECT_RAGING_BULL
similarly toEFFECT_BRICK_BREAK
by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4682 - Fixed AI getting incorrect calculations due to using
gCurrentMove
inCalcCritChanceStageArgs
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4687 - Fixed AI not recording Battle Armor or Shell Armor by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4751
- Fixed AI not considering guaranteed crits by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4751
- Fixed AI not properly avoiding contact against Rocky Helmet/Rough Skin by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4779
- Fixed AI not recognising Volt Absorb/Flash Fire by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4781
- Fixed AI thinking that Defiant/Competitive triggers off partner's moves in doubles by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4786
- Fixed AI using
TRUE
(Stench) when calculating if it's worth using Swagger or Flatter on its partner by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4786 - Fixed passing hold effect instead of ability in one call of ShouldSetSandstorm by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4789
🧪 Test Runner 🧪
Added
- Added
FORCE_MOVE_ANIM
macro to force an animation to run in headless mode by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4774- Usage:
FORCE_MOVE_ANIM(TRUE)
at the beginning of the test andFORCE_MOVE_ANIM(FALSE)
at the end.
- Usage:
- Added test to prevent species from having different evolution tracker methods by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4771
- Added test for missing Pokédex Entries by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4858
- Added missing Move Effect TODO tests - Volume B by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4682
- Added missing tests
- Berserk by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4724
- Clear Body by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4685
- Anger Point and Moxie by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4811
- Cursed Body, Poison Touch and Confusion status by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4831
- Corrosion, Acrobatics, Hone Claws and Hurricane by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4708
- Added AI tests for avoiding using status moves on Pokémon with abilities that prevent them by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4883
- Added Own Tempo/Mold Breaker test by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4883
Changed
- Multiple changes by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4682
- Renamed some Baton Pass-related tests so that their prefix becomes Baton Pass.
- Eg.
Aqua Ring can be Baton Passed
becomesBaton Pass passes Aqua Ring's effect
.
- Eg.
- Expanded Belch's test to show that it doesn't need to eat a berry before each use of the move.
- Unconfirmed interactions added to the specific files.
- Split
EFFECT_RAGING_BULL
fromEFFECT_BRICK_BREAK
's file. - Moved Grassy Terrain/Earthquake test to Earthquake file.
- Renamed some Baton Pass-related tests so that their prefix becomes Baton Pass.
- Write new/Fix old tests for post-ko switch scenarios by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4856
Fixed
- Fixed issues when building tests with agbcc by @u8-Salem in https://github.com/rh-hideout/pokeemerald-expansion/pull/4689
- Fixed incorrect
ASSUME
s in 2 test rampage tests by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4722 - Fixed AI ability guessing in tests by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4764
- Fixed Pokemon in tests not being male by default by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4766
- Fixed Plasma Fists/Pixilate interaction test by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4865
- Fixed wrong palette in player backsprite in recorded battle by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4875
📦 Pret merges 📦
- Merge in pret 189d542 by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4832
- Fix Steven partner battle post-battle script by @Jaizu in https://github.com/pret/pokeemerald/pull/2001
- Pret merge (20th of June) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4845
- Pret Merge (5th of July) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4915
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.4...expansion/1.8.5
Version 1.8.4
## 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.8.4`.
🌋 IMPORTANT CHANGES 🌋
Reverted Guillotine feature branch by @AsparagusEduardo:
- This was a runtime decapitalization branch introduced silently in version 1.8.0. We didn't properly announce as it was hastily merged and we were hoping that future versions of it would have fixed issues that we encountered after the merge. However, issues kept piling on and we felt the need to revert it as it was also silently breaking other features as well.
- We will work on an alternate decapitalization option in the future.
💥 Softlock/Crash fixes 💥
- Fixed softlock caused by Destiny Bond triggering after Explosion by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4516
- Fixed softlock caused by Future Sight trying to hit a fainted target by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4543
- Fixed softlock caused by Galvanized Explosion being absorbed by Volt Absorb by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4601
- Fixed softlock caused by Flinging a Razor Fang when the target had already moved by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4625
🧬 General 🧬
Fixed
- Fixed instances of Level Caps causing absurd amounts of Exp. by @Nopinou in https://github.com/rh-hideout/pokeemerald-expansion/pull/4505
- Fixed
GetBoxMonData
evolution tracker reading garbage data if compiled withagbcc
by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4510 - Fixed potential Berry Tree mutation corruptions when compiling with
agbcc
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4535 - Added missing EOF newlines to
species_info
files by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4584 - Fixed
EVO_MODE_BATTLE_SPECIAL
evolutions (only Sirfetch'd currently) triggering twice under certain situations by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4553- As a side effect, these evolutions no longer happen before other ones, instead being triggered in party order alongside
EVO_MODE_NORMAL
.
- As a side effect, these evolutions no longer happen before other ones, instead being triggered in party order alongside
✨ Feature Branches ✨
TheXaman's Debug Menu:
Fixed
- Fixed abilities past ID 255 not being properly being given to Pokémon using the debug menu's Give Pokémon option by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4576
SBird/Karathan's Dynamic Multichoices:
Changed
- Dynamic Multichoice no longer plays sound on init by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4480
TheXaman's HGSS Pokédex Plus:
Fixed
- Multiple evolution page fixes by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4514
- Fixed duplicate icons when 2 or more evolution methods share the same target species (eg. Magnezone evolution via Thunder Stone or Electromagnetic field).
- Fixed arrow not loading when there are multiple evolution methods to the same target species that hadn't been caught.
- Fixed wonky D-Pad inconsistency when scrolling down.
- Fixed regression from #3562 (1.7.0) that caused non-evolving Pokémon to not show their "X has no evolution" text.
- Change from the original branch: The message no longer shows for Pokémon that are part of an evolutionary family, even if they don't evolve themselves (eg. Venusaur).
- Added failsafe for Egg Groups without text defined by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4628
ghoulslash's Saveblock Cleansing:
Changed
- Adjusted description of
FREE_MATCH_CALL
config to clarify that the VS Seeker also utilizes that data by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4590
🐉 Pokémon 🐉
Added
- Added missing Gen 9 and PLA footprints + update some footprints by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4621
- Credits to Caruban for creating the sprites: eeveeexpo.com/resources/1101 https://eeveeexpo.com/resources/1101/
Changed
- Update various sprites to ones from PokeCommunity by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4554
- Updated footprints to Gen 4/5 designs, being more accurate to their designs @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4621
- Golem, Ludicolo, Shroomish and Mawile.
- Also updated Origin Giratina to have an empty footprint.
- Explicitly define Gengar's 3rd ability slot (Hidden Ability) by @lhearachel in https://github.com/rh-hideout/pokeemerald-expansion/pull/4633
Fixed
- Fixed animation errors by adding missing 2nd frames:
- Keldeo Resolute and Meloetta Pirouette by @TheJamesLJ in https://github.com/rh-hideout/pokeemerald-expansion/pull/4541
- White-Striped Basculin and Neutral Xerneas @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4552
- Summer, Autumn and Winter Sawsbuck by @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4592
- Fixed Unown B-Z and Punctuation Marks entry animations by @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4546
- Fixed Iron Hands and Iron Bundle incorrect backsprite palettes @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4552
- Fixed transparent pixel in Mega Mewtwo Y's backsprite eye by @TheJamesLJ in https://github.com/rh-hideout/pokeemerald-expansion/pull/4541
- Fixed floating Munkidori backsprite @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4552
- Fixed Salandit's sprite and palettes by @BlueAnthem37510 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4614
- Fixed regression from #4230 (1.8.0) that caused Mr. Mime's typing to ignore
P_UPDATED_TYPES
by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4547 - Fixed silent Oricorio Pom-Pom cry by @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4551
- Fixed regression from #4360 (1.8.2) that caused Shaymin to changing form with the incorrect status + receiving damage upon form change by @TheJamesLJ in https://github.com/rh-hideout/pokeemerald-expansion/pull/4559
⚔️ Battle General ⚔️
Fixed
- Fixed Imposter and Transform causing the user to look shiny until screen is refreshed if they're not in the first party slot by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4486
- Fixed regression in #4307 (1.8.2) that caused special battle types to not finish correctly by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4536
- Fixed multiple Speed ignoring effects by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4613
- Fixed Quick Draw always outspeeding Quick Claw and Custap Berry.
- Fixed Myceleum Might always outspeeding Stall.
🤹 Moves 🤹
Changed
- Ported Explosion/Mind Blown/Steel Beam implementation from CFRU (with tweaks) by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4516
Fixed
- Fixes Thief and Covet used by an opponent not stealing items by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4506
- Fixed Substitute, Fillet Away, Shed Tail and Belly Drum missing their
HITMARKER_PASSIVE_DAMAGE
, which weretriggering effects where they shouldn't by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4533- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4629
- Fixed Copycat issues by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4549
- Copycat can no longer call Z-Moves.
- 2-turn moves no longer play their animation twice when called by Copycat.
- Fixed Substitute issues by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4558
- The following secondary effects no longer occur if the target is behind a Substitute.
- Knock Off
- Salt Cure
- Smack Down/Thousand Arrows
- Wake-Up Slap/Smelling Salts, including doubling in damage, unless they have the
ignoresSubstitute
like Sparkling Aria.
- The following secondary effects no longer occur if the target is behind a Substitute.
- Fixed move animations by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4560
- Animations using
AnimTask_ShakeMonInPlace
: Last Resort,, Aqua Tail, Earth Power, Giga Impact, Zen Headbutt, Rock Climb, Stone Edge and Attack Order - Animations using
AnimTask_HorizontalShake
: Sunsteel Strike and Chloroblast
- Animations using
- Fixed Future Sight/Doom Desire triggering Focus Sash but not consuming the item moves by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4625
🎭 Abilities 🎭
Fixed
- Fixed Gulp Missile not triggering before fainting by @BlueAnthem37510 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4502
- Fixed Parental Bond converting Multi-Hit moves into in two-hit moves by @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4570
- Fixed Magic Guard not preventing recoil damage by @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4578
- Fixed Inner Focus, Scrappy, Oblivious and Own Temp granting immunity to all stat drops if the attacker has Intimidate by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4606
- Fixed Moxie-like abilities not triggering when fainting the target with G-Max/Max Moves by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4625
🧶 Items 🧶
Added
- Added missing Stellar Tera Shard sprite by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4595
Fixed
- Fixed overflowing item descriptions for Dubious Disc and for Ice Beam and Blizzard TMs when
B_USE_FROSTBITE
is set toTRUE
by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4540 - Fixed plural of "Exp. Candy XL" by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4574
- Fixed Elixir only being usable if the first move was missing PP by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4594
- Fixed Full Restore not curing statuses when used on party member that's not in battle by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4603
- Fixed Sceptilite using Tyranitarite's palette by @BlueAnthem37510 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4614
- Fixed Dire Hit being used on incorrect targets by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4626
🤖 Battle AI 🤖
Changed
- AI is now aware that Dynamaxed targets are immune to Heat Crash's effect by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4521
- AI now ignores resistances that don't actually apply when checking for bad moves by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4524
- For example: Super Fang, Counter and Endeavor.
- Stat stage related AI improvements by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4548
- Contrary is now properly checked.
- Some evasion and accuracy checks that were incorrectly handled are now fixed.
- Updated AI scores for Status moves that Dynamax Pokémon are immune to by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4523
- Roar, One-Hit KO moves, Disable, Encore, Torment, Destiny Bond, Skill Swap, Entrainment, Instruct and Skill Swappokeemerald-expansion/pull/4518
Fixed
- Various AI switching logic fixes by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4571
- Weather-based healing was treated as damage
- Damage and healing from multiple sources overwrote each other
- Utility Umbrella and Magic Guard were ignored.
- Max G-Steelsurge was ignored.
- Sitrus Berry's Gen 4+ effect was ignored.
- Removed item ID hardcoding for confuse berries.
- Various AI switching logic fixes Part 2 by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4572
- AI now calculates damage from the badly poisoned status.
- AI now removes weather damage from current AI instead of adding it.
- Cleanup for #4571
- AI respects partner when using spread moves in double battles by @AlexOn1ine in https://github.com/rh-hideout/
- Fixed AI not properly reading that Belch could be used after eating a berry by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4616
🧹 Other Cleanup 🧹
Fixed
- Fixed
BS_SetGlaiveRush
formatting by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4610
🧪 Test Runner 🧪
Added
- Added tests to verify Parental Bond doesn't affect
EFFECT_MULTI_HIT
moves by @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4573 - Added missing Move Effect TODO tests - Volume A by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4569
- Handles all
EFFECTS_x
that start with A, other effects will follow. Once all TODO tests are added, tests can begin to be written to assure that all current functionalities are fully functional.
- Handles all
Fixed
- Fixed incorrect Quick Claw test name by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4613
📦 Pret merges 📦
- Pre-1.8.4 pret merge (2024/05/26) (v2) by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4637
- Fix poison projectile array being incorrectly combined into three separate arrays by @NTx86 in https://github.com/pret/pokeemerald/pull/1989
- Fix hoenn pokedex palette being split in two by @NTx86 in https://github.com/pret/pokeemerald/pull/1990
- Fix Pokeblock script missing a releaseall by @Jaizu in https://github.com/pret/pokeemerald/pull/1996
- Fix Pokeblock script missing a releaseall by @Jaizu in https://github.com/pret/pokeemerald/pull/1996
- Make AdjustFriendship more readable by @Jaizu in https://github.com/pret/pokeemerald/pull/1995
- Move POKE_ICON_BASE_PAL_TAG to a header by @Sneed69 in https://github.com/pret/pokeemerald/pull/1998
New Contributors
- @BlueAnthem37510 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4502
- @TheJamesLJ made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4541
- @iriv24 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4570
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.3...expansion/1.8.4
Version 1.8.3
## 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.8.3`.
💥 Softlock/Crash fixes 💥
- Fixed AI bug that caused an infinite loop when player mon has only status moves by @Pawkkie and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4403
- Temporarely disabled
AI_FLAG_SMART_MON_CHOICES
flag in double battles to prevent a softlock by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4405 - Fixed debug option "Fill PC Boxes Fast" softlocking the game by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4428
- Fixed infinite loop caused by Leftovers with
AI_FLAG_SMART_MON_CHOICES
by @Pokabbie and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4453
🧬 General 🧬
Changed
- Updated outdated macOS instructions in
INSTALL.md
by @jschoeny in https://github.com/rh-hideout/pokeemerald-expansion/pull/4407 - Made filepath links in
README.md
relative by @lolbinarycat in https://github.com/rh-hideout/pokeemerald-expansion/pull/4509
Fixed
- Fixed abilities not being properly inherited via breeding for species/abilities with IDs over 255 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4411
- Fixed Hard Level Caps issues by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4420
- Fixed Pokémon being able to surpass cap if they gained enough experience at once.
- Fixed Exp. Candies ignoring hard caps.
- Fixed Pokémon gaining 1 experience if they are at the level cap.
- Fixed evolution tracker issues by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4503
EVO_LEVEL_MOVE_TWENTY_TIMES
no longer increases with every move.EVO_LEVEL_RECOIL_DAMAGE_MALE/FEMALE
is no longer updated twice than intended.
✨ Feature Branches ✨
TheXaman's HGSS Pokédex Plus:
Fixed
- Fixed Pokémon data page not properly handling
u16
Exp. Yields by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4432- Cleanup by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4445
🐉 Pokémon 🐉
Changed
- Further Gen 9 Pokémon icon improvements by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4413
- Original sprites by ezerart on DeviantArt. Palette assignments and 2nd frames by kittenchilly.
- Cyclizar, Dipplin, Farigiraf, Glimmet, Glimmora, Greavard, Iron Moth, Revavroom, Tadbulb, Paldean Tauros (all three of them), Tinkaton and Paldean Wooper.
- Further Gen 9 Pokémon front/back sprite improvements by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4414
- Source: PokéCommunity
- Dolliv, Arboliva, Charcadet, Mabosstiff, Tinkatink, Tinkatuff, Tinkaton and Chien-Pao.
Fixed
- Fixed Lycanroc Dusk and Midnight forms using Midday's backsprite by @Eemeliri in https://github.com/rh-hideout/pokeemerald-expansion/pull/4430
- Fixed Tatsugiri Droopy back sprite palette by @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4455
⚔️ Battle General ⚔️
Changed
- Turned
B_RESTORE_HELD_BATTLE_ITEMS
into a generational config by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4402
Fixed
- Fixed battle Partner trainer class and potential OOB-related issues by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4422
🤹 Moves 🤹
Fixed
- Fixed Quash not properly working when
B_RECALC_TURN_AFTER_ACTIONS
is set toGEN_8
or greater by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4419 - Fixed Will-O-Wisp's name capitalization in gMovesInfo by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4425
- Fixed Thunder Cage not printing the right battle message by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4426
- Fixed Diamond Storm missing its effect by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4489
- Fixed Mortal Spin's description by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4489
- Fixed Assist being able to call
MOVE_NONE
by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4491
🎭 Abilities 🎭
Changed
- Changed the Embody Aspect defines to use the full form name, to be in line with the species define by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4439
- Eg.
ABILITY_EMBODY_ASPECT_TEAL
->ABILITY_EMBODY_ASPECT_TEAL_MASK
.
- Eg.
Fixed
- Fixed Intimidate/Supersweet Syrup playing their animation and not printing the right message for battlers at -6 stage Attack/Evasion by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4406
- Fixed ability pop ups not respecting
abilityPopupOverwrite
in tests by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4423 - Fixed Dancer copying multi-target moves by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4437
- Fixed Hospitality triggering on a fainted mon by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4450
- Fixed Embody Aspect (Teal Mask) boosting Sp. Attack instead of Speed by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4439
- Fixed lingering long ability popup names by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4456
- Fixed Fur Coat not being skipped by Mold Breaker abilities by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4459
- Fixed Color change not being triggered by Future Sight or Doom Desire by @AlexOn1ine and @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4472
- Fixes Magic Bounce only working for battlers in certain positions by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4464
- Fixed Costar, Zero to Hero, Supreme Overlord and Ruin abilities' switch-in battle messages showing sometimes incorrectly by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4500
- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4511
🧶 Items 🧶
Fixed
- Fixed typo in Rotom Catalogue description by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4433
- Eject item fixes (Eject Button/Pack):
- Fixed regression from 1.8.2 that caused Eject Pack to not trigger upon self-inflicted stat decreases by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4463
- Fixed Eject Items causing wrong Pokémon taking damage by entry hazards by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4465
- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4497
- Fixed Flute Items being consumed in battle by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4496
- Fixed Red Card activating if the holder was switched in in the same turn (eg. via Endure) by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4482
🤖 Battle AI 🤖
Changed
AI_FLAG_SMART_SWITCHING
flag now automatically setsAI_FLAG_SMART_MON_CHOICES
as well by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4405- Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4409
- Corrected
IsDamageMoveUsable
's name toIsDamageMoveUnusable
by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4476 - Fixed AI not knowing that Steam Roller fails when there's no terrain by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4476
- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4498
🧪 Test Runner 🧪
Added
- Added missing Color change tests by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4472
Changed
Fixed
- Fixed AI test error messages by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4404
- The error messages for
EXPECT_MOVE
andEXPECT_SWITCH
were backwards, saying, e.g.Expected MOVE, got SWITCH
when it should sayExpected SWITCH, got MOVE
.
- The error messages for
- Fixed typos in Embody Aspect tests by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4439
- Fixed Battle Test organization by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4504
- Fixed Cud Chew's file being in the move effect folder.
- Fixed Cud Chew's file name and test names (Cud Chuw).
- Fixed Gastro Acid and Role Play's files being in the ability folder.
- Moved Recoil file to move flags folder.
- Renamed White Herb's file to
restore_stats.c
. - Renamed Techno Blast's file to
change_type_on_item.c
. semi_invulnerable_moves.c
tosemi_invulnerable.c
.two_turn_moves.c
totwo_turns_attack.c
.- Combined Burn Up/Double Shock to a single file
fail_if_not_arg_type.c
- Added Spit Up/Swallow files that point Stockpile's file.
- Moved secondary effect files to their own folder.
- Combinations of secondary effects moved to their own folder
- Split
hit_set_entry_hazards.c
to separate files for Spikes/Stealth Rock. - Grouped Hex/Venoshock to the same file
double_power_on_arg_status.c
New Contributors
- @jschoeny made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4407
- @Eemeliri made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4430
- @cafei-uh made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4455
- @PhallenTree made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4465
- @WillKolada made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4476
- @cawtds made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4503
- @lolbinarycat made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4509
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.2...expansion/1.8.3
Version 1.8.2
## 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.8.2`.
🌋 Important changes 🌋
- Added check during compilation to make sure that the code is inside a git directory before building by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4363
- If you downloaded the code using the "Download ZIP" option on GitHub, you will not be able to update your expansion version or merge any other feature brances, which is why we added this check to make sure that users don't fall into this trap.
💥 Softlock/Crash fixes 💥
- Fixed Battle Pyramid freeze when
BATTLE_PYRAMID_RANDOM_ENCOUNTERS
is set toTRUE
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4326 - Fixed switch-in AI infinite loop when calculating amount of hits to faint the opponent by @Pawkkie and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4338
- Fixed softlock with weather-triggered form changes and Cloud Nine by @skolgrahd in https://github.com/rh-hideout/pokeemerald-expansion/pull/4382
- Fixes Eject Pack softlock when there are no other party members left to switch to by @skolgrahd and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4387
🧬 General 🧬
Changed
- Changed Frostbite's abbreviation from
FSB
toFRB
by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4355
Fixed
- Fixed
BATTLE_PYRAMID_RANDOM_ENCOUNTERS
not including species pastFORMS_START
, including Gen 9 Pokémon by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4326 - Fixed potential compile issue that occurs when
gba/types.h
is included beforegba/defines.h
by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4364 - Fixed
givemon
setting every move despite only specifying a couple by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4377- Level up moves will be used when no move is specified.
- Rewrite
GiveBoxMonInitialMoveset_Fast
to matchGiveBoxMonInitialMoveset
results (but still faster) by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4373 - Fixed Teachable Learnset helper crashing in some environments by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4389
✨ Feature Branches ✨
TheXaman's Debug Menu:
Fixed
- Fixed compile issue when disabling Debug Menu by @damon-murdoch in https://github.com/rh-hideout/pokeemerald-expansion/pull/4372
TheXaman's HGSS Pokédex Plus:
Changed
- Male icons and front pics are now the default by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4390
Fixed
- Fixed showing graphical errors for icons by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4390
- Fixed disabled forms appearing in form list by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4395
🐉 Pokémon 🐉
Added
- Added missing Pecharunt sprite from PokéCommunity by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4324
- Added missing icons for multiple Pokémon by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4290
- Archaludon
- Partner Eevee
- Gouging Fire
- Iron Boulder
- Iron Crown
- Cornerstone Ogerpon
- Hearthflame Ogerpon
- Wellspring Ogerpon
- Pecharunt
- Partner Pikachu
- Raging Bolt
- Terapagos (all forms)
- Bloodmoon Ursaluna
Changed
- Updated almost all Gen 9 icon sprites to cleaner ones by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4290
- Original Source (there were some tweaks): https://www.deviantart.com/ezerart/art/Pokemon-Gen-9-Icon-sprites-3DS-Style-944211258
- GBA Pal sprites source: https://whackahack.com/foro/threads/9-gen-sprites.67492/page-46#post-493662
- Further tweaks were made after that.
Fixed
- Fixed Gengar's missing cries by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4385
- Fixed silent Klefki cry by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4392
⚔️ Battle General ⚔️
Fixed
- Level Cap issues
- Fixed Soft Level Caps not properly working by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4327
- Fixed issue that caused Level Caps to give 0 Exp when below the cap and
B_LEVEL_CAP_EXP_UP
set toFALSE
by @ravepossum in https://github.com/rh-hideout/pokeemerald-expansion/pull/4305
- Fixed graphical bug in Battle Arena windows by @Bassoonian and @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4307
- Fixed Totem Boosts not triggering by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4328
- Fixed Trainer Slide message for Low HP appearing when the HP was above 25% HP instead of below by @MelonSpeedruns and @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4353
- Fixed Pokémon Mega Evolving/Gigantamaxing/Fusing into
SPECIES_NONE
when the respective form toggles are set toFALSE
by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4395
🤹 Moves 🤹
Fixed
- Fixed Z-Mirror Move's base power being set to 0 instead of the mirrored move's base power by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4308
- Fixed Searing Sunraze Smash, Menacing Moonraze Maelstrom and Light That Burns The Sky not bypassing abilities by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4360
- Fixed multiple Future Sight issues by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4350
- Fixed Future Sight using the active Pokémon's stats if the original user switches out.
- Fixed Future Sight not being boosted by the user's item when the user is active when the move hits.
- Fixed Future Sight not failing when the target of the attack faints before it hits.
- Fixed Belch not being usable even if a berry was eating via Stuff Cheeks by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4376
🎭 Abilities 🎭
Added
- Added missing Disguise Gen8+ HP loss behavior by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4360
Fixed
- Fixed No Guard checking the wrong battler by @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/4320
- Fixed Intimidate's ability pop up appearing even when
B_ABILITY_POP_UP
is set toFALSE
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4339 - Fixed Guts preventing Frostbite's Sp. Attack reduction by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4351
- Fixed Iron Barbs/Rough Skin and confusion self-damage breaking Disguise by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4360
- Fixed Gulp Missile not changing Cramorant's form when Dive is triggered in a single turn using Power Herb by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4371
- Fixed Cud Chew showing its ability pop up but not triggering its berry again by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4379
- Fixed Ability flags by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4381
- Gulp Missle can't be copied.
- Commander can't be supressed.
🧶 Items 🧶
Fixed
- Fixed multiple White Herb Known issues by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4258
- Fixed White Herb not activating after Intimidade.
- Fixed White Herb not activating after all hits of a multi-hit move.
- Fixed White Herb activating when Knocked Off on the same turn as the lowering of the stat (eg. via Weak Armor)
- Fixed White Herb activating even if Magician steals it
- Fixed White Herb activating before Defiant and Competitive.
- Fixed Protective Pads ignoring Fluffy by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4340
- Fixed Ability Shield not preventing Neutralizing Gas from supressing the holder's ability by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4391
🤖 Battle AI 🤖
Fixed
- Fixed AI not considering Earth Eater by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4352
- Fixed AI not considering Memento an effect that reduces stats by adding it to
IsStatLoweringEffect
by @PCG06 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4386
🧹 Other Cleanup 🧹
Added
- Clarify in
README.md
to not use the "Download ZIP" option by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4336
Fixed
- Fixed formatting of plate items in type table by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4318
- Fixed style of some bit definitions by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4319
🧪 Test Runner 🧪
Added
- Added missing Defiant tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4331
- Added missing parametrized Gastro Acid tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4381
- Added missing parametrized Role Play tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4381
📦 Pret merges 📦
- Pret merge (2024/03/24) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4304
- Simplify weirdly matching division/substraction code by @DizzyEggg in https://github.com/pret/pokeemerald/pull/1982
- Document camera sprite functions by @GriffinRichards in https://github.com/pret/pokeemerald/pull/1961
- Renamed "fateful encounter" commands for consistency reasons by @LOuroboros in https://github.com/pret/pokeemerald/pull/1983
- Mid-April pret merge (2024/04/12) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4380
- Incorporated @ghoulslash's Surfing Dismount graphical fix by @pkmnsnfrn in https://github.com/pret/pokeemerald/pull/1985
- Updated value of
gMain.inBattle
atOpponentHandleEndLinkBattle
by @LOuroboros in https://github.com/pret/pokeemerald/pull/1986 - Added fix to Keep the Camera from Making Waves by @pkmnsnfrn in https://github.com/pret/pokeemerald/pull/1987
New Contributors
- @skolgrahd made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4382
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.1...expansion/1.8.2
Version 1.8.1
## 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.8.1`.
🌋 IMPORTANT CHANGES 🌋
- CRITICAL FIX: Fixed a softlock when looking at an Egg in the summary screen by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4301
🧬 General 🧬
Added
- Added pre-1.6.2 changelogs by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4296
Changed
- Disabled Tera Type on summary screen by default, since Terastallization is not implemented yet by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4289
Fixed
- Small fixes to Python install instructions by @ravepossum in https://github.com/rh-hideout/pokeemerald-expansion/pull/4288
- Fixed unintended Pokédex form behavior by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4299
🧹 Other Cleanup 🧹
Changed
- Actually removed unused
STATUS3_CANT_SCORE_A_CRIT
by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4293
Fixed
- Fixed species flag padding by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4291
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.0...expansion/1.8.1
Version 1.8.0
## 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.8.0`.
🌋 IMPORTANT CHANGES 🌋
-
Python is now a required for the Expansion.
- Run the
command -v python3
command to see if you have it. If you don't, please check INSTALL.md to see how to install it.
- Run the
-
Support for PoryMap v5.1.1 and lower has been dropped.
- Please update your PoryMap version.
- Specifically, we have removed the commented-out
gMonIconTable
table used to associate species IDs with icon images by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3896- From PoryMap v5.2.0 onwards, these icons are autodetected based on file/directory names instead.
- To continue using older versions of PoryMap, you may restore the commented-out table, though you'll need to keep it up to date with any new items you add.
-
Backwards-compatible
BoxPokemon
Refactor by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3438- HP and Status is now kept when depositing Pokémon in the PC
- Previous behavior can be restored by setting
OW_PC_HEAL
.
- Previous behavior can be restored by setting
- Nature Mints are now fully functional.
- Nature colors in summary screen are based on the changed nature by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3898
- Gigantamax Factor and Dynamax Level fully supported.
- Cannot be seen in summary screen.
- Dynamax Candy effect added.
- Gigantamax Factor prevents Duraludon from evolving, like Pikachu, Eevee and Meowth beforehand.
- Added
hasgigantamaxfactor
andtogglegigantamaxfactor
overworld script commands.- Gigantamax Factor cannot be toggled for Mythical Pokémon (vanilla behavior).
- Hyper Training is now fully supported.
- Cannot be seen in summary screen.
- Added
canhypertrain
andhypertrain
overworld script commands.
- Shininess can be toggled with
MON_DATA_IS_SHINY
. - Added Tera Type field is added for future-proofing.
- It can be seen in the summary screen by turning
P_SHOW_TERA_TYPE
on.
- It can be seen in the summary screen by turning
- Added
isShadow
field for future-proofing. - Added options for Tera Type, Dynamax Level, Gigantamax Factor and Shadow flag in tests.
- Cleanup by
- @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3832
- @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4017
- HP and Status is now kept when depositing Pokémon in the PC
-
Move Refactors:
- Move data unification by @LOuroboros, with help from @Bassoonian, @cfmnephrite and @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3999
- Renamed
gBattleMoves
togMovesInfo
. - Moved move names to
gMovesInfo
.- Added
GetMoveName
to get all move names, removing the need forGetMaxMoveName
andGetZMoveName
.
- Added
- Moved move descriptions to
gMovesInfo
. - Moved contest data to
gMovesInfo
.
- Renamed
- Secondary/primary effects overhaul by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/3577
- Secondary effects such as stat stage modifiers and status via are now set via
additionalEffects
field. - Eg.
Now becomes:[MOVE_THUNDER_FANG] = { .effect = EFFECT_FLINCH_STATUS, .secondaryEffectChance = 10, .argument = STATUS1_PARALYSIS, ... },
With customizable independent chances for each effect. Because of this,[MOVE_THUNDER_FANG] = { .effect = EFFECT_HIT, .additionalEffects = ADDITIONAL_EFFECTS( { .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 10, }, { .moveEffect = MOVE_EFFECT_FLINCH, .chance = 10, } ), ... },
secondaryEffectChance
has been removed. - For more info, check the wiki article on How to add a new move.
- Cleanup by:
- @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/3986
- @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4003
- By @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/4137
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4277
- Secondary effects such as stat stage modifiers and status via are now set via
- Renamed Battle Move "Split" to the proper "Category" term by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3774
-.split = SPLIT_PHYSICAL, +.category = DAMAGE_CATEGORY_PHYSICAL,
- Z-move power override (eg. Mega Drain) was moved from a switch in
GetZMovePower
to move data. It's part of an union alongsize with Z-move status effect by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/3575- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4201
- Removed
EFFECT_RECOIL_x
effects in favor of newrecoil
field by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/3575 - Removed critical-hit move effects in favor of new
criticalHitStage
by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/3779- Added
alwaysCriticalHit
move flag.
- Added
- Converted
EFFECT_x
defines to an enum by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/3975 - Move data now uses ternaries for data that was changed only once across generations by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3987
[MOVE_SWORDS_DANCE] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 - .pp = 20, - #else - .pp = 30, - #endif .effect = EFFECT_ATTACK_UP_2, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, + .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 20 : 30,
- Moved effect script array to
src/data/battle_move_effects.h
by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/3994- AI's
sEncouragedEncoreEffects
and Battle TV'ssPoints_MoveEffect
are now handled in this struct. - Some move flags were moved to this array instead
- Semi-invulnerable flag (
semiInvulnerableEffect
) in https://github.com/rh-hideout/pokeemerald-expansion/pull/4062- Cleanup by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/4150
- Flag to define Two-turn effects (
twoTurnEffect
) in https://github.com/rh-hideout/pokeemerald-expansion/pull/4062 - Flag for increasing the protection counter (
usesProtectCounter
) in https://github.com/rh-hideout/pokeemerald-expansion/pull/4062
- Semi-invulnerable flag (
- AI's
- Removed
sheerForceBoost
in favor of checking their actual secondary effects by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/4096- To force Sheer Boost acting for a move without secondary effect, you can add
SHEER_FORCE_HACK
in theadditionalEffects
field.
- To force Sheer Boost acting for a move without secondary effect, you can add
- Move data unification by @LOuroboros, with help from @Bassoonian, @cfmnephrite and @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3999
-
Learnset refactors
- Level up learnsets can now be switched by generational config by @MartyKen in https://github.com/rh-hideout/pokeemerald-expansion/pull/4049
- Adds a file for each generation with data for all species.
- Gen 1: Yellow
- Gen 2: Crystal
- Gen 3: RSE
- Gen 4: HGSS
- Gen 5: B2W2
- Gen 6: ORAS
- Gen 7: USUM
- Gen 8:
- Species from Gens 1-4: BDSP
- Species from Legends: Arceus: Use that game's data.
- Species from Gens 5-8: SwSh if they exist there. Otherwise, default to Gen 7's data.
- Gen 9:
- If they exist in SV, use that game's data.
- Otherwise, default to Gen 8's data.
- If a Pokémon doesn't exist in the respective generation, it uses the first instance it appears in.
- Eg. Chikorita uses its Gen 2 learnset if the config is set to Gen 1.
- IMPORTANT: Since the expansion's default had most movesets correspond to USUM's, conflicts will arise in
data/pokemon/level_up_learnsets/gen_7.h
if you modified the level learnsets. Be sure to backup yourdata/pokemon/level_up_learnsets.h
before merging and then do the following after merging to keep your changes:+#include "data/pokemon/level_up_learnsets.h" +#if FALSE + #if P_LVL_UP_LEARNSETS >= GEN_9 #include "data/pokemon/level_up_learnsets/gen_9.h" #elif P_LVL_UP_LEARNSETS >= GEN_8 #include "data/pokemon/level_up_learnsets/gen_8.h" #elif P_LVL_UP_LEARNSETS >= GEN_7 #include "data/pokemon/level_up_learnsets/gen_7.h" #elif P_LVL_UP_LEARNSETS >= GEN_6 #include "data/pokemon/level_up_learnsets/gen_6.h" #elif P_LVL_UP_LEARNSETS >= GEN_5 #include "data/pokemon/level_up_learnsets/gen_5.h" #elif P_LVL_UP_LEARNSETS >= GEN_4 #include "data/pokemon/level_up_learnsets/gen_4.h" #elif P_LVL_UP_LEARNSETS >= GEN_3 #include "data/pokemon/level_up_learnsets/gen_3.h" #elif P_LVL_UP_LEARNSETS >= GEN_2 #include "data/pokemon/level_up_learnsets/gen_2.h" #elif P_LVL_UP_LEARNSETS >= GEN_1 #include "data/pokemon/level_up_learnsets/gen_1.h" #endif +#endif
- Cleanup by
- @MartyKen in https://github.com/rh-hideout/pokeemerald-expansion/pull/4267
- @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4275
- Adds a file for each generation with data for all species.
- Added
sUniversalMoves
, a near-universal teachable move array by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4052- This removes the need to add moves such as Hidden Power to almost every species.
- Adds
tmIlliterate
flag that controls when specific species cannot learn these moves, such as Magikarp, Caterpie and Ditto.
- Auto-generate teachable learnset data from JSON data by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3856
- Scans the repository for TMs and tutor moves.
- Checks JSON files (same format as PoryMoves, with minor label adjustments for an easier time) for compatibility.
- Creates a
teachable_learnsets.h
file with the smallest size possible by only including the moves found in the scan. - Users can easily delete/add JSON files to reference less/more data as they see fit.
- Eg. they can remove hgss.json to remove those games' compatibility list from being considered.
- Any changes in
teachable_learnsets.h
made before this tool runs for the first time will be saved incustom.json
for flawless migration.
- Updated
teachable_learnsets.h
using this script by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4064- Further updated with new Indigo Disk data compatibility by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4155
- Can be disabled via
P_LEARNSET_HELPER_TEACHABLE
.
- Removed previously untutorable moves from Mew's unteachable moves by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4142
- Level up learnsets can now be switched by generational config by @MartyKen in https://github.com/rh-hideout/pokeemerald-expansion/pull/4049
-
Ability Refactor: new struct called
Ability
that stores both name and description of abilities by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3861- AI ability scores moved to this struct by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3862
- Added ability flags to replace arrays and switch statements by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/3886
cantBeCopied
: Cannot be copied by Role Play or Doodle.cantBeSwapped
: Cannot be swapped with Skill Swap or Wandering Spirit.cantBeTraced
: Cannot be copied by Trace.cantBeSuppressed
: Cannot be negated by Gastro Acid or Neutralizing Gas.cantBeOverwritten
: Cannot be overwritten by Entrainment, Worry Seed or Simple Beam. Mummy/Lingering Aroma checks forcantBeSuppressed
instead.breakable
: Can be bypassed by Mold Breaker-like abilities.failsOnImposter
: Currently unused.- Cleanup by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/3889
-
Type info consolidation by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4185
- New struct called
TypeInfo
that stores:- Name
- Generic move name
- Icon Palette index number
- Type Z-Move
- Type Max Move
- Commented out data to assist users that desire to use it in their own hacks and as a reference for them to add items of new types.
- Type-enhancing item (eg. Charcoal)
- Type-resist berry
- Type Gems
- Z-Crystal
- Tera Shard
- Arceus form
- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4276
- New struct called
🧬 General 🧬
Added
- Added optional high-quality RNG by @tertu-m in https://github.com/rh-hideout/pokeemerald-expansion/pull/3780
- Can be toggled with
HQ_RANDOM
. - Cleanup by
- Can be toggled with
- Added defines to RHH's rom header
MOVES_COUNT
andNUM_SPECIES
by @Ninjdai1 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3831- Cleanup by @Ninjdai1 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3992
ITEMS_COUNT
andITEM_NAME_LENGTH
by @Ninjdai1 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3988
- IWRAM and EWRAM variables can now be assigned at boot by using
EWRAM_INIT
andIWRAM_INIT
by @aronson in https://github.com/rh-hideout/pokeemerald-expansion/pull/3892- For example:
EWRAM_INIT u32 gFoo = 1337; IWRAM_INIT u32 gFastFoo = 31337;
- Cleanup by @aronson in https://github.com/rh-hideout/pokeemerald-expansion/pull/3903
- For example:
- Level Caps by @AlexOn1ine, @SBird1337 and PokemonCrazy in https://github.com/rh-hideout/pokeemerald-expansion/pull/3632
- Types of caps (set in
B_EXP_CAP_TYPE
):- None (
EXP_CAP_NONE
): Regular behavior, no level caps are applied. - Hard (
EXP_CAP_HARD
): Pokémon with a level equal or above cap cap cannot gain any experience. - Soft (
EXP_CAP_SOFT
): Pokémon with a level equal or above cap will gain reduced experience.
- None (
- Cap level can be set using either:
LEVEL_CAP_FLAG_LIST
: Level cap is chosen according to the first unset flag insLevelCapFlagMap
.LEVEL_CAP_VARIABLE
: Uses a defined variable to dynamically change level cap.
- Additional options include:
B_RARE_CANDY_CAP
: If set to true, Rare Candies can't be used to go over the level cap.B_LEVEL_CAP_EXP_UP
: If set to true, mons under level cap will receive more experience.
- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4275
- Types of caps (set in
- Added new metaprogram macros by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/3968
- Allows to set up default data without explicitily defining it.
- Eg. setting Poké Balls as the default ball for all trainer classes.
- Allows to set up default data without explicitily defining it.
- Elite Four/Champion transitions can now easily be applied to any trainer in their data by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4000
- Based off @ShinyDragonHunter's BetterMugshots branch.
- To use, use these in
src/data/trainers.h
:- Use
mugshotEnabled
to enable it for the specific trainer. - Use
mugshotColor
to choose the color of the background for the transition between the following:MUGSHOT_COLOR_PURPLE
MUGSHOT_COLOR_GREEN
MUGSHOT_COLOR_PINK
MUGSHOT_COLOR_BLUE
MUGSHOT_COLOR_YELLOW
- Use
- Cleanup using metaprogram by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4140
- Added
OW_DOUBLE_APPROACH_WITH_ONE_MON
config to allow being spotted by two trainers with one mon in party for a 2v1 battle by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4007 - Added configs to enable metric system units by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4183
- Toggled by
UNITS
ininclude/config.h
. - Cleanup by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4193
- Toggled by
- Implemented custom GiveMon scripting command by @LOuroboros, with help from @ghoulslash and @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3924
- Based off @ghoulslash's custom_givemon branch.
- In addition to Species, Level and Held Item, users can now specify:
- Poké Ball
- Nature
- Ability number
- You can pass
NUM_ABILITY_PERSONALITY
to generate the ability based on personality by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4192
- You can pass
- Gender
- EVs
- IVs
- Moves
- Shininess
- Gigantamax Factor
- Tera Type
- Save-compatible SaveBlock3, with 1624 bytes by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4112
- IMPORTANT: This is incompatible with the "Extra save space with two lines of code" tutorial, which allocates that additional space to
SaveBlock1
,SaveBlock2
, andPokemonStorage
instead. To preserve save compatibility, changeSAVE_BLOCK_3_CHUNK_SIZE
to 0 and keepSECTOR_DATA_SIZE
as 4084.
- IMPORTANT: This is incompatible with the "Extra save space with two lines of code" tutorial, which allocates that additional space to
- Trainer Control
- Trainer data encapsulation by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4216
- Added options for
TrainerMon
:- By @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3438
- Dynamax Level (
dynamaxLevel
) - Gigantamax Factor (
gigantamaxFactor
)
- Dynamax Level (
- By @Nopinou in https://github.com/rh-hideout/pokeemerald-expansion/pull/4169
- AI flags to signal when to Dynamax (
shouldDynamax
) - AI flags to signal when to Terastalize (
shouldTerastal
)
- AI flags to signal when to Dynamax (
- By @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3438
- Sets neutral nature and ability to 0 as default by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4172
- Added
randompercentage
andrandomelement
script commands by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4189- Allows to do the following:
@ VAR_RESULT is one of Treecko, Torchic, or Mudkip randomelement SPECIES_TREECKO, SPECIES_TORCHIC, SPECIES_MUDKIP @ Gives a random one of Treecko, Torchic, or Mudkip. givemon VAR_RESULT, 5
@ VAR_RESULT is TRUE 25% of the time, and FALSE 75% of the time. randompercentage 25 @ Gives a Wobbuffet that is shiny 25% of the time. givemon SPECIES_WOBBUFFET, 20, isShiny=VAR_RESULT
- Allows to do the following:
Changed
- Simplified creation of Object Events by adding
overworld_ascending_frames
for sequentialoverworld_ascending
s by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3625 - Comparison functions now follow -1, 1, 0 convention by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3777
- Centralized Trainer sprites by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3597
- Standarized usage of array shuffling to use
Shuffle
function by @tertu-m in https://github.com/rh-hideout/pokeemerald-expansion/pull/3801 - Turned nature names into compound strings by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3871
TrainerMoney
struct is renamed toTrainerClass
and now includes Trainer Class name by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3875- Improve error message with unsupported cpp by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4272
Fixed
- Fixed potential compiler errors by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4252
- Fixed
ScriptGiveMonParameterized
not recognizing the state ofP_FLAG_FORCE_SHINY
andP_FLAG_FORCE_NO_SHINY
by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4256 - Fixed a graphical issue when catching a form of a Pokémon for the first time by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4279
- Fixed
ScriptGiveMonParameterized
randomizing nature even when being set by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4271
✨ Feature Branches ✨
Incorporated @SBird1337's Dynamic Multichoices by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3826
- This allows to set up custom multichoices much easier!
- Allows you to control what options appear based custom conditions (such as them being based on what items you have currently, or even completely at random!).
- Event callbacks can be added as well, to fully customize what happens with your multichoices.
- Included there's
DYN_MULTICHOICE_CB_SHOW_ITEM
, which shows icons of the items defined by your script.
- Included there's
- Compatible with Poryscript.
- For more information and how to use it, please visit the Pokécommunity thread.
Incorporated @ghoulslash's Saveblock Cleansing branch by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4113
- Differences from the the standalone branch:
- Moved configs to dedicated file (
include/config/save.h
).- Fixed comments to the proper amount of space saved.
- Added
FREE_MYSTERY_GIFT
, saving 876 bytes inSaveBlock1
.
- Added new
FREE_EXTRA_SEEN_FLAGS_SAVEBLOCK2
to Pokedex struct to save an extra 108 inSaveBlock2
by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4213 - Renamed
FREE_EXTRA_SEEN_FLAGS
toFREE_EXTRA_SEEN_FLAGS_SAVEBLOCK1
by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4213
- Converted
#ifndef
configs to the config format the rest of expansion uses - Cleaned up the code and fixed to work on
modern
.
- Moved configs to dedicated file (
TheXaman's Debug Menu:
Added
- "Give Pokémon Complex" option can now set EVs by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3566
- Fix by @gabrielcowley in https://github.com/rh-hideout/pokeemerald-expansion/pull/3930
- Added "Clear bag" option by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/
- Added new party debug options by @LOuroboros, with help from @ghoulslash and @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3924
- "Check IV": Checks the selected Pokémon's IVs.
- "Check EV": Checks the selected Pokémon's EVs.
- "Clear Party": Deletes all Pokémon from the Player's party.
- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4275
- Upgraded "Poison Party" to "Inflict Status1" by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4235
- Now it can also inflict: Paralysis, Sleep, Burn, Freeze and Frostbite.
- Can be applied to a single member or the whole party.
- Built using SBird's Multichoice.
Changed
- Cleaned up text and adjusted size to support longer text by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3919
- Reorganization and better naming by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3926
- Removed duplicated "Give all TMs" option by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4025
Fixed
- Fixed sound effect clipping when giving an item via debug menu by using a shorter sound by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4025
🐉 Pokémon 🐉
Added
- Added Indigo Disk Pokémon data:
- Doesn't break saves since it uses the reserved IDs used in 1.7.0
- Species data by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3878
- Cleanup by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3974
- Sprites from PokéCommunity's 64x64 DS-Style thread by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4117
- Front/Back sprites for: Gouging Fire, Raging Bolt, Iron Boulder, Iron Crown, Archaludon, Hydrapple.
- Icon for: Hydrapple.
- Cries by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4164
- Added
P_FOOTPRINTS
config to disable Pokémon footprints, saving around 35KB of ROM space by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3902- Cleanup by
- @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3925
- @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4251
- Cleanup by
- Added missing
P_UPDATED_EVS
config that allows setting the EV yield changes across generations by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3993 - Added missing
P_UPDATED_EXP_YIELDS
config that allows setting the Experience yield changes across generations by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3995 - Added evolution methods that require custom trackers (
MON_DATA_EVOLUTION_TRACKER
) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4087EVO_LEVEL_MOVE_TWENTY_TIMES
:- Stantler can now evolve into Wyrdeer by using Psyshield Bash 20 times.
- Primeape can now evolve into Annihilape by using Rage Fist 20 times.
EVO_LEVEL_RECOIL_DAMAGE_MALE
/EVO_LEVEL_RECOIL_DAMAGE_FEMALE
- White-Striped Basculin can now evolve into Basculegion when leveling up after receiving 294HP of recoil damage and being the corresponding gender.
- Added missing Paldean Wooper icon by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4260
- Added missing data for placeholder Pokémon by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4281
- Internal Mothim forms used for accurate breeding.
- Internal Scatterbug/Spewpa forms that can be used to specify Vivillon form in previous stages.
- Totem Pokémon
- Partner Pikachu/Eevee
Changed
- Made all species IDs absolute instead of relative, to avoid confusion when adding new species by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4281
- Moved shared Pokédex text descriptions to their own file by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4281
- Renamed
species_info/gen_X.h
tospecies_info/gen_X_families.h
- Added missing entries for Hidden Abilities that default to
ABILITY_NONE
. - Updated Gen 9 mon sprites from PokéCommunity's 64x64 DS-Style thread by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3969
- Brute Bonnet
- Chi-Yu
- Flutter Mane
- Iron Bundle
- Sandy Shocks
- Scream Tail
- Skeledirge
- Slither Wing
- Added
MON_TYPES
andMON_EGG_GROUPS
metaprogram macros by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4154- They're used to define a single type/egg group without needing to define it twice.
Still supports double types:-.types = { TYPE_WATER, TYPE_WATER }, +.types = MON_TYPES(TYPE_WATER), ... -.eggGroups = { EGG_GROUP_WATER_3, EGG_GROUP_WATER_3 }, +.eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_3),
-.types = { TYPE_GROUND, TYPE_ROCK }, +.types = MON_TYPES(TYPE_GROUND, TYPE_ROCK), ... -.eggGroups = { EGG_GROUP_MONSTER, EGG_GROUP_FIELD }, +.eggGroups = MON_EGG_GROUPS(EGG_GROUP_MONSTER, EGG_GROUP_FIELD),
- They're used to define a single type/egg group without needing to define it twice.
- To avoid confusion, reverted gSpeciesInfo "INFO" macros by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4230
⚔️ Battle General ⚔️
Added
-
Implemented optional Gen1 type immunity logic. by @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/3627
-
Added Calyrex's blue Dynamax aura by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4018
-
Expanded
VAR_TERRAIN
functionality- Added
B_VAR_STARTING_STATUS_TIMER
to allowVAR_TERRAIN
(now calledB_VAR_STARTING_STATUS
) to last only a certain amount of turns instead of permanently by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4132 - Further expanded by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4176
- Can be used to set up these as well:
- Trick Room
- Magic Room
- Wonder Room
- Tailwind (for player or opponent sides independenly)
- Can be used to set up these as well:
- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4237
- Added
-
AI score debug menu can now cycle through battlers by pressing L/R by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4134
Changed
- Simplified Battle Partners code (eg. Steven) by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3592
- Based off @ShinyDragonHunter's CustomMultiBattles branch.
- Removed specialized code for Steven partner cases.
- Partners are now stored in their own array.
- Fixed infinite loop by @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/3808
- B_VAR_TERRAIN_TIMERRenamed VAR_TERRAIN to B_VAR_TERRAIN and added a var-based field terrain timer by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4132
Fixed
- Fixed AI calculations potentially stomping data when emiting data by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3784
- Fixed Battle AI debug screen showing shiny sprites by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3922
- Fixed Gigantamax Factor not changing form by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4108
- Fixed Quick Draw having increased chances of activation in double battles by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4266
🤹 Moves 🤹
Added
- Added missing move effects:
- Ally Switch by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3533
- Cleanup by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3835
- Doodle by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3609
- Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3800
- Fillet Away by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3616
- Shed Tail by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4016
- Last Respects by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4151
- Tidy Up by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4136
- Ally Switch by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3533
- Added Indigo Disk Moves
- Data by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3704
- Moves with existing effects by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3704
- Thunderclap
- Mighty Cleave
- Tachyon Cutter
- Hard Press
- Temper Flare
- Animation by @ZnogyroP in https://github.com/rh-hideout/pokeemerald-expansion/pull/4145
- Supercell Slam
- Malignant Chain
- New move effects
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3853
- Burning Bulwark (uses Protect's animation as placeholder)
- Alluring Voice (and animation)
- Fickle Beam
- Electro Shot
- Animation by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4148
- Psychic Noise by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4005
- Animation by @ZnogyroP in https://github.com/rh-hideout/pokeemerald-expansion/pull/4145
- Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4021
- Upper Hand (and animation) by @ZnogyroP in https://github.com/rh-hideout/pokeemerald-expansion/pull/4085
- Dragon Cheer by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4122
- Cleanup by @AlexOn1ine, based on comments by @Skeli789 and @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4136
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3853
- Added move animations for existing moves:
- By @ZnogyroP, with adjustments from @AlexOn1ine and @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3989
- Raging Bull
- Gigaton Hammer
- Ice Spinner
- Aqua Cutter
- Jet Punch by @PCG06 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4067
- By @ZnogyroP in https://github.com/rh-hideout/pokeemerald-expansion/pull/4145
- Last Respects
- Lumina Crash
- Kowtow Cleave
- Torch Song
- Aqua Step
- Hydro Steam
- Tidy Up
- Pounce
- Trailblaze
- Chilling Water
- Rage Fist
- By @ZnogyroP, with adjustments from @AlexOn1ine and @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3989
Changed
- Updated move data to Gen 9 with configs by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3704
- Added
sketchBanned
move flag, given to:- Sketch, Dark Void, Hyperspace Fury, Revival Blessing, Torque moves.
- Luster Purge: 70 Power -> 95 Power
- Mist Ball: 70 Power -> 95 Power
- Aeroblast: Added Wind Move flag.
- Added
- Ivy Cudgel's type now changes based on Ogerpon's form rather than held item by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3865
- Renamed
healBlockBanned
flag tohealingMove
by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3981 - Removed some hardcoded move IDs
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3982
MOVE_EXPLOSION
,MOVE_SELF_DESTRUCT
,MOVE_FRUSTRATION
,MOVE_AURA_WHEEL
,MOVE_PRESENT
,MOVE_BLIZZARD
.
- By @ZnogyroP in https://github.com/rh-hideout/pokeemerald-expansion/pull/4085
MOVE_SUCKER_PUNCH
.
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3982
- Removed now redundant
EFFECT_HURRICANE
in favor ofEFFECT_THUNDER
by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3982 - Renamed
constants/z_move_effects.h
toconstants/battle_z_move_effects.h
by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3982 - Updated Draco Meteor's animation to use @Skeli789's from CFRU, by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3989
- Improved Double Shock's animation by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3989
- Set
EFFECT_PLACEHOLDER
as the default move effect by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4079 - Renamed
EFFECT_FAKE_OUT
toEFFECT_FIRST_TURN_ONLY
due to the flinch effect separation by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4081 - Renamed
EFFECT_WRING_OUT
toEFFECT_VARY_POWER_BASED_ON_HP
and now it usesargument
to set its base power by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4180
Fixed
- Fixed
GetBattleAnimMoveTargets
function that caused multiple animation issues, such as Overheat's animation by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4139 - Fixed hardcoded battle strings by @ZnogyroP in https://github.com/rh-hideout/pokeemerald-expansion/pull/4147
- Hospitality had Sinistcha's name hardcoded.
- Battler prefixes (eg. "The opposing") were hardcoded in some places.
- Fixed Supreme Overlord's incorrect effect by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4151
- Fixed Hard Press' base power by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4180
- Fixed Teeter Dance not being copyable by Dancer in singles by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4129
- Known issue: In doubles, it copies the move, but only confuses a single Pokémon.
🎭 Abilities 🎭
Added
- Added Mind's Eye by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3782
- Added Hospitality by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3818
- Fixed Dynamax interaction by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3821
- Added Embody Aspect (all 4 versions) by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3821
- Added Supersweet Syrup by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4115
- Cleanup by
- @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4170
- @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4171
- Cleanup by
- Indigo Disk Abilities
- Data by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3838
Changed
- Updated ability banlists to Indigo Disk data by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3609
Fixed
- Fixed Tangling Hair preventing Rocky Helmet from triggering interaction by @AlexOn1ine, with help from @ZnogyroP in https://github.com/rh-hideout/pokeemerald-expansion/pull/4219
🧶 Items 🧶
Added
- Added Meteorite item form change functionality for Deoxys by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3770
- Added item price configs by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3834
I_PRICE
andI_BERRY_PRICE
.- Fixed missing data by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3836
- Added Pokemon Box Link functionality by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3837
- Added Indigo Disk item data by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3854
- Metal Alloy
- Stellar Tera Shard
- Added Legends: Arceus item data by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3825
- Jubilife Muffin - Local specialty (Full Heal)
- Remedy - Medicine (Potion)
- Fine Remedy - Medicine (Super Potion)
- Super Remedy - Medicine (Hyper Potion)
- Aux items
- Aux Evasion
- Aux Power
- Aux Guard
- Aux Powerguard
- Sprites based off lichen's sprites from Relic Castle by @MartyKen in https://github.com/rh-hideout/pokeemerald-expansion/pull/4160
- Choice Dumpling
- Swap Snack
- Twice Spiced Radish
- Pokéshi Doll
- Berry Expansion by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3618
- Berry Mutations (from XY): Planting a Berry tree next to another has a
BERRY_MUTATION_CHANCE
(25% by default) chance of causing a mutation (as dictated bysBerryMutations
). Mutations mean that besides the usual output, the Berry plant will have a single Berry of the mutation (e.g. planting a Iapapa Berry next to a Mago Berry will cause it to have a single Pomeg Berry on top of its usual output).- Enabled via
OW_BERRY_MUTATIONS
config.
- Enabled via
- Easier Berry Debugging: Add berry manipulation functions to the debug menu to allow for forced growth and more.
- Mulch (from Gen IV and XY): Using it on soil affects the growth, watering and production values of the plants.
- Enabled via
OW_BERRY_MULCH_USAGE
config.
- Enabled via
- Gradient watering (from Gen IV and XY) (
OW_BERRY_MOISTURE
andOW_BERRY_ALWAYS_WATERABLE
): rather than keeping track of if each stage has been watered like Gen III, the humidity of the soil is kept track of separately.- Enabled via
OW_BERRY_MOISTURE
config. - Switch between Gen4/6 via
OW_BERRY_ALWAYS_WATERABLE
config. - Rate of drying set by
OW_BERRY_DRAIN_RATE
config.
- Enabled via
- Weeding from XY: Berries may require unweeding for additional produce.
- Enabled via
OW_BERRY_WEEDS
config.
- Enabled via
- Pests (from XY): Bug-type Pokémon may appear to feast on your plants.
- Enabled via
OW_BERRY_PESTS
config.
- Enabled via
- Customisable stages: XY has six stages rather than four, so with this easy toggle you can choose the amount of stages without influencing the growth time.
- Enabled via
OW_BERRY_SIX_STAGES
config.
- Enabled via
- Growth configs: Pick a generation whose Berry growth rates to use
- Changed via
OW_BERRY_GROWTH_RATE
config.
- Changed via
- Yield configs: Pick a generation whose Berry yields to use
- Changed via
OW_BERRY_YIELD_RATE
config.
- Changed via
- Cleanup by
- @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3931
- @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/4028
- @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4275
- Berry Mutations (from XY): Planting a Berry tree next to another has a
- Added missing pre-Gen7 Power Item config (giving 4 EVs instead of 8) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3961
- Added LGPE+ Premier Ball Bonus config by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4191
- Originally based off pret's tutorial, but with the following changes:
- If there's no space for the full amount of Premier Balls that would've been given, give the partial amount.
- Shows the amount of Premier Balls given.
- Originally based off pret's tutorial, but with the following changes:
Changed
- Raised the limit of max items per stack to 999 by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3923
- Unified item data
- Move descriptions are now defined in
src/data/items.h
instead ofsrc/data/text/item_descriptions.h
by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3432- Cleanup by
- @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3797
- @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4088
- Cleanup by
- Moved Item Effects (
gItemEffectTable
) togItemsInfo
by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3991 - Renamed
gItems
togItemsInfo
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4068
- Move descriptions are now defined in
- Item Balls now can be defined in the map's JSON (or using PoryMap) via the common script
Common_EventScript_FindItem
instead of needing to define a new script for it by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/3942"trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", - "script": "AbandonedShip_CaptainsOffice_EventScript_ItemStorageKey", + "trainer_sight_or_berry_tree_id": "ITEM_STORAGE_KEY", + "script": "Common_EventScript_FindItem", "flag": "FLAG_ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY"
- Item count can also be defined by using the
movement_range_x
field:"trainer_sight_or_berry_tree_id": "ITEM_NUGGET", "script": "Common_EventScript_FindItem", "flag": "FLAG_ITEM_AQUA_HIDEOUT_B1F_NUGGET" + "movement_range_x": 2,
- Existing scripts have been adapted to use this new format.
- Item count can also be defined by using the
- Added plural item name support with new
pluralName
field ingItemsInfo
by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/3942- When obtaining multiples of an item and the field is not defined, it appends an
s
at the end instead (eg. "Brendan got 40 Potions!"). - Python migration script available in
migration_scripts/item_ball_refactor.py
by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/3997 - Deprecated
GetBerryCountString
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4012 - Cleanup by
- When obtaining multiples of an item and the field is not defined, it appends an
- Combined
CannotUseBagBattleItem
andCannotUsePartyBattleItem
intoCannotUseItemsInBattle
by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3524
Fixed
- Fixed some ball multiplier data by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3939
- Fixed
B_SPORT_BALL_MODIFIER
config being ignored and always applying a 1.5x multiplier. - Added missing
B_SAFARI_BALL_MODIFIER
that makes Safari Balls have a 1x multiplier from Gen7 onwards. - Added missing
B_LURE_BALL_MODIFIER
state that sets Lure Ball's multiplier to 4x from Gen8 onwards.
- Fixed
- Fixed Quick Claw having increased chances of activation in double battles by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4266
🤖 Battle AI 🤖
Added
- Added
AI_CalcMoveScore
function to more easily control score increases by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3984 - Added
AI_FLAG_POWERFUL_STATUS
AI flag, replacingAI_FLAG_SCREENER
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4125- It's meant to force the AI to do status instead of fainting the target (eg. setting up Trick Room to support the rest of the team)
Changed
- AI flags are now saved by battler position instead of per side by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3003
- Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4114
Fixed
- Improved AI score changes handling by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4036
- AI will not further increase Attack / Sp. Atk stat if it knows it faints to target.
- AI will not use Throat Chop if opposing mon has a better move.
- AI will select Throat Chop if the sound move is the best damaging move from opposing mon.
- Cleanup by
- @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4074
- @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4075
- @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4199
- Fixed AI not setting sets up double flags correctly by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4228
- Move most damage
AI_BadMove
checks toAI_CalcDamage
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4238- Fixes AI trying to use Burn Up after losing its fire type.
- Fixes AI trying to use Electric moves when the target has Volt Absorb.
- Fixed AI vs AI battles would crash during the throw animation by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4240
- Fixed AI considering Mold Breaker but not Turboblaze/Teravolt for flinch-related decisions by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4244
🧹 Other Cleanup 🧹
- Removed hardcoded uses of
MOVE_STUFF_CHEEKS
andMOVE_ME_FIRST
by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3950 - Cleaned up
CheckMoveLimitations
to use less horizontal space by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3950 - Small
CanFirstMonBoostHeldItemRarity
optimization by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4008 - Tag previously-unused icon pals as such in code. by @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/4072
- Converted a bunch of
#if/#else
to regular conditions by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4071 - Clean up contest strings by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3876
- Fixed inconsistent braces style by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4023
- Replaced some
AI_GetMoveEffectiveness
instances withAI_CanStatus
for speeding up calculations by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4166 - Remove some unused data by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4239
- Use
u32
instead ofu8
/u16
in gflib files by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4250 - Unify monSpritesGfx bytes/ptr field by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4252
gHeap
can go in the middle of ram by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4253- Corrected initial value of
targetSpecies
variable inGetEvolutionTargetSpecies
by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4269 - Replaces
MOVE_FIRST_IMPRESSION
argument with a check for Fake Out for 100% flinch effect by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4274
🧪 Test Runner 🧪
Added
- Added option to set flags in tests by @fakuzatsu in https://github.com/rh-hideout/pokeemerald-expansion/pull/3786
- Added missing Illuminate and Keen Eye Tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3782
- Added missing Belly Drum tests by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3616
- Added missing Stuff Cheeks by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3950
- Added Teeter Dance + Dancer test for doubles by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4274
Changed
- Updated tests to use Gen 9 mon for appropiate abilities by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3740
- Tests no longer allow to use SEND_OUT if the chosen mon is fainted by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3752
Fixed
- Consistent
BENCHMARK
timing by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3866 - Fixed Teatime test checking for Wonder Room instead of Magic Room by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3950
- Fixed test battle move category assumptions by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4051
- Fixed Tri Attack status ability immunity test by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4229
- Fixed Dauntless Shield test names by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4229
📦 Pret merges 📦
- 2023/12/30 by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3869
- 2024/02/10 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4173
- 2024/03/07 by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4255
New Contributors
- @cfmnephrite made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3575
- @tertu-m made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3780
- @aronson made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3892
- @MartyKen made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4049
- @ZnogyroP made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4085
- @Nopinou made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4169
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.7.4...expansion/1.8.0
Version 1.7.4
## 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.Y.Z`.
🧬 General 🧬
Fixed
- HGSS Dex fixes:
- Fixed inconsistent list tileset between capped and decapped modes by @ravepossum in https://github.com/rh-hideout/pokeemerald-expansion/pull/4126
- Fixed screen select bar popping in too early for area screen by @ravepossum in https://github.com/rh-hideout/pokeemerald-expansion/pull/4094
- Fixed Lotad/Seedot house using species weight instead of height by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4195
🐉 Pokémon 🐉
Fixed
- Fixed Ogerpon shiny palettes by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4165
- Fixed Basculegion back sprite offset by @MelonSpeedruns in https://github.com/rh-hideout/pokeemerald-expansion/pull/4198
- Fixed Greninja form animations by @MelonSpeedruns in https://github.com/rh-hideout/pokeemerald-expansion/pull/4198
- Fixed compile error when
P_GEN_8_CROSS_EVOS
is enabled but notP_GEN_9_CROSS_EVOS
due to Ursaluna's cry being labled as Gen 9 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4210 - Fixed Curly Tatsugiri and Green Plumage Squawkabilly icons not showing up properly in later versions of Porymap by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4212
⚔️ Battle General ⚔️
Fixed
- Fixed disobedience not resetting multihit moves by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4133
- Fixed switch in interactions with hold effects abilities by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4091
- Download activating on an empty field.
- Intimidate activating on an empty field and not activating upon new opponent switching in.
- Primal Reversion not happening immediately upon switching in from U-turn.
- Held items not being triggered when switching in fron U-turn and Intimidate being triggered beforehand.
- Fixed LastUsedBall issues not being saved and DisplayBall not being shown by @Wesmaster in https://github.com/rh-hideout/pokeemerald-expansion/pull/4209
🤹 Moves 🤹
Fixed
- Fixed move animations crashing on some emulators because of division by zero by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4121
- Flip Turn, Anchor Shot, Snipe Shot and Incinerate were affected by this.
- Fixed Eerie Spell consuming double PP and showing its message twice by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4127
- Fixed Fairy Lock animation by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4111
🎭 Abilities 🎭
Added
- Added Gen 5+ config for Soundproof no longer preventing Uproar status by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4174
Fixed
- Fixed Mycelium Might speed calculation by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4146
- Fixed Stench triggering on non-damaging attacks by @HungryPickle in https://github.com/rh-hideout/pokeemerald-expansion/pull/4159
- Fixed Disguise not ending the battle in the correct form by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4167
- Fixed Opportunist accumulating stat changes by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4168
🧶 Items 🧶
Fixed
- Kee Berry fixes by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4149
- Fixed triggering if the holder does a physical attack instead of receiving it.
- Fixed it boosting the target's defense if the attacker holds a Kee Berry, while still displaying the boost animation for the holder.
- Fixed poison-healing items not reseting Toxic Counter by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4135
🧹 Other Cleanup 🧹
Changed
- Clean up space/tabs difference by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4163
- Deleted a space by @cmy2008 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4194
New Contributors
- @cmy2008 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4194
- @MelonSpeedruns made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4198
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.7.3...expansion/1.7.4
Version 1.7.3
## 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.7.3`.
🌋 IMPORTANT CHANGES 🌋
- Unused warnings are no longer treated as errrors by default by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4092
- [Critical fix] Backported gHeap alignment fix from upstream pret by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4089
- Fixes issue that causes graphics to bug when leaving Littleroot for Birch's cutscene.
🧬 General 🧬
- Fixed HGSS Dex's dark mode search palette by @ravepossum in https://github.com/rh-hideout/pokeemerald-expansion/pull/4095
🐉 Pokémon 🐉
Changed
- Condensed Oinkologne teachable learnsets (they previously had different tables despite having the same learnsets) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4026
- Removed illegal teachable learnset moves that didn't match Gen 7 or 9 by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4039 and https://github.com/rh-hideout/pokeemerald-expansion/pull/4042
Fixed
- Fixed incorrect family toggle preproc blocks by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4024
- Cosplay and Cap Pikachu animations were still being included even if disabled.
- Fixed compile errors when:
- Feebas' family was disabled but not Castform.
- Chatot was disabled but not Spiritomb.
- Virizion was disabled but not Tornadus or Thundurus.
- Zekrom was disabled but not Landorus.
- Kyurem was disabled but not Keldeo or Meloetta.
- Wishiwashi was disabled but not Rockruff.
- Fixed compile error when disabling Gen 4 cross-evolutions while having Kingdra enabled by @Skyeward and @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4044 and https://github.com/rh-hideout/pokeemerald-expansion/pull/4046
⚔️ Battle General ⚔️
Fixed
- Fixed Steven double battle palette error by @johannakullmann in https://github.com/rh-hideout/pokeemerald-expansion/pull/4078
🤹 Moves 🤹
Changed
- Renamed
EFFECT_STEEL_BEAM
toEFFECT_MAX_HP_50_RECOIL
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4043
Fixed
- Fixed Pursuit's effect not working by @ZnogyroP @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4086
🎭 Abilities 🎭
Fixed
- Fixed Emergency Exit issues:
- Fixed rounding error that caused it to not switch out when odd-numbered HP was off by 1 by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4040
- Eg: going from 101 Max HP to 50 HP would've not cause it to switch out.
- Fixes Emergency Exit switching out even if the Pokémon was healed above the threshold before it would've triggered by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4041
- Eg: going from 100 Max HP to 45 HP and eating a Sitrus Berry back to 55 HP would've cause it to switch out.
- Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4100
- Fixed rounding error that caused it to not switch out when odd-numbered HP was off by 1 by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4040
- Fixed Corrosion only working for status moves by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4037
- Fixed Magic Guard not preventing Mind Blown recoil damage by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4043
🧶 Items 🧶
Fixed
- Fixed oversight causing chosen fossil to be lost if bag is full by @fakuzatsu in https://github.com/rh-hideout/pokeemerald-expansion/pull/3978
- Fixed other Key Item script oversights by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4066
- Fixed Life Orb causing damage on switch-in from Eject Pack and Red Card by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4038
- Fixed Glimmering Charm sprite by @SonikkuA-DatH and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4047
🤖 Battle AI 🤖
Fixed
- Fixed AI trying to switch into the same mon twice in the same turn by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4098
🧪 Test Runner 🧪
Added
- Corrosion tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4037
- Pursuit/Tangling Hair interaction by @ZnogyroP @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4086
Changed
- Passing
KNOWN_FAILING
tests are now listed separately fromPASSED
tests by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4063
New Contributors
- @Skyeward made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4044
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.7.2...expansion/1.7.3
Version 1.7.2
## 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.7.2`.
🧬 General 🧬
Changed
- Pokédex Ratings now dynamically adapt to the size of the regional dex, instead of being harcoded at set intervals of 10 up to 200 by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3900
- Mythical Pokémon are skipped from the rating unless they have the
dexForceRequired
flag by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3937
- Mythical Pokémon are skipped from the rating unless they have the
- Updates to INSTALL.MD for 1.7.0+ and misc clarifications by @ravepossum in https://github.com/rh-hideout/pokeemerald-expansion/pull/3983
Fixed
- Fixed HGSS Pokédex showing incorrect preevolutions by @kaisermg5 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3894
- Fixed typo in HGSS Pokédex by @Ninjdai1 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3958
- Fixed Hall of Fame not showing proper 4-digit dex numbers by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3901
- Fixed debug menu flags not redrawing correctly by @ravepossum in https://github.com/rh-hideout/pokeemerald-expansion/pull/3916
- Fixed issue when trying to add new party menu field moves by @johannakullmann in https://github.com/rh-hideout/pokeemerald-expansion/pull/3933
- Fixed RHH Rom Header shifting addresses by @Ninjdai1 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3980
🐉 Pokémon 🐉
Added
- Added missing form dex entries by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3972
- Meloetta Pirouette
- Mega Diancie
- Hoopa Unbound
- Gigantamax Sandaconda
Changed
- Multiple Pokémon graphical improvements by @katykat5099 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3805
- Improved Tyrantrum's back sprite.
- Improved Zigzagoon and Linoone's palette
- Updated Gen 9 Pokémon icons to @CyanSMP64's improvements
- Annihilape
- Arctibax and Baxcalibur
- Bellibolt
- Bramblin and Brambleghast
- Cetoddle and Cetitan
- Charcadet, Armarouge and Ceruledge.
- Chi-Yu and Chien-Pao
- Clodsire
- Crocalor
- Dolliv
- Dudunsparce
- Esparthra
Fixed
- Multiple Pokémon graphical fixes by @katykat5099 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3805
- Fixed Togepi having a missing pixel on its icon's first frame.
- Fixed Litwick having a missing pixel on its front sprite.
- Fixed Krookodile having a stray pixel on its front sprite.
- Fixed Duraludon's palette.
- Fixed Egg graphical data not being properly read by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3879
- Fixed Dugtrio's missing footprint and forms not appearing in the HGSS dex by @kaisermg5 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3897
- Fixed Paldean Tauros having the base stats of Kantonian Tauros by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3970
- Fixed Hisuian Electrode having the wrong evolution method (evolving "at level 214" instead of via Leaf Stone) by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3970
⚔️ Battle General ⚔️
Changed
- Re-enabled Z-Move Usage in Battle Frontier by @damon-murdoch in https://github.com/rh-hideout/pokeemerald-expansion/pull/3883
Fixed
- Fixed weird stat drop animation by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3870
- Fixed Battle Frontier Multi Battles randomly ending in loss by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3990
🤹 Moves 🤹
Fixed
- Fixed Bleakwind Storm, Wildbolt Storm and Sandsear Storm not targetting both foes and not skipping accuracy check under rain by @damon-murdoch in https://github.com/rh-hideout/pokeemerald-expansion/pull/3884
- Updated move animations to account for this target change by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3895
- Fixed Inner Focus breaking when
B_WAIT_TIME_MULTIPLIER
config was being set to any value other than 16. - Fixed Collision Course's and Electro Drift's PP being 10 instead of 5 by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3890
- Fixed "Sea of Fire" Pledge effect damaging fainted PokémonSome pledge combo fixes by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3934
- Fixed Syrup Bomb's effect not being cleared when the user leaves the field by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3948
- Fixed Dragon Darts hitting 3 times instead of 2 (full effect still not done) by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4014
🧶 Items 🧶
Fixed
- Fixed Unremarkable Teacup, Masterpiece Teacup and Syrupy Apple's effects by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3858
- Fixed Poké Balls getting 100% catch rate by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3955
- Fixed item usage in double battles by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3977
🤖 Battle AI 🤖
Fixed
- Fixed small AI bulldoze effect bug by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3872
🧹 Other Cleanup 🧹
Fixed
- Fixed Quick/Wide Guard config comments by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3857
🧪 Test Runner 🧪
Added
- Added missing Strength Sap tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3860
- Added Clanging Scales test by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3973
- Added 5 Parental Bond tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3973
Changed
- Consistent
BENCHMARK
timing by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3867
New Contributors
- @damon-murdoch made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3883
- @lordraindance2 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3885
- @johannakullmann made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3933
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.7.1...expansion/1.7.2
Version 1.7.1
## 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.7.1`.
🧬 General 🧬
Changed
- Deprecate agbcc and clarify gcc version usage in install instructions. by @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/3788
Fixed
- Fix Update Message Saying 1.6.2 by @kaicardenas2 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3759
- Fix exp gain when defeating two opponents at once by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3798
- Fix debug menu toggling first flag by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3796
🐉 Pokémon 🐉
Fixed
- Fix Maushold-3 and Maushold-4 icons being swapped by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3809
- Fixes Minior form change and likely other forms by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3822
- Fix P_FAMILY #if blocks for Regigigas and Giratina in front_pic_anims.h by @gabrielcowley in https://github.com/rh-hideout/pokeemerald-expansion/pull/3823
🤹 Moves 🤹
Added
- Adds data for The Indigo Disk moves by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3852
- Many moves still have placeholder effects.
Fixed
- Fix Telekinesis not working by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3763
- Fix Ion Deluge interaction with Volt Absorb andLightning Rod by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3764
- Fix Max Moves animations by @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/3769
- Fix Cotton Down overwriting gBattlerAttacker by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3783
- Fix Photon Geyser by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3803 and https://github.com/rh-hideout/pokeemerald-expansion/pull/3807
- Fix Metronome crash by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3852
🎭 Abilities 🎭
Fixed
- Fix Ice Face ignoring move effects by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3755
- Fix Frisk ability pop-up showing wrong battler by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3762
- Prankster tests + fixes by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3766
🧶 Items 🧶
Fixed
- Fixes Item Metronome damage by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3767
- Fix gem boost description + test by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3817
🧹 Cleanup 🧹
- Clear BattleScripting struct at the battle start by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3776
- Fix Rain Dance and Sunny Day not blending opponent sprite by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3785
- Same lists for healing moves by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3787
- [battle_controller_player.c] refactor and fix buffer overread by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3792
- Make overworld weather-based terrain setting effects use B_MSG_TERRAIN_SET constants for intro text by @ravepossum in https://github.com/rh-hideout/pokeemerald-expansion/pull/3793
- Clear Sky Battle & Dynamax flags upon whiteout by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3830
🧪 Test Runner 🧪
Added
- Small test runner improvements by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3761
- EXPECT_MUL_EQ thresholds are always at least ±1 by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3768
- Added last CannotUseItemsInBattle tests by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3789
New Contributors
- @kaicardenas2 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3759
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.7.0...expansion/1.7.1
Version 1.7.0
## 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.7.0`.
🌋 IMPORTANT CHANGES 🌋
The Expansion now uses Modern compilers by default
- We have enabled
-Werror -Wall
in the Makefile. These flags show warnings for undefined behaviors in the old compiler (agbcc
), and sets all warnings as errors. As such, we have updated the codebase so that all warnings that gcc 13 throws are handled:- CI now uses devkitarm container to run a more modern gcc by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3429
- Fix by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3530
- Fixed
-Wall -Werror
errors on Modern by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3412 - Fixed warnings introduced by gcc 13 by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3428
-Warray-bounds
-Waddress
-Warray-parameter
- Fixed
-Wmaybe-uninitialized
forModifyPersonalityForNature
test by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3457
- CI now uses devkitarm container to run a more modern gcc by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3429
- Modern compiler may raise the following errors for code introduced from outside the expansion, so we recommend solving those errors:
unused-function
. To solve it, addUNUSED
to the function definition.-static void Function(void) +static void UNUSED Function(void)
unused-variable
. To solve it, remove the unused variable.static void Function(void) { - u8 unused; u8 used; ...
unused-but-set-variable
. To solve it, addUNUSED
to the variable definition.static void Function(void) { - u8 unused; + u8 UNUSED unused; u8 used; unused = DoSomething(); ...
- Updated modern compiler install instructions by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3527
- You may still use
agbcc
by addingagbcc
to yourmake
command to finish the update process before fixing these errors.- eg.
make -j8 agbcc
. - We may drop support for it in the future, so we recommend updating the code to support the new compilers.
- This will generate
pokeemerald_agbcc.gba
, while modern will generatepokeemerald.gba
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3462
- eg.
🧬 General 🧬
Added
- Incorporated @TheXaman's HGSS Style Pokédex by @AaghatIsLive in https://github.com/rh-hideout/pokeemerald-expansion/pull/3288
- Includes Dark Mode
- Fix by @AaghatIsLive in https://github.com/rh-hideout/pokeemerald-expansion/pull/3479
- Updated evolution strings by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/3375
- Changes to omit adding the code when disabling the feature by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3445
- Teachable move list fix by @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/3624
- Includes Dark Mode
- Incorporated @DizzyEggg's nature color branch by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3582
- Shows nature stat modifiers in summary screen.
- Added
SUMMARY_SCREEN_NATURE_COLORS
config to disable it. - Updates stat reduction to blue to align with official implementation.
- Added
I_SELL_VALUE_FRACTION
config that changes selling factor of items to 1/4th when set to Gen 9 by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3315 - Added
P_FRIENDSHIP_EVO_THRESHOLD
config to update the Friendship evolution threshold to Gen8+'s standard by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3376 - Debug Menu
- Added
ROM Space
Utility option to check ROM space by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3453 - Added
Toggle Match Call
Flag option to toggle Match Call by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3489 - Added
Move Reminder
option by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3707 - Moved Party/Boxes related functions to their own menu by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3707
- Added
- Added expansion Rom Header by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3454
- Added defines for Expansion version number.
- Added option to see the version number in debug menu.
- Added option to restore Japan-only Walda PC backgrounds by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3550
- Added
BATTLE_PYRAMID_RANDOM_ENCOUNTERS
config to enable Battle Pyramid Wild Encounter randomization by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2581 - Added a
GetSpeciesPreEvolution
function by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3696
Changed
- Converted
Get(Box)MonData2
to proper functions by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3416 - Added
src/data/map_group_count.h
to.gitignore
by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3423 Cheat Start
option now gives all badges and enables all Fly locations.Fly to...
option no longer enables all Fly locations by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3489- Better documentation for Type Effectiveness table by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3374
- Generational defines now start at
GEN_1
instead ofGEN_3
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3628- Fixes and cleanup
- By @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/3720
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3723
- Fixes and cleanup
Fixed
- Fixed potential Fly and Badge mismatch when using debug options by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3489
- Fixed Pokémon Animation debug menu ignoring animation delay by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3562
- Fixed
IS_DITTO
macro by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3558 - Added RTC failsafe to Debug menu's
Cheat Start
option by @ravepossum in https://github.com/rh-hideout/pokeemerald-expansion/pull/3561
🐉 Pokémon 🐉
Added
- Added Generation 9 species up to Teal Mask by @leo60228, @AlexOn1ine, @katykat5099, @kittenchilly and @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3249
- IMPORTANT: Enabling Gen 9 species currently break saves. If you don't want to use them, you can disable
P_GEN_9_POKEMON
ininclude/config/species_enabled.h
.- Reserved Indigo Disk IDs
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3725
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3726
- By @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3727
- Reserved Form IDs that will be supported in future versions by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3750
- Shadow Lugia
- Totem Forms
- Partner Pikachu and Eevee
- Reserved Indigo Disk IDs
- Updated UIs to support 4-digit Dex numbers.
- Added Dunsparce and Tandemaus evolution methods by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3547
- Tandemaus still does the evolution cutscene for now.
- Ported newer PokéCommunity sprites by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3643 and https://github.com/rh-hideout/pokeemerald-expansion/pull/3646
- Fixes and cleanup
- By @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3539
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3655 and https://github.com/rh-hideout/pokeemerald-expansion/pull/3749
- By @katykat5099 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3751
- IMPORTANT: Enabling Gen 9 species currently break saves. If you don't want to use them, you can disable
- Adjusted Pokemon sprites and palettes - Part 2 by @CyanSMP64 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3612
- From Magnemite to Tangela + Hitmontop + Nidoking adjustment by MrDollSteak.
- Corrected sprite sizes and elevations
- Further palette adjustments by @CyanSMP64 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3744
- Pidgeotto, Tentacruel, Feraligatr, Furret, Flaaffy, Marill, Azumarill and Miltank.
- Added missing Alcremie forms by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3469
- Previously, only Strawberry Sweet forms were available
- Missing: Icons for non-Ruby Cream forms.
- Cleanup by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3488
- Added species define synonyms for base forms with form names by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3248
- Eg.
SPECIES_GIRATINA_ALTERED
is equal toSPECIES_GIRATINA
. - The original defines can be used in combination of
GET_BASE_SPECIES_ID(species)
to check for the whole species instead of specific forms.
- Eg.
- Added Gen 7 Pokémon 2nd frames and animations by @katykat5099 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3426
- Rowlet family
- Pikipek family
- Cutiefly family
- Rockruff family
- Oranguru
- Passimian
- Fixed its shiny palette.
- Togedemaru
- Drampa
- Jangmo-O family
- Added Gen 6 Pokémon 2nd frames and animations by @katykat5099 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3543
- Chespin
- Bunnelby
- Fletchling family
- Floette family
- Added missing 2nd frame for Eternal Flower Form.
- Amaura
- Added mising World Cap Pikachu icon by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3401
- Added
P_CUSTOM_GENDER_DIFF_ICONS
config to use custom female icon sprites for Pikachu and Wobbuffet by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3506- Removed
P_HIPPO_GENDER_DIFF_ICONS
in favor of Hippopotas and Hippowdon to use this new config.
- Removed
- Added
P_UPDATED_FRIENDSHIP
config that updates Pokémon base friendship to Gen 8+ standards by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3491
Changed
- Species Simplifier™ (Parts 1, 2 and 3)
- Moved most data from multiple arrays to new fields in
gSpeciesInfo
gSpeciesNames
array ->speciesName
field.gLevelUpLearnsets
array ->levelUpLearnset
field.gTeachableLearnsets
array ->teachableLearnset
field.gEvolutionTable
array ->evolutions
field.- Fix by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3696
gFormSpeciesIdTables
array ->formSpeciesIdTable
field.gFormChangeTablePointers
array ->formChangeTable
field.- Refactored Cry tables to simplify the process of adding new cries.
- Now there's a single entry in the table per cry, and species are asigned cry IDs in
gSpeciesInfo
'scryId
field.
- Now there's a single entry in the table per cry, and species are asigned cry IDs in
- Graphical data now have their pointers in
gSpeciesInfo
(Sprites, palettes and animations)- Removed all files in
src/data/pokemon_graphics/
with the exception offront_pic_anims.h
.gMonBackPicCoords
array ->backPicSize
field.gMonBackPicTable
array ->backPic
field.gMonBackPicTableFemale
array ->backPicFemale
field.
gMonFrontPicCoords
array ->frontPicSize
field.gMonFrontPicTable
array ->frontPic
field.gMonFrontPicTableFemale
array ->frontPicFemale
field.
gMonPaletteTableFemale
array ->palette
field.gMonPaletteTableFemale
array ->paletteFemale
field.
gMonShinyPaletteTable
array ->shinyPalette
field.gMonShinyPaletteTableFemale
array ->shinyPaletteFemale
field.
gEnemyMonElevation
array ->enemyMonElevation
field.gMonIconPaletteIndices
array ->iconPalIndex
field.gMonIconPaletteIndicesFemale
array ->iconPalIndexFemale
field.
- Removed unused 2nd animations.
- Removed all files in
- Dex Entries
- Individual form information is visible in the HGSS Pokédex (Vanilla Dex TBD)
- National Dex numbers are assigned to the species in
gSpeciesInfo
, removing the need ofsSpeciesToHoennPokedexNum
andsSpeciesToNationalPokedexNum
arrays. - Height and Weight are now saved separately per form, so weight in battle is now more accurate.
- Pokédex size page proportions are also separate.
- Pokédex descriptions are now saved as compound strings in
gSpeciesInfo
and differ by form. Shared entries are at the top ofsrc/data/pokemon/species_info.h
.- Missing Pokédex texts for forms by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3708
- Added toggles to disable specific family groups of species
- Located in
include/config/species_enabled.h
.- Moved the original
P_GEN_x_POKEMON
configs to this file.
- Moved the original
- Options to disable groups of species:
- Battle-gimmick forms (Megas, Primals, etc.)
- Regional Forms (Includes evolutions of those species, such as Sirfetch'd)
- Pikachu extra forms.
- Cross-Generation Evolutions
- Also added separate option to add cross-evolutions to the Regional Dex.
- Generation 1-3 families can now be disabled.
- Pokémon will not evolve into species that have been disabled.
- Pokémon will produce offspring of species that have been disabled.
- Pokémon will not change form into forms that have been disabled.
- Fixes and cleanup
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3722
- Located in
- Grouped data by species family.
- Converted species flags to gcc flags.
- Converted
P_UPDATED_STATS
"ifdef blocks" to ternaries. - Added Mega Evolution hidden ability failsafes.
- Separated
gSpeciesInfo
by Generation by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3729 - Fixes and cleanup
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3656
- By @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3698
- Moved most data from multiple arrays to new fields in
- Updated
P_UPDATED_ABILITIES
Gen 9's config for Piplup's line, Gallade and Shiftry by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3353- Shiftry's 2nd regular ability was changed from Early Bird to Wind Rider.
- Piplup, Prinplup and Empoleon's Hidden abilities were changed from Defiant to Competitive.
- Gallade was given Sharpness as a 2nd regular ability.
- Updated Legends Arceus Pokémon data and Level Up learnsets to Scarlet/Violet's by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3458
- Applied missing uses of
PLACEHOLDER_ANIM_SINGLE_FRAME
by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3562 - Renamed
PLACEHOLDER_TWO_FRAME_ANIMATION
toPLACEHOLDER_ANIM_TWO_FRAMES
by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3562 - Removed Old Unown Level Up Learnsets by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3562
- Added
FORM_CHANGE_TIME_OF_DAY
form change that automatically changes Form during times of day (used by Shaymin to revert to Land Forme at night) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/1690 - Added
FORM_CHANGE_STATUS
form change that triggers when they adquire status condition (used by Shaymin to revert to Land Forme when frozen) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3734- Currently it doesn't:
- Prevent Shaymin from changing into Sky Forme when frozen.
- Change Form in the Battle Pike.
- Currently it doesn't:
- Evolutions now call for
GetTimeOfDay
instead of checking the times directly by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3369- Dusk Ball and Form changes also use this function by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3585
- Added config for different times of day ranges by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3579
- Fixes and cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3648 and https://github.com/rh-hideout/pokeemerald-expansion/pull/3701
Fixed
- Fixed Koffing and Weezing's abilities ignoring
P_UPDATED_ABILITIES
config and always using Gen8's config by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3353 - Fixed Pumpkaboo macro typo by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3541
- Multiple fixes by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3544
- Fixed Mega Gardevoir/Gallade not having their updated Egg Groups.
- Fixed mon not having their appropiate items.
- Alolan Sandlash (Grip Claw, Rare)
- Alolan Muk (Black Sludge, Common)
- Alolan Golem (Cell Battery, Common)
- Alolan Marowak (Thick Club, Rare)
- Alolan Ninetales (Snowball, Rare)
- Fixed missing species flags.
- Giratina Origin (Legendary flag)
- Deoxys Attack (Mythical flag)
- Deoxys Defense (Mythical flag)
- Deoxys Speed (Mythical flag)
- Shaymin Sky (Mythical flag)
- Fixed Aegislash Blade giving the wrong EV yield.
- Fixed Zygarde 10% with Power Construct having the same stats as Zygarde 50%.
- Fixed Galarian Weezing having inproper noFlip property.
- Fixed Stantler not evolving when
P_GEN_9_POKEMON
is set toFALSE
by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3548 - Fixes Hisuian Sneasel's type order by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3706
⚔️ Battle General ⚔️
Added
- Dynamax by @AgustinGDLV and @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2417 + Tests
- Requires a Dynamax Band in the bag and for the
B_FLAG_DYNAMAX_BATTLE
flag to be assigned and set.- Pokémon holding a Mega Stone or Z-Crystal can't Dynamax.
- Gigantamax forms.
- G-Max Moves.
- Forms determined using the Form Change tables.
P_GIGANTAMAX_FORMS
config to disable those forms.
- Since we currently don't modify the
BoxPokemon
struct:- Dynamax levels are set to 0 (1.5x HP increase)
- Species always change into their Gigantamax Forms.
- AI Dynamaxes the last Pokémon left in their party.
- Instances where HP/Max HP percentages are used now use
GetNonDynamaxHP
andGetNonDynamaxMaxHP
respectively. - Trainer slide-in messages by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3581
- Fixes and cleanup
- By @AsparagusEduardo in
- By @AlexOn1ine in
- Requires a Dynamax Band in the bag and for the
- Added support for Sky Battles by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/2950
- Requires both
B_FLAG_SKY_BATTLE
andB_VAR_SKY_BATTLE
to be assigned. - Use the
TrySkyBattle
special in scripts to check if the player can participate in a Sky Battle and readies the party if it's succesful. Saves the result in VAR_RESULT.Route123_EventScript_Alberto_Battle_Event_Script: msgbox Route123_EventScript_Alberto_Text_AskSkyBattle, MSGBOX_YESNO compare VAR_RESULT, NO goto_if_eq Route123_EventScript_Alberto_DenySkyBattle special TrySkyBattle compare VAR_RESULT, TRUE goto_if_eq Route123_EventScript_Alberto_StartBattle msgbox Route123_EventScript_Alberto_Text_No_Flying_Pokemon closemessage release end
- The
B_SKY_BATTLE_STRICT_ELIGIBILITY
config will restrict certain Pokémon from participating based on XY's list when enabled. By default is disabled and allows all Pokémon that are Flying-type and/or have Levitate as their ability. - Banned moves are defined by the
skyBattleBanned
flag. Besides moves banned officially in XY, Gen7+ moves are added viaB_EXTRAPOLATED_MOVE_FLAGS
config by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3714 - Effects that interact with grounded battlers do not happen in Sky Battles.
- Fix by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/3617
- Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3621
- Requires both
- Added
B_TOXIC_REVERSAL
config to revert bad poison to regular poison at the end of battles by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3605 - Added
B_SANDSTORM_SPDEF_BOOST
config to disable Sandstorm's Sp. Defense boost for Rock-type Pokémon when set toGEN_3
or less by @Petuuuhhh in https://github.com/rh-hideout/pokeemerald-expansion/pull/3387 - Added
B_QUICK_MOVE_CURSOR_TO_RUN
config to allow a B Button shortcut for moving the cursor to the run option in Wild Battles by @voloved in https://github.com/rh-hideout/pokeemerald-expansion/pull/3362 - Added
B_TRY_CATCH_TRAINER_BALL
config to disable losing the Poké Ball used to try to catch a Trainer's Pokémon by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3684 - Added
P_CATCH_CURVE
config that updates catch calculations to Gen 6+ by @AtariDreams in https://github.com/rh-hideout/pokeemerald-expansion/pull/3685 - Added Snow weather animation by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3440
- Added a
flushtextbox
macro to flush the text box in battles by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3442
Changed
- Removed redundant Battle Types by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/2417
BATTLE_TYPE_KYOGRE_GROUDON
BATTLE_TYPE_REGI
BATTLE_TYPE_GROUDON
BATTLE_TYPE_KYOGRE
BATTLE_TYPE_RAYQUAZA
- Intros, terrain and music determined by the species itself.
- Regigigas, Regieleki and Regidrago play
MUS_VS_REGI
.
- Regigigas, Regieleki and Regidrago play
- Converted most battle preproc
#if
blocks to Cif
s by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3392 - Removed pointless for loop in CB2_InitBattleInternal by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3422
- Refactored Battle Frontier bans to check the base species by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3465
- Better support for adding new species.
- Also adds Gen4+ Special Pokémon to the list.
- Obedience levels now increase per badge by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3475
- Also sets
B_OBEDIENCE_MECHANICS
's default config toGEN_LATEST
, where obedience restrictions also apply to non-outsider Pokémon, albeit based on their level met rather than actual level. - Thanks to combination of the added obedience levels matching ORAS' with vanilla Emerald's encounter levels, there's not a single instance were players need to worry about caught Pokémon not obeying as soon as they are caught.
- Also sets
- Decoupled Affection values from Friendship rater thresholds, making them occur less often than what they used to by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3495
- Because of the lessened frequency, they have been turned on by default.
- Added
HITMARKER_DISABLE_ANIMATION
to temporarily disable animations (used in Bug Bite's berry consumption) by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3607
Fixed
- Fixed Psychic Terrain blocking moves that target all battler or all opponents by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3521
- Fixed issue with "Cycle through Poké Balls" feature not working properly by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3534
- Fixed Burmy not transforming at the end of battle if it didn't switch in during a Single Battle by @benicioneto in https://github.com/rh-hideout/pokeemerald-expansion/pull/3728
- Fixed Player Partner not playing its Shiny animation by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3757
🤹 Moves 🤹
Added
- Added Teal Mask Moves by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3402 + Tests
- Matcha Gotcha
- Syrup Bomb
- Animation by @SonikkuA-DatH and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3474
- Fixes by @AlexOn1ine in
- Ivy Cudgel
- Type is shown in interfaces by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3590
- Tweaks and fixes
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3721
- Fixed Ivy Cudgel test name by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3742
- Added Glaive Rush's effect by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3476
- Added Raging Bull's effect by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3552
- Added Chilly Reception's effect by @RapidNutcracker in https://github.com/rh-hideout/pokeemerald-expansion/pull/3379
- Added Rage Fist's effect by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3573
- Added define synonyms (eg.
MOVE_VICE_GRIP
vs the currentMOVE_VISE_GRIP
) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3580 - Added combined Pledge move effects by @AlexOn1ine, @Skeli789 and @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3336
- Status animations by @SonikkuA-DatH
- Added
B_WIDE_GUARD
andB_QUICK_GUARD
configs for Wide Guard and Quick Guard to fail when used consecutively in Gen 5 by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3614 - Added
B_IMPRISON
config that makes Imprison not fail if opposin Pokémon don't have any moves that the user knows from Gen 5 onwards by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3710
Changed
- Added
B_EXTRAPOLATED_MOVE_FLAGS
config to extend move flag for moves removed in Gen8+.- Razor Wind, Silver Wind and Ominous Wind are given the
windMove
flag. - Dynamax Cannon, Behemoth Blade and Behemoth Blade are given the
assistBanned
flag. - Bitter Blade and Matcha Gotcha are given the
healBlockBanned
flag.
- Razor Wind, Silver Wind and Ominous Wind are given the
- Added new move flags by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3425
twoTurnMove
(replacesIsTwoTurnsMove
)forcePressure
(for self-targeted moves that are affected by Pressure)cantUseTwice
(replacesEFFECT_GIGATON_HAMMER
)healBlockBanned
(replaces anEFFECT_x
switch inIsHealBlockPreventingMove
)encoreBanned
(replacesif
chain inCmd_trysetencore
)assistBanned
(originally usedcopycatBanned
+EFFECT_SEMI_INVULNERABLE
andEFFECT_SKY_DROP
)parentalBondBanned
- Updated missing move flags for every move by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3425
- Updated Grassy Glide's power from 60 to 55 when
B_UPDATED_MOVE_DATA
is set toGEN_9
or later (Teal Mask) by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3425 - Simplified Octolock script and converted its
various
tocallnative
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3437 - Added
CanAbilityPreventStatLoss
to centralize stat lowering immunities by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3437- Fixed multiple abilities not showing the ability name in their message.
- Renamed
EFFECT_SMELLINGSALT
toEFFECT_SMELLING_SALTS
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3504 - New move animations by @Captain-Ford and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3529
- Phantom Force
- Trick or Treat
- Acrobatics
- Head Smash
- Psyshock
- Charge Beam
- Plasma Fists now setup
STATUS_FIELD_ION_DELUGE
instead of having their ownSTATUS4
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3476 - Battle Dome points are now based on move data instead of being arbitrarily assigned by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3596
Fixed
- Multiple Relic Song fixes by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3476
- Fixed Acid and Crunch move descriptions being updated by
B_UPDATED_MOVE_DATA
alongside their effects by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3586 - Fixed Howl buffing the user's ally if they have Soundproof by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3593
- Fixed Floral Healing not increasing its effect on Grassy Terrain + Tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3604
- Fixed Spirit Shackle/Anchor Shot not trapping the targets by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3668
- Fixed Defog not consuming PP if the foe has -6 evasion by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3668
- Fixed Mirror Coat being able to reflect Pain Split damage by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3668
- Fixed incorrect Fling damage calculation due to the item being removed before them by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3670
- Fixed Z-Moves using the base move's priority by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3690
- Fixed Metal Burst, Trump Card and Comeuppance not being considered as damaging moves by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3697
- Fixed Fiery Wrath animation bug that caused the user to flip upside down by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3739
- Fixed Baton Pass not passing Embargo's remaining turns by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3745
- Fixed Raging Fury not causing rampage on user by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3754
🎭 Abilities 🎭
Added
- Added Opportunist + Tests by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2994
- Added Zero to Hero + Tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3542
- Fix by @AlexOn1ine https://github.com/rh-hideout/pokeemerald-expansion/pull/3552
- Added
B_ILLUMINATE_EFFECT
config for Illuminate's Gen9 effect by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3482 - Added
B_WEAK_ARMOR_SPEED
config for Weak Armor's Gen 5-6 effect by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3498 - Added
B_PROTEAN_LIBERO
config for Protean/Libero only triggering once per switch-in as of Gen 9 by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3614 - Added
B_INTREPID_SWORD
andB_DAUNTLESS_SHIELD
configs for Intrepid Sword and Dauntless Sword only triggering once per battle by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3614 - Added configs for disabling ability overworld effects as of Gen 9 by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3480
- Synchronize, Compound Eyes, Super Luck, Cute Charm, Illuminate, Infiltrator, Harvest, Lightning Rod, Storm Drain, Flash Fire, Magnet Pull and Static.
- Àbility data (not yet functional) by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3349
- Hospitality
- Mind's Eye
- Embody Aspect (one ability per effect)
- Toxic Chain
- Supersweet Syrup
Changed
- Pickup Table has been changed so that their percentages can be customized more easily, by @kittenchilly and @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3351
- The data has been changed to Sword & Shield's.
- Moved
B_SYNCHRONIZE_NATURE
toinclude/config/overworld.h
and renamed it toOW_SYNCHRONIZE_NATURE
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3480
Fixed
- Fixed Synchronize not working with Gift Pokémon and scripted Wild Battles by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3480
- Fixed Anger Shell being triggered multiple times by multi-hit moves by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3508
- Fixed Absorbing abilities not cancelling multi-hit moves + Tests (eg. Sap Sipper vs Bullet Seed) by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3516
- Fixed issue that caused Shadow Tag to not work by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3549
- Fixed assumption that
gLastUsedAbility
isu8
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3569 - Fixes Protosynthesis and Quark Drive ability pop up appearing more than once by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3595
- Fixed Trace not triggering when switching in by secondary effects like U-Turn, Eject Pack or Explosion by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3623
- Fixed Defiant not being triggered by Cotton Down interaction by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3657
- Fixed self-targeted moves triggering Stamina, like Substitute by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3669
- Fixed Quick Draw not working properly by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3724
- Fixed Neutraling Gas switch-out combined with Electric Surge causing a visual glitch by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3746
- Fixed Innards Out damaging Pokémon with Magic Guard by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3758
- Fixed Innards Out damaging Pokémon despite being suppressed by Gastro Acid by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3758
🧶 Items 🧶
Added
- Repeated Medicine usage by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3005
- You can use multiple medicine items in a row without going back to the bag menu. Supports Rare and Exp. Candies.
- Added
B_LIGHT_BALL_ATTACK_BOOST
config to disable Light Ball's Pshycal Attack boost when set toGEN_3
or less by @Petuuuhhh in https://github.com/rh-hideout/pokeemerald-expansion/pull/3387 - Added Teal Mask items by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3349
- Sprites (except for Fairy Feather) by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3527
- Fairy Feather by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3520
- Sprite by Anarlaurendil on Deviantart.
- Despite being introduced in Gen 9, it's still affected by the
I_TYPE_BOOST_POWER
config to be consistent with other type items (10% boost when set to Gen 3).
- Evolution items
- Syrupy Apple
- Unremarkable Teacup
- Masterpiece Teacup
- Form change items
- Cornerstone Mask
- Wellspring Mask
- Hearthflame Mask
- EV modifier items
- Health Mochi
- Muscle Mochi
- Resist Mochi
- Genius Mochi
- Clever Mochi
- Swift Mochi
- Fresh Start Mochi
- Glimmering Charm
- Since there's no raids, it currently does nothing.
- Implemented Rotom Catalog and Zygarde Cube by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3284
- Zygarde Cube follows Gen 8 functionality, where it allows to change Form and Ability but not teach moves.
- Rotom Catalog follows non-BDSP functionality, where all forms don't need to be unlocked.
- Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3700
- Implemented support for Fusion items by @TeamAquasHideout and @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3274
- Items:
- DNA Splicers
- N-Solarizer
- N-Lunarizer
- Reins of Unity
- Fused mon are stored at the end of in
PokemonStorage
. - Fixes by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3602
- Fixes and cleanup
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3644
- By @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3692
- Items:
- Ported pokefirered's Vs. Seeker by @Jaizu @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/3256
- Requires
I_VS_SEEKER_CHARGING
flag to be assigned. - Cleanup by @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/3718
- Requires
- Added define synonyms (eg.
ITEM_STICK
vs the currentITEM_LEEK
) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3580
Changed
- Removed unused holdEffectParam for items that double the amount of money gained in battle by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3528
- Using the name
Parcel
instead ofOak's Parcel
by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3580 - Repel/Lure menu improvements @Jaizu and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/3594
- If
VAR_LAST_REPEL_LURE_USED
is enabled and a spray runs out:- It will show the name of the spray that ran out.
- If it was the last item of its type and strength, it will ask the player if they want to use a different one of the same type.
- B can now be pressed to cancel the menu.
- If
Fixed
- Fixed healing berries activating before Knock Off by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3509
- Fixed crash damage triggering Eject Button by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3669 and https://github.com/rh-hideout/pokeemerald-expansion/pull/3738
- Fixed Quick Claw not reading
holdEffectParam
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3737 - Fixed Life Orb causing recoil when swapped via Magician when it shouldn't by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3753
🤖 Battle AI 🤖
- Added AI Tests
- By @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3361
- AI prefers Bubble over Water Gun if it's slower (both are power 40).
- AI prefers Water Gun over Bubble if it knows that foe has Contrary.
- AI prefers moves with better accuracy, but only if they both require the same number of hits to KO.
- AI prefers moves which deal more damage instead of moves which are super-effective but deal less damage.
- AI prefers Earthquake over Drill Run if both require the same number of hits to KO.
- AI chooses the safest option to faint the target, taking into account accuracy and move effect.
- AI won't use ground type attacks against flying type Pokémon unless Gravity is in effect.
- AI will not switch in a Pokémon which is slower and gets 1HKOed after fainting.
- AI switches if Perish Song is about to kill.
- AI won't use a Weather changing move if partner already chose such move.
- AI will not use Helping Hand if partner does not have any damage moves.
- AI will not use a status move if partner already chose Helping Hand.
- AI without any flags chooses moves at random.
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3382
- AI prefers a weaker moves over one with a downside effect if both require the same number of hits to KO.
- AI prefers moves with the best possible score, chosen randomly if tied.
- AI can choose a status move that boosts the attack by two.
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3515
- AI won't use Solar Beam if there is no Sun up or the user is not holding Power Herb.
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3583
- AI chooses moves with secondary effect that have a 100% chance to trigger
- Cleanup by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3748
- By @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3361
- Smarter SwitchAI Mon Choices +
HasBadOdds
Switch Check by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/3253- Use
AI_FLAG_SMART_MON_CHOICES
to enable smarter decisions when choosing which mon gets sent out HasBadOdds
expandsAI_FLAG_SMART_SWITCHING
to switch out in cases where a mon has a bad matchup and lots of HP remaining
- Use
- Extend
AI_FLAG_SMART_SWITCHING
for Encore / hazards / lowered attacking stats + Tests by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/3557
Changed
- By @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3199
- Using move flags instead of lists for AI calculations by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3389
- Remove redundant AI score increases by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3504
- Remove
GetMoveDamageResult
function by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3536
Fixed
- Fixed AI randomly choosing moves if they're both super effective by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3361
🧹 Other Cleanup 🧹
- Remove all trailing whitespace (upcoming) by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3473
- Debug menu cleanup and documentation by @AsparagusEduardo and @sphericalice in https://github.com/rh-hideout/pokeemerald-expansion/pull/3390
- Removed
powerfulMoveEffects
array by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3515 - Added
-Woverride-init
Makefile flag that agbcc has by default by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3535 - Fixed static variable names by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3637
- Fixed config descriptions
- By @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/3717
- Fixed mistmatching
gBattleTextBuff3
definitions by @GraionDilach in https://github.com/rh-hideout/pokeemerald-expansion/pull/3719
🧪 Test Runner 🧪
Added
- Added support for wild battle tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3342
- Added support for AI battle tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3361
- Experience tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3342
- Catching Pokémon gives experience.
- Higher leveled Pokémon give more experience.
- Lucky Egg boosts gained exp points by 50%.
- Exp is scaled to player and opponent's levels.
- Large exp gains are supported
- Held Exp. Share gives Experience to mons which did not participate in battle
- Added additional damage formula test by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3437
- Added Octolock tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3437
- Added Defiant/Sticky Web interaction test by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3516
- Added Embargo tests by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3555
- Added missing Hyper Cutter tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3437
- Added missing Anger Shell tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3508
- Added missing White Herb tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3611
- Added
SpeciesInfo
integrity tests by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3688
Changed
- Moved battle tests off the heap by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3413
- Automatic
ASSUMPTION_FAIL
in tests when used species are disabled.- Because of this, instances of
ASSUME(P_GEN_x_POKEMON == TRUE)
have been removed.
- Because of this, instances of
- Updated Gen 9-mon-exclusive ability tests to use Gen 9 mon by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3733
Fixed
- Fixed VSCode error shenanigans when viewing tests by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3383
- Fixed broken move animations in test replays by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3398
- Performance improvement for test name matching by @jiangzhengwenjz in https://github.com/rh-hideout/pokeemerald-expansion/pull/3559
- Fixed Ice Heal test name typo by @AtariDreams in https://github.com/rh-hideout/pokeemerald-expansion/pull/3676
📦 Pret merges 📦
- 2023-10-02 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3372
- Slight RTC documentation + Evolution times constants (https://github.com/pret/pokeemerald/pull/1925)
- Add friendship evo threshold constant (https://github.com/pret/pokeemerald/pull/1928)
- Solved a bunch of -Wall errors on modern (https://github.com/pret/pokeemerald/pull/1926)
- 2023-10-27 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3471
- Add some task/sprite data defines (https://github.com/pret/pokeemerald/pull/1915)
- Fix mini_printf encoded string -Werror=pointer-sign warning (https://github.com/pret/pokeemerald/pull/1938)
- Remove all trailing whitespace (https://github.com/pret/pokeemerald/pull/1937)
- Use BUGFIX in assembly files (https://github.com/pret/pokeemerald/pull/1935)
- 2023-12-10 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3675
- Delete the redundant files generated after running build (https://github.com/pret/pokeemerald/pull/1944)
- Rename
EGG_GROUP_UNDISCOVERED
egg group toEGG_GROUP_NO_EGGS_DISCOVERED
(https://github.com/pret/pokeemerald/pull/1939) - Renamed
SendMonToPC
toCopyMonToPC
(https://github.com/pret/pokeemerald/pull/1940) - Document
datahpupdate
(https://github.com/pret/pokeemerald/pull/1936) - Renamed
HITMARKER_IGNORE_SAFEGUARD
toHITMARKER_STATUS_ABILITY_EFFECT
(https://github.com/pret/pokeemerald/pull/1959) - Moved files (https://github.com/pret/pokeemerald/pull/1953)
- Spinda Spots
- JP Fonts
redyellowgreen_frame.bin
- [Build System Rewrite] Linkerscript now tracks RAM/ROM usage (https://github.com/pret/pokeemerald/pull/1952)
- Fixed ld_script.ld artifact from a previous pret version by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3731
- Updated the size of the
struct InGameTrade
'sotName
variable (https://github.com/pret/pokeemerald/pull/1962)
New Contributors
- @Petuuuhhh made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3387
- @katykat5099 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3426
- @leo60228 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3249
- @hedara90 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3527
- @jiangzhengwenjz made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3559
- @ravepossum made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3561
- @RapidNutcracker made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3379
- @GraionDilach made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3624
- @AtariDreams made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3676
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.6.2...expansion/1.7.0
Version 1.6.2
## 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.6.2`.
🌋 IMPORTANT CHANGES 🌋
Battle changes
- Battler Types are now obtained via
GetBattlerType
instead ofgBattleMons[battlerId].type1/2/3
to better consider Roost. Be sure to update your custom battle effects to account for this change.
🧬 General 🧬
Fixed
- Fixed Cheat Start not initiating time-based events by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3446
🐉 Pokémon 🐉
Changed
- Updated Cresselia's base stats to Gen 9 by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3419
- Updated Zacian/Zamazenta base stats to Gen 9 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3421
Fixed
- Fixed Kleavor, Hisuian Sneasel and Sneasler missing their SV abilities by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3391
- Fixed Bergmite/Avalugg old and updated egg groups being switched by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3380
🤹 Moves 🤹
Changed
- Quick Draw now uses weighted RNG by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3399
- Added
IS_BATTLER_TYPELESS
macro that checks if the specified battler has no valid type by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3303
Fixed
- Fixed Protect failing if the user flinched on the previous turn by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3345
- Fixed entry hazards not working properly being cleared on switch-in by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3316
- This includes Toxic Spikes not working if Pecha Berry actived on the previous turn.
- Fixed Roost overwriting other type changing at the end of the turn (Soak, Forest's Curse, Color Change, etc.) by @BLourenco in https://github.com/rh-hideout/pokeemerald-expansion/pull/3258
- Now it suppresses the user's Flying-type rather than remove and re-add it.
- Fixes Salt Cure visual bug if mon fainted by direct attack by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3388
- Fixed Purifying Salt not preventing the use of Rest by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3399
- Fixed Make it Rain lowering Sp. Attack twice if hitting 2 targets in double battles by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3441
- Fixed Reflect Type not properly handle 3rd types by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3303
- Fixed form change triggered by switching not occuring when using moves like U-Turn or Baton Pass by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3463
- Fixed Last Resort not counting Sleep Talk as used for its effect by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3378
🎭 Abilities 🎭
Changed
- Removed unused
STATUS3_CANT_SCORE_A_CRIT
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3377 - Moved Beads of Ruin and Sword of Ruin damage to the appropiate damage modifier functions by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3415
Fixed
- Fixed Intimidate increasing the attack of both opponents if one of them has Contrary in double battles by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3365
- Fixed Battle/Shell Armor not preventing critical hits by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3377
- Fixed Rivalry's effect being reversed by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3381
- Fixed Rivalry lowering attack if either attacker or target were genderless by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3381
- Fixed missing Poison Heal Ability Popup by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3385
- Fixed Parental Bond not working at all by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3417
- Fixed Beads of Ruin and Sword of Ruin damage modifiers by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3415
- Fixed Sheer Force not negating effects that benefit the user (eg. Flame Charge, Power-Up Punch) by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3378
- Fixed Strength Sap not healing the user when used on a Substitute by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3486
- Fixed Substitute showing the "took damage for" message if Strength Sap was used on it by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3486
- Fixed Weak Armor interrupting Multi Hit moves by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3497
🧶 Items 🧶
Fixed
- Fixed Shiny Charm doing too many rerolls by default by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3327
- Fixed Berserk Gene activating for the wrong Pokémon double battles by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3363
- Fixed Red Card not being consumed after opponent Sticky Web activation by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3364
- Fixed implementation of Gen6 that didn't allow for the Exp Share flag to be set via script without setting the item to the Gen 6+ version by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3384
- Fixed Kee Berry raising defense by 1 stage instead of 2 by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3409
- Fixed Kee Berry incorrect stat raise message by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3409
- Fixed Razor Fang not being able to be used directly even if
I_USE_EVO_HELD_ITEMS_FROM_BAG
was set toTRUE
by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3456
🧹 Cleanup 🧹
AbilityBattleEffects
usesB_MSG_TERRAIN
constants for field terrain intro text by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3410- Removed all trailing whitespace by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3472
🧪 Test Runner 🧪
Added
- Flinch tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3345
- Berserk Gene double battle tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3363
- More specific Toxic Spikes tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3316
- Red Card/Sticky Web test @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3364
- Intimidate/Contrary double battle test by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3365
- Critical Hit tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3377
- Roost tests by @BLourenco in https://github.com/rh-hideout/pokeemerald-expansion/pull/3258
- Rivalry tests by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3381
- Various tests by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3385
- Defeatist, Dragon's Maw, Earth Eater, Gale Wings, Poison Heal, Rocky Payload, Sap Sipper, Steelworker and Transistor.
- Various tests by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3399
- Beast Boost, Ice Scales, Neuroforce, Purifying Salt, Quick Draw and Sharpness.
- Berry tests @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3409
- Full: Apicot, Custap, Ganlon, Jaboca, Kee, Lansat, Liechi, Maranga, Micle, Petaya, Rowap and Salac Berries.
- TODO: Starf Berry.
- Weather and type-specific tests by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3260
- Full: Freezing, Hail, Moonlight, Morning Sun, Sandstorm, Snow, Solar Beam/Blade, Steel poisoning, Synthesis, Thunder and Weather Ball.
- Partial: Prankster, Safety Goggles, Aurora Veil, Hurricane, Leech Seed and OHKO moves.
- TODO: Harvest.
- Single Parental Bond test by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3417
- Several tests by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3378
- Full: Weak Armor, Last Resort, Stealth Rock.
- Completed Weak Armor tests by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3493
- Partial: Defiant, Sheer Force, White Herb, Strength Sap.
- Full: Weak Armor, Last Resort, Stealth Rock.
Changed
- Red Card tests now check if the item was consumed by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3364
- Tests now cannot use
i
in their cycles to avoid messing withPARAMETRIZE
by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3408 - Moved battle tests off the heap by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3414
- Moved Powder/Grass test to
move_flags
folder by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3260 - Continuous
NOT x; NOT y;
are now not allowed in tests due to them not acting as one would expect by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3459- Test writers should use
NONE_OF { x; y; }
instead.
- Test writers should use
Fixed
- Fixed CreateNPCTrainerPartyForTrainer test failing on modern by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3367
- Fixed
RNG_CRITICAL_HIT
by @mrgriffin and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3377 - Fixed
ASSUMPTIONS
block not working by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3368- Fixup by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3408
- Fixed Beads of Ruin and Sword of Ruin damage tests by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3415
- Fixes test RNG by @mrgriffin and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3433
- Fixed battle test estimateCost bug by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3448
- Test cleanup and improvements by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3449
- Removed duplicated Prankster TO_DO test.
- Corrected Multi-hit test names (4 and 5 hits stated 35% instead of 15%).
- Grouped Maranga Berry's Physical vs Special tests using PARAMETRIZE.
- Improved Jaboca, Kee and Rowap tests by @AlexOn1ine
- Fixed
ModifyPersonalityForNature
by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3452 - Fixed test_runner.c modern warning by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3451
New Contributors
- @BLourenco made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3258
Full Changelog
https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.6.1...expansion/1.6.2
Version 1.6.1
## 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.6.1`.
CRITICAL FIX, please update to avoid the issues detailed down below:
- Fixed deleting PC mon by placing another one on top with B by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3360
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.6.0...expansion/1.6.1
Version 1.6.0
## 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.6.0`.
Added
General
- Ported TheXaman's latest changes to the Debug Menu by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2815
- Arrows and ellipsis to mark submenus.
- Added 9th scrolling option to occupy the whole screen height.
- Combine Flags and Vars into one submenu.
- Moved Running Shoes flag to this menu.
- Added new window to flags/vars showing the current state and added submenu indicator.
- Colored toggle options for specific flags that change upon toggling.
- Added option to reset Pokédex flags to whatever is in the party and boxes.
- New "Fill PC/Item Pocket" submenu for filling both PC and Bag Pockets.
- Option to generate Box Mon with their own personalities/IVs.
- Moved "CHEAT Start" option to the Utility Submenu"
- Fixes:
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3223
- By @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3317
- Allow Cycling Through Balls in the Last Ball Used Menu by @voloved in https://github.com/rh-hideout/pokeemerald-expansion/pull/3039
- Tweaks by @voloved in https://github.com/rh-hideout/pokeemerald-expansion/pull/3254
- Implemented Ultra Burst by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3221
- Config for LGPE friendship stat boost by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2257
- Added a debug menu option to hatch eggs by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3155
- Option to run an AI vs AI battle by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3216
- With fixes by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3283
- Added missing Evolution data by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3287
- Crabrawler can now evolve into Crabominable with an Ice Stone as of SV.
- Nosepass can now evolve into Probopass with a Thunder Stone as of LA.
- Added Sliggoo's overworld fog evolution method by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3343
- Overworld snow weather now summons Snow or Hail based on a config by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3241
- Added unevolved Exp. multiplier by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3301
- Added config to support placing Pokémon in the PC when pressing the B button by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3329
- Added array shuffle implementation by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3097
- Fixes/improvements by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3128
Item Effects
- Added Generation 6 Exp. Share by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/3276
- Cleanup
- By @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3291
- By @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3339
- Cleanup
- Added Exp. Charm by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3301
- Added Gen 4+'s Enigma Berry's hold effect by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3300
- Added config for type-boosting held item power by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3326
Move Effects
- By @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2870
- Triple Arrows
- Infernal Parade
- Lunar Blessing
- Take Heart
- Axe Kick
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3147
- Spin Out
- Make It Rain
- Collision Course/Electro Drift
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3178
- Mortal Spin
- Population Bomb
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3297
- Gigaton Hammer
- Salt Cure
Move Animations
- By @Skeli789 and @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2861
- Spirit Break
- False Surrender
- Isle of Armor Moves
- Grassy Glide fix by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3092
- Crown Tundra Moves
- Legends: Arceus Moves
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3310
- Bitter Blade
- Double Shock by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3310
Graphics
- Added all remaining gender differences sprites by @SubzeroEclipse and @CyanSMP64 in:
- https://github.com/rh-hideout/pokeemerald-expansion/pull/3070
- https://github.com/rh-hideout/pokeemerald-expansion/pull/3082
- https://github.com/rh-hideout/pokeemerald-expansion/pull/3095
- https://github.com/rh-hideout/pokeemerald-expansion/pull/3122
- https://github.com/rh-hideout/pokeemerald-expansion/pull/3149
- Add new Substitute doll sprites by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3263
- Added icon for Clear Amulet by @PacFire in https://github.com/rh-hideout/pokeemerald-expansion/pull/3078
- Palette fixes by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3086
- Tera Shard icons by @AlexOn1ine @PacFire in https://github.com/rh-hideout/pokeemerald-expansion/pull/3307
- A selection of mon animation frames by @Tacobell24 and @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3090
- Applin, Stufful, Chewtle, Rookidee, Rolycoly, Grubbin, Turtonator, Wimpod, Jangmo-O, Pyukumuku, Dewpider, Pincurchin, Sizzlipede, Salandit families and Alolan Exeggutor.
- Multiple Graphical Tweaks by @SonikkuA-DatH in https://github.com/rh-hideout/pokeemerald-expansion/pull/3127
- Added 2nd frames to Castform, Spinda (with help by @shinydragonhunter) and Cherrim.
- Added Castform's Pokémon HOME shiny palettes.
- Adjusted Spheal's 2nd frame and restored vanilla Emerald's speen.
Changed
General
- Set GEN_LATEST to GEN_9 by default by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3186
- Make -fanalyzer optional by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3265
- Updated Big Nugget's Fling power to Gen 8+ by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3296
Graphical changes
- Adjusted Pokemon sprites and palettes - Part 1 by @CyanSMP64 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3235
- 0001 Bulbasaur to 0080 Slowbro
Refactors
- Inlined fixed Point Math by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3115
- Refactors battle damage modifier calculations to use the new functions in order to improve readability and performance.
- Fixes by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3125
- Refactored damage formula to match Gen5+ by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3196
- Gamefreak often times rounds down on n.5 in their fixed point mathematics.
- Fixed point arithmetic (multiplication) is not associative, this changes the order of operations to match the original games.
- A lot of the damage calculation function was quite messy, some aspects were factored in at the wrong place.
- The main damage calculation should now be clearer to read.
- Removed Vanilla trainer structs, converted trainer data to use the custom struct by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3114
- Removed the sTMHMMoves array and made TMs/HMs read moves from their secondaryId item field by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3243
- Converted move flags and bans into GCC bitfields by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2952
- Fixes by by @PCG06 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3229
- Added bitfields for moves that fail with Me First and Gravity.
- Inverted certain logic and flags, since there are more moves that are affected by them than not.
- Protect
- Mirror Move
- King's Rock
- Assist uses Copycat's flag + the 2 additional move effects banned by it.
EFFECT_SEMI_INVULNERABLE
EFFECT_SKY_DROP
- Made a separate config for move flag changes:
B_UPDATED_MOVE_FLAGS
. - Adds
IS_MOVE_RECOIL
to help recoil move checks. - Adds functions to account for the
flags
field being removed alongsideTestMoveFlags
andTestMoveFlagsInMoveset
. - Adds
sParentalBondBannedEffects
to streamline adding new moves. - Unified multi-strike move flags by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3126
- Some
gActiveBattler
fixes by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3259 - Got rid of the
gActiveBattler
variable by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3262 - Scale Shot now uses Multi-hit Moves' canceller by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3290
- Callnative functions now take ScriptContext arguments to allow using macros with .byte fields similar to vanilla battle script functions by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3294
- Converted some
VARIOUS
s tocallnative
s by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3269 - Refactored battle terrain text string tables and removed
EFFECT_REMOVE_TERRAIN
by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3247
Move animations
- New Wood Hammer animation by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3192
Battle AI
- Added AI delay timer by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3302
- Fixed
AI_WhoStrikesFirst
considering status priority moves when it shouldn't by @Joggel19 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3064 - Fixed Beat Up Gen5+ AI damage calculation by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3104
- Improved AI switching, so it doesn't get killed on switch-in by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3146
- Added missing absorbing abilities to
FindMonThatAbsorbsOpponentsMove
by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/3218 - Prevent certain status moves when item is known + Fake Out changes by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3219
- Improve AI switching with bad moves by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3213
- Fixed
CanTargetFaintAi
index issue by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3306 - Transform updates
AI_PARTY
data by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3295 - Greatly reduce AI lag by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3308
Cleanup
- Changed a lot of variables to
u32
in order to speed up processes and AI - Simplify/Clean battle controllers code by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3202
- Cleaned up remaining Castform hack code by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3063
- Cleaned experience gain logic by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3339
- Removed debug item effect override by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3106
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2952
- Removes unused
BattleScript_EffectStomp
andEFFECT_FLINCH_MINIMIZE_HIT
. - Removes unused
BattleScript_FlinchEffect
- Removes reduntant
EFFECT_TWISTER
which was a copy ofEFFECT_FLINCH_HIT
. - Fixes missing uses of
MOVE_UNAVAILABLE
inbattle_ai_util.c
. - Removed
sMovesNotAffectedByStench
in favor of checking for moves with Flinch chance. - Added
EFFECT_GEOMANCY
toIsTwoTurnsMove
.
- Removes unused
- Animation script cleanup and fixes by @AsparagusEduardo in:
- Reverted BattleMove power to u8 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3187
- Optimize sprite.c by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3175
- Removed unused itemId field by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3293
- Removed unused
EFFECT_UNUSED_125
by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3290 - Removed redundant side macros/funcs by @gruxor and @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3299
GET_BATTLER_SIDE
(replaced byGetBattlerSide
)GET_BATTLER_SIDE2
(replaced byGetBattlerSide
)GetBattlerPosition
(replaced by direct call togBattlerPositions
)
- Added missing return in
IsBattlerGrounded
by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3328 GetBattlerHoldEffect
usage optimizations by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3330
Fixed
Softlocks
- Disabled species now default their graphics to
SPECIES_NONE
, preventing softlocks when trying to load graphical data for disabled species by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3116 - Fixed debug menu memory overflow when reducing
PC_ITEMS_COUNT
to a value below 19 by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3154 - Fixed Ice Spinner logic causing a softlock by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3247
- Fixed "Daycare Egg" debug option generating invalid eggs when parents in the Daycare aren't compatible or are missing by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3335
General
- Fixed female Basculegion missing from the cry table by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/3242
- Fixed preproc config for Diamond Storm by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3052
- Fixed null dereferencing errors with -fanalyzer on modern by @gruxor in https://github.com/rh-hideout/pokeemerald-expansion/pull/3165
- Fixed "Fill PC" debug option giving all mon Bulbasaur's moves by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2815
- Fixed some Hisuian Pokémon abilities to Gen 9 data by @AaghatIsLive in https://github.com/rh-hideout/pokeemerald-expansion/pull/3292
Graphics
- Killed the bKGD invalid index warnings and fixed the bit depth of the species sprites by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3051
- Tweaks by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3205
- Fixed item sprites with palette errors by @gruxor in https://github.com/rh-hideout/pokeemerald-expansion/pull/3222
- Fixed Mega Venusaur icon to match regular Venusaur by @SubzeroEclipse in https://github.com/rh-hideout/pokeemerald-expansion/pull/3137
- Fixed Wailord icon sprite by @SubzeroEclipse in https://github.com/rh-hideout/pokeemerald-expansion/pull/3183
- Fixed overworld snow weather by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3241
Battle Mechanics
- General
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2952
- Fixed Stench/King's Rock interaction.
- Fixed Wandering Spirit skipping contact checks.
- Reset all battler IDs at battle start by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3111
- Fixed GetBattleAnimMoveTargets logic by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3278
- Fixed Magnet Rise animation moving the partner in double battles by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3280
- Fixed Status Z-Moves' effect descriptions being cut off by @gabrielcowley in https://github.com/rh-hideout/pokeemerald-expansion/pull/3286
- By @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3301
- Fixed traded Pokémon experience boost being applied twice.
- Fixed experience calculation inaccuracies.
- By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2952
- Move effects
- Fixed
ABILITYEFFECT_ON_TERRAIN
settinggBattlerAbility
incorrectly by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2796 - Fixed
TryChangeBattleTerrain
overwritinggBattlerAttacker
by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2796 - Fixed Teatime skipping non-player Pokémon by @hetoord in https://github.com/rh-hideout/pokeemerald-expansion/pull/3096
- Fixed Pursuit commands check its move ID instead of its effect ID by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3231
- Fixed Fling issues by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3191
- No longer consumes the item if user is fast asleep or paralyzed.
- When the user has no item, the "But it failed!" message no longer overwrites other messages like "X was fully paralyzed"
- Maranga and Kee Berries have their effects when being flung.
- Fixed Leppa Berry not recovering PP when being eaten by Bug Bite by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3282
- Fixed Seed Sower in Double Battles by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2796
- Fixed Seed Sower changing move targets when triggered in double battles by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3341
- Fixed Protect issues by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3321
- Recoil moves no longer cause recoil damage if the target protected
- Fixed Multi-hit moves being able to hit a protected target past the first hit.
- Fixed Multi-hit moves decreasing speed on each hit when the target uses Silk Trap.
- Fixed
- Ability effects
- Fixed potential bug with weather and terrain ABILITYEFFECT ids by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3083
- Fixed Battle bond not triggering when KOing an ally by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3279
- Fixed Toxic Debris issues that other effects to not trigger by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3306
- Fixed Toxic Debris not being able to set up 2 layers of Toxic Spikes by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3306
- Fixed Toxic Debris not triggering when user faints by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3323
- Item effects
- Fixed Metronome's damage multiplier by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3246
Test Runner
General
- Fixed tests breaking on modern by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3319
Tests added for:
- Move Effects
- By @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2870
- Axe Kick
- Infernal Parade
- Take Heart
- Triple Arrows
- Teatime by @hetoord in https://github.com/rh-hideout/pokeemerald-expansion/pull/3096
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3147
- Spin Out
- Make It Rain
- Collision Course/Electro Drift
- By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3178
- Mortal Spin
- Population Bomb
- Fling by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3191
- Leppa Berry interaction by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3282
- Bug Bite by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3282
- Multi-hit moves by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3290
- Protect by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3321
- Fixed Protect tests failing on
upcoming
by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3348
- Fixed Protect tests failing on
- By @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2870
- Item Effects
- Metronome by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3246
- Status-curing berries by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3289
- Gen 4+ Enigma Berry by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3300
- Fling/Bug Bite interaction by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3311
- Ability Effects
- Battle bond by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3279
- Toxic Debris by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3306
- Additional test by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3323
Pret merges:
- Pret merge (2023/08/31) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3268
- VAR_TEMP aliases
- TM and HM item constants by their move name without numbers.
- Stat change documentation.
- Factory Menu + Dome Tourney documentation.
- Berry Fix Documentation.
- Missing uses of
DISPLAY_WIDTH
andDISPLAY_HEIGHT
. - Static assertion for Battle Palace Flags.
- Static assertion for Rotating Gates.
- Automatic increase of
TEXT_BUFF_ARRAY_COUNT
andPOKEMON_NAME_BUFFER_SIZE
. - Proper
bravoTrainerTower
documentation. - Birth Island Rock documentation.
- 6 new bugfixes.
- Pret merge (2023/09/26) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3347
- Add include guards for assembly constants files
- Add
blockBoxRS
field toBoxPokemon
struct - Bugfix for abilities affecting wild encounter tables
- Fixes a potential buffer overread in
TryGetAbilityInfluencedWildMonIndex
. The bug can occur if an electric type mon is in the first slots of a fishing encounter table and the player carries a mon with theABILITY_STATIC
ability. This never happens in the vanilla codebase.
- Fixes a potential buffer overread in
- Add missing constant usage in
m4a_1
New Contributors
- @Joggel19 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3064
- @PacFire made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3078
- @CyanSMP64 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3149
- @PCG06 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3229
- @gabrielcowley made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3286
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.5.3...expansion/1.6.0
Version 1.5.3
## 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.5.3`.
CRITICAL FIX, please update to avoid the issues detailed down below:
- Fixed memory corruption when handling trigger sprites by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3238
- This had the posibility of manifesting in weird ways, like camera and music changes, NPC duplication and more. If you've had this issue in the past, we heavily recommend you update to this version of the expansion.
- Thank you @Bassoonian for helping us pinpointing the issue.
Fixed
Battle Mechanics
- General
- Fixed wild double battles with an in-game partner using
multi_fixed_wild
, by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3210 - Corrected conditionals used for
B_SPEED_BUFFING_RAPID_SPIN
andI_GEM_BOOST_POWER
by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3232 - Fixed being unable to use a Z-Move when a previous mon in the player's team Mega Evolved, by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/3233
- Fixed wild double battles with an in-game partner using
- Move effects
- Fixed Jump Kick's recoil happening before Spiky Shield's damage by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3208
Test Runner
Changed
- Organized tests into subfolders by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2822
Fixed
- Fixed certain tests failing when Inverse Battle battle flag was defined, by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3215
New Contributors
- @kittenchilly made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3233
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.5.2...expansion/1.5.3
Version 1.5.2
## 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.5.2`.
Changed
General
- Added config for Gem boost multiplier by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3144
Refactors
- Revamped GetTotalAccuracy by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3182
Fixed
Softlocks
- Fixed Z-Moves softlocking when their Z-Move effect failed to apply, by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3108
Graphics
- Fixed ability pop-up not properly clearing the previous text, by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3107
- Fixed wrong color in stat move animation by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3161
- Fixed copyright screen not showing up on certain emulators by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2664
Battle Mechanics
- General
- Primal Reversion
- Fixed it not activating when switching in after a fainting by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3141
- Fixed it not activating when switching in after Eject Button by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3141
- Fixed enemy parties not reverting to their original form post-battle by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3150
- Fixed OTGender not being set in
FillPartnerParty
, by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3163 - Fixed missing use of
CustomTrainerPartyAssignMoves
inFillPartnerParty
, by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3163 - Fixed trainer slide messages appearing for frontier trainers, by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3162
- Fixed
jumpifsideaffecting
potentially returning the wrong side by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3200 - Fixed Trainer class balls not being assigned past the first Pokémon by @SubzeroEclipse in https://github.com/rh-hideout/pokeemerald-expansion/pull/3203
- Primal Reversion
- Move effects
- Fixed Multi-Hit moves only hitting once and powder moves affecting Grass types when called via Metronome or Mirror Move, by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3135
- Fixed Teleport ending trainer battles, by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3166
- Ability effects
- Fixed multiple issues with Bad Dreams' ability pop-up, by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3131
- Fixed it activating even if there were no sleeping opponents.
- Fixed lag issue that caused it to not hide smoothly.
- Fixed it staying on screen if it fainted a target.
- Fixed Protosynthesis and Quark Drive boost amounts by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3139
- Fixed multiple issues with Primal Weather abilities by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3138
- Fixed printing "move missed" message for cancelled moves.
- Fixed 'move failed because of weather' printing twice if it were going to hit multiple targets (eg. Surf).
- Fixed 'move failed because of weather' printing if the mon was confused/paralyzed/asleep.
- Fixed 'move failed because of weather' printing when failing multiple times in a row.
- Fixed Sticky Web/Mirror Armor's interaction, by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3160
- Fixed multiple issues with Bad Dreams' ability pop-up, by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3131
- Item effects
- Fixed Gem boost only applying to the first hit of a Multi-Hit move by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3144
- Fixed Utility Umbrella damage calculations by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2835
- Fixed Ruin ability damage modifiers, by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3171
Battle AI
- Fixed Rollout's and Fury Cutter's AI power calculation by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3110
- Fixed how AI categorizes weak moves by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3109
- AI now gives priority to moves that always hit if the opponent's evasion increases or the AI's accuracy is reduced by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3109
Pret merges:
- 23-07-25 by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3176
- Remove unused macro to fix syntax highlights https://github.com/pret/pokeemerald/pull/1899
- Update msys2 instructions https://github.com/pret/pokeemerald/8ec0bff0342413ac4996b63382c8d03a3b532899
- Fix priortiy typos https://github.com/pret/pokeemerald/pull/1900
- Declarations for 2- and 3-argument GetMonData https://github.com/pret/pokeemerald/pull/1756
- Detect potential misalignment in modern https://github.com/pret/pokeemerald/pull/1901
Test Runner
Changed
- Failed tests are now listed in the total, by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3073
- Hydra now respects -jN by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3132
- Test runner test runner crashes are now detected by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3129
- Random functions that exclude elements based on conditions. Used by Metronome, multi-hit moves, and Loaded Dice by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3159
Fixed
- Fixed fixedPopup not being cleared while gTestRunnerHeadless is active, which caused some tests to fail on CI but not locally by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3133
Tests added for:
- General
- Primal Reversion, by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3141
- Rain weather, by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2835
- Sun weather, by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2835
- Ability Effects
- Bad Dreams, by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3131
- Tablets of Ruin by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3171
- Swords of Ruin by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3171
- Vessel of Ruin by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3171
- Beads of Ruin by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3171
- Primordial Sea by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3138
- Desolate Land by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3138
- Mirror Armor by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3160
- Move Effects
- Metronome, by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3135
- Mirror move, by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3135
- Hydro Steam, by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2835
- Sticky web by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3160
- Court Change by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3160
- Item Effects
- Utility Umbrella, by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2835
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.5.1...expansion/1.5.2
Version 1.5.1
## 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.5.1`.
Changed
General
- Easy Chat always shows words in uppercase by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3050
Fixed
General
- Fixed Hisuian mon not evolving by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3047
- Fixed regional forms not breeding correctly by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3047
- Fixed Sylveon's evolution method not requiring Friendship by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3048
- Fixed being able to sell TMs set as reusable by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3049
- Fixed shadows in Pokémon sprite viewer when toggling shininess by @gruxor in https://github.com/rh-hideout/pokeemerald-expansion/pull/3094
Softlocks
- Added safeguard for move animations to not create new sprites in case the maximum has been reached, which would lock the game by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3084
- Changed Mega indicator sprites from 3 per battler to 1 per battler by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3087
- Fixed the debug menu not removing list menu task, causing eventual softlock if used too many times, like when giving items/Pokémon by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3088
Graphics
- Fixed Ball shortcut graphics moving offsync by @voloved in https://github.com/rh-hideout/pokeemerald-expansion/pull/3042
Battle Mechanics
- General
- Fixed disobedience not resetting move effects, causing the opponent getting stat changes originally for the player by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3089
- Fix graphical/exp bugs with 2 vs 1 trainer battles by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3105
- Item effects
- Fixed Clear Amulet showing ability popup and message when nullifying stat reducing effects by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3074
Battle AI
- Fixed Baton Pass sending an invalid mon when Ace mon is the last one alive by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3067
- Fixed overflow when AI chooses a new Pokemon to send out by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/3068
Battle Tests
Added
- Test Runner support for illegal abilities by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/3045
- This should NOT be used for test PRs unless the ability to test isn't available on any Pokémon.
- Added tests for
- Items
- Air Balloon by @hetoord in https://github.com/rh-hideout/pokeemerald-expansion/pull/3071
- Clear Amulet by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3074
- Full ability tests for Scrappy, Own Tempo and Inner Focus by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3074
- Intimidate being blocked by Clear Body, Full Metal Body, Hyper Cutter and White Smoke by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3074
- Items
Changed
- Minor test changes by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3072
- Regularizes the whitespace.
- Removes unnecessary
;
s after}
s. - Parametrizes
item_effect_restore_hp.c
and usesI_HEALTH_RECOVERY
everywhere. - Inlines uses of macros where I think it makes the test easier to follow.
- Use 3-arg
PASSES_RANDOMLY
in the Snow + Blizzard test (improves performance). - More conservative
unlink
error reporting. Ctrl-C inmake check
should not complain about being unable to unlink ROMs which weren't created yet. - Better names for the ROMs in
/tmp
. - Prints the test runner number in Hydra, making it easier to track down bugs involving state leaking from a test to the following tests.
- Simplify
TO_DO_BATTLE_TEST
's implementation. - Introduce a
TearDownBattle
function which was repeated twice.
Fixed
- Marks test as invalid if there's more than one PASSES_RANDOMLY in a single test by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3065
- Fixed non-battle tests omitting errors when failing by @mrgriffin and @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3076
- Fixed non-battle tests showing false positive memory leak errors due to the test failing for a different cause by @mrgriffin and @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3076
- Fixed "Pastel Veil immediately cures Mold Breaker poison" test by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3074
Latest pret commit:
https://github.com/pret/pokeemerald/commit/9c4a59f865360b7d6e0dede0e52812b897526588
New Contributors
- @Pawkkie made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3068
- @voloved made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/3042
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.5.0...expansion/1.5.1
Version 1.5.0
## 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.5.0`.
Added
General
- Mega Evolution and Primal Reversion now play the Pokémon's cry in its animation by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2805
- Added Meltan and Melmetal teachable moves by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2732
- Added option to clear PC boxes in Debug menu @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2814
- Added missing Hisuian sprites and cries by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2725 and https://github.com/rh-hideout/pokeemerald-expansion/pull/2829
- Implement Customizable NPC Trainer Parties by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2733.
- Further fixes by
- Nickname, EVs, IVs, moves, species, held item, ability, level, ball, friendship, nature, gender and shininess can all be customized.
- IMPORTANT: In a future version, we'll remove vanilla Trainer structs, so make sure to port your custom trainers to this system before then.
- Overworld Poison configs by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2884
- Gen 3: Health gets depleted every couple of steps and can faint from it.
- Gen 4: Health gets depleted every couple of steps, but once it reaches 1 HP it disappears.
- Gen 5+: Health does not get depleted at all.
- Reusable TMs by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2903 and https://github.com/rh-hideout/pokeemerald-expansion/pull/2930
- TMs are automatically counted as reusable when their importance is set to 1.
- Added config to toggle vanilla TMs' importance to 1.
- Shops will only allow to buy a reusable TM if the player doesn't already have one.
- Added config for setting the max amount of EVs to Gen6+'s (252) by @citrusbolt in https://github.com/rh-hideout/pokeemerald-expansion/pull/2825
- Added config for Gen 4's berry EV-stat lowering behavior by @citrusbolt in https://github.com/rh-hideout/pokeemerald-expansion/pull/2825
- Added new conditions for the trainer slide-in system by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2713
- Added config for Gen 4's transformed Pokémon using the opponent's palette instead of its own by @Ultimate-Bob in https://github.com/rh-hideout/pokeemerald-expansion/pull/2852
- Breeding features by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2963
- Father TM Move inheritance (with config).
- Mother Egg Move inheritance (with config).
- Nature inheritance using an Everstone (with config).
- Ability inheritance (with config).
- Parent Egg Move transfer (with config).
- Power Item IV inheritance.
- Added Ability Patch's Gen 9 functionality by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/2989
- Added Gen 4-6 Pokemon back animations by @SonikkuA-DatH in https://github.com/rh-hideout/pokeemerald-expansion/pull/2954
Battle General
- Support for multi battles where Trainer has only one mon by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2670
- Added
B_RESTORE_HELD_BATTLE_ITEMS
that restore non-berry single-use items after a battle by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2932 - Added Frostbite status by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2942, with fix by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3019
- Added Snow Battle Weather by @CallmeEchoo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2970
- Added
B_DOUBLE_WILD_REQUIRE_2_MONS
config.- Allows to trigger a double wild battle when only having a single Pokémon alive by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/2878
Move Effects
- Added Healing Wish's Gen 5+/8+ mechanics with config by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2708
- Added Swallow/Spit Up's Gen 5+ mechanics with config by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2790
- Added Shell Trap's effect by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2716
- Added several Gen 9 Move effects:
- By @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2834
- Psyblade
- Hydro Steam
- By @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2534
- Stone Axe, with fix by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2969
- Ceaseless Edge, with fix by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2969
- Dire Claw
- Barb Barrage
- By @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/2883
- Revival Blessing, with fix by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/3010
- By @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2834
Item Effects
- Trade and Held Level up evolution items and can now be used to evolve the respective species by default like in Legends: Arceus by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3009
- Eg. Magmarizer can be used from the Bag to evolve Magmar into Magmortar.
- Item usages can be turned off via config.
- Added Legends: Arceus Evolution items by @AaghatIsLive in https://github.com/rh-hideout/pokeemerald-expansion/pull/2897
- Black Augurite
- Peat Block
- Linking Cord
- Existing no-item trade evolutions can now evolve by using this item from the bag.
- Added Gen IX item data by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2838
- Mirror Herb
- Effect by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2873
- Scroll of Darkness
- Scroll of Waters
- Adamant Crystal
- Lustrous Globe
- Griseous Core
- Big Bamboo Shoot
- Tiny Bamboo Shoot
- No current effect
- Auspicious Armor
- Booster Energy
- Gimmighoul Coin
- Leader's Crest
- Malicious Armor
- Tera Orb
- Tera Shards
- Mirror Herb
- Max Mushrooms by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/2902
- Berserk Gene by @CallmeEchoo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2893
Battle AI
- Added
AI_FLAG_OMNISCIENT
flag by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2872- It lets the AI know the entirety of the player's party.
Tests
- Automatic tests now have a summary to list the amount of tests passed, failed and more by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2722
- To avoid tests failing when disabling new species, tests now use Gen 1-3 Pokémon when possible. Otherwise, they use ASSUMEs if the required species is disabled by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2818
- Sped up tests by using structured RNG in
PASSES_RANDOMLY
by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2720- RandomElement for structured RNG by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2868, with fix by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/3013
- Detect memory leaks in tests by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2698
- Detect more invalid test cases by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2955
- Tests now have their own build directory by @mrgriffin https://github.com/rh-hideout/pokeemerald-expansion/pull/3002
- New
TESTING
define by @mrgriffin https://github.com/rh-hideout/pokeemerald-expansion/pull/3002
Changed
General
- Partially fix Dex size inconsistencies by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2799
- Debug menu's Cheat Start now sets the Cable Club's tutorial as complete. by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2802
- Debug menu to give items based on the respective max quantity by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2807
- Debug menu's "Fill PC" option now adds one of each Pokémon instead of filling the boxes with Deoxys @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2814
- Known Issue: All Pokémon have the same personality/gender/stats/moves as the first Bulbasaur generated.
- It sets the Dex flags for each Pokémon as well.
- Enables
FLAG_SYS_POKEMON_GET
.
- Debug menu's saveblock checks now use the proper max size of the saveblock instead of a hardcoded string value by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3017
- Disable Gen8+ Obedience Mechanics by default by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2980
Graphical changes
- Fixed Gen 2 Pokémon sprite palettes up to Ampharos included by @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2783
- New move animations are set as default by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2964
Refactors
- Battle Item Refactor by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/2902
- Divorces in-battle effects from out-of-battle ones, such that they use battle scripts, making it easier to test and add new effects.
- Further fixes by
- @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2918
- @CallmeEchoo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2916, https://github.com/rh-hideout/pokeemerald-expansion/pull/2931 and https://github.com/rh-hideout/pokeemerald-expansion/pull/2940
- @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/2915 and https://github.com/rh-hideout/pokeemerald-expansion/pull/3022
- Refactored most Battle Form changes into the form change tables by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2411
- This includes:
- Form changes upon fainting
- Form changes upon switching
- Form changes upon battle end.
- Mega Evolutions
- Primal Reversions
- Zacian/Zamazenta/Xerneas
- Burmy
- Zen Mode
- Power Construct
- Schooling
- Shields Down
- Forecast/Flower Gift, with fixes by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/2978
- This includes:
- Hydra improvements (for Battle Tests)
- Prints a summary of how many tests ran/passed.
- Makes the pokemerald-test.elf file depend on tools.
- Shows SKIP log line when ASSUMPTIONS fail.
- Prints any buffered output at exit.
- OSX support by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2975
- Explosion looping is now handled by moveend instead of looping itself by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2688
- Removed
zMovePower
field ingBattleMoves
in favor of a function. by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2794 - Removed
ITEM_HAS_EFFECT
, allowing for items in of any ID to have effects by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2840 - Move direct statStage boosts to use statbuffchange by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3000
Cleanup
- Removed unused single-frame front pics by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2793
- Removed duplicated code in
Cmd_pickup
by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2705 - Removed some unused Battle Test code.
- Removed unused script
BattleScript_TargetAbilityStatRaiseOnMoveEnd
by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2727 - Purged existing bKGD warnings from graphics by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2735
- Use proper symbol name styles for Jangmo-o family by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2739
- Removed trailing whitespaces by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2787
- Debug Menu's "Feature unavailable" messages now properly point to the corresponding config file @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2814
- Removed
assistPossibleMoves
fromBattleStruct
by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2816 - Fixed instances of gSideTimers not using side constants by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2867
- Fixed stat names not being properly capitalized by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2927
- Adds GetMovesArray in CanTargetFaintAi by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2936
- Add Thunder Cage case to trap anim IDs by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2941
- GetSideParty/GetBattlerParty by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2910
- Removed duplicate CanBePoisoned condition by @CallmeEchoo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2988
- Convert a few various to callnatives by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2465
- Changed 999999 in DebugAction_Give_MaxMoney to MAX_MONEY constant by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/3015
- Optimized battle gender checks by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3020
- Replace launchtemplate and launchtask in battle anims by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2640
Fixed
General
- Fixed Honey Gather in Battle Pyramid using an uninitialized
lvlDivBy10
value by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2705 - Fixed B_FLAG_NO_CATCHING not working despite flag being defined @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2814
- Fixed Budew evolution method by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/2928
- Fixed issue with Enamorus Therian cry define order that caused compile issue when Gen 7 and 8 species were disabled by @grunt-lucas in https://github.com/rh-hideout/pokeemerald-expansion/pull/2956
- Fixed Zacian/Zamazenta's Iron Head PP not being calculated properly by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2411
- Fixed ability select in Debug Menu's "Give mon" option by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2999
- Fixed Esper Wing's accuracy if
B_UPDATED_MOVE_DATA
is set to Gen 9 by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/3004 - Fixed Hisuian Sneasel not having a way to evolve by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/3009
- Fixed Throat Spray's description by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3027
Graphics
- Fixed Debug menu displaying 3-digit map numbers incorrectly by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2807
- Properly aligned Pokémon icons up to gen V by @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2879
- Fixed multiple Pokémon sprites by @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2926
- Fixed form change animation properly loading the respective Pokémon palettes by @Ultimate-Bob in https://github.com/rh-hideout/pokeemerald-expansion/pull/2852
- Fixed Illumise's pallete causing issues in PC boxes by @AaghatIsLive in https://github.com/rh-hideout/pokeemerald-expansion/pull/2995
- Fixed for wrong mon positions for scripted wild double battles by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2996
- Fixed shiny animation not respecting Illusion mon target by @Ultimate-Bob in https://github.com/rh-hideout/pokeemerald-expansion/pull/2985
Battle Mechanics
- General
- Fixed Trainer slide-in not working properly on doubles by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2699
- Z-moves now properly bypass protection while doing 25% of the original damage by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/2730
- Fixed Mega Evolution and Primal Reversion healthbox icons not hiding when they're supposed to by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2805, with further fix by @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2898
- Fixed potential issues with confusion checks by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/2855
- Fixed an oversight that caused consecutive battles double battles by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2894
- Fixed status Z-Moves overwriting damage-dealing Z-Moves by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2937
- Fixed Battle Vars and Flags not resetting after the player whites out by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/2875
- Fixed mons not disobeying with Gen8 mechanics disabled by @SubzeroEclipse in https://github.com/rh-hideout/pokeemerald-expansion/pull/2990
- Fixed turn order issues by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2810
- Mega Evolution not being based on turn order.
- Focus Punch/Beak Blast/Shell Trap messages not being based on turn order.
- Fixed Beak Blast's burn not showing up by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2810
- Move effects
- Fixed Dragon Tail not activating Red Card if the target didn't switch by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2707
- Fixed Dragon Tail printing "But it failed!" if the target didn't switch by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2707
- Fixed Roar being not implemented with rejection sampling by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2707
- Fixed Mind Blown always fainting the user by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2688
- Fixed Defog showing improper battle strings by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2737
- Fixed Knock Off removing Choice Item restriction when the target has Gorilla Tactics as an ability by @CallmeEchoo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2854
- Fixed Ominous Wind's targeting by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2896
- Added missing forbidden Metronome move flags to LA and SV moves by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/2949
- Fixed Anger Shell activating when fainted by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2945
- Fixed Burn Up/Double Shock being affected by the user's ability by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2962
- Fixed Burn Up/Double Shock not removing their respective types if the target fainted by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2962
- Fixed Triple Dive's effect by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2947
- Ability effects
- Fixed Volt Absorb stopping damage to other Pokémon from Explosion under the effect of Galvanize by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2688
- Fixed Intimidate's ability pop up showing the incorrect name by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2712
- Fixed switch-in abilities activating on an empty field by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2712
- Partially fixed Supreme Overlord's effect by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2809
- Fixed Intimidate targetting dead sides and false postpones by @May8th1995 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2850
- Fixed switch-in abilities activating on terrain change by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/2881
- Fixed Leaf Guard not preventing Rest by @ShaeTsuPog in https://github.com/rh-hideout/pokeemerald-expansion/pull/2957
- Fixed Plus/Minus working with all damage-dealing moves instead of only pecial moves by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2974
- Fixed Impostor's Popup showing the target's ability instead of Impostor by @Ultimate-Bob in https://github.com/rh-hideout/pokeemerald-expansion/pull/2985
- Fixed Illusion's working when it shouldn't if the Pokémon with it is the last one in the party by @Ultimate-Bob in https://github.com/rh-hideout/pokeemerald-expansion/pull/2985
- Fixed Mimikyu's Disguise not breaking by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3025
- Item effects
- Fixed Eject Button interaction that forced incoming Pokémon with Intimidate to attack by @May8th1995 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2846
- Fixed erroneous uses of non e-reader Enigma Berries by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2839
Battle Animations
- Fixed potential Ability Popup tile corruption due to missing Word-alignment by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2812
- Fixed
GetBattleAnimMoveTargets
getting the wrong indices when the attacker is not the player by @ghoulslash in https://github.com/rh-hideout/ - Fixed Ability Popup not disappearing when called by Wandering Spirit by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2920pokeemerald-expansion/pull/2848
- Added missing config to enable NEW_ROCKS_PARTICLE by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/2929
- Fixed healthboxes reappearing in the Battle Tower by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2849
- Fixes Speed Boost animation by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3033
Battle AI
- Fixed AI switching to an invalid party slot from Volt Switch/Roar when using the Ace Pokémon flag by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2660
- Fixed AI not knowing how to handle Illusion by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2726
- Initially treats the initial Illusion species as the real species.
- If the type effectiveness doesn't match what it expects, or it uses a move that it cannot learn, the AI realises this and updates its data accordingly.
- Fixed AI damage calculation incorrectly when it has Protean/Libero by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2714
- Fix CalcMoveBasePower using battler addresses, which messed with AI calculations by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2858
- Fixed Comatose AI checks by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2866
- Fixed AI not considering Hidden Abilities in its team during switching logic by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2908
- Fixed Z-Move and Triple Kick/Axel damage calculation by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2983
Pret merges
- Kept you waiting, huh? (pret sync 2023/03/03) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2801
- Palms are sweaty, arms are heavy, mom's spaghetti (pret merge 2023/03/19) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2841
- I get knocked down, but I get up again (pret merge 2023/04/13) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2907
- Pret merge Friday by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2998
- One point five baby by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3044
New Contributors
- @CallmeEchoo made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2854
- @pkmnsnfrn made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2878
- @AaghatIsLive made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2897
- @fdeblasio made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2928
- @citrusbolt made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2825
- @grunt-lucas made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2956
- @Ultimate-Bob made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2852
- @ShaeTsuPog made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2957
- @SubzeroEclipse made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2990
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.4.3...expansion/1.5.0
Version 1.4.3
## 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.4.3`.
Changed
Cleanup
- Fixed instances of gSideTimers not using side constants by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2867
Fixed
General
- Fixed the Overworld debug menu not giving using the appropiate max item quantities by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2807
- Fixed the Overworld debug menu map number display not correctly showing 3 digits by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2807
- Fixed Budew's evolution method by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/2928
Battle Mechanics
- General
- Fixed CanBeConfused not properly checking the battlerId passed into it by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/2855
- Move effects
- Fixed Knocked-Off Choice items resetting the choiced move despite the holder having Gorilla Tactics by @CallmeEchoo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2854
- Fixes Ominous Wind targeting by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2896
- Item effects
- Fixed erroneous uses of non e-reader Enigma Berries by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2839
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.4.2...expansion/1.4.3
Version 1.4.2
## 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.4.2`.
Fixed
General
- Fixed overworld_config.h reference in the overworld debug by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2811
Battle Mechanics
- General
- Fixed long z-move names not showing properly on the battle textbox by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2789
- Move effects
- Fixes certain moves preventing Z status moves. by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2791
- Fixed Wring Out's power by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2824
- Ability effects
- Fixed wrong Contrary message when affected by Intimidate by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2723
Battle AI
- Fixed uninitialized modifier variable in AI calc damage by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2731
- Fixed AI mon getting lower score when it is faster by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2740
- Fixed status moves being considered for type effectiveness calculations by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2743
- Fixed AI not considering Nature Power in AI_CalcDamage by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2776
- Fixed Electrify check, as it workss on all move types, not just Normal by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2817
- Fixed score for Work up and Growth by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2813
- Fixed speed check on Electrify by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2819
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.4.1...expansion/1.4.2
Version 1.4.1
## 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.4.1`.
CRITICAL FIX, please update to avoid the issues detailed down below:
- Fixed electricity move animations causing softlocks with weird graphical results by @DizzyEggg in #2785
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.4.0...expansion/1.4.1
Version 1.4.0
## 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.4.0`.
Added
General
- Battle Auto-Tests by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2564
- Details of how they work and how to build them in
test\test_battle.h
. - Add some tests for gen1-3 abilities by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2626
- Details of how they work and how to build them in
- Implemented Xhyzi's RHH copyright intro by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2415
- There's a config to disable it, but we encourage keeping it :)
- Fixes by @SBird1337 and @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2665, https://github.com/rh-hideout/pokeemerald-expansion/pull/2687 and https://github.com/rh-hideout/pokeemerald-expansion/pull/2684
- Config to restore Gen 3's damage reduction to multi target moves by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2542
- Config to disable incense baby mechanic as of Gen 9 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2531
- Config for PLA+ obedience mechanics by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2569
- Config for ball inheritence when breeding by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2566
- Config to have Shuckle make Berry Juice from Oran Berries by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2331
- Support for dynamic number of targets in move animations by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2649
Moves
- Generation IX Moves
- Base move data by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2467
- New moves with existing effects:
- Lumina Crash, Jet Punch, Ice Spinner, Triple Dive, Kowtow Cleave, Flower Trick, Torch Song, Aqua Step, Ruination, Pounce, Trailblaze, Chilling Water, Hyper Drill, Twin Beam, Armor Cannon, Bitter Blade, Comeuppance, Aqua Cutter, Blazing Torque, Noxious Torque, Combat Torque, Magical Torque
- New move effects:
- Wicked Torque (
EFFECT_SLEEP_HIT
) - Double Shock (
EFFECT_DOUBLE_SHOCK
) - Silk Trap (uses
EFFECT_PROTECT
but the condition to check the move in specific) by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2512 and https://github.com/rh-hideout/pokeemerald-expansion/pull/2610
- Wicked Torque (
- Missing move effects:
- Tera Blast, Axe Kick, Last Respects, Order Up, Spicy Extract, Spin Out, Population Bomb, Glaive Rush, Revival Blessing, Salt Cure, Mortal Spin, Doodle, Fillet Away, Raging Bull, Make It Rain, Collision Course, Electro Drift, Shed Tail, Chilly Reception, Tidy Up, Snowscape, Rage Fist, Gigaton Hammer
- Updated Gen 1-8 move effects to Gen 9 standards: by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2467
- LA moves with existing effects
- Psyshield Bash, Raging Fury, Wave Crash, Chloroblast, Mountain Gale, Headlong Rush, Esper Wing, Shelter, Bitter Malice, Power Shift, Springtide Storm, Bleakwind Storm, Wildbolt Storm, Sandsear Storm
- LA moves with new move effects
- Mystical Power (
EFFECT_SPECIAL_ATTACK_UP_HIT
) - Victory Dance (
EFFECT_VICTORY_DANCE
)
- Mystical Power (
- PP adjustments.
- (5 -> 10) Bleakwind Storm, Wildbolt Storm, Sandsear Storm
- (10 -> 5) Recover, Soft-Boiled, Rest, Milk Drink, Slack Off, Roost, Shore Up
- Power adjustments
- (50 -> 90) Triple Arrows
- (90 -> 120) Raging Fury
- (120 -> 150) Wave Crash
- (60 -> 80) Dire Claw
- (100 -> 120) Headlong Rush
- (60 -> 75) Bitter Malice
- (75 -> 80) Esper Wing
- (95 -> 100) Springtide Storm, Bleakwind Storm, Wildbolt Storm, Sandsear Storm
- (80 -> 75) Wicked Blow
- (70 -> 60) Grassy Glide
- (130 -> 120) Glacial Lance
- LA moves with existing effects
- Implementing Teatime effect by @SonikkuA-DatH in https://github.com/rh-hideout/pokeemerald-expansion/pull/1956
- Config for Gen 4's Roost pure-Flying behavior (
B_ROOST_PURE_FLYING
) by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2530 - Config for Gen 8 Howl's effect by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2700
- AI check by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2703
Abilities
- Generation IX Abilities
- 28 of 31 abilities implemented by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2470
- Lingering Aroma, Seed Sower, Thermal Exchange, Anger Shell, Purifying Salt, Well-Baked Body, Wind Rider, Rocky Payload, Wind Power, Electromorphosis, Protosynthesis, Quark Drive, Good as Gold, Vessel of Ruin, Sword of Ruin, Tablets of Ruin, Beads of Ruin, Orichalcum Pulse, Hadron Engine, Cud Chew, Sharpness, Supreme Overlord, Costar, Toxic Debris, Armor Tail, Earth Eater, Guard Dog and Mycelium Might
- Not implemented yet:
- Commander
- Opportunist
- Zero to Hero
- 28 of 31 abilities implemented by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2470
- Implemented Ice Face by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2255
Items
- Generation IX Item Effects by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2471
- Ability Shield, Clear Amulet, Punching Glove, Covert Cloak and Loaded Dice
- Gen 9 item data except icons by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2595
- Added Destiny Knot's breeding functionality by @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2616
- Allow Lv100 Pokémon to access level based evos via Rare Candy by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2460
Changed
Graphical changes
- Remove usage of Sugimori Palettes for Pokémon sprites by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2318
- NOTICE: These will be tweaked over time, due to the PR not utilizing official palettes. Generation 1 Pokémon have already been fixed by @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2593
Refactors
- Readable BattleScript command arguments by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2529
- Add callnative battle script functions, as a way to convert the various macro to proper commands by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2464
- Converted Metal Burst damage calculation command by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2464
- Removed
SPECIES_FLAG_SHINY_LOCKED
in favor of actual flags to control when to generate Shiny/Non-Shiny mon (P_FLAG_FORCE_SHINY
andP_FLAG_FORCE_NO_SHINY
) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2453 - Optimized Intimidate's code by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2452
- Cleaned redundant
ENDTURN_PLASMA_FISTS
loop by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2520 - Refactor sInverseTypeEffectivenessTable to implicit lookup by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2528
- Reshape sBattlePointAwards to be easier to read by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2551
- Adjusted AnimTask_PrimalReversion layout by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2446
- Rolled
EFFECT_SCALD
intoEFFECT_BURN_HIT
with a config for its Gen6+ change by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2326 - Refactored incense baby checks into table by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2531
- Red Card and Eject Button effects check for
EFFECT_HIT_SWITCH_TARGET
instead of Dragon Tail and Circle Throw specifically by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2439
Cleanup
- Moved config files to their own folder (
include/constants/x_config.h → include/config/x.h
) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2453 - Fixed reference in INSTALL.md to pret's repo instead of the expansion's by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2468
- Reorganized SpecialStatus struct to minimize padding. by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2511
- Using decimal numbers for constants/battle.h by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2513
- Updated SIDE constant usages by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2518
- Removed repeated stat change defines by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2524
- Cleanup HandleTerrainMove by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2527
- Removed unread third
roostTypes
element by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2530 - Renamed
CheckFocusPunch_ClearVarsBeforeTurnStarts
toCheckChosenMoveForEffectsBeforeTurnStarts
because that function doesn't just check for Focus Punch anymore, and it doesn't clear any variables either. by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2544 - Removed pointless timers from disable struct by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2647
- Fixed
SpeciesInfo
(BaseStats
) struct offset labels by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2666
Other
- Overworld Debug Menu now sets
FLAG_SYS_POKEMON_GET
giving yourself a Pokémon by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/2475 - Allow exiting the Battle Debug menu pressing B by @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2598
Fixed
Softlocks
- Fix Beat Up's battle script to avoid an out-of-bounds array access by @sphericalice in https://github.com/rh-hideout/pokeemerald-expansion/pull/2541
Graphics
- Fix Bastiodon's second icon frame by @cynderquil in https://github.com/rh-hideout/pokeemerald-expansion/pull/1589
- Fixed Eggs sometimes reading garbage graphic data by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2539
- Fix Transform's interaction with gender differences by @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2618
- Fix buggy Pokémon animations with Illusion by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2639
- Fixed potential graphical issues when calling
BattleScript_TrainerSlideMsgRet
by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2466 - Fixed ability popup not showing all characters of Pokémon with full names by @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2586
Battle Mechanics
- General
- Fixed potential error in
TryChangeBattleTerrain
by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2469 - Fixed Ball throw handling in double wild battles by @walkingeyerobot in https://github.com/rh-hideout/pokeemerald-expansion/pull/2587
- Fixed 1v2 battles with eggs by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2658
- Fixed potential error in
- Z-Moves
- Fixed Z-Moves being usable if the base move was out of PP by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2418
- Fixed switching Z-Moves when pressing SELECT in battle by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2677
- Z-Move Indicator was wrongly displayed in double battles by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2678
- Fixed UI PP colors for Z moves by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2690
- Move effects
- Fixed Speed Swap's effect by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2517
- Fixed Shell Trap being affected by Encore by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2544
- Fixed potential bug for moves that use
MOVE_EFFECT_FEINT
by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2516 - Fixed Beak Blast potentially not assigning its state to the proper battler by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2544
- Fixed Psycho Shift not buffering the string index for its printfromtable call by @TeamAquasHideout in https://github.com/rh-hideout/pokeemerald-expansion/pull/2588
- Fixed Flame Burst hitting semi-invulnerable partner by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2601
- Fixed Wood Hammer doing 1/4th recoil damage instead of 1/3rd by @TeamAquasHideout in https://github.com/rh-hideout/pokeemerald-expansion/pull/2603
- Fixed U-turn not switching out the user if the target's Emergendy Exit activates by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2605
- Fixed Encore not failing if the target hasn't moved yet in that turn by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2605
- Fixed Fling's berry check working backwards by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2607
- Fixed Jaw Lock's effect not leaving upon the user being KO'd by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2681
- Fixed Round's power calculation only taking the partner into account by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2602
- Fixed subsequent Round users not executing their move directly after the first user by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2602
- Fixed Follow Me working in singles by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2644
- Fixed Clanging Scales target and effect by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2691
- Fixed After You's effect being overritten by Gen 8+'s move action recalculation by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2646
- Fixes Heal Block only targeting a single battler by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2649
- Fixed Venom Drench not taking target positions into account by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2649
- Ability effects
- Ability Pop-ups
- Fixed Insomnia not having an ability pop-up by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2643
- Fixed Shields Down Ability pop-up by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2692
- Fixed Pokémon with Clear Body-like abilities being immune to self-inflicted stat reductions (ie. Superpower, Shell Smash) by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2548
- Fixed Mimicry's implementation by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2473
- Fixed Intimidate activating after Explosion when it shouldn't by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2579
- Fixed Poison Point activating only if the Pokémon with Poison Point could be poisoned by the attacker by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2605
- Fixed Pastel Veil not granting Poison immunity @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/2605
- Fix Volt Absorb not activating with Thunder Wave by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2635
- Fixed Damp not showing ability pop-up when reacting with Aftermath by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2645
- Fixed Mirror Armor's effect against Clear Body by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2680
- Fixed Battle Bond activating multiple times in battle by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2689
- Fixed Grass-typed Pokémon being affected by powder moves reflected by Magic Bounce by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2633
- Ability Pop-ups
- Item effects
- Fixed a
HOLD_EFFECT_ZOOM_LENS
check that caused every move's attack to be increased by the hold effect parameter by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2557 - Fixed Flame Orb/Toxic Orb/Sticky Barb triggering when the holder is fainted by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2585
- Fixed a
Move Animations
- Fixed Poison Gas animation for
MOVE_TARGET_BOTH
by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2608 - Fixed Strange Steam's animation by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2642
- Fix Spacial Rend animation by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2671
- Fixed Fiery Wrath's animation by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2649
- Fixed Electroweb's animation by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2649
Battle AI
- Fix Helping Hand AI by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2533
- Rewritten AI entry hazard checks to fix multiple issues by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2106
- Fixed Stealth Rock's AI check ignoring type effectiveness.
- Fixed Stealth Rock's AI check assuming that Levitate bypasses it.
- Fixed spike AI check that Stealth Rock may overlap.
- Fixed spike AI check ignoring the amount of spikes some spike immunities.
- Fixed AI not accounting for Stealth Rock and Spikes overlapping.
- Fixed missic AI logic for Heal Pulse effects in double battles by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2662
- Fixes Pollen Puff AI issue #2611 by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/2648
Other
- Fixed cry table alignment that caused species from
SPECIES_KYUREM_WHITE
onward to play the wrong cries by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2462 - Fixed right Frontier move tutor not loading their move list correctly. by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2525
- Fixed reusable repels/lures function forcefully using items while menu config is on by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2561
- Fixed Exp Candy S using the XS description by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2572
- Fixed
B_DOUBLE_WILD_CHANCE
becoming 1% less than what's set by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2526
Pret merges
- Gen 9 when? (Pret sync 2022/11/24) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2456
- I'll make your face the greatest in Hoenn! Or else you will DIE. (Pret merge 2022/12/16) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2519
- For me, it was tuesday. (pret merge 2023/01/03) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2559
- | || || |_ (pret merge 2023/01/20) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2583
- I like shorts, they're comfy and easy to wear! (pret merge 2023/01/25) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2597
- It's ya boi, pret merge! (pret merge 2023/02/16) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2697
New Contributors
- @cynderquil made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/1589
- @Bassoonian made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2467
- @mrgriffin made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2527
- @TeamAquasHideout made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2588
- @walkingeyerobot made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2587
- @AlexOn1ine made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2642
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.3.0...expansion/1.4.0
Version 1.3.0
## 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.3.0`.
Added
- Added class-based Poké Balls for trainers by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2385
- Config for running indoors by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2388
- Implemented Lures and Repel/Lure "use another" menu by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2319
- Implemented Honey's Sweet Scent functionality by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2391
- Implemented Parental Bond by @BuffelSaft in https://github.com/rh-hideout/pokeemerald-expansion/pull/1676
- Implemented Beat Up Gen 5+ effect with config. by @BuffelSaft in https://github.com/rh-hideout/pokeemerald-expansion/pull/1676
- Config for Dark Void being only usable by Darkrai by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2428
Changed
- Improved Psycho Cut animation by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2390
- Multi-hit logic refactor. by @BuffelSaft in https://github.com/rh-hideout/pokeemerald-expansion/pull/1676
- Ported Gen 5 & 6 mon animations from Inclement Emerald + added most missing Gen 7 form animations by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/1927
- Restored GF Header. by @tustin2121 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2426
Fixed
- Bug where badge boosts apply in all gens except gen 3. by @May8th1995 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2383
- AI issue giving decrementing score to confuse hit instead of confuse by @May8th1995 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2384
- Z-Move not being cleared if Pokémon faints by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2389
- Integrated VBlank wait loop fix by @gruxor in https://github.com/rh-hideout/pokeemerald-expansion/pull/2392
- Fling only working with items with Fling Power equal to 0. by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2408
- Softlock when teaching a TM/HM after learning a move by level up. by @kaisermg5 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2413
- Battle Palace AI bug that caused multiple issues. by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2416
- Abilities that raise target's stat after hit showing the wrong message. by @BuffelSaft in https://github.com/rh-hideout/pokeemerald-expansion/pull/2427
- Fixed Bad Dream's ability popup message by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2430
- Opponent's Teleport ending Trainer Battle if it only has one Pokémon. by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2420
- Fixed Bug Bite deleting the user's item. by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2433, with cleanup by @eatthepear in https://github.com/rh-hideout/pokeemerald-expansion/pull/2451
Pret merges
- Support for Porymap 5.0.0 (up to 9e24fe6ec8f23d042ba2b0fb2dd687ab82989c44 2022-11-08) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2422
Cleanup
- Uncommented evolution moves for each species by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2386
- Uncommented Hisuian Pokémon level up moves by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2449
- Removed worthless DEBUG_FLAG_PC_FROM_DEBUG_MENU config by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2423
- Actually removed ItemId_GetId by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2424
- Optimized Bad Dreams' code by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2434
New Contributors
- @May8th1995 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2383
- @kaisermg5 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2413
- @tustin2121 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2426
- @eatthepear made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2451
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.2.0...expansion/1.3.0
Version 1.2.0
## 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.2.0`.
Added
- AI remembers Party mons - by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2230
- Takes in consideration overwritten abilities - by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2355
- ABILITY_SYMBIOSIS - by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/2117
- Teleport's modern in-battle effect, with config - by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2121
- "Access PC" option in debug menu now gives full access to both Item and Pokémon Storage - by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2356
- Battle Arena's move Mind ratings now expands to all moves - by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2339 and https://github.com/rh-hideout/pokeemerald-expansion/pull/2365
- 4 new species flags - by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2293
SPECIES_FLAG_ALL_PERFECT_IVS
SPECIES_FLAG_SHINY_LOCKED
SPECIES_FLAG_CANNOT_BE_TRADED
SPECIES_FLAG_MEGA_EVOLUTION
- Config for Battle text pause times - by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2380
Changed
- Updated move types now have their own separate config from
B_UPDATED_MOVE_DATA
- by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2361 - Mew now has special handling for it's Teachable moveset by @AsparagusEduardo (it learns all moves minus certain exceptions) - in https://github.com/rh-hideout/pokeemerald-expansion/pull/2367
- Changed ballMultiplier to account for future Hisuian ball multipliers - by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2376
P_NEW_POKEMON
is now split by Generation - by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2283HasAllMons
now accounts for all mon except mythicals.
Fixed
- Natural Cure, Shed Skin and Early Bird check in ShouldSwitchIfGameStatePrompt - by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2336
- Multi-fixed-wild partner not calculating damage - by @StubbornOne in https://github.com/rh-hideout/pokeemerald-expansion/pull/2343
- Z-Power Ring check - by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2349
- Crash during Light That Burns The Sky's animation - by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2350
- Z-Moves not showing the correct type in battle if it's different from the base move's type - by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2353
- Returning to the overworld after using the "Access PC" option in the debug menu makes option descriptions remain open - by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2356
- Pokémon Debug isn't loading female icon palettes correctly - by @TheXaman in https://github.com/rh-hideout/pokeemerald-expansion/pull/2360
- Multi battle interface displays incorrectly - by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2335
- Multi battle party menu displays incorrectly - by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2335
- AI doesn't track abilites when Traced - by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2364
- Berserk doesn't activate if the mon falls to exactly half HP - by @StephenLynx in https://github.com/rh-hideout/pokeemerald-expansion/pull/2370
- Triple Kick and Triple Axel doing too much damage - by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2141
- Mega Evolved Pokémon are able to get Friendship effects in battle - by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2262
Cleanup
- Fixed typo in BoxMonKnowsMove - by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2338
- Renamed mislabeled labels in src/debug.c - by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2337 and https://github.com/rh-hideout/pokeemerald-expansion/pull/2340
- Removed references to
ITEM_EXPANSION
after #2177 - by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2293
Pret merges
- Up to 1ae5010233a07bbd4fbe80a340019e04215afb71 - by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2359
- Up to bb2e64b3fc20f713356fb68326175871c8996331 - by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2379
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.1.1...expansion/1.2.0
Added
- Option to change the weather from the Overworld Debug Menu by @TheXaman in https://github.com/rh-hideout/pokeemerald-expansion/pull/2315
- Corner case logic for AI Switching. by @Porygon23 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2226
- Exp Candies now show the amount of experience gained by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2282
- Config to limit the moves called by Metronome (by generation) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2327
Changed
- Changed Lure prices to the same standards as the default Repels by @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2309
- Debug menu:
- The changeable flags now start at 1 (0 isnt a flag) by @TheXaman in https://github.com/rh-hideout/pokeemerald-expansion/pull/2315
- Object events now get frozen while the menu is open to avoid potential nasty effects by @TheXaman in https://github.com/rh-hideout/pokeemerald-expansion/pull/2315
- Automated creation of MAP_GROUP_COUNT for the debug menu by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2307
- Generating music names for the debug menu based on their labels by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2306
Fixed
- Ability pop ups not appearing at all by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2314
- Dauntless Shield's and Intrepid Sword's effects only triggering for mon on the left in double battle, even if the mon with the abilities are on the right by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2313
- Flickering when switching menus in the Overworld Debug Menu @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2315
- Missing uses of Fairy type for Union Room and Battle Factory by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2310
- Tutors changing the level of the taught Pokémon to the level that the last mon that used a Exp Candy reached by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2282
- Exp candies giving the wrong amount of experience by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2282
- Exp Candy XL breaking experience points by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2282
- Ai check for switching when the target is semi invulnerable by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2324
Pret merges
- Up to (c1dfd3c9eca7d9dd73ac7dbaff0444d965758f4c) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2308
Cleanup
- Tidying graphics - Super Ancient Pokémon special weather by @Blackforest92 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2303
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.1.0...expansion/1.2.0
Version 1.1.1
## 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.1.1`.
What's Changed
- Fixed battles breaking when ACE_POKEMON_FUNCTIONALITY was not set by @Porygon23 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2334
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.1.0...expansion/1.1.1
Version 1.1.0
## 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.1.0`.
Added
- Option to change the weather from the Overworld Debug Menu by @TheXaman in https://github.com/rh-hideout/pokeemerald-expansion/pull/2315
- Corner case logic for AI Switching. by @Porygon23 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2226
- Exp Candies now show the amount of experience gained by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2282
- Config to limit the moves called by Metronome (by generation) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2327
Changed
- Changed Lure prices to the same standards as the default Repels by @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2309
- Debug menu:
- The changeable flags now start at 1 (0 isnt a flag) by @TheXaman in https://github.com/rh-hideout/pokeemerald-expansion/pull/2315
- Object events now get frozen while the menu is open to avoid potential nasty effects by @TheXaman in https://github.com/rh-hideout/pokeemerald-expansion/pull/2315
- Automated creation of MAP_GROUP_COUNT for the debug menu by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2307
- Generating music names for the debug menu based on their labels by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2306
Fixed
- Ability pop ups not appearing at all by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2314
- Dauntless Shield's and Intrepid Sword's effects only triggering for mon on the left in double battle, even if the mon with the abilities are on the right by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2313
- Flickering when switching menus in the Overworld Debug Menu @Jaizu in https://github.com/rh-hideout/pokeemerald-expansion/pull/2315
- Missing uses of Fairy type for Union Room and Battle Factory by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2310
- Tutors changing the level of the taught Pokémon to the level that the last mon that used a Exp Candy reached by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2282
- Exp candies giving the wrong amount of experience by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2282
- Exp Candy XL breaking experience points by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2282
- Ai check for switching when the target is semi invulnerable by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2324
Pret merges
- Up to (c1dfd3c9eca7d9dd73ac7dbaff0444d965758f4c) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2308
Cleanup
- Tidying graphics - Super Ancient Pokémon special weather by @Blackforest92 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2303
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.0.0...expansion/1.1.0
Version 1.0.0
## 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.0.0`.
BREAKING
- Reworked TMHM into expandable list format by @gruxor in https://github.com/rh-hideout/pokeemerald-expansion/pull/2233
- Tutor moves and TM/HM moves have been combined into a single list of Teachable Moves.
- With this change, it allows users to have official data for compatibility if they add their own TMs/HMs and Tutors.
- Added Legends: Arceus species by @Blackforest92 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2177
- Fixed PokemonSubstruct3 alignment by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2265
ADDED
- Added Legends: Arceus' move data by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2280
- Inclusion of the TheXaman's Debug Menu by @TheXaman in https://github.com/rh-hideout/pokeemerald-expansion/pull/2277
- Introduced FORM_BATTLE form changes by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2273
- Form changes for Zacian, Zamazenta and Xerneas before a battle's intro.
- Optional parameter to check for held item.
- Introduced
param3
to facilitate this and merging of FORM_ITEM_USE.
- Introduced
CHANGED
- Merged FORM_ITEM_USE_TIME into FORM_ITEM_USE by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2304
- Comatose prevents Battle Pike's status effects. by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2198
- Updated Serene Grace checks in AI_CheckViability by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2218
FIXES
- Fixed Quash's effect by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2239
- Fixed pickup running when it shouldn't in some cases. by @StephenLynx in https://github.com/rh-hideout/pokeemerald-expansion/pull/2284
- Dragon Tail Weak Armor fix by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2278
- Fix Magic Bounce targets by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2260
- Fixed ball multiplier fallthroughs by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2290
- Weather forms fixes and config by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2150
- Fixed compile error when using
GEN_3
setting for sport moves by @Yak-Attack-1012 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2295
PRET MERGES
- Up to 578064d (2022-08-26) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2286
CLEANUP
- Updated README.md to reflect the new workflow by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2287
- Updated README.md with credits and wiki links by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2299
- Config refactor by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2297
- Refactored uses of configs to be exclusivetly handled by preproc, as an optimization such that we don't have stuff like (is 3 > 4?)
- Moved Gen definitions to
include/config.h
, to be used by all config files. - Created
GEN_LATEST
as a way to avoid conflicts with users that modify the default configs and have a way for them to easily set everything to their prefered generation.
- Tyding graphics
- Tidying Graphics/Battle_Anims by @Blackforest92 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2289
- Acupressure by @Blackforest92 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2301
- Small syntax fix for CanLearnTeachableMove by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2302
- Added missing constant in GetBattleMonMoveSlot by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2294
New Contributors
- @StephenLynx made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2284
- @Yak-Attack-1012 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2295
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/0.9.0...expansion/1.0.0
Version 0.9.0
## 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/0.9.0`.
This version was labeled retroactively after our versioning scheme was decided, meaning the version number may be arbitrary.
ADDED
- Support for double wild battles with a single opponent by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2238
- Gen 8 EXP Candies by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/2142
- Affection/friendship battle mechanics by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2173
CHANGED
- Moves with EFFECT_PLACEHOLDER can't be used anymore. by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2243
- Modified HP display to support HP with 4 digits by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2256
- Enable BUGFIX by default by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2258
- Updated Fairy icon to better match the rest of them by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2269
FIXES
- Gen5+ multihit odds. by @aarant in https://github.com/rh-hideout/pokeemerald-expansion/pull/2219
- IsAbilityPreventingEscape message in party menu by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2125
- ENDTURN_WISH not resetting gBattleStruct->turnSideTracker by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2236
- Ability pop-up not displaying long abilities properly by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2234
- Doubles 2 vs 1 interface by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2238
- Fixed creation trio orbs not boosting power for non-base forms. by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2242
- LoadSpecialPokePic now loads gender differences correctly by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2247
- Fixed Net Ball Gen 7+ multiplier by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2259
- Fix Escape Rope Message when on gen 8 mechanics by @ThirdLemon in https://github.com/rh-hideout/pokeemerald-expansion/pull/2263
PRET MERGES
- Up to 578064d79966ebfcd0de8782f8b7294415fd6c87 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2264
CLEANUP
- Fix multiple pokemon icons & tidying pokemon graphic folders by @Blackforest92 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2206
- Get rid of garbage bytes in graphics.c by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2235
- Fixed P_UPDATED_ABILITIES's comment by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2241
- Fixed critical capture fields not using TRUE or FALSE by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2245
- Reworked branch defines into single compatibility define by @gruxor in https://github.com/rh-hideout/pokeemerald-expansion/pull/2237
- Removed unused local var in SetMonFormPSS by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2271
New Contributors
- @ThirdLemon made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2263
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/0.8.0...expansion/0.9.0
BREAKING
- Reworked TMHM into expandable list format by @gruxor in https://github.com/rh-hideout/pokeemerald-expansion/pull/2233
- Tutor moves and TM/HM moves have been combined into a single list of Teachable Moves.
- With this change, it allows users to have official data for compatibility if they add their own TMs/HMs and Tutors.
- Added Legends: Arceus species by @Blackforest92 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2177
- Fixed PokemonSubstruct3 alignment by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2265
ADDED
- Added Legends: Arceus' move data by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2280
- Inclusion of the TheXaman's Debug Menu by @TheXaman in https://github.com/rh-hideout/pokeemerald-expansion/pull/2277
- Introduced FORM_BATTLE form changes by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2273
- Form changes for Zacian, Zamazenta and Xerneas before a battle's intro.
- Optional parameter to check for held item.
- Introduced
param3
to facilitate this and merging of FORM_ITEM_USE.
- Introduced
CHANGED
- Merged FORM_ITEM_USE_TIME into FORM_ITEM_USE by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2304
- Comatose prevents Battle Pike's status effects. by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2198
- Updated Serene Grace checks in AI_CheckViability by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2218
FIXES
- Fixed Quash's effect by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2239
- Fixed pickup running when it shouldn't in some cases. by @StephenLynx in https://github.com/rh-hideout/pokeemerald-expansion/pull/2284
- Dragon Tail Weak Armor fix by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2278
- Fix Magic Bounce targets by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/2260
- Fixed ball multiplier fallthroughs by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2290
- Weather forms fixes and config by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2150
- Fixed compile error when using
GEN_3
setting for sport moves by @Yak-Attack-1012 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2295
PRET MERGES
- Up to 578064d (2022-08-26) by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2286
CLEANUP
- Updated README.md to reflect the new workflow by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2287
- Updated README.md with credits and wiki links by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/2299
- Config refactor by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2297
- Refactored uses of configs to be exclusivetly handled by preproc, as an optimization such that we don't have stuff like (is 3 > 4?)
- Moved Gen definitions to
include/config.h
, to be used by all config files. - Created
GEN_LATEST
as a way to avoid conflicts with users that modify the default configs and have a way for them to easily set everything to their prefered generation.
- Tyding graphics
- Tidying Graphics/Battle_Anims by @Blackforest92 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2289
- Acupressure by @Blackforest92 in https://github.com/rh-hideout/pokeemerald-expansion/pull/2301
- Small syntax fix for CanLearnTeachableMove by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2302
- Added missing constant in GetBattleMonMoveSlot by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/2294
New Contributors
- @StephenLynx made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2284
- @Yak-Attack-1012 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/2295
Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/0.9.0...expansion/1.0.0
How to make an Expansion version
If you need instructions on how to release a new Expansion version, check out the enclosed instruction book. - AsparagusEduardo
1.- Autogenerating a changelog for the master
branch.
Requires Write access to the repo.
If the changelog you're making is for a minor version (Eg. 1.3.0), make sure to sync the upcoming
branch with master
before starting. Keep in mind that if there are unreleased changes in master
, they should be made into a patch version released alongside minor version.
- Go to https://github.com/rh-hideout/pokeemerald-expansion/releases.
- Press the option "Draft a new release".
- Fill the following fields:
- In "Choose a tag", write the name of the tag for the desired release number.
- Eg. for version 1.2.3, write
expansion/1.2.3
. It cannot be an existing tag.
- Eg. for version 1.2.3, write
- In "Target" choose
master
. - In "Previous tag", select the latest version released.
- In "Choose a tag", write the name of the tag for the desired release number.
- Press "Generate release notes". This will fill the description with a list of PRs made to the
master
branch since the lastest release. - You may copy the contents to your editor of choice for step 2.
- If the changelog you're making is for a minor version (Eg. 1.3.0), proceed to step 1B, without closing the current window.
1B.- Autogenerating a changelog for the upcoming
branch.
- Delete the text and title generated in the site.
- Change "Target" to
upcoming
. - Press "Generate release notes". This will autogenerate the description with changes from both branches, as they've been merged.
- Use a comparison tool to remove any shared PRs from
master
. (I use WinMerge for this).- Also remove any shared "New Contributor" entries.
- You should now have a text that only contains PRs made to
upcoming
.
2.- Sorting PRs in the changelog
- Copy the
docs/changelogs/template.md
file into a new file with the corresponding version for file and folder. Eg, for 1.2.3, you copy the file intodocs/changelogs/1.2.x/1.2.3.md
. - Use the following Regex to adapt all PR links into the format currently used:
- Search
in https://github\.com/rh-hideout/pokeemerald-expansion/pull/(\d+)
- Replace
in [#$1](https://github.com/rh-hideout/pokeemerald-expansion/pull/$1)
- Search
- At the bottom of the template, replace the "____" in
<!--Last PR: ____-->
with the number of the last PR in your autogenerated changelog. This will help you keep track of any new PRs that are merged in before you're finished with your changelog. - Sort the PRs by the categories present in the PR taking the following considerations:
- Keep the language of the changelog as newbie friendly as possible, explaining how the PR affects them.
- The format of the main line is the following:
{{Description of the change}} by @{{GitHub user}} in {{PR link}}
- If a PR reverted by a different PR, both should be removed.
- If the reverted PR's contents are then re-added it should be treated as if it's the first time added, with all the proper documentation needed.
- If a PR's content fits into multiple categories, like fixing two unrelated Ability and Move effects, you may duplicate the PR line and put it in both categories, changing the description of it accordingly.
- When refering to an element present in the code, always enclose them with ` to easily tell them apart. Eg:
- "Converted
settotemboost
command tocallnative
" - "Changed
MOVEEND_
defines to an enum"
- "Converted
- A PR's technical changes that may conflict with user changes should have an entry in the "REFACTORS" section at the beginning of the changelog. Any of these changes that requires a migration script should also be marked as such by appending the corresponding emoji listed there. The section should include, but it's not limited to:
- Massive data format and/or structuring changes.
- Converting defines to enums.
- Renaming structs and/or their fields.
- Removing enums/defines/structs.
- For fixes:
- Once on their respective categories, if a PR fixes multiple issues at once in that category, you may make a sublist of those issues to properly detail each one and avoid just writing "Fixed multiple ability issues" or an overly verbose sentence for the PR.
- Try to fit the contents of a PR as a single sentence in past tense that.
- DON'T write something like "Fixed Parental Bond", as this doesn't explain what was fixed in Parental Bond. Instead, write something like "Fixed Parental Bond not affecting Snore".
- For new configs:
- Add the name of the config as part of the sentence, with subitems explaining what they do based on their generation if it's a generational config. Eg:
* Added missing `B_AFTER_YOU_TURN_ORDER` config by @PhallenTree in [#5400](https://github.com/rh-hideout/pokeemerald-expansion/pull/5400) * Gen 5-7: After You fails if the order remains the same after using After You. * Gen 8+: After You no longer fails if the turn order remains the same after using After You.
- Add the name of the config as part of the sentence, with subitems explaining what they do based on their generation if it's a generational config. Eg:
- For other new features:
- Explain how to use the feature completely, listing all its features as needed. For now, this is the only source of documentation for these features, so it's important to be thorough.
3.- Preparing the code for the new version
- Search for all non-changelog instances of the previous released version and update them to the newer version. As of writing, it's these files:
README.md
:-Based off RHH's pokeemerald-expansion 1.2.2 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.2.3 https://github.com/rh-hideout/pokeemerald-expansion/
-- 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.2.2, use `git pull RHH expansion/1.2.2`). +- 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.2.3, use `git pull RHH expansion/1.2.3`).
.github/ISSUE_TEMPLATE/*.yaml
- Patch version:
options: - 1.2.2 (Latest release) + 1.2.3 (Latest release) master (default, unreleased bugfixes) upcoming (Edge) + 1.2.2 1.2.1 1.2.0
- Minor Version:
options: - 1.2.2 (Latest release) + 1.2.3 (Latest release) master (default, unreleased bugfixes) upcoming (Edge) + 1.2.2 1.2.1 1.2.0 - 1.1.6 - 1.1.5 - 1.1.4 - 1.1.3 - 1.1.2 - 1.1.1 - 1.1.0 - pre-1.1.0 + pre-1.2.0
- Patch version:
docs/SUMMARY.md
:- Patch version:
[Changelog](./CHANGELOG.md) - [1.2.x]() + - [Version 1.2.3](changelogs/1.2.x/1.2.3.md) - [Version 1.2.2](changelogs/1.2.x/1.2.2.md) - [Version 1.2.1](changelogs/1.2.x/1.2.1.md) - [Version 1.2.0](changelogs/1.2.x/1.2.0.md)
- Minor version:
[Changelog](./CHANGELOG.md) + - [1.3.x]() + - [Version 1.3.0](changelogs/1.3.x/1.3.0.md) - [1.2.x]() - [Version 1.2.2](changelogs/1.2.x/1.2.2.md) - [Version 1.2.1](changelogs/1.2.x/1.2.1.md) - [Version 1.2.0](changelogs/1.2.x/1.2.0.md)
- Patch version:
include/constants/expansion.h
:- The defines should already have the version we're targetting as part of the previous changelog process.
-// Last version: 1.2.2 +// Last version: 1.2.3 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 2 #define EXPANSION_VERSION_PATCH 3 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE FALSE +#define EXPANSION_TAGGED_RELEASE TRUE
- The defines should already have the version we're targetting as part of the previous changelog process.
4.- Make a PR with the changes listed in Steps 2/3.
- Also post the changelog for feedback from contributors and maintainers.
- Once all feedback has been addresses, you may merge.
5.- Create the release on GitHub
- Copy the contents of your manual changelog into the description of your release.
- Modify the title to "Version {{version}}", eg. "Version 1.2.3"
- Be sure to have the "Set as the latest release" option set,
- Press "Publish Release".
- This will create a new tag in the repo that users can pull from like they can with branches.
6.- Post-release handling
- DON'T ACCEPT ANY NEW PRs YET. We have to prepare for the next cycle first.
- Go to
include/constants/expansion.h
and merge the following changes to the repo (PR or direct commit, doesn't matter much):- Patch version:
// Last version: 1.2.3 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 2 - #define EXPANSION_VERSION_PATCH 3 + #define EXPANSION_VERSION_PATCH 4 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE TRUE +#define EXPANSION_TAGGED_RELEASE FALSE
- Patch version:
With this, the repo is ready again to receive new PRs.
Now you're ready to make the announcements!
- We tend to post on the following Discord Servers:
- RH-Hideout
- Requires role to post in #announcements channel.
- Team Aqua's Hideout
- Requires role to post in #romhacking-updates channel.
- What a Hack!
- Announcements are done in Spanish, but not the changelogs themselves.
- Requires role to ping "Decompilaciones" role.
- pret
- PokéCommunity
- RH-Hideout
You can make a highlight of changes in the announcement itself, but it's not needed. (I also like using Discord emotes to highlight certain features during announcements, but gain, it's not needed).
Document Purpose
This document is a guide for contributors and Senate to decide if a feature is within "scope" for pokeemerald-expansion. If a feature is not in scope, then it should not be merged. Even if an opened PR is within scope, this does not mean it will be merged, as acceptance criteria will often come down to the details of the implementation.
Definitions
- Showdown Supported (SS): A core series game who's metagame can be played on Showdown.
- Notably, this is every core series game except Pokémon Legends: Arceus.
- Base Expansion Version: "A .gba file built from an unmodified
master
orupcoming
branch ofpokeemerald-expansion
. - Vanilla Emerald Version: A .gba file built from an unmodified
master
branch of pret'spokeemerald
.
Guidelines
A pull request meets the scope criteria if:
- The feature does not belong to a category considered “not in scope” AND
- The feature belongs to a category considered “in scope”
In Scope Categories
- SS Species: Adds Species that have appeared in a Showdown-supported title
- SS Moves: Adds Moves and Move Animations that have appeared in a Showdown-supported title
- SS Abilities: Adds Abilities that have appeared in a Showdown-supported title
- SS Items: Adds Items that have appeared in a Showdown-supported title
- SS Gimmicks: Adds Gimmicks that have appeared in a Showdown-supported title
- SS Battle Types: Adds Special Battle Types that have appeared in a Showdown-supported title
- SS Battle Mechanics: Adds mechanical battle changes that have appeared in a Showdown-supported title
- Improve Battle AI: Improve the Battle AI in a way that allows it to approach the skill and capability of a human competitive player
- Base Link Compatibility: Link compatibility with base
- SS Overworld / Menu Updates: Replicate overworld or menu changes from Showdown-supported Pokémon titles
- Speed Up: Speed up the player experience of features found in base
- Compression: Automatically compress assets
- Novel Experience: Adds a novel experience included in another Showdown Supported title
- Helper Features: Eases the addition or inclusion of any of the aforementioned
Not In Scope Categories
- Non-SS Species: Adds Species that have NOT appeared in a Showdown-supported title
- Non-SS Moves: Adds Moves and Move Animations that have NOT appeared in a Showdown-supported title
- Non-SS Abilities: Adds Abilities that have NOT appeared in a Showdown-supported title
- Non-SS Items: Adds Items that have NOT appeared in a Showdown-supported title
- Non-SS Gimmicks: Adds Gimmicks that have NOT appeared in a Showdown-supported title
- Non-SS Battle Types: Adds Special Battle Types that have NOT appeared in a Showdown-supported title
- Duplicate Feature UI: Adds functionality that duplicates the core functionality of an existing vanilla feature
- Vanilla Link Compatibility: Link compatibility with vanilla
Discussion Required Categories
Pull Requests that fall into this category should be brought up to maintainers, who will discuss and vote as to whether or not the feature is considered in scope. Considerations for acceptance may include invasiveness of implementation, popularity, ease of maintenance, etc.
- Developer Ease of Use: Lowers barrier of entry for developers to use existing behavior
- Fangame Features: Adds a popular feature from other fangames
- Popular Non-SS Features: Exceptions can be made for uniquely popular or requested features (Drowsy, PLA Legend Plate, etc.)
- External Program: External programs like poryscript, porymoves, etc.