Merge branch '_RHH/master' into _RHH/upcoming

This commit is contained in:
Eduardo Quezada 2024-05-06 15:29:21 -04:00
commit 1ceae6e100
86 changed files with 802 additions and 345 deletions

View File

@ -23,9 +23,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.8.2 (Latest release)
- 1.8.3 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.8.2
- 1.8.1
- 1.8.0
- 1.7.4

View File

@ -23,9 +23,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.8.2 (Latest release)
- 1.8.3 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.8.2
- 1.8.1
- 1.8.0
- 1.7.4

View File

@ -23,9 +23,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.8.2 (Latest release)
- 1.8.3 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.8.2
- 1.8.1
- 1.8.0
- 1.7.4

View File

@ -1,46 +1,47 @@
# Pokeemerald-Expansion Changelogs
## 1.8.x
- ### [Version 1.8.2](docs/changelogs/1.8.2.md) - Bugfix Release 🧹
- ### [Version 1.8.1](docs/changelogs/1.8.1.md) - HOTFIX Release 🔥
- ### [Version 1.8.0](docs/changelogs/1.8.0.md) - Feature Release ✨
- ### [Version 1.8.3](docs/changelogs/1.8.x/1.8.3.md) - Bugfix Release 🧹
- ### [Version 1.8.2](docs/changelogs/1.8.x/1.8.2.md) - Bugfix Release 🧹
- ### [Version 1.8.1](docs/changelogs/1.8.x/1.8.1.md) - HOTFIX Release 🔥
- ### [Version 1.8.0](docs/changelogs/1.8.x/1.8.0.md) - Feature Release ✨
## 1.7.x
- ### [Version 1.7.4](docs/changelogs/1.7.4.md) - Bugfix Release 🧹
- ### [Version 1.7.3](docs/changelogs/1.7.3.md) - Bugfix Release 🧹
- ### [Version 1.7.2](docs/changelogs/1.7.2.md) - Bugfix Release 🧹
- ### [Version 1.7.1](docs/changelogs/1.7.1.md) - Bugfix Release 🧹
- ### [Version 1.7.0](docs/changelogs/1.7.0.md) - Feature Release ✨
- ### [Version 1.7.4](docs/changelogs/1.7.x/1.7.4.md) - Bugfix Release 🧹
- ### [Version 1.7.3](docs/changelogs/1.7.x/1.7.3.md) - Bugfix Release 🧹
- ### [Version 1.7.2](docs/changelogs/1.7.x/1.7.2.md) - Bugfix Release 🧹
- ### [Version 1.7.1](docs/changelogs/1.7.x/1.7.1.md) - Bugfix Release 🧹
- ### [Version 1.7.0](docs/changelogs/1.7.x/1.7.0.md) - Feature Release ✨
## 1.6.x
- ### [Version 1.6.2](docs/changelogs/1.6.2.md) - Bugfix Release 🧹
- ### [Version 1.6.1](docs/changelogs/1.6.1.md) - HOTFIX Release 🔥
- ### [Version 1.6.0](docs/changelogs/1.6.0.md) - Feature Release ✨
- ### [Version 1.6.2](docs/changelogs/1.6.x/1.6.2.md) - Bugfix Release 🧹
- ### [Version 1.6.1](docs/changelogs/1.6.x/1.6.1.md) - HOTFIX Release 🔥
- ### [Version 1.6.0](docs/changelogs/1.6.x/1.6.0.md) - Feature Release ✨
## 1.5.x
- ### [Version 1.5.3](docs/changelogs/1.5.3.md) - HOTFIX Release 🔥
- ### [Version 1.5.2](docs/changelogs/1.5.2.md) - Bugfix Release 🧹
- ### [Version 1.5.1](docs/changelogs/1.5.1.md) - Bugfix Release 🧹
- ### [Version 1.5.0](docs/changelogs/1.5.0.md) - Feature Release ✨
- ### [Version 1.5.3](docs/changelogs/1.5.x/1.5.3.md) - HOTFIX Release 🔥
- ### [Version 1.5.2](docs/changelogs/1.5.x/1.5.2.md) - Bugfix Release 🧹
- ### [Version 1.5.1](docs/changelogs/1.5.x/1.5.1.md) - Bugfix Release 🧹
- ### [Version 1.5.0](docs/changelogs/1.5.x/1.5.0.md) - Feature Release ✨
## 1.4.x
- ### [Version 1.4.3](docs/changelogs/1.4.3.md) - Bugfix Release 🧹
- ### [Version 1.4.2](docs/changelogs/1.4.2.md) - Bugfix Release 🧹
- ### [Version 1.4.1](docs/changelogs/1.4.1.md) - HOTFIX Release 🔥
- ### [Version 1.4.0](docs/changelogs/1.4.0.md) - Feature Release ✨
- ### [Version 1.4.3](docs/changelogs/1.4.x/1.4.3.md) - Bugfix Release 🧹
- ### [Version 1.4.2](docs/changelogs/1.4.x/1.4.2.md) - Bugfix Release 🧹
- ### [Version 1.4.1](docs/changelogs/1.4.x/1.4.1.md) - HOTFIX Release 🔥
- ### [Version 1.4.0](docs/changelogs/1.4.x/1.4.0.md) - Feature Release ✨
## 1.3.x
- ### [Version 1.3.0](docs/changelogs/1.3.0.md) - Feature Release ✨
- ### [Version 1.3.0](docs/changelogs/1.3.x/1.3.0.md) - Feature Release ✨
## 1.2.x
- ### [Version 1.2.0](docs/changelogs/1.2.0.md) - Feature Release ✨
- ### [Version 1.2.0](docs/changelogs/1.2.x/1.2.0.md) - Feature Release ✨
## 1.1.x
- ### [Version 1.1.1](docs/changelogs/1.1.1.md) - Bugfix Release 🧹
- ### [Version 1.1.0](docs/changelogs/1.1.0.md) - Feature Release ✨
- ### [Version 1.1.1](docs/changelogs/1.1.x/1.1.1.md) - Bugfix Release 🧹
- ### [Version 1.1.0](docs/changelogs/1.1.x/1.1.0.md) - Feature Release ✨
## 1.0.x
- ### [Version 1.0.0](docs/changelogs/1.0.0.md) - Feature Release ✨
- ### [Version 1.0.0](docs/changelogs/1.0.x/1.0.0.md) - Feature Release ✨
## Pre-1.0.x:
- ### [Version 0.9.0](docs/changelogs/0.9.0.md) - Retroactive Version 🦕
- ### [Version 0.9.0](docs/changelogs/0.9.x/0.9.0.md) - Retroactive Version 🦕

View File

@ -14,11 +14,11 @@ Based off RHH's pokeemerald-expansion v1.8.0 https://github.com/rh-hideout/pokee
## What features are included?
- ***IMPORTANT*❗❗ Read through these to learn what features you can toggle**:
- [Battle configurations](/include/config/battle.h)
- [Pokémon configurations](/include/config/pokemon.h)
- [Item configurations](/include/config/item.h)
- [Overworld configurations](/include/config/overworld.h)
- [Debug configurations](/include/config/debug.h)
- [Battle configurations](include/config/battle.h)
- [Pokémon configurations](include/config/pokemon.h)
- [Item configurations](include/config/item.h)
- [Overworld configurations](include/config/overworld.h)
- [Debug configurations](include/config/debug.h)
- ***Upgraded battle engine.***
- Gen5+ damage calculation.
- 2v2 Wild battles support.
@ -62,7 +62,7 @@ Based off RHH's pokeemerald-expansion v1.8.0 https://github.com/rh-hideout/pokee
- Recalculating stats at the end of every battle.
- Level 100 Pokémon can earn EVs.
- Inverse battle support.
- TONS of other features listed [here](/include/config/battle.h).
- TONS of other features listed [here](include/config/battle.h).
- ***Full Trainer customization***
- Nickname, EVs, IVs, moves, ability, ball, friendship, nature, gender, shininess.
- Custom tag battle support (teaming up an NPC in a double battle).
@ -94,7 +94,7 @@ Based off RHH's pokeemerald-expansion v1.8.0 https://github.com/rh-hideout/pokee
- All gender differences.
- Custom female icons for female Hippopotas Hippowdon, Pikachu and Wobbufett
- 3 Perfect IVs on Legendaries, Mythicals and Ultra Beasts.
- ***Customizable form change tables. Full list of methods [here](/include/constants/form_change_types.h).***
- ***Customizable form change tables. Full list of methods [here](include/constants/form_change_types.h).***
- Item holding (eg. Giratina/Arceus)
- Item using (eg. Oricorio)
- Time of day option for Shaymin
@ -115,7 +115,7 @@ Based off RHH's pokeemerald-expansion v1.8.0 https://github.com/rh-hideout/pokee
- Egg Move Transfer, including Mirror Herb (configurable).
- Nature inheriting 100% of the time with Everstone (configurable)
- Gen6+ Ability inheriting (configurable).
- ***Items from newer Generations. Full list [here](/include/constants/items.h).***
- ***Items from newer Generations. Full list [here](include/constants/items.h).***
- ***Gen 6+ Exp. Share*** (configurable)
- Berserk Gene
- Most battle items from Gen 4+
@ -170,7 +170,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.8.2, use `git pull RHH expansion/1.8.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.8.3, use `git pull RHH expansion/1.8.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

@ -0,0 +1,132 @@
# Version 1.8.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.8.3`.
```
## 💥 *Softlock/Crash fixes* 💥
* Fixed AI bug that caused an infinite loop when player mon has only status moves by @Pawkkie and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4403
* Temporarely disabled `AI_FLAG_SMART_MON_CHOICES` flag in double battles to prevent a softlock by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4405
* Fixed debug option "Fill PC Boxes Fast" softlocking the game by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4428
* Fixed infinite loop caused by Leftovers with `AI_FLAG_SMART_MON_CHOICES` by @Pokabbie and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4453
## 🧬 General 🧬
### Changed
* Updated outdated macOS instructions in `INSTALL.md` by @jschoeny in https://github.com/rh-hideout/pokeemerald-expansion/pull/4407
* Made filepath links in `README.md` relative by @lolbinarycat in https://github.com/rh-hideout/pokeemerald-expansion/pull/4509
### Fixed
* Fixed abilities not being properly inherited via breeding for species/abilities with IDs over 255 by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4411
* Fixed Hard Level Caps issues by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4420
* Fixed Pokémon being able to surpass cap if they gained enough experience at once.
* Fixed Exp. Candies ignoring hard caps.
* Fixed Pokémon gaining 1 experience if they are at the level cap.
* Fixed evolution tracker issues by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4503
* `EVO_LEVEL_MOVE_TWENTY_TIMES` no longer increases with every move.
* `EVO_LEVEL_RECOIL_DAMAGE_MALE/FEMALE` is no longer updated twice than intended.
## ✨ Feature Branches ✨
### ***TheXaman's HGSS Pokédex Plus***:
#### Fixed
* Fixed Pokémon data page not properly handling `u16` Exp. Yields by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4432
* Cleanup by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4445
## 🐉 Pokémon 🐉
### Changed
* Further Gen 9 Pokémon icon improvements by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4413
* Original sprites by [ezerart on DeviantArt](https://www.deviantart.com/ezerart/art/Pokemon-Gen-9-Icon-sprites-3DS-Style-944211258). Palette assignments and 2nd frames by kittenchilly.
* Cyclizar, Dipplin, Farigiraf, Glimmet, Glimmora, Greavard, Iron Moth, Revavroom, Tadbulb, Paldean Tauros (all three of them), Tinkaton and Paldean Wooper.
* Further Gen 9 Pokémon front/back sprite improvements by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4414
* Source: [PokéCommunity](https://www.pokecommunity.com/threads/ds-style-gen-vii-and-beyond-pok%C3%A9mon-sprite-repository-in-64x64.368703/post-10814369)
* Dolliv, Arboliva, Charcadet, Mabosstiff, Tinkatink, Tinkatuff, Tinkaton and Chien-Pao.
### Fixed
* Fixed Lycanroc Dusk and Midnight forms using Midday's backsprite by @Eemeliri in https://github.com/rh-hideout/pokeemerald-expansion/pull/4430
* Fixed Tatsugiri Droopy back sprite palette by @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4455
## ⚔️ Battle General ⚔️ ##
### Changed
* Turned `B_RESTORE_HELD_BATTLE_ITEMS` into a generational config by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4402
### Fixed
* Fixed battle Partner trainer class and potential OOB-related issues by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4422
## 🤹 Moves 🤹
### Fixed
* Fixed Quash not properly working when `B_RECALC_TURN_AFTER_ACTIONS` is set to `GEN_8` or greater by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4419
* Fixed Will-O-Wisp's name capitalization in gMovesInfo by @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4425
* Fixed Thunder Cage not printing the right battle message by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4426
* Fixed Diamond Storm missing its effect by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4489
* Fixed Mortal Spin's description by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4489
* Fixed Assist being able to call `MOVE_NONE` by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4491
## 🎭 Abilities 🎭
### Changed
* Changed the Embody Aspect defines to use the full form name, to be in line with the species define by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4439
* Eg. `ABILITY_EMBODY_ASPECT_TEAL` -> `ABILITY_EMBODY_ASPECT_TEAL_MASK`.
### Fixed
* Fixed Intimidate/Supersweet Syrup playing their animation and not printing the right message for battlers at -6 stage Attack/Evasion by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4406
* Fixed ability pop ups not respecting `abilityPopupOverwrite` in tests by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4423
* Fixed Dancer copying multi-target moves by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4437
* Fixed Hospitality triggering on a fainted mon by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4450
* Fixed Embody Aspect (Teal Mask) boosting Sp. Attack instead of Speed by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4439
* Fixed lingering long ability popup names by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4456
* Fixed Fur Coat not being skipped by Mold Breaker abilities by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4459
* Fixed Color change not being triggered by Future Sight or Doom Desire by @AlexOn1ine and @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4472
* Fixes Magic Bounce only working for battlers in certain positions by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4464
* Fixed Costar, Zero to Hero, Supreme Overlord and Ruin abilities' switch-in battle messages showing sometimes incorrectly by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4500
* Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4511
## 🧶 Items 🧶
### Fixed
* Fixed typo in Rotom Catalogue description by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4433
* Eject item fixes (Eject Button/Pack):
* Fixed regression from 1.8.2 that caused Eject Pack to not trigger upon self-inflicted stat decreases by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4463
* Fixed Eject Items causing wrong Pokémon taking damage by entry hazards by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4465
* Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4497
* Fixed Flute Items being consumed in battle by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4496
* Fixed Red Card activating if the holder was switched in in the same turn (eg. via Endure) by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4482
## 🤖 Battle AI 🤖
### Changed
* `AI_FLAG_SMART_SWITCHING` flag now automatically sets `AI_FLAG_SMART_MON_CHOICES` as well by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4405
* Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4409
* Corrected `IsDamageMoveUsable`'s name to `IsDamageMoveUnusable` by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4476
* Fixed AI not knowing that Steam Roller fails when there's no terrain by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4476
* Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4498
## 🧪 Test Runner 🧪
### Added
* Added missing Color change tests by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4472
### Changed
### Fixed
* Fixed AI test error messages by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4404
* The error messages for `EXPECT_MOVE` and `EXPECT_SWITCH` were backwards, saying, e.g. `Expected MOVE, got SWITCH` when it should say `Expected SWITCH, got MOVE`.
* Fixed typos in Embody Aspect tests by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4439
* Fixed Battle Test organization by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4504
* Fixed Cud Chew's file being in the move effect folder.
* Fixed Cud Chew's file name and test names (Cud Chuw).
* Fixed Gastro Acid and Role Play's files being in the ability folder.
* Moved Recoil file to move flags folder.
* Renamed White Herb's file to `restore_stats.c`.
* Renamed Techno Blast's file to `change_type_on_item.c`.
* `semi_invulnerable_moves.c` to `semi_invulnerable.c`.
* `two_turn_moves.c` to `two_turns_attack.c`.
* Combined Burn Up/Double Shock to a single file `fail_if_not_arg_type.c`
* Added Spit Up/Swallow files that point Stockpile's file.
* Moved secondary effect files to their own folder.
* Combinations of secondary effects moved to their own folder
* Split `hit_set_entry_hazards.c` to separate files for Spikes/Stealth Rock.
* Grouped Hex/Venoshock to the same file `double_power_on_arg_status.c`
## New Contributors
* @jschoeny made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4407
* @Eemeliri made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4430
* @cafei-uh made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4455
* @PhallenTree made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4465
* @WillKolada made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4476
* @cawtds made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4503
* @lolbinarycat made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4509
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.2...expansion/1.8.3
<!--Last PR: 4503-->

View File

@ -7,7 +7,7 @@
```
## 🌋 *IMPORTANT CHANGES* 🌋
* We deleted the whole repo LOL by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/3367
* N/A
## 💥 *Softlock/Crash fixes* 💥
* N/A
@ -119,7 +119,7 @@
## New Contributors
* Tony
* N/A
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.Y.Z...expansion/1.Y.Z

View File

@ -1,10 +1,10 @@
#ifndef GUARD_CONSTANTS_EXPANSION_H
#define GUARD_CONSTANTS_EXPANSION_H
// 1.8.2
// 1.8.3
#define EXPANSION_VERSION_MAJOR 1
#define EXPANSION_VERSION_MINOR 8
#define EXPANSION_VERSION_PATCH 2
#define EXPANSION_VERSION_PATCH 3
// FALSE if this this version of Expansion is not a tagged commit, i.e.
// it contains unreleased changes.

View File

@ -335,7 +335,7 @@ static void RemoveAllTerrains(void);
static bool8 CanAbilityPreventStatLoss(u16 abilityDef, bool8 isIntimidate);
static bool8 CanBurnHitThaw(u16 move);
static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent);
static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount);
static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount, u16 usedMove);
static void Cmd_attackcanceler(void);
static void Cmd_accuracycheck(void);
@ -6334,7 +6334,7 @@ static void Cmd_moveend(void)
case MOVEEND_SET_EVOLUTION_TRACKER:
// If the Pokémon needs to keep track of move usage for its evolutions, do it
if (originallyUsedMove != MOVE_NONE)
TryUpdateEvolutionTracker(EVO_LEVEL_MOVE_TWENTY_TIMES, 1);
TryUpdateEvolutionTracker(EVO_LEVEL_MOVE_TWENTY_TIMES, 1, originallyUsedMove);
gBattleScripting.moveendState++;
break;
case MOVEEND_CLEAR_BITS: // Clear/Set bits for things like using a move for all targets and all hits.
@ -16822,7 +16822,7 @@ void BS_RunStatChangeItems(void)
ItemBattleEffects(ITEMEFFECT_STATS_CHANGED, GetBattlerForBattleScript(cmd->battler), FALSE);
}
static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount)
static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount, u16 usedMove)
{
u32 i;
@ -16847,9 +16847,19 @@ static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount)
// We only have 9 bits to use
u16 val = min(511, GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER) + upAmount);
// Reset progress if you faint for the recoil method.
if (gBattleMons[gBattlerAttacker].hp == 0 && (evolutionMethod == EVO_LEVEL_RECOIL_DAMAGE_MALE || evolutionMethod == EVO_LEVEL_RECOIL_DAMAGE_FEMALE))
val = 0;
SetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER, &val);
switch (evolutionMethod)
{
case EVO_LEVEL_MOVE_TWENTY_TIMES:
if (evolutions[i].param == usedMove)
SetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER, &val);
break;
case EVO_LEVEL_RECOIL_DAMAGE_MALE:
case EVO_LEVEL_RECOIL_DAMAGE_FEMALE:
if (gBattleMons[gBattlerAttacker].hp == 0)
val = 0;
SetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER, &val);
break;
}
return;
}
}
@ -16859,8 +16869,18 @@ static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount)
void BS_TryUpdateRecoilTracker(void)
{
NATIVE_ARGS();
TryUpdateEvolutionTracker(EVO_LEVEL_RECOIL_DAMAGE_MALE, gBattleMoveDamage);
TryUpdateEvolutionTracker(EVO_LEVEL_RECOIL_DAMAGE_FEMALE, gBattleMoveDamage);
u8 gender = GetMonGender(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]]);
switch(gender)
{
case MON_MALE:
TryUpdateEvolutionTracker(EVO_LEVEL_RECOIL_DAMAGE_MALE, gBattleMoveDamage, MOVE_NONE);
break;
case MON_FEMALE:
TryUpdateEvolutionTracker(EVO_LEVEL_RECOIL_DAMAGE_FEMALE, gBattleMoveDamage, MOVE_NONE);
break;
}
gBattlescriptCurrInstr = cmd->nextInstr;
}

View File

@ -29,3 +29,47 @@ SINGLE_BATTLE_TEST("Beads of Ruin reduces Sp. Def if opposing mon's ability does
EXPECT_MUL_EQ(damage[1], Q_4_12(1.33), damage[0]);
}
}
SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battlers fainted - Player")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
PLAYER(SPECIES_WOBBUFFET) { HP(1);}
PLAYER(SPECIES_CHI_YU);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); }
TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_RUINATION); }
} SCENE {
HP_BAR(opponent, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, opponent);
// Everyone faints.
MESSAGE("Go! Chi-Yu!");
ABILITY_POPUP(player, ABILITY_BEADS_OF_RUIN);
MESSAGE("Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding Pokémon!");
MESSAGE("2 sent out Wobbuffet!");
}
}
SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battlers fainted - Opponent")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { HP(1);}
OPPONENT(SPECIES_CHI_YU);
} WHEN {
TURN { MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); }
TURN { MOVE(player, MOVE_RUINATION); MOVE(opponent, MOVE_TACKLE); }
} SCENE {
HP_BAR(player, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, player);
// Everyone faints.
MESSAGE("Go! Wobbuffet!");
MESSAGE("2 sent out Chi-Yu!");
ABILITY_POPUP(opponent, ABILITY_BEADS_OF_RUIN);
MESSAGE("Foe Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding Pokémon!");
}
}

View File

@ -0,0 +1,8 @@
#include "global.h"
#include "test/battle.h"
TO_DO_BATTLE_TEST("Costar copies an ally's stat stages upon entering battle");
// Copy from Ruin ability tests
TO_DO_BATTLE_TEST("Costar's message displays correctly after all battlers fainted - Player");
TO_DO_BATTLE_TEST("Costar's message displays correctly after all battlers fainted - Opponent");

View File

@ -1,7 +1,7 @@
#include "global.h"
#include "test/battle.h"
SINGLE_BATTLE_TEST("Cud Chuw will activate Kee Berry effect again on the next turn")
SINGLE_BATTLE_TEST("Cud Chew will activate Kee Berry effect again on the next turn")
{
GIVEN {
ASSUME(gItemsInfo[ITEM_KEE_BERRY].holdEffect == HOLD_EFFECT_KEE_BERRY);
@ -23,7 +23,7 @@ SINGLE_BATTLE_TEST("Cud Chuw will activate Kee Berry effect again on the next tu
}
}
SINGLE_BATTLE_TEST("Cud Chuw will activate Oran Berry effect again on the next turn")
SINGLE_BATTLE_TEST("Cud Chew will activate Oran Berry effect again on the next turn")
{
GIVEN {
ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP);

View File

@ -1,7 +1,7 @@
#include "global.h"
#include "test/battle.h"
DOUBLE_BATTLE_TEST("Supreme Overlord boosts Attack by an additive 10% per fainted mon on the side", s16 damage)
DOUBLE_BATTLE_TEST("Supreme Overlord boosts Attack by an additive 10% per fainted mon on its side upon switch in", s16 damage)
{
bool32 switchMon = 0;
PARAMETRIZE { switchMon = FALSE; }
@ -21,6 +21,10 @@ DOUBLE_BATTLE_TEST("Supreme Overlord boosts Attack by an additive 10% per fainte
TURN { SWITCH(playerLeft, 0); }
TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); }
} SCENE {
if (switchMon) {
ABILITY_POPUP(playerLeft, ABILITY_SUPREME_OVERLORD);
MESSAGE("Kingambit gained strength from the fallen!");
}
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerLeft);
HP_BAR(opponentLeft, captureDamage: &results[i].damage);
} FINALLY {
@ -51,6 +55,8 @@ DOUBLE_BATTLE_TEST("Supreme Overlord's boost caps at a 1.5x multipler", s16 dama
TURN { SWITCH(playerRight, 3); }
TURN { MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); }
} SCENE {
ABILITY_POPUP(playerRight, ABILITY_SUPREME_OVERLORD);
MESSAGE("Kingambit gained strength from the fallen!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerRight);
HP_BAR(opponentLeft, captureDamage: &results[i].damage);
} FINALLY {
@ -85,3 +91,52 @@ SINGLE_BATTLE_TEST("Supreme Overlord does not boost attack if party members are
EXPECT_EQ(results[0].damage, results[1].damage);
}
}
SINGLE_BATTLE_TEST("Supreme Overlord's message displays correctly after all battlers fainted - Player")
{
// For some reason the Ability Pop Up fails to appear after Explosion.
KNOWN_FAILING;
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
PLAYER(SPECIES_WOBBUFFET) { HP(1);}
PLAYER(SPECIES_KINGAMBIT);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); }
TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_KOWTOW_CLEAVE); }
} SCENE {
HP_BAR(opponent, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, opponent);
// Everyone faints.
MESSAGE("Go! Kingambit!");
ABILITY_POPUP(player, ABILITY_SUPREME_OVERLORD);
MESSAGE("Kingambit gained strength from the fallen!");
MESSAGE("2 sent out Wobbuffet!");
}
}
SINGLE_BATTLE_TEST("Supreme Overlord's message displays correctly after all battlers fainted - Opponent")
{
// For some reason the Ability Pop Up fails to appear after Explosion.
KNOWN_FAILING;
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { HP(1);}
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_KINGAMBIT);
} WHEN {
TURN { MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); }
TURN { SWITCH(opponent, 2); MOVE(player, MOVE_TACKLE); }
} SCENE {
HP_BAR(player, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, player);
// Everyone faints.
MESSAGE("Go! Wobbuffet!");
MESSAGE("2 sent out Kingambit!");
ABILITY_POPUP(opponent, ABILITY_SUPREME_OVERLORD);
MESSAGE("Foe Kingambit gained strength from the fallen!");
}
}

View File

@ -29,3 +29,47 @@ SINGLE_BATTLE_TEST("Sword of Ruin reduces Defense if opposing mon's ability does
EXPECT_MUL_EQ(damage[1], Q_4_12(1.33), damage[0]);
}
}
SINGLE_BATTLE_TEST("Sword of Ruin's message displays correctly after all battlers fainted - Player")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
PLAYER(SPECIES_WOBBUFFET) { HP(1);}
PLAYER(SPECIES_CHIEN_PAO);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); }
TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_RUINATION); }
} SCENE {
HP_BAR(opponent, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, opponent);
// Everyone faints.
MESSAGE("Go! Chien-Pao!");
ABILITY_POPUP(player, ABILITY_SWORD_OF_RUIN);
MESSAGE("Chien-Pao's Sword of Ruin weakened the Defense of all surrounding Pokémon!");
MESSAGE("2 sent out Wobbuffet!");
}
}
SINGLE_BATTLE_TEST("Sword of Ruin's message displays correctly after all battlers fainted - Opponent")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { HP(1);}
OPPONENT(SPECIES_CHIEN_PAO);
} WHEN {
TURN { MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); }
TURN { MOVE(player, MOVE_RUINATION); MOVE(opponent, MOVE_TACKLE); }
} SCENE {
HP_BAR(player, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, player);
// Everyone faints.
MESSAGE("Go! Wobbuffet!");
MESSAGE("2 sent out Chien-Pao!");
ABILITY_POPUP(opponent, ABILITY_SWORD_OF_RUIN);
MESSAGE("Foe Chien-Pao's Sword of Ruin weakened the Defense of all surrounding Pokémon!");
}
}

View File

@ -29,3 +29,47 @@ SINGLE_BATTLE_TEST("Tablets of Ruin reduces Attack if opposing mon's ability doe
EXPECT_MUL_EQ(damage[0], Q_4_12(1.33), damage[1]);
}
}
SINGLE_BATTLE_TEST("Tablets of Ruin's message displays correctly after all battlers fainted - Player")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
PLAYER(SPECIES_WOBBUFFET) { HP(1);}
PLAYER(SPECIES_WO_CHIEN);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); }
TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_RUINATION); }
} SCENE {
HP_BAR(opponent, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, opponent);
// Everyone faints.
MESSAGE("Go! Wo-Chien!");
ABILITY_POPUP(player, ABILITY_TABLETS_OF_RUIN);
MESSAGE("Wo-Chien's Tablets of Ruin weakened the Attack of all surrounding Pokémon!");
MESSAGE("2 sent out Wobbuffet!");
}
}
SINGLE_BATTLE_TEST("Tablets of Ruin's message displays correctly after all battlers fainted - Opponent")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { HP(1);}
OPPONENT(SPECIES_WO_CHIEN);
} WHEN {
TURN { MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); }
TURN { MOVE(player, MOVE_RUINATION); MOVE(opponent, MOVE_TACKLE); }
} SCENE {
HP_BAR(player, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, player);
// Everyone faints.
MESSAGE("Go! Wobbuffet!");
MESSAGE("2 sent out Wo-Chien!");
ABILITY_POPUP(opponent, ABILITY_TABLETS_OF_RUIN);
MESSAGE("Foe Wo-Chien's Tablets of Ruin weakened the Attack of all surrounding Pokémon!");
}
}

View File

@ -29,3 +29,47 @@ SINGLE_BATTLE_TEST("Vessel of Ruin reduces Sp. Atk if opposing mon's ability doe
EXPECT_MUL_EQ(damage[0], Q_4_12(1.33), damage[1]);
}
}
SINGLE_BATTLE_TEST("Vessel of Ruin's message displays correctly after all battlers fainted - Player")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
PLAYER(SPECIES_WOBBUFFET) { HP(1);}
PLAYER(SPECIES_TING_LU);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); }
TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_RUINATION); }
} SCENE {
HP_BAR(opponent, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, opponent);
// Everyone faints.
MESSAGE("Go! Ting-Lu!");
ABILITY_POPUP(player, ABILITY_VESSEL_OF_RUIN);
MESSAGE("Ting-Lu's Vessel of Ruin weakened the Sp. Atk of all surrounding Pokémon!");
MESSAGE("2 sent out Wobbuffet!");
}
}
SINGLE_BATTLE_TEST("Vessel of Ruin's message displays correctly after all battlers fainted - Opponent")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { HP(1);}
OPPONENT(SPECIES_TING_LU);
} WHEN {
TURN { MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); }
TURN { MOVE(player, MOVE_RUINATION); MOVE(opponent, MOVE_TACKLE); }
} SCENE {
HP_BAR(player, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, player);
// Everyone faints.
MESSAGE("Go! Wobbuffet!");
MESSAGE("2 sent out Ting-Lu!");
ABILITY_POPUP(opponent, ABILITY_VESSEL_OF_RUIN);
MESSAGE("Foe Ting-Lu's Vessel of Ruin weakened the Sp. Atk of all surrounding Pokémon!");
}
}

View File

@ -136,6 +136,52 @@ SINGLE_BATTLE_TEST("Imposter doesn't apply the heroic transformation message whe
} THEN { EXPECT_EQ(player->species, SPECIES_PALAFIN_HERO); }
}
SINGLE_BATTLE_TEST("Zero to Hero's message displays correctly after all battlers fainted - Player")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
PLAYER(SPECIES_PALAFIN_ZERO);
PLAYER(SPECIES_WOBBUFFET) { HP(1);}
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_FLIP_TURN); SEND_OUT(player, 1); }
TURN { MOVE(opponent, MOVE_EXPLOSION); SEND_OUT(player, 0); SEND_OUT(opponent, 1); }
TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_TACKLE); }
} SCENE {
HP_BAR(opponent, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, opponent);
// Everyone faints.
MESSAGE("Go! Palafin!");
ABILITY_POPUP(player, ABILITY_ZERO_TO_HERO);
MESSAGE("Palafin underwent a heroic transformation!");
MESSAGE("2 sent out Wobbuffet!");
}
}
SINGLE_BATTLE_TEST("Zero to Hero's message displays correctly after all battlers fainted - Opponent")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_PALAFIN_ZERO);
OPPONENT(SPECIES_WOBBUFFET) { HP(1);}
} WHEN {
TURN { MOVE(opponent, MOVE_FLIP_TURN); SEND_OUT(opponent, 1); }
TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 0); }
TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_TACKLE); }
} SCENE {
HP_BAR(player, hp: 0);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, player);
// Everyone faints.
MESSAGE("Go! Wobbuffet!");
MESSAGE("2 sent out Palafin!");
ABILITY_POPUP(opponent, ABILITY_ZERO_TO_HERO);
MESSAGE("Foe Palafin underwent a heroic transformation!");
}
}
// Write Trace test and move this one to that file (including every other ability that can't be copied)
SINGLE_BATTLE_TEST("Zero to Hero cannot be copied by Trace")
{

View File

@ -1,54 +0,0 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(gMovesInfo[MOVE_BURN_UP].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE);
}
SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type")
{
GIVEN {
PLAYER(SPECIES_CYNDAQUIL);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_BURN_UP); }
TURN { MOVE(player, MOVE_BURN_UP); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player);
MESSAGE("Cyndaquil burned itself out!");
MESSAGE("Cyndaquil used Burn Up!");
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Burn Up fails if the user isn't a Fire-type")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_BURN_UP); }
} SCENE {
NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); }
MESSAGE("Wobbuffet used Burn Up!");
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type if enemy faints")
{
GIVEN {
PLAYER(SPECIES_CYNDAQUIL);
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
} WHEN {
TURN { MOVE(player, MOVE_BURN_UP); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player);
HP_BAR(opponent, hp: 0);
MESSAGE("Cyndaquil burned itself out!");
}
}

View File

@ -1,54 +0,0 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(gMovesInfo[MOVE_DOUBLE_SHOCK].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC);
ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC || gSpeciesInfo[SPECIES_PIKACHU].types[1] == TYPE_ELECTRIC);
}
SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type")
{
GIVEN {
PLAYER(SPECIES_PIKACHU);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_DOUBLE_SHOCK); }
TURN { MOVE(player, MOVE_DOUBLE_SHOCK); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_SHOCK, player);
MESSAGE("Pikachu used up all of its electricity!");
MESSAGE("Pikachu used Double Shock!");
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Double Shock fails if the user isn't an Electric-type")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_DOUBLE_SHOCK); }
} SCENE {
NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_SHOCK, player); }
MESSAGE("Wobbuffet used Double Shock!");
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type if enemy faints")
{
GIVEN {
PLAYER(SPECIES_PIKACHU);
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
} WHEN {
TURN { MOVE(player, MOVE_DOUBLE_SHOCK); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_SHOCK, player);
HP_BAR(opponent, hp: 0);
MESSAGE("Pikachu used up all of its electricity!");
}
}

View File

@ -0,0 +1,112 @@
#include "global.h"
#include "test/battle.h"
SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_BURN_UP].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE);
PLAYER(SPECIES_CYNDAQUIL);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_BURN_UP); }
TURN { MOVE(player, MOVE_BURN_UP); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player);
MESSAGE("Cyndaquil burned itself out!");
MESSAGE("Cyndaquil used Burn Up!");
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Burn Up fails if the user isn't a Fire-type")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_BURN_UP].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_BURN_UP); }
} SCENE {
NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); }
MESSAGE("Wobbuffet used Burn Up!");
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type if enemy faints")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_BURN_UP].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE);
PLAYER(SPECIES_CYNDAQUIL);
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
} WHEN {
TURN { MOVE(player, MOVE_BURN_UP); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player);
HP_BAR(opponent, hp: 0);
MESSAGE("Cyndaquil burned itself out!");
}
}
SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_DOUBLE_SHOCK].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC);
ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC || gSpeciesInfo[SPECIES_PIKACHU].types[1] == TYPE_ELECTRIC);
PLAYER(SPECIES_PIKACHU);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_DOUBLE_SHOCK); }
TURN { MOVE(player, MOVE_DOUBLE_SHOCK); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_SHOCK, player);
MESSAGE("Pikachu used up all of its electricity!");
MESSAGE("Pikachu used Double Shock!");
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Double Shock fails if the user isn't an Electric-type")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_DOUBLE_SHOCK].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_DOUBLE_SHOCK); }
} SCENE {
NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_SHOCK, player); }
MESSAGE("Wobbuffet used Double Shock!");
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type if enemy faints")
{
GIVEN {
ASSUME(gMovesInfo[MOVE_DOUBLE_SHOCK].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC);
ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC || gSpeciesInfo[SPECIES_PIKACHU].types[1] == TYPE_ELECTRIC);
PLAYER(SPECIES_PIKACHU);
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
} WHEN {
TURN { MOVE(player, MOVE_DOUBLE_SHOCK); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_SHOCK, player);
HP_BAR(opponent, hp: 0);
MESSAGE("Pikachu used up all of its electricity!");
}
}

View File

@ -1,34 +0,0 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(gMovesInfo[MOVE_HEX].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS);
ASSUME(gMovesInfo[MOVE_HEX].argument == STATUS1_ANY);
}
SINGLE_BATTLE_TEST("Hex deals double damage to foes with a status", s16 damage)
{
u32 status1;
PARAMETRIZE { status1 = STATUS1_NONE; }
PARAMETRIZE { status1 = STATUS1_SLEEP; }
PARAMETRIZE { status1 = STATUS1_POISON; }
PARAMETRIZE { status1 = STATUS1_BURN; }
PARAMETRIZE { status1 = STATUS1_FREEZE; }
PARAMETRIZE { status1 = STATUS1_PARALYSIS; }
PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; }
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Status1(status1); }
} WHEN {
TURN { MOVE(player, MOVE_HEX); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_HEX, player);
HP_BAR(opponent, captureDamage: &results[i].damage);
} THEN {
if (i > 0)
EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[i].damage);
if (i > 1)
EXPECT_EQ(results[i-1].damage, results[i].damage);
}
}

View File

@ -1,117 +0,0 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(MoveHasAdditionalEffect(MOVE_STONE_AXE, MOVE_EFFECT_STEALTH_ROCK) == TRUE);
ASSUME(MoveHasAdditionalEffect(MOVE_CEASELESS_EDGE, MOVE_EFFECT_SPIKES) == TRUE);
}
SINGLE_BATTLE_TEST("Stone Axe / Ceaseless Edge set up hazards after hitting the target")
{
u16 move;
PARAMETRIZE { move = MOVE_STONE_AXE; }
PARAMETRIZE { move = MOVE_CEASELESS_EDGE; }
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, move); }
TURN { SWITCH(opponent, 1); }
} SCENE {
s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP);
ANIMATION(ANIM_TYPE_MOVE, move, player);
HP_BAR(opponent);
if (move == MOVE_CEASELESS_EDGE) {
MESSAGE("Spikes were scattered all around the opposing team!");
}
else {
MESSAGE("Pointed stones float in the air around the opposing team!");
}
MESSAGE("2 sent out Wobbuffet!");
if (move == MOVE_CEASELESS_EDGE) {
HP_BAR(opponent, damage: maxHP / 8);
MESSAGE("Foe Wobbuffet is hurt by spikes!");
}
else {
HP_BAR(opponent, damage: maxHP / 8);
MESSAGE("Pointed stones dug into Foe Wobbuffet!");
}
}
}
SINGLE_BATTLE_TEST("Ceaseless Edge can set up to 3 layers of Spikes")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN { MOVE(player, MOVE_CEASELESS_EDGE); }
TURN { MOVE(player, MOVE_CEASELESS_EDGE); }
TURN { MOVE(player, MOVE_CEASELESS_EDGE); }
TURN { MOVE(player, MOVE_CEASELESS_EDGE); }
TURN { SWITCH(opponent, 1); }
} SCENE {
s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player);
HP_BAR(opponent);
MESSAGE("Spikes were scattered all around the opposing team!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player);
HP_BAR(opponent);
MESSAGE("Spikes were scattered all around the opposing team!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player);
HP_BAR(opponent);
MESSAGE("Spikes were scattered all around the opposing team!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player);
HP_BAR(opponent);
NOT MESSAGE("Spikes were scattered all around the opposing team!");
MESSAGE("2 sent out Wynaut!");
HP_BAR(opponent, damage: maxHP / 4);
MESSAGE("Foe Wynaut is hurt by spikes!");
}
}
SINGLE_BATTLE_TEST("Stone Axe can set up pointed stones only once")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN { MOVE(player, MOVE_STONE_AXE); }
TURN { MOVE(player, MOVE_STONE_AXE); }
TURN { MOVE(player, MOVE_STONE_AXE); }
TURN { MOVE(player, MOVE_STONE_AXE); }
TURN { SWITCH(opponent, 1); }
} SCENE {
s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP);
ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player);
HP_BAR(opponent);
MESSAGE("Pointed stones float in the air around the opposing team!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player);
HP_BAR(opponent);
NOT MESSAGE("Pointed stones float in the air around the opposing team!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player);
HP_BAR(opponent);
NOT MESSAGE("Pointed stones float in the air around the opposing team!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player);
HP_BAR(opponent);
NOT MESSAGE("Pointed stones float in the air around the opposing team!");
MESSAGE("2 sent out Wynaut!");
HP_BAR(opponent, damage: maxHP / 8);
MESSAGE("Pointed stones dug into Foe Wynaut!");
}
}

View File

@ -0,0 +1,4 @@
#include "global.h"
#include "test/battle.h"
// Go to test/battle/move_effect/stockpile.c for Spit Up's tests

View File

@ -0,0 +1,4 @@
#include "global.h"
#include "test/battle.h"
// Go to test/battle/move_effect/stockpile.c for Swallow's tests

View File

@ -1,28 +0,0 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(gMovesInfo[MOVE_VENOSHOCK].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS);
ASSUME(gMovesInfo[MOVE_VENOSHOCK].argument == STATUS1_PSN_ANY);
}
SINGLE_BATTLE_TEST("Venoshock's power doubles if the target is poisoned/badly poisoned", s16 damage)
{
u32 status1;
PARAMETRIZE { status1 = 0; }
PARAMETRIZE { status1 = STATUS1_POISON; }
PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; }
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Status1(status1); }
} WHEN {
TURN { MOVE(player, MOVE_VENOSHOCK); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_VENOSHOCK, player);
HP_BAR(opponent, captureDamage: &results[i].damage);
} FINALLY {
EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage);
EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[2].damage);
}
}

View File

@ -0,0 +1,52 @@
#include "global.h"
#include "test/battle.h"
SINGLE_BATTLE_TEST("Hex deals double damage to foes with a status", s16 damage)
{
u32 status1;
PARAMETRIZE { status1 = STATUS1_NONE; }
PARAMETRIZE { status1 = STATUS1_SLEEP; }
PARAMETRIZE { status1 = STATUS1_POISON; }
PARAMETRIZE { status1 = STATUS1_BURN; }
PARAMETRIZE { status1 = STATUS1_FREEZE; }
PARAMETRIZE { status1 = STATUS1_PARALYSIS; }
PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; }
GIVEN {
ASSUME(gMovesInfo[MOVE_HEX].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS);
ASSUME(gMovesInfo[MOVE_HEX].argument == STATUS1_ANY);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Status1(status1); }
} WHEN {
TURN { MOVE(player, MOVE_HEX); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_HEX, player);
HP_BAR(opponent, captureDamage: &results[i].damage);
} THEN {
if (i > 0)
EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[i].damage);
if (i > 1)
EXPECT_EQ(results[i-1].damage, results[i].damage);
}
}
SINGLE_BATTLE_TEST("Venoshock's power doubles if the target is poisoned/badly poisoned", s16 damage)
{
u32 status1;
PARAMETRIZE { status1 = 0; }
PARAMETRIZE { status1 = STATUS1_POISON; }
PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; }
GIVEN {
ASSUME(gMovesInfo[MOVE_VENOSHOCK].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS);
ASSUME(gMovesInfo[MOVE_VENOSHOCK].argument == STATUS1_PSN_ANY);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Status1(status1); }
} WHEN {
TURN { MOVE(player, MOVE_VENOSHOCK); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_VENOSHOCK, player);
HP_BAR(opponent, captureDamage: &results[i].damage);
} FINALLY {
EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage);
EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[2].damage);
}
}

View File

@ -1,15 +1,10 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(MoveHasAdditionalEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON) == TRUE);
ASSUME(MoveHasAdditionalEffect(MOVE_TWINEEDLE, MOVE_EFFECT_POISON) == TRUE);
}
SINGLE_BATTLE_TEST("Poison Sting inflicts poison")
{
GIVEN {
ASSUME(MoveHasAdditionalEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON) == TRUE);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -29,6 +24,7 @@ SINGLE_BATTLE_TEST("Poison cannot be inflicted on Poison and Steel-type Pokémon
PARAMETRIZE { mon = SPECIES_NIDORAN_M; }
PARAMETRIZE { mon = SPECIES_REGISTEEL; }
GIVEN {
ASSUME(MoveHasAdditionalEffect(MOVE_TWINEEDLE, MOVE_EFFECT_POISON) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_NIDORAN_M].types[0] == TYPE_POISON);
ASSUME(gSpeciesInfo[SPECIES_REGISTEEL].types[0] == TYPE_STEEL);
PLAYER(SPECIES_WOBBUFFET);

View File

@ -0,0 +1,64 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(MoveHasAdditionalEffect(MOVE_CEASELESS_EDGE, MOVE_EFFECT_SPIKES) == TRUE);
}
SINGLE_BATTLE_TEST("Ceaseless Edge sets up hazards after hitting the target")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_CEASELESS_EDGE); }
TURN { SWITCH(opponent, 1); }
} SCENE {
s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player);
HP_BAR(opponent);
MESSAGE("Spikes were scattered all around the opposing team!");
MESSAGE("2 sent out Wobbuffet!");
HP_BAR(opponent, damage: maxHP / 8);
MESSAGE("Foe Wobbuffet is hurt by spikes!");
}
}
SINGLE_BATTLE_TEST("Ceaseless Edge can set up to 3 layers of Spikes")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN { MOVE(player, MOVE_CEASELESS_EDGE); }
TURN { MOVE(player, MOVE_CEASELESS_EDGE); }
TURN { MOVE(player, MOVE_CEASELESS_EDGE); }
TURN { MOVE(player, MOVE_CEASELESS_EDGE); }
TURN { SWITCH(opponent, 1); }
} SCENE {
s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player);
HP_BAR(opponent);
MESSAGE("Spikes were scattered all around the opposing team!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player);
HP_BAR(opponent);
MESSAGE("Spikes were scattered all around the opposing team!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player);
HP_BAR(opponent);
MESSAGE("Spikes were scattered all around the opposing team!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player);
HP_BAR(opponent);
NOT MESSAGE("Spikes were scattered all around the opposing team!");
MESSAGE("2 sent out Wynaut!");
HP_BAR(opponent, damage: maxHP / 4);
MESSAGE("Foe Wynaut is hurt by spikes!");
}
}

View File

@ -0,0 +1,65 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(MoveHasAdditionalEffect(MOVE_STONE_AXE, MOVE_EFFECT_STEALTH_ROCK) == TRUE);
}
SINGLE_BATTLE_TEST("Stone Axe sets up hazards after hitting the target")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_STONE_AXE); }
TURN { SWITCH(opponent, 1); }
} SCENE {
s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP);
ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player);
HP_BAR(opponent);
MESSAGE("Pointed stones float in the air around the opposing team!");
MESSAGE("2 sent out Wobbuffet!");
HP_BAR(opponent, damage: maxHP / 8);
MESSAGE("Pointed stones dug into Foe Wobbuffet!");
}
}
SINGLE_BATTLE_TEST("Stone Axe can set up pointed stones only once")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN { MOVE(player, MOVE_STONE_AXE); }
TURN { MOVE(player, MOVE_STONE_AXE); }
TURN { MOVE(player, MOVE_STONE_AXE); }
TURN { MOVE(player, MOVE_STONE_AXE); }
TURN { SWITCH(opponent, 1); }
} SCENE {
s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP);
ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player);
HP_BAR(opponent);
MESSAGE("Pointed stones float in the air around the opposing team!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player);
HP_BAR(opponent);
NOT MESSAGE("Pointed stones float in the air around the opposing team!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player);
HP_BAR(opponent);
NOT MESSAGE("Pointed stones float in the air around the opposing team!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player);
HP_BAR(opponent);
NOT MESSAGE("Pointed stones float in the air around the opposing team!");
MESSAGE("2 sent out Wynaut!");
HP_BAR(opponent, damage: maxHP / 8);
MESSAGE("Pointed stones dug into Foe Wynaut!");
}
}

View File

@ -1,6 +1,11 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(MoveHasAdditionalEffect(MOVE_SYRUP_BOMB, MOVE_EFFECT_SYRUP_BOMB) == TRUE);
}
SINGLE_BATTLE_TEST("Syrup Bomb covers the foe in sticky syrup for 3 turns")
{
u8 j;

View File

@ -5,6 +5,7 @@ ASSUMPTIONS
{
ASSUME(gMovesInfo[MOVE_INFERNAL_PARADE].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS);
ASSUME(gMovesInfo[MOVE_INFERNAL_PARADE].argument == STATUS1_ANY);
ASSUME(MoveHasAdditionalEffect(MOVE_INFERNAL_PARADE, MOVE_EFFECT_BURN) == TRUE);
}
SINGLE_BATTLE_TEST("Infernal Parade inflicts burn")