Merge branch '_RHH/master' into _RHH/upcoming

This commit is contained in:
Eduardo Quezada 2024-10-08 14:52:12 -03:00
commit ee00c251ae
26 changed files with 384 additions and 102 deletions

View File

@ -23,9 +23,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.9.2 (Latest release)
- 1.9.3 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.9.2
- 1.9.1
- 1.9.0
- 1.8.6

View File

@ -23,9 +23,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.9.2 (Latest release)
- 1.9.3 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.9.2
- 1.9.1
- 1.9.0
- 1.8.6

View File

@ -23,9 +23,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.9.2 (Latest release)
- 1.9.3 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.9.2
- 1.9.1
- 1.9.0
- 1.8.6

View File

@ -9,7 +9,7 @@ pokeemerald-expansion is a decomp hack base project based off pret's [pokeemeral
If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect.
You can phrase it as the following:
```
Based off RHH's pokeemerald-expansion 1.9.2 https://github.com/rh-hideout/pokeemerald-expansion/
Based off RHH's pokeemerald-expansion 1.9.3 https://github.com/rh-hideout/pokeemerald-expansion/
```
## What features are included?
@ -178,7 +178,7 @@ With this, you'll get the latest version of pokeemerald-expansion, plus a couple
- Check your current version.
- You can check in the debug menu's `Utilities -> Expansion Version` option.
- If the option is not available, you possibly have version 1.6.2 or older. In that case, please check the [changelogs](CHANGELOG.md) to determine your version based on the features available on your repository.
- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.9.2, use `git pull RHH expansion/1.9.2`).
- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.9.3, use `git pull RHH expansion/1.9.3`).
- ***Important:*** If you are several versions behind, we recommend updating one minor version at a time, skipping directly to the latest patch version (eg, 1.5.3 -> 1.6.2 -> 1.7.4 and so on)
- Alternatively, you can update to unreleased versions of the expansion.
- ***master (stable):*** It contains unreleased **bugfixes** that will come in the next patch version. To merge, use `git pull RHH master`.

View File

@ -5,20 +5,21 @@
- [Setting up WSL1 (Legacy Portion)](./legacy_WSL1_INSTALL.md)
- [Run documentation site locally](local_mdbook/index.md)
- [Ubuntu WSL1/WSL2](local_mdbook/ubuntu_WSL.md)
- [AI Flags](./ai_flags.md)
- [Tutorials]()
- [How to add new AI Flags](./ai_logic.md)
- [How to add new battle script commands/macros](./how_to_battle_script_command_macro.md)
- [How to add a new move](./how_to_new_move.md)
- [How to add a new trainer class](./how_to_trainer_class.md)
- [What are AI Flags?](tutorials/ai_flags.md)
- [How to add new AI Flags](tutorials/ai_logic.md)
- [How to add new battle script commands/macros](tutorials/how_to_battle_script_command_macro.md)
- [How to add a new move](tutorials/how_to_new_move.md)
- [How to add a new trainer class](tutorials/how_to_trainer_class.md)
- [How to add a new Pokémon]()
- [v1.9.x](./how_to_new_pokemon_1_9_0.md)
- [v1.8.x](./how_to_new_pokemon_1_8_0.md)
- [v1.7.x](./how_to_new_pokemon_1_7_0.md)
- [v1.6.x](./how_to_new_pokemon_1_6_0.md)
- [How to use the Testing System](./how_to_testing_system.md)
- [v1.9.x](tutorials/how_to_new_pokemon_1_9_0.md)
- [v1.8.x](tutorials/how_to_new_pokemon_1_8_0.md)
- [v1.7.x](tutorials/how_to_new_pokemon_1_7_0.md)
- [v1.6.x](tutorials/how_to_new_pokemon_1_6_0.md)
- [How to use the Testing System](tutorials/how_to_testing_system.md)
- [Changelog](./CHANGELOG.md)
- [1.9.x]()
- [Version 1.9.3](changelogs/1.9.x/1.9.3.md)
- [Version 1.9.2](changelogs/1.9.x/1.9.2.md)
- [Version 1.9.1](changelogs/1.9.x/1.9.1.md)
- [Version 1.9.0](changelogs/1.9.x/1.9.0.md)
@ -30,43 +31,36 @@
- [Version 1.8.2](changelogs/1.8.x/1.8.2.md)
- [Version 1.8.1](changelogs/1.8.x/1.8.1.md)
- [Version 1.8.0](changelogs/1.8.x/1.8.0.md)
- [1.7.x]()
- [Version 1.7.4](changelogs/1.7.x/1.7.4.md)
- [Version 1.7.3](changelogs/1.7.x/1.7.3.md)
- [Version 1.7.2](changelogs/1.7.x/1.7.2.md)
- [Version 1.7.1](changelogs/1.7.x/1.7.1.md)
- [Version 1.7.0](changelogs/1.7.x/1.7.0.md)
- [1.6.x]()
- [Version 1.6.2](changelogs/1.6.x/1.6.2.md)
- [Version 1.6.1](changelogs/1.6.x/1.6.1.md)
- [Version 1.6.0](changelogs/1.6.x/1.6.0.md)
- [1.5.x]()
- [Version 1.5.3](changelogs/1.5.x/1.5.3.md)
- [Version 1.5.2](changelogs/1.5.x/1.5.2.md)
- [Version 1.5.1](changelogs/1.5.x/1.5.1.md)
- [Version 1.5.0](changelogs/1.5.x/1.5.0.md)
- [1.4.x]()
- [Version 1.4.3](changelogs/1.4.x/1.4.3.md)
- [Version 1.4.2](changelogs/1.4.x/1.4.2.md)
- [Version 1.4.1](changelogs/1.4.x/1.4.1.md)
- [Version 1.4.0](changelogs/1.4.x/1.4.0.md)
- [1.3.x]()
- [Version 1.3.0](changelogs/1.3.x/1.3.0.md)
- [1.2.x]()
- [Version 1.2.0](changelogs/1.2.x/1.2.0.md)
- [1.1.x]()
- [Version 1.1.1](changelogs/1.1.x/1.1.1.md)
- [Version 1.1.0](changelogs/1.1.x/1.1.0.md)
- [1.0.x]()
- [Version 1.0.0](changelogs/1.0.x/1.0.0.md)
- [Pre-1.0.x]()
- [Version 0.9.0](changelogs/0.9.x/0.9.0.md)
- [Team Procedures]()
- [How to make an Expansion version](team_procedures/expansion_versions.md)

View File

@ -0,0 +1,106 @@
# Version 1.9.3
```md
## How to update
- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`.
- Once you have your remote set up, run the command `git pull RHH expansion/1.9.3`.
```
## 🌋 *REFACTORS* 🌋
📜 = Uses a migration script.
* Converted `settotemboost` command to `callnative` in [#5418](https://github.com/rh-hideout/pokeemerald-expansion/pull/5418)
* Removed unused `RESOURCE_FLAG_TRACED` in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430)
* Changed `MOVEEND_` defines to an enum in [#5449](https://github.com/rh-hideout/pokeemerald-expansion/pull/5449)
## ✨ Feature Branches ✨
### ***merrp/aarant's Followers***
#### Fixed
* Fixed Expansion-exclusive issue that caused trainers to not play their "pointing" animation when Followers were out during battle intro by @kittenchilly in [#5406](https://github.com/rh-hideout/pokeemerald-expansion/pull/5406)
## ⚔️ Battle General ⚔️ ##
### Changed
* Improved Mega evolution animation to make it a little smoother by @kleenxfeu in [#4816](https://github.com/rh-hideout/pokeemerald-expansion/pull/4816)
### Fixed
* Fixed affection check for exp multiplier by @Bassoonian in [#5421](https://github.com/rh-hideout/pokeemerald-expansion/pull/5421)
* Fixed multiple Primal Reversions not occurring if multiple battlers fainted on the previous turn by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430)
## 🤹 Moves 🤹
### Added
* Added missing `B_AFTER_YOU_TURN_ORDER` config by @PhallenTree in [#5400](https://github.com/rh-hideout/pokeemerald-expansion/pull/5400)
* Gen 5-7: After You fails if the order remains the same after using After You.
* Gen 8+: After You no longer fails if the turn order remains the same after using After You.
* Added missing `B_QUASH_TURN_ORDER` config by @PhallenTree in [#5400](https://github.com/rh-hideout/pokeemerald-expansion/pull/5400)
* Gen 5-7: If multiple Pokémon are affected by Quash, they move in the order they were affected by Quash.
* Gen 8+: If multiple Pokémon are affected by Quash, they now move fastest to slowest.
* Added missing updated `B_UPDATED_CONVERSION_2` by @wiz1989 in [#5453](https://github.com/rh-hideout/pokeemerald-expansion/pull/5453)
* Gens 2-4: Conversion 2 changes the user's type to a type that is resistant/immune to the last move the user was hit by.
* Gen 5+: Conversion 2 changes the user's type to a type that resists the last move used by the selected target.
### Fixed
* Fixed Scale Shot corrupting the move used on the next turn by @AlexOn1ine in [#5397](https://github.com/rh-hideout/pokeemerald-expansion/pull/5397)
* Fixed Growth's description not being updated based on `B_GROWTH_STAT_RAISE` by @nescioquid in [#5398](https://github.com/rh-hideout/pokeemerald-expansion/pull/5398)
* Fixed Quash not updating the battlers' actions correctly by @PhallenTree in [#5400](https://github.com/rh-hideout/pokeemerald-expansion/pull/5400)
* Cleanup by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430)
* Fixed Snatched Swallow not recovering HP if the Snatcher is not under the effect of Stockpile (should still heal) by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430)
* Fixed Counter users being damaged by Spiky Shield by @AlexOn1ine in [#5402](https://github.com/rh-hideout/pokeemerald-expansion/pull/5402)
* Fixed Electrified Dragon Darts not correctly avoiding targets with ability immunity (Volt Absorb, Motor Drive) by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430)
* Fixed Trace not activating a switch-in ability it traces (eg. Intimidate) by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430)
* Removed unused `RESOURCE_FLAG_TRACED`.
* Fixed recoil damage not triggering healing berries by @AlexOn1ine in [#5449](https://github.com/rh-hideout/pokeemerald-expansion/pull/5449)
* Also changed `MOVEEND_` defines to an enum.
## 🎭 Abilities 🎭
### Fixed
* Fixed Dancer activating even if the dance move is stolen by Snatch by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430)
* Fixed Ability popup when multiple Pokémon faint at the same time by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430)
* Multiple ability fixes by @PhallenTree in [#5447](https://github.com/rh-hideout/pokeemerald-expansion/pull/5447)
* Fixed Protosynthesis/Quark Drive sometimes not activating ability popup despite still gaining the boost as they should.
* Fixed Protosynthesis/Quark Drive activating on Transformed battlers.
* Fixed Protosynthesis activating despite Cloud Nine being present on the field.
* Fixed Quark Drive not activating if the battler is not grounded.
* Fixed Protosynthesis/Quark Drive/Beast Boost stat raise priority when multiple stats are tied for the highest one.
* Before: `Attack, Defense, Speed, Special Attack, Special Defense`.
* After: `Attack, Defense, Special Attack, Special Defense, Speed`.
## 🧶 Items 🧶
### Fixed
* Fixed Ogerpon's Masks not increasing the power of moves by 20% by @AlexOn1ine in [#5391](https://github.com/rh-hideout/pokeemerald-expansion/pull/5391)
* Fixed Jubilife Muffin not working by @kittenchilly in [#5444](https://github.com/rh-hideout/pokeemerald-expansion/pull/5444)
* Fixed duplicating flute bug in double battles by @ghoulslash in [#5436](https://github.com/rh-hideout/pokeemerald-expansion/pull/5436)
## 🤖 Battle AI 🤖
### Fixed
* Fixed Trick/Switcheroo giving AI score even if the opponent has no held item by @kittenchilly in [#5412](https://github.com/rh-hideout/pokeemerald-expansion/pull/5412)
* Various AI fixes in `AI_CalcMoveEffectScore` by @ghoulslash in [#5474](https://github.com/rh-hideout/pokeemerald-expansion/pull/5474)
* Missing break from `EFFECT_ABSORB` switch case.
* Using last used move for Mirror Move instead of predicted move.
## 🧹 Other Cleanup 🧹
### Changed
* Converted `settotemboost` command to `callnative` by @ghoulslash in [#5418](https://github.com/rh-hideout/pokeemerald-expansion/pull/5418)
* Removed trailing whitespace by @kittenchilly in [#5455](https://github.com/rh-hideout/pokeemerald-expansion/pull/5455)
* Removed binary match workaround for Rayquaza's tail in Sootopolis' cutscene by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5480
### Fixed
* Fixed potential uninitialized behavior in `ChangeOrderTargetAfterAttacker` by @AlexOn1ine in [#5393](https://github.com/rh-hideout/pokeemerald-expansion/pull/5393)
* Fallback on default BW map pop-up theme to reduce potential for error by @ravepossum in [#5392](https://github.com/rh-hideout/pokeemerald-expansion/pull/5392)
* Multiple typo fixes by @nescioquid in [#5398](https://github.com/rh-hideout/pokeemerald-expansion/pull/5398)
* VS Seeker documentation fix by @Bassoonian in [#5415](https://github.com/rh-hideout/pokeemerald-expansion/pull/5415)
## 🧪 Test Runner 🧪
### Added
* Added missing After You and Quash tests by @PhallenTree in [#5400](https://github.com/rh-hideout/pokeemerald-expansion/pull/5400)
### Changed
* Improved Tangling Hair test to make sure that chained effects do not overwrite relevant battler IDs by @ghoulslash in [#5423](https://github.com/rh-hideout/pokeemerald-expansion/pull/5423)
* Improved Full Heal item tests by @kittenchilly in [#5444](https://github.com/rh-hideout/pokeemerald-expansion/pull/5444)
### Fixed
* Fixed Wake-Up Slap test typo by @Pawkkie in [#5442](https://github.com/rh-hideout/pokeemerald-expansion/pull/5442)
* Fixed test assumption fail summary fields using more memory than needed by @AsparagusEduardo in [#5443](https://github.com/rh-hideout/pokeemerald-expansion/pull/5443)
* Fixed issue with `PASSES_RANDOMLY` in AI tests by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/5486
## New Contributors
* @nescioquid made their first contribution in [#5398](https://github.com/rh-hideout/pokeemerald-expansion/pull/5398)
* @kleenxfeu made their first contribution in [#4816](https://github.com/rh-hideout/pokeemerald-expansion/pull/4816)
* @wiz1989 made their first contribution in [#5453](https://github.com/rh-hideout/pokeemerald-expansion/pull/5453)
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.2...expansion/1.9.3
<!--Last PR: 5486-->
<!--Used to keep track of the last PR merged in case new ones come in before the changelog is done.-->

View File

@ -0,0 +1,187 @@
# How to make an Expansion version
*If you need instructions on how to release a new Expansion version, check out the enclosed instruction book. - AsparagusEduardo*
## 1.- Autogenerating a changelog for the `master` branch.
*Requires Write access to the repo.*
If the changelog you're making is for a minor version (Eg. 1.3.0), make sure to sync the `upcoming` branch with `master` before starting. Keep in mind that if there are unreleased changes in `master`, they should be made into a patch version released alongside minor version.
- Go to https://github.com/rh-hideout/pokeemerald-expansion/releases.
- Press the option "Draft a new release".
- Fill the following fields:
- In "Choose a tag", write the name of the tag for the desired release number.
- Eg. for version 1.2.3, write `expansion/1.2.3`. ***It cannot be an existing tag.***
- In "Target" choose `master`.
- In "Previous tag", select the latest version released.
- Press "Generate release notes". This will fill the description with a list of PRs made to the `master` branch since the lastest release.
- You may copy the contents to your editor of choice for step 2.
- If the changelog you're making is for a minor version (Eg. 1.3.0), proceed to step 1B, without closing the current window.
## 1B.- Autogenerating a changelog for the `upcoming` branch.
- Delete the text and title generated in the site.
- Change "Target" to `upcoming`.
- Press "Generate release notes". This will autogenerate the description with changes from both branches, as they've been merged.
- Use a comparison tool to remove any shared PRs from `master`. (I use [WinMerge](https://winmerge.org/) for this).
- Also remove any shared "New Contributor" entries.
- You should now have a text that only contains PRs made to `upcoming`.
## 2.- Sorting PRs in the changelog
- Copy the `docs/changelogs/template.md` file into a new file with the corresponding version for file and folder. Eg, for 1.2.3, you copy the file into `docs/changelogs/1.2.x/1.2.3.md`.
- Use the following Regex to adapt all PR links into the format currently used:
- Search
```
in https://github\.com/rh-hideout/pokeemerald-expansion/pull/(\d+)
```
- Replace
```
in [#$1](https://github.com/rh-hideout/pokeemerald-expansion/pull/$1)
```
- At the bottom of the template, replace the "____" in `<!--Last PR: ____-->` with the number of the last PR in your autogenerated changelog. This will help you keep track of any new PRs that are merged in before you're finished with your changelog.
- Sort the PRs by the categories present in the PR taking the following considerations:
- Keep the language of the changelog as newbie friendly as possible, explaining how the PR affects them.
- The format of the main line is the following:
```
{{Description of the change}} by @{{GitHub user}} in {{PR link}}
```
- If a PR reverted by a different PR, both should be removed.
- If the reverted PR's contents are then re-added it should be treated as if it's the first time added, with all the proper documentation needed.
- If a PR's content fits into multiple categories, like fixing two unrelated Ability and Move effects, you may duplicate the PR line and put it in both categories, changing the description of it accordingly.
- When refering to an element present in the code, always enclose them with ` to easily tell them apart. Eg:
- "Converted `settotemboost` command to `callnative`"
- "Changed `MOVEEND_` defines to an enum"
- A PR's technical changes that may conflict with user changes should have an entry in the "**REFACTORS**" section at the beginning of the changelog. Any of these changes that requires a migration script should also be marked as such by appending the corresponding emoji listed there. The section should include, but it's not limited to:
- Massive data format and/or structuring changes.
- Converting defines to enums.
- Renaming structs and/or their fields.
- Removing enums/defines/structs.
- For fixes:
- Once on their respective categories, if a PR fixes multiple issues at once in that category, you may make a sublist of those issues to properly detail each one and avoid just writing "Fixed multiple ability issues" or an overly verbose sentence for the PR.
- Try to fit the contents of a PR as a single sentence in past tense that.
- ***DON'T*** write something like "Fixed Parental Bond", as this doesn't explain *what* was fixed in Parental Bond. Instead, write something like "Fixed Parental Bond not affecting Snore".
- For new configs:
- Add the name of the config as part of the sentence, with subitems explaining what they do based on their generation if it's a generational config. Eg:
```
* Added missing `B_AFTER_YOU_TURN_ORDER` config by @PhallenTree in [#5400](https://github.com/rh-hideout/pokeemerald-expansion/pull/5400)
* Gen 5-7: After You fails if the order remains the same after using After You.
* Gen 8+: After You no longer fails if the turn order remains the same after using After You.
```
- For other new features:
- Explain how to use the feature completely, listing all its features as needed. For now, this is the only source of documentation for these features, so it's important to be thorough.
# 3.- Preparing the code for the new version
- Search for all non-changelog instances of the previous released version and update them to the newer version. As of writing, it's these files:
- `README.md`:
```diff
-Based off RHH's pokeemerald-expansion 1.2.2 https://github.com/rh-hideout/pokeemerald-expansion/
+Based off RHH's pokeemerald-expansion 1.2.3 https://github.com/rh-hideout/pokeemerald-expansion/
```
```diff
-- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.2.2, use `git pull RHH expansion/1.2.2`).
+- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.2.3, use `git pull RHH expansion/1.2.3`).
```
- `.github/ISSUE_TEMPLATE/*.yaml`
- Patch version:
```diff
options:
- 1.2.2 (Latest release)
+ 1.2.3 (Latest release)
master (default, unreleased bugfixes)
upcoming (Edge)
+ 1.2.2
1.2.1
1.2.0
```
- Minor Version:
```diff
options:
- 1.2.2 (Latest release)
+ 1.2.3 (Latest release)
master (default, unreleased bugfixes)
upcoming (Edge)
+ 1.2.2
1.2.1
1.2.0
- 1.1.6
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- pre-1.1.0
+ pre-1.2.0
```
- `docs/SUMMARY.md`:
- Patch version:
```diff
[Changelog](./CHANGELOG.md)
- [1.2.x]()
+ - [Version 1.2.3](changelogs/1.2.x/1.2.3.md)
- [Version 1.2.2](changelogs/1.2.x/1.2.2.md)
- [Version 1.2.1](changelogs/1.2.x/1.2.1.md)
- [Version 1.2.0](changelogs/1.2.x/1.2.0.md)
```
- Minor version:
```diff
[Changelog](./CHANGELOG.md)
+ - [1.3.x]()
+ - [Version 1.3.0](changelogs/1.3.x/1.3.0.md)
- [1.2.x]()
- [Version 1.2.2](changelogs/1.2.x/1.2.2.md)
- [Version 1.2.1](changelogs/1.2.x/1.2.1.md)
- [Version 1.2.0](changelogs/1.2.x/1.2.0.md)
```
- `include/constants/expansion.h`:
- The defines should already have the version we're targetting as part of the previous changelog process.
```diff
-// Last version: 1.2.2
+// Last version: 1.2.3
#define EXPANSION_VERSION_MAJOR 1
#define EXPANSION_VERSION_MINOR 2
#define EXPANSION_VERSION_PATCH 3
// FALSE if this this version of Expansion is not a tagged commit, i.e.
// it contains unreleased changes.
-#define EXPANSION_TAGGED_RELEASE FALSE
+#define EXPANSION_TAGGED_RELEASE TRUE
```
# 4.- Make a PR with the changes listed in Steps 2/3.
- Also post the changelog for feedback from contributors and maintainers.
- Once all feedback has been addresses, you may merge.
# 5.- Create the release on GitHub
- Copy the contents of your manual changelog into the description of your release.
- Modify the title to "Version {{version}}", eg. "Version 1.2.3"
- Be sure to have the "Set as the latest release" option set,
- Press "Publish Release".
- This will create a new tag in the repo that users can pull from like they can with branches.
# 6.- Post-release handling
- ***DON'T ACCEPT ANY NEW PRs YET.*** We have to prepare for the next cycle first.
- Go to `include/constants/expansion.h` and merge the following changes to the repo (PR or direct commit, doesn't matter much):
- Patch version:
```diff
// Last version: 1.2.3
#define EXPANSION_VERSION_MAJOR 1
#define EXPANSION_VERSION_MINOR 2
- #define EXPANSION_VERSION_PATCH 3
+ #define EXPANSION_VERSION_PATCH 4
// FALSE if this this version of Expansion is not a tagged commit, i.e.
// it contains unreleased changes.
-#define EXPANSION_TAGGED_RELEASE TRUE
+#define EXPANSION_TAGGED_RELEASE FALSE
```
With this, the repo is ready again to receive new PRs.
# Now you're ready to make the announcements!
- We tend to post on the following Discord Servers:
- [RH-Hideout](https://discord.gg/6CzjAG6GZk)
- Requires role to post in #announcements channel.
- [Team Aqua's Hideout](https://discord.gg/team-aqua-s-hideout-976252009114140682)
- Requires role to post in #romhacking-updates channel.
- [What a Hack!](https://discord.gg/whack-a-hack-292436944670162955)
- Announcements are done in Spanish, but not the changelogs themselves.
- Requires role to ping "Decompilaciones" role.
- [pret](https://discord.gg/R4c3FA95dP)
- [PokéCommunity](https://discord.gg/pokecommunity)
You can make a highlight of changes in the announcement itself, but it's not needed. (I also like using Discord emotes to highlight certain features during announcements, but gain, it's not needed).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 268 B

View File

@ -393,10 +393,6 @@ $(RAYQUAZAGFXDIR)/scene_2/bg.4bpp: %.4bpp: %.png
$(RAYQUAZAGFXDIR)/scene_3/rayquaza.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 124 -Wnum_tiles
$(RAYQUAZAGFXDIR)/scene_3/rayquaza_tail_fix.4bpp: $(RAYQUAZAGFXDIR)/scene_3/rayquaza_tail.4bpp
cp $< $@
head -c 12 /dev/zero >> $@
$(RAYQUAZAGFXDIR)/scene_4/streaks.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 19 -Wnum_tiles

View File

@ -1,7 +1,7 @@
#ifndef GUARD_CONSTANTS_EXPANSION_H
#define GUARD_CONSTANTS_EXPANSION_H
// 1.10.0
// Last version: 1.9.3
#define EXPANSION_VERSION_MAJOR 1
#define EXPANSION_VERSION_MINOR 10
#define EXPANSION_VERSION_PATCH 0

View File

@ -645,6 +645,15 @@ struct AILogLine
s16 score;
};
// Data which is updated by the test runner during a battle and needs to
// be reset between trials.
struct BattleTrialData
{
u8 lastActionTurn;
u8 queuedEvent;
u8 aiActionsPlayed[MAX_BATTLERS_COUNT];
};
struct BattleTestData
{
u8 stack[BATTLE_TEST_STACK_SIZE];
@ -676,20 +685,19 @@ struct BattleTestData
u8 battleRecordSourceLineOffsets[MAX_BATTLERS_COUNT][BATTLER_RECORD_SIZE];
u16 recordIndexes[MAX_BATTLERS_COUNT];
struct BattlerTurn battleRecordTurns[MAX_TURNS][MAX_BATTLERS_COUNT];
u8 lastActionTurn;
u8 queuedEventsCount;
u8 queueGroupType;
u8 queueGroupStart;
u8 queuedEvent;
struct QueuedEvent queuedEvents[MAX_QUEUED_EVENTS];
u8 expectedAiActionIndex[MAX_BATTLERS_COUNT];
u8 aiActionsPlayed[MAX_BATTLERS_COUNT];
struct ExpectedAIAction expectedAiActions[MAX_BATTLERS_COUNT][MAX_EXPECTED_ACTIONS];
struct ExpectedAiScore expectedAiScores[MAX_BATTLERS_COUNT][MAX_TURNS][MAX_AI_SCORE_COMPARISION_PER_TURN]; // Max 4 comparisions per turn
struct AILogLine aiLogLines[MAX_BATTLERS_COUNT][MAX_MON_MOVES][MAX_AI_LOG_LINES];
u8 aiLogPrintedForMove[MAX_BATTLERS_COUNT]; // Marks ai score log as printed for move, so the same log isn't displayed multiple times.
u16 flagId;
struct BattleTrialData trial;
};
struct BattleTestRunnerState

View File

@ -3348,6 +3348,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
case EFFECT_ABSORB:
if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT && effectiveness >= AI_EFFECTIVENESS_x1)
ADJUST_SCORE(DECENT_EFFECT);
break;
case EFFECT_EXPLOSION:
case EFFECT_MEMENTO:
if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] < 7)
@ -3362,7 +3363,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
break;
case EFFECT_MIRROR_MOVE:
if (predictedMove != MOVE_NONE)
return AI_CheckViability(battlerAtk, battlerDef, gLastMoves[battlerDef], score);
return AI_CheckViability(battlerAtk, battlerDef, predictedMove, score);
break;
case EFFECT_ATTACK_UP:
case EFFECT_ATTACK_UP_USER_ALLY:

View File

@ -24,9 +24,7 @@ const u32 gRaySceneTakesFlight_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaz
// Scene 3 (RAY_ANIM_DESCENDS)
const u32 gRaySceneDescends_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.lz");
// for some reason there are an extra 0xC bytes at the end of the original rayquaza_tail.4bpp, so in order to produce the correct lz,
// we have to cat the bytes at the end with a make rule. not sure why those bytes are there, it may have been a bug in Game Freak's software.
const u32 gRaySceneDescends_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail_fix.4bpp.lz");
const u32 gRaySceneDescends_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail.4bpp.lz");
const u32 gRaySceneDescends_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.lz");
const u32 gRaySceneDescends_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.4bpp.lz"); // uses pal 2 of gRaySceneDescends_Bg_Pal
const u32 gRaySceneDescends_Bg_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.gbapal.lz");

View File

@ -4672,7 +4672,7 @@ void ItemUseCB_Medicine(u8 taskId, TaskFunc task)
if (canHeal == TRUE)
{
if (hp == 0)
AnimatePartySlot(gPartyMenu.slotId, 1);
AnimatePartySlot(gPartyMenu.slotId, 1);
PartyMenuModifyHP(taskId, gPartyMenu.slotId, 1, GetMonData(mon, MON_DATA_HP) - hp, Task_DisplayHPRestoredMessage);
ResetHPTaskData(taskId, 0, hp);
return;

View File

@ -452,28 +452,18 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would
AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it can't deal damage to a mon with Wonder Guard 66% of the time")
{
u32 aiOmniscientFlag = 0;
PARAMETRIZE { aiOmniscientFlag = 0; }
PARAMETRIZE { aiOmniscientFlag = AI_FLAG_OMNISCIENT; }
PASSES_RANDOMLY(66, 100, RNG_AI_SWITCH_WONDER_GUARD);
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG);
ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST);
ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL);
ASSUME(gMovesInfo[MOVE_SHADOW_BALL].type == TYPE_GHOST);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiOmniscientFlag);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_SHEDINJA) { Moves(MOVE_TACKLE); }
OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); }
OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SHADOW_BALL); }
} WHEN {
if(aiOmniscientFlag == 0) {
TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_MOVE(opponent, MOVE_TACKLE); }
TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_SWITCH(opponent, 1); }
}
else {
TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_SWITCH(opponent, 1); }
}
TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_SWITCH(opponent, 1); }
}
}

View File

@ -559,19 +559,19 @@ void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, u32 ability)
s32 match;
struct QueuedEvent *event;
if (DATA.queuedEvent == DATA.queuedEventsCount)
if (DATA.trial.queuedEvent == DATA.queuedEventsCount)
return;
event = &DATA.queuedEvents[DATA.queuedEvent];
event = &DATA.queuedEvents[DATA.trial.queuedEvent];
switch (event->groupType)
{
case QUEUE_GROUP_NONE:
case QUEUE_GROUP_ONE_OF:
if (TryAbilityPopUp(DATA.queuedEvent, event->groupSize, battlerId, ability) != -1)
DATA.queuedEvent += event->groupSize;
if (TryAbilityPopUp(DATA.trial.queuedEvent, event->groupSize, battlerId, ability) != -1)
DATA.trial.queuedEvent += event->groupSize;
break;
case QUEUE_GROUP_NONE_OF:
queuedEvent = DATA.queuedEvent;
queuedEvent = DATA.trial.queuedEvent;
do
{
if ((match = TryAbilityPopUp(queuedEvent, event->groupSize, battlerId, ability)) != -1)
@ -590,7 +590,7 @@ void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, u32 ability)
continue;
if (TryAbilityPopUp(queuedEvent, event->groupSize, battlerId, ability) != -1)
DATA.queuedEvent = queuedEvent + event->groupSize;
DATA.trial.queuedEvent = queuedEvent + event->groupSize;
} while (FALSE);
break;
}
@ -622,19 +622,19 @@ void TestRunner_Battle_RecordAnimation(u32 animType, u32 animId)
s32 match;
struct QueuedEvent *event;
if (DATA.queuedEvent == DATA.queuedEventsCount)
if (DATA.trial.queuedEvent == DATA.queuedEventsCount)
return;
event = &DATA.queuedEvents[DATA.queuedEvent];
event = &DATA.queuedEvents[DATA.trial.queuedEvent];
switch (event->groupType)
{
case QUEUE_GROUP_NONE:
case QUEUE_GROUP_ONE_OF:
if (TryAnimation(DATA.queuedEvent, event->groupSize, animType, animId) != -1)
DATA.queuedEvent += event->groupSize;
if (TryAnimation(DATA.trial.queuedEvent, event->groupSize, animType, animId) != -1)
DATA.trial.queuedEvent += event->groupSize;
break;
case QUEUE_GROUP_NONE_OF:
queuedEvent = DATA.queuedEvent;
queuedEvent = DATA.trial.queuedEvent;
do
{
if ((match = TryAnimation(queuedEvent, event->groupSize, animType, animId)) != -1)
@ -653,7 +653,7 @@ void TestRunner_Battle_RecordAnimation(u32 animType, u32 animId)
continue;
if (TryAnimation(queuedEvent, event->groupSize, animType, animId) != -1)
DATA.queuedEvent = queuedEvent + event->groupSize;
DATA.trial.queuedEvent = queuedEvent + event->groupSize;
} while (FALSE);
break;
}
@ -712,19 +712,19 @@ void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP)
s32 match;
struct QueuedEvent *event;
if (DATA.queuedEvent == DATA.queuedEventsCount)
if (DATA.trial.queuedEvent == DATA.queuedEventsCount)
return;
event = &DATA.queuedEvents[DATA.queuedEvent];
event = &DATA.queuedEvents[DATA.trial.queuedEvent];
switch (event->groupType)
{
case QUEUE_GROUP_NONE:
case QUEUE_GROUP_ONE_OF:
if (TryHP(DATA.queuedEvent, event->groupSize, battlerId, oldHP, newHP) != -1)
DATA.queuedEvent += event->groupSize;
if (TryHP(DATA.trial.queuedEvent, event->groupSize, battlerId, oldHP, newHP) != -1)
DATA.trial.queuedEvent += event->groupSize;
break;
case QUEUE_GROUP_NONE_OF:
queuedEvent = DATA.queuedEvent;
queuedEvent = DATA.trial.queuedEvent;
do
{
if ((match = TryHP(queuedEvent, event->groupSize, battlerId, oldHP, newHP)) != -1)
@ -743,7 +743,7 @@ void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP)
continue;
if (TryHP(queuedEvent, event->groupSize, battlerId, oldHP, newHP) != -1)
DATA.queuedEvent = queuedEvent + event->groupSize;
DATA.trial.queuedEvent = queuedEvent + event->groupSize;
} while (FALSE);
break;
}
@ -774,7 +774,7 @@ static u32 CountAiExpectMoves(struct ExpectedAIAction *expectedAction, u32 battl
void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target)
{
const char *filename = gTestRunnerState.test->filename;
u32 id = DATA.aiActionsPlayed[battlerId];
u32 id = DATA.trial.aiActionsPlayed[battlerId];
struct ExpectedAIAction *expectedAction = &DATA.expectedAiActions[battlerId][id];
if (!expectedAction->actionSet)
@ -837,13 +837,13 @@ void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target)
}
// Turn passed, clear logs from the turn
ClearAiLog(battlerId);
DATA.aiActionsPlayed[battlerId]++;
DATA.trial.aiActionsPlayed[battlerId]++;
}
void TestRunner_Battle_CheckSwitch(u32 battlerId, u32 partyIndex)
{
const char *filename = gTestRunnerState.test->filename;
u32 id = DATA.aiActionsPlayed[battlerId];
u32 id = DATA.trial.aiActionsPlayed[battlerId];
struct ExpectedAIAction *expectedAction = &DATA.expectedAiActions[battlerId][id];
if (!expectedAction->actionSet)
@ -857,7 +857,7 @@ void TestRunner_Battle_CheckSwitch(u32 battlerId, u32 partyIndex)
if (expectedAction->target != partyIndex)
Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: Expected partyIndex %d, got %d", filename, expectedAction->sourceLine, expectedAction->target, partyIndex);
}
DATA.aiActionsPlayed[battlerId]++;
DATA.trial.aiActionsPlayed[battlerId]++;
}
void TestRunner_Battle_InvalidNoHPMon(u32 battlerId, u32 partyIndex)
@ -1021,7 +1021,7 @@ void TestRunner_Battle_CheckAiMoveScores(u32 battlerId)
}
// We need to make sure that the expected move has the best score. We have to rule out a situation where the expected move is used, but it has the same number of points as some other moves.
aiAction = &DATA.expectedAiActions[battlerId][DATA.aiActionsPlayed[battlerId]];
aiAction = &DATA.expectedAiActions[battlerId][DATA.trial.aiActionsPlayed[battlerId]];
if (aiAction->actionSet && !aiAction->pass)
{
s32 target = aiAction->target;
@ -1094,19 +1094,19 @@ void TestRunner_Battle_RecordExp(u32 battlerId, u32 oldExp, u32 newExp)
s32 match;
struct QueuedEvent *event;
if (DATA.queuedEvent == DATA.queuedEventsCount)
if (DATA.trial.queuedEvent == DATA.queuedEventsCount)
return;
event = &DATA.queuedEvents[DATA.queuedEvent];
event = &DATA.queuedEvents[DATA.trial.queuedEvent];
switch (event->groupType)
{
case QUEUE_GROUP_NONE:
case QUEUE_GROUP_ONE_OF:
if (TryExp(DATA.queuedEvent, event->groupSize, battlerId, oldExp, newExp) != -1)
DATA.queuedEvent += event->groupSize;
if (TryExp(DATA.trial.queuedEvent, event->groupSize, battlerId, oldExp, newExp) != -1)
DATA.trial.queuedEvent += event->groupSize;
break;
case QUEUE_GROUP_NONE_OF:
queuedEvent = DATA.queuedEvent;
queuedEvent = DATA.trial.queuedEvent;
do
{
if ((match = TryExp(queuedEvent, event->groupSize, battlerId, oldExp, newExp)) != -1)
@ -1125,7 +1125,7 @@ void TestRunner_Battle_RecordExp(u32 battlerId, u32 oldExp, u32 newExp)
continue;
if (TryExp(queuedEvent, event->groupSize, battlerId, oldExp, newExp) != -1)
DATA.queuedEvent = queuedEvent + event->groupSize;
DATA.trial.queuedEvent = queuedEvent + event->groupSize;
} while (FALSE);
break;
}
@ -1183,19 +1183,19 @@ void TestRunner_Battle_RecordMessage(const u8 *string)
s32 match;
struct QueuedEvent *event;
if (DATA.queuedEvent == DATA.queuedEventsCount)
if (DATA.trial.queuedEvent == DATA.queuedEventsCount)
return;
event = &DATA.queuedEvents[DATA.queuedEvent];
event = &DATA.queuedEvents[DATA.trial.queuedEvent];
switch (event->groupType)
{
case QUEUE_GROUP_NONE:
case QUEUE_GROUP_ONE_OF:
if (TryMessage(DATA.queuedEvent, event->groupSize, string) != -1)
DATA.queuedEvent += event->groupSize;
if (TryMessage(DATA.trial.queuedEvent, event->groupSize, string) != -1)
DATA.trial.queuedEvent += event->groupSize;
break;
case QUEUE_GROUP_NONE_OF:
queuedEvent = DATA.queuedEvent;
queuedEvent = DATA.trial.queuedEvent;
do
{
if ((match = TryMessage(queuedEvent, event->groupSize, string)) != -1)
@ -1214,7 +1214,7 @@ void TestRunner_Battle_RecordMessage(const u8 *string)
continue;
if (TryMessage(queuedEvent, event->groupSize, string) != -1)
DATA.queuedEvent = queuedEvent + event->groupSize;
DATA.trial.queuedEvent = queuedEvent + event->groupSize;
} while (FALSE);
break;
}
@ -1248,19 +1248,19 @@ void TestRunner_Battle_RecordStatus1(u32 battlerId, u32 status1)
s32 match;
struct QueuedEvent *event;
if (DATA.queuedEvent == DATA.queuedEventsCount)
if (DATA.trial.queuedEvent == DATA.queuedEventsCount)
return;
event = &DATA.queuedEvents[DATA.queuedEvent];
event = &DATA.queuedEvents[DATA.trial.queuedEvent];
switch (event->groupType)
{
case QUEUE_GROUP_NONE:
case QUEUE_GROUP_ONE_OF:
if (TryStatus(DATA.queuedEvent, event->groupSize, battlerId, status1) != -1)
DATA.queuedEvent += event->groupSize;
if (TryStatus(DATA.trial.queuedEvent, event->groupSize, battlerId, status1) != -1)
DATA.trial.queuedEvent += event->groupSize;
break;
case QUEUE_GROUP_NONE_OF:
queuedEvent = DATA.queuedEvent;
queuedEvent = DATA.trial.queuedEvent;
do
{
if ((match = TryStatus(queuedEvent, event->groupSize, battlerId, status1)) != -1)
@ -1279,7 +1279,7 @@ void TestRunner_Battle_RecordStatus1(u32 battlerId, u32 status1)
continue;
if (TryStatus(queuedEvent, event->groupSize, battlerId, status1) != -1)
DATA.queuedEvent = queuedEvent + event->groupSize;
DATA.trial.queuedEvent = queuedEvent + event->groupSize;
} while (FALSE);
break;
}
@ -1299,22 +1299,22 @@ void TestRunner_Battle_AfterLastTurn(void)
{
const struct BattleTest *test = GetBattleTest();
if (DATA.turns - 1 != DATA.lastActionTurn)
if (DATA.turns - 1 != DATA.trial.lastActionTurn)
{
const char *filename = gTestRunnerState.test->filename;
Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: %d TURNs specified, but %d ran", filename, SourceLine(0), DATA.turns, DATA.lastActionTurn + 1);
Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: %d TURNs specified, but %d ran", filename, SourceLine(0), DATA.turns, DATA.trial.lastActionTurn + 1);
}
while (DATA.queuedEvent < DATA.queuedEventsCount
&& DATA.queuedEvents[DATA.queuedEvent].groupType == QUEUE_GROUP_NONE_OF)
while (DATA.trial.queuedEvent < DATA.queuedEventsCount
&& DATA.queuedEvents[DATA.trial.queuedEvent].groupType == QUEUE_GROUP_NONE_OF)
{
DATA.queuedEvent += DATA.queuedEvents[DATA.queuedEvent].groupSize;
DATA.trial.queuedEvent += DATA.queuedEvents[DATA.trial.queuedEvent].groupSize;
}
if (DATA.queuedEvent != DATA.queuedEventsCount)
if (DATA.trial.queuedEvent != DATA.queuedEventsCount)
{
const char *filename = gTestRunnerState.test->filename;
u32 line = SourceLine(DATA.queuedEvents[DATA.queuedEvent].sourceLineOffset);
const char *macro = sEventTypeMacros[DATA.queuedEvents[DATA.queuedEvent].type];
u32 line = SourceLine(DATA.queuedEvents[DATA.trial.queuedEvent].sourceLineOffset);
const char *macro = sEventTypeMacros[DATA.queuedEvents[DATA.trial.queuedEvent].type];
Test_ExitWithResult(TEST_RESULT_FAIL, line, ":L%s:%d: Unmatched %s", filename, line, macro);
}
@ -1383,8 +1383,7 @@ static void CB2_BattleTest_NextTrial(void)
PrintTestName();
gTestRunnerState.result = TEST_RESULT_PASS;
DATA.recordedBattle.rngSeed = MakeRngValue(STATE->runTrial);
DATA.queuedEvent = 0;
DATA.lastActionTurn = 0;
memset(&DATA.trial, 0, sizeof(DATA.trial));
SetVariablesForRecordedBattle(&DATA.recordedBattle);
SetMainCallback2(CB2_InitBattle);
}
@ -1880,7 +1879,7 @@ void TestRunner_Battle_CheckBattleRecordActionType(u32 battlerId, u32 recordInde
if (DATA.battleRecordTypes[battlerId][recordIndex] != RECORDED_BYTE)
{
DATA.lastActionTurn = gBattleResults.battleTurnCounter;
DATA.trial.lastActionTurn = gBattleResults.battleTurnCounter;
if (actionType != DATA.battleRecordTypes[battlerId][recordIndex])
{
@ -1914,7 +1913,7 @@ void TestRunner_Battle_CheckBattleRecordActionType(u32 battlerId, u32 recordInde
}
else
{
if (DATA.lastActionTurn == gBattleResults.battleTurnCounter)
if (DATA.trial.lastActionTurn == gBattleResults.battleTurnCounter)
{
const char *filename = gTestRunnerState.test->filename;
Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: TURN %d incomplete", filename, SourceLine(0), gBattleResults.battleTurnCounter + 1);