Compare commits

...

63 Commits

Author SHA1 Message Date
Mumble
ad8598406c
Merge branch 'beta' into learnMovePhase 2024-09-02 20:47:17 -07:00
PigeonBar
587360c8da
[Bug] Fix eggs having exploitable RNG (#3913)
* [Bug] Fix eggs having exploitable RNG

* Fix Wind Rider test having random chance to fail

* Revert egg's ID back to its own unseeded generation

* Remove change from wind rider test

---------

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
Co-authored-by: Mumble <171087428+frutescens@users.noreply.github.com>
2024-09-02 22:18:18 -04:00
Mumble
deb4e9dd24
[UI] Run history fixes and improvements (#3987)
* Challenge Rules Word Wrap

* Fixed Modifiers

* Fixed item count color.

* removed .js endings

---------

Co-authored-by: frutescens <info@laptop>
2024-09-02 22:14:09 -04:00
Amani H.
89e80f3deb
[Refactor/Bug/Move] Overhaul Stats and Battle Items, Implement Several Stat Moves (#2699)
* Create Getters, Setters, and Types

* Work on `pokemon.ts`

* Adjust Types, Refactor `White Herb` Modifier

* Migrate `TempBattleStat` Usage

* Refactor `PokemonBaseStatModifier` Slightly

* Remove `BattleStat`, Use "Stat Stages" & New Names

* Address Phase `integers`

* Finalize `BattleStat` Removal

* Address Minor Manual NITs

* Apply Own Review Suggestions

* Fix Syntax Error

* Add Docs

* Overhaul X Items

* Implement Guard and Power Split with Unit Tests

* Add Several Unit Tests and Fixes

* Implement Speed Swap with Unit Tests

* Fix Keys in Summary Menu

* Fix Starf Berry Raising EVA and ACC

* Fix Contrary & Simple, Verify with Unit Tests

* Implement Power & Guard Swap with Unit Tests

* Add Move Effect Message to Speed Swap

* Add Move Effect Message to Power & Guard Split

* Add Localization Entries

* Adjust Last X Item Unit Test

* Overhaul X Items Unit Tests

* Finish Missing Docs

* Revamp Crit-Based Unit Tests & Dire Hit

* Address Initial NITs

* Apply NIT Batch

Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com>

* Fix Moody Test

* Address Multiple Messages for `ProtectStatAbAttr`

* Change `ignoreOverride` to `bypassSummonData`

* Adjust Italian Localization

Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com>

* Fix Moody

---------

Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com>
Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com>
2024-09-02 22:12:34 -04:00
NightKev
947400f2b9
[Test] Add tests for Freeze-Dry (#3990) 2024-09-02 22:11:35 -04:00
ckincaid17
234d617464
[Bug] Let Shedinja relearn egg moves when evolved from a starter (#3915)
* [Bug] Let Shedinja relearn egg moves when evolved from a starter

* Copy met level as well
2024-09-02 19:10:33 -07:00
cam
672bc77c58
Added Donate Link to Community Page (#3989)
* Added Donate Link to Community Page

Removed the cookies from the html and added a Donations link on the community page (with guidance from Walker)

* Added Translation Key
2024-09-03 01:37:53 +01:00
frutescens
2fd4786346 Fixed bracketing and added parameter types 2024-09-02 16:45:45 -07:00
Mumble
12dda98fe3
Merge branch 'beta' into learnMovePhase 2024-09-02 16:40:52 -07:00
AJ Fontaine
b0360123e0
[Balance] [QoL] [Feature] Allow mons to track and relearn used TMs (#3656)
* Allow mons to track and relearn used TMs

* Fix issue getting level moves

* Apply suggested safety measures
2024-09-02 16:25:41 -07:00
Leo Kim
60becf54f8
[Enhancement][UI] Passive ability will be displayed even if it is locked or disabled (#3976)
* show passive name even if it is locked or disabled

* update passive label with updated new icons

* fix icon remains bug, when go start button and filterbar
2024-09-02 23:49:11 +01:00
Lugiad
df1c6efe2d
[Localization] [Fix] Restoring inverted rival dialogues in all dialogue-misc.json locales (#3986)
* Update dialogue-misc.json

* Update dialogue-misc.json

* Update dialogue-misc.json

* Update dialogue-misc.json

* Update dialogue-misc.json

* Update dialogue-misc.json

* Update dialogue-misc.json
2024-09-02 18:33:21 -04:00
MokaStitcher
89a1ff7b5b
[Bug] Fix Inconsistency with stat boost when breaking through boss shields + tests (#3785)
* fix boss shield stats up calculation and add tests

* update test to remove usage of deprecated startBattle
2024-09-03 00:29:15 +02:00
Lugiad
9c30e5b213
[Localization] [FR] [Fix] Dialogue fixs batch + ignored entries form previous PR (#3985)
* Update dialogue-misc.json

* Update dialogue.json

* Update dialogue.json

* Update dialogue-misc.json

* Update dialogue.json

* Update dialogue.json

* Update dialogue.json

* Update dialogue.json

* Update dialogue.json

* Update dialogue.json
2024-09-02 18:03:21 -04:00
njahja
03567ed56c
[Bugfix #3930] Moves That a Pokemon Knows and are not in their List of Learnable TMs Display as "Not Able" Rather than Learned (#3935)
* fix for [Bug] Moves That a Pokemon Knows and are not in their List of Learnable TMs Display as "Not Able" Rather than Learned #3930

* convert switch case block to if/elif/else
2024-09-02 17:59:26 -04:00
Chapybara-jp
4c4a2c1900
[Localisation] [JA] Translated trainer-classes.json, trainer-names.json, trainer-titles.json (#3978)
* [Localisation] [JA] trainer-classes.json

Names taken from Poke Corpus and Bulbapedia. 
Some double team names do not exist in the official games so I created some new fitting/localised/funny ones (e.g. (solo) サイキッカー -> (double) サイキッ家)
As we are using Scarlet/Violet Kanji usage conventions, I decided to write all class titles that were Hiragana only in BW/B2W2 with Kanji instead.

* Translate trainer-names.json

Should we localise the names of Finn and Ivy? 
Two possible ideas:
Finn -> チトセ (Finn may come from the "Whale Fin" snake plant; Latin Name Sansevieria Masoniana. The Sansevieria family is known as チトセラン属 in Japanese. チトセ(千歳 millenium;long time) can be a reference to endless loop of Classic Mode)
Ivy -> タイチ (Ivy -> IV. IV in Japanese is 固体値 (こたいち). タイチ also sounds like  対置 (opposition)

* Update trainer-classes.json

* Translate trainer-titles.json
2024-09-02 17:57:24 -04:00
Mumble
ce5a92325c
[UI][Misc] Rename Space to Action in voucher/achv menu (#3982)
* Changing only achvs-ui-handler for now

* Add ACTION sprite

---------

Co-authored-by: frutescens <info@laptop>
Co-authored-by: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com>
2024-09-02 17:54:56 -04:00
Asdar
e9998fcc16
[Localisation] [ES] Bugfix pokemon-form-battle.json (#3981)
Removed an extra tab added by GitLocalize
2024-09-02 14:20:05 -07:00
timchi94
aae4d6933c
[QoL] Enable female gender for all default starters and all existing s… (#2194)
* fix: Enable female gender for all default starters and all existing saves

* Fixed Fresh Start so it doesn't restrict gender

---------

Co-authored-by: Mumble <171087428+frutescens@users.noreply.github.com>
Co-authored-by: frutescens <info@laptop>
2024-09-02 12:43:44 -07:00
Mumble
256dfbde6e
Fixed conditional (#3983)
Co-authored-by: frutescens <info@laptop>
2024-09-02 21:27:29 +02:00
Jannik Tappert
86316bd6f8
[Localization] [DE] DisguiseChange (#3979)
* [Localization] [DE] DisguiseChange

* Update src/locales/de/pokemon-form-battle.json
2024-09-02 10:55:57 -07:00
Jannik Tappert
ad778101e4
[DEV] Remove female achv file (#3977) 2024-09-02 10:32:49 -07:00
NightKev
c20f37bcf9
[P3 Bug] Add dialog lines for Rood (#3970) 2024-09-02 01:39:52 -04:00
AJ Fontaine
39cfe69cd9
[Bug] Fix affix used when enemy trainer switches Pokemon (#3899) 2024-09-02 01:25:45 -04:00
chaosgrimmon
634bfb7900
[Sprite] Pelipper variant cleanup (#3969)
* [Sprite] Sprite fix Pelipper front

* [Sprite] Map epic Pelipper front

* Delete public/images/pokemon/variant/279_1.png

* Delete public/images/pokemon/variant/279_2.png

* Delete public/images/pokemon/variant/279_3.png

* Delete public/images/pokemon/variant/279_1.json

* Delete public/images/pokemon/variant/279_2.json

* Delete public/images/pokemon/variant/279_3.json

* [Sprite] Use epic Pelipper palette

* [Sprite] Index base shiny Pelipper front
2024-09-02 01:16:47 -04:00
Madmadness65
434b823112
[Enhancement/Item] Separate form change items into non-rare and rare (#3957)
* Separate form change items into non-rare and rare

* Remove unnecessary !!
2024-09-02 01:15:52 -04:00
NightKev
744c8f8845
[Test] Update/modernize/fix some tests (#3968) 2024-09-02 01:06:20 -04:00
Mumble
0cbdaab28e
[UI][Misc] Force users to have an active challenge (#3953)
* I hope this is good enough

* renamed variable to better name

* Remove random newline

* When player is ready cool box

* Fixed cancel behavior

* standardized action/cancel behavior

* Added comments

---------

Co-authored-by: frutescens <info@laptop>
Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
2024-09-02 00:32:22 -04:00
NightKev
84ef7f0683
[Balance] Double base shiny odds, adjusted Shiny Charm to match (#3964)
* Double shiny odds

"anyone wanna double the base shiny odds for me" - damo, 2024

* Adjust Shiny Charm to compensate for increased base odds

* Remove magic number

* Update tsdoc and remove unneeded `console.log()`

* Clarify tsdoc
2024-09-02 00:26:47 -04:00
Mumble
1e432fc74b
[Bug] Fixed pre-set volume oversight (#3963)
Co-authored-by: frutescens <info@laptop>
2024-09-02 00:26:35 -04:00
NightKev
f54846f735
[Move] Implement Safeguard (#3447)
* Implemented safeguard and tests

* Update tests

* Add i18n placeholders

* Implement Safeguard for non-volatile statuses

* Implement protection from confusion and Yawn

* Replace `target instanceof EnemyPokemon` with `target.isPlayer()`

* Minor capitalization change

* First batch of i18n

Adds fr, pt_BR, zh_CN, zh_TW

Co-authored-by: Lugiad' <adrien.grivel@hotmail.fr>
Co-authored-by: José Ricardo Fleury Oliveira <josefleury@discente.ufg.br>
Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com>

* Add more translations

+ de, es, ko

Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com>
Co-authored-by: Asdar <asdargmng@gmail.com>
Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com>

* Fix broken character in es translation

* Update test with new function definition

* Add Italian translation

Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com>

* Add move category check for message display

Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com>

* Update phase imports in Safeguard test

* Fix test imports

* Update tests

---------

Co-authored-by: Joshua Keegan <keeganjosh@vuw.ac.nz>
Co-authored-by: Lugiad' <adrien.grivel@hotmail.fr>
Co-authored-by: José Ricardo Fleury Oliveira <josefleury@discente.ufg.br>
Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com>
Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com>
Co-authored-by: Asdar <asdargmng@gmail.com>
Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com>
Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com>
Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com>
2024-09-02 00:26:20 -04:00
gitlocalize-app[bot]
2d5bd57c44
[Localization] [FR] pokemon-info.json and dialogue-misc.json completion (#3761)
* Translate pokemon-info.json via GitLocalize

* Update dialogue-misc.json

---------

Co-authored-by: Lugiad <adrien.grivel@hotmail.fr>
2024-09-02 00:25:07 -04:00
NightKev
f3c41edf5e
[Bug] Don't reset turn count or used moves array at the start of a new wave (fakeout and gigaton hammer) (#3606)
* Don't reset turn count or used moves array at the start of a new wave

* Add tests
2024-09-02 00:24:12 -04:00
NightKev
69a9916b4c
[Bug] Moves copied by Dancer should not consume PP (#3623)
* Moves copied by Dancer should not consume PP

* Add test for Dancer (unfinished)

* Delete src/test/abilities/dancer.test.ts

This test is not finished lol

* Add test
2024-09-02 00:21:56 -04:00
PrabbyDD
4553c1c34f
[Bug] Fix Octolock Ignores Clear Body, White Smoke, Big Pecks #3876
Pecks, Clear Body, and White Smoke

Adding tests for octolock
2024-09-02 00:20:16 -04:00
gitlocalize-app[bot]
22d31bc704
[Localisation] [ES] Review and finished pokemon-form and pokemon-form-battle (#3903)
* Translate pokemon-form.json via GitLocalize

* Translate pokemon-form.json via GitLocalize

* Translate pokemon-form-battle.json via GitLocalize

* Translate pokemon-form-battle.json via GitLocalize

* Update src/locales/es/pokemon-form.json

Co-authored-by: Asdar <asdargmng@gmail.com>

---------

Co-authored-by: Rafa <rhijano@hotmail.com>
Co-authored-by: LilyAlternis <tias.a2002@gmail.com>
Co-authored-by: Asdar <asdargmng@gmail.com>
Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com>
2024-09-02 00:19:02 -04:00
gitlocalize-app[bot]
a894438e24
[Localisation] [JA] Several files translated (#3916)
* Translate ability-trigger.json via GitLocalize

* Translate game-stats-ui-handler.json via GitLocalize

* Translate modifier-select-ui-handler.json via GitLocalize

* Translate pokemon-form-battle.json via GitLocalize

* Translate battle-info.json via GitLocalize

* Translate menu.json via GitLocalize

* Translate battler-tags.json via GitLocalize

* Translate pokemon-info.json via GitLocalize

* Translate achv.json via GitLocalize

* Translate berry.json via GitLocalize

* Translate achv-female.json via GitLocalize

* Translate challenges.json via GitLocalize

* Translate menu-ui-handler.json via GitLocalize

* Translate egg.json via GitLocalize

* Translate pokemon.json via GitLocalize

* Translate pokemon.json via GitLocalize

* Translate starter-select-ui-handler.json via GitLocalize

* Translate command-ui-handler.json via GitLocalize

* Translate settings.json via GitLocalize

* Update achv-female.json

* Update menu-ui-handler.json

* Update settings.json

* Update achv.json

* Update achv.json

* Update achv.json

* Delete src/locales/ja/achv-female.json

* Update achv.json

Compared in-game, with these changes it should all look good.

* Update challenges.json

* Update game-mode.json

* Update menu.json

* Update settings.json

* Translate game-stats-ui-handler.json via GitLocalize

* Update game-stats-ui-handler.json

* Update settings.json

---------

Co-authored-by: gitlocalize-app[bot] <55277160+gitlocalize-app[bot]@users.noreply.github.com>
Co-authored-by: Enoch <enoch.jwsong@gmail.com>
Co-authored-by: Chapybara-jp <charlie.beer@hotmail.com>
2024-09-02 00:18:49 -04:00
gitlocalize-app[bot]
dd033f4ec1
[Localization] [pt_BR] Updated many translations (#3917)
* Translate tutorial.json via GitLocalize

* Translate challenges.json via GitLocalize

* Translate menu-ui-handler.json via GitLocalize

---------

Co-authored-by: José Ricardo <josefleury@discente.ufg.br>
2024-09-02 00:17:05 -04:00
gitlocalize-app[bot]
0671a244a8
[Localisation] [ES] Reviewed and finished ability.json and bgm-name.json (#3920)
* Translate ability.json via GitLocalize

* Translate ability.json via GitLocalize

* Translate bgm-name.json via GitLocalize

---------

Co-authored-by: Asdar <asdargmng@gmail.com>
Co-authored-by: LilyAlternis <tias.a2002@gmail.com>
2024-09-02 00:16:54 -04:00
Mumble
c4c9cf939e
[Bug] Moved RNG call if the Pokemon's ability hasn't been determined (#3966)
Co-authored-by: frutescens <info@laptop>
2024-09-02 00:09:46 -04:00
gitlocalize-app[bot]
8edb9ca65b
[Localizaiton(pt_br)] Translate pokemon-summary.json via GitLocalize (#3868)
Co-authored-by: José Ricardo <josefleury@discente.ufg.br>
2024-09-01 23:57:48 -04:00
gitlocalize-app[bot]
08fe9e1e21
[Localization(fr)] Translate trainer-classes.json (#3882)
Co-authored-by: Lugiad <adrien.grivel@hotmail.fr>
2024-09-01 23:57:28 -04:00
gitlocalize-app[bot]
781bfd831f
[Localization] pokemon names, party-ui-handler, pokemon-info and pokemon-info-container localizations for italian (#3836)
* Translate pokemon-info-container.json via GitLocalize

* Translate pokemon-info.json via GitLocalize

* Translate party-ui-handler.json via GitLocalize

* Translate pokemon.json via GitLocalize

---------

Co-authored-by: Niccolò <niccolo.pulcini.07@gmail.com>
2024-09-01 23:55:07 -04:00
innerthunder
e29f1fe5fd
[Bug] Fix some trapping moves' interactions with Ghost-type Pokemon (#3936)
* Fix secondary effects to trapping moves not applying to Ghost types

* Docs for `isTrapped`

* more `isTrapped` cleanup

* Remove .js from imports
2024-09-01 23:39:26 -04:00
NightKev
1fd662111e
[Test] Tests now default to using "Set" battle style (#3728)
* Tests now default to using "Set" battle style

* Fix typo
2024-09-01 23:32:31 -04:00
Adrian T.
56b39032b9
[Dev] add script to create test boilerplate file (#3954)
* add script to create test boilerplate file

* add more docs

* add timeout to template
2024-09-01 23:30:27 -04:00
gitlocalize-app[bot]
80828359e2
[Localization(en)] Fix Roark Dialouge (#3873)
* Translate dialogue-male.json via GitLocalize

* Added female

* !

* Update src/locales/en/dialogue-male.json

* Remove empty files

* Added missing comma

---------

Co-authored-by: Jannik Tappert <tappertjannik@googlemail.com>
Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com>
2024-09-01 23:28:10 -04:00
NightKev
709066bd1a
[Move] Finish Alluring Voice, Burning Jealousy and Lash Out (#3508)
* Implement Alluring Voice and Burning Jealousy

* Fix Alluring Voice and add tests

* Replace `BattlerTag.STATS_BOOSTED` with `PokemonTurnData` field

* Work around bug with turn data

* Remove unused variable

* Replace nearby instances of `integer` with `number`

* Fix imports

* Implement Lash Out

* Rename `battleStats(In|De)crease` -> `battleStats(In|De)creased`

* Fix copy/paste error

Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com>

* Update tests

---------

Co-authored-by: ElliottSimmonds <simmonds.elliott@yahoo.co.uk>
Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com>
Co-authored-by: Mumble <171087428+frutescens@users.noreply.github.com>
2024-09-01 22:57:07 -04:00
MokaStitcher
dcb03f4ee9
[Test] Add test for final boss fight phase switch (#3847)
* implement test for final boss encounter phase switch

* Update Eternatus tests & helper function

* fix endless_boss test following GameManager update

---------

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
2024-09-01 22:47:22 -04:00
gitlocalize-app[bot]
14e0c66ed9
[Localisation] [ES] Finished and reviewed terrain, modifier, trainer-names, splash messages (#3848)
* Translate splash-messages.json via GitLocalize

* Translate splash-messages.json via GitLocalize

* Translate trainer-names.json via GitLocalize

* Translate modifier.json via GitLocalize

* Translate modifier.json via GitLocalize

* Translate modifier.json via GitLocalize

* Translate terrain.json via GitLocalize

* Update src/locales/es/trainer-names.json

Co-authored-by: Asdar <asdargmng@gmail.com>

---------

Co-authored-by: LilyAlternis <tias.a2002@gmail.com>
Co-authored-by: Asdar <asdargmng@gmail.com>
Co-authored-by: Rafa <rhijano@hotmail.com>
Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com>
Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
2024-09-01 22:46:53 -04:00
gitlocalize-app[bot]
49c3158fd1
[Localization(ko)] Change ghost type challenge acv for achv-female (#3866)
Co-authored-by: sodam <sodamlee315@gmail.com>
Co-authored-by: Enoch <enoch.jwsong@gmail.com>
Co-authored-by: KimJeongSun <leo@atlaslabs.ai>
2024-09-01 22:45:42 -04:00
gitlocalize-app[bot]
c070f110e5
[Localization(fr)] Additional nature entries in pokemon-summary (#3869)
Co-authored-by: Lugiad <adrien.grivel@hotmail.fr>
2024-09-01 22:44:58 -04:00
flx-sta
0c28da75b4
[Bug] Fix Opponent pokemon sprite disappears after using Roar and Dragon Tail #481 (#3927) 2024-09-01 22:42:23 -04:00
Adrian T.
64368b62bc
[Ability] Add form change support for Flower Gift (#3941)
* add form change support for flower gift

* fix nits
2024-09-01 22:39:42 -04:00
Adrian T.
3bcee779e2
[Move] Fully implement dragon cheer (#3959) 2024-09-01 22:39:12 -04:00
chaosgrimmon
97e3250f62
[Sprite] Chien-Pao sprite cleanup (#3961)
* Delete public/images/pokemon/exp/shiny/1002b.png

* Delete public/images/pokemon/exp/shiny/1002s.png

* Delete public/images/pokemon/exp/shiny/1002sb.png
2024-09-01 22:31:25 -04:00
innerthunder
7755f798fd
[Ability] Implement Tera Shell (#3856)
* Implement Tera Shell

* Apply suggestions from code review

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>

* Update src/data/ability.ts

Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com>

* Add comments and fixed damage condition to `applyPreDefend`

* Fix speed tie breaking things in tera shell test

* Change deprecated `startBattle` calls

---------

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com>
2024-09-02 02:21:11 +01:00
cadi
a41133a55a
blocking inputs while showing texts to prevent moveing cursor (#2371)
Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
2024-09-01 15:26:45 -07:00
AJ Fontaine
335d32e0d7
[UI] [QoL] [Enhancement] Exclude redundant species from certain filters in starter select (#3910)
* Exclude species without HA from HA filters in starter select

* Remove candyless starters from passive/cost reduction filters
2024-09-01 15:24:37 -07:00
Mumble
55e0d65ac8
[Refactor] Improvements on getOrder() (#3547)
* Moved getOrder() into TurnStartPhase

* Cleaned up bypass speed checks

* Revert "Cleaned up bypass speed checks"

This reverts commit 11150254f5.

* Added comments.

* Fixed up some inconsistencies

* changed isSameBracket check

* changed isSameBracket check p2

* changed isSameBracket check p3

* changed isSameBracket check p3

* Fixed up conditionals + stall/M.m

* Seems OK

* Update battle-spec.ts

* Updated tests to use new functions introduced. Less intuitive, but faster.

* Update src/phases.ts

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>

* Moved getOrder() into TurnStartPhase

* Cleaned up bypass speed checks

* Revert "Cleaned up bypass speed checks"

This reverts commit 11150254f5.

* Added comments.

* Fixed up some inconsistencies

* changed isSameBracket check

* changed isSameBracket check p2

* changed isSameBracket check p3

* changed isSameBracket check p3

* Fixed up conditionals + stall/M.m

* Seems OK

* Update battle-spec.ts

* Updated tests to use new functions introduced. Less intuitive, but faster.

* Removed import

* i hate git

* Moved getOrder() into TurnStartPhase

* Seems OK

* missing import

* Added Snooze's review

* Added test fixes and removed unwanted edit.

* fixed dynamax cannon test

* typedocs fixes

* Updating battle-order.test.ts

* merge fixes

* ughhh

* Update src/test/abilities/mycelium_might.test.ts

Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com>

* tsdocs :)

* Fixed tests

* Update src/phases/turn-start-phase.ts

Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com>

* Update src/phases/turn-start-phase.ts

Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com>

* innerthunder's fixes

* commas

* Mocked stats instead of directly changing them

---------

Co-authored-by: Frutescens <info@laptop>
Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com>
2024-09-01 15:23:25 -07:00
flx-sta
69a9e6a365
Localization: remove all "<key>_female": null entries in /en (#3918) 2024-09-02 00:21:48 +02:00
Frederico Santos
55acf0eeac
Merge branch 'main' into beta 2024-09-01 23:10:40 +01:00
NightKev
762aa9e49b
Update the GitHub pull request template (#3755) 2024-08-25 17:28:29 +01:00
285 changed files with 10322 additions and 18256 deletions

View File

@ -30,7 +30,7 @@
- [ ] The PR is self-contained and cannot be split into smaller PRs? - [ ] The PR is self-contained and cannot be split into smaller PRs?
- [ ] Have I provided a clear explanation of the changes? - [ ] Have I provided a clear explanation of the changes?
- [ ] Have I considered writing automated tests for the issue? - [ ] Have I considered writing automated tests for the issue?
- [ ] If I have text, did I add make it translatable and added a key in the English language? - [ ] If I have text, did I make it translatable and add a key in the English locale file(s)?
- [ ] Have I tested the changes (manually)? - [ ] Have I tested the changes (manually)?
- [ ] Are all unit tests still passing? (`npm run test`) - [ ] Are all unit tests still passing? (`npm run test`)
- [ ] Are the changes visual? - [ ] Are the changes visual?

101
create-test-boilerplate.js Normal file
View File

@ -0,0 +1,101 @@
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
/**
* This script creates a test boilerplate file for a move or ability.
* @param {string} type - The type of test to create. Either "move" or "ability".
* @param {string} fileName - The name of the file to create.
* @example npm run create-test move tackle
*/
// Get the directory name of the current module file
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Get the arguments from the command line
const args = process.argv.slice(2);
const type = args[0]; // "move" or "ability"
let fileName = args[1]; // The file name
if (!type || !fileName) {
console.error('Please provide both a type ("move" or "ability") and a file name.');
process.exit(1);
}
// Convert fileName from to snake_case if camelCase is given
fileName = fileName.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
// Format the description for the test case
const formattedName = fileName
.replace(/_/g, ' ')
.replace(/\b\w/g, char => char.toUpperCase());
// Determine the directory based on the type
let dir;
let description;
if (type === 'move') {
dir = path.join(__dirname, 'src', 'test', 'moves');
description = `Moves - ${formattedName}`;
} else if (type === 'ability') {
dir = path.join(__dirname, 'src', 'test', 'abilities');
description = `Abilities - ${formattedName}`;
} else {
console.error('Invalid type. Please use "move" or "ability".');
process.exit(1);
}
// Ensure the directory exists
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
// Create the file with the given name
const filePath = path.join(dir, `${fileName}.test.ts`);
if (fs.existsSync(filePath)) {
console.error(`File "${fileName}.test.ts" already exists.`);
process.exit(1);
}
// Define the content template
const content = `import { Abilities } from "#enums/abilities";
import GameManager from "#test/utils/gameManager";
import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, it } from "vitest";
describe("${description}", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
const TIMEOUT = 20 * 1000;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override
.battleType("single")
.enemyAbility(Abilities.BALL_FETCH)
.enemyMoveset(SPLASH_ONLY);
});
it("test case", async () => {
// await game.classicMode.startBattle();
// game.move.select();
}, TIMEOUT);
});
`;
// Write the template content to the file
fs.writeFileSync(filePath, content, 'utf8');
console.log(`File created at: ${filePath}`);

View File

@ -191,15 +191,15 @@ Now that the enemy Pokémon with the best matchup score is on the field (assumin
We then need to apply a 2x multiplier for the move's type effectiveness and a 1.5x multiplier since STAB applies. After applying these multipliers, the final score for this move is **75**. We then need to apply a 2x multiplier for the move's type effectiveness and a 1.5x multiplier since STAB applies. After applying these multipliers, the final score for this move is **75**.
- **Swords Dance**: As a non-attacking move, this move's benefit score is derived entirely from the sum of its attributes' benefit scores. Swords Dance's `StatChangeAttr` has a user benefit score of 0 and a target benefit score that, in this case, simplifies to - **Swords Dance**: As a non-attacking move, this move's benefit score is derived entirely from the sum of its attributes' benefit scores. Swords Dance's `StatStageChangeAttr` has a user benefit score of 0 and a target benefit score that, in this case, simplifies to
$\text{TBS}=4\times \text{levels} + (-2\times \text{sign(levels)})$ $\text{TBS}=4\times \text{levels} + (-2\times \text{sign(levels)})$
where `levels` is the number of stat stages added by the attribute (in this case, +2). The final score for this move is **6** (Note: because this move is self-targeted, we don't flip the sign of TBS when computing the target score). where `levels` is the number of stat stages added by the attribute (in this case, +2). The final score for this move is **6** (Note: because this move is self-targeted, we don't flip the sign of TBS when computing the target score).
- **Crush Claw**: This move is a 75-power Normal-type physical attack with a 50 percent chance to lower the target's Defense by one stage. The additional effect is implemented by the same `StatChangeAttr` as Swords Dance, so we can use the same formulas from before to compute the total TBS and base target score. - **Crush Claw**: This move is a 75-power Normal-type physical attack with a 50 percent chance to lower the target's Defense by one stage. The additional effect is implemented by the same `StatStageChangeAttr` as Swords Dance, so we can use the same formulas from before to compute the total TBS and base target score.
$\text{TBS}=\text{getTargetBenefitScore(StatChangeAttr)}-\text{attackScore}$ $\text{TBS}=\text{getTargetBenefitScore(StatStageChangeAttr)}-\text{attackScore}$
$\text{TBS}=(-4 + 2)-(-2\times 2 + \lfloor \frac{75}{5} \rfloor)=-2-11=-13$ $\text{TBS}=(-4 + 2)-(-2\times 2 + \lfloor \frac{75}{5} \rfloor)=-2-11=-13$
@ -221,4 +221,4 @@ When implementing a new move attribute, it's important to override `MoveAttr`'s
- A move's **user benefit score (UBS)** incentivizes (or discourages) the move's usage in general. A positive UBS gives the move more incentive to be used, while a negative UBS gives the move less incentive. - A move's **user benefit score (UBS)** incentivizes (or discourages) the move's usage in general. A positive UBS gives the move more incentive to be used, while a negative UBS gives the move less incentive.
- A move's **target benefit score (TBS)** incentivizes (or discourages) the move's usage on a specific target. A positive TBS indicates the move is better used on the user or its allies, while a negative TBS indicates the move is better used on enemies. - A move's **target benefit score (TBS)** incentivizes (or discourages) the move's usage on a specific target. A positive TBS indicates the move is better used on the user or its allies, while a negative TBS indicates the move is better used on enemies.
- **The total benefit score (UBS + TBS) of a move should never be 0.** The move selection algorithm assumes the move's benefit score is unimplemented if the total score is 0 and penalizes the move's usage as a result. With status moves especially, it's important to have some form of implementation among the move's attributes to avoid this scenario. - **The total benefit score (UBS + TBS) of a move should never be 0.** The move selection algorithm assumes the move's benefit score is unimplemented if the total score is 0 and penalizes the move's usage as a result. With status moves especially, it's important to have some form of implementation among the move's attributes to avoid this scenario.
- **Score functions that use formulas should include comments.** If your attribute requires complex logic or formulas to calculate benefit scores, please add comments to explain how the logic works and its intended effect on the enemy's decision making. - **Score functions that use formulas should include comments.** If your attribute requires complex logic or formulas to calculate benefit scores, please add comments to explain how the logic works and its intended effect on the enemy's decision making.

View File

@ -23,15 +23,6 @@ body {
} }
} }
#links {
width: 90%;
text-align: center;
position: fixed;
bottom: 0;
display: flex;
justify-content: space-around;
}
#app { #app {
display: flex; display: flex;
justify-content: center; justify-content: center;
@ -93,7 +84,7 @@ input:-internal-autofill-selected {
@media (orientation: landscape) { @media (orientation: landscape) {
#touchControls { #touchControls {
--controls-size: 20vh; --controls-size: 20vh;
--text-shadow-size: 1.3vh; --text-shadow-size: 1.3vh;
--small-button-offset: 4vh; --small-button-offset: 4vh;
} }

View File

@ -39,7 +39,6 @@
</style> </style>
<link rel="stylesheet" type="text/css" href="./index.css" /> <link rel="stylesheet" type="text/css" href="./index.css" />
<link rel="manifest" href="./manifest.webmanifest"> <link rel="manifest" href="./manifest.webmanifest">
<script type="text/javascript" src="https://app.termly.io/resource-blocker/c5dbfa2f-9723-4c0f-a84b-2895124e851f?autoBlock=on"></script>
<script> <script>
if ("serviceWorker" in navigator) { if ("serviceWorker" in navigator) {
window.addEventListener("load", function () { window.addEventListener("load", function () {
@ -144,13 +143,6 @@
</div> </div>
</div> </div>
<div id="tnc-links">
<a href="#" class="termly-display-preferences" style="display: none;" target="_blank" rel="noreferrer noopener">Consent Preferences</a>
<a href="https://app.termly.io/policy-viewer/policy.html?policyUUID=bc96778b-3f04-4d25-bafc-0deba53e8bec" target="_blank" rel="noreferrer noopener">Privacy Policy</a>
<a href="https://app.termly.io/policy-viewer/policy.html?policyUUID=8b523c05-7ec2-4646-9534-5bd61b386e2a" target="_blank" rel="noreferrer noopener">Cookie Disclaimer</a>
<a href="https://app.termly.io/policy-viewer/policy.html?policyUUID=b01e092a-9721-477f-8356-45576702ff9e" target="_blank" rel="noreferrer noopener">Terms & Conditions</a>
<a href="https://app.termly.io/policy-viewer/policy.html?policyUUID=3b5d1928-3f5b-4ee1-b8df-2d6c276b0bcc" target="_blank" rel="noreferrer noopener">Acceptable Use Policy</a>
</div>
<script type="module" src="./src/main.ts"></script> <script type="module" src="./src/main.ts"></script>
<script src="./src/touch-controls.ts" type="module"></script> <script src="./src/touch-controls.ts" type="module"></script>
<script src="./src/debug.js" type="module"></script> <script src="./src/debug.js" type="module"></script>

View File

@ -18,7 +18,8 @@
"eslint-ci": "eslint .", "eslint-ci": "eslint .",
"docs": "typedoc", "docs": "typedoc",
"depcruise": "depcruise src", "depcruise": "depcruise src",
"depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg" "depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg",
"create-test": "node ./create-test-boilerplate.js"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.3.0", "@eslint/js": "^9.3.0",

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 55 KiB

View File

Before

Width:  |  Height:  |  Size: 405 B

After

Width:  |  Height:  |  Size: 405 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,38 +1,49 @@
{ {
"0": { "0": {
"bc4524": "af5457",
"31638c": "324a26", "31638c": "324a26",
"101010": "101010",
"5aa5ce": "40683c", "5aa5ce": "40683c",
"a5e6ff": "b6d9ac", "ce4252": "af2c4f",
"7bceef": "789c6e",
"ced6ef": "c09e99",
"737384": "774644",
"ffffff": "f1dcd8", "ffffff": "f1dcd8",
"8c4231": "420b0c", "8c4231": "420b0c",
"ffde4a": "c66f68",
"c57b31": "551917",
"ffffad": "f4bfb6", "ffffad": "f4bfb6",
"ffde4a": "c66f68",
"7bceef": "789c6e",
"a5e6ff": "b6d9ac",
"737384": "774644",
"f7b531": "af5457", "f7b531": "af5457",
"ce4252": "af2c4f", "c57b31": "551917",
"bc4524": "af5457", "ced6ef": "c09e99"
"00e5e7": "00e5e7"
}, },
"1": { "1": {
"bc4524": "3d325e",
"31638c": "143a72", "31638c": "143a72",
"101010": "101010",
"5aa5ce": "4060bc", "5aa5ce": "4060bc",
"a5e6ff": "b4b3ff", "ce4252": "b75558",
"7bceef": "657ddf",
"ced6ef": "a8b5dd",
"737384": "737384",
"ffffff": "e5ecff", "ffffff": "e5ecff",
"8c4231": "17103f", "8c4231": "17103f",
"ffde4a": "534e72",
"c57b31": "2a1f50",
"ffffad": "87879b", "ffffad": "87879b",
"ffde4a": "534e72",
"7bceef": "657ddf",
"a5e6ff": "b4b3ff",
"f7b531": "3d325e", "f7b531": "3d325e",
"ce4252": "b75558", "c57b31": "2a1f50",
"bc4524": "3d325e", "ced6ef": "a8b5dd"
"00e5e7": "00e5e7" },
"2": {
"ce4252": "215991",
"ffde4a": "f16f40",
"ffffad": "ffb274",
"737384": "884c43",
"c57b31": "761c03",
"7bceef": "be3d2f",
"8c4231": "5a0700",
"5aa5ce": "892722",
"8c4232": "761c03",
"ffffff": "f5e1d1",
"a5e6ff": "dd533a",
"f7b531": "bc4524",
"ced6ef": "d19e92",
"31638c": "610f0e"
} }
} }

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

View File

@ -1017,7 +1017,7 @@
"279": [ "279": [
1, 1,
1, 1,
2 1
], ],
"280": [ "280": [
0, 0,

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 B

View File

@ -841,12 +841,13 @@ export default class BattleScene extends SceneBase {
} }
addEnemyPokemon(species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void): EnemyPokemon { addEnemyPokemon(species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void): EnemyPokemon {
if (Overrides.OPP_LEVEL_OVERRIDE > 0) {
level = Overrides.OPP_LEVEL_OVERRIDE;
}
if (Overrides.OPP_SPECIES_OVERRIDE) { if (Overrides.OPP_SPECIES_OVERRIDE) {
species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE); species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE);
} // The fact that a Pokemon is a boss or not can change based on its Species and level
boss = this.getEncounterBossSegments(this.currentBattle.waveIndex, level, species) > 1;
if (Overrides.OPP_LEVEL_OVERRIDE !== 0) {
level = Overrides.OPP_LEVEL_OVERRIDE;
} }
const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource); const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource);
@ -973,6 +974,7 @@ export default class BattleScene extends SceneBase {
this.setSeed(Overrides.SEED_OVERRIDE || Utils.randomString(24)); this.setSeed(Overrides.SEED_OVERRIDE || Utils.randomString(24));
console.log("Seed:", this.seed); console.log("Seed:", this.seed);
this.resetSeed(); // Properly resets RNG after saving and quitting a session
this.disableMenu = false; this.disableMenu = false;
@ -1327,6 +1329,13 @@ export default class BattleScene extends SceneBase {
} }
getEncounterBossSegments(waveIndex: integer, level: integer, species?: PokemonSpecies, forceBoss: boolean = false): integer { getEncounterBossSegments(waveIndex: integer, level: integer, species?: PokemonSpecies, forceBoss: boolean = false): integer {
if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1) {
return Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE;
} else if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE === 1) {
// The rest of the code expects to be returned 0 and not 1 if the enemy is not a boss
return 0;
}
if (this.gameMode.isDaily && this.gameMode.isWaveFinal(waveIndex)) { if (this.gameMode.isDaily && this.gameMode.isWaveFinal(waveIndex)) {
return 5; return 5;
} }
@ -1791,6 +1800,7 @@ export default class BattleScene extends SceneBase {
config = config ?? {}; config = config ?? {};
try { try {
const keyDetails = key.split("/"); const keyDetails = key.split("/");
config["volume"] = config["volume"] ?? 1;
switch (keyDetails[0]) { switch (keyDetails[0]) {
case "level_up_fanfare": case "level_up_fanfare":
case "item_fanfare": case "item_fanfare":
@ -1800,11 +1810,11 @@ export default class BattleScene extends SceneBase {
case "evolution_fanfare": case "evolution_fanfare":
// These sounds are loaded in as BGM, but played as sound effects // These sounds are loaded in as BGM, but played as sound effects
// When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM() // When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM()
config["volume"] = this.masterVolume * this.bgmVolume; config["volume"] *= (this.masterVolume * this.bgmVolume);
break; break;
case "battle_anims": case "battle_anims":
case "cry": case "cry":
config["volume"] = this.masterVolume * this.fieldVolume; config["volume"] *= (this.masterVolume * this.fieldVolume);
//PRSFX sound files are unusually loud //PRSFX sound files are unusually loud
if (keyDetails[1].startsWith("PRSFX- ")) { if (keyDetails[1].startsWith("PRSFX- ")) {
config["volume"] *= 0.5; config["volume"] *= 0.5;
@ -1812,10 +1822,10 @@ export default class BattleScene extends SceneBase {
break; break;
case "ui": case "ui":
//As of, right now this applies to the "select", "menu_open", "error" sound effects //As of, right now this applies to the "select", "menu_open", "error" sound effects
config["volume"] = this.masterVolume * this.uiVolume; config["volume"] *= (this.masterVolume * this.uiVolume);
break; break;
case "se": case "se":
config["volume"] = this.masterVolume * this.seVolume; config["volume"] *= (this.masterVolume * this.seVolume);
break; break;
} }
this.sound.play(key, config); this.sound.play(key, config);

File diff suppressed because it is too large Load Diff

View File

@ -7,17 +7,17 @@ import Pokemon, { HitResult, PokemonMove } from "../field/pokemon";
import { StatusEffect } from "./status-effect"; import { StatusEffect } from "./status-effect";
import { BattlerIndex } from "../battle"; import { BattlerIndex } from "../battle";
import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability"; import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability";
import { BattleStat } from "./battle-stat"; import { Stat } from "#enums/stat";
import { CommonAnim, CommonBattleAnim } from "./battle-anims"; import { CommonAnim, CommonBattleAnim } from "./battle-anims";
import i18next from "i18next"; import i18next from "i18next";
import { Abilities } from "#enums/abilities"; import { Abilities } from "#enums/abilities";
import { ArenaTagType } from "#enums/arena-tag-type"; import { ArenaTagType } from "#enums/arena-tag-type";
import { BattlerTagType } from "#enums/battler-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type";
import { Moves } from "#enums/moves"; import { Moves } from "#enums/moves";
import { MoveEffectPhase } from "#app/phases/move-effect-phase.js"; import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
import { ShowAbilityPhase } from "#app/phases/show-ability-phase.js"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
import { StatChangePhase } from "#app/phases/stat-change-phase.js"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
export enum ArenaTagSide { export enum ArenaTagSide {
BOTH, BOTH,
@ -786,8 +786,8 @@ class StickyWebTag extends ArenaTrapTag {
applyAbAttrs(ProtectStatAbAttr, pokemon, cancelled); applyAbAttrs(ProtectStatAbAttr, pokemon, cancelled);
if (!cancelled.value) { if (!cancelled.value) {
pokemon.scene.queueMessage(i18next.t("arenaTag:stickyWebActivateTrap", { pokemonName: pokemon.getNameToRender() })); pokemon.scene.queueMessage(i18next.t("arenaTag:stickyWebActivateTrap", { pokemonName: pokemon.getNameToRender() }));
const statLevels = new Utils.NumberHolder(-1); const stages = new Utils.NumberHolder(-1);
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [BattleStat.SPD], statLevels.value)); pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [ Stat.SPD ], stages.value));
} }
} }
@ -875,7 +875,7 @@ class TailwindTag extends ArenaTag {
// Raise attack by one stage if party member has WIND_RIDER ability // Raise attack by one stage if party member has WIND_RIDER ability
if (pokemon.hasAbility(Abilities.WIND_RIDER)) { if (pokemon.hasAbility(Abilities.WIND_RIDER)) {
pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.getBattlerIndex())); pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.getBattlerIndex()));
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK], 1, true)); pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.ATK ], 1, true));
} }
} }
} }
@ -905,6 +905,21 @@ class HappyHourTag extends ArenaTag {
} }
} }
class SafeguardTag extends ArenaTag {
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
super(ArenaTagType.SAFEGUARD, turnCount, Moves.SAFEGUARD, sourceId, side);
}
onAdd(arena: Arena): void {
arena.scene.queueMessage(i18next.t(`arenaTag:safeguardOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`));
}
onRemove(arena: Arena): void {
arena.scene.queueMessage(i18next.t(`arenaTag:safeguardOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`));
}
}
export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null { export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null {
switch (tagType) { switch (tagType) {
case ArenaTagType.MIST: case ArenaTagType.MIST:
@ -950,6 +965,8 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov
return new TailwindTag(turnCount, sourceId, side); return new TailwindTag(turnCount, sourceId, side);
case ArenaTagType.HAPPY_HOUR: case ArenaTagType.HAPPY_HOUR:
return new HappyHourTag(turnCount, sourceId, side); return new HappyHourTag(turnCount, sourceId, side);
case ArenaTagType.SAFEGUARD:
return new SafeguardTag(turnCount, sourceId, side);
default: default:
return null; return null;
} }

View File

@ -788,10 +788,10 @@ export abstract class BattleAnim {
targetSprite.pipelineData["tone"] = [ 0.0, 0.0, 0.0, 0.0 ]; targetSprite.pipelineData["tone"] = [ 0.0, 0.0, 0.0, 0.0 ];
targetSprite.setAngle(0); targetSprite.setAngle(0);
if (!this.isHideUser() && userSprite) { if (!this.isHideUser() && userSprite) {
userSprite.setVisible(true); this.user?.getSprite().setVisible(true); // using this.user to fix context loss due to isOppAnim swap (#481)
} }
if (!this.isHideTarget() && (targetSprite !== userSprite || !this.isHideUser())) { if (!this.isHideTarget() && (targetSprite !== userSprite || !this.isHideUser())) {
targetSprite.setVisible(true); this.target?.getSprite().setVisible(true); // using this.target to fix context loss due to isOppAnim swap (#481)
} }
for (const ms of Object.values(spriteCache).flat()) { for (const ms of Object.values(spriteCache).flat()) {
if (ms) { if (ms) {

View File

@ -1,71 +0,0 @@
import i18next, { ParseKeys } from "i18next";
export enum BattleStat {
ATK,
DEF,
SPATK,
SPDEF,
SPD,
ACC,
EVA,
RAND,
HP
}
export function getBattleStatName(stat: BattleStat) {
switch (stat) {
case BattleStat.ATK:
return i18next.t("pokemonInfo:Stat.ATK");
case BattleStat.DEF:
return i18next.t("pokemonInfo:Stat.DEF");
case BattleStat.SPATK:
return i18next.t("pokemonInfo:Stat.SPATK");
case BattleStat.SPDEF:
return i18next.t("pokemonInfo:Stat.SPDEF");
case BattleStat.SPD:
return i18next.t("pokemonInfo:Stat.SPD");
case BattleStat.ACC:
return i18next.t("pokemonInfo:Stat.ACC");
case BattleStat.EVA:
return i18next.t("pokemonInfo:Stat.EVA");
case BattleStat.HP:
return i18next.t("pokemonInfo:Stat.HPStat");
default:
return "???";
}
}
export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean, count: number = 1) {
const stringKey = (() => {
if (up) {
switch (levels) {
case 1:
return "battle:statRose";
case 2:
return "battle:statSharplyRose";
case 3:
case 4:
case 5:
case 6:
return "battle:statRoseDrastically";
default:
return "battle:statWontGoAnyHigher";
}
} else {
switch (levels) {
case 1:
return "battle:statFell";
case 2:
return "battle:statHarshlyFell";
case 3:
case 4:
case 5:
case 6:
return "battle:statSeverelyFell";
default:
return "battle:statWontGoAnyLower";
}
}
})();
return i18next.t(stringKey as ParseKeys, { pokemonNameWithAffix, stats, count });
}

View File

@ -1,7 +1,6 @@
import { ChargeAnim, CommonAnim, CommonBattleAnim, MoveChargeAnim } from "./battle-anims"; import { ChargeAnim, CommonAnim, CommonBattleAnim, MoveChargeAnim } from "./battle-anims";
import { getPokemonNameWithAffix } from "../messages"; import { getPokemonNameWithAffix } from "../messages";
import Pokemon, { MoveResult, HitResult } from "../field/pokemon"; import Pokemon, { MoveResult, HitResult } from "../field/pokemon";
import { Stat, getStatName } from "./pokemon-stat";
import { StatusEffect } from "./status-effect"; import { StatusEffect } from "./status-effect";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { ChargeAttr, MoveFlags, allMoves } from "./move"; import { ChargeAttr, MoveFlags, allMoves } from "./move";
@ -9,20 +8,20 @@ import { Type } from "./type";
import { BlockNonDirectDamageAbAttr, FlinchEffectAbAttr, ReverseDrainAbAttr, applyAbAttrs } from "./ability"; import { BlockNonDirectDamageAbAttr, FlinchEffectAbAttr, ReverseDrainAbAttr, applyAbAttrs } from "./ability";
import { TerrainType } from "./terrain"; import { TerrainType } from "./terrain";
import { WeatherType } from "./weather"; import { WeatherType } from "./weather";
import { BattleStat } from "./battle-stat";
import { allAbilities } from "./ability"; import { allAbilities } from "./ability";
import { SpeciesFormChangeManualTrigger } from "./pokemon-forms"; import { SpeciesFormChangeManualTrigger } from "./pokemon-forms";
import { Abilities } from "#enums/abilities"; import { Abilities } from "#enums/abilities";
import { BattlerTagType } from "#enums/battler-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type";
import { Moves } from "#enums/moves"; import { Moves } from "#enums/moves";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import i18next from "#app/plugins/i18n.js"; import i18next from "#app/plugins/i18n";
import { CommonAnimPhase } from "#app/phases/common-anim-phase.js"; import { Stat, type BattleStat, type EffectiveStat, EFFECTIVE_STATS, getStatKey } from "#app/enums/stat";
import { MoveEffectPhase } from "#app/phases/move-effect-phase.js"; import { CommonAnimPhase } from "#app/phases/common-anim-phase";
import { MovePhase } from "#app/phases/move-phase.js"; import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js"; import { MovePhase } from "#app/phases/move-phase";
import { ShowAbilityPhase } from "#app/phases/show-ability-phase.js"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
import { StatChangePhase, StatChangeCallback } from "#app/phases/stat-change-phase.js"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
import { StatStageChangePhase, StatStageChangeCallback } from "#app/phases/stat-stage-change-phase";
export enum BattlerTagLapseType { export enum BattlerTagLapseType {
FAINT, FAINT,
@ -212,7 +211,7 @@ export class TrappedTag extends BattlerTag {
canAdd(pokemon: Pokemon): boolean { canAdd(pokemon: Pokemon): boolean {
const isGhost = pokemon.isOfType(Type.GHOST); const isGhost = pokemon.isOfType(Type.GHOST);
const isTrapped = pokemon.getTag(BattlerTagType.TRAPPED); const isTrapped = pokemon.getTag(TrappedTag);
return !isTrapped && !isGhost; return !isTrapped && !isGhost;
} }
@ -245,6 +244,23 @@ export class TrappedTag extends BattlerTag {
} }
} }
/**
* BattlerTag implementing No Retreat's trapping effect.
* This is treated separately from other trapping effects to prevent
* Ghost-type Pokemon from being able to reuse the move.
* @extends TrappedTag
*/
class NoRetreatTag extends TrappedTag {
constructor(sourceId: number) {
super(BattlerTagType.NO_RETREAT, BattlerTagLapseType.CUSTOM, 0, Moves.NO_RETREAT, sourceId);
}
/** overrides {@linkcode TrappedTag.apply}, removing the Ghost-type condition */
canAdd(pokemon: Pokemon): boolean {
return !pokemon.getTag(TrappedTag);
}
}
/** /**
* BattlerTag that represents the {@link https://bulbapedia.bulbagarden.net/wiki/Flinch Flinch} status condition * BattlerTag that represents the {@link https://bulbapedia.bulbagarden.net/wiki/Flinch Flinch} status condition
*/ */
@ -345,8 +361,8 @@ export class ConfusedTag extends BattlerTag {
// 1/3 chance of hitting self with a 40 base power move // 1/3 chance of hitting self with a 40 base power move
if (pokemon.randSeedInt(3) === 0) { if (pokemon.randSeedInt(3) === 0) {
const atk = pokemon.getBattleStat(Stat.ATK); const atk = pokemon.getEffectiveStat(Stat.ATK);
const def = pokemon.getBattleStat(Stat.DEF); const def = pokemon.getEffectiveStat(Stat.DEF);
const damage = Utils.toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedInt(15, 85) / 100)); const damage = Utils.toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedInt(15, 85) / 100));
pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself")); pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself"));
pokemon.damageAndUpdate(damage); pokemon.damageAndUpdate(damage);
@ -750,7 +766,7 @@ export class OctolockTag extends TrappedTag {
const shouldLapse = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); const shouldLapse = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType);
if (shouldLapse) { if (shouldLapse) {
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF, BattleStat.SPDEF], -1)); pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [ Stat.DEF, Stat.SPDEF ], -1));
return true; return true;
} }
@ -864,7 +880,7 @@ export abstract class DamagingTrapTag extends TrappedTag {
} }
canAdd(pokemon: Pokemon): boolean { canAdd(pokemon: Pokemon): boolean {
return !pokemon.isOfType(Type.GHOST) && !pokemon.findTag(t => t instanceof DamagingTrapTag); return !pokemon.getTag(TrappedTag);
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
@ -1076,7 +1092,7 @@ export class ContactDamageProtectedTag extends ProtectedTag {
} }
} }
export class ContactStatChangeProtectedTag extends ProtectedTag { export class ContactStatStageChangeProtectedTag extends ProtectedTag {
private stat: BattleStat; private stat: BattleStat;
private levels: number; private levels: number;
@ -1093,7 +1109,7 @@ export class ContactStatChangeProtectedTag extends ProtectedTag {
*/ */
loadTag(source: BattlerTag | any): void { loadTag(source: BattlerTag | any): void {
super.loadTag(source); super.loadTag(source);
this.stat = source.stat as BattleStat; this.stat = source.stat;
this.levels = source.levels; this.levels = source.levels;
} }
@ -1104,7 +1120,7 @@ export class ContactStatChangeProtectedTag extends ProtectedTag {
const effectPhase = pokemon.scene.getCurrentPhase(); const effectPhase = pokemon.scene.getCurrentPhase();
if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) {
const attacker = effectPhase.getPokemon(); const attacker = effectPhase.getPokemon();
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, attacker.getBattlerIndex(), true, [ this.stat ], this.levels)); pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, attacker.getBattlerIndex(), true, [ this.stat ], this.levels));
} }
} }
@ -1331,11 +1347,10 @@ export class HighestStatBoostTag extends AbilityBattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
const stats = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]; let highestStat: EffectiveStat;
let highestStat: Stat; EFFECTIVE_STATS.map(s => pokemon.getEffectiveStat(s)).reduce((highestValue: number, value: number, i: number) => {
stats.map(s => pokemon.getBattleStat(s)).reduce((highestValue: number, value: number, i: number) => {
if (value > highestValue) { if (value > highestValue) {
highestStat = stats[i]; highestStat = EFFECTIVE_STATS[i];
return value; return value;
} }
return highestValue; return highestValue;
@ -1353,7 +1368,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag {
break; break;
} }
pokemon.scene.queueMessage(i18next.t("battlerTags:highestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: getStatName(highestStat) }), null, false, null, true); pokemon.scene.queueMessage(i18next.t("battlerTags:highestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: i18next.t(getStatKey(highestStat)) }), null, false, null, true);
} }
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
@ -1507,6 +1522,25 @@ export class CritBoostTag extends BattlerTag {
} }
} }
/**
* Tag for the effects of Dragon Cheer, which boosts the critical hit ratio of the user's allies.
* @extends {CritBoostTag}
*/
export class DragonCheerTag extends CritBoostTag {
/** The types of the user's ally when the tag is added */
public typesOnAdd: Type[];
constructor() {
super(BattlerTagType.CRIT_BOOST, Moves.DRAGON_CHEER);
}
onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon);
this.typesOnAdd = pokemon.getTypes(true);
}
}
export class SaltCuredTag extends BattlerTag { export class SaltCuredTag extends BattlerTag {
private sourceIndex: number; private sourceIndex: number;
@ -1678,25 +1712,25 @@ export class IceFaceBlockDamageTag extends FormBlockDamageTag {
*/ */
export class StockpilingTag extends BattlerTag { export class StockpilingTag extends BattlerTag {
public stockpiledCount: number = 0; public stockpiledCount: number = 0;
public statChangeCounts: { [BattleStat.DEF]: number; [BattleStat.SPDEF]: number } = { public statChangeCounts: { [Stat.DEF]: number; [Stat.SPDEF]: number } = {
[BattleStat.DEF]: 0, [Stat.DEF]: 0,
[BattleStat.SPDEF]: 0 [Stat.SPDEF]: 0
}; };
constructor(sourceMove: Moves = Moves.NONE) { constructor(sourceMove: Moves = Moves.NONE) {
super(BattlerTagType.STOCKPILING, BattlerTagLapseType.CUSTOM, 1, sourceMove); super(BattlerTagType.STOCKPILING, BattlerTagLapseType.CUSTOM, 1, sourceMove);
} }
private onStatsChanged: StatChangeCallback = (_, statsChanged, statChanges) => { private onStatStagesChanged: StatStageChangeCallback = (_, statsChanged, statChanges) => {
const defChange = statChanges[statsChanged.indexOf(BattleStat.DEF)] ?? 0; const defChange = statChanges[statsChanged.indexOf(Stat.DEF)] ?? 0;
const spDefChange = statChanges[statsChanged.indexOf(BattleStat.SPDEF)] ?? 0; const spDefChange = statChanges[statsChanged.indexOf(Stat.SPDEF)] ?? 0;
if (defChange) { if (defChange) {
this.statChangeCounts[BattleStat.DEF]++; this.statChangeCounts[Stat.DEF]++;
} }
if (spDefChange) { if (spDefChange) {
this.statChangeCounts[BattleStat.SPDEF]++; this.statChangeCounts[Stat.SPDEF]++;
} }
}; };
@ -1704,8 +1738,8 @@ export class StockpilingTag extends BattlerTag {
super.loadTag(source); super.loadTag(source);
this.stockpiledCount = source.stockpiledCount || 0; this.stockpiledCount = source.stockpiledCount || 0;
this.statChangeCounts = { this.statChangeCounts = {
[ BattleStat.DEF ]: source.statChangeCounts?.[ BattleStat.DEF ] ?? 0, [ Stat.DEF ]: source.statChangeCounts?.[ Stat.DEF ] ?? 0,
[ BattleStat.SPDEF ]: source.statChangeCounts?.[ BattleStat.SPDEF ] ?? 0, [ Stat.SPDEF ]: source.statChangeCounts?.[ Stat.SPDEF ] ?? 0,
}; };
} }
@ -1725,9 +1759,9 @@ export class StockpilingTag extends BattlerTag {
})); }));
// Attempt to increase DEF and SPDEF by one stage, keeping track of successful changes. // Attempt to increase DEF and SPDEF by one stage, keeping track of successful changes.
pokemon.scene.unshiftPhase(new StatChangePhase( pokemon.scene.unshiftPhase(new StatStageChangePhase(
pokemon.scene, pokemon.getBattlerIndex(), true, pokemon.scene, pokemon.getBattlerIndex(), true,
[BattleStat.SPDEF, BattleStat.DEF], 1, true, false, true, this.onStatsChanged [Stat.SPDEF, Stat.DEF], 1, true, false, true, this.onStatStagesChanged
)); ));
} }
} }
@ -1741,15 +1775,15 @@ export class StockpilingTag extends BattlerTag {
* one stage for each stack which had successfully changed that particular stat during onAdd. * one stage for each stack which had successfully changed that particular stat during onAdd.
*/ */
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
const defChange = this.statChangeCounts[BattleStat.DEF]; const defChange = this.statChangeCounts[Stat.DEF];
const spDefChange = this.statChangeCounts[BattleStat.SPDEF]; const spDefChange = this.statChangeCounts[Stat.SPDEF];
if (defChange) { if (defChange) {
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF], -defChange, true, false, true)); pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.DEF ], -defChange, true, false, true));
} }
if (spDefChange) { if (spDefChange) {
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.SPDEF], -spDefChange, true, false, true)); pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.SPDEF ], -spDefChange, true, false, true));
} }
} }
} }
@ -1864,6 +1898,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
return new DrowsyTag(); return new DrowsyTag();
case BattlerTagType.TRAPPED: case BattlerTagType.TRAPPED:
return new TrappedTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); return new TrappedTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);
case BattlerTagType.NO_RETREAT:
return new NoRetreatTag(sourceId);
case BattlerTagType.BIND: case BattlerTagType.BIND:
return new BindTag(turnCount, sourceId); return new BindTag(turnCount, sourceId);
case BattlerTagType.WRAP: case BattlerTagType.WRAP:
@ -1889,11 +1925,11 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
case BattlerTagType.SPIKY_SHIELD: case BattlerTagType.SPIKY_SHIELD:
return new ContactDamageProtectedTag(sourceMove, 8); return new ContactDamageProtectedTag(sourceMove, 8);
case BattlerTagType.KINGS_SHIELD: case BattlerTagType.KINGS_SHIELD:
return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.ATK, -1); return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.ATK, -1);
case BattlerTagType.OBSTRUCT: case BattlerTagType.OBSTRUCT:
return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.DEF, -2); return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.DEF, -2);
case BattlerTagType.SILK_TRAP: case BattlerTagType.SILK_TRAP:
return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.SPD, -1); return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.SPD, -1);
case BattlerTagType.BANEFUL_BUNKER: case BattlerTagType.BANEFUL_BUNKER:
return new ContactPoisonProtectedTag(sourceMove); return new ContactPoisonProtectedTag(sourceMove);
case BattlerTagType.BURNING_BULWARK: case BattlerTagType.BURNING_BULWARK:
@ -1923,6 +1959,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false); return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false);
case BattlerTagType.CRIT_BOOST: case BattlerTagType.CRIT_BOOST:
return new CritBoostTag(tagType, sourceMove); return new CritBoostTag(tagType, sourceMove);
case BattlerTagType.DRAGON_CHEER:
return new DragonCheerTag();
case BattlerTagType.ALWAYS_CRIT: case BattlerTagType.ALWAYS_CRIT:
case BattlerTagType.IGNORE_ACCURACY: case BattlerTagType.IGNORE_ACCURACY:
return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, 2, sourceMove); return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, 2, sourceMove);

View File

@ -1,14 +1,14 @@
import { getPokemonNameWithAffix } from "../messages"; import { getPokemonNameWithAffix } from "../messages";
import Pokemon, { HitResult } from "../field/pokemon"; import Pokemon, { HitResult } from "../field/pokemon";
import { BattleStat } from "./battle-stat";
import { getStatusEffectHealText } from "./status-effect"; import { getStatusEffectHealText } from "./status-effect";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { DoubleBerryEffectAbAttr, ReduceBerryUseThresholdAbAttr, applyAbAttrs } from "./ability"; import { DoubleBerryEffectAbAttr, ReduceBerryUseThresholdAbAttr, applyAbAttrs } from "./ability";
import i18next from "i18next"; import i18next from "i18next";
import { BattlerTagType } from "#enums/battler-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type";
import { BerryType } from "#enums/berry-type"; import { BerryType } from "#enums/berry-type";
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js"; import { Stat, type BattleStat } from "#app/enums/stat";
import { StatChangePhase } from "#app/phases/stat-change-phase.js"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
export function getBerryName(berryType: BerryType): string { export function getBerryName(berryType: BerryType): string {
return i18next.t(`berry:${BerryType[berryType]}.name`); return i18next.t(`berry:${BerryType[berryType]}.name`);
@ -35,9 +35,10 @@ export function getBerryPredicate(berryType: BerryType): BerryPredicate {
case BerryType.SALAC: case BerryType.SALAC:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
const threshold = new Utils.NumberHolder(0.25); const threshold = new Utils.NumberHolder(0.25);
const battleStat = (berryType - BerryType.LIECHI) as BattleStat; // Offset BerryType such that LIECHI -> Stat.ATK = 1, GANLON -> Stat.DEF = 2, so on and so forth
const stat: BattleStat = berryType - BerryType.ENIGMA;
applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold);
return pokemon.getHpRatio() < threshold.value && pokemon.summonData.battleStats[battleStat] < 6; return pokemon.getHpRatio() < threshold.value && pokemon.getStatStage(stat) < 6;
}; };
case BerryType.LANSAT: case BerryType.LANSAT:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
@ -95,10 +96,11 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
if (pokemon.battleData) { if (pokemon.battleData) {
pokemon.battleData.berriesEaten.push(berryType); pokemon.battleData.berriesEaten.push(berryType);
} }
const battleStat = (berryType - BerryType.LIECHI) as BattleStat; // Offset BerryType such that LIECHI -> Stat.ATK = 1, GANLON -> Stat.DEF = 2, so on and so forth
const statLevels = new Utils.NumberHolder(1); const stat: BattleStat = berryType - BerryType.ENIGMA;
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statLevels); const statStages = new Utils.NumberHolder(1);
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ battleStat ], statLevels.value)); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statStages);
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], statStages.value));
}; };
case BerryType.LANSAT: case BerryType.LANSAT:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
@ -112,9 +114,10 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
if (pokemon.battleData) { if (pokemon.battleData) {
pokemon.battleData.berriesEaten.push(berryType); pokemon.battleData.berriesEaten.push(berryType);
} }
const statLevels = new Utils.NumberHolder(2); const randStat = Utils.randSeedInt(Stat.SPD, Stat.ATK);
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statLevels); const stages = new Utils.NumberHolder(2);
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ BattleStat.RAND ], statLevels.value)); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, stages);
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ randStat ], stages.value));
}; };
case BerryType.LEPPA: case BerryType.LEPPA:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {

View File

@ -13,7 +13,6 @@ import { TrainerType } from "#enums/trainer-type";
import { Nature } from "./nature"; import { Nature } from "./nature";
import { Moves } from "#app/enums/moves.js"; import { Moves } from "#app/enums/moves.js";
import { TypeColor, TypeShadow } from "#app/enums/color.js"; import { TypeColor, TypeShadow } from "#app/enums/color.js";
import { Gender } from "./gender";
import { pokemonEvolutions } from "./pokemon-evolutions"; import { pokemonEvolutions } from "./pokemon-evolutions";
import { pokemonFormChanges } from "./pokemon-forms"; import { pokemonFormChanges } from "./pokemon-forms";
@ -659,7 +658,6 @@ export class FreshStartChallenge extends Challenge {
pokemon.luck = 0; // No luck pokemon.luck = 0; // No luck
pokemon.shiny = false; // Not shiny pokemon.shiny = false; // Not shiny
pokemon.variant = 0; // Not shiny pokemon.variant = 0; // Not shiny
pokemon.gender = Gender.MALE; // Starters default to male
pokemon.formIndex = 0; // Froakie should be base form pokemon.formIndex = 0; // Froakie should be base form
pokemon.ivs = [10, 10, 10, 10, 10, 10]; // Default IVs of 10 for all stats pokemon.ivs = [10, 10, 10, 10, 10, 10]; // Default IVs of 10 for all stats
return true; return true;

View File

@ -1,6 +1,6 @@
import { BattleSpec } from "#enums/battle-spec"; import { BattleSpec } from "#enums/battle-spec";
import { TrainerType } from "#enums/trainer-type"; import { TrainerType } from "#enums/trainer-type";
import {trainerConfigs} from "./trainer-config"; import { trainerConfigs } from "./trainer-config";
export interface TrainerTypeMessages { export interface TrainerTypeMessages {
encounter?: string | string[], encounter?: string | string[],
@ -707,6 +707,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
] ]
} }
], ],
[TrainerType.ROOD]: [
{
encounter: [
"dialogue:rood.encounter.1",
"dialogue:rood.encounter.2",
"dialogue:rood.encounter.3",
],
victory: [
"dialogue:rood.victory.1",
"dialogue:rood.victory.2",
"dialogue:rood.victory.3",
]
}
],
[TrainerType.FLARE_GRUNT]: [ [TrainerType.FLARE_GRUNT]: [
{ {
encounter: [ encounter: [

View File

@ -139,46 +139,57 @@ export class Egg {
//// ////
constructor(eggOptions?: IEggOptions) { constructor(eggOptions?: IEggOptions) {
//if (eggOptions.tier && eggOptions.species) throw Error("Error egg can't have species and tier as option. only choose one of them.") const generateEggProperties = (eggOptions?: IEggOptions) => {
//if (eggOptions.tier && eggOptions.species) throw Error("Error egg can't have species and tier as option. only choose one of them.")
this._sourceType = eggOptions?.sourceType!; // TODO: is this bang correct? this._sourceType = eggOptions?.sourceType!; // TODO: is this bang correct?
// Ensure _sourceType is defined before invoking rollEggTier(), as it is referenced // Ensure _sourceType is defined before invoking rollEggTier(), as it is referenced
this._tier = eggOptions?.tier ?? (Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier()); this._tier = eggOptions?.tier ?? (Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier());
// If egg was pulled, check if egg pity needs to override the egg tier // If egg was pulled, check if egg pity needs to override the egg tier
if (eggOptions?.pulled) { if (eggOptions?.pulled) {
// Needs this._tier and this._sourceType to work // Needs this._tier and this._sourceType to work
this.checkForPityTierOverrides(eggOptions.scene!); // TODO: is this bang correct? this.checkForPityTierOverrides(eggOptions.scene!); // TODO: is this bang correct?
} }
this._id = eggOptions?.id ?? Utils.randInt(EGG_SEED, EGG_SEED * this._tier); this._id = eggOptions?.id ?? Utils.randInt(EGG_SEED, EGG_SEED * this._tier);
this._sourceType = eggOptions?.sourceType ?? undefined; this._sourceType = eggOptions?.sourceType ?? undefined;
this._hatchWaves = eggOptions?.hatchWaves ?? this.getEggTierDefaultHatchWaves(); this._hatchWaves = eggOptions?.hatchWaves ?? this.getEggTierDefaultHatchWaves();
this._timestamp = eggOptions?.timestamp ?? new Date().getTime(); this._timestamp = eggOptions?.timestamp ?? new Date().getTime();
// First roll shiny and variant so we can filter if species with an variant exist // First roll shiny and variant so we can filter if species with an variant exist
this._isShiny = eggOptions?.isShiny ?? (Overrides.EGG_SHINY_OVERRIDE || this.rollShiny()); this._isShiny = eggOptions?.isShiny ?? (Overrides.EGG_SHINY_OVERRIDE || this.rollShiny());
this._variantTier = eggOptions?.variantTier ?? (Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant()); this._variantTier = eggOptions?.variantTier ?? (Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant());
this._species = eggOptions?.species ?? this.rollSpecies(eggOptions!.scene!)!; // TODO: Are those bangs correct? this._species = eggOptions?.species ?? this.rollSpecies(eggOptions!.scene!)!; // TODO: Are those bangs correct?
this._overrideHiddenAbility = eggOptions?.overrideHiddenAbility ?? false; this._overrideHiddenAbility = eggOptions?.overrideHiddenAbility ?? false;
// Override egg tier and hatchwaves if species was given // Override egg tier and hatchwaves if species was given
if (eggOptions?.species) { if (eggOptions?.species) {
this._tier = this.getEggTierFromSpeciesStarterValue(); this._tier = this.getEggTierFromSpeciesStarterValue();
this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves(); this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves();
} }
// If species has no variant, set variantTier to common. This needs to // If species has no variant, set variantTier to common. This needs to
// be done because species with no variants get filtered at rollSpecies but if the // be done because species with no variants get filtered at rollSpecies but if the
// species is set via options or the legendary gacha pokemon gets choosen the check never happens // species is set via options or the legendary gacha pokemon gets choosen the check never happens
if (this._species && !getPokemonSpecies(this._species).hasVariants()) { if (this._species && !getPokemonSpecies(this._species).hasVariants()) {
this._variantTier = VariantTier.COMMON; this._variantTier = VariantTier.COMMON;
} }
// Needs this._tier so it needs to be generated afer the tier override if bought from same species // Needs this._tier so it needs to be generated afer the tier override if bought from same species
this._eggMoveIndex = eggOptions?.eggMoveIndex ?? this.rollEggMoveIndex(); this._eggMoveIndex = eggOptions?.eggMoveIndex ?? this.rollEggMoveIndex();
if (eggOptions?.pulled) { if (eggOptions?.pulled) {
this.increasePullStatistic(eggOptions.scene!); // TODO: is this bang correct? this.increasePullStatistic(eggOptions.scene!); // TODO: is this bang correct?
this.addEggToGameData(eggOptions.scene!); // TODO: is this bang correct? this.addEggToGameData(eggOptions.scene!); // TODO: is this bang correct?
}
};
if (eggOptions?.scene) {
const seedOverride = Utils.randomString(24);
eggOptions?.scene.executeWithSeedOffset(() => {
generateEggProperties(eggOptions);
}, 0, seedOverride);
} else { // For legacy eggs without scene
generateEggProperties(eggOptions);
} }
} }
@ -200,37 +211,46 @@ export class Egg {
// Generates a PlayerPokemon from an egg // Generates a PlayerPokemon from an egg
public generatePlayerPokemon(scene: BattleScene): PlayerPokemon { public generatePlayerPokemon(scene: BattleScene): PlayerPokemon {
// Legacy egg wants to hatch. Generate missing properties let ret: PlayerPokemon;
if (!this._species) {
this._isShiny = this.rollShiny();
this._species = this.rollSpecies(scene!)!; // TODO: are these bangs correct?
}
let pokemonSpecies = getPokemonSpecies(this._species); const generatePlayerPokemonHelper = (scene: BattleScene) => {
// Special condition to have Phione eggs also have a chance of generating Manaphy // Legacy egg wants to hatch. Generate missing properties
if (this._species === Species.PHIONE) { if (!this._species) {
pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY); this._isShiny = this.rollShiny();
} this._species = this.rollSpecies(scene!)!; // TODO: are these bangs correct?
}
// Sets the hidden ability if a hidden ability exists and let pokemonSpecies = getPokemonSpecies(this._species);
// the override is set or the egg hits the chance // Special condition to have Phione eggs also have a chance of generating Manaphy
let abilityIndex: number | undefined = undefined; if (this._species === Species.PHIONE) {
const sameSpeciesEggHACheck = (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE)); pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY);
const gachaEggHACheck = (!(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE)); }
if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility || sameSpeciesEggHACheck || gachaEggHACheck)) {
abilityIndex = 2;
}
// This function has way to many optional parameters // Sets the hidden ability if a hidden ability exists and
const ret: PlayerPokemon = scene.addPlayerPokemon(pokemonSpecies, 1, abilityIndex, undefined, undefined, false); // the override is set or the egg hits the chance
ret.shiny = this._isShiny; let abilityIndex: number | undefined = undefined;
ret.variant = this._variantTier; const sameSpeciesEggHACheck = (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE));
const gachaEggHACheck = (!(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE));
if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility || sameSpeciesEggHACheck || gachaEggHACheck)) {
abilityIndex = 2;
}
const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); // This function has way to many optional parameters
ret = scene.addPlayerPokemon(pokemonSpecies, 1, abilityIndex, undefined, undefined, false);
ret.shiny = this._isShiny;
ret.variant = this._variantTier;
for (let s = 0; s < ret.ivs.length; s++) { const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295));
ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]);
} for (let s = 0; s < ret.ivs.length; s++) {
ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]);
}
};
ret = ret!; // Tell TS compiler it's defined now
scene.executeWithSeedOffset(() => {
generatePlayerPokemonHelper(scene);
}, this._id, EGG_SEED.toString());
return ret; return ret;
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
import { Stat, getStatName } from "./pokemon-stat";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { TextStyle, getBBCodeFrag } from "../ui/text"; import { TextStyle, getBBCodeFrag } from "../ui/text";
import { Nature } from "#enums/nature"; import { Nature } from "#enums/nature";
import { UiTheme } from "#enums/ui-theme"; import { UiTheme } from "#enums/ui-theme";
import i18next from "i18next"; import i18next from "i18next";
import { Stat, EFFECTIVE_STATS, getShortenedStatKey } from "#app/enums/stat";
export { Nature }; export { Nature };
@ -14,10 +14,9 @@ export function getNatureName(nature: Nature, includeStatEffects: boolean = fals
ret = i18next.t("nature:" + ret as any); ret = i18next.t("nature:" + ret as any);
} }
if (includeStatEffects) { if (includeStatEffects) {
const stats = Utils.getEnumValues(Stat).slice(1);
let increasedStat: Stat | null = null; let increasedStat: Stat | null = null;
let decreasedStat: Stat | null = null; let decreasedStat: Stat | null = null;
for (const stat of stats) { for (const stat of EFFECTIVE_STATS) {
const multiplier = getNatureStatMultiplier(nature, stat); const multiplier = getNatureStatMultiplier(nature, stat);
if (multiplier > 1) { if (multiplier > 1) {
increasedStat = stat; increasedStat = stat;
@ -28,7 +27,7 @@ export function getNatureName(nature: Nature, includeStatEffects: boolean = fals
const textStyle = forStarterSelect ? TextStyle.SUMMARY_ALT : TextStyle.WINDOW; const textStyle = forStarterSelect ? TextStyle.SUMMARY_ALT : TextStyle.WINDOW;
const getTextFrag = !ignoreBBCode ? (text: string, style: TextStyle) => getBBCodeFrag(text, style, uiTheme) : (text: string, style: TextStyle) => text; const getTextFrag = !ignoreBBCode ? (text: string, style: TextStyle) => getBBCodeFrag(text, style, uiTheme) : (text: string, style: TextStyle) => text;
if (increasedStat && decreasedStat) { if (increasedStat && decreasedStat) {
ret = `${getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(`, textStyle)}${getTextFrag(`+${getStatName(increasedStat, true)}`, TextStyle.SUMMARY_PINK)}${getTextFrag("/", textStyle)}${getTextFrag(`-${getStatName(decreasedStat, true)}`, TextStyle.SUMMARY_BLUE)}${getTextFrag(")", textStyle)}`; ret = `${getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(`, textStyle)}${getTextFrag(`+${i18next.t(getShortenedStatKey(increasedStat))}`, TextStyle.SUMMARY_PINK)}${getTextFrag("/", textStyle)}${getTextFrag(`-${i18next.t(getShortenedStatKey(decreasedStat))}`, TextStyle.SUMMARY_BLUE)}${getTextFrag(")", textStyle)}`;
} else { } else {
ret = getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(-)`, textStyle); ret = getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(-)`, textStyle);
} }

View File

@ -1,7 +1,7 @@
import { Gender } from "./gender"; import { Gender } from "./gender";
import { PokeballType } from "./pokeball"; import { PokeballType } from "./pokeball";
import Pokemon from "../field/pokemon"; import Pokemon from "../field/pokemon";
import { Stat } from "./pokemon-stat"; import { Stat } from "#enums/stat";
import { Type } from "./type"; import { Type } from "./type";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { SpeciesFormKey } from "./pokemon-species"; import { SpeciesFormKey } from "./pokemon-species";

View File

@ -66,34 +66,34 @@ export enum FormChangeItem {
BLUE_ORB = 50, BLUE_ORB = 50,
RED_ORB, RED_ORB,
SHARP_METEORITE,
HARD_METEORITE,
SMOOTH_METEORITE,
ADAMANT_CRYSTAL, ADAMANT_CRYSTAL,
LUSTROUS_GLOBE, LUSTROUS_GLOBE,
GRISEOUS_CORE, GRISEOUS_CORE,
REVEAL_GLASS, REVEAL_GLASS,
GRACIDEA,
MAX_MUSHROOMS, MAX_MUSHROOMS,
DARK_STONE, DARK_STONE,
LIGHT_STONE, LIGHT_STONE,
PRISON_BOTTLE, PRISON_BOTTLE,
N_LUNARIZER,
N_SOLARIZER,
RUSTED_SWORD, RUSTED_SWORD,
RUSTED_SHIELD, RUSTED_SHIELD,
ICY_REINS_OF_UNITY, ICY_REINS_OF_UNITY,
SHADOW_REINS_OF_UNITY, SHADOW_REINS_OF_UNITY,
WELLSPRING_MASK, ULTRANECROZIUM_Z,
HEARTHFLAME_MASK,
CORNERSTONE_MASK, SHARP_METEORITE = 100,
HARD_METEORITE,
SMOOTH_METEORITE,
GRACIDEA,
SHOCK_DRIVE, SHOCK_DRIVE,
BURN_DRIVE, BURN_DRIVE,
CHILL_DRIVE, CHILL_DRIVE,
DOUSE_DRIVE, DOUSE_DRIVE,
ULTRANECROZIUM_Z, N_SOLARIZER,
N_LUNARIZER,
FIST_PLATE = 100, WELLSPRING_MASK,
HEARTHFLAME_MASK,
CORNERSTONE_MASK,
FIST_PLATE,
SKY_PLATE, SKY_PLATE,
TOXIC_PLATE, TOXIC_PLATE,
EARTH_PLATE, EARTH_PLATE,
@ -129,7 +129,7 @@ export enum FormChangeItem {
DRAGON_MEMORY, DRAGON_MEMORY,
DARK_MEMORY, DARK_MEMORY,
FAIRY_MEMORY, FAIRY_MEMORY,
BLANK_MEMORY // TODO: Find a potential use for this NORMAL_MEMORY // TODO: Find a potential use for this
} }
export type SpeciesFormChangeConditionPredicate = (p: Pokemon) => boolean; export type SpeciesFormChangeConditionPredicate = (p: Pokemon) => boolean;
@ -359,7 +359,7 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger {
/** /**
* Class used for triggering form changes based on weather. * Class used for triggering form changes based on weather.
* Used by Castform. * Used by Castform and Cherrim.
* @extends SpeciesFormChangeTrigger * @extends SpeciesFormChangeTrigger
*/ */
export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger { export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger {
@ -392,7 +392,7 @@ export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger {
/** /**
* Class used for reverting to the original form when the weather runs out * Class used for reverting to the original form when the weather runs out
* or when the user loses the ability/is suppressed. * or when the user loses the ability/is suppressed.
* Used by Castform. * Used by Castform and Cherrim.
* @extends SpeciesFormChangeTrigger * @extends SpeciesFormChangeTrigger
*/ */
export class SpeciesFormChangeRevertWeatherFormTrigger extends SpeciesFormChangeTrigger { export class SpeciesFormChangeRevertWeatherFormTrigger extends SpeciesFormChangeTrigger {
@ -930,6 +930,11 @@ export const pokemonFormChanges: PokemonFormChanges = {
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeActiveTrigger(), true), new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeActiveTrigger(), true),
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeActiveTrigger(), true), new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeActiveTrigger(), true),
], ],
[Species.CHERRIM]: [
new SpeciesFormChange(Species.CHERRIM, "overcast", "sunshine", new SpeciesFormChangeWeatherTrigger(Abilities.FLOWER_GIFT, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]), true),
new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FLOWER_GIFT, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG, WeatherType.HAIL, WeatherType.HEAVY_RAIN, WeatherType.SNOW, WeatherType.RAIN ]), true),
new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeActiveTrigger(), true),
],
}; };
export function initPokemonForms() { export function initPokemonForms() {

View File

@ -14,7 +14,7 @@ import { GrowthRate } from "./exp";
import { EvolutionLevel, SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions"; import { EvolutionLevel, SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions";
import { Type } from "./type"; import { Type } from "./type";
import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "./pokemon-level-moves"; import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "./pokemon-level-moves";
import { Stat } from "./pokemon-stat"; import { Stat } from "#enums/stat";
import { Variant, VariantSet, variantColorCache, variantData } from "./variant"; import { Variant, VariantSet, variantColorCache, variantData } from "./variant";
export enum Region { export enum Region {

View File

@ -1,29 +0,0 @@
import { Stat } from "#enums/stat";
import i18next from "i18next";
export { Stat };
export function getStatName(stat: Stat, shorten: boolean = false) {
let ret: string = "";
switch (stat) {
case Stat.HP:
ret = !shorten ? i18next.t("pokemonInfo:Stat.HP") : i18next.t("pokemonInfo:Stat.HPshortened");
break;
case Stat.ATK:
ret = !shorten ? i18next.t("pokemonInfo:Stat.ATK") : i18next.t("pokemonInfo:Stat.ATKshortened");
break;
case Stat.DEF:
ret = !shorten ? i18next.t("pokemonInfo:Stat.DEF") : i18next.t("pokemonInfo:Stat.DEFshortened");
break;
case Stat.SPATK:
ret = !shorten ? i18next.t("pokemonInfo:Stat.SPATK") : i18next.t("pokemonInfo:Stat.SPATKshortened");
break;
case Stat.SPDEF:
ret = !shorten ? i18next.t("pokemonInfo:Stat.SPDEF") : i18next.t("pokemonInfo:Stat.SPDEFshortened");
break;
case Stat.SPD:
ret = !shorten ? i18next.t("pokemonInfo:Stat.SPD") : i18next.t("pokemonInfo:Stat.SPDshortened");
break;
}
return ret;
}

View File

@ -1,38 +0,0 @@
import { BattleStat, getBattleStatName } from "./battle-stat";
import i18next from "i18next";
export enum TempBattleStat {
ATK,
DEF,
SPATK,
SPDEF,
SPD,
ACC,
CRIT
}
export function getTempBattleStatName(tempBattleStat: TempBattleStat) {
if (tempBattleStat === TempBattleStat.CRIT) {
return i18next.t("modifierType:TempBattleStatBoosterStatName.CRIT");
}
return getBattleStatName(tempBattleStat as integer as BattleStat);
}
export function getTempBattleStatBoosterItemName(tempBattleStat: TempBattleStat) {
switch (tempBattleStat) {
case TempBattleStat.ATK:
return "X Attack";
case TempBattleStat.DEF:
return "X Defense";
case TempBattleStat.SPATK:
return "X Sp. Atk";
case TempBattleStat.SPDEF:
return "X Sp. Def";
case TempBattleStat.SPD:
return "X Speed";
case TempBattleStat.ACC:
return "X Accuracy";
case TempBattleStat.CRIT:
return "Dire Hit";
}
}

View File

@ -22,5 +22,6 @@ export enum ArenaTagType {
CRAFTY_SHIELD = "CRAFTY_SHIELD", CRAFTY_SHIELD = "CRAFTY_SHIELD",
TAILWIND = "TAILWIND", TAILWIND = "TAILWIND",
HAPPY_HOUR = "HAPPY_HOUR", HAPPY_HOUR = "HAPPY_HOUR",
SAFEGUARD = "SAFEGUARD",
NO_CRIT = "NO_CRIT" NO_CRIT = "NO_CRIT"
} }

View File

@ -69,5 +69,7 @@ export enum BattlerTagType {
GULP_MISSILE_ARROKUDA = "GULP_MISSILE_ARROKUDA", GULP_MISSILE_ARROKUDA = "GULP_MISSILE_ARROKUDA",
GULP_MISSILE_PIKACHU = "GULP_MISSILE_PIKACHU", GULP_MISSILE_PIKACHU = "GULP_MISSILE_PIKACHU",
BEAK_BLAST_CHARGING = "BEAK_BLAST_CHARGING", BEAK_BLAST_CHARGING = "BEAK_BLAST_CHARGING",
SHELL_TRAP = "SHELL_TRAP" SHELL_TRAP = "SHELL_TRAP",
DRAGON_CHEER = "DRAGON_CHEER",
NO_RETREAT = "NO_RETREAT",
} }

View File

@ -1,8 +1,75 @@
/** Enum that comprises all possible stat-related attributes, in-battle and permanent, of a Pokemon. */
export enum Stat { export enum Stat {
/** Hit Points */
HP = 0, HP = 0,
/** Attack */
ATK, ATK,
/** Defense */
DEF, DEF,
/** Special Attack */
SPATK, SPATK,
/** Special Defense */
SPDEF, SPDEF,
/** Speed */
SPD, SPD,
/** Accuracy */
ACC,
/** Evasiveness */
EVA
}
/** A constant array comprised of the {@linkcode Stat} values that make up {@linkcode PermanentStat}. */
export const PERMANENT_STATS = [ Stat.HP, Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ] as const;
/** Type used to describe the core, permanent stats of a Pokemon. */
export type PermanentStat = typeof PERMANENT_STATS[number];
/** A constant array comprised of the {@linkcode Stat} values that make up {@linkcode EFfectiveStat}. */
export const EFFECTIVE_STATS = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ] as const;
/** Type used to describe the intersection of core stats and stats that have stages in battle. */
export type EffectiveStat = typeof EFFECTIVE_STATS[number];
/** A constant array comprised of {@linkcode Stat} the values that make up {@linkcode BattleStat}. */
export const BATTLE_STATS = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD, Stat.ACC, Stat.EVA ] as const;
/** Type used to describe the stats that have stages which can be incremented and decremented in battle. */
export type BattleStat = typeof BATTLE_STATS[number];
/** A constant array comprised of {@linkcode Stat} the values that make up {@linkcode TempBattleStat}. */
export const TEMP_BATTLE_STATS = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD, Stat.ACC ] as const;
/** Type used to describe the stats that have X item (`TEMP_STAT_STAGE_BOOSTER`) equivalents. */
export type TempBattleStat = typeof TEMP_BATTLE_STATS[number];
/**
* Provides the translation key corresponding to the amount of stat stages and whether those stat stages
* are positive or negative.
* @param stages the amount of stages
* @param isIncrease dictates a negative (`false`) or a positive (`true`) stat stage change
* @returns the translation key fitting the conditions described by {@linkcode stages} and {@linkcode isIncrease}
*/
export function getStatStageChangeDescriptionKey(stages: number, isIncrease: boolean) {
if (stages === 1) {
return isIncrease ? "battle:statRose" : "battle:statFell";
} else if (stages === 2) {
return isIncrease ? "battle:statSharplyRose" : "battle:statHarshlyFell";
} else if (stages <= 6) {
return isIncrease ? "battle:statRoseDrastically" : "battle:statSeverelyFell";
}
return isIncrease ? "battle:statWontGoAnyHigher" : "battle:statWontGoAnyLower";
}
/**
* Provides the translation key corresponding to a given stat which can be translated into its full name.
* @param stat the {@linkcode Stat} to be translated
* @returns the translation key corresponding to the given {@linkcode Stat}
*/
export function getStatKey(stat: Stat) {
return `pokemonInfo:Stat.${Stat[stat]}`;
}
/**
* Provides the translation key corresponding to a given stat which can be translated into its shortened name.
* @param stat the {@linkcode Stat} to be translated
* @returns the translation key corresponding to the given {@linkcode Stat}
*/
export function getShortenedStatKey(stat: PermanentStat) {
return `pokemonInfo:Stat.${Stat[stat]}shortened`;
} }

View File

@ -339,7 +339,10 @@ export class Arena {
*/ */
triggerWeatherBasedFormChanges(): void { triggerWeatherBasedFormChanges(): void {
this.scene.getField(true).forEach( p => { this.scene.getField(true).forEach( p => {
if (p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM) { const isCastformWithForecast = (p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM);
const isCherrimWithFlowerGift = (p.hasAbility(Abilities.FLOWER_GIFT) && p.species.speciesId === Species.CHERRIM);
if (isCastformWithForecast || isCherrimWithFlowerGift) {
new ShowAbilityPhase(this.scene, p.getBattlerIndex()); new ShowAbilityPhase(this.scene, p.getBattlerIndex());
this.scene.triggerPokemonFormChange(p, SpeciesFormChangeWeatherTrigger); this.scene.triggerPokemonFormChange(p, SpeciesFormChangeWeatherTrigger);
} }
@ -351,7 +354,10 @@ export class Arena {
*/ */
triggerWeatherBasedFormChangesToNormal(): void { triggerWeatherBasedFormChangesToNormal(): void {
this.scene.getField(true).forEach( p => { this.scene.getField(true).forEach( p => {
if (p.hasAbility(Abilities.FORECAST, false, true) && p.species.speciesId === Species.CASTFORM) { const isCastformWithForecast = (p.hasAbility(Abilities.FORECAST, false, true) && p.species.speciesId === Species.CASTFORM);
const isCherrimWithFlowerGift = (p.hasAbility(Abilities.FLOWER_GIFT, false, true) && p.species.speciesId === Species.CHERRIM);
if (isCastformWithForecast || isCherrimWithFlowerGift) {
new ShowAbilityPhase(this.scene, p.getBattlerIndex()); new ShowAbilityPhase(this.scene, p.getBattlerIndex());
return this.scene.triggerPokemonFormChange(p, SpeciesFormChangeRevertWeatherFormTrigger); return this.scene.triggerPokemonFormChange(p, SpeciesFormChangeRevertWeatherFormTrigger);
} }

View File

@ -3,26 +3,24 @@ import BattleScene, { AnySound } from "../battle-scene";
import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; import { Variant, VariantSet, variantColorCache } from "#app/data/variant";
import { variantData } from "#app/data/variant"; import { variantData } from "#app/data/variant";
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info";
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr } from "../data/move"; import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr } from "../data/move";
import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species";
import { Constructor } from "#app/utils"; import { Constructor } from "#app/utils";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type";
import { getLevelTotalExp } from "../data/exp"; import { getLevelTotalExp } from "../data/exp";
import { Stat } from "../data/pokemon-stat"; import { Stat, type PermanentStat, type BattleStat, type EffectiveStat, PERMANENT_STATS, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat";
import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier } from "../modifier/modifier"; import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier } from "../modifier/modifier";
import { PokeballType } from "../data/pokeball"; import { PokeballType } from "../data/pokeball";
import { Gender } from "../data/gender"; import { Gender } from "../data/gender";
import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims"; import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims";
import { Status, StatusEffect, getRandomStatus } from "../data/status-effect"; import { Status, StatusEffect, getRandomStatus } from "../data/status-effect";
import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions"; import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions";
import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms"; import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms";
import { BattleStat } from "../data/battle-stat"; import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag } from "../data/battler-tags";
import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, ExposedTag } from "../data/battler-tags";
import { WeatherType } from "../data/weather"; import { WeatherType } from "../data/weather";
import { TempBattleStat } from "../data/temp-battle-stat";
import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag"; import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag";
import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AddSecondStrikeAbAttr, IgnoreOpponentEvasionAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr } from "../data/ability"; import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr } from "../data/ability";
import PokemonData from "../system/pokemon-data"; import PokemonData from "../system/pokemon-data";
import { BattlerIndex } from "../battle"; import { BattlerIndex } from "../battle";
import { Mode } from "../ui/ui"; import { Mode } from "../ui/ui";
@ -40,7 +38,7 @@ import Overrides from "#app/overrides";
import i18next from "i18next"; import i18next from "i18next";
import { speciesEggMoves } from "../data/egg-moves"; import { speciesEggMoves } from "../data/egg-moves";
import { ModifierTier } from "../modifier/modifier-tier"; import { ModifierTier } from "../modifier/modifier-tier";
import { applyChallenges, ChallengeType } from "#app/data/challenge.js"; import { applyChallenges, ChallengeType } from "#app/data/challenge";
import { Abilities } from "#enums/abilities"; import { Abilities } from "#enums/abilities";
import { ArenaTagType } from "#enums/arena-tag-type"; import { ArenaTagType } from "#enums/arena-tag-type";
import { BattleSpec } from "#enums/battle-spec"; import { BattleSpec } from "#enums/battle-spec";
@ -49,17 +47,17 @@ import { BerryType } from "#enums/berry-type";
import { Biome } from "#enums/biome"; import { Biome } from "#enums/biome";
import { Moves } from "#enums/moves"; import { Moves } from "#enums/moves";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import { getPokemonNameWithAffix } from "#app/messages";
import { DamagePhase } from "#app/phases/damage-phase";
import { FaintPhase } from "#app/phases/faint-phase";
import { LearnMovePhase } from "#app/phases/learn-move-phase";
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import { MoveEndPhase } from "#app/phases/move-end-phase";
import { ObtainStatusEffectPhase } from "#app/phases/obtain-status-effect-phase";
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
import { SwitchSummonPhase } from "#app/phases/switch-summon-phase";
import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase";
import { Challenges } from "#enums/challenges"; import { Challenges } from "#enums/challenges";
import { getPokemonNameWithAffix } from "#app/messages.js";
import { DamagePhase } from "#app/phases/damage-phase.js";
import { FaintPhase } from "#app/phases/faint-phase.js";
import { LearnMovePhase } from "#app/phases/learn-move-phase.js";
import { MoveEffectPhase } from "#app/phases/move-effect-phase.js";
import { MoveEndPhase } from "#app/phases/move-end-phase.js";
import { ObtainStatusEffectPhase } from "#app/phases/obtain-status-effect-phase.js";
import { StatChangePhase } from "#app/phases/stat-change-phase.js";
import { SwitchSummonPhase } from "#app/phases/switch-summon-phase.js";
import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase.js";
export enum FieldPosition { export enum FieldPosition {
CENTER, CENTER,
@ -119,6 +117,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
public maskEnabled: boolean; public maskEnabled: boolean;
public maskSprite: Phaser.GameObjects.Sprite | null; public maskSprite: Phaser.GameObjects.Sprite | null;
public usedTMs: Moves[];
private shinySparkle: Phaser.GameObjects.Sprite; private shinySparkle: Phaser.GameObjects.Sprite;
constructor(scene: BattleScene, x: number, y: number, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) { constructor(scene: BattleScene, x: number, y: number, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) {
@ -133,9 +133,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); this.scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance);
} }
const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value);
const randAbilityIndex = Utils.randSeedInt(2);
this.species = species; this.species = species;
this.pokeball = dataSource?.pokeball || PokeballType.POKEBALL; this.pokeball = dataSource?.pokeball || PokeballType.POKEBALL;
this.level = level; this.level = level;
@ -146,6 +143,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.abilityIndex = abilityIndex; // Use the provided ability index if it is defined this.abilityIndex = abilityIndex; // Use the provided ability index if it is defined
} else { } else {
// If abilityIndex is not provided, determine it based on species and hidden ability // If abilityIndex is not provided, determine it based on species and hidden ability
const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value);
const randAbilityIndex = Utils.randSeedInt(2);
if (species.abilityHidden && hasHiddenAbility) { if (species.abilityHidden && hasHiddenAbility) {
// If the species has a hidden ability and the hidden ability is present // If the species has a hidden ability and the hidden ability is present
this.abilityIndex = 2; this.abilityIndex = 2;
@ -196,6 +195,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.fusionVariant = dataSource.fusionVariant || 0; this.fusionVariant = dataSource.fusionVariant || 0;
this.fusionGender = dataSource.fusionGender; this.fusionGender = dataSource.fusionGender;
this.fusionLuck = dataSource.fusionLuck; this.fusionLuck = dataSource.fusionLuck;
this.usedTMs = dataSource.usedTMs ?? [];
} else { } else {
this.id = Utils.randSeedInt(4294967296); this.id = Utils.randSeedInt(4294967296);
this.ivs = ivs || Utils.getIvsFromId(this.id); this.ivs = ivs || Utils.getIvsFromId(this.id);
@ -674,49 +674,139 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}); });
} }
getStat(stat: Stat): integer { /**
* Retrieves the entire set of stats of the {@linkcode Pokemon}.
* @param bypassSummonData prefer actual stats (`true` by default) or in-battle overriden stats (`false`)
* @returns the numeric values of the {@linkcode Pokemon}'s stats
*/
getStats(bypassSummonData: boolean = true): number[] {
if (!bypassSummonData && this.summonData?.stats) {
return this.summonData.stats;
}
return this.stats;
}
/**
* Retrieves the corresponding {@linkcode PermanentStat} of the {@linkcode Pokemon}.
* @param stat the desired {@linkcode PermanentStat}
* @param bypassSummonData prefer actual stats (`true` by default) or in-battle overridden stats (`false`)
* @returns the numeric value of the desired {@linkcode Stat}
*/
getStat(stat: PermanentStat, bypassSummonData: boolean = true): number {
if (!bypassSummonData && this.summonData && (this.summonData.stats[stat] !== 0)) {
return this.summonData.stats[stat];
}
return this.stats[stat]; return this.stats[stat];
} }
getBattleStat(stat: Stat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): integer { /**
if (stat === Stat.HP) { * Writes the value to the corrseponding {@linkcode PermanentStat} of the {@linkcode Pokemon}.
return this.getStat(Stat.HP); *
} * Note that this does nothing if {@linkcode value} is less than 0.
const battleStat = (stat - 1) as BattleStat; * @param stat the desired {@linkcode PermanentStat} to be overwritten
const statLevel = new Utils.IntegerHolder(this.summonData.battleStats[battleStat]); * @param value the desired numeric value
if (opponent) { * @param bypassSummonData write to actual stats (`true` by default) or in-battle overridden stats (`false`)
if (isCritical) { */
switch (stat) { setStat(stat: PermanentStat, value: number, bypassSummonData: boolean = true): void {
case Stat.ATK: if (value >= 0) {
case Stat.SPATK: if (!bypassSummonData && this.summonData) {
statLevel.value = Math.max(statLevel.value, 0); this.summonData.stats[stat] = value;
break; } else {
case Stat.DEF: this.stats[stat] = value;
case Stat.SPDEF:
statLevel.value = Math.min(statLevel.value, 0);
break;
}
}
applyAbAttrs(IgnoreOpponentStatChangesAbAttr, opponent, null, false, statLevel);
if (move) {
applyMoveAttrs(IgnoreOpponentStatChangesAttr, this, opponent, move, statLevel);
} }
} }
if (this.isPlayer()) { }
this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), battleStat as integer as TempBattleStat, statLevel);
/**
* Retrieves the entire set of in-battle stat stages of the {@linkcode Pokemon}.
* @returns the numeric values of the {@linkcode Pokemon}'s in-battle stat stages if available, a fresh stat stage array otherwise
*/
getStatStages(): number[] {
return this.summonData ? this.summonData.statStages : [ 0, 0, 0, 0, 0, 0, 0 ];
}
/**
* Retrieves the in-battle stage of the specified {@linkcode BattleStat}.
* @param stat the {@linkcode BattleStat} whose stage is desired
* @returns the stage of the desired {@linkcode BattleStat} if available, 0 otherwise
*/
getStatStage(stat: BattleStat): number {
return this.summonData ? this.summonData.statStages[stat - 1] : 0;
}
/**
* Writes the value to the in-battle stage of the corresponding {@linkcode BattleStat} of the {@linkcode Pokemon}.
*
* Note that, if the value is not within a range of [-6, 6], it will be forced to the closest range bound.
* @param stat the {@linkcode BattleStat} whose stage is to be overwritten
* @param value the desired numeric value
*/
setStatStage(stat: BattleStat, value: number): void {
if (this.summonData) {
if (value >= -6) {
this.summonData.statStages[stat - 1] = Math.min(value, 6);
} else {
this.summonData.statStages[stat - 1] = Math.max(value, -6);
}
} }
const statValue = new Utils.NumberHolder(this.getStat(stat)); }
/**
* Retrieves the critical-hit stage considering the move used and the Pokemon
* who used it.
* @param source the {@linkcode Pokemon} who using the move
* @param move the {@linkcode Move} being used
* @returns the final critical-hit stage value
*/
getCritStage(source: Pokemon, move: Move): number {
const critStage = new Utils.IntegerHolder(0);
applyMoveAttrs(HighCritAttr, source, this, move, critStage);
this.scene.applyModifiers(CritBoosterModifier, source.isPlayer(), source, critStage);
this.scene.applyModifiers(TempCritBoosterModifier, source.isPlayer(), critStage);
const bonusCrit = new Utils.BooleanHolder(false);
//@ts-ignore
if (applyAbAttrs(BonusCritAbAttr, source, null, false, bonusCrit)) { // TODO: resolve ts-ignore. This is a promise. Checking a promise is bogus.
if (bonusCrit.value) {
critStage.value += 1;
}
}
const critBoostTag = source.getTag(CritBoostTag);
if (critBoostTag) {
if (critBoostTag instanceof DragonCheerTag) {
critStage.value += critBoostTag.typesOnAdd.includes(Type.DRAGON) ? 2 : 1;
} else {
critStage.value += 2;
}
}
console.log(`crit stage: +${critStage.value}`);
return critStage.value;
}
/**
* Calculates and retrieves the final value of a stat considering any held
* items, move effects, opponent abilities, and whether there was a critical
* hit.
* @param stat the desired {@linkcode EffectiveStat}
* @param opponent the target {@linkcode Pokemon}
* @param move the {@linkcode Move} being used
* @param isCritical determines whether a critical hit has occurred or not (`false` by default)
* @returns the final in-battle value of a stat
*/
getEffectiveStat(stat: EffectiveStat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): integer {
const statValue = new Utils.NumberHolder(this.getStat(stat, false));
this.scene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue); this.scene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue);
const fieldApplied = new Utils.BooleanHolder(false); const fieldApplied = new Utils.BooleanHolder(false);
for (const pokemon of this.scene.getField(true)) { for (const pokemon of this.scene.getField(true)) {
applyFieldBattleStatMultiplierAbAttrs(FieldMultiplyBattleStatAbAttr, pokemon, stat, statValue, this, fieldApplied); applyFieldStatMultiplierAbAttrs(FieldMultiplyStatAbAttr, pokemon, stat, statValue, this, fieldApplied);
if (fieldApplied.value) { if (fieldApplied.value) {
break; break;
} }
} }
applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this, battleStat, statValue); applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, stat, statValue);
let ret = statValue.value * (Math.max(2, 2 + statLevel.value) / Math.max(2, 2 - statLevel.value)); let ret = statValue.value * this.getStatStageMultiplier(stat, opponent, move, isCritical);
switch (stat) { switch (stat) {
case Stat.ATK: case Stat.ATK:
if (this.getTag(BattlerTagType.SLOW_START)) { if (this.getTag(BattlerTagType.SLOW_START)) {
@ -763,24 +853,25 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (!this.stats) { if (!this.stats) {
this.stats = [ 0, 0, 0, 0, 0, 0 ]; this.stats = [ 0, 0, 0, 0, 0, 0 ];
} }
const baseStats = this.getSpeciesForm().baseStats.slice(0);
if (this.fusionSpecies) { // Get and manipulate base stats
const fusionBaseStats = this.getFusionSpeciesForm().baseStats; const baseStats = this.getSpeciesForm(true).baseStats.slice();
for (let s = 0; s < this.stats.length; s++) { if (this.isFusion()) {
const fusionBaseStats = this.getFusionSpeciesForm(true).baseStats;
for (const s of PERMANENT_STATS) {
baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2); baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2);
} }
} else if (this.scene.gameMode.isSplicedOnly) { } else if (this.scene.gameMode.isSplicedOnly) {
for (let s = 0; s < this.stats.length; s++) { for (const s of PERMANENT_STATS) {
baseStats[s] = Math.ceil(baseStats[s] / 2); baseStats[s] = Math.ceil(baseStats[s] / 2);
} }
} }
this.scene.applyModifiers(PokemonBaseStatModifier, this.isPlayer(), this, baseStats); this.scene.applyModifiers(BaseStatModifier, this.isPlayer(), this, baseStats);
const stats = Utils.getEnumValues(Stat);
for (const s of stats) { // Using base stats, calculate and store stats one by one
const isHp = s === Stat.HP; for (const s of PERMANENT_STATS) {
const baseStat = baseStats[s]; let value = Math.floor(((2 * baseStats[s] + this.ivs[s]) * this.level) * 0.01);
let value = Math.floor(((2 * baseStat + this.ivs[s]) * this.level) * 0.01); if (s === Stat.HP) {
if (isHp) {
value = value + this.level + 10; value = value + this.level + 10;
if (this.hasAbility(Abilities.WONDER_GUARD, false, true)) { if (this.hasAbility(Abilities.WONDER_GUARD, false, true)) {
value = 1; value = 1;
@ -801,7 +892,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
value = Math.max(Math[natureStatMultiplier.value > 1 ? "ceil" : "floor"](value * natureStatMultiplier.value), 1); value = Math.max(Math[natureStatMultiplier.value > 1 ? "ceil" : "floor"](value * natureStatMultiplier.value), 1);
} }
} }
this.stats[s] = value;
this.setStat(s, value);
} }
} }
@ -936,7 +1028,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (this.metBiome === -1 && !this.scene.gameMode.isFreshStartChallenge() && !this.scene.gameMode.isDaily) { if (this.metBiome === -1 && !this.scene.gameMode.isFreshStartChallenge() && !this.scene.gameMode.isDaily) {
levelMoves = this.getUnlockedEggMoves().concat(levelMoves); levelMoves = this.getUnlockedEggMoves().concat(levelMoves);
} }
return levelMoves.filter(lm => !this.moveset.some(m => m?.moveId === lm)); if (Array.isArray(this.usedTMs) && this.usedTMs.length > 0) {
levelMoves = this.usedTMs.filter(m => !levelMoves.includes(m)).concat(levelMoves);
}
levelMoves = levelMoves.filter(lm => !this.moveset.some(m => m?.moveId === lm));
return levelMoves;
} }
/** /**
@ -1210,6 +1306,28 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return !!this.getTag(GroundedTag) || (!this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.MAGNET_RISEN) && !this.getTag(SemiInvulnerableTag)); return !!this.getTag(GroundedTag) || (!this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.MAGNET_RISEN) && !this.getTag(SemiInvulnerableTag));
} }
/**
* Determines whether this Pokemon is prevented from running or switching due
* to effects from moves and/or abilities.
* @param trappedAbMessages `string[]` If defined, ability trigger messages
* (e.g. from Shadow Tag) are forwarded through this array.
* @param simulated `boolean` if `true`, applies abilities via simulated calls.
* @returns
*/
isTrapped(trappedAbMessages: string[] = [], simulated: boolean = true): boolean {
if (this.isOfType(Type.GHOST)) {
return false;
}
const trappedByAbility = new Utils.BooleanHolder(false);
this.scene.getEnemyField()!.forEach(enemyPokemon =>
applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trappedByAbility, this, trappedAbMessages, simulated)
);
return (trappedByAbility.value || !!this.getTag(TrappedTag));
}
/** /**
* Calculates the type of a move when used by this Pokemon after * Calculates the type of a move when used by this Pokemon after
* type-changing move and ability attributes have applied. * type-changing move and ability attributes have applied.
@ -1276,6 +1394,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
} }
// Apply Tera Shell's effect to attacks after all immunities are accounted for
if (!ignoreAbility && move.category !== MoveCategory.STATUS) {
applyPreDefendAbAttrs(FullHpResistTypeAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier);
}
return (!cancelledHolder.value ? typeMultiplier.value : 0) as TypeDamageMultiplier; return (!cancelledHolder.value ? typeMultiplier.value : 0) as TypeDamageMultiplier;
} }
@ -1345,7 +1468,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const types = this.getTypes(true); const types = this.getTypes(true);
const enemyTypes = opponent.getTypes(true, true); const enemyTypes = opponent.getTypes(true, true);
/** Is this Pokemon faster than the opponent? */ /** Is this Pokemon faster than the opponent? */
const outspeed = (this.isActive(true) ? this.getBattleStat(Stat.SPD, opponent) : this.getStat(Stat.SPD)) >= opponent.getBattleStat(Stat.SPD, this); const outspeed = (this.isActive(true) ? this.getEffectiveStat(Stat.SPD, opponent) : this.getStat(Stat.SPD, false)) >= opponent.getEffectiveStat(Stat.SPD, this);
/** /**
* Based on how effective this Pokemon's types are offensively against the opponent's types. * Based on how effective this Pokemon's types are offensively against the opponent's types.
* This score is increased by 25 percent if this Pokemon is faster than the opponent. * This score is increased by 25 percent if this Pokemon is faster than the opponent.
@ -1501,13 +1624,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
/** /**
* Function that tries to set a Pokemon shiny based on the trainer's trainer ID and secret ID * Function that tries to set a Pokemon shiny based on the trainer's trainer ID and secret ID.
* Endless Pokemon in the end biome are unable to be set to shiny * Endless Pokemon in the end biome are unable to be set to shiny
* *
* The exact mechanic is that it calculates E as the XOR of the player's trainer ID and secret ID * The exact mechanic is that it calculates E as the XOR of the player's trainer ID and secret ID.
* F is calculated as the XOR of the first 16 bits of the Pokemon's ID with the last 16 bits * F is calculated as the XOR of the first 16 bits of the Pokemon's ID with the last 16 bits.
* The XOR of E and F are then compared to the thresholdOverride (default case 32) to see whether or not to generate a shiny * The XOR of E and F are then compared to the {@linkcode shinyThreshold} (or {@linkcode thresholdOverride} if set) to see whether or not to generate a shiny.
* @param thresholdOverride number that is divided by 2^16 (65536) to get the shiny chance * The base shiny odds are {@linkcode baseShinyChance} / 65536
* @param thresholdOverride number that is divided by 2^16 (65536) to get the shiny chance, overrides {@linkcode shinyThreshold} if set (bypassing shiny rate modifiers such as Shiny Charm)
* @returns true if the Pokemon has been set as a shiny, false otherwise * @returns true if the Pokemon has been set as a shiny, false otherwise
*/ */
trySetShiny(thresholdOverride?: integer): boolean { trySetShiny(thresholdOverride?: integer): boolean {
@ -1522,7 +1646,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const E = this.scene.gameData.trainerId ^ this.scene.gameData.secretId; const E = this.scene.gameData.trainerId ^ this.scene.gameData.secretId;
const F = rand1 ^ rand2; const F = rand1 ^ rand2;
const shinyThreshold = new Utils.IntegerHolder(32); /** `64/65536 -> 1/1024` */
const baseShinyChance = 64;
const shinyThreshold = new Utils.IntegerHolder(baseShinyChance);
if (thresholdOverride === undefined) { if (thresholdOverride === undefined) {
if (this.scene.eventManager.isEventActive()) { if (this.scene.eventManager.isEventActive()) {
shinyThreshold.value *= this.scene.eventManager.getShinyMultiplier(); shinyThreshold.value *= this.scene.eventManager.getShinyMultiplier();
@ -1535,9 +1661,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
this.shiny = (E ^ F) < shinyThreshold.value; this.shiny = (E ^ F) < shinyThreshold.value;
if ((E ^ F) < 32) {
console.log("REAL SHINY!!");
}
if (this.shiny) { if (this.shiny) {
this.initShinySparkle(); this.initShinySparkle();
@ -1724,7 +1847,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].hasAttr(SacrificialAttr) ? 0.5 : 1)]); movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].hasAttr(SacrificialAttr) ? 0.5 : 1)]);
movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].hasAttr(SacrificialAttrOnHit) ? 0.5 : 1)]); movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].hasAttr(SacrificialAttrOnHit) ? 0.5 : 1)]);
// Trainers get a weight bump to stat buffing moves // Trainers get a weight bump to stat buffing moves
movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].getAttrs(StatChangeAttr).some(a => a.levels > 1 && a.selfTarget) ? 1.25 : 1)]); movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].getAttrs(StatStageChangeAttr).some(a => a.stages > 1 && a.selfTarget) ? 1.25 : 1)]);
// Trainers get a weight decrease to multiturn moves // Trainers get a weight decrease to multiturn moves
movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].hasAttr(ChargeAttr) || !!allMoves[m[0]].hasAttr(RechargeAttr) ? 0.7 : 1)]); movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].hasAttr(ChargeAttr) || !!allMoves[m[0]].hasAttr(RechargeAttr) ? 0.7 : 1)]);
} }
@ -1736,8 +1859,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].category === MoveCategory.STATUS ? 1 : Math.max(Math.min(allMoves[m[0]].power/maxPower, 1), 0.5))]); movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].category === MoveCategory.STATUS ? 1 : Math.max(Math.min(allMoves[m[0]].power/maxPower, 1), 0.5))]);
// Weight damaging moves against the lower stat // Weight damaging moves against the lower stat
const worseCategory: MoveCategory = this.stats[Stat.ATK] > this.stats[Stat.SPATK] ? MoveCategory.SPECIAL : MoveCategory.PHYSICAL; const atk = this.getStat(Stat.ATK);
const statRatio = worseCategory === MoveCategory.PHYSICAL ? this.stats[Stat.ATK]/this.stats[Stat.SPATK] : this.stats[Stat.SPATK]/this.stats[Stat.ATK]; const spAtk = this.getStat(Stat.SPATK);
const worseCategory: MoveCategory = atk > spAtk ? MoveCategory.SPECIAL : MoveCategory.PHYSICAL;
const statRatio = worseCategory === MoveCategory.PHYSICAL ? atk / spAtk : spAtk / atk;
movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].category === worseCategory ? statRatio : 1)]); movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].category === worseCategory ? statRatio : 1)]);
let weightMultiplier = 0.9; // The higher this is the more the game weights towards higher level moves. At 0 all moves are equal weight. let weightMultiplier = 0.9; // The higher this is the more the game weights towards higher level moves. At 0 all moves are equal weight.
@ -1923,6 +2048,48 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return this instanceof PlayerPokemon ? this.scene.getPlayerField() : this.scene.getEnemyField(); return this instanceof PlayerPokemon ? this.scene.getPlayerField() : this.scene.getEnemyField();
} }
/**
* Calculates the stat stage multiplier of the user against an opponent.
*
* Note that this does not apply to evasion or accuracy
* @see {@linkcode getAccuracyMultiplier}
* @param stat the desired {@linkcode EffectiveStat}
* @param opponent the target {@linkcode Pokemon}
* @param move the {@linkcode Move} being used
* @param isCritical determines whether a critical hit has occurred or not (`false` by default)
* @return the stat stage multiplier to be used for effective stat calculation
*/
getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): number {
const statStage = new Utils.IntegerHolder(this.getStatStage(stat));
const ignoreStatStage = new Utils.BooleanHolder(false);
if (opponent) {
if (isCritical) {
switch (stat) {
case Stat.ATK:
case Stat.SPATK:
statStage.value = Math.max(statStage.value, 0);
break;
case Stat.DEF:
case Stat.SPDEF:
statStage.value = Math.min(statStage.value, 0);
break;
}
}
applyAbAttrs(IgnoreOpponentStatStagesAbAttr, opponent, null, false, stat, ignoreStatStage);
if (move) {
applyMoveAttrs(IgnoreOpponentStatStagesAttr, this, opponent, move, ignoreStatStage);
}
}
if (!ignoreStatStage.value) {
const statStageMultiplier = new Utils.NumberHolder(Math.max(2, 2 + statStage.value) / Math.max(2, 2 - statStage.value));
this.scene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), stat, statStageMultiplier);
return Math.min(statStageMultiplier.value, 4);
}
return 1;
}
/** /**
* Calculates the accuracy multiplier of the user against a target. * Calculates the accuracy multiplier of the user against a target.
* *
@ -1939,34 +2106,38 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return 1; return 1;
} }
const userAccuracyLevel = new Utils.IntegerHolder(this.summonData.battleStats[BattleStat.ACC]); const userAccStage = new Utils.IntegerHolder(this.getStatStage(Stat.ACC));
const targetEvasionLevel = new Utils.IntegerHolder(target.summonData.battleStats[BattleStat.EVA]); const targetEvaStage = new Utils.IntegerHolder(target.getStatStage(Stat.EVA));
applyAbAttrs(IgnoreOpponentStatChangesAbAttr, target, null, false, userAccuracyLevel); const ignoreAccStatStage = new Utils.BooleanHolder(false);
applyAbAttrs(IgnoreOpponentStatChangesAbAttr, this, null, false, targetEvasionLevel); const ignoreEvaStatStage = new Utils.BooleanHolder(false);
applyAbAttrs(IgnoreOpponentEvasionAbAttr, this, null, false, targetEvasionLevel);
applyMoveAttrs(IgnoreOpponentStatChangesAttr, this, target, sourceMove, targetEvasionLevel); applyAbAttrs(IgnoreOpponentStatStagesAbAttr, target, null, false, Stat.ACC, ignoreAccStatStage);
this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), TempBattleStat.ACC, userAccuracyLevel); applyAbAttrs(IgnoreOpponentStatStagesAbAttr, this, null, false, Stat.EVA, ignoreEvaStatStage);
applyMoveAttrs(IgnoreOpponentStatStagesAttr, this, target, sourceMove, ignoreEvaStatStage);
this.scene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), Stat.ACC, userAccStage);
userAccStage.value = ignoreAccStatStage.value ? 0 : Math.min(userAccStage.value, 6);
targetEvaStage.value = ignoreEvaStatStage.value ? 0 : targetEvaStage.value;
if (target.findTag(t => t instanceof ExposedTag)) { if (target.findTag(t => t instanceof ExposedTag)) {
targetEvasionLevel.value = Math.min(0, targetEvasionLevel.value); targetEvaStage.value = Math.min(0, targetEvaStage.value);
} }
const accuracyMultiplier = new Utils.NumberHolder(1); const accuracyMultiplier = new Utils.NumberHolder(1);
if (userAccuracyLevel.value !== targetEvasionLevel.value) { if (userAccStage.value !== targetEvaStage.value) {
accuracyMultiplier.value = userAccuracyLevel.value > targetEvasionLevel.value accuracyMultiplier.value = userAccStage.value > targetEvaStage.value
? (3 + Math.min(userAccuracyLevel.value - targetEvasionLevel.value, 6)) / 3 ? (3 + Math.min(userAccStage.value - targetEvaStage.value, 6)) / 3
: 3 / (3 + Math.min(targetEvasionLevel.value - userAccuracyLevel.value, 6)); : 3 / (3 + Math.min(targetEvaStage.value - userAccStage.value, 6));
} }
applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this, BattleStat.ACC, accuracyMultiplier, false, sourceMove); applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, Stat.ACC, accuracyMultiplier, false, sourceMove);
const evasionMultiplier = new Utils.NumberHolder(1); const evasionMultiplier = new Utils.NumberHolder(1);
applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, target, BattleStat.EVA, evasionMultiplier); applyStatMultiplierAbAttrs(StatMultiplierAbAttr, target, Stat.EVA, evasionMultiplier);
accuracyMultiplier.value /= evasionMultiplier.value; return accuracyMultiplier.value / evasionMultiplier.value;
return accuracyMultiplier.value;
} }
/** /**
@ -2053,22 +2224,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (critOnly.value || critAlways) { if (critOnly.value || critAlways) {
isCritical = true; isCritical = true;
} else { } else {
const critLevel = new Utils.IntegerHolder(0); const critChance = [24, 8, 2, 1][Math.max(0, Math.min(this.getCritStage(source, move), 3))];
applyMoveAttrs(HighCritAttr, source, this, move, critLevel);
this.scene.applyModifiers(CritBoosterModifier, source.isPlayer(), source, critLevel);
this.scene.applyModifiers(TempBattleStatBoosterModifier, source.isPlayer(), TempBattleStat.CRIT, critLevel);
const bonusCrit = new Utils.BooleanHolder(false);
//@ts-ignore
if (applyAbAttrs(BonusCritAbAttr, source, null, false, bonusCrit)) { // TODO: resolve ts-ignore. This is a promise. Checking a promise is bogus.
if (bonusCrit.value) {
critLevel.value += 1;
}
}
if (source.getTag(BattlerTagType.CRIT_BOOST)) {
critLevel.value += 2;
}
console.log(`crit stage: +${critLevel.value}`);
const critChance = [24, 8, 2, 1][Math.max(0, Math.min(critLevel.value, 3))];
isCritical = critChance === 1 || !this.scene.randBattleSeedInt(critChance); isCritical = critChance === 1 || !this.scene.randBattleSeedInt(critChance);
if (Overrides.NEVER_CRIT_OVERRIDE) { if (Overrides.NEVER_CRIT_OVERRIDE) {
isCritical = false; isCritical = false;
@ -2082,8 +2238,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
isCritical = false; isCritical = false;
} }
} }
const sourceAtk = new Utils.IntegerHolder(source.getBattleStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, isCritical)); const sourceAtk = new Utils.IntegerHolder(source.getEffectiveStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, isCritical));
const targetDef = new Utils.IntegerHolder(this.getBattleStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical)); const targetDef = new Utils.IntegerHolder(this.getEffectiveStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical));
const criticalMultiplier = new Utils.NumberHolder(isCritical ? 1.5 : 1); const criticalMultiplier = new Utils.NumberHolder(isCritical ? 1.5 : 1);
applyAbAttrs(MultCritAbAttr, source, null, false, criticalMultiplier); applyAbAttrs(MultCritAbAttr, source, null, false, criticalMultiplier);
const screenMultiplier = new Utils.NumberHolder(1); const screenMultiplier = new Utils.NumberHolder(1);
@ -2494,10 +2650,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
* @param source {@linkcode Pokemon} the pokemon whose stats/Tags are to be passed on from, ie: the Pokemon using Baton Pass * @param source {@linkcode Pokemon} the pokemon whose stats/Tags are to be passed on from, ie: the Pokemon using Baton Pass
*/ */
transferSummon(source: Pokemon): void { transferSummon(source: Pokemon): void {
const battleStats = Utils.getEnumValues(BattleStat); // Copy all stat stages
for (const stat of battleStats) { for (const s of BATTLE_STATS) {
this.summonData.battleStats[stat] = source.summonData.battleStats[stat]; const sourceStage = source.getStatStage(s);
if ((this instanceof PlayerPokemon) && (sourceStage === 6)) {
this.scene.validateAchv(achvs.TRANSFER_MAX_STAT_STAGE);
}
this.setStatStage(s, sourceStage);
} }
for (const tag of source.summonData.tags) { for (const tag of source.summonData.tags) {
// bypass those can not be passed via Baton Pass // bypass those can not be passed via Baton Pass
@ -2509,9 +2670,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.summonData.tags.push(tag); this.summonData.tags.push(tag);
} }
if (this instanceof PlayerPokemon && source.summonData.battleStats.find(bs => bs === 6)) {
this.scene.validateAchv(achvs.TRANSFER_MAX_BATTLE_STAT);
}
this.updateInfo(); this.updateInfo();
} }
@ -2754,6 +2913,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const types = this.getTypes(true, true); const types = this.getTypes(true, true);
const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
if (sourcePokemon && sourcePokemon !== this && this.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, defendingSide)) {
return false;
}
switch (effect) { switch (effect) {
case StatusEffect.POISON: case StatusEffect.POISON:
case StatusEffect.TOXIC: case StatusEffect.TOXIC:
@ -3319,6 +3483,7 @@ export default interface Pokemon {
export class PlayerPokemon extends Pokemon { export class PlayerPokemon extends Pokemon {
public compatibleTms: Moves[]; public compatibleTms: Moves[];
public usedTms: Moves[];
constructor(scene: BattleScene, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) { constructor(scene: BattleScene, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) {
super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource);
@ -3342,6 +3507,7 @@ export class PlayerPokemon extends Pokemon {
} }
} }
this.generateCompatibleTms(); this.generateCompatibleTms();
this.usedTms = [];
} }
initBattleInfo(): void { initBattleInfo(): void {
@ -3600,6 +3766,9 @@ export class PlayerPokemon extends Pokemon {
newPokemon.moveset = this.moveset.slice(); newPokemon.moveset = this.moveset.slice();
newPokemon.moveset = this.copyMoveset(); newPokemon.moveset = this.copyMoveset();
newPokemon.luck = this.luck; newPokemon.luck = this.luck;
newPokemon.metLevel = this.metLevel;
newPokemon.metBiome = this.metBiome;
newPokemon.metSpecies = this.metSpecies;
newPokemon.fusionSpecies = this.fusionSpecies; newPokemon.fusionSpecies = this.fusionSpecies;
newPokemon.fusionFormIndex = this.fusionFormIndex; newPokemon.fusionFormIndex = this.fusionFormIndex;
newPokemon.fusionAbilityIndex = this.fusionAbilityIndex; newPokemon.fusionAbilityIndex = this.fusionAbilityIndex;
@ -3679,16 +3848,17 @@ export class PlayerPokemon extends Pokemon {
this.scene.gameData.gameStats.pokemonFused++; this.scene.gameData.gameStats.pokemonFused++;
// Store the average HP% that each Pokemon has // Store the average HP% that each Pokemon has
const newHpPercent = ((pokemon.hp / pokemon.stats[Stat.HP]) + (this.hp / this.stats[Stat.HP])) / 2; const maxHp = this.getMaxHp();
const newHpPercent = ((pokemon.hp / pokemon.getMaxHp()) + (this.hp / maxHp)) / 2;
this.generateName(); this.generateName();
this.calculateStats(); this.calculateStats();
// Set this Pokemon's HP to the average % of both fusion components // Set this Pokemon's HP to the average % of both fusion components
this.hp = Math.round(this.stats[Stat.HP] * newHpPercent); this.hp = Math.round(maxHp * newHpPercent);
if (!this.isFainted()) { if (!this.isFainted()) {
// If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum // If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum
this.hp = Math.min(this.hp, this.stats[Stat.HP]); this.hp = Math.min(this.hp, maxHp);
this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two
} else if (!pokemon.isFainted()) { } else if (!pokemon.isFainted()) {
// If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero // If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero
@ -4138,7 +4308,7 @@ export class EnemyPokemon extends Pokemon {
//console.log('damage', damage, 'segment', segmentsBypassed + 1, 'segment size', segmentSize, 'damage needed', Math.round(segmentSize * Math.pow(2, segmentsBypassed + 1))); //console.log('damage', damage, 'segment', segmentsBypassed + 1, 'segment size', segmentSize, 'damage needed', Math.round(segmentSize * Math.pow(2, segmentsBypassed + 1)));
} }
damage = hpRemainder + Math.round(segmentSize * segmentsBypassed); damage = Utils.toDmgValue(this.hp - hpThreshold + segmentSize * segmentsBypassed);
clearedBossSegmentIndex = s - segmentsBypassed; clearedBossSegmentIndex = s - segmentsBypassed;
} }
break; break;
@ -4181,43 +4351,40 @@ export class EnemyPokemon extends Pokemon {
handleBossSegmentCleared(segmentIndex: integer): void { handleBossSegmentCleared(segmentIndex: integer): void {
while (segmentIndex - 1 < this.bossSegmentIndex) { while (segmentIndex - 1 < this.bossSegmentIndex) {
let boostedStat = BattleStat.RAND; // Filter out already maxed out stat stages and weigh the rest based on existing stats
const leftoverStats = EFFECTIVE_STATS.filter((s: EffectiveStat) => this.getStatStage(s) < 6);
const statWeights = leftoverStats.map((s: EffectiveStat) => this.getStat(s, false));
const battleStats = Utils.getEnumValues(BattleStat).slice(0, -3); let boostedStat: EffectiveStat;
const statWeights = new Array().fill(battleStats.length).filter((bs: BattleStat) => this.summonData.battleStats[bs] < 6).map((bs: BattleStat) => this.getStat(bs + 1)); const statThresholds: number[] = [];
const statThresholds: integer[] = [];
let totalWeight = 0; let totalWeight = 0;
for (const bs of battleStats) {
totalWeight += statWeights[bs]; for (const i in statWeights) {
totalWeight += statWeights[i];
statThresholds.push(totalWeight); statThresholds.push(totalWeight);
} }
// Pick a random stat from the leftover stats to increase its stages
const randInt = Utils.randSeedInt(totalWeight); const randInt = Utils.randSeedInt(totalWeight);
for (const i in statThresholds) {
for (const bs of battleStats) { if (randInt < statThresholds[i]) {
if (randInt < statThresholds[bs]) { boostedStat = leftoverStats[i];
boostedStat = bs;
break; break;
} }
} }
let statLevels = 1; let stages = 1;
switch (segmentIndex) { // increase the boost if the boss has at least 3 segments and we passed last shield
case 1: if (this.bossSegments >= 3 && this.bossSegmentIndex === 1) {
if (this.bossSegments >= 3) { stages++;
statLevels++; }
} // increase the boost if the boss has at least 5 segments and we passed the second to last shield
break; if (this.bossSegments >= 5 && this.bossSegmentIndex === 2) {
case 2: stages++;
if (this.bossSegments >= 5) {
statLevels++;
}
break;
} }
this.scene.unshiftPhase(new StatChangePhase(this.scene, this.getBattlerIndex(), true, [ boostedStat ], statLevels, true, true)); this.scene.unshiftPhase(new StatStageChangePhase(this.scene, this.getBattlerIndex(), true, [ boostedStat! ], stages, true, true));
this.bossSegmentIndex--; this.bossSegmentIndex--;
} }
} }
@ -4274,7 +4441,7 @@ export interface TurnMove {
targets?: BattlerIndex[]; targets?: BattlerIndex[];
result: MoveResult; result: MoveResult;
virtual?: boolean; virtual?: boolean;
turn?: integer; turn?: number;
} }
export interface QueuedMove { export interface QueuedMove {
@ -4286,17 +4453,17 @@ export interface QueuedMove {
export interface AttackMoveResult { export interface AttackMoveResult {
move: Moves; move: Moves;
result: DamageResult; result: DamageResult;
damage: integer; damage: number;
critical: boolean; critical: boolean;
sourceId: integer; sourceId: number;
sourceBattlerIndex: BattlerIndex; sourceBattlerIndex: BattlerIndex;
} }
export class PokemonSummonData { export class PokemonSummonData {
public battleStats: integer[] = [ 0, 0, 0, 0, 0, 0, 0 ]; public statStages: number[] = [ 0, 0, 0, 0, 0, 0, 0 ];
public moveQueue: QueuedMove[] = []; public moveQueue: QueuedMove[] = [];
public disabledMove: Moves = Moves.NONE; public disabledMove: Moves = Moves.NONE;
public disabledTurns: integer = 0; public disabledTurns: number = 0;
public tags: BattlerTag[] = []; public tags: BattlerTag[] = [];
public abilitySuppressed: boolean = false; public abilitySuppressed: boolean = false;
public abilitiesApplied: Abilities[] = []; public abilitiesApplied: Abilities[] = [];
@ -4306,14 +4473,14 @@ export class PokemonSummonData {
public ability: Abilities = Abilities.NONE; public ability: Abilities = Abilities.NONE;
public gender: Gender; public gender: Gender;
public fusionGender: Gender; public fusionGender: Gender;
public stats: integer[]; public stats: number[] = [ 0, 0, 0, 0, 0, 0 ];
public moveset: (PokemonMove | null)[]; public moveset: (PokemonMove | null)[];
// If not initialized this value will not be populated from save data. // If not initialized this value will not be populated from save data.
public types: Type[] = []; public types: Type[] = [];
} }
export class PokemonBattleData { export class PokemonBattleData {
public hitCount: integer = 0; public hitCount: number = 0;
public endured: boolean = false; public endured: boolean = false;
public berriesEaten: BerryType[] = []; public berriesEaten: BerryType[] = [];
public abilitiesApplied: Abilities[] = []; public abilitiesApplied: Abilities[] = [];
@ -4322,21 +4489,23 @@ export class PokemonBattleData {
export class PokemonBattleSummonData { export class PokemonBattleSummonData {
/** The number of turns the pokemon has passed since entering the battle */ /** The number of turns the pokemon has passed since entering the battle */
public turnCount: integer = 1; public turnCount: number = 1;
/** The list of moves the pokemon has used since entering the battle */ /** The list of moves the pokemon has used since entering the battle */
public moveHistory: TurnMove[] = []; public moveHistory: TurnMove[] = [];
} }
export class PokemonTurnData { export class PokemonTurnData {
public flinched: boolean; public flinched: boolean = false;
public acted: boolean; public acted: boolean = false;
public hitCount: integer; public hitCount: number;
public hitsLeft: integer; public hitsLeft: number;
public damageDealt: integer = 0; public damageDealt: number = 0;
public currDamageDealt: integer = 0; public currDamageDealt: number = 0;
public damageTaken: integer = 0; public damageTaken: number = 0;
public attacksReceived: AttackMoveResult[] = []; public attacksReceived: AttackMoveResult[] = [];
public order: number; public order: number;
public statStagesIncreased: boolean = false;
public statStagesDecreased: boolean = false;
} }
export enum AiType { export enum AiType {

View File

@ -37,8 +37,7 @@ export interface ModifierTypeTranslationEntries {
ModifierType: { [key: string]: ModifierTypeTranslationEntry }, ModifierType: { [key: string]: ModifierTypeTranslationEntry },
SpeciesBoosterItem: { [key: string]: ModifierTypeTranslationEntry }, SpeciesBoosterItem: { [key: string]: ModifierTypeTranslationEntry },
AttackTypeBoosterItem: SimpleTranslationEntries, AttackTypeBoosterItem: SimpleTranslationEntries,
TempBattleStatBoosterItem: SimpleTranslationEntries, TempStatStageBoosterItem: SimpleTranslationEntries,
TempBattleStatBoosterStatName: SimpleTranslationEntries,
BaseStatBoosterItem: SimpleTranslationEntries, BaseStatBoosterItem: SimpleTranslationEntries,
EvolutionItem: SimpleTranslationEntries, EvolutionItem: SimpleTranslationEntries,
FormChangeItem: SimpleTranslationEntries, FormChangeItem: SimpleTranslationEntries,

View File

@ -98,6 +98,8 @@ export class LoadingScene extends SceneBase {
this.loadImage("ha_capsule", "ui", "ha_capsule.png"); this.loadImage("ha_capsule", "ui", "ha_capsule.png");
this.loadImage("champion_ribbon", "ui", "champion_ribbon.png"); this.loadImage("champion_ribbon", "ui", "champion_ribbon.png");
this.loadImage("icon_spliced", "ui"); this.loadImage("icon_spliced", "ui");
this.loadImage("icon_lock", "ui", "icon_lock.png");
this.loadImage("icon_stop", "ui", "icon_stop.png");
this.loadImage("icon_tera", "ui"); this.loadImage("icon_tera", "ui");
this.loadImage("type_tera", "ui"); this.loadImage("type_tera", "ui");
this.loadAtlas("type_bgs", "ui"); this.loadAtlas("type_bgs", "ui");

View File

@ -89,7 +89,7 @@
"name": "Bänder-Meister", "name": "Bänder-Meister",
"name_female": "Bänder-Meisterin" "name_female": "Bänder-Meisterin"
}, },
"TRANSFER_MAX_BATTLE_STAT": { "TRANSFER_MAX_STAT_STAGE": {
"name": "Teamwork", "name": "Teamwork",
"description": "Nutze Staffette, während der Anwender mindestens eines Statuswertes maximiert hat." "description": "Nutze Staffette, während der Anwender mindestens eines Statuswertes maximiert hat."
}, },
@ -274,4 +274,4 @@
"name": "Spieglein, Spieglein an der Wand", "name": "Spieglein, Spieglein an der Wand",
"description": "Schließe die 'Umkehrkampf' Herausforderung ab" "description": "Schließe die 'Umkehrkampf' Herausforderung ab"
} }
} }

View File

@ -47,5 +47,11 @@
"tailwindOnRemovePlayer": "Der Rückenwind auf deiner Seite hat sich gelegt!", "tailwindOnRemovePlayer": "Der Rückenwind auf deiner Seite hat sich gelegt!",
"tailwindOnRemoveEnemy": "Der Rückenwind auf gegnerischer Seite hat sich gelegt!", "tailwindOnRemoveEnemy": "Der Rückenwind auf gegnerischer Seite hat sich gelegt!",
"happyHourOnAdd": "Goldene Zeiten sind angebrochen!", "happyHourOnAdd": "Goldene Zeiten sind angebrochen!",
"happyHourOnRemove": "Die goldenen Zeiten sind vorbei!" "happyHourOnRemove": "Die goldenen Zeiten sind vorbei!",
"safeguardOnAdd": "Das ganze Feld wird von einem Schleier umhüllt!",
"safeguardOnAddPlayer": "Das Team des Anwenders wird von einem Schleier umhüllt!",
"safeguardOnAddEnemy": "Das gegnerische Team wird von einem Schleier umhüllt!",
"safeguardOnRemove": "Der mystische Schleier, der das ganze Feld umgab, hat sich gelüftet!",
"safeguardOnRemovePlayer": "Der mystische Schleier, der dein Team umgab, hat sich gelüftet!",
"safeguardOnRemoveEnemy": "Der mystische Schleier, der das gegnerische Team umgab, hat sich gelüftet!"
} }

View File

@ -1,6 +1,6 @@
{ {
"ending": "@c{smile}Oh? Du hast gewonnen?@d{96} @c{smile_eclosed}Ich schätze, das hätte ich wissen sollen.\n$Aber, du bist jetzt zurück.\n$@c{smile}Es ist vorbei.@d{64} Du hast die Schleife beendet.\n$@c{serious_smile_fists}Du hast auch deinen Traum erfüllt, nicht wahr?\nDu hast nicht einmal verloren.\n$@c{neutral}Ich bin der Einzige, der sich daran erinnern wird, was du getan hast.@d{96}\n$Ich schätze, das ist in Ordnung, oder?\n$@c{serious_smile_fists}Deine Legende wird immer in unseren Herzen weiterleben.\n$@c{smile_eclosed}Wie auch immer, ich habe genug von diesem Ort, oder nicht? Lass uns nach Hause gehen.\n$@c{serious_smile_fists}Vielleicht können wir, wenn wir zurück sind, noch einen Kampf haben?\n$Wenn du dazu bereit bist.", "ending": "@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?!\n$@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast.\n$@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl.\n$@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet.\n$@c{smile_ehalf}Du hast auch deinen Traum erfüllt, nicht wahr?\n$Du hast nicht einmal verloren.\n$Ich werde die Einzige sein, die sich daran erinnert, was du getan hast.\n$@c{angry_mopen}Ich werde versuchen, es nicht zu vergessen!\n$@c{smile_wave_wink}Nur ein Scherz!@d{64} @c{smile}Ich würde es nie vergessen.@d{32}\n$Deine Legende wird in unseren Herzen weiterleben.\n$@c{smile_wave}Wie auch immer,@d{64} es wird spät…@d{96} denke ich?\nEs ist schwer zu sagen an diesem Ort.\n$Lass uns nach Hause gehen. \n$@c{smile_wave_wink}Vielleicht können wir morgen noch einen Kampf haben, der alten Zeiten willen?",
"ending_female": "@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?!\n$@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast.\n$@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl.\n$@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet.\n$@c{smile_ehalf}Du hast auch deinen Traum erfüllt, nicht wahr?\n$Du hast nicht einmal verloren.\n$Ich werde die Einzige sein, die sich daran erinnert, was du getan hast.\n$@c{angry_mopen}Ich werde versuchen, es nicht zu vergessen!\n$@c{smile_wave_wink}Nur ein Scherz!@d{64} @c{smile}Ich würde es nie vergessen.@d{32}\n$Deine Legende wird in unseren Herzen weiterleben.\n$@c{smile_wave}Wie auch immer,@d{64} es wird spät…@d{96} denke ich?\nEs ist schwer zu sagen an diesem Ort.\n$Lass uns nach Hause gehen. \n$@c{smile_wave_wink}Vielleicht können wir morgen noch einen Kampf haben, der alten Zeiten willen?", "ending_female": "@c{smile}Oh? Du hast gewonnen?@d{96} @c{smile_eclosed}Ich schätze, das hätte ich wissen sollen.\n$Aber, du bist jetzt zurück.\n$@c{smile}Es ist vorbei.@d{64} Du hast die Schleife beendet.\n$@c{serious_smile_fists}Du hast auch deinen Traum erfüllt, nicht wahr?\nDu hast nicht einmal verloren.\n$@c{neutral}Ich bin der Einzige, der sich daran erinnern wird, was du getan hast.@d{96}\n$Ich schätze, das ist in Ordnung, oder?\n$@c{serious_smile_fists}Deine Legende wird immer in unseren Herzen weiterleben.\n$@c{smile_eclosed}Wie auch immer, ich habe genug von diesem Ort, oder nicht? Lass uns nach Hause gehen.\n$@c{serious_smile_fists}Vielleicht können wir, wenn wir zurück sind, noch einen Kampf haben?\n$Wenn du dazu bereit bist.",
"ending_endless": "Glückwunsch! Du hast das aktuelle Ende erreicht!\nWir arbeiten an mehr Spielinhalten.", "ending_endless": "Glückwunsch! Du hast das aktuelle Ende erreicht!\nWir arbeiten an mehr Spielinhalten.",
"ending_name": "Entwickler" "ending_name": "Entwickler"
} }

View File

@ -1403,19 +1403,19 @@
"1": "Ich muss dein Potenzial als Trainer und die Stärke der Pokémon sehen, die mit dir kämpfen!", "1": "Ich muss dein Potenzial als Trainer und die Stärke der Pokémon sehen, die mit dir kämpfen!",
"2": "Los geht's! Dies sind meine Gesteins-Pokémon, mein ganzer Stolz!", "2": "Los geht's! Dies sind meine Gesteins-Pokémon, mein ganzer Stolz!",
"3": "Gesteins-Pokémon sind einfach die besten!", "3": "Gesteins-Pokémon sind einfach die besten!",
"4": "Ich muss dein Potenzial als Trainer und die Stärke der Pokémon sehen, die mit dir kämpfen!" "4": "Tag für Tag grabe ich hier nach Fossilien.\n$Die viele Arbeit hat meine Pokémon felsenfest gemacht\nund das wirst du jetzt im Kampf zu spüren bekommen!"
}, },
"victory": { "victory": {
"1": "W-was? Das kann nicht sein! Meine total tranierten Pokémon!", "1": "W-was? Das kann nicht sein! Meine total tranierten Pokémon!",
"2": "…Wir haben die Kontrolle verloren. Beim nächsten Mal fordere ich dich\n$zu einem Fossilien-Ausgrabungswettbewerb heraus.", "2": "…Wir haben die Kontrolle verloren. Beim nächsten Mal fordere ich dich\n$zu einem Fossilien-Ausgrabungswettbewerb heraus.",
"3": "Mit deinem Können ist es nur natürlich, dass du gewinnst.", "3": "Mit deinem Können ist es nur natürlich, dass du gewinnst.",
"4": "W-was?! Das kann nicht sein! Selbst das war nicht genug?", "4": "W-was?! Das kann nicht sein! Selbst das war nicht genug?"
"5": "Ich habe es vermasselt."
}, },
"defeat": { "defeat": {
"1": "Siehst du? Ich bin stolz auf meinen steinigen Kampfstil!", "1": "Siehst du? Ich bin stolz auf meinen steinigen Kampfstil!",
"2": "Danke! Der Kampf hat mir Vertrauen gegeben, dass ich vielleicht meinen Vater besiegen kann!", "2": "Danke! Der Kampf hat mir Vertrauen gegeben, dass ich vielleicht meinen Vater besiegen kann!",
"3": "Ich fühle mich, als hätte ich gerade einen wirklich hartnäckigen Felsen durchbrochen!" "3": "Na, was sagst du jetzt? Meine felsenfesten Pokémon waren hart genug für dich, was?",
"4": "Ich wusste, dass ich gewinnen würde!"
} }
}, },
"morty": { "morty": {

View File

@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "Verdoppelt die Wahrscheinlichkeit, dass die nächsten {{battleCount}} Begegnungen mit wilden Pokémon ein Doppelkampf sind." "description": "Verdoppelt die Wahrscheinlichkeit, dass die nächsten {{battleCount}} Begegnungen mit wilden Pokémon ein Doppelkampf sind."
}, },
"TempBattleStatBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "Erhöht die {{tempBattleStatName}} aller Teammitglieder für 5 Kämpfe um eine Stufe." "description": "Erhöht die {{stat}} aller Teammitglieder für 5 Kämpfe um eine Stufe."
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%." "description": "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%."
@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": { "AllPokemonLevelIncrementModifierType": {
"description": "Erhöht das Level aller Teammitglieder um {{levels}}." "description": "Erhöht das Level aller Teammitglieder um {{levels}}."
}, },
"PokemonBaseStatBoosterModifierType": { "BaseStatBoosterModifierType": {
"description": "Erhöht den {{statName}} Basiswert des Trägers um 10%. Das Stapellimit erhöht sich, je höher dein IS-Wert ist." "description": "Erhöht den {{stat}} Basiswert des Trägers um 10%. Das Stapellimit erhöht sich, je höher dein IS-Wert ist."
}, },
"AllPokemonFullHpRestoreModifierType": { "AllPokemonFullHpRestoreModifierType": {
"description": "Stellt 100% der KP aller Pokémon her." "description": "Stellt 100% der KP aller Pokémon her."
@ -248,6 +248,12 @@
"name": "Scope-Linse", "name": "Scope-Linse",
"description": "Ein Item zum Tragen. Es erhöht die Volltrefferquote." "description": "Ein Item zum Tragen. Es erhöht die Volltrefferquote."
}, },
"DIRE_HIT": {
"name": "X-Volltreffer",
"extra": {
"raises": "Volltrefferquote"
}
},
"LEEK": { "LEEK": {
"name": "Lauchstange", "name": "Lauchstange",
"description": "Ein Item, das von Porenta getragen werden kann. Diese lange Lauchstange erhöht die Volltrefferquote stark." "description": "Ein Item, das von Porenta getragen werden kann. Diese lange Lauchstange erhöht die Volltrefferquote stark."
@ -411,25 +417,13 @@
"description": "Ein Item, das Ditto zum Tragen gegeben werden kann. Fein und doch hart, erhöht dieses sonderbare Pulver die Initiative." "description": "Ein Item, das Ditto zum Tragen gegeben werden kann. Fein und doch hart, erhöht dieses sonderbare Pulver die Initiative."
} }
}, },
"TempBattleStatBoosterItem": { "TempStatStageBoosterItem": {
"x_attack": "X-Angriff", "x_attack": "X-Angriff",
"x_defense": "X-Verteidigung", "x_defense": "X-Verteidigung",
"x_sp_atk": "X-Sp.-Ang.", "x_sp_atk": "X-Sp.-Ang.",
"x_sp_def": "X-Sp.-Vert.", "x_sp_def": "X-Sp.-Vert.",
"x_speed": "X-Tempo", "x_speed": "X-Tempo",
"x_accuracy": "X-Treffer", "x_accuracy": "X-Treffer"
"dire_hit": "X-Volltreffer"
},
"TempBattleStatBoosterStatName": {
"ATK": "Angriff",
"DEF": "Verteidigung",
"SPATK": "Sp. Ang",
"SPDEF": "Sp. Vert",
"SPD": "Initiative",
"ACC": "Genauigkeit",
"CRIT": "Volltrefferquote",
"EVA": "Fluchtwert",
"DEFAULT": "???"
}, },
"AttackTypeBoosterItem": { "AttackTypeBoosterItem": {
"silk_scarf": "Seidenschal", "silk_scarf": "Seidenschal",
@ -604,6 +598,6 @@
"DRAGON_MEMORY": "Drachen-Disc", "DRAGON_MEMORY": "Drachen-Disc",
"DARK_MEMORY": "Unlicht-Disc", "DARK_MEMORY": "Unlicht-Disc",
"FAIRY_MEMORY": "Feen-Disc", "FAIRY_MEMORY": "Feen-Disc",
"BLANK_MEMORY": "Leere-Disc" "NORMAL_MEMORY": "Normal-Disc"
} }
} }

View File

@ -3,7 +3,7 @@
"turnHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!", "turnHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!",
"hitHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!", "hitHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} wurde durch {{typeName}} wiederbelebt!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} wurde durch {{typeName}} wiederbelebt!",
"pokemonResetNegativeStatStageApply": "Die negative Statuswertveränderung von {{pokemonNameWithAffix}} wurde durch {{typeName}} aufgehoben!", "resetNegativeStatStageApply": "Die negative Statuswertveränderung von {{pokemonNameWithAffix}} wurde durch {{typeName}} aufgehoben!",
"moneyInterestApply": "Du erhählst {{moneyAmount}} ₽ durch das Item {{typeName}}!", "moneyInterestApply": "Du erhählst {{moneyAmount}} ₽ durch das Item {{typeName}}!",
"turnHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} absorbiert!", "turnHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} absorbiert!",
"contactHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} geklaut!", "contactHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} geklaut!",

View File

@ -3,6 +3,10 @@
"cutHpPowerUpMove": "{{pokemonName}} nutzt seine KP um seine Attacke zu verstärken!", "cutHpPowerUpMove": "{{pokemonName}} nutzt seine KP um seine Attacke zu verstärken!",
"absorbedElectricity": "{{pokemonName}} absorbiert elektrische Energie!", "absorbedElectricity": "{{pokemonName}} absorbiert elektrische Energie!",
"switchedStatChanges": "{{pokemonName}} tauschte die Statuswerteveränderungen mit dem Ziel!", "switchedStatChanges": "{{pokemonName}} tauschte die Statuswerteveränderungen mit dem Ziel!",
"switchedTwoStatChanges": "{{pokemonName}} tauscht Veränderungen an {{firstStat}} und {{secondStat}} mit dem Ziel!",
"switchedStat": "{{pokemonName}} tauscht seinen {{stat}}-Wert mit dem des Zieles!",
"sharedGuard": "{{pokemonName}} addiert seine Schutzkräfte mit jenen des Zieles und teilt sie gerecht auf!",
"sharedPower": "{{pokemonName}} addiert seine Kräfte mit jenen des Zieles und teilt sie gerecht auf!",
"goingAllOutForAttack": "{{pokemonName}} legt sich ins Zeug!", "goingAllOutForAttack": "{{pokemonName}} legt sich ins Zeug!",
"regainedHealth": "{{pokemonName}} erholt sich!", "regainedHealth": "{{pokemonName}} erholt sich!",
"keptGoingAndCrashed": "{{pokemonName}} springt daneben und verletzt sich!", "keptGoingAndCrashed": "{{pokemonName}} springt daneben und verletzt sich!",
@ -61,5 +65,6 @@
"suppressAbilities": "Die Fähigkeit von {{pokemonName}} wirkt nicht mehr!", "suppressAbilities": "Die Fähigkeit von {{pokemonName}} wirkt nicht mehr!",
"revivalBlessing": "{{pokemonName}} ist wieder fit und kampfbereit!", "revivalBlessing": "{{pokemonName}} ist wieder fit und kampfbereit!",
"swapArenaTags": "{{pokemonName}} hat die Effekte, die auf den beiden Seiten des Kampffeldes wirken, miteinander getauscht!", "swapArenaTags": "{{pokemonName}} hat die Effekte, die auf den beiden Seiten des Kampffeldes wirken, miteinander getauscht!",
"exposedMove": "{{pokemonName}} erkennt {{targetPokemonName}}!" "exposedMove": "{{pokemonName}} erkennt {{targetPokemonName}}!",
} "safeguard": "{{targetName}} wird durch Bodyguard geschützt!"
}

View File

@ -10,5 +10,5 @@
"eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!", "eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!",
"revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!", "revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!",
"formChange": "{{preName}} hat seine Form geändert!", "formChange": "{{preName}} hat seine Form geändert!",
"disguiseChange": "Its disguise served it as a decoy!" "disguiseChange": "Sein Kostüm hat die Attacke absorbiert!"
} }

View File

@ -1,7 +1,6 @@
{ {
"Stat": { "Stat": {
"HP": "KP", "HP": "KP",
"HPStat": "KP",
"HPshortened": "KP", "HPshortened": "KP",
"ATK": "Angriff", "ATK": "Angriff",
"ATKshortened": "Ang", "ATKshortened": "Ang",

View File

@ -12,6 +12,7 @@
"blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", "blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!",
"typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!",
"fullHpResistType": "{{pokemonNameWithAffix}} made its shell gleam!\nIt's distorting type matchups!",
"moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!", "moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!",
"reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!", "reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!",
"postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!", "postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!",

View File

@ -1,268 +0,0 @@
{
"Achievements": {
"name": "Achievements"
},
"Locked": {
"name": "Locked"
},
"MoneyAchv": {
"description": "Accumulate a total of ₽{{moneyAmount}}"
},
"10K_MONEY": {
"name": "Money Haver"
},
"100K_MONEY": {
"name": "Rich"
},
"1M_MONEY": {
"name": "Millionaire"
},
"10M_MONEY": {
"name": "One Percenter"
},
"DamageAchv": {
"description": "Inflict {{damageAmount}} damage in one hit"
},
"250_DMG": {
"name": "Hard Hitter"
},
"1000_DMG": {
"name": "Harder Hitter"
},
"2500_DMG": {
"name": "That's a Lotta Damage!"
},
"10000_DMG": {
"name": "One Punch Man"
},
"HealAchv": {
"description": "Heal {{healAmount}} {{HP}} at once with a move, ability, or held item"
},
"250_HEAL": {
"name": "Novice Healer"
},
"1000_HEAL": {
"name": "Big Healer"
},
"2500_HEAL": {
"name": "Cleric"
},
"10000_HEAL": {
"name": "Recovery Master"
},
"LevelAchv": {
"description": "Level up a Pokémon to Lv{{level}}"
},
"LV_100": {
"name": "But Wait, There's More!"
},
"LV_250": {
"name": "Elite"
},
"LV_1000": {
"name": "To Go Even Further Beyond"
},
"RibbonAchv": {
"description": "Accumulate a total of {{ribbonAmount}} Ribbons"
},
"10_RIBBONS": {
"name": "Pokémon League Champion"
},
"25_RIBBONS": {
"name": "Great League Champion"
},
"50_RIBBONS": {
"name": "Ultra League Champion"
},
"75_RIBBONS": {
"name": "Rogue League Champion"
},
"100_RIBBONS": {
"name": "Master League Champion"
},
"TRANSFER_MAX_BATTLE_STAT": {
"name": "Teamwork",
"description": "Baton pass to another party member with at least one stat maxed out"
},
"MAX_FRIENDSHIP": {
"name": "Friendmaxxing",
"description": "Reach max friendship on a Pokémon"
},
"MEGA_EVOLVE": {
"name": "Megamorph",
"description": "Mega evolve a Pokémon"
},
"GIGANTAMAX": {
"name": "Absolute Unit",
"description": "Gigantamax a Pokémon"
},
"TERASTALLIZE": {
"name": "STAB Enthusiast",
"description": "Terastallize a Pokémon"
},
"STELLAR_TERASTALLIZE": {
"name": "The Hidden Type",
"description": "Stellar Terastallize a Pokémon"
},
"SPLICE": {
"name": "Infinite Fusion",
"description": "Splice two Pokémon together with DNA Splicers"
},
"MINI_BLACK_HOLE": {
"name": "A Hole Lot of Items",
"description": "Acquire a Mini Black Hole"
},
"CATCH_MYTHICAL": {
"name": "Mythical",
"description": "Catch a mythical Pokémon"
},
"CATCH_SUB_LEGENDARY": {
"name": "(Sub-)Legendary",
"description": "Catch a sub-legendary Pokémon"
},
"CATCH_LEGENDARY": {
"name": "Legendary",
"description": "Catch a legendary Pokémon"
},
"SEE_SHINY": {
"name": "Shiny",
"description": "Find a shiny Pokémon in the wild"
},
"SHINY_PARTY": {
"name": "That's Dedication",
"description": "Have a full party of shiny Pokémon"
},
"HATCH_MYTHICAL": {
"name": "Mythical Egg",
"description": "Hatch a mythical Pokémon from an egg"
},
"HATCH_SUB_LEGENDARY": {
"name": "Sub-Legendary Egg",
"description": "Hatch a sub-legendary Pokémon from an egg"
},
"HATCH_LEGENDARY": {
"name": "Legendary Egg",
"description": "Hatch a legendary Pokémon from an egg"
},
"HATCH_SHINY": {
"name": "Shiny Egg",
"description": "Hatch a shiny Pokémon from an egg"
},
"HIDDEN_ABILITY": {
"name": "Hidden Potential",
"description": "Catch a Pokémon with a hidden ability"
},
"PERFECT_IVS": {
"name": "Certificate of Authenticity",
"description": "Get perfect IVs on a Pokémon"
},
"CLASSIC_VICTORY": {
"name": "Undefeated",
"description": "Beat the game in classic mode"
},
"UNEVOLVED_CLASSIC_VICTORY": {
"name": "Bring Your Child To Work Day",
"description": "Beat the game in Classic Mode with at least one unevolved party member."
},
"MONO_GEN_ONE": {
"name": "The Original Rival",
"description": "Complete the generation one only challenge."
},
"MONO_GEN_TWO": {
"name": "Generation 1.5",
"description": "Complete the generation two only challenge."
},
"MONO_GEN_THREE": {
"name": "Too much water?",
"description": "Complete the generation three only challenge."
},
"MONO_GEN_FOUR": {
"name": "Is she really the hardest?",
"description": "Complete the generation four only challenge."
},
"MONO_GEN_FIVE": {
"name": "All Original",
"description": "Complete the generation five only challenge."
},
"MONO_GEN_SIX": {
"name": "Almost Royalty",
"description": "Complete the generation six only challenge."
},
"MONO_GEN_SEVEN": {
"name": "Only Technically",
"description": "Complete the generation seven only challenge."
},
"MONO_GEN_EIGHT": {
"name": "A Champion Time!",
"description": "Complete the generation eight only challenge."
},
"MONO_GEN_NINE": {
"name": "She was going easy on you",
"description": "Complete the generation nine only challenge."
},
"MonoType": {
"description": "Complete the {{type}} monotype challenge."
},
"MONO_NORMAL": {
"name": "Extra Ordinary"
},
"MONO_FIGHTING": {
"name": "I Know Kung Fu"
},
"MONO_FLYING": {
"name": "Angry Birds"
},
"MONO_POISON": {
"name": "Kanto's Favourite"
},
"MONO_GROUND": {
"name": "Forecast: Earthquakes"
},
"MONO_ROCK": {
"name": "Brock Hard"
},
"MONO_BUG": {
"name": "You Like Jazz?"
},
"MONO_GHOST": {
"name": "Who You Gonna Call?"
},
"MONO_STEEL": {
"name": "Iron Giant"
},
"MONO_FIRE": {
"name": "I Cast Fireball!"
},
"MONO_WATER": {
"name": "When It Rains, It Pours"
},
"MONO_GRASS": {
"name": "Can't Touch This"
},
"MONO_ELECTRIC": {
"name": "Aim For The Horn!"
},
"MONO_PSYCHIC": {
"name": "Big Brain Energy"
},
"MONO_ICE": {
"name": "Walking On Thin Ice"
},
"MONO_DRAGON": {
"name": "Pseudo-Legend Club"
},
"MONO_DARK": {
"name": "It's Just A Phase"
},
"MONO_FAIRY": {
"name": "Hey! Listen!"
},
"FRESH_START": {
"name": "First Try!",
"description": "Complete the Fresh Start challenge."
},
"INVERSE_BATTLE": {
"name": "Mirror rorriM",
"description": "Complete the Inverse Battle challenge.\n.egnellahc elttaB esrevnI eht etelpmoC"
}
}

View File

@ -10,19 +10,19 @@
}, },
"10K_MONEY": { "10K_MONEY": {
"name": "Money Haver", "name": "Money Haver",
"name_female": null "name_female": "Money Haver"
}, },
"100K_MONEY": { "100K_MONEY": {
"name": "Rich", "name": "Rich",
"name_female": null "name_female": "Rich"
}, },
"1M_MONEY": { "1M_MONEY": {
"name": "Millionaire", "name": "Millionaire",
"name_female": null "name_female": "Millionaire"
}, },
"10M_MONEY": { "10M_MONEY": {
"name": "One Percenter", "name": "One Percenter",
"name_female": null "name_female": "One Percenter"
}, },
"DamageAchv": { "DamageAchv": {
"description": "Inflict {{damageAmount}} damage in one hit" "description": "Inflict {{damageAmount}} damage in one hit"
@ -32,11 +32,11 @@
}, },
"1000_DMG": { "1000_DMG": {
"name": "Harder Hitter", "name": "Harder Hitter",
"name_female": null "name_female": "Harder Hitter"
}, },
"2500_DMG": { "2500_DMG": {
"name": "That's a Lotta Damage!", "name": "That's a Lotta Damage!",
"name_female": null "name_female": "That's a Lotta Damage!"
}, },
"10000_DMG": { "10000_DMG": {
"name": "One Punch Man", "name": "One Punch Man",
@ -47,19 +47,19 @@
}, },
"250_HEAL": { "250_HEAL": {
"name": "Novice Healer", "name": "Novice Healer",
"name_female": null "name_female": "Novice Healer"
}, },
"1000_HEAL": { "1000_HEAL": {
"name": "Big Healer", "name": "Big Healer",
"name_female": null "name_female": "Big Healer"
}, },
"2500_HEAL": { "2500_HEAL": {
"name": "Cleric", "name": "Cleric",
"name_female": null "name_female": "Cleric"
}, },
"10000_HEAL": { "10000_HEAL": {
"name": "Recovery Master", "name": "Recovery Master",
"name_female": null "name_female": "Recovery Master"
}, },
"LevelAchv": { "LevelAchv": {
"description": "Level up a Pokémon to Lv{{level}}" "description": "Level up a Pokémon to Lv{{level}}"
@ -69,7 +69,7 @@
}, },
"LV_250": { "LV_250": {
"name": "Elite", "name": "Elite",
"name_female": null "name_female": "Elite"
}, },
"LV_1000": { "LV_1000": {
"name": "To Go Even Further Beyond" "name": "To Go Even Further Beyond"
@ -79,27 +79,27 @@
}, },
"10_RIBBONS": { "10_RIBBONS": {
"name": "Pokémon League Champion", "name": "Pokémon League Champion",
"name_female": null "name_female": "Pokémon League Champion"
}, },
"25_RIBBONS": { "25_RIBBONS": {
"name": "Great League Champion", "name": "Great League Champion",
"name_female": null "name_female": "Great League Champion"
}, },
"50_RIBBONS": { "50_RIBBONS": {
"name": "Ultra League Champion", "name": "Ultra League Champion",
"name_female": null "name_female": "Ultra League Champion"
}, },
"75_RIBBONS": { "75_RIBBONS": {
"name": "Rogue League Champion", "name": "Rogue League Champion",
"name_female": null "name_female": "Rogue League Champion"
}, },
"100_RIBBONS": { "100_RIBBONS": {
"name": "Master League Champion", "name": "Master League Champion",
"name_female": null "name_female": "Master League Champion"
}, },
"TRANSFER_MAX_BATTLE_STAT": { "TRANSFER_MAX_STAT_STAGE": {
"name": "Teamwork", "name": "Teamwork",
"description": "Baton pass to another party member with at least one stat maxed out" "description": "Baton pass to another party member with at least one stat stage maxed out"
}, },
"MAX_FRIENDSHIP": { "MAX_FRIENDSHIP": {
"name": "Friendmaxxing", "name": "Friendmaxxing",
@ -147,7 +147,7 @@
}, },
"SHINY_PARTY": { "SHINY_PARTY": {
"name": "That's Dedication", "name": "That's Dedication",
"name_female": null, "name_female": "That's Dedication",
"description": "Have a full party of shiny Pokémon" "description": "Have a full party of shiny Pokémon"
}, },
"HATCH_MYTHICAL": { "HATCH_MYTHICAL": {
@ -176,7 +176,7 @@
}, },
"CLASSIC_VICTORY": { "CLASSIC_VICTORY": {
"name": "Undefeated", "name": "Undefeated",
"name_female": null, "name_female": "Undefeated",
"description": "Beat the game in classic mode" "description": "Beat the game in classic mode"
}, },
"UNEVOLVED_CLASSIC_VICTORY": { "UNEVOLVED_CLASSIC_VICTORY": {
@ -284,4 +284,4 @@
"name": "Mirror rorriM", "name": "Mirror rorriM",
"description": "Complete the Inverse Battle challenge.\n.egnellahc elttaB esrevnI eht etelpmoC" "description": "Complete the Inverse Battle challenge.\n.egnellahc elttaB esrevnI eht etelpmoC"
} }
} }

View File

@ -1,6 +1,7 @@
{ {
"title": "Challenge Modifiers", "title": "Challenge Modifiers",
"illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
"noneSelected": "None Selected",
"singleGeneration": { "singleGeneration": {
"name": "Mono Gen", "name": "Mono Gen",
"desc": "You can only use Pokémon from Generation {{gen}}.", "desc": "You can only use Pokémon from Generation {{gen}}.",

View File

@ -58,7 +58,7 @@
"iris_alder_double": { "iris_alder_double": {
"encounter": { "encounter": {
"1": "Iris: Welcome Challenger! I am THE Unova Champion!\n$Alder: Iris, aren't you a bit too excited?", "1": "Iris: Welcome Challenger! I am THE Unova Champion!\n$Alder: Iris, aren't you a bit too excited?",
"1_female": null "1_female": "Iris: Welcome Challenger! I am THE Unova Champion!\n$Alder: Iris, aren't you a bit too excited?"
}, },
"victory": { "victory": {
"1": "Iris: A loss like this is not easy to take...\n$Alder: But we will only get stronger with every loss!" "1": "Iris: A loss like this is not easy to take...\n$Alder: But we will only get stronger with every loss!"
@ -75,7 +75,7 @@
"marnie_piers_double": { "marnie_piers_double": {
"encounter": { "encounter": {
"1": "Piers: Ready for a concert?\n$Marnie: Brother... They are here to fight, not to sing...", "1": "Piers: Ready for a concert?\n$Marnie: Brother... They are here to fight, not to sing...",
"1_female": null "1_female": "Piers: Ready for a concert?\n$Marnie: Brother... They are here to fight, not to sing..."
}, },
"victory": { "victory": {
"1": "Piers: Now that was a great concert!\n$Marnie: Brother..." "1": "Piers: Now that was a great concert!\n$Marnie: Brother..."

View File

@ -1,6 +1,6 @@
{ {
"encounter": "It appears the time has finally come once again.\nYou know why you have come here, do you not?\n$You were drawn here, because you have been here before.\nCountless times.\n$Though, perhaps it can be counted.\nTo be precise, this is in fact your {{cycleCount}} cycle.\n$Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain.\n$Until now you have yet to succeed, but I sense a different presence in you this time.\n\n$You are the only one here, though it is as if there is… another.\n$Will you finally prove a formidable challenge to me?\nThe challenge I have longed after for millennia?\n$We begin.", "encounter": "It appears the time has finally come once again.\nYou know why you have come here, do you not?\n$You were drawn here, because you have been here before.\nCountless times.\n$Though, perhaps it can be counted.\nTo be precise, this is in fact your {{cycleCount}} cycle.\n$Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain.\n$Until now you have yet to succeed, but I sense a different presence in you this time.\n\n$You are the only one here, though it is as if there is… another.\n$Will you finally prove a formidable challenge to me?\nThe challenge I have longed after for millennia?\n$We begin.",
"encounter_female": null, "encounter_female": "It appears the time has finally come once again.\nYou know why you have come here, do you not?\n$You were drawn here, because you have been here before.\nCountless times.\n$Though, perhaps it can be counted.\nTo be precise, this is in fact your {{cycleCount}} cycle.\n$Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain.\n$Until now you have yet to succeed, but I sense a different presence in you this time.\n\n$You are the only one here, though it is as if there is… another.\n$Will you finally prove a formidable challenge to me?\nThe challenge I have longed after for millennia?\n$We begin.",
"firstStageWin": "I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back.\n$Do not disappoint me.", "firstStageWin": "I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back.\n$Do not disappoint me.",
"secondStageWin": "…Magnificent.", "secondStageWin": "…Magnificent.",
"key_ordinal_one": "st", "key_ordinal_one": "st",

View File

@ -1,6 +1,6 @@
{ {
"ending": "@c{smile}Oh? You won?@d{96} @c{smile_eclosed}I guess I should've known.\nBut, you're back now.\n$@c{smile}It's over.@d{64} You ended the loop.\n$@c{serious_smile_fists}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$@c{neutral}I'm the only one who'll remember what you did.@d{96}\nI guess that's okay, isn't it?\n$@c{serious_smile_fists}Your legend will always live on in our hearts.\n$@c{smile_eclosed}Anyway, I've had about enough of this place, haven't you? Let's head home.\n$@c{serious_smile_fists}Maybe when we get back, we can have another battle?\nIf you're up to it.", "ending": "@c{shock}You're back?@d{32} Does that mean…@d{96} you won?!\n@c{smile_ehalf}I should have known you had it in you.\n$@c{smile_eclosed}Of course… I always had that feeling.\n@c{smile}It's over now, right? You ended the loop.\n$@c{smile_ehalf}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$I'll be the only one to remember what you did.\n@c{angry_mopen}I'll try not to forget!\n$@c{smile_wave_wink}Just kidding!@d{64} @c{smile}I'd never forget.@d{32}\nYour legend will live on in our hearts.\n$@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place.\n$Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?",
"ending_female": "@c{shock}You're back?@d{32} Does that mean…@d{96} you won?!\n@c{smile_ehalf}I should have known you had it in you.\n$@c{smile_eclosed}Of course… I always had that feeling.\n@c{smile}It's over now, right? You ended the loop.\n$@c{smile_ehalf}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$I'll be the only one to remember what you did.\n@c{angry_mopen}I'll try not to forget!\n$@c{smile_wave_wink}Just kidding!@d{64} @c{smile}I'd never forget.@d{32}\nYour legend will live on in our hearts.\n$@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place.\n$Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?", "ending_female": "@c{smile}Oh? You won?@d{96} @c{smile_eclosed}I guess I should've known.\nBut, you're back now.\n$@c{smile}It's over.@d{64} You ended the loop.\n$@c{serious_smile_fists}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$@c{neutral}I'm the only one who'll remember what you did.@d{96}\nI guess that's okay, isn't it?\n$@c{serious_smile_fists}Your legend will always live on in our hearts.\n$@c{smile_eclosed}Anyway, I've had about enough of this place, haven't you? Let's head home.\n$@c{serious_smile_fists}Maybe when we get back, we can have another battle?\nIf you're up to it.",
"ending_endless": "Congratulations on reaching the current end!\nMore content is coming soon.", "ending_endless": "Congratulations on reaching the current end!\nMore content is coming soon.",
"ending_name": "Devs" "ending_name": "Devs"
} }

View File

@ -3,31 +3,31 @@
"encounter": { "encounter": {
"1": "Hey, wanna battle?", "1": "Hey, wanna battle?",
"2": "Are you a new trainer too?", "2": "Are you a new trainer too?",
"2_female": null, "2_female": "Are you a new trainer too?",
"3": "Hey, I haven't seen you before. Let's battle!", "3": "Hey, I haven't seen you before. Let's battle!",
"4": "I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!", "4": "I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!",
"4_female": null, "4_female": "I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!",
"5": "Have we met or not? I don't really remember. Well, I guess it's nice to meet you anyway!", "5": "Have we met or not? I don't really remember. Well, I guess it's nice to meet you anyway!",
"6": "All right! Let's go!", "6": "All right! Let's go!",
"7": "All right! Here I come! I'll show you my power!", "7": "All right! Here I come! I'll show you my power!",
"8": "Haw haw haw... I'll show you how hawesome my Pokémon are!", "8": "Haw haw haw... I'll show you how hawesome my Pokémon are!",
"9": "No need to waste time saying hello. Bring it on whenever you're ready!", "9": "No need to waste time saying hello. Bring it on whenever you're ready!",
"9_female": null, "9_female": "No need to waste time saying hello. Bring it on whenever you're ready!",
"10": "Don't let your guard down, or you may be crying when a kid beats you.", "10": "Don't let your guard down, or you may be crying when a kid beats you.",
"11": "I've raised my Pokémon with great care. You're not allowed to hurt them!", "11": "I've raised my Pokémon with great care. You're not allowed to hurt them!",
"12": "Glad you made it! It won't be an easy job from here.", "12": "Glad you made it! It won't be an easy job from here.",
"12_female": null, "12_female": "Glad you made it! It won't be an easy job from here.",
"13": "The battles continue forever! Welcome to the world with no end!", "13": "The battles continue forever! Welcome to the world with no end!",
"13_female": null "13_female": "The battles continue forever! Welcome to the world with no end!"
}, },
"victory": { "victory": {
"1": "Wow! You're strong!", "1": "Wow! You're strong!",
"1_female": null, "1_female": "Wow! You're strong!",
"2": "I didn't stand a chance, huh?", "2": "I didn't stand a chance, huh?",
"3": "I'll find you again when I'm older and beat you!", "3": "I'll find you again when I'm older and beat you!",
"4": "Ugh. I don't have any more Pokémon.", "4": "Ugh. I don't have any more Pokémon.",
"5": "No way… NO WAY! How could I lose again…", "5": "No way… NO WAY! How could I lose again…",
"5_female": null, "5_female": "No way… NO WAY! How could I lose again…",
"6": "No! I lost!", "6": "No! I lost!",
"7": "Whoa! You are incredible! I'm amazed and surprised!", "7": "Whoa! You are incredible! I'm amazed and surprised!",
"8": "Could it be… How… My Pokémon and I are the strongest, though…", "8": "Could it be… How… My Pokémon and I are the strongest, though…",
@ -42,12 +42,12 @@
"encounter": { "encounter": {
"1": "Let's have a battle, shall we?", "1": "Let's have a battle, shall we?",
"2": "You look like a new trainer. Let's have a battle!", "2": "You look like a new trainer. Let's have a battle!",
"2_female": null, "2_female": "You look like a new trainer. Let's have a battle!",
"3": "I don't recognize you. How about a battle?", "3": "I don't recognize you. How about a battle?",
"4": "Let's have a fun Pokémon battle!", "4": "Let's have a fun Pokémon battle!",
"5": "I'll show you the ropes of how to really use Pokémon!", "5": "I'll show you the ropes of how to really use Pokémon!",
"6": "A serious battle starts from a serious beginning! Are you sure you're ready?", "6": "A serious battle starts from a serious beginning! Are you sure you're ready?",
"6_female": null, "6_female": "A serious battle starts from a serious beginning! Are you sure you're ready?",
"7": "You're only young once. And you only get one shot at a given battle. Soon, you'll be nothing but a memory.", "7": "You're only young once. And you only get one shot at a given battle. Soon, you'll be nothing but a memory.",
"8": "You'd better go easy on me, OK? Though I'll be seriously fighting!", "8": "You'd better go easy on me, OK? Though I'll be seriously fighting!",
"9": "School is boring. I've got nothing to do. Yawn. I'm only battling to kill the time." "9": "School is boring. I've got nothing to do. Yawn. I'm only battling to kill the time."
@ -55,15 +55,15 @@
"victory": { "victory": {
"1": "That was impressive! I've got a lot to learn.", "1": "That was impressive! I've got a lot to learn.",
"2": "I didn't think you'd beat me that bad…", "2": "I didn't think you'd beat me that bad…",
"2_female": null, "2_female": "I didn't think you'd beat me that bad…",
"3": "I hope we get to have a rematch some day.", "3": "I hope we get to have a rematch some day.",
"4": "That was pretty amazingly fun! You've totally exhausted me…", "4": "That was pretty amazingly fun! You've totally exhausted me…",
"5": "You actually taught me a lesson! You're pretty amazing!", "5": "You actually taught me a lesson! You're pretty amazing!",
"6": "Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.", "6": "Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.",
"6_female": null, "6_female": "Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.",
"7": "I don't need memories like this. Deleting memory…", "7": "I don't need memories like this. Deleting memory…",
"8": "Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.", "8": "Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.",
"8_female": null, "8_female": "Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.",
"9": "I'm actually getting tired of battling… There's gotta be something new to do…" "9": "I'm actually getting tired of battling… There's gotta be something new to do…"
} }
}, },
@ -154,7 +154,7 @@
"ace_trainer": { "ace_trainer": {
"encounter": { "encounter": {
"1": "You seem quite confident.", "1": "You seem quite confident.",
"1_female": null, "1_female": "You seem quite confident.",
"2": "Your Pokémon… Show them to me…", "2": "Your Pokémon… Show them to me…",
"3": "Because I'm an Ace Trainer, people think I'm strong.", "3": "Because I'm an Ace Trainer, people think I'm strong.",
"4": "Are you aware of what it takes to be an Ace Trainer?" "4": "Are you aware of what it takes to be an Ace Trainer?"
@ -163,9 +163,9 @@
"1": "Yes… You have good Pokémon…", "1": "Yes… You have good Pokémon…",
"2": "What?! But I'm a battling genius!", "2": "What?! But I'm a battling genius!",
"3": "Of course, you are the main character!", "3": "Of course, you are the main character!",
"3_female": null, "3_female": "Of course, you are the main character!",
"4": "OK! OK! You could be an Ace Trainer!", "4": "OK! OK! You could be an Ace Trainer!",
"4_female": null "4_female": "OK! OK! You could be an Ace Trainer!"
}, },
"defeat": { "defeat": {
"1": "I am devoting my body and soul to Pokémon battles!", "1": "I am devoting my body and soul to Pokémon battles!",
@ -187,7 +187,7 @@
"1": "Get ready, because when we team up, it's double the trouble!", "1": "Get ready, because when we team up, it's double the trouble!",
"2": "Two hearts, one strategy let's see if you can keep up with our twin power!", "2": "Two hearts, one strategy let's see if you can keep up with our twin power!",
"3": "Hope you're ready for double trouble, because we're about to bring the heat!", "3": "Hope you're ready for double trouble, because we're about to bring the heat!",
"3_female": null "3_female": "Hope you're ready for double trouble, because we're about to bring the heat!"
}, },
"victory": { "victory": {
"1": "We may have lost this round, but our bond remains unbreakable!", "1": "We may have lost this round, but our bond remains unbreakable!",
@ -216,7 +216,7 @@
"encounter": { "encounter": {
"1": "I praise your courage in challenging me! For I am the one with the strongest kick!", "1": "I praise your courage in challenging me! For I am the one with the strongest kick!",
"2": "Oh, I see. Would you like to be cut to pieces? Or do you prefer the role of punching bag?", "2": "Oh, I see. Would you like to be cut to pieces? Or do you prefer the role of punching bag?",
"2_female": null "2_female": "Oh, I see. Would you like to be cut to pieces? Or do you prefer the role of punching bag?"
}, },
"victory": { "victory": {
"1": "Oh. The Pokémon did the fighting. My strong kick didn't help a bit.", "1": "Oh. The Pokémon did the fighting. My strong kick didn't help a bit.",
@ -328,7 +328,7 @@
"defeat": { "defeat": {
"1": "New age simply refers to twentieth century classical composers, right?", "1": "New age simply refers to twentieth century classical composers, right?",
"2": "Don't get hung up on sadness or frustration. You can use your grudges to motivate yourself.", "2": "Don't get hung up on sadness or frustration. You can use your grudges to motivate yourself.",
"2_female": null "2_female": "Don't get hung up on sadness or frustration. You can use your grudges to motivate yourself."
} }
}, },
"psychic": { "psychic": {
@ -360,7 +360,7 @@
"baker": { "baker": {
"encounter": { "encounter": {
"1": "Hope you're ready to taste defeat!", "1": "Hope you're ready to taste defeat!",
"1_female": null "1_female": "Hope you're ready to taste defeat!"
}, },
"victory": { "victory": {
"1": "I'll bake a comeback." "1": "I'll bake a comeback."
@ -391,7 +391,7 @@
"1": "Matey, you're walking the plank if you lose!", "1": "Matey, you're walking the plank if you lose!",
"2": "Come on then! My sailor's pride is at stake!", "2": "Come on then! My sailor's pride is at stake!",
"3": "Ahoy there! Are you seasick?", "3": "Ahoy there! Are you seasick?",
"3_female": null "3_female": "Ahoy there! Are you seasick?"
}, },
"victory": { "victory": {
"1": "Argh! Beaten by a kid!", "1": "Argh! Beaten by a kid!",
@ -419,7 +419,7 @@
}, },
"victory": { "victory": {
"1": "Tch, you really are strong. It's too bad.\n$If you were to join Team Rocket, you could become an Executive.", "1": "Tch, you really are strong. It's too bad.\n$If you were to join Team Rocket, you could become an Executive.",
"1_female": null, "1_female": "Tch, you really are strong. It's too bad.\n$If you were to join Team Rocket, you could become an Executive.",
"2": "I... I'm shattered...", "2": "I... I'm shattered...",
"3": "Aaaieeeee! This can't be happening! I fought hard, but I still lost…" "3": "Aaaieeeee! This can't be happening! I fought hard, but I still lost…"
} }
@ -458,7 +458,7 @@
"1": "Hehehe! You might have beaten me, but you don't stand a chance against the boss!\n$If you get lost now, you won't have to face a sound whipping!", "1": "Hehehe! You might have beaten me, but you don't stand a chance against the boss!\n$If you get lost now, you won't have to face a sound whipping!",
"2": "Hehehe... So, I lost, too...", "2": "Hehehe... So, I lost, too...",
"3": "Ahya! How could this be? For an Admin like me to lose to some random trainer...", "3": "Ahya! How could this be? For an Admin like me to lose to some random trainer...",
"3_female": null "3_female": "Ahya! How could this be? For an Admin like me to lose to some random trainer..."
} }
}, },
"courtney": { "courtney": {
@ -478,13 +478,13 @@
"1": "Ahahahaha! You're going to meddle in Team Aqua's affairs?\n$You're either absolutely fearless, simply ignorant, or both!\n$You're so cute, you're disgusting! I'll put you down", "1": "Ahahahaha! You're going to meddle in Team Aqua's affairs?\n$You're either absolutely fearless, simply ignorant, or both!\n$You're so cute, you're disgusting! I'll put you down",
"2": "What's this? Who's this spoiled brat?", "2": "What's this? Who's this spoiled brat?",
"3": "Cool your jets. Be patient. I'll crush you shortly.", "3": "Cool your jets. Be patient. I'll crush you shortly.",
"3_female": null "3_female": "Cool your jets. Be patient. I'll crush you shortly."
}, },
"victory": { "victory": {
"1": "Ahahahaha! We got meddled with unexpectedly! We're out of options.\n$We'll have to pull out. But this isn't the last you'll see of Team Aqua!\n$We have other plans! Don't you forget it!", "1": "Ahahahaha! We got meddled with unexpectedly! We're out of options.\n$We'll have to pull out. But this isn't the last you'll see of Team Aqua!\n$We have other plans! Don't you forget it!",
"2": "Ahhh?! Did I go too easy on you?!", "2": "Ahhh?! Did I go too easy on you?!",
"3": "Uh. Are you telling me you've upped your game even more during the fight?\n$You're a brat with a bright future… My Pokémon and I don't have any strength left to fight…\n$Go on… Go and be destroyed by Archie.", "3": "Uh. Are you telling me you've upped your game even more during the fight?\n$You're a brat with a bright future… My Pokémon and I don't have any strength left to fight…\n$Go on… Go and be destroyed by Archie.",
"3_female": null "3_female": "Uh. Are you telling me you've upped your game even more during the fight?\n$You're a brat with a bright future… My Pokémon and I don't have any strength left to fight…\n$Go on… Go and be destroyed by Archie."
} }
}, },
"matt": { "matt": {
@ -497,7 +497,7 @@
"1": "Muwuhahaha! That battle was fun even though I lost!", "1": "Muwuhahaha! That battle was fun even though I lost!",
"2": "I can feel it! I can feel it, all right! The strength coming offa you!\n$More! I still want more! But looks like we're outta time...", "2": "I can feel it! I can feel it, all right! The strength coming offa you!\n$More! I still want more! But looks like we're outta time...",
"3": "Oho! That's a loss I can be proud of!", "3": "Oho! That's a loss I can be proud of!",
"3_female": null "3_female": "Oho! That's a loss I can be proud of!"
} }
}, },
"mars": { "mars": {
@ -505,7 +505,7 @@
"1": "I'm Mars, one of Team Galactic's top Commanders.", "1": "I'm Mars, one of Team Galactic's top Commanders.",
"2": "Team Galactic's vision for the future is unwavering. Opposition will be crushed without mercy!", "2": "Team Galactic's vision for the future is unwavering. Opposition will be crushed without mercy!",
"3": "Feeling nervous? You should be!", "3": "Feeling nervous? You should be!",
"3_female": null "3_female": "Feeling nervous? You should be!"
}, },
"victory": { "victory": {
"1": "This can't be happening! How did I lose?!", "1": "This can't be happening! How did I lose?!",
@ -540,25 +540,25 @@
"zinzolin": { "zinzolin": {
"encounter": { "encounter": {
"1": "You could become a threat to Team Plasma, so we will eliminate you here and now!", "1": "You could become a threat to Team Plasma, so we will eliminate you here and now!",
"1_female": null, "1_female": "You could become a threat to Team Plasma, so we will eliminate you here and now!",
"2": "You don't have the sense to know when to quit, it seems. It's an act of mercy on my part to bring an end to this now!", "2": "You don't have the sense to know when to quit, it seems. It's an act of mercy on my part to bring an end to this now!",
"3": "You're an impressive Trainer to have made it this far. But it ends here.", "3": "You're an impressive Trainer to have made it this far. But it ends here.",
"3_female": null "3_female": "You're an impressive Trainer to have made it this far. But it ends here."
}, },
"victory": { "victory": {
"1": "Ghetsis... I have failed you...", "1": "Ghetsis... I have failed you...",
"2": "It's bitter cold. I'm shivering. I'm suffering. Yet, we will stand victorious.", "2": "It's bitter cold. I'm shivering. I'm suffering. Yet, we will stand victorious.",
"3": "Hmph. You're a smarter Trainer than I expected, but not smart enough.", "3": "Hmph. You're a smarter Trainer than I expected, but not smart enough.",
"3_female": null "3_female": "Hmph. You're a smarter Trainer than I expected, but not smart enough."
} }
}, },
"rood": { "rood": {
"encounter": { "encounter": {
"1": "You are a threat to Team Plasma. We cannot let you walk away from here and now!", "1": "You are a threat to Team Plasma. We cannot let you walk away from here and now!",
"1_female": null, "1_female": "You are a threat to Team Plasma. We cannot let you walk away from here and now!",
"2": "It seems you don't know when to give up. I'll make sure no one interferes with our plans!", "2": "It seems you don't know when to give up. I'll make sure no one interferes with our plans!",
"3": "You are a remarkable Trainer to have made it this far. But this is where it ends.", "3": "You are a remarkable Trainer to have made it this far. But this is where it ends.",
"3_female": null "3_female": "You are a remarkable Trainer to have made it this far. But this is where it ends."
}, },
"victory": { "victory": {
"1": "Ghetsis... I have failed my mission...", "1": "Ghetsis... I have failed my mission...",
@ -569,15 +569,15 @@
"xerosic": { "xerosic": {
"encounter": { "encounter": {
"1": "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", "1": "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
"1_female": null, "1_female": "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
"2": "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", "2": "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
"2_female": null, "2_female": "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
"3": "I've been waiting for you! I need to do a little research on you! Come, let us begin!" "3": "I've been waiting for you! I need to do a little research on you! Come, let us begin!"
}, },
"victory": { "victory": {
"1": "Ah, you're quite strong. Oh yes—very strong, indeed.", "1": "Ah, you're quite strong. Oh yes—very strong, indeed.",
"2": "Ding-ding-ding! You did it! To the victor go the spoils!", "2": "Ding-ding-ding! You did it! To the victor go the spoils!",
"2_female": null, "2_female": "Ding-ding-ding! You did it! To the victor go the spoils!",
"3": "Wonderful! Amazing! You have tremendous skill and bravery!" "3": "Wonderful! Amazing! You have tremendous skill and bravery!"
} }
}, },
@ -585,7 +585,7 @@
"encounter": { "encounter": {
"1": "I am Bryony, and it would be my pleasure to battle you. Show me what you've got.", "1": "I am Bryony, and it would be my pleasure to battle you. Show me what you've got.",
"2": "Impressive... You're more powerful than you appear. Let's see the true extent of your energy.", "2": "Impressive... You're more powerful than you appear. Let's see the true extent of your energy.",
"2_female": null, "2_female": "Impressive... You're more powerful than you appear. Let's see the true extent of your energy.",
"3": "I've anticipated your arrival. It's time for a little test. Shall we begin?" "3": "I've anticipated your arrival. It's time for a little test. Shall we begin?"
}, },
"victory": { "victory": {
@ -598,11 +598,11 @@
"encounter": { "encounter": {
"1": "Prepare for trouble!", "1": "Prepare for trouble!",
"2": "We're pulling a big job here! Get lost, kid!", "2": "We're pulling a big job here! Get lost, kid!",
"2_female": null, "2_female": "We're pulling a big job here! Get lost, kid!",
"3": "Hand over your Pokémon, or face the wrath of Team Rocket!", "3": "Hand over your Pokémon, or face the wrath of Team Rocket!",
"4": "You're about to experience the true terror of Team Rocket!", "4": "You're about to experience the true terror of Team Rocket!",
"5": "Hey, kid! Me am a Team Rocket member kind of guy!", "5": "Hey, kid! Me am a Team Rocket member kind of guy!",
"5_female": null "5_female": "Hey, kid! Me am a Team Rocket member kind of guy!"
}, },
"victory": { "victory": {
"1": "Team Rocket blasting off again!", "1": "Team Rocket blasting off again!",
@ -624,7 +624,7 @@
"1": "Huh? I lost?!", "1": "Huh? I lost?!",
"2": "I can't believe I lost! I even skipped lunch for this", "2": "I can't believe I lost! I even skipped lunch for this",
"3": "No way! You're just a kid!", "3": "No way! You're just a kid!",
"3_female": null, "3_female": "No way! You're just a kid!",
"4": "Urrrgh... I should've ducked into our hideout right away...", "4": "Urrrgh... I should've ducked into our hideout right away...",
"5": "You beat me... Do you think the boss will dock my pay for this?" "5": "You beat me... Do you think the boss will dock my pay for this?"
} }
@ -652,7 +652,7 @@
"3": "In the name of Team Galactic, I'll eliminate anyone who stands in our way!", "3": "In the name of Team Galactic, I'll eliminate anyone who stands in our way!",
"4": "Get ready to lose!", "4": "Get ready to lose!",
"5": "Hope you're ready for a cosmic beatdown!", "5": "Hope you're ready for a cosmic beatdown!",
"5_female": null "5_female": "Hope you're ready for a cosmic beatdown!"
}, },
"victory": { "victory": {
"1": "Shut down...", "1": "Shut down...",
@ -682,7 +682,7 @@
"encounter": { "encounter": {
"1": "Your Pokémon are no match for the elegance of Team Flare.", "1": "Your Pokémon are no match for the elegance of Team Flare.",
"2": "Hope you brought your sunglasses, because things are about to get bright!", "2": "Hope you brought your sunglasses, because things are about to get bright!",
"2_female": null, "2_female": "Hope you brought your sunglasses, because things are about to get bright!",
"3": "Team Flare will cleanse the world of imperfection!", "3": "Team Flare will cleanse the world of imperfection!",
"4": "Prepare to face the brilliance of Team Flare!", "4": "Prepare to face the brilliance of Team Flare!",
"5": "Fashion is most important to us!" "5": "Fashion is most important to us!"
@ -699,6 +699,7 @@
"encounter": { "encounter": {
"1": "I'll fight you with all I have to wipe you out!", "1": "I'll fight you with all I have to wipe you out!",
"2": "I don't care if you're a kid or what. I'll send you flying if you threaten us!", "2": "I don't care if you're a kid or what. I'll send you flying if you threaten us!",
"2_female": "I don't care if you're a kid or what. I'll send you flying if you threaten us!",
"3": "I was told to turn away Trainers, whomever they might be!", "3": "I was told to turn away Trainers, whomever they might be!",
"4": "I'll show you the power of Aether Paradise!", "4": "I'll show you the power of Aether Paradise!",
"5": "Now that you've learned of the darkness at the heart of Aether Paradise, we'll need you to conveniently disappear!" "5": "Now that you've learned of the darkness at the heart of Aether Paradise, we'll need you to conveniently disappear!"
@ -715,11 +716,13 @@
"encounter": { "encounter": {
"1": "I, Branch Chief Faba, shall show you the harshness of the real world!", "1": "I, Branch Chief Faba, shall show you the harshness of the real world!",
"2": "The man who is called Aether Paradise's last line of defense is to battle a mere child?", "2": "The man who is called Aether Paradise's last line of defense is to battle a mere child?",
"2_female": "The man who is called Aether Paradise's last line of defense is to battle a mere child?",
"3": "I, Faba, am the Aether Branch Chief. The only one in the world, I'm irreplaceable." "3": "I, Faba, am the Aether Branch Chief. The only one in the world, I'm irreplaceable."
}, },
"victory": { "victory": {
"1": "Aiyee!", "1": "Aiyee!",
"2": "H-h-how can this be?! How could this child...", "2": "H-h-how can this be?! How could this child...",
"2_female": "H-h-how can this be?! How could this child...",
"3": "This is why... This is why I can't bring myself to like children." "3": "This is why... This is why I can't bring myself to like children."
} }
}, },
@ -727,9 +730,12 @@
"encounter": { "encounter": {
"1": "We're not bad-we're just hard!", "1": "We're not bad-we're just hard!",
"2": "You want some? That's how we say hello! Nice knowing you, punks!", "2": "You want some? That's how we say hello! Nice knowing you, punks!",
"2_female": "You want some? That's how we say hello! Nice knowing you, punks!",
"3": "We're just a bunch of guys and gals with a great interest in other people's Pokémon!", "3": "We're just a bunch of guys and gals with a great interest in other people's Pokémon!",
"4": "Why you trying to act hard when we're already hard as bones out here, homie?", "4": "Why you trying to act hard when we're already hard as bones out here, homie?",
"5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!" "4_female": "Why you trying to act hard when we're already hard as bones out here, homie?",
"5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!",
"5_female": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!"
}, },
"victory": { "victory": {
"1": "Huh? Is it over already?", "1": "Huh? Is it over already?",
@ -742,11 +748,13 @@
"plumeria": { "plumeria": {
"encounter": { "encounter": {
"1": " ...Hmph. You don't look like anything special to me.", "1": " ...Hmph. You don't look like anything special to me.",
"2": "It takes these dumb Grunts way too long to deal with you kids..", "1_female": " ...Hmph. You don't look like anything special to me.",
"2": "It takes these dumb Grunts way too long to deal with you kids...",
"3": "Mess with anyone in Team Skull, and I'll show you how serious I can get." "3": "Mess with anyone in Team Skull, and I'll show you how serious I can get."
}, },
"victory": { "victory": {
"1": "Hmmph! You're pretty strong. I'll give you that.", "1": "Hmmph! You're pretty strong. I'll give you that.",
"1_female": "Hmmph! You're pretty strong. I'll give you that.",
"2": "Hmmph. Guess you are pretty tough. Now I understand why my Grunts waste so much time battling kids.", "2": "Hmmph. Guess you are pretty tough. Now I understand why my Grunts waste so much time battling kids.",
"3": "Hmmph! I guess I just have to hold that loss." "3": "Hmmph! I guess I just have to hold that loss."
} }
@ -755,6 +763,7 @@
"encounter": { "encounter": {
"1": "It looks like this is the end of the line for you!", "1": "It looks like this is the end of the line for you!",
"2": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.", "2": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
"2_female": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
"3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?" "3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?"
}, },
"victory": { "victory": {
@ -772,6 +781,7 @@
"victory": { "victory": {
"1": "*sigh* I wasn't able to win... Oleana...you really are a hopeless woman.", "1": "*sigh* I wasn't able to win... Oleana...you really are a hopeless woman.",
"2": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..", "2": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..",
"2_female": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..",
"3": "*sigh* I am one tired Oleana..." "3": "*sigh* I am one tired Oleana..."
} }
}, },
@ -784,7 +794,7 @@
}, },
"defeat": { "defeat": {
"1": "Mark my words. Not being able to measure your own strength shows that you are still a child.", "1": "Mark my words. Not being able to measure your own strength shows that you are still a child.",
"1_female": null "1_female": "Mark my words. Not being able to measure your own strength shows that you are still a child."
} }
}, },
"rocket_boss_giovanni_2": { "rocket_boss_giovanni_2": {
@ -845,7 +855,7 @@
"galactic_boss_cyrus_1": { "galactic_boss_cyrus_1": {
"encounter": { "encounter": {
"1": "You were compelled to come here by such vacuous sentimentality.\n$I will make you regret paying heed to your heart!", "1": "You were compelled to come here by such vacuous sentimentality.\n$I will make you regret paying heed to your heart!",
"1_female": null "1_female": "You were compelled to come here by such vacuous sentimentality.\n$I will make you regret paying heed to your heart!"
}, },
"victory": { "victory": {
"1": "Interesting. And quite curious." "1": "Interesting. And quite curious."
@ -995,7 +1005,7 @@
"misty": { "misty": {
"encounter": { "encounter": {
"1": "My policy is an all out offensive with Water-type Pokémon!", "1": "My policy is an all out offensive with Water-type Pokémon!",
"1_female": null, "1_female": "My policy is an all out offensive with Water-type Pokémon!",
"2": "Hiya, I'll show you the strength of my aquatic Pokémon!", "2": "Hiya, I'll show you the strength of my aquatic Pokémon!",
"3": "My dream was to go on a journey and battle powerful trainers…\nWill you be a sufficient challenge?" "3": "My dream was to go on a journey and battle powerful trainers…\nWill you be a sufficient challenge?"
}, },
@ -1013,14 +1023,14 @@
"lt_surge": { "lt_surge": {
"encounter": { "encounter": {
"1": "My Electric Pokémon saved me during the war! I'll show you how!", "1": "My Electric Pokémon saved me during the war! I'll show you how!",
"1_female": null, "1_female": "My Electric Pokémon saved me during the war! I'll show you how!",
"2": "Ten-hut! I'll shock you into surrender!", "2": "Ten-hut! I'll shock you into surrender!",
"3": "I'll zap you just like I do to all my enemies in battle!" "3": "I'll zap you just like I do to all my enemies in battle!"
}, },
"victory": { "victory": {
"1": "Whoa! Your team's the real deal, kid!", "1": "Whoa! Your team's the real deal, kid!",
"2": "Aaargh, you're strong! Even my electric tricks lost against you.", "2": "Aaargh, you're strong! Even my electric tricks lost against you.",
"2_female": null, "2_female": "Aaargh, you're strong! Even my electric tricks lost against you.",
"3": "That was an absolutely shocking loss!" "3": "That was an absolutely shocking loss!"
}, },
"defeat": { "defeat": {
@ -1045,7 +1055,7 @@
"defeat": { "defeat": {
"1": "I was afraid I would doze off…", "1": "I was afraid I would doze off…",
"2": "Oh my, it seems my Grass Pokémon overwhelmed you.", "2": "Oh my, it seems my Grass Pokémon overwhelmed you.",
"2_female": null, "2_female": "Oh my, it seems my Grass Pokémon overwhelmed you.",
"3": "That battle was such a soothing experience.", "3": "That battle was such a soothing experience.",
"4": "Oh… Is that all?" "4": "Oh… Is that all?"
} }
@ -1106,7 +1116,7 @@
"1": "I, the leader of Team Rocket, will make you feel a world of pain!", "1": "I, the leader of Team Rocket, will make you feel a world of pain!",
"2": "My training here will be vital before I am to face my old associates again.", "2": "My training here will be vital before I am to face my old associates again.",
"3": "I do not think you are prepared for the level of failure you are about to experience!", "3": "I do not think you are prepared for the level of failure you are about to experience!",
"3_female": null "3_female": "I do not think you are prepared for the level of failure you are about to experience!"
}, },
"victory": { "victory": {
"1": "WHAT! Me, lose?! There is nothing I wish to say to you!", "1": "WHAT! Me, lose?! There is nothing I wish to say to you!",
@ -1139,7 +1149,7 @@
"brawly": { "brawly": {
"encounter": { "encounter": {
"1": "Oh man, a challenger!\nLet's see what you can do!", "1": "Oh man, a challenger!\nLet's see what you can do!",
"1_female": null, "1_female": "Oh man, a challenger!\nLet's see what you can do!",
"2": "You seem like a big splash.\nLet's battle!", "2": "You seem like a big splash.\nLet's battle!",
"3": "Time to create a storm!\nLet's go!" "3": "Time to create a storm!\nLet's go!"
}, },
@ -1167,7 +1177,7 @@
}, },
"defeat": { "defeat": {
"1": "Recharge your batteries and challenge me again sometime!\nWahahahaha!", "1": "Recharge your batteries and challenge me again sometime!\nWahahahaha!",
"1_female": null, "1_female": "Recharge your batteries and challenge me again sometime!\nWahahahaha!",
"2": "I hope you found our battle electrifying!\nWahahahaha!", "2": "I hope you found our battle electrifying!\nWahahahaha!",
"3": "Aren't you shocked I won?\nWahahahaha!" "3": "Aren't you shocked I won?\nWahahahaha!"
} }
@ -1214,7 +1224,7 @@
}, },
"victory": { "victory": {
"1": "You're the first Trainer I've seen with more grace than I.\nExcellently played.", "1": "You're the first Trainer I've seen with more grace than I.\nExcellently played.",
"1_female": null, "1_female": "You're the first Trainer I've seen with more grace than I.\nExcellently played.",
"2": "Oh, my Flying Pokémon have plummeted!\nVery well.", "2": "Oh, my Flying Pokémon have plummeted!\nVery well.",
"3": "Though I may have fallen, my Pokémon will continue to fly!" "3": "Though I may have fallen, my Pokémon will continue to fly!"
}, },
@ -1227,7 +1237,7 @@
"tate": { "tate": {
"encounter": { "encounter": {
"1": "Hehehe…\nWere you surprised to see me without my sister?", "1": "Hehehe…\nWere you surprised to see me without my sister?",
"1_female": null, "1_female": "Hehehe…\nWere you surprised to see me without my sister?",
"2": "I can see what you're thinking…\nYou want to battle!", "2": "I can see what you're thinking…\nYou want to battle!",
"3": "How can you defeat someone…\nWho knows your every move?" "3": "How can you defeat someone…\nWho knows your every move?"
}, },
@ -1245,7 +1255,7 @@
"liza": { "liza": {
"encounter": { "encounter": {
"1": "Fufufu…\nWere you surprised to see me without my brother?", "1": "Fufufu…\nWere you surprised to see me without my brother?",
"1_female": null, "1_female": "Fufufu…\nWere you surprised to see me without my brother?",
"2": "I can determine what you desire…\nYou want to battle, don't you?", "2": "I can determine what you desire…\nYou want to battle, don't you?",
"3": "How can you defeat someone…\nWho's one with their Pokémon?" "3": "How can you defeat someone…\nWho's one with their Pokémon?"
}, },
@ -1317,10 +1327,10 @@
"nessa": { "nessa": {
"encounter": { "encounter": {
"1": "No matter what kind of plan your refined mind may be plotting, my partner and I will be sure to sink it.", "1": "No matter what kind of plan your refined mind may be plotting, my partner and I will be sure to sink it.",
"1_female": null, "1_female": "No matter what kind of plan your refined mind may be plotting, my partner and I will be sure to sink it.",
"2": "I'm not here to chat. I'm here to win!", "2": "I'm not here to chat. I'm here to win!",
"3": "This is a little gift from my Pokémon… I hope you can take it!", "3": "This is a little gift from my Pokémon… I hope you can take it!",
"3_female": null "3_female": "This is a little gift from my Pokémon… I hope you can take it!"
}, },
"victory": { "victory": {
"1": "You and your Pokémon are just too much…", "1": "You and your Pokémon are just too much…",
@ -1341,7 +1351,7 @@
}, },
"victory": { "victory": {
"1": "You… You're pretty good, huh?", "1": "You… You're pretty good, huh?",
"1_female": null, "1_female": "You… You're pretty good, huh?",
"2": "If you find Gordie around, be sure to give him a right trashing, would you?", "2": "If you find Gordie around, be sure to give him a right trashing, would you?",
"3": "I think you took breaking the ice a little too literally…" "3": "I think you took breaking the ice a little too literally…"
}, },
@ -1355,12 +1365,12 @@
"encounter": { "encounter": {
"1": "You look strong! Shoots! Let's start!", "1": "You look strong! Shoots! Let's start!",
"2": "I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.", "2": "I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.",
"2_female": null, "2_female": "I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.",
"3": "Oh ho, so I'm facing you! That's off the wall." "3": "Oh ho, so I'm facing you! That's off the wall."
}, },
"victory": { "victory": {
"1": "You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!", "1": "You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!",
"1_female": null, "1_female": "You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!",
"2": "You don't just look strong, you're strong fo' reals! Eh, I was swept away, too!", "2": "You don't just look strong, you're strong fo' reals! Eh, I was swept away, too!",
"3": "You're strong as a gnarly wave!" "3": "You're strong as a gnarly wave!"
}, },
@ -1373,7 +1383,7 @@
"shauntal": { "shauntal": {
"encounter": { "encounter": {
"1": "Excuse me. You're a challenger, right?\nI'm the Elite Four's Ghost-type Pokémon user, Shauntal, and I shall be your opponent.", "1": "Excuse me. You're a challenger, right?\nI'm the Elite Four's Ghost-type Pokémon user, Shauntal, and I shall be your opponent.",
"1_female": null, "1_female": "Excuse me. You're a challenger, right?\nI'm the Elite Four's Ghost-type Pokémon user, Shauntal, and I shall be your opponent.",
"2": "I absolutely love writing about Trainers who come here and the Pokémon they train.\nCould I use you and your Pokémon as a subject?", "2": "I absolutely love writing about Trainers who come here and the Pokémon they train.\nCould I use you and your Pokémon as a subject?",
"3": "Every person who works with Pokémon has a story to tell.\nWhat story is about to be told?" "3": "Every person who works with Pokémon has a story to tell.\nWhat story is about to be told?"
}, },
@ -1391,7 +1401,7 @@
"marshal": { "marshal": {
"encounter": { "encounter": {
"1": "My mentor, Alder, sees your potential as a Trainer and is taking an interest in you.\nIt is my intention to test you--to take you to the limits of your strength. Kiai!", "1": "My mentor, Alder, sees your potential as a Trainer and is taking an interest in you.\nIt is my intention to test you--to take you to the limits of your strength. Kiai!",
"1_female": null, "1_female": "My mentor, Alder, sees your potential as a Trainer and is taking an interest in you.\nIt is my intention to test you--to take you to the limits of your strength. Kiai!",
"2": "Victory, decisive victory, is my intention! Challenger, here I come!", "2": "Victory, decisive victory, is my intention! Challenger, here I come!",
"3": "In myself, I seek to develop the strength of a fighter and shatter any weakness in myself!\nPrevailing with the force of my convictions!" "3": "In myself, I seek to develop the strength of a fighter and shatter any weakness in myself!\nPrevailing with the force of my convictions!"
}, },
@ -1411,7 +1421,7 @@
"1": "You remind me of an old friend. That makes me excited about this Pokémon battle!", "1": "You remind me of an old friend. That makes me excited about this Pokémon battle!",
"2": "Pokémon battles have no meaning if you don't think why you battle.\n$Or better said, it makes battling together with Pokémon meaningless.", "2": "Pokémon battles have no meaning if you don't think why you battle.\n$Or better said, it makes battling together with Pokémon meaningless.",
"3": "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you.", "3": "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you.",
"3_female": null "3_female": "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you."
}, },
"victory": { "victory": {
"1": "Thank you! I saw what was missing in me.", "1": "Thank you! I saw what was missing in me.",
@ -1427,73 +1437,73 @@
"chili": { "chili": {
"encounter": { "encounter": {
"1": "Yeeeeooow! Time to play with FIRE!! I'm the strongest of us brothers!", "1": "Yeeeeooow! Time to play with FIRE!! I'm the strongest of us brothers!",
"1_female": null, "1_female": "Yeeeeooow! Time to play with FIRE!! I'm the strongest of us brothers!",
"2": "Ta-da! The Fire-type scorcher Chili--that's me--will be your opponent!", "2": "Ta-da! The Fire-type scorcher Chili--that's me--will be your opponent!",
"2_female": null, "2_female": "Ta-da! The Fire-type scorcher Chili--that's me--will be your opponent!",
"3": "I'm going to show you what me and my blazing Fire types can do!", "3": "I'm going to show you what me and my blazing Fire types can do!",
"3_female": null "3_female": "I'm going to show you what me and my blazing Fire types can do!"
}, },
"victory": { "victory": {
"1": "You got me. I am… burned… out…", "1": "You got me. I am… burned… out…",
"1_female": null, "1_female": "You got me. I am… burned… out…",
"2": "Whoa ho! You're on fire!", "2": "Whoa ho! You're on fire!",
"2_female": null, "2_female": "Whoa ho! You're on fire!",
"3": "Augh! You got me!" "3": "Augh! You got me!"
}, },
"defeat": { "defeat": {
"1": "I'm on fire! Play with me, and you'll get burned!", "1": "I'm on fire! Play with me, and you'll get burned!",
"1_female": null, "1_female": "I'm on fire! Play with me, and you'll get burned!",
"2": "When you play with fire, you get burned!", "2": "When you play with fire, you get burned!",
"3": "I mean, c'mon, your opponent was me! You didn't have a chance!", "3": "I mean, c'mon, your opponent was me! You didn't have a chance!",
"3_female": null "3_female": "I mean, c'mon, your opponent was me! You didn't have a chance!"
} }
}, },
"cilan": { "cilan": {
"encounter": { "encounter": {
"1": "Nothing personal... No hard feelings... Me and my Grass-type Pokémon will...\n$Um... We're gonna battle come what may.", "1": "Nothing personal... No hard feelings... Me and my Grass-type Pokémon will...\n$Um... We're gonna battle come what may.",
"1_female": null, "1_female": "Nothing personal... No hard feelings... Me and my Grass-type Pokémon will...\n$Um... We're gonna battle come what may.",
"2": "So, um, if you're OK with me, I'll, um, put everything I've got into being, er, you know, your opponent.", "2": "So, um, if you're OK with me, I'll, um, put everything I've got into being, er, you know, your opponent.",
"2_female": null, "2_female": "So, um, if you're OK with me, I'll, um, put everything I've got into being, er, you know, your opponent.",
"3": "OK… So, um, I'm Cilan, I like Grass-type Pokémon.", "3": "OK… So, um, I'm Cilan, I like Grass-type Pokémon.",
"3_female": null "3_female": "OK… So, um, I'm Cilan, I like Grass-type Pokémon."
}, },
"victory": { "victory": {
"1": "Er… Is it over now?", "1": "Er… Is it over now?",
"1_female": null, "1_female": "Er… Is it over now?",
"2": "…What a surprise. You are very strong, aren't you? \n$I guess my brothers wouldn't have been able to defeat you either…", "2": "…What a surprise. You are very strong, aren't you? \n$I guess my brothers wouldn't have been able to defeat you either…",
"2_female": null, "2_female": "…What a surprise. You are very strong, aren't you? \n$I guess my brothers wouldn't have been able to defeat you either…",
"3": "…Huh. Looks like my timing was, um, off?" "3": "…Huh. Looks like my timing was, um, off?"
}, },
"defeat": { "defeat": {
"1": "Huh? Did I win?", "1": "Huh? Did I win?",
"1_female": null, "1_female": "Huh? Did I win?",
"2": "I guess… \n$I suppose I won, because I've been competing with my brothers Chili and Cress, and we all were able to get tougher.", "2": "I guess… \n$I suppose I won, because I've been competing with my brothers Chili and Cress, and we all were able to get tougher.",
"2_female": null, "2_female": "I guess… \n$I suppose I won, because I've been competing with my brothers Chili and Cress, and we all were able to get tougher.",
"3": "It…it was quite a thrilling experience…", "3": "It…it was quite a thrilling experience…",
"3_female": null "3_female": "It…it was quite a thrilling experience…"
} }
}, },
"roark": { "roark": {
"encounter": { "encounter": {
"1": "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!", "1": "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!",
"1_female": null, "1_female": "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!",
"2": "Here goes! These are my rocking Pokémon, my pride and joy!", "2": "Here goes! These are my rocking Pokémon, my pride and joy!",
"3": "Rock-type Pokémon are simply the best!", "3": "Rock-type Pokémon are simply the best!",
"4": "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!", "4": "Every day, I toughened up my Pokémon by digging up Fossils nonstop.\n$Could I show you how tough I made them in a battle?",
"4_female": null "4_female": "Every day, I toughened up my Pokémon by digging up Fossils nonstop.\n$Could I show you how tough I made them in a battle?"
}, },
"victory": { "victory": {
"1": "W-what? That can't be! My buffed-up Pokémon!", "1": "W-what? That can't be! My buffed-up Pokémon!",
"2": "…We lost control there. Next time I'd like to challenge you to a Fossil-digging race underground.", "2": "…We lost control there. Next time I'd like to challenge you to a Fossil-digging race underground.",
"2_female": null, "2_female": "…We lost control there. Next time I'd like to challenge you to a Fossil-digging race underground.",
"3": "With skill like yours, it's natural for you to win.", "3": "With skill like yours, it's natural for you to win.",
"4": "Wh-what?! It can't be! Even that wasn't enough?", "4": "Wh-what?! It can't be! Even that wasn't enough?"
"5": "I blew it."
}, },
"defeat": { "defeat": {
"1": "See? I'm proud of my rocking battle style!", "1": "See? I'm proud of my rocking battle style!",
"2": "Thanks! The battle gave me confidence that I may be able to beat my dad!", "2": "Thanks! The battle gave me confidence that I may be able to beat my dad!",
"3": "I feel like I just smashed through a really stubborn boulder!" "3": "See? These are my rocking Pokémon, my pride and joy!",
"4": "I knew I would win!"
} }
}, },
"morty": { "morty": {
@ -1508,7 +1518,7 @@
"victory": { "victory": {
"1": "I'm not good enough yet…", "1": "I'm not good enough yet…",
"2": "I see… Your journey has taken you to far-away places and you have witnessed much more than I.\n$I envy you for that…", "2": "I see… Your journey has taken you to far-away places and you have witnessed much more than I.\n$I envy you for that…",
"2_female": null, "2_female": "I see… Your journey has taken you to far-away places and you have witnessed much more than I.\n$I envy you for that…",
"3": "How is this possible…", "3": "How is this possible…",
"4": "I don't think our potentials are so different.\n$But you seem to have something more than that… So be it.", "4": "I don't think our potentials are so different.\n$But you seem to have something more than that… So be it.",
"5": "Guess I need more training.", "5": "Guess I need more training.",
@ -1568,13 +1578,13 @@
}, },
"defeat": { "defeat": {
"1": "Heh heh! Don't mind me, just scooping up a W over here. I get it if you're upset, but don't go full Kieran on me, OK?", "1": "Heh heh! Don't mind me, just scooping up a W over here. I get it if you're upset, but don't go full Kieran on me, OK?",
"1_female": null "1_female": "Heh heh! Don't mind me, just scooping up a W over here. I get it if you're upset, but don't go full Kieran on me, OK?"
} }
}, },
"ramos": { "ramos": {
"encounter": { "encounter": {
"1": "Did yeh enjoy the garden playground I made with all these sturdy plants o' mine?\n$Their strength is a sign o' my strength as a gardener and a Gym Leader! Yeh sure yer up to facing all that?", "1": "Did yeh enjoy the garden playground I made with all these sturdy plants o' mine?\n$Their strength is a sign o' my strength as a gardener and a Gym Leader! Yeh sure yer up to facing all that?",
"1_female": null "1_female": "Did yeh enjoy the garden playground I made with all these sturdy plants o' mine?\n$Their strength is a sign o' my strength as a gardener and a Gym Leader! Yeh sure yer up to facing all that?"
}, },
"victory": { "victory": {
"1": "Yeh believe in yer Pokémon… And they believe in yeh, too… It was a fine battle, sprout." "1": "Yeh believe in yer Pokémon… And they believe in yeh, too… It was a fine battle, sprout."
@ -1605,7 +1615,7 @@
"victory": { "victory": {
"1": "I must say, I'm warmed up to you! I might even admire you a little.", "1": "I must say, I'm warmed up to you! I might even admire you a little.",
"2": "Wow! You're great! You've earned my respect! \n$I think your focus and will bowled us over totally. ", "2": "Wow! You're great! You've earned my respect! \n$I think your focus and will bowled us over totally. ",
"2_female": null "2_female": "Wow! You're great! You've earned my respect! \n$I think your focus and will bowled us over totally. "
}, },
"defeat": { "defeat": {
"1": "I sensed your will to win, but I don't lose!", "1": "I sensed your will to win, but I don't lose!",
@ -1618,7 +1628,7 @@
}, },
"victory": { "victory": {
"1": "Amazing! You're very good, aren't you?", "1": "Amazing! You're very good, aren't you?",
"1_female": null "1_female": "Amazing! You're very good, aren't you?"
}, },
"defeat": { "defeat": {
"1": "Yes! My Pokémon and I are perfectly good!" "1": "Yes! My Pokémon and I are perfectly good!"
@ -1660,7 +1670,7 @@
"clay": { "clay": {
"encounter": { "encounter": {
"1": "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!", "1": "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!",
"1_female": null "1_female": "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!"
}, },
"victory": { "victory": {
"1": "Man oh man… It feels good to go all out and still be defeated!" "1": "Man oh man… It feels good to go all out and still be defeated!"
@ -1675,7 +1685,7 @@
}, },
"victory": { "victory": {
"1": "Vaultin' Veluza! Yer a lively one, aren't ya! A little TOO lively, if I do say so myself!", "1": "Vaultin' Veluza! Yer a lively one, aren't ya! A little TOO lively, if I do say so myself!",
"1_female": null "1_female": "Vaultin' Veluza! Yer a lively one, aren't ya! A little TOO lively, if I do say so myself!"
}, },
"defeat": { "defeat": {
"1": "You come back to see me again now, ya hear?" "1": "You come back to see me again now, ya hear?"
@ -1742,7 +1752,7 @@
}, },
"victory": { "victory": {
"1": "Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. \n$I find much joy in having met you and your Pokémon. You have proven yourself worthy.", "1": "Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. \n$I find much joy in having met you and your Pokémon. You have proven yourself worthy.",
"1_female": null "1_female": "Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. \n$I find much joy in having met you and your Pokémon. You have proven yourself worthy."
}, },
"defeat": { "defeat": {
"1": "A grand illusion!" "1": "A grand illusion!"
@ -1751,14 +1761,14 @@
"lorelei": { "lorelei": {
"encounter": { "encounter": {
"1": "No one can best me when it comes to icy Pokémon! Freezing moves are powerful!\n$Your Pokémon will be at my mercy when they are frozen solid! Hahaha! Are you ready?", "1": "No one can best me when it comes to icy Pokémon! Freezing moves are powerful!\n$Your Pokémon will be at my mercy when they are frozen solid! Hahaha! Are you ready?",
"1_female": null "1_female": "No one can best me when it comes to icy Pokémon! Freezing moves are powerful!\n$Your Pokémon will be at my mercy when they are frozen solid! Hahaha! Are you ready?"
}, },
"victory": { "victory": {
"1": "How dare you!" "1": "How dare you!"
}, },
"defeat": { "defeat": {
"1": "There's nothing you can do once you're frozen.", "1": "There's nothing you can do once you're frozen.",
"1_female": null "1_female": "There's nothing you can do once you're frozen."
} }
}, },
"will": { "will": {
@ -1775,11 +1785,11 @@
"malva": { "malva": {
"encounter": { "encounter": {
"1": "I feel like my heart might just burst into flames. \n$I'm burning up with my hatred for you, runt!", "1": "I feel like my heart might just burst into flames. \n$I'm burning up with my hatred for you, runt!",
"1_female": null "1_female": "I feel like my heart might just burst into flames. \n$I'm burning up with my hatred for you, runt!"
}, },
"victory": { "victory": {
"1": "What news… So a new challenger has defeated Malva!", "1": "What news… So a new challenger has defeated Malva!",
"1_female": null "1_female": "What news… So a new challenger has defeated Malva!"
}, },
"defeat": { "defeat": {
"1": "I am delighted! Yes, delighted that I could squash you beneath my heel." "1": "I am delighted! Yes, delighted that I could squash you beneath my heel."
@ -1802,7 +1812,7 @@
}, },
"victory": { "victory": {
"1": "I certainly found an interesting Trainer to face!", "1": "I certainly found an interesting Trainer to face!",
"1_female": null "1_female": "I certainly found an interesting Trainer to face!"
}, },
"defeat": { "defeat": {
"1": "Ahaha. What an interesting battle." "1": "Ahaha. What an interesting battle."
@ -1814,11 +1824,11 @@
}, },
"victory": { "victory": {
"1": "Not bad, kiddo.", "1": "Not bad, kiddo.",
"1_female": null "1_female": "Not bad, kiddo."
}, },
"defeat": { "defeat": {
"1": "Nahahaha! You really are something else, kiddo!", "1": "Nahahaha! You really are something else, kiddo!",
"1_female": null "1_female": "Nahahaha! You really are something else, kiddo!"
} }
}, },
"bruno": { "bruno": {
@ -1838,7 +1848,7 @@
}, },
"victory": { "victory": {
"1": "Whoa, amazing! You're an expert on Pokémon!\nMy research isn't complete yet. OK, you win.", "1": "Whoa, amazing! You're an expert on Pokémon!\nMy research isn't complete yet. OK, you win.",
"1_female": null "1_female": "Whoa, amazing! You're an expert on Pokémon!\nMy research isn't complete yet. OK, you win."
}, },
"defeat": { "defeat": {
"1": "Thanks! Thanks to our battle, I was also able to make progress in my research!" "1": "Thanks! Thanks to our battle, I was also able to make progress in my research!"
@ -1869,11 +1879,11 @@
"lenora": { "lenora": {
"encounter": { "encounter": {
"1": "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!", "1": "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!",
"1_female": null "1_female": "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!"
}, },
"victory": { "victory": {
"1": "My theory about you was correct. You're more than just talented… You're motivated! I salute you!", "1": "My theory about you was correct. You're more than just talented… You're motivated! I salute you!",
"1_female": null "1_female": "My theory about you was correct. You're more than just talented… You're motivated! I salute you!"
}, },
"defeat": { "defeat": {
"1": "Ah ha ha! If you lose, make sure to analyze why, and use that knowledge in your next battle!" "1": "Ah ha ha! If you lose, make sure to analyze why, and use that knowledge in your next battle!"
@ -1899,7 +1909,7 @@
}, },
"defeat": { "defeat": {
"1": "Hey, c'mon! Get serious! You gotta put more out there!", "1": "Hey, c'mon! Get serious! You gotta put more out there!",
"1_female": null "1_female": "Hey, c'mon! Get serious! You gotta put more out there!"
} }
}, },
"olivia": { "olivia": {
@ -1938,7 +1948,7 @@
"flint": { "flint": {
"encounter": { "encounter": {
"1": "Hope you're warmed up, cause here comes the Big Bang!", "1": "Hope you're warmed up, cause here comes the Big Bang!",
"1_female": null "1_female": "Hope you're warmed up, cause here comes the Big Bang!"
}, },
"victory": { "victory": {
"1": "Incredible! Your moves are so hot, they make mine look lukewarm!" "1": "Incredible! Your moves are so hot, they make mine look lukewarm!"
@ -1961,7 +1971,7 @@
"caitlin": { "caitlin": {
"encounter": { "encounter": {
"1": "It's me who appeared when the flower opened up. You who have been waiting…\n$You look like a Pokémon Trainer with refined strength and deepened kindness. \n$What I look for in my opponent is superb strength… \n$Please unleash your power to the fullest!", "1": "It's me who appeared when the flower opened up. You who have been waiting…\n$You look like a Pokémon Trainer with refined strength and deepened kindness. \n$What I look for in my opponent is superb strength… \n$Please unleash your power to the fullest!",
"1_female": null "1_female": "It's me who appeared when the flower opened up. You who have been waiting…\n$You look like a Pokémon Trainer with refined strength and deepened kindness. \n$What I look for in my opponent is superb strength… \n$Please unleash your power to the fullest!"
}, },
"victory": { "victory": {
"1": "My Pokémon and I learned so much! I offer you my thanks." "1": "My Pokémon and I learned so much! I offer you my thanks."
@ -1984,15 +1994,15 @@
"wikstrom": { "wikstrom": {
"encounter": { "encounter": {
"1": "Well met, young challenger! Verily am I the famed blade of hardened steel, Duke Wikstrom! \n$Let the battle begin! En garde!", "1": "Well met, young challenger! Verily am I the famed blade of hardened steel, Duke Wikstrom! \n$Let the battle begin! En garde!",
"1_female": null "1_female": "Well met, young challenger! Verily am I the famed blade of hardened steel, Duke Wikstrom! \n$Let the battle begin! En garde!"
}, },
"victory": { "victory": {
"1": "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!", "1": "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!",
"1_female": null "1_female": "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!"
}, },
"defeat": { "defeat": {
"1": "What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! \n$Winning against such a worthy opponent doth give my soul wings--thus do I soar!", "1": "What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! \n$Winning against such a worthy opponent doth give my soul wings--thus do I soar!",
"1_female": null "1_female": "What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! \n$Winning against such a worthy opponent doth give my soul wings--thus do I soar!"
} }
}, },
"acerola": { "acerola": {
@ -2024,14 +2034,14 @@
}, },
"victory": { "victory": {
"1": "You got me. You are magnificent!", "1": "You got me. You are magnificent!",
"1_female": null, "1_female": "You got me. You are magnificent!",
"2": "I never expected another trainer to beat me… I'm surprised.", "2": "I never expected another trainer to beat me… I'm surprised.",
"2_female": null "2_female": "I never expected another trainer to beat me… I'm surprised."
}, },
"defeat": { "defeat": {
"1": "That was close. Want to try again?", "1": "That was close. Want to try again?",
"2": "It's not that you are weak. Don't let it bother you.", "2": "It's not that you are weak. Don't let it bother you.",
"2_female": null "2_female": "It's not that you are weak. Don't let it bother you."
} }
}, },
"karen": { "karen": {
@ -2057,7 +2067,7 @@
}, },
"victory": { "victory": {
"1": "The power of Grass has wilted… What an incredible Challenger!", "1": "The power of Grass has wilted… What an incredible Challenger!",
"1_female": null "1_female": "The power of Grass has wilted… What an incredible Challenger!"
}, },
"defeat": { "defeat": {
"1": "This'll really leave you in shock and awe." "1": "This'll really leave you in shock and awe."
@ -2077,7 +2087,7 @@
"drasna": { "drasna": {
"encounter": { "encounter": {
"1": "You must be a strong Trainer. Yes, quite strong indeed…\n$That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!", "1": "You must be a strong Trainer. Yes, quite strong indeed…\n$That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!",
"1_female": null "1_female": "You must be a strong Trainer. Yes, quite strong indeed…\n$That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!"
}, },
"victory": { "victory": {
"1": "Oh, dear me. That sure was a quick battle… I do hope you'll come back again sometime!" "1": "Oh, dear me. That sure was a quick battle… I do hope you'll come back again sometime!"
@ -2111,7 +2121,7 @@
"blue": { "blue": {
"encounter": { "encounter": {
"1": "You must be pretty good to get this far.", "1": "You must be pretty good to get this far.",
"1_female": null "1_female": "You must be pretty good to get this far."
}, },
"victory": { "victory": {
"1": "I've only lost to him and now to you… Him? Hee, hee…" "1": "I've only lost to him and now to you… Him? Hee, hee…"
@ -2159,7 +2169,7 @@
}, },
"victory": { "victory": {
"1": "This is the emergence of a new Champion.", "1": "This is the emergence of a new Champion.",
"1_female": null "1_female": "This is the emergence of a new Champion."
}, },
"defeat": { "defeat": {
"1": "I successfully defended my Championship." "1": "I successfully defended my Championship."
@ -2248,7 +2258,7 @@
}, },
"victory": { "victory": {
"1": "Waaah! Waaah! You're so mean!", "1": "Waaah! Waaah! You're so mean!",
"1_female": null "1_female": "Waaah! Waaah! You're so mean!"
}, },
"defeat": { "defeat": {
"1": "And that's that!" "1": "And that's that!"
@ -2257,7 +2267,7 @@
"chuck": { "chuck": {
"encounter": { "encounter": {
"1": "Hah! You want to challenge me? Are you brave or just ignorant?", "1": "Hah! You want to challenge me? Are you brave or just ignorant?",
"1_female": null "1_female": "Hah! You want to challenge me? Are you brave or just ignorant?"
}, },
"victory": { "victory": {
"1": "You're strong! Would you please make me your apprentice?" "1": "You're strong! Would you please make me your apprentice?"
@ -2269,7 +2279,7 @@
"katy": { "katy": {
"encounter": { "encounter": {
"1": "Don't let your guard down unless you would like to find yourself knocked off your feet!", "1": "Don't let your guard down unless you would like to find yourself knocked off your feet!",
"1_female": null "1_female": "Don't let your guard down unless you would like to find yourself knocked off your feet!"
}, },
"victory": { "victory": {
"1": "All of my sweet little Pokémon dropped like flies!" "1": "All of my sweet little Pokémon dropped like flies!"
@ -2303,7 +2313,7 @@
"maylene": { "maylene": {
"encounter": { "encounter": {
"1": "I've come to challenge you now, and I won't hold anything back. \n$Please prepare yourself for battle!", "1": "I've come to challenge you now, and I won't hold anything back. \n$Please prepare yourself for battle!",
"1_female": null "1_female": "I've come to challenge you now, and I won't hold anything back. \n$Please prepare yourself for battle!"
}, },
"victory": { "victory": {
"1": "I admit defeat…" "1": "I admit defeat…"
@ -2326,7 +2336,7 @@
"byron": { "byron": {
"encounter": { "encounter": {
"1": "Trainer! You're young, just like my son, Roark. \n$With more young Trainers taking charge, the future of Pokémon is bright! \n$So, as a wall for young people, I'll take your challenge!", "1": "Trainer! You're young, just like my son, Roark. \n$With more young Trainers taking charge, the future of Pokémon is bright! \n$So, as a wall for young people, I'll take your challenge!",
"1_female": null "1_female": "Trainer! You're young, just like my son, Roark. \n$With more young Trainers taking charge, the future of Pokémon is bright! \n$So, as a wall for young people, I'll take your challenge!"
}, },
"victory": { "victory": {
"1": "Hmm! My sturdy Pokémon--defeated!" "1": "Hmm! My sturdy Pokémon--defeated!"
@ -2349,7 +2359,7 @@
"volkner": { "volkner": {
"encounter": { "encounter": {
"1": "Since you've come this far, you must be quite strong…\n$I hope you're the Trainer who'll make me remember how fun it is to battle!", "1": "Since you've come this far, you must be quite strong…\n$I hope you're the Trainer who'll make me remember how fun it is to battle!",
"1_female": null "1_female": "Since you've come this far, you must be quite strong…\n$I hope you're the Trainer who'll make me remember how fun it is to battle!"
}, },
"victory": { "victory": {
"1": "You've got me beat…\n$Your desire and the noble way your Pokémon battled for you… \n$I even felt thrilled during our match. That was a very good battle." "1": "You've got me beat…\n$Your desire and the noble way your Pokémon battled for you… \n$I even felt thrilled during our match. That was a very good battle."
@ -2452,7 +2462,7 @@
"valerie": { "valerie": {
"encounter": { "encounter": {
"1": "Oh, if it isn't a young Trainer… It is lovely to get to meet you like this. \n$Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. \n$The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.", "1": "Oh, if it isn't a young Trainer… It is lovely to get to meet you like this. \n$Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. \n$The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.",
"1_female": null "1_female": "Oh, if it isn't a young Trainer… It is lovely to get to meet you like this. \n$Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. \n$The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong."
}, },
"victory": { "victory": {
"1": "I hope that you will find things worth smiling about tomorrow…" "1": "I hope that you will find things worth smiling about tomorrow…"
@ -2500,7 +2510,7 @@
}, },
"victory": { "victory": {
"1": "Your pink is still lacking, but you're an excellent Trainer with excellent Pokémon.", "1": "Your pink is still lacking, but you're an excellent Trainer with excellent Pokémon.",
"1_female": null "1_female": "Your pink is still lacking, but you're an excellent Trainer with excellent Pokémon."
}, },
"defeat": { "defeat": {
"1": "Too bad for you, I guess." "1": "Too bad for you, I guess."
@ -2509,7 +2519,7 @@
"bede": { "bede": {
"encounter": { "encounter": {
"1": "I suppose I should prove beyond doubt just how pathetic you are and how strong I am.", "1": "I suppose I should prove beyond doubt just how pathetic you are and how strong I am.",
"1_female": null "1_female": "I suppose I should prove beyond doubt just how pathetic you are and how strong I am."
}, },
"victory": { "victory": {
"1": "I see… Well, that's fine. I wasn't really trying all that hard anyway." "1": "I see… Well, that's fine. I wasn't really trying all that hard anyway."
@ -2554,7 +2564,7 @@
"brassius": { "brassius": {
"encounter": { "encounter": {
"1": "I assume you are ready? Let our collaborative work of art begin!", "1": "I assume you are ready? Let our collaborative work of art begin!",
"1_female": null "1_female": "I assume you are ready? Let our collaborative work of art begin!"
}, },
"victory": { "victory": {
"1": "Ahhh…vant-garde!" "1": "Ahhh…vant-garde!"
@ -2566,11 +2576,11 @@
"iono": { "iono": {
"encounter": { "encounter": {
"1": "How're ya feelin' about this battle?\n$...\n$Let's get this show on the road! How strong is our challenger? \n$I 'unno! Let's find out together!", "1": "How're ya feelin' about this battle?\n$...\n$Let's get this show on the road! How strong is our challenger? \n$I 'unno! Let's find out together!",
"1_female": null "1_female": "How're ya feelin' about this battle?\n$...\n$Let's get this show on the road! How strong is our challenger? \n$I 'unno! Let's find out together!"
}, },
"victory": { "victory": {
"1": "You're as flashy and bright as a 10,000,000-volt Thunderbolt, friendo!", "1": "You're as flashy and bright as a 10,000,000-volt Thunderbolt, friendo!",
"1_female": null "1_female": "You're as flashy and bright as a 10,000,000-volt Thunderbolt, friendo!"
}, },
"defeat": { "defeat": {
"1": "Your eyeballs are MINE!" "1": "Your eyeballs are MINE!"
@ -2593,7 +2603,7 @@
}, },
"victory": { "victory": {
"1": "You're cool, my friend—you move my SOUL!", "1": "You're cool, my friend—you move my SOUL!",
"1_female": null "1_female": "You're cool, my friend—you move my SOUL!"
}, },
"defeat": { "defeat": {
"1": "Later, baby!" "1": "Later, baby!"
@ -2627,9 +2637,9 @@
"nessa_elite": { "nessa_elite": {
"encounter": { "encounter": {
"1": "The tides are turning in my favor. Ready to get swept away?", "1": "The tides are turning in my favor. Ready to get swept away?",
"1_female": null, "1_female": "The tides are turning in my favor. Ready to get swept away?",
"2": "Let's make some waves with this battle! I hope you're prepared!", "2": "Let's make some waves with this battle! I hope you're prepared!",
"2_female": null "2_female": "Let's make some waves with this battle! I hope you're prepared!"
}, },
"victory": { "victory": {
"1": "You navigated those waters perfectly... Well done!", "1": "You navigated those waters perfectly... Well done!",
@ -2657,7 +2667,7 @@
"allister_elite": { "allister_elite": {
"encounter": { "encounter": {
"1": "Shadows fall... Are you ready to face your fears?", "1": "Shadows fall... Are you ready to face your fears?",
"1_female": null, "1_female": "Shadows fall... Are you ready to face your fears?",
"2": "Let's see if you can handle the darkness that I command." "2": "Let's see if you can handle the darkness that I command."
}, },
"victory": { "victory": {
@ -2681,7 +2691,7 @@
"defeat": { "defeat": {
"1": "Another storm weathered, another victory claimed! Well fought!", "1": "Another storm weathered, another victory claimed! Well fought!",
"2": "You got caught in my storm! Better luck next time!", "2": "You got caught in my storm! Better luck next time!",
"2_female": null "2_female": "You got caught in my storm! Better luck next time!"
} }
}, },
"alder": { "alder": {

View File

@ -24,6 +24,7 @@
"linkGoogle": "Link Google", "linkGoogle": "Link Google",
"unlinkGoogle": "Unlink Google", "unlinkGoogle": "Unlink Google",
"cancel": "Cancel", "cancel": "Cancel",
"donate": "Donate",
"losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?", "losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?",
"noEggs": "You are not hatching\nany eggs at the moment!" "noEggs": "You are not hatching\nany eggs at the moment!"
} }

View File

@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "Doubles the chance of an encounter being a double battle for {{battleCount}} battles." "description": "Doubles the chance of an encounter being a double battle for {{battleCount}} battles."
}, },
"TempBattleStatBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "Increases the {{tempBattleStatName}} of all party members by 1 stage for 5 battles." "description": "Increases the {{stat}} of all party members by 1 stage for 5 battles."
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "Increases the power of a Pokémon's {{moveType}}-type moves by 20%." "description": "Increases the power of a Pokémon's {{moveType}}-type moves by 20%."
@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": { "AllPokemonLevelIncrementModifierType": {
"description": "Increases all party members' level by {{levels}}." "description": "Increases all party members' level by {{levels}}."
}, },
"PokemonBaseStatBoosterModifierType": { "BaseStatBoosterModifierType": {
"description": "Increases the holder's base {{statName}} by 10%. The higher your IVs, the higher the stack limit." "description": "Increases the holder's base {{stat}} by 10%. The higher your IVs, the higher the stack limit."
}, },
"AllPokemonFullHpRestoreModifierType": { "AllPokemonFullHpRestoreModifierType": {
"description": "Restores 100% HP for all Pokémon." "description": "Restores 100% HP for all Pokémon."
@ -183,6 +183,7 @@
"SOOTHE_BELL": { "name": "Soothe Bell" }, "SOOTHE_BELL": { "name": "Soothe Bell" },
"SCOPE_LENS": { "name": "Scope Lens", "description": "It's a lens for scoping out weak points. It boosts the holder's critical-hit ratio."}, "SCOPE_LENS": { "name": "Scope Lens", "description": "It's a lens for scoping out weak points. It boosts the holder's critical-hit ratio."},
"DIRE_HIT": { "name": "Dire Hit", "extra": { "raises": "Critical Hit Ratio" } },
"LEEK": { "name": "Leek", "description": "This very long and stiff stalk of leek boosts the critical-hit ratio of Farfetch'd's moves."}, "LEEK": { "name": "Leek", "description": "This very long and stiff stalk of leek boosts the critical-hit ratio of Farfetch'd's moves."},
"EVIOLITE": { "name": "Eviolite", "description": "This mysterious evolutionary lump boosts the Defense and Sp. Def stats when held by a Pokémon that can still evolve." }, "EVIOLITE": { "name": "Eviolite", "description": "This mysterious evolutionary lump boosts the Defense and Sp. Def stats when held by a Pokémon that can still evolve." },
@ -250,28 +251,14 @@
"METAL_POWDER": { "name": "Metal Powder", "description": "Extremely fine yet hard, this odd powder boosts Ditto's Defense stat." }, "METAL_POWDER": { "name": "Metal Powder", "description": "Extremely fine yet hard, this odd powder boosts Ditto's Defense stat." },
"QUICK_POWDER": { "name": "Quick Powder", "description": "Extremely fine yet hard, this odd powder boosts Ditto's Speed stat." } "QUICK_POWDER": { "name": "Quick Powder", "description": "Extremely fine yet hard, this odd powder boosts Ditto's Speed stat." }
}, },
"TempBattleStatBoosterItem": { "TempStatStageBoosterItem": {
"x_attack": "X Attack", "x_attack": "X Attack",
"x_defense": "X Defense", "x_defense": "X Defense",
"x_sp_atk": "X Sp. Atk", "x_sp_atk": "X Sp. Atk",
"x_sp_def": "X Sp. Def", "x_sp_def": "X Sp. Def",
"x_speed": "X Speed", "x_speed": "X Speed",
"x_accuracy": "X Accuracy", "x_accuracy": "X Accuracy"
"dire_hit": "Dire Hit"
}, },
"TempBattleStatBoosterStatName": {
"ATK": "Attack",
"DEF": "Defense",
"SPATK": "Sp. Atk",
"SPDEF": "Sp. Def",
"SPD": "Speed",
"ACC": "Accuracy",
"CRIT": "Critical Hit Ratio",
"EVA": "Evasiveness",
"DEFAULT": "???"
},
"AttackTypeBoosterItem": { "AttackTypeBoosterItem": {
"silk_scarf": "Silk Scarf", "silk_scarf": "Silk Scarf",
"black_belt": "Black Belt", "black_belt": "Black Belt",
@ -450,6 +437,6 @@
"DRAGON_MEMORY": "Dragon Memory", "DRAGON_MEMORY": "Dragon Memory",
"DARK_MEMORY": "Dark Memory", "DARK_MEMORY": "Dark Memory",
"FAIRY_MEMORY": "Fairy Memory", "FAIRY_MEMORY": "Fairy Memory",
"BLANK_MEMORY": "Blank Memory" "NORMAL_MEMORY": "Normal Memory"
} }
} }

View File

@ -3,7 +3,7 @@
"turnHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "turnHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!",
"hitHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "hitHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} was revived\nby its {{typeName}}!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} was revived\nby its {{typeName}}!",
"pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "resetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!",
"moneyInterestApply": "You received interest of ₽{{moneyAmount}}\nfrom the {{typeName}}!", "moneyInterestApply": "You received interest of ₽{{moneyAmount}}\nfrom the {{typeName}}!",
"turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!",
"contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!",

View File

@ -3,6 +3,10 @@
"cutHpPowerUpMove": "{{pokemonName}} cut its own HP to power up its move!", "cutHpPowerUpMove": "{{pokemonName}} cut its own HP to power up its move!",
"absorbedElectricity": "{{pokemonName}} absorbed electricity!", "absorbedElectricity": "{{pokemonName}} absorbed electricity!",
"switchedStatChanges": "{{pokemonName}} switched stat changes with the target!", "switchedStatChanges": "{{pokemonName}} switched stat changes with the target!",
"switchedTwoStatChanges": "{{pokemonName}} switched all changes to its {{firstStat}}\nand {{secondStat}} with its target!",
"switchedStat": "{{pokemonName}} switched {{stat}} with its target!",
"sharedGuard": "{{pokemonName}} shared its guard with the target!",
"sharedPower": "{{pokemonName}} shared its power with the target!",
"goingAllOutForAttack": "{{pokemonName}} is going all out for this attack!", "goingAllOutForAttack": "{{pokemonName}} is going all out for this attack!",
"regainedHealth": "{{pokemonName}} regained\nhealth!", "regainedHealth": "{{pokemonName}} regained\nhealth!",
"keptGoingAndCrashed": "{{pokemonName}} kept going\nand crashed!", "keptGoingAndCrashed": "{{pokemonName}} kept going\nand crashed!",

View File

@ -1,7 +1,7 @@
{ {
"Stat": { "Stat": {
"HP": "Max. HP", "HP": "Max. HP",
"HPshortened": "MaxHP", "HPshortened": "HP",
"ATK": "Attack", "ATK": "Attack",
"ATKshortened": "Atk", "ATKshortened": "Atk",
"DEF": "Defense", "DEF": "Defense",
@ -13,8 +13,7 @@
"SPD": "Speed", "SPD": "Speed",
"SPDshortened": "Spd", "SPDshortened": "Spd",
"ACC": "Accuracy", "ACC": "Accuracy",
"EVA": "Evasiveness", "EVA": "Evasiveness"
"HPStat": "HP"
}, },
"Type": { "Type": {
"UNKNOWN": "Unknown", "UNKNOWN": "Unknown",
@ -38,4 +37,4 @@
"FAIRY": "Fairy", "FAIRY": "Fairy",
"STELLAR": "Stellar" "STELLAR": "Stellar"
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -91,7 +91,7 @@
"name": "Campeón Liga Master", "name": "Campeón Liga Master",
"name_female": "Campeona Liga Master" "name_female": "Campeona Liga Master"
}, },
"TRANSFER_MAX_BATTLE_STAT": { "TRANSFER_MAX_STAT_STAGE": {
"name": "Trabajo en Equipo", "name": "Trabajo en Equipo",
"description": "Haz relevo a otro miembro del equipo con al menos una estadística al máximo." "description": "Haz relevo a otro miembro del equipo con al menos una estadística al máximo."
}, },
@ -175,4 +175,4 @@
"name": "Espejo ojepsE", "name": "Espejo ojepsE",
"description": "Completa el reto de Combate Inverso.\n.osrevnI etabmoC ed oter le atelpmoC" "description": "Completa el reto de Combate Inverso.\n.osrevnI etabmoC ed oter le atelpmoC"
} }
} }

View File

@ -1 +1,8 @@
{} {
"safeguardOnAdd": "¡Todos los Pokémon están protegidos por Velo Sagrado!",
"safeguardOnAddPlayer": "¡Tu equipo se ha protegido con Velo Sagrado!",
"safeguardOnAddEnemy": "¡El equipo enemigo se ha protegido con Velo Sagrado!",
"safeguardOnRemove": "¡Velo Sagrado dejó de hacer efecto!",
"safeguardOnRemovePlayer": "El efecto de Velo Sagrado en tu equipo se ha disipado.",
"safeguardOnRemoveEnemy": "El efecto de Velo Sagrado en el equipo enemigo se ha disipado."
}

View File

@ -1,95 +1,99 @@
{ {
"music": "Música: ", "music": "Música: ",
"missing_entries": "{{name}}", "missing_entries": "{{name}}",
"battle_kanto_champion": "B2W2 - ¡Vs Campeón de Kanto!", "battle_kanto_champion": "B2W2 - ¡Vs. Campeón de Kanto!",
"battle_johto_champion": "B2W2 - ¡Vs Campeón de Johto!", "battle_johto_champion": "B2W2 - ¡Vs. Campeón de Johto!",
"battle_hoenn_champion_g5": "B2W2 - ¡Vs Campeón de Hoenn!", "battle_hoenn_champion_g5": "B2W2 - ¡Vs. Campeón de Hoenn!",
"battle_hoenn_champion_g6": "ORAS - ¡Vs Campeón de Hoenn!", "battle_hoenn_champion_g6": "ORAS - ¡Vs. Campeón de Hoenn!",
"battle_sinnoh_champion": "B2W2 - ¡Vs Campeón de Sinnoh!", "battle_sinnoh_champion": "B2W2 - ¡Vs. Campeón de Sinnoh!",
"battle_champion_alder": "BW - ¡Vs Campeón de Teselia!", "battle_champion_alder": "BW - ¡Vs. Campeón de Teselia!",
"battle_champion_iris": "B2W2 - ¡Vs Campeón de Teselia!", "battle_champion_iris": "B2W2 - ¡Vs. Campeón de Teselia!",
"battle_kalos_champion": "XY - ¡Vs Campeón de Kalos!", "battle_kalos_champion": "XY - ¡Vs. Campeón de Kalos!",
"battle_alola_champion": "USUM - ¡Vs Campeón de Alola!", "battle_alola_champion": "USUM - ¡Vs. Campeón de Alola!",
"battle_galar_champion": "SWSH - ¡Vs Campeón de Galar!", "battle_galar_champion": "SWSH - ¡Vs. Campeón de Galar!",
"battle_champion_geeta": "SV - ¡Vs Campeona Ságita!", "battle_champion_geeta": "SV - ¡Vs. Campeona Ságita!",
"battle_champion_nemona": "SV - ¡Vs Campeona Mencía!", "battle_champion_nemona": "SV - ¡Vs. Campeona Mencía!",
"battle_champion_kieran": "SV - ¡Vs Campeón Cass!", "battle_champion_kieran": "SV - ¡Vs. Campeón Cass!",
"battle_hoenn_elite": "ORAS - ¡Vs Alto Mando!", "battle_hoenn_elite": "ORAS - ¡Vs. Alto Mando!",
"battle_unova_elite": "BW - ¡Vs Alto Mando!", "battle_unova_elite": "BW - ¡Vs. Alto Mando!",
"battle_kalos_elite": "XY - ¡Vs Alto Mando!", "battle_kalos_elite": "XY - ¡Vs. Alto Mando!",
"battle_alola_elite": "SM - ¡Vs Alto Mando!", "battle_alola_elite": "SM - ¡Vs. Alto Mando!",
"battle_galar_elite": "SWSH - Torneo de Finalistas", "battle_galar_elite": "SWSH - Torneo de finalistas",
"battle_paldea_elite": "SV - ¡Vs Alto Mando!", "battle_paldea_elite": "SV - ¡Vs. Alto Mando!",
"battle_bb_elite": "SV - ¡Vs Alto Mando de la Academia Arándano!", "battle_bb_elite": "SV - ¡Vs. Alto Mando de la Academia Arándano!",
"battle_final_encounter": "PMD RTDX - Dominio de Rayquaza", "battle_final_encounter": "PMD RTDX - Dominio de Rayquaza",
"battle_final": "BW - ¡Vs Ghechis!", "battle_final": "BW - ¡Vs. Ghechis!",
"battle_kanto_gym": "B2W2 - ¡Vs Líder de Kanto!", "battle_kanto_gym": "B2W2 - ¡Vs. Líder de Kanto!",
"battle_johto_gym": "B2W2 - ¡Vs Líder de Johto!", "battle_johto_gym": "B2W2 - ¡Vs. Líder de Johto!",
"battle_hoenn_gym": "B2W2 - ¡Vs Líder de Hoenn!", "battle_hoenn_gym": "B2W2 - ¡Vs. Líder de Hoenn!",
"battle_sinnoh_gym": "B2W2 - ¡Vs Líder de Sinnoh!", "battle_sinnoh_gym": "B2W2 - ¡Vs. Líder de Sinnoh!",
"battle_unova_gym": "BW - ¡Vs Líder de Teselia!", "battle_unova_gym": "BW - ¡Vs. Líder de Teselia!",
"battle_kalos_gym": "XY - ¡Vs Líder de Kalos!", "battle_kalos_gym": "XY - ¡Vs. Líder de Kalos!",
"battle_galar_gym": "SWSH - ¡Vs Líder de Galar!", "battle_galar_gym": "SWSH - ¡Vs. Líder de Galar!",
"battle_paldea_gym": "SV - ¡Vs Líder de Paldea!", "battle_paldea_gym": "SV - ¡Vs. Líder de Paldea!",
"battle_legendary_kanto": "XY - ¡Vs Legendarios de Kanto!", "battle_legendary_kanto": "XY - ¡Vs. Legendarios de Kanto!",
"battle_legendary_raikou": "HGSS - ¡Vs Raikou!", "battle_legendary_raikou": "HGSS - ¡Vs. Raikou!",
"battle_legendary_entei": "HGSS - ¡Vs Entei!", "battle_legendary_entei": "HGSS - ¡Vs. Entei!",
"battle_legendary_suicune": "HGSS - ¡Vs Suicune!", "battle_legendary_suicune": "HGSS - ¡Vs. Suicune!",
"battle_legendary_lugia": "HGSS - ¡Vs Lugia!", "battle_legendary_lugia": "HGSS - ¡Vs. Lugia!",
"battle_legendary_ho_oh": "HGSS - ¡Vs Ho-oh!", "battle_legendary_ho_oh": "HGSS - ¡Vs. Ho-oh!",
"battle_legendary_regis_g5": "B2W2 - ¡Vs Regis!", "battle_legendary_regis_g5": "B2W2 - ¡Vs. Regis!",
"battle_legendary_regis_g6": "ORAS - ¡Vs Regis!", "battle_legendary_regis_g6": "ORAS - ¡Vs. Regis!",
"battle_legendary_gro_kyo": "ORAS - ¡Vs Groudon/Kyogre!", "battle_legendary_gro_kyo": "ORAS - ¡Vs. Groudon/Kyogre!",
"battle_legendary_rayquaza": "ORAS - ¡Vs Rayquaza!", "battle_legendary_rayquaza": "ORAS - ¡Vs. Rayquaza!",
"battle_legendary_deoxys": "ORAS - ¡Vs Deoxys!", "battle_legendary_deoxys": "ORAS - ¡Vs. Deoxys!",
"battle_legendary_lake_trio": "ORAS - ¡Vs Trío del Lago!", "battle_legendary_lake_trio": "ORAS - ¡Vs. trío del Lago!",
"battle_legendary_sinnoh": "ORAS - ¡Vs Legendarios de Sinnoh!", "battle_legendary_sinnoh": "ORAS - ¡Vs. legendarios de Sinnoh!",
"battle_legendary_dia_pal": "ORAS - ¡Vs Dialga/Palkia!", "battle_legendary_dia_pal": "ORAS - ¡Vs. Dialga/Palkia!",
"battle_legendary_giratina": "ORAS - ¡Vs Giratina!", "battle_legendary_origin_forme": "LA - ¡Vs. Dialga & Palkia, Forma Origen!",
"battle_legendary_arceus": "HGSS - ¡Vs Arceus!", "battle_legendary_giratina": "ORAS - ¡Vs. Giratina!",
"battle_legendary_unova": "BW - ¡Vs Legendarios de Teselia!", "battle_legendary_arceus": "HGSS - ¡Vs. Arceus!",
"battle_legendary_kyurem": "BW - ¡Vs Kyurem!", "battle_legendary_unova": "BW - ¡Vs. legendarios de Teselia!",
"battle_legendary_res_zek": "BW - ¡Vs Reshiram/Zekrom!", "battle_legendary_kyurem": "BW - ¡Vs. Kyurem!",
"battle_legendary_xern_yvel": "XY - ¡Vs Xerneas/Yveltal!", "battle_legendary_res_zek": "BW - ¡Vs. Reshiram/Zekrom!",
"battle_legendary_tapu": "SM - ¡Vs Tapus!", "battle_legendary_xern_yvel": "XY - ¡Vs. Xerneas/Yveltal!",
"battle_legendary_sol_lun": "SM - ¡Vs Solgaleo/Lunala!", "battle_legendary_tapu": "SM - ¡Vs. Tapus!",
"battle_legendary_ub": "SM - ¡Vs Ultraentes!", "battle_legendary_sol_lun": "SM - ¡Vs. Solgaleo/Lunala!",
"battle_legendary_dusk_dawn": "USUM - ¡Vs Necrozma Melena Crepuscular/Alas del Alba!", "battle_legendary_ub": "SM - ¡Vs. Ultraentes!",
"battle_legendary_ultra_nec": "USUM - ¡Vs Ultra-Necrozma!", "battle_legendary_dusk_dawn": "USUM - ¡Vs. Necrozma Melena Crepuscular/Alas del Alba!",
"battle_legendary_zac_zam": "SWSH - ¡Vs Zacian/Zamazenta!", "battle_legendary_ultra_nec": "USUM - ¡Vs. Ultra-Necrozma!",
"battle_legendary_glas_spec": "SWSH - ¡Vs Glastrier/Spectrier!", "battle_legendary_zac_zam": "SWSH - ¡Vs. Zacian/Zamazenta!",
"battle_legendary_calyrex": "SWSH - ¡Vs Calyrex!", "battle_legendary_glas_spec": "SWSH - ¡Vs. Glastrier/Spectrier!",
"battle_legendary_birds_galar": "SWSH - ¡Vs Aves Legendarias de Galar!", "battle_legendary_calyrex": "SWSH - ¡Vs. Calyrex!",
"battle_legendary_ruinous": "SV - ¡Vs Tesoros Funestos!", "battle_legendary_riders": "SWSH - ¡Vs. Calyrex Jinete!",
"battle_legendary_kor_mir": "SV Depths of Area Zero Battle", "battle_legendary_birds_galar": "SWSH - ¡Vs. Aves Legendarias de Galar!",
"battle_legendary_loyal_three": "SV - ¡Vs Compatrones!", "battle_legendary_ruinous": "SV - ¡Vs. Tesoros Funestos!",
"battle_legendary_ogerpon": "SV - ¡Vs Ogerpon!", "battle_legendary_kor_mir": "SV - ¡Batalla en el área Zero!",
"battle_legendary_terapagos": "SV - ¡Vs Terapagos!", "battle_legendary_loyal_three": "SV - ¡Vs. Compatrones!",
"battle_legendary_pecharunt": "SV - ¡Vs Pecharunt!", "battle_legendary_ogerpon": "SV - ¡Vs. Ogerpon!",
"battle_rival": "BW - ¡Vs Rival!", "battle_legendary_terapagos": "SV - ¡Vs. Terapagos!",
"battle_legendary_pecharunt": "SV - ¡Vs. Pecharunt!",
"battle_rival": "BW - ¡Vs. Rival!",
"battle_rival_2": "BW - ¡Vs N!", "battle_rival_2": "BW - ¡Vs N!",
"battle_rival_3": "BW - ¡Vs N (Liga Pokémon)!", "battle_rival_3": "BW - ¡Vs. N (Liga Pokémon)!",
"battle_trainer": "BW - ¡Vs Entrenador!", "battle_trainer": "BW - ¡Vs. entrenador!",
"battle_wild": "BW - ¡Vs Pokémon Salvaje!", "battle_wild": "BW - ¡Vs. Pokémon salvaje!",
"battle_wild_strong": "BW - ¡Vs Pokémon Salvaje Raro!", "battle_wild_strong": "BW - ¡Vs. Pokémon salvaje raro!",
"end_summit": "PMD RTDX - Techo del Cielo", "end_summit": "PMD RTDX - Techo del cielo",
"battle_rocket_grunt": "HGSS Team Rocket Battle", "battle_rocket_grunt": "HGSS - ¡Vs. Team Rocket!",
"battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", "battle_aqua_magma_grunt": "ORAS - ¡Vs. Equipo Aqua & Magma!",
"battle_galactic_grunt": "BDSP Team Galactic Battle", "battle_galactic_grunt": "BDSP - ¡Vs. Equipo Galaxia!",
"battle_plasma_grunt": "BW - ¡Vs Equipo Plasma!", "battle_plasma_grunt": "BW - ¡Vs Equipo Plasma!",
"battle_flare_grunt": "XY Team Flare Battle", "battle_flare_grunt": "XY - ¡Vs. Team Flare!",
"battle_aether_grunt": "SM Aether Foundation Battle", "battle_aether_grunt": "SM - ¡Vs. Fundación Æther!",
"battle_skull_grunt": "SM Team Skull Battle", "battle_skull_grunt": "SM - ¡Vs. Team Skull!",
"battle_macro_grunt": "SWSH Trainer Battle", "battle_macro_grunt": "SWSH - ¡Vs. entrenador!",
"battle_galactic_admin": "BDSP Team Galactic Admin Battle", "battle_galactic_admin": "BDSP - ¡Vs. Comandante del Equipo Galaxia!",
"battle_skull_admin": "SM Team Skull Admin Battle", "battle_skull_admin": "SM - ¡Vs. Comandante del Team Skull!",
"battle_oleana": "SWSH Oleana Battle", "battle_oleana": "SWSH - ¡Vs. Olivia!",
"battle_rocket_boss": "USUM Giovanni Battle", "battle_rocket_boss": "USUM - ¡Vs. Giovanni!",
"battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", "battle_aqua_magma_boss": "ORAS - ¡Vs. Aquiles & Magno!",
"battle_galactic_boss": "BDSP Cyrus Battle", "battle_galactic_boss": "BDSP - ¡Vs. Helio!",
"battle_plasma_boss": "B2W2 Ghetsis Battle", "battle_plasma_boss": "B2W2 - ¡Vs. Ghechis Armonia!",
"battle_flare_boss": "XY Lysandre Battle", "battle_flare_boss": "XY - ¡Vs. Lysson!",
"battle_aether_boss": "SM - ¡Vs. Samina!",
"battle_skull_boss": "SM - ¡Vs. Guzmán!",
"battle_macro_boss": "SWSH - ¡Vs. Rose!",
"abyss": "PMD EoS - Cráter Oscuro", "abyss": "PMD EoS - Cráter Oscuro",
"badlands": "PMD EoS - Valle Desolado", "badlands": "PMD EoS - Valle Desolado",
"beach": "PMD EoS - Risco Calado", "beach": "PMD EoS - Risco Calado",
@ -105,40 +109,40 @@
"graveyard": "PMD EoS - Bosque Misterio", "graveyard": "PMD EoS - Bosque Misterio",
"ice_cave": "PMD EoS - Gran Iceberg", "ice_cave": "PMD EoS - Gran Iceberg",
"island": "PMD EoS - Costa Escarpada", "island": "PMD EoS - Costa Escarpada",
"jungle": "Lmz - Jungle", "jungle": "Lmz - Jungla",
"laboratory": "Firel - Laboratory", "laboratory": "Firel - Laboratorio",
"lake": "PMD EoS - Cueva Cristal", "lake": "PMD EoS - Cueva Cristal",
"meadow": "PMD EoS - Bosque de la Cumbre del Cielo", "meadow": "PMD EoS - Bosque de la Cumbre del Cielo",
"metropolis": "Firel - Metropolis", "metropolis": "Firel - Metrópolis",
"mountain": "PMD EoS - Monte Cuerno", "mountain": "PMD EoS - Monte Cuerno",
"plains": "PMD EoS - Pradera de la Cumbre del Cielo", "plains": "PMD EoS - Pradera de la Cumbre del Cielo",
"power_plant": "PMD EoS - Pradera Destello", "power_plant": "PMD EoS - Pradera Destello",
"ruins": "PMD EoS - Sima Hermética", "ruins": "PMD EoS - Sima Hermética",
"sea": "Andr06 - Marine Mystique", "sea": "Andr06 - Misticismo marino",
"seabed": "Firel - Seabed", "seabed": "Firel - Lecho del mar",
"slum": "Andr06 - Sneaky Snom", "slum": "Andr06 - Snom sigiloso",
"snowy_forest": "PMD EoS - Campo nevado de la Cumbre del Cielo", "snowy_forest": "PMD EoS - Campo nevado de la Cumbre del Cielo",
"space": "Firel - Aether", "space": "Firel - Æther ",
"swamp": "PMD EoS - Mar Circundante", "swamp": "PMD EoS - Mar Circundante",
"tall_grass": "PMD EoS - Bosque Niebla", "tall_grass": "PMD EoS - Bosque Niebla",
"temple": "PMD EoS - Cueva Regia", "temple": "PMD EoS - Cueva Regia",
"town": "PMD EoS - Tema del territorio aleatorio 3", "town": "PMD EoS - Tema del territorio aleatorio 3",
"volcano": "PMD EoS - Cueva Vapor", "volcano": "PMD EoS - Cueva Vapor",
"wasteland": "PMD EoS - Corazón Tierra Oculta", "wasteland": "PMD EoS - Corazón Tierra Oculta",
"encounter_ace_trainer": "BW - Desafío Combate (Entrenador Guay)", "encounter_ace_trainer": "BW - ¡Vs. entrenador guay!",
"encounter_backpacker": "BW - Desafío Combate (Mochilero)", "encounter_backpacker": "BW - ¡Vs. mochilero!",
"encounter_clerk": "BW - Desafío Combate (Empresario)", "encounter_clerk": "BW - ¡Vs. empresario!",
"encounter_cyclist": "BW - Desafío Combate (Ciclista)", "encounter_cyclist": "BW - ¡Vs. ciclista!",
"encounter_lass": "BW - Desafío Combate (Chica)", "encounter_lass": "BW - ¡Vs. chica joven!",
"encounter_parasol_lady": "BW - Desafío Combate (Dama parasol)", "encounter_parasol_lady": "BW - ¡Vs. dama parasol!",
"encounter_pokefan": "BW - Desafío Combate (Pokéfan)", "encounter_pokefan": "BW - ¡Vs. poké-fan!",
"encounter_psychic": "BW - Desafío Combate (Médium)", "encounter_psychic": "BW -¡Vs. médium!",
"encounter_rich": "BW - Desafío Combate (Aristócrata)", "encounter_rich": "BW - ¡Vs. aristócrata!",
"encounter_rival": "BW - Desafío Combate (Cheren)", "encounter_rival": "BW - ¡Vs. Cheren!",
"encounter_roughneck": "BW - Desafío Combate (Calvo)", "encounter_roughneck": "BW - ¡Vs. tío chungo!",
"encounter_scientist": "BW - Desafío Combate (Científico)", "encounter_scientist": "BW - ¡Vs. científico!",
"encounter_twins": "BW - Desafío Combate (Gemelas)", "encounter_twins": "BW - ¡Vs. gemelas!",
"encounter_youngster": "BW - Desafío Combate (Joven)", "encounter_youngster": "BW - ¡Vs. chico joven!",
"heal": "BW - Cura Pokémon", "heal": "BW - Cura Pokémon",
"menu": "PMD EoS - ¡Bienvenidos al mundo de los Pokémon!", "menu": "PMD EoS - ¡Bienvenidos al mundo de los Pokémon!",
"title": "PMD EoS - Tema del menú principal" "title": "PMD EoS - Tema del menú principal"

View File

@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "Duplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates." "description": "Duplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates."
}, },
"TempBattleStatBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "Aumenta la est. {{tempBattleStatName}} de todos los miembros del equipo en 1 nivel durante 5 combates." "description": "Aumenta la est. {{stat}} de todos los miembros del equipo en 1 nivel durante 5 combates."
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%." "description": "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%."
@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": { "AllPokemonLevelIncrementModifierType": {
"description": "Aumenta el nivel de todos los miembros del equipo en {{levels}}." "description": "Aumenta el nivel de todos los miembros del equipo en {{levels}}."
}, },
"PokemonBaseStatBoosterModifierType": { "BaseStatBoosterModifierType": {
"description": "Aumenta la est. {{statName}} base del portador en un 10%.\nCuanto mayores sean tus IVs, mayor será el límite de acumulación." "description": "Aumenta la est. {{stat}} base del portador en un 10%.\nCuanto mayores sean tus IVs, mayor será el límite de acumulación."
}, },
"AllPokemonFullHpRestoreModifierType": { "AllPokemonFullHpRestoreModifierType": {
"description": "Restaura el 100% de los PS de todos los Pokémon." "description": "Restaura el 100% de los PS de todos los Pokémon."
@ -248,6 +248,12 @@
"name": "Periscopio", "name": "Periscopio",
"description": "Aumenta la probabilidad de asestar un golpe crítico." "description": "Aumenta la probabilidad de asestar un golpe crítico."
}, },
"DIRE_HIT": {
"name": "Crítico X",
"extra": {
"raises": "Critical Hit Ratio"
}
},
"LEEK": { "LEEK": {
"name": "Puerro", "name": "Puerro",
"description": "Puerro muy largo y duro que aumenta la probabilidad de asestar un golpe crítico. Debe llevarlo Farfetch'd." "description": "Puerro muy largo y duro que aumenta la probabilidad de asestar un golpe crítico. Debe llevarlo Farfetch'd."
@ -411,25 +417,13 @@
"description": "Polvo muy fino, pero a la vez poderoso, que aumenta la Velocidad. Debe llevarlo Ditto." "description": "Polvo muy fino, pero a la vez poderoso, que aumenta la Velocidad. Debe llevarlo Ditto."
} }
}, },
"TempBattleStatBoosterItem": { "TempStatStageBoosterItem": {
"x_attack": "Ataque X", "x_attack": "Ataque X",
"x_defense": "Defensa X", "x_defense": "Defensa X",
"x_sp_atk": "Ataq. Esp. X", "x_sp_atk": "Ataq. Esp. X",
"x_sp_def": "Def. Esp. X", "x_sp_def": "Def. Esp. X",
"x_speed": "Velocidad X", "x_speed": "Velocidad X",
"x_accuracy": "Precisión X", "x_accuracy": "Precisión X"
"dire_hit": "Crítico X"
},
"TempBattleStatBoosterStatName": {
"ATK": "Ataque",
"DEF": "Defensa",
"SPATK": "Ataq. Esp.",
"SPDEF": "Def. Esp.",
"SPD": "Velocidad",
"ACC": "Precisión",
"CRIT": "Tasa de crítico",
"EVA": "Evasión",
"DEFAULT": "???"
}, },
"AttackTypeBoosterItem": { "AttackTypeBoosterItem": {
"silk_scarf": "Pañuelo seda", "silk_scarf": "Pañuelo seda",
@ -604,6 +598,6 @@
"DRAGON_MEMORY": "Disco dragón", "DRAGON_MEMORY": "Disco dragón",
"DARK_MEMORY": "Disco siniestro", "DARK_MEMORY": "Disco siniestro",
"FAIRY_MEMORY": "Disco hada", "FAIRY_MEMORY": "Disco hada",
"BLANK_MEMORY": "Disco en blanco" "NORMAL_MEMORY": "Disco normal"
} }
} }

View File

@ -1,3 +1,12 @@
{ {
"bypassSpeedChanceApply": "¡Gracias {{itemName}} {{pokemonName}} puede tener prioridad!" "surviveDamageApply": "{{pokemonNameWithAffix}} ha usado {{typeName}} y ha logrado resistir!",
} "turnHealApply": "{{pokemonNameWithAffix}} ha recuperado unos pocos PS gracias a {{typeName}}!",
"hitHealApply": "{{pokemonNameWithAffix}} ha recuperado unos pocos PS gracias a {{typeName}}!",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} ha sido revivido gracias a su {{typeName}}!",
"pokemonResetNegativeStatStageApply": "Las estadísticas bajadas de {{pokemonNameWithAffix}} fueron restauradas gracias a {{typeName}}!",
"moneyInterestApply": "Recibiste intereses de ₽{{moneyAmount}}\ngracias a {{typeName}}!",
"turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} fue absorbido\npor {{pokemonName}}'s {{typeName}}!",
"contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} fue robado por {{pokemonName}}'s {{typeName}}!",
"enemyTurnHealApply": "¡{{pokemonNameWithAffix}}\nrecuperó algunos PS!",
"bypassSpeedChanceApply": "¡Gracias a su {{itemName}}, {{pokemonName}} puede tener prioridad!"
}

View File

@ -1,4 +1,8 @@
{ {
"switchedTwoStatChanges": "{{pokemonName}} ha intercambiado los cambios en {{firstStat}} y {{secondStat}} con los del objetivo!",
"switchedStat": "{{pokemonName}} cambia su {{stat}} por la de su objetivo!",
"sharedGuard": "{{pokemonName}} suma su capacidad defensiva a la del objetivo y la reparte equitativamente!",
"sharedPower": "{{pokemonName}} suma su capacidad ofensiva a la del objetivo y la reparte equitativamente!",
"isChargingPower": "¡{{pokemonName}} está acumulando energía!", "isChargingPower": "¡{{pokemonName}} está acumulando energía!",
"burnedItselfOut": "¡El fuego interior de {{pokemonName}} se ha extinguido!", "burnedItselfOut": "¡El fuego interior de {{pokemonName}} se ha extinguido!",
"startedHeatingUpBeak": "¡{{pokemonName}} empieza\na calentar su pico!", "startedHeatingUpBeak": "¡{{pokemonName}} empieza\na calentar su pico!",
@ -7,5 +11,6 @@
"usedUpAllElectricity": "¡{{pokemonName}} ha descargado toda su electricidad!", "usedUpAllElectricity": "¡{{pokemonName}} ha descargado toda su electricidad!",
"stoleItem": "¡{{pokemonName}} robó el objeto\n{{itemName}} de {{targetName}}!", "stoleItem": "¡{{pokemonName}} robó el objeto\n{{itemName}} de {{targetName}}!",
"statEliminated": "¡Los cambios en estadísticas fueron eliminados!", "statEliminated": "¡Los cambios en estadísticas fueron eliminados!",
"revivalBlessing": "¡{{pokemonName}} ha revivido!" "revivalBlessing": "¡{{pokemonName}} ha revivido!",
} "safeguard": "¡{{targetName}} está protegido por Velo Sagrado!"
}

View File

@ -4,5 +4,11 @@
"mega-y": "Mega {{pokemonName}} Y", "mega-y": "Mega {{pokemonName}} Y",
"primal": "{{pokemonName}} Primigenio", "primal": "{{pokemonName}} Primigenio",
"gigantamax": "G-Max {{pokemonName}}", "gigantamax": "G-Max {{pokemonName}}",
"eternamax": "E-Max {{pokemonName}}" "eternamax": "E-Max {{pokemonName}}",
} "megaChange": "¡{{preName}} ha mega-evolucionado a {{pokemonName}}!",
"gigantamaxChange": "¡{{preName}} ha gigamaxizado a {{pokemonName}}!",
"eternamaxChange": "¡{{preName}} ha eternamaxizado a {{pokemonName}}!",
"revertChange": "¡{{pokemonName}} ha revertido a su forma original!",
"formChange": "¡{{preName}} ha cambiado de forma!",
"disguiseChange": "¡El disfraz ha actuado como señuelo!"
}

View File

@ -7,6 +7,7 @@
"pikachuToughCosplay": "Enmascarada", "pikachuToughCosplay": "Enmascarada",
"pikachuPartner": "Compañero", "pikachuPartner": "Compañero",
"eeveePartner": "Compañero", "eeveePartner": "Compañero",
"pichuSpiky": "Picoreja",
"unownA": "A", "unownA": "A",
"unownB": "B", "unownB": "B",
"unownC": "C", "unownC": "C",
@ -49,6 +50,8 @@
"rotomFrost": "Frío", "rotomFrost": "Frío",
"rotomFan": "Ventilador", "rotomFan": "Ventilador",
"rotomMow": "Corte", "rotomMow": "Corte",
"giratinaAltered": "Modificada",
"shayminLand": "Tierra",
"basculinRedStriped": "Raya Roja", "basculinRedStriped": "Raya Roja",
"basculinBlueStriped": "Raya Azul", "basculinBlueStriped": "Raya Azul",
"basculinWhiteStriped": "Raya Blanca", "basculinWhiteStriped": "Raya Blanca",
@ -56,6 +59,10 @@
"deerlingSummer": "Verano", "deerlingSummer": "Verano",
"deerlingAutumn": "Otoño", "deerlingAutumn": "Otoño",
"deerlingWinter": "Invierno", "deerlingWinter": "Invierno",
"tornadusIncarnate": "Avatar",
"thundurusIncarnate": "Avatar",
"landorusIncarnate": "Avatar",
"keldeoOrdinary": "Habitual",
"meloettaAria": "Lírica", "meloettaAria": "Lírica",
"meloettaPirouette": "Danza", "meloettaPirouette": "Danza",
"froakieBattleBond": "Fuerte Afecto", "froakieBattleBond": "Fuerte Afecto",
@ -87,12 +94,12 @@
"furfrouHeart": "Corazón", "furfrouHeart": "Corazón",
"furfrouStar": "Estrella", "furfrouStar": "Estrella",
"furfrouDiamond": "Diamante", "furfrouDiamond": "Diamante",
"furfrouDebutante": "Debutante", "furfrouDebutante": "Señorita",
"furfrouMatron": "Matrón", "furfrouMatron": "Dama",
"furfrouDandy": "Dandi", "furfrouDandy": "Caballero",
"furfrouLaReine": "La Reine", "furfrouLaReine": "Aristócrata",
"furfrouKabuki": "Kabuki", "furfrouKabuki": "Kabuki",
"furfrouPharaoh": "Faraón", "furfrouPharaoh": "Faraónico",
"pumpkabooSmall": "Pequeño", "pumpkabooSmall": "Pequeño",
"pumpkabooLarge": "Grande", "pumpkabooLarge": "Grande",
"pumpkabooSuper": "Enorme", "pumpkabooSuper": "Enorme",
@ -127,11 +134,15 @@
"magearnaOriginal": "Vetusto", "magearnaOriginal": "Vetusto",
"marshadowZenith": "Cénit", "marshadowZenith": "Cénit",
"sinisteaPhony": "Falsificada", "sinisteaPhony": "Falsificada",
"sinisteaAntique": "Auténtica", "sinisteaAntique": "Genuina",
"eiscueNoIce": "Cara Deshielo", "eiscueNoIce": "Cara Deshielo",
"indeedeeMale": "Macho", "indeedeeMale": "Macho",
"indeedeeFemale": "Hembra", "indeedeeFemale": "Hembra",
"morpekoFullBelly": "Saciada",
"zacianHeroOfManyBattles": "Guerrero avezado",
"zamazentaHeroOfManyBattles": "Guerrero avezado",
"zarudeDada": "Papá", "zarudeDada": "Papá",
"enamorusIncarnate": "Avatar",
"squawkabillyGreenPlumage": "Plumaje Verde", "squawkabillyGreenPlumage": "Plumaje Verde",
"squawkabillyBluePlumage": "Plumaje Azul", "squawkabillyBluePlumage": "Plumaje Azul",
"squawkabillyYellowPlumage": "Plumaje Amarillo", "squawkabillyYellowPlumage": "Plumaje Amarillo",
@ -141,9 +152,19 @@
"tatsugiriStretchy": "Estirada", "tatsugiriStretchy": "Estirada",
"gimmighoulChest": "Cofre", "gimmighoulChest": "Cofre",
"gimmighoulRoaming": "Andante", "gimmighoulRoaming": "Andante",
"poltchageistCounterfeit": "Imitación", "koraidonApexBuild": "Forma Plena",
"poltchageistArtisan": "Original", "koraidonLimitedBuild": "Forma Limitada",
"koraidonSprintingBuild": "Forma Carrera",
"koraidonSwimmingBuild": "Forma Nado",
"koraidonGlidingBuild": "Forma Planeo",
"miraidonUltimateMode": "Modo Pleno",
"miraidonLowPowerMode": "Modo Limitado",
"miraidonDriveMode": "Modo Conducción",
"miraidonAquaticMode": "Modo Flote",
"miraidonGlideMode": "Modo Planeo",
"poltchageistCounterfeit": "Fraudulenta",
"poltchageistArtisan": "Opulenta",
"paldeaTaurosCombat": "Combatiente", "paldeaTaurosCombat": "Combatiente",
"paldeaTaurosBlaze": "Ardiente", "paldeaTaurosBlaze": "Ardiente",
"paldeaTaurosAqua": "Acuático" "paldeaTaurosAqua": "Acuático"
} }

View File

@ -3,12 +3,12 @@
"joinTheDiscord": "¡Únete al Discord!", "joinTheDiscord": "¡Únete al Discord!",
"infiniteLevels": "¡Niveles infinitos!", "infiniteLevels": "¡Niveles infinitos!",
"everythingStacks": "¡Todo se acumula!", "everythingStacks": "¡Todo se acumula!",
"optionalSaveScumming": "¡Trampas guardando opcionales!)!", "optionalSaveScumming": "¡Trampas de guardado opcionales!",
"biomes": "¡35 biomas!", "biomes": "¡35 biomas!",
"openSource": "¡Código abierto!", "openSource": "¡Código abierto!",
"playWithSpeed": "¡Juega a velocidad 5x!", "playWithSpeed": "¡Juega a velocidad 5x!",
"liveBugTesting": Arreglo de bugs sobre la marcha!", "liveBugTesting": Testeo de bugs en directo!",
"heavyInfluence": Influencia Alta en RoR2!", "heavyInfluence": Mucha Influencia de RoR2!",
"pokemonRiskAndPokemonRain": "¡Pokémon Risk y Pokémon Rain!", "pokemonRiskAndPokemonRain": "¡Pokémon Risk y Pokémon Rain!",
"nowWithMoreSalt": "¡Con un 33% más de polémica!", "nowWithMoreSalt": "¡Con un 33% más de polémica!",
"infiniteFusionAtHome": "¡Infinite Fusion en casa!", "infiniteFusionAtHome": "¡Infinite Fusion en casa!",
@ -17,16 +17,16 @@
"mubstitute": "¡Mubstituto!", "mubstitute": "¡Mubstituto!",
"thatsCrazy": "¡De locos!", "thatsCrazy": "¡De locos!",
"oranceJuice": "¡Zumo de narancia!", "oranceJuice": "¡Zumo de narancia!",
"questionableBalancing": Balance cuestionable!", "questionableBalancing": Cambios en balance cuestionables!",
"coolShaders": "¡Shaders impresionantes!", "coolShaders": "¡Shaders impresionantes!",
"aiFree": "¡Libre de IA!", "aiFree": "¡Libre de IA!",
"suddenDifficultySpikes": "¡Saltos de dificultad repentinos!", "suddenDifficultySpikes": "¡Saltos de dificultad repentinos!",
"basedOnAnUnfinishedFlashGame": "¡Basado en un juego Flash inacabado!", "basedOnAnUnfinishedFlashGame": "¡Basado en un juego Flash inacabado!",
"moreAddictiveThanIntended": "¡Más adictivo de la cuenta!", "moreAddictiveThanIntended": "¡Más adictivo de lo previsto!",
"mostlyConsistentSeeds": "¡Semillas CASI consistentes!", "mostlyConsistentSeeds": "¡Semillas CASI consistentes!",
"achievementPointsDontDoAnything": "¡Los Puntos de Logro no hacen nada!", "achievementPointsDontDoAnything": "¡Los Puntos de Logro no hacen nada!",
"youDoNotStartAtLevel": "¡No empiezas al nivel 2000!", "youDoNotStartAtLevel": "¡No empiezas al nivel 2000!",
"dontTalkAboutTheManaphyEggIncident": "¡No hablen del incidente del Huevo Manaphy!", "dontTalkAboutTheManaphyEggIncident": "¡No se habla del Incidente Manaphy!",
"alsoTryPokengine": "¡Prueba también Pokéngine!", "alsoTryPokengine": "¡Prueba también Pokéngine!",
"alsoTryEmeraldRogue": "¡Prueba también Emerald Rogue!", "alsoTryEmeraldRogue": "¡Prueba también Emerald Rogue!",
"alsoTryRadicalRed": "¡Prueba también Radical Red!", "alsoTryRadicalRed": "¡Prueba también Radical Red!",

View File

@ -1 +1,16 @@
{} {
"misty": "Niebla",
"mistyStartMessage": "¡La niebla ha envuelto el terreno de combate!",
"mistyClearMessage": "La niebla se ha disipado.",
"mistyBlockMessage": "¡El campo de niebla ha protegido a {{pokemonNameWithAffix}} ",
"electric": "Eléctrico",
"electricStartMessage": "¡Se ha formado un campo de corriente eléctrica en el terreno\nde combate!",
"electricClearMessage": "El campo de corriente eléctrica ha desaparecido.\t",
"grassy": "Hierba",
"grassyStartMessage": "¡El terreno de combate se ha cubierto de hierba!",
"grassyClearMessage": "La hierba ha desaparecido.",
"psychic": "Psíquico",
"psychicStartMessage": "¡El terreno de combate se ha vuelto muy extraño!",
"psychicClearMessage": "Ha desaparecido la extraña sensación que se percibía en el terreno\nde combate.",
"defaultBlockMessage": "¡El campo {{terrainName}} ha protegido a {{pokemonNameWithAffix}} "
}

View File

@ -1,7 +1,7 @@
{ {
"brock": "Brock", "brock": "Brock",
"misty": "Misty", "misty": "Misty",
"lt_surge": "Tt. Surge", "lt_surge": "Teniente Surge",
"erika": "Erika", "erika": "Erika",
"janine": "Sachiko", "janine": "Sachiko",
"sabrina": "Sabrina", "sabrina": "Sabrina",
@ -23,7 +23,7 @@
"winona": "Alana", "winona": "Alana",
"tate": "Vito", "tate": "Vito",
"liza": "Leti", "liza": "Leti",
"juan": "Galán", "juan": "Galano",
"roark": "Roco", "roark": "Roco",
"gardenia": "Gardenia", "gardenia": "Gardenia",
"maylene": "Brega", "maylene": "Brega",
@ -34,7 +34,7 @@
"volkner": "Lectro", "volkner": "Lectro",
"cilan": "Millo", "cilan": "Millo",
"chili": "Zeo", "chili": "Zeo",
"cress": "Maiz", "cress": "Maíz",
"cheren": "Cheren", "cheren": "Cheren",
"lenora": "Aloe", "lenora": "Aloe",
"roxie": "Hiedra", "roxie": "Hiedra",
@ -57,7 +57,7 @@
"nessa": "Cathy", "nessa": "Cathy",
"kabu": "Naboru", "kabu": "Naboru",
"bea": "Judith", "bea": "Judith",
"allister": "Allistair", "allister": "Alistair",
"opal": "Sally", "opal": "Sally",
"bede": "Berto", "bede": "Berto",
"gordie": "Morris", "gordie": "Morris",
@ -123,30 +123,28 @@
"leon": "Lionel", "leon": "Lionel",
"rival": "Finn", "rival": "Finn",
"rival_female": "Ivy", "rival_female": "Ivy",
"archer": "Archer", "archer": "Atlas",
"ariana": "Ariana", "ariana": "Atenea",
"proton": "Proton", "proton": "Protón",
"petrel": "Petrel", "petrel": "Petrel",
"tabitha": "Tabitha", "tabitha": "Tatiano",
"courtney": "Courtney", "courtney": "Carola",
"shelly": "Shelly", "shelly": "Silvina",
"matt": "Matt", "matt": "Matías",
"mars": "Mars", "mars": "Venus",
"jupiter": "Jupiter", "jupiter": "Ceres",
"saturn": "Saturn", "saturn": "Saturno",
"zinzolin": "Zinzolin", "zinzolin": "Menek",
"rood": "Rood", "rood": "Ruga",
"xerosic": "Xerosic", "xerosic": "Xero",
"bryony": "Bryony", "bryony": "Begonia",
"maxie": "Magno",
"archie": "Aquiles",
"cyrus": "Helio",
"ghetsis": "Ghechis",
"lysandre": "Lysson",
"faba": "Fabio", "faba": "Fabio",
"maxie": "Maxie",
"archie": "Archie",
"cyrus": "Cyrus",
"ghetsis": "Ghetsis",
"lysandre": "Lysandre",
"lusamine": "Samina", "lusamine": "Samina",
"blue_red_double": "Azul y Rojo", "blue_red_double": "Azul y Rojo",
"red_blue_double": "Rojo y Azul", "red_blue_double": "Rojo y Azul",
"tate_liza_double": "Vito y Leti", "tate_liza_double": "Vito y Leti",

View File

@ -92,7 +92,7 @@
"name": "Master Maitre de la Ligue", "name": "Master Maitre de la Ligue",
"name_female": "Master Maitresse de la Ligue" "name_female": "Master Maitresse de la Ligue"
}, },
"TRANSFER_MAX_BATTLE_STAT": { "TRANSFER_MAX_STAT_STAGE": {
"name": "Travail déquipe", "name": "Travail déquipe",
"description": "Utiliser Relais avec au moins une statistique montée à fond." "description": "Utiliser Relais avec au moins une statistique montée à fond."
}, },

View File

@ -47,5 +47,11 @@
"tailwindOnRemovePlayer": "Le vent arrière soufflant\nsur votre équipe sarrête !", "tailwindOnRemovePlayer": "Le vent arrière soufflant\nsur votre équipe sarrête !",
"tailwindOnRemoveEnemy": "Le vent arrière soufflant\nsur léquipe ennemie sarrête !", "tailwindOnRemoveEnemy": "Le vent arrière soufflant\nsur léquipe ennemie sarrête !",
"happyHourOnAdd": "Lambiance est euphorique !", "happyHourOnAdd": "Lambiance est euphorique !",
"happyHourOnRemove": "Lambiance se calme !" "happyHourOnRemove": "Lambiance se calme !",
"safeguardOnAdd": "Un voile mystérieux recouvre\ntout le terrain !",
"safeguardOnAddPlayer": "Un voile mystérieux recouvre\nvotre équipe !",
"safeguardOnAddEnemy": "Un voile mystérieux recouvre\nléquipe ennemie !",
"safeguardOnRemove": "Le terrain nest plus protégé\npar le voile mystérieux !",
"safeguardOnRemovePlayer": "Votre équipe nest plus protégée\npar le voile mystérieux !",
"safeguardOnRemoveEnemy": "Léquipe ennemie nest plus protégée\npar le voile mystérieux !"
} }

View File

@ -1,4 +1,6 @@
{ {
"ending": "@c{smile}Oh ? Tas gagné ?@d{96} @c{smile_eclosed}Jaurais dû le savoir.\nMais de voilà de retour.\n$@c{smile}Cest terminé.@d{64} Tas brisé ce cycle infernal.\n$@c{serious_smile_fists}Tas aussi accompli ton rêve non ?\nTu nas pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que tas fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, jen ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un ptit combat une fois rentrés ?\nSi tes daccord.", "ending": "@c{shock}Tes revenu ?@d{32} Ça veut dire…@d{96} que tas gagné ?!\n@c{smile_ehalf}Jaurais dû men douter.\n$@c{smile_eclosed}Bien sûr… Jai toujours eu ce sentiment.\n@c{smile}Cest fini maintenant hein ? Tas brisé ce cycle.\n$@c{smile_ehalf}Tas aussi accompli ton rêve non ?\nTu nas pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que tas fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}Jdéconne !@d{64} @c{smile}Jamais joublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un ptit combat, comme au bon vieux temps ?",
"ending_female": "@c{shock}Tes revenu ?@d{32} Ça veut dire…@d{96} que tas gagné ?!\n@c{smile_ehalf}Jaurais dû le savoir.\n$@c{smile_eclosed}Bien sûr… Jai toujours eu ce sentiment.\n@c{smile}Cest fini maitenant hein ? Tas brisé ce cycle.\n$@c{smile_ehalf}Tas aussi accompli ton rêve non ?\nTu nas pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que tas fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}Jdéconne !@d{64} @c{smile}Jamais joublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un ptit combat, comme au bon vieux temps ?" "ending_female": "@c{smile}Oh ? Tas gagné ?@d{96} @c{smile_eclosed}Jaurais dû men douter.\nMais te voilà enfin de retour.\n$@c{smile}Cest terminé.@d{64} Tas brisé ce cycle infernal.\n$@c{serious_smile_fists}Tas aussi accompli ton rêve non ?\nTu nas pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que tas fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, jen ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un ptit combat une fois rentrés ?\nSi tes daccord.",
} "ending_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !",
"ending_name": "Les devs"
}

View File

@ -9,7 +9,7 @@
"6": "Allez, cest parti !", "6": "Allez, cest parti !",
"7": "Attention, me voilà !\nTu vas voir comment jsuis fort !", "7": "Attention, me voilà !\nTu vas voir comment jsuis fort !",
"8": "Coucou… Tu veux voir mes bô Pokémon ?", "8": "Coucou… Tu veux voir mes bô Pokémon ?",
"9": "Trève de mondanités. Ramène-toi quand tu le sens !", "9": "Trêve de mondanités. Ramène-toi quand tu le sens !",
"10": "Baisse pas ta garde si tu veux pas pleurer davoir perdu face à un gamin.", "10": "Baisse pas ta garde si tu veux pas pleurer davoir perdu face à un gamin.",
"11": "Jai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !", "11": "Jai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !",
"12": "Incroyable que ty sois parvenu ! Mais la suite va pas être une partie de plaisir.", "12": "Incroyable que ty sois parvenu ! Mais la suite va pas être une partie de plaisir.",
@ -68,7 +68,7 @@
"3": "Hum, tes pas trop laxiste avec tes Pokémon ?\nTrop les chouchouter nest pas bon." "3": "Hum, tes pas trop laxiste avec tes Pokémon ?\nTrop les chouchouter nest pas bon."
}, },
"victory": { "victory": {
"1": "Il est primordial de nourir et développer toutes les caractéristiques de chaque Pokémon.", "1": "Il est primordial de nourrir et développer toutes les caractéristiques de chaque Pokémon.",
"2": "Contrairement à moi, ces Pokémon ont un bon fond.", "2": "Contrairement à moi, ces Pokémon ont un bon fond.",
"3": "Trop déloges peut ruiner les Pokémon et les gens." "3": "Trop déloges peut ruiner les Pokémon et les gens."
}, },
@ -229,7 +229,7 @@
"encounter": { "encounter": {
"1": "Ne te mets pas en travers de la Team Galaxie !", "1": "Ne te mets pas en travers de la Team Galaxie !",
"2": "Sois témoin de la puissance de notre technologie et du futur qui se profile !", "2": "Sois témoin de la puissance de notre technologie et du futur qui se profile !",
"3": "Au nom de la Team Galaxie, jéliminerai quiconque se mettera sur notre route !", "3": "Au nom de la Team Galaxie, jéliminerai quiconque se mettra sur notre route !",
"4": "Prépare ta défaite !", "4": "Prépare ta défaite !",
"5": "Jespère que tes prêt à te prendre une raclée de lespace !", "5": "Jespère que tes prêt à te prendre une raclée de lespace !",
"5_female": "Jespère que tes prête à te prendre une raclée de lespace !" "5_female": "Jespère que tes prête à te prendre une raclée de lespace !"
@ -244,7 +244,7 @@
}, },
"plasma_grunt": { "plasma_grunt": {
"encounter": { "encounter": {
"1": "Pas de quatiers à ceux qui ne suivent pas notre idéal !", "1": "Pas de quartiers à quiconque ne suit pas notre idéal !",
"2": "Si je gagne, tu relâches tous tes Pokémon !", "2": "Si je gagne, tu relâches tous tes Pokémon !",
"3": "Si tu te mets en travers de la Team Plasma, je moccuperai de toi personnellement !", "3": "Si tu te mets en travers de la Team Plasma, je moccuperai de toi personnellement !",
"4": "La Team Plasma va libérer les Pokémon de tous les humains égoïstes dans ton genre !", "4": "La Team Plasma va libérer les Pokémon de tous les humains égoïstes dans ton genre !",
@ -275,6 +275,96 @@
"5": "Jappelle pas ça perdre, jappelle ça échouer avec panache !" "5": "Jappelle pas ça perdre, jappelle ça échouer avec panache !"
} }
}, },
"aether_grunt": {
"encounter": {
"1": "Je vais te mettre ta raclée !",
"2": "Jen ai rien à faire que tu sois une gosse. Tu vas tutoyer les étoiles si tu nous menaces !",
"2_female": "Jen ai rien à faire que tu sois une gosse. Tu vas tutoyer les étoiles si tu nous menaces !",
"3": "Jai pour ordre de ne laisser passer aucun Dresseur, peu importe qui cest !",
"4": "Je vais te montrer le pouvoir du Paradis Æther !",
"5": "Maintenant que tes au courant de ce quil se passe au cœur du Paradis Æther, fais-moi une faveur et disparait !"
},
"victory": {
"1": "Cest plutôt toi qui devrait mapprendre à en mettre…",
"2": "Pardon ? Jai pas compris…",
"3": "Peu importe les ordres, jamais jaurais pu te retenir en fait…",
"4": "Mhh… Il semblerait que jai perdu.",
"5": "Cest plutôt moi qui va disparaitre je crois."
}
},
"faba": {
"encounter": {
"1": "Moi, Directeur Saubohne, je vais te montrer de quel bois je me chauffe !",
"2": "Donc là, lhomme supposé être la dernière ligne défense du Paradis Æther doit affronter un mioche ?",
"2_female": "Donc là, lhomme supposé être la dernière ligne défense du Paradis Æther doit affronter un mioche ?",
"3": "Sil ny a quun seul nom à retenir au sein de la Fondation Æther, cest le mien : Saubohne !"
},
"victory": {
"1": "Gloups !",
"2": "Malheur ! Jai perdu face à un simple enfant ?!",
"2_female": "Malheur ! Jai perdu face à une simple enfant ?!",
"3": "Jai HORREUR des enfants !"
}
},
"skull_grunt": {
"encounter": {
"1": "Oush oush ! On est pas méchants, sauf si tu viens nous allumer la mèche-han !",
"2": "Ce manque de respect, jhallucine ! Tes allé trop loin, le mioche !",
"2_female": "Ce manque de respect, jhallucine ! Tes allée trop loin, la mioche !",
"3": "On est juste des gars et des meufs normaux, on voit un Pokémon on le prend !",
"4": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que tvas jouer frérot.",
"4_female": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que tvas jouer ma reus.",
"5": "Cousin, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu tincrustes chez nous, ça sfait pas ! ♪\n$Mais on est sympa, on a un plan pour toi ! ♪",
"5_female": "Cousine, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu tincrustes chez nous, ça sfait pas ! ♪\n$Mais on est sympa, on a un plan pour toi ! ♪"
},
"victory": {
"1": "Hein ? Cest déjà terminé ?",
"2": "… Ça craint grave! On stire!",
"3": "Ouais de toute on en avait pas bsoin de ton Pokémon… Ah ah…",
"4": "Ouh là, cest bon, jen demandais pas tant…",
"5": "On pèse plus que des Pokémon, tentends ?\nAlors tu vas nous respecter, oush !"
}
},
"plumeria": {
"encounter": {
"1": "Tsk. Tes un gamin tout ce quil y a de plus banal, en fait.",
"1_female": "Tsk. Tes une gamine tout ce quil y a de plus banal, en fait.",
"2": "Abrutis de sbires. Trop incompétents pour arriver à se débarasser de gamins…",
"3": "Si tu touches encore à un cheveu de mes lascars, tu vas pas comprendre cqui tarrive !"
},
"victory": {
"1": "Tsk. Tes pas mauvais. Jte laccorde.",
"1_female": "Tsk. Tes pas mauvaise. Jte laccorde.",
"2": "Tsk. Jdois reconnaitre que ten as dans le ventre.\n$Maintenant, jcomprends pourquoi mes gars narrêtent pas de se faire battre par toi.",
"3": "Tsk. Jcrois que j'ai plus quà assumer ma défaite."
}
},
"macro_grunt": {
"encounter": {
"1": "Hop hop hop ! Terminus !",
"2": "Tes un Dresseur nest-ce pas ?\n$Jai bien peur ce que ne soit pas une excuse suffisante pour nous interrompre dans notre travail.",
"2_female": "Tes une Dresseuse nest-ce pas ?\n$Jai bien peur ce que ne soit pas une excuse suffisante pour nous interrompre dans notre travail.",
"3": "Je travaille à Macro Cosmos Assurances !\nBesoin dune assurance-vie ?"
},
"victory": {
"1": "Je nai dautre choix que respectueusement me retirer.",
"2": "Mon argent de poche…\nPlus quà manger des pâtes pour la fin du mois…",
"3": "Chez Macro Cosmos, rien nest comparable à notre dévotion au travail !"
}
},
"oleana": {
"encounter": {
"1": "Je ne laisserai personne interférer avec les projets du président Shehroz.",
"2": "Je vois que vous avez su vous défaire de mes subalternes.\n$Mais assez joué. Il est temps de rentrer chez vous, maintenant.",
"3": "Je gagnerai en votre nom, monsieur le président."
},
"victory": {
"1": "*soupir* Comment ai-je fait pour perdre ainsi…?\nJe ne suis vraiment pas à la hauteur…",
"2": "Ah! Quelle erreur… Je naurais pas dû sous-estimer un Dresseur de ton calibre…",
"2_female": "Ah! Quelle erreur… Je naurais pas dû sous-estimer une Dresseuse de ton calibre…",
"3": "*soupir* Je suis fatiguée parton…"
}
},
"rocket_boss_giovanni_1": { "rocket_boss_giovanni_1": {
"encounter": { "encounter": {
"1": "Bien. Je dois admettre que je suis impressionné de te voir ici !" "1": "Bien. Je dois admettre que je suis impressionné de te voir ici !"
@ -468,7 +558,7 @@
"4": "Voir un tel jardin rempli de fleurs est si apaisant…" "4": "Voir un tel jardin rempli de fleurs est si apaisant…"
}, },
"victory": { "victory": {
"1": "Bien joué, cest mértié.", "1": "Bien joué, cest mérité.",
"2": "Dommage, on samusait si bien…", "2": "Dommage, on samusait si bien…",
"3": "Oh non, le combat est terminé…", "3": "Oh non, le combat est terminé…",
"4": "Aaah, ça fait du bien !\nMerci, jen avais besoin." "4": "Aaah, ça fait du bien !\nMerci, jen avais besoin."
@ -505,15 +595,15 @@
}, },
"rival": { "rival": {
"encounter": { "encounter": {
"1": "@c{smile}Ah, je te cherchais ! Je savais que tétais pressé de partir, mais je mattendais quand même à un au revoir…\n$@c{smile_eclosed}Tas finalement décidé de réaliser ton rêve ?\nJai peine à y croire.\n$@c{serious_smile_fists}Vu que tes là, ça te dis un petit combat ?\nJe voudrais quand même massurer que tes prêt.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que tas !" "1": "@c{smile}Ah, je te cherchais ! Je savais que tétais pressée de partir, mais je mattendais quand même à un au revoir…\n$@c{smile_eclosed}Tas finalement décidé de réaliser ton rêve ?\nJai peine à y croire.\n$@c{serious_smile_fists}Vu que tes là, ça te dis un petit combat ?\nJe voudrais quand même massurer que tes prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que tas !"
}, },
"victory": { "victory": {
"1": "@c{shock}Wah… Tu mas vraiment lavé.\nTes vraiment un débutant ?\n$@c{smile}Tas peut-être eu de la chance, mais…\nPeut-être que tarriveras jusquau bout du chemin.\n$Dailleurs, le prof ma demandé de te filer ces objets.\nIls ont lair sympas.\n$@c{serious_smile_fists}Bonne chance à toi !" "1": "@c{shock}Wah… Tu mas vraiment lavé.\nTes vraiment une débutante ?\n$@c{smile}Tas peut-être eu de la chance, mais…\nPeut-être que tarriveras jusquau bout du chemin.\n$Dailleurs, le prof ma demandé de te filer ces objets.\nIls ont lair sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
} }
}, },
"rival_female": { "rival_female": {
"encounter": { "encounter": {
"1": "@c{smile_wave}Ah, te voilà ! Je tai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}Tas décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de mavoir oubliée,\nà une conditon. @c{smile_wave_wink}Que tu maffronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant davoir commencé, hein ?" "1": "@c{smile_wave}Ah, te voilà ! Je tai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}Tas décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de mavoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu maffronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant davoir commencé, hein ?"
}, },
"victory": { "victory": {
"1": "@c{shock}Tu viens de commencer et tes déjà si fort ?!@d{96}\n@c{angry}Tas triché non ? Avoue !\n$@c{smile_wave_wink}Jdéconne !@d{64} @c{smile_eclosed}Jai perdu dans les règles…\nJai le sentiment que tu vas très bien ten sortir.\n$@c{smile}Dailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !" "1": "@c{shock}Tu viens de commencer et tes déjà si fort ?!@d{96}\n@c{angry}Tas triché non ? Avoue !\n$@c{smile_wave_wink}Jdéconne !@d{64} @c{smile_eclosed}Jai perdu dans les règles…\nJai le sentiment que tu vas très bien ten sortir.\n$@c{smile}Dailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !"
@ -521,10 +611,10 @@
}, },
"rival_2": { "rival_2": {
"encounter": { "encounter": {
"1": "@c{smile}Hé, toi aussi tes là ?\n@c{smile_eclosed}Toujours invaincu, hein… ?\n$@c{serious_mopen_fists}Je sais que jai lair de tavoir suivi ici, mais cest pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait davoir une revanche depuis que tu mas battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nCest parti !" "1": "@c{smile}Hé, toi aussi tes là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que jai lair de tavoir suivie ici, mais cest pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait davoir une revanche depuis que tu mas battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nCest parti !"
}, },
"victory": { "victory": {
"1": "@c{neutral_eclosed}Oh. Je crois que jai trop pris la confiance.\n$@c{smile}Pas grave, cest OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus mentrainer !\n\n$@c{smile}Ah, et pas que taies réellement besoin daide, mais jai ça en trop sur moi qui pourrait tintéresser.\n\n$@c{serious_smile_fists}Mais nespère plus en avoir dautres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi et profite bien de lévènement !" "1": "@c{neutral_eclosed}Oh. Je crois que jai trop pris la confiance.\n$@c{smile}Pas grave, cest OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus mentrainer !\n\n$@c{smile}Ah, et pas que taies réellement besoin daide, mais jai ça en trop sur moi qui pourrait tintéresser.\n\n$@c{serious_smile_fists}Mais nespère plus en avoir dautres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi !"
} }
}, },
"rival_2_female": { "rival_2_female": {
@ -532,7 +622,7 @@
"1": "@c{smile_wave}Hé, sympa de te croiser ici. Tas toujours lair invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je tespionne pas.\n@c{smile_eclosed}Cest juste que jétais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que cest pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, tas intérêt à tout donner !" "1": "@c{smile_wave}Hé, sympa de te croiser ici. Tas toujours lair invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je tespionne pas.\n@c{smile_eclosed}Cest juste que jétais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que cest pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, tas intérêt à tout donner !"
}, },
"victory": { "victory": {
"1": "@c{neutral}Je… Jétais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus mentrainer !\n$@c{smile_wave}Jai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}Cétaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup et profite bien de lévènement !" "1": "@c{neutral}Je… Jétais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus mentrainer !\n$@c{smile_wave}Jai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}Cétaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup !"
}, },
"defeat": { "defeat": {
"1": "Je suppose que cest parfois normal de perdre…" "1": "Je suppose que cest parfois normal de perdre…"
@ -540,7 +630,7 @@
}, },
"rival_3": { "rival_3": {
"encounter": { "encounter": {
"1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}Tes… toujours invaincu ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nCest plus pareil sans toi au village.\n$@c{serious}Je sais que cest égoïste, mais jai besoin dexpier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, cest juste irréaliste.\nGrandir, cest parfois aussi savoir perdre.\n$@c{neutral_eclosed}Tas un beau parcours, mais il y a encore tellement à venir et ça va pas sarranger. @c{neutral}Tes prêt pour ça ?\n$@c{serious_mopen_fists}Si tu les, alors prouve-le." "1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}Tes… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nCest plus pareil sans toi au village.\n$@c{serious}Je sais que cest égoïste, mais jai besoin dexpier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, cest juste irréaliste.\nGrandir, cest parfois aussi savoir perdre.\n$@c{neutral_eclosed}Tas un beau parcours, mais il y a encore tellement à venir et ça va pas sarranger. @c{neutral}Tes prête pour ça ?\n$@c{serious_mopen_fists}Si tu les, alors prouve-le."
}, },
"victory": { "victory": {
"1": "@c{angry_mhalf}Cest lunaire… Jai presque fait que mentrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?" "1": "@c{angry_mhalf}Cest lunaire… Jai presque fait que mentrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?"
@ -559,7 +649,7 @@
}, },
"rival_4": { "rival_4": {
"encounter": { "encounter": {
"1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}Jai appris à maximiser tout mon potentiel en mentrainant darrachepied.\n$@c{smile}Cest fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien na dimportance désormais, pas tant que jaurai pas gagné.\n$@c{neutral_eclosed}Jai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, cest pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prêt." "1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}Jai appris à maximiser tout mon potentiel en mentrainant darrachepied.\n$@c{smile}Cest fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien na dimportance désormais, pas tant que jaurai pas gagné.\n$@c{neutral_eclosed}Jai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, cest pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prête."
}, },
"victory": { "victory": {
"1": "@c{neutral}Que…@d{64} Qui es-tu ?" "1": "@c{neutral}Que…@d{64} Qui es-tu ?"
@ -597,7 +687,7 @@
}, },
"rival_6": { "rival_6": {
"encounter": { "encounter": {
"1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}Jai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}Cest même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}Jignore si je serai capable de laccomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il ma lair familier, comme si jy avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et cest comme si quelque chose ici me parlait.\n$Comme si cétait tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus quun lointain souvenir.\n$@c{neutral_eclosed}Dailleurs, qui peut dire aujourdhui quils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu tarrêtes, ça naura jamais de fin et tes le seul à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que cest la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu nas aucune chance." "1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}Jai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}Cest même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}Jignore si je serai capable de laccomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il ma lair familier, comme si jy avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et cest comme si quelque chose ici me parlait.\n$Comme si cétait tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus quun lointain souvenir.\n$@c{neutral_eclosed}Dailleurs, qui peut dire aujourdhui quils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu tarrêtes, ça naura jamais de fin et tes la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que cest la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu nas aucune chance."
}, },
"victory": { "victory": {
"1": "@c{smile_eclosed}Jai fait ce que javais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison." "1": "@c{smile_eclosed}Jai fait ce que javais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison."

View File

@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "Double les chances de tomber sur un combat double pendant {{battleCount}} combats." "description": "Double les chances de tomber sur un combat double pendant {{battleCount}} combats."
}, },
"TempBattleStatBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "Augmente dun cran {{tempBattleStatName}} pour toute léquipe pendant 5 combats." "description": "Augmente dun cran {{stat}} pour toute léquipe pendant 5 combats."
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "Augmente de 20% la puissance des capacités de type {{moveType}} dun Pokémon." "description": "Augmente de 20% la puissance des capacités de type {{moveType}} dun Pokémon."
@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": { "AllPokemonLevelIncrementModifierType": {
"description": "Fait monter toute léquipe de {{levels}} niveau·x." "description": "Fait monter toute léquipe de {{levels}} niveau·x."
}, },
"PokemonBaseStatBoosterModifierType": { "BaseStatBoosterModifierType": {
"description": "Augmente de 10% {{statName}} de base de son porteur. Plus les IV sont hauts, plus il peut en porter." "description": "Augmente de 10% {{stat}} de base de son porteur. Plus les IV sont hauts, plus il peut en porter."
}, },
"AllPokemonFullHpRestoreModifierType": { "AllPokemonFullHpRestoreModifierType": {
"description": "Restaure tous les PV de toute léquipe." "description": "Restaure tous les PV de toute léquipe."
@ -183,6 +183,7 @@
"SOOTHE_BELL": { "name": "Grelot Zen" }, "SOOTHE_BELL": { "name": "Grelot Zen" },
"SCOPE_LENS": { "name": "Lentilscope", "description": "Une lentille qui augmente dun cran le taux de critiques du porteur." }, "SCOPE_LENS": { "name": "Lentilscope", "description": "Une lentille qui augmente dun cran le taux de critiques du porteur." },
"DIRE_HIT": { "name": "Muscle +", "extra": { "raises": "Taux de critique" } },
"LEEK": { "name": "Poireau", "description": "À faire tenir à Canarticho ou Palarticho. Un poireau très long et solide qui augmente de 2 crans le taux de critiques." }, "LEEK": { "name": "Poireau", "description": "À faire tenir à Canarticho ou Palarticho. Un poireau très long et solide qui augmente de 2 crans le taux de critiques." },
"EVIOLITE": { "name": "Évoluroc", "description": "Augmente de 50% la Défense et Déf. Spé. si le porteur peut évoluer, 25% aux fusions dont une moitié le peut encore." }, "EVIOLITE": { "name": "Évoluroc", "description": "Augmente de 50% la Défense et Déf. Spé. si le porteur peut évoluer, 25% aux fusions dont une moitié le peut encore." },
@ -250,28 +251,14 @@
"METAL_POWDER": { "name": "Poudre Métal", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Défense." }, "METAL_POWDER": { "name": "Poudre Métal", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Défense." },
"QUICK_POWDER": { "name": "Poudre Vite", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Vitesse." } "QUICK_POWDER": { "name": "Poudre Vite", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Vitesse." }
}, },
"TempBattleStatBoosterItem": { "TempStatStageBoosterItem": {
"x_attack": "Attaque +", "x_attack": "Attaque +",
"x_defense": "Défense +", "x_defense": "Défense +",
"x_sp_atk": "Atq. Spé. +", "x_sp_atk": "Atq. Spé. +",
"x_sp_def": "Déf. Spé. +", "x_sp_def": "Déf. Spé. +",
"x_speed": "Vitesse +", "x_speed": "Vitesse +",
"x_accuracy": "Précision +", "x_accuracy": "Précision +"
"dire_hit": "Muscle +"
}, },
"TempBattleStatBoosterStatName": {
"ATK": "lAttaque",
"DEF": "la Défense",
"SPATK": "lAtq. Spé.",
"SPDEF": "la Déf. Spé.",
"SPD": "la Vitesse",
"ACC": "la précision",
"CRIT": "le taux de critique",
"EVA": "lesquive",
"DEFAULT": "???"
},
"AttackTypeBoosterItem": { "AttackTypeBoosterItem": {
"silk_scarf": "Mouchoir Soie", "silk_scarf": "Mouchoir Soie",
"black_belt": "Ceinture Noire", "black_belt": "Ceinture Noire",
@ -450,6 +437,6 @@
"DRAGON_MEMORY": "ROM Dragon", "DRAGON_MEMORY": "ROM Dragon",
"DARK_MEMORY": "ROM Ténèbres", "DARK_MEMORY": "ROM Ténèbres",
"FAIRY_MEMORY": "ROM Fée", "FAIRY_MEMORY": "ROM Fée",
"BLANK_MEMORY": "ROM Vierge" "NORMAL_MEMORY": "ROM Normal"
} }
} }

View File

@ -3,7 +3,7 @@
"turnHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par les {{typeName}} !", "turnHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par les {{typeName}} !",
"hitHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par le {{typeName}} !", "hitHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par le {{typeName}} !",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} a repris connaissance\navec sa {{typeName}} et est prêt à se battre de nouveau !", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} a repris connaissance\navec sa {{typeName}} et est prêt à se battre de nouveau !",
"pokemonResetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l{{typeName}} !", "resetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l{{typeName}} !",
"moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}}  dintérêts !", "moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}}  dintérêts !",
"turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !", "turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !",
"contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l{{typeName}} de {{pokemonName}} !", "contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l{{typeName}} de {{pokemonName}} !",

View File

@ -3,6 +3,10 @@
"cutHpPowerUpMove": "{{pokemonName}} sacrifie des PV\net augmente la puissance ses capacités !", "cutHpPowerUpMove": "{{pokemonName}} sacrifie des PV\net augmente la puissance ses capacités !",
"absorbedElectricity": "{{pokemonName}} absorbe de lélectricité !", "absorbedElectricity": "{{pokemonName}} absorbe de lélectricité !",
"switchedStatChanges": "{{pokemonName}} permute\nles changements de stats avec ceux de sa cible !", "switchedStatChanges": "{{pokemonName}} permute\nles changements de stats avec ceux de sa cible !",
"switchedTwoStatChanges": "{{pokemonName}} permute les changements de {{firstStat} et de {{secondStat}} avec ceux de sa cible !",
"switchedStat": "{{pokemonName}} et sa cible échangent leur {{stat}} !",
"sharedGuard": "{{pokemonName}} additionne sa garde à celle de sa cible et redistribue le tout équitablement !",
"sharedPower": "{{pokemonName}} additionne sa force à celle de sa cible et redistribue le tout équitablement !",
"goingAllOutForAttack": "{{pokemonName}} a pris\ncette capacité au sérieux !", "goingAllOutForAttack": "{{pokemonName}} a pris\ncette capacité au sérieux !",
"regainedHealth": "{{pokemonName}}\nrécupère des PV !", "regainedHealth": "{{pokemonName}}\nrécupère des PV !",
"keptGoingAndCrashed": "{{pokemonName}}\nsécrase au sol !", "keptGoingAndCrashed": "{{pokemonName}}\nsécrase au sol !",
@ -61,5 +65,6 @@
"suppressAbilities": "Le talent de {{pokemonName}}\na été rendu inactif !", "suppressAbilities": "Le talent de {{pokemonName}}\na été rendu inactif !",
"revivalBlessing": "{{pokemonName}} a repris connaissance\net est prêt à se battre de nouveau !", "revivalBlessing": "{{pokemonName}} a repris connaissance\net est prêt à se battre de nouveau !",
"swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !", "swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !",
"exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !" "exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !",
"safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !"
} }

View File

@ -13,7 +13,8 @@
"SPD": "Vitesse", "SPD": "Vitesse",
"SPDshortened": "Vit", "SPDshortened": "Vit",
"ACC": "Précison", "ACC": "Précison",
"EVA": "Esquive" "EVA": "Esquive",
"HPStat": "PV"
}, },
"Type": { "Type": {
"UNKNOWN": "Inconnu", "UNKNOWN": "Inconnu",
@ -37,4 +38,4 @@
"FAIRY": "Fée", "FAIRY": "Fée",
"STELLAR": "Stellaire" "STELLAR": "Stellaire"
} }
} }

View File

@ -13,5 +13,32 @@
"metFragment": { "metFragment": {
"normal": "rencontré au N.{{level}},\n{{biome}}.", "normal": "rencontré au N.{{level}},\n{{biome}}.",
"apparently": "apparemment rencontré au N.{{level}},\n{{biome}}." "apparently": "apparemment rencontré au N.{{level}},\n{{biome}}."
},
"natureFragment": {
"Hardy": "{{nature}}",
"Lonely": "{{nature}}",
"Brave": "{{nature}}",
"Adamant": "{{nature}}",
"Naughty": "{{nature}}",
"Bold": "{{nature}}",
"Docile": "{{nature}}",
"Relaxed": "{{nature}}",
"Impish": "{{nature}}",
"Lax": "{{nature}}",
"Timid": "{{nature}}",
"Hasty": "{{nature}}",
"Serious": "{{nature}}",
"Jolly": "{{nature}}",
"Naive": "{{nature}}",
"Modest": "{{nature}}",
"Mild": "{{nature}}",
"Quiet": "{{nature}}",
"Bashful": "{{nature}}",
"Rash": "{{nature}}",
"Calm": "{{nature}}",
"Gentle": "{{nature}}",
"Sassy": "{{nature}}",
"Careful": "{{nature}}",
"Quirky": "{{nature}}"
} }
} }

View File

@ -101,8 +101,8 @@
"workers": "Ouvriers", "workers": "Ouvriers",
"youngster": "Gamin", "youngster": "Gamin",
"rocket_grunt": "Sbire de la Team Rocket", "rocket_grunt": "Sbire de la Team Rocket",
"rocket_grunt_female": "Sbire de la Team Rocket",
"rocket_grunts": "Sbires de la Team Rocket", "rocket_grunts": "Sbires de la Team Rocket",
"rocket_grunt_female": "Sbire de la Team Rocket",
"magma_grunt": "Sbire de la Team Magma", "magma_grunt": "Sbire de la Team Magma",
"magma_grunt_female": "Sbire de la Team Magma", "magma_grunt_female": "Sbire de la Team Magma",
"magma_grunts": "Sbires de la Team Magma", "magma_grunts": "Sbires de la Team Magma",
@ -123,6 +123,7 @@
"aether_grunts": "Employés de la Fondation Æther", "aether_grunts": "Employés de la Fondation Æther",
"skull_grunt": "Sbire de la Team Skull", "skull_grunt": "Sbire de la Team Skull",
"skull_grunt_female": "Sbire de la Team Skull", "skull_grunt_female": "Sbire de la Team Skull",
"skull_grunts": "Sbires de la Team Skull",
"macro_grunt": "Employé de Macro Cosmos", "macro_grunt": "Employé de Macro Cosmos",
"macro_grunt_female": "Employée de Macro Cosmos", "macro_grunt_female": "Employée de Macro Cosmos",
"macro_grunts": "Employés de Macro Cosmos" "macro_grunts": "Employés de Macro Cosmos"

View File

@ -80,7 +80,7 @@
"100_RIBBONS": { "100_RIBBONS": {
"name": "Campione Lega Assoluta" "name": "Campione Lega Assoluta"
}, },
"TRANSFER_MAX_BATTLE_STAT": { "TRANSFER_MAX_STAT_STAGE": {
"name": "Lavoro di Squadra", "name": "Lavoro di Squadra",
"description": "Trasferisci almeno sei bonus statistiche tramite staffetta" "description": "Trasferisci almeno sei bonus statistiche tramite staffetta"
}, },
@ -261,4 +261,4 @@
"name": "Buona la prima!", "name": "Buona la prima!",
"description": "Completa la modalità sfida 'Un nuovo inizio'." "description": "Completa la modalità sfida 'Un nuovo inizio'."
} }
} }

View File

@ -1 +1,8 @@
{} {
"safeguardOnAdd": "Un velo mistico ricopre il campo!",
"safeguardOnAddPlayer": "Un velo mistico ricopre la tua squadra!",
"safeguardOnAddEnemy": "Un velo mistico ricopre la squadra avversaria!",
"safeguardOnRemove": "Il campo non è più protetto da Salvaguardia!",
"safeguardOnRemovePlayer": "La tua squadra non è più protetta da Salvaguardia!",
"safeguardOnRemoveEnemy": "La squadra avversaria non è più protetta da Salvaguardia!"
}

View File

@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "Raddoppia la possibilità di imbattersi in doppie battaglie per {{battleCount}} battaglie." "description": "Raddoppia la possibilità di imbattersi in doppie battaglie per {{battleCount}} battaglie."
}, },
"TempBattleStatBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "Aumenta {{tempBattleStatName}} di un livello a tutti i Pokémon nel gruppo per 5 battaglie." "description": "Aumenta la statistica {{stat}} di un livello\na tutti i Pokémon nel gruppo per 5 battaglie."
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "Aumenta la potenza delle mosse di tipo {{moveType}} del 20% per un Pokémon." "description": "Aumenta la potenza delle mosse di tipo {{moveType}} del 20% per un Pokémon."
@ -59,10 +59,10 @@
"description": "Aumenta il livello di un Pokémon di {{levels}}." "description": "Aumenta il livello di un Pokémon di {{levels}}."
}, },
"AllPokemonLevelIncrementModifierType": { "AllPokemonLevelIncrementModifierType": {
"description": "Aumenta i livell di tutti i Pokémon della squadra di {{levels}}." "description": "Aumenta il livello di tutti i Pokémon della squadra di {{levels}}."
}, },
"PokemonBaseStatBoosterModifierType": { "BaseStatBoosterModifierType": {
"description": "Aumenta {{statName}} di base del possessore del 10%." "description": "Aumenta l'/la {{stat}} di base del possessore del 10%."
}, },
"AllPokemonFullHpRestoreModifierType": { "AllPokemonFullHpRestoreModifierType": {
"description": "Restituisce il 100% dei PS a tutti i Pokémon." "description": "Restituisce il 100% dei PS a tutti i Pokémon."
@ -248,6 +248,12 @@
"name": "Mirino", "name": "Mirino",
"description": "Lente che aumenta la probabilità di sferrare brutti colpi." "description": "Lente che aumenta la probabilità di sferrare brutti colpi."
}, },
"DIRE_HIT": {
"name": "Supercolpo",
"extra": {
"raises": "Tasso di brutti colpi"
}
},
"LEEK": { "LEEK": {
"name": "Porro", "name": "Porro",
"description": "Strumento da dare a Farfetch'd. Lungo gambo di porro che aumenta la probabilità di sferrare brutti colpi." "description": "Strumento da dare a Farfetch'd. Lungo gambo di porro che aumenta la probabilità di sferrare brutti colpi."
@ -411,25 +417,13 @@
"description": "Strumento da dare a Ditto. Questa strana polvere, fine e al contempo dura, aumenta la Velocità." "description": "Strumento da dare a Ditto. Questa strana polvere, fine e al contempo dura, aumenta la Velocità."
} }
}, },
"TempBattleStatBoosterItem": { "TempStatStageBoosterItem": {
"x_attack": "Attacco X", "x_attack": "Attacco X",
"x_defense": "Difesa X", "x_defense": "Difesa X",
"x_sp_atk": "Att. Speciale X", "x_sp_atk": "Att. Speciale X",
"x_sp_def": "Dif. Speciale X", "x_sp_def": "Dif. Speciale X",
"x_speed": "Velocità X", "x_speed": "Velocità X",
"x_accuracy": "Precisione X", "x_accuracy": "Precisione X"
"dire_hit": "Supercolpo"
},
"TempBattleStatBoosterStatName": {
"ATK": "Attacco",
"DEF": "Difesa",
"SPATK": "Att. Speciale",
"SPDEF": "Dif. Speciale",
"SPD": "Velocità",
"ACC": "Precisione",
"CRIT": "Tasso di brutti colpi",
"EVA": "Elusione",
"DEFAULT": "???"
}, },
"AttackTypeBoosterItem": { "AttackTypeBoosterItem": {
"silk_scarf": "Sciarpa seta", "silk_scarf": "Sciarpa seta",
@ -604,6 +598,6 @@
"DRAGON_MEMORY": "ROM Drago", "DRAGON_MEMORY": "ROM Drago",
"DARK_MEMORY": "ROM Buio", "DARK_MEMORY": "ROM Buio",
"FAIRY_MEMORY": "ROM Folletto", "FAIRY_MEMORY": "ROM Folletto",
"BLANK_MEMORY": "ROM Vuota" "NORMAL_MEMORY": "ROM Normale"
} }
} }

View File

@ -3,7 +3,7 @@
"turnHealApply": "{{pokemonNameWithAffix}} recupera alcuni PS con\nil/la suo/a {{typeName}}!", "turnHealApply": "{{pokemonNameWithAffix}} recupera alcuni PS con\nil/la suo/a {{typeName}}!",
"hitHealApply": "{{pokemonNameWithAffix}} recupera alcuni PS con\nil/la suo/a {{typeName}}!", "hitHealApply": "{{pokemonNameWithAffix}} recupera alcuni PS con\nil/la suo/a {{typeName}}!",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} torna in forze\ngrazie al/alla suo/a {{typeName}}!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} torna in forze\ngrazie al/alla suo/a {{typeName}}!",
"pokemonResetNegativeStatStageApply": "La riduzione alle statistiche di {{pokemonNameWithAffix}}\nviene annullata grazie al/alla suo/a {{typeName}}!", "resetNegativeStatStageApply": "La riduzione alle statistiche di {{pokemonNameWithAffix}}\nviene annullata grazie al/alla suo/a {{typeName}}!",
"moneyInterestApply": "Ricevi un interesse pari a {{moneyAmount}}₽\ngrazie al/allo/a {{typeName}}!", "moneyInterestApply": "Ricevi un interesse pari a {{moneyAmount}}₽\ngrazie al/allo/a {{typeName}}!",
"turnHeldItemTransferApply": "Il/l'/lo/la {{itemName}} di {{pokemonNameWithAffix}} è stato assorbito\ndal {{typeName}} di {{pokemonName}}!", "turnHeldItemTransferApply": "Il/l'/lo/la {{itemName}} di {{pokemonNameWithAffix}} è stato assorbito\ndal {{typeName}} di {{pokemonName}}!",
"contactHeldItemTransferApply": "Il/l'/lo/la {{itemName}} di {{pokemonNameWithAffix}} è stato rubato\nda {{pokemonName}} con {{typeName}}!", "contactHeldItemTransferApply": "Il/l'/lo/la {{itemName}} di {{pokemonNameWithAffix}} è stato rubato\nda {{pokemonName}} con {{typeName}}!",

Some files were not shown because too many files have changed in this diff Show More