fix conflict
10817
public/images/items.json
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 50 KiB |
BIN
public/images/items/bronze_ribbon.png
Normal file
After Width: | Height: | Size: 400 B |
BIN
public/images/items/great_ribbon.png
Normal file
After Width: | Height: | Size: 408 B |
BIN
public/images/items/master_ribbon.png
Normal file
After Width: | Height: | Size: 408 B |
BIN
public/images/items/rogue_ribbon.png
Normal file
After Width: | Height: | Size: 407 B |
BIN
public/images/items/ultra_ribbon.png
Normal file
After Width: | Height: | Size: 406 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-dandy.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 71,
|
||||
"h": 71
|
||||
"w": 65,
|
||||
"h": 65
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.5,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 56,
|
||||
"h": 71
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 56,
|
||||
"h": 71
|
||||
"x": 22,
|
||||
"y": 15,
|
||||
"w": 50,
|
||||
"h": 65
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 56,
|
||||
"h": 71
|
||||
"w": 50,
|
||||
"h": 65
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:29165e5c573c8a4235076355ce5d29d5:17a1912fd81d23ce8a7209e27ad3e9ed:b5a287256e260744fe6660dc2ceefd11$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:c09947cc1f66b7a7bf844a7caaa3bd76:20ba7e14cce8a9ee80955d94d19ae46f:b5a287256e260744fe6660dc2ceefd11$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 765 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-debutante.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 67,
|
||||
"h": 67
|
||||
"w": 61,
|
||||
"h": 61
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.5,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 56,
|
||||
"h": 67
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 56,
|
||||
"h": 67
|
||||
"x": 20,
|
||||
"y": 19,
|
||||
"w": 50,
|
||||
"h": 61
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 56,
|
||||
"h": 67
|
||||
"w": 50,
|
||||
"h": 61
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:689efba1d73755e99f598016fd321c3c:07d06d321fff31976e1b993edb972e4f:bf2f862a1c8881133f9f3ffbf44602fa$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:107780a0e7447bf89ae4998e24021f8b:7623c7ab8d7b6bc5f755e8a1f81ea257:bf2f862a1c8881133f9f3ffbf44602fa$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 802 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-diamond.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 74,
|
||||
"h": 74
|
||||
"w": 68,
|
||||
"h": 68
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.5,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 53,
|
||||
"h": 74
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 53,
|
||||
"h": 74
|
||||
"x": 24,
|
||||
"y": 12,
|
||||
"w": 47,
|
||||
"h": 68
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 53,
|
||||
"h": 74
|
||||
"w": 47,
|
||||
"h": 68
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:b33f3de937219e7763316531398d7bbd:c7e104da9393ec52b9e6d37f92fc20d9:88c467fc09249b0d2f579d44eacd528d$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:90477dc67c3429f2f0430f0a868ed85c:bd69660307b7d945313b73a256c24d57:88c467fc09249b0d2f579d44eacd528d$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 807 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-heart.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 72,
|
||||
"h": 72
|
||||
"w": 66,
|
||||
"h": 66
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.5,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 54,
|
||||
"h": 72
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 54,
|
||||
"h": 72
|
||||
"x": 24,
|
||||
"y": 14,
|
||||
"w": 48,
|
||||
"h": 66
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 54,
|
||||
"h": 72
|
||||
"w": 48,
|
||||
"h": 66
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:15e433a2269dd4043b1614811a1b8fbd:421a40542b16cdb2cc154c85e963b40d:e11d4dd16bff2ef69bc5ca683c44ca7c$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:a9b1c7a73abb563b1ecadad8b517794e:2273c7342204f52860d8e96670ddf46a:e11d4dd16bff2ef69bc5ca683c44ca7c$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 813 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-kabuki.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 70,
|
||||
"h": 70
|
||||
"w": 64,
|
||||
"h": 64
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.5,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 58,
|
||||
"h": 70
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 58,
|
||||
"h": 70
|
||||
"x": 22,
|
||||
"y": 16,
|
||||
"w": 52,
|
||||
"h": 64
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 58,
|
||||
"h": 70
|
||||
"w": 52,
|
||||
"h": 64
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:7f4056b1c055475f905d048c8d8d2969:08eecd31f557298e1570ec3490acffe2:c3cad56aa65d2ee971ceebc435a14ee6$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:d36abbc31bcd28664e28eb50f8e4719d:43c9d8bb344b7a1373b93f493badb47e:c3cad56aa65d2ee971ceebc435a14ee6$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 842 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-la-reine.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 69,
|
||||
"h": 69
|
||||
"w": 63,
|
||||
"h": 63
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.5,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 55,
|
||||
"h": 69
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 55,
|
||||
"h": 69
|
||||
"x": 23,
|
||||
"y": 17,
|
||||
"w": 49,
|
||||
"h": 63
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 55,
|
||||
"h": 69
|
||||
"w": 49,
|
||||
"h": 63
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:d209428aca72f49f1e9ee3e97f1c18ab:c56ae957d7acb10c7373b842af3a8786:b99821e87dffda3297dd25a224a9029f$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:81b2b5d853a3d2527630ca0b2fea6569:98097941483e509b7962c50b179d132f:b99821e87dffda3297dd25a224a9029f$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 726 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-matron.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 68,
|
||||
"h": 68
|
||||
"w": 62,
|
||||
"h": 62
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.5,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 52,
|
||||
"h": 68
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 52,
|
||||
"h": 68
|
||||
"x": 23,
|
||||
"y": 18,
|
||||
"w": 46,
|
||||
"h": 62
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 52,
|
||||
"h": 68
|
||||
"w": 46,
|
||||
"h": 62
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:698fab0e5221743b912637e774bfaecd:72a9977db421d061829c639e3b50a617:020798583d07c479020bb0af34cf8bb6$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:50d9857668a013306b96adc3777a22b2:7d3708f1b5b6eeb8419815fc6734bf06:020798583d07c479020bb0af34cf8bb6$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 777 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-pharaoh.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 69,
|
||||
"h": 69
|
||||
"w": 63,
|
||||
"h": 63
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.5,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 52,
|
||||
"h": 69
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 52,
|
||||
"h": 69
|
||||
"x": 25,
|
||||
"y": 17,
|
||||
"w": 46,
|
||||
"h": 63
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 52,
|
||||
"h": 69
|
||||
"w": 46,
|
||||
"h": 63
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:5c1df95bcf0d53d4f1b9f1bf77690598:623b4bc6698ef1a984b6bad42e68115b:904b7ab6f57249c96beea4b5f72deb53$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:69f1be06f9a7175f294267b08e7ba275:42e7e4068e30b78248d3629cffa5d2ec:904b7ab6f57249c96beea4b5f72deb53$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 770 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-star.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 72,
|
||||
"h": 72
|
||||
"w": 66,
|
||||
"h": 66
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.5,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 56,
|
||||
"h": 72
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 56,
|
||||
"h": 72
|
||||
"x": 24,
|
||||
"y": 14,
|
||||
"w": 50,
|
||||
"h": 66
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 56,
|
||||
"h": 72
|
||||
"w": 50,
|
||||
"h": 66
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:31c1ce60aa953fb647ff40c50ac54cf1:d7eefc05e299310d05d389e05997e449:dd7fedf66b493b0bbdef5d25e0041dd8$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:fde8824a7749541f5af1cc14e6281670:204c6eb602358a5c7c1389b42317ffce:dd7fedf66b493b0bbdef5d25e0041dd8$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 838 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-dandy.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 72,
|
||||
"h": 72
|
||||
"w": 66,
|
||||
"h": 66
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.333,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 62,
|
||||
"h": 72
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 62,
|
||||
"h": 72
|
||||
"x": 20,
|
||||
"y": 14,
|
||||
"w": 56,
|
||||
"h": 66
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 62,
|
||||
"h": 72
|
||||
"w": 56,
|
||||
"h": 66
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:92d02eca8d05166d15bfa8b79ac478b9:f01538e7a19ca3d0d2fea48cd27d8a4c:b5a287256e260744fe6660dc2ceefd11$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:24899e1e616c6a0b9143d36903f9249e:8132d78c7f1f4ab0f673c82868b6a090:b5a287256e260744fe6660dc2ceefd11$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 715 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-debutante.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 68,
|
||||
"h": 68
|
||||
"w": 62,
|
||||
"h": 62
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.333,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 57,
|
||||
"h": 68
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 57,
|
||||
"h": 68
|
||||
"x": 25,
|
||||
"y": 18,
|
||||
"w": 51,
|
||||
"h": 62
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 57,
|
||||
"h": 68
|
||||
"w": 51,
|
||||
"h": 62
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:76ef75ea5c9561531c220cdb7f78934d:6f39eb82deb32d251df708f5d4edc9f1:bf2f862a1c8881133f9f3ffbf44602fa$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:ba172ad89c93e6e6f36f621c38e54754:7c9d0d13f309221141cd334833e412a5:bf2f862a1c8881133f9f3ffbf44602fa$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 782 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-diamond.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 74,
|
||||
"h": 74
|
||||
"w": 68,
|
||||
"h": 68
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.333,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 51,
|
||||
"h": 74
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 51,
|
||||
"h": 74
|
||||
"x": 27,
|
||||
"y": 12,
|
||||
"w": 45,
|
||||
"h": 68
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 51,
|
||||
"h": 74
|
||||
"w": 45,
|
||||
"h": 68
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:d2b094f0534f6acd2e5bbe67b8e94fa8:47037a1746645a551e31781cb8262e1f:88c467fc09249b0d2f579d44eacd528d$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:0a6f3993923b87e1c16c84b1aa8c3705:6d59d20d1b0cd07c3e7a16eadf0de4cf:88c467fc09249b0d2f579d44eacd528d$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 696 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-heart.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 71,
|
||||
"h": 71
|
||||
"w": 65,
|
||||
"h": 65
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.333,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 52,
|
||||
"h": 71
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 52,
|
||||
"h": 71
|
||||
"x": 26,
|
||||
"y": 15,
|
||||
"w": 46,
|
||||
"h": 65
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 52,
|
||||
"h": 71
|
||||
"w": 46,
|
||||
"h": 65
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:537e6149183f630be038f053dd62d27d:dce25f0e6474cad17709f18c96ffb3e5:e11d4dd16bff2ef69bc5ca683c44ca7c$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:f99ca7d216355ffd449999125499d32e:cf2dd50594846ac631d9da32cd66dceb:e11d4dd16bff2ef69bc5ca683c44ca7c$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 730 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-kabuki.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 71,
|
||||
"h": 71
|
||||
"w": 65,
|
||||
"h": 65
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.333,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 55,
|
||||
"h": 71
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 55,
|
||||
"h": 71
|
||||
"x": 23,
|
||||
"y": 15,
|
||||
"w": 49,
|
||||
"h": 65
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 55,
|
||||
"h": 71
|
||||
"w": 49,
|
||||
"h": 65
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:dfc02a08763810a151fc4e22c23a3093:2f6c7f2792f64728b478333fc2c65138:c3cad56aa65d2ee971ceebc435a14ee6$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:8de2d15ea2537eb2104a72a133418e94:903840ea77662ae31175e482a712402a:c3cad56aa65d2ee971ceebc435a14ee6$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 729 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-la-reine.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 69,
|
||||
"h": 69
|
||||
"w": 63,
|
||||
"h": 63
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.333,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 54,
|
||||
"h": 69
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 54,
|
||||
"h": 69
|
||||
"x": 24,
|
||||
"y": 17,
|
||||
"w": 48,
|
||||
"h": 63
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 54,
|
||||
"h": 69
|
||||
"w": 48,
|
||||
"h": 63
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:014beffd470b78d94c3234500d9dee5b:3261fa54b4c9574937d670de782ca3e8:b99821e87dffda3297dd25a224a9029f$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:b72b1f5723bb276f4a555ccdbb3ed4c0:0ab778e99ee37c883a0b1a0f918f1bee:b99821e87dffda3297dd25a224a9029f$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 655 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-matron.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 68,
|
||||
"h": 68
|
||||
"w": 62,
|
||||
"h": 62
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.333,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 53,
|
||||
"h": 68
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 53,
|
||||
"h": 68
|
||||
"x": 26,
|
||||
"y": 18,
|
||||
"w": 47,
|
||||
"h": 62
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 53,
|
||||
"h": 68
|
||||
"w": 47,
|
||||
"h": 62
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:a9199442be3400b8a70f8ad212790732:18b55adc9c377d1b24d6b236e1f39177:020798583d07c479020bb0af34cf8bb6$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:d447de0737ae7f9ca8690e7f039a884d:1ffc2bfd67fda79ede1d0e489bf36c94:020798583d07c479020bb0af34cf8bb6$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 740 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-pharaoh.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 70,
|
||||
"h": 70
|
||||
"w": 64,
|
||||
"h": 64
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.333,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 53,
|
||||
"h": 70
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 53,
|
||||
"h": 70
|
||||
"x": 25,
|
||||
"y": 16,
|
||||
"w": 47,
|
||||
"h": 64
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 53,
|
||||
"h": 70
|
||||
"w": 47,
|
||||
"h": 64
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:be799b3acab0a591e7b2d4a2ad903c94:6260eeb9aa48a1047c8ec12842ac28c6:904b7ab6f57249c96beea4b5f72deb53$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:729eefb95778889aa11840e684f35af8:9c72a2d345e9be40096dffd6b99a7ba0:904b7ab6f57249c96beea4b5f72deb53$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 725 B |
@ -4,30 +4,30 @@
|
||||
"image": "676-star.png",
|
||||
"format": "RGBA8888",
|
||||
"size": {
|
||||
"w": 72,
|
||||
"h": 72
|
||||
"w": 66,
|
||||
"h": 66
|
||||
},
|
||||
"scale": 1,
|
||||
"scale": 0.333,
|
||||
"frames": [
|
||||
{
|
||||
"filename": "0001.png",
|
||||
"rotated": false,
|
||||
"trimmed": false,
|
||||
"sourceSize": {
|
||||
"w": 54,
|
||||
"h": 72
|
||||
"w": 96,
|
||||
"h": 96
|
||||
},
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 54,
|
||||
"h": 72
|
||||
"x": 24,
|
||||
"y": 14,
|
||||
"w": 48,
|
||||
"h": 66
|
||||
},
|
||||
"frame": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 54,
|
||||
"h": 72
|
||||
"w": 48,
|
||||
"h": 66
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -36,6 +36,6 @@
|
||||
"meta": {
|
||||
"app": "https://www.codeandweb.com/texturepacker",
|
||||
"version": "3.0",
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:8a18f8f110bc4f6f6e86ca95b9a566b8:c9e3d3db02b6ea0720a20b9bbd159d79:dd7fedf66b493b0bbdef5d25e0041dd8$"
|
||||
"smartupdate": "$TexturePacker:SmartUpdate:37e89522e7b92408df9d52c3d98137ea:241a531f0918e0a4b616569e7d4bc186:dd7fedf66b493b0bbdef5d25e0041dd8$"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 741 B |
@ -146,14 +146,14 @@
|
||||
"spriteSourceSize": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"w": 3,
|
||||
"h": 3
|
||||
"w": 66,
|
||||
"h": 55
|
||||
},
|
||||
"frame": {
|
||||
"x": 132,
|
||||
"y": 0,
|
||||
"w": 3,
|
||||
"h": 3
|
||||
"x": 0,
|
||||
"y": 112,
|
||||
"w": 66,
|
||||
"h": 55
|
||||
}
|
||||
},
|
||||
{
|
||||
|
BIN
public/images/ui/champion_ribbon.png
Normal file
After Width: | Height: | Size: 285 B |
BIN
public/images/ui/legacy/champion_ribbon.png
Normal file
After Width: | Height: | Size: 285 B |
@ -1,4 +1,4 @@
|
||||
import Phaser, { Time } from 'phaser';
|
||||
import Phaser from 'phaser';
|
||||
import UI, { Mode } from './ui/ui';
|
||||
import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase } from './phases';
|
||||
import Pokemon, { PlayerPokemon, EnemyPokemon } from './field/pokemon';
|
||||
@ -54,13 +54,14 @@ import CharSprite from './ui/char-sprite';
|
||||
import DamageNumberHandler from './field/damage-number-handler';
|
||||
import PokemonInfoContainer from './ui/pokemon-info-container';
|
||||
import { biomeDepths } from './data/biomes';
|
||||
import { initTouchControls } from './touch-controls';
|
||||
import { UiTheme } from './enums/ui-theme';
|
||||
import { SceneBase } from './scene-base';
|
||||
import CandyBar from './ui/candy-bar';
|
||||
import { Variant, variantData } from './data/variant';
|
||||
import { Localizable } from './plugins/i18n';
|
||||
import { STARTING_WAVE_OVERRIDE, OPP_SPECIES_OVERRIDE, SEED_OVERRIDE, STARTING_BIOME_OVERRIDE } from './overrides';
|
||||
import { STARTING_WAVE_OVERRIDE, OPP_SPECIES_OVERRIDE, SEED_OVERRIDE, STARTING_BIOME_OVERRIDE, DOUBLE_BATTLE_OVERRIDE } from './overrides';
|
||||
import {InputsController} from "./inputs-controller";
|
||||
import {UiInputs} from "./ui-inputs";
|
||||
|
||||
export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1";
|
||||
|
||||
@ -69,33 +70,12 @@ const DEBUG_RNG = false;
|
||||
export const startingWave = STARTING_WAVE_OVERRIDE || 1;
|
||||
|
||||
const expSpriteKeys: string[] = [];
|
||||
const repeatInputDelayMillis = 250;
|
||||
|
||||
export let starterColors: StarterColors;
|
||||
interface StarterColors {
|
||||
[key: string]: [string, string]
|
||||
}
|
||||
|
||||
export enum Button {
|
||||
UP,
|
||||
DOWN,
|
||||
LEFT,
|
||||
RIGHT,
|
||||
SUBMIT,
|
||||
ACTION,
|
||||
CANCEL,
|
||||
MENU,
|
||||
STATS,
|
||||
CYCLE_SHINY,
|
||||
CYCLE_FORM,
|
||||
CYCLE_GENDER,
|
||||
CYCLE_ABILITY,
|
||||
CYCLE_NATURE,
|
||||
CYCLE_VARIANT,
|
||||
SPEED_UP,
|
||||
SLOW_DOWN
|
||||
}
|
||||
|
||||
export interface PokeballCounts {
|
||||
[pb: string]: integer;
|
||||
}
|
||||
@ -104,6 +84,8 @@ export type AnySound = Phaser.Sound.WebAudioSound | Phaser.Sound.HTML5AudioSound
|
||||
|
||||
export default class BattleScene extends SceneBase {
|
||||
public rexUI: UIPlugin;
|
||||
public inputController: InputsController;
|
||||
public uiInputs: UiInputs;
|
||||
|
||||
public sessionPlayTime: integer = null;
|
||||
public masterVolume: number = 0.5;
|
||||
@ -124,6 +106,7 @@ export default class BattleScene extends SceneBase {
|
||||
public gamepadSupport: boolean = true;
|
||||
public enableTouchControls: boolean = false;
|
||||
public enableVibration: boolean = false;
|
||||
public abSwapped: boolean = false;
|
||||
|
||||
public disableMenu: boolean = false;
|
||||
|
||||
@ -190,34 +173,6 @@ export default class BattleScene extends SceneBase {
|
||||
private bgmCache: Set<string> = new Set();
|
||||
private playTimeTimer: Phaser.Time.TimerEvent;
|
||||
|
||||
private buttonKeys: Phaser.Input.Keyboard.Key[][];
|
||||
private lastProcessedButtonPressTimes: Map<Button, number> = new Map();
|
||||
// movementButtonLock ensures only a single movement key is firing repeated inputs
|
||||
// (i.e. by holding down a button) at a time
|
||||
private movementButtonLock: Button;
|
||||
|
||||
// using a dualshock controller as a map
|
||||
private gamepadKeyConfig = {
|
||||
[Button.UP]: 12, // up
|
||||
[Button.DOWN]: 13, // down
|
||||
[Button.LEFT]: 14, // left
|
||||
[Button.RIGHT]: 15, // right
|
||||
[Button.SUBMIT]: 17, // touchpad
|
||||
[Button.ACTION]: 0, // X
|
||||
[Button.CANCEL]: 1, // O
|
||||
[Button.MENU]: 9, // options
|
||||
[Button.STATS]: 8, // share
|
||||
[Button.CYCLE_SHINY]: 5, // RB
|
||||
[Button.CYCLE_FORM]: 4, // LB
|
||||
[Button.CYCLE_GENDER]: 6, // LT
|
||||
[Button.CYCLE_ABILITY]: 7, // RT
|
||||
[Button.CYCLE_NATURE]: 2, // square
|
||||
[Button.CYCLE_VARIANT]: 3, // triangle
|
||||
[Button.SPEED_UP]: 10, // L3
|
||||
[Button.SLOW_DOWN]: 11 // R3
|
||||
};
|
||||
public gamepadButtonStates: boolean[] = new Array(17).fill(false);
|
||||
|
||||
public rngCounter: integer = 0;
|
||||
public rngSeedOverride: string = '';
|
||||
public rngOffset: integer = 0;
|
||||
@ -235,15 +190,6 @@ export default class BattleScene extends SceneBase {
|
||||
this.nextCommandPhaseQueue = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Conditionally swaps the ACTION and CANCEL button
|
||||
* @param standard When true, uses the default values
|
||||
*/
|
||||
setGamepadConfirm(standard: boolean) {
|
||||
this.gamepadKeyConfig[Button.ACTION] = standard ? 0 : 1;
|
||||
this.gamepadKeyConfig[Button.CANCEL] = standard ? 1 : 0;
|
||||
}
|
||||
|
||||
loadPokemonAtlas(key: string, atlasPath: string, experimental?: boolean) {
|
||||
if (experimental === undefined)
|
||||
experimental = this.experimentalSprites;
|
||||
@ -277,13 +223,13 @@ export default class BattleScene extends SceneBase {
|
||||
|
||||
create() {
|
||||
initGameSpeed.apply(this);
|
||||
this.inputController = new InputsController(this);
|
||||
this.uiInputs = new UiInputs(this, this.inputController);
|
||||
|
||||
this.gameData = new GameData(this);
|
||||
|
||||
addUiThemeOverrides(this);
|
||||
|
||||
this.setupControls();
|
||||
|
||||
this.load.setBaseURL();
|
||||
|
||||
this.spritePipeline = new SpritePipeline(this.game);
|
||||
@ -296,7 +242,7 @@ export default class BattleScene extends SceneBase {
|
||||
}
|
||||
|
||||
update() {
|
||||
this.checkInput();
|
||||
this.inputController.update();
|
||||
this.ui?.update();
|
||||
}
|
||||
|
||||
@ -615,42 +561,6 @@ export default class BattleScene extends SceneBase {
|
||||
return true;
|
||||
}
|
||||
|
||||
setupControls() {
|
||||
const keyCodes = Phaser.Input.Keyboard.KeyCodes;
|
||||
const keyConfig = {
|
||||
[Button.UP]: [keyCodes.UP, keyCodes.W],
|
||||
[Button.DOWN]: [keyCodes.DOWN, keyCodes.S],
|
||||
[Button.LEFT]: [keyCodes.LEFT, keyCodes.A],
|
||||
[Button.RIGHT]: [keyCodes.RIGHT, keyCodes.D],
|
||||
[Button.SUBMIT]: [keyCodes.ENTER],
|
||||
[Button.ACTION]: [keyCodes.SPACE, keyCodes.ENTER, keyCodes.Z],
|
||||
[Button.CANCEL]: [keyCodes.BACKSPACE, keyCodes.X],
|
||||
[Button.MENU]: [keyCodes.ESC, keyCodes.M],
|
||||
[Button.STATS]: [keyCodes.SHIFT, keyCodes.C],
|
||||
[Button.CYCLE_SHINY]: [keyCodes.R],
|
||||
[Button.CYCLE_FORM]: [keyCodes.F],
|
||||
[Button.CYCLE_GENDER]: [keyCodes.G],
|
||||
[Button.CYCLE_ABILITY]: [keyCodes.E],
|
||||
[Button.CYCLE_NATURE]: [keyCodes.N],
|
||||
[Button.CYCLE_VARIANT]: [keyCodes.V],
|
||||
[Button.SPEED_UP]: [keyCodes.PLUS],
|
||||
[Button.SLOW_DOWN]: [keyCodes.MINUS]
|
||||
};
|
||||
const mobileKeyConfig = {};
|
||||
this.buttonKeys = [];
|
||||
for (let b of Utils.getEnumValues(Button)) {
|
||||
const keys: Phaser.Input.Keyboard.Key[] = [];
|
||||
if (keyConfig.hasOwnProperty(b)) {
|
||||
for (let k of keyConfig[b])
|
||||
keys.push(this.input.keyboard.addKey(k, false));
|
||||
mobileKeyConfig[Button[b]] = keys[0];
|
||||
}
|
||||
this.buttonKeys[b] = keys;
|
||||
}
|
||||
|
||||
initTouchControls(mobileKeyConfig);
|
||||
}
|
||||
|
||||
getParty(): PlayerPokemon[] {
|
||||
return this.party;
|
||||
}
|
||||
@ -932,6 +842,9 @@ export default class BattleScene extends SceneBase {
|
||||
} else if (!battleConfig)
|
||||
newDouble = !!double;
|
||||
|
||||
if (DOUBLE_BATTLE_OVERRIDE)
|
||||
newDouble = true;
|
||||
|
||||
const lastBattle = this.currentBattle;
|
||||
|
||||
if (lastBattle?.double && !newDouble)
|
||||
@ -1120,7 +1033,7 @@ export default class BattleScene extends SceneBase {
|
||||
return 5;
|
||||
|
||||
let isBoss: boolean;
|
||||
if (forceBoss || (species && (species.pseudoLegendary || species.legendary || species.mythical)))
|
||||
if (forceBoss || (species && (species.subLegendary || species.legendary || species.mythical)))
|
||||
isBoss = true;
|
||||
else {
|
||||
this.executeWithSeedOffset(() => {
|
||||
@ -1352,177 +1265,6 @@ export default class BattleScene extends SceneBase {
|
||||
return biomes[Utils.randSeedInt(biomes.length)];
|
||||
}
|
||||
|
||||
checkInput(): boolean {
|
||||
let inputSuccess = false;
|
||||
let vibrationLength = 0;
|
||||
if (this.buttonJustPressed(Button.UP) || this.repeatInputDurationJustPassed(Button.UP)) {
|
||||
inputSuccess = this.ui.processInput(Button.UP);
|
||||
vibrationLength = 5;
|
||||
this.setLastProcessedMovementTime(Button.UP)
|
||||
} else if (this.buttonJustPressed(Button.DOWN) || this.repeatInputDurationJustPassed(Button.DOWN)) {
|
||||
inputSuccess = this.ui.processInput(Button.DOWN);
|
||||
vibrationLength = 5;
|
||||
this.setLastProcessedMovementTime(Button.DOWN)
|
||||
} else if (this.buttonJustPressed(Button.LEFT) || this.repeatInputDurationJustPassed(Button.LEFT)) {
|
||||
inputSuccess = this.ui.processInput(Button.LEFT);
|
||||
vibrationLength = 5;
|
||||
this.setLastProcessedMovementTime(Button.LEFT)
|
||||
} else if (this.buttonJustPressed(Button.RIGHT) || this.repeatInputDurationJustPassed(Button.RIGHT)) {
|
||||
inputSuccess = this.ui.processInput(Button.RIGHT);
|
||||
vibrationLength = 5;
|
||||
this.setLastProcessedMovementTime(Button.RIGHT)
|
||||
} else if (this.buttonJustPressed(Button.SUBMIT) || this.repeatInputDurationJustPassed(Button.SUBMIT)) {
|
||||
inputSuccess = this.ui.processInput(Button.SUBMIT) || this.ui.processInput(Button.ACTION);
|
||||
this.setLastProcessedMovementTime(Button.SUBMIT);
|
||||
} else if (this.buttonJustPressed(Button.ACTION) || this.repeatInputDurationJustPassed(Button.ACTION)) {
|
||||
inputSuccess = this.ui.processInput(Button.ACTION);
|
||||
this.setLastProcessedMovementTime(Button.ACTION);
|
||||
} else if (this.buttonJustPressed(Button.CANCEL)|| this.repeatInputDurationJustPassed(Button.CANCEL)) {
|
||||
inputSuccess = this.ui.processInput(Button.CANCEL);
|
||||
this.setLastProcessedMovementTime(Button.CANCEL);
|
||||
} else if (this.buttonJustPressed(Button.MENU)) {
|
||||
if (this.disableMenu)
|
||||
return;
|
||||
switch (this.ui?.getMode()) {
|
||||
case Mode.MESSAGE:
|
||||
if (!(this.ui.getHandler() as MessageUiHandler).pendingPrompt)
|
||||
return;
|
||||
case Mode.TITLE:
|
||||
case Mode.COMMAND:
|
||||
case Mode.FIGHT:
|
||||
case Mode.BALL:
|
||||
case Mode.TARGET_SELECT:
|
||||
case Mode.SAVE_SLOT:
|
||||
case Mode.PARTY:
|
||||
case Mode.SUMMARY:
|
||||
case Mode.STARTER_SELECT:
|
||||
case Mode.CONFIRM:
|
||||
case Mode.OPTION_SELECT:
|
||||
this.ui.setOverlayMode(Mode.MENU);
|
||||
inputSuccess = true;
|
||||
break;
|
||||
case Mode.MENU:
|
||||
case Mode.SETTINGS:
|
||||
case Mode.ACHIEVEMENTS:
|
||||
this.ui.revertMode();
|
||||
this.playSound('select');
|
||||
inputSuccess = true;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
} else if (this.ui?.getHandler() instanceof StarterSelectUiHandler) {
|
||||
if (this.buttonJustPressed(Button.CYCLE_SHINY)) {
|
||||
inputSuccess = this.ui.processInput(Button.CYCLE_SHINY);
|
||||
this.setLastProcessedMovementTime(Button.CYCLE_SHINY);
|
||||
} else if (this.buttonJustPressed(Button.CYCLE_FORM)) {
|
||||
inputSuccess = this.ui.processInput(Button.CYCLE_FORM);
|
||||
this.setLastProcessedMovementTime(Button.CYCLE_FORM);
|
||||
} else if (this.buttonJustPressed(Button.CYCLE_GENDER)) {
|
||||
inputSuccess = this.ui.processInput(Button.CYCLE_GENDER);
|
||||
this.setLastProcessedMovementTime(Button.CYCLE_GENDER);
|
||||
} else if (this.buttonJustPressed(Button.CYCLE_ABILITY)) {
|
||||
inputSuccess = this.ui.processInput(Button.CYCLE_ABILITY);
|
||||
this.setLastProcessedMovementTime(Button.CYCLE_ABILITY);
|
||||
} else if (this.buttonJustPressed(Button.CYCLE_NATURE)) {
|
||||
inputSuccess = this.ui.processInput(Button.CYCLE_NATURE);
|
||||
this.setLastProcessedMovementTime(Button.CYCLE_NATURE);
|
||||
} else if (this.buttonJustPressed(Button.CYCLE_VARIANT)) {
|
||||
inputSuccess = this.ui.processInput(Button.CYCLE_VARIANT);
|
||||
this.setLastProcessedMovementTime(Button.CYCLE_VARIANT);
|
||||
} else
|
||||
return;
|
||||
} else if (this.buttonJustPressed(Button.SPEED_UP)) {
|
||||
if (this.gameSpeed < 5) {
|
||||
this.gameData.saveSetting(Setting.Game_Speed, settingOptions[Setting.Game_Speed].indexOf(`${this.gameSpeed}x`) + 1);
|
||||
if (this.ui?.getMode() === Mode.SETTINGS)
|
||||
(this.ui.getHandler() as SettingsUiHandler).show([]);
|
||||
}
|
||||
} else if (this.buttonJustPressed(Button.SLOW_DOWN)) {
|
||||
if (this.gameSpeed > 1) {
|
||||
this.gameData.saveSetting(Setting.Game_Speed, Math.max(settingOptions[Setting.Game_Speed].indexOf(`${this.gameSpeed}x`) - 1, 0));
|
||||
if (this.ui?.getMode() === Mode.SETTINGS)
|
||||
(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
|
||||
return;
|
||||
}
|
||||
if (inputSuccess && this.enableVibration && typeof navigator.vibrate !== 'undefined')
|
||||
navigator.vibrate(vibrationLength || 10);
|
||||
}
|
||||
|
||||
/**
|
||||
* gamepadButtonJustDown returns true if @param button has just been pressed down
|
||||
* or not. It will only return true once, until the key is released and pressed down
|
||||
* again.
|
||||
*/
|
||||
gamepadButtonJustDown(button: Phaser.Input.Gamepad.Button): boolean {
|
||||
if (!button || !this.gamepadSupport)
|
||||
return false;
|
||||
|
||||
let ret = false;
|
||||
if (button.pressed) {
|
||||
if (!this.gamepadButtonStates[button.index])
|
||||
ret = true;
|
||||
this.gamepadButtonStates[button.index] = true;
|
||||
} else
|
||||
this.gamepadButtonStates[button.index] = false;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
buttonJustPressed(button: Button): boolean {
|
||||
const gamepad = this.input.gamepad?.gamepads[0];
|
||||
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
|
||||
* enough to fire a repeated input. A button must claim the movementButtonLock before
|
||||
* firing a repeated input - this is to prevent multiple buttons from firing repeatedly.
|
||||
*/
|
||||
repeatInputDurationJustPassed(button: Button): boolean {
|
||||
if (this.movementButtonLock !== null && this.movementButtonLock !== button) {
|
||||
return false;
|
||||
}
|
||||
if (this.buttonKeys[button].every(k => k.isUp) && this.gamepadButtonStates.every(b => b == false)) {
|
||||
this.movementButtonLock = null;
|
||||
return false;
|
||||
}
|
||||
if (this.time.now - this.lastProcessedButtonPressTimes.get(button) >= repeatInputDelayMillis) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
setLastProcessedMovementTime(button: Button) {
|
||||
this.lastProcessedButtonPressTimes.set(button, this.time.now);
|
||||
this.movementButtonLock = button;
|
||||
}
|
||||
|
||||
isBgmPlaying(): boolean {
|
||||
return this.bgm && this.bgm.isPlaying;
|
||||
}
|
||||
|
@ -194,7 +194,7 @@ export default class Battle {
|
||||
return 'battle_final';
|
||||
return 'battle_final_encounter';
|
||||
}
|
||||
if (pokemon.species.legendary || pokemon.species.pseudoLegendary || pokemon.species.mythical) {
|
||||
if (pokemon.species.legendary || pokemon.species.subLegendary || pokemon.species.mythical) {
|
||||
if (pokemon.species.speciesId === Species.REGIROCK || pokemon.species.speciesId === Species.REGICE || pokemon.species.speciesId === Species.REGISTEEL || pokemon.species.speciesId === Species.REGIGIGAS || pokemon.species.speciesId === Species.REGIELEKI || pokemon.species.speciesId === Species.REGIDRAGO)
|
||||
return 'battle_legendary_regis';
|
||||
if (pokemon.species.speciesId === Species.COBALION || pokemon.species.speciesId === Species.TERRAKION || pokemon.species.speciesId === Species.VIRIZION || pokemon.species.speciesId === Species.TORNADUS || pokemon.species.speciesId === Species.THUNDURUS || pokemon.species.speciesId === Species.LANDORUS || pokemon.species.speciesId === Species.KELDEO || pokemon.species.speciesId === Species.MELOETTA || pokemon.species.speciesId === Species.GENESECT)
|
||||
|
29
src/configs/pad_dualshock.ts
Normal file
@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Dualshock mapping
|
||||
*/
|
||||
const pad_dualshock = {
|
||||
padID: 'Dualshock',
|
||||
padType: 'Sony',
|
||||
gamepadMapping: {
|
||||
RC_S: 0,
|
||||
RC_E: 1,
|
||||
RC_W: 2,
|
||||
RC_N: 3,
|
||||
START: 9, // Options
|
||||
SELECT: 8, // Share
|
||||
LB: 4,
|
||||
RB: 5,
|
||||
LT: 6,
|
||||
RT: 7,
|
||||
LS: 10,
|
||||
RS: 11,
|
||||
LC_N: 12,
|
||||
LC_S: 13,
|
||||
LC_W: 14,
|
||||
LC_E: 15,
|
||||
MENU: 16,
|
||||
TOUCH: 17
|
||||
},
|
||||
};
|
||||
|
||||
export default pad_dualshock;
|
27
src/configs/pad_generic.ts
Normal file
@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Generic pad mapping
|
||||
*/
|
||||
const pad_generic = {
|
||||
padID: 'Generic',
|
||||
padType: 'generic',
|
||||
gamepadMapping: {
|
||||
RC_S: 0,
|
||||
RC_E: 1,
|
||||
RC_W: 2,
|
||||
RC_N: 3,
|
||||
START: 9,
|
||||
SELECT: 8,
|
||||
LB: 4,
|
||||
RB: 5,
|
||||
LT: 6,
|
||||
RT: 7,
|
||||
LS: 10,
|
||||
RS: 11,
|
||||
LC_N: 12,
|
||||
LC_S: 13,
|
||||
LC_W: 14,
|
||||
LC_E: 15
|
||||
},
|
||||
};
|
||||
|
||||
export default pad_generic;
|
23
src/configs/pad_unlicensedSNES.ts
Normal file
@ -0,0 +1,23 @@
|
||||
/**
|
||||
* 081f-e401 - UnlicensedSNES
|
||||
*/
|
||||
const pad_unlicensedSNES = {
|
||||
padID: '081f-e401',
|
||||
padType: 'snes',
|
||||
gamepadMapping : {
|
||||
RC_S: 2,
|
||||
RC_E: 1,
|
||||
RC_W: 3,
|
||||
RC_N: 0,
|
||||
START: 9,
|
||||
SELECT: 8,
|
||||
LB: 4,
|
||||
RB: 5,
|
||||
LC_N: 12,
|
||||
LC_S: 13,
|
||||
LC_W: 14,
|
||||
LC_E: 15
|
||||
}
|
||||
};
|
||||
|
||||
export default pad_unlicensedSNES;
|
28
src/configs/pad_xbox360.ts
Normal file
@ -0,0 +1,28 @@
|
||||
/**
|
||||
* Generic pad mapping
|
||||
*/
|
||||
const pad_xbox360 = {
|
||||
padID: 'Xbox 360 controller (XInput STANDARD GAMEPAD)',
|
||||
padType: 'xbox',
|
||||
gamepadMapping: {
|
||||
RC_S: 0,
|
||||
RC_E: 1,
|
||||
RC_W: 2,
|
||||
RC_N: 3,
|
||||
START: 9,
|
||||
SELECT: 8,
|
||||
LB: 4,
|
||||
RB: 5,
|
||||
LT: 6,
|
||||
RT: 7,
|
||||
LS: 10,
|
||||
RS: 11,
|
||||
LC_N: 12,
|
||||
LC_S: 13,
|
||||
LC_W: 14,
|
||||
LC_E: 15,
|
||||
MENU: 16
|
||||
},
|
||||
};
|
||||
|
||||
export default pad_xbox360;
|
@ -20,6 +20,8 @@ import { SpeciesFormChangeManualTrigger } from "./pokemon-forms";
|
||||
import { Abilities } from "./enums/abilities";
|
||||
import i18next, { Localizable } from "#app/plugins/i18n.js";
|
||||
import { Command } from "../ui/command-ui-handler";
|
||||
import Battle from "#app/battle.js";
|
||||
import { ability } from "#app/locales/en/ability.js";
|
||||
|
||||
export class Ability implements Localizable {
|
||||
public id: Abilities;
|
||||
@ -247,7 +249,7 @@ export class PreDefendFormChangeAbAttr extends PreDefendAbAttr {
|
||||
}
|
||||
export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr {
|
||||
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||
if (pokemon.getHpRatio() < 1 || (args[0] as Utils.NumberHolder).value < pokemon.hp)
|
||||
if (pokemon.getMaxHp() <= 1 && (pokemon.getHpRatio() < 1 || (args[0] as Utils.NumberHolder).value < pokemon.hp))
|
||||
return false;
|
||||
|
||||
return pokemon.addTag(BattlerTagType.STURDY, 1);
|
||||
@ -424,7 +426,7 @@ export class NonSuperEffectiveImmunityAbAttr extends TypeImmunityAbAttr {
|
||||
}
|
||||
|
||||
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||
if (move.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.getMove().type) < 2) {
|
||||
if (move.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.getMove().type, attacker) < 2) {
|
||||
cancelled.value = true;
|
||||
(args[0] as Utils.NumberHolder).value = 0;
|
||||
return true;
|
||||
@ -1271,6 +1273,40 @@ export class IgnoreOpponentStatChangesAbAttr extends AbAttr {
|
||||
}
|
||||
}
|
||||
|
||||
export class IntimidateImmunityAbAttr extends AbAttr {
|
||||
constructor() {
|
||||
super(false);
|
||||
}
|
||||
|
||||
apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||
cancelled.value = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
|
||||
return getPokemonMessage(pokemon, `'s ${abilityName} prevented it from being Intimidated!`);
|
||||
}
|
||||
}
|
||||
|
||||
export class PostIntimidateStatChangeAbAttr extends AbAttr {
|
||||
private stats: BattleStat[];
|
||||
private levels: integer;
|
||||
private overwrites: boolean;
|
||||
|
||||
constructor(stats: BattleStat[], levels: integer, overwrites?: boolean) {
|
||||
super(true)
|
||||
this.stats = stats
|
||||
this.levels = levels
|
||||
this.overwrites = !!overwrites
|
||||
}
|
||||
|
||||
apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||
pokemon.scene.pushPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, this.levels));
|
||||
cancelled.value = this.overwrites;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class PostSummonAbAttr extends AbAttr {
|
||||
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise<boolean> {
|
||||
return false;
|
||||
@ -1313,34 +1349,36 @@ export class PostSummonStatChangeAbAttr extends PostSummonAbAttr {
|
||||
private stats: BattleStat[];
|
||||
private levels: integer;
|
||||
private selfTarget: boolean;
|
||||
private intimidate: boolean;
|
||||
|
||||
constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean) {
|
||||
super();
|
||||
constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, intimidate?: boolean) {
|
||||
super(false);
|
||||
|
||||
this.stats = typeof(stats) === 'number'
|
||||
? [ stats as BattleStat ]
|
||||
: stats as BattleStat[];
|
||||
this.levels = levels;
|
||||
this.selfTarget = !!selfTarget;
|
||||
this.intimidate = !!intimidate;
|
||||
}
|
||||
|
||||
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
|
||||
const statChangePhases: StatChangePhase[] = [];
|
||||
|
||||
if (this.selfTarget)
|
||||
statChangePhases.push(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.levels));
|
||||
else {
|
||||
for (let opponent of pokemon.getOpponents())
|
||||
statChangePhases.push(new StatChangePhase(pokemon.scene, opponent.getBattlerIndex(), false, this.stats, this.levels));
|
||||
queueShowAbility(pokemon, passive); // TODO: Better solution than manually showing the ability here
|
||||
if (this.selfTarget) {
|
||||
pokemon.scene.pushPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.levels));
|
||||
return true;
|
||||
}
|
||||
|
||||
for (let statChangePhase of statChangePhases) {
|
||||
if (!this.selfTarget && !statChangePhase.getPokemon().summonData)
|
||||
pokemon.scene.pushPhase(statChangePhase); // TODO: This causes the ability bar to be shown at the wrong time
|
||||
else
|
||||
for (let opponent of pokemon.getOpponents()) {
|
||||
const cancelled = new Utils.BooleanHolder(false)
|
||||
if (this.intimidate) {
|
||||
applyAbAttrs(IntimidateImmunityAbAttr, opponent, cancelled);
|
||||
applyAbAttrs(PostIntimidateStatChangeAbAttr, opponent, cancelled);
|
||||
}
|
||||
if (!cancelled.value) {
|
||||
const statChangePhase = new StatChangePhase(pokemon.scene, opponent.getBattlerIndex(), false, this.stats, this.levels);
|
||||
pokemon.scene.unshiftPhase(statChangePhase);
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -1756,7 +1794,7 @@ function getAnticipationCondition(): AbAttrCondition {
|
||||
for (let opponent of pokemon.getOpponents()) {
|
||||
for (let move of opponent.moveset) {
|
||||
// move is super effective
|
||||
if (move.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.getMove().type) >= 2) {
|
||||
if (move.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.getMove().type, opponent) >= 2) {
|
||||
return true;
|
||||
}
|
||||
// move is a OHKO
|
||||
@ -1778,7 +1816,7 @@ function getAnticipationCondition(): AbAttrCondition {
|
||||
Type.FIRE, Type.WATER, Type.GRASS, Type.ELECTRIC,
|
||||
Type.PSYCHIC, Type.ICE, Type.DRAGON, Type.DARK][iv_val];
|
||||
|
||||
if (pokemon.getAttackTypeEffectiveness(type) >= 2) {
|
||||
if (pokemon.getAttackTypeEffectiveness(type, opponent) >= 2) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -1788,6 +1826,19 @@ function getAnticipationCondition(): AbAttrCondition {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an ability condition that causes the ability to fail if that ability
|
||||
* has already been used by that pokemon that battle. It requires an ability to
|
||||
* be specified due to current limitations in how conditions on abilities work.
|
||||
* @param {Abilities} ability The ability to check if it's already been applied
|
||||
* @returns {AbAttrCondition} The condition
|
||||
*/
|
||||
function getOncePerBattleCondition(ability: Abilities): AbAttrCondition {
|
||||
return (pokemon: Pokemon) => {
|
||||
return !pokemon.battleData?.abilitiesApplied.includes(ability);
|
||||
}
|
||||
}
|
||||
|
||||
export class ForewarnAbAttr extends PostSummonAbAttr {
|
||||
constructor() {
|
||||
super(true);
|
||||
@ -2316,6 +2367,13 @@ export class FlinchStatChangeAbAttr extends FlinchEffectAbAttr {
|
||||
|
||||
export class IncreasePpAbAttr extends AbAttr { }
|
||||
|
||||
export class ForceSwitchOutImmunityAbAttr extends AbAttr {
|
||||
apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||
cancelled.value = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class ReduceBerryUseThresholdAbAttr extends AbAttr {
|
||||
constructor() {
|
||||
super();
|
||||
@ -2427,6 +2485,25 @@ export class NoFusionAbilityAbAttr extends AbAttr {
|
||||
}
|
||||
}
|
||||
|
||||
export class IgnoreTypeImmunityAbAttr extends AbAttr {
|
||||
defenderType: Type;
|
||||
allowedMoveTypes: Type[];
|
||||
|
||||
constructor(defenderType: Type, allowedMoveTypes: Type[]) {
|
||||
super(true);
|
||||
this.defenderType = defenderType;
|
||||
this.allowedMoveTypes = allowedMoveTypes;
|
||||
}
|
||||
|
||||
apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||
if (this.defenderType !== (args[1] as Type)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return this.allowedMoveTypes.some(type => type === (args[0] as Type));
|
||||
}
|
||||
}
|
||||
|
||||
function applyAbAttrsInternal<TAttr extends AbAttr>(attrType: { new(...args: any[]): TAttr },
|
||||
pokemon: Pokemon, applyFunc: AbAttrApplyFunc<TAttr>, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise<void> {
|
||||
return new Promise(resolve => {
|
||||
@ -2458,6 +2535,9 @@ function applyAbAttrsInternal<TAttr extends AbAttr>(attrType: { new(...args: any
|
||||
return applyNextAbAttr();
|
||||
pokemon.scene.setPhaseQueueSplice();
|
||||
const onApplySuccess = () => {
|
||||
if (pokemon.battleData && !pokemon.battleData.abilitiesApplied.includes(ability.id)) {
|
||||
pokemon.battleData.abilitiesApplied.push(ability.id);
|
||||
}
|
||||
if (attr.showAbility && !quiet) {
|
||||
if (showAbilityInstant)
|
||||
pokemon.scene.abilityBar.showAbility(pokemon, passive);
|
||||
@ -2647,7 +2727,8 @@ export function initAbilities() {
|
||||
.condition(getWeatherCondition(WeatherType.SANDSTORM))
|
||||
.ignorable(),
|
||||
new Ability(Abilities.STATIC, 3)
|
||||
.attr(PostDefendContactApplyStatusEffectAbAttr, 30, StatusEffect.PARALYSIS),
|
||||
.attr(PostDefendContactApplyStatusEffectAbAttr, 30, StatusEffect.PARALYSIS)
|
||||
.bypassFaint(),
|
||||
new Ability(Abilities.VOLT_ABSORB, 3)
|
||||
.attr(TypeImmunityHealAbAttr, Type.ELECTRIC)
|
||||
.ignorable(),
|
||||
@ -2656,6 +2737,7 @@ export function initAbilities() {
|
||||
.ignorable(),
|
||||
new Ability(Abilities.OBLIVIOUS, 3)
|
||||
.attr(BattlerTagImmunityAbAttr, BattlerTagType.INFATUATED)
|
||||
.attr(IntimidateImmunityAbAttr)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.CLOUD_NINE, 3)
|
||||
.attr(SuppressWeatherEffectAbAttr, true),
|
||||
@ -2678,12 +2760,13 @@ export function initAbilities() {
|
||||
.unimplemented(),
|
||||
new Ability(Abilities.OWN_TEMPO, 3)
|
||||
.attr(BattlerTagImmunityAbAttr, BattlerTagType.CONFUSED)
|
||||
.attr(IntimidateImmunityAbAttr)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.SUCTION_CUPS, 3)
|
||||
.ignorable()
|
||||
.unimplemented(),
|
||||
.attr(ForceSwitchOutImmunityAbAttr)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.INTIMIDATE, 3)
|
||||
.attr(PostSummonStatChangeAbAttr, BattleStat.ATK, -1),
|
||||
.attr(PostSummonStatChangeAbAttr, BattleStat.ATK, -1, false, true),
|
||||
new Ability(Abilities.SHADOW_TAG, 3)
|
||||
.attr(ArenaTrapAbAttr),
|
||||
new Ability(Abilities.ROUGH_SKIN, 3)
|
||||
@ -2729,9 +2812,11 @@ export function initAbilities() {
|
||||
new Ability(Abilities.HUGE_POWER, 3)
|
||||
.attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 2),
|
||||
new Ability(Abilities.POISON_POINT, 3)
|
||||
.attr(PostDefendContactApplyStatusEffectAbAttr, 30, StatusEffect.POISON),
|
||||
.attr(PostDefendContactApplyStatusEffectAbAttr, 30, StatusEffect.POISON)
|
||||
.bypassFaint(),
|
||||
new Ability(Abilities.INNER_FOCUS, 3)
|
||||
.attr(BattlerTagImmunityAbAttr, BattlerTagType.FLINCHED)
|
||||
.attr(IntimidateImmunityAbAttr)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.MAGMA_ARMOR, 3)
|
||||
.attr(StatusEffectImmunityAbAttr, StatusEffect.FREEZE)
|
||||
@ -2761,7 +2846,8 @@ export function initAbilities() {
|
||||
new Ability(Abilities.EARLY_BIRD, 3)
|
||||
.attr(ReduceStatusEffectDurationAbAttr, StatusEffect.SLEEP),
|
||||
new Ability(Abilities.FLAME_BODY, 3)
|
||||
.attr(PostDefendContactApplyStatusEffectAbAttr, 30, StatusEffect.BURN),
|
||||
.attr(PostDefendContactApplyStatusEffectAbAttr, 30, StatusEffect.BURN)
|
||||
.bypassFaint(),
|
||||
new Ability(Abilities.RUN_AWAY, 3)
|
||||
.attr(RunSuccessAbAttr),
|
||||
new Ability(Abilities.KEEN_EYE, 3)
|
||||
@ -2922,14 +3008,15 @@ export function initAbilities() {
|
||||
.attr(IgnoreOpponentStatChangesAbAttr)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.TINTED_LENS, 4)
|
||||
.attr(MovePowerBoostAbAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type) <= 0.5, 2),
|
||||
.attr(MovePowerBoostAbAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) <= 0.5, 2),
|
||||
new Ability(Abilities.FILTER, 4)
|
||||
.attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type) >= 2, 0.75)
|
||||
.attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 0.75)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.SLOW_START, 4)
|
||||
.attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.SLOW_START, 5),
|
||||
new Ability(Abilities.SCRAPPY, 4)
|
||||
.unimplemented(),
|
||||
.attr(IgnoreTypeImmunityAbAttr, Type.GHOST, [Type.NORMAL, Type.FIGHTING])
|
||||
.attr(IntimidateImmunityAbAttr),
|
||||
new Ability(Abilities.STORM_DRAIN, 4)
|
||||
.attr(RedirectTypeMoveAbAttr, Type.WATER)
|
||||
.attr(TypeImmunityStatChangeAbAttr, Type.WATER, BattleStat.SPATK, 1)
|
||||
@ -2938,7 +3025,7 @@ export function initAbilities() {
|
||||
.attr(BlockWeatherDamageAttr, WeatherType.HAIL)
|
||||
.attr(PostWeatherLapseHealAbAttr, 1, WeatherType.HAIL, WeatherType.SNOW),
|
||||
new Ability(Abilities.SOLID_ROCK, 4)
|
||||
.attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type) >= 2, 0.75)
|
||||
.attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 0.75)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.SNOW_WARNING, 4)
|
||||
.attr(PostSummonWeatherChangeAbAttr, WeatherType.SNOW)
|
||||
@ -3048,7 +3135,7 @@ export function initAbilities() {
|
||||
new Ability(Abilities.RATTLED, 5)
|
||||
.attr(PostDefendStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS && (move.type === Type.DARK || move.type === Type.BUG ||
|
||||
move.type === Type.GHOST), BattleStat.SPD, 1)
|
||||
.partial(),
|
||||
.attr(PostIntimidateStatChangeAbAttr, [BattleStat.SPD], 1),
|
||||
new Ability(Abilities.MAGIC_BOUNCE, 5)
|
||||
.ignorable()
|
||||
.unimplemented(),
|
||||
@ -3206,7 +3293,7 @@ export function initAbilities() {
|
||||
.attr(UnsuppressableAbilityAbAttr)
|
||||
.attr(NoFusionAbilityAbAttr),
|
||||
new Ability(Abilities.DISGUISE, 7)
|
||||
.attr(PreDefendMovePowerToOneAbAttr, (target, user, move) => target.formIndex == 0 && target.getAttackTypeEffectiveness(move.type) > 0)
|
||||
.attr(PreDefendMovePowerToOneAbAttr, (target, user, move) => target.formIndex == 0 && target.getAttackTypeEffectiveness(move.type, user) > 0)
|
||||
.attr(PostSummonFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
|
||||
.attr(PostBattleInitFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
|
||||
.attr(PostDefendFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
|
||||
@ -3304,13 +3391,15 @@ export function initAbilities() {
|
||||
new Ability(Abilities.SHADOW_SHIELD, 7)
|
||||
.attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getHpRatio() === 1, 0.5),
|
||||
new Ability(Abilities.PRISM_ARMOR, 7)
|
||||
.attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type) >= 2, 0.75),
|
||||
.attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 0.75),
|
||||
new Ability(Abilities.NEUROFORCE, 7)
|
||||
.attr(MovePowerBoostAbAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type) >= 2, 1.25),
|
||||
.attr(MovePowerBoostAbAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 1.25),
|
||||
new Ability(Abilities.INTREPID_SWORD, 8)
|
||||
.attr(PostSummonStatChangeAbAttr, BattleStat.ATK, 1, true),
|
||||
.attr(PostSummonStatChangeAbAttr, BattleStat.ATK, 1, true)
|
||||
.condition(getOncePerBattleCondition(Abilities.INTREPID_SWORD)),
|
||||
new Ability(Abilities.DAUNTLESS_SHIELD, 8)
|
||||
.attr(PostSummonStatChangeAbAttr, BattleStat.DEF, 1, true),
|
||||
.attr(PostSummonStatChangeAbAttr, BattleStat.DEF, 1, true)
|
||||
.condition(getOncePerBattleCondition(Abilities.DAUNTLESS_SHIELD)),
|
||||
new Ability(Abilities.LIBERO, 8)
|
||||
.unimplemented(),
|
||||
new Ability(Abilities.BALL_FETCH, 8)
|
||||
@ -3382,7 +3471,8 @@ export function initAbilities() {
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
.attr(UnswappableAbilityAbAttr)
|
||||
.attr(NoTransformAbilityAbAttr)
|
||||
.attr(NoFusionAbilityAbAttr),
|
||||
.attr(NoFusionAbilityAbAttr)
|
||||
.condition((pokemon) => !pokemon.isTerastallized()),
|
||||
new Ability(Abilities.QUICK_DRAW, 8)
|
||||
.unimplemented(),
|
||||
new Ability(Abilities.UNSEEN_FIST, 8)
|
||||
@ -3433,8 +3523,9 @@ export function initAbilities() {
|
||||
.ignorable()
|
||||
.partial(),
|
||||
new Ability(Abilities.GUARD_DOG, 9)
|
||||
.ignorable()
|
||||
.unimplemented(),
|
||||
.attr(PostIntimidateStatChangeAbAttr, [BattleStat.ATK], 1, true)
|
||||
.attr(ForceSwitchOutImmunityAbAttr)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.ROCKY_PAYLOAD, 9)
|
||||
.attr(MoveTypePowerBoostAbAttr, Type.ROCK),
|
||||
new Ability(Abilities.WIND_POWER, 9)
|
||||
@ -3458,13 +3549,15 @@ export function initAbilities() {
|
||||
.attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.PROTOSYNTHESIS, 0, WeatherType.SUNNY, WeatherType.HARSH_SUN)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
.attr(UnswappableAbilityAbAttr)
|
||||
.attr(NoTransformAbilityAbAttr),
|
||||
.attr(NoTransformAbilityAbAttr)
|
||||
.partial(), // While setting the tag, the getbattlestat should ignore all modifiers to stats except stat stages
|
||||
new Ability(Abilities.QUARK_DRIVE, 9)
|
||||
.conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), PostSummonAddBattlerTagAbAttr, BattlerTagType.QUARK_DRIVE, 0, true)
|
||||
.attr(PostTerrainChangeAddBattlerTagAttr, BattlerTagType.QUARK_DRIVE, 0, TerrainType.ELECTRIC)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
.attr(UnswappableAbilityAbAttr)
|
||||
.attr(NoTransformAbilityAbAttr),
|
||||
.attr(NoTransformAbilityAbAttr)
|
||||
.partial(), // While setting the tag, the getbattlestat should ignore all modifiers to stats except stat stages
|
||||
new Ability(Abilities.GOOD_AS_GOLD, 9)
|
||||
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.getMove().category === MoveCategory.STATUS)
|
||||
.ignorable()
|
||||
@ -3512,10 +3605,11 @@ export function initAbilities() {
|
||||
.attr(MoveAbilityBypassAbAttr, (pokemon, move: Move) => move.category === MoveCategory.STATUS)
|
||||
.partial(),
|
||||
new Ability(Abilities.MINDS_EYE, 9)
|
||||
.ignorable()
|
||||
.unimplemented(),
|
||||
.attr(IgnoreTypeImmunityAbAttr, Type.GHOST, [Type.NORMAL, Type.FIGHTING])
|
||||
.ignorable(), // TODO: evasiveness bypass should not be ignored, but accuracy immunity should
|
||||
new Ability(Abilities.SUPERSWEET_SYRUP, 9)
|
||||
.unimplemented(),
|
||||
.attr(PostSummonStatChangeAbAttr, BattleStat.EVA, -1)
|
||||
.condition(getOncePerBattleCondition(Abilities.SUPERSWEET_SYRUP)),
|
||||
new Ability(Abilities.HOSPITALITY, 9)
|
||||
.attr(PostSummonAllyHealAbAttr, 4, true),
|
||||
new Ability(Abilities.TOXIC_CHAIN, 9)
|
||||
|
@ -340,7 +340,7 @@ export async function printPokemon() {
|
||||
const speciesKey = (pokemonSpecies as any).key as string;
|
||||
|
||||
enumStr += ` ${speciesKey}${pokemonSpecies.speciesId >= 2000 ? ` = ${pokemonSpecies.speciesId}` : ''},\n`;
|
||||
pokemonSpeciesStr += ` new PokemonSpecies(Species.${speciesKey}, "${pokemonSpecies.name}", ${pokemonSpecies.generation}, ${pokemonSpecies.pseudoLegendary}, ${pokemonSpecies.legendary}, ${pokemonSpecies.mythical}, "${pokemonSpecies.species}", Type.${Type[pokemonSpecies.type1]}, ${pokemonSpecies.type2 ? `Type.${Type[pokemonSpecies.type2]}` : 'null'}, ${pokemonSpecies.height}, ${pokemonSpecies.weight}, Abilities.${Abilities[pokemonSpecies.ability1]}, Abilities.${Abilities[pokemonSpecies.ability2]}, Abilities.${Abilities[pokemonSpecies.abilityHidden]}, ${pokemonSpecies.baseTotal}, ${pokemonSpecies.baseStats[0]}, ${pokemonSpecies.baseStats[1]}, ${pokemonSpecies.baseStats[2]}, ${pokemonSpecies.baseStats[3]}, ${pokemonSpecies.baseStats[4]}, ${pokemonSpecies.baseStats[5]}, ${pokemonSpecies.catchRate}, ${pokemonSpecies.baseFriendship}, ${pokemonSpecies.baseExp}, GrowthRate.${GrowthRate[pokemonSpecies.growthRate]}, ${pokemonSpecies.malePercent}, ${pokemonSpecies.genderDiffs}`;
|
||||
pokemonSpeciesStr += ` new PokemonSpecies(Species.${speciesKey}, "${pokemonSpecies.name}", ${pokemonSpecies.generation}, ${pokemonSpecies.subLegendary}, ${pokemonSpecies.legendary}, ${pokemonSpecies.mythical}, "${pokemonSpecies.species}", Type.${Type[pokemonSpecies.type1]}, ${pokemonSpecies.type2 ? `Type.${Type[pokemonSpecies.type2]}` : 'null'}, ${pokemonSpecies.height}, ${pokemonSpecies.weight}, Abilities.${Abilities[pokemonSpecies.ability1]}, Abilities.${Abilities[pokemonSpecies.ability2]}, Abilities.${Abilities[pokemonSpecies.abilityHidden]}, ${pokemonSpecies.baseTotal}, ${pokemonSpecies.baseStats[0]}, ${pokemonSpecies.baseStats[1]}, ${pokemonSpecies.baseStats[2]}, ${pokemonSpecies.baseStats[3]}, ${pokemonSpecies.baseStats[4]}, ${pokemonSpecies.baseStats[5]}, ${pokemonSpecies.catchRate}, ${pokemonSpecies.baseFriendship}, ${pokemonSpecies.baseExp}, GrowthRate.${GrowthRate[pokemonSpecies.growthRate]}, ${pokemonSpecies.malePercent}, ${pokemonSpecies.genderDiffs}`;
|
||||
if (pokemonSpecies.forms.length > 1) {
|
||||
pokemonSpeciesStr += `, ${pokemonSpecies.canChangeForm},`;
|
||||
for (let form of pokemonSpecies.forms)
|
||||
|
@ -920,7 +920,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag {
|
||||
stats.map(s => pokemon.getBattleStat(s)).reduce((highestValue: integer, value: integer, i: integer) => {
|
||||
if (value > highestValue) {
|
||||
highestStat = stats[i];
|
||||
return highestValue += value;
|
||||
return value;
|
||||
}
|
||||
return highestValue;
|
||||
}, 0);
|
||||
|
@ -114,7 +114,8 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
|
||||
pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect)));
|
||||
pokemon.resetStatus();
|
||||
pokemon.updateInfo();
|
||||
} else if (pokemon.getTag(BattlerTagType.CONFUSED))
|
||||
}
|
||||
if (pokemon.getTag(BattlerTagType.CONFUSED))
|
||||
pokemon.lapseTag(BattlerTagType.CONFUSED);
|
||||
};
|
||||
case BerryType.LIECHI:
|
||||
|
@ -5,18 +5,18 @@ import * as Utils from "../utils";
|
||||
|
||||
|
||||
export const speciesEggMoves = {
|
||||
[Species.BULBASAUR]: [ Moves.STRENGTH_SAP, Moves.SLUDGE_BOMB, Moves.EARTH_POWER, Moves.SAPPY_SEED ],
|
||||
[Species.BULBASAUR]: [ Moves.GIGA_DRAIN, Moves.SLUDGE_BOMB, Moves.EARTH_POWER, Moves.SAPPY_SEED ],
|
||||
[Species.CHARMANDER]: [ Moves.DRAGON_DANCE, Moves.BITTER_BLADE, Moves.EARTH_POWER, Moves.OBLIVION_WING ],
|
||||
[Species.SQUIRTLE]: [ Moves.ICE_BEAM, Moves.DARK_PULSE, Moves.BOUNCY_BUBBLE, Moves.ORIGIN_PULSE ],
|
||||
[Species.CATERPIE]: [ Moves.EARTH_POWER, Moves.SILK_TRAP, Moves.STICKY_WEB, Moves.BLEAKWIND_STORM ],
|
||||
[Species.WEEDLE]: [ Moves.DRILL_RUN, Moves.SWORDS_DANCE, Moves.BANEFUL_BUNKER, Moves.BARB_BARRAGE ],
|
||||
[Species.PIDGEY]: [ Moves.HEAT_WAVE, Moves.FOCUS_BLAST, Moves.U_TURN, Moves.WILDBOLT_STORM ],
|
||||
[Species.RATTATA]: [ Moves.HYPER_FANG, Moves.PSYCHIC_FANGS, Moves.FIRE_FANG, Moves.EXTREME_SPEED ],
|
||||
[Species.SPEAROW]: [ Moves.DUAL_WINGBEAT, Moves.SUCKER_PUNCH, Moves.PARTING_SHOT, Moves.HYPER_DRILL ],
|
||||
[Species.SPEAROW]: [ Moves.FLOATY_FALL, Moves.EXTREME_SPEED, Moves.TIDY_UP, Moves.TRIPLE_ARROWS ],
|
||||
[Species.EKANS]: [ Moves.SHED_TAIL, Moves.DRAGON_DANCE, Moves.SLACK_OFF, Moves.NOXIOUS_TORQUE ],
|
||||
[Species.SANDSHREW]: [ Moves.DIRE_CLAW, Moves.CEASELESS_EDGE, Moves.SHORE_UP, Moves.PRECIPICE_BLADES ],
|
||||
[Species.NIDORAN_F]: [ Moves.SCALD, Moves.SHORE_UP, Moves.CALM_MIND, Moves.BANEFUL_BUNKER ],
|
||||
[Species.NIDORAN_M]: [ Moves.DARK_PULSE, Moves.SHORE_UP, Moves.CALM_MIND, Moves.KINGS_SHIELD ],
|
||||
[Species.NIDORAN_F]: [ Moves.DIRE_CLAW, Moves.SHORE_UP, Moves.THOUSAND_WAVES, Moves.SALT_CURE ],
|
||||
[Species.NIDORAN_M]: [ Moves.NOXIOUS_TORQUE, Moves.KINGS_SHIELD, Moves.NO_RETREAT, Moves.PRECIPICE_BLADES ],
|
||||
[Species.VULPIX]: [ Moves.MOONBLAST, Moves.PSYCHIC, Moves.MORNING_SUN, Moves.TAIL_GLOW ],
|
||||
[Species.ZUBAT]: [ Moves.FLOATY_FALL, Moves.DIRE_CLAW, Moves.SWORDS_DANCE, Moves.BRAVE_BIRD ],
|
||||
[Species.ODDISH]: [ Moves.SLUDGE_BOMB, Moves.FIERY_DANCE, Moves.STRENGTH_SAP, Moves.SPORE ],
|
||||
@ -28,24 +28,24 @@ export const speciesEggMoves = {
|
||||
[Species.MANKEY]: [ Moves.DRAIN_PUNCH, Moves.RAGING_FURY, Moves.METEOR_MASH, Moves.NO_RETREAT ],
|
||||
[Species.GROWLITHE]: [ Moves.ZING_ZAP, Moves.PARTING_SHOT, Moves.MORNING_SUN, Moves.SACRED_FIRE ],
|
||||
[Species.POLIWAG]: [ Moves.BOUNCY_BUBBLE, Moves.WILDBOLT_STORM, Moves.DRAIN_PUNCH, Moves.SURGING_STRIKES ],
|
||||
[Species.ABRA]: [ Moves.MOONBLAST, Moves.EARTH_POWER, Moves.THUNDERBOLT, Moves.LUSTER_PURGE ],
|
||||
[Species.MACHOP]: [ Moves.MACH_PUNCH, Moves.METEOR_MASH, Moves.FLYING_PRESS, Moves.FISSURE ],
|
||||
[Species.BELLSPROUT]: [ Moves.SOLAR_BLADE, Moves.WEATHER_BALL, Moves.FIRE_LASH, Moves.STRENGTH_SAP ],
|
||||
[Species.ABRA]: [ Moves.MOONBLAST, Moves.FLAMETHROWER, Moves.THUNDERBOLT, Moves.PSYSTRIKE ],
|
||||
[Species.MACHOP]: [ Moves.MACH_PUNCH, Moves.METEOR_MASH, Moves.ICE_HAMMER, Moves.FISSURE ],
|
||||
[Species.BELLSPROUT]: [ Moves.SOLAR_BLADE, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.VICTORY_DANCE ],
|
||||
[Species.TENTACOOL]: [ Moves.BANEFUL_BUNKER, Moves.STRENGTH_SAP, Moves.HAZE, Moves.MALIGNANT_CHAIN ],
|
||||
[Species.GEODUDE]: [ Moves.BODY_PRESS, Moves.BULK_UP, Moves.SHORE_UP, Moves.HEAD_SMASH ],
|
||||
[Species.PONYTA]: [ Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.MORNING_SUN, Moves.VOLT_TACKLE ],
|
||||
[Species.PONYTA]: [ Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.SWORDS_DANCE, Moves.VOLT_TACKLE ],
|
||||
[Species.SLOWPOKE]: [ Moves.BOUNCY_BUBBLE, Moves.PARTING_SHOT, Moves.COSMIC_POWER, Moves.LUMINA_CRASH ],
|
||||
[Species.MAGNEMITE]: [ Moves.RECOVER, Moves.BODY_PRESS, Moves.ICE_BEAM, Moves.THUNDERCLAP ],
|
||||
[Species.MAGNEMITE]: [ Moves.PARABOLIC_CHARGE, Moves.BODY_PRESS, Moves.ICE_BEAM, Moves.THUNDERCLAP ],
|
||||
[Species.FARFETCHD]: [ Moves.BATON_PASS, Moves.SACRED_SWORD, Moves.ROOST, Moves.VICTORY_DANCE ],
|
||||
[Species.DODUO]: [ Moves.TRIPLE_AXEL, Moves.HEAD_CHARGE, Moves.BRAVE_BIRD, Moves.TRIPLE_ARROWS ],
|
||||
[Species.DODUO]: [ Moves.TRIPLE_AXEL, Moves.MULTI_ATTACK, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ],
|
||||
[Species.SEEL]: [ Moves.FREEZE_DRY, Moves.CHILLY_RECEPTION, Moves.SLACK_OFF, Moves.BOUNCY_BUBBLE ],
|
||||
[Species.GRIMER]: [ Moves.SHADOW_SNEAK, Moves.CURSE, Moves.STRENGTH_SAP, Moves.NOXIOUS_TORQUE ],
|
||||
[Species.SHELLDER]: [ Moves.BODY_PRESS, Moves.WATER_SHURIKEN, Moves.BANEFUL_BUNKER, Moves.RECOVER ],
|
||||
[Species.SHELLDER]: [ Moves.ROCK_BLAST, Moves.WATER_SHURIKEN, Moves.BANEFUL_BUNKER, Moves.BONE_RUSH ],
|
||||
[Species.GASTLY]: [ Moves.FROST_BREATH, Moves.AURA_SPHERE, Moves.NASTY_PLOT, Moves.MALIGNANT_CHAIN ],
|
||||
[Species.ONIX]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.HEAD_SMASH, Moves.SPIN_OUT ],
|
||||
[Species.DROWZEE]: [ Moves.DREAM_EATER, Moves.RECOVER, Moves.NIGHTMARE, Moves.SPORE ],
|
||||
[Species.KRABBY]: [ Moves.MOUNTAIN_GALE, Moves.LIQUIDATION, Moves.SHORE_UP, Moves.SHELL_SMASH ],
|
||||
[Species.VOLTORB]: [ Moves.BUZZY_BUZZ, Moves.VOLT_SWITCH, Moves.ENERGY_BALL, Moves.NASTY_PLOT ],
|
||||
[Species.KRABBY]: [ Moves.ICICLE_CRASH, Moves.LIQUIDATION, Moves.IVY_CUDGEL, Moves.SHELL_SMASH ],
|
||||
[Species.VOLTORB]: [ Moves.BUZZY_BUZZ, Moves.OVERHEAT, Moves.FROST_BREATH, Moves.TAIL_GLOW ],
|
||||
[Species.EXEGGCUTE]: [ Moves.MYSTICAL_POWER, Moves.APPLE_ACID, Moves.TRICK_ROOM, Moves.FICKLE_BEAM ],
|
||||
[Species.CUBONE]: [ Moves.HEAD_SMASH, Moves.WOOD_HAMMER, Moves.PAIN_SPLIT, Moves.VOLT_TACKLE ],
|
||||
[Species.LICKITUNG]: [ Moves.BODY_SLAM, Moves.FIRE_LASH, Moves.GRAV_APPLE, Moves.MILK_DRINK ],
|
||||
@ -53,7 +53,7 @@ export const speciesEggMoves = {
|
||||
[Species.RHYHORN]: [ Moves.SHORE_UP, Moves.WAVE_CRASH, Moves.FLARE_BLITZ, Moves.HEAD_SMASH ],
|
||||
[Species.TANGELA]: [ Moves.STRENGTH_SAP, Moves.INFESTATION, Moves.PARTING_SHOT, Moves.SAPPY_SEED ],
|
||||
[Species.KANGASKHAN]: [ Moves.POWER_UP_PUNCH, Moves.BREAKING_SWIPE, Moves.RETURN, Moves.SEISMIC_TOSS ],
|
||||
[Species.HORSEA]: [ Moves.SNIPE_SHOT, Moves.NASTY_PLOT, Moves.HURRICANE, Moves.SPACIAL_REND ],
|
||||
[Species.HORSEA]: [ Moves.SNIPE_SHOT, Moves.FROST_BREATH, Moves.HURRICANE, Moves.DRAGON_ENERGY ],
|
||||
[Species.GOLDEEN]: [ Moves.DRILL_RUN, Moves.FLIP_TURN, Moves.DRAGON_DANCE, Moves.FISHIOUS_REND ],
|
||||
[Species.STARYU]: [ Moves.CALM_MIND, Moves.BOUNCY_BUBBLE, Moves.MOONBLAST, Moves.MYSTICAL_POWER ],
|
||||
[Species.SCYTHER]: [ Moves.GEAR_GRIND, Moves.BUG_BITE, Moves.STORM_THROW, Moves.MIGHTY_CLEAVE ],
|
||||
@ -64,11 +64,11 @@ export const speciesEggMoves = {
|
||||
[Species.DITTO]: [ Moves.MIMIC, Moves.COPYCAT, Moves.ME_FIRST, Moves.METRONOME ],
|
||||
[Species.EEVEE]: [ Moves.WISH, Moves.REVELATION_DANCE, Moves.TRI_ATTACK, Moves.NO_RETREAT ],
|
||||
[Species.PORYGON]: [ Moves.BUZZY_BUZZ, Moves.AURA_SPHERE, Moves.TOPSY_TURVY, Moves.TECHNO_BLAST ],
|
||||
[Species.OMANYTE]: [ Moves.SCALD, Moves.EARTH_POWER, Moves.POWER_GEM, Moves.STRENGTH_SAP ],
|
||||
[Species.OMANYTE]: [ Moves.FREEZE_DRY, Moves.EARTH_POWER, Moves.POWER_GEM, Moves.STEAM_ERUPTION ],
|
||||
[Species.KABUTO]: [ Moves.CEASELESS_EDGE, Moves.DRILL_RUN, Moves.AQUA_CUTTER, Moves.MIGHTY_CLEAVE ],
|
||||
[Species.AERODACTYL]: [ Moves.FLOATY_FALL, Moves.HEAD_SMASH, Moves.SWORDS_DANCE, Moves.MIGHTY_CLEAVE ],
|
||||
[Species.ARTICUNO]: [ Moves.AURA_SPHERE, Moves.CALM_MIND, Moves.AURORA_VEIL, Moves.AEROBLAST ],
|
||||
[Species.ZAPDOS]: [ Moves.WEATHER_BALL, Moves.CALM_MIND, Moves.SPIKY_SHIELD, Moves.ELECTRO_SHOT ],
|
||||
[Species.ZAPDOS]: [ Moves.WEATHER_BALL, Moves.CALM_MIND, Moves.SANDSEAR_STORM, Moves.ELECTRO_SHOT ],
|
||||
[Species.MOLTRES]: [ Moves.SCORCHING_SANDS, Moves.CALM_MIND, Moves.BURNING_BULWARK, Moves.TORCH_SONG ],
|
||||
[Species.DRATINI]: [ Moves.DRAGON_HAMMER, Moves.METEOR_MASH, Moves.FIRE_LASH, Moves.FLOATY_FALL ],
|
||||
[Species.MEWTWO]: [ Moves.METEOR_MASH, Moves.MOONBLAST, Moves.PLASMA_FISTS, Moves.PHOTON_GEYSER ],
|
||||
@ -86,7 +86,7 @@ export const speciesEggMoves = {
|
||||
[Species.IGGLYBUFF]: [ Moves.MOONBLAST, Moves.APPLE_ACID, Moves.WISH, Moves.BOOMBURST ],
|
||||
[Species.TOGEPI]: [ Moves.SCORCHING_SANDS, Moves.ROOST, Moves.MOONBLAST, Moves.FIERY_DANCE ],
|
||||
[Species.NATU]: [ Moves.AEROBLAST, Moves.ROOST, Moves.CALM_MIND, Moves.LUMINA_CRASH ],
|
||||
[Species.MAREEP]: [ Moves.ICE_BEAM, Moves.MILK_DRINK, Moves.DRAGON_ENERGY, Moves.TAIL_GLOW ],
|
||||
[Species.MAREEP]: [ Moves.ICE_BEAM, Moves.PARABOLIC_CHARGE, Moves.DRAGON_ENERGY, Moves.TAIL_GLOW ],
|
||||
[Species.HOPPIP]: [ Moves.AIR_SLASH, Moves.STRENGTH_SAP, Moves.QUIVER_DANCE, Moves.SEED_FLARE ],
|
||||
[Species.AIPOM]: [ Moves.TIDY_UP, Moves.STORM_THROW, Moves.FAKE_OUT, Moves.POPULATION_BOMB ],
|
||||
[Species.SUNKERN]: [ Moves.SPORE, Moves.SAPPY_SEED, Moves.FIERY_DANCE, Moves.HYDRO_STEAM ],
|
||||
@ -124,31 +124,31 @@ export const speciesEggMoves = {
|
||||
[Species.ENTEI]: [ Moves.BURNING_BULWARK, Moves.DRAGON_DANCE, Moves.EARTHQUAKE, Moves.MIGHTY_CLEAVE ],
|
||||
[Species.SUICUNE]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.FREEZE_DRY, Moves.BOUNCY_BUBBLE ],
|
||||
[Species.LARVITAR]: [ Moves.DRAGON_DANCE, Moves.MOUNTAIN_GALE, Moves.MIGHTY_CLEAVE, Moves.SHORE_UP ],
|
||||
[Species.LUGIA]: [ Moves.COSMIC_POWER, Moves.STORED_POWER, Moves.SCALD, Moves.OBLIVION_WING ],
|
||||
[Species.LUGIA]: [ Moves.TAKE_HEART, Moves.STORED_POWER, Moves.SCALD, Moves.OBLIVION_WING ],
|
||||
[Species.HO_OH]: [ Moves.BURNING_BULWARK, Moves.U_TURN, Moves.BRAVE_BIRD, Moves.REVIVAL_BLESSING ],
|
||||
[Species.CELEBI]: [ Moves.MYSTICAL_POWER, Moves.STORED_POWER, Moves.COSMIC_POWER, Moves.SEED_FLARE ],
|
||||
[Species.TREECKO]: [ Moves.DRAGON_PULSE, Moves.DRAGON_ENERGY, Moves.SECRET_SWORD, Moves.SEED_FLARE ],
|
||||
[Species.TORCHIC]: [ Moves.THUNDEROUS_KICK, Moves.POWER_UP_PUNCH, Moves.KNOCK_OFF, Moves.SACRED_FIRE ],
|
||||
[Species.MUDKIP]: [ Moves.SHORE_UP, Moves.ICICLE_CRASH, Moves.BULK_UP, Moves.WAVE_CRASH ],
|
||||
[Species.TORCHIC]: [ Moves.HIGH_JUMP_KICK, Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.V_CREATE ],
|
||||
[Species.MUDKIP]: [ Moves.SHORE_UP, Moves.ICICLE_CRASH, Moves.BULK_UP, Moves.SURGING_STRIKES ],
|
||||
[Species.POOCHYENA]: [ Moves.JAW_LOCK, Moves.PSYCHIC_FANGS, Moves.POISON_FANG, Moves.NO_RETREAT ],
|
||||
[Species.ZIGZAGOON]: [ Moves.EXTREME_SPEED, Moves.ENDURE, Moves.HIGH_HORSEPOWER, Moves.TIDY_UP ],
|
||||
[Species.WURMPLE]: [ Moves.BATON_PASS, Moves.BLEAKWIND_STORM, Moves.STICKY_WEB, Moves.MALIGNANT_CHAIN ],
|
||||
[Species.LOTAD]: [ Moves.REVELATION_DANCE, Moves.APPLE_ACID, Moves.ICE_BEAM, Moves.QUIVER_DANCE ],
|
||||
[Species.SEEDOT]: [ Moves.SWORDS_DANCE, Moves.GRASSY_GLIDE, Moves.KOWTOW_CLEAVE, Moves.IVY_CUDGEL ],
|
||||
[Species.TAILLOW]: [ Moves.BOOMBURST, Moves.FACADE, Moves.DRILL_RUN, Moves.VOLT_TACKLE ],
|
||||
[Species.TAILLOW]: [ Moves.SWORDS_DANCE, Moves.FACADE, Moves.DRILL_RUN, Moves.EXTREME_SPEED ],
|
||||
[Species.WINGULL]: [ Moves.THUNDER, Moves.FLIP_TURN, Moves.DEFOG, Moves.STEAM_ERUPTION ],
|
||||
[Species.RALTS]: [ Moves.BOOMBURST, Moves.BITTER_BLADE, Moves.PSYBLADE, Moves.VICTORY_DANCE ],
|
||||
[Species.RALTS]: [ Moves.BOOMBURST, Moves.BITTER_BLADE, Moves.QUIVER_DANCE, Moves.VICTORY_DANCE ],
|
||||
[Species.SURSKIT]: [ Moves.ROOST, Moves.FIERY_DANCE, Moves.STICKY_WEB, Moves.BLEAKWIND_STORM ],
|
||||
[Species.SHROOMISH]: [ Moves.ACCELEROCK, Moves.TRAILBLAZE, Moves.STORM_THROW, Moves.SAPPY_SEED ],
|
||||
[Species.SLAKOTH]: [ Moves.FACADE, Moves.JUMP_KICK, Moves.KNOCK_OFF, Moves.SKILL_SWAP ],
|
||||
[Species.NINCADA]: [ Moves.ATTACK_ORDER, Moves.STICKY_WEB, Moves.POLTERGEIST, Moves.SHELL_SMASH ],
|
||||
[Species.WHISMUR]: [ Moves.ALLURING_VOICE, Moves.SLACK_OFF, Moves.SPARKLING_ARIA, Moves.TORCH_SONG ],
|
||||
[Species.NINCADA]: [ Moves.ATTACK_ORDER, Moves.STICKY_WEB, Moves.SPIRIT_SHACKLE, Moves.SHELL_SMASH ],
|
||||
[Species.WHISMUR]: [ Moves.ALLURING_VOICE, Moves.TRICK_ROOM, Moves.SPARKLING_ARIA, Moves.TORCH_SONG ],
|
||||
[Species.MAKUHITA]: [ Moves.STORM_THROW, Moves.SLACK_OFF, Moves.HEAT_CRASH, Moves.DOUBLE_IRON_BASH ],
|
||||
[Species.AZURILL]: [ Moves.SLACK_OFF, Moves.SPIRIT_BREAK, Moves.TIDY_UP, Moves.WAVE_CRASH ],
|
||||
[Species.AZURILL]: [ Moves.JET_PUNCH, Moves.SPIRIT_BREAK, Moves.SWORDS_DANCE, Moves.SURGING_STRIKES ],
|
||||
[Species.NOSEPASS]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.CALM_MIND, Moves.TACHYON_CUTTER ],
|
||||
[Species.SKITTY]: [ Moves.THUNDEROUS_KICK, Moves.SKETCH, Moves.TIDY_UP, Moves.V_CREATE ],
|
||||
[Species.SABLEYE]: [ Moves.RECOVER, Moves.TOPSY_TURVY, Moves.PARTING_SHOT, Moves.SALT_CURE ],
|
||||
[Species.MAWILE]: [ Moves.BULLET_PUNCH, Moves.RECOVER, Moves.EARTHQUAKE, Moves.DOUBLE_IRON_BASH ],
|
||||
[Species.MAWILE]: [ Moves.BULLET_PUNCH, Moves.MAGICAL_TORQUE, Moves.EARTHQUAKE, Moves.DOUBLE_IRON_BASH ],
|
||||
[Species.ARON]: [ Moves.HEAD_SMASH, Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SALT_CURE ],
|
||||
[Species.MEDITITE]: [ Moves.THUNDEROUS_KICK, Moves.SUCKER_PUNCH, Moves.BULLET_PUNCH, Moves.PHOTON_GEYSER ],
|
||||
[Species.ELECTRIKE]: [ Moves.RISING_VOLTAGE, Moves.FLAMETHROWER, Moves.NASTY_PLOT, Moves.ICE_BEAM ],
|
||||
@ -162,40 +162,40 @@ export const speciesEggMoves = {
|
||||
[Species.NUMEL]: [ Moves.SANDSEAR_STORM, Moves.SPIKES, Moves.SHORE_UP, Moves.SEARING_SHOT ],
|
||||
[Species.TORKOAL]: [ Moves.SLACK_OFF, Moves.SPIKES, Moves.BODY_PRESS, Moves.BURNING_BULWARK ],
|
||||
[Species.SPOINK]: [ Moves.AURA_SPHERE, Moves.MILK_DRINK, Moves.COSMIC_POWER, Moves.EXPANDING_FORCE ],
|
||||
[Species.SPINDA]: [ Moves.SUPERPOWER, Moves.RECOVER, Moves.FLEUR_CANNON, Moves.V_CREATE ],
|
||||
[Species.SPINDA]: [ Moves.SUPERPOWER, Moves.SLACK_OFF, Moves.FLEUR_CANNON, Moves.V_CREATE ],
|
||||
[Species.TRAPINCH]: [ Moves.FIRE_LASH, Moves.DRAGON_DARTS, Moves.THOUSAND_ARROWS, Moves.DRAGON_ENERGY ],
|
||||
[Species.CACNEA]: [ Moves.SCORCHING_SANDS, Moves.CEASELESS_EDGE, Moves.NIGHT_DAZE, Moves.SAPPY_SEED ],
|
||||
[Species.CACNEA]: [ Moves.EARTH_POWER, Moves.CEASELESS_EDGE, Moves.NIGHT_DAZE, Moves.IVY_CUDGEL ],
|
||||
[Species.SWABLU]: [ Moves.ROOST, Moves.NASTY_PLOT, Moves.FLOATY_FALL, Moves.BOOMBURST ],
|
||||
[Species.ZANGOOSE]: [ Moves.FACADE, Moves.HIGH_HORSEPOWER, Moves.EXTREME_SPEED, Moves.TIDY_UP ],
|
||||
[Species.SEVIPER]: [ Moves.DIRE_CLAW, Moves.NASTY_PLOT, Moves.SUCKER_PUNCH, Moves.SHED_TAIL ],
|
||||
[Species.LUNATONE]: [ Moves.POWER_GEM, Moves.NIGHT_DAZE, Moves.STORED_POWER, Moves.LUMINA_CRASH ],
|
||||
[Species.SOLROCK]: [ Moves.PSYSHIELD_BASH, Moves.MIGHTY_CLEAVE, Moves.POWER_TRIP, Moves.SACRED_FIRE ],
|
||||
[Species.BARBOACH]: [ Moves.DRAGON_DANCE, Moves.SUPERCELL_SLAM, Moves.ICE_SPINNER, Moves.WAVE_CRASH ],
|
||||
[Species.CORPHISH]: [ Moves.CEASELESS_EDGE, Moves.AQUA_JET, Moves.WAVE_CRASH, Moves.SHELL_SMASH ],
|
||||
[Species.CORPHISH]: [ Moves.CEASELESS_EDGE, Moves.JET_PUNCH, Moves.WAVE_CRASH, Moves.SHELL_SMASH ],
|
||||
[Species.BALTOY]: [ Moves.RECOVER, Moves.STORED_POWER, Moves.BODY_PRESS, Moves.MYSTICAL_POWER ],
|
||||
[Species.LILEEP]: [ Moves.METEOR_BEAM, Moves.SCALD, Moves.STEALTH_ROCK, Moves.SAPPY_SEED ],
|
||||
[Species.LILEEP]: [ Moves.POWER_GEM, Moves.SCALD, Moves.STONE_AXE, Moves.SAPPY_SEED ],
|
||||
[Species.ANORITH]: [ Moves.LIQUIDATION, Moves.LEECH_LIFE, Moves.DRAGON_DANCE, Moves.MIGHTY_CLEAVE ],
|
||||
[Species.FEEBAS]: [ Moves.CALM_MIND, Moves.FREEZE_DRY, Moves.MOONBLAST, Moves.STEAM_ERUPTION ],
|
||||
[Species.CASTFORM]: [ Moves.BOOMBURST, Moves.HYDRO_STEAM, Moves.CLEAR_SMOG, Moves.QUIVER_DANCE ],
|
||||
[Species.KECLEON]: [ Moves.DRAIN_PUNCH, Moves.DRAGON_DANCE, Moves.EXTREME_SPEED, Moves.MULTI_ATTACK ],
|
||||
[Species.SHUPPET]: [ Moves.DRAIN_PUNCH, Moves.RECOVER, Moves.PARTING_SHOT, Moves.SPECTRAL_THIEF ],
|
||||
[Species.DUSKULL]: [ Moves.BULK_UP, Moves.DRAIN_PUNCH, Moves.RECOVER, Moves.RAGE_FIST ],
|
||||
[Species.SHUPPET]: [ Moves.DRAIN_PUNCH, Moves.TOPSY_TURVY, Moves.PARTING_SHOT, Moves.SPECTRAL_THIEF ],
|
||||
[Species.DUSKULL]: [ Moves.BULK_UP, Moves.DRAIN_PUNCH, Moves.STRENGTH_SAP, Moves.RAGE_FIST ],
|
||||
[Species.TROPIUS]: [ Moves.STUFF_CHEEKS, Moves.EARTH_POWER, Moves.APPLE_ACID, Moves.SAPPY_SEED ],
|
||||
[Species.ABSOL]: [ Moves.KOWTOW_CLEAVE, Moves.SACRED_SWORD, Moves.DIRE_CLAW, Moves.BITTER_BLADE ],
|
||||
[Species.WYNAUT]: [ Moves.RECOVER, Moves.COSMIC_POWER, Moves.TAUNT, Moves.SHED_TAIL ],
|
||||
[Species.SNORUNT]: [ Moves.AURORA_VEIL, Moves.HEAD_CHARGE, Moves.POLTERGEIST, Moves.FREEZY_FROST ],
|
||||
[Species.WYNAUT]: [ Moves.RECOVER, Moves.PERISH_SONG, Moves.TAUNT, Moves.SHED_TAIL ],
|
||||
[Species.SNORUNT]: [ Moves.AURORA_VEIL, Moves.HYPER_VOICE, Moves.EARTH_POWER, Moves.NO_RETREAT ],
|
||||
[Species.SPHEAL]: [ Moves.FLIP_TURN, Moves.FREEZE_DRY, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ],
|
||||
[Species.CLAMPERL]: [ Moves.ICE_SPINNER, Moves.LIQUIDATION, Moves.EARTH_POWER, Moves.ORIGIN_PULSE ],
|
||||
[Species.RELICANTH]: [ Moves.BODY_PRESS, Moves.SHORE_UP, Moves.WAVE_CRASH, Moves.FISHIOUS_REND ],
|
||||
[Species.LUVDISC]: [ Moves.BATON_PASS, Moves.THIEF, Moves.BOUNCY_BUBBLE, Moves.TAKE_HEART ],
|
||||
[Species.BAGON]: [ Moves.IRON_HEAD, Moves.FIRE_LASH, Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH ],
|
||||
[Species.BAGON]: [ Moves.FLOATY_FALL, Moves.FIRE_LASH, Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH ],
|
||||
[Species.BELDUM]: [ Moves.PSYCHIC_FANGS, Moves.RECOVER, Moves.MOUNTAIN_GALE, Moves.SHIFT_GEAR ],
|
||||
[Species.REGIROCK]: [ Moves.STONE_AXE, Moves.BODY_PRESS, Moves.RECOVER, Moves.SALT_CURE ],
|
||||
[Species.REGICE]: [ Moves.EARTH_POWER, Moves.COSMIC_POWER, Moves.RECOVER, Moves.FREEZE_DRY ],
|
||||
[Species.REGISTEEL]: [ Moves.BODY_PRESS, Moves.HEAT_CRASH, Moves.RECOVER, Moves.GIGATON_HAMMER ],
|
||||
[Species.LATIAS]: [ Moves.CORE_ENFORCER, Moves.SEARING_SHOT, Moves.DRAGON_ENERGY, Moves.QUIVER_DANCE ],
|
||||
[Species.LATIOS]: [ Moves.CORE_ENFORCER, Moves.SEARING_SHOT, Moves.DRAGON_ENERGY, Moves.QUIVER_DANCE ],
|
||||
[Species.KYOGRE]: [ Moves.BOUNCY_BUBBLE, Moves.HURRICANE, Moves.THUNDER, Moves.RECOVER ],
|
||||
[Species.KYOGRE]: [ Moves.BOUNCY_BUBBLE, Moves.HURRICANE, Moves.THUNDER, Moves.TAIL_GLOW ],
|
||||
[Species.GROUDON]: [ Moves.STONE_AXE, Moves.SOLAR_BLADE, Moves.MORNING_SUN, Moves.SACRED_FIRE ],
|
||||
[Species.RAYQUAZA]: [ Moves.OBLIVION_WING, Moves.DRAGON_DARTS, Moves.DRAGON_ENERGY, Moves.V_CREATE ],
|
||||
[Species.JIRACHI]: [ Moves.IRON_HEAD, Moves.FLOATY_FALL, Moves.ROCK_SLIDE, Moves.SHIFT_GEAR ],
|
||||
@ -215,7 +215,7 @@ export const speciesEggMoves = {
|
||||
[Species.PACHIRISU]: [ Moves.BADDY_BAD, Moves.SIZZLY_SLIDE, Moves.U_TURN, Moves.ZIPPY_ZAP ],
|
||||
[Species.BUIZEL]: [ Moves.JET_PUNCH, Moves.TRIPLE_AXEL, Moves.SUPERCELL_SLAM, Moves.SURGING_STRIKES ],
|
||||
[Species.CHERUBI]: [ Moves.SPORE, Moves.STRENGTH_SAP, Moves.FIERY_DANCE, Moves.FLOWER_TRICK ],
|
||||
[Species.SHELLOS]: [ Moves.STRENGTH_SAP, Moves.SCORCHING_SANDS, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ],
|
||||
[Species.SHELLOS]: [ Moves.BOUNCY_BUBBLE, Moves.SCORCHING_SANDS, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ],
|
||||
[Species.DRIFLOON]: [ Moves.WILL_O_WISP, Moves.HEAT_WAVE, Moves.CALM_MIND, Moves.OBLIVION_WING ],
|
||||
[Species.BUNEARY]: [ Moves.TRIPLE_AXEL, Moves.SWORDS_DANCE, Moves.THUNDEROUS_KICK, Moves.MULTI_ATTACK ],
|
||||
[Species.GLAMEOW]: [ Moves.U_TURN, Moves.HIGH_HORSEPOWER, Moves.BULK_UP, Moves.EXTREME_SPEED ],
|
||||
@ -226,7 +226,7 @@ export const speciesEggMoves = {
|
||||
[Species.MIME_JR]: [ Moves.CALM_MIND, Moves.MOONBLAST, Moves.WILL_O_WISP, Moves.LUMINA_CRASH ],
|
||||
[Species.HAPPINY]: [ Moves.COTTON_GUARD, Moves.SEISMIC_TOSS, Moves.SIZZLY_SLIDE, Moves.REVIVAL_BLESSING ],
|
||||
[Species.CHATOT]: [ Moves.SPARKLING_ARIA, Moves.TORCH_SONG, Moves.BATON_PASS, Moves.BOOMBURST ],
|
||||
[Species.SPIRITOMB]: [ Moves.PARTING_SHOT, Moves.FOUL_PLAY, Moves.RECOVER, Moves.SPECTRAL_THIEF ],
|
||||
[Species.SPIRITOMB]: [ Moves.PARTING_SHOT, Moves.FOUL_PLAY, Moves.STRENGTH_SAP, Moves.SPECTRAL_THIEF ],
|
||||
[Species.GIBLE]: [ Moves.DRAGON_DANCE, Moves.THOUSAND_WAVES, Moves.SHORE_UP, Moves.BITTER_BLADE ],
|
||||
[Species.MUNCHLAX]: [ Moves.CURSE, Moves.BODY_PRESS, Moves.KNOCK_OFF, Moves.SLACK_OFF ],
|
||||
[Species.RIOLU]: [ Moves.THUNDEROUS_KICK, Moves.BULLET_PUNCH, Moves.TRIPLE_AXEL, Moves.DOUBLE_IRON_BASH ],
|
||||
@ -237,18 +237,18 @@ export const speciesEggMoves = {
|
||||
[Species.FINNEON]: [ Moves.QUIVER_DANCE, Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.ORIGIN_PULSE ],
|
||||
[Species.MANTYKE]: [ Moves.BOUNCY_BUBBLE, Moves.SPIKES, Moves.ROOST, Moves.STEAM_ERUPTION ],
|
||||
[Species.SNOVER]: [ Moves.HIGH_HORSEPOWER, Moves.STRENGTH_SAP, Moves.AURORA_VEIL, Moves.IVY_CUDGEL ],
|
||||
[Species.ROTOM]: [ Moves.RECOVER, Moves.FIERY_DANCE, Moves.SPLISHY_SPLASH, Moves.RISING_VOLTAGE ],
|
||||
[Species.ROTOM]: [ Moves.STRENGTH_SAP, Moves.FIERY_DANCE, Moves.SPLISHY_SPLASH, Moves.RISING_VOLTAGE ],
|
||||
[Species.UXIE]: [ Moves.COSMIC_POWER, Moves.BODY_PRESS, Moves.RECOVER, Moves.LUMINA_CRASH ],
|
||||
[Species.MESPRIT]: [ Moves.QUIVER_DANCE, Moves.AURA_SPHERE, Moves.RECOVER, Moves.LUMINA_CRASH ],
|
||||
[Species.AZELF]: [ Moves.PHOTON_GEYSER, Moves.DRAGON_DANCE, Moves.RECOVER, Moves.LUMINA_CRASH ],
|
||||
[Species.AZELF]: [ Moves.PHOTON_GEYSER, Moves.ICE_BEAM, Moves.MOONBLAST, Moves.LUMINA_CRASH ],
|
||||
[Species.DIALGA]: [ Moves.CORE_ENFORCER, Moves.TAKE_HEART, Moves.RECOVER, Moves.MAKE_IT_RAIN ],
|
||||
[Species.PALKIA]: [ Moves.RECOVER, Moves.TAKE_HEART, Moves.WATER_SPOUT, Moves.DRAGON_ENERGY ],
|
||||
[Species.HEATRAN]: [ Moves.TORCH_SONG, Moves.RECOVER, Moves.FLASH_CANNON, Moves.MATCHA_GOTCHA ],
|
||||
[Species.REGIGIGAS]: [ Moves.SKILL_SWAP, Moves.SHORE_UP, Moves.EXTREME_SPEED, Moves.GIGATON_HAMMER ],
|
||||
[Species.GIRATINA]: [ Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH, Moves.RECOVER, Moves.ASTRAL_BARRAGE ],
|
||||
[Species.GIRATINA]: [ Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH, Moves.RECOVER, Moves.SPECTRAL_THIEF ],
|
||||
[Species.CRESSELIA]: [ Moves.COSMIC_POWER, Moves.SECRET_SWORD, Moves.SIZZLY_SLIDE, Moves.LUMINA_CRASH ],
|
||||
[Species.PHIONE]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.RECOVER, Moves.QUIVER_DANCE ],
|
||||
[Species.MANAPHY]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.RECOVER, Moves.QUIVER_DANCE ],
|
||||
[Species.PHIONE]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.SPLISHY_SPLASH, Moves.QUIVER_DANCE ],
|
||||
[Species.MANAPHY]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.SPLISHY_SPLASH, Moves.QUIVER_DANCE ],
|
||||
[Species.DARKRAI]: [ Moves.FIERY_WRATH, Moves.MOONBLAST, Moves.SEARING_SHOT, Moves.SPORE ],
|
||||
[Species.SHAYMIN]: [ Moves.SPRINGTIDE_STORM, Moves.HEAT_WAVE, Moves.BLEAKWIND_STORM, Moves.MATCHA_GOTCHA ],
|
||||
[Species.ARCEUS]: [ Moves.QUIVER_DANCE, Moves.COLLISION_COURSE, Moves.VICTORY_DANCE, Moves.SPECTRAL_THIEF ],
|
||||
@ -303,7 +303,7 @@ export const speciesEggMoves = {
|
||||
[Species.JOLTIK]: [ Moves.THUNDER, Moves.PARABOLIC_CHARGE, Moves.EARTH_POWER, Moves.QUIVER_DANCE ],
|
||||
[Species.FERROSEED]: [ Moves.STRENGTH_SAP, Moves.BODY_PRESS, Moves.SPIKY_SHIELD, Moves.SAPPY_SEED ],
|
||||
[Species.KLINK]: [ Moves.FLARE_BLITZ, Moves.HIGH_HORSEPOWER, Moves.FUSION_BOLT, Moves.DOUBLE_IRON_BASH ],
|
||||
[Species.TYNAMO]: [ Moves.SCALD, Moves.RECOVER, Moves.FIRE_LASH, Moves.PLASMA_FISTS ],
|
||||
[Species.TYNAMO]: [ Moves.SCALD, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.PLASMA_FISTS ],
|
||||
[Species.ELGYEM]: [ Moves.MYSTICAL_POWER, Moves.TRICK_ROOM, Moves.STORED_POWER, Moves.LUMINA_CRASH ],
|
||||
[Species.LITWICK]: [ Moves.FIERY_DANCE, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.ASTRAL_BARRAGE ],
|
||||
[Species.AXEW]: [ Moves.STONE_AXE, Moves.DIRE_CLAW, Moves.FIRE_LASH, Moves.GLAIVE_RUSH ],
|
||||
@ -313,7 +313,7 @@ export const speciesEggMoves = {
|
||||
[Species.STUNFISK]: [ Moves.SHORE_UP, Moves.BANEFUL_BUNKER, Moves.THUNDER_CAGE, Moves.THUNDERCLAP ],
|
||||
[Species.MIENFOO]: [ Moves.GUNK_SHOT, Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.MOUNTAIN_GALE ],
|
||||
[Species.DRUDDIGON]: [ Moves.GLARE, Moves.ROOST, Moves.DRAGON_HAMMER, Moves.FIRE_LASH ],
|
||||
[Species.GOLETT]: [ Moves.BULK_UP, Moves.RECOVER, Moves.HEADLONG_RUSH, Moves.RAGE_FIST ],
|
||||
[Species.GOLETT]: [ Moves.SHIFT_GEAR, Moves.DRAIN_PUNCH, Moves.HEADLONG_RUSH, Moves.RAGE_FIST ],
|
||||
[Species.PAWNIARD]: [ Moves.SUCKER_PUNCH, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE, Moves.LAST_RESPECTS ],
|
||||
[Species.BOUFFALANT]: [ Moves.SLACK_OFF, Moves.JUMP_KICK, Moves.HEAD_SMASH, Moves.FLARE_BLITZ ],
|
||||
[Species.RUFFLET]: [ Moves.FLOATY_FALL, Moves.MOONBLAST, Moves.HEAT_WAVE, Moves.BOLT_BEAK ],
|
||||
@ -328,14 +328,14 @@ export const speciesEggMoves = {
|
||||
[Species.TORNADUS]: [ Moves.EARTH_POWER, Moves.U_TURN, Moves.ICE_BEAM, Moves.OBLIVION_WING ],
|
||||
[Species.THUNDURUS]: [ Moves.EARTH_POWER, Moves.HURRICANE, Moves.THUNDERCLAP, Moves.ELECTRO_SHOT ],
|
||||
[Species.RESHIRAM]: [ Moves.ROOST, Moves.TAKE_HEART, Moves.ERUPTION, Moves.DRAGON_ENERGY ],
|
||||
[Species.ZEKROM]: [ Moves.ROOST, Moves.THUNDEROUS_KICK, Moves.DRAGON_HAMMER, Moves.BOLT_BEAK ],
|
||||
[Species.ZEKROM]: [ Moves.DRAGON_DANCE, Moves.THUNDEROUS_KICK, Moves.DRAGON_HAMMER, Moves.BOLT_BEAK ],
|
||||
[Species.LANDORUS]: [ Moves.STONE_AXE, Moves.THOUSAND_ARROWS, Moves.ROOST, Moves.FLOATY_FALL ],
|
||||
[Species.KYUREM]: [ Moves.ICICLE_CRASH, Moves.DRAGON_ENERGY, Moves.NASTY_PLOT, Moves.GLACIAL_LANCE ],
|
||||
[Species.KELDEO]: [ Moves.BOUNCY_BUBBLE, Moves.THUNDERBOLT, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ],
|
||||
[Species.MELOETTA]: [ Moves.TORCH_SONG, Moves.QUIVER_DANCE, Moves.THUNDEROUS_KICK, Moves.BOOMBURST ],
|
||||
[Species.GENESECT]: [ Moves.EXTREME_SPEED, Moves.U_TURN, Moves.SHIFT_GEAR, Moves.TAIL_GLOW ],
|
||||
[Species.CHESPIN]: [ Moves.DRAIN_PUNCH, Moves.SYNTHESIS, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED ],
|
||||
[Species.FENNEKIN]: [ Moves.BITTER_MALICE, Moves.MOONBLAST, Moves.THUNDERBOLT, Moves.TORCH_SONG ],
|
||||
[Species.FENNEKIN]: [ Moves.EXPANDING_FORCE, Moves.MOONBLAST, Moves.THUNDERBOLT, Moves.TORCH_SONG ],
|
||||
[Species.FROAKIE]: [ Moves.MOONBLAST, Moves.EARTH_POWER, Moves.TRIPLE_AXEL, Moves.SURGING_STRIKES ],
|
||||
[Species.BUNNELBY]: [ Moves.DRAIN_PUNCH, Moves.TIDY_UP, Moves.FACADE, Moves.EXTREME_SPEED ],
|
||||
[Species.FLETCHLING]: [ Moves.DRILL_RUN, Moves.U_TURN, Moves.SUPERCELL_SLAM, Moves.TIDY_UP ],
|
||||
@ -346,14 +346,14 @@ export const speciesEggMoves = {
|
||||
[Species.PANCHAM]: [ Moves.DRAIN_PUNCH, Moves.FAKE_OUT, Moves.BULLET_PUNCH, Moves.WICKED_BLOW ],
|
||||
[Species.FURFROU]: [ Moves.TIDY_UP, Moves.CRUNCH, Moves.COVET, Moves.MULTI_ATTACK ],
|
||||
[Species.ESPURR]: [ Moves.GLARE, Moves.MOONBLAST, Moves.FLAMETHROWER, Moves.PSYSTRIKE ],
|
||||
[Species.HONEDGE]: [ Moves.TACHYON_CUTTER, Moves.POLTERGEIST, Moves.BITTER_BLADE, Moves.PAIN_SPLIT ],
|
||||
[Species.HONEDGE]: [ Moves.TACHYON_CUTTER, Moves.POLTERGEIST, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ],
|
||||
[Species.SPRITZEE]: [ Moves.TRICK_ROOM, Moves.FOUL_PLAY, Moves.WISH, Moves.REVIVAL_BLESSING ],
|
||||
[Species.SWIRLIX]: [ Moves.BELLY_DRUM, Moves.SUCKER_PUNCH, Moves.SPIRIT_BREAK, Moves.SIZZLY_SLIDE ],
|
||||
[Species.INKAY]: [ Moves.POWER_TRIP, Moves.STORED_POWER, Moves.RECOVER, Moves.PSYCHO_BOOST ],
|
||||
[Species.BINACLE]: [ Moves.ICE_SPINNER, Moves.ACCELEROCK, Moves.BULK_UP, Moves.MIGHTY_CLEAVE ],
|
||||
[Species.BINACLE]: [ Moves.TRIPLE_AXEL, Moves.ACCELEROCK, Moves.DIRE_CLAW, Moves.MIGHTY_CLEAVE ],
|
||||
[Species.SKRELP]: [ Moves.RECOVER, Moves.CORE_ENFORCER, Moves.CALM_MIND, Moves.MALIGNANT_CHAIN ],
|
||||
[Species.CLAUNCHER]: [ Moves.SHELL_SMASH, Moves.ARMOR_CANNON, Moves.TERRAIN_PULSE, Moves.ORIGIN_PULSE ],
|
||||
[Species.HELIOPTILE]: [ Moves.WEATHER_BALL, Moves.NASTY_PLOT, Moves.SHORE_UP, Moves.CLANGOROUS_SOUL ],
|
||||
[Species.HELIOPTILE]: [ Moves.WEATHER_BALL, Moves.BOOMBURST, Moves.EARTH_POWER, Moves.TAIL_GLOW ],
|
||||
[Species.TYRUNT]: [ Moves.DRAGON_HAMMER, Moves.FLARE_BLITZ, Moves.VOLT_TACKLE, Moves.AXE_KICK ],
|
||||
[Species.AMAURA]: [ Moves.RECOVER, Moves.AURORA_VEIL, Moves.POWER_GEM, Moves.GEOMANCY ],
|
||||
[Species.HAWLUCHA]: [ Moves.DARKEST_LARIAT, Moves.HIGH_HORSEPOWER, Moves.SUPERCELL_SLAM, Moves.BRAVE_BIRD ],
|
||||
@ -361,13 +361,13 @@ export const speciesEggMoves = {
|
||||
[Species.CARBINK]: [ Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SPARKLY_SWIRL, Moves.DIAMOND_STORM ],
|
||||
[Species.GOOMY]: [ Moves.SCALD, Moves.RECOVER, Moves.CALM_MIND, Moves.MAKE_IT_RAIN ],
|
||||
[Species.KLEFKI]: [ Moves.COURT_CHANGE, Moves.ENCORE, Moves.TAUNT, Moves.TOPSY_TURVY ],
|
||||
[Species.PHANTUMP]: [ Moves.POLTERGEIST, Moves.TRICK_ROOM, Moves.SYNTHESIS, Moves.SAPPY_SEED ],
|
||||
[Species.PUMPKABOO]: [ Moves.POLTERGEIST, Moves.FIRE_LASH, Moves.DIRE_CLAW, Moves.SAPPY_SEED ],
|
||||
[Species.PHANTUMP]: [ Moves.SPIRIT_SHACKLE, Moves.TRICK_ROOM, Moves.SYNTHESIS, Moves.SAPPY_SEED ],
|
||||
[Species.PUMPKABOO]: [ Moves.SPIRIT_SHACKLE, Moves.FIRE_LASH, Moves.DIRE_CLAW, Moves.SAPPY_SEED ],
|
||||
[Species.BERGMITE]: [ Moves.STONE_AXE, Moves.METAL_BURST, Moves.BODY_PRESS, Moves.GLACIAL_LANCE ],
|
||||
[Species.NOIBAT]: [ Moves.AEROBLAST, Moves.OVERDRIVE, Moves.NASTY_PLOT, Moves.CLANGING_SCALES ],
|
||||
[Species.XERNEAS]: [ Moves.LIGHT_OF_RUIN, Moves.LUMINA_CRASH, Moves.STRENGTH_SAP, Moves.REVIVAL_BLESSING ],
|
||||
[Species.YVELTAL]: [ Moves.IRON_HEAD, Moves.FLOATY_FALL, Moves.NASTY_PLOT, Moves.WICKED_BLOW ],
|
||||
[Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.SHORE_UP, Moves.VICTORY_DANCE, Moves.DOUBLE_IRON_BASH ],
|
||||
[Species.YVELTAL]: [ Moves.SLUDGE_WAVE, Moves.POWER_TRIP, Moves.FIERY_WRATH, Moves.CLANGOROUS_SOUL ],
|
||||
[Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.HEAL_ORDER, Moves.VICTORY_DANCE, Moves.DOUBLE_IRON_BASH ],
|
||||
[Species.DIANCIE]: [ Moves.MAGICAL_TORQUE, Moves.BODY_PRESS, Moves.SHORE_UP, Moves.GEOMANCY ],
|
||||
[Species.HOOPA]: [ Moves.PHOTON_GEYSER, Moves.EARTH_POWER, Moves.BATON_PASS, Moves.TIDY_UP ],
|
||||
[Species.VOLCANION]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.ENERGY_BALL, Moves.SEARING_SHOT ],
|
||||
@ -400,38 +400,38 @@ export const speciesEggMoves = {
|
||||
[Species.MINIOR]: [ Moves.EARTH_POWER, Moves.FLOATY_FALL, Moves.ZING_ZAP, Moves.DIAMOND_STORM ],
|
||||
[Species.KOMALA]: [ Moves.SLACK_OFF, Moves.EXTREME_SPEED, Moves.KNOCK_OFF, Moves.CLOSE_COMBAT ],
|
||||
[Species.TURTONATOR]: [ Moves.SHELL_SMASH, Moves.ARMOR_CANNON, Moves.EARTH_POWER, Moves.CLANGING_SCALES ],
|
||||
[Species.TOGEDEMARU]: [ Moves.SIZZLY_SLIDE, Moves.RECOVER, Moves.METEOR_MASH, Moves.BEHEMOTH_BASH ],
|
||||
[Species.MIMIKYU]: [ Moves.SPIRIT_BREAK, Moves.NUZZLE, Moves.PARTING_SHOT, Moves.SPECTRAL_THIEF ],
|
||||
[Species.TOGEDEMARU]: [ Moves.FAKE_OUT, Moves.METAL_BURST, Moves.METEOR_MASH, Moves.BOLT_STRIKE ],
|
||||
[Species.MIMIKYU]: [ Moves.SPIRIT_BREAK, Moves.TIDY_UP, Moves.SIZZLY_SLIDE, Moves.SPECTRAL_THIEF ],
|
||||
[Species.BRUXISH]: [ Moves.ICE_FANG, Moves.FIRE_FANG, Moves.FLIP_TURN, Moves.FILLET_AWAY ],
|
||||
[Species.DRAMPA]: [ Moves.SLACK_OFF, Moves.FLAMETHROWER, Moves.CLANGING_SCALES, Moves.CLANGOROUS_SOUL ],
|
||||
[Species.DHELMISE]: [ Moves.POLTERGEIST, Moves.STRENGTH_SAP, Moves.LEAF_BLADE, Moves.DOUBLE_IRON_BASH ],
|
||||
[Species.JANGMO_O]: [ Moves.ICE_BEAM, Moves.RECOVER, Moves.SECRET_SWORD, Moves.GLAIVE_RUSH ],
|
||||
[Species.JANGMO_O]: [ Moves.ICE_BEAM, Moves.DRAIN_PUNCH, Moves.SECRET_SWORD, Moves.GLAIVE_RUSH ],
|
||||
[Species.TAPU_KOKO]: [ Moves.PLAY_ROUGH, Moves.MOUNTAIN_GALE, Moves.RISING_VOLTAGE, Moves.BOLT_BEAK ],
|
||||
[Species.TAPU_LELE]: [ Moves.MOONLIGHT, Moves.NASTY_PLOT, Moves.HEAT_WAVE, Moves.EXPANDING_FORCE ],
|
||||
[Species.TAPU_BULU]: [ Moves.GRASSY_GLIDE, Moves.CLOSE_COMBAT, Moves.PLAY_ROUGH, Moves.VICTORY_DANCE ],
|
||||
[Species.TAPU_FINI]: [ Moves.AURA_SPHERE, Moves.EARTH_POWER, Moves.RECOVER, Moves.QUIVER_DANCE ],
|
||||
[Species.COSMOG]: [ Moves.VICTORY_DANCE, Moves.QUIVER_DANCE, Moves.STORED_POWER, Moves.PHOTON_GEYSER ],
|
||||
[Species.NIHILEGO]: [ Moves.RECOVER, Moves.QUIVER_DANCE, Moves.GIGA_DRAIN, Moves.MALIGNANT_CHAIN ],
|
||||
[Species.NIHILEGO]: [ Moves.RECOVER, Moves.QUIVER_DANCE, Moves.ENERGY_BALL, Moves.MALIGNANT_CHAIN ],
|
||||
[Species.BUZZWOLE]: [ Moves.LEECH_LIFE, Moves.BULLET_PUNCH, Moves.DARKEST_LARIAT, Moves.COLLISION_COURSE ],
|
||||
[Species.PHEROMOSA]: [ Moves.AURA_SPHERE, Moves.MAKE_IT_RAIN, Moves.ATTACK_ORDER, Moves.COLLISION_COURSE ],
|
||||
[Species.XURKITREE]: [ Moves.OVERHEAT, Moves.GIGA_DRAIN, Moves.TAIL_GLOW, Moves.THUNDERCLAP ],
|
||||
[Species.CELESTEELA]: [ Moves.ROOST, Moves.BUZZY_BUZZ, Moves.SPIKES, Moves.OBLIVION_WING ],
|
||||
[Species.KARTANA]: [ Moves.MIGHTY_CLEAVE, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ],
|
||||
[Species.GUZZLORD]: [ Moves.DIRE_CLAW, Moves.GLAIVE_RUSH, Moves.SLACK_OFF, Moves.BADDY_BAD ],
|
||||
[Species.GUZZLORD]: [ Moves.SUCKER_PUNCH, Moves.COMEUPPANCE, Moves.SLACK_OFF, Moves.RUINATION ],
|
||||
[Species.NECROZMA]: [ Moves.COSMIC_POWER, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE, Moves.CLANGOROUS_SOUL ],
|
||||
[Species.MAGEARNA]: [ Moves.RECOVER, Moves.EARTH_POWER, Moves.COSMIC_POWER, Moves.MAKE_IT_RAIN ],
|
||||
[Species.MAGEARNA]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.COSMIC_POWER, Moves.MAKE_IT_RAIN ],
|
||||
[Species.MARSHADOW]: [ Moves.POWER_UP_PUNCH, Moves.TRIPLE_AXEL, Moves.STORM_THROW, Moves.DOUBLE_IRON_BASH ],
|
||||
[Species.POIPOLE]: [ Moves.SLUDGE_BOMB, Moves.BUG_BUZZ, Moves.SEARING_SHOT, Moves.DRAGON_ENERGY ],
|
||||
[Species.STAKATAKA]: [ Moves.HEAVY_SLAM, Moves.SHORE_UP, Moves.CURSE, Moves.SALT_CURE ],
|
||||
[Species.BLACEPHALON]: [ Moves.NASTY_PLOT, Moves.SEARING_SHOT, Moves.GIGA_DRAIN, Moves.ASTRAL_BARRAGE ],
|
||||
[Species.ZERAORA]: [ Moves.SWORDS_DANCE, Moves.TRIPLE_AXEL, Moves.BOLT_STRIKE, Moves.PYRO_BALL ],
|
||||
[Species.MELTAN]: [ Moves.BULLET_PUNCH, Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.RECOVER ],
|
||||
[Species.MELTAN]: [ Moves.BULLET_PUNCH, Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS ],
|
||||
[Species.GROOKEY]: [ Moves.HEADLONG_RUSH, Moves.CLOSE_COMBAT, Moves.GRASSY_GLIDE, Moves.CLANGOROUS_SOUL ],
|
||||
[Species.SCORBUNNY]: [ Moves.EXTREME_SPEED, Moves.TROP_KICK, Moves.TRIPLE_AXEL, Moves.THUNDEROUS_KICK ],
|
||||
[Species.SOBBLE]: [ Moves.AEROBLAST, Moves.FROST_BREATH, Moves.SEARING_SHOT, Moves.SURGING_STRIKES ],
|
||||
[Species.SKWOVET]: [ Moves.KNOCK_OFF, Moves.GRAV_APPLE, Moves.BODY_PRESS, Moves.SLACK_OFF ],
|
||||
[Species.ROOKIDEE]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.IRON_HEAD, Moves.KINGS_SHIELD ],
|
||||
[Species.BLIPBUG]: [ Moves.RECOVER, Moves.FREEZING_GLARE, Moves.SPORE, Moves.TAIL_GLOW ],
|
||||
[Species.BLIPBUG]: [ Moves.HEAL_ORDER, Moves.EXPANDING_FORCE, Moves.SPORE, Moves.TAIL_GLOW ],
|
||||
[Species.NICKIT]: [ Moves.BADDY_BAD, Moves.BURNING_JEALOUSY, Moves.SPARKLY_SWIRL, Moves.FIERY_WRATH ],
|
||||
[Species.GOSSIFLEUR]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.PARTING_SHOT, Moves.SEED_FLARE ],
|
||||
[Species.WOOLOO]: [ Moves.PSYSHIELD_BASH, Moves.HEAD_CHARGE, Moves.BODY_PRESS, Moves.MILK_DRINK ],
|
||||
@ -440,7 +440,7 @@ export const speciesEggMoves = {
|
||||
[Species.ROLYCOLY]: [ Moves.BURNING_BULWARK, Moves.ZING_ZAP, Moves.WORK_UP, Moves.DIAMOND_STORM ],
|
||||
[Species.APPLIN]: [ Moves.DRAGON_CHEER, Moves.PARTING_SHOT, Moves.FLOWER_TRICK, Moves.STRENGTH_SAP ],
|
||||
[Species.SILICOBRA]: [ Moves.SHORE_UP, Moves.SHED_TAIL, Moves.STONE_EDGE, Moves.PRECIPICE_BLADES ],
|
||||
[Species.CRAMORANT]: [ Moves.APPLE_ACID, Moves.SURF, Moves.SCORCHING_SANDS, Moves.ROOST ],
|
||||
[Species.CRAMORANT]: [ Moves.APPLE_ACID, Moves.SURF, Moves.SCORCHING_SANDS, Moves.OBLIVION_WING ],
|
||||
[Species.ARROKUDA]: [ Moves.THUNDER_FANG, Moves.KNOCK_OFF, Moves.ICE_FANG, Moves.FILLET_AWAY ],
|
||||
[Species.TOXEL]: [ Moves.NASTY_PLOT, Moves.BANEFUL_BUNKER, Moves.SPARKLING_ARIA, Moves.TORCH_SONG ],
|
||||
[Species.SIZZLIPEDE]: [ Moves.BURNING_BULWARK, Moves.ZING_ZAP, Moves.FIRST_IMPRESSION, Moves.VICTORY_DANCE ],
|
||||
@ -461,8 +461,8 @@ export const speciesEggMoves = {
|
||||
[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.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.DREEPY]: [ Moves.DRAGON_ENERGY, Moves.SHED_TAIL, Moves.BLAZING_TORQUE, Moves.SPECTRAL_THIEF ],
|
||||
[Species.DURALUDON]: [ Moves.ICE_BEAM, Moves.BODY_PRESS, Moves.RECOVER, Moves.CORE_ENFORCER ],
|
||||
[Species.DREEPY]: [ Moves.DRAGON_ENERGY, Moves.SPIRIT_BREAK, Moves.BLAZING_TORQUE, Moves.SPECTRAL_THIEF ],
|
||||
[Species.ZACIAN]: [ Moves.MAGICAL_TORQUE, Moves.BITTER_BLADE, Moves.LEAF_BLADE, Moves.VICTORY_DANCE ],
|
||||
[Species.ZAMAZENTA]: [ Moves.PSYSHIELD_BASH, Moves.BODY_PRESS, Moves.SLACK_OFF, Moves.VICTORY_DANCE ],
|
||||
[Species.KUBFU]: [ Moves.METEOR_MASH, Moves.DRAIN_PUNCH, Moves.JET_PUNCH, Moves.DRAGON_DANCE ],
|
||||
@ -471,11 +471,11 @@ export const speciesEggMoves = {
|
||||
[Species.REGIDRAGO]: [ Moves.METEOR_MASH, Moves.FLAMETHROWER, Moves.CALM_MIND, Moves.DRAGON_DARTS ],
|
||||
[Species.GLASTRIER]: [ Moves.TRICK_ROOM, Moves.SLACK_OFF, Moves.HIGH_HORSEPOWER, Moves.GLACIAL_LANCE ],
|
||||
[Species.SPECTRIER]: [ Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ],
|
||||
[Species.CALYREX]: [ Moves.SAPPY_SEED, Moves.RECOVER, Moves.AURA_SPHERE, Moves.PHOTON_GEYSER ],
|
||||
[Species.CALYREX]: [ Moves.SAPPY_SEED, Moves.RECOVER, Moves.SECRET_SWORD, Moves.PHOTON_GEYSER ],
|
||||
[Species.ENAMORUS]: [ Moves.FLEUR_CANNON, Moves.TAKE_HEART, Moves.STORED_POWER, Moves.OBLIVION_WING ],
|
||||
[Species.SPRIGATITO]: [ Moves.BLAZE_KICK, Moves.STRENGTH_SAP, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ],
|
||||
[Species.FUECOCO]: [ Moves.COSMIC_POWER, Moves.SLACK_OFF, Moves.INFERNAL_PARADE, Moves.MOONGEIST_BEAM ],
|
||||
[Species.QUAXLY]: [ Moves.DRAGON_DANCE, Moves.ROOST, Moves.TROP_KICK, Moves.THUNDEROUS_KICK ],
|
||||
[Species.SPRIGATITO]: [ Moves.FIRE_LASH, Moves.TRIPLE_AXEL, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ],
|
||||
[Species.FUECOCO]: [ Moves.ALLURING_VOICE, Moves.SLACK_OFF, Moves.OVERDRIVE, Moves.MOONGEIST_BEAM ],
|
||||
[Species.QUAXLY]: [ Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.TROP_KICK, Moves.THUNDEROUS_KICK ],
|
||||
[Species.LECHONK]: [ Moves.MILK_DRINK, Moves.BLAZING_TORQUE, Moves.FILLET_AWAY, Moves.MULTI_ATTACK ],
|
||||
[Species.TAROUNTULA]: [ Moves.STONE_AXE, Moves.LEECH_LIFE, Moves.THIEF, Moves.SPORE ],
|
||||
[Species.NYMBLE]: [ Moves.CEASELESS_EDGE, Moves.FELL_STINGER, Moves.LEECH_LIFE, Moves.WICKED_BLOW ],
|
||||
@ -485,13 +485,13 @@ export const speciesEggMoves = {
|
||||
[Species.SMOLIV]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.CALM_MIND, Moves.BOOMBURST ],
|
||||
[Species.SQUAWKABILLY]: [ Moves.PARTING_SHOT, Moves.BULK_UP, Moves.FLARE_BLITZ, Moves.HEAD_CHARGE ],
|
||||
[Species.NACLI]: [ Moves.BODY_PRESS, Moves.SPIKES, Moves.CURSE, Moves.DIAMOND_STORM ],
|
||||
[Species.CHARCADET]: [ Moves.SACRED_SWORD, Moves.PHOTON_GEYSER, Moves.RECOVER, Moves.SPECTRAL_THIEF ],
|
||||
[Species.CHARCADET]: [ Moves.SACRED_SWORD, Moves.PHOTON_GEYSER, Moves.MOONBLAST, Moves.SPECTRAL_THIEF ],
|
||||
[Species.TADBULB]: [ Moves.PARABOLIC_CHARGE, Moves.SCALD, Moves.EARTH_POWER, Moves.ELECTRO_SHOT ],
|
||||
[Species.WATTREL]: [ Moves.NASTY_PLOT, Moves.TAILWIND, Moves.HEAT_WAVE, Moves.AEROBLAST ],
|
||||
[Species.MASCHIFF]: [ Moves.PARTING_SHOT, Moves.KNOCK_OFF, Moves.NUZZLE, Moves.COLLISION_COURSE ],
|
||||
[Species.SHROODLE]: [ Moves.FIRE_LASH, Moves.PARTING_SHOT, Moves.TOXIC, Moves.TOPSY_TURVY ],
|
||||
[Species.BRAMBLIN]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.CEASELESS_EDGE, Moves.LAST_RESPECTS ],
|
||||
[Species.TOEDSCOOL]: [ Moves.STRENGTH_SAP, Moves.HEART_SWAP, Moves.PARTING_SHOT, Moves.SAPPY_SEED ],
|
||||
[Species.TOEDSCOOL]: [ Moves.STRENGTH_SAP, Moves.TOPSY_TURVY, Moves.PARTING_SHOT, Moves.SAPPY_SEED ],
|
||||
[Species.KLAWF]: [ Moves.CRABHAMMER, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE, Moves.SHELL_SMASH ],
|
||||
[Species.CAPSAKID]: [ Moves.STRENGTH_SAP, Moves.APPLE_ACID, Moves.FROST_BREATH, Moves.TORCH_SONG ],
|
||||
[Species.RELLOR]: [ Moves.TOXIC_SPIKES, Moves.RECOVER, Moves.HEAT_WAVE, Moves.LUMINA_CRASH ],
|
||||
@ -499,7 +499,7 @@ export const speciesEggMoves = {
|
||||
[Species.TINKATINK]: [ Moves.NUZZLE, Moves.SHIFT_GEAR, Moves.ICE_HAMMER, Moves.PYRO_BALL ],
|
||||
[Species.WIGLETT]: [ Moves.SHELL_SMASH, Moves.ICICLE_CRASH, Moves.SEED_BOMB, Moves.SURGING_STRIKES ],
|
||||
[Species.BOMBIRDIER]: [ Moves.U_TURN, Moves.TIDY_UP, Moves.SUCKER_PUNCH, Moves.MIGHTY_CLEAVE ],
|
||||
[Species.FINIZEN]: [ Moves.TRIPLE_AXEL, Moves.DRAIN_PUNCH, Moves.RECOVER, Moves.WOOD_HAMMER ],
|
||||
[Species.FINIZEN]: [ Moves.TRIPLE_AXEL, Moves.DRAIN_PUNCH, Moves.HEADLONG_RUSH, Moves.SURGING_STRIKES ],
|
||||
[Species.VAROOM]: [ Moves.COMBAT_TORQUE, Moves.U_TURN, Moves.BLAZING_TORQUE, Moves.NOXIOUS_TORQUE ],
|
||||
[Species.CYCLIZAR]: [ Moves.BATON_PASS, Moves.BLAZING_TORQUE, Moves.HEAD_CHARGE, Moves.CLANGOROUS_SOUL ],
|
||||
[Species.ORTHWORM]: [ Moves.GLARE, Moves.COIL, Moves.BODY_PRESS, Moves.SHORE_UP ],
|
||||
@ -518,24 +518,24 @@ export const speciesEggMoves = {
|
||||
[Species.SANDY_SHOCKS]: [ Moves.SHORE_UP, Moves.ICE_BEAM, Moves.NASTY_PLOT, Moves.THUNDERCLAP ],
|
||||
[Species.IRON_TREADS]: [ Moves.SUPERCELL_SLAM, Moves.BULK_UP, Moves.SHORE_UP, Moves.DOUBLE_IRON_BASH ],
|
||||
[Species.IRON_BUNDLE]: [ Moves.EARTH_POWER, Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.WATER_SPOUT ],
|
||||
[Species.IRON_HANDS]: [ Moves.DRAIN_PUNCH, Moves.CURSE, Moves.PLASMA_FISTS, Moves.RECOVER ],
|
||||
[Species.IRON_HANDS]: [ Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS, Moves.ICE_HAMMER ],
|
||||
[Species.IRON_JUGULIS]: [ Moves.FIERY_WRATH, Moves.ROOST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ],
|
||||
[Species.IRON_MOTH]: [ Moves.EARTH_POWER, Moves.SEARING_SHOT, Moves.QUIVER_DANCE, Moves.MALIGNANT_CHAIN ],
|
||||
[Species.IRON_THORNS]: [ Moves.MIGHTY_CLEAVE, Moves.SHORE_UP, Moves.SHIFT_GEAR, Moves.FUSION_BOLT ],
|
||||
[Species.FRIGIBAX]: [ Moves.DRAGON_DARTS, Moves.BULK_UP, Moves.SHORE_UP, Moves.GLACIAL_LANCE ],
|
||||
[Species.GIMMIGHOUL]: [ Moves.COSMIC_POWER, Moves.STORED_POWER, Moves.BATON_PASS, Moves.ASTRAL_BARRAGE ],
|
||||
[Species.WO_CHIEN]: [ Moves.SPORE, Moves.RAGE_POWDER, Moves.SAPPY_SEED, Moves.RECOVER ],
|
||||
[Species.WO_CHIEN]: [ Moves.SPORE, Moves.RAGE_POWDER, Moves.SAPPY_SEED, Moves.STRENGTH_SAP ],
|
||||
[Species.CHIEN_PAO]: [ Moves.KNOCK_OFF, Moves.PARTING_SHOT, Moves.BITTER_BLADE, Moves.GLACIAL_LANCE ],
|
||||
[Species.TING_LU]: [ Moves.SHORE_UP, Moves.CURSE, Moves.SAPPY_SEED, Moves.THOUSAND_ARROWS ],
|
||||
[Species.CHI_YU]: [ Moves.FIERY_WRATH, Moves.HYDRO_STEAM, Moves.TORCH_SONG, Moves.ERUPTION ],
|
||||
[Species.ROARING_MOON]: [ Moves.FIRE_LASH, Moves.DRAGON_HAMMER, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ],
|
||||
[Species.IRON_VALIANT]: [ Moves.PLASMA_FISTS, Moves.VICTORY_DANCE, Moves.QUIVER_DANCE, Moves.MAGICAL_TORQUE ],
|
||||
[Species.KORAIDON]: [ Moves.SACRED_FIRE, Moves.RECOVER, Moves.GLAIVE_RUSH, Moves.CLANGOROUS_SOUL ],
|
||||
[Species.MIRAIDON]: [ Moves.ICE_BEAM, Moves.RECOVER, Moves.RISING_VOLTAGE, Moves.DRAGON_ENERGY ],
|
||||
[Species.KORAIDON]: [ Moves.BITTER_BLADE, Moves.MORNING_SUN, Moves.GLAIVE_RUSH, Moves.CLANGOROUS_SOUL ],
|
||||
[Species.MIRAIDON]: [ Moves.ICE_BEAM, Moves.CLANGOROUS_SOUL, Moves.RISING_VOLTAGE, Moves.DRAGON_ENERGY ],
|
||||
[Species.WALKING_WAKE]: [ Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.DRAGON_ENERGY ],
|
||||
[Species.IRON_LEAVES]: [ Moves.SPORE, Moves.U_TURN, Moves.MIGHTY_CLEAVE, Moves.BITTER_BLADE ],
|
||||
[Species.POLTCHAGEIST]: [ Moves.COSMIC_POWER, Moves.INFERNAL_PARADE, Moves.LEECH_SEED, Moves.SPARKLY_SWIRL ],
|
||||
[Species.OKIDOGI]: [ Moves.MORNING_SUN, Moves.OBSTRUCT, Moves.DIRE_CLAW, Moves.COLLISION_COURSE ],
|
||||
[Species.OKIDOGI]: [ Moves.SLACK_OFF, Moves.OBSTRUCT, Moves.DIRE_CLAW, Moves.COLLISION_COURSE ],
|
||||
[Species.MUNKIDORI]: [ Moves.PSYSTRIKE, Moves.HEAT_WAVE, Moves.EARTH_POWER, Moves.MALIGNANT_CHAIN ],
|
||||
[Species.FEZANDIPITI]: [ Moves.BATON_PASS, Moves.COSMIC_POWER, Moves.SIZZLY_SLIDE, Moves.MALIGNANT_CHAIN ],
|
||||
[Species.OGERPON]: [ Moves.FLOWER_TRICK, Moves.BONEMERANG, Moves.TRIPLE_AXEL, Moves.GIGATON_HAMMER ],
|
||||
|
164
src/data/move.ts
@ -12,7 +12,7 @@ import * as Utils from "../utils";
|
||||
import { WeatherType } from "./weather";
|
||||
import { ArenaTagSide, ArenaTrapTag } from "./arena-tag";
|
||||
import { ArenaTagType } from "./enums/arena-tag-type";
|
||||
import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, NoTransformAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr } from "./ability";
|
||||
import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, NoTransformAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr } from "./ability";
|
||||
import { Abilities } from "./enums/abilities";
|
||||
import { allAbilities } from './ability';
|
||||
import { PokemonHeldItemModifier } from "../modifier/modifier";
|
||||
@ -326,6 +326,15 @@ export default class Move implements Localizable {
|
||||
return true;
|
||||
}
|
||||
|
||||
getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null {
|
||||
for (let attr of this.attrs) {
|
||||
let failedText = attr.getFailedText(user, target, move, cancelled);
|
||||
if (failedText !== null)
|
||||
return failedText;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
|
||||
let score = 0;
|
||||
|
||||
@ -358,7 +367,7 @@ export class AttackMove extends Move {
|
||||
|
||||
let attackScore = 0;
|
||||
|
||||
const effectiveness = target.getAttackTypeEffectiveness(this.type);
|
||||
const effectiveness = target.getAttackTypeEffectiveness(this.type, user);
|
||||
attackScore = Math.pow(effectiveness - 1, 2) * effectiveness < 1 ? -2 : 2;
|
||||
if (attackScore) {
|
||||
if (this.category === MoveCategory.PHYSICAL) {
|
||||
@ -422,6 +431,10 @@ export abstract class MoveAttr {
|
||||
return null;
|
||||
}
|
||||
|
||||
getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null {
|
||||
return null;
|
||||
}
|
||||
|
||||
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
|
||||
return 0;
|
||||
}
|
||||
@ -434,7 +447,9 @@ export abstract class MoveAttr {
|
||||
export enum MoveEffectTrigger {
|
||||
PRE_APPLY,
|
||||
POST_APPLY,
|
||||
HIT
|
||||
HIT,
|
||||
/** Triggers one time after all target effects have applied */
|
||||
POST_TARGET,
|
||||
}
|
||||
|
||||
export class MoveEffectAttr extends MoveAttr {
|
||||
@ -723,23 +738,37 @@ export class SacrificialAttr extends MoveEffectAttr {
|
||||
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
|
||||
if (user.isBoss())
|
||||
return -20;
|
||||
return Math.ceil(((1 - user.getHpRatio()) * 10 - 10) * (target.getAttackTypeEffectiveness(move.type) - 0.5));
|
||||
return Math.ceil(((1 - user.getHpRatio()) * 10 - 10) * (target.getAttackTypeEffectiveness(move.type, user) - 0.5));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribute used for moves which cut the user's Max HP in half.
|
||||
* Triggers using POST_TARGET.
|
||||
*/
|
||||
export class HalfSacrificialAttr extends MoveEffectAttr {
|
||||
constructor() {
|
||||
super(true, MoveEffectTrigger.PRE_APPLY);
|
||||
super(true, MoveEffectTrigger.POST_TARGET);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cut's the user's Max HP in half and displays the appropriate recoil message
|
||||
* @param user Pokemon that used the move
|
||||
* @param target N/A
|
||||
* @param move Move with this attribute
|
||||
* @param args N/A
|
||||
* @returns true if the function succeeds
|
||||
*/
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
if (!super.apply(user, target, move, args))
|
||||
return false;
|
||||
|
||||
const cancelled = new Utils.BooleanHolder(false);
|
||||
// Check to see if the Pokemon has an ability that blocks non-direct damage
|
||||
applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled);
|
||||
if (!cancelled.value){
|
||||
user.damageAndUpdate(Math.ceil(user.getMaxHp()/2), HitResult.OTHER, false, true, true);
|
||||
user.scene.queueMessage(getPokemonMessage(user, ' cut its own HP to power up its move!')); // Queue recoil message
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -747,7 +776,7 @@ export class HalfSacrificialAttr extends MoveEffectAttr {
|
||||
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
|
||||
if (user.isBoss())
|
||||
return -10;
|
||||
return Math.ceil(((1 - user.getHpRatio()/2) * 10 - 10) * (target.getAttackTypeEffectiveness(move.type) - 0.5));
|
||||
return Math.ceil(((1 - user.getHpRatio()/2) * 10 - 10) * (target.getAttackTypeEffectiveness(move.type, user) - 0.5));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1452,8 +1481,8 @@ export class StatChangeAttr extends MoveEffectAttr {
|
||||
private condition: MoveConditionFunc;
|
||||
private showMessage: boolean;
|
||||
|
||||
constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, condition?: MoveConditionFunc, showMessage: boolean = true, firstHitOnly: boolean = false) {
|
||||
super(selfTarget, MoveEffectTrigger.HIT, firstHitOnly);
|
||||
constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, condition?: MoveConditionFunc, showMessage: boolean = true, firstHitOnly: boolean = false, moveEffectTrigger: MoveEffectTrigger = MoveEffectTrigger.HIT) {
|
||||
super(selfTarget, moveEffectTrigger, firstHitOnly);
|
||||
this.stats = typeof(stats) === 'number'
|
||||
? [ stats as BattleStat ]
|
||||
: stats as BattleStat[];
|
||||
@ -2411,6 +2440,27 @@ export class HiddenPowerTypeAttr extends VariableMoveTypeAttr {
|
||||
}
|
||||
}
|
||||
|
||||
export class MatchUserTypeAttr extends VariableMoveTypeAttr {
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
const type = (args[0] as Utils.IntegerHolder);
|
||||
|
||||
const userTypes = user.getTypes(true);
|
||||
|
||||
if(userTypes.includes(Type.STELLAR)) { // will not change to stellar type
|
||||
const nonTeraTypes = user.getTypes();
|
||||
type.value = nonTeraTypes[0];
|
||||
return true;
|
||||
}
|
||||
else if (userTypes.length > 0) {
|
||||
type.value = userTypes[0];
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
export class VariableMoveTypeMultiplierAttr extends MoveAttr {
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
return false;
|
||||
@ -2447,7 +2497,7 @@ export class WaterSuperEffectTypeMultiplierAttr extends VariableMoveTypeMultipli
|
||||
export class FlyingTypeMultiplierAttr extends VariableMoveTypeMultiplierAttr {
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
const multiplier = args[0] as Utils.NumberHolder;
|
||||
multiplier.value *= target.getAttackTypeEffectiveness(Type.FLYING);
|
||||
multiplier.value *= target.getAttackTypeEffectiveness(Type.FLYING, user);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -2692,26 +2742,19 @@ export class AddBattlerTagAttr extends MoveEffectAttr {
|
||||
export class CurseAttr extends MoveEffectAttr {
|
||||
|
||||
apply(user: Pokemon, target: Pokemon, move:Move, args: any[]): boolean {
|
||||
// Determine the correct target based on the user's type
|
||||
if (!user.getTypes(true).includes(Type.GHOST)) {
|
||||
// For non-Ghost types, target the user itself
|
||||
target = user;
|
||||
}
|
||||
|
||||
if (user.getTypes(true).includes(Type.GHOST)) {
|
||||
if (target.getTag(BattlerTagType.CURSED)) {
|
||||
user.scene.queueMessage('But it failed!');
|
||||
return false;
|
||||
}
|
||||
let curseRecoilDamage = Math.floor(user.getMaxHp() / 2);
|
||||
let curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2));
|
||||
user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true);
|
||||
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);
|
||||
return true;
|
||||
} else {
|
||||
target = user;
|
||||
user.scene.unshiftPhase(new StatChangePhase(user.scene, user.getBattlerIndex(), this.selfTarget, [BattleStat.ATK, BattleStat.DEF], 1));
|
||||
user.scene.unshiftPhase(new StatChangePhase(user.scene, user.getBattlerIndex(), this.selfTarget, [BattleStat.SPD], -1));
|
||||
user.scene.unshiftPhase(new StatChangePhase(user.scene, user.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF], 1));
|
||||
user.scene.unshiftPhase(new StatChangePhase(user.scene, user.getBattlerIndex(), true, [BattleStat.SPD], -1));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -2918,6 +2961,42 @@ export class AddArenaTrapTagAttr extends AddArenaTagAttr {
|
||||
}
|
||||
}
|
||||
|
||||
export class RemoveArenaTrapAttr extends MoveEffectAttr {
|
||||
|
||||
private targetBothSides: boolean;
|
||||
|
||||
constructor(targetBothSides: boolean = false) {
|
||||
super(true, MoveEffectTrigger.PRE_APPLY);
|
||||
this.targetBothSides = targetBothSides;
|
||||
}
|
||||
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
|
||||
if (!super.apply(user, target, move, args))
|
||||
return false;
|
||||
|
||||
if(this.targetBothSides){
|
||||
user.scene.arena.removeTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER);
|
||||
user.scene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.PLAYER);
|
||||
user.scene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.PLAYER);
|
||||
user.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER);
|
||||
|
||||
user.scene.arena.removeTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY);
|
||||
user.scene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.ENEMY);
|
||||
user.scene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.ENEMY);
|
||||
user.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.ENEMY);
|
||||
}
|
||||
else {
|
||||
user.scene.arena.removeTagOnSide(ArenaTagType.SPIKES, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER);
|
||||
user.scene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER);
|
||||
user.scene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER);
|
||||
user.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class RemoveScreensAttr extends MoveEffectAttr {
|
||||
|
||||
private targetBothSides: boolean;
|
||||
@ -2964,11 +3043,9 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
|
||||
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
||||
return new Promise(resolve => {
|
||||
if (!this.user && target.isMax())
|
||||
return resolve(false);
|
||||
|
||||
// Check if the move category is not STATUS or if the switch out condition is not met
|
||||
if (move.category !== MoveCategory.STATUS && !this.getSwitchOutCondition()(user, target, move)) {
|
||||
if (!this.getSwitchOutCondition()(user, target, move)) {
|
||||
//Apply effects before switch out i.e. poison point, flame body, etc
|
||||
applyPostDefendAbAttrs(PostDefendContactApplyStatusEffectAbAttr, target, user, new PokemonMove(move.id), null);
|
||||
return resolve(false);
|
||||
@ -3022,7 +3099,13 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
|
||||
}
|
||||
|
||||
getCondition(): MoveConditionFunc {
|
||||
return (user, target, move) => move.category !== MoveCategory.STATUS || this.getSwitchOutCondition()(user, target, move);
|
||||
return (user, target, move) => (move.category !== MoveCategory.STATUS || this.getSwitchOutCondition()(user, target, move));
|
||||
}
|
||||
|
||||
getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null {
|
||||
const blockedByAbility = new Utils.BooleanHolder(false);
|
||||
applyAbAttrs(ForceSwitchOutImmunityAbAttr, target, blockedByAbility);
|
||||
return blockedByAbility.value ? getPokemonMessage(target, ` can't be switched out!`) : null;
|
||||
}
|
||||
|
||||
getSwitchOutCondition(): MoveConditionFunc {
|
||||
@ -3030,6 +3113,9 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
|
||||
const switchOutTarget = (this.user ? user : target);
|
||||
const player = switchOutTarget instanceof PlayerPokemon;
|
||||
|
||||
if (!this.user && move.category == MoveCategory.STATUS && (target.hasAbilityWithAttr(ForceSwitchOutImmunityAbAttr) || target.isMax()))
|
||||
return false;
|
||||
|
||||
if (!player && !user.scene.currentBattle.battleType) {
|
||||
if (this.batonPass)
|
||||
return false;
|
||||
@ -3792,6 +3878,9 @@ const failOnMaxCondition: MoveConditionFunc = (user, target, move) => !target.is
|
||||
const failIfDampCondition: MoveConditionFunc = (user, target, move) => {
|
||||
const cancelled = new Utils.BooleanHolder(false);
|
||||
user.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled));
|
||||
// Queue a message if an ability prevented usage of the move
|
||||
if (cancelled.value)
|
||||
user.scene.queueMessage(getPokemonMessage(user, ` cannot use ${move.name}!`));
|
||||
return !cancelled.value;
|
||||
}
|
||||
|
||||
@ -4385,10 +4474,8 @@ export function initMoves() {
|
||||
.condition((user, target, move) => user.status?.effect === StatusEffect.SLEEP)
|
||||
.soundBased(),
|
||||
new StatusMove(Moves.CURSE, Type.GHOST, -1, 10, -1, 0, 2)
|
||||
.attr(StatChangeAttr, BattleStat.SPD, -1, true)
|
||||
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF ], 1, true)
|
||||
.target(MoveTarget.USER)
|
||||
.partial(),
|
||||
.attr(CurseAttr)
|
||||
.ignoresProtect(true),
|
||||
new AttackMove(Moves.FLAIL, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2)
|
||||
.attr(LowHpPowerAttr),
|
||||
new StatusMove(Moves.CONVERSION_2, Type.NORMAL, -1, 30, -1, 0, 2)
|
||||
@ -4551,7 +4638,7 @@ export function initMoves() {
|
||||
BattlerTagType.SEEDED,
|
||||
BattlerTagType.INFESTATION
|
||||
], true)
|
||||
.partial(),
|
||||
.attr(RemoveArenaTrapAttr),
|
||||
new StatusMove(Moves.SWEET_SCENT, Type.NORMAL, 100, 20, -1, 0, 2)
|
||||
.attr(StatChangeAttr, BattleStat.EVA, -1)
|
||||
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||
@ -5093,7 +5180,8 @@ export function initMoves() {
|
||||
.attr(StatChangeAttr, BattleStat.EVA, -1)
|
||||
.attr(ClearWeatherAttr, WeatherType.FOG)
|
||||
.attr(ClearTerrainAttr)
|
||||
.attr(RemoveScreensAttr, true),
|
||||
.attr(RemoveScreensAttr, false)
|
||||
.attr(RemoveArenaTrapAttr, true),
|
||||
new StatusMove(Moves.TRICK_ROOM, Type.PSYCHIC, -1, 5, -1, -7, 4)
|
||||
.attr(AddArenaTagAttr, ArenaTagType.TRICK_ROOM, 5)
|
||||
.ignoresProtect()
|
||||
@ -5480,7 +5568,7 @@ export function initMoves() {
|
||||
.soundBased()
|
||||
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||
new StatusMove(Moves.PARTING_SHOT, Type.DARK, 100, 20, 100, 0, 6)
|
||||
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -1)
|
||||
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -1, false, null, true, true, MoveEffectTrigger.PRE_APPLY)
|
||||
.attr(ForceSwitchOutAttr, true, false)
|
||||
.soundBased(),
|
||||
new StatusMove(Moves.TOPSY_TURVY, Type.DARK, -1, 20, -1, 0, 6)
|
||||
@ -5766,7 +5854,7 @@ export function initMoves() {
|
||||
.unimplemented(),
|
||||
new AttackMove(Moves.REVELATION_DANCE, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7)
|
||||
.danceMove()
|
||||
.partial(),
|
||||
.attr(MatchUserTypeAttr),
|
||||
new AttackMove(Moves.CORE_ENFORCER, Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 7)
|
||||
.target(MoveTarget.ALL_NEAR_ENEMIES)
|
||||
.partial(),
|
||||
@ -5889,7 +5977,7 @@ export function initMoves() {
|
||||
new AttackMove(Moves.PIKA_PAPOW, Type.ELECTRIC, MoveCategory.SPECIAL, -1, -1, 20, -1, 0, 7)
|
||||
.attr(FriendshipPowerAttr),
|
||||
new AttackMove(Moves.BOUNCY_BUBBLE, Type.WATER, MoveCategory.SPECIAL, 60, 100, 20, -1, 0, 7)
|
||||
.attr(HitHealAttr)
|
||||
.attr(HitHealAttr, 1.0)
|
||||
.triageMove(),
|
||||
new AttackMove(Moves.BUZZY_BUZZ, Type.ELECTRIC, MoveCategory.SPECIAL, 60, 100, 20, 100, 0, 7)
|
||||
.attr(StatusEffectAttr, StatusEffect.PARALYSIS),
|
||||
@ -6152,7 +6240,8 @@ export function initMoves() {
|
||||
new AttackMove(Moves.THUNDEROUS_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 100, 0, 8)
|
||||
.attr(StatChangeAttr, BattleStat.DEF, -1),
|
||||
new AttackMove(Moves.GLACIAL_LANCE, Type.ICE, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 8)
|
||||
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||
.target(MoveTarget.ALL_NEAR_ENEMIES)
|
||||
.makesContact(false),
|
||||
new AttackMove(Moves.ASTRAL_BARRAGE, Type.GHOST, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 8)
|
||||
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||
new AttackMove(Moves.EERIE_SPELL, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 5, 100, 0, 8)
|
||||
@ -6232,7 +6321,7 @@ export function initMoves() {
|
||||
.partial(),
|
||||
new SelfStatusMove(Moves.TAKE_HEART, Type.PSYCHIC, -1, 10, -1, 0, 8)
|
||||
.attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF ], 1, true)
|
||||
.partial(),
|
||||
.attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP),
|
||||
/* Unused
|
||||
new AttackMove(Moves.G_MAX_WILDFIRE, Type.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8)
|
||||
.target(MoveTarget.ALL_NEAR_ENEMIES)
|
||||
@ -6392,6 +6481,7 @@ export function initMoves() {
|
||||
BattlerTagType.INFESTATION
|
||||
], true)
|
||||
.attr(StatusEffectAttr, StatusEffect.POISON)
|
||||
.attr(RemoveArenaTrapAttr)
|
||||
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||
new StatusMove(Moves.DOODLE, Type.NORMAL, 100, 10, -1, 0, 9)
|
||||
.attr(AbilityCopyAttr, true),
|
||||
@ -6423,9 +6513,9 @@ export function initMoves() {
|
||||
new AttackMove(Moves.RUINATION, Type.DARK, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 9)
|
||||
.attr(TargetHalfHpDamageAttr),
|
||||
new AttackMove(Moves.COLLISION_COURSE, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9)
|
||||
.attr(MovePowerMultiplierAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type) >= 2 ? 5461/4096 : 1),
|
||||
.attr(MovePowerMultiplierAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2 ? 5461/4096 : 1),
|
||||
new AttackMove(Moves.ELECTRO_DRIFT, Type.ELECTRIC, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 9)
|
||||
.attr(MovePowerMultiplierAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type) >= 2 ? 5461/4096 : 1)
|
||||
.attr(MovePowerMultiplierAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2 ? 5461/4096 : 1)
|
||||
.makesContact(),
|
||||
new SelfStatusMove(Moves.SHED_TAIL, Type.NORMAL, -1, 10, -1, 0, 9)
|
||||
.unimplemented(),
|
||||
@ -6435,7 +6525,7 @@ export function initMoves() {
|
||||
.target(MoveTarget.BOTH_SIDES),
|
||||
new SelfStatusMove(Moves.TIDY_UP, Type.NORMAL, -1, 10, 100, 0, 9)
|
||||
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPD ], 1, true)
|
||||
.partial(),
|
||||
.attr(RemoveArenaTrapAttr),
|
||||
new StatusMove(Moves.SNOWSCAPE, Type.ICE, -1, 10, -1, 0, 9)
|
||||
.attr(WeatherChangeAttr, WeatherType.SNOW)
|
||||
.target(MoveTarget.BOTH_SIDES),
|
||||
|
@ -476,7 +476,7 @@ export abstract class PokemonSpeciesForm {
|
||||
|
||||
export default class PokemonSpecies extends PokemonSpeciesForm implements Localizable {
|
||||
public name: string;
|
||||
public pseudoLegendary: boolean;
|
||||
public subLegendary: boolean;
|
||||
public legendary: boolean;
|
||||
public mythical: boolean;
|
||||
public species: string;
|
||||
@ -486,7 +486,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
|
||||
public canChangeForm: boolean;
|
||||
public forms: PokemonForm[];
|
||||
|
||||
constructor(id: Species, generation: integer, pseudoLegendary: boolean, legendary: boolean, mythical: boolean, species: string,
|
||||
constructor(id: Species, generation: integer, subLegendary: boolean, legendary: boolean, mythical: boolean, species: string,
|
||||
type1: Type, type2: Type, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities,
|
||||
baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer,
|
||||
catchRate: integer, baseFriendship: integer, baseExp: integer, growthRate: GrowthRate, malePercent: number,
|
||||
@ -496,7 +496,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
|
||||
this.speciesId = id;
|
||||
this.formIndex = 0;
|
||||
this.generation = generation;
|
||||
this.pseudoLegendary = pseudoLegendary;
|
||||
this.subLegendary = subLegendary;
|
||||
this.legendary = legendary;
|
||||
this.mythical = mythical;
|
||||
this.species = species;
|
||||
@ -712,14 +712,14 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
|
||||
getCompatibleFusionSpeciesFilter(): PokemonSpeciesFilter {
|
||||
const hasEvolution = pokemonEvolutions.hasOwnProperty(this.speciesId);
|
||||
const hasPrevolution = pokemonPrevolutions.hasOwnProperty(this.speciesId);
|
||||
const pseudoLegendary = this.pseudoLegendary;
|
||||
const pseudoLegendary = this.subLegendary;
|
||||
const legendary = this.legendary;
|
||||
const mythical = this.mythical;
|
||||
return species => {
|
||||
return (pseudoLegendary || legendary || mythical ||
|
||||
(pokemonEvolutions.hasOwnProperty(species.speciesId) === hasEvolution
|
||||
&& pokemonPrevolutions.hasOwnProperty(species.speciesId) === hasPrevolution))
|
||||
&& species.pseudoLegendary === pseudoLegendary
|
||||
&& species.subLegendary === pseudoLegendary
|
||||
&& species.legendary === legendary
|
||||
&& species.mythical === mythical
|
||||
&& (this.isTrainerForbidden() || !species.isTrainerForbidden());
|
||||
|
@ -51855,7 +51855,6 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.MABOSSTIFF,
|
||||
Species.BOMBIRDIER,
|
||||
Species.WALKING_WAKE,
|
||||
Species.PIKACHU,
|
||||
Species.ALOLA_SANDSHREW,
|
||||
Species.ALOLA_SANDSLASH,
|
||||
Species.ALOLA_DIGLETT,
|
||||
@ -60029,6 +60028,7 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.SHARPEDO,
|
||||
Species.SEVIPER,
|
||||
Species.SALAMENCE,
|
||||
Species.METAGROSS,
|
||||
Species.SHINX,
|
||||
Species.LUXIO,
|
||||
Species.LUXRAY,
|
||||
|
@ -212,7 +212,7 @@ export class TrainerConfig {
|
||||
this.battleBgm = 'battle_trainer';
|
||||
this.victoryBgm = 'victory_trainer';
|
||||
this.partyTemplates = [ trainerPartyTemplates.TWO_AVG ];
|
||||
this.speciesFilter = species => (allowLegendaries || (!species.legendary && !species.pseudoLegendary && !species.mythical)) && !species.isTrainerForbidden();
|
||||
this.speciesFilter = species => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden();
|
||||
}
|
||||
|
||||
getKey(): string {
|
||||
@ -509,7 +509,7 @@ function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSl
|
||||
|
||||
function getSpeciesFilterRandomPartyMemberFunc(speciesFilter: PokemonSpeciesFilter, trainerSlot: TrainerSlot = TrainerSlot.TRAINER, allowLegendaries?: boolean, postProcess?: (EnemyPokemon: EnemyPokemon) => void): PartyMemberFunc {
|
||||
const originalSpeciesFilter = speciesFilter;
|
||||
speciesFilter = (species: PokemonSpecies) => (allowLegendaries || (!species.legendary && !species.pseudoLegendary && !species.mythical)) && !species.isTrainerForbidden() && originalSpeciesFilter(species);
|
||||
speciesFilter = (species: PokemonSpecies) => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden() && originalSpeciesFilter(species);
|
||||
return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => {
|
||||
const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength)), level, trainerSlot, undefined, undefined, postProcess);
|
||||
return ret;
|
||||
|
@ -241,10 +241,12 @@ export class EggHatchPhase extends Phase {
|
||||
|
||||
doReveal(): void {
|
||||
const isShiny = this.pokemon.isShiny();
|
||||
if (this.pokemon.species.mythical)
|
||||
this.scene.validateAchv(achvs.HATCH_MYTHICAL);
|
||||
if (this.pokemon.species.subLegendary)
|
||||
this.scene.validateAchv(achvs.HATCH_SUB_LEGENDARY);
|
||||
if (this.pokemon.species.legendary)
|
||||
this.scene.validateAchv(achvs.HATCH_LEGENDARY);
|
||||
if (this.pokemon.species.mythical)
|
||||
this.scene.validateAchv(achvs.HATCH_MYTHICAL);
|
||||
if (isShiny)
|
||||
this.scene.validateAchv(achvs.HATCH_SHINY);
|
||||
this.eggContainer.setVisible(false);
|
||||
|
19
src/enums/buttons.ts
Normal file
@ -0,0 +1,19 @@
|
||||
export enum Button {
|
||||
UP,
|
||||
DOWN,
|
||||
LEFT,
|
||||
RIGHT,
|
||||
SUBMIT,
|
||||
ACTION,
|
||||
CANCEL,
|
||||
MENU,
|
||||
STATS,
|
||||
CYCLE_SHINY,
|
||||
CYCLE_FORM,
|
||||
CYCLE_GENDER,
|
||||
CYCLE_ABILITY,
|
||||
CYCLE_NATURE,
|
||||
CYCLE_VARIANT,
|
||||
SPEED_UP,
|
||||
SLOW_DOWN
|
||||
}
|
@ -106,7 +106,7 @@ export class Arena {
|
||||
|
||||
ret = getPokemonSpecies(species);
|
||||
|
||||
if (ret.pseudoLegendary || ret.legendary || ret.mythical) {
|
||||
if (ret.subLegendary || ret.legendary || ret.mythical) {
|
||||
switch (true) {
|
||||
case (ret.baseTotal >= 720):
|
||||
regen = level < 90;
|
||||
|
@ -19,7 +19,7 @@ import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEv
|
||||
import { reverseCompatibleTms, tmSpecies } from '../data/tms';
|
||||
import { DamagePhase, FaintPhase, LearnMovePhase, ObtainStatusEffectPhase, StatChangePhase, SwitchSummonPhase } from '../phases';
|
||||
import { BattleStat } from '../data/battle-stat';
|
||||
import { BattlerTag, BattlerTagLapseType, EncoreTag, HelpingHandTag, TypeBoostTag, getBattlerTag } from '../data/battler-tags';
|
||||
import { BattlerTag, BattlerTagLapseType, EncoreTag, HelpingHandTag, HighestStatBoostTag, TypeBoostTag, getBattlerTag } from '../data/battler-tags';
|
||||
import { BattlerTagType } from "../data/enums/battler-tag-type";
|
||||
import { Species } from '../data/enums/species';
|
||||
import { WeatherType } from '../data/weather';
|
||||
@ -27,7 +27,7 @@ import { TempBattleStat } from '../data/temp-battle-stat';
|
||||
import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from '../data/arena-tag';
|
||||
import { ArenaTagType } from "../data/enums/arena-tag-type";
|
||||
import { Biome } from "../data/enums/biome";
|
||||
import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, FieldVariableMovePowerAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, NonSuperEffectiveImmunityAbAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, VariableMoveTypeAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPostDefendAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr } from '../data/ability';
|
||||
import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, FieldVariableMovePowerAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, NonSuperEffectiveImmunityAbAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, VariableMoveTypeAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPostDefendAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr } from '../data/ability';
|
||||
import { Abilities } from "#app/data/enums/abilities";
|
||||
import PokemonData from '../system/pokemon-data';
|
||||
import Battle, { BattlerIndex } from '../battle';
|
||||
@ -43,7 +43,7 @@ import { Nature, getNatureStatMultiplier } from '../data/nature';
|
||||
import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from '../data/pokemon-forms';
|
||||
import { TerrainType } from '../data/terrain';
|
||||
import { TrainerSlot } from '../data/trainer-config';
|
||||
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 { ABILITY_OVERRIDE, MOVE_OVERRIDE, MOVE_OVERRIDE_2, OPP_ABILITY_OVERRIDE, OPP_MOVE_OVERRIDE, OPP_MOVE_OVERRIDE_2, OPP_PASSIVE_ABILITY_OVERRIDE, OPP_SHINY_OVERRIDE, OPP_VARIANT_OVERRIDE, PASSIVE_ABILITY_OVERRIDE } from '../overrides';
|
||||
import { BerryType } from '../data/berry';
|
||||
import i18next from '../plugins/i18n';
|
||||
|
||||
@ -601,6 +601,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
break;
|
||||
}
|
||||
|
||||
const highestStatBoost = this.findTag(t => t instanceof HighestStatBoostTag && (t as HighestStatBoostTag).stat === stat) as HighestStatBoostTag;
|
||||
if (highestStatBoost)
|
||||
ret *= highestStatBoost.multiplier;
|
||||
|
||||
return Math.floor(ret);
|
||||
}
|
||||
|
||||
@ -774,9 +778,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
types.splice(flyingIndex, 1);
|
||||
}
|
||||
|
||||
if (!types.length)
|
||||
if (!types.length) // become UNKNOWN if no types are present
|
||||
types.push(Type.UNKNOWN);
|
||||
|
||||
if (types.length > 1 && types.includes(Type.UNKNOWN)) { // remove UNKNOWN if other types are present
|
||||
const index = types.indexOf(Type.UNKNOWN);
|
||||
if (index !== -1) {
|
||||
types.splice(index, 1);
|
||||
}
|
||||
}
|
||||
|
||||
return types;
|
||||
}
|
||||
|
||||
@ -800,6 +811,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
}
|
||||
|
||||
getPassiveAbility(): Ability {
|
||||
if (PASSIVE_ABILITY_OVERRIDE && this.isPlayer())
|
||||
return allAbilities[PASSIVE_ABILITY_OVERRIDE];
|
||||
if (OPP_PASSIVE_ABILITY_OVERRIDE && !this.isPlayer())
|
||||
return allAbilities[OPP_PASSIVE_ABILITY_OVERRIDE];
|
||||
|
||||
let starterSpeciesId = this.species.speciesId;
|
||||
while (pokemonPrevolutions.hasOwnProperty(starterSpeciesId))
|
||||
starterSpeciesId = pokemonPrevolutions[starterSpeciesId];
|
||||
@ -807,6 +823,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
}
|
||||
|
||||
hasPassive(): boolean {
|
||||
if ((PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE && this.isPlayer()) || (OPP_PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE && !this.isPlayer()))
|
||||
return true;
|
||||
return this.passive || this.isBoss();
|
||||
}
|
||||
|
||||
@ -876,7 +894,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
|
||||
getAttackMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier {
|
||||
const typeless = !!move.getMove().getAttrs(TypelessAttr).length;
|
||||
const typeMultiplier = new Utils.NumberHolder(this.getAttackTypeEffectiveness(move.getMove().type));
|
||||
const typeMultiplier = new Utils.NumberHolder(this.getAttackTypeEffectiveness(move.getMove().type, source));
|
||||
const cancelled = new Utils.BooleanHolder(false);
|
||||
if (!typeless)
|
||||
applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier, true);
|
||||
@ -885,11 +903,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
return (!cancelled.value ? typeMultiplier.value : 0) as TypeDamageMultiplier;
|
||||
}
|
||||
|
||||
getAttackTypeEffectiveness(moveType: Type): TypeDamageMultiplier {
|
||||
getAttackTypeEffectiveness(moveType: Type, source?: Pokemon): TypeDamageMultiplier {
|
||||
if (moveType === Type.STELLAR)
|
||||
return this.isTerastallized() ? 2 : 1;
|
||||
const types = this.getTypes(true, true);
|
||||
let multiplier = getTypeDamageMultiplier(moveType, types[0]) * (types.length > 1 ? getTypeDamageMultiplier(moveType, types[1]) : 1) * (types.length > 2 ? getTypeDamageMultiplier(moveType, types[2]) : 1) as TypeDamageMultiplier;
|
||||
|
||||
const ignorableImmunities = source?.getAbility()?.getAttrs(IgnoreTypeImmunityAbAttr) || [];
|
||||
const cancelled = new Utils.BooleanHolder(false);
|
||||
|
||||
let multiplier = types.map(defType =>
|
||||
ignorableImmunities.some(attr => attr.apply(source, false, cancelled, [moveType, defType]))
|
||||
? 1
|
||||
: getTypeDamageMultiplier(moveType, defType)
|
||||
).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier;
|
||||
|
||||
// Handle strong winds lowering effectiveness of types super effective against pure flying
|
||||
if (this.scene.arena.weather?.weatherType === WeatherType.STRONG_WINDS && !this.scene.arena.weather.isEffectSuppressed(this.scene) && multiplier >= 2 && this.isOfType(Type.FLYING) && getTypeDamageMultiplier(moveType, Type.FLYING) === 2)
|
||||
multiplier /= 2;
|
||||
@ -900,12 +927,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
const types = this.getTypes(true);
|
||||
const enemyTypes = pokemon.getTypes(true, true);
|
||||
const outspeed = (this.isActive(true) ? this.getBattleStat(Stat.SPD, pokemon) : this.getStat(Stat.SPD)) <= pokemon.getBattleStat(Stat.SPD, this);
|
||||
let atkScore = pokemon.getAttackTypeEffectiveness(types[0]) * (outspeed ? 1.25 : 1);
|
||||
let defScore = 1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[0]), 0.25);
|
||||
let atkScore = pokemon.getAttackTypeEffectiveness(types[0], this) * (outspeed ? 1.25 : 1);
|
||||
let defScore = 1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[0], pokemon), 0.25);
|
||||
if (types.length > 1)
|
||||
atkScore *= pokemon.getAttackTypeEffectiveness(types[1]);
|
||||
atkScore *= pokemon.getAttackTypeEffectiveness(types[1], this);
|
||||
if (enemyTypes.length > 1)
|
||||
defScore *= (1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[1]), 0.25));
|
||||
defScore *= (1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[1], pokemon), 0.25));
|
||||
let hpDiffRatio = this.getHpRatio() + (1 - pokemon.getHpRatio());
|
||||
if (outspeed)
|
||||
hpDiffRatio = Math.min(hpDiffRatio * 1.5, 1);
|
||||
@ -1258,7 +1285,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
const cancelled = new Utils.BooleanHolder(false);
|
||||
const typeless = !!move.getAttrs(TypelessAttr).length;
|
||||
const typeMultiplier = new Utils.NumberHolder(!typeless && (moveCategory !== MoveCategory.STATUS || move.getAttrs(StatusMoveTypeImmunityAttr).find(attr => types.includes((attr as StatusMoveTypeImmunityAttr).immuneType)))
|
||||
? this.getAttackTypeEffectiveness(type)
|
||||
? this.getAttackTypeEffectiveness(type, source)
|
||||
: 1);
|
||||
applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier);
|
||||
if (typeless)
|
||||
@ -1681,18 +1708,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
});
|
||||
}
|
||||
|
||||
cry(soundConfig?: Phaser.Types.Sound.SoundConfig): AnySound {
|
||||
const cry = this.getSpeciesForm().cry(this.scene, soundConfig);
|
||||
cry(soundConfig?: Phaser.Types.Sound.SoundConfig, sceneOverride?: BattleScene): AnySound {
|
||||
const scene = sceneOverride || this.scene;
|
||||
const cry = this.getSpeciesForm().cry(scene, soundConfig);
|
||||
let duration = cry.totalDuration * 1000;
|
||||
if (this.fusionSpecies) {
|
||||
let fusionCry = this.getFusionSpeciesForm().cry(this.scene, soundConfig, true);
|
||||
let fusionCry = this.getFusionSpeciesForm().cry(scene, soundConfig, true);
|
||||
duration = Math.min(duration, fusionCry.totalDuration * 1000);
|
||||
fusionCry.destroy();
|
||||
this.scene.time.delayedCall(Utils.fixedInt(Math.ceil(duration * 0.4)), () => {
|
||||
scene.time.delayedCall(Utils.fixedInt(Math.ceil(duration * 0.4)), () => {
|
||||
try {
|
||||
SoundFade.fadeOut(this.scene, cry, Utils.fixedInt(Math.ceil(duration * 0.2)));
|
||||
fusionCry = this.getFusionSpeciesForm().cry(this.scene, Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0) }, soundConfig));
|
||||
SoundFade.fadeIn(this.scene, fusionCry, Utils.fixedInt(Math.ceil(duration * 0.2)), this.scene.masterVolume * this.scene.seVolume, 0);
|
||||
SoundFade.fadeOut(scene, cry, Utils.fixedInt(Math.ceil(duration * 0.2)));
|
||||
fusionCry = this.getFusionSpeciesForm().cry(scene, Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0) }, soundConfig));
|
||||
SoundFade.fadeIn(scene, fusionCry, Utils.fixedInt(Math.ceil(duration * 0.2)), scene.masterVolume * scene.seVolume, 0);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
@ -3106,6 +3134,7 @@ export class PokemonBattleData {
|
||||
public hitCount: integer = 0;
|
||||
public endured: boolean = false;
|
||||
public berriesEaten: BerryType[] = [];
|
||||
public abilitiesApplied: Abilities[] = [];
|
||||
}
|
||||
|
||||
export class PokemonBattleSummonData {
|
||||
@ -3168,7 +3197,7 @@ export class PokemonMove {
|
||||
isUsable(pokemon: Pokemon, ignorePp?: boolean): boolean {
|
||||
if (this.moveId && pokemon.summonData?.disabledMove === this.moveId)
|
||||
return false;
|
||||
return ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1;
|
||||
return (ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1) && !this.getMove().name.endsWith(' (N)');
|
||||
}
|
||||
|
||||
getMove(): Move {
|
||||
|
@ -121,7 +121,7 @@ export class GameMode implements GameModeConfig {
|
||||
|
||||
getOverrideSpecies(waveIndex: integer): PokemonSpecies {
|
||||
if (this.isDaily && this.isWaveFinal(waveIndex)) {
|
||||
const allFinalBossSpecies = allSpecies.filter(s => (s.pseudoLegendary || s.legendary || s.mythical)
|
||||
const allFinalBossSpecies = allSpecies.filter(s => (s.subLegendary || s.legendary || s.mythical)
|
||||
&& s.baseTotal >= 600 && s.speciesId !== Species.ETERNATUS && s.speciesId !== Species.ARCEUS);
|
||||
return Utils.randSeedItem(allFinalBossSpecies);
|
||||
}
|
||||
|
294
src/inputs-controller.ts
Normal file
@ -0,0 +1,294 @@
|
||||
import Phaser, {Time} from "phaser";
|
||||
import * as Utils from "./utils";
|
||||
import {initTouchControls} from './touch-controls';
|
||||
import pad_generic from "./configs/pad_generic";
|
||||
import pad_unlicensedSNES from "./configs/pad_unlicensedSNES";
|
||||
import pad_xbox360 from "./configs/pad_xbox360";
|
||||
import pad_dualshock from "./configs/pad_dualshock";
|
||||
import {Button} from "./enums/buttons";
|
||||
|
||||
export interface GamepadMapping {
|
||||
[key: string]: number;
|
||||
}
|
||||
|
||||
export interface GamepadConfig {
|
||||
padID: string;
|
||||
padType: string;
|
||||
gamepadMapping: GamepadMapping;
|
||||
}
|
||||
|
||||
export interface ActionGamepadMapping {
|
||||
[key: string]: Button;
|
||||
}
|
||||
|
||||
const repeatInputDelayMillis = 250;
|
||||
|
||||
export class InputsController {
|
||||
private buttonKeys: Phaser.Input.Keyboard.Key[][];
|
||||
private gamepads: Array<string> = new Array();
|
||||
private scene: Phaser.Scene;
|
||||
|
||||
// buttonLock ensures only a single movement key is firing repeated inputs
|
||||
// (i.e. by holding down a button) at a time
|
||||
private buttonLock: Button;
|
||||
private buttonLock2: Button;
|
||||
private interactions: Map<Button, Map<string, boolean>> = new Map();
|
||||
private time: Time;
|
||||
private player: Map<String, GamepadMapping> = new Map();
|
||||
|
||||
constructor(scene: Phaser.Scene) {
|
||||
this.scene = scene;
|
||||
this.time = this.scene.time;
|
||||
this.buttonKeys = [];
|
||||
|
||||
for (const b of Utils.getEnumValues(Button)) {
|
||||
this.interactions[b] = {
|
||||
pressTime: false,
|
||||
isPressed: false,
|
||||
}
|
||||
}
|
||||
// We don't want the menu key to be repeated
|
||||
delete this.interactions[Button.MENU];
|
||||
delete this.interactions[Button.STATS];
|
||||
this.init();
|
||||
}
|
||||
|
||||
init(): void {
|
||||
this.events = new Phaser.Events.EventEmitter();
|
||||
// Handle the game losing focus
|
||||
this.scene.game.events.on(Phaser.Core.Events.BLUR, () => {
|
||||
this.loseFocus()
|
||||
})
|
||||
|
||||
if (typeof this.scene.input.gamepad !== 'undefined') {
|
||||
this.scene.input.gamepad.on('connected', function (thisGamepad) {
|
||||
this.refreshGamepads();
|
||||
this.setupGamepad(thisGamepad);
|
||||
}, this);
|
||||
|
||||
// Check to see if the gamepad has already been setup by the browser
|
||||
this.scene.input.gamepad.refreshPads();
|
||||
if (this.scene.input.gamepad.total) {
|
||||
this.refreshGamepads();
|
||||
for (const thisGamepad of this.gamepads) {
|
||||
this.scene.input.gamepad.emit('connected', thisGamepad);
|
||||
}
|
||||
}
|
||||
|
||||
this.scene.input.gamepad.on('down', this.gamepadButtonDown, this);
|
||||
this.scene.input.gamepad.on('up', this.gamepadButtonUp, this);
|
||||
}
|
||||
|
||||
// Keyboard
|
||||
this.setupKeyboardControls();
|
||||
}
|
||||
|
||||
loseFocus(): void {
|
||||
this.deactivatePressedKey();
|
||||
}
|
||||
|
||||
update(): void {
|
||||
// reversed to let the cancel button have a kinda priority on the action button
|
||||
for (const b of Utils.getEnumValues(Button).reverse()) {
|
||||
if (!this.interactions.hasOwnProperty(b)) continue;
|
||||
if (this.repeatInputDurationJustPassed(b) && this.interactions[b].isPressed) {
|
||||
this.events.emit('input_down', {
|
||||
controller_type: 'repeated',
|
||||
button: b,
|
||||
});
|
||||
this.setLastProcessedMovementTime(b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setupGamepad(thisGamepad: Phaser.Input.Gamepad.Gamepad): void {
|
||||
let gamepadID = thisGamepad.id.toLowerCase();
|
||||
const mappedPad = this.mapGamepad(gamepadID);
|
||||
this.player['mapping'] = mappedPad.gamepadMapping;
|
||||
}
|
||||
|
||||
refreshGamepads(): void {
|
||||
// Sometimes, gamepads are undefined. For some reason.
|
||||
this.gamepads = this.scene.input.gamepad.gamepads.filter(function (el) {
|
||||
return el != null;
|
||||
});
|
||||
|
||||
for (const [index, thisGamepad] of this.gamepads.entries()) {
|
||||
thisGamepad.index = index; // Overwrite the gamepad index, in case we had undefined gamepads earlier
|
||||
}
|
||||
}
|
||||
|
||||
getActionGamepadMapping(): ActionGamepadMapping {
|
||||
const gamepadMapping = {};
|
||||
if (!this.player?.mapping) return gamepadMapping;
|
||||
gamepadMapping[this.player.mapping.LC_N] = Button.UP;
|
||||
gamepadMapping[this.player.mapping.LC_S] = Button.DOWN;
|
||||
gamepadMapping[this.player.mapping.LC_W] = Button.LEFT;
|
||||
gamepadMapping[this.player.mapping.LC_E] = Button.RIGHT;
|
||||
gamepadMapping[this.player.mapping.TOUCH] = Button.SUBMIT;
|
||||
gamepadMapping[this.player.mapping.RC_S] = this.scene.abSwapped ? Button.CANCEL : Button.ACTION;
|
||||
gamepadMapping[this.player.mapping.RC_E] = this.scene.abSwapped ? Button.ACTION : Button.CANCEL;
|
||||
gamepadMapping[this.player.mapping.SELECT] = Button.STATS;
|
||||
gamepadMapping[this.player.mapping.START] = Button.MENU;
|
||||
gamepadMapping[this.player.mapping.RB] = Button.CYCLE_SHINY;
|
||||
gamepadMapping[this.player.mapping.LB] = Button.CYCLE_FORM;
|
||||
gamepadMapping[this.player.mapping.LT] = Button.CYCLE_GENDER;
|
||||
gamepadMapping[this.player.mapping.RT] = Button.CYCLE_ABILITY;
|
||||
gamepadMapping[this.player.mapping.RC_W] = Button.CYCLE_NATURE;
|
||||
gamepadMapping[this.player.mapping.RC_N] = Button.CYCLE_VARIANT;
|
||||
gamepadMapping[this.player.mapping.LS] = Button.SPEED_UP;
|
||||
gamepadMapping[this.player.mapping.RS] = Button.SLOW_DOWN;
|
||||
|
||||
return gamepadMapping;
|
||||
}
|
||||
|
||||
gamepadButtonDown(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void {
|
||||
if (!this.scene.gamepadSupport) return;
|
||||
const actionMapping = this.getActionGamepadMapping();
|
||||
const buttonDown = actionMapping.hasOwnProperty(button.index) && actionMapping[button.index];
|
||||
if (buttonDown !== undefined) {
|
||||
this.events.emit('input_down', {
|
||||
controller_type: 'gamepad',
|
||||
button: buttonDown,
|
||||
});
|
||||
this.setLastProcessedMovementTime(buttonDown);
|
||||
}
|
||||
}
|
||||
|
||||
gamepadButtonUp(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void {
|
||||
if (!this.scene.gamepadSupport) return;
|
||||
const actionMapping = this.getActionGamepadMapping();
|
||||
const buttonUp = actionMapping.hasOwnProperty(button.index) && actionMapping[button.index];
|
||||
if (buttonUp !== undefined) {
|
||||
this.events.emit('input_up', {
|
||||
controller_type: 'gamepad',
|
||||
button: buttonUp,
|
||||
});
|
||||
this.delLastProcessedMovementTime(buttonUp);
|
||||
}
|
||||
}
|
||||
|
||||
setupKeyboardControls(): void {
|
||||
const keyCodes = Phaser.Input.Keyboard.KeyCodes;
|
||||
const keyConfig = {
|
||||
[Button.UP]: [keyCodes.UP, keyCodes.W],
|
||||
[Button.DOWN]: [keyCodes.DOWN, keyCodes.S],
|
||||
[Button.LEFT]: [keyCodes.LEFT, keyCodes.A],
|
||||
[Button.RIGHT]: [keyCodes.RIGHT, keyCodes.D],
|
||||
[Button.SUBMIT]: [keyCodes.ENTER],
|
||||
[Button.ACTION]: [keyCodes.SPACE, keyCodes.Z],
|
||||
[Button.CANCEL]: [keyCodes.BACKSPACE, keyCodes.X],
|
||||
[Button.MENU]: [keyCodes.ESC, keyCodes.M],
|
||||
[Button.STATS]: [keyCodes.SHIFT, keyCodes.C],
|
||||
[Button.CYCLE_SHINY]: [keyCodes.R],
|
||||
[Button.CYCLE_FORM]: [keyCodes.F],
|
||||
[Button.CYCLE_GENDER]: [keyCodes.G],
|
||||
[Button.CYCLE_ABILITY]: [keyCodes.E],
|
||||
[Button.CYCLE_NATURE]: [keyCodes.N],
|
||||
[Button.CYCLE_VARIANT]: [keyCodes.V],
|
||||
[Button.SPEED_UP]: [keyCodes.PLUS],
|
||||
[Button.SLOW_DOWN]: [keyCodes.MINUS]
|
||||
};
|
||||
const mobileKeyConfig = {};
|
||||
for (const b of Utils.getEnumValues(Button)) {
|
||||
const keys: Phaser.Input.Keyboard.Key[] = [];
|
||||
if (keyConfig.hasOwnProperty(b)) {
|
||||
for (let k of keyConfig[b])
|
||||
keys.push(this.scene.input.keyboard.addKey(k, false));
|
||||
mobileKeyConfig[Button[b]] = keys[0];
|
||||
}
|
||||
this.buttonKeys[b] = keys;
|
||||
}
|
||||
|
||||
initTouchControls(mobileKeyConfig);
|
||||
this.listenInputKeyboard();
|
||||
}
|
||||
|
||||
listenInputKeyboard(): void {
|
||||
this.buttonKeys.forEach((row, index) => {
|
||||
for (const key of row) {
|
||||
key.on('down', () => {
|
||||
this.events.emit('input_down', {
|
||||
controller_type: 'keyboard',
|
||||
button: index,
|
||||
});
|
||||
this.setLastProcessedMovementTime(index);
|
||||
});
|
||||
key.on('up', () => {
|
||||
this.events.emit('input_up', {
|
||||
controller_type: 'keyboard',
|
||||
button: index,
|
||||
});
|
||||
this.delLastProcessedMovementTime(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
mapGamepad(id: string): GamepadConfig {
|
||||
id = id.toLowerCase();
|
||||
|
||||
if (id.includes('081f') && id.includes('e401')) {
|
||||
return pad_unlicensedSNES;
|
||||
} else if (id.includes('xbox') && id.includes('360')) {
|
||||
return pad_xbox360;
|
||||
} else if (id.includes('054c')) {
|
||||
return pad_dualshock;
|
||||
}
|
||||
|
||||
return pad_generic;
|
||||
}
|
||||
|
||||
/**
|
||||
* repeatInputDurationJustPassed returns true if @param button has been held down long
|
||||
* enough to fire a repeated input. A button must claim the buttonLock before
|
||||
* firing a repeated input - this is to prevent multiple buttons from firing repeatedly.
|
||||
*/
|
||||
repeatInputDurationJustPassed(button: Button): boolean {
|
||||
if (!this.isButtonLocked(button)) return false;
|
||||
if (this.time.now - this.interactions[button].pressTime >= repeatInputDelayMillis) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
setLastProcessedMovementTime(button: Button): void {
|
||||
if (!this.interactions.hasOwnProperty(button)) return;
|
||||
this.setButtonLock(button);
|
||||
this.interactions[button].pressTime = this.time.now;
|
||||
this.interactions[button].isPressed = true;
|
||||
}
|
||||
|
||||
delLastProcessedMovementTime(button: Button): void {
|
||||
if (!this.interactions.hasOwnProperty(button)) return;
|
||||
this.releaseButtonLock(button);
|
||||
this.interactions[button].pressTime = null;
|
||||
this.interactions[button].isPressed = false;
|
||||
}
|
||||
|
||||
deactivatePressedKey(): void {
|
||||
this.releaseButtonLock(this.buttonLock);
|
||||
this.releaseButtonLock(this.buttonLock2);
|
||||
for (const b of Utils.getEnumValues(Button)) {
|
||||
if (!this.interactions.hasOwnProperty(b)) return;
|
||||
this.interactions[b].pressTime = null;
|
||||
this.interactions[b].isPressed = false;
|
||||
}
|
||||
}
|
||||
|
||||
isButtonLocked(button: Button): boolean {
|
||||
return (this.buttonLock === button || this.buttonLock2 === button);
|
||||
}
|
||||
|
||||
setButtonLock(button: Button): void {
|
||||
if (this.buttonLock === button || this.buttonLock2 === button) return;
|
||||
if (this.buttonLock === button) this.buttonLock2 = button;
|
||||
else if (this.buttonLock2 === button) this.buttonLock = button;
|
||||
else if(!!this.buttonLock) this.buttonLock2 = button;
|
||||
else this.buttonLock = button;
|
||||
}
|
||||
|
||||
releaseButtonLock(button: Button): void {
|
||||
if (this.buttonLock === button) this.buttonLock = null;
|
||||
else if (this.buttonLock2 === button) this.buttonLock2 = null;
|
||||
}
|
||||
}
|
@ -77,6 +77,7 @@ export class LoadingScene extends SceneBase {
|
||||
this.loadImage('shiny_star_small_1', 'ui', 'shiny_small_1.png');
|
||||
this.loadImage('shiny_star_small_2', 'ui', 'shiny_small_2.png');
|
||||
this.loadImage('ha_capsule', 'ui', 'ha_capsule.png');
|
||||
this.loadImage('champion_ribbon', 'ui', 'champion_ribbon.png');
|
||||
this.loadImage('icon_spliced', 'ui');
|
||||
this.loadImage('icon_tera', 'ui');
|
||||
this.loadImage('type_tera', 'ui');
|
||||
|
28
src/locales/chs/config.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import { ability } from "./ability";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
import { menu } from "./menu";
|
||||
import { menuUiHandler } from "./menu-ui-handler";
|
||||
import { move } from "./move";
|
||||
import { pokeball } from "./pokeball";
|
||||
import { pokemon } from "./pokemon";
|
||||
import { pokemonStat } from "./pokemon-stat";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { tutorial } from "./tutorial";
|
||||
|
||||
|
||||
export const chsConfig = {
|
||||
ability: ability,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
menuUiHandler: menuUiHandler,
|
||||
menu: menu,
|
||||
move: move,
|
||||
pokeball: pokeball,
|
||||
pokemonStat: pokemonStat,
|
||||
pokemon: pokemon,
|
||||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
tutorial: tutorial
|
||||
}
|
32
src/locales/chs/starter-select-ui-handler.ts
Normal file
@ -0,0 +1,32 @@
|
||||
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 starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam":'Begin with these Pokémon?',
|
||||
"growthRate": "Growth Rate:",
|
||||
"ability": "Ability:",
|
||||
"passive": "Passive:",
|
||||
"nature": "Nature:",
|
||||
"eggMoves": 'Egg Moves',
|
||||
"start": "Start",
|
||||
"addToParty": "Add to Party",
|
||||
"toggleIVs": 'Toggle IVs',
|
||||
"manageMoves": 'Manage Moves',
|
||||
"useCandies": 'Use Candies',
|
||||
"selectMoveSwapOut": "Select a move to swap out.",
|
||||
"selectMoveSwapWith": "Select a move to swap with",
|
||||
"unlockPassive": "Unlock Passive",
|
||||
"reduceCost": "Reduce Cost",
|
||||
"cycleShiny": "R: Cycle Shiny",
|
||||
"cycleForm": 'F: Cycle Form',
|
||||
"cycleGender": 'G: Cycle Gender',
|
||||
"cycleAbility": 'E: Cycle Ability',
|
||||
"cycleNature": 'N: Cycle Nature',
|
||||
"cycleVariant": 'V: Cycle Variant',
|
||||
"enablePassive": "Enable Passive",
|
||||
"disablePassive": "Disable Passive"
|
||||
}
|
28
src/locales/cht/config.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import { ability } from "./ability";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
import { menu } from "./menu";
|
||||
import { menuUiHandler } from "./menu-ui-handler";
|
||||
import { move } from "./move";
|
||||
import { pokeball } from "./pokeball";
|
||||
import { pokemon } from "./pokemon";
|
||||
import { pokemonStat } from "./pokemon-stat";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { tutorial } from "./tutorial";
|
||||
|
||||
|
||||
export const chtConfig = {
|
||||
ability: ability,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
menuUiHandler: menuUiHandler,
|
||||
menu: menu,
|
||||
move: move,
|
||||
pokeball: pokeball,
|
||||
pokemonStat: pokemonStat,
|
||||
pokemon: pokemon,
|
||||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
tutorial: tutorial
|
||||
}
|
32
src/locales/cht/starter-select-ui-handler.ts
Normal file
@ -0,0 +1,32 @@
|
||||
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 starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam":'Begin with these Pokémon?',
|
||||
"growthRate": "Growth Rate:",
|
||||
"ability": "Ability:",
|
||||
"passive": "Passive:",
|
||||
"nature": "Nature:",
|
||||
"eggMoves": 'Egg Moves',
|
||||
"start": "Start",
|
||||
"addToParty": "Add to Party",
|
||||
"toggleIVs": 'Toggle IVs',
|
||||
"manageMoves": 'Manage Moves',
|
||||
"useCandies": 'Use Candies',
|
||||
"selectMoveSwapOut": "Select a move to swap out.",
|
||||
"selectMoveSwapWith": "Select a move to swap with",
|
||||
"unlockPassive": "Unlock Passive",
|
||||
"reduceCost": "Reduce Cost",
|
||||
"cycleShiny": "R: Cycle Shiny",
|
||||
"cycleForm": 'F: Cycle Form',
|
||||
"cycleGender": 'G: Cycle Gender',
|
||||
"cycleAbility": 'E: Cycle Ability',
|
||||
"cycleNature": 'N: Cycle Nature',
|
||||
"cycleVariant": 'V: Cycle Variant',
|
||||
"enablePassive": "Enable Passive",
|
||||
"disablePassive": "Disable Passive"
|
||||
}
|
@ -33,6 +33,7 @@ export const battle: SimpleTranslationEntries = {
|
||||
"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.",
|
||||
"moveNoPP": "There's no PP left for\nthis move!",
|
||||
"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!",
|
||||
|
28
src/locales/de/config.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import { ability } from "./ability";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
import { menu } from "./menu";
|
||||
import { menuUiHandler } from "./menu-ui-handler";
|
||||
import { move } from "./move";
|
||||
import { pokeball } from "./pokeball";
|
||||
import { pokemon } from "./pokemon";
|
||||
import { pokemonStat } from "./pokemon-stat";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { tutorial } from "./tutorial";
|
||||
|
||||
|
||||
export const deConfig = {
|
||||
ability: ability,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
menuUiHandler: menuUiHandler,
|
||||
menu: menu,
|
||||
move: move,
|
||||
pokeball: pokeball,
|
||||
pokemonStat: pokemonStat,
|
||||
pokemon: pokemon,
|
||||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
tutorial: tutorial
|
||||
}
|
@ -43,5 +43,4 @@ export const menu: SimpleTranslationEntries = {
|
||||
"empty":"Empty",
|
||||
"yes":"Yes",
|
||||
"no":"No",
|
||||
"confirmStartTeam":'Begin with these Pokémon?',
|
||||
} as const;
|
32
src/locales/de/starter-select-ui-handler.ts
Normal file
@ -0,0 +1,32 @@
|
||||
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 starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam":'Begin with these Pokémon?',
|
||||
"growthRate": "Growth Rate:",
|
||||
"ability": "Ability:",
|
||||
"passive": "Passive:",
|
||||
"nature": "Nature:",
|
||||
"eggMoves": 'Egg Moves',
|
||||
"start": "Start",
|
||||
"addToParty": "Add to Party",
|
||||
"toggleIVs": 'Toggle IVs',
|
||||
"manageMoves": 'Manage Moves',
|
||||
"useCandies": 'Use Candies',
|
||||
"selectMoveSwapOut": "Select a move to swap out.",
|
||||
"selectMoveSwapWith": "Select a move to swap with",
|
||||
"unlockPassive": "Unlock Passive",
|
||||
"reduceCost": "Reduce Cost",
|
||||
"cycleShiny": "R: Cycle Shiny",
|
||||
"cycleForm": 'F: Cycle Form',
|
||||
"cycleGender": 'G: Cycle Gender',
|
||||
"cycleAbility": 'E: Cycle Ability',
|
||||
"cycleNature": 'N: Cycle Nature',
|
||||
"cycleVariant": 'V: Cycle Variant',
|
||||
"enablePassive": "Enable Passive",
|
||||
"disablePassive": "Disable Passive"
|
||||
}
|
@ -33,6 +33,7 @@ export const battle: SimpleTranslationEntries = {
|
||||
"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.",
|
||||
"moveNoPP": "There's no PP left for\nthis move!",
|
||||
"moveDisabled": "{{moveName}} is disabled!",
|
||||
"noPokeballForce": "An unseen force\nprevents using Poké Balls.",
|
||||
"noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!",
|
||||
|
28
src/locales/en/config.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import { ability } from "./ability";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
import { menu } from "./menu";
|
||||
import { menuUiHandler } from "./menu-ui-handler";
|
||||
import { move } from "./move";
|
||||
import { pokeball } from "./pokeball";
|
||||
import { pokemon } from "./pokemon";
|
||||
import { pokemonStat } from "./pokemon-stat";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { tutorial } from "./tutorial";
|
||||
|
||||
|
||||
export const enConfig = {
|
||||
ability: ability,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
menuUiHandler: menuUiHandler,
|
||||
menu: menu,
|
||||
move: move,
|
||||
pokeball: pokeball,
|
||||
pokemonStat: pokemonStat,
|
||||
pokemon: pokemon,
|
||||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
tutorial: tutorial
|
||||
}
|
@ -43,5 +43,4 @@ export const menu: SimpleTranslationEntries = {
|
||||
"empty":"Empty",
|
||||
"yes":"Yes",
|
||||
"no":"No",
|
||||
"confirmStartTeam":'Begin with these Pokémon?',
|
||||
} as const;
|
32
src/locales/en/starter-select-ui-handler.ts
Normal file
@ -0,0 +1,32 @@
|
||||
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 starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam":'Begin with these Pokémon?',
|
||||
"growthRate": "Growth Rate:",
|
||||
"ability": "Ability:",
|
||||
"passive": "Passive:",
|
||||
"nature": "Nature:",
|
||||
"eggMoves": 'Egg Moves',
|
||||
"start": "Start",
|
||||
"addToParty": "Add to Party",
|
||||
"toggleIVs": 'Toggle IVs',
|
||||
"manageMoves": 'Manage Moves',
|
||||
"useCandies": 'Use Candies',
|
||||
"selectMoveSwapOut": "Select a move to swap out.",
|
||||
"selectMoveSwapWith": "Select a move to swap with",
|
||||
"unlockPassive": "Unlock Passive",
|
||||
"reduceCost": "Reduce Cost",
|
||||
"cycleShiny": "R: Cycle Shiny",
|
||||
"cycleForm": 'F: Cycle Form',
|
||||
"cycleGender": 'G: Cycle Gender',
|
||||
"cycleAbility": 'E: Cycle Ability',
|
||||
"cycleNature": 'N: Cycle Nature',
|
||||
"cycleVariant": 'V: Cycle Variant',
|
||||
"enablePassive": "Enable Passive",
|
||||
"disablePassive": "Disable Passive"
|
||||
}
|
@ -24,7 +24,7 @@ export const battle: SimpleTranslationEntries = {
|
||||
"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}}.",
|
||||
"learnMovePrompt": "{{pokemonName}} quiere aprender\n{{moveName}}.",
|
||||
"learnMoveLimitReached": "Pero, {{pokemonName}} ya conoce\ncuatro movimientos.",
|
||||
"learnMoveReplaceQuestion": "¿Quieres sustituir uno de sus movimientos por {{moveName}}?",
|
||||
"learnMoveStopTeaching": "¿Prefieres que no aprenda\n{{moveName}}?",
|
||||
@ -33,6 +33,7 @@ export const battle: SimpleTranslationEntries = {
|
||||
"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.",
|
||||
"moveNoPP": "There's no PP left for\nthis move!",
|
||||
"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!",
|
||||
|
28
src/locales/es/config.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import { ability } from "./ability";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
import { menu } from "./menu";
|
||||
import { menuUiHandler } from "./menu-ui-handler";
|
||||
import { move } from "./move";
|
||||
import { pokeball } from "./pokeball";
|
||||
import { pokemon } from "./pokemon";
|
||||
import { pokemonStat } from "./pokemon-stat";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { tutorial } from "./tutorial";
|
||||
|
||||
|
||||
export const esConfig = {
|
||||
ability: ability,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
menuUiHandler: menuUiHandler,
|
||||
menu: menu,
|
||||
move: move,
|
||||
pokeball: pokeball,
|
||||
pokemonStat: pokemonStat,
|
||||
pokemon: pokemon,
|
||||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
tutorial: tutorial
|
||||
}
|
@ -13,6 +13,22 @@ export const menu: SimpleTranslationEntries = {
|
||||
"newGame": "Nueva partida",
|
||||
"selectGameMode": "Elige un modo de juego.",
|
||||
"logInOrCreateAccount": "Inicia sesión o crea una cuenta para empezar. ¡No se requiere correo electrónico!",
|
||||
"username": "Usuario",
|
||||
"password": "Contraseña",
|
||||
"login": "Iniciar Sesión",
|
||||
"register": "Registrarse",
|
||||
"emptyUsername": "El usuario no puede estar vacío",
|
||||
"invalidLoginUsername": "El usuario no es válido",
|
||||
"invalidRegisterUsername": "El usuario solo puede contener letras, números y guiones bajos",
|
||||
"invalidLoginPassword": "La contraseña no es válida",
|
||||
"invalidRegisterPassword": "Contraseña debe tener 6 o más caracter.",
|
||||
"usernameAlreadyUsed": "El usuario ya está en uso",
|
||||
"accountNonExistent": "El usuario no existe",
|
||||
"unmatchingPassword": "La contraseña no coincide",
|
||||
"passwordNotMatchingConfirmPassword": "Las contraseñas deben coincidir",
|
||||
"confirmPassword": "Confirmar Contra.",
|
||||
"registrationAgeWarning": "Al registrarte, confirmas tener 13 o más años de edad.",
|
||||
"backToLogin": "Volver al Login",
|
||||
"failedToLoadSaveData": "No se ha podido cargar los datos guardados. Por favor, recarga la página.\nSi el fallo continúa, por favor contacta al administrador.",
|
||||
"sessionSuccess": "Sesión cargada con éxito.",
|
||||
"failedToLoadSession": "No se ha podido cargar los datos de tu sesión.\nPuede que estén corruptos.",
|
||||
@ -27,5 +43,4 @@ export const menu: SimpleTranslationEntries = {
|
||||
"empty":"Vacío",
|
||||
"yes":"Sí",
|
||||
"no":"No",
|
||||
"confirmStartTeam":'¿Comenzar con estos Pokémon?',
|
||||
} as const;
|
@ -4,13 +4,13 @@ export const pokemonStat: SimpleTranslationEntries = {
|
||||
"HP": "PV",
|
||||
"HPshortened": "PV",
|
||||
"ATK": "Ataque",
|
||||
"ATKshortened": "Ataque",
|
||||
"ATKshortened": "Ata",
|
||||
"DEF": "Defensa",
|
||||
"DEFshortened": "Defensa",
|
||||
"DEFshortened": "Def",
|
||||
"SPATK": "At. Esp.",
|
||||
"SPATKshortened": "At. Esp.",
|
||||
"SPATKshortened": "AtEsp",
|
||||
"SPDEF": "Def. Esp.",
|
||||
"SPDEFshortened": "Def. Esp.",
|
||||
"SPDEFshortened": "DefEsp",
|
||||
"SPD": "Velocidad",
|
||||
"SPDshortened": "Veloc."
|
||||
} as const;
|
32
src/locales/es/starter-select-ui-handler.ts
Normal file
@ -0,0 +1,32 @@
|
||||
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 starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam":'¿Comenzar con estos Pokémon?',
|
||||
"growthRate": "Crecimiento:",
|
||||
"ability": "Habilid:",
|
||||
"passive": "Pasiva:",
|
||||
"nature": "Natur:",
|
||||
"eggMoves": "Mov. Huevo",
|
||||
"start": "Iniciar",
|
||||
"addToParty": "Añadir a Equipo",
|
||||
"toggleIVs": "Mostrar IVs",
|
||||
"manageMoves": "Gestionar Movs.",
|
||||
"useCandies": "Usar Caramelos",
|
||||
"selectMoveSwapOut": "Elige el movimiento que sustituir.",
|
||||
"selectMoveSwapWith": "Elige el movimiento que sustituirá a",
|
||||
"unlockPassive": "Añadir Pasiva",
|
||||
"reduceCost": "Reducir Coste",
|
||||
"cycleShiny": "R: Cambiar Shiny",
|
||||
"cycleForm": 'F: Cambiar Forma',
|
||||
"cycleGender": 'G: Cambiar Género',
|
||||
"cycleAbility": 'E: Cambiar Habilidad',
|
||||
"cycleNature": 'N: Cambiar Naturaleza',
|
||||
"cycleVariant": 'V: Cambiar Variante',
|
||||
"enablePassive": "Activar Pasiva",
|
||||
"disablePassive": "Desactivar Pasiva"
|
||||
}
|
@ -10,9 +10,9 @@ export const tutorial: SimpleTranslationEntries = {
|
||||
$ajustes de tu navegador.`,
|
||||
|
||||
"accessMenu": `Para acceder al menú, pulsa M o Escape cuando\ntengas el control.
|
||||
$El menú contiene la configuración y otras funciones.`,
|
||||
$El menú contiene los ajustes y otras funciones.`,
|
||||
|
||||
"menu": `Desde este menú podrás acceder a la configuración.
|
||||
"menu": `Desde este menú podrás acceder a los ajustes.
|
||||
$Podrás cambiar la velocidad del juego, el estilo de la ventana y demás.
|
||||
$Hay más opciones, ¡así que pruébalas todas!`,
|
||||
|
||||
|
@ -33,6 +33,7 @@ export const battle: SimpleTranslationEntries = {
|
||||
"learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.",
|
||||
"levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
|
||||
"moveNotImplemented": "{{moveName}} n’est pas encore implémenté et ne peut pas être sélectionné.",
|
||||
"moveNoPP": "Il n’y a plus de PP pour\ncette capacité !",
|
||||
"moveDisabled": "{{moveName}} est sous entrave !",
|
||||
"noPokeballForce": "Une force mystérieuse\nempêche l’utilisation des Poké Balls.",
|
||||
"noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, c’est mal !",
|
||||
|
28
src/locales/fr/config.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import { ability } from "./ability";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
import { menu } from "./menu";
|
||||
import { menuUiHandler } from "./menu-ui-handler";
|
||||
import { move } from "./move";
|
||||
import { pokeball } from "./pokeball";
|
||||
import { pokemon } from "./pokemon";
|
||||
import { pokemonStat } from "./pokemon-stat";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { tutorial } from "./tutorial";
|
||||
|
||||
|
||||
export const frConfig = {
|
||||
ability: ability,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
menuUiHandler: menuUiHandler,
|
||||
menu: menu,
|
||||
move: move,
|
||||
pokeball: pokeball,
|
||||
pokemonStat: pokemonStat,
|
||||
pokemon: pokemon,
|
||||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
tutorial: tutorial
|
||||
}
|
@ -38,5 +38,4 @@ export const menu: SimpleTranslationEntries = {
|
||||
"empty":"Vide",
|
||||
"yes":"Oui",
|
||||
"no":"Non",
|
||||
"confirmStartTeam":'Commencer avec ces Pokémon ?',
|
||||
} as const;
|
||||
|
32
src/locales/fr/starter-select-ui-handler.ts
Normal file
@ -0,0 +1,32 @@
|
||||
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 starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam":'Commencer avec ces Pokémon ?',
|
||||
"growthRate": "Croissance :",
|
||||
"ability": "Talent :",
|
||||
"passive": "Passif :",
|
||||
"nature": "Nature :",
|
||||
"eggMoves": "Capacités Œuf",
|
||||
"start": "Lancer",
|
||||
"addToParty": "Ajouter à l’équipe",
|
||||
"toggleIVs": "Voir IVs",
|
||||
"manageMoves": "Gérer Capacités",
|
||||
"useCandies": "Utiliser Bonbons",
|
||||
"selectMoveSwapOut": "Sélectionnez la capacité à échanger.",
|
||||
"selectMoveSwapWith": "Sélectionnez laquelle échanger avec",
|
||||
"unlockPassive": "Débloquer Passif",
|
||||
"reduceCost": "Diminuer le cout",
|
||||
"cycleShiny": "R: » Chromatiques",
|
||||
"cycleForm": "F: » Formes",
|
||||
"cycleGender": "G: » Sexes",
|
||||
"cycleAbility": "E: » Talents",
|
||||
"cycleNature": "N: » Natures",
|
||||
"cycleVariant": "V: » Variants",
|
||||
"enablePassive": "Activer Passif",
|
||||
"disablePassive": "Désactiver Passif"
|
||||
}
|
@ -11,20 +11,20 @@ export const battle: SimpleTranslationEntries = {
|
||||
"trainerGo": "{{trainerName}} manda in campo {{pokemonName}}!",
|
||||
"switchQuestion": "Vuoi cambiare\n{{pokemonName}}?",
|
||||
"trainerDefeated": `Hai sconfitto\n{{trainerName}}!`,
|
||||
"pokemonCaught": "{{pokemonName}} è stato catturato!",
|
||||
"pokemonCaught": "Preso! {{pokemonName}} è stato catturato!",
|
||||
"pokemon": "Pokémon",
|
||||
"sendOutPokemon": "Vai! {{pokemonName}}!",
|
||||
"hitResultCriticalHit": "Brutto colpo!",
|
||||
"hitResultSuperEffective": "È superefficace!",
|
||||
"hitResultNotVeryEffective": "Non è molto efficace…",
|
||||
"hitResultNoEffect": "Non ha effetto su {{pokemonName}}!",
|
||||
"hitResultOneHitKO": "È KO con un colpo solo!",
|
||||
"hitResultOneHitKO": "KO con un colpo!",
|
||||
"attackFailed": "Ma ha fallito!",
|
||||
"attackHitsCount": `Colpito {{count}} volta/e!`,
|
||||
"expGain": "{{pokemonName}} ha guadagnato\n{{exp}} Punti Esperienza!",
|
||||
"levelUp": "{{pokemonName}} è salito al \nLivello {{level}}!",
|
||||
"levelUp": "{{pokemonName}} è salito al \nlivello {{level}}!",
|
||||
"learnMove": "{{pokemonName}} impara \n{{moveName}}!",
|
||||
"learnMovePrompt": "{{pokemonName}} vorrebbe imparare \l{{moveName}}.",
|
||||
"learnMovePrompt": "{{pokemonName}} vorrebbe imparare\n{{moveName}}.",
|
||||
"learnMoveLimitReached": "Tuttavia, {{pokemonName}} \nconosce già quattro mosse.",
|
||||
"learnMoveReplaceQuestion": "Vuoi che ne dimentichi una e al suo \nposto la sostituisca con {{moveName}}?",
|
||||
"learnMoveStopTeaching": "Vuoi smettere di fargli imparare \n{{moveName}}?",
|
||||
@ -33,15 +33,16 @@ export const battle: SimpleTranslationEntries = {
|
||||
"learnMoveForgetSuccess": "{{pokemonName}} ha dimenticato la mossa\n{{moveName}}.",
|
||||
"levelCapUp": "Il livello massimo\nè aumentato a {{levelCap}}!",
|
||||
"moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.",
|
||||
"moveNoPP": "Non ci sono PP rimanenti\nper questa mossa!",
|
||||
"moveDisabled": "{{moveName}} è disabilitata!",
|
||||
"noPokeballForce": "Una forza misteriosa\nimpedisce l'uso dell Poké Ball.",
|
||||
"noPokeballTrainer": "Non puoi catturare\nPokémon di altri allenatori!",
|
||||
"noPokeballMulti": "Puoi lanciare una Poké Ball\nquando rimane un solo Pokémon!",
|
||||
"noPokeballStrong": "Il Pokémon avversario è troppo forte per essere catturato!\nDevi prima indebolirlo!",
|
||||
"noEscapeForce": "Una forza misteriosa\nimpedisce la fuga.",
|
||||
"noEscapeTrainer": "Non puoi fuggire\nda una battaglia contro un'allenatore!",
|
||||
"noEscapeTrainer": "Non puoi sottrarti\nalla lotta con un'allenatore!",
|
||||
"noEscapePokemon": "{{moveName}} di {{pokemonName}}\npreviene la {{escapeVerb}}!",
|
||||
"runAwaySuccess": "Sei riuscito a fuggire!",
|
||||
"runAwaySuccess": "Scampato pericolo!",
|
||||
"runAwayCannotEscape": 'Non puoi fuggire!',
|
||||
"escapeVerbSwitch": "cambiando",
|
||||
"escapeVerbFlee": "fuggendo",
|
||||
|
28
src/locales/it/config.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import { ability } from "./ability";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
import { menu } from "./menu";
|
||||
import { menuUiHandler } from "./menu-ui-handler";
|
||||
import { move } from "./move";
|
||||
import { pokeball } from "./pokeball";
|
||||
import { pokemon } from "./pokemon";
|
||||
import { pokemonStat } from "./pokemon-stat";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { tutorial } from "./tutorial";
|
||||
|
||||
|
||||
export const itConfig = {
|
||||
ability: ability,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
menuUiHandler: menuUiHandler,
|
||||
menu: menu,
|
||||
move: move,
|
||||
pokeball: pokeball,
|
||||
pokemonStat: pokemonStat,
|
||||
pokemon: pokemon,
|
||||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
tutorial: tutorial
|
||||
}
|
@ -43,5 +43,4 @@ export const menu: SimpleTranslationEntries = {
|
||||
"empty":"Vuoto",
|
||||
"yes":"Si",
|
||||
"no":"No",
|
||||
"confirmStartTeam":'Vuoi iniziare con questi Pokémon?',
|
||||
} as const;
|
@ -1026,61 +1026,61 @@ export const pokemon: SimpleTranslationEntries = {
|
||||
"iron_crown": "Capoferreo",
|
||||
"terapagos": "Terapagos",
|
||||
"pecharunt": "Pecharunt",
|
||||
"alola_rattata": "Rattata di Alola",
|
||||
"alola_raticate": "Raticate di Alola",
|
||||
"alola_raichu": "Raichu di Alola",
|
||||
"alola_sandshrew": "Sandshrew di Alola",
|
||||
"alola_sandslash": "Sandslash di Alola",
|
||||
"alola_vulpix": "Vulpix di Alola",
|
||||
"alola_ninetales": "Ninetales di Alola",
|
||||
"alola_diglett": "Diglett di Alola",
|
||||
"alola_dugtrio": "Dugtrio di Alola",
|
||||
"alola_meowth": "Meowth di Alola",
|
||||
"alola_persian": "Persian di Alola",
|
||||
"alola_geodude": "Geodude di Alola",
|
||||
"alola_graveler": "Graveler di Alola",
|
||||
"alola_golem": "Golem di Alola",
|
||||
"alola_grimer": "Grimer di Alola",
|
||||
"alola_muk": "Muk di Alola",
|
||||
"alola_exeggutor": "Exeggutor di Alola",
|
||||
"alola_marowak": "Marowak di Alola",
|
||||
"alola_rattata": "Rattata",
|
||||
"alola_raticate": "Raticate",
|
||||
"alola_raichu": "Raichu",
|
||||
"alola_sandshrew": "Sandshrew",
|
||||
"alola_sandslash": "Sandslash",
|
||||
"alola_vulpix": "Vulpix",
|
||||
"alola_ninetales": "Ninetales",
|
||||
"alola_diglett": "Diglett",
|
||||
"alola_dugtrio": "Dugtrio",
|
||||
"alola_meowth": "Meowth",
|
||||
"alola_persian": "Persian",
|
||||
"alola_geodude": "Geodude",
|
||||
"alola_graveler": "Graveler",
|
||||
"alola_golem": "Golem",
|
||||
"alola_grimer": "Grimer",
|
||||
"alola_muk": "Muk",
|
||||
"alola_exeggutor": "Exeggutor",
|
||||
"alola_marowak": "Marowak",
|
||||
"eternal_floette": "Floette",
|
||||
"galar_meowth": "Meowth di Galar",
|
||||
"galar_ponyta": "Ponyta di Galar",
|
||||
"galar_rapidash": "Rapidash di Galar",
|
||||
"galar_slowpoke": "Slowpoke di Galar",
|
||||
"galar_slowbro": "Slowbro di Galar",
|
||||
"galar_farfetchd": "Farfetch'd di Galar",
|
||||
"galar_weezing": "Weezing di Galar",
|
||||
"galar_mr_mime": "Mr. Mime di Galar",
|
||||
"galar_articuno": "Articuno di Galar",
|
||||
"galar_zapdos": "Zapdos di Galar",
|
||||
"galar_moltres": "Moltres di Galar",
|
||||
"galar_slowking": "Slowking di Galar",
|
||||
"galar_corsola": "Corsola di Galar",
|
||||
"galar_zigzagoon": "Zigzagoon di Galar",
|
||||
"galar_linoone": "Linoone di Galar",
|
||||
"galar_darumaka": "Darumaka di Galar",
|
||||
"galar_darmanitan": "Darmanitan di Galar",
|
||||
"galar_yamask": "Yamask di Galar",
|
||||
"galar_stunfisk": "Stunfisk di Galar",
|
||||
"hisui_growlithe": "Growlithe di Hisui",
|
||||
"hisui_arcanine": "Arcanine di Hisui",
|
||||
"hisui_voltorb": "Voltorb di Hisui",
|
||||
"hisui_electrode": "Electrode di Hisui",
|
||||
"hisui_typhlosion": "Typhlosion di Hisui",
|
||||
"hisui_qwilfish": "Qwilfish di Hisui",
|
||||
"hisui_sneasel": "Sneasel di Hisui",
|
||||
"hisui_samurott": "Samurott di Hisui",
|
||||
"hisui_lilligant": "Lilligant di Hisui",
|
||||
"hisui_zorua": "Zorua di Hisui",
|
||||
"hisui_zoroark": "Zoroark di Hisui",
|
||||
"hisui_braviary": "Braviary di Hisui",
|
||||
"hisui_sliggoo": "Sliggoo di Hisui",
|
||||
"hisui_goodra": "Goodra di Hisui",
|
||||
"hisui_avalugg": "Avalugg di Hisui",
|
||||
"hisui_decidueye": "Decidueye di Hisui",
|
||||
"paldea_tauros": "Tauros di Paldea",
|
||||
"paldea_wooper": "Wooper di Paldea",
|
||||
"bloodmoon_ursaluna": "Ursaluna Luna Cremisi",
|
||||
"galar_meowth": "Meowth",
|
||||
"galar_ponyta": "Ponyta",
|
||||
"galar_rapidash": "Rapidash",
|
||||
"galar_slowpoke": "Slowpoke",
|
||||
"galar_slowbro": "Slowbro",
|
||||
"galar_farfetchd": "Farfetch'd",
|
||||
"galar_weezing": "Weezing",
|
||||
"galar_mr_mime": "Mr. Mime",
|
||||
"galar_articuno": "Articuno",
|
||||
"galar_zapdos": "Zapdos",
|
||||
"galar_moltres": "Moltres",
|
||||
"galar_slowking": "Slowking",
|
||||
"galar_corsola": "Corsola",
|
||||
"galar_zigzagoon": "Zigzagoon",
|
||||
"galar_linoone": "Linoone",
|
||||
"galar_darumaka": "Darumaka",
|
||||
"galar_darmanitan": "Darmanitan",
|
||||
"galar_yamask": "Yamask",
|
||||
"galar_stunfisk": "Stunfisk",
|
||||
"hisui_growlithe": "Growlithe",
|
||||
"hisui_arcanine": "Arcanine",
|
||||
"hisui_voltorb": "Voltorb",
|
||||
"hisui_electrode": "Electrode",
|
||||
"hisui_typhlosion": "Typhlosion",
|
||||
"hisui_qwilfish": "Qwilfish",
|
||||
"hisui_sneasel": "Sneasel",
|
||||
"hisui_samurott": "Samurott",
|
||||
"hisui_lilligant": "Lilligant",
|
||||
"hisui_zorua": "Zorua",
|
||||
"hisui_zoroark": "Zoroark",
|
||||
"hisui_braviary": "Braviary",
|
||||
"hisui_sliggoo": "Sliggoo",
|
||||
"hisui_goodra": "Goodra",
|
||||
"hisui_avalugg": "Avalugg",
|
||||
"hisui_decidueye": "Decidueye",
|
||||
"paldea_tauros": "Tauros",
|
||||
"paldea_wooper": "Wooper",
|
||||
"bloodmoon_ursaluna": "Ursaluna",
|
||||
} as const;
|
32
src/locales/it/starter-select-ui-handler.ts
Normal file
@ -0,0 +1,32 @@
|
||||
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 starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam":'Vuoi iniziare con questi Pokémon?',
|
||||
"growthRate": "Vel. Crescita:",
|
||||
"ability": "Abilità:",
|
||||
"passive": "Passiva:",
|
||||
"nature": "Natura:",
|
||||
"eggMoves": 'Mosse delle uova',
|
||||
"start": "Inizia",
|
||||
"addToParty": "Aggiungi al Gruppo",
|
||||
"toggleIVs": 'Vedi/Nascondi IV',
|
||||
"manageMoves": 'Gestisci Mosse',
|
||||
"useCandies": 'Usa Caramelle',
|
||||
"selectMoveSwapOut": "Seleziona una mossa da scambiare.",
|
||||
"selectMoveSwapWith": "Seleziona una mossa da scambiare con",
|
||||
"unlockPassive": "Sblocca Passiva",
|
||||
"reduceCost": "Riduci Costo",
|
||||
"cycleShiny": "R: Alterna Shiny",
|
||||
"cycleForm": 'F: Alterna Forma',
|
||||
"cycleGender": 'G: Alterna Sesso',
|
||||
"cycleAbility": 'E: Alterna Abilità',
|
||||
"cycleNature": 'N: Alterna Natura',
|
||||
"cycleVariant": 'V: Alterna Variante',
|
||||
"enablePassive": "Attiva Passiva",
|
||||
"disablePassive": "Disattiva Passiva"
|
||||
}
|
@ -144,9 +144,16 @@ class AddPokeballModifierType extends ModifierType implements Localizable {
|
||||
}
|
||||
|
||||
localize(): void {
|
||||
// TODO: Actually use i18n to localize this description.
|
||||
this.name = `${this.count}x ${getPokeballName(this.pokeballType)}`;
|
||||
this.description = `Receive ${getPokeballName(this.pokeballType)} x${this.count}\nCatch Rate: ${getPokeballCatchMultiplier(this.pokeballType) > -1 ? `${getPokeballCatchMultiplier(this.pokeballType)}x` : 'Certain'}`;
|
||||
this.description = `Receive ${getPokeballName(this.pokeballType)} x${this.count} (Inventory: {AMOUNT}) \nCatch Rate: ${getPokeballCatchMultiplier(this.pokeballType) > -1 ? `${getPokeballCatchMultiplier(this.pokeballType)}x` : 'Certain'}`;
|
||||
}
|
||||
|
||||
getDescription(scene: BattleScene): string {
|
||||
this.localize();
|
||||
return this.description.replace('{AMOUNT}', scene.pokeballCounts[this.pokeballType].toString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class AddVoucherModifierType extends ModifierType {
|
||||
@ -299,7 +306,7 @@ export class PokemonNatureChangeModifierType extends PokemonModifierType {
|
||||
protected nature: Nature;
|
||||
|
||||
constructor(nature: Nature) {
|
||||
super(`${getNatureName(nature)} Mint`, `Changes a Pokémon\'s nature to ${getNatureName(nature, true, true, true)}`, ((_type, args) => new Modifiers.PokemonNatureChangeModifier(this, (args[0] as PlayerPokemon).id, this.nature)),
|
||||
super(`${getNatureName(nature)} Mint`, `Changes a Pokémon\'s nature to ${getNatureName(nature, true, true, true)} and permanently unlocks the nature for the starter.`, ((_type, args) => new Modifiers.PokemonNatureChangeModifier(this, (args[0] as PlayerPokemon).id, this.nature)),
|
||||
((pokemon: PlayerPokemon) => {
|
||||
if (pokemon.getNature() === this.nature)
|
||||
return PartyUiHandler.NoEffectMessage;
|
||||
|
@ -8,15 +8,14 @@ import { Stat } from "../data/pokemon-stat";
|
||||
import { addTextObject, TextStyle } from "../ui/text";
|
||||
import { Type } from '../data/type';
|
||||
import { EvolutionPhase } from '../evolution-phase';
|
||||
import { FusionSpeciesFormEvolution, pokemonEvolutions } from '../data/pokemon-evolutions';
|
||||
import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from '../data/pokemon-evolutions';
|
||||
import { getPokemonMessage } from '../messages';
|
||||
import * as Utils from "../utils";
|
||||
import { TempBattleStat } from '../data/temp-battle-stat';
|
||||
import { BerryType, getBerryEffectFunc, getBerryPredicate } from '../data/berry';
|
||||
import { StatusEffect, getStatusEffectHealText } from '../data/status-effect';
|
||||
import { MoneyAchv, achvs } from '../system/achv';
|
||||
import { achvs } from '../system/achv';
|
||||
import { VoucherType } from '../system/voucher';
|
||||
import { PreventBerryUseAbAttr, applyAbAttrs } from '../data/ability';
|
||||
import { FormChangeItem, SpeciesFormChangeItemTrigger } from '../data/pokemon-forms';
|
||||
import { Nature } from '#app/data/nature';
|
||||
import { BattlerTagType } from '#app/data/enums/battler-tag-type';
|
||||
@ -1090,6 +1089,13 @@ export class PokemonNatureChangeModifier extends ConsumablePokemonModifier {
|
||||
apply(args: any[]): boolean {
|
||||
const pokemon = args[0] as Pokemon;
|
||||
pokemon.natureOverride = this.nature;
|
||||
let speciesId = pokemon.species.speciesId;
|
||||
pokemon.scene.gameData.dexData[speciesId].natureAttr |= Math.pow(2, this.nature + 1);
|
||||
|
||||
while (pokemonPrevolutions.hasOwnProperty(speciesId)) {
|
||||
speciesId = pokemonPrevolutions[speciesId];
|
||||
pokemon.scene.gameData.dexData[speciesId].natureAttr |= Math.pow(2, this.nature + 1);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|