Merge branch 'main' into magic_coat

# Conflicts:
#	src/data/battler-tags.ts
#	src/data/enums/battler-tag-type.ts
#	src/data/move.ts
#	src/phases.ts
pull/468/head
Reldnahc 2024-05-04 18:24:21 -05:00
commit cd0c238085
106 changed files with 3480 additions and 895 deletions

View File

@ -42,3 +42,5 @@ jobs:
https://pokerogue.net/ https://pokerogue.net/
https://pokerogue.net/index.html https://pokerogue.net/index.html
https://pokerogue.net/manifest.json https://pokerogue.net/manifest.json
https://pokerogue.net/manifest.webmanifest
https://pokerogue.net/service-worker.js

View File

@ -19,7 +19,7 @@ If you have the motivation and experience with Typescript/Javascript (or are wil
### ❔ FAQ ### ❔ FAQ
**How do I test a new _______?** **How do I test a new _______?**
- In the `battle-scene.ts` file there are overrides for most values you'll need to change for testing - In the `src/overrides.ts` file there are overrides for most values you'll need to change for testing
## 🪧 To Do ## 🪧 To Do

View File

@ -150,6 +150,10 @@ body {
display: none; display: none;
} }
#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']) #apad #apadStats {
display: none;
}
#apad .apadRectBtnContainer + .apadSqBtnContainer { #apad .apadRectBtnContainer + .apadSqBtnContainer {
top: calc(var(--controls-size) * -1.9); top: calc(var(--controls-size) * -1.9);
left: calc(var(--controls-size) * -0.9); left: calc(var(--controls-size) * -0.9);

View File

@ -74,6 +74,9 @@
<div id="apadCycleVariant" class="apadSqBtn apadBtn" data-key="CYCLE_VARIANT"> <div id="apadCycleVariant" class="apadSqBtn apadBtn" data-key="CYCLE_VARIANT">
<text class="apadLabel apadLabelSmall">V</text> <text class="apadLabel apadLabelSmall">V</text>
</div> </div>
<div id="apadStats" class="apadRectBtn apadBtn" data-key="STATS">
<text class="apadLabel apadLabelSmall">C</text>
</div>
<div id="apadMenu" class="apadRectBtn apadBtn" data-key="MENU"> <div id="apadMenu" class="apadRectBtn apadBtn" data-key="MENU">
<text class="apadLabel apadLabelSmall">Menu</text> <text class="apadLabel apadLabelSmall">Menu</text>
</div> </div>

13
package-lock.json generated
View File

@ -1,16 +1,17 @@
{ {
"name": "pokemon-rogue-battle", "name": "pokemon-rogue-battle",
"version": "1.0.3", "version": "1.0.4",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "pokemon-rogue-battle", "name": "pokemon-rogue-battle",
"version": "1.0.3", "version": "1.0.4",
"dependencies": { "dependencies": {
"@material/material-color-utilities": "^0.2.7", "@material/material-color-utilities": "^0.2.7",
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",
"i18next": "^23.11.1", "i18next": "^23.11.1",
"i18next-browser-languagedetector": "^7.2.1",
"json-stable-stringify": "^1.1.0", "json-stable-stringify": "^1.1.0",
"phaser": "^3.70.0", "phaser": "^3.70.0",
"phaser3-rex-plugins": "^1.1.84" "phaser3-rex-plugins": "^1.1.84"
@ -2772,6 +2773,14 @@
"@babel/runtime": "^7.23.2" "@babel/runtime": "^7.23.2"
} }
}, },
"node_modules/i18next-browser-languagedetector": {
"version": "7.2.1",
"resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz",
"integrity": "sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==",
"dependencies": {
"@babel/runtime": "^7.23.2"
}
},
"node_modules/i18next-http-backend": { "node_modules/i18next-http-backend": {
"version": "2.5.0", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz", "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz",

View File

@ -31,6 +31,7 @@
"@material/material-color-utilities": "^0.2.7", "@material/material-color-utilities": "^0.2.7",
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",
"i18next": "^23.11.1", "i18next": "^23.11.1",
"i18next-browser-languagedetector": "^7.2.1",
"json-stable-stringify": "^1.1.0", "json-stable-stringify": "^1.1.0",
"phaser": "^3.70.0", "phaser": "^3.70.0",
"phaser3-rex-plugins": "^1.1.84" "phaser3-rex-plugins": "^1.1.84"

BIN
public/audio/se/shing.wav Normal file

Binary file not shown.

View File

@ -0,0 +1,293 @@
{
"textures": [
{
"image": "pbinfo_stat_numbers.png",
"format": "RGBA8888",
"size": {
"w": 117,
"h": 8
},
"scale": 1,
"frames": [
{
"filename": "+1",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "+2",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 9,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "+3",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 18,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "+4",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 27,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "+5",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 36,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "+6",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 45,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-1",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 54,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-2",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 63,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-3",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 72,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-4",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 81,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-5",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 90,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-6",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 99,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "0",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 108,
"y": 0,
"w": 9,
"h": 8
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:794aa4af3291db5abd8a2667626c1998:1a6706ad557b92f9bf099c23e02af4a6:6537c634087637bb27e8a1edb1ee2e35$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 B

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 B

BIN
public/images/ui/candy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 B

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 B

View File

@ -0,0 +1,188 @@
{
"textures": [
{
"image": "pbinfo_stat.png",
"format": "RGBA8888",
"size": {
"w": 112,
"h": 6
},
"scale": 1,
"frames": [
{
"filename": "SPATK",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 19,
"h": 8
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 18,
"h": 6
},
"frame": {
"x": 0,
"y": 0,
"w": 18,
"h": 6
}
},
{
"filename": "SPDEF",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 19,
"h": 8
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 18,
"h": 6
},
"frame": {
"x": 18,
"y": 0,
"w": 18,
"h": 6
}
},
{
"filename": "CRIT",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 17,
"h": 8
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 16,
"h": 6
},
"frame": {
"x": 36,
"y": 0,
"w": 16,
"h": 6
}
},
{
"filename": "ACC",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 13,
"h": 8
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 12,
"h": 6
},
"frame": {
"x": 52,
"y": 0,
"w": 12,
"h": 6
}
},
{
"filename": "ATK",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 13,
"h": 8
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 12,
"h": 6
},
"frame": {
"x": 64,
"y": 0,
"w": 12,
"h": 6
}
},
{
"filename": "DEF",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 13,
"h": 8
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 12,
"h": 6
},
"frame": {
"x": 76,
"y": 0,
"w": 12,
"h": 6
}
},
{
"filename": "EVA",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 13,
"h": 8
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 12,
"h": 6
},
"frame": {
"x": 88,
"y": 0,
"w": 12,
"h": 6
}
},
{
"filename": "SPD",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 13,
"h": 8
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 12,
"h": 6
},
"frame": {
"x": 100,
"y": 0,
"w": 12,
"h": 6
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:40d30205ce8efd40dfa86cd11b0491d6:7076db6ed74199dcfb38fc8cd4d4a0e8:05882267d3999884e0491134e98b1b53$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

View File

@ -0,0 +1,293 @@
{
"textures": [
{
"image": "pbinfo_stat_numbers.png",
"format": "RGBA8888",
"size": {
"w": 117,
"h": 8
},
"scale": 1,
"frames": [
{
"filename": "1",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "2",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 9,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "3",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 18,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "4",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 27,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "5",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 36,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "6",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 45,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-1",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 54,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-2",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 63,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-3",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 72,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-4",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 81,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-5",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 90,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-6",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 99,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "0",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 108,
"y": 0,
"w": 9,
"h": 8
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:1f22b7cb085faf9e9764273fa5e70c28:afc5587ebacca78d178ac7e0c434591b:6537c634087637bb27e8a1edb1ee2e35$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 B

After

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 888 B

After

Width:  |  Height:  |  Size: 851 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 654 B

After

Width:  |  Height:  |  Size: 619 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 898 B

After

Width:  |  Height:  |  Size: 860 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,188 @@
{
"textures": [
{
"image": "pbinfo_stat.png",
"format": "RGBA8888",
"size": {
"w": 120,
"h": 7
},
"scale": 1,
"frames": [
{
"filename": "SPATK",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 19,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 19,
"h": 7
},
"frame": {
"x": 0,
"y": 0,
"w": 19,
"h": 7
}
},
{
"filename": "SPDEF",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 19,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 19,
"h": 7
},
"frame": {
"x": 19,
"y": 0,
"w": 19,
"h": 7
}
},
{
"filename": "CRIT",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 17,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 17,
"h": 7
},
"frame": {
"x": 38,
"y": 0,
"w": 17,
"h": 7
}
},
{
"filename": "ACC",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 13,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 13,
"h": 7
},
"frame": {
"x": 55,
"y": 0,
"w": 13,
"h": 7
}
},
{
"filename": "ATK",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 13,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 13,
"h": 7
},
"frame": {
"x": 68,
"y": 0,
"w": 13,
"h": 7
}
},
{
"filename": "DEF",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 13,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 13,
"h": 7
},
"frame": {
"x": 81,
"y": 0,
"w": 13,
"h": 7
}
},
{
"filename": "EVA",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 13,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 13,
"h": 7
},
"frame": {
"x": 94,
"y": 0,
"w": 13,
"h": 7
}
},
{
"filename": "SPD",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 13,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 13,
"h": 7
},
"frame": {
"x": 107,
"y": 0,
"w": 13,
"h": 7
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

View File

@ -0,0 +1,293 @@
{
"textures": [
{
"image": "pbinfo_stat_numbers.png",
"format": "RGBA8888",
"size": {
"w": 117,
"h": 8
},
"scale": 1,
"frames": [
{
"filename": "1",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "2",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 9,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "3",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 18,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "4",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 27,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "5",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 36,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "6",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 45,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-1",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 54,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-2",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 63,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-3",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 72,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-4",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 81,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-5",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 90,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "-6",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 99,
"y": 0,
"w": 9,
"h": 8
}
},
{
"filename": "0",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 9,
"h": 8
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 9,
"h": 8
},
"frame": {
"x": 108,
"y": 0,
"w": 9,
"h": 8
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:b0719fae0d9b670a727148cdc7202249:afc5587ebacca78d178ac7e0c434591b:4825a9f02f72f1fe28a724c6c5dffb37$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

View File

@ -3,8 +3,8 @@
"short_name": "PokéRogue", "short_name": "PokéRogue",
"description": "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.", "description": "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.",
"scope": "/", "scope": "/",
"start_url": "/", "start_url": "https://pokerogue.net",
"display": "standalone", "display": "fullscreen",
"background_color": "#8c8c8c", "background_color": "#8c8c8c",
"theme_color": "#8c8c8c", "theme_color": "#8c8c8c",
"icons": [ "icons": [

View File

@ -85,6 +85,7 @@ export enum Button {
ACTION, ACTION,
CANCEL, CANCEL,
MENU, MENU,
STATS,
CYCLE_SHINY, CYCLE_SHINY,
CYCLE_FORM, CYCLE_FORM,
CYCLE_GENDER, CYCLE_GENDER,
@ -205,6 +206,7 @@ export default class BattleScene extends SceneBase {
[Button.ACTION]: 0, // X [Button.ACTION]: 0, // X
[Button.CANCEL]: 1, // O [Button.CANCEL]: 1, // O
[Button.MENU]: 9, // options [Button.MENU]: 9, // options
[Button.STATS]: 8, // share
[Button.CYCLE_SHINY]: 5, // RB [Button.CYCLE_SHINY]: 5, // RB
[Button.CYCLE_FORM]: 4, // LB [Button.CYCLE_FORM]: 4, // LB
[Button.CYCLE_GENDER]: 6, // LT [Button.CYCLE_GENDER]: 6, // LT
@ -615,6 +617,7 @@ export default class BattleScene extends SceneBase {
[Button.ACTION]: [keyCodes.SPACE, keyCodes.ENTER, keyCodes.Z], [Button.ACTION]: [keyCodes.SPACE, keyCodes.ENTER, keyCodes.Z],
[Button.CANCEL]: [keyCodes.BACKSPACE, keyCodes.X], [Button.CANCEL]: [keyCodes.BACKSPACE, keyCodes.X],
[Button.MENU]: [keyCodes.ESC, keyCodes.M], [Button.MENU]: [keyCodes.ESC, keyCodes.M],
[Button.STATS]: [keyCodes.SHIFT, keyCodes.C],
[Button.CYCLE_SHINY]: [keyCodes.R], [Button.CYCLE_SHINY]: [keyCodes.R],
[Button.CYCLE_FORM]: [keyCodes.F], [Button.CYCLE_FORM]: [keyCodes.F],
[Button.CYCLE_GENDER]: [keyCodes.G], [Button.CYCLE_GENDER]: [keyCodes.G],
@ -1432,8 +1435,16 @@ export default class BattleScene extends SceneBase {
if (this.ui?.getMode() === Mode.SETTINGS) if (this.ui?.getMode() === Mode.SETTINGS)
(this.ui.getHandler() as SettingsUiHandler).show([]); (this.ui.getHandler() as SettingsUiHandler).show([]);
} }
} else {
let pressed = false;
if (this.ui && (this.buttonJustReleased(Button.STATS) || (pressed = this.buttonJustPressed(Button.STATS)))) {
for (let p of this.getField().filter(p => p?.isActive(true)))
p.toggleStats(pressed);
if (pressed)
this.setLastProcessedMovementTime(Button.STATS);
} else } else
return; return;
}
if (inputSuccess && this.enableVibration && typeof navigator.vibrate !== 'undefined') if (inputSuccess && this.enableVibration && typeof navigator.vibrate !== 'undefined')
navigator.vibrate(vibrationLength || 10); navigator.vibrate(vibrationLength || 10);
} }
@ -1463,6 +1474,23 @@ export default class BattleScene extends SceneBase {
return this.buttonKeys[button].some(k => Phaser.Input.Keyboard.JustDown(k)) || this.gamepadButtonJustDown(gamepad?.buttons[this.gamepadKeyConfig[button]]); return this.buttonKeys[button].some(k => Phaser.Input.Keyboard.JustDown(k)) || this.gamepadButtonJustDown(gamepad?.buttons[this.gamepadKeyConfig[button]]);
} }
/**
* gamepadButtonJustUp returns true if @param button has just been released
* or not. It will only return true once, until the key is released and pressed down
* again.
*/
gamepadButtonJustUp(button: Phaser.Input.Gamepad.Button): boolean {
if (!button || !this.gamepadSupport)
return false;
return !this.gamepadButtonStates[button.index];
}
buttonJustReleased(button: Button): boolean {
const gamepad = this.input.gamepad?.gamepads[0];
return this.buttonKeys[button].some(k => Phaser.Input.Keyboard.JustUp(k)) || this.gamepadButtonJustUp(gamepad?.buttons[this.gamepadKeyConfig[button]]);
}
/** /**
* repeatInputDurationJustPassed returns true if @param button has been held down long * repeatInputDurationJustPassed returns true if @param button has been held down long
* enough to fire a repeated input. A button must claim the movementButtonLock before * enough to fire a repeated input. A button must claim the movementButtonLock before

View File

@ -9,7 +9,7 @@ import { BattlerTag } from "./battler-tags";
import { BattlerTagType } from "./enums/battler-tag-type"; import { BattlerTagType } from "./enums/battler-tag-type";
import { StatusEffect, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; import { StatusEffect, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect";
import { Gender } from "./gender"; import { Gender } from "./gender";
import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, RecoilAttr, StatusMoveTypeImmunityAttr, FlinchAttr, OneHitKOAttr, HitHealAttr, StrengthSapHealAttr, allMoves } from "./move"; import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, RecoilAttr, StatusMoveTypeImmunityAttr, FlinchAttr, OneHitKOAttr, HitHealAttr, StrengthSapHealAttr, allMoves, StatusMove } from "./move";
import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; import { ArenaTagSide, ArenaTrapTag } from "./arena-tag";
import { ArenaTagType } from "./enums/arena-tag-type"; import { ArenaTagType } from "./enums/arena-tag-type";
import { Stat } from "./pokemon-stat"; import { Stat } from "./pokemon-stat";
@ -580,6 +580,35 @@ export class PostDefendStatChangeAbAttr extends PostDefendAbAttr {
} }
} }
export class PostDefendHpGatedStatChangeAbAttr extends PostDefendAbAttr {
private condition: PokemonDefendCondition;
private hpGate: number;
private stats: BattleStat[];
private levels: integer;
private selfTarget: boolean;
constructor(condition: PokemonDefendCondition, hpGate: number, stats: BattleStat[], levels: integer, selfTarget: boolean = true) {
super(true);
this.condition = condition;
this.hpGate = hpGate;
this.stats = stats;
this.levels = levels;
this.selfTarget = selfTarget;
}
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
const hpGateFlat: integer = Math.ceil(pokemon.getMaxHp() * this.hpGate)
const lastAttackReceived = pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1]
if (this.condition(pokemon, attacker, move.getMove()) && (pokemon.hp <= hpGateFlat && (pokemon.hp + lastAttackReceived.damage) > hpGateFlat)) {
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, (this.selfTarget ? pokemon : attacker).getBattlerIndex(), true, this.stats, this.levels));
return true;
}
return false;
}
}
export class PostDefendApplyArenaTrapTagAbAttr extends PostDefendAbAttr { export class PostDefendApplyArenaTrapTagAbAttr extends PostDefendAbAttr {
private condition: PokemonDefendCondition; private condition: PokemonDefendCondition;
private tagType: ArenaTagType; private tagType: ArenaTagType;
@ -679,6 +708,19 @@ export class PostDefendContactApplyStatusEffectAbAttr extends PostDefendAbAttr {
} }
} }
export class EffectSporeAbAttr extends PostDefendContactApplyStatusEffectAbAttr {
constructor() {
super(10, StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP);
}
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
if (attacker.hasAbility(Abilities.OVERCOAT) || attacker.isOfType(Type.GRASS)) {
return false;
}
return super.applyPostDefend(pokemon, passive, attacker, move, hitResult, args);
}
}
export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr { export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr {
private chance: integer; private chance: integer;
private tagType: BattlerTagType; private tagType: BattlerTagType;
@ -785,13 +827,16 @@ export class PostDefendAbilitySwapAbAttr extends PostDefendAbAttr {
} }
export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr { export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr {
constructor() { private ability: Abilities;
constructor(ability: Abilities) {
super(); super();
this.ability = ability;
} }
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.getAbility().hasAttr(UnsuppressableAbilityAbAttr) && !attacker.getAbility().hasAttr(PostDefendAbilityGiveAbAttr)) { if (move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnsuppressableAbilityAbAttr) && !attacker.getAbility().hasAttr(PostDefendAbilityGiveAbAttr)) {
attacker.summonData.ability = pokemon.getAbility().id; attacker.summonData.ability = this.ability;
return true; return true;
} }
@ -906,8 +951,8 @@ export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr {
private condition: PokemonAttackCondition; private condition: PokemonAttackCondition;
private powerMultiplier: number; private powerMultiplier: number;
constructor(condition: PokemonAttackCondition, powerMultiplier: number) { constructor(condition: PokemonAttackCondition, powerMultiplier: number, showAbility: boolean = true) {
super(true); super(showAbility);
this.condition = condition; this.condition = condition;
this.powerMultiplier = powerMultiplier; this.powerMultiplier = powerMultiplier;
} }
@ -1596,6 +1641,27 @@ export class BonusCritAbAttr extends AbAttr {
} }
} }
export class MultCritAbAttr extends AbAttr {
public multAmount: number;
constructor(multAmount: number) {
super(true);
this.multAmount = multAmount;
}
apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
const critMult = args[0] as Utils.NumberHolder;
if (critMult.value > 1){
critMult.value *= this.multAmount;
return true;
}
return false;
}
}
export class BlockNonDirectDamageAbAttr extends AbAttr { export class BlockNonDirectDamageAbAttr extends AbAttr {
apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
cancelled.value = true; cancelled.value = true;
@ -1722,6 +1788,53 @@ function getAnticipationCondition(): AbAttrCondition {
}; };
} }
export class ForewarnAbAttr extends PostSummonAbAttr {
constructor() {
super(true);
}
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
let maxPowerSeen = 0;
let maxMove = "";
let movePower = 0;
for (let opponent of pokemon.getOpponents()) {
for (let move of opponent.moveset) {
if (move.getMove() instanceof StatusMove) {
movePower = 1;
} else if (move.getMove().findAttr(attr => attr instanceof OneHitKOAttr)) {
movePower = 150;
} else if (move.getMove().id === Moves.COUNTER || move.getMove().id === Moves.MIRROR_COAT || move.getMove().id === Moves.METAL_BURST) {
movePower = 120;
} else if (move.getMove().power === -1) {
movePower = 80;
} else {
movePower = move.getMove().power;
}
if (movePower > maxPowerSeen) {
maxPowerSeen = movePower;
maxMove = move.getName();
}
}
}
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " was forewarned about " + maxMove + "!"));
return true;
}
}
export class FriskAbAttr extends PostSummonAbAttr {
constructor() {
super(true);
}
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
for (let opponent of pokemon.getOpponents()) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " frisked " + opponent.name + "\'s " + opponent.getAbility().name + "!"));
}
return true;
}
}
export class PostWeatherChangeAbAttr extends AbAttr { export class PostWeatherChangeAbAttr extends AbAttr {
applyPostWeatherChange(pokemon: Pokemon, passive: boolean, weather: WeatherType, args: any[]): boolean { applyPostWeatherChange(pokemon: Pokemon, passive: boolean, weather: WeatherType, args: any[]): boolean {
return false; return false;
@ -1872,13 +1985,19 @@ export class MoodyAbAttr extends PostTurnAbAttr {
} }
applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean { applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
// TODO: Edge case of not choosing to buff or debuff a stat that's already maxed
let selectableStats = [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD]; let selectableStats = [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD];
let increaseStat = selectableStats[Utils.randInt(selectableStats.length)]; let increaseStatArray = selectableStats.filter(s => pokemon.summonData.battleStats[s] < 6);
selectableStats = selectableStats.filter(s => s !== increaseStat); let decreaseStatArray = selectableStats.filter(s => pokemon.summonData.battleStats[s] > -6);
let decreaseStat = selectableStats[Utils.randInt(selectableStats.length)];
if (increaseStatArray.length > 0) {
let increaseStat = increaseStatArray[Utils.randInt(increaseStatArray.length)];
decreaseStatArray = decreaseStatArray.filter(s => s !== increaseStat);
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [increaseStat], 2)); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [increaseStat], 2));
}
if (decreaseStatArray.length > 0) {
let decreaseStat = selectableStats[Utils.randInt(selectableStats.length)];
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [decreaseStat], -1)); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [decreaseStat], -1));
}
return true; return true;
} }
} }
@ -2574,7 +2693,7 @@ export function initAbilities() {
.attr(TypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(BattlerTagType.IGNORE_FLYING) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY) && !pokemon.getTag(BattlerTagType.GROUNDED)) .attr(TypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(BattlerTagType.IGNORE_FLYING) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY) && !pokemon.getTag(BattlerTagType.GROUNDED))
.ignorable(), .ignorable(),
new Ability(Abilities.EFFECT_SPORE, 3) new Ability(Abilities.EFFECT_SPORE, 3)
.attr(PostDefendContactApplyStatusEffectAbAttr, 10, StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP), .attr(EffectSporeAbAttr),
new Ability(Abilities.SYNCHRONIZE, 3) new Ability(Abilities.SYNCHRONIZE, 3)
.attr(SyncEncounterNatureAbAttr) .attr(SyncEncounterNatureAbAttr)
.unimplemented(), .unimplemented(),
@ -2714,7 +2833,7 @@ export function initAbilities() {
.attr(TypeImmunityStatChangeAbAttr, Type.ELECTRIC, BattleStat.SPD, 1) .attr(TypeImmunityStatChangeAbAttr, Type.ELECTRIC, BattleStat.SPD, 1)
.ignorable(), .ignorable(),
new Ability(Abilities.RIVALRY, 4) new Ability(Abilities.RIVALRY, 4)
.attr(MovePowerBoostAbAttr, (user, target, move) => user.gender !== Gender.GENDERLESS && target.gender !== Gender.GENDERLESS && user.gender === target.gender, 1.25) .attr(MovePowerBoostAbAttr, (user, target, move) => user.gender !== Gender.GENDERLESS && target.gender !== Gender.GENDERLESS && user.gender === target.gender, 1.25, true)
.attr(MovePowerBoostAbAttr, (user, target, move) => user.gender !== Gender.GENDERLESS && target.gender !== Gender.GENDERLESS && user.gender !== target.gender, 0.75), .attr(MovePowerBoostAbAttr, (user, target, move) => user.gender !== Gender.GENDERLESS && target.gender !== Gender.GENDERLESS && user.gender !== target.gender, 0.75),
new Ability(Abilities.STEADFAST, 4) new Ability(Abilities.STEADFAST, 4)
.attr(FlinchStatChangeAbAttr, BattleStat.SPD, 1), .attr(FlinchStatChangeAbAttr, BattleStat.SPD, 1),
@ -2765,7 +2884,7 @@ export function initAbilities() {
.attr(MoveTypeChangeAttr, Type.NORMAL, 1.2, (user, target, move) => move.id !== Moves.HIDDEN_POWER && move.id !== Moves.WEATHER_BALL && .attr(MoveTypeChangeAttr, Type.NORMAL, 1.2, (user, target, move) => move.id !== Moves.HIDDEN_POWER && move.id !== Moves.WEATHER_BALL &&
move.id !== Moves.NATURAL_GIFT && move.id !== Moves.JUDGMENT && move.id !== Moves.TECHNO_BLAST), move.id !== Moves.NATURAL_GIFT && move.id !== Moves.JUDGMENT && move.id !== Moves.TECHNO_BLAST),
new Ability(Abilities.SNIPER, 4) new Ability(Abilities.SNIPER, 4)
.unimplemented(), .attr(MultCritAbAttr, 1.5),
new Ability(Abilities.MAGIC_GUARD, 4) new Ability(Abilities.MAGIC_GUARD, 4)
.attr(BlockNonDirectDamageAbAttr), .attr(BlockNonDirectDamageAbAttr),
new Ability(Abilities.NO_GUARD, 4) new Ability(Abilities.NO_GUARD, 4)
@ -2793,7 +2912,7 @@ export function initAbilities() {
new Ability(Abilities.ANTICIPATION, 4) new Ability(Abilities.ANTICIPATION, 4)
.conditionalAttr(getAnticipationCondition(), PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, ' shuddered!')), .conditionalAttr(getAnticipationCondition(), PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, ' shuddered!')),
new Ability(Abilities.FOREWARN, 4) new Ability(Abilities.FOREWARN, 4)
.unimplemented(), .attr(ForewarnAbAttr),
new Ability(Abilities.UNAWARE, 4) new Ability(Abilities.UNAWARE, 4)
.attr(IgnoreOpponentStatChangesAbAttr) .attr(IgnoreOpponentStatChangesAbAttr)
.ignorable(), .ignorable(),
@ -2822,7 +2941,7 @@ export function initAbilities() {
new Ability(Abilities.HONEY_GATHER, 4) new Ability(Abilities.HONEY_GATHER, 4)
.unimplemented(), .unimplemented(),
new Ability(Abilities.FRISK, 4) new Ability(Abilities.FRISK, 4)
.unimplemented(), .attr(FriskAbAttr),
new Ability(Abilities.RECKLESS, 4) new Ability(Abilities.RECKLESS, 4)
.attr(MovePowerBoostAbAttr, (user, target, move) => move.getAttrs(RecoilAttr).length && move.id !== Moves.STRUGGLE, 1.2), .attr(MovePowerBoostAbAttr, (user, target, move) => move.getAttrs(RecoilAttr).length && move.id !== Moves.STRUGGLE, 1.2),
new Ability(Abilities.MULTITYPE, 4) new Ability(Abilities.MULTITYPE, 4)
@ -2915,7 +3034,7 @@ export function initAbilities() {
new Ability(Abilities.INFILTRATOR, 5) new Ability(Abilities.INFILTRATOR, 5)
.unimplemented(), .unimplemented(),
new Ability(Abilities.MUMMY, 5) new Ability(Abilities.MUMMY, 5)
.attr(PostDefendAbilityGiveAbAttr) .attr(PostDefendAbilityGiveAbAttr, Abilities.MUMMY)
.bypassFaint(), .bypassFaint(),
new Ability(Abilities.MOXIE, 5) new Ability(Abilities.MOXIE, 5)
.attr(PostVictoryStatChangeAbAttr, BattleStat.ATK, 1), .attr(PostVictoryStatChangeAbAttr, BattleStat.ATK, 1),
@ -3059,7 +3178,7 @@ export function initAbilities() {
new Ability(Abilities.STEELWORKER, 7) new Ability(Abilities.STEELWORKER, 7)
.attr(MoveTypePowerBoostAbAttr, Type.STEEL), .attr(MoveTypePowerBoostAbAttr, Type.STEEL),
new Ability(Abilities.BERSERK, 7) new Ability(Abilities.BERSERK, 7)
.unimplemented(), .attr(PostDefendHpGatedStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [BattleStat.SPATK], 1),
new Ability(Abilities.SLUSH_RUSH, 7) new Ability(Abilities.SLUSH_RUSH, 7)
.attr(BattleStatMultiplierAbAttr, BattleStat.SPD, 2) .attr(BattleStatMultiplierAbAttr, BattleStat.SPD, 2)
.condition(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW)), .condition(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW)),
@ -3248,6 +3367,7 @@ export function initAbilities() {
.attr(UncopiableAbilityAbAttr) .attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr) .attr(UnswappableAbilityAbAttr)
.attr(NoTransformAbilityAbAttr) .attr(NoTransformAbilityAbAttr)
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, '\'s Neutralizing Gas filled the area!'))
.partial(), .partial(),
new Ability(Abilities.PASTEL_VEIL, 8) new Ability(Abilities.PASTEL_VEIL, 8)
.attr(StatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .attr(StatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC)
@ -3286,7 +3406,7 @@ export function initAbilities() {
.attr(UnswappableAbilityAbAttr) .attr(UnswappableAbilityAbAttr)
.attr(UnsuppressableAbilityAbAttr), .attr(UnsuppressableAbilityAbAttr),
new Ability(Abilities.LINGERING_AROMA, 9) new Ability(Abilities.LINGERING_AROMA, 9)
.attr(PostDefendAbilityGiveAbAttr) .attr(PostDefendAbilityGiveAbAttr, Abilities.LINGERING_AROMA)
.bypassFaint(), .bypassFaint(),
new Ability(Abilities.SEED_SOWER, 9) new Ability(Abilities.SEED_SOWER, 9)
.attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY), .attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY),
@ -3295,7 +3415,8 @@ export function initAbilities() {
.attr(StatusEffectImmunityAbAttr, StatusEffect.BURN) .attr(StatusEffectImmunityAbAttr, StatusEffect.BURN)
.ignorable(), .ignorable(),
new Ability(Abilities.ANGER_SHELL, 9) new Ability(Abilities.ANGER_SHELL, 9)
.unimplemented(), .attr(PostDefendHpGatedStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [ BattleStat.ATK, BattleStat.SPATK, BattleStat.SPD ], 1)
.attr(PostDefendHpGatedStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [ BattleStat.DEF, BattleStat.SPDEF ], -1),
new Ability(Abilities.PURIFYING_SALT, 9) new Ability(Abilities.PURIFYING_SALT, 9)
.attr(StatusEffectImmunityAbAttr) .attr(StatusEffectImmunityAbAttr)
.attr(ReceivedTypeDamageMultiplierAbAttr, Type.GHOST, 0.5) .attr(ReceivedTypeDamageMultiplierAbAttr, Type.GHOST, 0.5)

View File

@ -482,6 +482,20 @@ export class GravityTag extends ArenaTag {
} }
} }
class TailwindTag extends ArenaTag {
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
super(ArenaTagType.TAILWIND, turnCount, Moves.TAILWIND, sourceId, side);
}
onAdd(arena: Arena): void {
arena.scene.queueMessage(`The Tailwind blew from behind${this.side === ArenaTagSide.PLAYER ? '\nyour' : this.side === ArenaTagSide.ENEMY ? '\nthe opposing' : ''} team!`);
}
onRemove(arena: Arena): void {
arena.scene.queueMessage(`${this.side === ArenaTagSide.PLAYER ? 'Your' : this.side === ArenaTagSide.ENEMY ? 'The opposing' : ''} team's Tailwind petered out!`);
}
}
export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag { export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag {
switch (tagType) { switch (tagType) {
case ArenaTagType.MIST: case ArenaTagType.MIST:
@ -513,5 +527,7 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov
return new LightScreenTag(turnCount, sourceId, side); return new LightScreenTag(turnCount, sourceId, side);
case ArenaTagType.AURORA_VEIL: case ArenaTagType.AURORA_VEIL:
return new AuroraVeilTag(turnCount, sourceId, side); return new AuroraVeilTag(turnCount, sourceId, side);
case ArenaTagType.TAILWIND:
return new TailwindTag(turnCount, sourceId, side);
} }
} }

View File

@ -163,6 +163,29 @@ export class FlinchedTag extends BattlerTag {
} }
} }
export class InterruptedTag extends BattlerTag {
constructor(sourceMove: Moves){
super(BattlerTagType.INTERRUPTED, BattlerTagLapseType.PRE_MOVE, 0, sourceMove)
}
canAdd(pokemon: Pokemon): boolean {
return !!pokemon.getTag(BattlerTagType.FLYING)
}
onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon);
pokemon.getMoveQueue().shift()
pokemon.pushMoveHistory({move: Moves.NONE, result: MoveResult.OTHER})
}
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
super.lapse(pokemon, lapseType);
(pokemon.scene.getCurrentPhase() as MovePhase).cancel();
return true
}
}
export class ConfusedTag extends BattlerTag { export class ConfusedTag extends BattlerTag {
constructor(turnCount: integer, sourceMove: Moves) { constructor(turnCount: integer, sourceMove: Moves) {
super(BattlerTagType.CONFUSED, BattlerTagLapseType.MOVE, turnCount, sourceMove); super(BattlerTagType.CONFUSED, BattlerTagLapseType.MOVE, turnCount, sourceMove);
@ -368,6 +391,12 @@ export class FrenzyTag extends BattlerTag {
} }
} }
export class ChargingTag extends BattlerTag {
constructor(sourceMove: Moves, sourceId: integer) {
super(BattlerTagType.CHARGING, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId);
}
}
export class EncoreTag extends BattlerTag { export class EncoreTag extends BattlerTag {
public moveId: Moves; public moveId: Moves;
@ -961,6 +990,19 @@ export class HideSpriteTag extends BattlerTag {
} }
} }
export class TypeImmuneTag extends BattlerTag {
public immuneType: Type;
constructor(tagType: BattlerTagType, sourceMove: Moves, immuneType: Type, length: number) {
super(tagType, BattlerTagLapseType.TURN_END, 1, sourceMove);
}
}
export class MagnetRisenTag extends TypeImmuneTag {
constructor(tagType: BattlerTagType, sourceMove: Moves) {
super(tagType, sourceMove, Type.GROUND, 5);
}
}
export class TypeBoostTag extends BattlerTag { export class TypeBoostTag extends BattlerTag {
public boostedType: Type; public boostedType: Type;
public boostValue: number; public boostValue: number;
@ -1087,6 +1129,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc
return new RechargingTag(sourceMove); return new RechargingTag(sourceMove);
case BattlerTagType.FLINCHED: case BattlerTagType.FLINCHED:
return new FlinchedTag(sourceMove); return new FlinchedTag(sourceMove);
case BattlerTagType.INTERRUPTED:
return new InterruptedTag(sourceMove);
case BattlerTagType.CONFUSED: case BattlerTagType.CONFUSED:
return new ConfusedTag(turnCount, sourceMove); return new ConfusedTag(turnCount, sourceMove);
case BattlerTagType.INFATUATED: case BattlerTagType.INFATUATED:
@ -1097,6 +1141,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc
return new NightmareTag(); return new NightmareTag();
case BattlerTagType.FRENZY: case BattlerTagType.FRENZY:
return new FrenzyTag(sourceMove, sourceId); return new FrenzyTag(sourceMove, sourceId);
case BattlerTagType.CHARGING:
return new ChargingTag(sourceMove, sourceId);
case BattlerTagType.ENCORE: case BattlerTagType.ENCORE:
return new EncoreTag(sourceId); return new EncoreTag(sourceId);
case BattlerTagType.HELPING_HAND: case BattlerTagType.HELPING_HAND:
@ -1184,6 +1230,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc
return new CursedTag(sourceId); return new CursedTag(sourceId);
case BattlerTagType.CHARGED: case BattlerTagType.CHARGED:
return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true); return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true);
case BattlerTagType.MAGNET_RISEN:
return new MagnetRisenTag(tagType, sourceMove);
case BattlerTagType.BOUNCE: case BattlerTagType.BOUNCE:
return new BounceTag(sourceMove); return new BounceTag(sourceMove);
case BattlerTagType.NONE: case BattlerTagType.NONE:

View File

@ -99,6 +99,8 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
case BerryType.SITRUS: case BerryType.SITRUS:
case BerryType.ENIGMA: case BerryType.ENIGMA:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (pokemon.battleData)
pokemon.battleData.berriesEaten.push(berryType);
const hpHealed = new Utils.NumberHolder(Math.floor(pokemon.getMaxHp() / 4)); const hpHealed = new Utils.NumberHolder(Math.floor(pokemon.getMaxHp() / 4));
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, hpHealed); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, hpHealed);
pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(),
@ -106,6 +108,8 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
}; };
case BerryType.LUM: case BerryType.LUM:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (pokemon.battleData)
pokemon.battleData.berriesEaten.push(berryType);
if (pokemon.status) { if (pokemon.status) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect))); pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect)));
pokemon.resetStatus(); pokemon.resetStatus();
@ -119,6 +123,8 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
case BerryType.APICOT: case BerryType.APICOT:
case BerryType.SALAC: case BerryType.SALAC:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (pokemon.battleData)
pokemon.battleData.berriesEaten.push(berryType);
const battleStat = (berryType - BerryType.LIECHI) as BattleStat; const battleStat = (berryType - BerryType.LIECHI) as BattleStat;
const statLevels = new Utils.NumberHolder(1); const statLevels = new Utils.NumberHolder(1);
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels);
@ -126,16 +132,22 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
}; };
case BerryType.LANSAT: case BerryType.LANSAT:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (pokemon.battleData)
pokemon.battleData.berriesEaten.push(berryType);
pokemon.addTag(BattlerTagType.CRIT_BOOST); pokemon.addTag(BattlerTagType.CRIT_BOOST);
}; };
case BerryType.STARF: case BerryType.STARF:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (pokemon.battleData)
pokemon.battleData.berriesEaten.push(berryType);
const statLevels = new Utils.NumberHolder(2); const statLevels = new Utils.NumberHolder(2);
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels);
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ BattleStat.RAND ], statLevels.value)); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ BattleStat.RAND ], statLevels.value));
}; };
case BerryType.LEPPA: case BerryType.LEPPA:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (pokemon.battleData)
pokemon.battleData.berriesEaten.push(berryType);
const ppRestoreMove = pokemon.getMoveset().find(m => !m.getPpRatio()); const ppRestoreMove = pokemon.getMoveset().find(m => !m.getPpRatio());
ppRestoreMove.ppUsed = Math.max(ppRestoreMove.ppUsed - 10, 0); ppRestoreMove.ppUsed = Math.max(ppRestoreMove.ppUsed - 10, 0);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` restored PP to its move ${ppRestoreMove.getName()}\nusing its ${getBerryName(berryType)}!`)); pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` restored PP to its move ${ppRestoreMove.getName()}\nusing its ${getBerryName(berryType)}!`));

View File

@ -241,10 +241,10 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.ALL]: [ { 1: [ Species.BULBASAUR ], 16: [ Species.IVYSAUR ], 32: [ Species.VENUSAUR ] }, Species.GROWLITHE, { 1: [ Species.TURTWIG ], 18: [ Species.GROTLE ], 32: [ Species.TORTERRA ] } ] [TimeOfDay.ALL]: [ { 1: [ Species.BULBASAUR ], 16: [ Species.IVYSAUR ], 32: [ Species.VENUSAUR ] }, Species.GROWLITHE, { 1: [ Species.TURTWIG ], 18: [ Species.GROTLE ], 32: [ Species.TORTERRA ] } ]
}, },
[BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.SUDOWOODO ] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.SUDOWOODO ] },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.VIRIZION ] },
[BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [ Species.JUMPLUFF, Species.SUNFLORA, Species.WHIMSICOTT ], [TimeOfDay.DAY]: [ Species.JUMPLUFF, Species.SUNFLORA, Species.WHIMSICOTT ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [ Species.JUMPLUFF, Species.SUNFLORA, Species.WHIMSICOTT ], [TimeOfDay.DAY]: [ Species.JUMPLUFF, Species.SUNFLORA, Species.WHIMSICOTT ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.VENUSAUR, Species.SUDOWOODO, Species.TORTERRA ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.VENUSAUR, Species.SUDOWOODO, Species.TORTERRA ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.VIRIZION ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }
}, },
[Biome.TALL_GRASS]: { [Biome.TALL_GRASS]: {
@ -487,14 +487,14 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.NIGHT]: [ Species.ARBOK, Species.CLODSIRE ], [TimeOfDay.NIGHT]: [ Species.ARBOK, Species.CLODSIRE ],
[TimeOfDay.ALL]: [ Species.POLIWRATH, Species.SWALOT, Species.WHISCASH, Species.GASTRODON, Species.SEISMITOAD, Species.STUNFISK, Species.TOXAPEX ] [TimeOfDay.ALL]: [ Species.POLIWRATH, Species.SWALOT, Species.WHISCASH, Species.GASTRODON, Species.SEISMITOAD, Species.STUNFISK, Species.TOXAPEX ]
}, },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.FERALIGATR, Species.POLITOED, Species.SWAMPERT ] }, [BiomePoolTier.BOSS_RARE]: {
[BiomePoolTier.BOSS_SUPER_RARE]: {
[TimeOfDay.DAWN]: [ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING, Species.HISUI_GOODRA ], [TimeOfDay.DAWN]: [ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING, Species.HISUI_GOODRA ],
[TimeOfDay.DAY]: [ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING, Species.HISUI_GOODRA ], [TimeOfDay.DAY]: [ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING, Species.HISUI_GOODRA ],
[TimeOfDay.DUSK]: [], [TimeOfDay.DUSK]: [],
[TimeOfDay.NIGHT]: [], [TimeOfDay.NIGHT]: [],
[TimeOfDay.ALL]: [ Species.AZELF, Species.NAGANADEL, Species.GALAR_STUNFISK ] [TimeOfDay.ALL]: [ Species.FERALIGATR, Species.POLITOED, Species.SWAMPERT, Species.GALAR_STUNFISK ]
}, },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.AZELF, Species.NAGANADEL ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }
}, },
[Biome.BEACH]: { [Biome.BEACH]: {
@ -521,7 +521,7 @@ export const biomePokemonPools: BiomePokemonPools = {
}, },
[BiomePoolTier.RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.QUAXLY ], 16: [ Species.QUAXWELL ], 36: [ Species.QUAQUAVAL ] }, Species.TATSUGIRI ] }, [BiomePoolTier.RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.QUAXLY ], 16: [ Species.QUAXWELL ], 36: [ Species.QUAQUAVAL ] }, Species.TATSUGIRI ] },
[BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.TIRTOUGA ], 37: [ Species.CARRACOSTA ] } ] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.TIRTOUGA ], 37: [ Species.CARRACOSTA ] } ] },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KELDEO ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.CRESSELIA, Species.KELDEO, Species.TAPU_FINI ] },
[BiomePoolTier.BOSS]: { [BiomePoolTier.BOSS]: {
[TimeOfDay.DAWN]: [ Species.STARMIE ], [TimeOfDay.DAWN]: [ Species.STARMIE ],
[TimeOfDay.DAY]: [ Species.STARMIE ], [TimeOfDay.DAY]: [ Species.STARMIE ],
@ -530,7 +530,7 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.ALL]: [ Species.KINGLER, Species.CRAWDAUNT, Species.WORMADAM, Species.CRUSTLE, Species.BARBARACLE, Species.CLAWITZER, Species.TOXAPEX, Species.PALOSSAND ] [TimeOfDay.ALL]: [ Species.KINGLER, Species.CRAWDAUNT, Species.WORMADAM, Species.CRUSTLE, Species.BARBARACLE, Species.CLAWITZER, Species.TOXAPEX, Species.PALOSSAND ]
}, },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.CARRACOSTA, Species.QUAQUAVAL ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.CARRACOSTA, Species.QUAQUAVAL ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KELDEO ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.CRESSELIA, Species.KELDEO, Species.TAPU_FINI ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }
}, },
[Biome.LAKE]: { [Biome.LAKE]: {
@ -615,7 +615,7 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.DAY]: [], [TimeOfDay.DAY]: [],
[TimeOfDay.DUSK]: [], [TimeOfDay.DUSK]: [],
[TimeOfDay.NIGHT]: [], [TimeOfDay.NIGHT]: [],
[TimeOfDay.ALL]: [ Species.QWILFISH, Species.CORSOLA, Species.OCTILLERY, { 1: [ Species.MANTYKE ], 20: [ Species.MANTINE ] }, Species.ALOMOMOLA, { 1: [ Species.TYNAMO ], 39: [ Species.EELEKTRIK ] }, Species.DHELMISE ] [TimeOfDay.ALL]: [ Species.QWILFISH, Species.CORSOLA, Species.OCTILLERY, { 1: [ Species.MANTYKE ], 52: [ Species.MANTINE ] }, Species.ALOMOMOLA, { 1: [ Species.TYNAMO ], 39: [ Species.EELEKTRIK ] }, Species.DHELMISE ]
}, },
[BiomePoolTier.SUPER_RARE]: { [BiomePoolTier.SUPER_RARE]: {
[TimeOfDay.DAWN]: [], [TimeOfDay.DAWN]: [],
@ -640,8 +640,14 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.NIGHT]: [], [TimeOfDay.NIGHT]: [],
[TimeOfDay.ALL]: [ Species.LANTURN, Species.QWILFISH, Species.CORSOLA, Species.OCTILLERY, Species.MANTINE, Species.WAILORD, Species.HUNTAIL, Species.GOREBYSS, Species.LUVDISC, Species.JELLICENT, Species.ALOMOMOLA, Species.DRAGALGE, Species.BARRASKEWDA, Species.DONDOZO ] [TimeOfDay.ALL]: [ Species.LANTURN, Species.QWILFISH, Species.CORSOLA, Species.OCTILLERY, Species.MANTINE, Species.WAILORD, Species.HUNTAIL, Species.GOREBYSS, Species.LUVDISC, Species.JELLICENT, Species.ALOMOMOLA, Species.DRAGALGE, Species.BARRASKEWDA, Species.DONDOZO ]
}, },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.OMASTAR, Species.KABUTOPS, Species.RELICANTH, Species.EELEKTROSS, Species.PYUKUMUKU, Species.DHELMISE, Species.ARCTOVISH, Species.BASCULEGION ] }, [BiomePoolTier.BOSS_RARE]: {
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.MILOTIC, Species.NIHILEGO, Species.CURSOLA, Species.OVERQWIL ] }, [TimeOfDay.DAWN]: [],
[TimeOfDay.DAY]: [],
[TimeOfDay.DUSK]: [],
[TimeOfDay.NIGHT]: [],
[TimeOfDay.ALL]: [ Species.OMASTAR, Species.KABUTOPS, Species.RELICANTH, Species.EELEKTROSS, Species.PYUKUMUKU, Species.DHELMISE, Species.CURSOLA, Species.ARCTOVISH, Species.BASCULEGION, Species.OVERQWIL ]
},
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.MILOTIC, Species.NIHILEGO ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KYOGRE ] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KYOGRE ] }
}, },
[Biome.MOUNTAIN]: { [Biome.MOUNTAIN]: {
@ -840,7 +846,7 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.ALL]: [ { 1: [ Species.DARUMAKA ], 35: [ Species.DARMANITAN ] } ] [TimeOfDay.ALL]: [ { 1: [ Species.DARUMAKA ], 35: [ Species.DARMANITAN ] } ]
}, },
[BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.LILEEP ], 40: [ Species.CRADILY ] }, { 1: [ Species.ANORITH ], 40: [ Species.ARMALDO ] } ] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.LILEEP ], 40: [ Species.CRADILY ] }, { 1: [ Species.ANORITH ], 40: [ Species.ARMALDO ] } ] },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.REGIROCK, Species.PHEROMOSA ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.REGIROCK, Species.TAPU_BULU, Species.PHEROMOSA ] },
[BiomePoolTier.BOSS]: { [BiomePoolTier.BOSS]: {
[TimeOfDay.DAWN]: [ Species.HIPPOWDON, Species.HELIOLISK, Species.RABSCA ], [TimeOfDay.DAWN]: [ Species.HIPPOWDON, Species.HELIOLISK, Species.RABSCA ],
[TimeOfDay.DAY]: [ Species.HIPPOWDON, Species.HELIOLISK, Species.RABSCA ], [TimeOfDay.DAY]: [ Species.HIPPOWDON, Species.HELIOLISK, Species.RABSCA ],
@ -849,7 +855,7 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.ALL]: [ Species.SANDSLASH, Species.DRAPION, Species.DARMANITAN, Species.MARACTUS, Species.SANDACONDA, Species.BRAMBLEGHAST ] [TimeOfDay.ALL]: [ Species.SANDSLASH, Species.DRAPION, Species.DARMANITAN, Species.MARACTUS, Species.SANDACONDA, Species.BRAMBLEGHAST ]
}, },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.CRADILY, Species.ARMALDO ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.CRADILY, Species.ARMALDO ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.REGIROCK, Species.PHEROMOSA ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.REGIROCK, Species.TAPU_BULU, Species.PHEROMOSA ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }
}, },
[Biome.ICE_CAVE]: { [Biome.ICE_CAVE]: {
@ -951,9 +957,9 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.NIGHT]: [], [TimeOfDay.NIGHT]: [],
[TimeOfDay.ALL]: [ Species.TAUROS, Species.MILTANK, Species.GARDEVOIR, Species.PURUGLY, Species.ZEBSTRIKA, Species.FLORGES, Species.RIBOMBEE, Species.DUBWOOL ] [TimeOfDay.ALL]: [ Species.TAUROS, Species.MILTANK, Species.GARDEVOIR, Species.PURUGLY, Species.ZEBSTRIKA, Species.FLORGES, Species.RIBOMBEE, Species.DUBWOOL ]
}, },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.BLISSEY, Species.SYLVEON, Species.FLAPPLE, Species.APPLETUN, Species.MEOWSCARADA, Species.HYDRAPPLE ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [ Species.HISUI_LILLIGANT ], [TimeOfDay.DAY]: [ Species.HISUI_LILLIGANT ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.BLISSEY, Species.SYLVEON, Species.FLAPPLE, Species.APPLETUN, Species.MEOWSCARADA, Species.HYDRAPPLE ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [ Species.HISUI_LILLIGANT ], [TimeOfDay.DAY]: [ Species.HISUI_LILLIGANT ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.MELOETTA ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.MELOETTA ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.SHAYMIN ] }
}, },
[Biome.POWER_PLANT]: { [Biome.POWER_PLANT]: {
[BiomePoolTier.COMMON]: { [BiomePoolTier.COMMON]: {
@ -984,8 +990,8 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.NIGHT]: [], [TimeOfDay.NIGHT]: [],
[TimeOfDay.ALL]: [ Species.RAICHU, Species.MANECTRIC, Species.LUXRAY, Species.MAGNEZONE, Species.ELECTIVIRE, Species.DEDENNE, Species.VIKAVOLT, Species.TOGEDEMARU, Species.PAWMOT, Species.BELLIBOLT ] [TimeOfDay.ALL]: [ Species.RAICHU, Species.MANECTRIC, Species.LUXRAY, Species.MAGNEZONE, Species.ELECTIVIRE, Species.DEDENNE, Species.VIKAVOLT, Species.TOGEDEMARU, Species.PAWMOT, Species.BELLIBOLT ]
}, },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.JOLTEON, Species.AMPHAROS ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.JOLTEON, Species.AMPHAROS, Species.HISUI_ELECTRODE ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ZAPDOS, Species.RAIKOU, Species.THUNDURUS, Species.XURKITREE, Species.ZERAORA, Species.REGIELEKI, Species.HISUI_ELECTRODE ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ZAPDOS, Species.RAIKOU, Species.THUNDURUS, Species.XURKITREE, Species.ZERAORA, Species.REGIELEKI ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ZEKROM ] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ZEKROM ] }
}, },
[Biome.VOLCANO]: { [Biome.VOLCANO]: {
@ -1035,9 +1041,9 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.DAY]: [], [TimeOfDay.DAY]: [],
[TimeOfDay.DUSK]: [], [TimeOfDay.DUSK]: [],
[TimeOfDay.NIGHT]: [], [TimeOfDay.NIGHT]: [],
[TimeOfDay.ALL]: [ Species.CHARIZARD, Species.FLAREON, Species.TYPHLOSION, Species.INFERNAPE, Species.EMBOAR, Species.VOLCARONA, Species.DELPHOX, Species.INCINEROAR, Species.CINDERACE, Species.ARMAROUGE ] [TimeOfDay.ALL]: [ Species.CHARIZARD, Species.FLAREON, Species.TYPHLOSION, Species.INFERNAPE, Species.EMBOAR, Species.VOLCARONA, Species.DELPHOX, Species.INCINEROAR, Species.CINDERACE, Species.ARMAROUGE, Species.HISUI_ARCANINE ]
}, },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.MOLTRES, Species.ENTEI, Species.ROTOM, Species.HEATRAN, Species.VOLCANION, Species.CHI_YU, Species.HISUI_ARCANINE ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.MOLTRES, Species.ENTEI, Species.ROTOM, Species.HEATRAN, Species.VOLCANION, Species.CHI_YU ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.RESHIRAM ] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.RESHIRAM ] }
}, },
[Biome.GRAVEYARD]: { [Biome.GRAVEYARD]: {
@ -1074,8 +1080,8 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.NIGHT]: [], [TimeOfDay.NIGHT]: [],
[TimeOfDay.ALL]: [ Species.GENGAR, Species.BANETTE, Species.DRIFBLIM, Species.MISMAGIUS, Species.DUSKNOIR, Species.CHANDELURE, Species.TREVENANT, Species.GOURGEIST, Species.MIMIKYU, Species.POLTEAGEIST, Species.HOUNDSTONE ] [TimeOfDay.ALL]: [ Species.GENGAR, Species.BANETTE, Species.DRIFBLIM, Species.MISMAGIUS, Species.DUSKNOIR, Species.CHANDELURE, Species.TREVENANT, Species.GOURGEIST, Species.MIMIKYU, Species.POLTEAGEIST, Species.HOUNDSTONE ]
}, },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.SKELEDIRGE, Species.CERULEDGE ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.SKELEDIRGE, Species.CERULEDGE, Species.HISUI_TYPHLOSION ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.MARSHADOW, Species.SPECTRIER, Species.HISUI_TYPHLOSION ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.MARSHADOW, Species.SPECTRIER ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GIRATINA ] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GIRATINA ] }
}, },
[Biome.DOJO]: { [Biome.DOJO]: {
@ -1109,8 +1115,8 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.NIGHT]: [], [TimeOfDay.NIGHT]: [],
[TimeOfDay.ALL]: [ Species.HITMONLEE, Species.HITMONCHAN, Species.HARIYAMA, Species.MEDICHAM, Species.LUCARIO, Species.TOXICROAK, Species.THROH, Species.SAWK, Species.SCRAFTY, Species.MIENSHAO, Species.BEWEAR, Species.GRAPPLOCT, Species.ANNIHILAPE ] [TimeOfDay.ALL]: [ Species.HITMONLEE, Species.HITMONCHAN, Species.HARIYAMA, Species.MEDICHAM, Species.LUCARIO, Species.TOXICROAK, Species.THROH, Species.SAWK, Species.SCRAFTY, Species.MIENSHAO, Species.BEWEAR, Species.GRAPPLOCT, Species.ANNIHILAPE ]
}, },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.HITMONTOP, Species.GALLADE, Species.PANGORO ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.HITMONTOP, Species.GALLADE, Species.PANGORO, Species.SIRFETCHD, Species.HISUI_DECIDUEYE ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.TERRAKION, Species.SIRFETCHD, Species.URSHIFU, Species.HISUI_DECIDUEYE ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.TERRAKION, Species.URSHIFU ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ZAMAZENTA, Species.GALAR_ZAPDOS ] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ZAMAZENTA, Species.GALAR_ZAPDOS ] }
}, },
[Biome.FACTORY]: { [Biome.FACTORY]: {
@ -1128,8 +1134,8 @@ export const biomePokemonPools: BiomePokemonPools = {
] ]
}, },
[BiomePoolTier.UNCOMMON]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.BRONZOR ], 33: [ Species.BRONZONG ] }, Species.KLEFKI ] }, [BiomePoolTier.UNCOMMON]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.BRONZOR ], 33: [ Species.BRONZONG ] }, Species.KLEFKI ] },
[BiomePoolTier.RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.PORYGON ], 30: [ Species.PORYGON2 ] } ] },
[BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.PORYGON ], 30: [ Species.PORYGON2 ] }, { 1: [ Species.BELDUM ], 20: [ Species.METANG ], 45: [ Species.METAGROSS ] } ] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.BELDUM ], 20: [ Species.METANG ], 45: [ Species.METAGROSS ] } ] },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GENESECT, Species.MAGEARNA ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GENESECT, Species.MAGEARNA ] },
[BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KLINKLANG, Species.KLEFKI ] }, [BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KLINKLANG, Species.KLEFKI ] },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] },
@ -1168,8 +1174,8 @@ export const biomePokemonPools: BiomePokemonPools = {
}, },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.REGISTEEL, Species.FEZANDIPITI ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.REGISTEEL, Species.FEZANDIPITI ] },
[BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ALAKAZAM, Species.HYPNO, Species.XATU, Species.GRUMPIG, Species.CLAYDOL, Species.SIGILYPH, Species.GOTHITELLE, Species.BEHEEYEM, Species.TINKATON ] }, [BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ALAKAZAM, Species.HYPNO, Species.XATU, Species.GRUMPIG, Species.CLAYDOL, Species.SIGILYPH, Species.GOTHITELLE, Species.BEHEEYEM, Species.TINKATON ] },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [ Species.ESPEON ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.MR_MIME, Species.WOBBUFFET, Species.ARCHEOPS ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [ Species.ESPEON ], [TimeOfDay.DUSK]: [ Species.RUNERIGUS ], [TimeOfDay.NIGHT]: [ Species.RUNERIGUS ], [TimeOfDay.ALL]: [ Species.MR_MIME, Species.WOBBUFFET, Species.ARCHEOPS ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [ Species.RUNERIGUS ], [TimeOfDay.NIGHT]: [ Species.RUNERIGUS ], [TimeOfDay.ALL]: [ Species.REGISTEEL, Species.FEZANDIPITI ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.REGISTEEL, Species.FEZANDIPITI ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KORAIDON ] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KORAIDON ] }
}, },
[Biome.WASTELAND]: { [Biome.WASTELAND]: {
@ -1245,7 +1251,7 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.ALL]: [ Species.ABSOL, Species.SPIRITOMB, { 1: [ Species.ZORUA ], 30: [ Species.ZOROARK ] }, { 1: [ Species.DEINO ], 50: [ Species.ZWEILOUS ], 64: [ Species.HYDREIGON ] } ] [TimeOfDay.ALL]: [ Species.ABSOL, Species.SPIRITOMB, { 1: [ Species.ZORUA ], 30: [ Species.ZOROARK ] }, { 1: [ Species.DEINO ], 50: [ Species.ZWEILOUS ], 64: [ Species.HYDREIGON ] } ]
}, },
[BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.UMBREON ] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.UMBREON ] },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.DARKRAI, Species.GUZZLORD, Species.GALAR_MOLTRES ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.DARKRAI, Species.GALAR_MOLTRES ] },
[BiomePoolTier.BOSS]: { [BiomePoolTier.BOSS]: {
[TimeOfDay.DAWN]: [], [TimeOfDay.DAWN]: [],
[TimeOfDay.DAY]: [], [TimeOfDay.DAY]: [],
@ -1253,8 +1259,8 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.NIGHT]: [], [TimeOfDay.NIGHT]: [],
[TimeOfDay.ALL]: [ Species.HOUNDOOM, Species.SABLEYE, Species.ABSOL, Species.HONCHKROW, Species.SPIRITOMB, Species.LIEPARD, Species.ZOROARK, Species.HYDREIGON, Species.THIEVUL, Species.GRIMMSNARL, Species.MABOSSTIFF, Species.KINGAMBIT ] [TimeOfDay.ALL]: [ Species.HOUNDOOM, Species.SABLEYE, Species.ABSOL, Species.HONCHKROW, Species.SPIRITOMB, Species.LIEPARD, Species.ZOROARK, Species.HYDREIGON, Species.THIEVUL, Species.GRIMMSNARL, Species.MABOSSTIFF, Species.KINGAMBIT ]
}, },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.UMBREON ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.UMBREON, Species.HISUI_SAMUROTT ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.DARKRAI, Species.GUZZLORD, Species.HISUI_SAMUROTT ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.DARKRAI ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.PALKIA, Species.YVELTAL, Species.GALAR_MOLTRES ] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.PALKIA, Species.YVELTAL, Species.GALAR_MOLTRES ] }
}, },
[Biome.SPACE]: { [Biome.SPACE]: {
@ -1274,10 +1280,10 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.ALL]: [ { 1: [ Species.BELDUM ], 20: [ Species.METANG ], 45: [ Species.METAGROSS ] }, Species.SIGILYPH, { 1: [ Species.SOLOSIS ], 32: [ Species.DUOSION ], 41: [ Species.REUNICLUS ] } ] [TimeOfDay.ALL]: [ { 1: [ Species.BELDUM ], 20: [ Species.METANG ], 45: [ Species.METAGROSS ] }, Species.SIGILYPH, { 1: [ Species.SOLOSIS ], 32: [ Species.DUOSION ], 41: [ Species.REUNICLUS ] } ]
}, },
[BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.PORYGON ], 30: [ Species.PORYGON2 ] } ] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.PORYGON ], 30: [ Species.PORYGON2 ] } ] },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.CRESSELIA, { 1: [ Species.COSMOG ], 43: [ Species.COSMOEM ] }, Species.CELESTEELA ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.COSMOG ], 43: [ Species.COSMOEM ] }, Species.CELESTEELA ] },
[BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [ Species.SOLROCK ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [ Species.LUNATONE ], [TimeOfDay.ALL]: [ Species.CLEFABLE, Species.BRONZONG, Species.MUSHARNA, Species.REUNICLUS, Species.MINIOR ] }, [BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [ Species.SOLROCK ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [ Species.LUNATONE ], [TimeOfDay.ALL]: [ Species.CLEFABLE, Species.BRONZONG, Species.MUSHARNA, Species.REUNICLUS, Species.MINIOR ] },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.METAGROSS, Species.PORYGON_Z ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.METAGROSS, Species.PORYGON_Z ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.CRESSELIA, Species.CELESTEELA ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.CELESTEELA ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [ Species.SOLGALEO ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [ Species.LUNALA ], [TimeOfDay.ALL]: [ Species.RAYQUAZA, Species.NECROZMA ] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [ Species.SOLGALEO ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [ Species.LUNALA ], [TimeOfDay.ALL]: [ Species.RAYQUAZA, Species.NECROZMA ] }
}, },
[Biome.CONSTRUCTION_SITE]: { [Biome.CONSTRUCTION_SITE]: {
@ -1307,10 +1313,10 @@ export const biomePokemonPools: BiomePokemonPools = {
}, },
[BiomePoolTier.RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [ { 1: [ Species.GALAR_MEOWTH ], 28: [ Species.PERRSERKER ] } ], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ONIX, Species.HITMONLEE, Species.HITMONCHAN, Species.DURALUDON ] }, [BiomePoolTier.RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [ { 1: [ Species.GALAR_MEOWTH ], 28: [ Species.PERRSERKER ] } ], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ONIX, Species.HITMONLEE, Species.HITMONCHAN, Species.DURALUDON ] },
[BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.DITTO, Species.HITMONTOP ] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.DITTO, Species.HITMONTOP ] },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.COBALION ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.COBALION, Species.STAKATAKA ] },
[BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.MACHAMP, Species.CONKELDURR ] }, [BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.MACHAMP, Species.CONKELDURR ] },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [ Species.PERRSERKER ], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ARCHALUDON ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [ Species.PERRSERKER ], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ARCHALUDON ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.COBALION ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.COBALION, Species.STAKATAKA ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }
}, },
[Biome.JUNGLE]: { [Biome.JUNGLE]: {
@ -1319,7 +1325,7 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.DAY]: [ Species.VESPIQUEN, { 1: [ Species.CHERUBI ], 25: [ Species.CHERRIM ] }, { 1: [ Species.SEWADDLE ], 20: [ Species.SWADLOON ], 30: [ Species.LEAVANNY ] } ], [TimeOfDay.DAY]: [ Species.VESPIQUEN, { 1: [ Species.CHERUBI ], 25: [ Species.CHERRIM ] }, { 1: [ Species.SEWADDLE ], 20: [ Species.SWADLOON ], 30: [ Species.LEAVANNY ] } ],
[TimeOfDay.DUSK]: [ Species.SHROOMISH, { 1: [ Species.PURRLOIN ], 20: [ Species.LIEPARD ] }, { 1: [ Species.FOONGUS ], 39: [ Species.AMOONGUSS ] } ], [TimeOfDay.DUSK]: [ Species.SHROOMISH, { 1: [ Species.PURRLOIN ], 20: [ Species.LIEPARD ] }, { 1: [ Species.FOONGUS ], 39: [ Species.AMOONGUSS ] } ],
[TimeOfDay.NIGHT]: [ { 1: [ Species.SPINARAK ], 22: [ Species.ARIADOS ] }, Species.SHROOMISH, { 1: [ Species.PURRLOIN ], 20: [ Species.LIEPARD ] }, { 1: [ Species.FOONGUS ], 39: [ Species.AMOONGUSS ] } ], [TimeOfDay.NIGHT]: [ { 1: [ Species.SPINARAK ], 22: [ Species.ARIADOS ] }, Species.SHROOMISH, { 1: [ Species.PURRLOIN ], 20: [ Species.LIEPARD ] }, { 1: [ Species.FOONGUS ], 39: [ Species.AMOONGUSS ] } ],
[TimeOfDay.ALL]: [ Species.AIPOM, { 1: [ Species.BLITZLE ], 27: [ Species.ZEBSTRIKA ] }, { 1: [ Species.PIKIPEK ], 14: [ Species.TRUMBEAK ], 36: [ Species.TOUCANNON ] } ] [TimeOfDay.ALL]: [ Species.AIPOM, { 1: [ Species.BLITZLE ], 27: [ Species.ZEBSTRIKA ] }, { 1: [ Species.PIKIPEK ], 14: [ Species.TRUMBEAK ], 28: [ Species.TOUCANNON ] } ]
}, },
[BiomePoolTier.UNCOMMON]: { [BiomePoolTier.UNCOMMON]: {
[TimeOfDay.DAWN]: [ Species.EXEGGCUTE, Species.TROPIUS, Species.COMBEE, Species.KOMALA ], [TimeOfDay.DAWN]: [ Species.EXEGGCUTE, Species.TROPIUS, Species.COMBEE, Species.KOMALA ],
@ -1352,7 +1358,7 @@ export const biomePokemonPools: BiomePokemonPools = {
] ]
}, },
[BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KANGASKHAN, Species.CHATOT, Species.KLEAVOR ] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KANGASKHAN, Species.CHATOT, Species.KLEAVOR ] },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.VIRIZION, Species.BUZZWOLE, Species.ZARUDE, Species.MUNKIDORI ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.TAPU_LELE, Species.BUZZWOLE, Species.ZARUDE, Species.MUNKIDORI ] },
[BiomePoolTier.BOSS]: { [BiomePoolTier.BOSS]: {
[TimeOfDay.DAWN]: [ Species.EXEGGUTOR, Species.TROPIUS, Species.CHERRIM, Species.LEAVANNY, Species.KOMALA ], [TimeOfDay.DAWN]: [ Species.EXEGGUTOR, Species.TROPIUS, Species.CHERRIM, Species.LEAVANNY, Species.KOMALA ],
[TimeOfDay.DAY]: [ Species.EXEGGUTOR, Species.TROPIUS, Species.CHERRIM, Species.LEAVANNY, Species.KOMALA ], [TimeOfDay.DAY]: [ Species.EXEGGUTOR, Species.TROPIUS, Species.CHERRIM, Species.LEAVANNY, Species.KOMALA ],
@ -1367,7 +1373,7 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.NIGHT]: [], [TimeOfDay.NIGHT]: [],
[TimeOfDay.ALL]: [ Species.KANGASKHAN, Species.SCIZOR, Species.SLAKING, Species.LEAFEON, Species.SERPERIOR, Species.RILLABOOM ] [TimeOfDay.ALL]: [ Species.KANGASKHAN, Species.SCIZOR, Species.SLAKING, Species.LEAFEON, Species.SERPERIOR, Species.RILLABOOM ]
}, },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.VIRIZION, Species.BUZZWOLE, Species.ZARUDE, Species.MUNKIDORI ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.TAPU_LELE, Species.BUZZWOLE, Species.ZARUDE, Species.MUNKIDORI ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KLEAVOR ] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KLEAVOR ] }
}, },
[Biome.FAIRY_CAVE]: { [Biome.FAIRY_CAVE]: {
@ -1445,10 +1451,10 @@ export const biomePokemonPools: BiomePokemonPools = {
}, },
[BiomePoolTier.RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.GIMMIGHOUL ], 40: [ Species.GHOLDENGO ] } ] }, [BiomePoolTier.RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.GIMMIGHOUL ], 40: [ Species.GHOLDENGO ] } ] },
[BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.HOOPA, Species.TAPU_KOKO, Species.TAPU_LELE, Species.TAPU_BULU, Species.TAPU_FINI ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.HOOPA, Species.TAPU_KOKO ] },
[BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.CHIMECHO, Species.COFAGRIGUS, Species.GOLURK, Species.AEGISLASH ] }, [BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.CHIMECHO, Species.COFAGRIGUS, Species.GOLURK, Species.AEGISLASH ] },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GHOLDENGO ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GHOLDENGO ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.HOOPA, Species.TAPU_KOKO, Species.TAPU_LELE, Species.TAPU_BULU, Species.TAPU_FINI ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.HOOPA, Species.TAPU_KOKO ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.REGIGIGAS ] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.REGIGIGAS ] }
}, },
[Biome.SLUM]: { [Biome.SLUM]: {
@ -1479,10 +1485,10 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.ALL]: [ { 1: [ Species.VAROOM ], 40: [ Species.REVAVROOM ] } ] [TimeOfDay.ALL]: [ { 1: [ Species.VAROOM ], 40: [ Species.REVAVROOM ] } ]
}, },
[BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GUZZLORD ] },
[BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [ Species.SKUNTANK, Species.WATCHOG ], [TimeOfDay.NIGHT]: [ Species.SKUNTANK, Species.WATCHOG ], [TimeOfDay.ALL]: [ Species.MUK, Species.WEEZING, Species.WORMADAM, Species.GARBODOR ] }, [BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [ Species.SKUNTANK, Species.WATCHOG ], [TimeOfDay.NIGHT]: [ Species.SKUNTANK, Species.WATCHOG ], [TimeOfDay.ALL]: [ Species.MUK, Species.WEEZING, Species.WORMADAM, Species.GARBODOR ] },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [ Species.TOXTRICITY, Species.OBSTAGOON ], [TimeOfDay.NIGHT]: [ Species.TOXTRICITY, Species.OBSTAGOON ], [TimeOfDay.ALL]: [ Species.REVAVROOM ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [ Species.TOXTRICITY, Species.OBSTAGOON ], [TimeOfDay.NIGHT]: [ Species.TOXTRICITY, Species.OBSTAGOON ], [TimeOfDay.ALL]: [ Species.REVAVROOM, Species.GALAR_WEEZING ] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GALAR_WEEZING ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GUZZLORD ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }
}, },
[Biome.SNOWY_FOREST]: { [Biome.SNOWY_FOREST]: {
@ -1516,14 +1522,14 @@ export const biomePokemonPools: BiomePokemonPools = {
}, },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GLASTRIER, Species.CHIEN_PAO, Species.GALAR_ARTICUNO ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GLASTRIER, Species.CHIEN_PAO, Species.GALAR_ARTICUNO ] },
[BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [ Species.WYRDEER ], [TimeOfDay.DAY]: [ Species.WYRDEER ], [TimeOfDay.DUSK]: [ Species.FROSMOTH ], [TimeOfDay.NIGHT]: [ Species.FROSMOTH ], [TimeOfDay.ALL]: [ Species.ABOMASNOW, Species.URSALUNA ] }, [BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [ Species.WYRDEER ], [TimeOfDay.DAY]: [ Species.WYRDEER ], [TimeOfDay.DUSK]: [ Species.FROSMOTH ], [TimeOfDay.NIGHT]: [ Species.FROSMOTH ], [TimeOfDay.ALL]: [ Species.ABOMASNOW, Species.URSALUNA ] },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ARCTOZOLT, Species.ALOLA_SANDSLASH, Species.ALOLA_NINETALES ] }, [BiomePoolTier.BOSS_RARE]: {
[BiomePoolTier.BOSS_SUPER_RARE]: {
[TimeOfDay.DAWN]: [ Species.SNEASLER, Species.GALAR_DARMANITAN ], [TimeOfDay.DAWN]: [ Species.SNEASLER, Species.GALAR_DARMANITAN ],
[TimeOfDay.DAY]: [ Species.SNEASLER, Species.GALAR_DARMANITAN ], [TimeOfDay.DAY]: [ Species.SNEASLER, Species.GALAR_DARMANITAN ],
[TimeOfDay.DUSK]: [ Species.HISUI_ZOROARK ], [TimeOfDay.DUSK]: [ Species.HISUI_ZOROARK ],
[TimeOfDay.NIGHT]: [ Species.HISUI_ZOROARK ], [TimeOfDay.NIGHT]: [ Species.HISUI_ZOROARK ],
[TimeOfDay.ALL]: [ Species.MR_RIME, Species.GLASTRIER, Species.CHIEN_PAO ] [TimeOfDay.ALL]: [ Species.MR_RIME, Species.ARCTOZOLT, Species.ALOLA_SANDSLASH, Species.ALOLA_NINETALES ]
}, },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GLASTRIER, Species.CHIEN_PAO ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ZACIAN, Species.GALAR_ARTICUNO ] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.ZACIAN, Species.GALAR_ARTICUNO ] }
}, },
[Biome.ISLAND]: { [Biome.ISLAND]: {
@ -1550,7 +1556,7 @@ export const biomePokemonPools: BiomePokemonPools = {
}, },
[BiomePoolTier.RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] },
[BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.STAKATAKA, Species.BLACEPHALON ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.BLACEPHALON ] },
[BiomePoolTier.BOSS]: { [BiomePoolTier.BOSS]: {
[TimeOfDay.DAWN]: [ Species.ALOLA_RAICHU, Species.ALOLA_EXEGGUTOR ], [TimeOfDay.DAWN]: [ Species.ALOLA_RAICHU, Species.ALOLA_EXEGGUTOR ],
[TimeOfDay.DAY]: [ Species.ALOLA_RAICHU, Species.ALOLA_EXEGGUTOR ], [TimeOfDay.DAY]: [ Species.ALOLA_RAICHU, Species.ALOLA_EXEGGUTOR ],
@ -1559,7 +1565,7 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.ALL]: [ Species.ORICORIO, Species.BRUXISH, Species.ALOLA_SANDSLASH, Species.ALOLA_NINETALES, Species.ALOLA_DUGTRIO, Species.ALOLA_GOLEM, Species.ALOLA_MUK ] [TimeOfDay.ALL]: [ Species.ORICORIO, Species.BRUXISH, Species.ALOLA_SANDSLASH, Species.ALOLA_NINETALES, Species.ALOLA_DUGTRIO, Species.ALOLA_GOLEM, Species.ALOLA_MUK ]
}, },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] },
[BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.STAKATAKA, Species.BLACEPHALON ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.BLACEPHALON ] },
[BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] } [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }
}, },
[Biome.LABORATORY]: { [Biome.LABORATORY]: {
@ -2708,7 +2714,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.PORYGON, Type.NORMAL, -1, [ [ Species.PORYGON, Type.NORMAL, -1, [
[ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], [ Biome.FACTORY, BiomePoolTier.RARE ],
[ Biome.SPACE, BiomePoolTier.SUPER_RARE ], [ Biome.SPACE, BiomePoolTier.SUPER_RARE ],
[ Biome.LABORATORY, BiomePoolTier.RARE ] [ Biome.LABORATORY, BiomePoolTier.RARE ]
] ]
@ -3165,7 +3171,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.PORYGON2, Type.NORMAL, -1, [ [ Species.PORYGON2, Type.NORMAL, -1, [
[ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], [ Biome.FACTORY, BiomePoolTier.RARE ],
[ Biome.SPACE, BiomePoolTier.SUPER_RARE ], [ Biome.SPACE, BiomePoolTier.SUPER_RARE ],
[ Biome.LABORATORY, BiomePoolTier.RARE ] [ Biome.LABORATORY, BiomePoolTier.RARE ]
] ]
@ -4371,8 +4377,8 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.CRESSELIA, Type.PSYCHIC, -1, [ [ Species.CRESSELIA, Type.PSYCHIC, -1, [
[ Biome.SPACE, BiomePoolTier.ULTRA_RARE ], [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ],
[ Biome.SPACE, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ]
] ]
], ],
[ Species.PHIONE, Type.WATER, -1, [ ] [ Species.PHIONE, Type.WATER, -1, [ ]
@ -4384,7 +4390,9 @@ export const biomeTrainerPools: BiomeTrainerPools = {
[ Biome.ABYSS, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.ABYSS, BiomePoolTier.BOSS_SUPER_RARE ]
] ]
], ],
[ Species.SHAYMIN, Type.GRASS, -1, [ ] [ Species.SHAYMIN, Type.GRASS, -1, [
[ Biome.MEADOW, BiomePoolTier.BOSS_ULTRA_RARE ]
]
], ],
[ Species.ARCEUS, Type.NORMAL, -1, [ ] [ Species.ARCEUS, Type.NORMAL, -1, [ ]
], ],
@ -5103,8 +5111,8 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.VIRIZION, Type.GRASS, Type.FIGHTING, [ [ Species.VIRIZION, Type.GRASS, Type.FIGHTING, [
[ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], [ Biome.GRASS, BiomePoolTier.ULTRA_RARE ],
[ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.GRASS, BiomePoolTier.BOSS_SUPER_RARE ]
] ]
], ],
[ Species.TORNADUS, Type.FLYING, -1, [ [ Species.TORNADUS, Type.FLYING, -1, [
@ -5779,18 +5787,18 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.TAPU_LELE, Type.PSYCHIC, Type.FAIRY, [ [ Species.TAPU_LELE, Type.PSYCHIC, Type.FAIRY, [
[ Biome.TEMPLE, BiomePoolTier.ULTRA_RARE ], [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ],
[ Biome.TEMPLE, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ]
] ]
], ],
[ Species.TAPU_BULU, Type.GRASS, Type.FAIRY, [ [ Species.TAPU_BULU, Type.GRASS, Type.FAIRY, [
[ Biome.TEMPLE, BiomePoolTier.ULTRA_RARE ], [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ],
[ Biome.TEMPLE, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ]
] ]
], ],
[ Species.TAPU_FINI, Type.WATER, Type.FAIRY, [ [ Species.TAPU_FINI, Type.WATER, Type.FAIRY, [
[ Biome.TEMPLE, BiomePoolTier.ULTRA_RARE ], [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ],
[ Biome.TEMPLE, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ]
] ]
], ],
[ Species.COSMOG, Type.PSYCHIC, -1, [ [ Species.COSMOG, Type.PSYCHIC, -1, [
@ -5840,8 +5848,8 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.GUZZLORD, Type.DARK, Type.DRAGON, [ [ Species.GUZZLORD, Type.DARK, Type.DRAGON, [
[ Biome.ABYSS, BiomePoolTier.ULTRA_RARE ], [ Biome.SLUM, BiomePoolTier.ULTRA_RARE ],
[ Biome.ABYSS, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.SLUM, BiomePoolTier.BOSS_SUPER_RARE ]
] ]
], ],
[ Species.NECROZMA, Type.PSYCHIC, -1, [ [ Species.NECROZMA, Type.PSYCHIC, -1, [
@ -5867,8 +5875,8 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.STAKATAKA, Type.ROCK, Type.STEEL, [ [ Species.STAKATAKA, Type.ROCK, Type.STEEL, [
[ Biome.ISLAND, BiomePoolTier.ULTRA_RARE ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.ULTRA_RARE ],
[ Biome.ISLAND, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_SUPER_RARE ]
] ]
], ],
[ Species.BLACEPHALON, Type.FIRE, Type.GHOST, [ [ Species.BLACEPHALON, Type.FIRE, Type.GHOST, [
@ -6129,21 +6137,21 @@ export const biomeTrainerPools: BiomeTrainerPools = {
], ],
[ Species.CURSOLA, Type.GHOST, -1, [ [ Species.CURSOLA, Type.GHOST, -1, [
[ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.SUPER_RARE ],
[ Biome.SEABED, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.SEABED, BiomePoolTier.BOSS_RARE ]
] ]
], ],
[ Species.SIRFETCHD, Type.FIGHTING, -1, [ [ Species.SIRFETCHD, Type.FIGHTING, -1, [
[ Biome.DOJO, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.DOJO, BiomePoolTier.BOSS_RARE ]
] ]
], ],
[ Species.MR_RIME, Type.ICE, Type.PSYCHIC, [ [ Species.MR_RIME, Type.ICE, Type.PSYCHIC, [
[ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ],
[ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ]
] ]
], ],
[ Species.RUNERIGUS, Type.GROUND, Type.GHOST, [ [ Species.RUNERIGUS, Type.GROUND, Type.GHOST, [
[ Biome.RUINS, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], [ Biome.RUINS, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ],
[ Biome.RUINS, BiomePoolTier.BOSS_SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] [ Biome.RUINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ]
] ]
], ],
[ Species.MILCERY, Type.FAIRY, -1, [ [ Species.MILCERY, Type.FAIRY, -1, [
@ -6305,11 +6313,11 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.SNEASLER, Type.FIGHTING, Type.POISON, [ [ Species.SNEASLER, Type.FIGHTING, Type.POISON, [
[ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ]
] ]
], ],
[ Species.OVERQWIL, Type.DARK, Type.POISON, [ [ Species.OVERQWIL, Type.DARK, Type.POISON, [
[ Biome.SEABED, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.SEABED, BiomePoolTier.BOSS_RARE ]
] ]
], ],
[ Species.ENAMORUS, Type.FAIRY, Type.FLYING, [ [ Species.ENAMORUS, Type.FAIRY, Type.FLYING, [
@ -6972,7 +6980,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
], ],
[ Species.GALAR_SLOWBRO, Type.POISON, Type.PSYCHIC, [ [ Species.GALAR_SLOWBRO, Type.POISON, Type.PSYCHIC, [
[ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ],
[ Biome.SWAMP, BiomePoolTier.BOSS_SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ]
] ]
], ],
[ Species.GALAR_FARFETCHD, Type.FIGHTING, -1, [ [ Species.GALAR_FARFETCHD, Type.FIGHTING, -1, [
@ -6980,7 +6988,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.GALAR_WEEZING, Type.POISON, Type.FAIRY, [ [ Species.GALAR_WEEZING, Type.POISON, Type.FAIRY, [
[ Biome.SLUM, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.SLUM, BiomePoolTier.BOSS_RARE ]
] ]
], ],
[ Species.GALAR_MR_MIME, Type.ICE, Type.PSYCHIC, [ [ Species.GALAR_MR_MIME, Type.ICE, Type.PSYCHIC, [
@ -7003,7 +7011,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.GALAR_SLOWKING, Type.POISON, Type.PSYCHIC, [ [ Species.GALAR_SLOWKING, Type.POISON, Type.PSYCHIC, [
[ Biome.SWAMP, BiomePoolTier.BOSS_SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ]
] ]
], ],
[ Species.GALAR_CORSOLA, Type.GHOST, -1, [ [ Species.GALAR_CORSOLA, Type.GHOST, -1, [
@ -7024,7 +7032,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
], ],
[ Species.GALAR_DARMANITAN, Type.ICE, -1, [ [ Species.GALAR_DARMANITAN, Type.ICE, -1, [
[ Biome.SNOWY_FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], [ Biome.SNOWY_FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ],
[ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ]
] ]
], ],
[ Species.GALAR_YAMASK, Type.GROUND, Type.GHOST, [ [ Species.GALAR_YAMASK, Type.GROUND, Type.GHOST, [
@ -7033,7 +7041,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
], ],
[ Species.GALAR_STUNFISK, Type.GROUND, Type.STEEL, [ [ Species.GALAR_STUNFISK, Type.GROUND, Type.STEEL, [
[ Biome.SWAMP, BiomePoolTier.SUPER_RARE ], [ Biome.SWAMP, BiomePoolTier.SUPER_RARE ],
[ Biome.SWAMP, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ]
] ]
], ],
[ Species.HISUI_GROWLITHE, Type.FIRE, Type.ROCK, [ [ Species.HISUI_GROWLITHE, Type.FIRE, Type.ROCK, [
@ -7041,7 +7049,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.HISUI_ARCANINE, Type.FIRE, Type.ROCK, [ [ Species.HISUI_ARCANINE, Type.FIRE, Type.ROCK, [
[ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ]
] ]
], ],
[ Species.HISUI_VOLTORB, Type.ELECTRIC, Type.GRASS, [ [ Species.HISUI_VOLTORB, Type.ELECTRIC, Type.GRASS, [
@ -7049,11 +7057,11 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.HISUI_ELECTRODE, Type.ELECTRIC, Type.GRASS, [ [ Species.HISUI_ELECTRODE, Type.ELECTRIC, Type.GRASS, [
[ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ]
] ]
], ],
[ Species.HISUI_TYPHLOSION, Type.FIRE, Type.GHOST, [ [ Species.HISUI_TYPHLOSION, Type.FIRE, Type.GHOST, [
[ Biome.GRAVEYARD, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ]
] ]
], ],
[ Species.HISUI_QWILFISH, Type.DARK, Type.POISON, [ [ Species.HISUI_QWILFISH, Type.DARK, Type.POISON, [
@ -7065,11 +7073,11 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.HISUI_SAMUROTT, Type.WATER, Type.DARK, [ [ Species.HISUI_SAMUROTT, Type.WATER, Type.DARK, [
[ Biome.ABYSS, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.ABYSS, BiomePoolTier.BOSS_RARE ]
] ]
], ],
[ Species.HISUI_LILLIGANT, Type.GRASS, Type.FIGHTING, [ [ Species.HISUI_LILLIGANT, Type.GRASS, Type.FIGHTING, [
[ Biome.MEADOW, BiomePoolTier.BOSS_SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] [ Biome.MEADOW, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ]
] ]
], ],
[ Species.HISUI_ZORUA, Type.NORMAL, Type.GHOST, [ [ Species.HISUI_ZORUA, Type.NORMAL, Type.GHOST, [
@ -7078,7 +7086,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
], ],
[ Species.HISUI_ZOROARK, Type.NORMAL, Type.GHOST, [ [ Species.HISUI_ZOROARK, Type.NORMAL, Type.GHOST, [
[ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ],
[ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ]
] ]
], ],
[ Species.HISUI_BRAVIARY, Type.PSYCHIC, Type.FLYING, [ [ Species.HISUI_BRAVIARY, Type.PSYCHIC, Type.FLYING, [
@ -7091,7 +7099,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
], ],
[ Species.HISUI_GOODRA, Type.STEEL, Type.DRAGON, [ [ Species.HISUI_GOODRA, Type.STEEL, Type.DRAGON, [
[ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ],
[ Biome.SWAMP, BiomePoolTier.BOSS_SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ]
] ]
], ],
[ Species.HISUI_AVALUGG, Type.ICE, Type.ROCK, [ [ Species.HISUI_AVALUGG, Type.ICE, Type.ROCK, [
@ -7099,7 +7107,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.HISUI_DECIDUEYE, Type.GRASS, Type.FIGHTING, [ [ Species.HISUI_DECIDUEYE, Type.GRASS, Type.FIGHTING, [
[ Biome.DOJO, BiomePoolTier.BOSS_SUPER_RARE ] [ Biome.DOJO, BiomePoolTier.BOSS_RARE ]
] ]
], ],
[ Species.PALDEA_TAUROS, Type.FIGHTING, -1, [ [ Species.PALDEA_TAUROS, Type.FIGHTING, -1, [

View File

@ -458,9 +458,9 @@ export const speciesEggMoves = {
[Species.MORPEKO]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.PARTING_SHOT, Moves.SWORDS_DANCE ], [Species.MORPEKO]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.PARTING_SHOT, Moves.SWORDS_DANCE ],
[Species.CUFANT]: [ Moves.LIQUIDATION, Moves.HEAVY_SLAM, Moves.CLOSE_COMBAT, Moves.GIGATON_HAMMER ], [Species.CUFANT]: [ Moves.LIQUIDATION, Moves.HEAVY_SLAM, Moves.CLOSE_COMBAT, Moves.GIGATON_HAMMER ],
[Species.DRACOZOLT]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.FIRE_LASH, Moves.DRAGON_DANCE ], [Species.DRACOZOLT]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.FIRE_LASH, Moves.DRAGON_DANCE ],
[Species.ARCTOZOLT]: [ Moves.TRIPLE_AXEL, Moves.EARTHQUAKE, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ], [Species.ARCTOZOLT]: [ Moves.TRIPLE_AXEL, Moves.LIQUIDATION, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ],
[Species.DRACOVISH]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.THUNDER_FANG, Moves.DRAGON_DANCE ], [Species.DRACOVISH]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.THUNDER_FANG, Moves.DRAGON_DANCE ],
[Species.ARCTOVISH]: [ Moves.TRIPLE_AXEL, Moves.EARTHQUAKE, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ], [Species.ARCTOVISH]: [ Moves.TRIPLE_AXEL, Moves.SUPERCELL_SLAM, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ],
[Species.DURALUDON]: [ Moves.CALM_MIND, Moves.BODY_PRESS, Moves.EARTH_POWER, Moves.RECOVER ], [Species.DURALUDON]: [ Moves.CALM_MIND, Moves.BODY_PRESS, Moves.EARTH_POWER, Moves.RECOVER ],
[Species.DREEPY]: [ Moves.DRAGON_ENERGY, Moves.SHED_TAIL, Moves.BLAZING_TORQUE, Moves.SPECTRAL_THIEF ], [Species.DREEPY]: [ Moves.DRAGON_ENERGY, Moves.SHED_TAIL, Moves.BLAZING_TORQUE, Moves.SPECTRAL_THIEF ],
[Species.ZACIAN]: [ Moves.MAGICAL_TORQUE, Moves.BITTER_BLADE, Moves.LEAF_BLADE, Moves.VICTORY_DANCE ], [Species.ZACIAN]: [ Moves.MAGICAL_TORQUE, Moves.BITTER_BLADE, Moves.LEAF_BLADE, Moves.VICTORY_DANCE ],

View File

@ -77,8 +77,6 @@ export function getEggHatchWavesMessage(hatchWaves: integer): string {
} }
export function getEggGachaTypeDescriptor(scene: BattleScene, egg: Egg): string { export function getEggGachaTypeDescriptor(scene: BattleScene, egg: Egg): string {
if (egg.isManaphyEgg())
return '';
switch (egg.gachaType) { switch (egg.gachaType) {
case GachaType.LEGENDARY: case GachaType.LEGENDARY:
return `Legendary Rate Up (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, egg.timestamp)).getName()})`; return `Legendary Rate Up (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, egg.timestamp)).getName()})`;

View File

@ -15,5 +15,6 @@ export enum ArenaTagType {
GRAVITY = "GRAVITY", GRAVITY = "GRAVITY",
REFLECT = "REFLECT", REFLECT = "REFLECT",
LIGHT_SCREEN = "LIGHT_SCREEN", LIGHT_SCREEN = "LIGHT_SCREEN",
AURORA_VEIL = "AURORA_VEIL" AURORA_VEIL = "AURORA_VEIL",
TAILWIND = "TAILWIND"
} }

View File

@ -3,11 +3,13 @@ export enum BattlerTagType {
NONE = "NONE", NONE = "NONE",
RECHARGING = "RECHARGING", RECHARGING = "RECHARGING",
FLINCHED = "FLINCHED", FLINCHED = "FLINCHED",
INTERRUPTED = "INTERRUPTED",
CONFUSED = "CONFUSED", CONFUSED = "CONFUSED",
INFATUATED = "INFATUATED", INFATUATED = "INFATUATED",
SEEDED = "SEEDED", SEEDED = "SEEDED",
NIGHTMARE = "NIGHTMARE", NIGHTMARE = "NIGHTMARE",
FRENZY = "FRENZY", FRENZY = "FRENZY",
CHARGING = "CHARGING",
ENCORE = "ENCORE", ENCORE = "ENCORE",
HELPING_HAND = "HELPING_HAND", HELPING_HAND = "HELPING_HAND",
INGRAIN = "INGRAIN", INGRAIN = "INGRAIN",
@ -53,5 +55,6 @@ export enum BattlerTagType {
CURSED = "CURSED", CURSED = "CURSED",
CHARGED = "CHARGED", CHARGED = "CHARGED",
GROUNDED = "GROUNDED", GROUNDED = "GROUNDED",
MAGNET_RISEN = "MAGNET_RISEN",
BOUNCE = "BOUNCE" BOUNCE = "BOUNCE"
} }

View File

@ -564,7 +564,7 @@ export class TargetHalfHpDamageAttr extends FixedDamageAttr {
} }
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
(args[0] as Utils.IntegerHolder).value = Math.floor(target.hp / 2); (args[0] as Utils.IntegerHolder).value = Math.max(Math.floor(target.hp / 2), 1);
return true; return true;
} }
@ -692,7 +692,7 @@ export class RecoilAttr extends MoveEffectAttr {
return false; return false;
const recoilDamage = Math.max(Math.floor((!this.useHp ? user.turnData.damageDealt : user.getMaxHp()) * this.damageRatio), const recoilDamage = Math.max(Math.floor((!this.useHp ? user.turnData.damageDealt : user.getMaxHp()) * this.damageRatio),
!this.useHp && user.turnData.damageDealt ? 1 : 0); user.turnData.damageDealt ? 1 : 0);
if (!recoilDamage) if (!recoilDamage)
return false; return false;
@ -1016,6 +1016,25 @@ export class StatusEffectAttr extends MoveEffectAttr {
} }
} }
export class MultiStatusEffectAttr extends StatusEffectAttr {
public effects: StatusEffect[];
constructor(effects: StatusEffect[], selfTarget?: boolean, cureTurn?: integer, overrideStatus?: boolean) {
super(effects[0], selfTarget, cureTurn, overrideStatus);
this.effects = effects;
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
this.effect = Utils.randSeedItem(this.effects);
const result = super.apply(user, target, move, args);
return result;
}
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;
}
}
export class PsychoShiftEffectAttr extends MoveEffectAttr { export class PsychoShiftEffectAttr extends MoveEffectAttr {
constructor() { constructor() {
super(false, MoveEffectTrigger.HIT); super(false, MoveEffectTrigger.HIT);
@ -1313,10 +1332,13 @@ export class ChargeAttr extends OverrideMoveEffectAttr {
user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true }); user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true });
if (this.sameTurn) if (this.sameTurn)
user.scene.pushMovePhase(new MovePhase(user.scene, user, [ target.getBattlerIndex() ], user.moveset.find(m => m.moveId === move.id), true), this.followUpPriority); user.scene.pushMovePhase(new MovePhase(user.scene, user, [ target.getBattlerIndex() ], user.moveset.find(m => m.moveId === move.id), true), this.followUpPriority);
user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id);
resolve(true); resolve(true);
}); });
} else } else {
user.lapseTag(BattlerTagType.CHARGING);
resolve(false); resolve(false);
}
}); });
} }
@ -1481,6 +1503,23 @@ export class StatChangeAttr extends MoveEffectAttr {
} }
} }
export class AcupressureStatChangeAttr extends MoveEffectAttr {
constructor() {
super();
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> {
let randStats = [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD, BattleStat.ACC, BattleStat.EVA ];
randStats = randStats.filter(s => target.summonData.battleStats[s] < 6);
if (randStats.length > 0) {
let boostStat = [randStats[Utils.randInt(randStats.length)]];
user.scene.unshiftPhase(new StatChangePhase(user.scene, target.getBattlerIndex(), this.selfTarget, boostStat, 2));
return true;
}
return false;
}
}
export class GrowthStatChangeAttr extends StatChangeAttr { export class GrowthStatChangeAttr extends StatChangeAttr {
constructor() { constructor() {
super([ BattleStat.ATK, BattleStat.SPATK ], 1, true); super([ BattleStat.ATK, BattleStat.SPATK ], 1, true);
@ -1558,6 +1597,8 @@ export class CopyStatsAttr extends MoveEffectAttr {
user.addTag(BattlerTagType.CRIT_BOOST, 0, move.id); user.addTag(BattlerTagType.CRIT_BOOST, 0, move.id);
else else
user.removeTag(BattlerTagType.CRIT_BOOST); user.removeTag(BattlerTagType.CRIT_BOOST);
target.updateInfo();
user.updateInfo();
target.scene.queueMessage(getPokemonMessage(user, 'copied\n') + getPokemonMessage(target, `'s stat changes!`)); target.scene.queueMessage(getPokemonMessage(user, 'copied\n') + getPokemonMessage(target, `'s stat changes!`));
@ -1572,6 +1613,8 @@ export class InvertStatsAttr extends MoveEffectAttr {
for (let s = 0; s < target.summonData.battleStats.length; s++) for (let s = 0; s < target.summonData.battleStats.length; s++)
target.summonData.battleStats[s] *= -1; target.summonData.battleStats[s] *= -1;
target.updateInfo();
user.updateInfo();
target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere all reversed!`)); target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere all reversed!`));
@ -1586,6 +1629,8 @@ export class ResetStatsAttr extends MoveEffectAttr {
for (let s = 0; s < target.summonData.battleStats.length; s++) for (let s = 0; s < target.summonData.battleStats.length; s++)
target.summonData.battleStats[s] = 0; target.summonData.battleStats[s] = 0;
target.updateInfo();
user.updateInfo();
target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere eliminated!`)); target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere eliminated!`));
@ -1752,13 +1797,13 @@ export class BattleStatRatioPowerAttr extends VariablePowerAttr {
if (this.invert) { if (this.invert) {
// Gyro ball uses a specific formula // Gyro ball uses a specific formula
let userSpeed = user.getStat(this.stat); let userSpeed = user.getBattleStat(this.stat);
if (userSpeed < 1) { if (userSpeed < 1) {
// Gen 6+ always have 1 base power // Gen 6+ always have 1 base power
power.value = 1; power.value = 1;
return true; return true;
} }
let bp = Math.floor(Math.min(150, 25 * target.getStat(this.stat) / userSpeed + 1)); let bp = Math.floor(Math.min(150, 25 * target.getBattleStat(this.stat) / userSpeed + 1));
power.value = bp; power.value = bp;
return true; return true;
} }
@ -2000,6 +2045,17 @@ export class PresentPowerAttr extends VariablePowerAttr {
} }
} }
export class KnockOffPowerAttr extends VariablePowerAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if(target.getHeldItems().length > 0){
(args[0] as Utils.NumberHolder).value *= 1.5;
return true;
}
return false;
}
}
export class VariableAtkAttr extends MoveAttr { export class VariableAtkAttr extends MoveAttr {
constructor() { constructor() {
super(); super();
@ -2597,7 +2653,7 @@ export class CurseAttr extends MoveEffectAttr {
} }
let curseRecoilDamage = Math.floor(user.getMaxHp() / 2); let curseRecoilDamage = Math.floor(user.getMaxHp() / 2);
user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true); user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true);
user.scene.queueMessage(getPokemonMessage(user, ' cut its own HP!')); user.scene.queueMessage(getPokemonMessage(user, ` cut its own HP\nand laid a curse on the ${target.name}!`));
target.addTag(BattlerTagType.CURSED, 0, move.id, user.id); target.addTag(BattlerTagType.CURSED, 0, move.id, user.id);
return true; return true;
} else { } else {
@ -3577,6 +3633,23 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr {
} }
} }
export class SuppressAbilitiesAttr extends MoveEffectAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (!super.apply(user, target, move, args))
return false;
target.summonData.abilitySuppressed = true;
target.scene.queueMessage(getPokemonMessage(target, ` ability\nwas suppressed!`));
return true;
}
getCondition(): MoveConditionFunc {
return (user, target, move) => !target.getAbility().hasAttr(UnsuppressableAbilityAbAttr);
}
}
export class TransformAttr extends MoveEffectAttr { export class TransformAttr extends MoveEffectAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
return new Promise(resolve => { return new Promise(resolve => {
@ -3628,6 +3701,36 @@ export class MoneyAttr extends MoveEffectAttr {
} }
} }
export class LastResortAttr extends MoveAttr {
getCondition(): MoveConditionFunc {
return (user: Pokemon, target: Pokemon, move: Move) => {
const uniqueUsedMoveIds = new Set<Moves>();
const movesetMoveIds = user.getMoveset().map(m => m.moveId);
user.getMoveHistory().map(m => {
if (m.move !== move.id && movesetMoveIds.find(mm => mm === m.move))
uniqueUsedMoveIds.add(m.move);
});
return uniqueUsedMoveIds.size >= movesetMoveIds.length - 1;
};
}
}
export class VariableTargetAttr extends MoveAttr {
private targetChangeFunc: (user: Pokemon, target: Pokemon, move: Move) => number;
constructor(targetChange: (user: Pokemon, target: Pokemon, move: Move) => number) {
super();
this.targetChangeFunc = targetChange;
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const targetVal = args[0] as Utils.NumberHolder;
targetVal.value = this.targetChangeFunc(user, target, move);
return true;
}
}
const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY); const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY);
const failOnBossCondition: MoveConditionFunc = (user, target, move) => !target.isBossImmune(); const failOnBossCondition: MoveConditionFunc = (user, target, move) => !target.isBossImmune();
@ -3689,13 +3792,29 @@ export class FirstMoveCondition extends MoveCondition {
} }
} }
export class hitsSameTypeAttr extends VariableMoveTypeMultiplierAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const multiplier = args[0] as Utils.NumberHolder;
if (!user.getTypes().some(type => target.getTypes().includes(type))){
multiplier.value = 0;
return true;
}
return false;
}
}
const unknownTypeCondition: MoveConditionFunc = (user, target, move) => !user.getTypes().includes(Type.UNKNOWN);
export type MoveTargetSet = { export type MoveTargetSet = {
targets: BattlerIndex[]; targets: BattlerIndex[];
multiple: boolean; multiple: boolean;
} }
export function getMoveTargets(user: Pokemon, move: Moves): MoveTargetSet { export function getMoveTargets(user: Pokemon, move: Moves): MoveTargetSet {
const moveTarget = move ? allMoves[move].moveTarget : move === undefined ? MoveTarget.NEAR_ENEMY : []; const variableTarget = new Utils.NumberHolder(0);
user.getOpponents().forEach(p => applyMoveAttrs(VariableTargetAttr, user, p, allMoves[move], variableTarget));
const moveTarget = allMoves[move].getAttrs(VariableTargetAttr).length ? variableTarget.value : move ? allMoves[move].moveTarget : move === undefined ? MoveTarget.NEAR_ENEMY : [];
const opponents = user.getOpponents(); const opponents = user.getOpponents();
let set: Pokemon[] = []; let set: Pokemon[] = [];
@ -4198,9 +4317,7 @@ export function initMoves() {
new SelfStatusMove(Moves.CONVERSION, Type.NORMAL, -1, 30, -1, 0, 1) new SelfStatusMove(Moves.CONVERSION, Type.NORMAL, -1, 30, -1, 0, 1)
.attr(FirstMoveTypeAttr), .attr(FirstMoveTypeAttr),
new AttackMove(Moves.TRI_ATTACK, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, 20, 0, 1) new AttackMove(Moves.TRI_ATTACK, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, 20, 0, 1)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS) .attr(MultiStatusEffectAttr, [StatusEffect.BURN, StatusEffect.FREEZE, StatusEffect.PARALYSIS]),
.attr(StatusEffectAttr, StatusEffect.BURN)
.attr(StatusEffectAttr, StatusEffect.FREEZE),
new AttackMove(Moves.SUPER_FANG, Type.NORMAL, MoveCategory.PHYSICAL, -1, 90, 10, -1, 0, 1) new AttackMove(Moves.SUPER_FANG, Type.NORMAL, MoveCategory.PHYSICAL, -1, 90, 10, -1, 0, 1)
.attr(TargetHalfHpDamageAttr), .attr(TargetHalfHpDamageAttr),
new AttackMove(Moves.SLASH, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 1) new AttackMove(Moves.SLASH, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 1)
@ -4564,6 +4681,7 @@ export function initMoves() {
.condition((user, target, move) => !target.status) .condition((user, target, move) => !target.status)
.magicCoatMove(), .magicCoatMove(),
new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3) new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3)
.attr(KnockOffPowerAttr)
.partial(), .partial(),
new AttackMove(Moves.ENDEAVOR, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 3) new AttackMove(Moves.ENDEAVOR, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 3)
.attr(MatchHpAttr) .attr(MatchHpAttr)
@ -4674,8 +4792,7 @@ export function initMoves() {
.soundBased() .soundBased()
.magicCoatMove(), .magicCoatMove(),
new StatusMove(Moves.TICKLE, Type.NORMAL, 100, 20, -1, 0, 3) new StatusMove(Moves.TICKLE, Type.NORMAL, 100, 20, -1, 0, 3)
.attr(StatChangeAttr, BattleStat.ATK, -1) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF ], -1)
.attr(StatChangeAttr, BattleStat.DEF, -1)
.magicCoatMove(), .magicCoatMove(),
new SelfStatusMove(Moves.COSMIC_POWER, Type.PSYCHIC, -1, 20, -1, 0, 3) new SelfStatusMove(Moves.COSMIC_POWER, Type.PSYCHIC, -1, 20, -1, 0, 3)
.attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], 1, true), .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], 1, true),
@ -4797,10 +4914,10 @@ export function initMoves() {
.partial(), .partial(),
new StatusMove(Moves.TAILWIND, Type.FLYING, -1, 15, -1, 0, 4) new StatusMove(Moves.TAILWIND, Type.FLYING, -1, 15, -1, 0, 4)
.windMove() .windMove()
.target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.TAILWIND, 4, true)
.unimplemented(), .target(MoveTarget.USER_SIDE),
new StatusMove(Moves.ACUPRESSURE, Type.NORMAL, -1, 30, -1, 0, 4) new StatusMove(Moves.ACUPRESSURE, Type.NORMAL, -1, 30, -1, 0, 4)
.attr(StatChangeAttr, BattleStat.RAND, 2) .attr(AcupressureStatChangeAttr)
.target(MoveTarget.USER_OR_NEAR_ALLY), .target(MoveTarget.USER_OR_NEAR_ALLY),
new AttackMove(Moves.METAL_BURST, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4) new AttackMove(Moves.METAL_BURST, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4)
.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)
@ -4842,8 +4959,8 @@ export function initMoves() {
new SelfStatusMove(Moves.POWER_TRICK, Type.PSYCHIC, -1, 10, -1, 0, 4) new SelfStatusMove(Moves.POWER_TRICK, Type.PSYCHIC, -1, 10, -1, 0, 4)
.unimplemented(), .unimplemented(),
new StatusMove(Moves.GASTRO_ACID, Type.POISON, 100, 10, -1, 0, 4) new StatusMove(Moves.GASTRO_ACID, Type.POISON, 100, 10, -1, 0, 4)
.magicCoatMove() .attr(SuppressAbilitiesAttr)
.unimplemented(), .magicCoatMove(),
new StatusMove(Moves.LUCKY_CHANT, Type.NORMAL, -1, 30, -1, 0, 4) new StatusMove(Moves.LUCKY_CHANT, Type.NORMAL, -1, 30, -1, 0, 4)
.attr(AddBattlerTagAttr, BattlerTagType.NO_CRIT, false, false, 5) .attr(AddBattlerTagAttr, BattlerTagType.NO_CRIT, false, false, 5)
.target(MoveTarget.USER_SIDE) .target(MoveTarget.USER_SIDE)
@ -4862,15 +4979,7 @@ export function initMoves() {
new AttackMove(Moves.PUNISHMENT, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) new AttackMove(Moves.PUNISHMENT, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4)
.unimplemented(), .unimplemented(),
new AttackMove(Moves.LAST_RESORT, Type.NORMAL, MoveCategory.PHYSICAL, 140, 100, 5, -1, 0, 4) new AttackMove(Moves.LAST_RESORT, Type.NORMAL, MoveCategory.PHYSICAL, 140, 100, 5, -1, 0, 4)
.condition((user, target, move) => { .attr(LastResortAttr),
const uniqueUsedMoveIds = new Set<Moves>();
const movesetMoveIds = user.getMoveset().map(m => m.moveId);
user.getMoveHistory().map(m => {
if (m.move !== move.id && movesetMoveIds.find(mm => mm === m.move))
uniqueUsedMoveIds.add(m.move);
});
return uniqueUsedMoveIds.size >= movesetMoveIds.length - 1;
}),
new StatusMove(Moves.WORRY_SEED, Type.GRASS, 100, 10, -1, 0, 4) new StatusMove(Moves.WORRY_SEED, Type.GRASS, 100, 10, -1, 0, 4)
.attr(AbilityChangeAttr, Abilities.INSOMNIA) .attr(AbilityChangeAttr, Abilities.INSOMNIA)
.magicCoatMove(), .magicCoatMove(),
@ -4885,6 +4994,10 @@ export function initMoves() {
new SelfStatusMove(Moves.AQUA_RING, Type.WATER, -1, 20, -1, 0, 4) new SelfStatusMove(Moves.AQUA_RING, Type.WATER, -1, 20, -1, 0, 4)
.attr(AddBattlerTagAttr, BattlerTagType.AQUA_RING, true, true), .attr(AddBattlerTagAttr, BattlerTagType.AQUA_RING, true, true),
new SelfStatusMove(Moves.MAGNET_RISE, Type.ELECTRIC, -1, 10, -1, 0, 4) new SelfStatusMove(Moves.MAGNET_RISE, Type.ELECTRIC, -1, 10, -1, 0, 4)
.attr(AddBattlerTagAttr, BattlerTagType.MAGNET_RISEN, true, true)
.condition((user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY) &&
!user.getTag(BattlerTagType.IGNORE_FLYING) && !user.getTag(BattlerTagType.INGRAIN) &&
!user.getTag(BattlerTagType.MAGNET_RISEN))
.unimplemented(), .unimplemented(),
new AttackMove(Moves.FLARE_BLITZ, Type.FIRE, MoveCategory.PHYSICAL, 120, 100, 15, 10, 0, 4) new AttackMove(Moves.FLARE_BLITZ, Type.FIRE, MoveCategory.PHYSICAL, 120, 100, 15, 10, 0, 4)
.attr(RecoilAttr, false, 0.33) .attr(RecoilAttr, false, 0.33)
@ -5116,6 +5229,8 @@ export function initMoves() {
.unimplemented(), .unimplemented(),
new AttackMove(Moves.SMACK_DOWN, Type.ROCK, MoveCategory.PHYSICAL, 50, 100, 15, 100, 0, 5) new AttackMove(Moves.SMACK_DOWN, Type.ROCK, MoveCategory.PHYSICAL, 50, 100, 15, 100, 0, 5)
.attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 5) .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 5)
.attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED)
.attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING])
.attr(HitsTagAttr, BattlerTagType.FLYING, false) .attr(HitsTagAttr, BattlerTagType.FLYING, false)
.makesContact(false), .makesContact(false),
new AttackMove(Moves.STORM_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) new AttackMove(Moves.STORM_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5)
@ -5133,7 +5248,8 @@ export function initMoves() {
.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)
.partial(), .condition(unknownTypeCondition)
.attr(hitsSameTypeAttr),
new AttackMove(Moves.ELECTRO_BALL, Type.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5) new AttackMove(Moves.ELECTRO_BALL, Type.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5)
.attr(BattleStatRatioPowerAttr, Stat.SPD) .attr(BattleStatRatioPowerAttr, Stat.SPD)
.ballBombMove(), .ballBombMove(),
@ -5207,7 +5323,7 @@ export function initMoves() {
new StatusMove(Moves.QUASH, Type.DARK, 100, 15, -1, 0, 5) new StatusMove(Moves.QUASH, Type.DARK, 100, 15, -1, 0, 5)
.unimplemented(), .unimplemented(),
new AttackMove(Moves.ACROBATICS, Type.FLYING, MoveCategory.PHYSICAL, 55, 100, 15, -1, 0, 5) new AttackMove(Moves.ACROBATICS, Type.FLYING, MoveCategory.PHYSICAL, 55, 100, 15, -1, 0, 5)
.partial(), .attr(MovePowerMultiplierAttr, (user, target, move) => Math.max(1, 2 - 0.2 * user.getHeldItems().reduce((v, m) => v + m.stackCount, 0))),
new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5) new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5)
.attr(CopyTypeAttr), .attr(CopyTypeAttr),
new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5) new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5)
@ -5337,7 +5453,7 @@ export function initMoves() {
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(),
new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6) new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6)
.partial(), .condition((user, target, move) => user.battleData.berriesEaten.length > 0),
new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, 100, 0, 6) new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, 100, 0, 6)
.target(MoveTarget.ALL) .target(MoveTarget.ALL)
.unimplemented(), .unimplemented(),
@ -5447,7 +5563,7 @@ export function initMoves() {
.attr(StatChangeAttr, BattleStat.SPATK, -2) .attr(StatChangeAttr, BattleStat.SPATK, -2)
.magicCoatMove(), .magicCoatMove(),
new StatusMove(Moves.VENOM_DRENCH, Type.POISON, 100, 20, 100, 0, 6) new StatusMove(Moves.VENOM_DRENCH, Type.POISON, 100, 20, 100, 0, 6)
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK, BattleStat.SPD ], -1, false, (user, target, move) => target.status?.effect === StatusEffect.POISON) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK, BattleStat.SPD ], -1, false, (user, target, move) => target.status?.effect === StatusEffect.POISON || target.status?.effect === StatusEffect.TOXIC)
.target(MoveTarget.ALL_NEAR_ENEMIES) .target(MoveTarget.ALL_NEAR_ENEMIES)
.magicCoatMove(), .magicCoatMove(),
new StatusMove(Moves.POWDER, Type.BUG, 100, 20, -1, 1, 6) new StatusMove(Moves.POWDER, Type.BUG, 100, 20, -1, 1, 6)
@ -5492,6 +5608,8 @@ export function initMoves() {
new AttackMove(Moves.THOUSAND_ARROWS, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, 100, 0, 6) new AttackMove(Moves.THOUSAND_ARROWS, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, 100, 0, 6)
.attr(NeutralDamageAgainstFlyingTypeMultiplierAttr) .attr(NeutralDamageAgainstFlyingTypeMultiplierAttr)
.attr(HitsTagAttr, BattlerTagType.FLYING, false) .attr(HitsTagAttr, BattlerTagType.FLYING, false)
.attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED)
.attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING])
.makesContact(false) .makesContact(false)
.target(MoveTarget.ALL_NEAR_ENEMIES), .target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.THOUSAND_WAVES, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) new AttackMove(Moves.THOUSAND_WAVES, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6)
@ -5746,8 +5864,7 @@ export function initMoves() {
.ignoresAbilities() .ignoresAbilities()
.partial(), .partial(),
new StatusMove(Moves.TEARFUL_LOOK, Type.NORMAL, -1, 20, 100, 0, 7) new StatusMove(Moves.TEARFUL_LOOK, Type.NORMAL, -1, 20, 100, 0, 7)
.attr(StatChangeAttr, BattleStat.ATK, -1) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -1)
.attr(StatChangeAttr, BattleStat.SPATK, -1)
.magicCoatMove(), .magicCoatMove(),
new AttackMove(Moves.ZING_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 7) new AttackMove(Moves.ZING_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 7)
.attr(FlinchAttr), .attr(FlinchAttr),
@ -5929,8 +6046,7 @@ export function initMoves() {
new AttackMove(Moves.BODY_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) new AttackMove(Moves.BODY_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8)
.attr(DefAtkAttr), .attr(DefAtkAttr),
new StatusMove(Moves.DECORATE, Type.FAIRY, -1, 15, 100, 0, 8) new StatusMove(Moves.DECORATE, Type.FAIRY, -1, 15, 100, 0, 8)
.attr(StatChangeAttr, BattleStat.ATK, 2) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], 2),
.attr(StatChangeAttr, BattleStat.SPATK, 2),
new AttackMove(Moves.DRUM_BEATING, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8) new AttackMove(Moves.DRUM_BEATING, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8)
.attr(StatChangeAttr, BattleStat.SPD, -1) .attr(StatChangeAttr, BattleStat.SPD, -1)
.makesContact(false), .makesContact(false),
@ -5980,7 +6096,8 @@ export function initMoves() {
new AttackMove(Moves.STEEL_BEAM, Type.STEEL, MoveCategory.SPECIAL, 140, 95, 5, -1, 0, 8) new AttackMove(Moves.STEEL_BEAM, Type.STEEL, MoveCategory.SPECIAL, 140, 95, 5, -1, 0, 8)
.attr(HalfSacrificialAttr), .attr(HalfSacrificialAttr),
new AttackMove(Moves.EXPANDING_FORCE, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 8) new AttackMove(Moves.EXPANDING_FORCE, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 8)
.partial(), .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.PSYCHIC && user.isGrounded() ? 1.5 : 1)
.attr(VariableTargetAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.PSYCHIC && user.isGrounded() ? 6 : 3),
new AttackMove(Moves.STEEL_ROLLER, Type.STEEL, MoveCategory.PHYSICAL, 130, 100, 5, -1, 0, 8) new AttackMove(Moves.STEEL_ROLLER, Type.STEEL, MoveCategory.PHYSICAL, 130, 100, 5, -1, 0, 8)
.attr(ClearTerrainAttr) .attr(ClearTerrainAttr)
.condition((user, target, move) => !!user.scene.arena.terrain), .condition((user, target, move) => !!user.scene.arena.terrain),
@ -6072,9 +6189,7 @@ export function initMoves() {
.soundBased() .soundBased()
.partial(), .partial(),
new AttackMove(Moves.DIRE_CLAW, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8) new AttackMove(Moves.DIRE_CLAW, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8)
.attr(StatusEffectAttr, StatusEffect.POISON) .attr(MultiStatusEffectAttr, [StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP]),
.attr(StatusEffectAttr, StatusEffect.PARALYSIS)
.attr(StatusEffectAttr, StatusEffect.SLEEP),
new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8)
.attr(StatChangeAttr, BattleStat.DEF, 1, true), .attr(StatChangeAttr, BattleStat.DEF, 1, true),
new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, 100, 0, 8) new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, 100, 0, 8)
@ -6389,8 +6504,7 @@ export function initMoves() {
}), // 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),
.partial(),
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)
.attr(HighCritAttr) .attr(HighCritAttr)
.slicingMove() .slicingMove()
@ -6444,6 +6558,7 @@ export function initMoves() {
new AttackMove(Moves.THUNDERCLAP, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 5, -1, 1, 9) new AttackMove(Moves.THUNDERCLAP, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 5, -1, 1, 9)
.condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()].move.move].category !== MoveCategory.STATUS), .condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()].move.move].category !== MoveCategory.STATUS),
new AttackMove(Moves.MIGHTY_CLEAVE, Type.ROCK, MoveCategory.PHYSICAL, 95, 100, 5, -1, 0, 9) new AttackMove(Moves.MIGHTY_CLEAVE, Type.ROCK, MoveCategory.PHYSICAL, 95, 100, 5, -1, 0, 9)
.slicingMove()
.ignoresProtect(), .ignoresProtect(),
new AttackMove(Moves.TACHYON_CUTTER, Type.STEEL, MoveCategory.SPECIAL, 50, -1, 10, -1, 0, 9) new AttackMove(Moves.TACHYON_CUTTER, Type.STEEL, MoveCategory.SPECIAL, 50, -1, 10, -1, 0, 9)
.attr(MultiHitAttr, MultiHitType._2) .attr(MultiHitAttr, MultiHitType._2)

View File

@ -30,7 +30,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 24, Moves.SWEET_SCENT ], [ 24, Moves.SWEET_SCENT ],
[ 27, Moves.SYNTHESIS ], [ 27, Moves.SYNTHESIS ],
[ 30, Moves.WORRY_SEED ], [ 30, Moves.WORRY_SEED ],
[ 33, Moves.DOUBLE_EDGE ], [ 33, Moves.POWER_WHIP ],
[ 36, Moves.SOLAR_BEAM ], [ 36, Moves.SOLAR_BEAM ],
], ],
[Species.IVYSAUR]: [ [Species.IVYSAUR]: [
@ -47,16 +47,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 30, Moves.SWEET_SCENT ], [ 30, Moves.SWEET_SCENT ],
[ 35, Moves.SYNTHESIS ], [ 35, Moves.SYNTHESIS ],
[ 40, Moves.WORRY_SEED ], [ 40, Moves.WORRY_SEED ],
[ 45, Moves.DOUBLE_EDGE ], [ 45, Moves.POWER_WHIP ],
[ 50, Moves.SOLAR_BEAM ], [ 50, Moves.SOLAR_BEAM ],
], ],
[Species.VENUSAUR]: [ [Species.VENUSAUR]: [
[ 0, Moves.PETAL_BLIZZARD ], [ 0, Moves.PETAL_BLIZZARD ],
[ 1, Moves.GROWTH ],
[ 1, Moves.PETAL_DANCE ],
[ 1, Moves.VINE_WHIP ], [ 1, Moves.VINE_WHIP ],
[ 1, Moves.TACKLE ], [ 1, Moves.TACKLE ],
[ 1, Moves.GROWL ], [ 1, Moves.GROWL ],
[ 1, Moves.GROWTH ],
[ 1, Moves.PETAL_DANCE ],
[ 9, Moves.LEECH_SEED ], [ 9, Moves.LEECH_SEED ],
[ 12, Moves.RAZOR_LEAF ], [ 12, Moves.RAZOR_LEAF ],
[ 15, Moves.POISON_POWDER ], [ 15, Moves.POISON_POWDER ],
@ -66,7 +66,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 30, Moves.SWEET_SCENT ], [ 30, Moves.SWEET_SCENT ],
[ 37, Moves.SYNTHESIS ], [ 37, Moves.SYNTHESIS ],
[ 44, Moves.WORRY_SEED ], [ 44, Moves.WORRY_SEED ],
[ 51, Moves.DOUBLE_EDGE ], [ 51, Moves.POWER_WHIP ],
[ 58, Moves.SOLAR_BEAM ], [ 58, Moves.SOLAR_BEAM ],
], ],
[Species.CHARMANDER]: [ [Species.CHARMANDER]: [
@ -127,7 +127,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 27, Moves.SHELL_SMASH ], [ 27, Moves.SHELL_SMASH ],
[ 30, Moves.IRON_DEFENSE ], [ 30, Moves.IRON_DEFENSE ],
[ 33, Moves.HYDRO_PUMP ], [ 33, Moves.HYDRO_PUMP ],
[ 36, Moves.SKULL_BASH ], [ 36, Moves.WAVE_CRASH ],
], ],
[Species.WARTORTLE]: [ [Species.WARTORTLE]: [
[ 1, Moves.TACKLE ], [ 1, Moves.TACKLE ],
@ -143,7 +143,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 35, Moves.SHELL_SMASH ], [ 35, Moves.SHELL_SMASH ],
[ 40, Moves.IRON_DEFENSE ], [ 40, Moves.IRON_DEFENSE ],
[ 45, Moves.HYDRO_PUMP ], [ 45, Moves.HYDRO_PUMP ],
[ 50, Moves.SKULL_BASH ], [ 50, Moves.WAVE_CRASH ],
], ],
[Species.BLASTOISE]: [ [Species.BLASTOISE]: [
[ 0, Moves.FLASH_CANNON ], [ 0, Moves.FLASH_CANNON ],
@ -160,7 +160,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 35, Moves.SHELL_SMASH ], [ 35, Moves.SHELL_SMASH ],
[ 42, Moves.IRON_DEFENSE ], [ 42, Moves.IRON_DEFENSE ],
[ 49, Moves.HYDRO_PUMP ], [ 49, Moves.HYDRO_PUMP ],
[ 56, Moves.SKULL_BASH ], [ 56, Moves.WAVE_CRASH ],
], ],
[Species.CATERPIE]: [ [Species.CATERPIE]: [
[ 1, Moves.TACKLE ], [ 1, Moves.TACKLE ],
@ -341,9 +341,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 12, Moves.GLARE ], [ 12, Moves.GLARE ],
[ 17, Moves.SCREECH ], [ 17, Moves.SCREECH ],
[ 20, Moves.ACID ], [ 20, Moves.ACID ],
[ 25, Moves.SWALLOW ],
[ 25, Moves.STOCKPILE ], [ 25, Moves.STOCKPILE ],
[ 25, Moves.SPIT_UP ], [ 25, Moves.SPIT_UP ],
[ 25, Moves.SWALLOW ],
[ 28, Moves.ACID_SPRAY ], [ 28, Moves.ACID_SPRAY ],
[ 33, Moves.SLUDGE_BOMB ], [ 33, Moves.SLUDGE_BOMB ],
[ 36, Moves.GASTRO_ACID ], [ 36, Moves.GASTRO_ACID ],
@ -1780,14 +1780,15 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 4, Moves.DOUBLE_KICK ], [ 4, Moves.DOUBLE_KICK ],
[ 8, Moves.LOW_KICK ], [ 8, Moves.LOW_KICK ],
[ 12, Moves.ENDURE ], [ 12, Moves.ENDURE ],
[ 16, Moves.REVENGE ], [ 16, Moves.SUCKER_PUNCH ],
[ 21, Moves.WIDE_GUARD ], [ 21, Moves.WIDE_GUARD ],
[ 24, Moves.BLAZE_KICK ], [ 24, Moves.BLAZE_KICK ],
[ 28, Moves.MIND_READER ], [ 28, Moves.FEINT ],
[ 32, Moves.MEGA_KICK ], [ 32, Moves.MEGA_KICK ],
[ 36, Moves.CLOSE_COMBAT ], [ 36, Moves.CLOSE_COMBAT ],
[ 40, Moves.REVERSAL ], [ 40, Moves.REVERSAL ],
[ 44, Moves.HIGH_JUMP_KICK ], [ 44, Moves.HIGH_JUMP_KICK ],
[ 50, Moves.AXE_KICK ],
], ],
[Species.HITMONCHAN]: [ [Species.HITMONCHAN]: [
[ 0, Moves.DRAIN_PUNCH ], [ 0, Moves.DRAIN_PUNCH ],
@ -1796,16 +1797,14 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 1, Moves.FAKE_OUT ], [ 1, Moves.FAKE_OUT ],
[ 1, Moves.HELPING_HAND ], [ 1, Moves.HELPING_HAND ],
[ 1, Moves.FEINT ], [ 1, Moves.FEINT ],
[ 1, Moves.VACUUM_WAVE ],
[ 1, Moves.BULLET_PUNCH ],
[ 4, Moves.MACH_PUNCH ], [ 4, Moves.MACH_PUNCH ],
[ 8, Moves.POWER_UP_PUNCH ], [ 8, Moves.VACUUM_WAVE ],
[ 12, Moves.DETECT ], [ 12, Moves.DETECT ],
[ 16, Moves.REVENGE ], [ 16, Moves.BULLET_PUNCH ],
[ 21, Moves.QUICK_GUARD ], [ 21, Moves.QUICK_GUARD ],
[ 24, Moves.FIRE_PUNCH ],
[ 24, Moves.ICE_PUNCH ],
[ 24, Moves.THUNDER_PUNCH ], [ 24, Moves.THUNDER_PUNCH ],
[ 24, Moves.ICE_PUNCH ],
[ 24, Moves.FIRE_PUNCH ],
[ 28, Moves.AGILITY ], [ 28, Moves.AGILITY ],
[ 32, Moves.MEGA_PUNCH ], [ 32, Moves.MEGA_PUNCH ],
[ 36, Moves.CLOSE_COMBAT ], [ 36, Moves.CLOSE_COMBAT ],
@ -4278,6 +4277,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 30, Moves.ANCIENT_POWER ], [ 30, Moves.ANCIENT_POWER ],
[ 40, Moves.LIFE_DEW ], [ 40, Moves.LIFE_DEW ],
[ 50, Moves.LEECH_SEED ], [ 50, Moves.LEECH_SEED ],
[ 55, Moves.HEAL_BLOCK ],
[ 60, Moves.RECOVER ], [ 60, Moves.RECOVER ],
[ 70, Moves.FUTURE_SIGHT ], [ 70, Moves.FUTURE_SIGHT ],
[ 80, Moves.HEALING_WISH ], [ 80, Moves.HEALING_WISH ],
@ -4976,6 +4976,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 23, Moves.ABSORB ], [ 23, Moves.ABSORB ],
[ 29, Moves.SHADOW_SNEAK ], [ 29, Moves.SHADOW_SNEAK ],
[ 36, Moves.FURY_SWIPES ], [ 36, Moves.FURY_SWIPES ],
[ 41, Moves.HEAL_BLOCK ],
[ 43, Moves.MIND_READER ], [ 43, Moves.MIND_READER ],
[ 50, Moves.SHADOW_BALL ], [ 50, Moves.SHADOW_BALL ],
[ 57, Moves.SPITE ], [ 57, Moves.SPITE ],
@ -5796,6 +5797,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 20, Moves.PSYSHOCK ], [ 20, Moves.PSYSHOCK ],
[ 25, Moves.COSMIC_POWER ], [ 25, Moves.COSMIC_POWER ],
[ 30, Moves.PSYCHIC ], [ 30, Moves.PSYCHIC ],
[ 33, Moves.HEAL_BLOCK ],
[ 35, Moves.STONE_EDGE ], [ 35, Moves.STONE_EDGE ],
[ 40, Moves.FUTURE_SIGHT ], [ 40, Moves.FUTURE_SIGHT ],
[ 45, Moves.MAGIC_ROOM ], [ 45, Moves.MAGIC_ROOM ],
@ -5814,6 +5816,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 20, Moves.ZEN_HEADBUTT ], [ 20, Moves.ZEN_HEADBUTT ],
[ 25, Moves.COSMIC_POWER ], [ 25, Moves.COSMIC_POWER ],
[ 30, Moves.PSYCHIC ], [ 30, Moves.PSYCHIC ],
[ 33, Moves.HEAL_BLOCK ],
[ 35, Moves.STONE_EDGE ], [ 35, Moves.STONE_EDGE ],
[ 40, Moves.SOLAR_BEAM ], [ 40, Moves.SOLAR_BEAM ],
[ 45, Moves.WONDER_ROOM ], [ 45, Moves.WONDER_ROOM ],
@ -5890,6 +5893,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 3, Moves.RAPID_SPIN ], [ 3, Moves.RAPID_SPIN ],
[ 6, Moves.CONFUSION ], [ 6, Moves.CONFUSION ],
[ 9, Moves.ROCK_TOMB ], [ 9, Moves.ROCK_TOMB ],
[ 10, Moves.HEAL_BLOCK ],
[ 12, Moves.POWER_TRICK ], [ 12, Moves.POWER_TRICK ],
[ 15, Moves.PSYBEAM ], [ 15, Moves.PSYBEAM ],
[ 18, Moves.ANCIENT_POWER ], [ 18, Moves.ANCIENT_POWER ],
@ -5911,6 +5915,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 1, Moves.MUD_SLAP ], [ 1, Moves.MUD_SLAP ],
[ 1, Moves.RAPID_SPIN ], [ 1, Moves.RAPID_SPIN ],
[ 9, Moves.ROCK_TOMB ], [ 9, Moves.ROCK_TOMB ],
[ 10, Moves.HEAL_BLOCK ],
[ 12, Moves.POWER_TRICK ], [ 12, Moves.POWER_TRICK ],
[ 15, Moves.PSYBEAM ], [ 15, Moves.PSYBEAM ],
[ 18, Moves.ANCIENT_POWER ], [ 18, Moves.ANCIENT_POWER ],
@ -6506,6 +6511,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.LATIOS]: [ [Species.LATIOS]: [
[ 1, Moves.DRAGON_DANCE ], [ 1, Moves.DRAGON_DANCE ],
[ 1, Moves.STORED_POWER ], [ 1, Moves.STORED_POWER ],
[ 1, Moves.HEAL_BLOCK ],
[ 5, Moves.HELPING_HAND ], [ 5, Moves.HELPING_HAND ],
[ 10, Moves.RECOVER ], [ 10, Moves.RECOVER ],
[ 15, Moves.CONFUSION ], [ 15, Moves.CONFUSION ],
@ -7364,6 +7370,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 36, Moves.IRON_DEFENSE ], [ 36, Moves.IRON_DEFENSE ],
[ 40, Moves.METAL_SOUND ], [ 40, Moves.METAL_SOUND ],
[ 44, Moves.FUTURE_SIGHT ], [ 44, Moves.FUTURE_SIGHT ],
[ 45, Moves.HEAL_BLOCK ],
], ],
[Species.BRONZONG]: [ [Species.BRONZONG]: [
[ 0, Moves.BLOCK ], [ 0, Moves.BLOCK ],
@ -7382,6 +7389,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 38, Moves.IRON_DEFENSE ], [ 38, Moves.IRON_DEFENSE ],
[ 44, Moves.METAL_SOUND ], [ 44, Moves.METAL_SOUND ],
[ 50, Moves.FUTURE_SIGHT ], [ 50, Moves.FUTURE_SIGHT ],
[ 52, Moves.HEAL_BLOCK ],
[ 56, Moves.RAIN_DANCE ], [ 56, Moves.RAIN_DANCE ],
], ],
[Species.BONSLY]: [ [Species.BONSLY]: [
@ -9491,6 +9499,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.YAMASK]: [ [Species.YAMASK]: [
[ 1, Moves.PROTECT ], [ 1, Moves.PROTECT ],
[ 1, Moves.ASTONISH ], [ 1, Moves.ASTONISH ],
[ 1, Moves.HEAL_BLOCK ],
[ 4, Moves.HAZE ], [ 4, Moves.HAZE ],
[ 8, Moves.NIGHT_SHADE ], [ 8, Moves.NIGHT_SHADE ],
[ 12, Moves.DISABLE ], [ 12, Moves.DISABLE ],
@ -9513,6 +9522,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 1, Moves.PROTECT ], [ 1, Moves.PROTECT ],
[ 1, Moves.SCARY_FACE ], [ 1, Moves.SCARY_FACE ],
[ 1, Moves.ASTONISH ], [ 1, Moves.ASTONISH ],
[ 1, Moves.HEAL_BLOCK ],
[ 12, Moves.DISABLE ], [ 12, Moves.DISABLE ],
[ 16, Moves.WILL_O_WISP ], [ 16, Moves.WILL_O_WISP ],
[ 20, Moves.CRAFTY_SHIELD ], [ 20, Moves.CRAFTY_SHIELD ],
@ -9720,6 +9730,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 24, Moves.HYPNOSIS ], [ 24, Moves.HYPNOSIS ],
[ 28, Moves.FAKE_TEARS ], [ 28, Moves.FAKE_TEARS ],
[ 33, Moves.PSYCH_UP ], [ 33, Moves.PSYCH_UP ],
[ 34, Moves.HEAL_BLOCK ],
[ 36, Moves.PSYCHIC ], [ 36, Moves.PSYCHIC ],
[ 40, Moves.FLATTER ], [ 40, Moves.FLATTER ],
[ 44, Moves.FUTURE_SIGHT ], [ 44, Moves.FUTURE_SIGHT ],
@ -9735,6 +9746,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 20, Moves.PSYSHOCK ], [ 20, Moves.PSYSHOCK ],
[ 24, Moves.HYPNOSIS ], [ 24, Moves.HYPNOSIS ],
[ 28, Moves.FAKE_TEARS ], [ 28, Moves.FAKE_TEARS ],
[ 34, Moves.HEAL_BLOCK ],
[ 35, Moves.PSYCH_UP ], [ 35, Moves.PSYCH_UP ],
[ 46, Moves.FLATTER ], [ 46, Moves.FLATTER ],
[ 52, Moves.FUTURE_SIGHT ], [ 52, Moves.FUTURE_SIGHT ],
@ -9750,6 +9762,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 20, Moves.PSYSHOCK ], [ 20, Moves.PSYSHOCK ],
[ 24, Moves.HYPNOSIS ], [ 24, Moves.HYPNOSIS ],
[ 28, Moves.FAKE_TEARS ], [ 28, Moves.FAKE_TEARS ],
[ 34, Moves.HEAL_BLOCK ],
[ 35, Moves.PSYCH_UP ], [ 35, Moves.PSYCH_UP ],
[ 40, Moves.PSYCHIC ], [ 40, Moves.PSYCHIC ],
[ 48, Moves.FLATTER ], [ 48, Moves.FLATTER ],
@ -9771,6 +9784,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 36, Moves.PSYCHIC ], [ 36, Moves.PSYCHIC ],
[ 40, Moves.SKILL_SWAP ], [ 40, Moves.SKILL_SWAP ],
[ 44, Moves.FUTURE_SIGHT ], [ 44, Moves.FUTURE_SIGHT ],
[ 46, Moves.HEAL_BLOCK ],
[ 48, Moves.WONDER_ROOM ], [ 48, Moves.WONDER_ROOM ],
], ],
[Species.DUOSION]: [ [Species.DUOSION]: [
@ -9787,6 +9801,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 35, Moves.PAIN_SPLIT ], [ 35, Moves.PAIN_SPLIT ],
[ 40, Moves.PSYCHIC ], [ 40, Moves.PSYCHIC ],
[ 46, Moves.SKILL_SWAP ], [ 46, Moves.SKILL_SWAP ],
[ 50, Moves.HEAL_BLOCK ],
[ 52, Moves.FUTURE_SIGHT ], [ 52, Moves.FUTURE_SIGHT ],
[ 58, Moves.WONDER_ROOM ], [ 58, Moves.WONDER_ROOM ],
], ],
@ -9805,6 +9820,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 35, Moves.PAIN_SPLIT ], [ 35, Moves.PAIN_SPLIT ],
[ 40, Moves.PSYCHIC ], [ 40, Moves.PSYCHIC ],
[ 48, Moves.SKILL_SWAP ], [ 48, Moves.SKILL_SWAP ],
[ 54, Moves.HEAL_BLOCK ],
[ 56, Moves.FUTURE_SIGHT ], [ 56, Moves.FUTURE_SIGHT ],
[ 64, Moves.WONDER_ROOM ], [ 64, Moves.WONDER_ROOM ],
], ],
@ -10209,6 +10225,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 1, Moves.GROWL ], [ 1, Moves.GROWL ],
[ 1, Moves.CONFUSION ], [ 1, Moves.CONFUSION ],
[ 6, Moves.IMPRISON ], [ 6, Moves.IMPRISON ],
[ 8, Moves.HEAL_BLOCK ],
[ 12, Moves.TELEPORT ], [ 12, Moves.TELEPORT ],
[ 18, Moves.PSYBEAM ], [ 18, Moves.PSYBEAM ],
[ 24, Moves.GUARD_SPLIT ], [ 24, Moves.GUARD_SPLIT ],
@ -10226,6 +10243,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 1, Moves.TELEPORT ], [ 1, Moves.TELEPORT ],
[ 1, Moves.IMPRISON ], [ 1, Moves.IMPRISON ],
[ 1, Moves.PSYCHIC_TERRAIN ], [ 1, Moves.PSYCHIC_TERRAIN ],
[ 8, Moves.HEAL_BLOCK ],
[ 18, Moves.PSYBEAM ], [ 18, Moves.PSYBEAM ],
[ 24, Moves.GUARD_SPLIT ], [ 24, Moves.GUARD_SPLIT ],
[ 24, Moves.POWER_SPLIT ], [ 24, Moves.POWER_SPLIT ],
@ -10884,6 +10902,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 20, Moves.SHOCK_WAVE ], [ 20, Moves.SHOCK_WAVE ],
[ 25, Moves.AGILITY ], [ 25, Moves.AGILITY ],
[ 30, Moves.CHARGE ], [ 30, Moves.CHARGE ],
[ 31, Moves.HEAL_BLOCK ],
[ 35, Moves.VOLT_SWITCH ], [ 35, Moves.VOLT_SWITCH ],
[ 40, Moves.CRUNCH ], [ 40, Moves.CRUNCH ],
[ 45, Moves.DISCHARGE ], [ 45, Moves.DISCHARGE ],
@ -11972,6 +11991,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 40, Moves.PLAY_ROUGH ], [ 40, Moves.PLAY_ROUGH ],
[ 44, Moves.MAGIC_ROOM ], [ 44, Moves.MAGIC_ROOM ],
[ 48, Moves.FOUL_PLAY ], [ 48, Moves.FOUL_PLAY ],
[ 50, Moves.HEAL_BLOCK ],
[ 52, Moves.LAST_RESORT ], [ 52, Moves.LAST_RESORT ],
], ],
[Species.PHANTUMP]: [ [Species.PHANTUMP]: [
@ -13045,6 +13065,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 45, Moves.IRON_HEAD ], [ 45, Moves.IRON_HEAD ],
[ 50, Moves.TAKE_DOWN ], [ 50, Moves.TAKE_DOWN ],
[ 55, Moves.DOUBLE_EDGE ], [ 55, Moves.DOUBLE_EDGE ],
[ 60, Moves.HEAL_BLOCK ],
], ],
[Species.SILVALLY]: [ [Species.SILVALLY]: [
[ 0, Moves.MULTI_ATTACK ], [ 0, Moves.MULTI_ATTACK ],
@ -13059,6 +13080,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 1, Moves.ICE_FANG ], [ 1, Moves.ICE_FANG ],
[ 1, Moves.FIRE_FANG ], [ 1, Moves.FIRE_FANG ],
[ 1, Moves.IRON_HEAD ], [ 1, Moves.IRON_HEAD ],
[ 1, Moves.HEAL_BLOCK ],
[ 15, Moves.DOUBLE_HIT ], [ 15, Moves.DOUBLE_HIT ],
[ 20, Moves.METAL_SOUND ], [ 20, Moves.METAL_SOUND ],
[ 25, Moves.CRUSH_CLAW ], [ 25, Moves.CRUSH_CLAW ],

View File

@ -138,9 +138,9 @@ export abstract class PokemonSpeciesForm {
this.genderDiffs = genderDiffs; this.genderDiffs = genderDiffs;
} }
getRootSpeciesId(): Species { getRootSpeciesId(forStarter: boolean = false): Species {
let ret = this.speciesId; let ret = this.speciesId;
while (pokemonPrevolutions.hasOwnProperty(ret)) while (pokemonPrevolutions.hasOwnProperty(ret) && (!forStarter || !speciesStarters.hasOwnProperty(ret)))
ret = pokemonPrevolutions[ret]; ret = pokemonPrevolutions[ret];
return ret; return ret;
} }
@ -367,8 +367,8 @@ export abstract class PokemonSpeciesForm {
loadAssets(scene: BattleScene, female: boolean, formIndex?: integer, shiny?: boolean, variant?: Variant, startLoad?: boolean): Promise<void> { loadAssets(scene: BattleScene, female: boolean, formIndex?: integer, shiny?: boolean, variant?: Variant, startLoad?: boolean): Promise<void> {
return new Promise(resolve => { return new Promise(resolve => {
const spriteKey = this.getSpriteKey(female, formIndex, shiny, variant); const spriteKey = this.getSpriteKey(female, formIndex, shiny, variant);
scene.load.audio(this.getCryKey(formIndex), `audio/cry/${this.getCryKey(formIndex)}.m4a`);
scene.loadPokemonAtlas(spriteKey, this.getSpriteAtlasPath(female, formIndex, shiny, variant)); scene.loadPokemonAtlas(spriteKey, this.getSpriteAtlasPath(female, formIndex, shiny, variant));
scene.load.audio(this.getCryKey(formIndex), `audio/cry/${this.getCryKey(formIndex)}.m4a`);
scene.load.once(Phaser.Loader.Events.COMPLETE, () => { scene.load.once(Phaser.Loader.Events.COMPLETE, () => {
const originalWarn = console.warn; const originalWarn = console.warn;
// Ignore warnings for missing frames, because there will be a lot // Ignore warnings for missing frames, because there will be a lot
@ -3156,6 +3156,30 @@ export const noStarterFormKeys: string[] = [
SpeciesFormKey.ETERNAMAX SpeciesFormKey.ETERNAMAX
].map(k => k.toString()); ].map(k => k.toString());
export function getStarterValueFriendshipCap(value: integer): integer {
switch (value) {
case 1:
return 20;
case 2:
return 40;
case 3:
return 60;
case 4:
return 100;
case 5:
return 140;
case 6:
return 200;
case 7:
return 280;
case 8:
case 9:
return 450;
default:
return 600;
}
}
export const starterPassiveAbilities = { export const starterPassiveAbilities = {
[Species.BULBASAUR]: Abilities.SOLAR_POWER, [Species.BULBASAUR]: Abilities.SOLAR_POWER,
[Species.CHARMANDER]: Abilities.INTIMIDATE, [Species.CHARMANDER]: Abilities.INTIMIDATE,
@ -3185,7 +3209,7 @@ export const starterPassiveAbilities = {
[Species.BELLSPROUT]: Abilities.CORROSION, [Species.BELLSPROUT]: Abilities.CORROSION,
[Species.TENTACOOL]: Abilities.INNARDS_OUT, [Species.TENTACOOL]: Abilities.INNARDS_OUT,
[Species.GEODUDE]: Abilities.ROCKY_PAYLOAD, [Species.GEODUDE]: Abilities.ROCKY_PAYLOAD,
[Species.PONYTA]: Abilities.PIXILATE, [Species.PONYTA]: Abilities.MAGIC_GUARD,
[Species.SLOWPOKE]: Abilities.UNAWARE, [Species.SLOWPOKE]: Abilities.UNAWARE,
[Species.MAGNEMITE]: Abilities.MOTOR_DRIVE, [Species.MAGNEMITE]: Abilities.MOTOR_DRIVE,
[Species.FARFETCHD]: Abilities.PURE_POWER, [Species.FARFETCHD]: Abilities.PURE_POWER,
@ -3211,7 +3235,7 @@ export const starterPassiveAbilities = {
[Species.SCYTHER]: Abilities.SPEED_BOOST, [Species.SCYTHER]: Abilities.SPEED_BOOST,
[Species.PINSIR]: Abilities.SAP_SIPPER, [Species.PINSIR]: Abilities.SAP_SIPPER,
[Species.TAUROS]: Abilities.ROCK_HEAD, [Species.TAUROS]: Abilities.ROCK_HEAD,
[Species.MAGIKARP]: Abilities.BERSERK, [Species.MAGIKARP]: Abilities.MULTISCALE,
[Species.LAPRAS]: Abilities.LIQUID_VOICE, [Species.LAPRAS]: Abilities.LIQUID_VOICE,
[Species.DITTO]: Abilities.GOOEY, [Species.DITTO]: Abilities.GOOEY,
[Species.EEVEE]: Abilities.PROTEAN, [Species.EEVEE]: Abilities.PROTEAN,
@ -3225,16 +3249,16 @@ export const starterPassiveAbilities = {
[Species.DRATINI]: Abilities.DELTA_STREAM, [Species.DRATINI]: Abilities.DELTA_STREAM,
[Species.MEWTWO]: Abilities.NEUROFORCE, [Species.MEWTWO]: Abilities.NEUROFORCE,
[Species.MEW]: Abilities.PROTEAN, [Species.MEW]: Abilities.PROTEAN,
[Species.CHIKORITA]: Abilities.RIPEN, [Species.CHIKORITA]: Abilities.THICK_FAT,
[Species.CYNDAQUIL]: Abilities.TURBOBLAZE, [Species.CYNDAQUIL]: Abilities.TURBOBLAZE,
[Species.TOTODILE]: Abilities.TOUGH_CLAWS, [Species.TOTODILE]: Abilities.TOUGH_CLAWS,
[Species.SENTRET]: Abilities.FLUFFY, [Species.SENTRET]: Abilities.FLUFFY,
[Species.HOOTHOOT]: Abilities.CURSED_BODY, [Species.HOOTHOOT]: Abilities.CURSED_BODY,
[Species.LEDYBA]: Abilities.SCREEN_CLEANER, [Species.LEDYBA]: Abilities.PRANKSTER,
[Species.SPINARAK]: Abilities.PRANKSTER, [Species.SPINARAK]: Abilities.PRANKSTER,
[Species.CHINCHOU]: Abilities.REGENERATOR, [Species.CHINCHOU]: Abilities.REGENERATOR,
[Species.PICHU]: Abilities.TRANSISTOR, [Species.PICHU]: Abilities.TRANSISTOR,
[Species.CLEFFA]: Abilities.MISTY_SURGE, [Species.CLEFFA]: Abilities.MAGIC_BOUNCE,
[Species.IGGLYBUFF]: Abilities.SERENE_GRACE, [Species.IGGLYBUFF]: Abilities.SERENE_GRACE,
[Species.TOGEPI]: Abilities.OPPORTUNIST, [Species.TOGEPI]: Abilities.OPPORTUNIST,
[Species.NATU]: Abilities.TINTED_LENS, [Species.NATU]: Abilities.TINTED_LENS,
@ -3252,7 +3276,7 @@ export const starterPassiveAbilities = {
[Species.DUNSPARCE]: Abilities.MARVEL_SCALE, [Species.DUNSPARCE]: Abilities.MARVEL_SCALE,
[Species.GLIGAR]: Abilities.MERCILESS, [Species.GLIGAR]: Abilities.MERCILESS,
[Species.SNUBBULL]: Abilities.BALL_FETCH, [Species.SNUBBULL]: Abilities.BALL_FETCH,
[Species.QWILFISH]: Abilities.LIQUID_OOZE, [Species.QWILFISH]: Abilities.TOXIC_DEBRIS,
[Species.SHUCKLE]: Abilities.WELL_BAKED_BODY, [Species.SHUCKLE]: Abilities.WELL_BAKED_BODY,
[Species.HERACROSS]: Abilities.QUICK_FEET, [Species.HERACROSS]: Abilities.QUICK_FEET,
[Species.SNEASEL]: Abilities.MOXIE, [Species.SNEASEL]: Abilities.MOXIE,
@ -3268,7 +3292,7 @@ export const starterPassiveAbilities = {
[Species.STANTLER]: Abilities.MAGIC_GUARD, [Species.STANTLER]: Abilities.MAGIC_GUARD,
[Species.SMEARGLE]: Abilities.QUICK_DRAW, [Species.SMEARGLE]: Abilities.QUICK_DRAW,
[Species.TYROGUE]: Abilities.STAMINA, [Species.TYROGUE]: Abilities.STAMINA,
[Species.SMOOCHUM]: Abilities.CUTE_CHARM, [Species.SMOOCHUM]: Abilities.DAZZLING,
[Species.ELEKID]: Abilities.IRON_FIST, [Species.ELEKID]: Abilities.IRON_FIST,
[Species.MAGBY]: Abilities.CONTRARY, [Species.MAGBY]: Abilities.CONTRARY,
[Species.MILTANK]: Abilities.GLUTTONY, [Species.MILTANK]: Abilities.GLUTTONY,
@ -3276,10 +3300,10 @@ export const starterPassiveAbilities = {
[Species.ENTEI]: Abilities.MOXIE, [Species.ENTEI]: Abilities.MOXIE,
[Species.SUICUNE]: Abilities.UNAWARE, [Species.SUICUNE]: Abilities.UNAWARE,
[Species.LARVITAR]: Abilities.SAND_FORCE, [Species.LARVITAR]: Abilities.SAND_FORCE,
[Species.LUGIA]: Abilities.STORM_DRAIN, [Species.LUGIA]: Abilities.DELTA_STREAM,
[Species.HO_OH]: Abilities.MAGIC_GUARD, [Species.HO_OH]: Abilities.MAGIC_GUARD,
[Species.CELEBI]: Abilities.GRASSY_SURGE, [Species.CELEBI]: Abilities.GRASSY_SURGE,
[Species.TREECKO]: Abilities.GRASSY_SURGE, [Species.TREECKO]: Abilities.TINTED_LENS,
[Species.TORCHIC]: Abilities.RECKLESS, [Species.TORCHIC]: Abilities.RECKLESS,
[Species.MUDKIP]: Abilities.REGENERATOR, [Species.MUDKIP]: Abilities.REGENERATOR,
[Species.POOCHYENA]: Abilities.STRONG_JAW, [Species.POOCHYENA]: Abilities.STRONG_JAW,
@ -3296,7 +3320,7 @@ export const starterPassiveAbilities = {
[Species.NINCADA]: Abilities.OVERCOAT, [Species.NINCADA]: Abilities.OVERCOAT,
[Species.WHISMUR]: Abilities.PUNK_ROCK, [Species.WHISMUR]: Abilities.PUNK_ROCK,
[Species.MAKUHITA]: Abilities.STAMINA, [Species.MAKUHITA]: Abilities.STAMINA,
[Species.AZURILL]: Abilities.UNNERVE, [Species.AZURILL]: Abilities.MISTY_SURGE,
[Species.NOSEPASS]: Abilities.LEVITATE, [Species.NOSEPASS]: Abilities.LEVITATE,
[Species.SKITTY]: Abilities.SCRAPPY, [Species.SKITTY]: Abilities.SCRAPPY,
[Species.SABLEYE]: Abilities.UNNERVE, [Species.SABLEYE]: Abilities.UNNERVE,
@ -3327,7 +3351,7 @@ export const starterPassiveAbilities = {
[Species.BALTOY]: Abilities.OWN_TEMPO, [Species.BALTOY]: Abilities.OWN_TEMPO,
[Species.LILEEP]: Abilities.WATER_ABSORB, [Species.LILEEP]: Abilities.WATER_ABSORB,
[Species.ANORITH]: Abilities.WATER_ABSORB, [Species.ANORITH]: Abilities.WATER_ABSORB,
[Species.FEEBAS]: Abilities.PASTEL_VEIL, [Species.FEEBAS]: Abilities.MAGIC_GUARD,
[Species.CASTFORM]: Abilities.ADAPTABILITY, [Species.CASTFORM]: Abilities.ADAPTABILITY,
[Species.KECLEON]: Abilities.ADAPTABILITY, [Species.KECLEON]: Abilities.ADAPTABILITY,
[Species.SHUPPET]: Abilities.MUMMY, [Species.SHUPPET]: Abilities.MUMMY,
@ -3342,13 +3366,13 @@ export const starterPassiveAbilities = {
[Species.LUVDISC]: Abilities.PICKUP, [Species.LUVDISC]: Abilities.PICKUP,
[Species.BAGON]: Abilities.GALE_WINGS, [Species.BAGON]: Abilities.GALE_WINGS,
[Species.BELDUM]: Abilities.IRON_FIST, [Species.BELDUM]: Abilities.IRON_FIST,
[Species.REGIROCK]: Abilities.REGENERATOR, [Species.REGIROCK]: Abilities.SAND_STREAM,
[Species.REGICE]: Abilities.ICE_SCALES, [Species.REGICE]: Abilities.SNOW_WARNING,
[Species.REGISTEEL]: Abilities.STEELY_SPIRIT, [Species.REGISTEEL]: Abilities.FILTER,
[Species.LATIAS]: Abilities.SERENE_GRACE, [Species.LATIAS]: Abilities.SOUL_HEART,
[Species.LATIOS]: Abilities.SERENE_GRACE, [Species.LATIOS]: Abilities.TINTED_LENS,
[Species.KYOGRE]: Abilities.HYDRATION, [Species.KYOGRE]: Abilities.HYDRATION,
[Species.GROUDON]: Abilities.EARTH_EATER, [Species.GROUDON]: Abilities.PROTOSYNTHESIS,
[Species.RAYQUAZA]: Abilities.UNNERVE, [Species.RAYQUAZA]: Abilities.UNNERVE,
[Species.JIRACHI]: Abilities.COMATOSE, [Species.JIRACHI]: Abilities.COMATOSE,
[Species.DEOXYS]: Abilities.PROTEAN, [Species.DEOXYS]: Abilities.PROTEAN,
@ -3390,16 +3414,16 @@ export const starterPassiveAbilities = {
[Species.MANTYKE]: Abilities.STORM_DRAIN, [Species.MANTYKE]: Abilities.STORM_DRAIN,
[Species.SNOVER]: Abilities.SNOW_CLOAK, [Species.SNOVER]: Abilities.SNOW_CLOAK,
[Species.ROTOM]: Abilities.HADRON_ENGINE, [Species.ROTOM]: Abilities.HADRON_ENGINE,
[Species.UXIE]: Abilities.ILLUSION, [Species.UXIE]: Abilities.UNAWARE,
[Species.MESPRIT]: Abilities.MOODY, [Species.MESPRIT]: Abilities.MOODY,
[Species.AZELF]: Abilities.NEUROFORCE, [Species.AZELF]: Abilities.NEUROFORCE,
[Species.DIALGA]: Abilities.SPEED_BOOST, [Species.DIALGA]: Abilities.SPEED_BOOST,
[Species.PALKIA]: Abilities.MAGIC_BOUNCE, [Species.PALKIA]: Abilities.MULTISCALE,
[Species.HEATRAN]: Abilities.ROUGH_SKIN, [Species.HEATRAN]: Abilities.FILTER,
[Species.REGIGIGAS]: Abilities.MINDS_EYE, [Species.REGIGIGAS]: Abilities.MINDS_EYE,
[Species.GIRATINA]: Abilities.SHADOW_TAG, [Species.GIRATINA]: Abilities.SHADOW_SHIELD,
[Species.CRESSELIA]: Abilities.MAGIC_BOUNCE, [Species.CRESSELIA]: Abilities.MAGIC_BOUNCE,
[Species.PHIONE]: Abilities.SWIFT_SWIM, [Species.PHIONE]: Abilities.SIMPLE,
[Species.MANAPHY]: Abilities.SIMPLE, [Species.MANAPHY]: Abilities.SIMPLE,
[Species.DARKRAI]: Abilities.UNNERVE, [Species.DARKRAI]: Abilities.UNNERVE,
[Species.SHAYMIN]: Abilities.FLOWER_VEIL, [Species.SHAYMIN]: Abilities.FLOWER_VEIL,
@ -3407,7 +3431,7 @@ export const starterPassiveAbilities = {
[Species.VICTINI]: Abilities.SUPER_LUCK, [Species.VICTINI]: Abilities.SUPER_LUCK,
[Species.SNIVY]: Abilities.MULTISCALE, [Species.SNIVY]: Abilities.MULTISCALE,
[Species.TEPIG]: Abilities.ROCK_HEAD, [Species.TEPIG]: Abilities.ROCK_HEAD,
[Species.OSHAWOTT]: Abilities.MOLD_BREAKER, [Species.OSHAWOTT]: Abilities.QUICK_DRAW,
[Species.PATRAT]: Abilities.STAKEOUT, [Species.PATRAT]: Abilities.STAKEOUT,
[Species.LILLIPUP]: Abilities.BALL_FETCH, [Species.LILLIPUP]: Abilities.BALL_FETCH,
[Species.PURRLOIN]: Abilities.DEFIANT, [Species.PURRLOIN]: Abilities.DEFIANT,
@ -3420,14 +3444,14 @@ export const starterPassiveAbilities = {
[Species.ROGGENROLA]: Abilities.SOLID_ROCK, [Species.ROGGENROLA]: Abilities.SOLID_ROCK,
[Species.WOOBAT]: Abilities.SOUL_HEART, [Species.WOOBAT]: Abilities.SOUL_HEART,
[Species.DRILBUR]: Abilities.SAND_STREAM, [Species.DRILBUR]: Abilities.SAND_STREAM,
[Species.AUDINO]: Abilities.SERENE_GRACE, [Species.AUDINO]: Abilities.FRIEND_GUARD,
[Species.TIMBURR]: Abilities.STAMINA, [Species.TIMBURR]: Abilities.STAMINA,
[Species.TYMPOLE]: Abilities.MOODY, [Species.TYMPOLE]: Abilities.MOODY,
[Species.THROH]: Abilities.SIMPLE, [Species.THROH]: Abilities.SIMPLE,
[Species.SAWK]: Abilities.DEFIANT, [Species.SAWK]: Abilities.DEFIANT,
[Species.SEWADDLE]: Abilities.SHARPNESS, [Species.SEWADDLE]: Abilities.SHARPNESS,
[Species.VENIPEDE]: Abilities.INTIMIDATE, [Species.VENIPEDE]: Abilities.INTIMIDATE,
[Species.COTTONEE]: Abilities.MISTY_SURGE, [Species.COTTONEE]: Abilities.FLUFFY,
[Species.PETILIL]: Abilities.DANCER, [Species.PETILIL]: Abilities.DANCER,
[Species.BASCULIN]: Abilities.OPPORTUNIST, [Species.BASCULIN]: Abilities.OPPORTUNIST,
[Species.SANDILE]: Abilities.STRONG_JAW, [Species.SANDILE]: Abilities.STRONG_JAW,
@ -3436,7 +3460,7 @@ export const starterPassiveAbilities = {
[Species.DWEBBLE]: Abilities.STAMINA, [Species.DWEBBLE]: Abilities.STAMINA,
[Species.SCRAGGY]: Abilities.ROCK_HEAD, [Species.SCRAGGY]: Abilities.ROCK_HEAD,
[Species.SIGILYPH]: Abilities.MAGICIAN, [Species.SIGILYPH]: Abilities.MAGICIAN,
[Species.YAMASK]: Abilities.GOOD_AS_GOLD, [Species.YAMASK]: Abilities.PURIFYING_SALT,
[Species.TIRTOUGA]: Abilities.SHELL_ARMOR, [Species.TIRTOUGA]: Abilities.SHELL_ARMOR,
[Species.ARCHEN]: Abilities.ROCKY_PAYLOAD, [Species.ARCHEN]: Abilities.ROCKY_PAYLOAD,
[Species.TRUBBISH]: Abilities.GOOEY, [Species.TRUBBISH]: Abilities.GOOEY,
@ -3476,16 +3500,16 @@ export const starterPassiveAbilities = {
[Species.LARVESTA]: Abilities.DROUGHT, [Species.LARVESTA]: Abilities.DROUGHT,
[Species.COBALION]: Abilities.INTREPID_SWORD, [Species.COBALION]: Abilities.INTREPID_SWORD,
[Species.TERRAKION]: Abilities.ROCKY_PAYLOAD, [Species.TERRAKION]: Abilities.ROCKY_PAYLOAD,
[Species.VIRIZION]: Abilities.SYMBIOSIS, [Species.VIRIZION]: Abilities.SHARPNESS,
[Species.TORNADUS]: Abilities.DELTA_STREAM, [Species.TORNADUS]: Abilities.DRIZZLE,
[Species.THUNDURUS]: Abilities.DRIZZLE, [Species.THUNDURUS]: Abilities.DRIZZLE,
[Species.RESHIRAM]: Abilities.ORICHALCUM_PULSE, [Species.RESHIRAM]: Abilities.ORICHALCUM_PULSE,
[Species.ZEKROM]: Abilities.HADRON_ENGINE, [Species.ZEKROM]: Abilities.HADRON_ENGINE,
[Species.LANDORUS]: Abilities.PRANKSTER, [Species.LANDORUS]: Abilities.STORM_DRAIN,
[Species.KYUREM]: Abilities.SNOW_WARNING, [Species.KYUREM]: Abilities.SNOW_WARNING,
[Species.KELDEO]: Abilities.SHARPNESS, [Species.KELDEO]: Abilities.GRIM_NEIGH,
[Species.MELOETTA]: Abilities.PUNK_ROCK, [Species.MELOETTA]: Abilities.MINDS_EYE,
[Species.GENESECT]: Abilities.MEGA_LAUNCHER, [Species.GENESECT]: Abilities.REGENERATOR,
[Species.CHESPIN]: Abilities.IRON_BARBS, [Species.CHESPIN]: Abilities.IRON_BARBS,
[Species.FENNEKIN]: Abilities.MAGIC_BOUNCE, [Species.FENNEKIN]: Abilities.MAGIC_BOUNCE,
[Species.FROAKIE]: Abilities.ADAPTABILITY, [Species.FROAKIE]: Abilities.ADAPTABILITY,
@ -3497,7 +3521,7 @@ export const starterPassiveAbilities = {
[Species.SKIDDO]: Abilities.GRASSY_SURGE, [Species.SKIDDO]: Abilities.GRASSY_SURGE,
[Species.PANCHAM]: Abilities.FLUFFY, [Species.PANCHAM]: Abilities.FLUFFY,
[Species.FURFROU]: Abilities.BALL_FETCH, [Species.FURFROU]: Abilities.BALL_FETCH,
[Species.ESPURR]: Abilities.PSYCHIC_SURGE, [Species.ESPURR]: Abilities.FUR_COAT,
[Species.HONEDGE]: Abilities.SHARPNESS, [Species.HONEDGE]: Abilities.SHARPNESS,
[Species.SPRITZEE]: Abilities.MISTY_SURGE, [Species.SPRITZEE]: Abilities.MISTY_SURGE,
[Species.SWIRLIX]: Abilities.WELL_BAKED_BODY, [Species.SWIRLIX]: Abilities.WELL_BAKED_BODY,
@ -3517,14 +3541,14 @@ export const starterPassiveAbilities = {
[Species.PUMPKABOO]: Abilities.FLASH_FIRE, [Species.PUMPKABOO]: Abilities.FLASH_FIRE,
[Species.BERGMITE]: Abilities.MIRROR_ARMOR, [Species.BERGMITE]: Abilities.MIRROR_ARMOR,
[Species.NOIBAT]: Abilities.PUNK_ROCK, [Species.NOIBAT]: Abilities.PUNK_ROCK,
[Species.XERNEAS]: Abilities.COMPETITIVE, [Species.XERNEAS]: Abilities.MISTY_SURGE,
[Species.YVELTAL]: Abilities.DEFIANT, [Species.YVELTAL]: Abilities.SOUL_HEART,
[Species.ZYGARDE]: Abilities.REGENERATOR, [Species.ZYGARDE]: Abilities.HUGE_POWER,
[Species.DIANCIE]: Abilities.QUEENLY_MAJESTY, [Species.DIANCIE]: Abilities.LEVITATE,
[Species.HOOPA]: Abilities.TRACE, [Species.HOOPA]: Abilities.OPPORTUNIST,
[Species.VOLCANION]: Abilities.FILTER, [Species.VOLCANION]: Abilities.FILTER,
[Species.ROWLET]: Abilities.SNIPER, [Species.ROWLET]: Abilities.SNIPER,
[Species.LITTEN]: Abilities.PRANKSTER, [Species.LITTEN]: Abilities.FLAME_BODY,
[Species.POPPLIO]: Abilities.PUNK_ROCK, [Species.POPPLIO]: Abilities.PUNK_ROCK,
[Species.PIKIPEK]: Abilities.ANGER_POINT, [Species.PIKIPEK]: Abilities.ANGER_POINT,
[Species.YUNGOOS]: Abilities.HUGE_POWER, [Species.YUNGOOS]: Abilities.HUGE_POWER,
@ -3553,39 +3577,39 @@ export const starterPassiveAbilities = {
[Species.KOMALA]: Abilities.GUTS, [Species.KOMALA]: Abilities.GUTS,
[Species.TURTONATOR]: Abilities.ANGER_SHELL, [Species.TURTONATOR]: Abilities.ANGER_SHELL,
[Species.TOGEDEMARU]: Abilities.STATIC, [Species.TOGEDEMARU]: Abilities.STATIC,
[Species.MIMIKYU]: Abilities.CURSED_BODY, [Species.MIMIKYU]: Abilities.TOUGH_CLAWS,
[Species.BRUXISH]: Abilities.MULTISCALE, [Species.BRUXISH]: Abilities.MULTISCALE,
[Species.DRAMPA]: Abilities.FLASH_FIRE, [Species.DRAMPA]: Abilities.FLASH_FIRE,
[Species.DHELMISE]: Abilities.INFILTRATOR, [Species.DHELMISE]: Abilities.INFILTRATOR,
[Species.JANGMO_O]: Abilities.DANCER, [Species.JANGMO_O]: Abilities.DANCER,
[Species.TAPU_KOKO]: Abilities.GALVANIZE, [Species.TAPU_KOKO]: Abilities.TRANSISTOR,
[Species.TAPU_LELE]: Abilities.BERSERK, [Species.TAPU_LELE]: Abilities.SHEER_FORCE,
[Species.TAPU_BULU]: Abilities.FLOWER_VEIL, [Species.TAPU_BULU]: Abilities.GRASS_PELT,
[Species.TAPU_FINI]: Abilities.FAIRY_AURA, [Species.TAPU_FINI]: Abilities.FAIRY_AURA,
[Species.COSMOG]: Abilities.BEAST_BOOST, [Species.COSMOG]: Abilities.BEAST_BOOST,
[Species.NIHILEGO]: Abilities.POISON_PUPPETEER, [Species.NIHILEGO]: Abilities.LEVITATE,
[Species.BUZZWOLE]: Abilities.MOXIE, [Species.BUZZWOLE]: Abilities.MOXIE,
[Species.PHEROMOSA]: Abilities.MOXIE, [Species.PHEROMOSA]: Abilities.TINTED_LENS,
[Species.XURKITREE]: Abilities.LIGHTNING_ROD, [Species.XURKITREE]: Abilities.TRANSISTOR,
[Species.CELESTEELA]: Abilities.CHLOROPHYLL, [Species.CELESTEELA]: Abilities.HEATPROOF,
[Species.KARTANA]: Abilities.SHARPNESS, [Species.KARTANA]: Abilities.SHARPNESS,
[Species.GUZZLORD]: Abilities.GLUTTONY, [Species.GUZZLORD]: Abilities.INNARDS_OUT,
[Species.NECROZMA]: Abilities.BEAST_BOOST, [Species.NECROZMA]: Abilities.BEAST_BOOST,
[Species.MAGEARNA]: Abilities.STEELY_SPIRIT, [Species.MAGEARNA]: Abilities.STEELY_SPIRIT,
[Species.MARSHADOW]: Abilities.IRON_FIST, [Species.MARSHADOW]: Abilities.IRON_FIST,
[Species.POIPOLE]: Abilities.MERCILESS, [Species.POIPOLE]: Abilities.SHEER_FORCE,
[Species.STAKATAKA]: Abilities.DAUNTLESS_SHIELD, [Species.STAKATAKA]: Abilities.SOLID_ROCK,
[Species.BLACEPHALON]: Abilities.MAGIC_GUARD, [Species.BLACEPHALON]: Abilities.MAGIC_GUARD,
[Species.ZERAORA]: Abilities.MOTOR_DRIVE, [Species.ZERAORA]: Abilities.TOUGH_CLAWS,
[Species.MELTAN]: Abilities.FULL_METAL_BODY, [Species.MELTAN]: Abilities.STEELY_SPIRIT,
[Species.GROOKEY]: Abilities.GRASS_PELT, [Species.GROOKEY]: Abilities.GRASS_PELT,
[Species.SCORBUNNY]: Abilities.RECKLESS, [Species.SCORBUNNY]: Abilities.RECKLESS,
[Species.SOBBLE]: Abilities.SUPER_LUCK, [Species.SOBBLE]: Abilities.SUPER_LUCK,
[Species.SKWOVET]: Abilities.HONEY_GATHER, [Species.SKWOVET]: Abilities.HONEY_GATHER,
[Species.ROOKIDEE]: Abilities.IRON_BARBS, [Species.ROOKIDEE]: Abilities.IRON_BARBS,
[Species.BLIPBUG]: Abilities.TINTED_LENS, [Species.BLIPBUG]: Abilities.PSYCHIC_SURGE,
[Species.NICKIT]: Abilities.INTIMIDATE, [Species.NICKIT]: Abilities.INTIMIDATE,
[Species.GOSSIFLEUR]: Abilities.STORM_DRAIN, [Species.GOSSIFLEUR]: Abilities.GRASSY_SURGE,
[Species.WOOLOO]: Abilities.ROCK_HEAD, [Species.WOOLOO]: Abilities.ROCK_HEAD,
[Species.CHEWTLE]: Abilities.ROCK_HEAD, [Species.CHEWTLE]: Abilities.ROCK_HEAD,
[Species.YAMPER]: Abilities.STAKEOUT, [Species.YAMPER]: Abilities.STAKEOUT,
@ -3600,7 +3624,7 @@ export const starterPassiveAbilities = {
[Species.SINISTEA]: Abilities.WATER_ABSORB, [Species.SINISTEA]: Abilities.WATER_ABSORB,
[Species.HATENNA]: Abilities.MAGIC_GUARD, [Species.HATENNA]: Abilities.MAGIC_GUARD,
[Species.IMPIDIMP]: Abilities.TANGLING_HAIR, [Species.IMPIDIMP]: Abilities.TANGLING_HAIR,
[Species.MILCERY]: Abilities.WELL_BAKED_BODY, [Species.MILCERY]: Abilities.MISTY_SURGE,
[Species.FALINKS]: Abilities.MOXIE, [Species.FALINKS]: Abilities.MOXIE,
[Species.PINCURCHIN]: Abilities.IRON_BARBS, [Species.PINCURCHIN]: Abilities.IRON_BARBS,
[Species.SNOM]: Abilities.SNOW_WARNING, [Species.SNOM]: Abilities.SNOW_WARNING,
@ -3615,17 +3639,17 @@ export const starterPassiveAbilities = {
[Species.ARCTOVISH]: Abilities.STRONG_JAW, [Species.ARCTOVISH]: Abilities.STRONG_JAW,
[Species.DURALUDON]: Abilities.MEGA_LAUNCHER, [Species.DURALUDON]: Abilities.MEGA_LAUNCHER,
[Species.DREEPY]: Abilities.PARENTAL_BOND, [Species.DREEPY]: Abilities.PARENTAL_BOND,
[Species.ZACIAN]: Abilities.GUARD_DOG, [Species.ZACIAN]: Abilities.UNNERVE,
[Species.ZAMAZENTA]: Abilities.GUARD_DOG, [Species.ZAMAZENTA]: Abilities.STAMINA,
[Species.ETERNATUS]: Abilities.SUPREME_OVERLORD, [Species.ETERNATUS]: Abilities.SUPREME_OVERLORD,
[Species.KUBFU]: Abilities.IRON_FIST, [Species.KUBFU]: Abilities.IRON_FIST,
[Species.ZARUDE]: Abilities.PRANKSTER, [Species.ZARUDE]: Abilities.GRASSY_SURGE,
[Species.REGIELEKI]: Abilities.LEVITATE, [Species.REGIELEKI]: Abilities.ELECTRIC_SURGE,
[Species.REGIDRAGO]: Abilities.INTIMIDATE, [Species.REGIDRAGO]: Abilities.MULTISCALE,
[Species.GLASTRIER]: Abilities.FILTER, [Species.GLASTRIER]: Abilities.FILTER,
[Species.SPECTRIER]: Abilities.PERISH_BODY, [Species.SPECTRIER]: Abilities.SHADOW_SHIELD,
[Species.CALYREX]: Abilities.HARVEST, [Species.CALYREX]: Abilities.HARVEST,
[Species.ENAMORUS]: Abilities.PRANKSTER, [Species.ENAMORUS]: Abilities.FAIRY_AURA,
[Species.SPRIGATITO]: Abilities.MAGICIAN, [Species.SPRIGATITO]: Abilities.MAGICIAN,
[Species.FUECOCO]: Abilities.EARTH_EATER, [Species.FUECOCO]: Abilities.EARTH_EATER,
[Species.QUAXLY]: Abilities.DANCER, [Species.QUAXLY]: Abilities.DANCER,
@ -3650,9 +3674,9 @@ export const starterPassiveAbilities = {
[Species.RELLOR]: Abilities.MAGIC_GUARD, [Species.RELLOR]: Abilities.MAGIC_GUARD,
[Species.FLITTLE]: Abilities.COMPETITIVE, [Species.FLITTLE]: Abilities.COMPETITIVE,
[Species.TINKATINK]: Abilities.HUGE_POWER, [Species.TINKATINK]: Abilities.HUGE_POWER,
[Species.WIGLETT]: Abilities.STORM_DRAIN, [Species.WIGLETT]: Abilities.STURDY,
[Species.BOMBIRDIER]: Abilities.UNAWARE, [Species.BOMBIRDIER]: Abilities.UNAWARE,
[Species.FINIZEN]: Abilities.LIQUID_VOICE, [Species.FINIZEN]: Abilities.IRON_FIST,
[Species.VAROOM]: Abilities.SPEED_BOOST, [Species.VAROOM]: Abilities.SPEED_BOOST,
[Species.CYCLIZAR]: Abilities.PROTEAN, [Species.CYCLIZAR]: Abilities.PROTEAN,
[Species.ORTHWORM]: Abilities.HEATPROOF, [Species.ORTHWORM]: Abilities.HEATPROOF,
@ -3664,55 +3688,55 @@ export const starterPassiveAbilities = {
[Species.DONDOZO]: Abilities.GLUTTONY, [Species.DONDOZO]: Abilities.GLUTTONY,
[Species.TATSUGIRI]: Abilities.WATER_BUBBLE, [Species.TATSUGIRI]: Abilities.WATER_BUBBLE,
[Species.GREAT_TUSK]: Abilities.INTIMIDATE, [Species.GREAT_TUSK]: Abilities.INTIMIDATE,
[Species.SCREAM_TAIL]: Abilities.PIXILATE, [Species.SCREAM_TAIL]: Abilities.UNAWARE,
[Species.BRUTE_BONNET]: Abilities.BEAST_BOOST, [Species.BRUTE_BONNET]: Abilities.BEAST_BOOST,
[Species.FLUTTER_MANE]: Abilities.DAZZLING, [Species.FLUTTER_MANE]: Abilities.DAZZLING,
[Species.SLITHER_WING]: Abilities.MOXIE, [Species.SLITHER_WING]: Abilities.SCRAPPY,
[Species.SANDY_SHOCKS]: Abilities.EARTH_EATER, [Species.SANDY_SHOCKS]: Abilities.EARTH_EATER,
[Species.IRON_TREADS]: Abilities.BULLETPROOF, [Species.IRON_TREADS]: Abilities.STEELY_SPIRIT,
[Species.IRON_BUNDLE]: Abilities.SNOW_WARNING, [Species.IRON_BUNDLE]: Abilities.SNOW_WARNING,
[Species.IRON_HANDS]: Abilities.IRON_FIST, [Species.IRON_HANDS]: Abilities.IRON_FIST,
[Species.IRON_JUGULIS]: Abilities.NO_GUARD, [Species.IRON_JUGULIS]: Abilities.AERILATE,
[Species.IRON_MOTH]: Abilities.LEVITATE, [Species.IRON_MOTH]: Abilities.LEVITATE,
[Species.IRON_THORNS]: Abilities.SAND_STREAM, [Species.IRON_THORNS]: Abilities.SAND_STREAM,
[Species.FRIGIBAX]: Abilities.THICK_FAT, [Species.FRIGIBAX]: Abilities.THICK_FAT,
[Species.GIMMIGHOUL]: Abilities.SUPER_LUCK, [Species.GIMMIGHOUL]: Abilities.SUPER_LUCK,
[Species.WO_CHIEN]: Abilities.TRIAGE, [Species.WO_CHIEN]: Abilities.GRASSY_SURGE,
[Species.CHIEN_PAO]: Abilities.REFRIGERATE, [Species.CHIEN_PAO]: Abilities.INTREPID_SWORD,
[Species.TING_LU]: Abilities.STAMINA, [Species.TING_LU]: Abilities.STAMINA,
[Species.CHI_YU]: Abilities.BLAZE, [Species.CHI_YU]: Abilities.DROUGHT,
[Species.ROARING_MOON]: Abilities.AERILATE, [Species.ROARING_MOON]: Abilities.TOUGH_CLAWS,
[Species.IRON_VALIANT]: Abilities.DOWNLOAD, [Species.IRON_VALIANT]: Abilities.DOWNLOAD,
[Species.KORAIDON]: Abilities.PROTOSYNTHESIS, [Species.KORAIDON]: Abilities.PROTOSYNTHESIS,
[Species.MIRAIDON]: Abilities.QUARK_DRIVE, [Species.MIRAIDON]: Abilities.QUARK_DRIVE,
[Species.WALKING_WAKE]: Abilities.BEAST_BOOST, [Species.WALKING_WAKE]: Abilities.BEAST_BOOST,
[Species.IRON_LEAVES]: Abilities.SHARPNESS, [Species.IRON_LEAVES]: Abilities.SHARPNESS,
[Species.POLTCHAGEIST]: Abilities.FLAME_BODY, [Species.POLTCHAGEIST]: Abilities.FLAME_BODY,
[Species.OKIDOGI]: Abilities.INTIMIDATE, [Species.OKIDOGI]: Abilities.FUR_COAT,
[Species.MUNKIDORI]: Abilities.PRANKSTER, [Species.MUNKIDORI]: Abilities.NEUROFORCE,
[Species.FEZANDIPITI]: Abilities.DAZZLING, [Species.FEZANDIPITI]: Abilities.LEVITATE,
[Species.OGERPON]: Abilities.OPPORTUNIST, [Species.OGERPON]: Abilities.OPPORTUNIST,
[Species.GOUGING_FIRE]: Abilities.BEAST_BOOST, [Species.GOUGING_FIRE]: Abilities.BEAST_BOOST,
[Species.RAGING_BOLT]: Abilities.BEAST_BOOST, [Species.RAGING_BOLT]: Abilities.BEAST_BOOST,
[Species.IRON_BOULDER]: Abilities.SHARPNESS, [Species.IRON_BOULDER]: Abilities.SHARPNESS,
[Species.IRON_CROWN]: Abilities.SHARPNESS, [Species.IRON_CROWN]: Abilities.SHARPNESS,
[Species.TERAPAGOS]: Abilities.PROTEAN, [Species.TERAPAGOS]: Abilities.REGENERATOR,
[Species.PECHARUNT]: Abilities.CORROSION, [Species.PECHARUNT]: Abilities.TOXIC_CHAIN,
[Species.ALOLA_RATTATA]: Abilities.CHEEK_POUCH, [Species.ALOLA_RATTATA]: Abilities.CHEEK_POUCH,
[Species.ALOLA_SANDSHREW]: Abilities.ICE_BODY, [Species.ALOLA_SANDSHREW]: Abilities.ICE_BODY,
[Species.ALOLA_VULPIX]: Abilities.ICE_BODY, [Species.ALOLA_VULPIX]: Abilities.ICE_BODY,
[Species.ALOLA_DIGLETT]: Abilities.CUTE_CHARM, [Species.ALOLA_DIGLETT]: Abilities.STURDY,
[Species.ALOLA_MEOWTH]: Abilities.UNNERVE, [Species.ALOLA_MEOWTH]: Abilities.UNNERVE,
[Species.ALOLA_GEODUDE]: Abilities.ELECTROMORPHOSIS, [Species.ALOLA_GEODUDE]: Abilities.ELECTROMORPHOSIS,
[Species.ALOLA_GRIMER]: Abilities.MERCILESS, [Species.ALOLA_GRIMER]: Abilities.MERCILESS,
[Species.ETERNAL_FLOETTE]: Abilities.MAGIC_GUARD, [Species.ETERNAL_FLOETTE]: Abilities.MAGIC_GUARD,
[Species.GALAR_MEOWTH]: Abilities.SUPER_LUCK, [Species.GALAR_MEOWTH]: Abilities.SUPER_LUCK,
[Species.GALAR_PONYTA]: Abilities.MAGIC_GUARD, [Species.GALAR_PONYTA]: Abilities.PIXILATE,
[Species.GALAR_SLOWPOKE]: Abilities.POISON_TOUCH, [Species.GALAR_SLOWPOKE]: Abilities.POISON_TOUCH,
[Species.GALAR_FARFETCHD]: Abilities.SUPER_LUCK, [Species.GALAR_FARFETCHD]: Abilities.SUPER_LUCK,
[Species.GALAR_ARTICUNO]: Abilities.SERENE_GRACE, [Species.GALAR_ARTICUNO]: Abilities.SERENE_GRACE,
[Species.GALAR_ZAPDOS]: Abilities.TOUGH_CLAWS, [Species.GALAR_ZAPDOS]: Abilities.TOUGH_CLAWS,
[Species.GALAR_MOLTRES]: Abilities.REGENERATOR, [Species.GALAR_MOLTRES]: Abilities.DARK_AURA,
[Species.GALAR_CORSOLA]: Abilities.SHADOW_TAG, [Species.GALAR_CORSOLA]: Abilities.SHADOW_TAG,
[Species.GALAR_ZIGZAGOON]: Abilities.PICKPOCKET, [Species.GALAR_ZIGZAGOON]: Abilities.PICKPOCKET,
[Species.GALAR_DARUMAKA]: Abilities.FLASH_FIRE, [Species.GALAR_DARUMAKA]: Abilities.FLASH_FIRE,

View File

@ -33,6 +33,5 @@ splashMessages.push(...[
'Also Try Emerald Rogue!', 'Also Try Emerald Rogue!',
'Also Try Radical Red!', 'Also Try Radical Red!',
'Eevee Expo!', 'Eevee Expo!',
'YNOproject!', 'YNOproject!'
'Shh, don\'t tell Sam!'
]); ]);

View File

@ -29550,7 +29550,6 @@ export const tmSpecies: TmSpecies = {
Species.MURKROW, Species.MURKROW,
Species.SLOWKING, Species.SLOWKING,
Species.MISDREAVUS, Species.MISDREAVUS,
Species.UNOWN,
Species.GIRAFARIG, Species.GIRAFARIG,
Species.PINECO, Species.PINECO,
Species.FORRETRESS, Species.FORRETRESS,
@ -62012,21 +62011,49 @@ export const tmSpecies: TmSpecies = {
Species.ALOLA_MAROWAK, Species.ALOLA_MAROWAK,
], ],
[Moves.TERA_BLAST]: [ [Moves.TERA_BLAST]: [
Species.BULBASAUR,
Species.IVYSAUR,
Species.VENUSAUR,
Species.CHARMANDER, Species.CHARMANDER,
Species.CHARMELEON, Species.CHARMELEON,
Species.CHARIZARD, Species.CHARIZARD,
Species.SQUIRTLE,
Species.WARTORTLE,
Species.BLASTOISE,
Species.BUTTERFREE,
Species.BEEDRILL,
Species.PIDGEY,
Species.PIDGEOTTO,
Species.PIDGEOT,
Species.RATTATA,
Species.RATICATE,
Species.SPEAROW,
Species.FEAROW,
Species.EKANS, Species.EKANS,
Species.ARBOK, Species.ARBOK,
Species.PIKACHU, Species.PIKACHU,
Species.RAICHU, Species.RAICHU,
Species.SANDSHREW, Species.SANDSHREW,
Species.SANDSLASH, Species.SANDSLASH,
Species.NIDORAN_F,
Species.NIDORINA,
Species.NIDOQUEEN,
Species.NIDORAN_M,
Species.NIDORINO,
Species.NIDOKING,
Species.CLEFAIRY, Species.CLEFAIRY,
Species.CLEFABLE, Species.CLEFABLE,
Species.VULPIX, Species.VULPIX,
Species.NINETALES, Species.NINETALES,
Species.JIGGLYPUFF, Species.JIGGLYPUFF,
Species.WIGGLYTUFF, Species.WIGGLYTUFF,
Species.ZUBAT,
Species.GOLBAT,
Species.ODDISH,
Species.GLOOM,
Species.VILEPLUME,
Species.PARAS,
Species.PARASECT,
Species.VENONAT, Species.VENONAT,
Species.VENOMOTH, Species.VENOMOTH,
Species.DIGLETT, Species.DIGLETT,
@ -62042,16 +62069,31 @@ export const tmSpecies: TmSpecies = {
Species.POLIWAG, Species.POLIWAG,
Species.POLIWHIRL, Species.POLIWHIRL,
Species.POLIWRATH, Species.POLIWRATH,
Species.ABRA,
Species.KADABRA,
Species.ALAKAZAM,
Species.MACHOP,
Species.MACHOKE,
Species.MACHAMP,
Species.BELLSPROUT, Species.BELLSPROUT,
Species.WEEPINBELL, Species.WEEPINBELL,
Species.VICTREEBEL, Species.VICTREEBEL,
Species.TENTACOOL,
Species.TENTACRUEL,
Species.GEODUDE, Species.GEODUDE,
Species.GRAVELER, Species.GRAVELER,
Species.GOLEM, Species.GOLEM,
Species.PONYTA,
Species.RAPIDASH,
Species.SLOWPOKE, Species.SLOWPOKE,
Species.SLOWBRO, Species.SLOWBRO,
Species.MAGNEMITE, Species.MAGNEMITE,
Species.MAGNETON, Species.MAGNETON,
Species.FARFETCHD,
Species.DODUO,
Species.DODRIO,
Species.SEEL,
Species.DEWGONG,
Species.GRIMER, Species.GRIMER,
Species.MUK, Species.MUK,
Species.SHELLDER, Species.SHELLDER,
@ -62059,20 +62101,52 @@ export const tmSpecies: TmSpecies = {
Species.GASTLY, Species.GASTLY,
Species.HAUNTER, Species.HAUNTER,
Species.GENGAR, Species.GENGAR,
Species.ONIX,
Species.DROWZEE, Species.DROWZEE,
Species.HYPNO, Species.HYPNO,
Species.KRABBY,
Species.KINGLER,
Species.VOLTORB, Species.VOLTORB,
Species.ELECTRODE, Species.ELECTRODE,
Species.EXEGGCUTE,
Species.EXEGGUTOR,
Species.CUBONE,
Species.MAROWAK,
Species.HITMONLEE,
Species.HITMONCHAN,
Species.LICKITUNG,
Species.KOFFING, Species.KOFFING,
Species.WEEZING, Species.WEEZING,
Species.RHYHORN,
Species.RHYDON,
Species.CHANSEY, Species.CHANSEY,
Species.TANGELA,
Species.KANGASKHAN,
Species.HORSEA,
Species.SEADRA,
Species.GOLDEEN,
Species.SEAKING,
Species.STARYU,
Species.STARMIE,
Species.MR_MIME,
Species.SCYTHER, Species.SCYTHER,
Species.JYNX,
Species.ELECTABUZZ,
Species.MAGMAR,
Species.PINSIR,
Species.TAUROS, Species.TAUROS,
Species.GYARADOS, Species.GYARADOS,
Species.LAPRAS,
Species.EEVEE, Species.EEVEE,
Species.VAPOREON, Species.VAPOREON,
Species.JOLTEON, Species.JOLTEON,
Species.FLAREON, Species.FLAREON,
Species.PORYGON,
Species.OMANYTE,
Species.OMASTAR,
Species.KABUTO,
Species.KABUTOPS,
Species.AERODACTYL,
Species.SNORLAX, Species.SNORLAX,
Species.ARTICUNO, Species.ARTICUNO,
Species.ZAPDOS, Species.ZAPDOS,
@ -62082,21 +62156,37 @@ export const tmSpecies: TmSpecies = {
Species.DRAGONITE, Species.DRAGONITE,
Species.MEWTWO, Species.MEWTWO,
Species.MEW, Species.MEW,
Species.CHIKORITA,
Species.BAYLEEF,
Species.MEGANIUM,
Species.CYNDAQUIL, Species.CYNDAQUIL,
Species.QUILAVA, Species.QUILAVA,
Species.TYPHLOSION, Species.TYPHLOSION,
Species.TOTODILE,
Species.CROCONAW,
Species.FERALIGATR,
Species.SENTRET, Species.SENTRET,
Species.FURRET, Species.FURRET,
Species.HOOTHOOT, Species.HOOTHOOT,
Species.NOCTOWL, Species.NOCTOWL,
Species.LEDYBA,
Species.LEDIAN,
Species.SPINARAK, Species.SPINARAK,
Species.ARIADOS, Species.ARIADOS,
Species.CROBAT,
Species.CHINCHOU,
Species.LANTURN,
Species.PICHU, Species.PICHU,
Species.CLEFFA, Species.CLEFFA,
Species.IGGLYBUFF, Species.IGGLYBUFF,
Species.TOGEPI,
Species.TOGETIC,
Species.NATU,
Species.XATU,
Species.MAREEP, Species.MAREEP,
Species.FLAAFFY, Species.FLAAFFY,
Species.AMPHAROS, Species.AMPHAROS,
Species.BELLOSSOM,
Species.MARILL, Species.MARILL,
Species.AZUMARILL, Species.AZUMARILL,
Species.SUDOWOODO, Species.SUDOWOODO,
@ -62120,8 +62210,12 @@ export const tmSpecies: TmSpecies = {
Species.FORRETRESS, Species.FORRETRESS,
Species.DUNSPARCE, Species.DUNSPARCE,
Species.GLIGAR, Species.GLIGAR,
Species.STEELIX,
Species.SNUBBULL,
Species.GRANBULL,
Species.QWILFISH, Species.QWILFISH,
Species.SCIZOR, Species.SCIZOR,
Species.SHUCKLE,
Species.HERACROSS, Species.HERACROSS,
Species.SNEASEL, Species.SNEASEL,
Species.TEDDIURSA, Species.TEDDIURSA,
@ -62130,24 +62224,58 @@ export const tmSpecies: TmSpecies = {
Species.MAGCARGO, Species.MAGCARGO,
Species.SWINUB, Species.SWINUB,
Species.PILOSWINE, Species.PILOSWINE,
Species.CORSOLA,
Species.REMORAID,
Species.OCTILLERY,
Species.DELIBIRD, Species.DELIBIRD,
Species.MANTINE,
Species.SKARMORY,
Species.HOUNDOUR, Species.HOUNDOUR,
Species.HOUNDOOM, Species.HOUNDOOM,
Species.KINGDRA,
Species.PHANPY, Species.PHANPY,
Species.DONPHAN, Species.DONPHAN,
Species.PORYGON2,
Species.STANTLER, Species.STANTLER,
Species.TYROGUE,
Species.HITMONTOP,
Species.SMOOCHUM,
Species.ELEKID,
Species.MAGBY,
Species.MILTANK,
Species.BLISSEY, Species.BLISSEY,
Species.RAIKOU,
Species.ENTEI,
Species.SUICUNE,
Species.LARVITAR, Species.LARVITAR,
Species.PUPITAR, Species.PUPITAR,
Species.TYRANITAR, Species.TYRANITAR,
Species.LUGIA,
Species.HO_OH,
Species.CELEBI,
Species.TREECKO,
Species.GROVYLE,
Species.SCEPTILE,
Species.TORCHIC,
Species.COMBUSKEN,
Species.BLAZIKEN,
Species.MUDKIP,
Species.MARSHTOMP,
Species.SWAMPERT,
Species.POOCHYENA, Species.POOCHYENA,
Species.MIGHTYENA, Species.MIGHTYENA,
Species.ZIGZAGOON,
Species.LINOONE,
Species.BEAUTIFLY,
Species.DUSTOX,
Species.LOTAD, Species.LOTAD,
Species.LOMBRE, Species.LOMBRE,
Species.LUDICOLO, Species.LUDICOLO,
Species.SEEDOT, Species.SEEDOT,
Species.NUZLEAF, Species.NUZLEAF,
Species.SHIFTRY, Species.SHIFTRY,
Species.TAILLOW,
Species.SWELLOW,
Species.WINGULL, Species.WINGULL,
Species.PELIPPER, Species.PELIPPER,
Species.RALTS, Species.RALTS,
@ -62160,49 +62288,101 @@ export const tmSpecies: TmSpecies = {
Species.SLAKOTH, Species.SLAKOTH,
Species.VIGOROTH, Species.VIGOROTH,
Species.SLAKING, Species.SLAKING,
Species.NINCADA,
Species.NINJASK,
Species.SHEDINJA,
Species.WHISMUR,
Species.LOUDRED,
Species.EXPLOUD,
Species.MAKUHITA, Species.MAKUHITA,
Species.HARIYAMA, Species.HARIYAMA,
Species.AZURILL, Species.AZURILL,
Species.NOSEPASS, Species.NOSEPASS,
Species.SKITTY,
Species.DELCATTY,
Species.SABLEYE, Species.SABLEYE,
Species.MAWILE,
Species.ARON,
Species.LAIRON,
Species.AGGRON,
Species.MEDITITE, Species.MEDITITE,
Species.MEDICHAM, Species.MEDICHAM,
Species.ELECTRIKE,
Species.MANECTRIC,
Species.PLUSLE,
Species.MINUN,
Species.VOLBEAT, Species.VOLBEAT,
Species.ILLUMISE, Species.ILLUMISE,
Species.ROSELIA,
Species.GULPIN, Species.GULPIN,
Species.SWALOT, Species.SWALOT,
Species.CARVANHA,
Species.SHARPEDO,
Species.WAILMER,
Species.WAILORD,
Species.NUMEL, Species.NUMEL,
Species.CAMERUPT, Species.CAMERUPT,
Species.TORKOAL, Species.TORKOAL,
Species.SPOINK, Species.SPOINK,
Species.GRUMPIG, Species.GRUMPIG,
Species.SPINDA,
Species.TRAPINCH,
Species.VIBRAVA,
Species.FLYGON,
Species.CACNEA, Species.CACNEA,
Species.CACTURNE, Species.CACTURNE,
Species.SWABLU, Species.SWABLU,
Species.ALTARIA, Species.ALTARIA,
Species.ZANGOOSE, Species.ZANGOOSE,
Species.SEVIPER, Species.SEVIPER,
Species.LUNATONE,
Species.SOLROCK,
Species.BARBOACH, Species.BARBOACH,
Species.WHISCASH, Species.WHISCASH,
Species.CORPHISH, Species.CORPHISH,
Species.CRAWDAUNT, Species.CRAWDAUNT,
Species.BALTOY,
Species.CLAYDOL,
Species.LILEEP,
Species.CRADILY,
Species.ANORITH,
Species.ARMALDO,
Species.FEEBAS, Species.FEEBAS,
Species.MILOTIC, Species.MILOTIC,
Species.CASTFORM,
Species.KECLEON,
Species.SHUPPET, Species.SHUPPET,
Species.BANETTE, Species.BANETTE,
Species.DUSKULL, Species.DUSKULL,
Species.DUSCLOPS, Species.DUSCLOPS,
Species.TROPIUS, Species.TROPIUS,
Species.CHIMECHO, Species.CHIMECHO,
Species.ABSOL,
Species.SNORUNT, Species.SNORUNT,
Species.GLALIE, Species.GLALIE,
Species.SPHEAL,
Species.SEALEO,
Species.WALREIN,
Species.CLAMPERL,
Species.HUNTAIL,
Species.GOREBYSS,
Species.RELICANTH,
Species.LUVDISC, Species.LUVDISC,
Species.BAGON, Species.BAGON,
Species.SHELGON, Species.SHELGON,
Species.SALAMENCE, Species.SALAMENCE,
Species.METANG,
Species.METAGROSS,
Species.REGIROCK,
Species.REGICE,
Species.REGISTEEL,
Species.LATIAS,
Species.LATIOS,
Species.KYOGRE, Species.KYOGRE,
Species.GROUDON, Species.GROUDON,
Species.RAYQUAZA, Species.RAYQUAZA,
Species.JIRACHI,
Species.DEOXYS,
Species.TURTWIG, Species.TURTWIG,
Species.GROTLE, Species.GROTLE,
Species.TORTERRA, Species.TORTERRA,
@ -62215,30 +62395,49 @@ export const tmSpecies: TmSpecies = {
Species.STARLY, Species.STARLY,
Species.STARAVIA, Species.STARAVIA,
Species.STARAPTOR, Species.STARAPTOR,
Species.BIDOOF,
Species.BIBAREL,
Species.KRICKETOT, Species.KRICKETOT,
Species.KRICKETUNE, Species.KRICKETUNE,
Species.SHINX, Species.SHINX,
Species.LUXIO, Species.LUXIO,
Species.LUXRAY, Species.LUXRAY,
Species.BUDEW,
Species.ROSERADE,
Species.CRANIDOS,
Species.RAMPARDOS,
Species.SHIELDON,
Species.BASTIODON,
Species.BURMY,
Species.WORMADAM,
Species.MOTHIM,
Species.COMBEE, Species.COMBEE,
Species.VESPIQUEN, Species.VESPIQUEN,
Species.PACHIRISU, Species.PACHIRISU,
Species.BUIZEL, Species.BUIZEL,
Species.FLOATZEL, Species.FLOATZEL,
Species.CHERUBI,
Species.CHERRIM,
Species.SHELLOS, Species.SHELLOS,
Species.GASTRODON, Species.GASTRODON,
Species.AMBIPOM, Species.AMBIPOM,
Species.DRIFLOON, Species.DRIFLOON,
Species.DRIFBLIM, Species.DRIFBLIM,
Species.BUNEARY,
Species.LOPUNNY,
Species.MISMAGIUS, Species.MISMAGIUS,
Species.HONCHKROW, Species.HONCHKROW,
Species.GLAMEOW,
Species.PURUGLY,
Species.CHINGLING, Species.CHINGLING,
Species.STUNKY, Species.STUNKY,
Species.SKUNTANK, Species.SKUNTANK,
Species.BRONZOR, Species.BRONZOR,
Species.BRONZONG, Species.BRONZONG,
Species.BONSLY, Species.BONSLY,
Species.MIME_JR,
Species.HAPPINY, Species.HAPPINY,
Species.CHATOT,
Species.SPIRITOMB, Species.SPIRITOMB,
Species.GIBLE, Species.GIBLE,
Species.GABITE, Species.GABITE,
@ -62248,19 +62447,30 @@ export const tmSpecies: TmSpecies = {
Species.LUCARIO, Species.LUCARIO,
Species.HIPPOPOTAS, Species.HIPPOPOTAS,
Species.HIPPOWDON, Species.HIPPOWDON,
Species.SKORUPI,
Species.DRAPION,
Species.CROAGUNK, Species.CROAGUNK,
Species.TOXICROAK, Species.TOXICROAK,
Species.CARNIVINE,
Species.FINNEON, Species.FINNEON,
Species.LUMINEON, Species.LUMINEON,
Species.MANTYKE,
Species.SNOVER, Species.SNOVER,
Species.ABOMASNOW, Species.ABOMASNOW,
Species.WEAVILE, Species.WEAVILE,
Species.MAGNEZONE, Species.MAGNEZONE,
Species.LICKILICKY,
Species.RHYPERIOR,
Species.TANGROWTH,
Species.ELECTIVIRE,
Species.MAGMORTAR,
Species.TOGEKISS,
Species.YANMEGA, Species.YANMEGA,
Species.LEAFEON, Species.LEAFEON,
Species.GLACEON, Species.GLACEON,
Species.GLISCOR, Species.GLISCOR,
Species.MAMOSWINE, Species.MAMOSWINE,
Species.PORYGON_Z,
Species.GALLADE, Species.GALLADE,
Species.PROBOPASS, Species.PROBOPASS,
Species.DUSKNOIR, Species.DUSKNOIR,
@ -62272,39 +62482,127 @@ export const tmSpecies: TmSpecies = {
Species.DIALGA, Species.DIALGA,
Species.PALKIA, Species.PALKIA,
Species.HEATRAN, Species.HEATRAN,
Species.REGIGIGAS,
Species.GIRATINA, Species.GIRATINA,
Species.CRESSELIA, Species.CRESSELIA,
Species.PHIONE,
Species.MANAPHY,
Species.DARKRAI,
Species.SHAYMIN,
Species.ARCEUS, Species.ARCEUS,
Species.VICTINI,
Species.SNIVY,
Species.SERVINE,
Species.SERPERIOR,
Species.TEPIG,
Species.PIGNITE,
Species.EMBOAR,
Species.OSHAWOTT, Species.OSHAWOTT,
Species.DEWOTT, Species.DEWOTT,
Species.SAMUROTT, Species.SAMUROTT,
Species.PATRAT,
Species.WATCHOG,
Species.LILLIPUP,
Species.HERDIER,
Species.STOUTLAND,
Species.PURRLOIN,
Species.LIEPARD,
Species.PANSAGE,
Species.SIMISAGE,
Species.PANSEAR,
Species.SIMISEAR,
Species.PANPOUR,
Species.SIMIPOUR,
Species.MUNNA,
Species.MUSHARNA,
Species.PIDOVE,
Species.TRANQUILL,
Species.UNFEZANT,
Species.BLITZLE,
Species.ZEBSTRIKA,
Species.ROGGENROLA,
Species.BOLDORE,
Species.GIGALITH,
Species.WOOBAT,
Species.SWOOBAT,
Species.DRILBUR,
Species.EXCADRILL,
Species.AUDINO,
Species.TIMBURR, Species.TIMBURR,
Species.GURDURR, Species.GURDURR,
Species.CONKELDURR, Species.CONKELDURR,
Species.TYMPOLE,
Species.PALPITOAD,
Species.SEISMITOAD,
Species.THROH,
Species.SAWK,
Species.SEWADDLE, Species.SEWADDLE,
Species.SWADLOON, Species.SWADLOON,
Species.LEAVANNY, Species.LEAVANNY,
Species.VENIPEDE,
Species.WHIRLIPEDE,
Species.SCOLIPEDE,
Species.COTTONEE,
Species.WHIMSICOTT,
Species.PETILIL, Species.PETILIL,
Species.LILLIGANT, Species.LILLIGANT,
Species.BASCULIN, Species.BASCULIN,
Species.SANDILE, Species.SANDILE,
Species.KROKOROK, Species.KROKOROK,
Species.KROOKODILE, Species.KROOKODILE,
Species.DARUMAKA,
Species.DARMANITAN,
Species.MARACTUS,
Species.DWEBBLE,
Species.CRUSTLE,
Species.SCRAGGY,
Species.SCRAFTY,
Species.SIGILYPH,
Species.YAMASK,
Species.COFAGRIGUS,
Species.TIRTOUGA,
Species.CARRACOSTA,
Species.ARCHEN,
Species.ARCHEOPS,
Species.TRUBBISH,
Species.GARBODOR,
Species.ZORUA, Species.ZORUA,
Species.ZOROARK, Species.ZOROARK,
Species.MINCCINO,
Species.CINCCINO,
Species.GOTHITA, Species.GOTHITA,
Species.GOTHORITA, Species.GOTHORITA,
Species.GOTHITELLE, Species.GOTHITELLE,
Species.SOLOSIS,
Species.DUOSION,
Species.REUNICLUS,
Species.DUCKLETT, Species.DUCKLETT,
Species.SWANNA, Species.SWANNA,
Species.VANILLITE,
Species.VANILLISH,
Species.VANILLUXE,
Species.DEERLING, Species.DEERLING,
Species.SAWSBUCK, Species.SAWSBUCK,
Species.EMOLGA,
Species.KARRABLAST,
Species.ESCAVALIER,
Species.FOONGUS, Species.FOONGUS,
Species.AMOONGUSS, Species.AMOONGUSS,
Species.FRILLISH,
Species.JELLICENT,
Species.ALOMOMOLA, Species.ALOMOMOLA,
Species.JOLTIK,
Species.GALVANTULA,
Species.FERROSEED,
Species.FERROTHORN,
Species.KLINK,
Species.KLANG,
Species.KLINKLANG,
Species.TYNAMO, Species.TYNAMO,
Species.EELEKTRIK, Species.EELEKTRIK,
Species.EELEKTROSS, Species.EELEKTROSS,
Species.ELGYEM,
Species.BEHEEYEM,
Species.LITWICK, Species.LITWICK,
Species.LAMPENT, Species.LAMPENT,
Species.CHANDELURE, Species.CHANDELURE,
@ -62314,23 +62612,40 @@ export const tmSpecies: TmSpecies = {
Species.CUBCHOO, Species.CUBCHOO,
Species.BEARTIC, Species.BEARTIC,
Species.CRYOGONAL, Species.CRYOGONAL,
Species.SHELMET,
Species.ACCELGOR,
Species.STUNFISK,
Species.MIENFOO, Species.MIENFOO,
Species.MIENSHAO, Species.MIENSHAO,
Species.DRUDDIGON,
Species.GOLETT,
Species.GOLURK,
Species.PAWNIARD, Species.PAWNIARD,
Species.BISHARP, Species.BISHARP,
Species.BOUFFALANT,
Species.RUFFLET, Species.RUFFLET,
Species.BRAVIARY, Species.BRAVIARY,
Species.VULLABY, Species.VULLABY,
Species.MANDIBUZZ, Species.MANDIBUZZ,
Species.HEATMOR,
Species.DURANT,
Species.DEINO, Species.DEINO,
Species.ZWEILOUS, Species.ZWEILOUS,
Species.HYDREIGON, Species.HYDREIGON,
Species.LARVESTA, Species.LARVESTA,
Species.VOLCARONA, Species.VOLCARONA,
Species.COBALION,
Species.TERRAKION,
Species.VIRIZION,
Species.TORNADUS, Species.TORNADUS,
Species.THUNDURUS, Species.THUNDURUS,
Species.RESHIRAM,
Species.ZEKROM,
Species.LANDORUS, Species.LANDORUS,
Species.KYUREM,
Species.KELDEO,
Species.MELOETTA, Species.MELOETTA,
Species.GENESECT,
Species.CHESPIN, Species.CHESPIN,
Species.QUILLADIN, Species.QUILLADIN,
Species.CHESNAUGHT, Species.CHESNAUGHT,
@ -62345,6 +62660,8 @@ export const tmSpecies: TmSpecies = {
'battle-bond', 'battle-bond',
'ash', 'ash',
], ],
Species.BUNNELBY,
Species.DIGGERSBY,
Species.FLETCHLING, Species.FLETCHLING,
Species.FLETCHINDER, Species.FLETCHINDER,
Species.TALONFLAME, Species.TALONFLAME,
@ -62354,14 +62671,43 @@ export const tmSpecies: TmSpecies = {
Species.LITLEO, Species.LITLEO,
Species.PYROAR, Species.PYROAR,
Species.FLABEBE, Species.FLABEBE,
[
Species.FLOETTE, Species.FLOETTE,
'red',
'yellow',
'orange',
'blue',
'white',
],
Species.FLORGES, Species.FLORGES,
Species.SKIDDO, Species.SKIDDO,
Species.GOGOAT, Species.GOGOAT,
Species.PANCHAM,
Species.PANGORO,
Species.FURFROU,
Species.ESPURR,
Species.MEOWSTIC,
Species.HONEDGE,
Species.DOUBLADE,
Species.AEGISLASH,
Species.SPRITZEE,
Species.AROMATISSE,
Species.SWIRLIX,
Species.SLURPUFF,
Species.INKAY,
Species.MALAMAR,
Species.BINACLE,
Species.BARBARACLE,
Species.SKRELP, Species.SKRELP,
Species.DRAGALGE, Species.DRAGALGE,
Species.CLAUNCHER, Species.CLAUNCHER,
Species.CLAWITZER, Species.CLAWITZER,
Species.HELIOPTILE,
Species.HELIOLISK,
Species.TYRUNT,
Species.TYRANTRUM,
Species.AMAURA,
Species.AURORUS,
Species.SYLVEON, Species.SYLVEON,
Species.HAWLUCHA, Species.HAWLUCHA,
Species.DEDENNE, Species.DEDENNE,
@ -62372,16 +62718,30 @@ export const tmSpecies: TmSpecies = {
Species.KLEFKI, Species.KLEFKI,
Species.PHANTUMP, Species.PHANTUMP,
Species.TREVENANT, Species.TREVENANT,
Species.PUMPKABOO,
Species.GOURGEIST,
Species.BERGMITE, Species.BERGMITE,
Species.AVALUGG, Species.AVALUGG,
Species.NOIBAT, Species.NOIBAT,
Species.NOIVERN, Species.NOIVERN,
Species.XERNEAS,
Species.YVELTAL,
Species.ZYGARDE,
Species.DIANCIE, Species.DIANCIE,
Species.HOOPA, Species.HOOPA,
Species.VOLCANION, Species.VOLCANION,
Species.ROWLET, Species.ROWLET,
Species.DARTRIX, Species.DARTRIX,
Species.DECIDUEYE, Species.DECIDUEYE,
Species.LITTEN,
Species.TORRACAT,
Species.INCINEROAR,
Species.POPPLIO,
Species.BRIONNE,
Species.PRIMARINA,
Species.PIKIPEK,
Species.TRUMBEAK,
Species.TOUCANNON,
Species.YUNGOOS, Species.YUNGOOS,
Species.GUMSHOOS, Species.GUMSHOOS,
Species.GRUBBIN, Species.GRUBBIN,
@ -62394,28 +62754,84 @@ export const tmSpecies: TmSpecies = {
Species.RIBOMBEE, Species.RIBOMBEE,
Species.ROCKRUFF, Species.ROCKRUFF,
Species.LYCANROC, Species.LYCANROC,
Species.WISHIWASHI,
Species.MAREANIE, Species.MAREANIE,
Species.TOXAPEX, Species.TOXAPEX,
Species.MUDBRAY, Species.MUDBRAY,
Species.MUDSDALE, Species.MUDSDALE,
Species.DEWPIDER,
Species.ARAQUANID,
Species.FOMANTIS, Species.FOMANTIS,
Species.LURANTIS, Species.LURANTIS,
Species.MORELULL,
Species.SHIINOTIC,
Species.SALANDIT, Species.SALANDIT,
Species.SALAZZLE, Species.SALAZZLE,
Species.STUFFUL,
Species.BEWEAR,
Species.BOUNSWEET, Species.BOUNSWEET,
Species.STEENEE, Species.STEENEE,
Species.TSAREENA, Species.TSAREENA,
Species.COMFEY,
Species.ORANGURU, Species.ORANGURU,
Species.PASSIMIAN, Species.PASSIMIAN,
Species.WIMPOD,
Species.GOLISOPOD,
Species.SANDYGAST, Species.SANDYGAST,
Species.PALOSSAND, Species.PALOSSAND,
Species.TYPE_NULL,
Species.SILVALLY,
Species.MINIOR,
Species.KOMALA, Species.KOMALA,
Species.TURTONATOR,
Species.TOGEDEMARU,
Species.MIMIKYU, Species.MIMIKYU,
Species.BRUXISH, Species.BRUXISH,
Species.DRAMPA,
Species.DHELMISE,
Species.JANGMO_O, Species.JANGMO_O,
Species.HAKAMO_O, Species.HAKAMO_O,
Species.KOMMO_O, Species.KOMMO_O,
Species.TAPU_KOKO,
Species.TAPU_LELE,
Species.TAPU_BULU,
Species.TAPU_FINI,
Species.SOLGALEO,
Species.LUNALA,
Species.NIHILEGO,
Species.BUZZWOLE,
Species.PHEROMOSA,
Species.XURKITREE,
Species.CELESTEELA,
Species.KARTANA,
Species.GUZZLORD,
Species.NECROZMA,
Species.MAGEARNA, Species.MAGEARNA,
Species.MARSHADOW,
Species.POIPOLE,
Species.NAGANADEL,
Species.STAKATAKA,
Species.BLACEPHALON,
Species.ZERAORA,
Species.ALOLA_RATTATA,
Species.ALOLA_RATICATE,
Species.ALOLA_RAICHU,
Species.ALOLA_SANDSHREW,
Species.ALOLA_SANDSLASH,
Species.ALOLA_VULPIX,
Species.ALOLA_NINETALES,
Species.ALOLA_DIGLETT,
Species.ALOLA_DUGTRIO,
Species.ALOLA_MEOWTH,
Species.ALOLA_PERSIAN,
Species.ALOLA_GEODUDE,
Species.ALOLA_GRAVELER,
Species.ALOLA_GOLEM,
Species.ALOLA_GRIMER,
Species.ALOLA_MUK,
Species.ALOLA_EXEGGUTOR,
Species.ALOLA_MAROWAK,
Species.ETERNAL_FLOETTE,
Species.GROOKEY, Species.GROOKEY,
Species.THWACKEY, Species.THWACKEY,
Species.RILLABOOM, Species.RILLABOOM,
@ -62596,21 +63012,6 @@ export const tmSpecies: TmSpecies = {
Species.MUNKIDORI, Species.MUNKIDORI,
Species.FEZANDIPITI, Species.FEZANDIPITI,
Species.OGERPON, Species.OGERPON,
Species.ALOLA_RAICHU,
Species.ALOLA_SANDSHREW,
Species.ALOLA_SANDSLASH,
Species.ALOLA_VULPIX,
Species.ALOLA_NINETALES,
Species.ALOLA_DIGLETT,
Species.ALOLA_DUGTRIO,
Species.ALOLA_MEOWTH,
Species.ALOLA_PERSIAN,
Species.ALOLA_GEODUDE,
Species.ALOLA_GRAVELER,
Species.ALOLA_GOLEM,
Species.ALOLA_GRIMER,
Species.ALOLA_MUK,
Species.ETERNAL_FLOETTE,
Species.GALAR_MEOWTH, Species.GALAR_MEOWTH,
Species.GALAR_SLOWPOKE, Species.GALAR_SLOWPOKE,
Species.GALAR_SLOWBRO, Species.GALAR_SLOWBRO,

View File

@ -4,13 +4,13 @@ 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 } 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 } from "../data/move";
import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, 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';
import { getLevelTotalExp } from '../data/exp'; import { getLevelTotalExp } from '../data/exp';
import { Stat } from '../data/pokemon-stat'; import { Stat } from '../data/pokemon-stat';
import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, TerastallizeModifier } from '../modifier/modifier'; import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, TerastallizeModifier } from '../modifier/modifier';
import { PokeballType } from '../data/pokeball'; import { PokeballType } from '../data/pokeball';
import { Gender } from '../data/gender'; import { Gender } from '../data/gender';
import { initMoveAnim, loadMoveAnimAssets } from '../data/battle-anims'; import { initMoveAnim, loadMoveAnimAssets } from '../data/battle-anims';
@ -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 } 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 } 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';
@ -37,13 +37,15 @@ import PartyUiHandler, { PartyOption, PartyUiMode } from '../ui/party-ui-handler
import SoundFade from 'phaser3-rex-plugins/plugins/soundfade'; import SoundFade from 'phaser3-rex-plugins/plugins/soundfade';
import { LevelMoves } from '../data/pokemon-level-moves'; import { LevelMoves } from '../data/pokemon-level-moves';
import { DamageAchv, achvs } from '../system/achv'; import { DamageAchv, achvs } from '../system/achv';
import { DexAttr, StarterMoveset } from '../system/game-data'; import { DexAttr, StarterDataEntry, StarterMoveset } from '../system/game-data';
import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from '@material/material-color-utilities'; import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from '@material/material-color-utilities';
import { Nature, getNatureStatMultiplier } from '../data/nature'; import { Nature, getNatureStatMultiplier } from '../data/nature';
import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from '../data/pokemon-forms'; import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from '../data/pokemon-forms';
import { TerrainType } from '../data/terrain'; import { TerrainType } from '../data/terrain';
import { TrainerSlot } from '../data/trainer-config'; import { TrainerSlot } from '../data/trainer-config';
import { ABILITY_OVERRIDE, MOVE_OVERRIDE, OPP_ABILITY_OVERRIDE, OPP_MOVE_OVERRIDE, OPP_SHINY_OVERRIDE, OPP_VARIANT_OVERRIDE } from '../overrides'; import { ABILITY_OVERRIDE, MOVE_OVERRIDE, MOVE_OVERRIDE_2, OPP_ABILITY_OVERRIDE, OPP_MOVE_OVERRIDE, OPP_MOVE_OVERRIDE_2, OPP_SHINY_OVERRIDE, OPP_VARIANT_OVERRIDE } from '../overrides';
import { BerryType } from '../data/berry';
import i18next from '../plugins/i18n';
export enum FieldPosition { export enum FieldPosition {
CENTER, CENTER,
@ -455,6 +457,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return 1; return 1;
} }
getHeldItems(): PokemonHeldItemModifier[] {
if (!this.scene)
return [];
return this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === this.id, this.isPlayer()) as PokemonHeldItemModifier[];
}
updateScale(): void { updateScale(): void {
this.setScale(this.getSpriteScale()); this.setScale(this.getSpriteScale());
} }
@ -581,6 +589,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
ret *= 1.5; ret *= 1.5;
break; break;
case Stat.SPD: case Stat.SPD:
// Check both the player and enemy to see if Tailwind should be multiplying the speed of the Pokemon
if ((this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER))
|| (!this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY)))
ret *= 2;
if (this.getTag(BattlerTagType.SLOW_START)) if (this.getTag(BattlerTagType.SLOW_START))
ret >>= 1; ret >>= 1;
if (this.status && this.status.effect === StatusEffect.PARALYSIS) if (this.status && this.status.effect === StatusEffect.PARALYSIS)
@ -712,6 +725,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.moveset[0] = new PokemonMove(MOVE_OVERRIDE, Math.min(this.moveset[0].ppUsed, allMoves[MOVE_OVERRIDE].pp)); this.moveset[0] = new PokemonMove(MOVE_OVERRIDE, Math.min(this.moveset[0].ppUsed, allMoves[MOVE_OVERRIDE].pp));
else if (OPP_MOVE_OVERRIDE && !this.isPlayer()) else if (OPP_MOVE_OVERRIDE && !this.isPlayer())
this.moveset[0] = new PokemonMove(OPP_MOVE_OVERRIDE, Math.min(this.moveset[0].ppUsed, allMoves[OPP_MOVE_OVERRIDE].pp)); this.moveset[0] = new PokemonMove(OPP_MOVE_OVERRIDE, Math.min(this.moveset[0].ppUsed, allMoves[OPP_MOVE_OVERRIDE].pp));
if (MOVE_OVERRIDE_2 && this.isPlayer())
this.moveset[1] = new PokemonMove(MOVE_OVERRIDE_2, Math.min(this.moveset[1].ppUsed, allMoves[MOVE_OVERRIDE_2].pp));
else if (OPP_MOVE_OVERRIDE_2 && !this.isPlayer())
this.moveset[1] = new PokemonMove(OPP_MOVE_OVERRIDE_2, Math.min(this.moveset[1].ppUsed, allMoves[OPP_MOVE_OVERRIDE_2].pp));
return ret; return ret;
} }
@ -1179,6 +1197,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return this.battleInfo.updateInfo(this, instant); return this.battleInfo.updateInfo(this, instant);
} }
toggleStats(visible: boolean): void {
this.battleInfo.toggleStats(visible);
}
addExp(exp: integer) { addExp(exp: integer) {
const maxExpLevel = this.scene.getMaxExpLevel(); const maxExpLevel = this.scene.getMaxExpLevel();
const initialExp = this.exp; const initialExp = this.exp;
@ -1315,7 +1337,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
const sourceAtk = new Utils.IntegerHolder(source.getBattleStat(isPhysical ? Stat.ATK : Stat.SPATK, this, null, isCritical)); const sourceAtk = new Utils.IntegerHolder(source.getBattleStat(isPhysical ? Stat.ATK : Stat.SPATK, this, null, isCritical));
const targetDef = new Utils.IntegerHolder(this.getBattleStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical)); const targetDef = new Utils.IntegerHolder(this.getBattleStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical));
const criticalMultiplier = isCritical ? 1.5 : 1; const criticalMultiplier = new Utils.NumberHolder(isCritical ? 1.5 : 1);
applyAbAttrs(MultCritAbAttr, source, null, criticalMultiplier);
const screenMultiplier = new Utils.NumberHolder(1); const screenMultiplier = new Utils.NumberHolder(1);
if (!isCritical) { if (!isCritical) {
this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, move.category, this.scene.currentBattle.double, screenMultiplier); this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, move.category, this.scene.currentBattle.double, screenMultiplier);
@ -1338,7 +1361,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); applyMoveAttrs(VariableDefAttr, source, this, move, targetDef);
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 * screenMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier); damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier * 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) {
const burnDamageReductionCancelled = new Utils.BooleanHolder(false); const burnDamageReductionCancelled = new Utils.BooleanHolder(false);
applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled); applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled);
@ -1406,7 +1429,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
damage.value = this.damageAndUpdate(damage.value, result as DamageResult, isCritical, oneHitKo, oneHitKo); damage.value = this.damageAndUpdate(damage.value, result as DamageResult, isCritical, oneHitKo, oneHitKo);
this.turnData.damageTaken += damage.value; this.turnData.damageTaken += damage.value;
if (isCritical) if (isCritical)
this.scene.queueMessage('A critical hit!'); this.scene.queueMessage(i18next.t('battle:hitResultCriticalHit'));
this.scene.setPhaseQueueSplice(); this.scene.setPhaseQueueSplice();
if (source.isPlayer()) { if (source.isPlayer()) {
this.scene.validateAchvs(DamageAchv, damage); this.scene.validateAchvs(DamageAchv, damage);
@ -1424,16 +1447,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (source.turnData.hitsLeft === 1) { if (source.turnData.hitsLeft === 1) {
switch (result) { switch (result) {
case HitResult.SUPER_EFFECTIVE: case HitResult.SUPER_EFFECTIVE:
this.scene.queueMessage('It\'s super effective!'); this.scene.queueMessage(i18next.t('battle:hitResultSuperEffective'));
break; break;
case HitResult.NOT_VERY_EFFECTIVE: case HitResult.NOT_VERY_EFFECTIVE:
this.scene.queueMessage('It\'s not very effective…'); this.scene.queueMessage(i18next.t('battle:hitResultNotVeryEffective'));
break; break;
case HitResult.NO_EFFECT: case HitResult.NO_EFFECT:
this.scene.queueMessage(`It doesn\'t affect ${this.name}!`); this.scene.queueMessage(i18next.t('battle:hitResultNoEffect', { pokemonName: this.name }));
break; break;
case HitResult.ONE_HIT_KO: case HitResult.ONE_HIT_KO:
this.scene.queueMessage('It\'s a one-hit KO!'); this.scene.queueMessage(i18next.t('battle:hitResultOneHitKO'));
break; break;
} }
} }
@ -1450,7 +1473,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, battlerMove, cancelled, typeMultiplier)); defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, battlerMove, cancelled, typeMultiplier));
} }
if (!typeMultiplier.value) if (!typeMultiplier.value)
this.scene.queueMessage(`It doesn\'t affect ${this.name}!`); this.scene.queueMessage(i18next.t('battle:hitResultNoEffect', { pokemonName: this.name }));
result = cancelled.value || !typeMultiplier.value ? HitResult.NO_EFFECT : HitResult.STATUS; result = cancelled.value || !typeMultiplier.value ? HitResult.NO_EFFECT : HitResult.STATUS;
break; break;
} }
@ -1620,6 +1643,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.summonData.tags.push(tag); this.summonData.tags.push(tag);
if (this instanceof PlayerPokemon && source.summonData.battleStats.find(bs => bs === 6)) if (this instanceof PlayerPokemon && source.summonData.battleStats.find(bs => bs === 6))
this.scene.validateAchv(achvs.TRANSFER_MAX_BATTLE_STAT); this.scene.validateAchv(achvs.TRANSFER_MAX_BATTLE_STAT);
this.updateInfo();
} }
getMoveHistory(): TurnMove[] { getMoveHistory(): TurnMove[] {
@ -1920,6 +1944,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
this.summonDataPrimer = null; this.summonDataPrimer = null;
} }
this.updateInfo();
} }
resetBattleData(): void { resetBattleData(): void {
@ -2349,6 +2374,37 @@ export class PlayerPokemon extends Pokemon {
}); });
} }
addFriendship(friendship: integer): void {
const starterSpeciesId = this.species.getRootSpeciesId();
const fusionStarterSpeciesId = this.isFusion() ? this.fusionSpecies.getRootSpeciesId() : 0;
const starterData = [
this.scene.gameData.starterData[starterSpeciesId],
fusionStarterSpeciesId ? this.scene.gameData.starterData[fusionStarterSpeciesId] : null
].filter(d => d);
const amount = new Utils.IntegerHolder(friendship);
const starterAmount = new Utils.IntegerHolder(Math.floor(friendship * (this.scene.gameMode.isClassic ? 2 : 1) / (fusionStarterSpeciesId ? 2 : 1)));
if (amount.value > 0) {
this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, amount);
this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, starterAmount);
this.friendship = Math.min(this.friendship + amount.value, 255);
if (this.friendship === 255)
this.scene.validateAchv(achvs.MAX_FRIENDSHIP);
starterData.forEach((sd: StarterDataEntry, i: integer) => {
const speciesId = !i ? starterSpeciesId : fusionStarterSpeciesId as Species;
sd.friendship = (sd.friendship || 0) + starterAmount.value;
if (sd.friendship >= getStarterValueFriendshipCap(speciesStarters[speciesId])) {
this.scene.gameData.addStarterCandy(getPokemonSpecies(speciesId), 1);
sd.friendship = 0;
}
});
} else {
this.friendship = Math.max(this.friendship + amount.value, 0);
for (let sd of starterData)
sd.friendship = Math.max((sd.friendship || 0) + starterAmount.value, 0);
}
}
getPossibleEvolution(evolution: SpeciesFormEvolution): Promise<Pokemon> { getPossibleEvolution(evolution: SpeciesFormEvolution): Promise<Pokemon> {
return new Promise(resolve => { return new Promise(resolve => {
const evolutionSpecies = getPokemonSpecies(evolution.speciesId); const evolutionSpecies = getPokemonSpecies(evolution.speciesId);
@ -2415,12 +2471,18 @@ export class PlayerPokemon extends Pokemon {
private handleSpecialEvolutions(evolution: SpeciesFormEvolution) { private handleSpecialEvolutions(evolution: SpeciesFormEvolution) {
const isFusion = evolution instanceof FusionSpeciesFormEvolution; const isFusion = evolution instanceof FusionSpeciesFormEvolution;
if ((!isFusion ? this.species : this.fusionSpecies).speciesId === Species.NINCADA && evolution.speciesId === Species.NINJASK) {
const newEvolution = pokemonEvolutions[this.species.speciesId][1]; const evoSpecies = (!isFusion ? this.species : this.fusionSpecies)
if (evoSpecies.speciesId === Species.NINCADA && evolution.speciesId === Species.NINJASK) {
const newEvolution = pokemonEvolutions[evoSpecies.speciesId][1];
if (newEvolution.condition.predicate(this)) { if (newEvolution.condition.predicate(this)) {
const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, undefined, this.shiny, this.variant, this.ivs, this.nature); const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, undefined, this.shiny, this.variant, this.ivs, this.nature);
newPokemon.natureOverride = this.natureOverride; newPokemon.natureOverride = this.natureOverride;
newPokemon.passive = this.passive;
newPokemon.moveset = this.moveset.slice(); newPokemon.moveset = this.moveset.slice();
newPokemon.moveset = this.copyMoveset();
newPokemon.luck = this.luck;
newPokemon.fusionSpecies = this.fusionSpecies; newPokemon.fusionSpecies = this.fusionSpecies;
newPokemon.fusionFormIndex = this.fusionFormIndex; newPokemon.fusionFormIndex = this.fusionFormIndex;
newPokemon.fusionAbilityIndex = this.fusionAbilityIndex; newPokemon.fusionAbilityIndex = this.fusionAbilityIndex;
@ -2428,8 +2490,9 @@ export class PlayerPokemon extends Pokemon {
newPokemon.fusionVariant = this.fusionVariant; newPokemon.fusionVariant = this.fusionVariant;
newPokemon.fusionGender = this.fusionGender; newPokemon.fusionGender = this.fusionGender;
newPokemon.fusionLuck = this.fusionLuck; newPokemon.fusionLuck = this.fusionLuck;
this.scene.getParty().push(newPokemon); this.scene.getParty().push(newPokemon);
newPokemon.evolve(newEvolution); newPokemon.evolve(!isFusion ? newEvolution : new FusionSpeciesFormEvolution(this.id, newEvolution));
const modifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier const modifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier
&& (m as PokemonHeldItemModifier).pokemonId === this.id, true) as PokemonHeldItemModifier[]; && (m as PokemonHeldItemModifier).pokemonId === this.id, true) as PokemonHeldItemModifier[];
modifiers.forEach(m => { modifiers.forEach(m => {
@ -2527,6 +2590,15 @@ export class PlayerPokemon extends Pokemon {
this.updateFusionPalette(); this.updateFusionPalette();
}); });
} }
/** Returns a deep copy of this Pokemon's moveset array */
copyMoveset(): PokemonMove[] {
let newMoveset = [];
this.moveset.forEach(move =>
newMoveset.push(new PokemonMove(move.moveId, 0, move.ppUp, move.virtual)));
return newMoveset;
}
} }
export class EnemyPokemon extends Pokemon { export class EnemyPokemon extends Pokemon {
@ -2665,9 +2737,13 @@ export class EnemyPokemon extends Pokemon {
let targetScores: integer[] = []; let targetScores: integer[] = [];
for (let mt of moveTargets[move.id]) { for (let mt of moveTargets[move.id]) {
// Prevent a target score from being calculated when the target is whoever attacks the user
if (mt === BattlerIndex.ATTACKER)
break;
const target = this.scene.getField()[mt]; const target = this.scene.getField()[mt];
let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1);
if (move.name.endsWith(' (N)')) if (move.name.endsWith(' (N)') || !move.applyConditions(this, target, move))
targetScore = -20; targetScore = -20;
else if (move instanceof AttackMove) { else if (move instanceof AttackMove) {
const effectiveness = target.getAttackMoveEffectiveness(this, pokemonMove); const effectiveness = target.getAttackMoveEffectiveness(this, pokemonMove);
@ -2735,8 +2811,14 @@ export class EnemyPokemon extends Pokemon {
return scoreA < scoreB ? 1 : scoreA > scoreB ? -1 : 0; return scoreA < scoreB ? 1 : scoreA > scoreB ? -1 : 0;
}); });
if (!sortedBenefitScores.length) if (!sortedBenefitScores.length) {
// Set target to BattlerIndex.ATTACKER when using a counter move
// This is the same as when the player does so
if (!!move.findAttr(attr => attr instanceof CounterDamageAttr))
return [BattlerIndex.ATTACKER];
return []; return [];
}
let targetWeights = sortedBenefitScores.map(s => s[1]); let targetWeights = sortedBenefitScores.map(s => s[1]);
const lowestWeight = targetWeights[targetWeights.length - 1]; const lowestWeight = targetWeights[targetWeights.length - 1];
@ -2987,6 +3069,7 @@ export class PokemonSummonData {
export class PokemonBattleData { export class PokemonBattleData {
public hitCount: integer = 0; public hitCount: integer = 0;
public endured: boolean = false; public endured: boolean = false;
public berriesEaten: BerryType[] = [];
} }
export class PokemonBattleSummonData { export class PokemonBattleSummonData {

View File

@ -31,6 +31,8 @@ export class LoadingScene extends SceneBase {
this.loadAtlas('bg', 'ui'); this.loadAtlas('bg', 'ui');
this.loadImage('command_fight_labels', 'ui'); this.loadImage('command_fight_labels', 'ui');
this.loadAtlas('prompt', 'ui'); this.loadAtlas('prompt', 'ui');
this.loadImage('candy', 'ui');
this.loadImage('candy_overlay', 'ui');
this.loadImage('cursor', 'ui'); this.loadImage('cursor', 'ui');
this.loadImage('cursor_reverse', 'ui'); this.loadImage('cursor_reverse', 'ui');
for (let wv of Utils.getEnumValues(WindowVariant)) { for (let wv of Utils.getEnumValues(WindowVariant)) {
@ -39,15 +41,21 @@ export class LoadingScene extends SceneBase {
} }
this.loadAtlas('namebox', 'ui'); this.loadAtlas('namebox', 'ui');
this.loadImage('pbinfo_player', 'ui'); this.loadImage('pbinfo_player', 'ui');
this.loadImage('pbinfo_player_stats', 'ui');
this.loadImage('pbinfo_player_mini', 'ui'); this.loadImage('pbinfo_player_mini', 'ui');
this.loadImage('pbinfo_player_mini_stats', 'ui');
this.loadAtlas('pbinfo_player_type', 'ui'); this.loadAtlas('pbinfo_player_type', 'ui');
this.loadAtlas('pbinfo_player_type1', 'ui'); this.loadAtlas('pbinfo_player_type1', 'ui');
this.loadAtlas('pbinfo_player_type2', 'ui'); this.loadAtlas('pbinfo_player_type2', 'ui');
this.loadImage('pbinfo_enemy_mini', 'ui'); this.loadImage('pbinfo_enemy_mini', 'ui');
this.loadImage('pbinfo_enemy_mini_stats', 'ui');
this.loadImage('pbinfo_enemy_boss', 'ui'); this.loadImage('pbinfo_enemy_boss', 'ui');
this.loadImage('pbinfo_enemy_boss_stats', 'ui');
this.loadAtlas('pbinfo_enemy_type', 'ui'); this.loadAtlas('pbinfo_enemy_type', 'ui');
this.loadAtlas('pbinfo_enemy_type1', 'ui'); this.loadAtlas('pbinfo_enemy_type1', 'ui');
this.loadAtlas('pbinfo_enemy_type2', 'ui'); this.loadAtlas('pbinfo_enemy_type2', 'ui');
this.loadAtlas('pbinfo_stat', 'ui');
this.loadAtlas('pbinfo_stat_numbers', 'ui');
this.loadImage('overlay_lv', 'ui'); this.loadImage('overlay_lv', 'ui');
this.loadAtlas('numbers', 'ui'); this.loadAtlas('numbers', 'ui');
this.loadAtlas('numbers_red', 'ui'); this.loadAtlas('numbers_red', 'ui');
@ -61,6 +69,7 @@ export class LoadingScene extends SceneBase {
this.loadImage('achv_bar_2', 'ui'); this.loadImage('achv_bar_2', 'ui');
this.loadImage('achv_bar_3', 'ui'); this.loadImage('achv_bar_3', 'ui');
this.loadImage('achv_bar_4', 'ui'); this.loadImage('achv_bar_4', 'ui');
this.loadImage('achv_bar_5', 'ui');
this.loadImage('shiny_star', 'ui', 'shiny.png'); this.loadImage('shiny_star', 'ui', 'shiny.png');
this.loadImage('shiny_star_1', 'ui', 'shiny_1.png'); this.loadImage('shiny_star_1', 'ui', 'shiny_1.png');
this.loadImage('shiny_star_2', 'ui', 'shiny_2.png'); this.loadImage('shiny_star_2', 'ui', 'shiny_2.png');
@ -216,6 +225,7 @@ export class LoadingScene extends SceneBase {
this.loadSe('sparkle'); this.loadSe('sparkle');
this.loadSe('restore'); this.loadSe('restore');
this.loadSe('shine'); this.loadSe('shine');
this.loadSe('shing');
this.loadSe('charge'); this.loadSe('charge');
this.loadSe('beam'); this.loadSe('beam');
this.loadSe('upgrade'); this.loadSe('upgrade');

52
src/locales/de/battle.ts Normal file
View File

@ -0,0 +1,52 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} erscheint.",
"trainerAppeared": "{{trainerName}}\nmöchte kämpfen!",
"singleWildAppeared": "Ein wildes {{pokemonName}} erscheint!",
"multiWildAppeared": "Ein wildes {{pokemonName1}}\nund {{pokemonName2}} erscheinen!",
"playerComeBack": "Komm zurück, {{pokemonName}}!",
"trainerComeBack": "{{trainerName}} ruft {{pokemonName}} zurück!",
"playerGo": "Los! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!",
"switchQuestion": "Willst du\n{{pokemonName}} auswechseln?",
"trainerDefeated": `You defeated\n{{trainerName}}!`,
"pokemonCaught": "{{pokemonName}} was caught!",
"pokemon": "Pokémon",
"sendOutPokemon": "Los! {{pokemonName}}!",
"hitResultCriticalHit": "A critical hit!",
"hitResultSuperEffective": "It's super effective!",
"hitResultNotVeryEffective": "It's not very effective…",
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!",
"hitResultOneHitKO": "It's a one-hit KO!",
"attackFailed": "But it failed!",
"attackHitsCount": `Hit {{count}} time(s)!`,
"expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!",
"levelUp": "{{pokemonName}} grew to\nLv. {{level}}!",
"learnMove": "{{pokemonName}} learned\n{{moveName}}!",
"learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.",
"learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.",
"learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?",
"learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
"learnMoveForgetQuestion": "Which move should be forgotten?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
"levelCapUp": "Das Levellimit\nhat sich zu {{levelCap}} erhöht!",
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",
"moveDisabled": "{{moveName}} ist deaktiviert!",
"noPokeballForce": "Eine unsichtbare Kraft\nverhindert die Nutzung von Pokébällen.",
"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!",
"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.",
"noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!",
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!",
"runAwaySuccess": "You got away safely!",
"runAwayCannotEscape": 'You can\'t escape!',
"escapeVerbSwitch": "auswechseln",
"escapeVerbFlee": "flucht",
"notDisabled": "{{moveName}} ist\nnicht mehr deaktiviert!",
"skipItemQuestion": "Are you sure you want to skip taking an item?",
"eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?"
} as const;

View File

@ -0,0 +1,6 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP",
"power": "POWER",
} as const;

View File

@ -35,33 +35,13 @@ 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",
"bossAppeared": "{{bossName}} erscheint.",
"trainerAppeared": "{{trainerName}}\nmöchte kämpfen!",
"singleWildAppeared": "Ein wildes {{pokemonName}} erscheint!",
"multiWildAppeared": "Ein wildes {{pokemonName1}}\nund {{pokemonName2}} erscheinen!",
"playerComeBack": "Komm zurück, {{pokemonName}}!",
"trainerComeBack": "{{trainerName}} ruft {{pokemonName}} zurück!",
"playerGo": "Los! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!",
"switchQuestion": "Willst du\n{{pokemonName}} auswechseln?",
"pokemon": "Pokémon",
"sendOutPokemon": "Los! {{pokemonName}}!",
"levelCapUp": "Das Levellimit\nhat sich zu {{levelCap}} erhöht!",
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",
"moveDisabled": "{{moveName}} ist deaktiviert!",
"noPokeballForce": "Eine unsichtbare Kraft\nverhindert die Nutzung von Pokébällen.",
"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!",
"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.",
"noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!",
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!",
"escapeVerbSwitch": "auswechseln",
"escapeVerbFlee": "flucht",
"notDisabled": "{{moveName}} ist\nnicht mehr deaktiviert!",
"rankings": "Rankings",
"dailyRankings": "Daily Rankings", "dailyRankings": "Daily Rankings",
"weeklyRankings": "Weekly Rankings",
"noRankings": "No Rankings", "noRankings": "No Rankings",
"loading": "Loading…", "loading": "Loading…",
"playersOnline": "Players Online" "playersOnline": "Players Online",
"empty":"Empty",
"yes":"Yes",
"no":"No",
"confirmStartTeam":'Begin with these Pokémon?',
} as const; } as const;

View File

@ -605,208 +605,208 @@ export const pokemon: SimpleTranslationEntries = {
"tynamo": "Zapplardin", "tynamo": "Zapplardin",
"eelektrik": "Zapplalek", "eelektrik": "Zapplalek",
"eelektross": "Zapplarang", "eelektross": "Zapplarang",
"elgyem": "Elgyem", "elgyem": "Pygraulon",
"beheeyem": "Beheeyem", "beheeyem": "Megalon",
"litwick": "Litwick", "litwick": "Lichtel",
"lampent": "Lampent", "lampent": "Laternecto",
"chandelure": "Chandelure", "chandelure": "Skelabra",
"axew": "Axew", "axew": "Milza",
"fraxure": "Fraxure", "fraxure": "Scharfax",
"haxorus": "Haxorus", "haxorus": "Maxax",
"cubchoo": "Cubchoo", "cubchoo": "Petznief",
"beartic": "Beartic", "beartic": "Siberio",
"cryogonal": "Cryogonal", "cryogonal": "Frigometri",
"shelmet": "Shelmet", "shelmet": "Schnuthelm",
"accelgor": "Accelgor", "accelgor": "Hydragil",
"stunfisk": "Stunfisk", "stunfisk": "Flunschlik",
"mienfoo": "Mienfoo", "mienfoo": "Lin-Fu",
"mienshao": "Mienshao", "mienshao": "Wie-Shu",
"druddigon": "Druddigon", "druddigon": "Shardrago",
"golett": "Golett", "golett": "Golbit",
"golurk": "Golurk", "golurk": "Golgantes",
"pawniard": "Pawniard", "pawniard": "Gladiantri",
"bisharp": "Bisharp", "bisharp": "Ceasurio",
"bouffalant": "Bouffalant", "bouffalant": "Bisofank",
"rufflet": "Rufflet", "rufflet": "Geronimatz",
"braviary": "Braviary", "braviary": "Washakwil",
"vullaby": "Vullaby", "vullaby": "Skallyk",
"mandibuzz": "Mandibuzz", "mandibuzz": "Grypheldis",
"heatmor": "Heatmor", "heatmor": "Furnifraß",
"durant": "Durant", "durant": "Fermicula",
"deino": "Deino", "deino": "Kapuno",
"zweilous": "Zweilous", "zweilous": "Duodino",
"hydreigon": "Hydreigon", "hydreigon": "Trikephalo",
"larvesta": "Larvesta", "larvesta": "Ignivor",
"volcarona": "Volcarona", "volcarona": "Ramoth",
"cobalion": "Cobalion", "cobalion": "Kobalium",
"terrakion": "Terrakion", "terrakion": "Terrakium",
"virizion": "Virizion", "virizion": "Viridium",
"tornadus": "Tornadus", "tornadus": "Boreos",
"thundurus": "Thundurus", "thundurus": "Voltolos",
"reshiram": "Reshiram", "reshiram": "Reshiram",
"zekrom": "Zekrom", "zekrom": "Zekrom",
"landorus": "Landorus", "landorus": "Dementeros",
"kyurem": "Kyurem", "kyurem": "Kyurem",
"keldeo": "Keldeo", "keldeo": "Keldeo",
"meloetta": "Meloetta", "meloetta": "Meloetta",
"genesect": "Genesect", "genesect": "Genesect",
"chespin": "Chespin", "chespin": "Igamaro",
"quilladin": "Quilladin", "quilladin": "Igastarnish",
"chesnaught": "Chesnaught", "chesnaught": "Brigaron",
"fennekin": "Fennekin", "fennekin": "Fynx",
"braixen": "Braixen", "braixen": "Rutena",
"delphox": "Delphox", "delphox": "Fennexis",
"froakie": "Froakie", "froakie": "Froxy",
"frogadier": "Frogadier", "frogadier": "Amphizel",
"greninja": "Greninja", "greninja": "Quajutsu",
"bunnelby": "Bunnelby", "bunnelby": "Scoppel",
"diggersby": "Diggersby", "diggersby": "Grebbit",
"fletchling": "Fletchling", "fletchling": "Dartiri",
"fletchinder": "Fletchinder", "fletchinder": "Dartignis",
"talonflame": "Talonflame", "talonflame": "Fiaro",
"scatterbug": "Scatterbug", "scatterbug": "Purmel",
"spewpa": "Spewpa", "spewpa": "Puponcho",
"vivillon": "Vivillon", "vivillon": "Vivillon",
"litleo": "Litleo", "litleo": "Leufeo",
"pyroar": "Pyroar", "pyroar": "Pyroleo",
"flabebe": "Flabébé", "flabebe": "Flabébé",
"floette": "Floette", "floette": "Floette",
"florges": "Florges", "florges": "Florges",
"skiddo": "Skiddo", "skiddo": "Mähikel",
"gogoat": "Gogoat", "gogoat": "Chevrumm",
"pancham": "Pancham", "pancham": "Pam-Pam",
"pangoro": "Pangoro", "pangoro": "Pandrago",
"furfrou": "Furfrou", "furfrou": "Coiffwaff",
"espurr": "Espurr", "espurr": "Psiau",
"meowstic": "Meowstic", "meowstic": "Psiaugon",
"honedge": "Honedge", "honedge": "Gramokles",
"doublade": "Doublade", "doublade": "Duokles",
"aegislash": "Aegislash", "aegislash": "Durengard",
"spritzee": "Spritzee", "spritzee": "Parfi",
"aromatisse": "Aromatisse", "aromatisse": "Parfinesse",
"swirlix": "Swirlix", "swirlix": "Flauschling",
"slurpuff": "Slurpuff", "slurpuff": "Sabbaione",
"inkay": "Inkay", "inkay": "Iscalar",
"malamar": "Malamar", "malamar": "Calamanero",
"binacle": "Binacle", "binacle": "Bithora",
"barbaracle": "Barbaracle", "barbaracle": "Thanathora",
"skrelp": "Skrelp", "skrelp": "Algitt",
"dragalge": "Dragalge", "dragalge": "Tandrak",
"clauncher": "Clauncher", "clauncher": "Scampisto",
"clawitzer": "Clawitzer", "clawitzer": "Wummer",
"helioptile": "Helioptile", "helioptile": "Eguana",
"heliolisk": "Heliolisk", "heliolisk": "Elezard",
"tyrunt": "Tyrunt", "tyrunt": "Balgoras",
"tyrantrum": "Tyrantrum", "tyrantrum": "Monargoras",
"amaura": "Amaura", "amaura": "Amarino",
"aurorus": "Aurorus", "aurorus": "Amagarga",
"sylveon": "Sylveon", "sylveon": "Feelinara",
"hawlucha": "Hawlucha", "hawlucha": "Resladero",
"dedenne": "Dedenne", "dedenne": "Dedenne",
"carbink": "Carbink", "carbink": "Rocara",
"goomy": "Goomy", "goomy": "Viscora",
"sliggoo": "Sliggoo", "sliggoo": "Viscargot",
"goodra": "Goodra", "goodra": "Viscogon",
"klefki": "Klefki", "klefki": "Clavion",
"phantump": "Phantump", "phantump": "Paragoni",
"trevenant": "Trevenant", "trevenant": "Trombork",
"pumpkaboo": "Pumpkaboo", "pumpkaboo": "Irrbis",
"gourgeist": "Gourgeist", "gourgeist": "Pumpdjinn",
"bergmite": "Bergmite", "bergmite": "Arktip",
"avalugg": "Avalugg", "avalugg": "Arktilas",
"noibat": "Noibat", "noibat": "eF-eM",
"noivern": "Noivern", "noivern": "UHaFnir",
"xerneas": "Xerneas", "xerneas": "Xerneas",
"yveltal": "Yveltal", "yveltal": "Yveltal",
"zygarde": "Zygarde", "zygarde": "Zygarde",
"diancie": "Diancie", "diancie": "Diancie",
"hoopa": "Hoopa", "hoopa": "Hoopa",
"volcanion": "Volcanion", "volcanion": "Volcanion",
"rowlet": "Rowlet", "rowlet": "Bauz",
"dartrix": "Dartrix", "dartrix": "Arboretoss",
"decidueye": "Decidueye", "decidueye": "Silvarro",
"litten": "Litten", "litten": "Flamiau",
"torracat": "Torracat", "torracat": "Miezunder",
"incineroar": "Incineroar", "incineroar": "Fuegro",
"popplio": "Popplio", "popplio": "Robball",
"brionne": "Brionne", "brionne": "Marikeck",
"primarina": "Primarina", "primarina": "Primarene",
"pikipek": "Pikipek", "pikipek": "Peppeck",
"trumbeak": "Trumbeak", "trumbeak": "Trompeck",
"toucannon": "Toucannon", "toucannon": "Tukanon",
"yungoos": "Yungoos", "yungoos": "Mangunior",
"gumshoos": "Gumshoos", "gumshoos": "Manguspektor",
"grubbin": "Grubbin", "grubbin": "Mabula",
"charjabug": "Charjabug", "charjabug": "Akkup",
"vikavolt": "Vikavolt", "vikavolt": "Donarion",
"crabrawler": "Crabrawler", "crabrawler": "Krabbox",
"crabominable": "Crabominable", "crabominable": "Krawell",
"oricorio": "Oricorio", "oricorio": "Choreogel",
"cutiefly": "Cutiefly", "cutiefly": "Wommel",
"ribombee": "Ribombee", "ribombee": "Bandelby",
"rockruff": "Rockruff", "rockruff": "Wuffels",
"lycanroc": "Lycanroc", "lycanroc": "Wolwerock",
"wishiwashi": "Wishiwashi", "wishiwashi": "Lusardin",
"mareanie": "Mareanie", "mareanie": "Garstella",
"toxapex": "Toxapex", "toxapex": "Aggrostella",
"mudbray": "Mudbray", "mudbray": "Pampuli",
"mudsdale": "Mudsdale", "mudsdale": "Pampross",
"dewpider": "Dewpider", "dewpider": "Araqua",
"araquanid": "Araquanid", "araquanid": "Aranestro",
"fomantis": "Fomantis", "fomantis": "Imantis",
"lurantis": "Lurantis", "lurantis": "Mantidea",
"morelull": "Morelull", "morelull": "Bubungus",
"shiinotic": "Shiinotic", "shiinotic": "Lamellus",
"salandit": "Salandit", "salandit": "Molunk",
"salazzle": "Salazzle", "salazzle": "Amfira",
"stufful": "Stufful", "stufful": "Velursi",
"bewear": "Bewear", "bewear": "Kosturso",
"bounsweet": "Bounsweet", "bounsweet": "Frubberl",
"steenee": "Steenee", "steenee": "Frubaila",
"tsareena": "Tsareena", "tsareena": "Fruyal",
"comfey": "Comfey", "comfey": "Curelei",
"oranguru": "Oranguru", "oranguru": "Kommandutan",
"passimian": "Passimian", "passimian": "Quartermak",
"wimpod": "Wimpod", "wimpod": "Reißlaus",
"golisopod": "Golisopod", "golisopod": "Tectass",
"sandygast": "Sandygast", "sandygast": "Sankabuh",
"palossand": "Palossand", "palossand": "Colossand",
"pyukumuku": "Pyukumuku", "pyukumuku": "Gufa",
"type_null": "Type: Null", "type_null": "Typ:Null",
"silvally": "Silvally", "silvally": "Amigento",
"minior": "Minior", "minior": "Meteno",
"komala": "Komala", "komala": "Koalelu",
"turtonator": "Turtonator", "turtonator": "Turtonator",
"togedemaru": "Togedemaru", "togedemaru": "Togedemaru",
"mimikyu": "Mimikyu", "mimikyu": "Mimigma",
"bruxish": "Bruxish", "bruxish": "Knirfish",
"drampa": "Drampa", "drampa": "Sen-Long",
"dhelmise": "Dhelmise", "dhelmise": "Moruda",
"jangmo_o": "Jangmo-o", "jangmo_o": "Miniras",
"hakamo_o": "Hakamo-o", "hakamo_o": "Mediras",
"kommo_o": "Kommo-o", "kommo_o": "Grandiras",
"tapu_koko": "Tapu Koko", "tapu_koko": "Kapu-Riki",
"tapu_lele": "Tapu Lele", "tapu_lele": "Kapu-Fala",
"tapu_bulu": "Tapu Bulu", "tapu_bulu": "Kapu-Toro",
"tapu_fini": "Tapu Fini", "tapu_fini": "Kapu-Kime",
"cosmog": "Cosmog", "cosmog": "Cosmog",
"cosmoem": "Cosmoem", "cosmoem": "Cosmovum",
"solgaleo": "Solgaleo", "solgaleo": "Solgaleo",
"lunala": "Lunala", "lunala": "Lunala",
"nihilego": "Nihilego", "nihilego": "Anego",
"buzzwole": "Buzzwole", "buzzwole": "Masskito",
"pheromosa": "Pheromosa", "pheromosa": "Schabelle",
"xurkitree": "Xurkitree", "xurkitree": "Voltriant",
"celesteela": "Celesteela", "celesteela": "Kaguron",
"kartana": "Kartana", "kartana": "Katagami",
"guzzlord": "Guzzlord", "guzzlord": "Schlingking",
"necrozma": "Necrozma", "necrozma": "Necrozma",
"magearna": "Magearna", "magearna": "Magearna",
"marshadow": "Marshadow", "marshadow": "Marshadow",
"poipole": "Poipole", "poipole": "Venicro",
"naganadel": "Naganadel", "naganadel": "Agoyon",
"stakataka": "Stakataka", "stakataka": "Muramura",
"blacephalon": "Blacephalon", "blacephalon": "Kopplosio",
"zeraora": "Zeraora", "zeraora": "Zeraora",
"meltan": "Meltan", "meltan": "Meltan",
"melmetal": "Melmetal", "melmetal": "Melmetal",

View File

@ -20,6 +20,10 @@ export const tutorial: SimpleTranslationEntries = {
"pokerus": `A daily random 3 selectable starters have a purple border. "pokerus": `A daily random 3 selectable starters have a purple border.
$If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`, $If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`,
"statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled.
$Your Pokémon are recalled before a trainer battle and before entering a new biome.
$You can also view the stat changes for the Pokémon on the field by holding C or Shift.`,
"selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one.
$These range from consumables, to Pokémon held items, to passive permanent items. $These range from consumables, to Pokémon held items, to passive permanent items.
$Most non-consumable item effects will stack in various ways. $Most non-consumable item effects will stack in various ways.

52
src/locales/en/battle.ts Normal file
View File

@ -0,0 +1,52 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} appeared.",
"trainerAppeared": "{{trainerName}}\nwould like to battle!",
"singleWildAppeared": "A wild {{pokemonName}} appeared!",
"multiWildAppeared": "A wild {{pokemonName1}}\nand {{pokemonName2}} appeared!",
"playerComeBack": "Come back, {{pokemonName}}!",
"trainerComeBack": "{{trainerName}} withdrew {{pokemonName}}!",
"playerGo": "Go! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sent out {{pokemonName}}!",
"switchQuestion": "Will you switch\n{{pokemonName}}?",
"trainerDefeated": `You defeated\n{{trainerName}}!`,
"pokemonCaught": "{{pokemonName}} was caught!",
"pokemon": "Pokémon",
"sendOutPokemon": "Go! {{pokemonName}}!",
"hitResultCriticalHit": "A critical hit!",
"hitResultSuperEffective": "It's super effective!",
"hitResultNotVeryEffective": "It's not very effective…",
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!",
"hitResultOneHitKO": "It's a one-hit KO!",
"attackFailed": "But it failed!",
"attackHitsCount": `Hit {{count}} time(s)!`,
"expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!",
"levelUp": "{{pokemonName}} grew to\nLv. {{level}}!",
"learnMove": "{{pokemonName}} learned\n{{moveName}}!",
"learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.",
"learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.",
"learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?",
"learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
"learnMoveForgetQuestion": "Which move should be forgotten?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
"levelCapUp": "The level cap\nhas increased to {{levelCap}}!",
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
"moveDisabled": "{{moveName}} is disabled!",
"noPokeballForce": "An unseen force\nprevents using Poké Balls.",
"noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!",
"noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!",
"noPokeballStrong": "The target Pokémon is too strong to be caught!\nYou need to weaken it first!",
"noEscapeForce": "An unseen force\nprevents escape.",
"noEscapeTrainer": "You can't run\nfrom a trainer battle!",
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nprevents {{escapeVerb}}!",
"runAwaySuccess": "You got away safely!",
"runAwayCannotEscape": 'You can\'t escape!',
"escapeVerbSwitch": "switching",
"escapeVerbFlee": "fleeing",
"notDisabled": "{{moveName}} is disabled\nno more!",
"skipItemQuestion": "Are you sure you want to skip taking an item?",
"eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?"
} as const;

View File

@ -35,52 +35,13 @@ 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",
"bossAppeared": "{{bossName}} appeared.",
"trainerAppeared": "{{trainerName}}\nwould like to battle!",
"singleWildAppeared": "A wild {{pokemonName}} appeared!",
"multiWildAppeared": "A wild {{pokemonName1}}\nand {{pokemonName2}} appeared!",
"playerComeBack": "Come back, {{pokemonName}}!",
"trainerComeBack": "{{trainerName}} withdrew {{pokemonName}}!",
"playerGo": "Go! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sent out {{pokemonName}}!",
"switchQuestion": "Will you switch\n{{pokemonName}}?",
"trainerDefeated": `You defeated\n{{trainerName}}!`,
"pokemonCaught": "{{pokemonName}} was caught!",
"pokemon": "Pokémon",
"sendOutPokemon": "Go! {{pokemonName}}!",
"attackFailed": "But it failed!",
"attackHitsCount": `Hit {{count}} time(s)!`,
"expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!",
"levelUp": "{{pokemonName}} grew to\nLv. {{level}}!",
"learnMove": "{{pokemonName}} learned\n{{moveName}}!",
"learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.",
"learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.",
"learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?",
"learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
"learnMoveForgetQuestion": "Which move should be forgotten?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
"levelCapUp": "The level cap\nhas increased to {{levelCap}}!",
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
"moveDisabled": "{{moveName}} is disabled!",
"noPokeballForce": "An unseen force\nprevents using Poké Balls.",
"noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!",
"noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!",
"noPokeballStrong": "The target Pokémon is too strong to be caught!\nYou need to weaken it first!",
"noEscapeForce": "An unseen force\nprevents escape.",
"noEscapeTrainer": "You can't run\nfrom a trainer battle!",
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nprevents {{escapeVerb}}!",
"runAwaySuccess": "You got away safely!",
"runAwayCannotEscape": 'You can\'t escape!',
"escapeVerbSwitch": "switching",
"escapeVerbFlee": "fleeing",
"notDisabled": "{{moveName}} is disabled\nno more!",
"skipItemQuestion": "Are you sure you want to skip taking an item?",
"eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?",
"rankings": "Rankings",
"dailyRankings": "Daily Rankings", "dailyRankings": "Daily Rankings",
"weeklyRankings": "Weekly Rankings",
"noRankings": "No Rankings", "noRankings": "No Rankings",
"loading": "Loading…", "loading": "Loading…",
"playersOnline": "Players Online" "playersOnline": "Players Online",
"empty":"Empty",
"yes":"Yes",
"no":"No",
"confirmStartTeam":'Begin with these Pokémon?',
} as const; } as const;

View File

@ -20,6 +20,10 @@ export const tutorial: SimpleTranslationEntries = {
"pokerus": `A daily random 3 selectable starters have a purple border. "pokerus": `A daily random 3 selectable starters have a purple border.
$If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`, $If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`,
"statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled.
$Your Pokémon are recalled before a trainer battle and before entering a new biome.
$You can also view the stat changes for the Pokémon on the field by holding C or Shift.`,
"selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one.
$These range from consumables, to Pokémon held items, to passive permanent items. $These range from consumables, to Pokémon held items, to passive permanent items.
$Most non-consumable item effects will stack in various ways. $Most non-consumable item effects will stack in various ways.

52
src/locales/es/battle.ts Normal file
View File

@ -0,0 +1,52 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "¡{{bossName}} te corta el paso!",
"trainerAppeared": "¡{{trainerName}}\nte desafía!",
"singleWildAppeared": "¡Un {{pokemonName}} salvaje te corta el paso!",
"multiWildAppeared": "¡Un {{pokemonName1}} y un {{pokemonName2}} salvajes\nte cortan el paso!",
"playerComeBack": "¡{{pokemonName}}, ven aquí!",
"trainerComeBack": "¡{{trainerName}} retira a {{pokemonName}} del combate!",
"playerGo": "¡Adelante, {{pokemonName}}!",
"trainerGo": "¡{{trainerName}} saca a {{pokemonName}}!",
"switchQuestion": "¿Quieres cambiar a\n{{pokemonName}}?",
"trainerDefeated": "¡Has derrotado a\n{{trainerName}}!",
"pokemonCaught": "¡{{pokemonName}} atrapado!",
"pokemon": "Pokémon",
"sendOutPokemon": "¡Adelante, {{pokemonName}}!",
"hitResultCriticalHit": "A critical hit!",
"hitResultSuperEffective": "It's super effective!",
"hitResultNotVeryEffective": "It's not very effective…",
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!",
"hitResultOneHitKO": "It's a one-hit KO!",
"attackFailed": "¡Pero ha fallado!",
"attackHitsCount": `N.º de golpes: {{count}}.`,
"expGain": "{{pokemonName}} ha ganado\n{{exp}} puntos de experiencia.",
"levelUp": "¡{{pokemonName}} ha subido al \nNv. {{level}}!",
"learnMove": "¡{{pokemonName}} ha aprendido {{moveName}}!",
"learnMovePrompt": "{{pokemonName}} quiere aprender {{moveName}}.",
"learnMoveLimitReached": "Pero, {{pokemonName}} ya conoce\ncuatro movimientos.",
"learnMoveReplaceQuestion": "¿Quieres sustituir uno de sus movimientos por {{moveName}}?",
"learnMoveStopTeaching": "¿Prefieres que no aprenda\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} no ha aprendido {{moveName}}.",
"learnMoveForgetQuestion": "¿Qué movimiento quieres que olvide?",
"learnMoveForgetSuccess": "{{pokemonName}} ha olvidado cómo utilizar {{moveName}}.",
"levelCapUp": "¡Se ha incrementado el\nnivel máximo a {{levelCap}}!",
"moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.",
"moveDisabled": "!No puede usar {{moveName}} porque ha sido anulado!",
"noPokeballForce": "Una fuerza misteriosa\nte impide usar Poké Balls.",
"noPokeballTrainer": "¡No puedes atrapar a los\nPokémon de los demás!",
"noPokeballMulti": "¡No se pueden lanzar Poké Balls\ncuando hay más de un Pokémon!",
"noPokeballStrong": "¡Este Pokémon es demasiado fuerte para ser capturado!\nNecesitas bajarle los PS primero!",
"noEscapeForce": "Una fuerza misteriosa\nte impide huir.",
"noEscapeTrainer": "¡No puedes huir de los\ncombates contra Entrenadores!",
"noEscapePokemon": "¡El movimiento {{moveName}} de {{pokemonName}} impide la huida!",
"runAwaySuccess": "¡Escapas sin problemas!",
"runAwayCannotEscape": "¡No has podido escapar!",
"escapeVerbSwitch": "cambiar",
"escapeVerbFlee": "huir",
"notDisabled": "¡El movimiento {{moveName}}\nya no está anulado!",
"skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?",
"eggHatching": "¿Y esto?",
"ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?"
} as const;

View File

@ -2,7 +2,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const commandUiHandler: SimpleTranslationEntries = { export const commandUiHandler: SimpleTranslationEntries = {
"fight": "Luchar", "fight": "Luchar",
"ball": "Ball", "ball": "Balls",
"pokemon": "Pokémon", "pokemon": "Pokémon",
"run": "Huir", "run": "Huir",
"actionMessage": "¿Qué debería\nhacer {{pokemonName}}?", "actionMessage": "¿Qué debería\nhacer {{pokemonName}}?",

View File

@ -0,0 +1,6 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP",
"power": "POTENCIA",
} as const;

View File

@ -19,52 +19,13 @@ 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",
"bossAppeared": "¡{{bossName}} te corta el paso!", "dailyRankings": "Rankings Diarios",
"trainerAppeared": "¡{{trainerName}}\nte desafía!", "weeklyRankings": "Rankings Semanales",
"singleWildAppeared": "¡Un {{pokemonName}} salvaje te corta el paso!", "noRankings": "Sin Rankings",
"multiWildAppeared": "¡Un {{pokemonName1}} y un {{pokemonName2}} salvajes\nte cortan el paso!", "loading": "Cargando…",
"playerComeBack": "¡{{pokemonName}}, ven aquí!", "playersOnline": "Jugadores en Línea",
"trainerComeBack": "¡{{trainerName}} retira a {{pokemonName}} del combate!", "empty":"Vacío",
"playerGo": "¡Adelante, {{pokemonName}}!", "yes":"Sí",
"trainerGo": "¡{{trainerName}} saca a {{pokemonName}}!", "no":"No",
"switchQuestion": "¿Quieres cambiar a\n{{pokemonName}}?", "confirmStartTeam":'¿Comenzar con estos Pokémon?',
"trainerDefeated": "¡Has derrotado a\n{{trainerName}}!",
"pokemonCaught": "¡{{pokemonName}} atrapado!",
"pokemon": "Pokémon",
"sendOutPokemon": "¡Adelante, {{pokemonName}}!",
"attackFailed": "¡Pero ha fallado!",
"attackHitsCount": `N.º de golpes: {{count}}.`,
"expGain": "{{pokemonName}} ha ganado\n{{exp}} puntos de experiencia.",
"levelUp": "¡{{pokemonName}} ha subido al \nNv. {{level}}!",
"learnMove": "¡{{pokemonName}} ha aprendido {{moveName}}!",
"learnMovePrompt": "{{pokemonName}} quiere aprender {{moveName}}.",
"learnMoveLimitReached": "Pero, {{pokemonName}} ya conoce\ncuatro movimientos.",
"learnMoveReplaceQuestion": "¿Quieres sustituir uno de sus movimientos por {{moveName}}?",
"learnMoveStopTeaching": "¿Prefieres que no aprenda\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} no ha aprendido {{moveName}}.",
"learnMoveForgetQuestion": "¿Qué movimiento quieres que olvide?",
"learnMoveForgetSuccess": "{{pokemonName}} ha olvidado cómo utilizar {{moveName}}.",
"levelCapUp": "¡Se ha incrementado el\nnivel máximo a {{levelCap}}!",
"moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.",
"moveDisabled": "!No puede usar {{moveName}} porque ha sido anulado!",
"noPokeballForce": "Una fuerza misteriosa\nte impide usar Poké Balls.",
"noPokeballTrainer": "¡No puedes atrapar a los\nPokémon de los demás!",
"noPokeballMulti": "¡No se pueden lanzar Poké Balls\ncuando hay más de un Pokémon!",
"noPokeballStrong": "¡Este Pokémon es demasiado fuerte para ser capturado!\nNecesitas bajarle los PS primero!",
"noEscapeForce": "Una fuerza misteriosa\nte impide huir.",
"noEscapeTrainer": "¡No puedes huir de los\ncombates contra Entrenadores!",
"noEscapePokemon": "¡El movimiento {{moveName}} de {{pokemonName}} impide la huida!",
"runAwaySuccess": "¡Escapas sin problemas!",
"runAwayCannotEscape": "¡No has podido escapar!",
"escapeVerbSwitch": "cambiar",
"escapeVerbFlee": "huir",
"notDisabled": "¡El movimiento {{moveName}}\nya no está anulado!",
"skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?",
"eggHatching": "¿Y esto?",
"ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?",
"rankings": "Rankings",
"dailyRankings": "Daily Rankings",
"noRankings": "No Rankings",
"loading": "Loading…",
"playersOnline": "Players Online"
} as const; } as const;

View File

@ -1,38 +1,49 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const tutorial: SimpleTranslationEntries = { export const tutorial: SimpleTranslationEntries = {
"intro": `Welcome to PokéRogue! This is a battle-focused Pokémon fangame with roguelite elements. "intro": `¡Bienvenido/a a PokéRogue! Este es un fangame de Pokémon centrado en el combate con elementos roguelite.
$This game is not monetized and we claim no ownership of Pokémon nor of the copyrighted assets used. $Este juego no está monetizado y no reclamamos ningún derecho de propiedad sobre Pokémon ni sobre ninguno de
$The game is a work in progress, but fully playable.\nFor bug reports, please use the Discord community. $los recursos con copyright utilizados.
$If the game runs slowly, please ensure 'Hardware Acceleration' is turned on in your browser settings.`, $El juego está en proceso, pero es completamente jugable.\nPara reportar bugs, por favor, hazlo en nuestra
$comunidad de Discord.
$Si el juego va lento, por favor, asegúrate de que tengas activada la opción 'Aceleración de gráficos' en los
$ajustes de tu navegador.`,
"accessMenu": `To access the menu, press M or Escape while awaiting input.\nThe menu contains settings and various features.`, "accessMenu": `Para acceder al menú, pulsa M o Escape cuando\ntengas el control.
$El menú contiene la configuración y otras funciones.`,
"menu": `From this menu you can access the settings. "menu": `Desde este menú podrás acceder a la configuración.
$From the settings you can change game speed, window style, and other options. $Podrás cambiar la velocidad del juego, el estilo de la ventana y demás.
$There are also various other features here, so be sure to check them all!`, $Hay más opciones, ¡así que pruébalas todas!`,
"starterSelect": `From this screen, you can select your starters.\nThese are your initial party members. "starterSelect": `En esta pantalla podrás elegir tus iniciales. Estos serán tus\nmiembros de equipo al comenzar la partida.
$Each starter has a value. Your party can have up to\n6 members as long as the total does not exceed 10. $Cada inicial tiene un valor. Tu equipo puede contener hasta 6\nmiembros mientras el valor total no pase de 10.
$You can also select gender, ability, and form depending on\nthe variants you've caught or hatched. $También puedes elegir su género, habilidad y forma\ndependiendo de las variantes que hayas conseguido.
$The IVs for a species are also the best of every one you've\ncaught or hatched, so try to get lots of the same species!`, $Los IVs de los iniciales corresponderán al valor más alto de\nlos Pokémon de la misma especie que hayas obtenido.
$¡Así que intenta conseguir muchos Pokémon de la misma\nespecie!`,
"pokerus": `A daily random 3 selectable starters have a purple border. "pokerus": `Cada día, 3 iniciales aleatorios tendrán un borde morado.
$If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`, $Si ves un inicial que tengas con este borde, prueba a\nañadirlo a tu equipo. ¡No olvides revisar sus datos!`,
"selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. "statChange": `Los cambios de estadísticas se mantienen entre combates\nmientras que el Pokémon no vuelva a la Poké Ball.
$These range from consumables, to Pokémon held items, to passive permanent items. $Tus Pokémon vuelven a sus Poké Balls antes de combates contra entrenadores y de entrar a un nuevo bioma.
$Most non-consumable item effects will stack in various ways. $También puedes ver los cambios de estadísticas del Pokémon en campo manteniendo pulsado C o Shift.`,
$Some items will only show up if they can be used, such as evolution items.
$You can also transfer held items between Pokémon using the transfer option.
$The transfer option will appear in the bottom right once you have obtained a held item.
$You may purchase consumable items with money, and a larger variety will be available the further you get.
$Be sure to buy these before you pick your random item, as it will progress to the next battle once you do.`,
"eggGacha": `From this screen, you can redeem your vouchers for\nPokémon eggs. "selectItem": `Tras cada combate, tendrás la opción de elegir entre tres objetos aleatorios. Solo podrás escoger uno.
$Eggs have to be hatched and get closer to hatching after\nevery battle. Rarer eggs take longer to hatch. $Estos objetos pueden ser consumibles, objetos equipables u objetos pasivos permanentes (hasta acabar la partida).
$Hatched Pokémon also won't be added to your party, they will\nbe added to your starters. $La mayoría de los efectos de objetos no consumibles se acumularán de varias maneras.
$Pokémon hatched from eggs generally have better IVs than\nwild Pokémon. $Algunos objetos solo aparecerán si pueden ser utilizados, como las piedras evolutivas.
$Some Pokémon can only even be obtained from eggs. $También puedes transferir objetos equipados entre Pokémon utilizando la opción de transferir.
$There are 3 different machines to pull from with different\nbonuses, so pick the one that suits you best!`, $La opción de transferir aparecerá en la parte inferior derecha una vez hayas obtenido un objeto equipable.
$También puedes comprar objetos consumibles con dinero y su variedad irá aumentando según tu avance.
$Asegúrate de comprar antes de escoger un objeto aleatorio, ya que se avanzará al siguiente combate.`,
"eggGacha": `En esta pantalla podrás canjear tus vales por huevos\nde Pokémon.
$Los huevos deben eclosionar y estarán más cerca de\nhacerlo tras cada combate.
$Los huevos más raros tardarán más en eclosionar.
$Los Pokémon que hayan salido del huevo no se\nañadirán a tu equipo, pero sí a tus iniciales.
$Los Pokémon salidos de un huevo suelen tener mejores\nIVs que los Pokémon salvajes.
$Algunos Pokémon solo pueden ser obtenidos de huevos.
$Hay 3 máquinas diferentes entre las que elegir, cada\nuna con zdiferentes bonificaciones.
$¡Así que escoge la que más te interese!`,
} as const; } as const;

52
src/locales/fr/battle.ts Normal file
View File

@ -0,0 +1,52 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "Un {{bossName}} apparaît.",
"trainerAppeared": "Un combat est lancé\npar {{trainerName}} !",
"singleWildAppeared": "Un {{pokemonName}} sauvage apparaît !",
"multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !",
"playerComeBack": "{{pokemonName}}, on change !\nReviens !",
"trainerComeBack": "{{trainerName}} retire {{pokemonName}} !",
"playerGo": "{{pokemonName}} ! Go !",
"trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !",
"switchQuestion": "Voulez-vous changer\nvotre {{pokemonName}} ?",
"trainerDefeated": `Vous avez battu\n{{trainerName}} !`,
"pokemonCaught": "Vous avez attrapé {{pokemonName}} !",
"pokemon": "Pokémon",
"sendOutPokemon": "{{pokemonName}} ! Go !",
"hitResultCriticalHit": "Coup critique !",
"hitResultSuperEffective": "Cest super efficace !",
"hitResultNotVeryEffective": "Ce nest pas très efficace…",
"hitResultNoEffect": "Ça naffecte pas {{pokemonName}}…",
"hitResultOneHitKO": "K.O. en un coup !",
"attackFailed": "Mais cela échoue !",
"attackHitsCount": `Touché {{count}} fois !`,
"expGain": "{{pokemonName}} gagne\n{{exp}} Points dExp !",
"levelUp": "{{pokemonName}} monte au\nN. {{level}} !",
"learnMove": "{{pokemonName}} apprend \n{{moveName}} !",
"learnMovePrompt": "{{pokemonName}} veut apprendre\n{{moveName}}.",
"learnMoveLimitReached": "Cependant, {{pokemonName}} connait\ndéjà quatre capacités.",
"learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?",
"learnMoveStopTeaching": "Arrêter dapprendre\n{{moveName}} ?",
"learnMoveNotLearned": "{{pokemonName}} na pas appris\n{{moveName}}.",
"learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?",
"learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.",
"levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
"moveNotImplemented": "{{moveName}} nest pas encore implémenté et ne peut pas être sélectionné.",
"moveDisabled": "{{moveName}} est sous entrave !",
"noPokeballForce": "Une force mystérieuse\nempêche lutilisation des Poké Balls.",
"noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, cest mal !",
"noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon !",
"noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez dabord laffaiblir !",
"noEscapeForce": "Une force mystérieuse\nempêche la fuite.",
"noEscapeTrainer": "On ne senfuit pas dun\ncombat de Dresseurs !",
"noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !",
"runAwaySuccess": "Vous prenez la fuite !",
"runAwayCannotEscape": "Fuite impossible !",
"escapeVerbSwitch": "le changement",
"escapeVerbFlee": "la fuite",
"notDisabled": "{{moveName}} nest plus sous entrave !",
"skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre dobjet ?",
"eggHatching": "Oh ?",
"ivScannerUseQuestion": "Utiliser le Scanner dIV sur {{pokemonName}} ?"
} as const;

View File

@ -13,9 +13,9 @@ export const menuUiHandler: SimpleTranslationEntries = {
"LOG_OUT": "Déconnexion", "LOG_OUT": "Déconnexion",
"slot": "Emplacement {{slotNumber}}", "slot": "Emplacement {{slotNumber}}",
"importSession": "Importer session", "importSession": "Importer session",
"importSlotSelect": "Sélectionnez l'emplacement vers lequel importer les données.", "importSlotSelect": "Sélectionnez lemplacement vers lequel importer les données.",
"exportSession": "Exporter session", "exportSession": "Exporter session",
"exportSlotSelect": "Sélectionnez l'emplacement depuis lequel exporter les données.", "exportSlotSelect": "Sélectionnez lemplacement depuis lequel exporter les données.",
"importData": "Importer données", "importData": "Importer données",
"exportData": "Exporter données", "exportData": "Exporter données",
"cancel": "Retour", "cancel": "Retour",

View File

@ -30,52 +30,13 @@ 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",
"bossAppeared": "Un {{bossName}} apparaît.", "dailyRankings": "Classement du Jour",
"trainerAppeared": "Un combat est lancé\npar {{trainerName}} !", "weeklyRankings": "Classement de la Semaine",
"singleWildAppeared": "Un {{pokemonName}} sauvage apparaît !", "noRankings": "Pas de Classement",
"multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !", "loading": "Chargement…",
"playerComeBack": "{{pokemonName}}, on change !\nReviens !", "playersOnline": "Joueurs Connectés",
"trainerComeBack": "{{trainerName}} retire {{pokemonName}} !", "empty":"Vide",
"playerGo": "{{pokemonName}} ! Go !", "yes":"Oui",
"trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !", "no":"Non",
"switchQuestion": "Voulez-vous changer\n{{pokemonName}} ?", "confirmStartTeam":'Commencer avec ces Pokémon ?',
"trainerDefeated": `Vous avez battu\n{{trainerName}} !`,
"pokemonCaught": "Vous avez attrapé {{pokemonName}} !",
"pokemon": "Pokémon",
"sendOutPokemon": "{{pokemonName}} ! Go !",
"attackFailed": "Mais cela échoue !",
"attackHitsCount": `Touché {{count}} fois !`,
"expGain": "{{pokemonName}} gagne\n{{exp}} Points dExp !",
"levelUp": "{{pokemonName}} monte au\nN. {{level}} !",
"learnMove": "{{pokemonName}} apprend \n{{moveName}} !",
"learnMovePrompt": "{{pokemonName}} veut apprendre\n{{moveName}}.",
"learnMoveLimitReached": "Cependant, {{pokemonName}} connait\ndéjà quatre capacités.",
"learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?",
"learnMoveStopTeaching": "Arrêter dapprendre\n{{moveName}} ?",
"learnMoveNotLearned": "{{pokemonName}} na pas appris\n{{moveName}}.",
"learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?",
"learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.",
"levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
"moveNotImplemented": "{{moveName}} nest pas encore implémenté et ne peut pas être sélectionné.",
"moveDisabled": "{{moveName}} est sous entrave !",
"noPokeballForce": "Une force mystérieuse\nempêche lutilisation des Poké Balls.",
"noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, cest mal !",
"noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon!",
"noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez dabord laffaiblir !",
"noEscapeForce": "Une force mystérieuse\nempêche la fuite.",
"noEscapeTrainer": "On ne senfuit pas dun\ncombat de Dresseurs !",
"noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !",
"runAwaySuccess": "Vous prenez la fuite !",
"runAwayCannotEscape": "Fuite impossible !",
"escapeVerbSwitch": "le changement",
"escapeVerbFlee": "la fuite",
"notDisabled": "{{moveName}} nest plus sous entrave !",
"skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre dobjet ?",
"eggHatching": "Oh ?",
"ivScannerUseQuestion": "Utiliser le Scanner dIV sur {{pokemonName}} ?",
"rankings": "Rankings",
"dailyRankings": "Daily Rankings",
"noRankings": "No Rankings",
"loading": "Loading…",
"playersOnline": "Players Online"
} as const; } as const;

View File

@ -8,7 +8,7 @@ export const tutorial: SimpleTranslationEntries = {
$Tout signalement de bugs passe par le serveur Discord. $Tout signalement de bugs passe par le serveur Discord.
$Si le jeu est lent, vérifiez que lAccélération Matérielle est activée dans les paramètres du navigateur.`, $Si le jeu est lent, vérifiez que lAccélération Matérielle est activée dans les paramètres du navigateur.`,
"accessMenu": `Accédez au menu avec M ou Échap lors de l'attente dune\naction. "accessMenu": `Accédez au menu avec M ou Échap lors de lattente dune\naction.
$Il contient les paramètres et diverses fonctionnalités`, $Il contient les paramètres et diverses fonctionnalités`,
"menu": `Vous pouvez accéder aux paramètres depuis ce menu. "menu": `Vous pouvez accéder aux paramètres depuis ce menu.
@ -17,7 +17,7 @@ export const tutorial: SimpleTranslationEntries = {
$jetez-y un œil !`, $jetez-y un œil !`,
"starterSelect": `Choisissez vos starters depuis cet écran.\nIls formeront votre équipe de départ. "starterSelect": `Choisissez vos starters depuis cet écran.\nIls formeront votre équipe de départ.
$Chacun possède une valeur. Votre équipe peut avoir jusquà\n6 membres, tant que vous ne dépassez pas un coût de 10. $Chacun possède une valeur. Votre équipe peut avoir jusquà\n6 membres, tant que vous ne dépassez pas un cout de 10.
$Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos. $Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos.
$Les IVs dun starter sont les meilleurs de tous ceux de son\nespèce déjà obtenus. Essayez donc den obtenir plusieurs !`, $Les IVs dun starter sont les meilleurs de tous ceux de son\nespèce déjà obtenus. Essayez donc den obtenir plusieurs !`,
@ -25,6 +25,10 @@ export const tutorial: SimpleTranslationEntries = {
$violet. Si un starter que vous possédez la, essayez de $violet. Si un starter que vous possédez la, essayez de
$lajouter à votre équipe. Vérifiez bien son résumé !`, $lajouter à votre équipe. Vérifiez bien son résumé !`,
"statChange": `Les changements de stats restent à travers les combats tant que le Pokémon nest pas rappelé.
$Vos Pokémon sont rappelés avant un combat de Dresseur et avant dentrer dans un nouveau biome.
$Vous pouvez également voir en combat les changements de stats dun Pokémon en maintenant C ou Maj.`,
"selectItem": `Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre quun. "selectItem": `Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre quun.
$Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents. $Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents.
$La plupart des effets des objets non-consommables se cumuleront de diverses manières. $La plupart des effets des objets non-consommables se cumuleront de diverses manières.

52
src/locales/it/battle.ts Normal file
View File

@ -0,0 +1,52 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} appeared.",
"trainerAppeared": "{{trainerName}}\nwould like to battle!",
"singleWildAppeared": "A wild {{pokemonName}} appeared!",
"multiWildAppeared": "A wild {{pokemonName1}}\nand {{pokemonName2}} appeared!",
"playerComeBack": "Come back, {{pokemonName}}!",
"trainerComeBack": "{{trainerName}} withdrew {{pokemonName}}!",
"playerGo": "Go! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sent out {{pokemonName}}!",
"switchQuestion": "Will you switch\n{{pokemonName}}?",
"trainerDefeated": `You defeated\n{{trainerName}}!`,
"pokemonCaught": "{{pokemonName}} was caught!",
"pokemon": "Pokémon",
"sendOutPokemon": "Go! {{pokemonName}}!",
"hitResultCriticalHit": "A critical hit!",
"hitResultSuperEffective": "It's super effective!",
"hitResultNotVeryEffective": "It's not very effective…",
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!",
"hitResultOneHitKO": "It's a one-hit KO!",
"attackFailed": "But it failed!",
"attackHitsCount": `Hit {{count}} time(s)!`,
"expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!",
"levelUp": "{{pokemonName}} grew to\nLv. {{level}}!",
"learnMove": "{{pokemonName}} learned\n{{moveName}}!",
"learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.",
"learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.",
"learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?",
"learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
"learnMoveForgetQuestion": "Which move should be forgotten?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
"levelCapUp": "The level cap\nhas increased to {{levelCap}}!",
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
"moveDisabled": "{{moveName}} is disabled!",
"noPokeballForce": "An unseen force\nprevents using Poké Balls.",
"noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!",
"noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!",
"noPokeballStrong": "The target Pokémon is too strong to be caught!\nYou need to weaken it first!",
"noEscapeForce": "An unseen force\nprevents escape.",
"noEscapeTrainer": "You can't run\nfrom a trainer battle!",
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nprevents {{escapeVerb}}!",
"runAwaySuccess": "You got away safely!",
"runAwayCannotEscape": 'You can\'t escape!',
"escapeVerbSwitch": "switching",
"escapeVerbFlee": "fleeing",
"notDisabled": "{{moveName}} is disabled\nno more!",
"skipItemQuestion": "Are you sure you want to skip taking an item?",
"eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?"
} as const;

View File

@ -0,0 +1,6 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP",
"power": "POWER",
} as const;

View File

@ -1,5 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; 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 = { export const menu: SimpleTranslationEntries = {
"cancel": "Annulla", "cancel": "Annulla",
"continue": "Continua", "continue": "Continua",
@ -7,9 +12,36 @@ export const menu: SimpleTranslationEntries = {
"loadGame": "Carica Partita", "loadGame": "Carica Partita",
"dailyRun": "Corsa Giornaliera (Beta)", "dailyRun": "Corsa Giornaliera (Beta)",
"selectGameMode": "Seleziona una modalità di gioco.", "selectGameMode": "Seleziona una modalità di gioco.",
"rankings": "Rankings", "logInOrCreateAccount": "Log in or create an account to start. No email required!",
"username": "Username",
"password": "Password",
"login": "Login",
"register": "Register",
"emptyUsername": "Username must not be empty",
"invalidLoginUsername": "The provided username is invalid",
"invalidRegisterUsername": "Username must only contain letters, numbers, or underscores",
"invalidLoginPassword": "The provided password is invalid",
"invalidRegisterPassword": "Password must be 6 characters or longer",
"usernameAlreadyUsed": "The provided username is already in use",
"accountNonExistent": "The provided user does not exist",
"unmatchingPassword": "The provided password does not match",
"passwordNotMatchingConfirmPassword": "Password must match confirm password",
"confirmPassword": "Confirm Password",
"registrationAgeWarning": "By registering, you confirm you are of 13 years of age or older.",
"backToLogin": "Back to Login",
"failedToLoadSaveData": "Failed to load save data. Please reload the page.\nIf this continues, please contact the administrator.",
"sessionSuccess": "Session loaded successfully.",
"failedToLoadSession": "Your session data could not be loaded.\nIt may be corrupted.",
"boyOrGirl": "Are you a boy or a girl?",
"boy": "Boy",
"girl": "Girl",
"dailyRankings": "Daily Rankings", "dailyRankings": "Daily Rankings",
"weeklyRankings": "Weekly Rankings",
"noRankings": "No Rankings", "noRankings": "No Rankings",
"loading": "Loading…", "loading": "Loading…",
"playersOnline": "Players Online" "playersOnline": "Players Online",
"empty":"Empty",
"yes":"Yes",
"no":"No",
"confirmStartTeam":'Begin with these Pokémon?',
} as const; } as const;

View File

@ -1,16 +1,16 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const pokemonStat: SimpleTranslationEntries = { export const pokemonStat: SimpleTranslationEntries = {
"HP": "Max. HP", "HP": "PS Max",
"HPshortened": "MaxHP", "HPshortened": "PS",
"ATK": "Attack", "ATK": "Attacco",
"ATKshortened": "Atk", "ATKshortened": "Att",
"DEF": "Defense", "DEF": "Difesa",
"DEFshortened": "Def", "DEFshortened": "Dif",
"SPATK": "Sp. Atk", "SPATK": "Att. Sp.",
"SPATKshortened": "SpAtk", "SPATKshortened": "AttSp",
"SPDEF": "Sp. Def", "SPDEF": "Dif. Sp.",
"SPDEFshortened": "SpDef", "SPDEFshortened": "DifSp",
"SPD": "Speed", "SPD": "Velocità",
"SPDshortened": "Spd" "SPDshortened": "Vel"
} as const; } as const;

View File

@ -1,38 +1,42 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const tutorial: SimpleTranslationEntries = { export const tutorial: SimpleTranslationEntries = {
"intro": `Welcome to PokéRogue! This is a battle-focused Pokémon fangame with roguelite elements. "intro": `Benvenuto in PokéRogue! Questo gioco si concentra sulle battaglie, con elementi roguelite.
$This game is not monetized and we claim no ownership of Pokémon nor of the copyrighted assets used. $Questo gioco non è monetizzato e non siamo proprietari di Pokemon e Assets presenti nel gioco.
$The game is a work in progress, but fully playable.\nFor bug reports, please use the Discord community. $Il gioco è work-in-progress ma giocabile al 100%.\nPer reportare eventuali bugs è possibile discuterne sul nostro Discord.
$If the game runs slowly, please ensure 'Hardware Acceleration' is turned on in your browser settings.`, $Se il game risulta 'lento', assicurati di aver abilitato l'Accelerazione Hardware nelle impostazioni del tuo Browser`,
"accessMenu": `To access the menu, press M or Escape while awaiting input.\nThe menu contains settings and various features.`, "accessMenu": `Per accedere al menù, press M o Esc.\nDal menù puoi cambiare impostazioni, controllare la wiki e accedere a varie features.`,
"menu": `From this menu you can access the settings. "menu": `Da questo menù puoi accedere alle impostazioni.
$From the settings you can change game speed, window style, and other options. $Dalle impostazioni puoi cambiare velocità di gioco, stile di finestra e altre opzioni.
$There are also various other features here, so be sure to check them all!`, $Ci sono varie funzionalità, controlla bene e non perderti nulla!`,
"starterSelect": `From this screen, you can select your starters.\nThese are your initial party members. "starterSelect": `Da questa schermata puoi selezionare il tuo starter.\nQuesti sono i membri iniziali del tuo parti.
$Each starter has a value. Your party can have up to\n6 members as long as the total does not exceed 10. $Ogni starter ha un valore. Puoi avere fino a \n6 Pokèmon, avendo a disposizione un massimo di 10 punti.
$You can also select gender, ability, and form depending on\nthe variants you've caught or hatched. $Puoi anche selezionare Sesso, Abilità, e Forma a seconda delle\nvarianti che hai catturato o schiuso.
$The IVs for a species are also the best of every one you've\ncaught or hatched, so try to get lots of the same species!`, $Le IVs di una specie sono le migliori rispetto a tutte quelle che hai\ncatturato o schiuso, quindi prova a catturarne il piu possibile!`,
"pokerus": `A daily random 3 selectable starters have a purple border. "pokerus": `Giornalmente 3 Starter casuali disponibili avranno il bordo viola.
$If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`, $Se possiedi uno di questi starter,\nprova ad aggiungerlo al party. Ricorda di controllare le info!`,
"selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. "statChange": `I cambiamenti alle statistiche persistono fintanto che i tuoi pokèmon resteranno in campo.
$These range from consumables, to Pokémon held items, to passive permanent items. $I tuoi pokemon verranno richiamati quando incontrerai un allenatore o al cambiamento di bioma.
$Most non-consumable item effects will stack in various ways. $Puoi anche vedere i cambiamenti alle statistiche in corso tenendo premuto C o Shift`,
$Some items will only show up if they can be used, such as evolution items.
$You can also transfer held items between Pokémon using the transfer option.
$The transfer option will appear in the bottom right once you have obtained a held item.
$You may purchase consumable items with money, and a larger variety will be available the further you get.
$Be sure to buy these before you pick your random item, as it will progress to the next battle once you do.`,
"eggGacha": `From this screen, you can redeem your vouchers for\nPokémon eggs. "selectItem": `Dopo ogni battaglia avrai disponibili tre item.\nPotrai prenderne solo uno.
$Eggs have to be hatched and get closer to hatching after\nevery battle. Rarer eggs take longer to hatch. $Questi spaziano tra consumabili, item tenuti da Pokèmon o con un effetto passivo permanente.
$Hatched Pokémon also won't be added to your party, they will\nbe added to your starters. $La maggior parte degli Item non Consumabili possono stackare in diversi modi.
$Pokémon hatched from eggs generally have better IVs than\nwild Pokémon. $Alcuni Item risulteranno disponibili solo se possono essere usati, come Item Evolutivi.
$Some Pokémon can only even be obtained from eggs. $Puoi anche passare un Item tenuto da un Pokèmon ad un altro attraverso l'opzione 'trasferisci strumento'.
$There are 3 different machines to pull from with different\nbonuses, so pick the one that suits you best!`, $L'opzione 'trasferisci strumento' sarà disponibile solo dopo aver assegnato uno strumento ad un Pokèmon.
$Puoi acquistare consumabili con le monete, progredendo saranno poi disponibili ulteriori oggetti.
$Assicurati di fare un acquisto prima di selezionare un item casuale, poichè passerai subito alla lotta successiva.`,
"eggGacha": `Da questa schermata, puoi riscattare i tuoi vouchers in cambio di\nuova Pokèmon.
$Le uova vanno schiuse e saranno sempre più vicine alla schiusura dopo\nogni battaglia. Le uova più rare impiegheranno più battaglie per la schiusura.
$I Pokémon schiusi non verranno aggiunti alla tua squadra, saranno\naggiunti ai tuoi starters.
$I Pokémon schiusi generalmente hanno IVs migliori rispetto ai\n Pokémon selvatici.
$Alcuni Pokémon possono essere ottenuti solo tramite uova.
$Ci sono 3 diversi macchinari con differenti\nbonus, scegli quello che preferisci!`,
} as const; } as const;

View File

@ -9,6 +9,23 @@ import BBCodeText from 'phaser3-rex-plugins/plugins/bbcodetext';
import TransitionImagePackPlugin from 'phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin.js'; import TransitionImagePackPlugin from 'phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin.js';
import { LoadingScene } from './loading-scene'; import { LoadingScene } from './loading-scene';
// Catch global errors and display them in an alert so users can report the issue.
window.onerror = function (message, source, lineno, colno, error) {
console.error(error);
let errorString = `Received unhandled error. Open browser console and click OK to see details.\nError: ${message}\nSource: ${source}\nLine: ${lineno}\nColumn: ${colno}\nStack: ${error.stack}`;
//alert(errorString);
// Avoids logging the error a second time.
return true;
};
// Catch global promise rejections and display them in an alert so users can report the issue.
window.addEventListener('unhandledrejection', (event) => {
let errorString = `Received unhandled promise rejection. Open browser console and click OK to see details.\nReason: ${event.reason}`;
console.error(event.reason);
//alert(errorString);
});
const config: Phaser.Types.Core.GameConfig = { const config: Phaser.Types.Core.GameConfig = {
type: Phaser.WEBGL, type: Phaser.WEBGL,
parent: 'app', parent: 'app',

View File

@ -1058,7 +1058,6 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10),
new WeightedModifierType(modifierTypes.TM_ULTRA, 8), new WeightedModifierType(modifierTypes.TM_ULTRA, 8),
new WeightedModifierType(modifierTypes.RARER_CANDY, 4), new WeightedModifierType(modifierTypes.RARER_CANDY, 4),
new WeightedModifierType(modifierTypes.SOOTHE_BELL, (party: Pokemon[]) => party.find(p => (pokemonEvolutions.hasOwnProperty(p.species.speciesId) && pokemonEvolutions[p.species.speciesId].find(e => e.condition && e.condition instanceof SpeciesFriendshipEvolutionCondition)) || p.moveset.find(m => m.moveId === Moves.RETURN)) ? 16 : 0, 16),
new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, 2), new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, 2),
new WeightedModifierType(modifierTypes.IV_SCANNER, 4), new WeightedModifierType(modifierTypes.IV_SCANNER, 4),
new WeightedModifierType(modifierTypes.EXP_CHARM, 8), new WeightedModifierType(modifierTypes.EXP_CHARM, 8),
@ -1078,6 +1077,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.BATON, 2), new WeightedModifierType(modifierTypes.BATON, 2),
new WeightedModifierType(modifierTypes.SOUL_DEW, 8), new WeightedModifierType(modifierTypes.SOUL_DEW, 8),
//new WeightedModifierType(modifierTypes.OVAL_CHARM, 6), //new WeightedModifierType(modifierTypes.OVAL_CHARM, 6),
new WeightedModifierType(modifierTypes.SOOTHE_BELL, 4),
new WeightedModifierType(modifierTypes.ABILITY_CHARM, 6), new WeightedModifierType(modifierTypes.ABILITY_CHARM, 6),
new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5),
new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3),
@ -1151,7 +1151,7 @@ const enemyBuffModifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.ENEMY_ATTACK_FREEZE_CHANCE, 2), new WeightedModifierType(modifierTypes.ENEMY_ATTACK_FREEZE_CHANCE, 2),
new WeightedModifierType(modifierTypes.ENEMY_ATTACK_BURN_CHANCE, 2), new WeightedModifierType(modifierTypes.ENEMY_ATTACK_BURN_CHANCE, 2),
new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 10), new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 10),
new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 10000), new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 5),
new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1) new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1)
].map(m => { m.setTier(ModifierTier.COMMON); return m; }), ].map(m => { m.setTier(ModifierTier.COMMON); return m; }),
[ModifierTier.GREAT]: [ [ModifierTier.GREAT]: [
@ -1162,12 +1162,12 @@ const enemyBuffModifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1) new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1)
].map(m => { m.setTier(ModifierTier.GREAT); return m; }), ].map(m => { m.setTier(ModifierTier.GREAT); return m; }),
[ModifierTier.ULTRA]: [ [ModifierTier.ULTRA]: [
new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_BOOSTER, 5), new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_BOOSTER, 10),
new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_REDUCTION, 5), new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_REDUCTION, 10),
new WeightedModifierType(modifierTypes.ENEMY_HEAL, 5), new WeightedModifierType(modifierTypes.ENEMY_HEAL, 10),
new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 5), new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 10),
new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 5), new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 10),
new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 300) new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 5)
].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }),
[ModifierTier.ROGUE]: [ ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), [ModifierTier.ROGUE]: [ ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }),
[ModifierTier.MASTER]: [ ].map(m => { m.setTier(ModifierTier.MASTER); return m; }) [ModifierTier.MASTER]: [ ].map(m => { m.setTier(ModifierTier.MASTER); return m; })

View File

@ -1111,9 +1111,7 @@ export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier {
pokemon.levelExp = 0; pokemon.levelExp = 0;
} }
const friendshipIncrease = new Utils.IntegerHolder(5); pokemon.addFriendship(5);
pokemon.scene.applyModifier(PokemonFriendshipBoosterModifier, true, pokemon, friendshipIncrease);
pokemon.friendship = Math.min(pokemon.friendship + friendshipIncrease.value, 255);
pokemon.scene.unshiftPhase(new LevelUpPhase(pokemon.scene, pokemon.scene.getParty().indexOf(pokemon), pokemon.level - levelCount.value, pokemon.level)); pokemon.scene.unshiftPhase(new LevelUpPhase(pokemon.scene, pokemon.scene.getParty().indexOf(pokemon), pokemon.level - levelCount.value, pokemon.level));
@ -1392,13 +1390,14 @@ export class PokemonFriendshipBoosterModifier extends PokemonHeldItemModifier {
} }
apply(args: any[]): boolean { apply(args: any[]): boolean {
(args[1] as Utils.IntegerHolder).value *= 1 + 0.5 * this.getStackCount(); const friendship = args[1] as Utils.IntegerHolder;
friendship.value = Math.floor(friendship.value * (1 + 0.5 * this.getStackCount()));
return true; return true;
} }
getMaxHeldItemCount(pokemon: Pokemon): integer { getMaxHeldItemCount(pokemon: Pokemon): integer {
return 5; return 3;
} }
} }

View File

@ -15,9 +15,11 @@ export const WEATHER_OVERRIDE = WeatherType.NONE;
export const ABILITY_OVERRIDE = Abilities.NONE; export const ABILITY_OVERRIDE = Abilities.NONE;
export const MOVE_OVERRIDE = Moves.NONE; export const MOVE_OVERRIDE = Moves.NONE;
export const MOVE_OVERRIDE_2 = Moves.NONE;
export const OPP_SPECIES_OVERRIDE = 0; export const OPP_SPECIES_OVERRIDE = 0;
export const OPP_ABILITY_OVERRIDE = Abilities.NONE; export const OPP_ABILITY_OVERRIDE = Abilities.NONE;
export const OPP_MOVE_OVERRIDE = Moves.NONE; export const OPP_MOVE_OVERRIDE = Moves.NONE;
export const OPP_MOVE_OVERRIDE_2 = Moves.NONE;
export const OPP_SHINY_OVERRIDE = false; export const OPP_SHINY_OVERRIDE = false;
export const OPP_VARIANT_OVERRIDE = 0; export const OPP_VARIANT_OVERRIDE = 0;

View File

@ -2,15 +2,15 @@ import BattleScene, {bypassLogin, startingWave} from "./battle-scene";
import {DamageResult, default as Pokemon, EnemyPokemon, FieldPosition, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove} from "./field/pokemon"; import {DamageResult, default as Pokemon, EnemyPokemon, FieldPosition, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove} from "./field/pokemon";
import * as Utils from './utils'; import * as Utils from './utils';
import { Moves } from "./data/enums/moves"; import { Moves } from "./data/enums/moves";
import {allMoves, applyFilteredMoveAttrs, applyMoveAttrs, AttackMove, BypassSleepAttr, ChargeAttr, CopyMoveAttr, FixedDamageAttr, ForceSwitchOutAttr, getMoveTargets, HealStatusEffectAttr, HitsTagAttr, IgnoreOpponentStatChangesAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveEffectTrigger, MoveFlags, MoveTarget, MoveTargetSet, MultiHitAttr, NoEffectAttr, OneHitKOAccuracyAttr, OverrideMoveEffectAttr, PreMoveMessageAttr, SelfStatusMove, VariableAccuracyAttr} from "./data/move"; import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveFlags, MultiHitAttr, OverrideMoveEffectAttr, VariableAccuracyAttr, MoveTarget, OneHitKOAttr, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, DelayedAttackAttr, RechargeAttr, PreMoveMessageAttr, HealStatusEffectAttr, IgnoreOpponentStatChangesAttr, NoEffectAttr, FixedDamageAttr, OneHitKOAccuracyAttr, ForceSwitchOutAttr, VariableTargetAttr } from "./data/move";
import { Mode } from './ui/ui'; import { Mode } from './ui/ui';
import { Command } from "./ui/command-ui-handler"; import { Command } from "./ui/command-ui-handler";
import { Stat } from "./data/pokemon-stat"; import { Stat } from "./data/pokemon-stat";
import {BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, IvScannerModifier, LapsingPersistentModifier, LapsingPokemonHeldItemModifier, MapModifier, Modifier, MoneyInterestModifier, MoneyMultiplierModifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier} from "./modifier/modifier"; import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier } from "./modifier/modifier";
import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler";
import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball";
import {CommonAnim, CommonBattleAnim, initMoveAnim, loadMoveAnimAssets, MoveAnim} from "./data/battle-anims"; import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims";
import {getStatusEffectActivationText, getStatusEffectCatchRateMultiplier, getStatusEffectHealText, getStatusEffectObtainText, getStatusEffectOverlapText, StatusEffect} from "./data/status-effect"; import { StatusEffect, getStatusEffectActivationText, getStatusEffectCatchRateMultiplier, getStatusEffectHealText, getStatusEffectObtainText, getStatusEffectOverlapText } from "./data/status-effect";
import { SummaryUiMode } from "./ui/summary-ui-handler"; import { SummaryUiMode } from "./ui/summary-ui-handler";
import EvolutionSceneHandler from "./ui/evolution-scene-handler"; import EvolutionSceneHandler from "./ui/evolution-scene-handler";
import { EvolutionPhase } from "./evolution-phase"; import { EvolutionPhase } from "./evolution-phase";
@ -19,7 +19,7 @@ import {BattleStat, getBattleStatLevelChangeDescription, getBattleStatName} from
import { biomeLinks, getBiomeName } from "./data/biomes"; import { biomeLinks, getBiomeName } from "./data/biomes";
import { Biome } from "./data/enums/biome"; import { Biome } from "./data/enums/biome";
import { ModifierTier } from "./modifier/modifier-tier"; import { ModifierTier } from "./modifier/modifier-tier";
import {FusePokemonModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, modifierTypes, PokemonModifierType, PokemonMoveModifierType, regenerateModifierPoolThresholds, RememberMoveModifierType, TmModifierType} from "./modifier/modifier-type"; import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, RememberMoveModifierType, TmModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type";
import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade";
import {BattlerTag, BattlerTagLapseType, BounceTag, EncoreTag, HideSpriteTag as HiddenTag, ProtectedTag, TrappedTag} from "./data/battler-tags"; import {BattlerTag, BattlerTagLapseType, BounceTag, EncoreTag, HideSpriteTag as HiddenTag, ProtectedTag, TrappedTag} from "./data/battler-tags";
import {BattlerTagType} from "./data/enums/battler-tag-type"; import {BattlerTagType} from "./data/enums/battler-tag-type";
@ -57,6 +57,7 @@ import {fetchDailyRunSeed, getDailyRunStarters} from "./data/daily-run";
import {GameModes, gameModes} from "./game-mode"; import {GameModes, gameModes} from "./game-mode";
import {getPokemonSpecies, speciesStarters} from "./data/pokemon-species"; import {getPokemonSpecies, speciesStarters} from "./data/pokemon-species";
import i18next from './plugins/i18n'; import i18next from './plugins/i18n';
import { Abilities } from "./data/enums/abilities";
import { STARTER_FORM_OVERRIDE, STARTER_SPECIES_OVERRIDE } from './overrides'; import { STARTER_FORM_OVERRIDE, STARTER_SPECIES_OVERRIDE } from './overrides';
export class LoginPhase extends Phase { export class LoginPhase extends Phase {
@ -331,6 +332,8 @@ export class TitlePhase extends Phase {
this.scene.sessionPlayTime = 0; this.scene.sessionPlayTime = 0;
this.end(); this.end();
}); });
}).catch(err => {
console.error("Failed to load daily run:\n", err);
}); });
}); });
} }
@ -815,14 +818,14 @@ export class EncounterPhase extends BattlePhase {
const enemyField = this.scene.getEnemyField(); const enemyField = this.scene.getEnemyField();
if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS)
return i18next.t('menu:bossAppeared', {bossName: enemyField[0].name}); return i18next.t('battle:bossAppeared', {bossName: enemyField[0].name});
if (this.scene.currentBattle.battleType === BattleType.TRAINER) if (this.scene.currentBattle.battleType === BattleType.TRAINER)
return i18next.t('menu:trainerAppeared', {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)}); return i18next.t('battle:trainerAppeared', {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)});
return enemyField.length === 1 return enemyField.length === 1
? i18next.t('menu:singleWildAppeared', {pokemonName: enemyField[0].name}) ? i18next.t('battle:singleWildAppeared', {pokemonName: enemyField[0].name})
: i18next.t('menu:multiWildAppeared', {pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name}) : i18next.t('battle:multiWildAppeared', {pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name})
} }
doEncounterCommon(showEncounterMessage: boolean = true) { doEncounterCommon(showEncounterMessage: boolean = true) {
@ -1187,7 +1190,7 @@ export class SummonPhase extends PartyMemberPokemonPhase {
} }
if (this.player) { if (this.player) {
this.scene.ui.showText(i18next.t('menu:playerGo', { pokemonName: this.getPokemon().name })); this.scene.ui.showText(i18next.t('battle:playerGo', { pokemonName: this.getPokemon().name }));
if (this.player) if (this.player)
this.scene.pbTray.hide(); this.scene.pbTray.hide();
this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'f' : 'm'}_back_pb`); this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'f' : 'm'}_back_pb`);
@ -1355,8 +1358,8 @@ export class SwitchSummonPhase extends SummonPhase {
applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, pokemon); applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, pokemon);
this.scene.ui.showText(this.player ? this.scene.ui.showText(this.player ?
i18next.t('menu:playerComeBack', { pokemonName: pokemon.name }) : i18next.t('battle:playerComeBack', { pokemonName: pokemon.name }) :
i18next.t('menu:trainerComeBack', { i18next.t('battle:trainerComeBack', {
trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER),
pokemonName: pokemon.name pokemonName: pokemon.name
}) })
@ -1396,8 +1399,8 @@ export class SwitchSummonPhase extends SummonPhase {
party[this.fieldIndex] = switchedPokemon; party[this.fieldIndex] = switchedPokemon;
const showTextAndSummon = () => { const showTextAndSummon = () => {
this.scene.ui.showText(this.player ? this.scene.ui.showText(this.player ?
i18next.t('menu:playerGo', { pokemonName: switchedPokemon.name }) : i18next.t('battle:playerGo', { pokemonName: switchedPokemon.name }) :
i18next.t('menu:trainerGo', { i18next.t('battle:trainerGo', {
trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER),
pokemonName: this.getPokemon().name pokemonName: this.getPokemon().name
}) })
@ -1544,7 +1547,7 @@ export class CheckSwitchPhase extends BattlePhase {
return; return;
} }
this.scene.ui.showText(i18next.t('menu:switchQuestion', { pokemonName: this.useName ? pokemon.name : i18next.t('menu:pokemon') }), null, () => { this.scene.ui.showText(i18next.t('battle:switchQuestion', { pokemonName: this.useName ? pokemon.name : i18next.t('battle:pokemon') }), null, () => {
this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.setMode(Mode.CONFIRM, () => {
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex); this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex);
@ -1564,7 +1567,7 @@ export class SummonMissingPhase extends SummonPhase {
} }
preSummon(): void { preSummon(): void {
this.scene.ui.showText(i18next.t('menu:sendOutPokemon', { pokemonName: this.getPokemon().name})); this.scene.ui.showText(i18next.t('battle:sendOutPokemon', { pokemonName: this.getPokemon().name}));
this.scene.time.delayedCall(250, () => this.summon()); this.scene.time.delayedCall(250, () => this.summon());
} }
} }
@ -1579,7 +1582,7 @@ export class LevelCapPhase extends FieldPhase {
this.scene.ui.setMode(Mode.MESSAGE).then(() => { this.scene.ui.setMode(Mode.MESSAGE).then(() => {
this.scene.playSound('level_up_fanfare'); this.scene.playSound('level_up_fanfare');
this.scene.ui.showText(i18next.t('menu:levelCapUp', { levelCap: this.scene.getMaxExpLevel() }), null, () => this.end(), null, true); this.scene.ui.showText(i18next.t('battle:levelCapUp', { levelCap: this.scene.getMaxExpLevel() }), null, () => this.end(), null, true);
this.executeForAll(pokemon => pokemon.updateInfo(true)); this.executeForAll(pokemon => pokemon.updateInfo(true));
}); });
} }
@ -1673,7 +1676,7 @@ export class CommandPhase extends FieldPhase {
const move = playerPokemon.getMoveset()[cursor]; const move = playerPokemon.getMoveset()[cursor];
if (move.getName().endsWith(' (N)')) { if (move.getName().endsWith(' (N)')) {
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:moveNotImplemented', { moveName: move.getName().slice(0, -4) }), null, () => { this.scene.ui.showText(i18next.t('battle:moveNotImplemented', { moveName: move.getName().slice(0, -4) }), null, () => {
this.scene.ui.clearText(); this.scene.ui.clearText();
this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex); this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex);
}, null, true); }, null, true);
@ -1684,6 +1687,8 @@ export class CommandPhase extends FieldPhase {
console.log(moveTargets, playerPokemon.name); console.log(moveTargets, playerPokemon.name);
if (moveTargets.targets.length <= 1 || moveTargets.multiple) if (moveTargets.targets.length <= 1 || moveTargets.multiple)
turnCommand.move.targets = moveTargets.targets; turnCommand.move.targets = moveTargets.targets;
else if(playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1)
turnCommand.move.targets = playerPokemon.getMoveQueue()[0].targets;
else else
this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex));
this.scene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; this.scene.currentBattle.turnCommands[this.fieldIndex] = turnCommand;
@ -1692,7 +1697,7 @@ export class CommandPhase extends FieldPhase {
const move = playerPokemon.getMoveset()[cursor]; const move = playerPokemon.getMoveset()[cursor];
if (playerPokemon.summonData.disabledMove === move.moveId) { if (playerPokemon.summonData.disabledMove === move.moveId) {
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:moveDisabled', { moveName: move.getName() }), null, () => { this.scene.ui.showText(i18next.t('battle:moveDisabled', { moveName: move.getName() }), null, () => {
this.scene.ui.clearText(); this.scene.ui.clearText();
this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex); this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex);
}, null, true); }, null, true);
@ -1703,14 +1708,14 @@ export class CommandPhase extends FieldPhase {
if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1))) { if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1))) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noPokeballForce'), null, () => { this.scene.ui.showText(i18next.t('battle:noPokeballForce'), null, () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true); }, null, true);
} else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noPokeballTrainer'), null, () => { this.scene.ui.showText(i18next.t('battle:noPokeballTrainer'), null, () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true); }, null, true);
@ -1719,16 +1724,16 @@ export class CommandPhase extends FieldPhase {
if (targets.length > 1) { if (targets.length > 1) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noPokeballMulti'), null, () => { this.scene.ui.showText(i18next.t('battle:noPokeballMulti'), null, () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true); }, null, true);
} else if (cursor < 5) { } else if (cursor < 5) {
const targetPokemon = this.scene.getEnemyField().find(p => p.isActive(true)); const targetPokemon = this.scene.getEnemyField().find(p => p.isActive(true));
if (targetPokemon.isBoss() && targetPokemon.bossSegmentIndex >= 1 && cursor < PokeballType.MASTER_BALL) { if (targetPokemon.isBoss() && targetPokemon.bossSegmentIndex >= 1 && !targetPokemon.hasAbility(Abilities.WONDER_GUARD, false, true) && cursor < PokeballType.MASTER_BALL) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noPokeballStrong'), null, () => { this.scene.ui.showText(i18next.t('battle:noPokeballStrong'), null, () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true); }, null, true);
@ -1748,14 +1753,14 @@ export class CommandPhase extends FieldPhase {
if (!isSwitch && this.scene.arena.biomeType === Biome.END) { if (!isSwitch && this.scene.arena.biomeType === Biome.END) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noEscapeForce'), null, () => { this.scene.ui.showText(i18next.t('battle:noEscapeForce'), null, () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true); }, null, true);
} else if (!isSwitch && this.scene.currentBattle.battleType === BattleType.TRAINER) { } else if (!isSwitch && this.scene.currentBattle.battleType === BattleType.TRAINER) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noEscapeTrainer'), null, () => { this.scene.ui.showText(i18next.t('battle:noEscapeTrainer'), null, () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true); }, null, true);
@ -1778,10 +1783,10 @@ export class CommandPhase extends FieldPhase {
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
} }
this.scene.ui.showText( this.scene.ui.showText(
i18next.t('menu:noEscapePokemon', { i18next.t('battle:noEscapePokemon', {
pokemonName: this.scene.getPokemonById(trapTag.sourceId).name, pokemonName: this.scene.getPokemonById(trapTag.sourceId).name,
moveName: trapTag.getMoveName(), moveName: trapTag.getMoveName(),
escapeVerb: isSwitch ? i18next.t('menu:escapeVerbSwitch') : i18next.t('menu:escapeVerbFlee') escapeVerb: isSwitch ? i18next.t('battle:escapeVerbSwitch') : i18next.t('battle:escapeVerbFlee')
}), }),
null, null,
() => { () => {
@ -2031,7 +2036,7 @@ export class TurnEndPhase extends FieldPhase {
pokemon.lapseTags(BattlerTagLapseType.TURN_END); pokemon.lapseTags(BattlerTagLapseType.TURN_END);
if (pokemon.summonData.disabledMove && !--pokemon.summonData.disabledTurns) { if (pokemon.summonData.disabledMove && !--pokemon.summonData.disabledTurns) {
this.scene.pushPhase(new MessagePhase(this.scene, i18next.t('menu:notDisabled', { moveName: allMoves[pokemon.summonData.disabledMove].name }))); this.scene.pushPhase(new MessagePhase(this.scene, i18next.t('battle:notDisabled', { moveName: allMoves[pokemon.summonData.disabledMove].name })));
pokemon.summonData.disabledMove = Moves.NONE; pokemon.summonData.disabledMove = Moves.NONE;
} }
@ -2325,13 +2330,14 @@ export class MovePhase extends BattlePhase {
showMoveText(): void { showMoveText(): void {
if (this.move.getMove().getAttrs(ChargeAttr).length) { if (this.move.getMove().getAttrs(ChargeAttr).length) {
this.scene.queueMessage(getPokemonMessage(this.pokemon, ` used\n${this.move.getName()}!`), 500);
const lastMove = this.pokemon.getLastXMoves() as TurnMove[]; const lastMove = this.pokemon.getLastXMoves() as TurnMove[];
if (!lastMove.length || lastMove[0].move !== this.move.getMove().id || lastMove[0].result !== MoveResult.OTHER) if (!lastMove.length || lastMove[0].move !== this.move.getMove().id || lastMove[0].result !== MoveResult.OTHER){
this.scene.queueMessage(getPokemonMessage(this.pokemon, ` used\n${this.move.getName()}!`), 500);
return; return;
} }
}
if (this.pokemon.getTag(BattlerTagType.RECHARGING)) if (this.pokemon.getTag(BattlerTagType.RECHARGING || BattlerTagType.INTERRUPTED))
return; return;
this.scene.queueMessage(getPokemonMessage(this.pokemon, ` used\n${this.move.getName()}!`), 500); this.scene.queueMessage(getPokemonMessage(this.pokemon, ` used\n${this.move.getName()}!`), 500);
@ -2339,7 +2345,7 @@ export class MovePhase extends BattlePhase {
} }
showFailedText(failedText: string = null): void { showFailedText(failedText: string = null): void {
this.scene.queueMessage(failedText || i18next.t('menu:attackFailed')); this.scene.queueMessage(failedText || i18next.t('battle:attackFailed'));
} }
end() { end() {
@ -2394,7 +2400,7 @@ export class MoveEffectPhase extends PokemonPhase {
const targetHitChecks = Object.fromEntries(targets.map(p => [ p.getBattlerIndex(), this.hitCheck(p) ])); const targetHitChecks = Object.fromEntries(targets.map(p => [ p.getBattlerIndex(), this.hitCheck(p) ]));
const activeTargets = targets.map(t => t.isActive(true)); const activeTargets = targets.map(t => t.isActive(true));
if (!activeTargets.length || (!this.move.getMove().isMultiTarget() && !targetHitChecks[this.targets[0]])) { if (!activeTargets.length || (!this.move.getMove().getAttrs(VariableTargetAttr).length && !this.move.getMove().isMultiTarget() && !targetHitChecks[this.targets[0]])) {
user.turnData.hitCount = 1; user.turnData.hitCount = 1;
user.turnData.hitsLeft = 1; user.turnData.hitsLeft = 1;
if (activeTargets.length) { if (activeTargets.length) {
@ -2402,7 +2408,7 @@ export class MoveEffectPhase extends PokemonPhase {
moveHistoryEntry.result = MoveResult.MISS; moveHistoryEntry.result = MoveResult.MISS;
applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove()); applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove());
} else { } else {
this.scene.queueMessage(i18next.t('menu:attackFailed')); this.scene.queueMessage(i18next.t('battle:attackFailed'));
moveHistoryEntry.result = MoveResult.FAIL; moveHistoryEntry.result = MoveResult.FAIL;
} }
return this.end(); return this.end();
@ -2513,7 +2519,7 @@ export class MoveEffectPhase extends PokemonPhase {
else { else {
const hitsTotal = user.turnData.hitCount - Math.max(user.turnData.hitsLeft, 0); const hitsTotal = user.turnData.hitCount - Math.max(user.turnData.hitsLeft, 0);
if (hitsTotal > 1) if (hitsTotal > 1)
this.scene.queueMessage(i18next.t('menu:attackHitsCount', { count: hitsTotal })); this.scene.queueMessage(i18next.t('battle:attackHitsCount', { count: hitsTotal }));
this.scene.applyModifiers(HitHealModifier, this.player, user); this.scene.applyModifiers(HitHealModifier, this.player, user);
} }
} }
@ -2698,7 +2704,6 @@ export class StatChangePhase extends PokemonPhase {
let random = false; let random = false;
const allStats = Utils.getEnumValues(BattleStat);
if (this.stats.length === 1 && this.stats[0] === BattleStat.RAND) { if (this.stats.length === 1 && this.stats[0] === BattleStat.RAND) {
this.stats[0] = this.getRandomStat(); this.stats[0] = this.getRandomStat();
random = true; random = true;
@ -2739,8 +2744,11 @@ export class StatChangePhase extends PokemonPhase {
for (let stat of filteredStats) for (let stat of filteredStats)
pokemon.summonData.battleStats[stat] = Math.max(Math.min(pokemon.summonData.battleStats[stat] + levels.value, 6), -6); pokemon.summonData.battleStats[stat] = Math.max(Math.min(pokemon.summonData.battleStats[stat] + levels.value, 6), -6);
applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget) applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget);
this.end();
pokemon.updateInfo();
handleTutorial(this.scene, Tutorial.Stat_Change).then(() => super.end());
}; };
if (relLevels.filter(l => l).length && this.scene.moveAnimations) { if (relLevels.filter(l => l).length && this.scene.moveAnimations) {
@ -3177,8 +3185,8 @@ export class FaintPhase extends PokemonPhase {
this.scene.getField(true).filter(p => p !== pokemon).forEach(p => p.removeTagsBySourceId(pokemon.id)); this.scene.getField(true).filter(p => p !== pokemon).forEach(p => p.removeTagsBySourceId(pokemon.id));
pokemon.faintCry(() => { pokemon.faintCry(() => {
const friendshipDecrease = new Utils.IntegerHolder(10); if (pokemon instanceof PlayerPokemon)
pokemon.friendship = Math.max(pokemon.friendship - friendshipDecrease.value, 0); pokemon.addFriendship(-10);
pokemon.hideInfo(); pokemon.hideInfo();
this.scene.playSound('faint'); this.scene.playSound('faint');
this.scene.tweens.add({ this.scene.tweens.add({
@ -3239,24 +3247,22 @@ export class VictoryPhase extends PokemonPhase {
const expShareModifier = this.scene.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier; const expShareModifier = this.scene.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier;
const expBalanceModifier = this.scene.findModifier(m => m instanceof ExpBalanceModifier) as ExpBalanceModifier; const expBalanceModifier = this.scene.findModifier(m => m instanceof ExpBalanceModifier) as ExpBalanceModifier;
const multipleParticipantExpBonusModifier = this.scene.findModifier(m => m instanceof MultipleParticipantExpBonusModifier) as MultipleParticipantExpBonusModifier; const multipleParticipantExpBonusModifier = this.scene.findModifier(m => m instanceof MultipleParticipantExpBonusModifier) as MultipleParticipantExpBonusModifier;
const expPartyMembers = party.filter(p => p.hp && p.level < this.scene.getMaxExpLevel()); const nonFaintedPartyMembers = party.filter(p => p.hp);
const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < this.scene.getMaxExpLevel());
const partyMemberExp = []; const partyMemberExp = [];
if (participantIds.size) { if (participantIds.size) {
let expValue = this.getPokemon().getExpValue(); let expValue = this.getPokemon().getExpValue();
if (this.scene.currentBattle.battleType === BattleType.TRAINER) if (this.scene.currentBattle.battleType === BattleType.TRAINER)
expValue = Math.floor(expValue * 1.5); expValue = Math.floor(expValue * 1.5);
for (let partyMember of expPartyMembers) { for (let partyMember of nonFaintedPartyMembers) {
const pId = partyMember.id; const pId = partyMember.id;
const participated = participantIds.has(pId); const participated = participantIds.has(pId);
if (participated) { if (participated)
const friendshipIncrease = new Utils.IntegerHolder(2); partyMember.addFriendship(2);
this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, partyMember, friendshipIncrease); if (!expPartyMembers.includes(partyMember))
partyMember.friendship = Math.min(partyMember.friendship + friendshipIncrease.value, 255); continue;
if (partyMember.friendship === 255) if (!participated && !expShareModifier) {
this.scene.validateAchv(achvs.MAX_FRIENDSHIP);
}
else if (!expShareModifier) {
partyMemberExp.push(0); partyMemberExp.push(0);
continue; continue;
} }
@ -3364,10 +3370,10 @@ export class TrainerVictoryPhase extends BattlePhase {
const trainerType = this.scene.currentBattle.trainer.config.trainerType; const trainerType = this.scene.currentBattle.trainer.config.trainerType;
if (vouchers.hasOwnProperty(TrainerType[trainerType])) { if (vouchers.hasOwnProperty(TrainerType[trainerType])) {
if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer.config.isBoss) if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer.config.isBoss)
this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.VOUCHER)); this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [ modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM ][vouchers[TrainerType[trainerType]].voucherType]));
} }
this.scene.ui.showText(i18next.t('menu:trainerDefeated', { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }), null, () => { this.scene.ui.showText(i18next.t('battle:trainerDefeated', { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }), null, () => {
const victoryMessages = this.scene.currentBattle.trainer.getVictoryMessages(); const victoryMessages = this.scene.currentBattle.trainer.getVictoryMessages();
const showMessage = () => { const showMessage = () => {
let message: string; let message: string;
@ -3634,7 +3640,7 @@ export class ExpPhase extends PlayerPartyMemberPokemonPhase {
let exp = new Utils.NumberHolder(this.expValue); let exp = new Utils.NumberHolder(this.expValue);
this.scene.applyModifiers(ExpBoosterModifier, true, exp); this.scene.applyModifiers(ExpBoosterModifier, true, exp);
exp.value = Math.floor(exp.value); exp.value = Math.floor(exp.value);
this.scene.ui.showText(i18next.t('menu:expGain', { pokemonName: pokemon.name, exp: exp.value }), null, () => { this.scene.ui.showText(i18next.t('battle:expGain', { pokemonName: pokemon.name, exp: exp.value }), null, () => {
const lastLevel = pokemon.level; const lastLevel = pokemon.level;
let newLevel: integer; let newLevel: integer;
pokemon.addExp(exp.value); pokemon.addExp(exp.value);
@ -3722,7 +3728,7 @@ export class LevelUpPhase extends PlayerPartyMemberPokemonPhase {
pokemon.calculateStats(); pokemon.calculateStats();
pokemon.updateInfo(); pokemon.updateInfo();
this.scene.playSound('level_up_fanfare'); this.scene.playSound('level_up_fanfare');
this.scene.ui.showText(i18next.t('menu:levelUp', { pokemonName: this.getPokemon().name, level: this.level }), null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()), null, true); this.scene.ui.showText(i18next.t('battle:levelUp', { pokemonName: this.getPokemon().name, level: this.level }), null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()), null, true);
if (this.level <= 100) { if (this.level <= 100) {
const levelMoves = this.getPokemon().getLevelMoves(this.lastLevel + 1); const levelMoves = this.getPokemon().getLevelMoves(this.lastLevel + 1);
for (let lm of levelMoves) for (let lm of levelMoves)
@ -3771,7 +3777,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
.then(() => { .then(() => {
this.scene.ui.setMode(messageMode).then(() => { this.scene.ui.setMode(messageMode).then(() => {
this.scene.playSound('level_up_fanfare'); this.scene.playSound('level_up_fanfare');
this.scene.ui.showText(i18next.t('menu:learnMove', { pokemonName: pokemon.name, moveName: move.name }), null, () => { this.scene.ui.showText(i18next.t('battle:learnMove', { pokemonName: pokemon.name, moveName: move.name }), null, () => {
this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true);
this.end(); this.end();
}, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true); }, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true);
@ -3780,15 +3786,15 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
}); });
} else { } else {
this.scene.ui.setMode(messageMode).then(() => { this.scene.ui.setMode(messageMode).then(() => {
this.scene.ui.showText(i18next.t('menu:learnMovePrompt', { pokemonName: pokemon.name, moveName: move.name }), null, () => { this.scene.ui.showText(i18next.t('battle:learnMovePrompt', { pokemonName: pokemon.name, moveName: move.name }), null, () => {
this.scene.ui.showText(i18next.t('menu:learnMoveLimitReached', { pokemonName: pokemon.name }), null, () => { this.scene.ui.showText(i18next.t('battle:learnMoveLimitReached', { pokemonName: pokemon.name }), null, () => {
this.scene.ui.showText(i18next.t('menu:learnMoveReplaceQuestion', { moveName: move.name }), null, () => { this.scene.ui.showText(i18next.t('battle:learnMoveReplaceQuestion', { moveName: move.name }), null, () => {
const noHandler = () => { const noHandler = () => {
this.scene.ui.setMode(messageMode).then(() => { this.scene.ui.setMode(messageMode).then(() => {
this.scene.ui.showText(i18next.t('menu:learnMoveStopTeaching', { moveName: move.name }), null, () => { this.scene.ui.showText(i18next.t('battle:learnMoveStopTeaching', { moveName: move.name }), null, () => {
this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
this.scene.ui.setMode(messageMode); this.scene.ui.setMode(messageMode);
this.scene.ui.showText(i18next.t('menu:learnMoveNotLearned', { pokemonName: pokemon.name, moveName: move.name }), null, () => this.end(), null, true); this.scene.ui.showText(i18next.t('battle:learnMoveNotLearned', { pokemonName: pokemon.name, moveName: move.name }), null, () => this.end(), null, true);
}, () => { }, () => {
this.scene.ui.setMode(messageMode); this.scene.ui.setMode(messageMode);
this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
@ -3799,7 +3805,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
}; };
this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
this.scene.ui.setMode(messageMode); this.scene.ui.setMode(messageMode);
this.scene.ui.showText(i18next.t('menu:learnMoveForgetQuestion'), null, () => { this.scene.ui.showText(i18next.t('battle:learnMoveForgetQuestion'), null, () => {
this.scene.ui.setModeWithoutClear(Mode.SUMMARY, this.getPokemon(), SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => { this.scene.ui.setModeWithoutClear(Mode.SUMMARY, this.getPokemon(), SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => {
if (moveIndex === 4) { if (moveIndex === 4) {
noHandler(); noHandler();
@ -3807,7 +3813,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
} }
this.scene.ui.setMode(messageMode).then(() => { this.scene.ui.setMode(messageMode).then(() => {
this.scene.ui.showText('@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Poof!', null, () => { this.scene.ui.showText('@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Poof!', null, () => {
this.scene.ui.showText(i18next.t('menu:learnMoveForgetSuccess', { pokemonName: pokemon.name, moveName: pokemon.moveset[moveIndex].getName() }), null, () => { this.scene.ui.showText(i18next.t('battle:learnMoveForgetSuccess', { pokemonName: pokemon.name, moveName: pokemon.moveset[moveIndex].getName() }), null, () => {
this.scene.ui.showText('And…', null, () => { this.scene.ui.showText('And…', null, () => {
pokemon.setMove(moveIndex, Moves.NONE); pokemon.setMove(moveIndex, Moves.NONE);
this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
@ -4120,9 +4126,9 @@ export class AttemptCapturePhase extends PokemonPhase {
this.scene.pokemonInfoContainer.show(pokemon, true); this.scene.pokemonInfoContainer.show(pokemon, true);
this.scene.gameData.updateSpeciesDexIvs(pokemon.species.speciesId, pokemon.ivs); this.scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs);
this.scene.ui.showText(i18next.t('menu:pokemonCaught', { pokemonName: pokemon.name }), null, () => { this.scene.ui.showText(i18next.t('battle:pokemonCaught', { pokemonName: pokemon.name }), null, () => {
const end = () => { const end = () => {
this.scene.pokemonInfoContainer.hide(); this.scene.pokemonInfoContainer.hide();
this.removePb(); this.removePb();
@ -4208,7 +4214,7 @@ export class AttemptRunPhase extends PokemonPhase {
if (playerPokemon.randSeedInt(256) < escapeChance.value) { if (playerPokemon.randSeedInt(256) < escapeChance.value) {
this.scene.playSound('flee'); this.scene.playSound('flee');
this.scene.queueMessage(i18next.t('menu:runAwaySuccess'), null, true, 500); this.scene.queueMessage(i18next.t('battle:runAwaySuccess'), null, true, 500);
this.scene.tweens.add({ this.scene.tweens.add({
targets: [ this.scene.arenaEnemy, enemyField ].flat(), targets: [ this.scene.arenaEnemy, enemyField ].flat(),
@ -4229,7 +4235,7 @@ export class AttemptRunPhase extends PokemonPhase {
this.scene.pushPhase(new BattleEndPhase(this.scene)); this.scene.pushPhase(new BattleEndPhase(this.scene));
this.scene.pushPhase(new NewBattlePhase(this.scene)); this.scene.pushPhase(new NewBattlePhase(this.scene));
} else } else
this.scene.queueMessage(i18next.t('menu:runAwayCannotEscape'), null, true, 500); this.scene.queueMessage(i18next.t('battle:runAwayCannotEscape'), null, true, 500);
this.end(); this.end();
} }
@ -4261,7 +4267,7 @@ export class SelectModifierPhase extends BattlePhase {
const modifierSelectCallback = (rowCursor: integer, cursor: integer) => { const modifierSelectCallback = (rowCursor: integer, cursor: integer) => {
if (rowCursor < 0 || cursor < 0) { if (rowCursor < 0 || cursor < 0) {
this.scene.ui.showText(i18next.t('menu:skipItemQuestion'), null, () => { this.scene.ui.showText(i18next.t('battle:skipItemQuestion'), null, () => {
this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { this.scene.ui.setOverlayMode(Mode.CONFIRM, () => {
this.scene.ui.revertMode(); this.scene.ui.revertMode();
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
@ -4365,6 +4371,7 @@ export class SelectModifierPhase extends BattlePhase {
const isMoveModifier = modifierType instanceof PokemonMoveModifierType; const isMoveModifier = modifierType instanceof PokemonMoveModifierType;
const isTmModifier = modifierType instanceof TmModifierType; const isTmModifier = modifierType instanceof TmModifierType;
const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType; const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType;
const isPpRestoreModifier = modifierType instanceof PokemonPpRestoreModifierType;
const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER
: isTmModifier ? PartyUiMode.TM_MODIFIER : isTmModifier ? PartyUiMode.TM_MODIFIER
: isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER : isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER
@ -4384,7 +4391,7 @@ export class SelectModifierPhase extends BattlePhase {
}); });
} else } else
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
}, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId); }, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier);
} }
} else } else
applyModifier(modifierType.newModifier()); applyModifier(modifierType.newModifier());
@ -4439,7 +4446,7 @@ export class EggLapsePhase extends Phase {
}); });
if (eggsToHatch.length) { if (eggsToHatch.length) {
this.scene.queueMessage(i18next.t('menu:eggHatching')); this.scene.queueMessage(i18next.t('battle:eggHatching'));
for (let egg of eggsToHatch) for (let egg of eggsToHatch)
this.scene.unshiftPhase(new EggHatchPhase(this.scene, egg)); this.scene.unshiftPhase(new EggHatchPhase(this.scene, egg));
@ -4533,7 +4540,7 @@ export class ScanIvsPhase extends PokemonPhase {
const pokemon = this.getPokemon(); const pokemon = this.getPokemon();
this.scene.ui.showText(i18next.t('menu:ivScannerUseQuestion', { pokemonName: pokemon.name }), null, () => { this.scene.ui.showText(i18next.t('battle:ivScannerUseQuestion', { pokemonName: pokemon.name }), null, () => {
this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.setMode(Mode.CONFIRM, () => {
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.clearText(); this.scene.ui.clearText();

View File

@ -1,4 +1,6 @@
import i18next from 'i18next'; import i18next from 'i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import { menu as enMenu } from '../locales/en/menu'; import { menu as enMenu } from '../locales/en/menu';
import { menu as esMenu } from '../locales/es/menu'; import { menu as esMenu } from '../locales/es/menu';
import { menu as itMenu } from '../locales/it/menu'; import { menu as itMenu } from '../locales/it/menu';
@ -11,6 +13,12 @@ import { menuUiHandler as frMenuUiHandler } from '../locales/fr/menu-ui-handler.
import { menuUiHandler as itMenuUiHandler } from '../locales/it/menu-ui-handler.js'; import { menuUiHandler as itMenuUiHandler } from '../locales/it/menu-ui-handler.js';
import { menuUiHandler as deMenuUiHandler } from '../locales/de/menu-ui-handler.js'; import { menuUiHandler as deMenuUiHandler } from '../locales/de/menu-ui-handler.js';
import { battle as enBattle } from '../locales/en/battle';
import { battle as esBattle } from '../locales/es/battle';
import { battle as itBattle } from '../locales/it/battle';
import { battle as frBattle } from '../locales/fr/battle';
import { battle as deBattle } from '../locales/de/battle';
import { move as enMove } from '../locales/en/move'; import { move as enMove } from '../locales/en/move';
import { move as esMove } from '../locales/es/move'; import { move as esMove } from '../locales/es/move';
import { move as frMove } from '../locales/fr/move'; import { move as frMove } from '../locales/fr/move';
@ -43,7 +51,10 @@ import { commandUiHandler as frCommandUiHandler } from '../locales/fr/command-ui
import { commandUiHandler as deCommandUiHandler } from '../locales/de/command-ui-handler'; import { commandUiHandler as deCommandUiHandler } from '../locales/de/command-ui-handler';
import { fightUiHandler as enFightUiHandler } from '../locales/en/fight-ui-handler'; import { fightUiHandler as enFightUiHandler } from '../locales/en/fight-ui-handler';
import { fightUiHandler as esFightUiHandler } from '../locales/es/fight-ui-handler';
import { fightUiHandler as frFightUiHandler } from '../locales/fr/fight-ui-handler'; import { fightUiHandler as frFightUiHandler } from '../locales/fr/fight-ui-handler';
import { fightUiHandler as itFightUiHandler } from '../locales/it/fight-ui-handler';
import { fightUiHandler as deFightUiHandler } from '../locales/de/fight-ui-handler';
import { tutorial as enTutorial } from '../locales/en/tutorial'; import { tutorial as enTutorial } from '../locales/en/tutorial';
import { tutorial as esTutorial } from '../locales/es/tutorial'; import { tutorial as esTutorial } from '../locales/es/tutorial';
@ -55,7 +66,6 @@ export interface SimpleTranslationEntries {
[key: string]: string [key: string]: string
} }
export interface MoveTranslationEntry { export interface MoveTranslationEntry {
name: string, name: string,
effect: string effect: string
@ -78,10 +88,8 @@ export interface Localizable {
localize(): void; localize(): void;
} }
const DEFAULT_LANGUAGE_OVERRIDE = '';
export function initI18n(): void { export function initI18n(): void {
let lang = 'en'; let lang = '';
if (localStorage.getItem('prLang')) if (localStorage.getItem('prLang'))
lang = localStorage.getItem('prLang'); lang = localStorage.getItem('prLang');
@ -92,6 +100,7 @@ export function initI18n(): void {
* Q: How do I add a new language? * Q: How do I add a new language?
* A: To add a new language, create a new folder in the locales directory with the language code. * A: To add a new language, create a new folder in the locales directory with the language code.
* Each language folder should contain a file for each namespace (ex. menu.ts) with the translations. * Each language folder should contain a file for each namespace (ex. menu.ts) with the translations.
* Don't forget to declare new language in `supportedLngs` i18next initializer
* *
* Q: How do I add a new namespace? * Q: How do I add a new namespace?
* A: To add a new namespace, create a new file in each language folder with the translations. * A: To add a new namespace, create a new file in each language folder with the translations.
@ -101,9 +110,10 @@ export function initI18n(): void {
* A: In src/system/settings.ts, add a new case to the Setting.Language switch statement. * A: In src/system/settings.ts, add a new case to the Setting.Language switch statement.
*/ */
i18next.init({ i18next.use(LanguageDetector).init({
lng: DEFAULT_LANGUAGE_OVERRIDE ? DEFAULT_LANGUAGE_OVERRIDE : lang, lng: lang,
fallbackLng: 'en', fallbackLng: 'en',
supportedLngs: ['en', 'es', 'fr', 'it', 'de'],
debug: true, debug: true,
interpolation: { interpolation: {
escapeValue: false, escapeValue: false,
@ -112,6 +122,7 @@ export function initI18n(): void {
en: { en: {
menu: enMenu, menu: enMenu,
menuUiHandler: enMenuUiHandler, menuUiHandler: enMenuUiHandler,
battle: enBattle,
move: enMove, move: enMove,
ability: enAbility, ability: enAbility,
pokeball: enPokeball, pokeball: enPokeball,
@ -124,17 +135,20 @@ export function initI18n(): void {
es: { es: {
menu: esMenu, menu: esMenu,
menuUiHandler: esMenuUiHandler, menuUiHandler: esMenuUiHandler,
battle: esBattle,
move: esMove, move: esMove,
ability: esAbility, ability: esAbility,
pokeball: esPokeball, pokeball: esPokeball,
pokemon: esPokemon, pokemon: esPokemon,
pokemonStat: esPokemonStat, pokemonStat: esPokemonStat,
commandUiHandler: esCommandUiHandler, commandUiHandler: esCommandUiHandler,
fightUiHandler: esFightUiHandler,
tutorial: esTutorial, tutorial: esTutorial,
}, },
fr: { fr: {
menu: frMenu, menu: frMenu,
menuUiHandler: frMenuUiHandler, menuUiHandler: frMenuUiHandler,
battle: frBattle,
move: frMove, move: frMove,
ability: frAbility, ability: frAbility,
pokeball: frPokeball, pokeball: frPokeball,
@ -147,18 +161,22 @@ export function initI18n(): void {
it: { it: {
menu: itMenu, menu: itMenu,
menuUiHandler: itMenuUiHandler, menuUiHandler: itMenuUiHandler,
battle: itBattle,
pokemonStat: itPokemonStat, pokemonStat: itPokemonStat,
fightUiHandler: itFightUiHandler,
tutorial: itTutorial, tutorial: itTutorial,
}, },
de: { de: {
menu: deMenu, menu: deMenu,
menuUiHandler: deMenuUiHandler, menuUiHandler: deMenuUiHandler,
battle: deBattle,
move: deMove, move: deMove,
ability: deAbility, ability: deAbility,
pokeball: dePokeball, pokeball: dePokeball,
pokemon: dePokemon, pokemon: dePokemon,
pokemonStat: dePokemonStat, pokemonStat: dePokemonStat,
commandUiHandler: deCommandUiHandler, commandUiHandler: deCommandUiHandler,
fightUiHandler: deFightUiHandler,
tutorial: deTutorial, tutorial: deTutorial,
} }
}, },
@ -172,6 +190,7 @@ declare module 'i18next' {
menu: typeof enMenu; menu: typeof enMenu;
menuUiHandler: typeof enMenuUiHandler; menuUiHandler: typeof enMenuUiHandler;
move: typeof enMove; move: typeof enMove;
battle: typeof enBattle,
ability: typeof enAbility; ability: typeof enAbility;
pokeball: typeof enPokeball; pokeball: typeof enPokeball;
pokemon: typeof enPokemon; pokemon: typeof enPokemon;

View File

@ -7,6 +7,7 @@ export enum AchvTier {
COMMON, COMMON,
GREAT, GREAT,
ULTRA, ULTRA,
ROGUE,
MASTER MASTER
} }
@ -50,8 +51,10 @@ export class Achv {
} }
getTier(): AchvTier { getTier(): AchvTier {
if (this.score >= 100) if (this.score >= 150)
return AchvTier.MASTER; return AchvTier.MASTER;
if (this.score >= 100)
return AchvTier.ROGUE;
if (this.score >= 50) if (this.score >= 50)
return AchvTier.ULTRA; return AchvTier.ULTRA;
if (this.score >= 25) if (this.score >= 25)

View File

@ -169,6 +169,7 @@ export interface StarterDataEntry {
moveset: StarterMoveset | StarterFormMoveData; moveset: StarterMoveset | StarterFormMoveData;
eggMoves: integer; eggMoves: integer;
candyCount: integer; candyCount: integer;
friendship: integer;
abilityAttr: integer; abilityAttr: integer;
passiveAttr: integer; passiveAttr: integer;
valueReduction: integer; valueReduction: integer;
@ -988,6 +989,7 @@ export class GameData {
moveset: null, moveset: null,
eggMoves: 0, eggMoves: 0,
candyCount: 0, candyCount: 0,
friendship: 0,
abilityAttr: defaultStarterSpecies.includes(speciesId) ? AbilityAttr.ABILITY_1 : 0, abilityAttr: defaultStarterSpecies.includes(speciesId) ? AbilityAttr.ABILITY_1 : 0,
passiveAttr: 0, passiveAttr: 0,
valueReduction: 0 valueReduction: 0
@ -1035,6 +1037,7 @@ export class GameData {
const hasPrevolution = pokemonPrevolutions.hasOwnProperty(species.speciesId); const hasPrevolution = pokemonPrevolutions.hasOwnProperty(species.speciesId);
const newCatch = !caughtAttr; const newCatch = !caughtAttr;
const hasNewAttr = (caughtAttr & dexAttr) !== dexAttr;
if (incrementCount) { if (incrementCount) {
if (!fromEgg) { if (!fromEgg) {
@ -1057,7 +1060,7 @@ export class GameData {
this.gameStats.shinyPokemonHatched++; this.gameStats.shinyPokemonHatched++;
} }
if (!hasPrevolution) if (!hasPrevolution && (!pokemon.scene.gameMode.isDaily || hasNewAttr || fromEgg))
this.addStarterCandy(species, (1 * (pokemon.isShiny() ? 5 * Math.pow(2, pokemon.variant || 0) : 1)) * (fromEgg || pokemon.isBoss() ? 2 : 1)); this.addStarterCandy(species, (1 * (pokemon.isShiny() ? 5 * Math.pow(2, pokemon.variant || 0) : 1)) * (fromEgg || pokemon.isBoss() ? 2 : 1));
} }

View File

@ -44,7 +44,7 @@ export class Voucher {
case VoucherType.PREMIUM: case VoucherType.PREMIUM:
return AchvTier.ULTRA; return AchvTier.ULTRA;
case VoucherType.GOLDEN: case VoucherType.GOLDEN:
return AchvTier.MASTER; return AchvTier.ROGUE;
} }
} }
} }

View File

@ -9,6 +9,7 @@ export enum Tutorial {
Menu = "MENU", Menu = "MENU",
Starter_Select = "STARTER_SELECT", Starter_Select = "STARTER_SELECT",
Pokerus = "POKERUS", Pokerus = "POKERUS",
Stat_Change = "STAT_CHANGE",
Select_Item = "SELECT_ITEM", Select_Item = "SELECT_ITEM",
Egg_Gacha = "EGG_GACHA" Egg_Gacha = "EGG_GACHA"
} }
@ -42,6 +43,11 @@ const tutorialHandlers = {
scene.ui.showText(i18next.t("tutorial:pokerus"), null, () => scene.ui.showText('', null, () => resolve()), null, true); scene.ui.showText(i18next.t("tutorial:pokerus"), null, () => scene.ui.showText('', null, () => resolve()), null, true);
}); });
}, },
[Tutorial.Stat_Change]: (scene: BattleScene) => {
return new Promise<void>(resolve => {
scene.showFieldOverlay(1000).then(() => scene.ui.showText(i18next.t("tutorial:statChange"), null, () => scene.ui.showText('', null, () => scene.hideFieldOverlay(1000).then(() => resolve())), null, true));
});
},
[Tutorial.Select_Item]: (scene: BattleScene) => { [Tutorial.Select_Item]: (scene: BattleScene) => {
return new Promise<void>(resolve => { return new Promise<void>(resolve => {
scene.ui.setModeWithoutClear(Mode.MESSAGE).then(() => { scene.ui.setModeWithoutClear(Mode.MESSAGE).then(() => {

View File

@ -7,6 +7,9 @@ import { StatusEffect } from '../data/status-effect';
import BattleScene from '../battle-scene'; import BattleScene from '../battle-scene';
import { Type, getTypeRgb } from '../data/type'; import { Type, getTypeRgb } from '../data/type';
import { getVariantTint } from '#app/data/variant'; import { getVariantTint } from '#app/data/variant';
import { BattleStat } from '#app/data/battle-stat';
const battleStatOrder = [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.ACC, BattleStat.EVA, BattleStat.SPD ];
export default class BattleInfo extends Phaser.GameObjects.Container { export default class BattleInfo extends Phaser.GameObjects.Container {
private player: boolean; private player: boolean;
@ -24,6 +27,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
private lastLevelExp: integer; private lastLevelExp: integer;
private lastLevel: integer; private lastLevel: integer;
private lastLevelCapped: boolean; private lastLevelCapped: boolean;
private lastBattleStats: string;
private box: Phaser.GameObjects.Sprite; private box: Phaser.GameObjects.Sprite;
private nameText: Phaser.GameObjects.Text; private nameText: Phaser.GameObjects.Text;
@ -46,6 +50,11 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
public expMaskRect: Phaser.GameObjects.Graphics; public expMaskRect: Phaser.GameObjects.Graphics;
private statsContainer: Phaser.GameObjects.Container;
private statsBox: Phaser.GameObjects.Sprite;
private statValuesContainer: Phaser.GameObjects.Container;
private statNumbers: Phaser.GameObjects.Sprite[];
constructor(scene: Phaser.Scene, x: number, y: number, player: boolean) { constructor(scene: Phaser.Scene, x: number, y: number, player: boolean) {
super(scene, x, y); super(scene, x, y);
this.player = player; this.player = player;
@ -138,18 +147,6 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
this.levelNumbersContainer = this.scene.add.container(9.5, (this.scene as BattleScene).uiTheme ? 0 : -0.5); this.levelNumbersContainer = this.scene.add.container(9.5, (this.scene as BattleScene).uiTheme ? 0 : -0.5);
this.levelContainer.add(this.levelNumbersContainer); this.levelContainer.add(this.levelNumbersContainer);
this.type1Icon = this.scene.add.sprite(player ? -139 : -15, player ? -17 : -15.5, `pbinfo_${player ? 'player' : 'enemy'}_type1`);
this.type1Icon.setOrigin(0, 0);
this.add(this.type1Icon);
this.type2Icon = this.scene.add.sprite(player ? -139 : -15, player ? -1 : -2.5, `pbinfo_${player ? 'player' : 'enemy'}_type2`);
this.type2Icon.setOrigin(0, 0);
this.add(this.type2Icon);
this.type3Icon = this.scene.add.sprite(player ? -154 : 0, player ? -17 : -15.5, `pbinfo_${player ? 'player' : 'enemy'}_type`);
this.type3Icon.setOrigin(0, 0);
this.add(this.type3Icon);
if (this.player) { if (this.player) {
this.hpNumbersContainer = this.scene.add.container(-15, 10); this.hpNumbersContainer = this.scene.add.container(-15, 10);
this.add(this.hpNumbersContainer); this.add(this.hpNumbersContainer);
@ -171,6 +168,46 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
this.expBar = expBar; this.expBar = expBar;
this.expMaskRect = expMaskRect; this.expMaskRect = expMaskRect;
} }
this.statsContainer = this.scene.add.container(0, 0);
this.statsContainer.setAlpha(0);
this.add(this.statsContainer);
this.statsBox = this.scene.add.sprite(0, 0, `${this.getTextureName()}_stats`);
this.statsBox.setOrigin(1, 0.5);
this.statsContainer.add(this.statsBox);
const statLabels: Phaser.GameObjects.Sprite[] = [];
this.statNumbers = [];
this.statValuesContainer = this.scene.add.container(0, 0);
this.statsContainer.add(this.statValuesContainer);
battleStatOrder.map((s, i) => {
const statX = i > 1 ? this.statNumbers[i - 2].x + this.statNumbers[i - 2].width + 4 : -this.statsBox.width + 8;
const statY = -this.statsBox.height / 2 + 4 + (i < battleStatOrder.length - 1 ? (i % 2 ? 10 : 0) : 5);
const statLabel = this.scene.add.sprite(statX, statY, 'pbinfo_stat', BattleStat[s]);
statLabel.setOrigin(0, 0);
statLabels.push(statLabel);
this.statValuesContainer.add(statLabel);
const statNumber = this.scene.add.sprite(statX + statLabel.width, statY, 'pbinfo_stat_numbers', '3');
statNumber.setOrigin(0, 0);
this.statNumbers.push(statNumber);
this.statValuesContainer.add(statNumber);
});
this.type1Icon = this.scene.add.sprite(player ? -139 : -15, player ? -17 : -15.5, `pbinfo_${player ? 'player' : 'enemy'}_type1`);
this.type1Icon.setOrigin(0, 0);
this.add(this.type1Icon);
this.type2Icon = this.scene.add.sprite(player ? -139 : -15, player ? -1 : -2.5, `pbinfo_${player ? 'player' : 'enemy'}_type2`);
this.type2Icon.setOrigin(0, 0);
this.add(this.type2Icon);
this.type3Icon = this.scene.add.sprite(player ? -154 : 0, player ? -17 : -15.5, `pbinfo_${player ? 'player' : 'enemy'}_type`);
this.type3Icon.setOrigin(0, 0);
this.add(this.type3Icon);
} }
initInfo(pokemon: Pokemon) { initInfo(pokemon: Pokemon) {
@ -258,7 +295,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
this.expMaskRect.x = (pokemon.levelExp / getLevelTotalExp(pokemon.level, pokemon.species.growthRate)) * 510; this.expMaskRect.x = (pokemon.levelExp / getLevelTotalExp(pokemon.level, pokemon.species.growthRate)) * 510;
this.lastExp = pokemon.exp; this.lastExp = pokemon.exp;
this.lastLevelExp = pokemon.levelExp; this.lastLevelExp = pokemon.levelExp;
this.statValuesContainer.setPosition(8, 7)
} }
const battleStats = battleStatOrder.map(() => 0);
this.lastBattleStats = battleStats.join('');
this.updateBattleStats(battleStats);
} }
getTextureName(): string { getTextureName(): string {
@ -272,6 +316,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
this.mini = mini; this.mini = mini;
this.box.setTexture(this.getTextureName()); this.box.setTexture(this.getTextureName());
this.statsBox.setTexture(`${this.getTextureName()}_stats`);
if (this.player) if (this.player)
this.y -= 12 * (mini ? 1 : -1); this.y -= 12 * (mini ? 1 : -1);
@ -284,21 +329,34 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
el.y += -8 * (mini ? 1 : -1); el.y += -8 * (mini ? 1 : -1);
}); });
this.statValuesContainer.x += 2 * (mini ? 1 : -1);
this.statValuesContainer.y += -7 * (mini ? 1 : -1);
const toggledElements = [ this.hpNumbersContainer, this.expBar ]; const toggledElements = [ this.hpNumbersContainer, this.expBar ];
toggledElements.forEach(el => el.setVisible(!mini)); toggledElements.forEach(el => el.setVisible(!mini));
} }
toggleStats(visible: boolean): void {
this.scene.tweens.add({
targets: this.statsContainer,
duration: Utils.fixedInt(125),
ease: 'Sine.easeInOut',
alpha: visible ? 1 : 0
});
}
updateBossSegments(pokemon: EnemyPokemon): void { updateBossSegments(pokemon: EnemyPokemon): void {
const boss = !!pokemon.bossSegments; const boss = !!pokemon.bossSegments;
if (boss !== this.boss) { if (boss !== this.boss) {
this.boss = boss; this.boss = boss;
[ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.ownedIcon, this.statusIndicator, this.levelContainer ].map(e => e.x += 48 * (boss ? -1 : 1)); [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.ownedIcon, this.statusIndicator, this.levelContainer, this.statValuesContainer ].map(e => e.x += 48 * (boss ? -1 : 1));
this.hpBar.x += 38 * (boss ? -1 : 1); this.hpBar.x += 38 * (boss ? -1 : 1);
this.hpBar.y += 2 * (this.boss ? -1 : 1); this.hpBar.y += 2 * (this.boss ? -1 : 1);
this.hpBar.setTexture(`overlay_hp${boss ? '_boss' : ''}`); this.hpBar.setTexture(`overlay_hp${boss ? '_boss' : ''}`);
this.box.setTexture(this.getTextureName()); this.box.setTexture(this.getTextureName());
this.statsBox.setTexture(`${this.getTextureName()}_stats`);
} }
this.bossSegments = boss ? pokemon.bossSegments : 0; this.bossSegments = boss ? pokemon.bossSegments : 0;
@ -317,6 +375,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
const divider = this.scene.add.rectangle(0, 0, 1, this.hpBar.height - (uiTheme ? 0 : 1), pokemon.bossSegmentIndex >= s ? 0xFFFFFF : 0x404040) const divider = this.scene.add.rectangle(0, 0, 1, this.hpBar.height - (uiTheme ? 0 : 1), pokemon.bossSegmentIndex >= s ? 0xFFFFFF : 0x404040)
divider.setOrigin(0.5, 0); divider.setOrigin(0.5, 0);
this.add(divider); this.add(divider);
this.moveBelow(divider as Phaser.GameObjects.GameObject, this.statsContainer);
divider.setPositionRelative(this.hpBar, dividerX, uiTheme ? 0 : 1); divider.setPositionRelative(this.hpBar, dividerX, uiTheme ? 0 : 1);
this.hpBarSegmentDividers.push(divider); this.hpBarSegmentDividers.push(divider);
@ -439,6 +498,16 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
this.lastLevel = pokemon.level; this.lastLevel = pokemon.level;
} }
const battleStats = pokemon.summonData
? pokemon.summonData.battleStats
: battleStatOrder.map(() => 0);
const battleStatsStr = battleStats.join('');
if (this.lastBattleStats !== battleStatsStr) {
this.updateBattleStats(battleStats);
this.lastBattleStats = battleStatsStr;
}
this.shinyIcon.setVisible(pokemon.isShiny()); this.shinyIcon.setVisible(pokemon.isShiny());
resolve(); resolve();
@ -513,7 +582,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
}); });
} }
setLevel(level: integer) { setLevel(level: integer): void {
const isCapped = level >= (this.scene as BattleScene).getMaxExpLevel(); const isCapped = level >= (this.scene as BattleScene).getMaxExpLevel();
this.levelNumbersContainer.removeAll(true); this.levelNumbersContainer.removeAll(true);
const levelStr = level.toString(); const levelStr = level.toString();
@ -522,7 +591,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
this.levelContainer.setX((this.player ? -41 : -50) - 8 * Math.max(levelStr.length - 3, 0)); this.levelContainer.setX((this.player ? -41 : -50) - 8 * Math.max(levelStr.length - 3, 0));
} }
setHpNumbers(hp: integer, maxHp: integer) { setHpNumbers(hp: integer, maxHp: integer): void {
if (!this.player || !this.scene) if (!this.player || !this.scene)
return; return;
this.hpNumbersContainer.removeAll(true); this.hpNumbersContainer.removeAll(true);
@ -535,6 +604,12 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
for (let i = hpStr.length - 1; i >= 0; i--) for (let i = hpStr.length - 1; i >= 0; i--)
this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, 'numbers', hpStr[i])); this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, 'numbers', hpStr[i]));
} }
updateBattleStats(battleStats: integer[]): void {
battleStatOrder.map((s, i) => {
this.statNumbers[i].setFrame(battleStats[s].toString());
});
}
} }
export class PlayerBattleInfo extends BattleInfo { export class PlayerBattleInfo extends BattleInfo {

View File

@ -1,15 +1,16 @@
import BattleScene, { Button } from "../battle-scene"; import BattleScene, { Button } from "../battle-scene";
import { addTextObject, TextStyle } from "./text"; import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "./text";
import { Mode } from "./ui"; import { Mode } from "./ui";
import * as Utils from "../utils"; import * as Utils from "../utils";
import MessageUiHandler from "./message-ui-handler"; import MessageUiHandler from "./message-ui-handler";
import { getStatName, Stat } from "../data/pokemon-stat"; import { getStatName, Stat } from "../data/pokemon-stat";
import { addWindow } from "./ui-theme"; import { addWindow } from "./ui-theme";
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
export default class BattleMessageUiHandler extends MessageUiHandler { export default class BattleMessageUiHandler extends MessageUiHandler {
private levelUpStatsContainer: Phaser.GameObjects.Container; private levelUpStatsContainer: Phaser.GameObjects.Container;
private levelUpStatsIncrContent: Phaser.GameObjects.Text; private levelUpStatsIncrContent: Phaser.GameObjects.Text;
private levelUpStatsValuesContent: Phaser.GameObjects.Text; private levelUpStatsValuesContent: BBCodeText;
private nameBox: Phaser.GameObjects.NineSlice; private nameBox: Phaser.GameObjects.NineSlice;
private nameText: Phaser.GameObjects.Text; private nameText: Phaser.GameObjects.Text;
@ -95,18 +96,19 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
this.levelUpStatsContainer = levelUpStatsContainer; this.levelUpStatsContainer = levelUpStatsContainer;
const levelUpStatsBg = addWindow(this.scene, (this.scene.game.canvas.width / 6), -100, 128, 100); const levelUpStatsLabelsContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 73, -94, '', TextStyle.WINDOW, { maxLines: 6 });
levelUpStatsBg.setOrigin(1, 0);
levelUpStatsContainer.add(levelUpStatsBg);
const levelUpStatsLabelsContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 121, -94, '', TextStyle.WINDOW, { maxLines: 6 });
let levelUpStatsLabelText = ''; let levelUpStatsLabelText = '';
const stats = Utils.getEnumValues(Stat); const stats = Utils.getEnumValues(Stat);
for (let s of stats) for (let s of stats)
levelUpStatsLabelText += `${getStatName(s)}\n`; levelUpStatsLabelText += `${getStatName(s)}\n`;
levelUpStatsLabelsContent.text = levelUpStatsLabelText; levelUpStatsLabelsContent.text = levelUpStatsLabelText;
levelUpStatsLabelsContent.x -= levelUpStatsLabelsContent.displayWidth;
const levelUpStatsBg = addWindow(this.scene, (this.scene.game.canvas.width / 6), -100, 80 + levelUpStatsLabelsContent.displayWidth, 100);
levelUpStatsBg.setOrigin(1, 0);
levelUpStatsContainer.add(levelUpStatsBg);
levelUpStatsContainer.add(levelUpStatsLabelsContent); levelUpStatsContainer.add(levelUpStatsLabelsContent);
const levelUpStatsIncrContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 50, -94, '+\n+\n+\n+\n+\n+', TextStyle.WINDOW, { maxLines: 6 }); const levelUpStatsIncrContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 50, -94, '+\n+\n+\n+\n+\n+', TextStyle.WINDOW, { maxLines: 6 });
@ -114,7 +116,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
this.levelUpStatsIncrContent = levelUpStatsIncrContent; this.levelUpStatsIncrContent = levelUpStatsIncrContent;
const levelUpStatsValuesContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 7, -94, '', TextStyle.WINDOW, { maxLines: 6 }); const levelUpStatsValuesContent = addBBCodeTextObject(this.scene, (this.scene.game.canvas.width / 6) - 7, -94, '', TextStyle.WINDOW, { maxLines: 6 , lineSpacing: 5});
levelUpStatsValuesContent.setOrigin(1, 0); levelUpStatsValuesContent.setOrigin(1, 0);
levelUpStatsValuesContent.setAlign('right'); levelUpStatsValuesContent.setAlign('right');
levelUpStatsContainer.add(levelUpStatsValuesContent); levelUpStatsContainer.add(levelUpStatsValuesContent);
@ -208,7 +210,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
} else } else
shownStats = stats; shownStats = stats;
for (let s of stats) for (let s of stats)
levelUpStatsValuesText += `${shownStats.indexOf(s) > -1 ? this.getIvDescriptor(ivs[s]) : '???'}\n`; levelUpStatsValuesText += `${shownStats.indexOf(s) > -1 ? this.getIvDescriptor(ivs[s], s, pokemonId) : '???'}\n`;
this.levelUpStatsValuesContent.text = levelUpStatsValuesText; this.levelUpStatsValuesContent.text = levelUpStatsValuesText;
this.levelUpStatsIncrContent.setVisible(false); this.levelUpStatsIncrContent.setVisible(false);
this.levelUpStatsContainer.setVisible(true); this.levelUpStatsContainer.setVisible(true);
@ -221,18 +223,30 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
}); });
} }
getIvDescriptor(value: integer): string { getIvDescriptor(value: integer, typeIv: integer, pokemonId: integer): string {
const starterSpecies = this.scene.getPokemonById(pokemonId).species.getRootSpeciesId(true);
const starterIvs: number[] = this.scene.gameData.dexData[starterSpecies].ivs;
const uiTheme = (this.scene as BattleScene).uiTheme; // Assuming uiTheme is accessible
// Function to wrap text in color based on comparison
const coloredText = (text: string, isBetter: boolean) => {
const textStyle: TextStyle = isBetter ? TextStyle.SUMMARY_GREEN : TextStyle.SUMMARY;
const color = getTextColor(textStyle, false, uiTheme);
return `[color=${color}][shadow=${getTextColor(textStyle, true, uiTheme)}]${text}[/shadow][/color]`;
};
if (value > 30) if (value > 30)
return 'Best'; return coloredText('Best', value > starterIvs[typeIv]);
if (value === 30) if (value === 30)
return 'Fantastic'; return coloredText('Fantastic', value > starterIvs[typeIv]);
if (value > 20) if (value > 20)
return 'Very Good'; return coloredText('Very Good', value > starterIvs[typeIv]);
if (value > 10) if (value > 10)
return 'Pretty Good'; return coloredText('Pretty Good', value > starterIvs[typeIv]);
if (value) if (value > 0)
return 'Decent'; return coloredText('Decent', value > starterIvs[typeIv]);
return 'No Good';
return coloredText('No Good', value > starterIvs[typeIv]);
} }
showNameText(name: string): void { showNameText(name: string): void {

View File

@ -69,6 +69,8 @@ export default class CandyBar extends Phaser.GameObjects.Container {
if (this.tween) if (this.tween)
this.tween.stop(); this.tween.stop();
(this.scene as BattleScene).playSound('shing');
this.tween = this.scene.tweens.add({ this.tween = this.scene.tweens.add({
targets: this, targets: this,
x: (this.scene.game.canvas.width / 6) - (this.bg.width - 5), x: (this.scene.game.canvas.width / 6) - (this.bg.width - 5),

View File

@ -1,6 +1,7 @@
import BattleScene, { Button } from "../battle-scene"; import BattleScene, { Button } from "../battle-scene";
import AbstractOptionSelectUiHandler, { OptionSelectConfig } from "./abstact-option-select-ui-handler"; import AbstractOptionSelectUiHandler, { OptionSelectConfig } from "./abstact-option-select-ui-handler";
import { Mode } from "./ui"; import { Mode } from "./ui";
import i18next from "i18next";
export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler {
private switchCheck: boolean; private switchCheck: boolean;
@ -19,14 +20,14 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler {
const config: OptionSelectConfig = { const config: OptionSelectConfig = {
options: [ options: [
{ {
label: 'Yes', label: i18next.t("menu:yes"),
handler: () => { handler: () => {
args[0](); args[0]();
return true; return true;
} }
}, },
{ {
label: 'No', label: i18next.t("menu:no"),
handler: () => { handler: () => {
args[1](); args[1]();
return true; return true;

View File

@ -11,6 +11,7 @@ interface RankingEntry {
wave: integer wave: integer
} }
// Don't forget to update translations when adding a new category
enum ScoreboardCategory { enum ScoreboardCategory {
DAILY, DAILY,
WEEKLY WEEKLY
@ -40,7 +41,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
const titleWindow = addWindow(this.scene, 0, 0, 114, 18, false, false, null, null, WindowVariant.THIN); const titleWindow = addWindow(this.scene, 0, 0, 114, 18, false, false, null, null, WindowVariant.THIN);
this.add(titleWindow); this.add(titleWindow);
this.titleLabel = addTextObject(this.scene, titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, i18next.t('menu:dailyRankings'), TextStyle.WINDOW, { fontSize: '64px' }); this.titleLabel = addTextObject(this.scene, titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, i18next.t('menu:loading'), TextStyle.WINDOW, { fontSize: '64px' });
this.titleLabel.setOrigin(0.5, 0.5); this.titleLabel.setOrigin(0.5, 0.5);
this.add(this.titleLabel); this.add(this.titleLabel);
@ -156,7 +157,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
.then(jsonResponse => { .then(jsonResponse => {
this.page = page; this.page = page;
this.category = category; this.category = category;
this.titleLabel.setText(`${Utils.toReadableString(ScoreboardCategory[category])} ${i18next.t("menu:rankings")}`); this.titleLabel.setText(`${i18next.t(`menu:${ScoreboardCategory[category].toLowerCase()}Rankings`)}`);
this.prevPageButton.setAlpha(page > 1 ? 1 : 0.5); this.prevPageButton.setAlpha(page > 1 ? 1 : 0.5);
this.nextPageButton.setAlpha(page < this.pageCount ? 1 : 0.5); this.nextPageButton.setAlpha(page < this.pageCount ? 1 : 0.5);
this.pageNumberLabel.setText(page.toString()); this.pageNumberLabel.setText(page.toString());
@ -166,7 +167,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
} else } else
this.loadingLabel.setText(i18next.t('menu:noRankings')); this.loadingLabel.setText(i18next.t('menu:noRankings'));
}); });
}); }).catch(err => { console.error("Failed to load daily rankings:\n", err) });
} }
} }

View File

@ -90,6 +90,7 @@ export default class PartyUiHandler extends MessageUiHandler {
private selectFilter: PokemonSelectFilter | PokemonModifierTransferSelectFilter; private selectFilter: PokemonSelectFilter | PokemonModifierTransferSelectFilter;
private moveSelectFilter: PokemonMoveSelectFilter; private moveSelectFilter: PokemonMoveSelectFilter;
private tmMoveId: Moves; private tmMoveId: Moves;
private showMovePp: boolean;
private iconAnimHandler: PokemonIconAnimHandler; private iconAnimHandler: PokemonIconAnimHandler;
@ -185,6 +186,7 @@ export default class PartyUiHandler extends MessageUiHandler {
? args[4] as PokemonMoveSelectFilter ? args[4] as PokemonMoveSelectFilter
: PartyUiHandler.FilterAllMoves; : PartyUiHandler.FilterAllMoves;
this.tmMoveId = args.length > 5 && args[5] ? args[5] : Moves.NONE; this.tmMoveId = args.length > 5 && args[5] ? args[5] : Moves.NONE;
this.showMovePp = args.length > 6 && args[6];
this.partyContainer.setVisible(true); this.partyContainer.setVisible(true);
this.partyBg.setTexture(`party_bg${this.scene.currentBattle.double ? '_double' : ''}`); this.partyBg.setTexture(`party_bg${this.scene.currentBattle.double ? '_double' : ''}`);
@ -663,7 +665,14 @@ export default class PartyUiHandler extends MessageUiHandler {
case PartyOption.MOVE_2: case PartyOption.MOVE_2:
case PartyOption.MOVE_3: case PartyOption.MOVE_3:
case PartyOption.MOVE_4: case PartyOption.MOVE_4:
optionName = pokemon.moveset[option - PartyOption.MOVE_1].getName(); const move = pokemon.moveset[option - PartyOption.MOVE_1];
if(this.showMovePp) {
const maxPP = move.getMovePp();
const currPP = maxPP - move.ppUsed;
optionName = `${move.getName()} ${currPP}/${maxPP}`;
} else {
optionName = move.getName();
}
break; break;
default: default:
if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) { if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) {

View File

@ -161,8 +161,9 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
if (isFusion) if (isFusion)
this.pokemonFusionShinyIcon.setTint(getVariantTint(pokemon.fusionVariant)); this.pokemonFusionShinyIcon.setTint(getVariantTint(pokemon.fusionVariant));
const originalIvs: integer[] = this.scene.gameData.dexData[pokemon.species.speciesId].caughtAttr const starterSpeciesId = pokemon.species.getRootSpeciesId(true);
? this.scene.gameData.dexData[pokemon.species.speciesId].ivs const originalIvs: integer[] = this.scene.gameData.dexData[starterSpeciesId].caughtAttr
? this.scene.gameData.dexData[starterSpeciesId].ivs
: null; : null;
this.statsContainer.updateIvs(pokemon.ivs, originalIvs); this.statsContainer.updateIvs(pokemon.ivs, originalIvs);

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