## 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.
loadspritegfxhad an implicitdelay 1in it, if downstream animations depended on that, an explicitdelay 1needs 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
returninstead ofend2. end2scripts may still be used, but it's recommended to switch them toreturnscripts
- Changed end of turn scripts to use
- 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
RedrawListMenunow properly calls themoveCursorFunccallback 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
SwitchContextby @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 fromu8toenum PokeBallby @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
GenConfignaming 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.handsrc/data/decorations/icon.hwhen resolving conflicts - Run migration script
- Remove
src/data/decorations/description.handsrc/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
RedrawListMenunow properly calls themoveCursorFunccallback 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
FillSpriteRectperformance by @estellarc in #9813 - Move wild encounter related config to
wild_encounterconfig 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_orOW_toWE_
- The following configs have been moved to
- 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
gEnemyPartyandgEnemyPartyCountwill 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
FillSpriteRectwrongly 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.incthat is used ifpokemartis 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
- added a default shop list in
- Reworked event evolution
tryspecialevoby @FosterProgramming in #7573tryspecialevonow 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_RELEARNERfor that functionality instead
- The P_PARTY_MOVE_RELEARNER config is not supported anymore, use
- 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
DetermineFollowerNPCDirectionsame 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_SOUNDPROOFandB_UPROAR_TURNS.
- Gen 5+ Uproar was implemented. Uproar's implementation is split between the configs
- 12v12 capability by @grintoul1 in #8943
- Key renames:
- (1) gEnemyPartyCount ->
gPartiesCount[B_TRAINER_1]; Later becomesgPartiesCount[B_TRAINER_OPPONENT_A] - (2) gPlayerPartyCount ->
gPartiesCount[B_TRAINER_0]; Later becomesgPartiesCount[B_TRAINER_PLAYER] - (3) gEnemyParty ->
gParties[B_TRAINER_1]; Later becomesgParties[B_TRAINER_OPPONENT_A] - (4) gPlayerParty ->
gParties[B_TRAINER_0]; Later becomesgParties[B_TRAINER_PLAYER] - Temporary defines for
gEnemyPartyandgEnemyPartyCountwill remain for one release cycle to allow downstream to integrate changes at their own pace. These come with deprecation messages. - Defines for
gPlayerPartyandgPlayerPartyCountwill remain in place for the forseeable future, with deprecation warnings. These can continue to be used at users' own risk. - Changes to
struct TrainerreducingencounterMusicfrom 7 bits to 4, andmugshotsfrom 6 bits to 3. Combined two separateu8bitfields to a singleu16with 2 bits of padding available if needed by users struct RecordedBattlehas reducedplayerGenderto 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 theBATTLER_RECORD_SIZEdefine located above the struct.- Other restructuring of
struct RecordedBattleundertaken to absorb some of the hit fromBATTLER_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
returninstead ofend2. end2scripts may still be used, but it's recommended to switch them toreturnscripts
- Changed end of turn scripts to use
- 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_ButItFailedso visible-target accuracy misses print the avoided-attack message instead ofBut it failed!.
- Fixed status moves using
- 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.
loadspritegfxhad an implicitdelay 1in it, if downstream animations depended on that, an explicitdelay 1needs 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
🤖 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_SWITCHINGwill now consider switching to pass Wish to an injured teammate when they have a bad matchup and a better switch-in candidate exists.
- AI trainers with
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
SwitchContextby @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
ctxinGetDefenderPartnerAbilitiesModifierby @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
GenConfignaming 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
ctxinGetDefenderPartnerAbilitiesModifierby @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_RELEARNERfor that functionality instead
- The P_PARTY_MOVE_RELEARNER config is not supported anymore, use
- 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_encounterconfig 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_orOW_toWE_
- The following configs have been moved to
- 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
gEnemyPartyandgEnemyPartyCountwill 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 becomesgPartiesCount[B_TRAINER_OPPONENT_A] - (2) gPlayerPartyCount ->
gPartiesCount[B_TRAINER_0]; Later becomesgPartiesCount[B_TRAINER_PLAYER] - (3) gEnemyParty ->
gParties[B_TRAINER_1]; Later becomesgParties[B_TRAINER_OPPONENT_A] - (4) gPlayerParty ->
gParties[B_TRAINER_0]; Later becomesgParties[B_TRAINER_PLAYER] - Temporary defines for
gEnemyPartyandgEnemyPartyCountwill remain for one release cycle to allow downstream to integrate changes at their own pace. These come with deprecation messages. - Defines for
gPlayerPartyandgPlayerPartyCountwill remain in place for the forseeable future, with deprecation warnings. These can continue to be used at users' own risk. - Changes to
struct TrainerreducingencounterMusicfrom 7 bits to 4, andmugshotsfrom 6 bits to 3. Combined two separateu8bitfields to a singleu16with 2 bits of padding available if needed by users struct RecordedBattlehas reducedplayerGenderto 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 theBATTLER_RECORD_SIZEdefine located above the struct.- Other restructuring of
struct RecordedBattleundertaken to absorb some of the hit fromBATTLER_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
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_EmitTwoReturnValuescleanup 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: expansion/1.15.2...expansion/1.16.0