Compare commits

..

99 Commits

Author SHA1 Message Date
Lugiad a5bafe5c47
Corrections to French menu.ts (#932)
* Corrections to French menu.ts

* Corrections to French menu.ts
2024-05-15 16:43:28 -05:00
José Ricardo Fleury Oliveira 1b751dddec Update translations in pt_BR/menu.ts and pt_BR/weather.ts 2024-05-15 15:25:35 -04:00
José Ricardo Fleury Oliveira 04866e503a
Minor translating fixes and Save and Quit in ptBR (#928)
* Minor fixes in menu-ui-handler

* Minor fix in menu.ts
2024-05-15 15:24:47 -04:00
Lugiad 2778eb2651
French weather.ts corrections (#923)
* French weather.ts corrections

* French weather.ts corrections
2024-05-15 13:05:07 -05:00
Surinam b8dff030aa
Weather & evolution i18n with french translations (#380)
Co-authored-by: Marius MICHAUD <marius@lacomstore.com>
2024-05-15 12:31:18 -05:00
Adrian Torrano 44c0d29c1d
Add missing translation for learning move (#879)
* add missing translation for learn move

* fix countdown german translation

* Fix countdown French translation

---------

Co-authored-by: Lugiad <adrien.grivel@hotmail.fr>
2024-05-15 11:42:34 -05:00
Flashfyre 78f7965304 Revert "add logic to conditionally align window (#851)"
This reverts commit 7769c06393.
2024-05-15 12:22:32 -04:00
Adrian Torrano 7769c06393
add logic to conditionally align window (#851) 2024-05-15 11:01:20 -05:00
Lugiad afcffab90f
Added Gen names localizations in Starter Selection UI (+"Uncaught" translation in French) (#907)
* Added Gen names localizations in Starter Selection UI

* Added Gen names localizations in Starter Selection UI

* Added Gen names localizations in Starter Selection UI

* Added Gen names localizations in Starter Selection UI

* Added Gen names localizations in Starter Selection UI

* Added Gen names localizations in Starter Selection UI

* Added Gen names localizations in Starter Selection UI

* Added Gen names localizations in Starter Selection UI

* Added Gen names localizations in Starter Selection UI

* Added Gen names localizations in Starter Selection UI

* Added Gen names localizations in Starter Selection UI

* Update starter-select-ui-handler.ts

* Update starter-select-ui-handler.ts

* Added Gen names localizations in Starter Selection UI

* Added Gen names localizations in Starter Selection UI

* Updated with recent pt BR edits
2024-05-15 10:57:48 -05:00
Xavion3 9197f9f070 Limit rare eggs to e4+ and fix trainer boss check
Also fixes weighting to account for adjusted level ranges
2024-05-15 11:55:47 -04:00
Lugiad fcffa000c5 French translation Save and Quit 2024-05-15 11:45:44 -04:00
Flashfyre ac2e78129e Add Save and Quit option to replace Return to Title 2024-05-15 11:42:18 -04:00
Tempoanon 38e3022d06
Add missing biomes for camoflauge (#912) 2024-05-15 10:32:10 -05:00
José Ricardo Fleury Oliveira 9b8af7ad71
Fixed the ptBR text in starter menu popping out of the info box... (#902)
* Fixes the ptBR text in starter menu popping out of the info box and added language personalization, changed some ptBR natures and ordered thw switch case in alphabetic order

* Small fix
2024-05-15 10:13:35 -05:00
Flashfyre adf5690383 Migrate data for offline users 2024-05-15 10:55:17 -04:00
mbroll d32dbddd48
Update ability.ts (#910)
Water bubble should double the damage of water moves. The current multiplier in-game is x1.
2024-05-15 09:21:52 -05:00
Flashfyre 3c8d919ef8 Revert "Implemented Power Split and Guard Split (#699)"
This reverts commit 0b75a5210a.
2024-05-15 10:13:29 -04:00
Alessandro Bruzzese 3aeef50507
Update Italian starter-select-ui-handler.ts (#901) 2024-05-15 09:08:32 -05:00
karl-police 3ef08e433a Correct a translation due to misleading token 2024-05-15 09:58:45 -04:00
Flashfyre 5f3fd17fdd Add Quick Claw item 2024-05-15 09:42:45 -04:00
Flashfyre 58e59369ed Revert "Readded removed args, inverted 'simulated' instead of removing (#874)"
This reverts commit e89dbad5f1.
2024-05-15 09:12:03 -04:00
Frederico Santos 0b75a5210a
Implemented Power Split and Guard Split (#699)
* Implemented Power Split and Guard Split

* Update changeStat method to use summonData for Pokemon stats

This commit modifies the `changeStat` method in the `Pokemon` class to use the `summonData` object for updating Pokemon stats instead of directly modifying the `stats` object. This change ensures that the updated stats are correctly reflected in the `summonData` object, which is used for battle calculations and other related operations.

Refactor the `getStat` method to check if `summonData` exists and return the corresponding stat value from `summonData.stats` if it does. Otherwise, return the stat value from the `stats` object.

This change improves the accuracy of stat calculations during battles and ensures consistency between the `stats` and `summonData` objects.

* Added documentation for Power Split and Guard Split + linting

* removed incorrect files

* Removed incorrect folder

* removed unnecessary import

* Added documentation for getStat and changeSummonStat methods

* New description for getStat()

* Adjusting function descriptions

* adjusted descriptions according to guideline

---------

Co-authored-by: Frederico Santos <frederico.santos@fivedegrees.nl>
2024-05-15 07:41:40 -05:00
andrew-wilcox 1f5b2726b5
added auto hit and 2x damage from certain moves when targeting a pokemon that used minimize (#824)
* added auto hit and 2x damage from certain moves when targetting a pokemon who used minimize

* review fixes and bad merge

* review fixes and bad merge v2

* changed to be double damage instead of power for the minimize condition

* added TSdocs for function]

* remove ability to add minimize tag to dynamax-mons

* status cannot be applied to max-mons, and falls off if they dynamax

* updated doccumentation

* Update move.ts

---------

Co-authored-by: Cae Rulius <cae@polywhack.com>
Co-authored-by: Benjamin Odom <bennybroseph@gmail.com>
2024-05-15 07:36:34 -05:00
Jannik Tappert 512016faef
Sacrifical Moves (that dont require a target like explosion or self d… (#691)
* Sacrifical Moves (that dont require a target like explosion or self destruct) now also work if the target is flying, diving etc.

There is also a new catagorie of moves. "SacrificalMovesOnHit" for all moves that need to hit for them to be sacrifical like MEMENTO

* Added comments, added (what i think is TSDoc) to functions and classes. Removed empty lines i introduced

* .

* Added fixes for the Review by TempsRay.

* Added missing *

* Remove Target Requirement of SacrificialAttr

* Update move.ts

---------

Co-authored-by: Benjamin Odom <bennybroseph@gmail.com>
2024-05-15 04:10:20 -05:00
notpatchmaybe e89dbad5f1
Readded removed args, inverted 'simulated' instead of removing (#874) 2024-05-15 03:56:06 -05:00
Madmadness65 1e224a6ac4 Allow Original Color Magearna to be obtained
Another completely cosmetic Pokémon form (and a nice looking one at that!).
2024-05-15 01:46:24 -05:00
Flashfyre 4a7da3e5f6 Fix export not working 2024-05-15 02:01:30 -04:00
Flashfyre 70ecc51f50 Don't clear local data in offline mode 2024-05-15 01:54:15 -04:00
Flashfyre 751120e77e Fix crashing in offline mode 2024-05-15 01:42:36 -04:00
Flashfyre 7e0e4ecd6d Call saveSystem on gacha pull outside of current battle 2024-05-15 01:29:07 -04:00
Flashfyre c6973365cb Change last save interval to correct value 2024-05-15 00:56:17 -04:00
Samuel H 67c18a15e2
Implement client session and re-implement hybrid saving (#888)
* Implement client session and re-implement hybrid saving (WiP)

* Fixes for hybrid saving

* Add local data clears where applicable

* Include client session ID in system update

* Change save threshold from 5 waves to 10 waves or 5 minutes
2024-05-15 00:52:06 -04:00
Benjamin Odom 835b00d457
Added Comments to Base Classes (#860) 2024-05-14 23:19:12 -05:00
karl-police 6bed21770d
Recoil (#863) 2024-05-14 20:36:49 -05:00
cimds aeeebcbf38 Update biomes.ts: Cave's Beach link changed to Lake
Replacing Cave's Beach link with Lake would weaken the "water loop", a situation where players get continually routed back to Beach, leading to frustration. Lake is a crossroads biome that connects to much of the rest of the game, while still connecting to Beach, making it not a drastic detour.

Infernal Vulpix simulated a hypothetical 10k wave endless run for me to see the difference this change would have on biome frequencies. Apologies for the broken formatting from me copying this from Discord:

                   Odds      Alt
Abyss              1.98%     2.40%
Badlands           3.57%     3.46%
Beach              6.30%     4.06%
Cave               5.87%     5.91%
Construction Site  3.90%     4.83%
Desert             1.70%     1.70%
Dojo               2.05%     2.58%
Factory            2.03%     2.57%
Fairy Cave         0.86%     0.59%
Forest             5.79%     5.64%
Grass              2.12%     2.48%
Graveyard          2.03%     2.39%
Ice Cave           4.00%     2.68%
Island             0.79%     0.53%
Jungle             2.80%     2.72%
Laboratory         0.13%     0.13%
Lake               3.37%     6.26%
Meadow             2.93%     2.74%
Metropolis         2.33%     2.55%
Mountain           2.86%     2.40%
Plains             5.96%     6.94%
Power Plant        2.06%     2.63%
Ruins              2.51%     2.59%
Sea                6.16%     4.07%
Seabed             2.90%     2.04%
Slum               2.58%     2.67%
Snowy Forest       3.79%     2.60%
Space              0.37%     0.41%
Swamp              3.79%     4.64%
Tall Grass         4.18%     4.73%
Temple             2.98%     3.06%
Town               0.00%     0.00%
Volcano            2.58%     2.29%
Wasteland          0.72%     0.72%
End                2.00%     2.00%
2024-05-14 18:54:39 -04:00
Flashfyre f505c7f5fd Fix issues with formatLargeNumber 2024-05-14 16:12:31 -04:00
karl-police 06ec265bcd battle.ts Translation Consistency and fixes 2024-05-14 15:43:33 -04:00
Nexllon df499e2f71
offline mode - adds daily run and fixes clear freezes (#834)
* offline mode - adds daily run and fixes clear freezes

* removed unused import
2024-05-14 15:42:30 -04:00
daniel_and 58ec2ebd89 meta charset should be ordered before any elements containing text 2024-05-14 14:40:24 -04:00
Ethan 7d3cf577a6
Implented Gen VII Sheer Cold Changes (#349)
* Made Sheer Cold not affect Ice Types, as well as implementing the Gen VII change of 20% for non ice types.

* Pushed accurancy change

* Updated and separated the accuracy attribute and the Ice no effect attribute

* Fixed the OHKO attribute (accidentally removed) and fixed multiplier

* Updated attribute names, as well as making the move cancelled instead of 0x multiplier

* Added TSDoc comments

* Updated accuracy logic

* Changed the text response for Sheer Cold immunity

* Added immune to the HitResult enum
2024-05-14 13:01:37 -05:00
Brandon Rodgers 06c3611d06
Ability Corrosion (#744)
* Ability Corrosion

Implemented Corrosion Partially.
Tested against:
- Poison Powder
- Toxic
- Dire Claw
- Sludge Bomb
- Psycho Shift

They all work as expected

Missing ability Magic Bounce to test against.

* Added TSDoc Documentation

Added documentation to the new IgnoreTypeStatusEffectImunnityAbAttr and added comments to the checks for this ability attribute.

* Added More Documentation

Add comment into Phases for what sourcePokemon is for.
Renamed source to sourcePokemon onto trySetStatus and canSetStatus.
Added TSDoc head for what sourcePokemon is and anything else I am aware of what they are used for.

* Removed unfinished TSDoc

Removed TSDoc headers due to not having enough understanding to fill out all of the parameters

* Fix Formatting and Reorder Parameters

* Update arena-tag.ts

* Update phases.ts

* Update ability.ts

Added access modifiers to my class and the class I compared to.

---------

Co-authored-by: Benjamin Odom <bennybroseph@gmail.com>
2024-05-14 13:00:37 -05:00
Alessandro Bruzzese 89411d7b3e
Update Italian ability-trigger.ts (#861) 2024-05-14 10:38:52 -05:00
Xavion3 d1187c7174
Modify legend gacha to be even split (#858)
* Modify egg gacha to be even split

* Update to a daily cycle

* Add spaces

* Removes now unused getSunday function
2024-05-14 11:34:40 -04:00
Madmadness65 7061bb0d70 Lower starter cost of some mythical Pokémon
Deoxys, Victini, and Genesect should not be in the Legendary egg pool, to make them consistent with the other mythicals.
Also additional learnset changes for a couple mythicals with no/lacking starting moves.
2024-05-14 01:21:28 -05:00
Madmadness65 37f672789d Give Delibird an actual level up learnset
No longer is it stuck with just two moves via level up. It now has a thematic set of level up moves based on other similar Pokémon and its TM compatibility.
2024-05-14 00:56:45 -05:00
Madmadness65 856757fd56 Add custom Jungle biome music by Lmz 2024-05-13 23:46:28 -05:00
James Diefenbach 81349816d9
changed formIndex to getFormkey in EvolutionItem constructor (#844)
Co-authored-by: James Diefenbach <z5421232@ad.unsw.edu.au>
2024-05-13 23:01:08 -05:00
AJ Fontaine fe7a4180a2
Give level 1 moves back that were made unusable in SV (#842) 2024-05-13 21:21:49 -05:00
Lugiad c0426cfe6b
Update French move.ts (#845) 2024-05-13 21:19:28 -05:00
Madmadness65 4e279224c5 Update Let's Go moves to their Gen 8 functionality
This primarily just affects Zippy Zap, as it loses its always crit attribute for an evasion increase (Associated localization strings will need updating). Also implemented Sparkly Swirl's status curing attribute.

Also included is a wild evolution delay for some stone evolution Pokémon that was previously overlooked.
2024-05-13 20:59:38 -05:00
Lugiad c42441294b
Update French ability-trigger.ts (#836) 2024-05-13 20:17:41 -05:00
Douglas Marchione de Souza de3ca08704
Fix Air_Lock ability to express when it is switched in (#765)
* Airlock ability now properly announces when it is
in field when the pokemon with it is switched in

* Set message as in the original games, also created
a new attribute for in switch messages to not have
the pokemon name required to be on it.

* Committing language changes (i18n function)

* Revert "Committing language changes (i18n function)"

This reverts commit 2a3152003b.

* Changed message variable name
2024-05-13 20:09:46 -05:00
Flashfyre 7943633481 Revert "Implement hybrid saving for optimization"
This reverts commit b45cd2f7e7.
2024-05-13 20:56:28 -04:00
Flashfyre ab92bc61ba Revert "Only show save icon on server sync"
This reverts commit 5d0dbfff98.
2024-05-13 20:56:19 -04:00
YounesM 9d90cc3e10
corrected uturn flip turn crash (#596) 2024-05-13 18:52:36 -05:00
LaukkaE af86bdeb06
Prevent applying item boosts when power is <1 (#795)
* Prevent applying item boosts when power is <1

* add comments
2024-05-13 18:48:47 -05:00
LaukkaE 1d29ca7974
Fix Comeuppance (#781) 2024-05-13 18:48:22 -05:00
JackGilham 19d244ee94
Update modifier-type.ts (#636)
Issue#613.

Have added additional EvolutionItemModifierType condition that prevents none base form pokes from taking Evo Items.
2024-05-13 18:38:27 -05:00
Benjamin Odom 1c56efc860
Added Ability Triggers Localization (#811)
Adds the base files needed to start translating Ability trigger messages. Provides one as an example.
2024-05-13 18:12:28 -05:00
José Ricardo Fleury Oliveira 74ee3329f8
Added "Uncaught" localization in Starter Selection UI (#831) 2024-05-13 18:02:44 -05:00
José Ricardo Fleury Oliveira 3a3611dfc0
Minor translation fixes (#829) 2024-05-13 17:59:09 -05:00
Flashfyre 5d0dbfff98 Only show save icon on server sync 2024-05-13 18:37:48 -04:00
Flashfyre b45cd2f7e7 Implement hybrid saving for optimization 2024-05-13 18:17:57 -04:00
Flashfyre 7e5c7fb4f7 Don't allow trainer egg moves before level 60 and no rare egg moves at all 2024-05-13 17:03:53 -04:00
Griffin Zody ed87293867
Fix Zygarge Complete form changing back into 50% (#786) 2024-05-13 14:53:23 -05:00
Matthew Olker 47c9eb547d fix Rare Shiny Groudon back sprite 2024-05-13 15:29:50 -04:00
José Ricardo Fleury Oliveira e2dfbc4aa5
Added new entries (#823) 2024-05-13 13:55:15 -05:00
Jannik Tappert 487b1d26d1
Added german localization to the new entries in starter-select-ui-handler.ts (#822) 2024-05-13 13:24:55 -05:00
Matthew Olker 40993793cb Show default icon for missing starter icon 2024-05-13 14:23:34 -04:00
Matt Ross 4e6cf2a6ac
Facade should ignore burn damage reduction (#530)
* Facade should ignore burn damage reduction

* update order of burn conditions

* remove unnecessary space

* undo facade check in apply

* Rework facade bypassing burn as move attribute

* Only check ability attribute if move attribute was false

* Add missing semicolon

* Add tsdoc comment

* Add comment to burn damage reduction class

* Added changes from Discord thread

---------

Co-authored-by: Benjamin Odom <bennybroseph@gmail.com>
2024-05-13 13:06:15 -05:00
Matt Ross fa60e002e8
Fixes some variable damage moves not working with tinted lens (#759)
* Fixes some variable damage moves not working with abilities

* Rework as new ability attribute

* Update variable base power check to original location

* formatting

* Add tsdoc comments

* add floor for potential non int multipliers

* Update pokemon.ts

---------

Co-authored-by: Benjamin Odom <bennybroseph@gmail.com>
2024-05-13 13:05:09 -05:00
Lugiad 610de916a0
Update French starter-select-ui-handler.ts (#821) 2024-05-13 13:01:30 -05:00
Madmadness65 34a4f86982 Add a couple starter select localization entries
The passive ability's "Locked" and "Disabled" strings can now be localized.
2024-05-13 12:50:56 -05:00
Flashfyre 9a49691a9e Add max options to language select
Add max options to language select (fixes #819)
2024-05-13 13:10:01 -04:00
José Ricardo Fleury Oliveira 2a32189ea1
Added Portuguese (Brazil) translations (#766)
* Add support for Portuguese (Brazil) locale, except for moves and abilities.

* All ptBR translations, names of moves and abilities maintained in english.

* Small fixes

* Updated Frisk and fixed Plus and Minus descriptions

* Changed the settings label to "Português (BR)"
2024-05-13 11:18:24 -05:00
Alvin Zou 6d73500aeb
Update Frisk descriptions (#784) 2024-05-13 11:08:55 -05:00
Jannik Tappert e4d3f73dee
ToggleSize is now dependend on language + added some missing german translations (#797) 2024-05-13 11:06:26 -05:00
Alessandro Bruzzese b189289890
Updated italian localization (#815)
Updated:
 - `it/fight-ui-handler`
- `it/growth`
- `it/nature`
2024-05-13 10:52:31 -05:00
alpaca 09287c22ba
implements telepathy (#307) 2024-05-13 05:59:39 -05:00
lucfd b36c23fae1
Implemented Curious Medicine (#263)
* implemented supersweet syrup

* implemented curious medicine

* removed sneaky test overrides

* removed sneaky test overrides x2

* updated to new language-agnostic format, removed supersweet syrup

* fixed whitespace

* Update ability.ts

---------

Co-authored-by: Benjamin Odom <bennybroseph@gmail.com>
2024-05-13 04:57:17 -05:00
Marcos 3cc990f5d2
Fully implemented floral healing (#250)
* Created BoostedHealAttr and implemented Floral Healing

* Update move.ts

---------

Co-authored-by: Benjamin Odom <bennybroseph@gmail.com>
2024-05-13 04:27:38 -05:00
Matthew 21a0a0276d
add pokeball override (#793) 2024-05-13 03:40:53 -05:00
Flashfyre 8d96ec7666 Add canonical link 2024-05-13 01:43:04 -04:00
Tempoanon e9c09070df
Stench should not trigger on status moves (#800) 2024-05-13 00:24:07 -05:00
Benjamin Odom 9ee5fec41d
Added Passives to the Summary Screen (#703)
* Added passives to the Summary Screen

Adds the ability to view passives on the Summary screen. Just like in the starter select, you can only see the passive once it is unlocked.

There is a small pixel button prompt which helps indicate you are able to press the button to view the passive. This buttons shows an A when gamepad support is enabled and a Z otherwise.

* Update summary-ui-handler.ts

* Updated for Legacy Support
2024-05-12 23:38:28 -04:00
Samuel H 2b9b63e3f3
Add combined save between waves (#777) 2024-05-12 23:01:05 -04:00
James Diefenbach 9a09d790f0
Rockruff dusk form not evolving (#700)
* changed nonfunctioning rockruff form check to ability check for own tempo for dusk form evos

* testing changes

* rockruff OT uses formIndex for dusk form evolution, removed temporary debug rockruff getFormIndex changes

* reverted overrides

* fixed spacing issue

* evolution times revised

* revised dawn and dusk evos for rockruff

* reordering evo times for consistency

* removed unused imports (abilities, attackTypeBoosterModifierType)

---------

Co-authored-by: James Diefenbach <z5421232@ad.unsw.edu.au>
2024-05-12 22:00:46 -05:00
Xavion3 22097a0c95 Fix getSunday function 2024-05-12 21:22:50 -04:00
Flashfyre 347972d103 Remove boosted shiny rate 2024-05-12 20:45:41 -04:00
Tempoanon e61c63f6c8
Implement innards out (#569)
* Implement innards out

* remove log statement

* Some cleanup

* Added comment
2024-05-13 07:07:31 +10:00
Matthew e195c6d799
Show Default Pokemon icon for missing shiny icon (#802) 2024-05-13 06:41:02 +10:00
Douglas Marchione de Souza 9e453c5b0f
Fix sturdy (#604)
* Fixes sturdy to stop popping up even if not used

* Made changes to better the code, also added
a check for wonder_guard 1hp

* Refined code, as requested by bennybroseph

* Made a small fix and added better comments in
relation to interaction with Wonder_guard ability
2024-05-12 14:53:54 -05:00
Benjamin Odom 512cc5b965
Fix Duplicate Egg Moves (#736)
Fixes an issue where egg moves could get duplicated onto a starter Pokémon's moveset.
2024-05-12 14:56:37 -04:00
phynor 2176d5854d
fixed typo in german pokemon names (#794) 2024-05-12 13:55:57 -05:00
Lugiad dbb8f4c217
French translation of growth.ts (#763) 2024-05-12 14:42:56 -04:00
phynor 7b7df5b245
More german translations (#612)
* added more german translations

* added german translation for move.ts

* more german translations

* ability.ts wih german translation updated

* added missing german translation for abilites.ts

* added more missing translations

* changed description of frisk
2024-05-12 12:53:07 -05:00
Madmadness65 20a09c2b92 Remove species form encounter code for Scatterbug line and Calyrex
The Vivillon forms can all be encountered properly now, and Calyrex's forms have since been removed from the wild encounter pool, requiring a form change item to obtain.
2024-05-12 11:33:27 -05:00
Benjamin Odom 79a87e1c65 Update pokemon.ts 2024-05-12 10:27:54 -04:00
LaukkaE ced74efc52
fix isGrounded check (#774) 2024-05-12 06:30:18 -05:00
126 changed files with 12695 additions and 4636 deletions

View File

@ -44,7 +44,8 @@ Check out our [Trello Board](https://trello.com/b/z10B703R/pokerogue-board) to s
- Arata Iiyoshi - Arata Iiyoshi
- Atsuhiro Ishizuna - Atsuhiro Ishizuna
- Pokémon Black/White 2 - Pokémon Black/White 2
- Firel (Additional biome themes) - Firel (Custom Metropolis and Laboratory biome music)
- Lmz (Custom Jungle biome music)
- edifette (Title screen music) - edifette (Title screen music)
### 🎵 Sound Effects ### 🎵 Sound Effects

View File

@ -2,6 +2,7 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" />
<title>PokéRogue</title> <title>PokéRogue</title>
<meta name="description" content="A Pokémon fangame heavily inspired by the roguelite genre. Battle endlessly while gathering stacking items, exploring many different biomes, and reaching Pokémon stats you never thought possible." /> <meta name="description" content="A Pokémon fangame heavily inspired by the roguelite genre. Battle endlessly while gathering stacking items, exploring many different biomes, and reaching Pokémon stats you never thought possible." />
<meta name="theme-color" content="#da3838" /> <meta name="theme-color" content="#da3838" />
@ -11,7 +12,7 @@
<meta property="og:image" content="https://pokerogue.net/logo512.png" /> <meta property="og:image" content="https://pokerogue.net/logo512.png" />
<link rel="apple-touch-icon" href="./logo512.png" /> <link rel="apple-touch-icon" href="./logo512.png" />
<link rel="shortcut icon" type="image/png" href="./logo512.png" /> <link rel="shortcut icon" type="image/png" href="./logo512.png" />
<meta charset="UTF-8" /> <link rel="canonical" href="https://pokerogue.net" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<style type="text/css"> <style type="text/css">
@font-face { @font-face {

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

View File

@ -7,18 +7,29 @@ export interface UserInfo {
} }
export let loggedInUser: UserInfo = null; export let loggedInUser: UserInfo = null;
export const clientSessionId = Utils.randomString(32);
export function updateUserInfo(): Promise<[boolean, integer]> { export function updateUserInfo(): Promise<[boolean, integer]> {
return new Promise<[boolean, integer]>(resolve => { return new Promise<[boolean, integer]>(resolve => {
if (bypassLogin) { if (bypassLogin) {
loggedInUser = { username: 'Guest', lastSessionSlot: -1 };
let lastSessionSlot = -1; let lastSessionSlot = -1;
for (let s = 0; s < 2; s++) { for (let s = 0; s < 5; s++) {
if (localStorage.getItem(`sessionData${s ? s : ''}`)) { if (localStorage.getItem(`sessionData${s ? s : ''}_${loggedInUser.username}`)) {
lastSessionSlot = s; lastSessionSlot = s;
break; break;
} }
} }
loggedInUser = { username: 'Guest', lastSessionSlot: lastSessionSlot }; loggedInUser.lastSessionSlot = lastSessionSlot;
// Migrate old data from before the username was appended
[ 'data', 'sessionData', 'sessionData1', 'sessionData2', 'sessionData3', 'sessionData4' ].map(d => {
if (localStorage.hasOwnProperty(d)) {
if (localStorage.hasOwnProperty(`${d}_${loggedInUser.username}`))
localStorage.setItem(`${d}_${loggedInUser.username}_bak`, localStorage.getItem(`${d}_${loggedInUser.username}`));
localStorage.setItem(`${d}_${loggedInUser.username}`, localStorage.getItem(d));
localStorage.removeItem(d);
}
});
return resolve([ true, 200 ]); return resolve([ true, 200 ]);
} }
Utils.apiFetch('account/info', true).then(response => { Utils.apiFetch('account/info', true).then(response => {

View File

@ -88,6 +88,7 @@ export default class BattleScene extends SceneBase {
public uiInputs: UiInputs; public uiInputs: UiInputs;
public sessionPlayTime: integer = null; public sessionPlayTime: integer = null;
public lastSavePlayTime: integer = null;
public masterVolume: number = 0.5; public masterVolume: number = 0.5;
public bgmVolume: number = 1; public bgmVolume: number = 1;
public seVolume: number = 1; public seVolume: number = 1;
@ -452,6 +453,8 @@ export default class BattleScene extends SceneBase {
initSession(): void { initSession(): void {
if (this.sessionPlayTime === null) if (this.sessionPlayTime === null)
this.sessionPlayTime = 0; this.sessionPlayTime = 0;
if (this.lastSavePlayTime === null)
this.lastSavePlayTime = 0;
if (this.playTimeTimer) if (this.playTimeTimer)
this.playTimeTimer.destroy(); this.playTimeTimer.destroy();
@ -464,6 +467,8 @@ export default class BattleScene extends SceneBase {
this.gameData.gameStats.playTime++; this.gameData.gameStats.playTime++;
if (this.sessionPlayTime !== null) if (this.sessionPlayTime !== null)
this.sessionPlayTime++; this.sessionPlayTime++;
if (this.lastSavePlayTime !== null)
this.lastSavePlayTime++;
} }
}); });
@ -647,6 +652,15 @@ export default class BattleScene extends SceneBase {
const icon = this.add.sprite(0, 0, pokemon.getIconAtlasKey(ignoreOverride)); const icon = this.add.sprite(0, 0, pokemon.getIconAtlasKey(ignoreOverride));
icon.setFrame(pokemon.getIconId(true)); icon.setFrame(pokemon.getIconId(true));
// Temporary fix to show pokemon's default icon if variant icon doesn't exist
if (icon.frame.name != pokemon.getIconId(true)) {
console.log(`${pokemon.name}'s variant icon does not exist. Replacing with default.`)
const temp = pokemon.shiny;
pokemon.shiny = false;
icon.setTexture(pokemon.getIconAtlasKey(ignoreOverride));
icon.setFrame(pokemon.getIconId(true));
pokemon.shiny = temp;
}
icon.setOrigin(0.5, 0); icon.setOrigin(0.5, 0);
container.add(icon); container.add(icon);
@ -732,6 +746,9 @@ export default class BattleScene extends SceneBase {
this.pokeballCounts = Object.fromEntries(Utils.getEnumValues(PokeballType).filter(p => p <= PokeballType.MASTER_BALL).map(t => [ t, 0 ])); this.pokeballCounts = Object.fromEntries(Utils.getEnumValues(PokeballType).filter(p => p <= PokeballType.MASTER_BALL).map(t => [ t, 0 ]));
this.pokeballCounts[PokeballType.POKEBALL] += 5; this.pokeballCounts[PokeballType.POKEBALL] += 5;
if (Overrides.POKEBALL_OVERRIDE.active) {
this.pokeballCounts = Overrides.POKEBALL_OVERRIDE.pokeballs;
}
this.modifiers = []; this.modifiers = [];
this.enemyModifiers = []; this.enemyModifiers = [];
@ -987,12 +1004,15 @@ export default class BattleScene extends SceneBase {
case Species.SAWSBUCK: case Species.SAWSBUCK:
case Species.FROAKIE: case Species.FROAKIE:
case Species.FROGADIER: case Species.FROGADIER:
case Species.SCATTERBUG:
case Species.SPEWPA:
case Species.VIVILLON: case Species.VIVILLON:
case Species.FLABEBE: case Species.FLABEBE:
case Species.FLOETTE: case Species.FLOETTE:
case Species.FLORGES: case Species.FLORGES:
case Species.FURFROU: case Species.FURFROU:
case Species.ORICORIO: case Species.ORICORIO:
case Species.MAGEARNA:
case Species.SQUAWKABILLY: case Species.SQUAWKABILLY:
case Species.TATSUGIRI: case Species.TATSUGIRI:
case Species.PALDEA_TAUROS: case Species.PALDEA_TAUROS:

View File

@ -3,7 +3,7 @@ import { Type } from "./type";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { BattleStat, getBattleStatName } from "./battle-stat"; import { BattleStat, getBattleStatName } from "./battle-stat";
import { PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases";
import { getPokemonMessage } from "../messages"; import { getPokemonMessage, getPokemonPrefix } from "../messages";
import { Weather, WeatherType } from "./weather"; import { Weather, WeatherType } from "./weather";
import { BattlerTag } from "./battler-tags"; import { BattlerTag } from "./battler-tags";
import { BattlerTagType } from "./enums/battler-tag-type"; import { BattlerTagType } from "./enums/battler-tag-type";
@ -144,7 +144,7 @@ export class BlockRecoilDamageAttr extends AbAttr {
} }
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) {
return getPokemonMessage(pokemon, `'s ${abilityName}\nprotected it from recoil!`); return i18next.t('abilityTriggers:blockRecoilDamage', {pokemonName: `${getPokemonPrefix(pokemon)}${pokemon.name}`, abilityName: abilityName});
} }
} }
@ -249,11 +249,14 @@ export class PreDefendFormChangeAbAttr extends PreDefendAbAttr {
} }
export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr { export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr {
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean { applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (pokemon.getMaxHp() <= 1 && (pokemon.getHpRatio() < 1 || (args[0] as Utils.NumberHolder).value < pokemon.hp)) if (pokemon.hp === pokemon.getMaxHp() &&
return false; pokemon.getMaxHp() > 1 && //Checks if pokemon has wonder_guard (which forces 1hp)
(args[0] as Utils.NumberHolder).value >= pokemon.hp){ //Damage >= hp
return pokemon.addTag(BattlerTagType.STURDY, 1); return pokemon.addTag(BattlerTagType.STURDY, 1);
} }
return false
}
} }
export class BlockItemTheftAbAttr extends AbAttr { export class BlockItemTheftAbAttr extends AbAttr {
@ -712,7 +715,7 @@ export class PostDefendContactApplyStatusEffectAbAttr extends PostDefendAbAttr {
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
if (move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.status && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance)) { if (move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.status && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance)) {
const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)];
return attacker.trySetStatus(effect, true); return attacker.trySetStatus(effect, true, pokemon);
} }
return false; return false;
@ -988,6 +991,42 @@ export class MoveTypeChangeAttr extends PreAttackAbAttr {
} }
} }
/**
* Class for abilities that boost the damage of moves
* For abilities that boost the base power of moves, see VariableMovePowerAbAttr
* @param damageMultiplier the amount to multiply the damage by
* @param condition the condition for this ability to be applied
*/
export class DamageBoostAbAttr extends PreAttackAbAttr {
private damageMultiplier: number;
private condition: PokemonAttackCondition;
constructor(damageMultiplier: number, condition: PokemonAttackCondition){
super(true);
this.damageMultiplier = damageMultiplier;
this.condition = condition;
}
/**
*
* @param pokemon the attacker pokemon
* @param passive N/A
* @param defender the target pokemon
* @param move the move used by the attacker pokemon
* @param args Utils.NumberHolder as damage
* @returns true if the function succeeds
*/
applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: PokemonMove, args: any[]): boolean {
if (this.condition(pokemon, defender, move.getMove())) {
const power = args[0] as Utils.NumberHolder;
power.value = Math.floor(power.value * this.damageMultiplier);
return true;
}
return false;
}
}
export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr { export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr {
private condition: PokemonAttackCondition; private condition: PokemonAttackCondition;
private powerMultiplier: number; private powerMultiplier: number;
@ -1138,7 +1177,7 @@ export class PostAttackApplyStatusEffectAbAttr extends PostAttackAbAttr {
applyPostAttack(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { applyPostAttack(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
if (pokemon != attacker && (!this.contactRequired || move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) { if (pokemon != attacker && (!this.contactRequired || move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) {
const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)];
return attacker.trySetStatus(effect, true); return attacker.trySetStatus(effect, true, pokemon);
} }
return false; return false;
@ -1368,6 +1407,23 @@ export class PostSummonMessageAbAttr extends PostSummonAbAttr {
} }
} }
export class PostSummonUnnamedMessageAbAttr extends PostSummonAbAttr {
//Attr doesn't force pokemon name on the message
private message: string;
constructor(message: string) {
super(true);
this.message = message;
}
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
pokemon.scene.queueMessage(this.message);
return true;
}
}
export class PostSummonAddBattlerTagAbAttr extends PostSummonAbAttr { export class PostSummonAddBattlerTagAbAttr extends PostSummonAbAttr {
private tagType: BattlerTagType; private tagType: BattlerTagType;
private turnCount: integer; private turnCount: integer;
@ -1445,6 +1501,34 @@ export class PostSummonAllyHealAbAttr extends PostSummonAbAttr {
} }
} }
/**
* Resets an ally's temporary stat boots to zero with no regard to
* whether this is a positive or negative change
* @param pokemon The {@link Pokemon} with this {@link AbAttr}
* @param passive N/A
* @param args N/A
* @returns if the move was successful
*/
export class PostSummonClearAllyStatsAbAttr extends PostSummonAbAttr {
constructor() {
super();
}
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
const target = pokemon.getAlly();
if (target?.isActive(true)) {
for (let s = 0; s < target.summonData.battleStats.length; s++)
target.summonData.battleStats[s] = 0;
target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere removed!`));
return true;
}
return false;
}
}
export class DownloadAbAttr extends PostSummonAbAttr { export class DownloadAbAttr extends PostSummonAbAttr {
private enemyDef: integer; private enemyDef: integer;
private enemySpDef: integer; private enemySpDef: integer;
@ -2344,6 +2428,26 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr {
} }
} }
/**
* Attribute used for abilities (Innards Out) that damage the opponent based on how much HP the last attack used to knock out the owner of the ability.
*/
export class PostFaintHPDamageAbAttr extends PostFaintAbAttr {
constructor() {
super ();
}
applyPostFaint(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
const damage = pokemon.turnData.attacksReceived[0].damage;
attacker.damageAndUpdate((damage), HitResult.OTHER);
attacker.turnData.damageTaken += damage;
return true;
}
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
return getPokemonMessage(pokemon, `'s ${abilityName} hurt\nits attacker!`);
}
}
export class RedirectMoveAbAttr extends AbAttr { export class RedirectMoveAbAttr extends AbAttr {
apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (this.canRedirect(args[0] as Moves)) { if (this.canRedirect(args[0] as Moves)) {
@ -2544,8 +2648,8 @@ export class NoFusionAbilityAbAttr extends AbAttr {
} }
export class IgnoreTypeImmunityAbAttr extends AbAttr { export class IgnoreTypeImmunityAbAttr extends AbAttr {
defenderType: Type; private defenderType: Type;
allowedMoveTypes: Type[]; private allowedMoveTypes: Type[];
constructor(defenderType: Type, allowedMoveTypes: Type[]) { constructor(defenderType: Type, allowedMoveTypes: Type[]) {
super(true); super(true);
@ -2562,6 +2666,30 @@ export class IgnoreTypeImmunityAbAttr extends AbAttr {
} }
} }
/**
* Ignores the type immunity to Status Effects of the defender if the defender is of a certain type
*/
export class IgnoreTypeStatusEffectImmunityAbAttr extends AbAttr {
private statusEffect: StatusEffect[];
private defenderType: Type[];
constructor(statusEffect: StatusEffect[], defenderType: Type[]) {
super(true);
this.statusEffect = statusEffect;
this.defenderType = defenderType;
}
apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (this.statusEffect.includes(args[0] as StatusEffect) && this.defenderType.includes(args[1] as Type)) {
cancelled.value = true;
return true;
}
return false;
}
}
function applyAbAttrsInternal<TAttr extends AbAttr>(attrType: { new(...args: any[]): TAttr }, function applyAbAttrsInternal<TAttr extends AbAttr>(attrType: { new(...args: any[]): TAttr },
pokemon: Pokemon, applyFunc: AbAttrApplyFunc<TAttr>, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise<void> { pokemon: Pokemon, applyFunc: AbAttrApplyFunc<TAttr>, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise<void> {
return new Promise(resolve => { return new Promise(resolve => {
@ -2760,7 +2888,7 @@ export const allAbilities = [ new Ability(Abilities.NONE, 3) ];
export function initAbilities() { export function initAbilities() {
allAbilities.push( allAbilities.push(
new Ability(Abilities.STENCH, 3) new Ability(Abilities.STENCH, 3)
.attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => !move.getMove().findAttr(attr => attr instanceof FlinchAttr) ? 10 : 0, BattlerTagType.FLINCHED), .attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => (move.getMove().category !== MoveCategory.STATUS && !move.getMove().findAttr(attr => attr instanceof FlinchAttr)) ? 10 : 0, BattlerTagType.FLINCHED),
new Ability(Abilities.DRIZZLE, 3) new Ability(Abilities.DRIZZLE, 3)
.attr(PostSummonWeatherChangeAbAttr, WeatherType.RAIN) .attr(PostSummonWeatherChangeAbAttr, WeatherType.RAIN)
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.RAIN), .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.RAIN),
@ -2974,7 +3102,8 @@ export function initAbilities() {
.attr(BlockCritAbAttr) .attr(BlockCritAbAttr)
.ignorable(), .ignorable(),
new Ability(Abilities.AIR_LOCK, 3) new Ability(Abilities.AIR_LOCK, 3)
.attr(SuppressWeatherEffectAbAttr, true), .attr(SuppressWeatherEffectAbAttr, true)
.attr(PostSummonUnnamedMessageAbAttr, "The effects of the weather disappeared."),
new Ability(Abilities.TANGLED_FEET, 4) new Ability(Abilities.TANGLED_FEET, 4)
.conditionalAttr(pokemon => !!pokemon.getTag(BattlerTagType.CONFUSED), BattleStatMultiplierAbAttr, BattleStat.EVA, 2) .conditionalAttr(pokemon => !!pokemon.getTag(BattlerTagType.CONFUSED), BattleStatMultiplierAbAttr, BattleStat.EVA, 2)
.ignorable(), .ignorable(),
@ -3070,7 +3199,7 @@ export function initAbilities() {
.attr(IgnoreOpponentStatChangesAbAttr) .attr(IgnoreOpponentStatChangesAbAttr)
.ignorable(), .ignorable(),
new Ability(Abilities.TINTED_LENS, 4) new Ability(Abilities.TINTED_LENS, 4)
.attr(MovePowerBoostAbAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) <= 0.5, 2), .attr(DamageBoostAbAttr, 2, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) <= 0.5),
new Ability(Abilities.FILTER, 4) new Ability(Abilities.FILTER, 4)
.attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 0.75) .attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 0.75)
.ignorable(), .ignorable(),
@ -3155,8 +3284,8 @@ export function initAbilities() {
new Ability(Abilities.HARVEST, 5) new Ability(Abilities.HARVEST, 5)
.unimplemented(), .unimplemented(),
new Ability(Abilities.TELEPATHY, 5) new Ability(Abilities.TELEPATHY, 5)
.ignorable() .attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon.getAlly() === attacker && move.getMove() instanceof AttackMove)
.unimplemented(), .ignorable(),
new Ability(Abilities.MOODY, 5) new Ability(Abilities.MOODY, 5)
.attr(MoodyAbAttr), .attr(MoodyAbAttr),
new Ability(Abilities.OVERCOAT, 5) new Ability(Abilities.OVERCOAT, 5)
@ -3327,7 +3456,7 @@ export function initAbilities() {
.attr(MovePowerBoostAbAttr, (user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.POKEMON, 2), .attr(MovePowerBoostAbAttr, (user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.POKEMON, 2),
new Ability(Abilities.WATER_BUBBLE, 7) new Ability(Abilities.WATER_BUBBLE, 7)
.attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5)
.attr(MoveTypePowerBoostAbAttr, Type.WATER, 1) .attr(MoveTypePowerBoostAbAttr, Type.WATER, 2)
.attr(StatusEffectImmunityAbAttr, StatusEffect.BURN) .attr(StatusEffectImmunityAbAttr, StatusEffect.BURN)
.ignorable(), .ignorable(),
new Ability(Abilities.STEELWORKER, 7) new Ability(Abilities.STEELWORKER, 7)
@ -3376,16 +3505,17 @@ export function initAbilities() {
.attr(UnsuppressableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr)
.attr(NoFusionAbilityAbAttr), .attr(NoFusionAbilityAbAttr),
new Ability(Abilities.POWER_CONSTRUCT, 7) // TODO: 10% Power Construct Zygarde isn't accounted for yet. If changed, update Zygarde's getSpeciesFormIndex entry accordingly new Ability(Abilities.POWER_CONSTRUCT, 7) // TODO: 10% Power Construct Zygarde isn't accounted for yet. If changed, update Zygarde's getSpeciesFormIndex entry accordingly
.attr(PostBattleInitFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 4 : 2) .attr(PostBattleInitFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2)
.attr(PostSummonFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 4 : 2) .attr(PostSummonFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2)
.attr(PostTurnFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 4 : 2) .attr(PostTurnFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2)
.attr(UncopiableAbilityAbAttr) .attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr) .attr(UnswappableAbilityAbAttr)
.attr(UnsuppressableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr)
.attr(NoFusionAbilityAbAttr) .attr(NoFusionAbilityAbAttr)
.partial(), .partial(),
new Ability(Abilities.CORROSION, 7) new Ability(Abilities.CORROSION, 7) // TODO: Test Corrosion against Magic Bounce once it is implemented
.unimplemented(), .attr(IgnoreTypeStatusEffectImmunityAbAttr, [StatusEffect.POISON, StatusEffect.TOXIC], [Type.STEEL, Type.POISON])
.partial(),
new Ability(Abilities.COMATOSE, 7) new Ability(Abilities.COMATOSE, 7)
.attr(UncopiableAbilityAbAttr) .attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr) .attr(UnswappableAbilityAbAttr)
@ -3395,7 +3525,8 @@ export function initAbilities() {
.attr(FieldPriorityMoveImmunityAbAttr) .attr(FieldPriorityMoveImmunityAbAttr)
.ignorable(), .ignorable(),
new Ability(Abilities.INNARDS_OUT, 7) new Ability(Abilities.INNARDS_OUT, 7)
.unimplemented(), .attr(PostFaintHPDamageAbAttr)
.bypassFaint(),
new Ability(Abilities.DANCER, 7) new Ability(Abilities.DANCER, 7)
.unimplemented(), .unimplemented(),
new Ability(Abilities.BATTERY, 7) new Ability(Abilities.BATTERY, 7)
@ -3542,7 +3673,7 @@ export function initAbilities() {
new Ability(Abilities.UNSEEN_FIST, 8) new Ability(Abilities.UNSEEN_FIST, 8)
.unimplemented(), .unimplemented(),
new Ability(Abilities.CURIOUS_MEDICINE, 8) new Ability(Abilities.CURIOUS_MEDICINE, 8)
.unimplemented(), .attr(PostSummonClearAllyStatsAbAttr),
new Ability(Abilities.TRANSISTOR, 8) new Ability(Abilities.TRANSISTOR, 8)
.attr(MoveTypePowerBoostAbAttr, Type.ELECTRIC), .attr(MoveTypePowerBoostAbAttr, Type.ELECTRIC),
new Ability(Abilities.DRAGONS_MAW, 8) new Ability(Abilities.DRAGONS_MAW, 8)

View File

@ -316,7 +316,7 @@ class ToxicSpikesTag extends ArenaTrapTag {
} }
} else if (!pokemon.status) { } else if (!pokemon.status) {
const toxic = this.layers > 1; const toxic = this.layers > 1;
if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, `the ${this.getMoveName()}`)) if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, `the ${this.getMoveName()}`))
return true; return true;
} }
} }

View File

@ -544,6 +544,33 @@ export class AquaRingTag extends BattlerTag {
} }
} }
/** Tag used to allow moves that interact with {@link Moves.MINIMIZE} to function */
export class MinimizeTag extends BattlerTag {
constructor() {
super(BattlerTagType.MINIMIZED, BattlerTagLapseType.TURN_END, 1, Moves.MINIMIZE, undefined);
}
canAdd(pokemon: Pokemon): boolean {
return !pokemon.isMax();
}
onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon);
}
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
//If a pokemon dynamaxes they lose minimized status
if(pokemon.isMax()){
return false
}
return lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType);
}
onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon);
}
}
export class DrowsyTag extends BattlerTag { export class DrowsyTag extends BattlerTag {
constructor() { constructor() {
super(BattlerTagType.DROWSY, BattlerTagLapseType.TURN_END, 2, Moves.YAWN); super(BattlerTagType.DROWSY, BattlerTagLapseType.TURN_END, 2, Moves.YAWN);
@ -819,7 +846,7 @@ export class ContactPoisonProtectedTag 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();
attacker.trySetStatus(StatusEffect.POISON, true); attacker.trySetStatus(StatusEffect.POISON, true, pokemon);
} }
} }
@ -1358,6 +1385,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc
return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true); return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true);
case BattlerTagType.MAGNET_RISEN: case BattlerTagType.MAGNET_RISEN:
return new MagnetRisenTag(tagType, sourceMove); return new MagnetRisenTag(tagType, sourceMove);
case BattlerTagType.MINIMIZED:
return new MinimizeTag();
case BattlerTagType.NONE: case BattlerTagType.NONE:
default: default:
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);

View File

@ -48,7 +48,7 @@ export const biomeLinks: BiomeLinks = {
[Biome.SEABED]: [ Biome.CAVE, [ Biome.VOLCANO, 4 ] ], [Biome.SEABED]: [ Biome.CAVE, [ Biome.VOLCANO, 4 ] ],
[Biome.MOUNTAIN]: [ Biome.VOLCANO, [ Biome.WASTELAND, 3 ] ], [Biome.MOUNTAIN]: [ Biome.VOLCANO, [ Biome.WASTELAND, 3 ] ],
[Biome.BADLANDS]: [ Biome.DESERT, Biome.MOUNTAIN ], [Biome.BADLANDS]: [ Biome.DESERT, Biome.MOUNTAIN ],
[Biome.CAVE]: [ Biome.BADLANDS, Biome.BEACH ], [Biome.CAVE]: [ Biome.BADLANDS, Biome.LAKE ],
[Biome.DESERT]: Biome.RUINS, [Biome.DESERT]: Biome.RUINS,
[Biome.ICE_CAVE]: Biome.SNOWY_FOREST, [Biome.ICE_CAVE]: Biome.SNOWY_FOREST,
[Biome.MEADOW]: [ Biome.PLAINS, [ Biome.FAIRY_CAVE, 2 ] ], [Biome.MEADOW]: [ Biome.PLAINS, [ Biome.FAIRY_CAVE, 2 ] ],

View File

@ -13,14 +13,15 @@ export interface DailyRunConfig {
} }
export function fetchDailyRunSeed(): Promise<string> { export function fetchDailyRunSeed(): Promise<string> {
return new Promise<string>(resolve => { return new Promise<string>((resolve, reject) => {
Utils.apiFetch('daily/seed').then(response => { Utils.apiFetch('daily/seed').then(response => {
if (!response.ok) { if (!response.ok) {
resolve(null); resolve(null);
return; return;
} }
return response.text(); return response.text();
}).then(seed => resolve(seed)); }).then(seed => resolve(seed))
.catch(err => reject(err));
}); });
} }

View File

@ -95,9 +95,16 @@ export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timesta
let ret: Species; let ret: Species;
// 86400000 is the number of miliseconds in one day
const timeDate = new Date(timestamp);
const dayDate = new Date(Date.UTC(timeDate.getUTCFullYear(), timeDate.getUTCMonth(), timeDate.getUTCDate()));
const dayTimestamp = timeDate.getTime(); // Timestamp of current week
const offset = Math.floor(Math.floor(dayTimestamp / 86400000) / legendarySpecies.length); // Cycle number
const index = Math.floor(dayTimestamp / 86400000) % legendarySpecies.length // Index within cycle
scene.executeWithSeedOffset(() => { scene.executeWithSeedOffset(() => {
ret = Utils.randSeedItem(legendarySpecies); ret = Phaser.Math.RND.shuffle(legendarySpecies)[index];
}, Utils.getSunday(new Date(timestamp)).getTime(), EGG_SEED.toString()); }, offset, EGG_SEED.toString());
return ret; return ret;
} }

View File

@ -55,5 +55,6 @@ export enum BattlerTagType {
CURSED = "CURSED", CURSED = "CURSED",
CHARGED = "CHARGED", CHARGED = "CHARGED",
GROUNDED = "GROUNDED", GROUNDED = "GROUNDED",
MAGNET_RISEN = "MAGNET_RISEN" MAGNET_RISEN = "MAGNET_RISEN",
MINIMIZED = "MINIMIZED"
} }

View File

@ -434,29 +434,66 @@ export class SelfStatusMove extends Move {
} }
} }
/**
* Base class defining all {@link Move} Attributes
* @abstract
*/
export abstract class MoveAttr { export abstract class MoveAttr {
/** Should this {@link Move} target the user? */
public selfTarget: boolean; public selfTarget: boolean;
constructor(selfTarget: boolean = false) { constructor(selfTarget: boolean = false) {
this.selfTarget = selfTarget; this.selfTarget = selfTarget;
} }
/**
* Applies move attributes
* @see {@link applyMoveAttrsInternal}
* @virtual
* @param user The {@link Pokemon} using the move
* @param target The target {@link Pokemon} of the move
* @param move The {@link Move} being used
* @param args Set of unique arguments needed by this attribute
* @returns true if the application succeeds
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> {
return true; return true;
} }
/**
* @virtual
* @returns the {@link MoveCondition} or {@link MoveConditionFunc} for this {@link Move}
*/
getCondition(): MoveCondition | MoveConditionFunc { getCondition(): MoveCondition | MoveConditionFunc {
return null; return null;
} }
/**
* @virtual
* @param user The {@link Pokemon} using the move
* @param target The target {@link Pokemon} of the move
* @param move The {@link Move} being used
* @param cancelled A {@link Utils.BooleanHolder} which stores if the move should fail
* @returns the string representing failure of this {@link Move}
*/
getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null {
return null; return null;
} }
/**
* Used by the Enemy AI to rank an attack based on a given user
* @see {@link EnemyPokemon.getNextMove}
* @virtual
*/
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
return 0; return 0;
} }
/**
* Used by the Enemy AI to rank an attack based on a given target
* @see {@link EnemyPokemon.getNextMove}
* @virtual
*/
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
return 0; return 0;
} }
@ -470,6 +507,9 @@ export enum MoveEffectTrigger {
POST_TARGET, POST_TARGET,
} }
/** Base class defining all Move Effect Attributes
* @extends MoveAttr
*/
export class MoveEffectAttr extends MoveAttr { export class MoveEffectAttr extends MoveAttr {
public trigger: MoveEffectTrigger; public trigger: MoveEffectTrigger;
public firstHitOnly: boolean; public firstHitOnly: boolean;
@ -480,11 +520,21 @@ export class MoveEffectAttr extends MoveAttr {
this.firstHitOnly = firstHitOnly; this.firstHitOnly = firstHitOnly;
} }
/**
* Determines whether the {@link Move}'s effects are valid to {@link apply}
* @virtual
* @param user The {@link Pokemon} using the move
* @param target The target {@link Pokemon} of the move
* @param move The {@link Move} being used
* @param args Set of unique arguments needed by this attribute
* @returns true if the application succeeds
*/
canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) { canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) {
return !!(this.selfTarget ? user.hp && !user.getTag(BattlerTagType.FRENZY) : target.hp) return !!(this.selfTarget ? user.hp && !user.getTag(BattlerTagType.FRENZY) : target.hp)
&& (this.selfTarget || !target.getTag(BattlerTagType.PROTECTED) || move.hasFlag(MoveFlags.IGNORE_PROTECT)); && (this.selfTarget || !target.getTag(BattlerTagType.PROTECTED) || move.hasFlag(MoveFlags.IGNORE_PROTECT));
} }
/** Applies move effects so long as they are able based on {@link canApply} */
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> {
return this.canApply(user, target, move, args); return this.canApply(user, target, move, args);
} }
@ -738,12 +788,60 @@ export class RecoilAttr extends MoveEffectAttr {
} }
} }
/**
* Attribute used for moves which self KO the user regardless if the move hits a target
* @extends MoveEffectAttr
* @see {@link apply}
**/
export class SacrificialAttr extends MoveEffectAttr { export class SacrificialAttr extends MoveEffectAttr {
constructor() { constructor() {
super(true, MoveEffectTrigger.PRE_APPLY); super(true, MoveEffectTrigger.POST_TARGET);
} }
/**
* Deals damage to the user equal to their current hp
* @param user Pokemon that used the move
* @param target The target of the move
* @param move Move with this attribute
* @param args N/A
* @returns true if the function succeeds
**/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
user.damageAndUpdate(user.hp, HitResult.OTHER, false, true, true);
user.turnData.damageTaken += user.hp;
return true;
}
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
if (user.isBoss())
return -20;
return Math.ceil(((1 - user.getHpRatio()) * 10 - 10) * (target.getAttackTypeEffectiveness(move.type, user) - 0.5));
}
}
/**
* Attribute used for moves which self KO the user but only if the move hits a target
* @extends MoveEffectAttr
* @see {@link apply}
**/
export class SacrificialAttrOnHit extends MoveEffectAttr {
constructor() {
super(true, MoveEffectTrigger.POST_TARGET);
}
/**
* Deals damage to the user equal to their current hp if the move lands
* @param user Pokemon that used the move
* @param target The target of the move
* @param move Move with this attribute
* @param args N/A
* @returns true if the function succeeds
**/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
// If the move fails to hit a target, then the user does not faint and the function returns false
if (!super.apply(user, target, move, args)) if (!super.apply(user, target, move, args))
return false; return false;
@ -806,8 +904,15 @@ export enum MultiHitType {
_1_TO_10, _1_TO_10,
} }
/**
* Heals the user or target by {@link healRatio} depending on the value of {@link selfTarget}
* @extends MoveEffectAttr
* @see {@link apply}
*/
export class HealAttr extends MoveEffectAttr { export class HealAttr extends MoveEffectAttr {
/** The percentage of {@link Stat.HP} to heal */
private healRatio: number; private healRatio: number;
/** Should an animation be shown? */
private showAnim: boolean; private showAnim: boolean;
constructor(healRatio?: number, showAnim?: boolean, selfTarget?: boolean) { constructor(healRatio?: number, showAnim?: boolean, selfTarget?: boolean) {
@ -822,9 +927,13 @@ export class HealAttr extends MoveEffectAttr {
return true; return true;
} }
/**
* Creates a new {@link PokemonHealPhase}.
* This heals the target and shows the appropriate message.
*/
addHealPhase(target: Pokemon, healRatio: number) { addHealPhase(target: Pokemon, healRatio: number) {
target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(),
Math.max(Math.floor(target.getMaxHp() * healRatio), 1), getPokemonMessage(target, ' regained\nhealth!'), true, !this.showAnim)); Math.max(Math.floor(target.getMaxHp() * healRatio), 1), getPokemonMessage(target, ' \nhad its HP restored.'), true, !this.showAnim));
} }
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
@ -903,7 +1012,7 @@ export class IgnoreWeatherTypeDebuffAttr extends MoveAttr {
* @param user Pokemon that used the move * @param user Pokemon that used the move
* @param target N/A * @param target N/A
* @param move Move with this attribute * @param move Move with this attribute
* @param args Utils.NumberHolder for arenaAttackTypeMultiplier * @param args [0] Utils.NumberHolder for arenaAttackTypeMultiplier
* @returns true if the function succeeds * @returns true if the function succeeds
*/ */
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
@ -962,6 +1071,41 @@ export class SandHealAttr extends WeatherHealAttr {
} }
} }
/**
* Heals the target or the user by either {@link normalHealRatio} or {@link boostedHealRatio}
* depending on the evaluation of {@link condition}
* @extends HealAttr
* @see {@link apply}
*/
export class BoostHealAttr extends HealAttr {
/** Healing received when {@link condition} is false */
private normalHealRatio?: number;
/** Healing received when {@link condition} is true */
private boostedHealRatio?: number;
/** The lambda expression to check against when boosting the healing value */
private condition?: MoveConditionFunc;
constructor(normalHealRatio?: number, boostedHealRatio?: number, showAnim?: boolean, selfTarget?: boolean, condition?: MoveConditionFunc) {
super(normalHealRatio, showAnim, selfTarget);
this.normalHealRatio = normalHealRatio;
this.boostedHealRatio = boostedHealRatio;
this.condition = condition;
}
/**
* @param user The Pokemon using this move
* @param target The target Pokemon of this move
* @param move This move
* @param args N/A
* @returns true if the move was successful
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const healRatio = this.condition(user, target, move) ? this.boostedHealRatio : this.normalHealRatio;
this.addHealPhase(target, healRatio);
return true;
}
}
export class HitHealAttr extends MoveEffectAttr { export class HitHealAttr extends MoveEffectAttr {
private healRatio: number; private healRatio: number;
@ -1120,13 +1264,13 @@ export class StatusEffectAttr extends MoveEffectAttr {
return false; return false;
} }
if (!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0)) if (!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0))
return pokemon.trySetStatus(this.effect, true, this.cureTurn); return pokemon.trySetStatus(this.effect, true, user, this.cureTurn);
} }
return false; return false;
} }
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true) ? Math.floor(move.chance * -0.1) : 0; return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0;
} }
} }
@ -1145,7 +1289,7 @@ export class MultiStatusEffectAttr extends StatusEffectAttr {
} }
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true) ? Math.floor(move.chance * -0.1) : 0; return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0;
} }
} }
@ -1161,7 +1305,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr {
return false; return false;
} }
if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) { if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) {
var statusAfflictResult = target.trySetStatus(statusToApply, true); var statusAfflictResult = target.trySetStatus(statusToApply, true, user);
if (statusAfflictResult) { if (statusAfflictResult) {
user.scene.queueMessage(getPokemonMessage(user, getStatusEffectHealText(user.status.effect))); user.scene.queueMessage(getPokemonMessage(user, getStatusEffectHealText(user.status.effect)));
user.resetStatus(); user.resetStatus();
@ -1174,7 +1318,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr {
} }
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(user.status?.effect, true) ? Math.floor(move.chance * -0.1) : 0; return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(user.status?.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0;
} }
} }
@ -1317,6 +1461,25 @@ export class BypassSleepAttr extends MoveAttr {
} }
} }
/**
* Attribute used for moves that bypass the burn damage reduction of physical moves, currently only facade
* Called during damage calculation
* @param user N/A
* @param target N/A
* @param move Move with this attribute
* @param args Utils.BooleanHolder for burnDamageReductionCancelled
* @returns true if the function succeeds
*/
export class BypassBurnDamageReductionAttr extends MoveAttr {
/** Prevents the move's damage from being reduced by burn */
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
(args[0] as Utils.BooleanHolder).value = true;
return true;
}
}
export class WeatherChangeAttr extends MoveEffectAttr { export class WeatherChangeAttr extends MoveEffectAttr {
private weatherType: WeatherType; private weatherType: WeatherType;
@ -2317,6 +2480,30 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr {
} }
} }
/**
* Attribute used for moves which never miss
* against Pokemon with the {@link BattlerTagType.MINIMIZED}
* @see {@link apply}
* @param user N/A
* @param target Target of the move
* @param move N/A
* @param args [0] Accuracy of the move to be modified
* @returns true if the function succeeds
*/
export class MinimizeAccuracyAttr extends VariableAccuracyAttr{
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (target.getTag(BattlerTagType.MINIMIZED)){
const accuracy = args[0] as Utils.NumberHolder
accuracy.value = -1;
return true;
}
return false;
}
}
export class ToxicAccuracyAttr extends VariableAccuracyAttr { export class ToxicAccuracyAttr extends VariableAccuracyAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (user.isOfType(Type.POISON)) { if (user.isOfType(Type.POISON)) {
@ -2621,6 +2808,24 @@ export class WaterSuperEffectTypeMultiplierAttr extends VariableMoveTypeMultipli
} }
} }
export class IceNoEffectTypeAttr extends VariableMoveTypeMultiplierAttr {
/**
* Checks to see if the Target is Ice-Type or not. If so, the move will have no effect.
* @param {Pokemon} user N/A
* @param {Pokemon} target Pokemon that is being checked whether Ice-Type or not.
* @param {Move} move N/A
* @param {any[]} args Sets to false if the target is Ice-Type, so it should do no damage/no effect.
* @returns {boolean} Returns true if move is successful, false if Ice-Type.
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (target.isOfType(Type.ICE)) {
(args[0] as Utils.BooleanHolder).value = false;
return false;
}
return true;
}
}
export class FlyingTypeMultiplierAttr extends VariableMoveTypeMultiplierAttr { export class FlyingTypeMultiplierAttr extends VariableMoveTypeMultiplierAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const multiplier = args[0] as Utils.NumberHolder; const multiplier = args[0] as Utils.NumberHolder;
@ -2640,6 +2845,29 @@ export class OneHitKOAccuracyAttr extends VariableAccuracyAttr {
} }
} }
export class SheerColdAccuracyAttr extends OneHitKOAccuracyAttr {
/**
* Changes the normal One Hit KO Accuracy Attr to implement the Gen VII changes,
* where if the user is Ice-Type, it has more accuracy.
* @param {Pokemon} user Pokemon that is using the move; checks the Pokemon's level.
* @param {Pokemon} target Pokemon that is receiving the move; checks the Pokemon's level.
* @param {Move} move N/A
* @param {any[]} args Uses the accuracy argument, allowing to change it from either 0 if it doesn't pass
* the first if/else, or 30/20 depending on the type of the user Pokemon.
* @returns Returns true if move is successful, false if misses.
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const accuracy = args[0] as Utils.NumberHolder;
if (user.level < target.level) {
accuracy.value = 0;
} else {
const baseAccuracy = user.isOfType(Type.ICE) ? 30 : 20;
accuracy.value = Math.min(Math.max(baseAccuracy + 100 * (1 - target.level / user.level), 0), 100);
}
return true;
}
}
export class MissEffectAttr extends MoveAttr { export class MissEffectAttr extends MoveAttr {
private missEffectFunc: UserMoveConditionFunc; private missEffectFunc: UserMoveConditionFunc;
@ -3031,8 +3259,11 @@ export class FaintCountdownAttr extends AddBattlerTagAttr {
} }
} }
/** Attribute used when a move hits a {@link BattlerTagType} for double damage */
export class HitsTagAttr extends MoveAttr { export class HitsTagAttr extends MoveAttr {
/** The {@link BattlerTagType} this move hits */
public tagType: BattlerTagType; public tagType: BattlerTagType;
/** Should this move deal double damage against {@link HitsTagAttr.tagType}? */
public doubleDamage: boolean; public doubleDamage: boolean;
constructor(tagType: BattlerTagType, doubleDamage?: boolean) { constructor(tagType: BattlerTagType, doubleDamage?: boolean) {
@ -4199,6 +4430,8 @@ export function initMoves() {
new AttackMove(Moves.SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 80, 75, 20, -1, 0, 1), new AttackMove(Moves.SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 80, 75, 20, -1, 0, 1),
new AttackMove(Moves.VINE_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 45, 100, 25, -1, 0, 1), new AttackMove(Moves.VINE_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 45, 100, 25, -1, 0, 1),
new AttackMove(Moves.STOMP, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 1) new AttackMove(Moves.STOMP, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 1)
.attr(MinimizeAccuracyAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.attr(FlinchAttr), .attr(FlinchAttr),
new AttackMove(Moves.DOUBLE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 30, 100, 30, -1, 0, 1) new AttackMove(Moves.DOUBLE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 30, 100, 30, -1, 0, 1)
.attr(MultiHitAttr, MultiHitType._2), .attr(MultiHitAttr, MultiHitType._2),
@ -4222,6 +4455,8 @@ export function initMoves() {
.attr(OneHitKOAccuracyAttr), .attr(OneHitKOAccuracyAttr),
new AttackMove(Moves.TACKLE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), new AttackMove(Moves.TACKLE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1),
new AttackMove(Moves.BODY_SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 85, 100, 15, 30, 0, 1) new AttackMove(Moves.BODY_SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 85, 100, 15, 30, 0, 1)
.attr(MinimizeAccuracyAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS), .attr(StatusEffectAttr, StatusEffect.PARALYSIS),
new AttackMove(Moves.WRAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, 100, 0, 1) new AttackMove(Moves.WRAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, 100, 0, 1)
.attr(TrapAttr, BattlerTagType.WRAP), .attr(TrapAttr, BattlerTagType.WRAP),
@ -4419,6 +4654,7 @@ export function initMoves() {
new SelfStatusMove(Moves.HARDEN, Type.NORMAL, -1, 30, -1, 0, 1) new SelfStatusMove(Moves.HARDEN, Type.NORMAL, -1, 30, -1, 0, 1)
.attr(StatChangeAttr, BattleStat.DEF, 1, true), .attr(StatChangeAttr, BattleStat.DEF, 1, true),
new SelfStatusMove(Moves.MINIMIZE, Type.NORMAL, -1, 10, -1, 0, 1) new SelfStatusMove(Moves.MINIMIZE, Type.NORMAL, -1, 10, -1, 0, 1)
.attr(AddBattlerTagAttr, BattlerTagType.MINIMIZED, true, false)
.attr(StatChangeAttr, BattleStat.EVA, 2, true), .attr(StatChangeAttr, BattleStat.EVA, 2, true),
new StatusMove(Moves.SMOKESCREEN, Type.NORMAL, 100, 20, -1, 0, 1) new StatusMove(Moves.SMOKESCREEN, Type.NORMAL, 100, 20, -1, 0, 1)
.attr(StatChangeAttr, BattleStat.ACC, -1), .attr(StatChangeAttr, BattleStat.ACC, -1),
@ -4864,11 +5100,12 @@ export function initMoves() {
new StatusMove(Moves.WILL_O_WISP, Type.FIRE, 85, 15, -1, 0, 3) new StatusMove(Moves.WILL_O_WISP, Type.FIRE, 85, 15, -1, 0, 3)
.attr(StatusEffectAttr, StatusEffect.BURN), .attr(StatusEffectAttr, StatusEffect.BURN),
new StatusMove(Moves.MEMENTO, Type.DARK, 100, 10, -1, 0, 3) new StatusMove(Moves.MEMENTO, Type.DARK, 100, 10, -1, 0, 3)
.attr(SacrificialAttr) .attr(SacrificialAttrOnHit)
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -2), .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -2),
new AttackMove(Moves.FACADE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 3) new AttackMove(Moves.FACADE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 3)
.attr(MovePowerMultiplierAttr, (user, target, move) => user.status .attr(MovePowerMultiplierAttr, (user, target, move) => user.status
&& (user.status.effect === StatusEffect.BURN || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.PARALYSIS) ? 2 : 1), && (user.status.effect === StatusEffect.BURN || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.PARALYSIS) ? 2 : 1)
.attr(BypassBurnDamageReductionAttr),
new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3) new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3)
.punchingMove() .punchingMove()
.ignoresVirtual() .ignoresVirtual()
@ -5039,9 +5276,10 @@ export function initMoves() {
new AttackMove(Moves.SAND_TOMB, Type.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, 100, 0, 3) new AttackMove(Moves.SAND_TOMB, Type.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, 100, 0, 3)
.attr(TrapAttr, BattlerTagType.SAND_TOMB) .attr(TrapAttr, BattlerTagType.SAND_TOMB)
.makesContact(false), .makesContact(false),
new AttackMove(Moves.SHEER_COLD, Type.ICE, MoveCategory.SPECIAL, 200, 30, 5, -1, 0, 3) new AttackMove(Moves.SHEER_COLD, Type.ICE, MoveCategory.SPECIAL, 200, 20, 5, -1, 0, 3)
.attr(IceNoEffectTypeAttr)
.attr(OneHitKOAttr) .attr(OneHitKOAttr)
.attr(OneHitKOAccuracyAttr), .attr(SheerColdAccuracyAttr),
new AttackMove(Moves.MUDDY_WATER, Type.WATER, MoveCategory.SPECIAL, 90, 85, 10, 30, 0, 3) new AttackMove(Moves.MUDDY_WATER, Type.WATER, MoveCategory.SPECIAL, 90, 85, 10, 30, 0, 3)
.attr(StatChangeAttr, BattleStat.ACC, -1) .attr(StatChangeAttr, BattleStat.ACC, -1)
.target(MoveTarget.ALL_NEAR_ENEMIES), .target(MoveTarget.ALL_NEAR_ENEMIES),
@ -5170,7 +5408,7 @@ export function initMoves() {
|| user.status?.effect === StatusEffect.TOXIC || user.status?.effect === StatusEffect.TOXIC
|| user.status?.effect === StatusEffect.PARALYSIS || user.status?.effect === StatusEffect.PARALYSIS
|| user.status?.effect === StatusEffect.SLEEP) || user.status?.effect === StatusEffect.SLEEP)
&& target.canSetStatus(user.status?.effect) && target.canSetStatus(user.status?.effect, false, false, user)
), ),
new AttackMove(Moves.TRUMP_CARD, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 5, -1, 0, 4) new AttackMove(Moves.TRUMP_CARD, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 5, -1, 0, 4)
.makesContact() .makesContact()
@ -5256,6 +5494,8 @@ export function initMoves() {
new AttackMove(Moves.DRAGON_PULSE, Type.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4) new AttackMove(Moves.DRAGON_PULSE, Type.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4)
.pulseMove(), .pulseMove(),
new AttackMove(Moves.DRAGON_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 100, 75, 10, 20, 0, 4) new AttackMove(Moves.DRAGON_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 100, 75, 10, 20, 0, 4)
.attr(MinimizeAccuracyAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.attr(FlinchAttr), .attr(FlinchAttr),
new AttackMove(Moves.POWER_GEM, Type.ROCK, MoveCategory.SPECIAL, 80, 100, 20, -1, 0, 4), new AttackMove(Moves.POWER_GEM, Type.ROCK, MoveCategory.SPECIAL, 80, 100, 20, -1, 0, 4),
new AttackMove(Moves.DRAIN_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 4) new AttackMove(Moves.DRAIN_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 4)
@ -5398,7 +5638,7 @@ export function initMoves() {
new AttackMove(Moves.SPACIAL_REND, Type.DRAGON, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 4) new AttackMove(Moves.SPACIAL_REND, Type.DRAGON, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 4)
.attr(HighCritAttr), .attr(HighCritAttr),
new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4) new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4)
.attr(SacrificialAttr) .attr(SacrificialAttrOnHit)
.danceMove() .danceMove()
.triageMove() .triageMove()
.unimplemented(), .unimplemented(),
@ -5465,7 +5705,9 @@ export function initMoves() {
.attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true) .attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true)
.danceMove(), .danceMove(),
new AttackMove(Moves.HEAVY_SLAM, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) new AttackMove(Moves.HEAVY_SLAM, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5)
.attr(MinimizeAccuracyAttr)
.attr(CompareWeightPowerAttr) .attr(CompareWeightPowerAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.condition(failOnMaxCondition), .condition(failOnMaxCondition),
new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5) new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5)
.target(MoveTarget.ALL_NEAR_OTHERS) .target(MoveTarget.ALL_NEAR_OTHERS)
@ -5547,7 +5789,7 @@ export function initMoves() {
.partial(), .partial(),
new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5) new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5)
.attr(UserHpDamageAttr) .attr(UserHpDamageAttr)
.attr(SacrificialAttr), .attr(SacrificialAttrOnHit),
new StatusMove(Moves.BESTOW, Type.NORMAL, -1, 15, -1, 0, 5) new StatusMove(Moves.BESTOW, Type.NORMAL, -1, 15, -1, 0, 5)
.ignoresProtect() .ignoresProtect()
.unimplemented(), .unimplemented(),
@ -5596,7 +5838,9 @@ export function initMoves() {
.attr(StatChangeAttr, BattleStat.DEF, -1) .attr(StatChangeAttr, BattleStat.DEF, -1)
.slicingMove(), .slicingMove(),
new AttackMove(Moves.HEAT_CRASH, Type.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) new AttackMove(Moves.HEAT_CRASH, Type.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5)
.attr(MinimizeAccuracyAttr)
.attr(CompareWeightPowerAttr) .attr(CompareWeightPowerAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.condition(failOnMaxCondition), .condition(failOnMaxCondition),
new AttackMove(Moves.LEAF_TORNADO, Type.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5) new AttackMove(Moves.LEAF_TORNADO, Type.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5)
.attr(StatChangeAttr, BattleStat.ACC, -1), .attr(StatChangeAttr, BattleStat.ACC, -1),
@ -5667,7 +5911,9 @@ export function initMoves() {
.makesContact(false) .makesContact(false)
.partial(), .partial(),
new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6) new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6)
.attr(MinimizeAccuracyAttr)
.attr(FlyingTypeMultiplierAttr) .attr(FlyingTypeMultiplierAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.condition(failOnGravityCondition), .condition(failOnGravityCondition),
new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6) new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6)
.unimplemented(), .unimplemented(),
@ -5977,9 +6223,8 @@ export function initMoves() {
.attr(StatChangeAttr, BattleStat.SPD, -1, true) .attr(StatChangeAttr, BattleStat.SPD, -1, true)
.punchingMove(), .punchingMove(),
new StatusMove(Moves.FLORAL_HEALING, Type.FAIRY, -1, 10, -1, 0, 7) new StatusMove(Moves.FLORAL_HEALING, Type.FAIRY, -1, 10, -1, 0, 7)
.attr(HealAttr, 0.5, true, false) .attr(BoostHealAttr, 0.5, 2/3, true, false, (user, target, move) => user.scene.arena.terrain?.terrainType === TerrainType.GRASSY)
.triageMove() .triageMove(),
.partial(),
new AttackMove(Moves.HIGH_HORSEPOWER, Type.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7), new AttackMove(Moves.HIGH_HORSEPOWER, Type.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7),
new StatusMove(Moves.STRENGTH_SAP, Type.GRASS, 100, 10, 100, 0, 7) new StatusMove(Moves.STRENGTH_SAP, Type.GRASS, 100, 10, 100, 0, 7)
.attr(StrengthSapHealAttr) .attr(StrengthSapHealAttr)
@ -6166,7 +6411,7 @@ export function initMoves() {
.ignoresVirtual(), .ignoresVirtual(),
/* End Unused */ /* End Unused */
new AttackMove(Moves.ZIPPY_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 100, 2, 7) new AttackMove(Moves.ZIPPY_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 100, 2, 7)
.attr(CritOnlyAttr), .attr(StatChangeAttr, BattleStat.EVA, 1, true),
new AttackMove(Moves.SPLISHY_SPLASH, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, 30, 0, 7) new AttackMove(Moves.SPLISHY_SPLASH, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, 30, 0, 7)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS) .attr(StatusEffectAttr, StatusEffect.PARALYSIS)
.target(MoveTarget.ALL_NEAR_ENEMIES), .target(MoveTarget.ALL_NEAR_ENEMIES),
@ -6191,7 +6436,7 @@ export function initMoves() {
new AttackMove(Moves.FREEZY_FROST, Type.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7) new AttackMove(Moves.FREEZY_FROST, Type.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7)
.attr(ResetStatsAttr), .attr(ResetStatsAttr),
new AttackMove(Moves.SPARKLY_SWIRL, Type.FAIRY, MoveCategory.SPECIAL, 120, 85, 5, -1, 0, 7) new AttackMove(Moves.SPARKLY_SWIRL, Type.FAIRY, MoveCategory.SPECIAL, 120, 85, 5, -1, 0, 7)
.partial(), .attr(PartyStatusCureAttr, null, Abilities.NONE),
new AttackMove(Moves.VEEVEE_VOLLEY, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 20, -1, 0, 7) new AttackMove(Moves.VEEVEE_VOLLEY, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 20, -1, 0, 7)
.attr(FriendshipPowerAttr), .attr(FriendshipPowerAttr),
new AttackMove(Moves.DOUBLE_IRON_BASH, Type.STEEL, MoveCategory.PHYSICAL, 60, 100, 5, 30, 0, 7) new AttackMove(Moves.DOUBLE_IRON_BASH, Type.STEEL, MoveCategory.PHYSICAL, 60, 100, 5, 30, 0, 7)
@ -6786,7 +7031,7 @@ export function initMoves() {
const turnMove = user.getLastXMoves(1); const turnMove = user.getLastXMoves(1);
return !turnMove.length || turnMove[0].move !== move.id || turnMove[0].result !== MoveResult.SUCCESS; return !turnMove.length || turnMove[0].move !== move.id || turnMove[0].result !== MoveResult.SUCCESS;
}), // TODO Add Instruct/Encore interaction }), // TODO Add Instruct/Encore interaction
new AttackMove(Moves.COMEUPPANCE, Type.DARK, MoveCategory.PHYSICAL, 1, 100, 10, -1, 0, 9) new AttackMove(Moves.COMEUPPANCE, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9)
.attr(CounterDamageAttr, (move: Move) => (move.category === MoveCategory.PHYSICAL || move.category === MoveCategory.SPECIAL), 1.5) .attr(CounterDamageAttr, (move: Move) => (move.category === MoveCategory.PHYSICAL || move.category === MoveCategory.SPECIAL), 1.5)
.target(MoveTarget.ATTACKER), .target(MoveTarget.ATTACKER),
new AttackMove(Moves.AQUA_CUTTER, Type.WATER, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 9) new AttackMove(Moves.AQUA_CUTTER, Type.WATER, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 9)

View File

@ -1,6 +1,5 @@
import { Gender } from "./gender"; import { Gender } from "./gender";
import { AttackTypeBoosterModifier, FlinchChanceModifier } from "../modifier/modifier"; import { AttackTypeBoosterModifier, FlinchChanceModifier } from "../modifier/modifier";
import { AttackTypeBoosterModifierType } from "../modifier/modifier-type";
import { Moves } from "./enums/moves"; import { Moves } from "./enums/moves";
import { PokeballType } from "./pokeball"; import { PokeballType } from "./pokeball";
import Pokemon from "../field/pokemon"; import Pokemon from "../field/pokemon";
@ -1386,15 +1385,15 @@ export const pokemonEvolutions: PokemonEvolutions = {
new SpeciesEvolution(Species.HELIOLISK, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG) new SpeciesEvolution(Species.HELIOLISK, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG)
], ],
[Species.CHARJABUG]: [ [Species.CHARJABUG]: [
new SpeciesEvolution(Species.VIKAVOLT, 1, EvolutionItem.THUNDER_STONE, null) new SpeciesEvolution(Species.VIKAVOLT, 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG)
], ],
[Species.CRABRAWLER]: [ [Species.CRABRAWLER]: [
new SpeciesEvolution(Species.CRABOMINABLE, 1, EvolutionItem.ICE_STONE, null) new SpeciesEvolution(Species.CRABOMINABLE, 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG)
], ],
[Species.ROCKRUFF]: [ [Species.ROCKRUFF]: [
new SpeciesFormEvolution(Species.LYCANROC, '', 'midday', 25, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), null), new SpeciesFormEvolution(Species.LYCANROC, '', 'midday', 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY) && (p.formIndex === 0)), null),
new SpeciesFormEvolution(Species.LYCANROC, '', 'dusk', 25, null, new SpeciesEvolutionCondition(p => p.scene.getSpeciesFormIndex(p.species) === 1), null), new SpeciesFormEvolution(Species.LYCANROC, '', 'dusk', 25, null, new SpeciesEvolutionCondition(p => p.formIndex === 1), null),
new SpeciesFormEvolution(Species.LYCANROC, '', 'midnight', 25, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), null) new SpeciesFormEvolution(Species.LYCANROC, '', 'midnight', 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT) && (p.formIndex === 0)), null)
], ],
[Species.STEENEE]: [ [Species.STEENEE]: [
new SpeciesEvolution(Species.TSAREENA, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.STOMP).length > 0), SpeciesWildEvolutionDelay.LONG) new SpeciesEvolution(Species.TSAREENA, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.STOMP).length > 0), SpeciesWildEvolutionDelay.LONG)

File diff suppressed because it is too large Load Diff

View File

@ -2759,7 +2759,7 @@ export const speciesStarters = {
[Species.GROUDON]: 8, [Species.GROUDON]: 8,
[Species.RAYQUAZA]: 8, [Species.RAYQUAZA]: 8,
[Species.JIRACHI]: 7, [Species.JIRACHI]: 7,
[Species.DEOXYS]: 8, [Species.DEOXYS]: 7,
[Species.TURTWIG]: 3, [Species.TURTWIG]: 3,
[Species.CHIMCHAR]: 3, [Species.CHIMCHAR]: 3,
@ -2813,7 +2813,7 @@ export const speciesStarters = {
[Species.DARKRAI]: 7, [Species.DARKRAI]: 7,
[Species.SHAYMIN]: 7, [Species.SHAYMIN]: 7,
[Species.ARCEUS]: 9, [Species.ARCEUS]: 9,
[Species.VICTINI]: 8, [Species.VICTINI]: 7,
[Species.SNIVY]: 3, [Species.SNIVY]: 3,
[Species.TEPIG]: 3, [Species.TEPIG]: 3,
@ -2895,7 +2895,7 @@ export const speciesStarters = {
[Species.KYUREM]: 8, [Species.KYUREM]: 8,
[Species.KELDEO]: 7, [Species.KELDEO]: 7,
[Species.MELOETTA]: 7, [Species.MELOETTA]: 7,
[Species.GENESECT]: 8, [Species.GENESECT]: 7,
[Species.CHESPIN]: 3, [Species.CHESPIN]: 3,
[Species.FENNEKIN]: 3, [Species.FENNEKIN]: 3,

View File

@ -855,14 +855,20 @@ export const trainerConfigs: TrainerConfigs = {
}), }),
[TrainerType.RIVAL_6]: new TrainerConfig(++t).setName('Finn').setHasGenders('Ivy').setHasCharSprite().setTitle('Rival').setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm('final').setBattleBgm('battle_rival_3').setPartyTemplates(trainerPartyTemplates.RIVAL_6) [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName('Finn').setHasGenders('Ivy').setHasCharSprite().setTitle('Rival').setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm('final').setBattleBgm('battle_rival_3').setPartyTemplates(trainerPartyTemplates.RIVAL_6)
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true,
p => p.setBoss(true, 3)) p => {
) p.setBoss(true, 3);
p.generateAndPopulateMoveset();
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true, .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true,
p => p.setBoss(true, 2))) p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
}))
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
.setSpeciesFilter(species => species.baseTotal >= 540) .setSpeciesFilter(species => species.baseTotal >= 540)
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => { .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => {
p.setBoss(); p.setBoss();
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.MASTER_BALL;
p.shiny = true; p.shiny = true;
p.variant = 1; p.variant = 1;

View File

@ -7,6 +7,7 @@ import * as Utils from "../utils";
import BattleScene from "../battle-scene"; import BattleScene from "../battle-scene";
import { SuppressWeatherEffectAbAttr } from "./ability"; import { SuppressWeatherEffectAbAttr } from "./ability";
import { TerrainType } from "./terrain"; import { TerrainType } from "./terrain";
import i18next from "i18next";
export enum WeatherType { export enum WeatherType {
NONE, NONE,
@ -121,23 +122,23 @@ export class Weather {
export function getWeatherStartMessage(weatherType: WeatherType): string { export function getWeatherStartMessage(weatherType: WeatherType): string {
switch (weatherType) { switch (weatherType) {
case WeatherType.SUNNY: case WeatherType.SUNNY:
return 'The sunlight got bright!'; return i18next.t('weather:sunnyStartMessage');
case WeatherType.RAIN: case WeatherType.RAIN:
return 'A downpour started!'; return i18next.t('weather:rainStartMessage');
case WeatherType.SANDSTORM: case WeatherType.SANDSTORM:
return 'A sandstorm brewed!'; return i18next.t('weather:sandstormStartMessage');
case WeatherType.HAIL: case WeatherType.HAIL:
return 'It started to hail!'; return i18next.t('weather:hailStartMessage');
case WeatherType.SNOW: case WeatherType.SNOW:
return 'It started to snow!'; return i18next.t('weather:snowStartMessage');
case WeatherType.FOG: case WeatherType.FOG:
return 'A thick fog emerged!' return i18next.t('weather:fogStartMessage');
case WeatherType.HEAVY_RAIN: case WeatherType.HEAVY_RAIN:
return 'A heavy downpour started!' return i18next.t('weather:heavyRainStartMessage');
case WeatherType.HARSH_SUN: case WeatherType.HARSH_SUN:
return 'The sunlight got hot!' return i18next.t('weather:harshSunStartMessage');
case WeatherType.STRONG_WINDS: case WeatherType.STRONG_WINDS:
return 'A heavy wind began!'; return i18next.t('weather:strongWindsStartMessage');
} }
return null; return null;
@ -146,23 +147,23 @@ export function getWeatherStartMessage(weatherType: WeatherType): string {
export function getWeatherLapseMessage(weatherType: WeatherType): string { export function getWeatherLapseMessage(weatherType: WeatherType): string {
switch (weatherType) { switch (weatherType) {
case WeatherType.SUNNY: case WeatherType.SUNNY:
return 'The sunlight is strong.'; return i18next.t('weather:sunnyLapseMessage');
case WeatherType.RAIN: case WeatherType.RAIN:
return 'The downpour continues.'; return i18next.t('weather:rainLapseMessage');
case WeatherType.SANDSTORM: case WeatherType.SANDSTORM:
return 'The sandstorm rages.'; return i18next.t('weather:sandstormLapseMessage');
case WeatherType.HAIL: case WeatherType.HAIL:
return 'Hail continues to fall.'; return i18next.t('weather:hailLapseMessage');
case WeatherType.SNOW: case WeatherType.SNOW:
return 'The snow is falling down.'; return i18next.t('weather:snowLapseMessage');
case WeatherType.FOG: case WeatherType.FOG:
return 'The fog continues.'; return i18next.t('weather:fogLapseMessage');
case WeatherType.HEAVY_RAIN: case WeatherType.HEAVY_RAIN:
return 'The heavy downpour continues.' return i18next.t('weather:heavyRainLapseMessage');
case WeatherType.HARSH_SUN: case WeatherType.HARSH_SUN:
return 'The sun is scorching hot.' return i18next.t('weather:harshSunLapseMessage');
case WeatherType.STRONG_WINDS: case WeatherType.STRONG_WINDS:
return 'The wind blows intensely.'; return i18next.t('weather:strongWindsLapseMessage');
} }
return null; return null;
@ -182,23 +183,23 @@ export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokem
export function getWeatherClearMessage(weatherType: WeatherType): string { export function getWeatherClearMessage(weatherType: WeatherType): string {
switch (weatherType) { switch (weatherType) {
case WeatherType.SUNNY: case WeatherType.SUNNY:
return 'The sunlight faded.'; return i18next.t('weather:sunnyClearMessage');
case WeatherType.RAIN: case WeatherType.RAIN:
return 'The rain stopped.'; return i18next.t('weather:rainClearMessage');
case WeatherType.SANDSTORM: case WeatherType.SANDSTORM:
return 'The sandstorm subsided.'; return i18next.t('weather:sandstormClearMessage');
case WeatherType.HAIL: case WeatherType.HAIL:
return 'The hail stopped.'; return i18next.t('weather:hailClearMessage');
case WeatherType.SNOW: case WeatherType.SNOW:
return 'The snow stopped.'; return i18next.t('weather:snowClearMessage');
case WeatherType.FOG: case WeatherType.FOG:
return 'The fog disappeared.' return i18next.t('weather:fogClearMessage');
case WeatherType.HEAVY_RAIN: case WeatherType.HEAVY_RAIN:
return 'The heavy rain stopped.' return i18next.t('weather:heavyRainClearMessage');
case WeatherType.HARSH_SUN: case WeatherType.HARSH_SUN:
return 'The harsh sunlight faded.' return i18next.t('weather:harshSunClearMessage');
case WeatherType.STRONG_WINDS: case WeatherType.STRONG_WINDS:
return 'The heavy wind stopped.'; return i18next.t('weather:strongWindsClearMessage');
} }
return null; return null;

View File

@ -9,6 +9,7 @@ import { LearnMovePhase } from "./phases";
import { cos, sin } from "./field/anims"; import { cos, sin } from "./field/anims";
import { PlayerPokemon } from "./field/pokemon"; import { PlayerPokemon } from "./field/pokemon";
import { getTypeRgb } from "./data/type"; import { getTypeRgb } from "./data/type";
import i18next from "i18next";
export class EvolutionPhase extends Phase { export class EvolutionPhase extends Phase {
protected pokemon: PlayerPokemon; protected pokemon: PlayerPokemon;
@ -115,7 +116,7 @@ export class EvolutionPhase extends Phase {
const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler; const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler;
const preName = this.pokemon.name; const preName = this.pokemon.name;
this.scene.ui.showText(`What?\n${preName} is evolving!`, null, () => { this.scene.ui.showText(i18next.t('menu:evolving', { pokemonName: preName }), null, () => {
this.pokemon.cry(); this.pokemon.cry();
this.pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => { this.pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => {
@ -187,8 +188,8 @@ export class EvolutionPhase extends Phase {
this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); this.scene.unshiftPhase(new EndEvolutionPhase(this.scene));
this.scene.ui.showText(`${preName} stopped evolving.`, null, () => { this.scene.ui.showText(i18next.t('menu:stoppedEvolving', { pokemonName: preName }), null, () => {
this.scene.ui.showText(`Would you like to pause evolutions for ${preName}?\nEvolutions can be re-enabled from the party screen.`, null, () => { this.scene.ui.showText(i18next.t('menu:pauseEvolutionsQuestion', { pokemonName: preName }), null, () => {
const end = () => { const end = () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.playBgm(); this.scene.playBgm();
@ -198,7 +199,7 @@ export class EvolutionPhase extends Phase {
this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { this.scene.ui.setOverlayMode(Mode.CONFIRM, () => {
this.scene.ui.revertMode(); this.scene.ui.revertMode();
this.pokemon.pauseEvolutions = true; this.pokemon.pauseEvolutions = true;
this.scene.ui.showText(`Evolutions have been paused for ${preName}.`, null, end, 3000); this.scene.ui.showText(i18next.t('menu:evolutionsPaused', { pokemonName: preName }), null, end, 3000);
}, () => { }, () => {
this.scene.ui.revertMode(); this.scene.ui.revertMode();
this.scene.time.delayedCall(3000, end); this.scene.time.delayedCall(3000, end);
@ -249,7 +250,7 @@ export class EvolutionPhase extends Phase {
this.scene.playSoundWithoutBgm('evolution_fanfare'); this.scene.playSoundWithoutBgm('evolution_fanfare');
evolvedPokemon.destroy(); evolvedPokemon.destroy();
this.scene.ui.showText(`Congratulations!\nYour ${preName} evolved into ${this.pokemon.name}!`, null, () => this.end(), null, true, Utils.fixedInt(4000)); this.scene.ui.showText(i18next.t('menu:evolutionDone', { pokemonName: preName, evolvedPokemonName: this.pokemon.name }), null, () => this.end(), null, true, Utils.fixedInt(4000));
this.scene.time.delayedCall(Utils.fixedInt(4250), () => this.scene.playBgm()); this.scene.time.delayedCall(Utils.fixedInt(4250), () => this.scene.playBgm());
}); });
}); });

View File

@ -179,10 +179,6 @@ export class Arena {
return 5; return 5;
} }
break; break;
case Species.SCATTERBUG:
case Species.SPEWPA:
case Species.VIVILLON:
return 0;
case Species.LYCANROC: case Species.LYCANROC:
const timeOfDay = this.getTimeOfDay(); const timeOfDay = this.getTimeOfDay();
switch (timeOfDay) { switch (timeOfDay) {
@ -194,13 +190,6 @@ export class Arena {
case TimeOfDay.NIGHT: case TimeOfDay.NIGHT:
return 1; return 1;
} }
case Species.CALYREX:
switch (this.biomeType) {
case Biome.SNOWY_FOREST:
return 1;
case Biome.GRAVEYARD:
return 2;
}
break; break;
} }
@ -217,6 +206,7 @@ export class Arena {
case Biome.TALL_GRASS: case Biome.TALL_GRASS:
return Type.GRASS; return Type.GRASS;
case Biome.FOREST: case Biome.FOREST:
case Biome.JUNGLE:
return Type.BUG; return Type.BUG;
case Biome.SLUM: case Biome.SLUM:
case Biome.SWAMP: case Biome.SWAMP:
@ -248,8 +238,10 @@ export class Arena {
case Biome.TEMPLE: case Biome.TEMPLE:
return Type.GHOST; return Type.GHOST;
case Biome.DOJO: case Biome.DOJO:
case Biome.CONSTRUCTION_SITE:
return Type.FIGHTING; return Type.FIGHTING;
case Biome.FACTORY: case Biome.FACTORY:
case Biome.LABORATORY:
return Type.STEEL; return Type.STEEL;
case Biome.RUINS: case Biome.RUINS:
case Biome.SPACE: case Biome.SPACE:
@ -259,6 +251,8 @@ export class Arena {
return Type.DRAGON; return Type.DRAGON;
case Biome.ABYSS: case Biome.ABYSS:
return Type.DARK; return Type.DARK;
default:
return Type.UNKNOWN;
} }
} }
@ -628,7 +622,7 @@ export class Arena {
case Biome.CONSTRUCTION_SITE: case Biome.CONSTRUCTION_SITE:
return 1.222; return 1.222;
case Biome.JUNGLE: case Biome.JUNGLE:
return 2.477; return 0.000;
case Biome.FAIRY_CAVE: case Biome.FAIRY_CAVE:
return 4.542; return 4.542;
case Biome.TEMPLE: case Biome.TEMPLE:

View File

@ -13,7 +13,7 @@ export default class DamageNumberHandler {
add(target: Pokemon, amount: integer, result: DamageResult | HitResult.HEAL = HitResult.EFFECTIVE, critical: boolean = false): void { add(target: Pokemon, amount: integer, result: DamageResult | HitResult.HEAL = HitResult.EFFECTIVE, critical: boolean = false): void {
const scene = target.scene; const scene = target.scene;
if (!scene.damageNumbersMode) if (!scene?.damageNumbersMode)
return; return;
const battlerIndex = target.getBattlerIndex(); const battlerIndex = target.getBattlerIndex();

View File

@ -4,7 +4,7 @@ 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 { Moves } from "../data/enums/moves"; import { Moves } from "../data/enums/moves";
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveTypeAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr } from "../data/move"; import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveTypeAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr } 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 * 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';
@ -27,7 +27,7 @@ import { TempBattleStat } from '../data/temp-battle-stat';
import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from '../data/arena-tag'; import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from '../data/arena-tag';
import { ArenaTagType } from "../data/enums/arena-tag-type"; import { ArenaTagType } from "../data/enums/arena-tag-type";
import { Biome } from "../data/enums/biome"; import { Biome } from "../data/enums/biome";
import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, FieldVariableMovePowerAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, NonSuperEffectiveImmunityAbAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, VariableMoveTypeAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPostDefendAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr } from '../data/ability'; import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, FieldVariableMovePowerAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, NonSuperEffectiveImmunityAbAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, VariableMoveTypeAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPostDefendAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr } from '../data/ability';
import { Abilities } from "#app/data/enums/abilities"; import { Abilities } from "#app/data/enums/abilities";
import PokemonData from '../system/pokemon-data'; import PokemonData from '../system/pokemon-data';
import Battle, { BattlerIndex } from '../battle'; import Battle, { BattlerIndex } from '../battle';
@ -940,7 +940,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
isGrounded(): boolean { isGrounded(): boolean {
return !this.isOfType(Type.FLYING, true) && this.getAbility().id !== Abilities.LEVITATE; return !this.isOfType(Type.FLYING, true) && !this.hasAbility(Abilities.LEVITATE);
} }
getAttackMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier { getAttackMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier {
@ -1096,11 +1096,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
let shinyThreshold = new Utils.IntegerHolder(32); let shinyThreshold = new Utils.IntegerHolder(32);
if (thresholdOverride === undefined) { if (thresholdOverride === undefined) {
if (!this.hasTrainer()) { if (!this.hasTrainer())
if (new Date() < new Date('2024-05-13'))
shinyThreshold.value *= 3;
this.scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold); this.scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold);
}
} else } else
shinyThreshold.value = thresholdOverride; shinyThreshold.value = thresholdOverride;
@ -1228,24 +1225,24 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
} }
if (this.level >= 25) { // No egg moves below level 25 if (this.level >= 60) { // No egg moves below level 60
for (let i = 0; i < 3; i++) { for (let i = 0; i < 3; i++) {
const moveId = speciesEggMoves[this.species.getRootSpeciesId()][i]; const moveId = speciesEggMoves[this.species.getRootSpeciesId()][i];
if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)')) if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)'))
movePool.push([moveId, Math.min(this.level * 0.5, 40)]); movePool.push([moveId, 40]);
} }
const moveId = speciesEggMoves[this.species.getRootSpeciesId()][3]; const moveId = speciesEggMoves[this.species.getRootSpeciesId()][3];
if (this.level >= 60 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)')) // No rare egg moves before level 60 if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)') && !this.isBoss()) // No rare egg moves before e4
movePool.push([moveId, Math.min(this.level * 0.2, 20)]); movePool.push([moveId, 30]);
if (this.fusionSpecies) { if (this.fusionSpecies) {
for (let i = 0; i < 3; i++) { for (let i = 0; i < 3; i++) {
const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][i]; const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][i];
if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)')) if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)'))
movePool.push([moveId, Math.min(this.level * 0.5, 30)]); movePool.push([moveId, 40]);
} }
const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][3]; const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][3];
if (this.level >= 60 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)')) // No rare egg moves before level 60 if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)') && !this.isBoss()) // No rare egg moves before e4
movePool.push([moveId, Math.min(this.level * 0.2, 20)]); movePool.push([moveId, 30]);
} }
} }
} }
@ -1543,11 +1540,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (!isTypeImmune) { if (!isTypeImmune) {
damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier.value * screenMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value); damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier.value * screenMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value);
if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) { if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) {
if(!move.getAttrs(BypassBurnDamageReductionAttr).length) {
const burnDamageReductionCancelled = new Utils.BooleanHolder(false); const burnDamageReductionCancelled = new Utils.BooleanHolder(false);
applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled); applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled);
if (!burnDamageReductionCancelled.value) if (!burnDamageReductionCancelled.value)
damage.value = Math.floor(damage.value / 2); damage.value = Math.floor(damage.value / 2);
} }
}
applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, battlerMove, damage);
/**
* For each {@link HitsTagAttr} the move has, doubles the damage of the move if:
* The target has a {@link BattlerTagType} that this move interacts with
* AND
* The move doubles damage when used against that tag
* */
move.getAttrs(HitsTagAttr).map(hta => hta as HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => { move.getAttrs(HitsTagAttr).map(hta => hta as HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => {
if (this.getTag(hta.tagType)) if (this.getTag(hta.tagType))
damage.value *= 2; damage.value *= 2;
@ -1567,7 +1575,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (!result) { if (!result) {
if (!typeMultiplier.value) if (!typeMultiplier.value)
result = HitResult.NO_EFFECT; result = move.id == Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT;
else { else {
const oneHitKo = new Utils.BooleanHolder(false); const oneHitKo = new Utils.BooleanHolder(false);
applyMoveAttrs(OneHitKOAttr, source, this, move, oneHitKo); applyMoveAttrs(OneHitKOAttr, source, this, move, oneHitKo);
@ -1635,6 +1643,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
case HitResult.NO_EFFECT: case HitResult.NO_EFFECT:
this.scene.queueMessage(i18next.t('battle:hitResultNoEffect', { pokemonName: this.name })); this.scene.queueMessage(i18next.t('battle:hitResultNoEffect', { pokemonName: this.name }));
break; break;
case HitResult.IMMUNE:
this.scene.queueMessage(`${this.name} is unaffected!`);
break;
case HitResult.ONE_HIT_KO: case HitResult.ONE_HIT_KO:
this.scene.queueMessage(i18next.t('battle:hitResultOneHitKO')); this.scene.queueMessage(i18next.t('battle:hitResultOneHitKO'));
break; break;
@ -2028,7 +2039,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return this.gender !== Gender.GENDERLESS && pokemon.gender === (this.gender === Gender.MALE ? Gender.FEMALE : Gender.MALE); return this.gender !== Gender.GENDERLESS && pokemon.gender === (this.gender === Gender.MALE ? Gender.FEMALE : Gender.MALE);
} }
canSetStatus(effect: StatusEffect, quiet: boolean = false, overrideStatus: boolean = false): boolean { canSetStatus(effect: StatusEffect, quiet: boolean = false, overrideStatus: boolean = false, sourcePokemon: Pokemon = null): boolean {
if (effect !== StatusEffect.FAINT) { if (effect !== StatusEffect.FAINT) {
if (overrideStatus ? this.status?.effect === effect : this.status) if (overrideStatus ? this.status?.effect === effect : this.status)
return false; return false;
@ -2036,11 +2047,32 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return false; return false;
} }
const types = this.getTypes(true, true);
switch (effect) { switch (effect) {
case StatusEffect.POISON: case StatusEffect.POISON:
case StatusEffect.TOXIC: case StatusEffect.TOXIC:
if (this.isOfType(Type.POISON) || this.isOfType(Type.STEEL)) // Check if the Pokemon is immune to Poison/Toxic or if the source pokemon is canceling the immunity
let poisonImmunity = types.map(defType => {
// Check if the Pokemon is not immune to Poison/Toxic
if (defType !== Type.POISON && defType !== Type.STEEL)
return false; return false;
// Check if the source Pokemon has an ability that cancels the Poison/Toxic immunity
const cancelImmunity = new Utils.BooleanHolder(false);
if (sourcePokemon) {
applyAbAttrs(IgnoreTypeStatusEffectImmunityAbAttr, sourcePokemon, cancelImmunity, effect, defType);
if (cancelImmunity.value)
return false;
}
return true;
})
if (this.isOfType(Type.POISON) || this.isOfType(Type.STEEL)) {
if (poisonImmunity.includes(true))
return false;
}
break; break;
case StatusEffect.PARALYSIS: case StatusEffect.PARALYSIS:
if (this.isOfType(Type.ELECTRIC)) if (this.isOfType(Type.ELECTRIC))
@ -2069,12 +2101,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return true; return true;
} }
trySetStatus(effect: StatusEffect, asPhase: boolean = false, cureTurn: integer = 0, sourceText: string = null): boolean { trySetStatus(effect: StatusEffect, asPhase: boolean = false, sourcePokemon: Pokemon = null, cureTurn: integer = 0, sourceText: string = null): boolean {
if (!this.canSetStatus(effect, asPhase)) if (!this.canSetStatus(effect, asPhase, false, sourcePokemon))
return false; return false;
if (asPhase) { if (asPhase) {
this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, cureTurn, sourceText)); this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, cureTurn, sourceText, sourcePokemon));
return true; return true;
} }
@ -2492,6 +2524,13 @@ export class PlayerPokemon extends Pokemon {
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);
if (Overrides.SHINY_OVERRIDE) {
this.shiny = true;
this.initShinySparkle();
if (Overrides.VARIANT_OVERRIDE)
this.variant = Overrides.VARIANT_OVERRIDE;
}
if (!dataSource) if (!dataSource)
this.generateAndPopulateMoveset(); this.generateAndPopulateMoveset();
this.generateCompatibleTms(); this.generateCompatibleTms();
@ -3336,7 +3375,8 @@ export enum HitResult {
HEAL, HEAL,
FAIL, FAIL,
MISS, MISS,
OTHER OTHER,
IMMUNE
} }
export type DamageResult = HitResult.EFFECTIVE | HitResult.SUPER_EFFECTIVE | HitResult.NOT_VERY_EFFECTIVE | HitResult.ONE_HIT_KO | HitResult.OTHER; export type DamageResult = HitResult.EFFECTIVE | HitResult.SUPER_EFFECTIVE | HitResult.NOT_VERY_EFFECTIVE | HitResult.ONE_HIT_KO | HitResult.OTHER;

View File

@ -100,6 +100,10 @@ export class LoadingScene extends SceneBase {
this.loadImage('summary_bg', 'ui'); this.loadImage('summary_bg', 'ui');
this.loadImage('summary_overlay_shiny', 'ui'); this.loadImage('summary_overlay_shiny', 'ui');
this.loadImage('summary_profile', 'ui'); this.loadImage('summary_profile', 'ui');
this.loadImage('summary_profile_prompt_z', 'ui') // The pixel Z button prompt
this.loadImage('summary_profile_prompt_a', 'ui'); // The pixel A button prompt
this.loadImage('summary_profile_ability', 'ui'); // Pixel text 'ABILITY'
this.loadImage('summary_profile_passive', 'ui'); // Pixel text 'PASSIVE'
this.loadImage('summary_status', 'ui'); this.loadImage('summary_status', 'ui');
this.loadImage('summary_stats', 'ui'); this.loadImage('summary_stats', 'ui');
this.loadImage('summary_stats_overlay_exp', 'ui'); this.loadImage('summary_stats_overlay_exp', 'ui');

View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const abilityTriggers: SimpleTranslationEntries = {
'blockRecoilDamage' : `{{pokemonName}} wurde durch {{abilityName}}\nvor Rückstoß geschützt!`,
} as const;

File diff suppressed because it is too large Load Diff

View File

@ -9,45 +9,47 @@ export const battle: SimpleTranslationEntries = {
"trainerComeBack": "{{trainerName}} ruft {{pokemonName}} zurück!", "trainerComeBack": "{{trainerName}} ruft {{pokemonName}} zurück!",
"playerGo": "Los! {{pokemonName}}!", "playerGo": "Los! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!", "trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!",
"switchQuestion": "Willst du\n{{pokemonName}} auswechseln?", "switchQuestion": "Möchtest du\n{{pokemonName}} auswechseln?",
"trainerDefeated": `You defeated\n{{trainerName}}!`, "trainerDefeated": `{{trainerName}}\nwurde besiegt!`,
"pokemonCaught": "{{pokemonName}} was caught!", "pokemonCaught": "{{pokemonName}} wurde gefangen!",
"pokemon": "Pokémon", "pokemon": "Pokémon",
"sendOutPokemon": "Los! {{pokemonName}}!", "sendOutPokemon": "Los, {{pokemonName}}!",
"hitResultCriticalHit": "A critical hit!", "hitResultCriticalHit": "Ein Volltreffer!",
"hitResultSuperEffective": "It's super effective!", "hitResultSuperEffective": "Das ist sehr effektiv!",
"hitResultNotVeryEffective": "It's not very effective…", "hitResultNotVeryEffective": "Das ist nicht sehr effektiv…",
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!", "hitResultNoEffect": "Es hat keine Wirkung auf {{pokemonName}}…",
"hitResultOneHitKO": "It's a one-hit KO!", "hitResultOneHitKO": "Ein K.O.-Treffer!",
"attackFailed": "But it failed!", "attackFailed": "Es ist fehlgeschlagen!",
"attackHitsCount": `Hit {{count}} time(s)!`, "attackHitsCount": `{{count}}-mal getroffen!`,
"expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!", "expGain": "{{pokemonName}} erhält\n{{exp}} Erfahrungspunkte!",
"levelUp": "{{pokemonName}} grew to\nLv. {{level}}!", "levelUp": "{{pokemonName}} erreicht\nLv. {{level}}!",
"learnMove": "{{pokemonName}} learned\n{{moveName}}!", "learnMove": "{{pokemonName}} erlernt\n{{moveName}}!",
"learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.", "learnMovePrompt": "{{pokemonName}} versucht, {{moveName}} zu erlernen.",
"learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.", "learnMoveLimitReached": "Aber {{pokemonName}} kann nur\nmaximal vier Attacken erlernen.",
"learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?", "learnMoveReplaceQuestion": "Soll eine bekannte Attacke durch\n{{moveName}} ersetzt werden?",
"learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?", "learnMoveStopTeaching": "{{moveName}} nicht\nerlernen?",
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.", "learnMoveNotLearned": "{{pokemonName}} hat\n{{moveName}} nicht erlernt.",
"learnMoveForgetQuestion": "Which move should be forgotten?", "learnMoveForgetQuestion": "Welche Attacke soll vergessen werden?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.", "learnMoveForgetSuccess": "{{pokemonName}} hat\n{{moveName}} vergessen.",
"countdownPoof": "@d{32}Eins, @d{15}zwei @d{15}und@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}schwupp!",
"learnMoveAnd": "Und…",
"levelCapUp": "Das Levellimit\nhat sich zu {{levelCap}} erhöht!", "levelCapUp": "Das Levellimit\nhat sich zu {{levelCap}} erhöht!",
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.", "moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",
"moveNoPP": "There's no PP left for\nthis move!", "moveNoPP": "Es sind keine AP für\ndiese Attacke mehr übrig!",
"moveDisabled": "{{moveName}} ist deaktiviert!", "moveDisabled": "{{moveName}} ist deaktiviert!",
"noPokeballForce": "Eine unsichtbare Kraft\nverhindert die Nutzung von Pokébällen.", "noPokeballForce": "Eine unsichtbare Kraft\nverhindert die Nutzung von Pokébällen.",
"noPokeballTrainer": "Du kannst das Pokémon\neines anderen Trainers nicht fangen!", "noPokeballTrainer": "Du kannst das Pokémon\neines anderen Trainers nicht fangen!",
"noPokeballMulti": "Du kannst erst einen Pokéball werden,\nwenn nur noch ein Pokémon übrig ist!", "noPokeballMulti": "Du kannst erst einen Pokéball werfen,\nwenn nur noch ein Pokémon übrig ist!",
"noPokeballStrong": "Das Ziel-Pokémon ist zu stark, um gefangen zu werden!\nDu musst es zuerst schwächen!", "noPokeballStrong": "Das Ziel-Pokémon ist zu stark, um gefangen zu werden!\nDu musst es zuerst schwächen!",
"noEscapeForce": "Eine unsichtbare Kraft\nverhindert die Flucht.", "noEscapeForce": "Eine unsichtbare Kraft\nverhindert die Flucht.",
"noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!", "noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!",
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!", "noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!",
"runAwaySuccess": "You got away safely!", "runAwaySuccess": "Du bist entkommen!",
"runAwayCannotEscape": 'You can\'t escape!', "runAwayCannotEscape": 'Flucht gescheitert!',
"escapeVerbSwitch": "auswechseln", "escapeVerbSwitch": "auswechseln",
"escapeVerbFlee": "flucht", "escapeVerbFlee": "flucht",
"skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?",
"notDisabled": "{{pokemonName}}'s {{moveName}} ist\nnicht mehr deaktiviert!", "notDisabled": "{{pokemonName}}'s {{moveName}} ist\nnicht mehr deaktiviert!",
"skipItemQuestion": "Are you sure you want to skip taking an item?",
"eggHatching": "Oh?", "eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?" "ivScannerUseQuestion": "IV-Scanner auf {{pokemonName}} benutzen?"
} as const; } as const;

View File

@ -1,4 +1,5 @@
import { ability } from "./ability"; import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
@ -16,6 +17,7 @@ import { tutorial } from "./tutorial";
export const deConfig = { export const deConfig = {
ability: ability, ability: ability,
abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,

View File

@ -1,7 +1,7 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = { export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP", "pp": "AP",
"power": "Power", "power": "Stärke",
"accuracy": "Accuracy", "accuracy": "Genauigkeit",
} as const; } as const;

View File

@ -1,10 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = { export const growth: SimpleTranslationEntries = {
"Erratic": "Erratic", "Erratic": "Unregelmäßig",
"Fast": "Fast", "Fast": "Schnell",
"Medium_Fast": "Medium Fast", "Medium_Fast": "Schneller",
"Medium_Slow": "Medium Slow", "Medium_Slow": "Langsamer",
"Slow": "Slow", "Slow": "Langsam",
"Fluctuating": "Fluctuating" "Fluctuating": "Schwankend"
} as const; } as const;

View File

@ -2,14 +2,14 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const menuUiHandler: SimpleTranslationEntries = { export const menuUiHandler: SimpleTranslationEntries = {
"GAME_SETTINGS": 'Spieleinstellungen', "GAME_SETTINGS": 'Spieleinstellungen',
"ACHIEVEMENTS": "Achievements", "ACHIEVEMENTS": "Erfolge",
"STATS": "Statistiken", "STATS": "Statistiken",
"VOUCHERS": "Gutscheine", "VOUCHERS": "Gutscheine",
"EGG_LIST": "Eierliste", "EGG_LIST": "Eierliste",
"EGG_GACHA": "Eier-Gacha", "EGG_GACHA": "Eier-Gacha",
"MANAGE_DATA": "Daten verwalten", "MANAGE_DATA": "Daten verwalten",
"COMMUNITY": "Community", "COMMUNITY": "Community",
"RETURN_TO_TITLE": "Zurück zum Titelbildschirm", "SAVE_AND_QUIT": "Save and Quit",
"LOG_OUT": "Ausloggen", "LOG_OUT": "Ausloggen",
"slot": "Slot {{slotNumber}}", "slot": "Slot {{slotNumber}}",
"importSession": "Sitzung importieren", "importSession": "Sitzung importieren",

View File

@ -35,12 +35,17 @@ export const menu: SimpleTranslationEntries = {
"boyOrGirl": "Bist du ein Junge oder ein Mädchen?", "boyOrGirl": "Bist du ein Junge oder ein Mädchen?",
"boy": "Junge", "boy": "Junge",
"girl": "Mädchen", "girl": "Mädchen",
"dailyRankings": "Daily Rankings", "evolving": "What?\n{{pokemonName}} is evolving!",
"weeklyRankings": "Weekly Rankings", "stoppedEvolving": "{{pokemonName}} stopped evolving.",
"noRankings": "No Rankings", "pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.",
"loading": "Loading…", "evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.",
"playersOnline": "Players Online", "evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!",
"empty":"Empty", "dailyRankings": "Tägliche Rangliste",
"yes":"Yes", "weeklyRankings": "Wöchentliche Rangliste",
"no":"No", "noRankings": "Keine Rangliste",
"loading": "Lade…",
"playersOnline": "Spieler Online",
"empty":"Leer",
"yes":"Ja",
"no":"Nein",
} as const; } as const;

View File

@ -42,8 +42,8 @@ export const move: MoveTranslationEntries = {
effect: "Das Ziel wird mit scharfen Klauen zerkratzt." effect: "Das Ziel wird mit scharfen Klauen zerkratzt."
}, },
"viseGrip": { "viseGrip": {
name: "Vise Grip", name: "Klammer",
effect: "The target is gripped and squeezed from both sides to inflict damage." effect: "Das Ziel wird umklammert und zusammengequetscht."
}, },
"guillotine": { "guillotine": {
name: "Guillotine", name: "Guillotine",
@ -2490,7 +2490,7 @@ export const move: MoveTranslationEntries = {
effect: "Der durch Z-Kraft energiegeladene Anwender rennt mit ganzer Kraft gegen das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der durch Z-Kraft energiegeladene Anwender rennt mit ganzer Kraft gegen das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"breakneckBlitzSpecial": { "breakneckBlitzSpecial": {
name: "Breakneck Blitz", name: "Hyper-Sprintangriff",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"allOutPummelingPhysical": { "allOutPummelingPhysical": {
@ -2498,7 +2498,7 @@ export const move: MoveTranslationEntries = {
effect: "Aus Z-Kraft hergestellte Energiebälle prallen mit voller Wucht auf das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Aus Z-Kraft hergestellte Energiebälle prallen mit voller Wucht auf das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"allOutPummelingSpecial": { "allOutPummelingSpecial": {
name: "All-Out Pummeling", name: "Fulminante Faustschläge",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"supersonicSkystrikePhysical": { "supersonicSkystrikePhysical": {
@ -2506,7 +2506,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender schwingt sich durch Z-Kraft in die Lüfte und stürzt sich dann auf das Ziel hinab. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender schwingt sich durch Z-Kraft in die Lüfte und stürzt sich dann auf das Ziel hinab. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"supersonicSkystrikeSpecial": { "supersonicSkystrikeSpecial": {
name: "Supersonic Skystrike", name: "Finaler Steilflug",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"acidDownpourPhysical": { "acidDownpourPhysical": {
@ -2514,7 +2514,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender kreiert mit Z-Kraft ein giftiges Moor, in dem das Ziel versinkt. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender kreiert mit Z-Kraft ein giftiges Moor, in dem das Ziel versinkt. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"acidDownpourSpecial": { "acidDownpourSpecial": {
name: "Acid Downpour", name: "Vernichtender Säureregen",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"tectonicRagePhysical": { "tectonicRagePhysical": {
@ -2522,7 +2522,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender zerrt das Ziel mit Z-Kraft tief in den Boden und kollidiert dort mit ihm. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender zerrt das Ziel mit Z-Kraft tief in den Boden und kollidiert dort mit ihm. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"tectonicRageSpecial": { "tectonicRageSpecial": {
name: "Tectonic Rage", name: "Seismische Eruption",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"continentalCrushPhysical": { "continentalCrushPhysical": {
@ -2530,7 +2530,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender beschwört mit Z-Kraft einen großen Felsen herbei und lässt ihn auf das Ziel fallen. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender beschwört mit Z-Kraft einen großen Felsen herbei und lässt ihn auf das Ziel fallen. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"continentalCrushSpecial": { "continentalCrushSpecial": {
name: "Continental Crush", name: "Apokalyptische Steinpresse",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"savageSpinOutPhysical": { "savageSpinOutPhysical": {
@ -2538,7 +2538,7 @@ export const move: MoveTranslationEntries = {
effect: "Mithilfe von Z-Kraft umwickelt der Anwender das Ziel mit Fäden. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Mithilfe von Z-Kraft umwickelt der Anwender das Ziel mit Fäden. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"savageSpinOutSpecial": { "savageSpinOutSpecial": {
name: "Savage Spin-Out", name: "Wirbelnder Insektenhieb",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"neverEndingNightmarePhysical": { "neverEndingNightmarePhysical": {
@ -2546,7 +2546,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender beschwört mit Z-Kraft tiefen Groll herbei und lässt diesen auf das Ziel los. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender beschwört mit Z-Kraft tiefen Groll herbei und lässt diesen auf das Ziel los. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"neverEndingNightmareSpecial": { "neverEndingNightmareSpecial": {
name: "Never-Ending Nightmare", name: "Ewige Nacht",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"corkscrewCrashPhysical": { "corkscrewCrashPhysical": {
@ -2554,7 +2554,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender wirbelt durch Z-Kraft sehr schnell umher und prallt mit dem Ziel zusammen. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender wirbelt durch Z-Kraft sehr schnell umher und prallt mit dem Ziel zusammen. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"corkscrewCrashSpecial": { "corkscrewCrashSpecial": {
name: "Corkscrew Crash", name: "Turbo-Spiralkombo",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"infernoOverdrivePhysical": { "infernoOverdrivePhysical": {
@ -2562,7 +2562,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender speit dank Z-Kraft eine gewaltige Kugel aus Flammen auf das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender speit dank Z-Kraft eine gewaltige Kugel aus Flammen auf das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"infernoOverdriveSpecial": { "infernoOverdriveSpecial": {
name: "Inferno Overdrive", name: "Dynamische Maxiflamme",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"hydroVortexPhysical": { "hydroVortexPhysical": {
@ -2570,7 +2570,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender kreiert mit Z-Kraft einen riesigen Wasserstrudel, der das Ziel verschluckt. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender kreiert mit Z-Kraft einen riesigen Wasserstrudel, der das Ziel verschluckt. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"hydroVortexSpecial": { "hydroVortexSpecial": {
name: "Hydro Vortex", name: "Super-Wassertornado",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"bloomDoomPhysical": { "bloomDoomPhysical": {
@ -2578,7 +2578,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender leiht sich durch Z-Kraft die Energie von Wiesenblumen und greift das Ziel damit an. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender leiht sich durch Z-Kraft die Energie von Wiesenblumen und greift das Ziel damit an. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"bloomDoomSpecial": { "bloomDoomSpecial": {
name: "Bloom Doom", name: "Brillante Blütenpracht",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"gigavoltHavocPhysical": { "gigavoltHavocPhysical": {
@ -2586,7 +2586,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender greift das Ziel mit durch Z-Kraft gesammelter starker Elektrizität an. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender greift das Ziel mit durch Z-Kraft gesammelter starker Elektrizität an. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"gigavoltHavocSpecial": { "gigavoltHavocSpecial": {
name: "Gigavolt Havoc", name: "Gigavolt-Funkensalve",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"shatteredPsychePhysical": { "shatteredPsychePhysical": {
@ -2594,7 +2594,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender kontrolliert das Ziel mit Z-Kraft und macht ihm so das Leben schwer. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender kontrolliert das Ziel mit Z-Kraft und macht ihm so das Leben schwer. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"shatteredPsycheSpecial": { "shatteredPsycheSpecial": {
name: "Shattered Psyche", name: "Psycho-Schmetterschlag",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"subzeroSlammerPhysical": { "subzeroSlammerPhysical": {
@ -2602,7 +2602,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender senkt mit Z-Kraft die Temperatur drastisch und lässt das Ziel einfrieren. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender senkt mit Z-Kraft die Temperatur drastisch und lässt das Ziel einfrieren. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"subzeroSlammerSpecial": { "subzeroSlammerSpecial": {
name: "Subzero Slammer", name: "Tobender Geofrost",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"devastatingDrakePhysical": { "devastatingDrakePhysical": {
@ -2610,7 +2610,7 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender materialisiert durch Z-Kraft seine Aura und greift damit das Ziel an. Die Stärke variiert je nach zugrunde liegender Attacke." effect: "Der Anwender materialisiert durch Z-Kraft seine Aura und greift damit das Ziel an. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"devastatingDrakeSpecial": { "devastatingDrakeSpecial": {
name: "Devastating Drake", name: "Drastisches Drachendröhnen",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"blackHoleEclipsePhysical": { "blackHoleEclipsePhysical": {
@ -2874,8 +2874,8 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender sammelt eine große Menge Energie und greift das Ziel damit an. Der Typ der Attacke hängt von dem der Disc ab." effect: "Der Anwender sammelt eine große Menge Energie und greift das Ziel damit an. Der Typ der Attacke hängt von dem der Disc ab."
}, },
"tenMillionVoltThunderbolt": { "tenMillionVoltThunderbolt": {
name: "10,000,000 Volt Thunderbolt", name: "Tausendfacher Donnerblitz",
effect: "The user, Pikachu wearing a cap, powers up a jolt of electricity using its Z-Power and unleashes it. Critical hits land more easily." effect: "Das eine Kappe tragende Pikachu greift das Ziel mit einem durch Z-Kraft verstärkten Elektroschock an. Hohe Volltrefferquote."
}, },
"mindBlown": { "mindBlown": {
name: "Knallkopf", name: "Knallkopf",
@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
}, },
"zippyZap": { "zippyZap": {
name: "Britzelturbo", name: "Britzelturbo",
effect: "Ein stürmischer Blitz-Angriff mit hoher Erstschlag- und Volltrefferquote." effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness."
}, },
"splishySplash": { "splishySplash": {
name: "Plätschersurfer", name: "Plätschersurfer",
@ -3306,507 +3306,507 @@ export const move: MoveTranslationEntries = {
effect: "Der Anwender greift mit gewaltigen Psycho-Kräften an. Die AP der letzten Attacke des Zieles werden um 3 Punkte gesenkt." effect: "Der Anwender greift mit gewaltigen Psycho-Kräften an. Die AP der letzten Attacke des Zieles werden um 3 Punkte gesenkt."
}, },
"direClaw": { "direClaw": {
name: "Dire Claw", name: "Unheilsklauen",
effect: "The user lashes out at the target with ruinous claws. This may also leave the target poisoned, paralyzed, or asleep." effect: "Der Anwender greift mit zerstörerischen Klauen an. Das Ziel wird eventuell vergiftet, paralysiert oder in Schlaf versetzt."
}, },
"psyshieldBash": { "psyshieldBash": {
name: "Psyshield Bash", name: "Barrierenstoß",
effect: "Cloaking itself in psychic energy, the user slams into the target. This also boosts the user's Defense stat." effect: "Der Anwender hüllt sich in Psycho-Energie und rammt das Ziel. Außerdem steigt seine Verteidigung."
}, },
"powerShift": { "powerShift": {
name: "Power Shift", name: "Kraftwechsel",
effect: "The user swaps its Attack and Defense stats." effect: "Der Anwender tauscht seinen Angriff mit seiner Verteidigung."
}, },
"stoneAxe": { "stoneAxe": {
name: "Stone Axe", name: "Felsaxt",
effect: "The user swings its stone axes at the target. Stone splinters left behind by this attack float around the target." effect: "Der Anwender greift mit seinen Felsäxten an. Dadurch verstreut er schwebende Felssplitter im Umkreis des Zieles."
}, },
"springtideStorm": { "springtideStorm": {
name: "Springtide Storm", name: "Frühlingsorkan",
effect: "The user attacks by wrapping opposing Pokémon in fierce winds brimming with love and hate. This may also lower their Attack stats." effect: "Der Anwender greift gegnerische Pokémon an, indem er sie mit heftigen Windböen voller Hassliebe umgibt. Eventuell sinkt ihr Angriff."
}, },
"mysticalPower": { "mysticalPower": {
name: "Mystical Power", name: "Mythenkraft",
effect: "The user attacks by emitting a mysterious power. This also boosts the user's Sp. Atk stat." effect: "Der Anwender greift mit einer wundersamen Kraft an. Außerdem steigt sein Spezial-Angriff."
}, },
"ragingFury": { "ragingFury": {
name: "Raging Fury", name: "Flammenwut",
effect: "The user rampages around spewing flames for two to three turns. The user then becomes confused." effect: "Der Anwender wütet zwei bis drei Runden lang und speit heftige Flammen aus. Danach wird er verwirrt."
}, },
"waveCrash": { "waveCrash": {
name: "Wave Crash", name: "Wellentackle",
effect: "The user shrouds itself in water and slams into the target with its whole body to inflict damage. This also damages the user quite a lot." effect: "Der Anwender hüllt sich in Wasser und stürzt sich mit dem ganzen Körper auf das Ziel, wobei er selbst großen Schaden erleidet."
}, },
"chloroblast": { "chloroblast": {
name: "Chloroblast", name: "Chlorostrahl",
effect: "The user launches its amassed chlorophyll to inflict damage on the target. This also damages the user." effect: "Der Anwender greift mit einer hohen Konzentration seines Chlorophylls an, wobei er selbst Schaden erleidet."
}, },
"mountainGale": { "mountainGale": {
name: "Mountain Gale", name: "Frostfallwind",
effect: "The user hurls giant chunks of ice at the target to inflict damage. This may also make the target flinch." effect: "Der Anwender wirft gigantische Eisbrocken auf das Ziel. Dieses schreckt eventuell zurück."
}, },
"victoryDance": { "victoryDance": {
name: "Victory Dance", name: "Siegestanz",
effect: "The user performs an intense dance to usher in victory, boosting its Attack, Defense, and Speed stats." effect: "Der Anwender führt einen wilden Tanz auf, der den Sieg herbeiführen soll. Dies erhöht seinen Angriff, seine Verteidigung und seine Initiative."
}, },
"headlongRush": { "headlongRush": {
name: "Headlong Rush", name: "Schmetterramme",
effect: "The user smashes into the target in a full-body tackle. This also lowers the user's Defense and Sp. Def stats." effect: "Der Anwender rammt das Ziel mit dem ganzen Körper. Dadurch sinken die Verteidigung und Spezial-Verteidigung des Anwenders."
}, },
"barbBarrage": { "barbBarrage": {
name: "Barb Barrage", name: "Giftstachelregen",
effect: "The user launches countless toxic barbs to inflict damage. This may also poison the target. This move's power is doubled if the target is already poisoned." effect: "Der Anwender greift mit unzähligen Giftstacheln an und vergiftet das Ziel eventuell. Doppelt so stark gegen vergiftete Ziele."
}, },
"esperWing": { "esperWing": {
name: "Esper Wing", name: "Auraschwingen",
effect: "The user slashes the target with aura-enriched wings. This also boosts the user's Speed stat. This move has a heightened chance of landing a critical hit." effect: "Ein schneidender Angriff mit durch eine Aura verstärkten Schwingen, der außerdem die Initiative des Anwenders erhöht. Hohe Volltrefferquote."
}, },
"bitterMalice": { "bitterMalice": {
name: "Bitter Malice", name: "Niedertracht",
effect: "The user attacks the target with spine-chilling resentment. This also lowers the target's Attack stat." effect: "Der Anwender greift mit eiskaltem, schaudererregendem Hass an und senkt dabei den Angriff des Zieles."
}, },
"shelter": { "shelter": {
name: "Shelter", name: "Refugium",
effect: "The user makes its skin as hard as an iron shield, sharply boosting its Defense stat." effect: "Der Anwender macht seine Haut so hart wie Eisen und erhöht dadurch seine Verteidigung stark."
}, },
"tripleArrows": { "tripleArrows": {
name: "Triple Arrows", name: "Drillingspfeile",
effect: "The user kicks, then fires three arrows. This move has a heightened chance of landing a critical hit and may also lower the target's Defense stat or make it flinch." effect: "Der Anwender tritt zu und schießt dann drei Pfeile ab. Senkt eventuell die Verteidigung des Zieles oder lässt es zurückschrecken. Hohe Volltrefferquote."
}, },
"infernalParade": { "infernalParade": {
name: "Infernal Parade", name: "Phantomparade",
effect: "The user attacks with myriad fireballs. This may also leave the target with a burn. This move's power is doubled if the target has a status condition." effect: "Angriff mit unzähligen Feuerkugeln, der dem Ziel eventuell Verbrennungen zufügt. Doppelt so stark gegen Ziele mit Statusproblemen."
}, },
"ceaselessEdge": { "ceaselessEdge": {
name: "Ceaseless Edge", name: "Klingenschwall",
effect: "The user slashes its shell blade at the target. Shell splinters left behind by this attack remain scattered under the target as spikes." effect: "Der Anwender greift mit einer klingengleichen Muschelschale an und verstreut Muschelsplitter, die Stacheln zu Füßen des Zieles werden."
}, },
"bleakwindStorm": { "bleakwindStorm": {
name: "Bleakwind Storm", name: "Polarorkan",
effect: "The user attacks with savagely cold winds that cause both body and spirit to tremble. This may also lower the Speed stats of opposing Pokémon." effect: "Der Anwender greift mit starken, kalten Winden an, die Körper und Geist erzittern lassen. Senkt eventuell die Initiative gegnerischer Pokémon."
}, },
"wildboltStorm": { "wildboltStorm": {
name: "Wildbolt Storm", name: "Donnerorkan",
effect: "The user summons a thunderous tempest and savagely attacks with lightning and wind. This may also leave opposing Pokémon with paralysis." effect: "Der Anwender ruft ein heftiges Unwetter herbei, um mit Wind und Blitzen anzugreifen. Gegnerische Pokémon werden eventuell paralysiert."
}, },
"sandsearStorm": { "sandsearStorm": {
name: "Sandsear Storm", name: "Wüstenorkan",
effect: "The user attacks by wrapping opposing Pokémon in fierce winds and searingly hot sand. This may also leave them with a burn." effect: "Der Anwender greift gegnerische Pokémon an, indem er sie mit heftigen Windböen und brennend heißem Sand umgibt. Eventuell erleiden sie Verbrennungen."
}, },
"lunarBlessing": { "lunarBlessing": {
name: "Lunar Blessing", name: "Lunargebet",
effect: "The user receives a blessing from the crescent moon, restoring HP and curing status conditions for itself and its ally Pokémon currently in the battle." effect: "Der Anwender richtet ein Gebet an den Mond und heilt bei sich und seinen am Kampf beteiligten Mitstreitern KP und hebt jegliche Statusprobleme auf."
}, },
"takeHeart": { "takeHeart": {
name: "Take Heart", name: "Mutschub",
effect: "The user lifts its spirits, curing its own status conditions and boosting its Sp. Atk and Sp. Def stats." effect: "Der Anwender fasst sich ein Herz, befreit sich von Statusproblemen und erhöht außerdem seinen Spezial-Angriff und seine Spezial-Verteidigung."
}, },
"gMaxWildfire": { "gMaxWildfire": {
name: "G-Max Wildfire", name: "Giga-Feuerflug",
effect: "A Fire-type attack that Gigantamax Charizard use. This move continues to deal damage to opponents for four turns." effect: "Eine Feuer-Attacke, die nur Gigadynamax-Glurak einsetzen kann. Fügt vier Runden lang Schaden zu."
}, },
"gMaxBefuddle": { "gMaxBefuddle": {
name: "G-Max Befuddle", name: "Giga-Benebelung",
effect: "A Bug-type attack that Gigantamax Butterfree use. This move inflicts the poisoned, paralyzed, or asleep status condition on opponents." effect: "Eine Käfer-Attacke, die nur Gigadynamax-Smettbo einsetzen kann. Gegnerische Pokémon werden entweder vergiftet, paralysiert oder in Schlaf versetzt."
}, },
"gMaxVoltCrash": { "gMaxVoltCrash": {
name: "G-Max Volt Crash", name: "Giga-Blitzhagel",
effect: "An Electric-type attack that Gigantamax Pikachu use. This move paralyzes opponents." effect: "Eine Elektro-Attacke, die nur Gigadynamax-Pikachu einsetzen kann. Gegnerische Pokémon werden paralysiert."
}, },
"gMaxGoldRush": { "gMaxGoldRush": {
name: "G-Max Gold Rush", name: "Giga-Münzregen",
effect: "A Normal-type attack that Gigantamax Meowth use. This move confuses opponents and also earns extra money." effect: "Eine Normal-Attacke, die nur Gigadynamax-Mauzi einsetzen kann. Verwirrt Gegner und bringt nach dem Kampf Geld ein."
}, },
"gMaxChiStrike": { "gMaxChiStrike": {
name: "G-Max Chi Strike", name: "Giga-Fokusschlag",
effect: "A Fighting-type attack that Gigantamax Machamp use. This move raises the chance of critical hits." effect: "Eine Kampf-Attacke, die nur Gigadynamax-Machomei einsetzen kann. Erhöht die Volltrefferquote auf Mitstreiterseite."
}, },
"gMaxTerror": { "gMaxTerror": {
name: "G-Max Terror", name: "Giga-Spuksperre",
effect: "A Ghost-type attack that Gigantamax Gengar use. This Pokémon steps on the opposing Pokémon's shadow to prevent them from escaping." effect: "Eine Geister-Attacke, die nur Gigadynamax-Gengar einsetzen kann. Hindert gegnerische Pokémon an der Flucht beziehungsweise am Auswechseln."
}, },
"gMaxResonance": { "gMaxResonance": {
name: "G-Max Resonance", name: "Giga-Melodie",
effect: "An Ice-type attack that Gigantamax Lapras use. This move reduces the damage received for five turns." effect: "Eine Eis-Attacke, die nur Gigadynamax-Lapras einsetzen kann. Reduziert fünf Runden lang den erlittenen Schaden."
}, },
"gMaxCuddle": { "gMaxCuddle": {
name: "G-Max Cuddle", name: "Giga-Gekuschel",
effect: "A Normal-type attack that Gigantamax Eevee use. This move infatuates opponents." effect: "Eine Normal-Attacke, die nur Gigadynamax-Evoli einsetzen kann. Gegnerische Pokémon verlieben sich in es."
}, },
"gMaxReplenish": { "gMaxReplenish": {
name: "G-Max Replenish", name: "Giga-Recycling",
effect: "A Normal-type attack that Gigantamax Snorlax use. This move restores Berries that have been eaten." effect: "Eine Normal-Attacke, die nur Gigadynamax-Relaxo einsetzen kann. Stellt bereits verzehrte Beeren wieder her."
}, },
"gMaxMalodor": { "gMaxMalodor": {
name: "G-Max Malodor", name: "Giga-Gestank",
effect: "A Poison-type attack that Gigantamax Garbodor use. This move poisons opponents." effect: "Eine Gift-Attacke, die nur Gigadynamax-Deponitox einsetzen kann. Vergiftet gegnerische Pokémon."
}, },
"gMaxStonesurge": { "gMaxStonesurge": {
name: "G-Max Stonesurge", name: "Giga-Geröll",
effect: "A Water-type attack that Gigantamax Drednaw use. This move scatters sharp rocks around the field." effect: "Eine Wasser-Attacke, die nur Gigadynamax-Kamalm einsetzen kann. Verstreut viele spitze Steinbrocken auf dem Kampffeld."
}, },
"gMaxWindRage": { "gMaxWindRage": {
name: "G-Max Wind Rage", name: "Giga-Sturmstoß",
effect: "A Flying-type attack that Gigantamax Corviknight use. This move removes the effects of moves like Reflect and Light Screen." effect: "Eine Flug-Attacke, die nur Gigadynamax-Krarmor einsetzen kann. Beseitigt die Effekte von Attacken wie Reflektor und Lichtschild.."
}, },
"gMaxStunShock": { "gMaxStunShock": {
name: "G-Max Stun Shock", name: "Giga-Voltschlag",
effect: "An Electric-type attack that Gigantamax Toxtricity use. This move poisons or paralyzes opponents." effect: "Eine Elektro-Attacke, die nur Gigadynamax-Riffex einsetzen kann. Vergiftet oder paralysiert gegnerische Pokémon."
}, },
"gMaxFinale": { "gMaxFinale": {
name: "G-Max Finale", name: "Giga-Lichtblick",
effect: "A Fairy-type attack that Gigantamax Alcremie use. This move heals the HP of allies." effect: "Eine Feen-Attacke, die nur Gigadynamax-Pokusan einsetzen kann. Füllt die KP auf Mitstreiterseite auf."
}, },
"gMaxDepletion": { "gMaxDepletion": {
name: "G-Max Depletion", name: "Giga-Dämpfer",
effect: "A Dragon-type attack that Gigantamax Duraludon use. Reduces the PP of the last move used." effect: "Eine Drachen-Attacke, die nur Gigadynamax-Duraludon einsetzen kann. AP der letzten Attacke, die gegnerische Pokémon eingesetzt haben, werden gesenkt."
}, },
"gMaxGravitas": { "gMaxGravitas": {
name: "G-Max Gravitas", name: "Giga-Astrowellen",
effect: "A Psychic-type attack that Gigantamax Orbeetle use. This move changes gravity for five turns." effect: "Eine Psycho-Attacke, die nur Gigadynamax-Maritellit einsetzen kann. Ändert die Erdanziehung für fünf Runden."
}, },
"gMaxVolcalith": { "gMaxVolcalith": {
name: "G-Max Volcalith", name: "Giga-Schlacke",
effect: "A Rock-type attack that Gigantamax Coalossal use. This move continues to deal damage to opponents for four turns." effect: "Eine Gesteins-Attacke, die nur Gigadynamax-Montecarbo einsetzen kann. Fügt vier Runden lang Schaden zu."
}, },
"gMaxSandblast": { "gMaxSandblast": {
name: "G-Max Sandblast", name: "Giga-Sandstoß",
effect: "A Ground-type attack that Gigantamax Sandaconda use. Opponents are trapped in a raging sandstorm for four to five turns." effect: "Eine Boden-Attacke, die nur Gigadynamax-Sanaconda einsetzen kann. Eine Sandhose wütet für vier bis fünf Runden."
}, },
"gMaxSnooze": { "gMaxSnooze": {
name: "G-Max Snooze", name: "Giga-Gähnzwang",
effect: "A Dark-type attack that Gigantamax Grimmsnarl use. The user lets loose a huge yawn that lulls the targets into falling asleep on the next turn." effect: "Eine Unlicht-Attacke, die nur Gigadynamax-Olangaar einsetzen kann. Mit einem großen Gähner wird das Ziel müde gemacht und schläft in der nächsten Runde ein."
}, },
"gMaxTartness": { "gMaxTartness": {
name: "G-Max Tartness", name: "Giga-Säureguss",
effect: "A Grass-type attack that Gigantamax Flapple use. This move reduces the opponents' evasiveness." effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Drapfel einsetzen kann. Senkt den Ausweichwert der gegnerischen Pokémon."
}, },
"gMaxSweetness": { "gMaxSweetness": {
name: "G-Max Sweetness", name: "Giga-Nektarflut",
effect: "A Grass-type attack that Gigantamax Appletun use. This move heals the status conditions of allies." effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Schlapfel einsetzen kann. Heilt Statusprobleme auf Mitstreiterseite."
}, },
"gMaxSmite": { "gMaxSmite": {
name: "G-Max Smite", name: "Giga-Sanktion",
effect: "A Fairy-type attack that Gigantamax Hatterene use. This move confuses opponents." effect: "Eine Feen-Attacke, die nur Gigadynamax-Silembrim einsetzen kann. Verwirrt gegnerische Pokémon."
}, },
"gMaxSteelsurge": { "gMaxSteelsurge": {
name: "G-Max Steelsurge", name: "Giga-Stahlschlag",
effect: "A Steel-type attack that Gigantamax Copperajah use. This move scatters sharp spikes around the field." effect: "Eine Stahl-Attacke, die nur Gigadynamax-Patinaraja einsetzen kann. Verstreut viele zackige Stahlsplitter auf dem Kampffeld."
}, },
"gMaxMeltdown": { "gMaxMeltdown": {
name: "G-Max Meltdown", name: "Giga-Schmelze",
effect: "A Steel-type attack that Gigantamax Melmetal use. This move makes opponents incapable of using the same move twice in a row." effect: "Eine Stahl-Attacke, die nur Gigadynamax-Melmetal einsetzen kann. Hindert Gegner am wiederholten Einsatz derselben Attacke."
}, },
"gMaxFoamBurst": { "gMaxFoamBurst": {
name: "G-Max Foam Burst", name: "Giga-Schaumbad",
effect: "A Water-type attack that Gigantamax Kingler use. This move harshly lowers the Speed of opponents." effect: "Eine Wasser-Attacke, die nur Gigadynamax-Kingler einsetzen kann. Senkt die Initiative der gegnerischen Pokémon stark."
}, },
"gMaxCentiferno": { "gMaxCentiferno": {
name: "G-Max Centiferno", name: "Giga-Feuerkessel",
effect: "A Fire-type attack that Gigantamax Centiskorch use. This move traps opponents in flames for four to five turns." effect: "Eine Feuer-Attacke, die nur Gigadynamax-Infernopod einsetzen kann. Schließt gegnerische Pokémon vier bis fünf Runden in wirbelnden Flammen ein."
}, },
"gMaxVineLash": { "gMaxVineLash": {
name: "G-Max Vine Lash", name: "Giga-Geißel",
effect: "A Grass-type attack that Gigantamax Venusaur use. This move continues to deal damage to opponents for four turns." effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Bisaflor einsetzen kann. Geißelt gegnerische Pokémon vier Runden lang mit peitschenartigen Ranken."
}, },
"gMaxCannonade": { "gMaxCannonade": {
name: "G-Max Cannonade", name: "Giga-Beschuss",
effect: "A Water-type attack that Gigantamax Blastoise use. This move continues to deal damage to opponents for four turns." effect: "Eine Wasser-Attacke, die nur Gigadynamax-Turtok einsetzen kann. Schließt gegnerische Pokémon vier Runden lang in einem Wasserwirbel ein."
}, },
"gMaxDrumSolo": { "gMaxDrumSolo": {
name: "G-Max Drum Solo", name: "Giga-Getrommel",
effect: "A Grass-type attack that Gigantamax Rillaboom use. This move can be used on the target regardless of its Abilities." effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Gortrom einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten."
}, },
"gMaxFireball": { "gMaxFireball": {
name: "G-Max Fireball", name: "Giga-Brandball",
effect: "A Fire-type attack that Gigantamax Cinderace use. This move can be used on the target regardless of its Abilities." effect: "Eine Feuer-Attacke, die nur Gigadynamax-Liberlo einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten."
}, },
"gMaxHydrosnipe": { "gMaxHydrosnipe": {
name: "G-Max Hydrosnipe", name: "Giga-Schütze",
effect: "A Water-type attack that Gigantamax Inteleon use. This move can be used on the target regardless of its Abilities." effect: "Eine Wasser-Attacke, die nur Gigadynamax-Intelleon einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten."
}, },
"gMaxOneBlow": { "gMaxOneBlow": {
name: "G-Max One Blow", name: "Giga-Einzelhieb",
effect: "A Dark-type attack that Gigantamax Urshifu use. This single-strike move can ignore Max Guard." effect: "Eine Unlicht-Attacke, die nur Gigadynamax-Wulaosu einsetzen kann. Dieser Einzelhieb ignoriert die schützende Wirkung von Dyna-Wall."
}, },
"gMaxRapidFlow": { "gMaxRapidFlow": {
name: "G-Max Rapid Flow", name: "Giga-Multihieb",
effect: "A Water-type attack that Gigantamax Urshifu use. This rapid-strike move can ignore Max Guard." effect: "Eine Wasser-Attacke, die nur Gigadynamax-Wulaosu einsetzen kann. Dieser Multihieb ignoriert die schützende Wirkung von Dyna-Wall."
}, },
"teraBlast": { "teraBlast": {
name: "Tera Blast", name: "Tera-Ausbruch",
effect: "If the user has Terastallized, it unleashes energy of its Tera Type. This move inflicts damage using the Attack or Sp. Atk stat-whichever is higher for the user." effect: "Ist der Anwender terakristallisiert, greift er mit Energie seines Tera-Typs an. Der Schaden hängt vom Angriff oder Spezial-Angriff ab, je nachdem, welcher Wert höher ist."
}, },
"silkTrap": { "silkTrap": {
name: "Silk Trap", name: "Fadenfalle",
effect: "The user spins a silken trap, protecting itself from damage while lowering the Speed stat of any attacker that makes direct contact." effect: "Der Anwender spannt eine Falle aus Fäden und wird so vor Angriffen geschützt. Berührt ihn nun ein Angreifer, sinkt dessen Initiative."
}, },
"axeKick": { "axeKick": {
name: "Axe Kick", name: "Fersenkick",
effect: "The user attacks by kicking up into the air and slamming its heel down upon the target. This may also confuse the target. If it misses, the user takes damage instead." effect: "Der Anwender greift an, indem er seine erhobene Ferse hinunterschnellen lässt. Das Ziel wird eventuell verwirrt. Bei Misserfolg verletzt sich der Anwender selbst."
}, },
"lastRespects": { "lastRespects": {
name: "Last Respects", name: "Letzte Ehre",
effect: "The user attacks to avenge its allies. The more defeated allies there are in the user's party, the greater the move's power." effect: "Der Anwender rächt gefallene Mitstreiter. Je mehr kampfunfähige Pokémon sich im Team befinden, desto stärker ist die Attacke."
}, },
"luminaCrash": { "luminaCrash": {
name: "Lumina Crash", name: "Lichteinschlag",
effect: "The user attacks by unleashing a peculiar light that even affects the mind. This also harshly lowers the target's Sp. Def stat." effect: "Der Anwender greift an, indem er ein sonderbares Licht freisetzt, das sich auch auf die Psyche auswirkt. Zudem wird die Spezial-Verteidigung des Zieles stark gesenkt."
}, },
"orderUp": { "orderUp": {
name: "Order Up", name: "Auftischen",
effect: "The user attacks with elegant poise. If the user has a Tatsugiri in its mouth, this move boosts one of the user's stats based on the Tatsugiri's form." effect: "Eine Attacke mit geübten Bewegungen. Trägt der Anwender ein Nigiragi im Maul, erhöht sich je nach dessen Form ein Statuswert des Anwenders."
}, },
"jetPunch": { "jetPunch": {
name: "Jet Punch", name: "Düsenhieb",
effect: "The user summons a torrent around its fist and punches at blinding speed. This move always goes first." effect: "Bei dieser Erstschlag-Attacke hüllt der Anwender seine Faust in einen Strudel und greift mit einem extrem schnellen Hieb an."
}, },
"spicyExtract": { "spicyExtract": {
name: "Spicy Extract", name: "Chili-Essenz",
effect: "The user emits an incredibly spicy extract, sharply boosting the target's Attack stat and harshly lowering the target's Defense stat." effect: "Der Anwender setzt eine unglaublich scharfe Essenz frei, die den Angriff des Zieles stark erhöht, aber seine Verteidigung stark senkt."
}, },
"spinOut": { "spinOut": {
name: "Spin Out", name: "Reifendrehung",
effect: "The user spins furiously by straining its legs, inflicting damage on the target. This also harshly lowers the user's Speed stat." effect: "Der Anwender wirbelt wild umher, indem er sein Gewicht auf seine Extremitäten verlagert, und richtet so Schaden an. Seine eigene Initiative sinkt dadurch stark"
}, },
"populationBomb": { "populationBomb": {
name: "Population Bomb", name: "Mäuseplage",
effect: "The user's fellows gather in droves to perform a combo attack that hits the target one to ten times in a row." effect: "Der Anwender versammelt eine Schar von Artgenossen, die dann geschlossen angreift und das Ziel ein- bis zehnmal hintereinander trifft."
}, },
"iceSpinner": { "iceSpinner": {
name: "Ice Spinner", name: "Eiskreisel",
effect: "The user covers its feet in thin ice and twirls around, slamming into the target. This move's spinning motion also destroys the terrain." effect: "Der Anwender hüllt seine Füße in dünnes Eis, wirbelt herum und greift so das Ziel an. Die Drehung zerstört etwaige Felder"
}, },
"glaiveRush": { "glaiveRush": {
name: "Glaive Rush", name: "Großklingenstoß",
effect: "The user throws its entire body into a reckless charge. After this move is used, attacks on the user cannot miss and will inflict double damage until the user's next turn." effect: "Der Anwender stürzt sich waghalsig auf das Ziel. Bis zum nächsten Zug des Anwenders treffen ihn gegnerische Angriffe garantiert und richten doppelten Schaden an."
}, },
"revivalBlessing": { "revivalBlessing": {
name: "Revival Blessing", name: "Vitalsegen",
effect: "The user bestows a loving blessing, reviving a party Pokémon that has fainted and restoring half that Pokémon's max HP." effect: "Der Anwender belebt mit einem Wunsch voller Mitgefühl ein kampfunfähiges Team-Mitglied wieder und stellt die Hälfte dessen maximaler KP wieder her."
}, },
"saltCure": { "saltCure": {
name: "Salt Cure", name: "Pökelsalz",
effect: "The user salt cures the target, inflicting damage every turn. Steel and Water types are more strongly affected by this move." effect: "Der Anwender pökelt das Ziel mit Salz ein, wodurch dieses jede Runde Schaden erleidet. Stahl- und Wasser-Pokémon leiden besonders darunter."
}, },
"tripleDive": { "tripleDive": {
name: "Triple Dive", name: "Tauchtriade",
effect: "The user performs a perfectly timed triple dive, hitting the target with splashes of water three times in a row." effect: "Der Anwender taucht mit perfekt abgestimmtem Timing ab und trifft das Ziel mit Wasserspritzern. Dabei richtet er dreimal hintereinander Schaden an."
}, },
"mortalSpin": { "mortalSpin": {
name: "Mortal Spin", name: "Letalwirbler",
effect: "The user performs a spin attack that can also eliminate the effects of such moves as Bind, Wrap, and Leech Seed. This also poisons opposing Pokémon." effect: "Der Anwender greift mit einer wirbelnden Attacke an, die Gegner auch vergiftet. Befreit den Anwender unter anderem von Wickel, Klammergriff und Egelsamen."
}, },
"doodle": { "doodle": {
name: "Doodle", name: "Abpausen",
effect: "The user captures the very essence of the target in a sketch. This changes the Abilities of the user and its ally Pokémon to that of the target." effect: "Der Anwender kopiert die wahre Essenz des Zieles. Dadurch erhalten alle Pokémon auf der Mitstreiterseite die Fähigkeit des Zieles."
}, },
"filletAway": { "filletAway": {
name: "Fillet Away", name: "Abspaltung",
effect: "The user sharply boosts its Attack, Sp. Atk, and Speed stats by using its own HP." effect: "Der Anwender setzt seine KP ein, um seinen Angriff, seinen Spezial-Angriff und seine Initiative stark zu erhöhen."
}, },
"kowtowCleave": { "kowtowCleave": {
name: "Kowtow Cleave", name: "Kniefallspalter",
effect: "The user slashes at the target after kowtowing to make the target let down its guard. This attack never misses." effect: "Der Anwender fällt auf die Knie und verleitet das Ziel zu Unachtsamkeit, bevor er mit einer Klinge zuschlägt. Diese Attacke trifft garantiert."
}, },
"flowerTrick": { "flowerTrick": {
name: "Flower Trick", name: "Blumentrick",
effect: "The user throws a rigged bouquet of flowers at the target. This attack never misses and always lands a critical hit." effect: "Der Anwender greift an, indem er dem Ziel einen Trick-Strauß zuwirft. Diese Attacke trifft immer und hat zudem Volltreffergarantie."
}, },
"torchSong": { "torchSong": {
name: "Torch Song", name: "Loderlied",
effect: "The user blows out raging flames as if singing a song, scorching the target. This also boosts the user's Sp. Atk stat." effect: "Der Anwender spuckt inbrünstig lodernde Flammen, als würde er singen, und versengt das Ziel. Dadurch steigt auch der Spezial-Angriff des Anwenders."
}, },
"aquaStep": { "aquaStep": {
name: "Aqua Step", name: "Wogentanz",
effect: "The user toys with the target and attacks it using light and fluid dance steps. This also boosts the user's Speed stat." effect: "Der Anwender neckt das Ziel mit flinken, fließenden Tanzschritten und greift es dann an. Dadurch steigt auch die Initiative des Anwenders."
}, },
"ragingBull": { "ragingBull": {
name: "Raging Bull", name: "Rasender Stier",
effect: "The user performs a tackle like a raging bull. This move's type depends on the user's form. It can also break barriers, such as Light Screen and Reflect." effect: "Ein rasender Angriff eines wilden Stiers, der auch Barrieren wie Lichtschild und Reflektor durchbricht. Der Attacken-Typ hängt von der Form des Anwenders ab."
}, },
"makeItRain": { "makeItRain": {
name: "Make It Rain", name: "Goldrausch",
effect: "The user attacks by throwing out a mass of coins. This also lowers the user's Sp. Atk stat. Money is earned after the battle." effect: "Der Anwender greift an, indem er Unmengen an Münzen ausschüttet, senkt dabei aber seinen Spezial-Angriff. Das Geld wird nach dem Kampf aufgesammelt."
}, },
"psyblade": { "psyblade": {
name: "Psyblade", name: "Psychoschneide",
effect: "The user rends the target with an ethereal blade. This move's power is boosted by 50 percent if the user is on Electric Terrain." effect: "Das Ziel wird mit einer immateriellen Klinge angegriffen. Die Stärke der Attacke steigt um 50 %, wenn beim Anwender ein Elektrofeld aktiv ist."
}, },
"hydroSteam": { "hydroSteam": {
name: "Hydro Steam", name: "Hydrodampf",
effect: "The user blasts the target with boiling-hot water. This move's power is not lowered in harsh sunlight but rather boosted by 50 percent." effect: "Das Ziel wird kraftvoll mit brodelndem Wasser übergossen. Wider Erwarten sinkt die Stärke der Attacke bei starkem Sonnenlicht nicht, sondern steigt um 50 %."
}, },
"ruination": { "ruination": {
name: "Ruination", name: "Verderben",
effect: "The user summons a ruinous disaster. This cuts the target's HP in half." effect: "Der Anwender beschwört Verderben bringendes Unheil herauf und halbiert die KP des Zieles."
}, },
"collisionCourse": { "collisionCourse": {
name: "Collision Course", name: "Kollisionskurs",
effect: "The user transforms and crashes to the ground, causing a massive prehistoric explosion. This move's power is boosted more than usual if it's a supereffective hit." effect: "Der Anwender wechselt seine Form, während er sich gen Boden stürzt, und verursacht eine riesige Ur-Explosion. Ist die Attacke sehr effektiv, steigt ihre Stärke noch mehr."
}, },
"electroDrift": { "electroDrift": {
name: "Electro Drift", name: "Blitztour",
effect: "The user races forward at ultrafast speeds, piercing its target with futuristic electricity. This move's power is boosted more than usual if it's a supereffective hit." effect: "Der Anwender wechselt bei rasantem Tempo seine Form und trifft das Ziel mit einem futuristischen Elektroschlag. Ist die Attacke sehr effektiv, steigt ihre Stärke noch mehr."
}, },
"shedTail": { "shedTail": {
name: "Shed Tail", name: "Schwanzabwurf",
effect: "The user creates a substitute for itself using its own HP before switching places with a party Pokémon in waiting." effect: "Der Anwender setzt seine KP ein, um einen Doppelgänger zu erzeugen, und tauscht dann den Platz mit einem anderen Pokémon."
}, },
"chillyReception": { "chillyReception": {
name: "Chilly Reception", name: "Eisige Stimmung",
effect: "The user tells a chillingly bad joke before switching places with a party Pokémon in waiting. This summons a snowstorm lasting five turns." effect: "Der Anwender sorgt mit einem schlechten Witz für eisige Stimmung und tauscht den Platz mit einem anderen Pokémon. Erzeugt fünf Runden lang Schnee."
}, },
"tidyUp": { "tidyUp": {
name: "Tidy Up", name: "Aufräumen",
effect: "The user tidies up and removes the effects of Spikes, Stealth Rock, Sticky Web, Toxic Spikes, and Substitute. This also boosts the user's Attack and Speed stats." effect: "Die Effekte von Stachler, Tarnsteine, Klebenetz, Giftspitzen und Delegator werden aufgehoben. Zudem steigen der Angriff und die Initiative des Anwenders."
}, },
"snowscape": { "snowscape": {
name: "Snowscape", name: "Schneelandschaft",
effect: "The user summons a snowstorm lasting five turns. This boosts the Defense stats of Ice types." effect: "Erzeugt fünf Runden lang Schnee. Dadurch wird die Verteidigung von Eis-Pokémon erhöht."
}, },
"pounce": { "pounce": {
name: "Pounce", name: "Anspringen",
effect: "The user attacks by pouncing on the target. This also lowers the target's Speed stat." effect: "Der Anwender greift an, indem er das Ziel anspringt. Dadurch sinkt auch die Initiative des Zieles."
}, },
"trailblaze": { "trailblaze": {
name: "Trailblaze", name: "Wegbereiter",
effect: "The user attacks suddenly as if leaping out from tall grass. The user's nimble footwork boosts its Speed stat." effect: "Der Anwender greift an, als würde er aus hohem Gras hervorspringen. Mit wendigen Schritten erhöht er seine Initiative."
}, },
"chillingWater": { "chillingWater": {
name: "Chilling Water", name: "Kalte Dusche",
effect: "The user attacks the target by showering it with water that's so cold it saps the target's power. This also lowers the target's Attack stat." effect: "Der Anwender greift an, indem er das Ziel mit eiskaltem Wasser überschüttet. Das raubt dem Ziel seinen Kampfgeist und senkt so seinen Angriff."
}, },
"hyperDrill": { "hyperDrill": {
name: "Hyper Drill", name: "Hyperbohrer",
effect: "The user spins the pointed part of its body at high speed to pierce the target. This attack can hit a target using a move such as Protect or Detect." effect: " Der Anwender lässt einen spitzen Teil seines Körpers rasant rotieren, sticht zu und durchbricht dabei auch die Wirkung von Attacken wie Schutzschild und Scanner."
}, },
"twinBeam": { "twinBeam": {
name: "Twin Beam", name: "Doppelstrahl",
effect: "The user shoots mystical beams from its eyes to inflict damage. The target is hit twice in a row." effect: "Der Anwender greift mit übernatürlichen Lichtstrahlen an, die er aus seinen Augen abfeuert, und trifft das Ziel zweimal hintereinander."
}, },
"rageFist": { "rageFist": {
name: "Rage Fist", name: "Zornesfaust",
effect: "The user converts its rage into energy to attack. The more times the user has been hit by attacks, the greater the move's power." effect: "Ein Angriff, für den der Anwender seinen Zorn in Energie umwandelt. Je häufiger der Anwender getroffen wurde, desto stärker wird diese Attacke."
}, },
"armorCannon": { "armorCannon": {
name: "Armor Cannon", name: "Rüstungskanone",
effect: "The user shoots its own armor out as blazing projectiles. This also lowers the user's Defense and Sp. Def stats." effect: "Der Anwender schießt die eigene Rüstung als glühendes Projektil auf das Ziel. Dadurch sinken die Verteidigung und Spezial-Verteidigung des Anwenders."
}, },
"bitterBlade": { "bitterBlade": {
name: "Bitter Blade", name: "Reueschwert",
effect: "The user focuses its bitter feelings toward the world of the living into a slashing attack. The user's HP is restored by up to half the damage taken by the target." effect: "Der Anwender tränkt seine Klinge in Bedauern und Reue und greift damit an. Die Hälfte des zugefügten Schadens wird dem Anwender als KP gutgeschrieben."
}, },
"doubleShock": { "doubleShock": {
name: "Double Shock", name: "Zweifachladung",
effect: "The user discharges all the electricity from its body to perform a high-damage attack. After using this move, the user will no longer be Electric type." effect: "Der Anwender nutzt die gesamte Elektrizität in seinem Körper, um großen Schaden auszuteilen. Die restliche Kampfdauer gehört er nicht mehr dem Typ Elektro an."
}, },
"gigatonHammer": { "gigatonHammer": {
name: "Gigaton Hammer", name: "Riesenhammer",
effect: "The user swings its whole body around to attack with its huge hammer. This move can't be used twice in a row." effect: "Der Anwender greift mit einem großen Hammer an, den er mit vollem Körpereinsatz um sich schwingt. Diese Attacke kann nicht zweimal in Folge eingesetzt werden."
}, },
"comeuppance": { "comeuppance": {
name: "Comeuppance", name: "Vendetta",
effect: "The user retaliates with much greater force against the opponent that last inflicted damage on it." effect: "Der Anwender rächt sich an dem Gegner, der ihm zuletzt mit einer Attacke Schaden zugefügt hat, indem er ihm den Schaden mit erhöhter Kraft zurückzahlt."
}, },
"aquaCutter": { "aquaCutter": {
name: "Aqua Cutter", name: "Aquaschnitt",
effect: "The user expels pressurized water to cut at the target like a blade. This move has a heightened chance of landing a critical hit." effect: "Der Anwender stößt Wasser unter Druck aus, um das Ziel wie mit einer Klinge anzugreifen. Hohe Volltrefferquote."
}, },
"blazingTorque": { "blazingTorque": {
name: "Blazing Torque", name: "Hitzeturbo",
effect: "The user revs their blazing engine into the target. This may also leave the target with a burn." effect: "The user revs their blazing engine into the target. This may also leave the target with a burn."
}, },
"wickedTorque": { "wickedTorque": {
name: "Wicked Torque", name: "Finsterturbo",
effect: "The user revs their engine into the target with malicious intent. This may put the target to sleep." effect: "The user revs their engine into the target with malicious intent. This may put the target to sleep."
}, },
"noxiousTorque": { "noxiousTorque": {
name: "Noxious Torque", name: "Toxiturbo",
effect: "The user revs their poisonous engine into the target. This may also poison the target." effect: "The user revs their poisonous engine into the target. This may also poison the target."
}, },
"combatTorque": { "combatTorque": {
name: "Combat Torque", name: "Raufturbo",
effect: "The user revs their engine forcefully into the target. This may also leave the target with paralysis." effect: "The user revs their engine forcefully into the target. This may also leave the target with paralysis."
}, },
"magicalTorque": { "magicalTorque": {
name: "Magical Torque", name: "Zauberturbo",
effect: "The user revs their fae-like engine into the target. This may also confuse the target." effect: "The user revs their fae-like engine into the target. This may also confuse the target."
}, },
"bloodMoon": { "bloodMoon": {
name: "Blood Moon", name: "Blutmond",
effect: "The user unleashes the full brunt of its spirit from a full moon that shines as red as blood. This move can't be used twice in a row." effect: "Der Anwender entfesselt eine gewaltige Energieladung aus einem blutroten Vollmond. Diese Attacke kann nicht zweimal in Folge eingesetzt werden."
}, },
"matchaGotcha": { "matchaGotcha": {
name: "Matcha Gotcha", name: "Quirlschuss",
effect: "The user fires a blast of tea that it mixed. The user's HP is restored by up to half the damage taken by the target. This may also leave the target with a burn." effect: "Der Anwender verschießt gequirlten Tee. Die Hälfte des zugefügten Schadens wird ihm als KP gutgeschrieben. Das Ziel erleidet eventuell Verbrennungen."
}, },
"syrupBomb": { "syrupBomb": {
name: "Syrup Bomb", name: "Sirupbombe",
effect: "The user sets off an explosion of sticky candy syrup, which coats the target and causes the target's Speed stat to drop each turn for three turns." effect: "Der Anwender feuert eine klebrige Sirupbombe auf das Ziel, wodurch es in Sirup gehüllt und seine Initiative drei Runden in Folge gesenkt wird."
}, },
"ivyCudgel": { "ivyCudgel": {
name: "Ivy Cudgel", name: "Rankenkeule",
effect: "The user strikes with an ivy-wrapped cudgel. This move's type changes depending on the mask worn by the user, and it has a heightened chance of landing a critical hit." effect: "Der Anwender schlägt mit einer rankenumschlungenen Keule zu. Der Typ dieser Attacke hängt von der Maske des Anwenders ab. Hohe Volltrefferquote."
}, },
"electroShot": { "electroShot": {
name: "Electro Shot", name: "Stromstrahl",
effect: "The user gathers electricity on the first turn, boosting its Sp. Atk stat, then fires a high-voltage shot on the next turn. The shot will be fired immediately in rain." effect: "Sammelt in Runde 1 Elektrizität, um den Spezial-Angriff zu erhöhen, und greift dann in Runde 2 mit Starkstrom an. Bei Regen erfolgt der Angriff sofort in Runde 1."
}, },
"teraStarstorm": { "teraStarstorm": {
name: "Tera Starstorm", name: "Tera-Sternhagel",
effect: "With the power of its crystals, the user bombards and eliminates the target. When used by Terapagos in its Stellar Form, this move damages all opposing Pokémon." effect: "Der Anwender greift das Ziel mit gebündelter Kristallenergie an. Wenn Terapagos diese Attacke in seiner Stellarform einsetzt, erleiden alle Gegner Schaden."
}, },
"fickleBeam": { "fickleBeam": {
name: "Fickle Beam", name: "Launenlaser",
effect: "The user shoots a beam of light to inflict damage. Sometimes all the user's heads shoot beams in unison, doubling the move's power." effect: "Der Anwender greift mit einem Laserstrahl an. Manchmal feuern mehrere seiner Köpfe Laser ab, wodurch sich die Stärke dieser Attacke verdoppelt."
}, },
"burningBulwark": { "burningBulwark": {
name: "Burning Bulwark", name: "Flammenschild",
effect: "The user's intensely hot fur protects it from attacks and also burns any attacker that makes direct contact with it." effect: "Das brennend heiße Fell des Anwenders schützt ihn vor Angriffen. Gleichzeitig erleiden alle Pokémon, die mit ihm in Berührung kommen, Verbrennungen."
}, },
"thunderclap": { "thunderclap": {
name: "Thunderclap", name: "Sturmblitz",
effect: "This move enables the user to attack first with a jolt of electricity. This move fails if the target is not readying an attack." effect: "This move enables the user to attack first with a jolt of electricity. This move fails if the target is not readying an attack."
}, },
"mightyCleave": { "mightyCleave": {
name: "Mighty Cleave", name: "Wuchtklinge",
effect: "The user wields the light that has accumulated atop its head to cleave the target. This move hits even if the target protects itself." effect: "Der Anwender führt mit dem in seinem Kopf gespeicherten Licht einen Schnitt aus. Diese Attacke trifft auch, wenn das Ziel sich selbst schützt."
}, },
"tachyonCutter": { "tachyonCutter": {
name: "Tachyon Cutter", name: "Tachyon-Schnitt",
effect: "The user attacks by launching particle blades at the target twice in a row. This attack never misses." effect: "Der Anwender greift das Ziel zweimal hintereinander mit Partikelklingen an. Der Angriff trifft garantiert."
}, },
"hardPress": { "hardPress": {
name: "Hard Press", name: "Stahlpresse",
effect: "The target is crushed with an arm, a claw, or the like to inflict damage. The more HP the target has left, the greater the move's power." effect: "Der Anwender nimmt das Ziel mit Armen oder Scheren in die Mangel. Je höher die KP des Zieles, desto stärker die Attacke."
}, },
"dragonCheer": { "dragonCheer": {
name: "Dragon Cheer", name: "Drachenschrei",
effect: "The user raises its allies' morale with a draconic cry so that their future attacks have a heightened chance of landing critical hits. This rouses Dragon types more." effect: "Das anspornende Drachengebrüll hebt die Moral aller Mitstreiter und erhöht ihre Volltrefferquote. Der Effekt ist stärker, wenn sie dem Typ Drache angehören."
}, },
"alluringVoice": { "alluringVoice": {
name: "Alluring Voice", name: "Lockstimme",
effect: "The user attacks the target using its angelic voice. This also confuses the target if its stats have been boosted during the turn." effect: "Der Anwender greift mit engelsgleichem Gesang an. Falls die Statuswerte des Zieles in dieser Runde erhöht wurden, wird es zusätzlich verwirrt."
}, },
"temperFlare": { "temperFlare": {
name: "Temper Flare", name: "Frustflamme",
effect: "Spurred by desperation, the user attacks the target. This move's power is doubled if the user's previous move failed." effect: "Der Anwender greift das Ziel voller Verzweiflung an. Wenn seine vorige Attacke fehlgeschlagen ist, verdoppelt sich die Stärke der Attacke."
}, },
"supercellSlam": { "supercellSlam": {
name: "Supercell Slam", name: "Donnerstoß",
effect: "The user electrifies its body and drops onto the target to inflict damage. If this move misses, the user takes damage instead." effect: "Der Anwender lädt seinen Körper mit elektrischer Energie auf und stürzt sich auf das Ziel. Bei Misserfolg verletzt sich der Anwender selbst."
}, },
"psychicNoise": { "psychicNoise": {
name: "Psychic Noise", name: "Psycholärm",
effect: "The user attacks the target with unpleasant sound waves. For two turns, the target is prevented from recovering HP through moves, Abilities, or held items." effect: "Der Anwender greift mit unerträglichen Schallwellen an, wodurch das Ziel zwei Runden lang nicht durch Attacken, Fähigkeiten oder getragene Items geheilt werden kann."
}, },
"upperHand": { "upperHand": {
name: "Upper Hand", name: "Schnellkonter",
effect: "The user reacts to the target's movement and strikes with the heel of its palm, making the target flinch. This move fails if the target is not readying a priority move." effect: "Der Anwender reagiert auf Bewegungen des Zieles und lässt es durch einen Schlag zurückschrecken. Gelingt nur, wenn das Ziel gerade eine Erstschlag-Attacke vorbereitet."
}, },
"malignantChain": { "malignantChain": {
name: "Malignant Chain", name: "Giftkettung",
effect: "The user pours toxins into the target by wrapping them in a toxic, corrosive chain. This may also leave the target badly poisoned." effect: "Der Anwender umwickelt das Ziel mit einer Kette aus Toxinen, die in dessen Körper eindringen und ihm schaden. Das Ziel wird eventuell schwer vergiftet."
} }
} as const; } as const;

View File

@ -898,14 +898,14 @@ export const pokemon: SimpleTranslationEntries = {
"regidrago": "Regidrago", "regidrago": "Regidrago",
"glastrier": "Polaross", "glastrier": "Polaross",
"spectrier": "Phantoross", "spectrier": "Phantoross",
"calyrex": "Calyrex", "calyrex": "Coronospa",
"wyrdeer": "Damythir", "wyrdeer": "Damythir",
"kleavor": "Axantor", "kleavor": "Axantor",
"ursaluna": "Ursaluna", "ursaluna": "Ursaluna",
"basculegion": "Salmagnis", "basculegion": "Salmagnis",
"sneasler": "Snieboss", "sneasler": "Snieboss",
"overqwil": "Myriador", "overqwil": "Myriador",
"enamorus": "Enamorus", "enamorus": "Cupidos",
"sprigatito": "Felori", "sprigatito": "Felori",
"floragato": "Feliospa", "floragato": "Feliospa",
"meowscarada": "Maskagato", "meowscarada": "Maskagato",
@ -1059,7 +1059,7 @@ export const pokemon: SimpleTranslationEntries = {
"galar_slowking": "Laschoking", "galar_slowking": "Laschoking",
"galar_corsola": "Corasonn", "galar_corsola": "Corasonn",
"galar_zigzagoon": "Zigzachs", "galar_zigzagoon": "Zigzachs",
"galar_linoone": "Geradachs", "galar_linoone": "Geradaks",
"galar_darumaka": "Flampion", "galar_darumaka": "Flampion",
"galar_darmanitan": "Flampivian", "galar_darmanitan": "Flampivian",
"galar_yamask": "Makabaja", "galar_yamask": "Makabaja",

View File

@ -7,6 +7,15 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
*/ */
export const starterSelectUiHandler: SimpleTranslationEntries = { export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": "Mit diesen Pokémon losziehen?", "confirmStartTeam": "Mit diesen Pokémon losziehen?",
"gen1": "I",
"gen2": "II",
"gen3": "III",
"gen4": "IV",
"gen5": "V",
"gen6": "VI",
"gen7": "VII",
"gen8": "VIII",
"gen9": "IX",
"growthRate": "Wachstum:", "growthRate": "Wachstum:",
"ability": "Fhgkeit:", "ability": "Fhgkeit:",
"passive": "Passiv:", "passive": "Passiv:",
@ -28,5 +37,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleNature": "N: Wesen Ändern", "cycleNature": "N: Wesen Ändern",
"cycleVariant": "V: Seltenheit ändern", "cycleVariant": "V: Seltenheit ändern",
"enablePassive": "Passiv-Skill aktivieren", "enablePassive": "Passiv-Skill aktivieren",
"disablePassive": "Passiv-Skill deaktivieren" "disablePassive": "Passiv-Skill deaktivieren",
"locked": "Gesperrt",
"disabled": "Deaktiviert",
"uncaught": "Uncaught"
} }

44
src/locales/de/weather.ts Normal file
View File

@ -0,0 +1,44 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
/**
* The weather namespace holds text displayed when weather is active during a battle
*/
export const weather: SimpleTranslationEntries = {
"sunnyStartMessage": "The sunlight got bright!",
"sunnyLapseMessage": "The sunlight is strong.",
"sunnyClearMessage": "The sunlight faded.",
"rainStartMessage": "A downpour started!",
"rainLapseMessage": "The downpour continues.",
"rainClearMessage": "The rain stopped.",
"sandstormStartMessage": "A sandstorm brewed!",
"sandstormLapseMessage": "The sandstorm rages.",
"sandstormClearMessage": "The sandstorm subsided.",
"sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!",
"hailStartMessage": "It started to hail!",
"hailLapseMessage": "Hail continues to fall.",
"hailClearMessage": "The hail stopped.",
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!",
"snowStartMessage": "It started to snow!",
"snowLapseMessage": "The snow is falling down.",
"snowClearMessage": "The snow stopped.",
"fogStartMessage": "A thick fog emerged!",
"fogLapseMessage": "The fog continues.",
"fogClearMessage": "The fog disappeared.",
"heavyRainStartMessage": "A heavy downpour started!",
"heavyRainLapseMessage": "The heavy downpour continues.",
"heavyRainClearMessage": "The heavy rain stopped.",
"harshSunStartMessage": "The sunlight got hot!",
"harshSunLapseMessage": "The sun is scorching hot.",
"harshSunClearMessage": "The harsh sunlight faded.",
"strongWindsStartMessage": "A heavy wind began!",
"strongWindsLapseMessage": "The wind blows intensely.",
"strongWindsClearMessage": "The heavy wind stopped."
}

View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const abilityTriggers: SimpleTranslationEntries = {
'blockRecoilDamage' : `{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!`,
} as const;

View File

@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
}, },
frisk: { frisk: {
name: "Frisk", name: "Frisk",
description: "When it enters a battle, the Pokémon can check an opposing Pokémon's held item.", description: "When it enters a battle, the Pokémon can check an opposing Pokémon's Ability.",
}, },
reckless: { reckless: {
name: "Reckless", name: "Reckless",

View File

@ -31,6 +31,8 @@ export const battle: SimpleTranslationEntries = {
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.", "learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
"learnMoveForgetQuestion": "Which move should be forgotten?", "learnMoveForgetQuestion": "Which move should be forgotten?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.", "learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
"countdownPoof": "@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Poof!",
"learnMoveAnd": "And…",
"levelCapUp": "The level cap\nhas increased to {{levelCap}}!", "levelCapUp": "The level cap\nhas increased to {{levelCap}}!",
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.", "moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
"moveNoPP": "There's no PP left for\nthis move!", "moveNoPP": "There's no PP left for\nthis move!",

View File

@ -1,4 +1,5 @@
import { ability } from "./ability"; import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
@ -12,10 +13,12 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { weather } from "./weather";
export const enConfig = { export const enConfig = {
ability: ability, ability: ability,
abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
@ -28,5 +31,6 @@ export const enConfig = {
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
nature: nature, nature: nature,
growth: growth growth: growth,
weather: weather
} }

View File

@ -9,7 +9,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
"EGG_GACHA": "Egg Gacha", "EGG_GACHA": "Egg Gacha",
"MANAGE_DATA": "Manage Data", "MANAGE_DATA": "Manage Data",
"COMMUNITY": "Community", "COMMUNITY": "Community",
"RETURN_TO_TITLE": "Return To Title", "SAVE_AND_QUIT": "Save and Quit",
"LOG_OUT": "Log Out", "LOG_OUT": "Log Out",
"slot": "Slot {{slotNumber}}", "slot": "Slot {{slotNumber}}",
"importSession": "Import Session", "importSession": "Import Session",

View File

@ -35,6 +35,11 @@ export const menu: SimpleTranslationEntries = {
"boyOrGirl": "Are you a boy or a girl?", "boyOrGirl": "Are you a boy or a girl?",
"boy": "Boy", "boy": "Boy",
"girl": "Girl", "girl": "Girl",
"evolving": "What?\n{{pokemonName}} is evolving!",
"stoppedEvolving": "{{pokemonName}} stopped evolving.",
"pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.",
"evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.",
"evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!",
"dailyRankings": "Daily Rankings", "dailyRankings": "Daily Rankings",
"weeklyRankings": "Weekly Rankings", "weeklyRankings": "Weekly Rankings",
"noRankings": "No Rankings", "noRankings": "No Rankings",

View File

@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
}, },
"zippyZap": { "zippyZap": {
name: "Zippy Zap", name: "Zippy Zap",
effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and results in a critical hit." effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness."
}, },
"splishySplash": { "splishySplash": {
name: "Splishy Splash", name: "Splishy Splash",

View File

@ -7,6 +7,15 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
*/ */
export const starterSelectUiHandler: SimpleTranslationEntries = { export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam":'Begin with these Pokémon?', "confirmStartTeam":'Begin with these Pokémon?',
"gen1": "I",
"gen2": "II",
"gen3": "III",
"gen4": "IV",
"gen5": "V",
"gen6": "VI",
"gen7": "VII",
"gen8": "VIII",
"gen9": "IX",
"growthRate": "Growth Rate:", "growthRate": "Growth Rate:",
"ability": "Ability:", "ability": "Ability:",
"passive": "Passive:", "passive": "Passive:",
@ -28,5 +37,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleNature": 'N: Cycle Nature', "cycleNature": 'N: Cycle Nature',
"cycleVariant": 'V: Cycle Variant', "cycleVariant": 'V: Cycle Variant',
"enablePassive": "Enable Passive", "enablePassive": "Enable Passive",
"disablePassive": "Disable Passive" "disablePassive": "Disable Passive",
"locked": "Locked",
"disabled": "Disabled",
"uncaught": "Uncaught"
} }

44
src/locales/en/weather.ts Normal file
View File

@ -0,0 +1,44 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
/**
* The weather namespace holds text displayed when weather is active during a battle
*/
export const weather: SimpleTranslationEntries = {
"sunnyStartMessage": "The sunlight got bright!",
"sunnyLapseMessage": "The sunlight is strong.",
"sunnyClearMessage": "The sunlight faded.",
"rainStartMessage": "A downpour started!",
"rainLapseMessage": "The downpour continues.",
"rainClearMessage": "The rain stopped.",
"sandstormStartMessage": "A sandstorm brewed!",
"sandstormLapseMessage": "The sandstorm rages.",
"sandstormClearMessage": "The sandstorm subsided.",
"sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!",
"hailStartMessage": "It started to hail!",
"hailLapseMessage": "Hail continues to fall.",
"hailClearMessage": "The hail stopped.",
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!",
"snowStartMessage": "It started to snow!",
"snowLapseMessage": "The snow is falling down.",
"snowClearMessage": "The snow stopped.",
"fogStartMessage": "A thick fog emerged!",
"fogLapseMessage": "The fog continues.",
"fogClearMessage": "The fog disappeared.",
"heavyRainStartMessage": "A heavy downpour started!",
"heavyRainLapseMessage": "The heavy downpour continues.",
"heavyRainClearMessage": "The heavy rain stopped.",
"harshSunStartMessage": "The sunlight got hot!",
"harshSunLapseMessage": "The sun is scorching hot.",
"harshSunClearMessage": "The harsh sunlight faded.",
"strongWindsStartMessage": "A heavy wind began!",
"strongWindsLapseMessage": "The wind blows intensely.",
"strongWindsClearMessage": "The heavy wind stopped."
}

View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const abilityTriggers: SimpleTranslationEntries = {
'blockRecoilDamage' : `{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!`,
} as const;

View File

@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
}, },
"frisk": { "frisk": {
name: "Cacheo", name: "Cacheo",
description: "Puede ver el objeto que lleva el rival al entrar en combate." description: "Cuando entra en combate, el Pokémon puede comprobar la habilidad de un Pokémon rival."
}, },
"reckless": { "reckless": {
name: "Audaz", name: "Audaz",

View File

@ -31,6 +31,8 @@ export const battle: SimpleTranslationEntries = {
"learnMoveNotLearned": "{{pokemonName}} no ha aprendido {{moveName}}.", "learnMoveNotLearned": "{{pokemonName}} no ha aprendido {{moveName}}.",
"learnMoveForgetQuestion": "¿Qué movimiento quieres que olvide?", "learnMoveForgetQuestion": "¿Qué movimiento quieres que olvide?",
"learnMoveForgetSuccess": "{{pokemonName}} ha olvidado cómo utilizar {{moveName}}.", "learnMoveForgetSuccess": "{{pokemonName}} ha olvidado cómo utilizar {{moveName}}.",
"countdownPoof": "@d{32}1, @d{15}2, @d{15}y@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}¡Puf!",
"learnMoveAnd": "Y…",
"levelCapUp": "¡Se ha incrementado el\nnivel máximo a {{levelCap}}!", "levelCapUp": "¡Se ha incrementado el\nnivel máximo a {{levelCap}}!",
"moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.", "moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.",
"moveNoPP": "There's no PP left for\nthis move!", "moveNoPP": "There's no PP left for\nthis move!",

View File

@ -1,4 +1,5 @@
import { ability } from "./ability"; import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
@ -12,10 +13,12 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { weather } from "./weather";
export const esConfig = { export const esConfig = {
ability: ability, ability: ability,
abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
@ -28,5 +31,6 @@ export const esConfig = {
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
nature: nature, nature: nature,
growth: growth growth: growth,
weather: weather
} }

View File

@ -9,7 +9,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
"EGG_GACHA": "Gacha de Huevos", "EGG_GACHA": "Gacha de Huevos",
"MANAGE_DATA": "Gestionar Datos", "MANAGE_DATA": "Gestionar Datos",
"COMMUNITY": "Comunidad", "COMMUNITY": "Comunidad",
"RETURN_TO_TITLE": "Volver al Título", "SAVE_AND_QUIT": "Save and Quit",
"LOG_OUT": "Cerrar Sesión", "LOG_OUT": "Cerrar Sesión",
"slot": "Ranura {{slotNumber}}", "slot": "Ranura {{slotNumber}}",
"importSession": "Importar Sesión", "importSession": "Importar Sesión",

View File

@ -35,6 +35,11 @@ export const menu: SimpleTranslationEntries = {
"boyOrGirl": "¿Eres un chico o una chica?", "boyOrGirl": "¿Eres un chico o una chica?",
"boy": "Chico", "boy": "Chico",
"girl": "Chica", "girl": "Chica",
"evolving": "What?\n{{pokemonName}} is evolving!",
"stoppedEvolving": "{{pokemonName}} stopped evolving.",
"pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.",
"evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.",
"evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!",
"dailyRankings": "Rankings Diarios", "dailyRankings": "Rankings Diarios",
"weeklyRankings": "Rankings Semanales", "weeklyRankings": "Rankings Semanales",
"noRankings": "Sin Rankings", "noRankings": "Sin Rankings",

View File

@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
}, },
zippyZap: { zippyZap: {
name: "Pikaturbo", name: "Pikaturbo",
effect: "Ataque eléctrico a la velocidad del rayo. Este movimiento tiene prioridad alta y propina golpes críticos.", effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.",
}, },
splishySplash: { splishySplash: {
name: "Salpikasurf", name: "Salpikasurf",

View File

@ -7,6 +7,15 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
*/ */
export const starterSelectUiHandler: SimpleTranslationEntries = { export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam":'¿Comenzar con estos Pokémon?', "confirmStartTeam":'¿Comenzar con estos Pokémon?',
"gen1": "I",
"gen2": "II",
"gen3": "III",
"gen4": "IV",
"gen5": "V",
"gen6": "VI",
"gen7": "VII",
"gen8": "VIII",
"gen9": "IX",
"growthRate": "Crecimiento:", "growthRate": "Crecimiento:",
"ability": "Habilid:", "ability": "Habilid:",
"passive": "Pasiva:", "passive": "Pasiva:",
@ -28,5 +37,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleNature": 'N: Cambiar Naturaleza', "cycleNature": 'N: Cambiar Naturaleza',
"cycleVariant": 'V: Cambiar Variante', "cycleVariant": 'V: Cambiar Variante',
"enablePassive": "Activar Pasiva", "enablePassive": "Activar Pasiva",
"disablePassive": "Desactivar Pasiva" "disablePassive": "Desactivar Pasiva",
"locked": "Locked",
"disabled": "Disabled",
"uncaught": "Uncaught"
} }

44
src/locales/es/weather.ts Normal file
View File

@ -0,0 +1,44 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
/**
* The weather namespace holds text displayed when weather is active during a battle
*/
export const weather: SimpleTranslationEntries = {
"sunnyStartMessage": "The sunlight got bright!",
"sunnyLapseMessage": "The sunlight is strong.",
"sunnyClearMessage": "The sunlight faded.",
"rainStartMessage": "A downpour started!",
"rainLapseMessage": "The downpour continues.",
"rainClearMessage": "The rain stopped.",
"sandstormStartMessage": "A sandstorm brewed!",
"sandstormLapseMessage": "The sandstorm rages.",
"sandstormClearMessage": "The sandstorm subsided.",
"sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!",
"hailStartMessage": "It started to hail!",
"hailLapseMessage": "Hail continues to fall.",
"hailClearMessage": "The hail stopped.",
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!",
"snowStartMessage": "It started to snow!",
"snowLapseMessage": "The snow is falling down.",
"snowClearMessage": "The snow stopped.",
"fogStartMessage": "A thick fog emerged!",
"fogLapseMessage": "The fog continues.",
"fogClearMessage": "The fog disappeared.",
"heavyRainStartMessage": "A heavy downpour started!",
"heavyRainLapseMessage": "The heavy downpour continues.",
"heavyRainClearMessage": "The heavy rain stopped.",
"harshSunStartMessage": "The sunlight got hot!",
"harshSunLapseMessage": "The sun is scorching hot.",
"harshSunClearMessage": "The harsh sunlight faded.",
"strongWindsStartMessage": "A heavy wind began!",
"strongWindsLapseMessage": "The wind blows intensely.",
"strongWindsClearMessage": "The heavy wind stopped."
}

View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const abilityTriggers: SimpleTranslationEntries = {
'blockRecoilDamage' : `{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !`,
} as const;

View File

@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
}, },
frisk: { frisk: {
name: "Fouille", name: "Fouille",
description: "Permet de connaitre lobjet tenu par ladversaire quand le combat commence.", description: "Lorsqu'il entre en combat, le Pokémon peut vérifier la capacité d'un Pokémon adverse.",
}, },
reckless: { reckless: {
name: "Téméraire", name: "Téméraire",

View File

@ -31,6 +31,8 @@ export const battle: SimpleTranslationEntries = {
"learnMoveNotLearned": "{{pokemonName}} na pas appris\n{{moveName}}.", "learnMoveNotLearned": "{{pokemonName}} na pas appris\n{{moveName}}.",
"learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?", "learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?",
"learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.", "learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.",
"countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Tadaaa !",
"learnMoveAnd": "Et…",
"levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !", "levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
"moveNotImplemented": "{{moveName}} nest pas encore implémenté et ne peut pas être sélectionné.", "moveNotImplemented": "{{moveName}} nest pas encore implémenté et ne peut pas être sélectionné.",
"moveNoPP": "Il ny a plus de PP pour\ncette capacité !", "moveNoPP": "Il ny a plus de PP pour\ncette capacité !",

View File

@ -1,4 +1,5 @@
import { ability } from "./ability"; import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
@ -12,10 +13,12 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { weather } from "./weather";
export const frConfig = { export const frConfig = {
ability: ability, ability: ability,
abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
@ -28,5 +31,6 @@ export const frConfig = {
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
nature: nature, nature: nature,
growth: growth growth: growth,
weather: weather
} }

View File

@ -1,10 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = { export const growth: SimpleTranslationEntries = {
"Erratic": "Erratic", "Erratic": "Erratique",
"Fast": "Fast", "Fast": "Rapide",
"Medium_Fast": "Medium Fast", "Medium_Fast": "Moyenne-Rapide",
"Medium_Slow": "Medium Slow", "Medium_Slow": "Moyenne-Lente",
"Slow": "Slow", "Slow": "Lente",
"Fluctuating": "Fluctuating" "Fluctuating": "Fluctuante"
} as const; } as const;

View File

@ -9,7 +9,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
"EGG_GACHA": "Gacha-Œufs", "EGG_GACHA": "Gacha-Œufs",
"MANAGE_DATA": "Mes données", "MANAGE_DATA": "Mes données",
"COMMUNITY": "Communauté", "COMMUNITY": "Communauté",
"RETURN_TO_TITLE": "Écran titre", "SAVE_AND_QUIT": "Sauver & quitter",
"LOG_OUT": "Déconnexion", "LOG_OUT": "Déconnexion",
"slot": "Emplacement {{slotNumber}}", "slot": "Emplacement {{slotNumber}}",
"importSession": "Importer session", "importSession": "Importer session",

View File

@ -30,6 +30,11 @@ export const menu: SimpleTranslationEntries = {
"boyOrGirl": "Es-tu un garçon ou une fille ?", "boyOrGirl": "Es-tu un garçon ou une fille ?",
"boy": "Garçon", "boy": "Garçon",
"girl": "Fille", "girl": "Fille",
"evolving": "Quoi ?\n{{pokemonName}} évolue !",
"stoppedEvolving": "Hein ?\n{{pokemonName}} névolue plus !",
"pauseEvolutionsQuestion": "Mettre en pause les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis lécran déquipe.",
"evolutionsPaused": "Les évolutions ont été mises en pause pour {{pokemonName}}.",
"evolutionDone": "Félicitations !\n{{pokemonName}} a évolué en {{evolvedPokemonName}} !",
"dailyRankings": "Classement du Jour", "dailyRankings": "Classement du Jour",
"weeklyRankings": "Classement de la Semaine", "weeklyRankings": "Classement de la Semaine",
"noRankings": "Pas de Classement", "noRankings": "Pas de Classement",

View File

@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
}, },
"zippyZap": { "zippyZap": {
name: "Pika-Sprint", name: "Pika-Sprint",
effect: "Une attaque électrique rapide comme léclair qui inflige un coup critique à coup sûr. Frappe en priorité." effect: "Une attaque électrique rapide comme léclair qui auguemente lesquive. Frappe en priorité."
}, },
"splishySplash": { "splishySplash": {
name: "Pika-Splash", name: "Pika-Splash",

View File

@ -7,6 +7,15 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
*/ */
export const starterSelectUiHandler: SimpleTranslationEntries = { export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam":'Commencer avec ces Pokémon ?', "confirmStartTeam":'Commencer avec ces Pokémon ?',
"gen1": "1G",
"gen2": "2G",
"gen3": "3G",
"gen4": "4G",
"gen5": "5G",
"gen6": "6G",
"gen7": "7G",
"gen8": "8G",
"gen9": "9G",
"growthRate": "Croissance :", "growthRate": "Croissance :",
"ability": "Talent :", "ability": "Talent :",
"passive": "Passif :", "passive": "Passif :",
@ -28,5 +37,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleNature": "N: » Natures", "cycleNature": "N: » Natures",
"cycleVariant": "V: » Variants", "cycleVariant": "V: » Variants",
"enablePassive": "Activer Passif", "enablePassive": "Activer Passif",
"disablePassive": "Désactiver Passif" "disablePassive": "Désactiver Passif",
"locked": "Verrouillé",
"disabled": "Désactivé",
"uncaught": "Non-capturé"
} }

44
src/locales/fr/weather.ts Normal file
View File

@ -0,0 +1,44 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
/**
* The weather namespace holds text displayed when weather is active during a battle
*/
export const weather: SimpleTranslationEntries = {
"sunnyStartMessage": "Les rayons du soleil brillent !",
"sunnyLapseMessage": "Les rayons du soleil brillent fort !",
"sunnyClearMessage": "Les rayons du soleil saffaiblissent !",
"rainStartMessage": "Il commence à pleuvoir !",
"rainLapseMessage": "La pluie continue de tomber !",
"rainClearMessage": "La pluie sest arrêtée !",
"sandstormStartMessage": "Une tempête de sable se prépare !",
"sandstormLapseMessage": "La tempête de sable fait rage !",
"sandstormClearMessage": "La tempête de sable se calme !",
"sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonPrefix}}{{pokemonName}} !",
"hailStartMessage": "Il commence à grêler !",
"hailLapseMessage": "La grêle continue de tomber !",
"hailClearMessage": "La grêle sest arrêtée !",
"hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonPrefix}}{{pokemonName}} !",
"snowStartMessage": "Il commence à neiger !",
"snowLapseMessage": "Il y a une tempête de neige !",
"snowClearMessage": "La neige sest arrêtée !",
"fogStartMessage": "Le brouillard devient épais…",
"fogLapseMessage": "Le brouillard continue !",
"fogClearMessage": "Le brouillard sest dissipé !",
"heavyRainStartMessage": "Une pluie battante sabat soudainement !",
"heavyRainLapseMessage": "La pluie battante continue.",
"heavyRainClearMessage": "La pluie battante sest arrêtée…",
"harshSunStartMessage": "Les rayons du soleil sintensifient !",
"harshSunLapseMessage": "Les rayons du soleil sont brulants !",
"harshSunClearMessage": "Les rayons du soleil saffaiblissent !",
"strongWindsStartMessage": "Un vent mystérieux se lève !",
"strongWindsLapseMessage": "Le vent mystérieux violemment !",
"strongWindsClearMessage": "Le vent mystérieux sest dissipé…"
}

View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const abilityTriggers: SimpleTranslationEntries = {
'blockRecoilDamage' : `{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!`,
} as const;

View File

@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
}, },
frisk: { frisk: {
name: "Indagine", name: "Indagine",
description: "Quando il Pokémon entra in campo, rivela lo strumento del nemico.", description: "Quando entra in battaglia, il Pokémon può controllare il Potere di un Pokémon avversario.",
}, },
reckless: { reckless: {
name: "Temerarietà", name: "Temerarietà",

View File

@ -31,6 +31,8 @@ export const battle: SimpleTranslationEntries = {
"learnMoveNotLearned": "{{pokemonName}} non ha imparato\n{{moveName}}.", "learnMoveNotLearned": "{{pokemonName}} non ha imparato\n{{moveName}}.",
"learnMoveForgetQuestion": "Quale mossa deve dimenticare?", "learnMoveForgetQuestion": "Quale mossa deve dimenticare?",
"learnMoveForgetSuccess": "{{pokemonName}} ha dimenticato la mossa\n{{moveName}}.", "learnMoveForgetSuccess": "{{pokemonName}} ha dimenticato la mossa\n{{moveName}}.",
"countdownPoof": "@d{32}1, @d{15}2, @d{15}e@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Puff!",
"learnMoveAnd": "E…",
"levelCapUp": "Il livello massimo\nè aumentato a {{levelCap}}!", "levelCapUp": "Il livello massimo\nè aumentato a {{levelCap}}!",
"moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.", "moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.",
"moveNoPP": "Non ci sono PP rimanenti\nper questa mossa!", "moveNoPP": "Non ci sono PP rimanenti\nper questa mossa!",

View File

@ -1,4 +1,5 @@
import { ability } from "./ability"; import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
@ -12,10 +13,12 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { weather } from "./weather";
export const itConfig = { export const itConfig = {
ability: ability, ability: ability,
abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
@ -28,5 +31,6 @@ export const itConfig = {
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
nature: nature, nature: nature,
growth: growth growth: growth,
weather: weather
} }

View File

@ -3,5 +3,5 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = { export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP", "pp": "PP",
"power": "Potenza", "power": "Potenza",
"accuracy": "Accuracy", "accuracy": "Precisione",
} as const; } as const;

View File

@ -1,10 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = { export const growth: SimpleTranslationEntries = {
"Erratic": "Erratic", "Erratic": "Irregolare",
"Fast": "Fast", "Fast": "Veloce",
"Medium_Fast": "Medium Fast", "Medium_Fast": "Medio-Veloce",
"Medium_Slow": "Medium Slow", "Medium_Slow": "Medio-Lenta",
"Slow": "Slow", "Slow": "Lenta",
"Fluctuating": "Fluctuating" "Fluctuating": "Fluttuante"
} as const; } as const;

View File

@ -9,7 +9,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
"EGG_GACHA": "Gacha Uova", "EGG_GACHA": "Gacha Uova",
"MANAGE_DATA": "Gestisci Dati", "MANAGE_DATA": "Gestisci Dati",
"COMMUNITY": "Community", "COMMUNITY": "Community",
"RETURN_TO_TITLE": "Ritorna al Titolo", "SAVE_AND_QUIT": "Save and Quit",
"LOG_OUT": "Disconnettiti", "LOG_OUT": "Disconnettiti",
"slot": "Slot {{slotNumber}}", "slot": "Slot {{slotNumber}}",
"importSession": "Importa Sessione", "importSession": "Importa Sessione",

View File

@ -40,6 +40,11 @@ export const menu: SimpleTranslationEntries = {
"noRankings": "Nessuna Classifica", "noRankings": "Nessuna Classifica",
"loading": "Caricamento…", "loading": "Caricamento…",
"playersOnline": "Giocatori Online", "playersOnline": "Giocatori Online",
"evolving": "What?\n{{pokemonName}} is evolving!",
"stoppedEvolving": "{{pokemonName}} stopped evolving.",
"pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.",
"evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.",
"evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!",
"empty":"Vuoto", "empty":"Vuoto",
"yes":"Si", "yes":"Si",
"no":"No", "no":"No",

View File

@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
}, },
zippyZap: { zippyZap: {
name: "Sprintaboom", name: "Sprintaboom",
effect: "Un attacco elettrico ad altissima velocità. Questa mossa ha priorità alta e infligge sicuramente un brutto colpo.", effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.",
}, },
splishySplash: { splishySplash: {
name: "Surfasplash", name: "Surfasplash",

View File

@ -1,29 +1,29 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const nature: SimpleTranslationEntries = { export const nature: SimpleTranslationEntries = {
"Hardy": "Hardy", "Hardy": "Ardita",
"Lonely": "Lonely", "Lonely": "Schiva",
"Brave": "Brave", "Brave": "Audace",
"Adamant": "Adamant", "Adamant": "Decisa",
"Naughty": "Naughty", "Naughty": "Birbona",
"Bold": "Bold", "Bold": "Sicura",
"Docile": "Docile", "Docile": "Docile",
"Relaxed": "Relaxed", "Relaxed": "Placida",
"Impish": "Impish", "Impish": "Scaltra",
"Lax": "Lax", "Lax": "Fiacca",
"Timid": "Timid", "Timid": "Timida",
"Hasty": "Hasty", "Hasty": "Lesta",
"Serious": "Serious", "Serious": "Seria",
"Jolly": "Jolly", "Jolly": "Allegra",
"Naive": "Naive", "Naive": "Ingenuaa",
"Modest": "Modest", "Modest": "Modesta",
"Mild": "Mild", "Mild": "Mite",
"Quiet": "Quiet", "Quiet": "Quieta",
"Bashful": "Bashful", "Bashful": "Ritrosa",
"Rash": "Rash", "Rash": "Ardente",
"Calm": "Calm", "Calm": "Calma",
"Gentle": "Gentle", "Gentle": "Gentile",
"Sassy": "Sassy", "Sassy": "Vivace",
"Careful": "Careful", "Careful": "Cauta",
"Quirky": "Quirky" "Quirky": "Furba"
} as const; } as const;

View File

@ -7,6 +7,15 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
*/ */
export const starterSelectUiHandler: SimpleTranslationEntries = { export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam":'Vuoi iniziare con questi Pokémon?', "confirmStartTeam":'Vuoi iniziare con questi Pokémon?',
"gen1": "I",
"gen2": "II",
"gen3": "III",
"gen4": "IV",
"gen5": "V",
"gen6": "VI",
"gen7": "VII",
"gen8": "VIII",
"gen9": "IX",
"growthRate": "Vel. Crescita:", "growthRate": "Vel. Crescita:",
"ability": "Abilità:", "ability": "Abilità:",
"passive": "Passiva:", "passive": "Passiva:",
@ -28,5 +37,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleNature": 'N: Alterna Natura', "cycleNature": 'N: Alterna Natura',
"cycleVariant": 'V: Alterna Variante', "cycleVariant": 'V: Alterna Variante',
"enablePassive": "Attiva Passiva", "enablePassive": "Attiva Passiva",
"disablePassive": "Disattiva Passiva" "disablePassive": "Disattiva Passiva",
"locked": "Bloccato",
"disabled": "Disabilitato",
"uncaught": "Non Catturato"
} }

44
src/locales/it/weather.ts Normal file
View File

@ -0,0 +1,44 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
/**
* The weather namespace holds text displayed when weather is active during a battle
*/
export const weather: SimpleTranslationEntries = {
"sunnyStartMessage": "The sunlight got bright!",
"sunnyLapseMessage": "The sunlight is strong.",
"sunnyClearMessage": "The sunlight faded.",
"rainStartMessage": "A downpour started!",
"rainLapseMessage": "The downpour continues.",
"rainClearMessage": "The rain stopped.",
"sandstormStartMessage": "A sandstorm brewed!",
"sandstormLapseMessage": "The sandstorm rages.",
"sandstormClearMessage": "The sandstorm subsided.",
"sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!",
"hailStartMessage": "It started to hail!",
"hailLapseMessage": "Hail continues to fall.",
"hailClearMessage": "The hail stopped.",
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!",
"snowStartMessage": "It started to snow!",
"snowLapseMessage": "The snow is falling down.",
"snowClearMessage": "The snow stopped.",
"fogStartMessage": "A thick fog emerged!",
"fogLapseMessage": "The fog continues.",
"fogClearMessage": "The fog disappeared.",
"heavyRainStartMessage": "A heavy downpour started!",
"heavyRainLapseMessage": "The heavy downpour continues.",
"heavyRainClearMessage": "The heavy rain stopped.",
"harshSunStartMessage": "The sunlight got hot!",
"harshSunLapseMessage": "The sun is scorching hot.",
"harshSunClearMessage": "The harsh sunlight faded.",
"strongWindsStartMessage": "A heavy wind began!",
"strongWindsLapseMessage": "The wind blows intensely.",
"strongWindsClearMessage": "The heavy wind stopped."
}

1241
src/locales/pt_BR/ability.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,55 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} apareceu.",
"trainerAppeared": "{{trainerName}}\nquer batalhar!",
"singleWildAppeared": "Um {{pokemonName}} selvagem apareceu!",
"multiWildAppeared": "Um {{pokemonName1}} e um {{pokemonName2}} selvagens\napareceram!",
"playerComeBack": "{{pokemonName}}, retorne!",
"trainerComeBack": "{{trainerName}} retirou {{pokemonName}} da batalha!",
"playerGo": "{{pokemonName}}, eu escolho você!",
"trainerGo": "{{trainerName}} enviou {{pokemonName}}!",
"switchQuestion": "Quer trocar\nde {{pokemonName}}?",
"trainerDefeated": "Você derrotou\n{{trainerName}}!",
"pokemonCaught": "{{pokemonName}} foi capturado!",
"pokemon": "Pokémon",
"sendOutPokemon": "{{pokemonName}}, eu escolho você!!",
"hitResultCriticalHit": "Um golpe crítico!",
"hitResultSuperEffective": "É supereficaz!",
"hitResultNotVeryEffective": "É pouco eficaz...",
"hitResultNoEffect": "Isso não afeta {{pokemonName}}!",
"hitResultOneHitKO": "Foi um nocaute de um golpe!",
"attackFailed": "Mas falhou!",
"attackHitsCount": `Acertou {{count}} vezes.`,
"expGain": "{{pokemonName}} ganhou\n{{exp}} pontos de experiência.",
"levelUp": "{{pokemonName}} subiu para \nNv. {{level}}!",
"learnMove": "{{pokemonName}} aprendeu {{moveName}}!",
"learnMovePrompt": "{{pokemonName}} quer aprender\n{{moveName}}.",
"learnMoveLimitReached": "Porém, {{pokemonName}} já sabe\nquatro movimentos.",
"learnMoveReplaceQuestion": "Quer substituir um de seus movimentos por {{moveName}}?",
"learnMoveStopTeaching": "Você não quer aprender\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} não aprendeu {{moveName}}.",
"learnMoveForgetQuestion": "Qual movimento quer esquecer?",
"learnMoveForgetSuccess": "{{pokemonName}} esqueceu como usar {{moveName}}.",
"countdownPoof": "@d{32}1, @d{15}2, @d{15}e@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Puf!",
"learnMoveAnd": "E…",
"levelCapUp": "O nível máximo aumentou\npara {{levelCap}}!",
"moveNotImplemented": "{{moveName}} ainda não foi implementado e não pode ser usado.",
"moveNoPP": "Não há mais PP\npara esse movimento!",
"moveDisabled": "Não se pode usar {{moveName}} porque foi desabilitado!",
"noPokeballForce": "Uma força misteriosa\nte impede de usar Poké Bolas.",
"noPokeballTrainer": "Não se pode capturar\nPokémon dos outros!",
"noPokeballMulti": "Não se pode lançar Poké Bolas\nquando há mais de um Pokémon!",
"noPokeballStrong": "Este Pokémon é forte demais para ser capturado!\nÉ preciso enfraquecê-lo primeiro!",
"noEscapeForce": "Uma força misteriosa\nte impede de fugir.",
"noEscapeTrainer": "Não se pode fugir de\nbatalhas contra treinadores!",
"noEscapePokemon": "O movimento {{moveName}} de {{pokemonName}} te impede de fugir!",
"runAwaySuccess": "Você fugiu com sucesso",
"runAwayCannotEscape": "Você nao conseguiu fugir!",
"escapeVerbSwitch": "trocar",
"escapeVerbFlee": "fugir",
"notDisabled": "O movimento {{moveName}}\nnão está mais desabilitado!",
"skipItemQuestion": "Tem certeza de que não quer escolher um item?",
"eggHatching": "Opa?",
"ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?"
} as const;

View File

@ -0,0 +1,9 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const commandUiHandler: SimpleTranslationEntries = {
"fight": "Lutar",
"ball": "Bolas",
"pokemon": "Pokémon",
"run": "Fugir",
"actionMessage": "O que {{pokemonName}}\ndeve fazer?",
} as const;

View File

@ -0,0 +1,34 @@
import { ability } from "./ability";
import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler";
import { growth } from "./growth";
import { menu } from "./menu";
import { menuUiHandler } from "./menu-ui-handler";
import { move } from "./move";
import { nature } from "./nature";
import { pokeball } from "./pokeball";
import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial";
import { weather } from "./weather";
export const ptBrConfig = {
ability: ability,
battle: battle,
commandUiHandler: commandUiHandler,
fightUiHandler: fightUiHandler,
menuUiHandler: menuUiHandler,
menu: menu,
move: move,
pokeball: pokeball,
pokemonStat: pokemonStat,
pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial,
nature: nature,
growth: growth,
weather: weather
}

View File

@ -0,0 +1,7 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP",
"power": "Poder",
"accuracy": "Precisão",
} as const;

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = {
"Erratic": "Instável",
"Fast": "Rápido",
"Medium_Fast": "Meio Rápido",
"Medium_Slow": "Meio Lento",
"Slow": "Lento",
"Fluctuating": "Flutuante"
} as const;

View File

@ -0,0 +1,23 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const menuUiHandler: SimpleTranslationEntries = {
"GAME_SETTINGS": "Configurações",
"ACHIEVEMENTS": "Conquistas",
"STATS": "Estatísticas",
"VOUCHERS": "Vouchers",
"EGG_LIST": "Incubadora",
"EGG_GACHA": "Gacha de ovos",
"MANAGE_DATA": "Gerenciar dados",
"COMMUNITY": "Comunidade",
"SAVE_AND_QUIT": "Salvar e sair",
"LOG_OUT": "Logout",
"slot": "Slot {{slotNumber}}",
"importSession": "Importar sessão",
"importSlotSelect": "Selecione um slot para importar.",
"exportSession": "Exportar sessão",
"exportSlotSelect": "Selecione um slot para exportar.",
"importData": "Importar dados",
"exportData": "Exportar dados",
"cancel": "Cancelar",
"losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?"
} as const;

51
src/locales/pt_BR/menu.ts Normal file
View File

@ -0,0 +1,51 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
/**
* The menu namespace holds most miscellaneous text that isn't directly part of the game's
* contents or directly related to Pokemon data. This includes menu navigation, settings,
* account interactions, descriptive text, etc.
*/
export const menu: SimpleTranslationEntries = {
"cancel": "Cancelar",
"continue": "Continuar",
"dailyRun": "Desafio Diário (Beta)",
"loadGame": "Carregar Jogo",
"newGame": "Novo Jogo",
"selectGameMode": "Escolha um modo de jogo.",
"logInOrCreateAccount": "Inicie uma sessão ou crie uma conta para começar. Não é necessário email!",
"username": "Nome de Usuário",
"password": "Senha",
"login": "Iniciar sessão",
"register": "Registrar-se",
"emptyUsername": "Nome de usuário vazio",
"invalidLoginUsername": "Nome de usuário inválido",
"invalidRegisterUsername": "O nome de usuário só pode conter letras, números e sublinhados",
"invalidLoginPassword": "Senha inválida",
"invalidRegisterPassword": "A senha deve ter pelo menos 6 caracteres",
"usernameAlreadyUsed": "Esse nome de usuário já está em uso",
"accountNonExistent": "Esse nome de usuário não existe",
"unmatchingPassword": "Senha incorreta",
"passwordNotMatchingConfirmPassword": "As senhas não coincidem",
"confirmPassword": "Confirmar senha",
"registrationAgeWarning": "Se registrando, você confirma que tem pelo menos 13 anos de idade.",
"backToLogin": "Voltar ao Login",
"failedToLoadSaveData": "Não foi possível carregar os dados de salvamento. Por favor, recarregue a página.\nSe a falha persistir, contate o administrador.",
"sessionSuccess": "Sessão carregada com sucesso.",
"failedToLoadSession": "Não foi possível carregar os dados da sua sessão.\nEles podem estar corrompidos.",
"boyOrGirl": "Você é um menino ou uma menina?",
"boy": "Menino",
"girl": "Menina",
"evolving": "Que?\n{{pokemonName}} tá evoluindo!",
"stoppedEvolving": "{{pokemonName}} parou de evoluir.",
"pauseEvolutionsQuestion": "Gostaria de pausar evoluções para {{pokemonName}}?\nEvoluções podem ser religadas na tela de equipe.",
"evolutionsPaused": "Evoluções foram paradas para {{pokemonName}}.",
"evolutionDone": "Parabéns!\nSeu {{pokemonName}} evolui para {{evolvedPokemonName}}!",
"dailyRankings": "Classificação Diária",
"weeklyRankings": "Classificação Semanal",
"noRankings": "Sem Classificação",
"loading": "Carregando…",
"playersOnline": "Jogadores Ativos",
"empty": "Vazio",
"yes": "Sim",
"no": "Não",
} as const;

3812
src/locales/pt_BR/move.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const nature: SimpleTranslationEntries = {
"Hardy": "Destemida",
"Lonely": "Solitária",
"Brave": "Valente",
"Adamant": "Rígida",
"Naughty": "Teimosa",
"Bold": "Corajosa",
"Docile": "Dócil",
"Relaxed": "Relaxada",
"Impish": "Inquieta",
"Lax": "Relaxada",
"Timid": "Tímida",
"Hasty": "Apressada",
"Serious": "Séria",
"Jolly": "Alegre",
"Naive": "Ingênua",
"Modest": "Modesta",
"Mild": "Mansa",
"Quiet": "Quieta",
"Bashful": "Atrapalhada",
"Rash": "Rabugenta",
"Calm": "Calma",
"Gentle": "Gentil",
"Sassy": "Atrevida",
"Careful": "Cuidadosa",
"Quirky": "Peculiar",
} as const;

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const pokeball: SimpleTranslationEntries = {
"pokeBall": "Poké Bola",
"greatBall": "Grande Bola",
"ultraBall": "Ultra Bola",
"rogueBall": "Rogue Bola",
"masterBall": "Master Bola",
"luxuryBall": "Bola de Luxo",
} as const;

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