github rh-hideout/pokeemerald-expansion expansion/1.16.0
Expansion 1.16.0

4 hours ago
## 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

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

🗺️ 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

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

Changed

Fixed

⚔️ 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

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

🎭 Abilities 🎭

Changed

🧶 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

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

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 📚

👻 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

New Contributors

Full Changelog: expansion/1.15.2...expansion/1.16.0

Don't miss a new pokeemerald-expansion release

NewReleases is sending notifications on new releases.