Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

## 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.16.0
`.

🌋 REFACTORS 🌋

📜 = Uses a migration script.

  • Fling Refactor by @AlexOn1ine in #9176
  • Refactor synchronize and cure berry timing by @AlexOn1ine in #9446
  • Refactor Sky Drop and rampage confusion by @AlexOn1ine in #9249
  • 📜 Remove loadspritegfx by @hedara90 in #8497
    • Instead of having to load assets used in move animations manually, they’re loaded by the commands that use them instead.
    • loadspritegfx had an implicit delay 1 in it, if downstream animations depended on that, an explicit delay 1 needs to be added manually.
    • Has migration script, run python migration_scripts/1.15/remove_loadspritegfx.py
  • Minor IsBattlerWeatherAffected refactor by @AlexOn1ine in #9510
  • gBerries refactor + untangling berry indices from item IDs by @cfmnephrite in #7305
  • Makes Poltergeist and Fling messages into a pre attack effect by @PhallenTree in #9610
  • Rework special trainer IDs by @FosterProgramming in #9269
  • Adds queued switches for Move End switches by @PhallenTree in #9494
    • Non-forced switches in Move End are now queued, like in-game.
  • Refactor Battle Messages by @LinathanZel in #9655
  • Refactor/trainer pic info by @cawtds in #9475
  • Magic Bounce / Magic Coat/ Snatch refactor by @AlexOn1ine in #9674
  • Unify AI prediction handling by @Pawkkie in #9575
  • Make End Turn events use BattleScriptCall (return instead of end2) by @PhallenTree in #9680
    • Changed end of turn scripts to use return instead of end2.
    • end2 scripts may still be used, but it’s recommended to switch them to return scripts
  • Move relearner refactor by @FosterProgramming in #9006
    • Calling the move relearner from a script ignores config
    • Move Relearner warns you if a TM will be used
    • When the move relearner is called from a menu, it doesn’t quit the move relearner automatically, you can learn as many moves as you want before leaving
    • The function RedrawListMenu now properly calls the moveCursorFunc callback the same way it is done when the list is drawn for the first time
  • Automate regional Pokedex orders by @fdeblasio in #8930
  • Adds queued switches for EndTurn switches by @PhallenTree in #9717
    • End of turn switches are now queued.
    • Emergency Exit and Wimp Out now activate at the end of the turn after an event left the ability user under 50% HP if it wasn’t healed by a healing item in that event.
  • Adds AreMultiPartiesFullTeams and Test_BattlersShareParty handling to tests by @grintoul1 in #9751
  • Shouldswitch refactor to use SwitchContext by @Pawkkie in #9847
  • Adds CalcValue struct to MoveEnd by @AlexOn1ine in #9859
  • Stat Change Refactor by @AlexOn1ine in #9730
  • Customizeable Pledge Moves by @AlexOn1ine in #9918

🧬 General 🧬

Added

  • feat(debug): add quickstart from titlescreen by @miriamlefae in #9641

Changed

  • Remove unnecessary EWRAM allocation for cable car animation by @hedara90 in #9207
  • Cleaned up Match Call by @fdeblasio in #8816
  • Add Instructions on how to build FRLG by default by @HunarPG in #9415
  • Random EWRAM and IWRAM savings by @estellarc in #9231
  • Typeless enums for OBJ_EVENT_GFX, Multichoice Ids, and Facility Classes by @grintoul1 in #9066
  • preproc: (shared) COMPOUND_STRING by @mrgriffin in #9086
  • Removes unused files by @FosterProgramming in #9420
  • pr adding telekinesis ban list to species data by @Meister-anon in #9410
  • Change TrainersMon’s ball from u8 to enum PokeBall by @estellarc in #9467
  • Converted script_menu.h strings to COMPOUND_STRINGs by @fdeblasio in #9051
  • Clean up boolean comparisons by @Bassoonian in #9376
  • Fix enum usage by @Bassoonian in #9466
  • Master merge 2026-03-14 by @AsparagusEduardo in #9522
  • Some bool cleanup by @FosterProgramming in #9539
  • Replace MAX_GIFT_RIBBONS with NUM_GIFT_RIBBONS by @FosterProgramming in #9542
  • Remove PARTNER_DUMMY need by adding additional difficulty when TESTING by @grintoul1 in #9562
  • GenConfig naming cleanup by @Pawkkie in #9529
  • fix(pokedex_plus_hgss): revert incorrect usage of species enum by @miriamlefae in #9570
  • Remove leftover DebugPrintfs by @mrgriffin in #8213
  • Fix Kanto object event graphic names by @fdeblasio in #9537
  • Consolidated Battle Tower classes and object events by @fdeblasio in #9241
  • Rework special trainer IDs by @FosterProgramming in #9269
  • identified deprecated values by @Meister-anon in #9578
  • Removed STRINGID_PKMNISGLOWING by @fdeblasio in #9634
  • 📜 Consolidate decoration values by @fdeblasio in #9624
    • Process for running migrations script
    • Keep your modified src/data/decorations/description.h and src/data/decorations/icon.h when resolving conflicts
    • Run migration script
    • Remove src/data/decorations/description.h and src/data/decorations/icon.h
  • Convert move description variables into COMPOUND_STRINGs by @fdeblasio in #9667
  • Converted move animation magic numbers to defines by @fdeblasio in #9677
  • Move relearner refactor by @FosterProgramming in #9006
    • Calling the move relearner from a script ignores config
    • Move Relearner warns you if a TM will be used
    • When the move relearner is called from a menu, it doesn’t quit the move relearner automatically, you can learn as many moves as you want before leaving
    • The function RedrawListMenu now properly calls the moveCursorFunc callback the same way it is done when the list is drawn for the first time
  • Remove hex values from BattlePokemon by @AlexOn1ine in #9711
  • Support non-contiguous SE/MUS IDs in debug menu by @mrgriffin in #9713
  • Fix multi_do multiple-definition error by @mrgriffin in #9725
  • Automate regional Pokedex orders by @fdeblasio in #8930
  • Learnset Helper: Remove unnecessary order-only dependencies by @mrgriffin in #9721
  • Fix spaces, spelling, and grammar by @fdeblasio in #9761
  • Revert an overzealous find-replace by @rayrobdod in #9780
  • Improve FillSpriteRect performance by @estellarc in #9813
  • Move wild encounter related config to wild_encounter config file by @FosterProgramming in #9879
    • The following configs have been moved to include/config/wild_encounter.h: B_FLAG_FORCE_DOUBLE_WILD, B_SMART_WILD_AI_FLAG, B_FLAG_NO_CATCHING, B_FLAG_NO_RUNNING, B_DOUBLE_WILD_CHANCE, B_DOUBLE_WILD_REQUIRE_2_MONS,B_WILD_NATURAL_ENEMIES, OW_FLAG_NO_ENCOUNTER
    • Their prefix has been changed from B_ or OW_ to WE_
  • Fix stray tab in C file by @hedara90 in #9914
  • Remove two unused functions from src/event_object_movement.c by @FosterProgramming in #9911
  • Reduce battle heap usge outside main battle screen by @FosterProgramming in #9906
  • chore: removed old changelog file by @pkmnsnfrn in #9915
  • 📜 Adds migration script for trainer pic refactor by @AlexOn1ine in #9788
  • Refactor a more generic way to handle complex debug menu actions by @FosterProgramming in #9890
  • config/wild_encounter.h cleanup by @FosterProgramming in #9965
  • Various Follower Sprite Fixes from issue #5135 by @Liamjd14 in #9990
  • Give enum BattleTrainer more user friendly entry names by @grintoul1 in #10051
    • Key renames:
    • (1) gEnemyPartyCount -> gPartiesCount[B_TRAINER_OPPONENT_A];
    • (2) gPlayerPartyCount -> gPartiesCount[B_TRAINER_PLAYER];
    • (3) gEnemyParty -> gParties[B_TRAINER_OPPONENT_A];
    • (4) gPlayerParty -> gParties[B_TRAINER_PLAYER];
    • NEW:
    • Second trainer party count is now gPartiesCount[B_TRAINER_OPPONENT_B];
    • Second trainer party is now gParties[B_TRAINER_OPPONENT_B];
    • Multi partner party count is now gPartiesCount[B_TRAINER_PARTNER];
    • Multi partner party is now gParties[B_TRAINER_PARTNER];
  • Adds deprecation warnings to old party and party count globals by @grintoul1 in #9885
    • gEnemyParty and gEnemyPartyCount will be removed in 1.17.0
  • Describe compressed tilemaps with INCGFX by @FosterProgramming in #10036
    • most incbin of compressed tilemap replaced with incgfx that make the compression process more explicit
  • 28//05/26 Master to upcoming merge by @AlexOn1ine in #10070
  • chore(credits): change kildemal to miriam in credits by @miriamlefae in #10078

Fixed

  • Use PRIu64 to print appropriate variable length in preproc by @FosterProgramming in #9463
  • fix: battle message assert no longer calls for gText_Blank by @pkmnsnfrn in #9505
  • Fix upcoming compile by @AlexOn1ine in #9579
  • Removes DecompressTrainerBackPic fixing multibattles with 5-frame partner back sprites by @grintoul1 in #9608
  • Fix spritesheet_rules.mk for renamed FRLG objects by @hedara90 in #9668
  • fix meganium abilities by @cawtds in #9767
  • Fix declaration after label by @FosterProgramming in #9835
  • fix(debug_menu): fix flicker when used when map pop-up active by @miriamlefae in #9872
  • Cleanup of Dexnav checks by @hedara90 in #9913
  • Fix font shadow not being cleared in safari healthbox by @FosterProgramming in #9912
  • Fix trainer defines by @FosterProgramming in #9964
  • Fixes double battle rematches being single battles by @luuma in #9963
  • Fix FillSpriteRect wrongly triggering an assert by @estellarc in #9973
  • Prevent error in title screen cinematic if Kyogre/Groudon are disabled by @fisham33 in #9995
  • Fix Dynamic Summary Screen Type by @AlexOn1ine in #9861
  • Fix battle debug not properly freeing some tilemaps by @FosterProgramming in #10014
  • Fix incorrect action handler being set after rearranging moves in Emerald tutorial battle by @hedara90 in #10015
  • mapjson assume undefined layout and maps match the compiled version by @FosterProgramming in #9949
  • Set daily seed on new game by @FosterProgramming in #10050
  • 📜 Migration script for pret#2200 by @mrgriffin in #10061

🗺️ Overworld 🗺️

Added

  • Improved FRLG Map Previews by @Bivurnum in #9557
    • Implemented and improved FRLG Map Previews
  • feat (shopMenu): conditional item appearances by @mudskipper13 in #9425
    • added a default shop list in data/scripts/mart_clerk.inc that is used if pokemart is called without arguments
    • you can enabled a criteria function in the item definition to prevent the item from appearing in shop if the condition is not met, more details here
  • Reworked event evolution tryspecialevo by @FosterProgramming in #7573
    • tryspecialevo now takes a argument describing what type of evo occurs so if a pokemon like kubfu has multiple trigger evo, it can properly choose between them
    • if used with tryMultiple=FALSE, it applies to the first eligible Pokemon in party, if TRUE, it applies to all eligible pokemon in party
    • the command now also fills VAR_SPECIAL_RESULT when used, when tryMultiple is TRUE, it will contain the number of pokemon that finished their evolution. When used with FALSE, it will contain EVO_EVENT_IMPOSSIBLE (0) if it didn’t find an eligible pokemon, EVO_EVENT_INTERRUPTED (1) if the player stopped the evo and EVO_EVENT_SUCCESSFUL (2) if the evo finished
  • Show floor number in map popup by @FosterProgramming in #9461
    • The floor number feature from FRLG is now available in Emerald and working in FireRed. You can add a “floor_number” argument to you map json and when a popup for the map will appear, it will add 1F, 2F, B1. You can also use the value “FLOOR_ROOFTOP” (or 127) to show “ROOFTOP” like in the celadon mall
  • Add setmetatileinrange Script Command by @ghoulslash in #8628
  • Basic daily seed by @FosterProgramming in #9920
    • Adds a new config OW_USE_DAILY_SEED that stores a random number in save file updated every day
  • Add Dynamic Weather Option by @jtebbe in #9877
    • Added dynamic weather as a weather option for map headers for random or semi-random weather. See docs/tutorials/how_to_dynamic_weather for more information.
  • Random Mon Generation by @jtebbe in #9896
    • Added random species, item, ball, and move generation. For information on how to use this feature, check out the docs

Changed

  • Remove template abstraction for pokedex area map by @FosterProgramming in #9765
  • Clean mail-related duplicate code by @FosterProgramming in #9762
  • Remove relearner from party menu by @FosterProgramming in #9693
    • The P_PARTY_MOVE_RELEARNER config is not supported anymore, use P_SUMMARY_SCREEN_MOVE_RELEARNER for that functionality instead
  • Refactor rock climb and defog to be defined at all times by @BluSunrize in #9819
  • Cleanup and tests for ow_abilities.c by @FosterProgramming in #9850
  • Overworld Encounters by @Bivurnum in #8434

Fixed

  • Fade background and sprites simulatneously by @FosterProgramming in #9407
  • Fix blend-immune sprite not fading properly by @FosterProgramming in #9549
  • Reset objPaletteToggle after Software Fade by @HashtagMarky in #9707
  • Properly cancel move relearner NPC after refusing to learn a move by @FosterProgramming in #9774
  • fix (namebox): back 2 back namebox no longer flickers by @mudskipper13 in #9905
  • Fix move relearner from summary screen from pc by @FosterProgramming in #9903
  • Prevent reflection tag palette collisions by @moostoet in #9925
    • Fixed incorrect overworld reflection palettes when shiny and non-shiny Pokemon object events are loaded near water at the same time.
  • Modify GetAvailableObjectEventId to return objectEventId by value instead of by reference by @FosterProgramming in #9910
  • Fix FRLG player sprite glitch when fishing after surfing by @moostoet in #9930
    • Fixed player overworld sprite tile corruption when switching between graphics with the same OAM size enum but different frame byte sizes, such as Surfing to Fishing in FireRed.
  • Bugfix: OWEs set not to despawn can now be set not to despawn as a result of movement type by @Bivurnum in #9968
  • Bug fix: On-step scripts now only happen once the FNPC out of door task is complete by @Bivurnum in #9991
  • Re-add DetermineFollowerNPCDirection same coord check by @HashtagMarky in #10020
  • Fix Generated OWEs Accessing Garbage Data by @HashtagMarky in #10066

🐉 Pokémon 🐉

Added

  • refactor(graphics): make spinda spots generic by @miriamlefae in #9594

Changed

  • Separate Perfect IV Logic Into New Function by @HashtagMarky in #9173
  • Allow other species to have Shedinja HP handling by @AsparagusEduardo in #9135
  • Add Species enum by @Bassoonian in #9507
  • feat: Add some constants nudging users where to put their custom species by @lhearachel in #9558
  • Overworld Encounters by @Bivurnum in #8434
  • Garchomp Mega Z Sprites by @Liamjd14 in #9945
  • Updated Gen VII animations by @Tacobell24 in #9974
  • BoxPokemon: Less error-prone “static asserts” by @mrgriffin in #10071

Fixed

  • fix: Modernize the conversion formula for imperial weights by @lhearachel in #9690
  • Add Spot Coord Limits by @HashtagMarky in #9796
  • Fix reverse-cry off-by-one if Porygon disabled by @hedara90 in #10004

⚔️ Battle General ⚔️

Added

  • Add Gen 2-3 and Gen 4 Encore timers by @Cle-bit in #9429
  • Gen 5+ Uproar with config by @PhallenTree in #9616
    • Gen 5+ Uproar was implemented. Uproar’s implementation is split between the configs B_UPROAR, B_UPROAR_IGNORE_SOUNDPROOF and B_UPROAR_TURNS.
  • 12v12 capability by @grintoul1 in #8943
    • Key renames:
    • (1) gEnemyPartyCount -> gPartiesCount[B_TRAINER_1]; Later becomes gPartiesCount[B_TRAINER_OPPONENT_A]
    • (2) gPlayerPartyCount -> gPartiesCount[B_TRAINER_0]; Later becomes gPartiesCount[B_TRAINER_PLAYER]
    • (3) gEnemyParty -> gParties[B_TRAINER_1]; Later becomes gParties[B_TRAINER_OPPONENT_A]
    • (4) gPlayerParty -> gParties[B_TRAINER_0]; Later becomes gParties[B_TRAINER_PLAYER]
    • Temporary defines for gEnemyParty and gEnemyPartyCount will remain for one release cycle to allow downstream to integrate changes at their own pace. These come with deprecation messages.
    • Defines for gPlayerParty and gPlayerPartyCount will remain in place for the forseeable future, with deprecation warnings. These can continue to be used at users’ own risk.
    • Changes to struct Trainer reducing encounterMusic from 7 bits to 4, and mugshots from 6 bits to 3. Combined two separate u8 bitfields to a single u16 with 2 bits of padding available if needed by users
    • struct RecordedBattle has reduced playerGender to a 4-bit u8 to offset some space taken up by 4 parties. For developers using more than 2 player genders, this will require either adjusting or reverting to its previous form, which will require a reduction of the BATTLER_RECORD_SIZE define located above the struct.
    • Other restructuring of struct RecordedBattle undertaken to absorb some of the hit from BATTLER_RECORD_SIZE
  • Add Held Berry Animation by @LinathanZel in #9168

Changed

  • Simplify Scale Shot effect activation by @PhallenTree in #9408
  • Fling Refactor by @AlexOn1ine in #9176
  • Reduce heap usage in battle by @hedara90 in #9121
  • update poparraywithBattlers Arg to prevent warning by @Meister-anon in #9388
  • Minor dancer clean up/consolidation by @AlexOn1ine in #9417
  • Refactor synchronize and cure berry timing by @AlexOn1ine in #9446
  • Minor IsBattlerWeatherAffected refactor by @AlexOn1ine in #9510
  • SetMoveEffect cleanup by @PhallenTree in #9514
    • Move Effects are now (mostly) not hardcoded to only work on the attacker/target.
  • Fill out missing type info by @kevinvanrijn in #9525
  • Makes Poltergeist and Fling messages into a pre attack effect by @PhallenTree in #9610
  • Adds queued switches for Move End switches by @PhallenTree in #9494
    • Non-forced switches in Move End are now queued, like in-game.
  • BattleCalcValues usage and rename BattleContext back to DamageContext by @AlexOn1ine in #9657
  • Refactor Battle Messages by @LinathanZel in #9655
  • Refactor/trainer pic info by @cawtds in #9475
  • Magic Bounce / Magic Coat/ Snatch refactor by @AlexOn1ine in #9674
  • Make End Turn events use BattleScriptCall (return instead of end2) by @PhallenTree in #9680
    • Changed end of turn scripts to use return instead of end2.
    • end2 scripts may still be used, but it’s recommended to switch them to return scripts
  • Slight restructure for Defog and Tidy Up by @AlexOn1ine in #9714
  • Mega Sol and Dragonize by @luuma in #9735
  • Adds queued switches for EndTurn switches by @PhallenTree in #9717
    • End of turn switches are now queued.
    • Emergency Exit and Wimp Out now activate at the end of the turn after an event left the ability user under 50% HP if it wasn’t healed by a healing item in that event.
  • Clarify isFirstTurn usage with wrappers by @AlexOn1ine in #9786
  • Add Spicy Spray by @LinathanZel in #9769
  • Clean up for eject item changes by @AlexOn1ine in #9832
  • Adds CalcValue struct to MoveEnd by @AlexOn1ine in #9859
  • IsAnyTargetAffected and GetDynamicMoveType changes by @AlexOn1ine in #9898
  • Stat Change Refactor by @AlexOn1ine in #9730
  • Rename follow up for Stat Change Refactor by @AlexOn1ine in #9928
  • Minor Battle Struct clean up and script clean up by @AlexOn1ine in #9916
  • Customizeable Pledge Moves by @AlexOn1ine in #9918
  • Integrate accuracy check into canceler by @AlexOn1ine in #9939
  • Small Dome updates by @AsparagusEduardo in #9989
  • Align outdated move descriptions with current mechanics by @Cle-bit in #10011
  • Further stat change refactor clean up by @AlexOn1ine in #10057
  • Align wind move flags with current mechanics by @Cle-bit in #10016

Fixed

  • Refactor Sky Drop and rampage confusion by @AlexOn1ine in #9249
  • Bide Refactor by @AlexOn1ine in #9532
  • Fix wild doubles only having 1 mon by @grintoul1 in #9729
  • Use GetBattlerTrainer instead of GetBattlerSide in GetBattlerPartyState by @Nopinou in #9811
  • Adjustments for Eject Items / Mirror Herb / White Herb by @AlexOn1ine in #9784
  • Adds tests for switch battle messages and switch AI bugfix by @grintoul1 in #9799
  • Fix contact damage message printing by @Kasenn in #9856
  • Make healthbox invisible for previous mon after opening party screen by @PhallenTree in #9864
  • Fix Ruin abilities respecting each other even if deactivated by @AlexOn1ine in #9901
  • Fix Aroma Veil not blocking Destiny Knot infatuation by @Cle-bit in #9921
  • Fix incorrect ability battle history recording by @Cle-bit in #9917
  • Fix in-battle summary preserving battle party order by @moostoet in #9843
  • Correct status move miss messaging by @moostoet in #9929
    • Fixed status moves using accuracycheck BattleScript_ButItFailed so visible-target accuracy misses print the avoided-attack message instead of But it failed!.
  • Fix Air Balloon not popping when damaging moves hit a Substitute by @Cle-bit in #9943
  • Fix Eject Pack switch when the holder is trapped by @moostoet in #9946
  • Fix Fling Berry effects not being blocked by Covert Cloak and Shield Dust by @Cle-bit in #9951
  • Fix Air Balloon not popping when holder faints from a damaging hit by @Cle-bit in #9952
  • Fix stale hit state after multihit moves miss mid-sequence by @Cle-bit in #9937
  • Future Sight fixes and tests by @AlexOn1ine in #9942
  • Preserve Encore target last move after flinch by @moostoet in #9940
  • Fixes Guard Dog by @AlexOn1ine in #9957
  • Fix geomancy being a two turn move by @AlexOn1ine in #9972
  • Fix Guard Dog activating when Intimidate is blocked or cannot lower Attack by @Cle-bit in #9954
  • Fix Cute Charm infatuation message by @PhallenTree in #9982
  • Fix Red Card activating when attacker faints by @Cle-bit in #9976
  • Fix Utility Umbrella interactions with Weather Ball in sun/rain by @Cle-bit in #9975
  • Fix multi hit result message by @AlexOn1ine in #9983
  • Dancer activation order config + upcoming bugfixes by @PhallenTree in #9988
  • Fix Toxic Debris checking Toxic Spikes cap on the wrong side by @Cle-bit in #10002
  • Fix Infiltrator bypassing ally Safeguard for confusion effects by @Cle-bit in #10007
  • Fixes Trace not activating when reobtained after activation by @PhallenTree in #10024
  • Fix King’s Rock flinch chance with Serene Grace and rainbow by @Cle-bit in #10028
  • Fixes Swagger into Own Tempo target softlock by @PhallenTree in #10032
  • Fix incorrect Loaded Dice priority over Skill Link for Population Bomb by @Cle-bit in #10003
  • Fix gLastMoves and where it’s set by @LinathanZel in #9999
  • Fix Strength Sap activation on miss by @AlexOn1ine in #10035
  • Fix Strength Sap activation on miss and buffer correct stat by @AlexOn1ine in #10034
  • Fix Poison Puppeteer target tracking by @Cle-bit in #10047
  • Fix Teraform activations timing by @AlexOn1ine in #10040
  • Fix Syrup Bomb end-turn stat drop source for Defiant and Competitive by @Cle-bit in #10042
  • Fix Symbiosis triggering after Eject items consumed by @Cle-bit in #10038
  • Fix Illusion reveal on fainting without attack damage by @Cle-bit in #10030
  • Fix end-turn form changes for fainted battlers by @Cle-bit in #10029
  • Fix already-status messages using the wrong battler by @Cle-bit in #10064
  • Fix 12v12 partner party menu slot ptr by @grintoul1 in #10059
  • Fixed NoAliveMonsForPlayer for multibattles by @grintoul1 in #10039
  • Fix Spicy Spray triggering on party future sight attacker by @AlexOn1ine in #10072
  • Fix erroneous failure message for stat change moves by @AlexOn1ine in #10074
  • Fix Competetive, Defiant and Adrenaline Orb triggering when at min stat by @hedara90 in #10077
  • Fix Mega Sol weather interactions and Piercing Drill AI checks by @Cle-bit in #10079

🤹 Moves 🤹

Changed

  • Made moves’ animation’s AbsorbEffects more consistent by @fdeblasio in #9063
  • Create functions for repeated move animations by @fdeblasio in #9142
  • Move animation call depth increase by @hedara90 in #9473
  • 📜 Remove loadspritegfx by @hedara90 in #8497
    • Instead of having to load assets used in move animations manually, they’re loaded by the commands that use them instead.
    • loadspritegfx had an implicit delay 1 in it, if downstream animations depended on that, an explicit delay 1 needs to be added manually.
    • Has migration script, run python migration_scripts/1.15/remove_loadspritegfx.py
  • Converts move animation hex numbers to decimal by @fdeblasio in #9172
  • Created macros for fist and foot animations by @fdeblasio in #9676

Fixed

  • Fix Substitute breaking when used by opponentRight in double battles by @hedara90 in #9474
  • Fixed Stuff Cheeks animation by @fdeblasio in #9564
  • Fix move anim pal blending being discarded by @hedara90 in #9595
  • Fix move anim migration script by @hedara90 in #9511

🎭 Abilities 🎭

Changed

  • Add basic Z-A Mega ability data (from Champions Regulation M-A) by @kittenchilly in #9678
  • ABILITY_PIERCING_DRILL by @kittenchilly in #9740
  • Mega Sol and Dragonize by @luuma in #9735
  • Add Spicy Spray by @LinathanZel in #9769

🧶 Items 🧶

Changed

  • gBerries refactor + untangling berry indices from item IDs by @cfmnephrite in #7305

Fixed

  • Fix Competetive, Defiant and Adrenaline Orb triggering when at min stat by @hedara90 in #10077

🤖 Battle AI 🤖

Added

  • AI considers Defense‑boosting moves before using Body Press by @Cle-bit in #9360
  • AI uses Beat Up on allies to power up Rage Fist in doubles by @Cle-bit in #9359
  • AI avoids bad moves when a faster foe is predicted to go semi-invulnerable by @Cle-bit in #9358
  • Improve Rest sleep AI logic with cleanup and tests by @Cle-bit in #9349
  • Smarter Doubles Fake Out AI + EFFECT_FIRST_TURN_ONLY tests by @grintoul1 in #8664
  • Allow both AI opponents in doubles to switch out on the same turn by @Pawkkie in #9451
  • Add AI internal config support by @Pawkkie in #9460
  • Switch AI sees stat, volatile, status, and HP changes on switchin in calcs by @Pawkkie in #9124
  • Adds ai calcs for Bolt Beak, Payback and Analytic by @AlexOn1ine in #9548
  • Add AI contextual damage roll configs by @Pawkkie in #9568
  • Add Intimidate cycling logic for ai switching by @Cle-bit in #9551
  • Config to randomize the order AI mons compute logic in double battles by @Pawkkie in #9462
  • Implement Wish Passing in ShouldSwitch by @moostoet in #8472
    • AI trainers with AI_FLAG_SMART_SWITCHING will now consider switching to pass Wish to an injured teammate when they have a bad matchup and a better switch-in candidate exists.

Changed

  • Adds bridge between battle engine and ai calcs by @AlexOn1ine in #9116
  • AI scores Order Up stat boosts under Commander by @Cle-bit in #9107
  • Use precalculated speedStats for AI speed comparison by @AlexOn1ine in #9587
  • Damage roll speed wizardry by @Pawkkie in #9630
  • Unify AI prediction handling by @Pawkkie in #9575
  • Improve AI calc speed with affection hearts by @Pawkkie in #9709
  • Remove reundant weather check in IsDamageMoveUnusable by @AlexOn1ine in #9755
  • Remove redundant SetBattlerAiData call in GetMostSuitableMonToSwitchInto by @AlexOn1ine in #9757
  • Isolate AI thinking time tests by @Pawkkie in #9779
  • Shouldswitch refactor to use SwitchContext by @Pawkkie in #9847
  • Incoming and predicted move function cleanup by @Pawkkie in #9857

Fixed

  • Fix frame counter in multi battles by @AlexOn1ine in #9596
  • Use ctx in GetDefenderPartnerAbilitiesModifier by @Pawkkie in #9710
  • Adds AreMultiPartiesFullTeams and Test_BattlersShareParty handling to tests by @grintoul1 in #9751
  • Adds tests for switch battle messages and switch AI bugfix by @grintoul1 in #9799
  • Remove Defiant and Competitive from Partner Ability check in Doubles by @grintoul1 in #9985
  • Fix AI partner incorrectly having flags set to Battler1 instead of Battler2 by @grintoul1 in #10006

🧹 Other Cleanup 🧹

  • Remove unnecessary EWRAM allocation for cable car animation by @hedara90 in #9207
  • Adds bridge between battle engine and ai calcs by @AlexOn1ine in #9116
  • Made moves’ animation’s AbsorbEffects more consistent by @fdeblasio in #9063
  • Simplify Scale Shot effect activation by @PhallenTree in #9408
  • Cleaned up Match Call by @fdeblasio in #8816
  • Random EWRAM and IWRAM savings by @estellarc in #9231
  • Separate Perfect IV Logic Into New Function by @HashtagMarky in #9173
  • Typeless enums for OBJ_EVENT_GFX, Multichoice Ids, and Facility Classes by @grintoul1 in #9066
  • Removes unused files by @FosterProgramming in #9420
  • pr adding telekinesis ban list to species data by @Meister-anon in #9410
  • update poparraywithBattlers Arg to prevent warning by @Meister-anon in #9388
  • Minor dancer clean up/consolidation by @AlexOn1ine in #9417
  • Converted script_menu.h strings to COMPOUND_STRINGs by @fdeblasio in #9051
  • fix: battle message assert no longer calls for gText_Blank by @pkmnsnfrn in #9505
  • Clean up boolean comparisons by @Bassoonian in #9376
  • Fix enum usage by @Bassoonian in #9466
  • SetMoveEffect cleanup by @PhallenTree in #9514
    • Move Effects are now (mostly) not hardcoded to only work on the attacker/target.
  • Some bool cleanup by @FosterProgramming in #9539
  • Replace MAX_GIFT_RIBBONS with NUM_GIFT_RIBBONS by @FosterProgramming in #9542
  • Remove PARTNER_DUMMY need by adding additional difficulty when TESTING by @grintoul1 in #9562
  • GenConfig naming cleanup by @Pawkkie in #9529
  • fix(pokedex_plus_hgss): revert incorrect usage of species enum by @miriamlefae in #9570
  • Converts move animation hex numbers to decimal by @fdeblasio in #9172
  • Remove leftover DebugPrintfs by @mrgriffin in #8213
  • identified deprecated values by @Meister-anon in #9578
  • Damage roll speed wizardry by @Pawkkie in #9630
  • Removed STRINGID_PKMNISGLOWING by @fdeblasio in #9634
  • BattleCalcValues usage and rename BattleContext back to DamageContext by @AlexOn1ine in #9657
  • Convert move description variables into COMPOUND_STRINGs by @fdeblasio in #9667
  • Improve AI calc speed with affection hearts by @Pawkkie in #9709
  • Remove hex values from BattlePokemon by @AlexOn1ine in #9711
  • Slight restructure for Defog and Tidy Up by @AlexOn1ine in #9714
  • Learnset Helper: Remove unnecessary order-only dependencies by @mrgriffin in #9721
  • Fix spaces, spelling, and grammar by @fdeblasio in #9761
  • Remove reundant weather check in IsDamageMoveUnusable by @AlexOn1ine in #9755
  • Remove redundant SetBattlerAiData call in GetMostSuitableMonToSwitchInto by @AlexOn1ine in #9757
  • Use ctx in GetDefenderPartnerAbilitiesModifier by @Pawkkie in #9710
  • Isolate AI thinking time tests by @Pawkkie in #9779
  • Remove template abstraction for pokedex area map by @FosterProgramming in #9765
  • Clarify isFirstTurn usage with wrappers by @AlexOn1ine in #9786
  • Created macros for fist and foot animations by @fdeblasio in #9676
  • Clean mail-related duplicate code by @FosterProgramming in #9762
  • Remove relearner from party menu by @FosterProgramming in #9693
    • The P_PARTY_MOVE_RELEARNER config is not supported anymore, use P_SUMMARY_SCREEN_MOVE_RELEARNER for that functionality instead
  • Refactor rock climb and defog to be defined at all times by @BluSunrize in #9819
  • Clean up for eject item changes by @AlexOn1ine in #9832
  • Remove known failing for Blunder Policy/Darts interaction by @AlexOn1ine in #9841
  • Cleanup and tests for ow_abilities.c by @FosterProgramming in #9850
  • IsAnyTargetAffected and GetDynamicMoveType changes by @AlexOn1ine in #9898
  • Move wild encounter related config to wild_encounter config file by @FosterProgramming in #9879
    • The following configs have been moved to include/config/wild_encounter.h: B_FLAG_FORCE_DOUBLE_WILD, B_SMART_WILD_AI_FLAG, B_FLAG_NO_CATCHING, B_FLAG_NO_RUNNING, B_DOUBLE_WILD_CHANCE, B_DOUBLE_WILD_REQUIRE_2_MONS,B_WILD_NATURAL_ENEMIES, OW_FLAG_NO_ENCOUNTER
    • Their prefix has been changed from B_ or OW_ to WE_
  • Update maintainer list by @pkmnsnfrn in #9909
  • Fix stray tab in C file by @hedara90 in #9914
  • Remove two unused functions from src/event_object_movement.c by @FosterProgramming in #9911
  • Reduce battle heap usge outside main battle screen by @FosterProgramming in #9906
  • chore: removed old changelog file by @pkmnsnfrn in #9915
  • Mega Sol test adjustments by @AlexOn1ine in #9865
  • Rename follow up for Stat Change Refactor by @AlexOn1ine in #9928
  • Incoming and predicted move function cleanup by @Pawkkie in #9857
  • Minor Battle Struct clean up and script clean up by @AlexOn1ine in #9916
  • Refactor a more generic way to handle complex debug menu actions by @FosterProgramming in #9890
  • Integrate accuracy check into canceler by @AlexOn1ine in #9939
  • config/wild_encounter.h cleanup by @FosterProgramming in #9965
  • Small Dome updates by @AsparagusEduardo in #9989
  • Align outdated move descriptions with current mechanics by @Cle-bit in #10011
  • Further stat change refactor clean up by @AlexOn1ine in #10057
  • Give enum BattleTrainer more user friendly entry names by @grintoul1 in #10051
    • Key renames:
    • (1) gEnemyPartyCount -> gPartiesCount[B_TRAINER_OPPONENT_A];
    • (2) gPlayerPartyCount -> gPartiesCount[B_TRAINER_PLAYER];
    • (3) gEnemyParty -> gParties[B_TRAINER_OPPONENT_A];
    • (4) gPlayerParty -> gParties[B_TRAINER_PLAYER];
    • NEW:
    • Second trainer party count is now gPartiesCount[B_TRAINER_OPPONENT_B];
    • Second trainer party is now gParties[B_TRAINER_OPPONENT_B];
    • Multi partner party count is now gPartiesCount[B_TRAINER_PARTNER];
    • Multi partner party is now gParties[B_TRAINER_PARTNER];
  • Adds deprecation warnings to old party and party count globals by @grintoul1 in #9885
    • gEnemyParty and gEnemyPartyCount will be removed in 1.17.0
  • Align wind move flags with current mechanics by @Cle-bit in #10016
  • Describe compressed tilemaps with INCGFX by @FosterProgramming in #10036
    • most incbin of compressed tilemap replaced with incgfx that make the compression process more explicit
  • BoxPokemon: Less error-prone “static asserts” by @mrgriffin in #10071

🧪 Test Runner 🧪

Added

  • Smarter Doubles Fake Out AI + EFFECT_FIRST_TURN_ONLY tests by @grintoul1 in #8664
  • Add AI internal config support by @Pawkkie in #9460
  • Add Gen 2-3 and Gen 4 Encore timers by @Cle-bit in #9429
  • Adds ai calcs for Bolt Beak, Payback and Analytic by @AlexOn1ine in #9548
  • 12v12 capability by @grintoul1 in #8943
    • Key renames:
    • (1) gEnemyPartyCount -> gPartiesCount[B_TRAINER_1]; Later becomes gPartiesCount[B_TRAINER_OPPONENT_A]
    • (2) gPlayerPartyCount -> gPartiesCount[B_TRAINER_0]; Later becomes gPartiesCount[B_TRAINER_PLAYER]
    • (3) gEnemyParty -> gParties[B_TRAINER_1]; Later becomes gParties[B_TRAINER_OPPONENT_A]
    • (4) gPlayerParty -> gParties[B_TRAINER_0]; Later becomes gParties[B_TRAINER_PLAYER]
    • Temporary defines for gEnemyParty and gEnemyPartyCount will remain for one release cycle to allow downstream to integrate changes at their own pace. These come with deprecation messages.
    • Defines for gPlayerParty and gPlayerPartyCount will remain in place for the forseeable future, with deprecation warnings. These can continue to be used at users’ own risk.
    • Changes to struct Trainer reducing encounterMusic from 7 bits to 4, and mugshots from 6 bits to 3. Combined two separate u8 bitfields to a single u16 with 2 bits of padding available if needed by users
    • struct RecordedBattle has reduced playerGender to a 4-bit u8 to offset some space taken up by 4 parties. For developers using more than 2 player genders, this will require either adjusting or reverting to its previous form, which will require a reduction of the BATTLER_RECORD_SIZE define located above the struct.
    • Other restructuring of struct RecordedBattle undertaken to absorb some of the hit from BATTLER_RECORD_SIZE
  • Adds Ghost battle tests by @grintoul1 in #9805

Changed

  • AI scores Order Up stat boosts under Commander by @Cle-bit in #9107
  • Isolate AI thinking time tests by @Pawkkie in #9779
  • Remove known failing for Blunder Policy/Darts interaction by @AlexOn1ine in #9841
  • Mega Sol test adjustments by @AlexOn1ine in #9865
  • Add EFFECTIVENESS_SE for tests by @ghoulslash in #7360
  • Add test for Curse + Baton Pass interaction by @hedara90 in #10000
  • Set higher HP in Gem Damage calculation test fixing gen5 config result by @grintoul1 in #10017

Fixed

  • Adds tests for switch battle messages and switch AI bugfix by @grintoul1 in #9799
  • Fix failing Dream Eater test when target is behind Substitute (Gen 5+) by @Cle-bit in #9977
  • Fix AI partner incorrectly having flags set to Battler1 instead of Battler2 by @grintoul1 in #10006
  • Fix Electrify status move test expectations by @Cle-bit in #10021
  • Fix 12v12 partner party menu slot ptr by @grintoul1 in #10059
  • Fixed NoAliveMonsForPlayer for multibattles by @grintoul1 in #10039

📚 Documentation 📚

  • Add Instructions on how to build FRLG by default by @HunarPG in #9415
  • Add Species enum by @Bassoonian in #9507
  • Update maintainer list by @pkmnsnfrn in #9909
  • chore: removed old changelog file by @pkmnsnfrn in #9915
  • Updated expansion scope to include Champions by @pkmnsnfrn in #10054
  • updated DNS tutorial to be more clear by @pkmnsnfrn in #10067

👻 Sprites 👻

Changed

  • Various Follower Sprite Fixes from issue #5135 by @Liamjd14 in #9990

Fixed

  • Prevent reflection tag palette collisions by @moostoet in #9925
    • Fixed incorrect overworld reflection palettes when shiny and non-shiny Pokemon object events are loaded near water at the same time.

📦 Branch Synchronisation 📦

pret

  • 15th of May, 2026 in #9986
    • Add smol artifacts and tools to .gitignore by @AsparagusEduardo in pret#2236
    • Name values used by CompareMonSize by @rayrobdod in pret#2241
    • Extract GiveGiftRibbonToParty from file about size records by @rayrobdod in pret#2240
    • Implicit waitstate for special/specialvars by @mrgriffin in pret#2200
    • Added enum for IsMonDisobedient by @Mitsunee in pret#2212
    • Document gym leader match call texts by @GriffinRichards in pret#2231
    • BtlController_EmitTwoReturnValues cleanup by @AsparagusEduardo in pret#2140
    • Fix fakematch in DynamicPlaceholderTextUtil_Reset by @mike-goutokuji in pret#2258
    • Fix fakematch in AllocateBattleResources by @mike-goutokuji in pret#2261
    • Fix fakematchings regarding modulo by @mike-goutokuji in pret#2264
    • Remove stray dereference in union room chat by @mike-goutokuji in pret#2277
    • Add gBattleOutcome == B_OUTCOME_DREW to bugfix by @mike-goutokuji in pret#2238
    • INCGFX performance - define individual Make variables instead of appending to list by @ravepossum in pret#2291
    • Added more move animation macros by @fdeblasio in pret#2290
    • Fix line numbers in preproc diagnostics by @mrgriffin in pret#2294
    • Remove incorrectly added expansion tooling by @hedara90 in pret#2295

New Contributors

  • @HunarPG made their first contribution in #9415
  • @kevinvanrijn made their first contribution in #9525
  • @fisham33 made their first contribution in #9995
  • @Tacobell24 made their first contribution in #9974

Full Changelog: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.15.2...expansion/1.16.0