Remove trailing whitespace - Master (#9011)

This commit is contained in:
Eduardo Quezada 2026-01-25 06:12:41 -03:00 committed by GitHub
parent e871913e22
commit 89da62b02d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
47 changed files with 189 additions and 192 deletions

View File

@ -7,7 +7,7 @@ body:
value: |
Please fill in all fields with as many details as possible.
Once your bug is posted, make sure you and your collaborators are added to `CREDITS.md` by [tagging the bot on GitHub](https://github.com/rh-hideout/pokeemerald-expansion/wiki/CREDITS.md-Frequently-Asked-Questions). EVERY contribution matters, even reporting bugs!
- type: textarea
- type: textarea
id: description
attributes:
label: Description
@ -24,13 +24,13 @@ body:
description: |
What exact steps can somebody else follow in order to recreate the issue on their own?
placeholder: |
Provide as much context as possible as to what was done to create the issue.
Provide as much context as possible as to what was done to create the issue.
validations:
required: true
- type: textarea
id: media
id: media
attributes:
label: Images / Video
label: Images / Video
description: |
Do you have images or videos to show the problem happen?
placeholder: |

View File

@ -24,13 +24,13 @@ body:
description: |
What exact steps can somebody else follow in order to recreate the issue on their own?
placeholder: |
Provide as much context as possible as to what was done to create the issue.
Provide as much context as possible as to what was done to create the issue.
validations:
required: true
required: true
- type: textarea
id: media
id: media
attributes:
label: Images / Video
label: Images / Video
description: |
Do you have images or videos to show the problem happen?
placeholder: |

View File

@ -15,13 +15,13 @@ body:
description: |
What is the current behavior? What behavior would you expect your feature request to provide? What other information can you provide to help your feature get implemented?
placeholder: |
Provide as much context as possible.
Provide as much context as possible.
validations:
required: true
- type: textarea
id: media
attributes:
label: Images / Video
label: Images / Video
description: |
Have other projects or games solved this problem? Do you have images or video to show this happening?
placeholder: |

View File

@ -24,13 +24,13 @@ body:
description: |
What exact steps can somebody else follow in order to recreate the issue on their own?
placeholder: |
Provide as much context as possible as to what was done to create the issue.
Provide as much context as possible as to what was done to create the issue.
validations:
required: false
required: false
- type: textarea
id: media
id: media
attributes:
label: Images / Video
label: Images / Video
description: |
Do you have images or videos to show the problem happen?
placeholder: |

View File

@ -6,7 +6,7 @@ All contributions are encouraged and valued. Please make sure to read the releva
## Bug Reports
We use [GitHub](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+is%3Aissue+is%3Aopen+label%3Abug) issues to track bugs.
We use [GitHub](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+is%3Aissue+is%3Aopen+label%3Abug) issues to track bugs.
### What should I do before making a bug report?
@ -15,7 +15,7 @@ We use [GitHub](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sor
### How do I submit a bug report?
If you run into an issue with the project, open an [issue](https://github.com/rh-hideout/pokeemerald-expansion/issues/new).
If you run into an issue with the project, open an [issue](https://github.com/rh-hideout/pokeemerald-expansion/issues/new).
The best bug reports have enough information that we won't have to contact you for more information. We welcome all efforts to improve pokeemerald-expansion, but would be very grateful if you completed as much of the checklist as possible in your bug report. This will help other contributiors fix your issue.
@ -31,7 +31,7 @@ The best bug reports have enough information that we won't have to contact you f
This section guides you through submitting a feature request for pokeemerald-expansion, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.
- We use [GitHub](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+is%3Aissue+is%3Aopen+label%3Afeature-request) issues to track feature requests.
- We use [GitHub](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+is%3Aissue+is%3Aopen+label%3Afeature-request) issues to track feature requests.
### What should I do before making a feature request?
@ -44,7 +44,7 @@ This section guides you through submitting a feature request for pokeemerald-exp
### How do I submit a feature request?
To request a feature to be added to the project, open a [feature request](https://github.com/rh-hideout/pokeemerald-expansion/issues/new).
To request a feature to be added to the project, open a [feature request](https://github.com/rh-hideout/pokeemerald-expansion/issues/new).
### What happens after I submit a feature request?
@ -108,11 +108,11 @@ git push --set-upstream origin newFeature
```
#### 7. Open Pull Request
Once your work is complete and pushed to the branch on Github, you can open a [pull request from your branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork), targeting the branch you've chosen from `pokeemerald-expansion`. Please fill out the pull request description as completely as possible.
Once your work is complete and pushed to the branch on Github, you can open a [pull request from your branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork), targeting the branch you've chosen from `pokeemerald-expansion`. Please fill out the pull request description as completely as possible.
### What happens after I submit a pull request?
A maintainer will then assign themselves as a reviewer of your pull request, and may provide feedback in the form of a PR review.
A maintainer will then assign themselves as a reviewer of your pull request, and may provide feedback in the form of a PR review.
Contributors are responsible for responding to and updating their branch by addressing the feedback in the review. Contributors are also responsible for making sure the branch passes the checklist at all times.

View File

@ -4,7 +4,7 @@
<!-- If you want to re-record or change these gifs, here are some notes that I used: https://files.catbox.moe/05001g.md -->
**`pokeemerald-expansion`** is a GBA ROM hack base that equips developers with a comprehensive toolkit for creating Pokémon ROM hacks. **`pokeemerald-expansion`** is built on top of [pret's `pokeemerald`](https://github.com/pret/pokeemerald) decompilation project. **It is not a playable Pokémon game on its own.**
**`pokeemerald-expansion`** is a GBA ROM hack base that equips developers with a comprehensive toolkit for creating Pokémon ROM hacks. **`pokeemerald-expansion`** is built on top of [pret's `pokeemerald`](https://github.com/pret/pokeemerald) decompilation project. **It is not a playable Pokémon game on its own.**
# [Features](FEATURES.md)
@ -30,7 +30,7 @@ Please consider [crediting all contributors](CREDITS.md) involved in the project
# [Getting Started](INSTALL.md)
❗❗ **Important**: Do not use GitHub's "Download Zip" option as it will not include commit history. This is necessary if you want to update or merge other feature branches.
❗❗ **Important**: Do not use GitHub's "Download Zip" option as it will not include commit history. This is necessary if you want to update or merge other feature branches.
If you're new to git and GitHub, [Team Aqua's Asset Repo](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/) has a [guide to forking and cloning the repository](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub). Then you can follow one of the following guides:

View File

@ -15,7 +15,7 @@
.macro voice_group label:req, starting_note
.align 2
.ifb \starting_note
.global voicegroup_\label
.global voicegroup_\label
voicegroup_\label:
.else
.set voicegroup_\label, . - \starting_note * 0xC

View File

@ -9,7 +9,7 @@ SOUND_BIN_DIR := sound
# Needs to recompile for B_NUM_LOW_HEALTH_BEEPS in battle.h
EXPANSION_BATTLE_CONFIG := include/config/battle.h
SPECIAL_OUTDIRS := $(MID_ASM_DIR) $(CRY_BIN_DIR)
SPECIAL_OUTDIRS := $(MID_ASM_DIR) $(CRY_BIN_DIR)
SPECIAL_OUTDIRS += $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/direct_sound_samples/phonemes $(SOUND_BIN_DIR)/direct_sound_samples/cries
$(shell mkdir -p $(SPECIAL_OUTDIRS) )
@ -25,11 +25,11 @@ $(CRY_BIN_DIR)/%.bin: $(CRY_SUBDIR)/%.wav
$(WAV2AGB) -b -c -l 1 --no-pad $< $@
# Uncompressed cries
$(CRY_BIN_DIR)/uncomp_%.bin: $(CRY_SUBDIR)/uncomp_%.aif
$(CRY_BIN_DIR)/uncomp_%.bin: $(CRY_SUBDIR)/uncomp_%.aif
$(AIF) $< $@
# Uncompressed sounds
$(SOUND_BIN_DIR)/%.bin: sound/%.wav
$(SOUND_BIN_DIR)/%.bin: sound/%.wav
$(WAV2AGB) -b $< $@
# For each line in midi.cfg, we do some trickery to convert it into a make rule for the `.mid` file described on the line

View File

@ -1984,15 +1984,15 @@ gBattleAnimMove_IceShard::
setalpha 12, 8
loadspritegfx ANIM_TAG_ICE_CRYSTALS
loadspritegfx ANIM_TAG_IMPACT
createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
delay 1
createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20
delay 1
createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
delay 1
createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20
delay 1
createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
delay 4
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, -31, 0, 7, RGB(0, 20, 31)
createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 25, 1
@ -19861,36 +19861,36 @@ TeraBlastBug:
waitforvisualfinish
monbg ANIM_DEF_PARTNER
call SetBugBg
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20
delay 1
createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 50, 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30
delay 1
createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1
@ -20994,7 +20994,7 @@ OrderUpStretchy:
playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET
waitforvisualfinish
end
gBattleAnimMove_MatchaGotcha::
loadspritegfx ANIM_TAG_POISON_BUBBLE
playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER

View File

@ -64,7 +64,7 @@ When describing a system/component in-depth, use block comment syntax.
```
When briefly describing a function or block of code, use a single-line comments
placed on its own line.
placed on its own line.
There should be a single space directly to the right of `//`.
```c
@ -404,7 +404,7 @@ All other configs should be off.
### Save Philosophy
Until [save migration](https://discord.com/channels/419213663107416084/1108733346864963746) is implemented, branches will only merged in if they do not forcefully break existing game saves.
Until [save migration](https://discord.com/channels/419213663107416084/1108733346864963746) is implemented, branches will only merged in if they do not forcefully break existing game saves.
When `pokemeerald-expansion` gets to a point where new functionality will require that we break saves, we will merge as many [save-breaking features](https://discord.com/channels/419213663107416084/1202774957776441427) together as possible, and increment the major version number of the project.

View File

@ -53,8 +53,8 @@
* Fixed text width for a lot of forms in HGSS Dex by @AsparagusEduardo in [#7035](https://github.com/rh-hideout/pokeemerald-expansion/pull/7035)
* Fixes Roamers not saving shininess by @i0brendan0 in [#7185](https://github.com/rh-hideout/pokeemerald-expansion/pull/7185)
* [FIX] Prevent caught Pokémon loss in NPC partner battles by @J2M2 in [#7177](https://github.com/rh-hideout/pokeemerald-expansion/pull/7177)
## ⚔️ Battle General ⚔️
### Changed
@ -72,8 +72,8 @@
<!-- Add any important details for the release changelog. Must be structed as bullet points. --->
<!--- Remove this section if not applicable. --->
* Chloroblast causing recoil damage even if the move fails to connect by @LinathanZel in #7007
* [DRAFT] Fix Normalize not boosting Normal type moves if they were already Normal type by @i0brendan0 in [#7060](https://github.com/rh-hideout/pokeemerald-expansion/pull/7060)
* Fixes freeze during a 1v2 double battle by @AlexOn1ine in [#7075](https://github.com/rh-hideout/pokeemerald-expansion/pull/7075)
* Fixes Pursuit potentially causing both battlers to switch into the same mon by @PhallenTree in [#7084](https://github.com/rh-hideout/pokeemerald-expansion/pull/7084)
@ -93,8 +93,8 @@
## 🤹 Moves 🤹
### Changed
* Fix ScaryFace anim for Bitter Malice by @TLM-PsIQ in [#6476](https://github.com/rh-hideout/pokeemerald-expansion/pull/6476)
### Fixed
* Fix savage spin out spider web template by @ghoulslash in [#7137](https://github.com/rh-hideout/pokeemerald-expansion/pull/7137)

View File

@ -32,7 +32,7 @@
* Add new actions to Debug Menu by @FosterProgramming in [#7837](https://github.com/rh-hideout/pokeemerald-expansion/pull/7837)
- Adds an action to change a Pokemon ability in the party side of the Debug Menu
- Adds an action to set the friendship of a Pokemon in the party side of the Debug Menu
* Display TM/HM's move name in the debug menu by @estellarc in [#7994](https://github.com/rh-hideout/pokeemerald-expansion/pull/7994)
### Changed

View File

@ -121,7 +121,7 @@
* Fixed message for switch out moves by @kittenchilly in [#5258](https://github.com/rh-hideout/pokeemerald-expansion/pull/5258)
* Fixed Ice Fang's descriptions using the opposite of what they're supposed to do based on `B_USE_FROSTBITE` by @laserXdolphin in [#5273](https://github.com/rh-hideout/pokeemerald-expansion/pull/5273)
* Fixes to Instruct by @PhallenTree in [#5262](https://github.com/rh-hideout/pokeemerald-expansion/pull/5262)
* Fixed Instruct bypassing AtkCanceler checks (Instruct allowed the target to act while asleep, flinched, etc.) and its interaction with First Turn Only moves (Fake Out, First Impression, Mat Block).
* Fixed Instruct bypassing AtkCanceler checks (Instruct allowed the target to act while asleep, flinched, etc.) and its interaction with First Turn Only moves (Fake Out, First Impression, Mat Block).
* Fixed Instruct's animation using the attacker and target of the called move.
* Fixed Scale Shot's effect not activating if the opponent fainted before all hits finished by @AlexOn1ine in [#5292](https://github.com/rh-hideout/pokeemerald-expansion/pull/5292)
* Fixed Round not preserving turn order for non-Round users if there's a switch out at the beginning of the turn by @AlexOn1ine in [#5292](https://github.com/rh-hideout/pokeemerald-expansion/pull/5292)

View File

@ -4,7 +4,7 @@
## 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".
@ -178,7 +178,7 @@ With this, the repo is ready again to receive new PRs.
- 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)
- [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)

View File

@ -18,7 +18,7 @@ Contributors are asked to make sure tests pass locally, but maintainers should a
## Have you verified that the functionality works in game without any problems?
If functionality cannot be verified with an automated test, proof of an in game test is required. Do not be afraid to reach out to the contributor or the community to make sure something works in game as it should.
## If the branch ports behavior from another Pokémon game, have you verified that the behavior functions as faithfully as possible?
## If the branch ports behavior from another Pokémon game, have you verified that the behavior functions as faithfully as possible?
We have always tried to make sure we can mimic the original functionality as closely as possible so as to avoid confusion with users and players. Do not be afraid to ask the contributor / community for proof if you cannot personally verify.
## If the branch is a popular feature within the community with an established feature branch, is this using that established branch as a base?
@ -28,7 +28,7 @@ There are situations where this should and should not happen, and should be disc
Not everything needs a migration script - if you're unsure, start a discussion.
## Should new functionality introduced by this branch be gated behind a config?
We don't have a strict definition of when configs should be used, but you can start with
We don't have a strict definition of when configs should be used, but you can start with
> Why SHOULDN'T this be a config?

View File

@ -13,10 +13,10 @@ PRs with the Github label [`type: big feature`](https://github.com/rh-hideout/po
### Merge Freeze (14 days to the next Minor Release)
Pull Requests that **DO NOT** have one of the following Github labels:
- [`bugfix`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3Abugfix)
- [`type: cleanup`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3A%22type%3A+cleanup%22+)
- [`type: credits`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3A%22type%3A+credits%22+)
- [`type: documentation`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3A%22type%3A+documentation%22+)
- [`bugfix`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3Abugfix)
- [`type: cleanup`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3A%22type%3A+cleanup%22+)
- [`type: credits`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3A%22type%3A+credits%22+)
- [`type: documentation`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3A%22type%3A+documentation%22+)
- [`category: battle-tests`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22category%3A+battle-tests%22)
will NOT be merged until after the next Minor Release.
@ -36,7 +36,7 @@ will NOT be merged until after the next Minor Release.
## What is a "Big Feature"?
* If the original owner of the PR thinks a feature should be labeled a Big Feature, it is, no questions asked
* If a reviewer thinks a PR is a Big Feature, then it is
* If the two disagree, it can be discussed in a PR thread, and can ultimately be resolved with a Maintainer vote.
* If the two disagree, it can be discussed in a PR thread, and can ultimately be resolved with a Maintainer vote.
### How To Identify a Big Feature
* **Big diffs**: It's easy for something to go unnoticed in review when it's a tiny part of a massive diff.

View File

@ -25,7 +25,7 @@ A pull request meets the scope criteria if:
- Has appeared in a Showdown supported title
- Is mechanically / functionally unique from existing items (ie. not Relic Crown, Silver Leaf), with the exception of items with in-battle functionality (ie. Lumiose Gallette)
- Do not ONLY exist for story related purpose (ie. Jade Orb)
5. **SS Gimmicks**: Adds Gimmicks that have appeared in a Showdown-supported title (Dynamax, Mega Evolution, etc.)
5. **SS Gimmicks**: Adds Gimmicks that have appeared in a Showdown-supported title (Dynamax, Mega Evolution, etc.)
6. **SS Battle Types**: Adds Special Battle Types that have appeared in a Showdown-supported title (Triple battles, etc.)
7. **SS Battle Mechanics**: Adds mechanical battle changes that have appeared in a Showdown-supported title, and allow developers to choose which generation suits them where applicable
8. **Battle AI Behaviour**: Improvements towards the capability of a human competitive player, and unique or interesting behaviours otherwise

View File

@ -29,13 +29,13 @@ This section lists all of expansions AI Flags and briefly describes the effec
## Composite AI Flags
Expansion has a few "composite" AI flags. This means that these flags have no unique functionality themselves, and can instead be thought of as groups of other flags that are all enabled when this flag is enabled. The idea behind these flags is that if you don't care to manage the detailed behaviour of a particular trainer, you can use these as a baseline instead, and expansion will keep them updated for you.
Expansion has a few "composite" AI flags. This means that these flags have no unique functionality themselves, and can instead be thought of as groups of other flags that are all enabled when this flag is enabled. The idea behind these flags is that if you don't care to manage the detailed behaviour of a particular trainer, you can use these as a baseline instead, and expansion will keep them updated for you.
`AI_FLAG_BASIC_TRAINER` is expansion's version of generic, normal AI behaviour. It includes `AI_FLAG_CHECK_BAD_MOVE` (don't use bad moves), `AI_FLAG_TRY_TO_FAINT` (faint the player where possible), and `AI_FLAG_CHECK_VIABILITY` (choose the most effective move to use in the current context). Trainers with this flag will still be smarter than they are in vanilla as there have been dramatic improvements made to move selection, but not incredibly so. Trainers with this flag should feel like normal trainers. In general we recommend these three flags be used in all cases, unless you specifically want a trainer who makes obvious mistakes in battle.
`AI_FLAG_SMART_TRAINER` is expansion's version of a "smart AI". It includes everything in `AI_FLAG_BASIC_TRAINER` along with `AI_FLAG_SMART_SWITCHING` (make smart decisions about when to switch), `AI_FLAG_SMART_MON_CHOICES` (make smart decisions about what mon to send in after a switch / KO), `AI_FLAG_OMNISCIENT` (awareness of what moves, items, and abilities the player's mons have to better inform decisions), and `AI_FLAG_SMART_TERA` (make smart decisions about when to terastalize). Expansion will keep this updated to represent the most objectively intelligent behaviour our flags are capable of producing.
`AI_FLAG_PREDICTION` will enable all of the prediction flags at once, so the AI can perform as well as possible. It is best paired with the flags in `AI_FLAG_SMART_TRAINER` for optimal behaviour. This currently includes `AI_FLAG_PREDICT_SWITCH` and `AI_FLAG_PREDICT_INCOMING_MON`, but will likely be expanded in the future.
`AI_FLAG_PREDICTION` will enable all of the prediction flags at once, so the AI can perform as well as possible. It is best paired with the flags in `AI_FLAG_SMART_TRAINER` for optimal behaviour. This currently includes `AI_FLAG_PREDICT_SWITCH` and `AI_FLAG_PREDICT_INCOMING_MON`, but will likely be expanded in the future.
Expansion has LOADS of flags, which will be covered in the rest of this guide. If you don't want to engage with detailed trainer AI tuning though, you can just use these two composite flags, and trust that expansion will keep their contents updated to always represent the most standard and the smartest behaviour we can.

View File

@ -12,7 +12,7 @@ If you intend to use vanilla maps and have not already edited them, revert commi
If you _have_ edited vanilla maps, the merge conflicts from reverting that commit will cause problems. If you are using vanilla maps, manually copy some of the tileset changes, `.pal`, and `.pla` files in your branch, and begin rebuilding your metatiles to have windows use the palettes that have a `.pla` for light blending the correct color slots. [Triple-layer metatiles](https://github.com/pret/pokeemerald/wiki/Triple-layer-metatiles) are highly recommended.
WARNING: [As per issue #7034](https://github.com/rh-hideout/pokeemerald-expansion/issues/7034) if you follow this tutorial reverting the previously mentioned commit to use the updated palettes in the Hoenn maps and *after* that you try to follow the [Triple-layer metatiles tutorial](https://github.com/pret/pokeemerald/wiki/Triple-layer-metatiles), you'll encounter an issue when running the script to update old tilesets to support triple-layer metatiles.
WARNING: [As per issue #7034](https://github.com/rh-hideout/pokeemerald-expansion/issues/7034) if you follow this tutorial reverting the previously mentioned commit to use the updated palettes in the Hoenn maps and *after* that you try to follow the [Triple-layer metatiles tutorial](https://github.com/pret/pokeemerald/wiki/Triple-layer-metatiles), you'll encounter an issue when running the script to update old tilesets to support triple-layer metatiles.
Follow the band-aid fix proposed in that issue after this tutorial but before following the triple-layer metatiles tutorial if you want everythign to work properly with light-blended palettes and triple-layer metatiles together.
You will also want to add the lighting object events from that commit.

View File

@ -293,7 +293,7 @@ MysteryGift_EventScript_Celebi::
end
```
Walking through this, it's clear we'll need some more scripting. We first check if Celebi's corresponding Mystery Gift flag has been set, and if it has, we need to tell the player they've already redeemed it and can't again. If they haven't though, we get ourselves setup for the givemon, do the givemon, and set the mystery gift flag. Then we need soem more generic handling to prompt nicknaming and some fanfare.
Walking through this, it's clear we'll need some more scripting. We first check if Celebi's corresponding Mystery Gift flag has been set, and if it has, we need to tell the player they've already redeemed it and can't again. If they haven't though, we get ourselves setup for the givemon, do the givemon, and set the mystery gift flag. Then we need soem more generic handling to prompt nicknaming and some fanfare.
Two things, then; an event script to handle the case where a mystery gift mon has already been redeemed, and an event script to handle when a mystery gift mon has successfully been received.
@ -327,13 +327,13 @@ Almost done! Just need to handle the specific nicknaming scripts, and then add a
MysteryGift_EventScript_NicknamePartyMon::
msgbox gText_NicknameThisPokemon, MSGBOX_YESNO
goto_if_eq VAR_RESULT, NO, MysteryGift_EventScript_Exit
call Common_EventScript_GetGiftMonPartySlot
call Common_EventScript_NameReceivedPartyMon
call Common_EventScript_GetGiftMonPartySlot
call Common_EventScript_NameReceivedPartyMon
goto MysteryGift_EventScript_Exit
end
MysteryGift_EventScript_NicknamePCMon::
msgbox gText_NicknameThisPokemon, MSGBOX_YESNO
msgbox gText_NicknameThisPokemon, MSGBOX_YESNO
goto_if_eq VAR_RESULT, NO, MysteryGift_EventScript_TransferredToPC
call Common_EventScript_NameReceivedBoxMon
call Common_EventScript_TransferredToPC

View File

@ -1,5 +1,5 @@
# How to Use Follower NPCs
*Written by Bivurnum*
*Written by Bivurnum*
*gif by ghoulslash*
![follower-npc](img/follower_npc/follower-npc.gif)
@ -11,22 +11,22 @@ The configs for follower NPCs can be found in [include/config/follower_npc.h](ht
* `FNPC_FLAG_HEAL_AFTER_FOLLOWER_BATTLE`: The player's party can be automatically healed after every partner battle. Set it to a flag to toggle it on/off with scripts, or set it to `FNPC_ALWAYS` to have it happen every time.
* `FNPC_FLAG_PARTNER_WILD_BATTLES`: The battle partner can join the player for wild battles. Set it to a flag to toggle it on/off with scripts, or set it to `FNPC_ALWAYS` to have it happen every time.
* `FNPC_NPC_FOLLOWER_WILD_BATTLE_VS_2`: Wild battles with a battle partner default to two wild Pokémon appearing. You can set this to `FALSE` to make only one wild Pokémon appear.
* `FNPC_NPC_FOLLOWER_PARTY_PREVIEW`: By default, a preview of the player's and partner's teams will be shown at the start of every trainer battle. Set this to `FALSE` to disable this feature.
* `FNPC_NPC_FOLLOWER_PARTY_PREVIEW`: By default, a preview of the player's and partner's teams will be shown at the start of every trainer battle. Set this to `FALSE` to disable this feature.
* `FNPC_FACE_NPC_FOLLOWER_ON_DOOR_EXIT`: If `TRUE` the player will turn to face the follower when they exit a doorway.
* `FNPC_NPC_FOLLOWER_SHOW_AFTER_LEAVE_ROUTE`: If `TRUE` the follower will walk out of the player automatically after using Fly, Teleport, or Escape Rope.
## Set the Follower
The `setfollowernpc` macro will turn the specified object into an NPC follower. It requires the object id, the [follower flags](#follower-flags), and optionally a custom script and a [battle partner](#battle-partner). If you do not include a custom script name (or you set it to `0`), the NPC follower will default to their normal interaction script. If there is a follower Pokémon present, it will be returned to its Pokeball until the NPC follower is destroyed.
Here's an example:
`setfollowernpc 3, FNPC_ALL, MyScript_Eventscript_CustomFollowerScript, PARTNER_STEVEN`
Here's an example:
`setfollowernpc 3, FNPC_ALL, MyScript_Eventscript_CustomFollowerScript, PARTNER_STEVEN`
This would turn object number 3 on the current map into an NPC follower, give them access to all following behaviors, run that custom script when the player interacts with them, and adds the Steven battle partner to the follower ([more on this later](#battle-partner)).
The object ***MUST*** have an event flag or the NPC follower will not be created!
## Create a Follower
The `createfollowernpc` macro will create a new follower without needing to convert an existing NPC. It works similarly to `setfollowernpc`, but instead of providing an object id, you give it a GFX id. For example, if you wanted to create a follower with the May sprite, you could do something like this:
`createfollowernpc OBJ_EVENT_GFX_RIVAL_MAY_NORMAL, FNPC_ALL, EventScript_MayFollow`
The `createfollowernpc` macro will create a new follower without needing to convert an existing NPC. It works similarly to `setfollowernpc`, but instead of providing an object id, you give it a GFX id. For example, if you wanted to create a follower with the May sprite, you could do something like this:
`createfollowernpc OBJ_EVENT_GFX_RIVAL_MAY_NORMAL, FNPC_ALL, EventScript_MayFollow`
The created follower NPC will initially be invisible until the player takes a step.
## Follower Flags

View File

@ -907,7 +907,7 @@ _NOTE: At the top of this file, you will probably see this warning:_
// DO NOT MODIFY THIS FILE! It is auto-generated from tools/learnset_helpers/teachable.py`
//
```
From version 1.9 onwards, pokeemerald-expansion includes a tool called the learnset helper, which aims to automate the generation of valid teachable moves. At the time of writing, this tool only supports generating TM and Tutor learnsets. However, in the future it may be expanded to deal with level up learnsets and egg moves.
From version 1.9 onwards, pokeemerald-expansion includes a tool called the learnset helper, which aims to automate the generation of valid teachable moves. At the time of writing, this tool only supports generating TM and Tutor learnsets. However, in the future it may be expanded to deal with level up learnsets and egg moves.
Ignore the warning shown above the first time you're adding your teachable moves (as otherwise the compiler will complain about the array not existing), but in the future (if you're using the learnset helper) simply edit what teachable moves your Pokémon can learn in one of the JSON files found in `tools/learnset_helpers/porymoves_files`. It doesn't really matter which one you add your new Pokémon to, as the tool pulls from all of the files in this folder.

View File

@ -47,7 +47,7 @@ enum TrainerSlideType
{
TRAINER_SLIDE_BEFORE_FIRST_TURN,
TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT,
+ TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT, // Each Trainer Slide has a unqiue id.
+ TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT, // Each Trainer Slide has a unqiue id.
TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT,
TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE,
TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN,
@ -82,7 +82,7 @@ bool32 IsTrainerSlideInitialized(enum TrainerSlideType);
```diff
return IsTrainerSlideInitialized(slideId);
}
+static bool32 ShouldRunTrainerSlideEnemyLandsFirstCriticalHit(enum TrainerSlideType slideId)
+{
+ return IsTrainerSlideInitialized(slideId);
@ -110,7 +110,7 @@ The function that determines if a Slide should play has different function for m
```diff
InitalizeTrainerSlide(slideId);
}
+void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32 target)
+{
+ enum TrainerSlideType slideId = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT;
@ -149,10 +149,10 @@ In `BattleTurnPassed`, most Trainer Slides are checked to see if they should run
```diff
{
PrepareStringBattle(STRINGID_CRITICALHIT, gBattlerAttacker);
+ TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(gBattlerTarget);
TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(gBattlerTarget);
gBattleCommunication[MSG_DISPLAY] = 1;
```
@ -162,7 +162,7 @@ The actual usage of `TryInitializeTrainerSlideEnemyLandsFirstCriticalHit` is add
```diff
}
}
+SINGLE_BATTLE_TEST("Trainer Slide: Enemy Lands First Critical Hit")
+{
+ gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT;

View File

@ -292,7 +292,7 @@ Adds the species to the player's, player partner's, opponent A's, or opponent B'
Pokemon can be customised as per the guidance for `PLAYER(species)` and `OPPONENT(species)`.
The functions assign the Pokémon to the party of the trainer at `B_POSITION_PLAYER_LEFT`, `B_POSITION_PLAYER_RIGHT`, `B_POSITION_OPPONENT_LEFT`, and `B_POSITION_OPPONENT_RIGHT`, respectively.
`MULTI_PLAYER(species)` and `MULTI_OPPONENT_A(species)` set Pokémon starting at party index 0, while `MULTI_PARTNER(species)` and `MULTI_OPPONENT_B(species)` set Pokémon starting at party index 3.
For `ONE_VS_TWO` tests, `MULTI_PLAYER(species)` must be used for all player-side Pokémon, and for `TWO_VS_ONE` tests, `MULTI_OPPONENT_A(species)` must be used for all opponent-side Pokémon.
For `ONE_VS_TWO` tests, `MULTI_PLAYER(species)` must be used for all player-side Pokémon, and for `TWO_VS_ONE` tests, `MULTI_OPPONENT_A(species)` must be used for all opponent-side Pokémon.
All `MULTI_PLAYER(species)` Pokémon must be set before any `MULTI_PARTNER(species)` Pokémon, and all `MULTI_OPPONENT_A(species)` must be set before any `MULTI_OPPONENT_B(species)` Pokémon, else Pokémon will be set in the incorrect parties in the test.
**Note where a side in a test has two trainers, the test setup manages the assigning of correct multi-party orders, therefore when using functions such as SEND_OUT, Player and Opponent A Pokémon may be referenced using indexes 0, 1, and 2, and Player's Partner and Opponent B Pokémon may be referenced using indexes 3, 4, and 5.**

View File

@ -10,7 +10,7 @@
- [So what are the `#define` options in `overworld.h`?](#so-what-are-the-define-options-in-overworldh)
- [Examples](#examples)
## What is the Time-Based Encounters feature?
## What is the Time-Based Encounters feature?
Time-Based Encounters lets you pick which Pokémon appear based on the in-game clock, per route!
Gen 2 had this feature, and Gen 4 brought it back- for instance, in Sinnoh's Route 201 you have a higher chance of catching a Bidoof than a Starly at night.
@ -810,4 +810,4 @@ python3 migration_scripts/add_time_based_encounters.py --copy
},
]
```
As you can see, the group `gRoute101` and all its encounters were copied into groups that correspond with the four vanilla times of day (Morning/Day/Evening/Night).
As you can see, the group `gRoute101` and all its encounters were copied into groups that correspond with the four vanilla times of day (Morning/Day/Evening/Night).

View File

@ -1,13 +1,13 @@
# `pokemerald-expansion` Vs. Seeker
# `pokemerald-expansion` Vs. Seeker
## What is the Vs. Seeker?
The Vs. Seeker is a Key Item that is used to battle Trainers that the player has battled previously.
The Vs. Seeker is a Key Item that is used to battle Trainers that the player has battled previously.
When used, the Vs. Seeker sends out a signal that allows the player to find other Trainers who want a rematch. This signal affects all Trainers that are on-screen. Once used on Trainers that can be rematched, the device cannot be used again until it is charged. The player does this by walking a specific number of steps. The effect on the Trainers wears off if they are battled, the player leaves the area, or the player walks a specific number of steps. If the player attempts to use the Vs. Seeker when it is not fully charged, the player will be told how many steps remain until it is. After the player uses the Vs. Seeker, some Trainers may have their team changed from their first battle.
When used, the Vs. Seeker sends out a signal that allows the player to find other Trainers who want a rematch. This signal affects all Trainers that are on-screen. Once used on Trainers that can be rematched, the device cannot be used again until it is charged. The player does this by walking a specific number of steps. The effect on the Trainers wears off if they are battled, the player leaves the area, or the player walks a specific number of steps. If the player attempts to use the Vs. Seeker when it is not fully charged, the player will be told how many steps remain until it is. After the player uses the Vs. Seeker, some Trainers may have their team changed from their first battle.
## How is the Vs. Seeker enabled?
### Users
Vs. Seeker functionality is enabled by setting `I_VS_SEEKER_CHARGING` to `TRUE`.
Vs. Seeker functionality is enabled by setting `I_VS_SEEKER_CHARGING` to `TRUE`.
### Players
`ITEM_VS_SEEKER` can only be used outside of battle. It can be used from the bag or registered to be used from the field.
@ -26,7 +26,7 @@ When `I_VS_SEEKER_CHARGING` is enabled, the Match Call does not function at all.
## How does the Vs. Seeker choose a Trainer?
When the Vs. Seeker is successfully used, every Trainer on screen is individually queried. There is a 31% chance that the Trainer will want a rematch.
When the Vs. Seeker is successfully used, every Trainer on screen is individually queried. There is a 31% chance that the Trainer will want a rematch.
Objects listed in `regularTrainersOnLand` or `regularTrainersInWater` are considered Land/Water objects.
| Status | Is Land/Water Object | Emote | New Movement Type |
@ -34,7 +34,7 @@ Objects listed in `regularTrainersOnLand` or `regularTrainersInWater` are consid
| Wants Rematch | Yes | `MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK` | `MOVEMENT_TYPE_COUNTER_CLOCKWISE` |
| Wants Rematch | No | `MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK` | `MOVEMENT_TYPE_FACE_DOWN` |
| Does Not Want Rematch | - | `MOVEMENT_ACTION_EMOTE_X` | none |
| Has Not Been Fought | - | `MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK` | none |
| Has Not Been Fought | - | `MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK` | none |
### Rematch Table
@ -58,7 +58,7 @@ The game determines which version of the Trainer you'll fight next by following
No extra work is required. With the exception of Wally, Gym Leaders and Elite Four, all of the rematchable Trainers in Emerald will work with the Vs. Seeker without any changes.
### New Trainers
#### Party / `gRematchTable`
Each of the rematches for the Trainer must be defined as seperate Trainers in `src/data/trainers.party` and `include/constants/opponents`. For example, `TRAINER_CALVIN_1` also has `TRAINER_CALVIN_2`,`TRAINER_CALVIN_3`,`TRAINER_CALVIN_4`, and `TRAINER_CALVIN_5`.
Each of the rematches for the Trainer must be defined as seperate Trainers in `src/data/trainers.party` and `include/constants/opponents`. For example, `TRAINER_CALVIN_1` also has `TRAINER_CALVIN_2`,`TRAINER_CALVIN_3`,`TRAINER_CALVIN_4`, and `TRAINER_CALVIN_5`.
Once all of those constants and parties are defined, a new row must be added to `gRematchTable` (located in in `src/battle_setup.c`). The row header should be a rematch ID, which can be added in `include/constants/rematches.h`. The row contents must be the five constants created for the new parties, with the lat argument being the constant of the map (`include/constants/map_groups.h`) where the Trainer is placed.

View File

@ -19,7 +19,7 @@
#define WEATHER_ABNORMAL 15 // The alternating weather during Groudon/Kyogre conflict
#define WEATHER_ROUTE119_CYCLE 20
#define WEATHER_ROUTE123_CYCLE 21
#define WEATHER_FOG 22 // Aggregate of WEATHER_FOG_HORIZONTAL and WEATHER_FOG_DIAGONAL
#define WEATHER_FOG 22 // Aggregate of WEATHER_FOG_HORIZONTAL and WEATHER_FOG_DIAGONAL
#define WEATHER_COUNT 23
// These are used in maps' coord_weather_event entries.

View File

@ -4,63 +4,63 @@
#include "gba/types.h"
//
// This header includes typedefs for fields that commonly appear throughout
// This header includes typedefs for fields that commonly appear throughout
// the codebase, and which ROM hacks might benefit from being able to widen.
//
// These typedefs include the underlying type in their name for two reasons:
//
// - Game Freak wasn't fully consistent about field widths throughout
// their codebase. For example, when Region Map Sections are persistently
// stored in savedata, they're stored as 8-bit values; but much of the
// - Game Freak wasn't fully consistent about field widths throughout
// their codebase. For example, when Region Map Sections are persistently
// stored in savedata, they're stored as 8-bit values; but much of the
// codebase handles them as 16-bit values.
//
// - Although Pokemon Emerald doesn't come close to maxing out RAM, it *does*
// use nearly all of its EEPROM. That is: the vanilla game uses 96% of the
// flash memory available for storing players' save files, leaving 2172
// bytes to spare within each of the game's two save files (primary and
// backup). These spare bytes are not contiguous: SaveBlock1 can only grow
// by 84 bytes, and SaveBlock2 can only grow by 120 bytes, with the rest
// - Although Pokemon Emerald doesn't come close to maxing out RAM, it *does*
// use nearly all of its EEPROM. That is: the vanilla game uses 96% of the
// flash memory available for storing players' save files, leaving 2172
// bytes to spare within each of the game's two save files (primary and
// backup). These spare bytes are not contiguous: SaveBlock1 can only grow
// by 84 bytes, and SaveBlock2 can only grow by 120 bytes, with the rest
// of the free space located after the player's PC-boxed Pokemon.
//
// With so little flash memory to spare, keeping track of how much space
// you're using is vital -- and so is arranging struct members to minimize
// compiler-inserted padding. It's easier to deal with this when you can
// With so little flash memory to spare, keeping track of how much space
// you're using is vital -- and so is arranging struct members to minimize
// compiler-inserted padding. It's easier to deal with this when you can
// see these types' widths at a glance.
//
// Accordingly, this file generally doesn't contain just single types, but
// rather families of types. For example, Region Map Sections are saved as
// u8s within the player's save file, but are sometimes handled as u16s or
// even s16s and ints; and so there are multiple typedefs for Map Sections
// corresponding to each of these underlying types, and each typedef has a
// Accordingly, this file generally doesn't contain just single types, but
// rather families of types. For example, Region Map Sections are saved as
// u8s within the player's save file, but are sometimes handled as u16s or
// even s16s and ints; and so there are multiple typedefs for Map Sections
// corresponding to each of these underlying types, and each typedef has a
// name which indicates the underlying type.
//
// For a given family of typedefs, the smallest one should be considered
// the "real" or "canonical" type. Continuing with Map Sections as our
// example, the smallest type is an 8-bit integer, and so any values that
// can't fit in an 8-bit integer will be truncated and lost at some point
// within the codebase. Therefore mapsec_u8_t is the "canonical" type for
// Map Sections, and the larger typedefs just exist to describe situations
// For a given family of typedefs, the smallest one should be considered
// the "real" or "canonical" type. Continuing with Map Sections as our
// example, the smallest type is an 8-bit integer, and so any values that
// can't fit in an 8-bit integer will be truncated and lost at some point
// within the codebase. Therefore mapsec_u8_t is the "canonical" type for
// Map Sections, and the larger typedefs just exist to describe situations
// where the game handles Map Sections inconsistently with that "canon."
//
// Map Sections are named areas that can appear in the region map. Each
// individual map can be assigned to a Map Section as appropriate. The
// Map Sections are named areas that can appear in the region map. Each
// individual map can be assigned to a Map Section as appropriate. The
// possible values are in constants/region_map_sections.h.
//
// If you choose to widen Map Sections, be aware that Met Locations (below)
// If you choose to widen Map Sections, be aware that Met Locations (below)
// are based on Map Sections and will also be widened.
typedef u8 mapsec_u8_t;
typedef u16 mapsec_u16_t;
typedef s16 mapsec_s16_t;
typedef s32 mapsec_s32_t;
// Met Locations for caught Pokemon use the same values as Map Sections,
// Met Locations for caught Pokemon use the same values as Map Sections,
// except that 0xFD, 0xFE, and 0xFF have special meanings.
//
// Because this value appears inside every Pokemon's data, widening it will
// consume a lot more space within flash memory. The space usage will be
// greater than you expect due to how Pokemon substructs are laid out; you
// would have to rearrange the substructs' contents in order to minimize
// Because this value appears inside every Pokemon's data, widening it will
// consume a lot more space within flash memory. The space usage will be
// greater than you expect due to how Pokemon substructs are laid out; you
// would have to rearrange the substructs' contents in order to minimize
// how much more space a wider Met Location would consume.
typedef mapsec_u8_t metloc_u8_t;

View File

@ -56,7 +56,7 @@ def GetWildEncounterFile():
if tempSuffix in map["base_label"]:
editMap = False
break
else:
else:
editMap = True
if editMap:

View File

@ -1599,8 +1599,8 @@ static void AnimHailBegin(struct Sprite *sprite)
sprite->data[0] = spriteId;
if (spriteId != MAX_SPRITES)
{
// The sprite template we're using is shared amongst a few other
// places, which make the sprite flicker. That's not what we want
// The sprite template we're using is shared amongst a few other
// places, which make the sprite flicker. That's not what we want
// here, though. Override the callback.
gSprites[sprite->data[0]].callback = AnimHailContinue;
gSprites[sprite->data[0]].sOwnerTaskId = sprite->sOwnerTaskId;

View File

@ -626,10 +626,10 @@ static void AnimTask_LoadSandstormBackground_Step(u8 taskId)
#define sFractionalY data[4] // 256ths of a pixel
#define sMirroredX data[5] // init'd from gBattleAnimArgs[3]
// The fields named "velocity" are arguably more like "acceleration,"
// The fields named "velocity" are arguably more like "acceleration,"
// and the fields named "fractional" are arguably more like "velocity."
//
// ...is what I WOULD say if the "fractional" fields weren't AND'd with
// ...is what I WOULD say if the "fractional" fields weren't AND'd with
// 0xFF after every frame.
void AnimFlyingSandCrescent(struct Sprite *sprite)

View File

@ -1443,20 +1443,20 @@ static void AnimSmallWaterOrb(struct Sprite *sprite)
}
}
#define tRainState data[0]
#define tWaterSpoutPower data[1]
#define tDropTaskDelay data[2]
#define tDropInitialXPos data[4]
#define tDropXRange data[5]
#define tDropEndYPos data[6]
#define tDropXPos data[7]
#define tSineTableIndex data[8]
#define tCurrentDropSprites data[9]
#define tDropHasHit data[10]
#define tCreatedDropSprites data[11]
#define tMaxDropSprites data[12]
#define tShakeTasksCreated data[13]
#define tDropInitialYPos data[14]
#define tRainState data[0]
#define tWaterSpoutPower data[1]
#define tDropTaskDelay data[2]
#define tDropInitialXPos data[4]
#define tDropXRange data[5]
#define tDropEndYPos data[6]
#define tDropXPos data[7]
#define tSineTableIndex data[8]
#define tCurrentDropSprites data[9]
#define tDropHasHit data[10]
#define tCreatedDropSprites data[11]
#define tMaxDropSprites data[12]
#define tShakeTasksCreated data[13]
#define tDropInitialYPos data[14]
void AnimTask_BrineRain(u8 taskId)
{
@ -1634,20 +1634,20 @@ static void AnimWaterSpoutRainHit(struct Sprite *sprite)
}
}
#undef tRainState
#undef tWaterSpoutPower
#undef tDropTaskDelay
#undef tDropInitialXPos
#undef tDropXRange
#undef tDropEndYPos
#undef tDropXPos
#undef tSineTableIndex
#undef tCurrentDropSprites
#undef tDropHasHit
#undef tCreatedDropSprites
#undef tMaxDropSprites
#undef tShakeTasksCreated
#undef tDropInitialYPos
#undef tRainState
#undef tWaterSpoutPower
#undef tDropTaskDelay
#undef tDropInitialXPos
#undef tDropXRange
#undef tDropEndYPos
#undef tDropXPos
#undef tSineTableIndex
#undef tCurrentDropSprites
#undef tDropHasHit
#undef tCreatedDropSprites
#undef tMaxDropSprites
#undef tShakeTasksCreated
#undef tDropInitialYPos
void AnimTask_WaterSport(u8 taskId)
{

View File

@ -286,7 +286,7 @@ static void RecordedPlayerHandleDrawTrainerPic(u32 battler)
xPos = 80;
yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80;
}
else
else
{
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)
{

View File

@ -2426,7 +2426,7 @@ static bool8 Mugshot_WaitPlayerSlide(struct Task *task)
sTransitionData->BG0HOFS_Lower -= 8;
sTransitionData->BG0HOFS_Upper += 8;
if (gPartnerTrainerId != TRAINER_PARTNER(PARTNER_NONE) && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
if (gPartnerTrainerId != TRAINER_PARTNER(PARTNER_NONE) && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
{
if (IsTrainerPicSlideDone(task->tPartnerSpriteId))
{
@ -2615,11 +2615,11 @@ static void Mugshots_CreateTrainerPics(struct Task *task)
0, NULL);
gReservedSpritePaletteCount = 12;
if (gPartnerTrainerId != TRAINER_PARTNER(PARTNER_NONE) && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
if (gPartnerTrainerId != TRAINER_PARTNER(PARTNER_NONE) && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
{
task->tPartnerSpriteId = CreateTrainerSprite(partnerPicId,
DISPLAY_WIDTH + 240,
106,
task->tPartnerSpriteId = CreateTrainerSprite(partnerPicId,
DISPLAY_WIDTH + 240,
106,
0, NULL);
partnerSprite = &gSprites[task->tPartnerSpriteId];
partnerSprite->callback = SpriteCB_MugshotTrainerPicPartner;
@ -2631,9 +2631,9 @@ static void Mugshots_CreateTrainerPics(struct Task *task)
SetOamMatrixRotationScaling(partnerSprite->oam.matrixNum, -512, 512, 0);
}
task->tPlayerSpriteId = CreateTrainerSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender),
DISPLAY_WIDTH + 32,
106,
task->tPlayerSpriteId = CreateTrainerSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender),
DISPLAY_WIDTH + 32,
106,
0, NULL);
opponentSpriteA = &gSprites[task->tOpponentSpriteAId];

View File

@ -3,7 +3,7 @@
#include "rtc.h"
const struct DateTime gGen3Epoch =
const struct DateTime gGen3Epoch =
{
.year = 2000,
.month = MONTH_JAN,

View File

@ -845,10 +845,10 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys)
}
if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_UNDERWATER)
&& (heldKeys & B_BUTTON)
&& (heldKeys & B_BUTTON)
&& FlagGet(FLAG_SYS_B_DASH)
&& IsRunningDisallowed(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) == 0
&& !FollowerNPCComingThroughDoor()
&& IsRunningDisallowed(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) == 0
&& !FollowerNPCComingThroughDoor()
&& (I_ORAS_DOWSING_FLAG == 0 || (I_ORAS_DOWSING_FLAG != 0 && !FlagGet(I_ORAS_DOWSING_FLAG))))
{
if (ObjectMovingOnRockStairs(&gObjectEvents[gPlayerAvatar.objectEventId], direction))

View File

@ -187,7 +187,7 @@ static void FieldUpdateRegionMap(void)
sFieldRegionMapHandler->state++;
break;
case MAP_INPUT_R_BUTTON:
if (sFieldRegionMapHandler->regionMap.mapSecType == MAPSECTYPE_CITY_CANFLY
if (sFieldRegionMapHandler->regionMap.mapSecType == MAPSECTYPE_CITY_CANFLY
&& FlagGet(OW_FLAG_POKE_RIDER) && Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
{
PlaySE(SE_SELECT);

View File

@ -284,7 +284,7 @@ static bool32 FollowerNPCHasRunningFrames(void)
static bool32 IsStateMovement(u32 state)
{
switch (state)
switch (state)
{
case MOVEMENT_ACTION_FACE_DOWN:
case MOVEMENT_ACTION_FACE_UP:
@ -509,7 +509,7 @@ static void SetSurfJump(void)
SetUpSurfBlobFieldEffect(follower);
// Adjust surf head spawn location infront of follower.
switch (direction)
switch (direction)
{
case DIR_SOUTH:
gFieldEffectArguments[1]++; // effect_y
@ -813,7 +813,7 @@ void CreateFollowerNPC(u32 gfx, u32 followerFlags, const u8 *scriptPtr)
struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId];
struct ObjectEvent *follower;
struct ObjectEventTemplate npc =
struct ObjectEventTemplate npc =
{
.localId = OBJ_EVENT_ID_NPC_FOLLOWER,
.graphicsId = gfx,
@ -929,7 +929,7 @@ u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direc
break;
}
switch (state)
switch (state)
{
case MOVEMENT_ACTION_WALK_SLOW_DOWN ... MOVEMENT_ACTION_WALK_SLOW_RIGHT:
// Slow walk.
@ -1286,7 +1286,7 @@ void NPCFollow(struct ObjectEvent *npc, u32 state, bool32 ignoreScriptActive)
ObjectEventSetHeldMovement(follower, newState);
PlayerLogCoordinates(player);
switch (newState)
switch (newState)
{
case MOVEMENT_ACTION_JUMP_2_DOWN ... MOVEMENT_ACTION_JUMP_2_RIGHT:
case MOVEMENT_ACTION_JUMP_DOWN ... MOVEMENT_ACTION_JUMP_RIGHT:
@ -1305,7 +1305,7 @@ void CreateFollowerNPCAvatar(void)
return;
struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId];
struct ObjectEventTemplate clone =
struct ObjectEventTemplate clone =
{
.localId = OBJ_EVENT_ID_NPC_FOLLOWER,
.graphicsId = GetFollowerNPCSprite(),
@ -1830,7 +1830,7 @@ void ScriptFaceFollowerNPC(struct ScriptContext *ctx)
followerDirection = playerDirection;
//Flip direction.
switch (playerDirection)
switch (playerDirection)
{
case DIR_NORTH:
playerDirection = DIR_SOUTH;
@ -1851,7 +1851,7 @@ void ScriptFaceFollowerNPC(struct ScriptContext *ctx)
}
}
static const u8 *const FollowerNPCHideMovementsSpeedTable[][4] =
static const u8 *const FollowerNPCHideMovementsSpeedTable[][4] =
{
[DIR_SOUTH] = {Common_Movement_WalkDownSlow, Common_Movement_WalkDown, Common_Movement_WalkDownFast, Common_Movement_WalkDownFaster},
[DIR_NORTH] = {Common_Movement_WalkUpSlow, Common_Movement_WalkUp, Common_Movement_WalkUpFast, Common_Movement_WalkUpFaster},

View File

@ -606,7 +606,7 @@ static void LeaveFrontierPass(void)
static u32 AllocateFrontierPassData(MainCallback callback)
{
// This variable is a MAPSEC initially, but is recycled as a
// This variable is a MAPSEC initially, but is recycled as a
// bare integer near the end of the function.
mapsec_u8_t i;

View File

@ -2152,7 +2152,7 @@ static const struct NamingScreenTemplate sWaldaWordsScreenTemplate =
};
static const u8 sText_EnterCode[] = _("Enter code:");
static const struct NamingScreenTemplate sCodeScreenTemplate =
static const struct NamingScreenTemplate sCodeScreenTemplate =
{
.copyExistingString = FALSE,
.maxChars = CODE_NAME_LENGTH,
@ -2620,5 +2620,3 @@ static const struct SpritePalette sSpritePalettes[] =
{gNamingScreenMenu_Pal[4], PALTAG_OK_BUTTON},
{}
};

View File

@ -1859,7 +1859,7 @@ static void HandleInput_PokemonSpriteVisualizer(u8 taskId)
SetArrowInvisibility(data);
PrintInstructionsOnWindow(data);
UpdateMonAnimNames(taskId);
if (data->followerspriteId != 0)
gSprites[data->followerspriteId].invisible = FALSE;
}

View File

@ -2115,7 +2115,7 @@ static void Task_ChangeSummaryMon(u8 taskId)
}
if (P_SUMMARY_SCREEN_MOVE_RELEARNER
&& (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES
&& (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES
|| sMonSummaryScreen->currPageIndex == PSS_PAGE_CONTEST_MOVES))
{
gMoveRelearnerState = MOVE_RELEARNER_LEVEL_UP_MOVES;
@ -2288,7 +2288,7 @@ static void ChangePage(u8 taskId, s8 delta)
TryUpdateRelearnType(TRY_SET_UPDATE);
}
// to prevent nothing showing
// to prevent nothing showing
if (currPageIndex >= PSS_PAGE_BATTLE_MOVES && !sMonSummaryScreen->hasRelearnableMoves)
TryUpdateRelearnType(TRY_SET_UPDATE);
else

View File

@ -223,7 +223,7 @@ static u32 HandleRegionMapInput(struct Pokenav_RegionMapMenu *state)
state->callback = GetExitRegionMapMenuId;
return POKENAV_MAP_FUNC_EXIT;
case MAP_INPUT_R_BUTTON:
if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && FlagGet(OW_FLAG_POKE_RIDER)
if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && FlagGet(OW_FLAG_POKE_RIDER)
&& Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
return POKENAV_MAP_FUNC_FLY;
}
@ -775,7 +775,7 @@ void UpdateRegionMapHelpBarText(void)
{
struct RegionMap* regionMap = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP);
if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && FlagGet(OW_FLAG_POKE_RIDER)
if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && FlagGet(OW_FLAG_POKE_RIDER)
&& Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
{
if (IsRegionMapZoomed())

View File

@ -1293,7 +1293,7 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx)
Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE);
// When applying script movements to follower, it may have frozen animation that must be cleared
if ((localId == OBJ_EVENT_ID_FOLLOWER && (objEvent = GetFollowerObject()) && objEvent->frozen)
if ((localId == OBJ_EVENT_ID_FOLLOWER && (objEvent = GetFollowerObject()) && objEvent->frozen)
|| ((objEvent = &gObjectEvents[GetObjectEventIdByLocalId(localId)]) && IS_OW_MON_OBJ(objEvent)))
{
ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]);
@ -1507,8 +1507,8 @@ bool8 ScrCmd_resetobjectsubpriority(struct ScriptContext *ctx)
bool8 ScrCmd_faceplayer(struct ScriptContext *ctx)
{
Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE);
if (PlayerHasFollowerNPC()
&& gObjectEvents[GetFollowerNPCObjectId()].invisible == FALSE
if (PlayerHasFollowerNPC()
&& gObjectEvents[GetFollowerNPCObjectId()].invisible == FALSE
&& gSelectedObjectEvent == GetFollowerNPCObjectId())
{
struct ObjectEvent *npcFollower = &gObjectEvents[GetFollowerNPCObjectId()];

View File

@ -243,7 +243,7 @@ void LoadTypeIcons(u32 battler)
struct Pokemon* mon = GetBattlerMon(battler);
u32 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
if (B_SHOW_TYPES == SHOW_TYPES_NEVER
if (B_SHOW_TYPES == SHOW_TYPES_NEVER
|| (B_SHOW_TYPES == SHOW_TYPES_SEEN && !GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_SEEN)))
return;
@ -566,4 +566,3 @@ static s32 GetTypeIconBounceMovement(s32 originalY, u32 position)
struct Sprite *healthbox = &gSprites[gHealthboxSpriteIds[GetBattlerAtPosition(position)]];
return originalY + healthbox->y2;
}

View File

@ -234,7 +234,7 @@ AI_MULTI_BATTLE_TEST("Pollen Puff: AI correctly scores moves with EFFECT_HIT_ENE
MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Speed(1); HP(50); Moves(MOVE_POLLEN_PUFF); }
MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Speed(1); HP(50); Moves(MOVE_POLLEN_PUFF); }
} WHEN {
TURN {
TURN {
// Targeting ally
SCORE_EQ_VAL(opponentLeft, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + WEAK_EFFECT, target:opponentRight);
SCORE_EQ_VAL(playerRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + WEAK_EFFECT, target:playerLeft);

View File

@ -546,7 +546,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700")
case EFFECT_AURORA_VEIL:
case EFFECT_GEAR_UP:
case EFFECT_MAGNETIC_FLUX:
// Skipped on purpose.
case EFFECT_PROTECT:
case EFFECT_NON_VOLATILE_STATUS: