Merge branch 'beta' into midturnab

This commit is contained in:
Dean 2025-02-15 13:20:58 -08:00 committed by GitHub
commit 298afb4c3f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
104 changed files with 18563 additions and 9405 deletions

View File

@ -164,13 +164,13 @@ input:-internal-autofill-selected {
}
/* Show cycle buttons only on STARTER_SELECT and on touch configuration panel */
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadOpenFilters,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleForm,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleShiny,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE']) #apadOpenFilters,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleForm,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleShiny,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleAbility,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleGender,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleVariant {
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleAbility,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE']) #apadCycleGender,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX']) #apadCycleVariant {
display: none;
}

2
package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "pokemon-rogue-battle",
"version": "1.5.4",
"version": "1.6.0",
"lockfileVersion": 3,
"requires": true,
"packages": {

View File

@ -1,7 +1,7 @@
{
"name": "pokemon-rogue-battle",
"private": true,
"version": "1.5.4",
"version": "1.6.0",
"type": "module",
"scripts": {
"start": "vite",

View File

@ -201,6 +201,8 @@
"6211",
"6215",
"6215",
"6215f",
"6215f",
"65-mega",
"65-mega",
"650",
@ -291,8 +293,8 @@
"666-tundra",
"667",
"667",
"668-female",
"668-female",
"668f",
"668f",
"668",
"668",
"669-blue",
@ -1333,6 +1335,8 @@
"6211b",
"6215b",
"6215b",
"6215bf",
"6215bf",
"65b-mega",
"65b-mega",
"650b",
@ -1423,8 +1427,8 @@
"666b-tundra",
"667b",
"667b",
"668b-female",
"668b-female",
"668bf",
"668bf",
"668b",
"668b",
"669b-blue",
@ -2467,6 +2471,8 @@
"6211sb",
"6215sb",
"6215sb",
"6215sbf",
"6215sbf",
"65sb-mega",
"65sb-mega",
"650sb",
@ -2559,6 +2565,8 @@
"667sb",
"668sb",
"668sb",
"668sbf",
"668sbf",
"669sb-blue",
"669sb-blue",
"669sb-orange",
@ -3604,6 +3612,8 @@
"6211s",
"6215s",
"6215s",
"6215sf",
"6215sf",
"65s-mega",
"65s-mega",
"650s",
@ -3694,8 +3704,8 @@
"666s-tundra",
"667s",
"667s",
"668s-female",
"668s-female",
"668sf",
"668sf",
"668s",
"668s",
"669s-blue",
@ -4587,6 +4597,7 @@
"475-mega_3",
"475-mega_3",
"6215",
"6215f",
"653",
"654",
"6549",
@ -4856,6 +4867,7 @@
"475b-mega_3",
"475b-mega_3",
"6215b",
"6215bf",
"653b",
"654b",
"6549b",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -1,41 +0,0 @@
{
"textures": [
{
"image": "668-female.png",
"format": "RGBA8888",
"size": {
"w": 74,
"h": 74
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 74,
"h": 72
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 74,
"h": 72
},
"frame": {
"x": 0,
"y": 0,
"w": 74,
"h": 72
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:3b22b1fc8fabd22888048f909287acba:10bec1e42fb1d39868a624d00345818d:d99ed0e84a0695b54e479aa98271aba1$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 791 B

View File

@ -1,41 +0,0 @@
{
"textures": [
{
"image": "668-female.png",
"format": "RGBA8888",
"size": {
"w": 74,
"h": 74
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 74,
"h": 72
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 74,
"h": 72
},
"frame": {
"x": 0,
"y": 0,
"w": 74,
"h": 72
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:a3f814ea1f5b062df0ecc4e7c343d89b:769178f31dc2505ae0e67b72b1319828:d99ed0e84a0695b54e479aa98271aba1$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 792 B

View File

@ -1,272 +1,659 @@
{
"textures": [
{
"image": "667.png",
"format": "RGBA8888",
"size": {
"w": 160,
"h": 160
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
},
"frame": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
},
"frame": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
},
"frame": {
"x": 0,
"y": 46,
"w": 40,
"h": 46
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
},
"frame": {
"x": 0,
"y": 92,
"w": 40,
"h": 46
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
},
"frame": {
"x": 40,
"y": 0,
"w": 40,
"h": 46
}
},
{
"filename": "0012.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
},
"frame": {
"x": 80,
"y": 0,
"w": 40,
"h": 46
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 40,
"h": 45
},
"frame": {
"x": 120,
"y": 0,
"w": 40,
"h": 45
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 40,
"h": 45
},
"frame": {
"x": 120,
"y": 0,
"w": 40,
"h": 45
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 40,
"h": 45
},
"frame": {
"x": 120,
"y": 45,
"w": 40,
"h": 45
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 40,
"h": 45
},
"frame": {
"x": 40,
"y": 90,
"w": 40,
"h": 45
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 40,
"h": 44
},
"frame": {
"x": 40,
"y": 46,
"w": 40,
"h": 44
}
},
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 40,
"h": 44
},
"frame": {
"x": 80,
"y": 46,
"w": 40,
"h": 44
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:0c78c1973ebb266716d5a3a4557bca98:3ab4a906b1847f4048e828e5410eae40:02171d511e760c8a3e1b623ad6bf93f5$"
}
{ "frames": [
{
"filename": "0001.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0002.png",
"frame": { "x": 127, "y": 48, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0003.png",
"frame": { "x": 0, "y": 50, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0004.png",
"frame": { "x": 40, "y": 50, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0005.png",
"frame": { "x": 120, "y": 96, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0006.png",
"frame": { "x": 80, "y": 96, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0007.png",
"frame": { "x": 40, "y": 96, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0008.png",
"frame": { "x": 85, "y": 49, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0009.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0010.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0011.png",
"frame": { "x": 127, "y": 48, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0012.png",
"frame": { "x": 0, "y": 50, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0013.png",
"frame": { "x": 40, "y": 50, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0014.png",
"frame": { "x": 120, "y": 96, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0015.png",
"frame": { "x": 80, "y": 96, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0016.png",
"frame": { "x": 40, "y": 96, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0017.png",
"frame": { "x": 85, "y": 49, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0018.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0019.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0020.png",
"frame": { "x": 127, "y": 48, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0021.png",
"frame": { "x": 0, "y": 50, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0022.png",
"frame": { "x": 40, "y": 50, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0023.png",
"frame": { "x": 120, "y": 96, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0024.png",
"frame": { "x": 80, "y": 96, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0025.png",
"frame": { "x": 40, "y": 96, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0026.png",
"frame": { "x": 85, "y": 49, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0027.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0028.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0029.png",
"frame": { "x": 127, "y": 48, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0030.png",
"frame": { "x": 0, "y": 50, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0031.png",
"frame": { "x": 40, "y": 50, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0032.png",
"frame": { "x": 120, "y": 96, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0033.png",
"frame": { "x": 80, "y": 96, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0034.png",
"frame": { "x": 40, "y": 96, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0035.png",
"frame": { "x": 85, "y": 49, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0036.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0037.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0038.png",
"frame": { "x": 127, "y": 48, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0039.png",
"frame": { "x": 0, "y": 50, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0040.png",
"frame": { "x": 40, "y": 50, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0041.png",
"frame": { "x": 120, "y": 96, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0042.png",
"frame": { "x": 80, "y": 96, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0043.png",
"frame": { "x": 40, "y": 96, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0044.png",
"frame": { "x": 85, "y": 49, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0045.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0046.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0047.png",
"frame": { "x": 127, "y": 48, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0048.png",
"frame": { "x": 0, "y": 50, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0049.png",
"frame": { "x": 40, "y": 50, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0050.png",
"frame": { "x": 120, "y": 96, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0051.png",
"frame": { "x": 80, "y": 96, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0052.png",
"frame": { "x": 40, "y": 96, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0053.png",
"frame": { "x": 85, "y": 49, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0054.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0055.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0056.png",
"frame": { "x": 85, "y": 0, "w": 41, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 48 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0057.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0058.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0059.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0060.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0061.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0062.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0063.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0064.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0065.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0066.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0067.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0068.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0069.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0070.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0071.png",
"frame": { "x": 85, "y": 0, "w": 41, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 48 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0072.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
}
],
"meta": {
"app": "https://www.aseprite.org/",
"version": "1.3.11-x64",
"image": "667.png",
"format": "I8",
"size": { "w": 167, "h": 141 },
"scale": "1"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -1,125 +1,659 @@
{
"textures": [
{
"image": "667.png",
"format": "RGBA8888",
"size": {
"w": 115,
"h": 115
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 39,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 39,
"h": 42
},
"frame": {
"x": 0,
"y": 0,
"w": 39,
"h": 42
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 39,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 39,
"h": 42
},
"frame": {
"x": 0,
"y": 42,
"w": 39,
"h": 42
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 39,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 39,
"h": 41
},
"frame": {
"x": 39,
"y": 0,
"w": 39,
"h": 41
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 39,
"h": 42
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 38,
"h": 42
},
"frame": {
"x": 39,
"y": 41,
"w": 38,
"h": 42
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 39,
"h": 42
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 38,
"h": 42
},
"frame": {
"x": 77,
"y": 41,
"w": 38,
"h": 42
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:0515d906bdf1ec3ad533ac13c4e701ec:195a93073ecc7446c747c2e79ae07d54:02171d511e760c8a3e1b623ad6bf93f5$"
}
}
{ "frames": [
{
"filename": "0001.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0002.png",
"frame": { "x": 127, "y": 47, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0003.png",
"frame": { "x": 85, "y": 48, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0004.png",
"frame": { "x": 40, "y": 94, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0005.png",
"frame": { "x": 79, "y": 94, "w": 38, "h": 43 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0006.png",
"frame": { "x": 118, "y": 94, "w": 38, "h": 43 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0007.png",
"frame": { "x": 40, "y": 49, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0008.png",
"frame": { "x": 0, "y": 49, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0009.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0010.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0011.png",
"frame": { "x": 127, "y": 47, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0012.png",
"frame": { "x": 85, "y": 48, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0013.png",
"frame": { "x": 40, "y": 94, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0014.png",
"frame": { "x": 79, "y": 94, "w": 38, "h": 43 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0015.png",
"frame": { "x": 118, "y": 94, "w": 38, "h": 43 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0016.png",
"frame": { "x": 40, "y": 49, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0017.png",
"frame": { "x": 0, "y": 49, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0018.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0019.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0020.png",
"frame": { "x": 127, "y": 47, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0021.png",
"frame": { "x": 85, "y": 48, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0022.png",
"frame": { "x": 40, "y": 94, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0023.png",
"frame": { "x": 79, "y": 94, "w": 38, "h": 43 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0024.png",
"frame": { "x": 118, "y": 94, "w": 38, "h": 43 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0025.png",
"frame": { "x": 40, "y": 49, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0026.png",
"frame": { "x": 0, "y": 49, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0027.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0028.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0029.png",
"frame": { "x": 127, "y": 47, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0030.png",
"frame": { "x": 85, "y": 48, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0031.png",
"frame": { "x": 40, "y": 94, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0032.png",
"frame": { "x": 79, "y": 94, "w": 38, "h": 43 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0033.png",
"frame": { "x": 118, "y": 94, "w": 38, "h": 43 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0034.png",
"frame": { "x": 40, "y": 49, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0035.png",
"frame": { "x": 0, "y": 49, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0036.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0037.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0038.png",
"frame": { "x": 127, "y": 47, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0039.png",
"frame": { "x": 85, "y": 48, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0040.png",
"frame": { "x": 40, "y": 94, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0041.png",
"frame": { "x": 79, "y": 94, "w": 38, "h": 43 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0042.png",
"frame": { "x": 118, "y": 94, "w": 38, "h": 43 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0043.png",
"frame": { "x": 40, "y": 49, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0044.png",
"frame": { "x": 0, "y": 49, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0045.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0046.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0047.png",
"frame": { "x": 127, "y": 47, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0048.png",
"frame": { "x": 85, "y": 48, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0049.png",
"frame": { "x": 40, "y": 94, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0050.png",
"frame": { "x": 79, "y": 94, "w": 38, "h": 43 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0051.png",
"frame": { "x": 118, "y": 94, "w": 38, "h": 43 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0052.png",
"frame": { "x": 40, "y": 49, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0053.png",
"frame": { "x": 0, "y": 49, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0054.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0055.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0056.png",
"frame": { "x": 85, "y": 0, "w": 41, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 1, "w": 41, "h": 47 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0057.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0058.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0059.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0060.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0061.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0062.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0063.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0064.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0065.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0066.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0067.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0068.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0069.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0070.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0071.png",
"frame": { "x": 85, "y": 0, "w": 41, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 1, "w": 41, "h": 47 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
},
{
"filename": "0072.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 },
"sourceSize": { "w": 43, "h": 48 },
"duration": 110
}
],
"meta": {
"app": "https://www.aseprite.org/",
"version": "1.3.11-x64",
"image": "667.png",
"format": "I8",
"size": { "w": 167, "h": 138 },
"scale": "1"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 914 B

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -1,146 +1,821 @@
{
"textures": [
{
"image": "668.png",
"format": "RGBA8888",
"size": {
"w": 146,
"h": 146
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 73,
"h": 61
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 73,
"h": 61
},
"frame": {
"x": 0,
"y": 0,
"w": 73,
"h": 61
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 73,
"h": 61
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 73,
"h": 61
},
"frame": {
"x": 73,
"y": 0,
"w": 73,
"h": 61
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 73,
"h": 61
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 73,
"h": 61
},
"frame": {
"x": 73,
"y": 0,
"w": 73,
"h": 61
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 73,
"h": 61
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 73,
"h": 60
},
"frame": {
"x": 0,
"y": 61,
"w": 73,
"h": 60
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 73,
"h": 61
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 73,
"h": 60
},
"frame": {
"x": 0,
"y": 61,
"w": 73,
"h": 60
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 73,
"h": 61
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 72,
"h": 59
},
"frame": {
"x": 73,
"y": 61,
"w": 72,
"h": 59
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:bc67ee0b37e5c8a13762178a52fad862:1ee199920770bc5797feb94424ff9f9a:947bf84d1af493c62e2cef45bb6c19ad$"
}
}
{ "frames": [
{
"filename": "0001.png",
"frame": { "x": 152, "y": 292, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0002.png",
"frame": { "x": 303, "y": 221, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0003.png",
"frame": { "x": 383, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0004.png",
"frame": { "x": 233, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0005.png",
"frame": { "x": 459, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0006.png",
"frame": { "x": 315, "y": 0, "w": 76, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0007.png",
"frame": { "x": 387, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0008.png",
"frame": { "x": 392, "y": 0, "w": 75, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0009.png",
"frame": { "x": 237, "y": 0, "w": 77, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0010.png",
"frame": { "x": 0, "y": 0, "w": 78, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0011.png",
"frame": { "x": 79, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0012.png",
"frame": { "x": 158, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0013.png",
"frame": { "x": 0, "y": 75, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0014.png",
"frame": { "x": 458, "y": 220, "w": 75, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0015.png",
"frame": { "x": 150, "y": 364, "w": 73, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0016.png",
"frame": { "x": 152, "y": 292, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0017.png",
"frame": { "x": 303, "y": 221, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0018.png",
"frame": { "x": 383, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0019.png",
"frame": { "x": 233, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0020.png",
"frame": { "x": 459, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0021.png",
"frame": { "x": 315, "y": 0, "w": 76, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0022.png",
"frame": { "x": 387, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0023.png",
"frame": { "x": 392, "y": 0, "w": 75, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0024.png",
"frame": { "x": 237, "y": 0, "w": 77, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0025.png",
"frame": { "x": 0, "y": 0, "w": 78, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0026.png",
"frame": { "x": 79, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0027.png",
"frame": { "x": 158, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0028.png",
"frame": { "x": 0, "y": 75, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0029.png",
"frame": { "x": 458, "y": 220, "w": 75, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0030.png",
"frame": { "x": 150, "y": 364, "w": 73, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0031.png",
"frame": { "x": 152, "y": 292, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0032.png",
"frame": { "x": 303, "y": 221, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0033.png",
"frame": { "x": 383, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0034.png",
"frame": { "x": 233, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0035.png",
"frame": { "x": 459, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0036.png",
"frame": { "x": 315, "y": 0, "w": 76, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0037.png",
"frame": { "x": 387, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0038.png",
"frame": { "x": 392, "y": 0, "w": 75, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0039.png",
"frame": { "x": 237, "y": 0, "w": 77, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0040.png",
"frame": { "x": 0, "y": 0, "w": 78, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0041.png",
"frame": { "x": 79, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0042.png",
"frame": { "x": 158, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0043.png",
"frame": { "x": 0, "y": 75, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0044.png",
"frame": { "x": 458, "y": 220, "w": 75, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0045.png",
"frame": { "x": 150, "y": 364, "w": 73, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0046.png",
"frame": { "x": 152, "y": 292, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0047.png",
"frame": { "x": 303, "y": 221, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0048.png",
"frame": { "x": 383, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0049.png",
"frame": { "x": 233, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0050.png",
"frame": { "x": 459, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0051.png",
"frame": { "x": 315, "y": 0, "w": 76, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0052.png",
"frame": { "x": 387, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0053.png",
"frame": { "x": 392, "y": 0, "w": 75, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0054.png",
"frame": { "x": 237, "y": 0, "w": 77, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0055.png",
"frame": { "x": 0, "y": 0, "w": 78, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0056.png",
"frame": { "x": 79, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0057.png",
"frame": { "x": 158, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0058.png",
"frame": { "x": 0, "y": 75, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0059.png",
"frame": { "x": 458, "y": 220, "w": 75, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0060.png",
"frame": { "x": 150, "y": 364, "w": 73, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0061.png",
"frame": { "x": 152, "y": 292, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0062.png",
"frame": { "x": 458, "y": 292, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0063.png",
"frame": { "x": 303, "y": 364, "w": 74, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 70 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0064.png",
"frame": { "x": 227, "y": 294, "w": 75, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 70 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0065.png",
"frame": { "x": 378, "y": 364, "w": 75, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 5, "w": 75, "h": 69 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0066.png",
"frame": { "x": 303, "y": 293, "w": 75, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 70 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0067.png",
"frame": { "x": 379, "y": 293, "w": 75, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 4, "w": 75, "h": 70 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0068.png",
"frame": { "x": 454, "y": 364, "w": 72, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 8, "y": 3, "w": 72, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0069.png",
"frame": { "x": 70, "y": 365, "w": 68, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 68, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0070.png",
"frame": { "x": 291, "y": 435, "w": 62, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 17, "y": 2, "w": 62, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0071.png",
"frame": { "x": 378, "y": 434, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 15, "y": 2, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0072.png",
"frame": { "x": 224, "y": 365, "w": 66, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 2, "w": 66, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0073.png",
"frame": { "x": 0, "y": 365, "w": 69, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 8, "y": 2, "w": 69, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0074.png",
"frame": { "x": 229, "y": 220, "w": 73, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 1, "w": 73, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0075.png",
"frame": { "x": 468, "y": 0, "w": 75, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 1, "w": 75, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0076.png",
"frame": { "x": 308, "y": 147, "w": 74, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 1, "w": 74, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0077.png",
"frame": { "x": 0, "y": 148, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0078.png",
"frame": { "x": 383, "y": 220, "w": 74, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 74, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0079.png",
"frame": { "x": 231, "y": 147, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0080.png",
"frame": { "x": 79, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0081.png",
"frame": { "x": 156, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0082.png",
"frame": { "x": 310, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0083.png",
"frame": { "x": 464, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0084.png",
"frame": { "x": 77, "y": 147, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0085.png",
"frame": { "x": 154, "y": 147, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0086.png",
"frame": { "x": 76, "y": 220, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0087.png",
"frame": { "x": 152, "y": 220, "w": 76, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 3, "w": 76, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0088.png",
"frame": { "x": 0, "y": 221, "w": 75, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 3, "w": 75, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0089.png",
"frame": { "x": 0, "y": 293, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0090.png",
"frame": { "x": 75, "y": 293, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
}
],
"meta": {
"app": "https://www.aseprite.org/",
"version": "1.3.11-x64",
"image": "668.png",
"format": "I8",
"size": { "w": 543, "h": 507 },
"scale": "1"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 22 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,821 @@
{ "frames": [
{
"filename": "0001.png",
"frame": { "x": 475, "y": 144, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0002.png",
"frame": { "x": 76, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0003.png",
"frame": { "x": 152, "y": 283, "w": 75, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0004.png",
"frame": { "x": 73, "y": 284, "w": 74, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0005.png",
"frame": { "x": 460, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0006.png",
"frame": { "x": 227, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0007.png",
"frame": { "x": 385, "y": 284, "w": 75, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0008.png",
"frame": { "x": 472, "y": 283, "w": 77, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0009.png",
"frame": { "x": 233, "y": 282, "w": 77, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0010.png",
"frame": { "x": 396, "y": 215, "w": 76, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0011.png",
"frame": { "x": 0, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0012.png",
"frame": { "x": 399, "y": 144, "w": 76, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0013.png",
"frame": { "x": 431, "y": 73, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0014.png",
"frame": { "x": 242, "y": 142, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0015.png",
"frame": { "x": 156, "y": 213, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0016.png",
"frame": { "x": 475, "y": 144, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0017.png",
"frame": { "x": 76, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0018.png",
"frame": { "x": 152, "y": 283, "w": 75, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0019.png",
"frame": { "x": 73, "y": 284, "w": 74, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0020.png",
"frame": { "x": 460, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0021.png",
"frame": { "x": 227, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0022.png",
"frame": { "x": 385, "y": 284, "w": 75, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0023.png",
"frame": { "x": 472, "y": 283, "w": 77, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0024.png",
"frame": { "x": 233, "y": 282, "w": 77, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0025.png",
"frame": { "x": 396, "y": 215, "w": 76, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0026.png",
"frame": { "x": 0, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0027.png",
"frame": { "x": 399, "y": 144, "w": 76, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0028.png",
"frame": { "x": 431, "y": 73, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0029.png",
"frame": { "x": 242, "y": 142, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0030.png",
"frame": { "x": 156, "y": 213, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0031.png",
"frame": { "x": 475, "y": 144, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0032.png",
"frame": { "x": 76, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0033.png",
"frame": { "x": 152, "y": 283, "w": 75, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0034.png",
"frame": { "x": 73, "y": 284, "w": 74, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0035.png",
"frame": { "x": 460, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0036.png",
"frame": { "x": 227, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0037.png",
"frame": { "x": 385, "y": 284, "w": 75, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0038.png",
"frame": { "x": 472, "y": 283, "w": 77, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0039.png",
"frame": { "x": 233, "y": 282, "w": 77, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0040.png",
"frame": { "x": 396, "y": 215, "w": 76, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0041.png",
"frame": { "x": 0, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0042.png",
"frame": { "x": 399, "y": 144, "w": 76, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0043.png",
"frame": { "x": 431, "y": 73, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0044.png",
"frame": { "x": 242, "y": 142, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0045.png",
"frame": { "x": 156, "y": 213, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0046.png",
"frame": { "x": 475, "y": 144, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0047.png",
"frame": { "x": 76, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0048.png",
"frame": { "x": 152, "y": 283, "w": 75, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0049.png",
"frame": { "x": 73, "y": 284, "w": 74, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0050.png",
"frame": { "x": 460, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0051.png",
"frame": { "x": 227, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0052.png",
"frame": { "x": 385, "y": 284, "w": 75, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0053.png",
"frame": { "x": 472, "y": 283, "w": 77, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0054.png",
"frame": { "x": 233, "y": 282, "w": 77, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0055.png",
"frame": { "x": 396, "y": 215, "w": 76, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0056.png",
"frame": { "x": 0, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0057.png",
"frame": { "x": 399, "y": 144, "w": 76, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0058.png",
"frame": { "x": 431, "y": 73, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0059.png",
"frame": { "x": 242, "y": 142, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0060.png",
"frame": { "x": 156, "y": 213, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0061.png",
"frame": { "x": 475, "y": 144, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0062.png",
"frame": { "x": 0, "y": 144, "w": 78, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0063.png",
"frame": { "x": 233, "y": 213, "w": 78, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 4, "w": 78, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0064.png",
"frame": { "x": 156, "y": 144, "w": 79, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 4, "w": 79, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0065.png",
"frame": { "x": 319, "y": 144, "w": 80, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 9, "y": 5, "w": 80, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0066.png",
"frame": { "x": 242, "y": 73, "w": 80, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 9, "y": 4, "w": 80, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0067.png",
"frame": { "x": 310, "y": 282, "w": 75, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0068.png",
"frame": { "x": 534, "y": 350, "w": 71, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 17, "y": 4, "w": 71, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0069.png",
"frame": { "x": 301, "y": 351, "w": 67, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 21, "y": 3, "w": 67, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0070.png",
"frame": { "x": 0, "y": 353, "w": 63, "h": 75 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 25, "y": 3, "w": 63, "h": 75 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0071.png",
"frame": { "x": 204, "y": 417, "w": 63, "h": 75 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 25, "y": 2, "w": 63, "h": 75 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0072.png",
"frame": { "x": 139, "y": 352, "w": 65, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 23, "y": 3, "w": 65, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0073.png",
"frame": { "x": 73, "y": 352, "w": 66, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 21, "y": 3, "w": 66, "h": 72 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0074.png",
"frame": { "x": 368, "y": 351, "w": 69, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 18, "y": 4, "w": 69, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0075.png",
"frame": { "x": 0, "y": 284, "w": 73, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 15, "y": 4, "w": 73, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0076.png",
"frame": { "x": 475, "y": 214, "w": 76, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0077.png",
"frame": { "x": 319, "y": 212, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0078.png",
"frame": { "x": 82, "y": 73, "w": 80, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 7, "y": 2, "w": 80, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0079.png",
"frame": { "x": 519, "y": 72, "w": 83, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 1, "w": 83, "h": 72 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0080.png",
"frame": { "x": 434, "y": 0, "w": 85, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 0, "w": 85, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0081.png",
"frame": { "x": 261, "y": 0, "w": 86, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 86, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0082.png",
"frame": { "x": 174, "y": 0, "w": 87, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0083.png",
"frame": { "x": 87, "y": 0, "w": 87, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0084.png",
"frame": { "x": 0, "y": 0, "w": 87, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0085.png",
"frame": { "x": 347, "y": 0, "w": 87, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 1, "w": 87, "h": 72 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0086.png",
"frame": { "x": 519, "y": 0, "w": 85, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 1, "w": 85, "h": 72 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0087.png",
"frame": { "x": 347, "y": 72, "w": 84, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 1, "w": 84, "h": 72 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0088.png",
"frame": { "x": 0, "y": 73, "w": 82, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0089.png",
"frame": { "x": 162, "y": 73, "w": 80, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0090.png",
"frame": { "x": 78, "y": 144, "w": 78, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
}
],
"meta": {
"app": "https://www.aseprite.org/",
"version": "1.3.11-x64",
"image": "668-female.png",
"format": "I8",
"size": { "w": 605, "h": 492 },
"scale": "1"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -1,146 +1,821 @@
{
"textures": [
{
"image": "668.png",
"format": "RGBA8888",
"size": {
"w": 146,
"h": 146
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 73,
"h": 61
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 73,
"h": 61
},
"frame": {
"x": 0,
"y": 0,
"w": 73,
"h": 61
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 73,
"h": 61
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 73,
"h": 61
},
"frame": {
"x": 73,
"y": 0,
"w": 73,
"h": 61
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 73,
"h": 61
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 73,
"h": 61
},
"frame": {
"x": 73,
"y": 0,
"w": 73,
"h": 61
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 73,
"h": 61
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 73,
"h": 60
},
"frame": {
"x": 0,
"y": 61,
"w": 73,
"h": 60
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 73,
"h": 61
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 73,
"h": 60
},
"frame": {
"x": 0,
"y": 61,
"w": 73,
"h": 60
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 73,
"h": 61
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 72,
"h": 59
},
"frame": {
"x": 73,
"y": 61,
"w": 72,
"h": 59
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:0e20693ecfc704a58db8c8592fcdc9cc:659468d84f3cc98068a3454a7c68f1e4:947bf84d1af493c62e2cef45bb6c19ad$"
}
}
{ "frames": [
{
"filename": "0001.png",
"frame": { "x": 152, "y": 292, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0002.png",
"frame": { "x": 303, "y": 221, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0003.png",
"frame": { "x": 383, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0004.png",
"frame": { "x": 233, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0005.png",
"frame": { "x": 459, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0006.png",
"frame": { "x": 315, "y": 0, "w": 76, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0007.png",
"frame": { "x": 387, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0008.png",
"frame": { "x": 392, "y": 0, "w": 75, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0009.png",
"frame": { "x": 237, "y": 0, "w": 77, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0010.png",
"frame": { "x": 0, "y": 0, "w": 78, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0011.png",
"frame": { "x": 79, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0012.png",
"frame": { "x": 158, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0013.png",
"frame": { "x": 0, "y": 75, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0014.png",
"frame": { "x": 458, "y": 220, "w": 75, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0015.png",
"frame": { "x": 150, "y": 364, "w": 73, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0016.png",
"frame": { "x": 152, "y": 292, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0017.png",
"frame": { "x": 303, "y": 221, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0018.png",
"frame": { "x": 383, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0019.png",
"frame": { "x": 233, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0020.png",
"frame": { "x": 459, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0021.png",
"frame": { "x": 315, "y": 0, "w": 76, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0022.png",
"frame": { "x": 387, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0023.png",
"frame": { "x": 392, "y": 0, "w": 75, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0024.png",
"frame": { "x": 237, "y": 0, "w": 77, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0025.png",
"frame": { "x": 0, "y": 0, "w": 78, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0026.png",
"frame": { "x": 79, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0027.png",
"frame": { "x": 158, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0028.png",
"frame": { "x": 0, "y": 75, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0029.png",
"frame": { "x": 458, "y": 220, "w": 75, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0030.png",
"frame": { "x": 150, "y": 364, "w": 73, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0031.png",
"frame": { "x": 152, "y": 292, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0032.png",
"frame": { "x": 303, "y": 221, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0033.png",
"frame": { "x": 383, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0034.png",
"frame": { "x": 233, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0035.png",
"frame": { "x": 459, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0036.png",
"frame": { "x": 315, "y": 0, "w": 76, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0037.png",
"frame": { "x": 387, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0038.png",
"frame": { "x": 392, "y": 0, "w": 75, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0039.png",
"frame": { "x": 237, "y": 0, "w": 77, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0040.png",
"frame": { "x": 0, "y": 0, "w": 78, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0041.png",
"frame": { "x": 79, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0042.png",
"frame": { "x": 158, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0043.png",
"frame": { "x": 0, "y": 75, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0044.png",
"frame": { "x": 458, "y": 220, "w": 75, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0045.png",
"frame": { "x": 150, "y": 364, "w": 73, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0046.png",
"frame": { "x": 152, "y": 292, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0047.png",
"frame": { "x": 303, "y": 221, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0048.png",
"frame": { "x": 383, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0049.png",
"frame": { "x": 233, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0050.png",
"frame": { "x": 459, "y": 147, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0051.png",
"frame": { "x": 315, "y": 0, "w": 76, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0052.png",
"frame": { "x": 387, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0053.png",
"frame": { "x": 392, "y": 0, "w": 75, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0054.png",
"frame": { "x": 237, "y": 0, "w": 77, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0055.png",
"frame": { "x": 0, "y": 0, "w": 78, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0056.png",
"frame": { "x": 79, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0057.png",
"frame": { "x": 158, "y": 0, "w": 78, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0058.png",
"frame": { "x": 0, "y": 75, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0059.png",
"frame": { "x": 458, "y": 220, "w": 75, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0060.png",
"frame": { "x": 150, "y": 364, "w": 73, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0061.png",
"frame": { "x": 152, "y": 292, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0062.png",
"frame": { "x": 458, "y": 292, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0063.png",
"frame": { "x": 303, "y": 364, "w": 74, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 70 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0064.png",
"frame": { "x": 227, "y": 294, "w": 75, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 70 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0065.png",
"frame": { "x": 378, "y": 364, "w": 75, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 5, "w": 75, "h": 69 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0066.png",
"frame": { "x": 303, "y": 293, "w": 75, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 70 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0067.png",
"frame": { "x": 379, "y": 293, "w": 75, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 4, "w": 75, "h": 70 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0068.png",
"frame": { "x": 454, "y": 364, "w": 72, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 8, "y": 3, "w": 72, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0069.png",
"frame": { "x": 70, "y": 365, "w": 68, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 68, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0070.png",
"frame": { "x": 291, "y": 435, "w": 62, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 17, "y": 2, "w": 62, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0071.png",
"frame": { "x": 378, "y": 434, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 15, "y": 2, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0072.png",
"frame": { "x": 224, "y": 365, "w": 66, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 2, "w": 66, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0073.png",
"frame": { "x": 0, "y": 365, "w": 69, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 8, "y": 2, "w": 69, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0074.png",
"frame": { "x": 229, "y": 220, "w": 73, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 1, "w": 73, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0075.png",
"frame": { "x": 468, "y": 0, "w": 75, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 1, "w": 75, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0076.png",
"frame": { "x": 308, "y": 147, "w": 74, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 1, "w": 74, "h": 73 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0077.png",
"frame": { "x": 0, "y": 148, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0078.png",
"frame": { "x": 383, "y": 220, "w": 74, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 74, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0079.png",
"frame": { "x": 231, "y": 147, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0080.png",
"frame": { "x": 79, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0081.png",
"frame": { "x": 156, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0082.png",
"frame": { "x": 310, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0083.png",
"frame": { "x": 464, "y": 74, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0084.png",
"frame": { "x": 77, "y": 147, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0085.png",
"frame": { "x": 154, "y": 147, "w": 76, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0086.png",
"frame": { "x": 76, "y": 220, "w": 75, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0087.png",
"frame": { "x": 152, "y": 220, "w": 76, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 3, "w": 76, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0088.png",
"frame": { "x": 0, "y": 221, "w": 75, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 3, "w": 75, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0089.png",
"frame": { "x": 0, "y": 293, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
},
{
"filename": "0090.png",
"frame": { "x": 75, "y": 293, "w": 74, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 },
"sourceSize": { "w": 80, "h": 74 },
"duration": 100
}
],
"meta": {
"app": "https://www.aseprite.org/",
"version": "1.3.11-x64",
"image": "668.png",
"format": "I8",
"size": { "w": 543, "h": 507 },
"scale": "1"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 22 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,820 @@
{ "frames": [
{
"filename": "0001.png",
"frame": { "x": 475, "y": 144, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0002.png",
"frame": { "x": 76, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0003.png",
"frame": { "x": 152, "y": 283, "w": 75, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0004.png",
"frame": { "x": 73, "y": 284, "w": 74, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0005.png",
"frame": { "x": 460, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0006.png",
"frame": { "x": 227, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0007.png",
"frame": { "x": 385, "y": 284, "w": 75, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0008.png",
"frame": { "x": 472, "y": 283, "w": 77, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0009.png",
"frame": { "x": 233, "y": 282, "w": 77, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0010.png",
"frame": { "x": 396, "y": 215, "w": 76, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0011.png",
"frame": { "x": 0, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0012.png",
"frame": { "x": 399, "y": 144, "w": 76, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0013.png",
"frame": { "x": 431, "y": 73, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0014.png",
"frame": { "x": 242, "y": 142, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0015.png",
"frame": { "x": 156, "y": 213, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0016.png",
"frame": { "x": 475, "y": 144, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0017.png",
"frame": { "x": 76, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0018.png",
"frame": { "x": 152, "y": 283, "w": 75, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0019.png",
"frame": { "x": 73, "y": 284, "w": 74, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0020.png",
"frame": { "x": 460, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0021.png",
"frame": { "x": 227, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0022.png",
"frame": { "x": 385, "y": 284, "w": 75, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0023.png",
"frame": { "x": 472, "y": 283, "w": 77, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0024.png",
"frame": { "x": 233, "y": 282, "w": 77, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0025.png",
"frame": { "x": 396, "y": 215, "w": 76, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0026.png",
"frame": { "x": 0, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0027.png",
"frame": { "x": 399, "y": 144, "w": 76, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0028.png",
"frame": { "x": 431, "y": 73, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0029.png",
"frame": { "x": 242, "y": 142, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0030.png",
"frame": { "x": 156, "y": 213, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0031.png",
"frame": { "x": 475, "y": 144, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0032.png",
"frame": { "x": 76, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0033.png",
"frame": { "x": 152, "y": 283, "w": 75, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0034.png",
"frame": { "x": 73, "y": 284, "w": 74, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0035.png",
"frame": { "x": 460, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0036.png",
"frame": { "x": 227, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0037.png",
"frame": { "x": 385, "y": 284, "w": 75, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0038.png",
"frame": { "x": 472, "y": 283, "w": 77, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0039.png",
"frame": { "x": 233, "y": 282, "w": 77, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0040.png",
"frame": { "x": 396, "y": 215, "w": 76, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0041.png",
"frame": { "x": 0, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0042.png",
"frame": { "x": 399, "y": 144, "w": 76, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0043.png",
"frame": { "x": 431, "y": 73, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0044.png",
"frame": { "x": 242, "y": 142, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0045.png",
"frame": { "x": 156, "y": 213, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0046.png",
"frame": { "x": 475, "y": 144, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0047.png",
"frame": { "x": 76, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0048.png",
"frame": { "x": 152, "y": 283, "w": 75, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0049.png",
"frame": { "x": 73, "y": 284, "w": 74, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0050.png",
"frame": { "x": 460, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0051.png",
"frame": { "x": 227, "y": 350, "w": 74, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0052.png",
"frame": { "x": 385, "y": 284, "w": 75, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0053.png",
"frame": { "x": 472, "y": 283, "w": 77, "h": 67 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0054.png",
"frame": { "x": 233, "y": 282, "w": 77, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0055.png",
"frame": { "x": 396, "y": 215, "w": 76, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0056.png",
"frame": { "x": 0, "y": 214, "w": 76, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0057.png",
"frame": { "x": 399, "y": 144, "w": 76, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0058.png",
"frame": { "x": 431, "y": 73, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0059.png",
"frame": { "x": 242, "y": 142, "w": 77, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0060.png",
"frame": { "x": 156, "y": 213, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0061.png",
"frame": { "x": 475, "y": 144, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0062.png",
"frame": { "x": 0, "y": 144, "w": 78, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0063.png",
"frame": { "x": 233, "y": 213, "w": 78, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 4, "w": 78, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0064.png",
"frame": { "x": 156, "y": 144, "w": 79, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 4, "w": 79, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0065.png",
"frame": { "x": 319, "y": 144, "w": 80, "h": 68 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 9, "y": 5, "w": 80, "h": 68 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0066.png",
"frame": { "x": 242, "y": 73, "w": 80, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 9, "y": 4, "w": 80, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0067.png",
"frame": { "x": 310, "y": 282, "w": 75, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0068.png",
"frame": { "x": 534, "y": 350, "w": 71, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 17, "y": 4, "w": 71, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0069.png",
"frame": { "x": 301, "y": 351, "w": 67, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 21, "y": 3, "w": 67, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0070.png",
"frame": { "x": 0, "y": 353, "w": 63, "h": 75 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 25, "y": 3, "w": 63, "h": 75 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0071.png",
"frame": { "x": 204, "y": 417, "w": 63, "h": 75 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 25, "y": 2, "w": 63, "h": 75 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0072.png",
"frame": { "x": 139, "y": 352, "w": 65, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 23, "y": 3, "w": 65, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0073.png",
"frame": { "x": 73, "y": 352, "w": 66, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 21, "y": 3, "w": 66, "h": 72 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0074.png",
"frame": { "x": 368, "y": 351, "w": 69, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 18, "y": 4, "w": 69, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0075.png",
"frame": { "x": 0, "y": 284, "w": 73, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 15, "y": 4, "w": 73, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0076.png",
"frame": { "x": 475, "y": 214, "w": 76, "h": 69 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0077.png",
"frame": { "x": 319, "y": 212, "w": 77, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 3, "w": 77, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0078.png",
"frame": { "x": 82, "y": 73, "w": 80, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 7, "y": 2, "w": 80, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0079.png",
"frame": { "x": 519, "y": 72, "w": 83, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 1, "w": 83, "h": 72 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0080.png",
"frame": { "x": 434, "y": 0, "w": 85, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 0, "w": 85, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0081.png",
"frame": { "x": 261, "y": 0, "w": 86, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 86, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0082.png",
"frame": { "x": 174, "y": 0, "w": 87, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0083.png",
"frame": { "x": 87, "y": 0, "w": 87, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0084.png",
"frame": { "x": 0, "y": 0, "w": 87, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0085.png",
"frame": { "x": 347, "y": 0, "w": 87, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 1, "w": 87, "h": 72 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0086.png",
"frame": { "x": 519, "y": 0, "w": 85, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 1, "w": 85, "h": 72 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0087.png",
"frame": { "x": 347, "y": 72, "w": 84, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 1, "w": 84, "h": 72 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0088.png",
"frame": { "x": 0, "y": 73, "w": 82, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0089.png",
"frame": { "x": 162, "y": 73, "w": 80, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 71 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
},
{
"filename": "0090.png",
"frame": { "x": 78, "y": 144, "w": 78, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 },
"sourceSize": { "w": 89, "h": 78 },
"duration": 100
}
],
"meta": {
"app": "https://www.aseprite.org/",
"version": "1.3.11-x64",
"format": "I8",
"size": { "w": 605, "h": 492 },
"scale": "1"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -0,0 +1,820 @@
{ "frames": [
{
"filename": "0001.png",
"frame": { "x": 0, "y": 219, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0002.png",
"frame": { "x": 0, "y": 291, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0003.png",
"frame": { "x": 453, "y": 289, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0004.png",
"frame": { "x": 441, "y": 360, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0005.png",
"frame": { "x": 309, "y": 359, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0006.png",
"frame": { "x": 380, "y": 358, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0007.png",
"frame": { "x": 317, "y": 289, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0008.png",
"frame": { "x": 390, "y": 288, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0009.png",
"frame": { "x": 254, "y": 220, "w": 63, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0010.png",
"frame": { "x": 63, "y": 220, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0011.png",
"frame": { "x": 399, "y": 216, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0012.png",
"frame": { "x": 64, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0013.png",
"frame": { "x": 138, "y": 74, "w": 63, "h": 78 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0014.png",
"frame": { "x": 201, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0015.png",
"frame": { "x": 264, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0016.png",
"frame": { "x": 0, "y": 219, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0017.png",
"frame": { "x": 0, "y": 291, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0018.png",
"frame": { "x": 453, "y": 289, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0019.png",
"frame": { "x": 441, "y": 360, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0020.png",
"frame": { "x": 309, "y": 359, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0021.png",
"frame": { "x": 380, "y": 358, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0022.png",
"frame": { "x": 317, "y": 289, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0023.png",
"frame": { "x": 390, "y": 288, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0024.png",
"frame": { "x": 254, "y": 220, "w": 63, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0025.png",
"frame": { "x": 63, "y": 220, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0026.png",
"frame": { "x": 399, "y": 216, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0027.png",
"frame": { "x": 64, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0028.png",
"frame": { "x": 138, "y": 74, "w": 63, "h": 78 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0029.png",
"frame": { "x": 201, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0030.png",
"frame": { "x": 264, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0031.png",
"frame": { "x": 0, "y": 219, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0032.png",
"frame": { "x": 0, "y": 291, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0033.png",
"frame": { "x": 453, "y": 289, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0034.png",
"frame": { "x": 441, "y": 360, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0035.png",
"frame": { "x": 309, "y": 359, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0036.png",
"frame": { "x": 380, "y": 358, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0037.png",
"frame": { "x": 317, "y": 289, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0038.png",
"frame": { "x": 390, "y": 288, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0039.png",
"frame": { "x": 254, "y": 220, "w": 63, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0040.png",
"frame": { "x": 63, "y": 220, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0041.png",
"frame": { "x": 399, "y": 216, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0042.png",
"frame": { "x": 64, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0043.png",
"frame": { "x": 138, "y": 74, "w": 63, "h": 78 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0044.png",
"frame": { "x": 201, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0045.png",
"frame": { "x": 264, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0046.png",
"frame": { "x": 0, "y": 219, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0047.png",
"frame": { "x": 0, "y": 291, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0048.png",
"frame": { "x": 453, "y": 289, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0049.png",
"frame": { "x": 441, "y": 360, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0050.png",
"frame": { "x": 309, "y": 359, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0051.png",
"frame": { "x": 380, "y": 358, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0052.png",
"frame": { "x": 317, "y": 289, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0053.png",
"frame": { "x": 390, "y": 288, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0054.png",
"frame": { "x": 254, "y": 220, "w": 63, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0055.png",
"frame": { "x": 63, "y": 220, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0056.png",
"frame": { "x": 399, "y": 216, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0057.png",
"frame": { "x": 64, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0058.png",
"frame": { "x": 138, "y": 74, "w": 63, "h": 78 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0059.png",
"frame": { "x": 201, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0060.png",
"frame": { "x": 264, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0061.png",
"frame": { "x": 0, "y": 219, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0062.png",
"frame": { "x": 0, "y": 147, "w": 64, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 64, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0063.png",
"frame": { "x": 127, "y": 152, "w": 64, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 64, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0064.png",
"frame": { "x": 465, "y": 146, "w": 65, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 65, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0065.png",
"frame": { "x": 399, "y": 146, "w": 66, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 66, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0066.png",
"frame": { "x": 334, "y": 74, "w": 66, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 7, "w": 66, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0067.png",
"frame": { "x": 191, "y": 220, "w": 63, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 7, "w": 63, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0068.png",
"frame": { "x": 126, "y": 223, "w": 62, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 6, "w": 62, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0069.png",
"frame": { "x": 462, "y": 217, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0070.png",
"frame": { "x": 188, "y": 291, "w": 61, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 6, "w": 61, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0071.png",
"frame": { "x": 249, "y": 291, "w": 60, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 5, "w": 60, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0072.png",
"frame": { "x": 62, "y": 292, "w": 60, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0073.png",
"frame": { "x": 122, "y": 295, "w": 60, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0074.png",
"frame": { "x": 182, "y": 363, "w": 59, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 6, "w": 59, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0075.png",
"frame": { "x": 60, "y": 364, "w": 59, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 6, "w": 59, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0076.png",
"frame": { "x": 0, "y": 362, "w": 60, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 7, "w": 60, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0077.png",
"frame": { "x": 327, "y": 217, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0078.png",
"frame": { "x": 268, "y": 74, "w": 66, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0079.png",
"frame": { "x": 0, "y": 74, "w": 69, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 69, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0080.png",
"frame": { "x": 376, "y": 0, "w": 73, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 74 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0081.png",
"frame": { "x": 227, "y": 0, "w": 75, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0082.png",
"frame": { "x": 76, "y": 0, "w": 76, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0083.png",
"frame": { "x": 0, "y": 0, "w": 76, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0084.png",
"frame": { "x": 152, "y": 0, "w": 75, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0085.png",
"frame": { "x": 302, "y": 0, "w": 74, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 74 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0086.png",
"frame": { "x": 449, "y": 0, "w": 72, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 5, "w": 72, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0087.png",
"frame": { "x": 449, "y": 73, "w": 71, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 71, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0088.png",
"frame": { "x": 69, "y": 74, "w": 69, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0089.png",
"frame": { "x": 201, "y": 74, "w": 67, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 67, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0090.png",
"frame": { "x": 334, "y": 145, "w": 65, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 65, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
}
],
"meta": {
"app": "https://www.aseprite.org/",
"version": "1.3.11-x64",
"format": "I8",
"size": { "w": 530, "h": 436 },
"scale": "1"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -1,272 +1,659 @@
{
"textures": [
{
"image": "667.png",
"format": "RGBA8888",
"size": {
"w": 160,
"h": 160
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
},
"frame": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
},
"frame": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
},
"frame": {
"x": 0,
"y": 46,
"w": 40,
"h": 46
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
},
"frame": {
"x": 0,
"y": 92,
"w": 40,
"h": 46
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
},
"frame": {
"x": 40,
"y": 0,
"w": 40,
"h": 46
}
},
{
"filename": "0012.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 40,
"h": 46
},
"frame": {
"x": 80,
"y": 0,
"w": 40,
"h": 46
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 40,
"h": 45
},
"frame": {
"x": 120,
"y": 0,
"w": 40,
"h": 45
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 40,
"h": 45
},
"frame": {
"x": 120,
"y": 0,
"w": 40,
"h": 45
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 40,
"h": 45
},
"frame": {
"x": 120,
"y": 45,
"w": 40,
"h": 45
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 40,
"h": 45
},
"frame": {
"x": 40,
"y": 90,
"w": 40,
"h": 45
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 40,
"h": 44
},
"frame": {
"x": 40,
"y": 46,
"w": 40,
"h": 44
}
},
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 40,
"h": 44
},
"frame": {
"x": 80,
"y": 46,
"w": 40,
"h": 44
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:fb79c9185dd67d4776808c312f36f7a4:a6c3c7cc2402b26f23f5ac4e23929ba7:02171d511e760c8a3e1b623ad6bf93f5$"
}
{ "frames": [
{
"filename": "0001.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0002.png",
"frame": { "x": 127, "y": 48, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0003.png",
"frame": { "x": 0, "y": 50, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0004.png",
"frame": { "x": 40, "y": 50, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0005.png",
"frame": { "x": 120, "y": 96, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0006.png",
"frame": { "x": 80, "y": 96, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0007.png",
"frame": { "x": 40, "y": 96, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0008.png",
"frame": { "x": 85, "y": 49, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0009.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0010.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0011.png",
"frame": { "x": 127, "y": 48, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0012.png",
"frame": { "x": 0, "y": 50, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0013.png",
"frame": { "x": 40, "y": 50, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0014.png",
"frame": { "x": 120, "y": 96, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0015.png",
"frame": { "x": 80, "y": 96, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0016.png",
"frame": { "x": 40, "y": 96, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0017.png",
"frame": { "x": 85, "y": 49, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0018.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0019.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0020.png",
"frame": { "x": 127, "y": 48, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0021.png",
"frame": { "x": 0, "y": 50, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0022.png",
"frame": { "x": 40, "y": 50, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0023.png",
"frame": { "x": 120, "y": 96, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0024.png",
"frame": { "x": 80, "y": 96, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0025.png",
"frame": { "x": 40, "y": 96, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0026.png",
"frame": { "x": 85, "y": 49, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0027.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0028.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0029.png",
"frame": { "x": 127, "y": 48, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0030.png",
"frame": { "x": 0, "y": 50, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0031.png",
"frame": { "x": 40, "y": 50, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0032.png",
"frame": { "x": 120, "y": 96, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0033.png",
"frame": { "x": 80, "y": 96, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0034.png",
"frame": { "x": 40, "y": 96, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0035.png",
"frame": { "x": 85, "y": 49, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0036.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0037.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0038.png",
"frame": { "x": 127, "y": 48, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0039.png",
"frame": { "x": 0, "y": 50, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0040.png",
"frame": { "x": 40, "y": 50, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0041.png",
"frame": { "x": 120, "y": 96, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0042.png",
"frame": { "x": 80, "y": 96, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0043.png",
"frame": { "x": 40, "y": 96, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0044.png",
"frame": { "x": 85, "y": 49, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0045.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0046.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0047.png",
"frame": { "x": 127, "y": 48, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0048.png",
"frame": { "x": 0, "y": 50, "w": 39, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0049.png",
"frame": { "x": 40, "y": 50, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0050.png",
"frame": { "x": 120, "y": 96, "w": 38, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0051.png",
"frame": { "x": 80, "y": 96, "w": 39, "h": 44 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0052.png",
"frame": { "x": 40, "y": 96, "w": 39, "h": 45 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0053.png",
"frame": { "x": 85, "y": 49, "w": 40, "h": 46 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0054.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0055.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0056.png",
"frame": { "x": 85, "y": 0, "w": 41, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 48 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0057.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0058.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0059.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0060.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0061.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0062.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0063.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0064.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0065.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0066.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0067.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0068.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0069.png",
"frame": { "x": 0, "y": 0, "w": 42, "h": 49 },
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0070.png",
"frame": { "x": 43, "y": 0, "w": 41, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0071.png",
"frame": { "x": 85, "y": 0, "w": 41, "h": 48 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 48 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
},
{
"filename": "0072.png",
"frame": { "x": 127, "y": 0, "w": 40, "h": 47 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 },
"sourceSize": { "w": 42, "h": 49 },
"duration": 110
}
],
"meta": {
"app": "https://www.aseprite.org/",
"version": "1.3.11-x64",
"image": "667.png",
"format": "I8",
"size": { "w": 167, "h": 141 },
"scale": "1"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 29 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -0,0 +1,820 @@
{ "frames": [
{
"filename": "0001.png",
"frame": { "x": 0, "y": 219, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0002.png",
"frame": { "x": 0, "y": 291, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0003.png",
"frame": { "x": 453, "y": 289, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0004.png",
"frame": { "x": 441, "y": 360, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0005.png",
"frame": { "x": 309, "y": 359, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0006.png",
"frame": { "x": 380, "y": 358, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0007.png",
"frame": { "x": 317, "y": 289, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0008.png",
"frame": { "x": 390, "y": 288, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0009.png",
"frame": { "x": 254, "y": 220, "w": 63, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0010.png",
"frame": { "x": 63, "y": 220, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0011.png",
"frame": { "x": 399, "y": 216, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0012.png",
"frame": { "x": 64, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0013.png",
"frame": { "x": 138, "y": 74, "w": 63, "h": 78 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0014.png",
"frame": { "x": 201, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0015.png",
"frame": { "x": 264, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0016.png",
"frame": { "x": 0, "y": 219, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0017.png",
"frame": { "x": 0, "y": 291, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0018.png",
"frame": { "x": 453, "y": 289, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0019.png",
"frame": { "x": 441, "y": 360, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0020.png",
"frame": { "x": 309, "y": 359, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0021.png",
"frame": { "x": 380, "y": 358, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0022.png",
"frame": { "x": 317, "y": 289, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0023.png",
"frame": { "x": 390, "y": 288, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0024.png",
"frame": { "x": 254, "y": 220, "w": 63, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0025.png",
"frame": { "x": 63, "y": 220, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0026.png",
"frame": { "x": 399, "y": 216, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0027.png",
"frame": { "x": 64, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0028.png",
"frame": { "x": 138, "y": 74, "w": 63, "h": 78 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0029.png",
"frame": { "x": 201, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0030.png",
"frame": { "x": 264, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0031.png",
"frame": { "x": 0, "y": 219, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0032.png",
"frame": { "x": 0, "y": 291, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0033.png",
"frame": { "x": 453, "y": 289, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0034.png",
"frame": { "x": 441, "y": 360, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0035.png",
"frame": { "x": 309, "y": 359, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0036.png",
"frame": { "x": 380, "y": 358, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0037.png",
"frame": { "x": 317, "y": 289, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0038.png",
"frame": { "x": 390, "y": 288, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0039.png",
"frame": { "x": 254, "y": 220, "w": 63, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0040.png",
"frame": { "x": 63, "y": 220, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0041.png",
"frame": { "x": 399, "y": 216, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0042.png",
"frame": { "x": 64, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0043.png",
"frame": { "x": 138, "y": 74, "w": 63, "h": 78 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0044.png",
"frame": { "x": 201, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0045.png",
"frame": { "x": 264, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0046.png",
"frame": { "x": 0, "y": 219, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0047.png",
"frame": { "x": 0, "y": 291, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0048.png",
"frame": { "x": 453, "y": 289, "w": 62, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0049.png",
"frame": { "x": 441, "y": 360, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0050.png",
"frame": { "x": 309, "y": 359, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0051.png",
"frame": { "x": 380, "y": 358, "w": 61, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0052.png",
"frame": { "x": 317, "y": 289, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0053.png",
"frame": { "x": 390, "y": 288, "w": 63, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0054.png",
"frame": { "x": 254, "y": 220, "w": 63, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0055.png",
"frame": { "x": 63, "y": 220, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0056.png",
"frame": { "x": 399, "y": 216, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0057.png",
"frame": { "x": 64, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0058.png",
"frame": { "x": 138, "y": 74, "w": 63, "h": 78 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0059.png",
"frame": { "x": 201, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0060.png",
"frame": { "x": 264, "y": 147, "w": 63, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0061.png",
"frame": { "x": 0, "y": 219, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0062.png",
"frame": { "x": 0, "y": 147, "w": 64, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 64, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0063.png",
"frame": { "x": 127, "y": 152, "w": 64, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 64, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0064.png",
"frame": { "x": 465, "y": 146, "w": 65, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 65, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0065.png",
"frame": { "x": 399, "y": 146, "w": 66, "h": 70 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 8, "w": 66, "h": 70 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0066.png",
"frame": { "x": 334, "y": 74, "w": 66, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 7, "w": 66, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0067.png",
"frame": { "x": 191, "y": 220, "w": 63, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 7, "w": 63, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0068.png",
"frame": { "x": 126, "y": 223, "w": 62, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 6, "w": 62, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0069.png",
"frame": { "x": 462, "y": 217, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0070.png",
"frame": { "x": 188, "y": 291, "w": 61, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 1, "y": 6, "w": 61, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0071.png",
"frame": { "x": 249, "y": 291, "w": 60, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 5, "w": 60, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0072.png",
"frame": { "x": 62, "y": 292, "w": 60, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0073.png",
"frame": { "x": 122, "y": 295, "w": 60, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0074.png",
"frame": { "x": 182, "y": 363, "w": 59, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 6, "w": 59, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0075.png",
"frame": { "x": 60, "y": 364, "w": 59, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 6, "w": 59, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0076.png",
"frame": { "x": 0, "y": 362, "w": 60, "h": 71 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 7, "w": 60, "h": 71 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0077.png",
"frame": { "x": 327, "y": 217, "w": 63, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 6, "w": 63, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0078.png",
"frame": { "x": 268, "y": 74, "w": 66, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0079.png",
"frame": { "x": 0, "y": 74, "w": 69, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 5, "y": 5, "w": 69, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0080.png",
"frame": { "x": 376, "y": 0, "w": 73, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 74 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0081.png",
"frame": { "x": 227, "y": 0, "w": 75, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0082.png",
"frame": { "x": 76, "y": 0, "w": 76, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0083.png",
"frame": { "x": 0, "y": 0, "w": 76, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0084.png",
"frame": { "x": 152, "y": 0, "w": 75, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0085.png",
"frame": { "x": 302, "y": 0, "w": 74, "h": 74 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 74 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0086.png",
"frame": { "x": 449, "y": 0, "w": 72, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 4, "y": 5, "w": 72, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0087.png",
"frame": { "x": 449, "y": 73, "w": 71, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 71, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0088.png",
"frame": { "x": 69, "y": 74, "w": 69, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0089.png",
"frame": { "x": 201, "y": 74, "w": 67, "h": 73 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 5, "w": 67, "h": 73 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
},
{
"filename": "0090.png",
"frame": { "x": 334, "y": 145, "w": 65, "h": 72 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 65, "h": 72 },
"sourceSize": { "w": 80, "h": 78 },
"duration": 100
}
],
"meta": {
"app": "https://www.aseprite.org/",
"version": "1.3.11-x64",
"format": "I8",
"size": { "w": 530, "h": 436 },
"scale": "1"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -1,41 +0,0 @@
{
"textures": [
{
"image": "668-female.png",
"format": "RGBA8888",
"size": {
"w": 72,
"h": 72
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 63,
"h": 72
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 63,
"h": 72
},
"frame": {
"x": 0,
"y": 0,
"w": 63,
"h": 72
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:bf61792d4b290b767953cfbbc5b6234f:c16e73a6866720618f3b4f8e3e0a0877:d99ed0e84a0695b54e479aa98271aba1$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 899 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 899 B

After

Width:  |  Height:  |  Size: 940 B

View File

@ -1397,7 +1397,7 @@
"612": [0, 1, 1],
"616": [0, 1, 1],
"617": [0, 1, 1],
"618": [0, 2, 2],
"618": [0, 1, 1],
"619": [0, 1, 1],
"620": [0, 1, 1],
"621": [0, 1, 1],
@ -2143,7 +2143,9 @@
"6705": [0, 1, 1],
"6706": [0, 1, 1],
"6713": [0, 1, 1],
"female": {},
"female": {
"6215": [0, 1, 1]
},
"back": {
"3-mega": [0, 2, 2],
"6-mega-x": [0, 2, 2],
@ -2470,7 +2472,10 @@
"6571": [0, 1, 1],
"6705": [0, 1, 1],
"6706": [0, 1, 1],
"6713": [0, 1, 1]
"6713": [0, 1, 1],
"female": {
"6215": [0, 1, 1]
}
}
}
}

View File

@ -0,0 +1,40 @@
{
"1": {
"cebd00": "bdac99",
"ffff00": "f3e6dd",
"6b6319": "987b6d",
"081019": "081019",
"52423a": "312118",
"6b524a": "4a342a",
"bd846b": "8c3841",
"846b63": "6b3838",
"d69c84": "ad4c4c",
"efce42": "eac2bd",
"d6cec5": "d6cec5",
"ffffff": "ffffff",
"081018": "081018",
"735a52": "564038",
"735a53": "564038",
"9c8473": "a08773",
"bda59c": "e6dbd6"
},
"2": {
"cebd00": "58536b",
"ffff00": "707488",
"6b6319": "39314a",
"081019": "081019",
"52423a": "5a2e2e",
"6b524a": "804e48",
"bd846b": "cec9b1",
"846b63": "9c7765",
"d69c84": "f0ead6",
"efce42": "9fadb9",
"d6cec5": "4c8c4c",
"ffffff": "79a962",
"081018": "204a29",
"735a52": "885011",
"735a53": "735555",
"9c8473": "c18a2c",
"bda59c": "efc44b"
}
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,32 @@
{
"1": {
"724ca2": "12968b",
"9c9bce": "ae8976",
"503678": "0f5d6d",
"956cbe": "31dabb",
"514a80": "402010",
"dcdbf7": "d0b3a4",
"080808": "080808",
"28234b": "220d0a",
"7d6ca4": "672e26",
"584d80": "401914",
"f6f6ff": "f6f6ff",
"bdbdc5": "bdbdc5",
"c52973": "ea903f"
},
"2": {
"724ca2": "982e33",
"9c9bce": "3c8775",
"503678": "601522",
"956cbe": "cc5427",
"514a80": "14273a",
"dcdbf7": "60ae7e",
"080808": "080808",
"28234b": "0a191e",
"7d6ca4": "395962",
"584d80": "1c3942",
"f6f6ff": "f6f6ff",
"bdbdc5": "bdbdc5",
"c52973": "f49633"
}
}

View File

@ -0,0 +1,38 @@
{
"1": {
"503678": "0f5d6d",
"080808": "080808",
"514a80": "402010",
"956cbe": "31dabb",
"9c9bce": "ae8976",
"724ca2": "12968b",
"dcdbf7": "d0b3a4",
"7d6ca4": "853a36",
"c58b08": "6e6f6f",
"ffde7b": "a7a7a7",
"584d80": "562627",
"28234b": "220d0a",
"c52973": "ea903f",
"bdbdc5": "bdbdc5",
"f6f6ff": "f6f6ff",
"000000": "000000"
},
"2": {
"503678": "601522",
"080808": "080808",
"514a80": "14273a",
"956cbe": "cc5427",
"9c9bce": "3c8775",
"724ca2": "982e33",
"dcdbf7": "60ae7e",
"7d6ca4": "395962",
"c58b08": "ffa341",
"ffde7b": "ffe07e",
"584d80": "1c3942",
"28234b": "0a191e",
"c52973": "f49633",
"bdbdc5": "bdbdc5",
"f6f6ff": "f6f6ff",
"000000": "000000"
}
}

@ -1 +1 @@
Subproject commit 5f6fa82c17d5981eaec15f105880ac2b4c99cc8d
Subproject commit f917baa1bb2fc5071587b7894ce7b4898cc64f36

View File

@ -1401,8 +1401,8 @@ export default class BattleScene extends SceneBase {
return this.currentBattle;
}
newArena(biome: Biome): Arena {
this.arena = new Arena(biome, Biome[biome].toLowerCase());
newArena(biome: Biome, playerFaints?: number): Arena {
this.arena = new Arena(biome, Biome[biome].toLowerCase(), playerFaints);
this.eventTarget.dispatchEvent(new NewArenaEvent());
this.arenaBg.pipelineData = { terrainColorRatio: this.arena.getBgTerrainColorRatioForBiome() };
@ -2353,14 +2353,14 @@ export default class BattleScene extends SceneBase {
}
/**
* Adds Phase to the end of phaseQueuePrepend, or at phaseQueuePrependSpliceIndex
* @param phase {@linkcode Phase} the phase to add
* Adds Phase(s) to the end of phaseQueuePrepend, or at phaseQueuePrependSpliceIndex
* @param phases {@linkcode Phase} the phase(s) to add
*/
unshiftPhase(phase: Phase): void {
unshiftPhase(...phases: Phase[]): void {
if (this.phaseQueuePrependSpliceIndex === -1) {
this.phaseQueuePrepend.push(phase);
this.phaseQueuePrepend.push(...phases);
} else {
this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, phase);
this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, ...phases);
}
}
@ -2498,32 +2498,38 @@ export default class BattleScene extends SceneBase {
* @param targetPhase {@linkcode Phase} the type of phase to search for in phaseQueue
* @returns boolean if a targetPhase was found and added
*/
prependToPhase(phase: Phase, targetPhase: Constructor<Phase>): boolean {
prependToPhase(phase: Phase | Phase [], targetPhase: Constructor<Phase>): boolean {
if (!Array.isArray(phase)) {
phase = [ phase ];
}
const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase);
if (targetIndex !== -1) {
this.phaseQueue.splice(targetIndex, 0, phase);
this.phaseQueue.splice(targetIndex, 0, ...phase);
return true;
} else {
this.unshiftPhase(phase);
this.unshiftPhase(...phase);
return false;
}
}
/**
* Tries to add the input phase to index after target phase in the {@linkcode phaseQueue}, else simply calls {@linkcode unshiftPhase()}
* @param phase {@linkcode Phase} the phase to be added
* Tries to add the input phase(s) to index after target phase in the {@linkcode phaseQueue}, else simply calls {@linkcode unshiftPhase()}
* @param phase {@linkcode Phase} the phase(s) to be added
* @param targetPhase {@linkcode Phase} the type of phase to search for in {@linkcode phaseQueue}
* @returns `true` if a `targetPhase` was found to append to
*/
appendToPhase(phase: Phase, targetPhase: Constructor<Phase>): boolean {
appendToPhase(phase: Phase | Phase[], targetPhase: Constructor<Phase>): boolean {
if (!Array.isArray(phase)) {
phase = [ phase ];
}
const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase);
if (targetIndex !== -1 && this.phaseQueue.length > targetIndex) {
this.phaseQueue.splice(targetIndex + 1, 0, phase);
this.phaseQueue.splice(targetIndex + 1, 0, ...phase);
return true;
} else {
this.unshiftPhase(phase);
this.unshiftPhase(...phase);
return false;
}
}

View File

@ -105,9 +105,11 @@ export default class Battle {
public lastEnemyInvolved: number;
public lastPlayerInvolved: number;
public lastUsedPokeball: PokeballType | null = null;
/** The number of times a Pokemon on the player's side has fainted this battle */
public playerFaints: number = 0;
/** The number of times a Pokemon on the enemy's side has fainted this battle */
/**
* Saves the number of times a Pokemon on the enemy's side has fainted during this battle.
* This is saved here since we encounter a new enemy every wave.
* {@linkcode globalScene.arena.playerFaints} is the corresponding faint counter for the player and needs to be save across waves (reset every arena encounter).
*/
public enemyFaints: number = 0;
public playerFaintsHistory: FaintLogEntry[] = [];
public enemyFaintsHistory: FaintLogEntry[] = [];
@ -118,7 +120,7 @@ export default class Battle {
private rngCounter: number = 0;
constructor(gameMode: GameMode, waveIndex: number, battleType: BattleType, trainer?: Trainer, double?: boolean) {
constructor(gameMode: GameMode, waveIndex: number, battleType: BattleType, trainer?: Trainer, double: boolean = false) {
this.gameMode = gameMode;
this.waveIndex = waveIndex;
this.battleType = battleType;
@ -127,7 +129,7 @@ export default class Battle {
this.enemyLevels = battleType !== BattleType.TRAINER
? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave())
: trainer?.getPartyLevels(this.waveIndex);
this.double = double ?? false;
this.double = double;
}
private initBattleSpec(): void {

View File

@ -1003,7 +1003,7 @@ export class PostDefendPerishSongAbAttr extends PostDefendAbAttr {
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !move.hitsSubstitute(attacker, pokemon)) {
if (pokemon.getTag(BattlerTagType.PERISH_SONG) || attacker.getTag(BattlerTagType.PERISH_SONG)) {
if (attacker.getTag(BattlerTagType.PERISH_SONG)) {
return false;
} else {
if (!simulated) {
@ -4485,6 +4485,13 @@ export class InfiltratorAbAttr extends AbAttr {
}
}
/**
* Attribute implementing the effects of {@link https://bulbapedia.bulbagarden.net/wiki/Magic_Bounce_(ability) | Magic Bounce}.
* Allows the source to bounce back {@linkcode MoveFlags.REFLECTABLE | Reflectable}
* moves as if the user had used {@linkcode Moves.MAGIC_COAT | Magic Coat}.
*/
export class ReflectStatusMoveAbAttr extends AbAttr { }
export class UncopiableAbilityAbAttr extends AbAttr {
constructor() {
super(false);
@ -5832,8 +5839,11 @@ export function initAbilities() {
}, Stat.SPD, 1)
.attr(PostIntimidateStatStageChangeAbAttr, [ Stat.SPD ], 1),
new Ability(Abilities.MAGIC_BOUNCE, 5)
.attr(ReflectStatusMoveAbAttr)
.ignorable()
.unimplemented(),
// Interactions with stomping tantrum, instruct, encore, and probably other moves that
// rely on move history
.edgeCase(),
new Ability(Abilities.SAP_SIPPER, 5)
.attr(TypeImmunityStatStageChangeAbAttr, Type.GRASS, Stat.ATK, 1)
.ignorable(),
@ -6158,7 +6168,8 @@ export function initAbilities() {
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.hasFlag(MoveFlags.SOUND_BASED), 0.5)
.ignorable(),
new Ability(Abilities.SAND_SPIT, 8)
.attr(PostDefendWeatherChangeAbAttr, WeatherType.SANDSTORM, (target, user, move) => move.category !== MoveCategory.STATUS),
.attr(PostDefendWeatherChangeAbAttr, WeatherType.SANDSTORM, (target, user, move) => move.category !== MoveCategory.STATUS)
.bypassFaint(),
new Ability(Abilities.ICE_SCALES, 8)
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.category === MoveCategory.SPECIAL, 0.5)
.ignorable(),
@ -6191,7 +6202,8 @@ export function initAbilities() {
new Ability(Abilities.STEELY_SPIRIT, 8)
.attr(UserFieldMoveTypePowerBoostAbAttr, Type.STEEL),
new Ability(Abilities.PERISH_BODY, 8)
.attr(PostDefendPerishSongAbAttr, 4),
.attr(PostDefendPerishSongAbAttr, 4)
.bypassFaint(),
new Ability(Abilities.WANDERING_SPIRIT, 8)
.attr(PostDefendAbilitySwapAbAttr)
.bypassFaint()
@ -6249,7 +6261,8 @@ export function initAbilities() {
.attr(PostDefendAbilityGiveAbAttr, Abilities.LINGERING_AROMA)
.bypassFaint(),
new Ability(Abilities.SEED_SOWER, 9)
.attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY),
.attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY)
.bypassFaint(),
new Ability(Abilities.THERMAL_EXCHANGE, 9)
.attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === Type.FIRE && move.category !== MoveCategory.STATUS, Stat.ATK, 1)
.attr(StatusEffectImmunityAbAttr, StatusEffect.BURN)
@ -6299,15 +6312,13 @@ export function initAbilities() {
.attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.PROTOSYNTHESIS, 0, WeatherType.SUNNY, WeatherType.HARSH_SUN)
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr)
.attr(NoTransformAbilityAbAttr)
.partial(), // While setting the tag, the getbattlestat should ignore all modifiers to stats except stat stages
.attr(NoTransformAbilityAbAttr),
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)
.partial(), // While setting the tag, the getbattlestat should ignore all modifiers to stats except stat stages
.attr(NoTransformAbilityAbAttr),
new Ability(Abilities.GOOD_AS_GOLD, 9)
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.category === MoveCategory.STATUS && ![ MoveTarget.ENEMY_SIDE, MoveTarget.BOTH_SIDES, MoveTarget.USER_SIDE ].includes(move.moveTarget))
.ignorable(),
@ -6340,8 +6351,8 @@ export function initAbilities() {
new Ability(Abilities.SHARPNESS, 9)
.attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.SLICING_MOVE), 1.5),
new Ability(Abilities.SUPREME_OVERLORD, 9)
.attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? globalScene.currentBattle.playerFaints : globalScene.currentBattle.enemyFaints, 5))
.partial(), // Counter resets every wave instead of on arena reset
.attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? globalScene.arena.playerFaints : globalScene.currentBattle.enemyFaints, 5))
.partial(), // Should only boost once, on summon
new Ability(Abilities.COSTAR, 9)
.attr(PostSummonCopyAllyStatsAbAttr),
new Ability(Abilities.TOXIC_DEBRIS, 9)

View File

@ -2975,6 +2975,24 @@ export class PsychoShiftTag extends BattlerTag {
}
}
/**
* Tag associated with the move Magic Coat.
*/
export class MagicCoatTag extends BattlerTag {
constructor() {
super(BattlerTagType.MAGIC_COAT, BattlerTagLapseType.TURN_END, 1, Moves.MAGIC_COAT);
}
/**
* Queues the "[PokemonName] shrouded itself with Magic Coat" message when the tag is added.
* @param pokemon - The target {@linkcode Pokemon}
*/
override onAdd(pokemon: Pokemon) {
// "{pokemonNameWithAffix} shrouded itself with Magic Coat!"
globalScene.queueMessage(i18next.t("battlerTags:magicCoatOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
}
}
/**
* Retrieves a {@linkcode BattlerTag} based on the provided tag type, turn count, source move, and source ID.
* @param sourceId - The ID of the pokemon adding the tag
@ -3164,6 +3182,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
return new GrudgeTag();
case BattlerTagType.PSYCHO_SHIFT:
return new PsychoShiftTag();
case BattlerTagType.MAGIC_COAT:
return new MagicCoatTag();
case BattlerTagType.NONE:
default:
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);

View File

@ -125,7 +125,9 @@ export enum MoveFlags {
/** Indicates a move is able to bypass its target's Substitute (if the target has one) */
IGNORE_SUBSTITUTE = 1 << 17,
/** Indicates a move is able to be redirected to allies in a double battle if the attacker faints */
REDIRECT_COUNTER = 1 << 18,
REDIRECT_COUNTER = 1 << 18,
/** Indicates a move is able to be reflected by {@linkcode Abilities.MAGIC_BOUNCE} and {@linkcode Moves.MAGIC_COAT} */
REFLECTABLE = 1 << 19,
}
type MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => boolean;
@ -610,6 +612,16 @@ export default class Move implements Localizable {
return this;
}
/**
* Sets the {@linkcode MoveFlags.REFLECTABLE} flag for the calling Move
* @see {@linkcode Moves.ATTRACT}
* @returns The {@linkcode Move} that called this function
*/
reflectable(): this {
this.setFlag(MoveFlags.REFLECTABLE, true);
return this;
}
/**
* Checks if the move flag applies to the pokemon(s) using/receiving the move
* @param flag {@linkcode MoveFlags} MoveFlag to check on user and/or target
@ -4368,6 +4380,69 @@ export class CueNextRoundAttr extends MoveEffectAttr {
}
}
/**
* Attribute that changes stat stages before the damage is calculated
*/
export class StatChangeBeforeDmgCalcAttr extends MoveAttr {
/**
* Applies Stat Changes before damage is calculated
*
* @param user {@linkcode Pokemon} that called {@linkcode move}
* @param target {@linkcode Pokemon} that is the target of {@linkcode move}
* @param move {@linkcode Move} called by {@linkcode user}
* @param args N/A
*
* @returns true if stat stages where correctly applied
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
return false;
}
}
/**
* Steals the postitive Stat stages of the target before damage calculation so stat changes
* apply to damage calculation (e.g. {@linkcode Moves.SPECTRAL_THIEF})
* {@link https://bulbapedia.bulbagarden.net/wiki/Spectral_Thief_(move) | Spectral Thief}
*/
export class SpectralThiefAttr extends StatChangeBeforeDmgCalcAttr {
/**
* steals max amount of positive stats of the target while not exceeding the limit of max 6 stat stages
*
* @param user {@linkcode Pokemon} that called {@linkcode move}
* @param target {@linkcode Pokemon} that is the target of {@linkcode move}
* @param move {@linkcode Move} called by {@linkcode user}
* @param args N/A
*
* @returns true if stat stages where correctly stolen
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
/**
* Copy all positive stat stages to user and reduce copied stat stages on target.
*/
for (const s of BATTLE_STATS) {
const statStageValueTarget = target.getStatStage(s);
const statStageValueUser = user.getStatStage(s);
if (statStageValueTarget > 0) {
/**
* Only value of up to 6 can be stolen (stat stages don't exceed 6)
*/
const availableToSteal = Math.min(statStageValueTarget, 6 - statStageValueUser);
globalScene.unshiftPhase(new StatStageChangePhase(user.getBattlerIndex(), this.selfTarget, [ s ], availableToSteal));
target.setStatStage(s, statStageValueTarget - availableToSteal);
}
}
target.updateInfo();
user.updateInfo();
globalScene.queueMessage(i18next.t("moveTriggers:stealPositiveStats", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) }));
return true;
}
}
export class VariableAtkAttr extends MoveAttr {
constructor() {
super();
@ -5332,6 +5407,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr {
case BattlerTagType.INGRAIN:
case BattlerTagType.IGNORE_ACCURACY:
case BattlerTagType.AQUA_RING:
case BattlerTagType.MAGIC_COAT:
return 3;
case BattlerTagType.PROTECTED:
case BattlerTagType.FLYING:
@ -8334,7 +8410,8 @@ export function initMoves() {
.attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH)
.ignoresSubstitute()
.hidesTarget()
.windMove(),
.windMove()
.reflectable(),
new ChargingAttackMove(Moves.FLY, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1)
.chargeText(i18next.t("moveTriggers:flewUpHigh", { pokemonName: "{USER}" }))
.chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING)
@ -8358,7 +8435,8 @@ export function initMoves() {
new AttackMove(Moves.ROLLING_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 85, 15, 30, 0, 1)
.attr(FlinchAttr),
new StatusMove(Moves.SAND_ATTACK, Type.GROUND, 100, 15, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.ACC ], -1),
.attr(StatStageChangeAttr, [ Stat.ACC ], -1)
.reflectable(),
new AttackMove(Moves.HEADBUTT, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 15, 30, 0, 1)
.attr(FlinchAttr),
new AttackMove(Moves.HORN_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 25, -1, 0, 1),
@ -8387,7 +8465,8 @@ export function initMoves() {
.recklessMove(),
new StatusMove(Moves.TAIL_WHIP, Type.NORMAL, 100, 30, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.DEF ], -1)
.target(MoveTarget.ALL_NEAR_ENEMIES),
.target(MoveTarget.ALL_NEAR_ENEMIES)
.reflectable(),
new AttackMove(Moves.POISON_STING, Type.POISON, MoveCategory.PHYSICAL, 15, 100, 35, 30, 0, 1)
.attr(StatusEffectAttr, StatusEffect.POISON)
.makesContact(false),
@ -8400,30 +8479,36 @@ export function initMoves() {
.makesContact(false),
new StatusMove(Moves.LEER, Type.NORMAL, 100, 30, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.DEF ], -1)
.target(MoveTarget.ALL_NEAR_ENEMIES),
.target(MoveTarget.ALL_NEAR_ENEMIES)
.reflectable(),
new AttackMove(Moves.BITE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 1)
.attr(FlinchAttr)
.bitingMove(),
new StatusMove(Moves.GROWL, Type.NORMAL, 100, 40, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.ATK ], -1)
.soundBased()
.target(MoveTarget.ALL_NEAR_ENEMIES),
.target(MoveTarget.ALL_NEAR_ENEMIES)
.reflectable(),
new StatusMove(Moves.ROAR, Type.NORMAL, -1, 20, -1, -6, 1)
.attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH)
.soundBased()
.hidesTarget(),
.hidesTarget()
.reflectable(),
new StatusMove(Moves.SING, Type.NORMAL, 55, 15, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.SLEEP)
.soundBased(),
.soundBased()
.reflectable(),
new StatusMove(Moves.SUPERSONIC, Type.NORMAL, 55, 20, -1, 0, 1)
.attr(ConfuseAttr)
.soundBased(),
.soundBased()
.reflectable(),
new AttackMove(Moves.SONIC_BOOM, Type.NORMAL, MoveCategory.SPECIAL, -1, 90, 20, -1, 0, 1)
.attr(FixedDamageAttr, 20),
new StatusMove(Moves.DISABLE, Type.NORMAL, 100, 20, -1, 0, 1)
.attr(AddBattlerTagAttr, BattlerTagType.DISABLED, false, true)
.condition((user, target, move) => target.getMoveHistory().reverse().find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual) !== undefined)
.ignoresSubstitute(),
.ignoresSubstitute()
.reflectable(),
new AttackMove(Moves.ACID, Type.POISON, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1)
.attr(StatStageChangeAttr, [ Stat.SPDEF ], -1)
.target(MoveTarget.ALL_NEAR_ENEMIES),
@ -8476,7 +8561,8 @@ export function initMoves() {
.triageMove(),
new StatusMove(Moves.LEECH_SEED, Type.GRASS, 90, 10, -1, 0, 1)
.attr(LeechSeedAttr)
.condition((user, target, move) => !target.getTag(BattlerTagType.SEEDED) && !target.isOfType(Type.GRASS)),
.condition((user, target, move) => !target.getTag(BattlerTagType.SEEDED) && !target.isOfType(Type.GRASS))
.reflectable(),
new SelfStatusMove(Moves.GROWTH, Type.NORMAL, -1, 20, -1, 0, 1)
.attr(GrowthStatStageChangeAttr),
new AttackMove(Moves.RAZOR_LEAF, Type.GRASS, MoveCategory.PHYSICAL, 55, 95, 25, -1, 0, 1)
@ -8490,13 +8576,16 @@ export function initMoves() {
.attr(AntiSunlightPowerDecreaseAttr),
new StatusMove(Moves.POISON_POWDER, Type.POISON, 75, 35, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.POISON)
.powderMove(),
.powderMove()
.reflectable(),
new StatusMove(Moves.STUN_SPORE, Type.GRASS, 75, 30, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS)
.powderMove(),
.powderMove()
.reflectable(),
new StatusMove(Moves.SLEEP_POWDER, Type.GRASS, 75, 15, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.SLEEP)
.powderMove(),
.powderMove()
.reflectable(),
new AttackMove(Moves.PETAL_DANCE, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1)
.attr(FrenzyAttr)
.attr(MissEffectAttr, frenzyMissFunc)
@ -8506,7 +8595,8 @@ export function initMoves() {
.target(MoveTarget.RANDOM_NEAR_ENEMY),
new StatusMove(Moves.STRING_SHOT, Type.BUG, 95, 40, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.SPD ], -2)
.target(MoveTarget.ALL_NEAR_ENEMIES),
.target(MoveTarget.ALL_NEAR_ENEMIES)
.reflectable(),
new AttackMove(Moves.DRAGON_RAGE, Type.DRAGON, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 1)
.attr(FixedDamageAttr, 40),
new AttackMove(Moves.FIRE_SPIN, Type.FIRE, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 1)
@ -8517,7 +8607,8 @@ export function initMoves() {
.attr(StatusEffectAttr, StatusEffect.PARALYSIS),
new StatusMove(Moves.THUNDER_WAVE, Type.ELECTRIC, 90, 20, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS)
.attr(RespectAttackTypeImmunityAttr),
.attr(RespectAttackTypeImmunityAttr)
.reflectable(),
new AttackMove(Moves.THUNDER, Type.ELECTRIC, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 1)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS)
.attr(ThunderAccuracyAttr)
@ -8539,13 +8630,15 @@ export function initMoves() {
.chargeAttr(SemiInvulnerableAttr, BattlerTagType.UNDERGROUND),
new StatusMove(Moves.TOXIC, Type.POISON, 90, 10, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.TOXIC)
.attr(ToxicAccuracyAttr),
.attr(ToxicAccuracyAttr)
.reflectable(),
new AttackMove(Moves.CONFUSION, Type.PSYCHIC, MoveCategory.SPECIAL, 50, 100, 25, 10, 0, 1)
.attr(ConfuseAttr),
new AttackMove(Moves.PSYCHIC, Type.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1)
.attr(StatStageChangeAttr, [ Stat.SPDEF ], -1),
new StatusMove(Moves.HYPNOSIS, Type.PSYCHIC, 60, 20, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.SLEEP),
.attr(StatusEffectAttr, StatusEffect.SLEEP)
.reflectable(),
new SelfStatusMove(Moves.MEDITATE, Type.PSYCHIC, -1, 40, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.ATK ], 1, true),
new SelfStatusMove(Moves.AGILITY, Type.PSYCHIC, -1, 30, -1, 0, 1)
@ -8563,7 +8656,8 @@ export function initMoves() {
.ignoresSubstitute(),
new StatusMove(Moves.SCREECH, Type.NORMAL, 85, 40, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.DEF ], -2)
.soundBased(),
.soundBased()
.reflectable(),
new SelfStatusMove(Moves.DOUBLE_TEAM, Type.NORMAL, -1, 15, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.EVA ], 1, true),
new SelfStatusMove(Moves.RECOVER, Type.NORMAL, -1, 5, -1, 0, 1)
@ -8575,9 +8669,11 @@ export function initMoves() {
.attr(AddBattlerTagAttr, BattlerTagType.MINIMIZED, true, false)
.attr(StatStageChangeAttr, [ Stat.EVA ], 2, true),
new StatusMove(Moves.SMOKESCREEN, Type.NORMAL, 100, 20, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.ACC ], -1),
.attr(StatStageChangeAttr, [ Stat.ACC ], -1)
.reflectable(),
new StatusMove(Moves.CONFUSE_RAY, Type.GHOST, 100, 10, -1, 0, 1)
.attr(ConfuseAttr),
.attr(ConfuseAttr)
.reflectable(),
new SelfStatusMove(Moves.WITHDRAW, Type.WATER, -1, 40, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.DEF ], 1, true),
new SelfStatusMove(Moves.DEFENSE_CURL, Type.NORMAL, -1, 40, -1, 0, 1)
@ -8638,7 +8734,8 @@ export function initMoves() {
new SelfStatusMove(Moves.AMNESIA, Type.PSYCHIC, -1, 20, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.SPDEF ], 2, true),
new StatusMove(Moves.KINESIS, Type.PSYCHIC, 80, 15, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.ACC ], -1),
.attr(StatStageChangeAttr, [ Stat.ACC ], -1)
.reflectable(),
new SelfStatusMove(Moves.SOFT_BOILED, Type.NORMAL, -1, 5, -1, 0, 1)
.attr(HealAttr, 0.5)
.triageMove(),
@ -8648,14 +8745,16 @@ export function initMoves() {
.condition(failOnGravityCondition)
.recklessMove(),
new StatusMove(Moves.GLARE, Type.NORMAL, 100, 30, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS),
.attr(StatusEffectAttr, StatusEffect.PARALYSIS)
.reflectable(),
new AttackMove(Moves.DREAM_EATER, Type.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 15, -1, 0, 1)
.attr(HitHealAttr)
.condition(targetSleptOrComatoseCondition)
.triageMove(),
new StatusMove(Moves.POISON_GAS, Type.POISON, 90, 40, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.POISON)
.target(MoveTarget.ALL_NEAR_ENEMIES),
.target(MoveTarget.ALL_NEAR_ENEMIES)
.reflectable(),
new AttackMove(Moves.BARRAGE, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1)
.attr(MultiHitAttr)
.makesContact(false)
@ -8664,7 +8763,8 @@ export function initMoves() {
.attr(HitHealAttr)
.triageMove(),
new StatusMove(Moves.LOVELY_KISS, Type.NORMAL, 75, 10, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.SLEEP),
.attr(StatusEffectAttr, StatusEffect.SLEEP)
.reflectable(),
new ChargingAttackMove(Moves.SKY_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 1)
.chargeText(i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" }))
.attr(HighCritAttr)
@ -8683,9 +8783,11 @@ export function initMoves() {
.punchingMove(),
new StatusMove(Moves.SPORE, Type.GRASS, 100, 15, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.SLEEP)
.powderMove(),
.powderMove()
.reflectable(),
new StatusMove(Moves.FLASH, Type.NORMAL, 100, 20, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.ACC ], -1),
.attr(StatStageChangeAttr, [ Stat.ACC ], -1)
.reflectable(),
new AttackMove(Moves.PSYWAVE, Type.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1)
.attr(RandomLevelDamageAttr),
new SelfStatusMove(Moves.SPLASH, Type.NORMAL, -1, 40, -1, 0, 1)
@ -8744,7 +8846,8 @@ export function initMoves() {
.attr(StealHeldItemChanceAttr, 0.3),
new StatusMove(Moves.SPIDER_WEB, Type.BUG, -1, 10, -1, 0, 2)
.condition(failIfGhostTypeCondition)
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1),
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1)
.reflectable(),
new StatusMove(Moves.MIND_READER, Type.NORMAL, -1, 5, -1, 0, 2)
.attr(IgnoreAccuracyAttr),
new StatusMove(Moves.NIGHTMARE, Type.GHOST, 100, 15, -1, 0, 2)
@ -8775,12 +8878,14 @@ export function initMoves() {
new StatusMove(Moves.COTTON_SPORE, Type.GRASS, 100, 40, -1, 0, 2)
.attr(StatStageChangeAttr, [ Stat.SPD ], -2)
.powderMove()
.target(MoveTarget.ALL_NEAR_ENEMIES),
.target(MoveTarget.ALL_NEAR_ENEMIES)
.reflectable(),
new AttackMove(Moves.REVERSAL, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2)
.attr(LowHpPowerAttr),
new StatusMove(Moves.SPITE, Type.GHOST, 100, 10, -1, 0, 2)
.ignoresSubstitute()
.attr(ReducePpMoveAttr, 4),
.attr(ReducePpMoveAttr, 4)
.reflectable(),
new AttackMove(Moves.POWDER_SNOW, Type.ICE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 2)
.attr(StatusEffectAttr, StatusEffect.FREEZE)
.target(MoveTarget.ALL_NEAR_ENEMIES),
@ -8790,10 +8895,12 @@ export function initMoves() {
new AttackMove(Moves.MACH_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 2)
.punchingMove(),
new StatusMove(Moves.SCARY_FACE, Type.NORMAL, 100, 10, -1, 0, 2)
.attr(StatStageChangeAttr, [ Stat.SPD ], -2),
.attr(StatStageChangeAttr, [ Stat.SPD ], -2)
.reflectable(),
new AttackMove(Moves.FEINT_ATTACK, Type.DARK, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 2),
new StatusMove(Moves.SWEET_KISS, Type.FAIRY, 75, 10, -1, 0, 2)
.attr(ConfuseAttr),
.attr(ConfuseAttr)
.reflectable(),
new SelfStatusMove(Moves.BELLY_DRUM, Type.NORMAL, -1, 10, -1, 0, 2)
.attr(CutHpStatStageBoostAttr, [ Stat.ATK ], 12, 2, (user) => {
globalScene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", { pokemonName: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.ATK)) }));
@ -8808,13 +8915,15 @@ export function initMoves() {
.ballBombMove(),
new StatusMove(Moves.SPIKES, Type.GROUND, -1, 20, -1, 0, 2)
.attr(AddArenaTrapTagAttr, ArenaTagType.SPIKES)
.target(MoveTarget.ENEMY_SIDE),
.target(MoveTarget.ENEMY_SIDE)
.reflectable(),
new AttackMove(Moves.ZAP_CANNON, Type.ELECTRIC, MoveCategory.SPECIAL, 120, 50, 5, 100, 0, 2)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS)
.ballBombMove(),
new StatusMove(Moves.FORESIGHT, Type.NORMAL, -1, 40, -1, 0, 2)
.attr(ExposedMoveAttr, BattlerTagType.IGNORE_GHOST)
.ignoresSubstitute(),
.ignoresSubstitute()
.reflectable(),
new SelfStatusMove(Moves.DESTINY_BOND, Type.GHOST, -1, 5, -1, 0, 2)
.ignoresProtect()
.attr(DestinyBondAttr)
@ -8860,7 +8969,8 @@ export function initMoves() {
.attr(ProtectAttr, BattlerTagType.ENDURING)
.condition(failIfLastCondition),
new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2)
.attr(StatStageChangeAttr, [ Stat.ATK ], -2),
.attr(StatStageChangeAttr, [ Stat.ATK ], -2)
.reflectable(),
new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2)
.partial() // Does not lock the user, also does not increase damage properly
.attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL),
@ -8868,7 +8978,8 @@ export function initMoves() {
.attr(SurviveDamageAttr),
new StatusMove(Moves.SWAGGER, Type.NORMAL, 85, 15, -1, 0, 2)
.attr(StatStageChangeAttr, [ Stat.ATK ], 2)
.attr(ConfuseAttr),
.attr(ConfuseAttr)
.reflectable(),
new SelfStatusMove(Moves.MILK_DRINK, Type.NORMAL, -1, 5, -1, 0, 2)
.attr(HealAttr, 0.5)
.triageMove(),
@ -8881,11 +8992,13 @@ export function initMoves() {
.attr(StatStageChangeAttr, [ Stat.DEF ], 1, true),
new StatusMove(Moves.MEAN_LOOK, Type.NORMAL, -1, 5, -1, 0, 2)
.condition(failIfGhostTypeCondition)
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1),
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1)
.reflectable(),
new StatusMove(Moves.ATTRACT, Type.NORMAL, 100, 15, -1, 0, 2)
.attr(AddBattlerTagAttr, BattlerTagType.INFATUATED)
.ignoresSubstitute()
.condition((user, target, move) => user.isOppositeGender(target)),
.condition((user, target, move) => user.isOppositeGender(target))
.reflectable(),
new SelfStatusMove(Moves.SLEEP_TALK, Type.NORMAL, -1, 10, -1, 0, 2)
.attr(BypassSleepAttr)
.attr(RandomMovesetMoveAttr, invalidSleepTalkMoves, false)
@ -8932,7 +9045,8 @@ export function initMoves() {
new StatusMove(Moves.ENCORE, Type.NORMAL, 100, 5, -1, 0, 2)
.attr(AddBattlerTagAttr, BattlerTagType.ENCORE, false, true)
.ignoresSubstitute()
.condition((user, target, move) => new EncoreTag(user.id).canAdd(target)),
.condition((user, target, move) => new EncoreTag(user.id).canAdd(target))
.reflectable(),
new AttackMove(Moves.PURSUIT, Type.DARK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 0, 2)
.partial(), // No effect implemented
new AttackMove(Moves.RAPID_SPIN, Type.NORMAL, MoveCategory.PHYSICAL, 50, 100, 40, 100, 0, 2)
@ -8953,7 +9067,8 @@ export function initMoves() {
.attr(RemoveArenaTrapAttr),
new StatusMove(Moves.SWEET_SCENT, Type.NORMAL, 100, 20, -1, 0, 2)
.attr(StatStageChangeAttr, [ Stat.EVA ], -2)
.target(MoveTarget.ALL_NEAR_ENEMIES),
.target(MoveTarget.ALL_NEAR_ENEMIES)
.reflectable(),
new AttackMove(Moves.IRON_TAIL, Type.STEEL, MoveCategory.PHYSICAL, 100, 75, 15, 30, 0, 2)
.attr(StatStageChangeAttr, [ Stat.DEF ], -1),
new AttackMove(Moves.METAL_CLAW, Type.STEEL, MoveCategory.PHYSICAL, 50, 95, 35, 10, 0, 2)
@ -9041,12 +9156,15 @@ export function initMoves() {
new StatusMove(Moves.TORMENT, Type.DARK, 100, 15, -1, 0, 3)
.ignoresSubstitute()
.edgeCase() // Incomplete implementation because of Uproar's partial implementation
.attr(AddBattlerTagAttr, BattlerTagType.TORMENT, false, true, 1),
.attr(AddBattlerTagAttr, BattlerTagType.TORMENT, false, true, 1)
.reflectable(),
new StatusMove(Moves.FLATTER, Type.DARK, 100, 15, -1, 0, 3)
.attr(StatStageChangeAttr, [ Stat.SPATK ], 1)
.attr(ConfuseAttr),
.attr(ConfuseAttr)
.reflectable(),
new StatusMove(Moves.WILL_O_WISP, Type.FIRE, 85, 15, -1, 0, 3)
.attr(StatusEffectAttr, StatusEffect.BURN),
.attr(StatusEffectAttr, StatusEffect.BURN)
.reflectable(),
new StatusMove(Moves.MEMENTO, Type.DARK, 100, 10, -1, 0, 3)
.attr(SacrificialAttrOnHit)
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -2),
@ -9070,7 +9188,8 @@ export function initMoves() {
.attr(AddBattlerTagAttr, BattlerTagType.CHARGED, true, false),
new StatusMove(Moves.TAUNT, Type.DARK, 100, 20, -1, 0, 3)
.ignoresSubstitute()
.attr(AddBattlerTagAttr, BattlerTagType.TAUNT, false, true, 4),
.attr(AddBattlerTagAttr, BattlerTagType.TAUNT, false, true, 4)
.reflectable(),
new StatusMove(Moves.HELPING_HAND, Type.NORMAL, -1, 20, -1, 5, 3)
.attr(AddBattlerTagAttr, BattlerTagType.HELPING_HAND)
.ignoresSubstitute()
@ -9093,7 +9212,12 @@ export function initMoves() {
new AttackMove(Moves.SUPERPOWER, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 3)
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1, true),
new SelfStatusMove(Moves.MAGIC_COAT, Type.PSYCHIC, -1, 15, -1, 4, 3)
.unimplemented(),
.attr(AddBattlerTagAttr, BattlerTagType.MAGIC_COAT, true, true, 0)
.condition(failIfLastCondition)
// Interactions with stomping tantrum, instruct, and other moves that
// rely on move history
// Also will not reflect roar / whirlwind if the target has ForceSwitchOutImmunityAbAttr
.edgeCase(),
new SelfStatusMove(Moves.RECYCLE, Type.NORMAL, -1, 10, -1, 0, 3)
.unimplemented(),
new AttackMove(Moves.REVENGE, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 3)
@ -9102,7 +9226,8 @@ export function initMoves() {
.attr(RemoveScreensAttr),
new StatusMove(Moves.YAWN, Type.NORMAL, -1, 10, -1, 0, 3)
.attr(AddBattlerTagAttr, BattlerTagType.DROWSY, false, true)
.condition((user, target, move) => !target.status && !target.isSafeguarded(user)),
.condition((user, target, move) => !target.status && !target.isSafeguarded(user))
.reflectable(),
new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3)
.attr(MovePowerMultiplierAttr, (user, target, move) => target.getHeldItems().filter(i => i.isTransferable).length > 0 ? 1.5 : 1)
.attr(RemoveHeldItemAttr, false),
@ -9146,7 +9271,8 @@ export function initMoves() {
.ballBombMove(),
new StatusMove(Moves.FEATHER_DANCE, Type.FLYING, 100, 15, -1, 0, 3)
.attr(StatStageChangeAttr, [ Stat.ATK ], -2)
.danceMove(),
.danceMove()
.reflectable(),
new StatusMove(Moves.TEETER_DANCE, Type.NORMAL, 100, 20, -1, 0, 3)
.attr(ConfuseAttr)
.danceMove()
@ -9192,7 +9318,8 @@ export function initMoves() {
.attr(PartyStatusCureAttr, i18next.t("moveTriggers:soothingAromaWaftedThroughArea"), Abilities.SAP_SIPPER)
.target(MoveTarget.PARTY),
new StatusMove(Moves.FAKE_TEARS, Type.DARK, 100, 20, -1, 0, 3)
.attr(StatStageChangeAttr, [ Stat.SPDEF ], -2),
.attr(StatStageChangeAttr, [ Stat.SPDEF ], -2)
.reflectable(),
new AttackMove(Moves.AIR_CUTTER, Type.FLYING, MoveCategory.SPECIAL, 60, 95, 25, -1, 0, 3)
.attr(HighCritAttr)
.slicingMove()
@ -9203,7 +9330,8 @@ export function initMoves() {
.attr(HealStatusEffectAttr, true, StatusEffect.FREEZE),
new StatusMove(Moves.ODOR_SLEUTH, Type.NORMAL, -1, 40, -1, 0, 3)
.attr(ExposedMoveAttr, BattlerTagType.IGNORE_GHOST)
.ignoresSubstitute(),
.ignoresSubstitute()
.reflectable(),
new AttackMove(Moves.ROCK_TOMB, Type.ROCK, MoveCategory.PHYSICAL, 60, 95, 15, 100, 0, 3)
.attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.makesContact(false),
@ -9212,12 +9340,15 @@ export function initMoves() {
.windMove(),
new StatusMove(Moves.METAL_SOUND, Type.STEEL, 85, 40, -1, 0, 3)
.attr(StatStageChangeAttr, [ Stat.SPDEF ], -2)
.soundBased(),
.soundBased()
.reflectable(),
new StatusMove(Moves.GRASS_WHISTLE, Type.GRASS, 55, 15, -1, 0, 3)
.attr(StatusEffectAttr, StatusEffect.SLEEP)
.soundBased(),
.soundBased()
.reflectable(),
new StatusMove(Moves.TICKLE, Type.NORMAL, 100, 20, -1, 0, 3)
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1),
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1)
.reflectable(),
new SelfStatusMove(Moves.COSMIC_POWER, Type.PSYCHIC, -1, 20, -1, 0, 3)
.attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, true),
new AttackMove(Moves.WATER_SPOUT, Type.WATER, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 3)
@ -9255,7 +9386,8 @@ export function initMoves() {
.attr(StatStageChangeAttr, [ Stat.DEF ], 2, true),
new StatusMove(Moves.BLOCK, Type.NORMAL, -1, 5, -1, 0, 3)
.condition(failIfGhostTypeCondition)
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1),
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1)
.reflectable(),
new StatusMove(Moves.HOWL, Type.NORMAL, -1, 40, -1, 0, 3)
.attr(StatStageChangeAttr, [ Stat.ATK ], 1)
.soundBased()
@ -9318,7 +9450,8 @@ export function initMoves() {
.target(MoveTarget.BOTH_SIDES),
new StatusMove(Moves.MIRACLE_EYE, Type.PSYCHIC, -1, 40, -1, 0, 4)
.attr(ExposedMoveAttr, BattlerTagType.IGNORE_DARK)
.ignoresSubstitute(),
.ignoresSubstitute()
.reflectable(),
new AttackMove(Moves.WAKE_UP_SLAP, Type.FIGHTING, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 4)
.attr(MovePowerMultiplierAttr, (user, target, move) => targetSleptOrComatoseCondition(user, target, move) ? 2 : 1)
.attr(HealStatusEffectAttr, false, StatusEffect.SLEEP),
@ -9330,7 +9463,8 @@ export function initMoves() {
.ballBombMove(),
new SelfStatusMove(Moves.HEALING_WISH, Type.PSYCHIC, -1, 10, -1, 0, 4)
.attr(SacrificialFullRestoreAttr, false, "moveTriggers:sacrificialFullRestore")
.triageMove(),
.triageMove()
.condition(failIfLastInPartyCondition),
new AttackMove(Moves.BRINE, Type.WATER, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 4)
.attr(MovePowerMultiplierAttr, (user, target, move) => target.getHpRatio() < 0.5 ? 2 : 1),
new AttackMove(Moves.NATURAL_GIFT, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 4)
@ -9364,6 +9498,7 @@ export function initMoves() {
new AttackMove(Moves.ASSURANCE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 4)
.attr(MovePowerMultiplierAttr, (user, target, move) => target.turnData.damageTaken > 0 ? 2 : 1),
new StatusMove(Moves.EMBARGO, Type.DARK, 100, 15, -1, 0, 4)
.reflectable()
.unimplemented(),
new AttackMove(Moves.FLING, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4)
.makesContact(false)
@ -9383,14 +9518,16 @@ export function initMoves() {
.attr(LessPPMorePowerAttr),
new StatusMove(Moves.HEAL_BLOCK, Type.PSYCHIC, 100, 15, -1, 0, 4)
.attr(AddBattlerTagAttr, BattlerTagType.HEAL_BLOCK, false, true, 5)
.target(MoveTarget.ALL_NEAR_ENEMIES),
.target(MoveTarget.ALL_NEAR_ENEMIES)
.reflectable(),
new AttackMove(Moves.WRING_OUT, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 4)
.attr(OpponentHighHpPowerAttr, 120)
.makesContact(),
new SelfStatusMove(Moves.POWER_TRICK, Type.PSYCHIC, -1, 10, -1, 0, 4)
.attr(AddBattlerTagAttr, BattlerTagType.POWER_TRICK, true),
new StatusMove(Moves.GASTRO_ACID, Type.POISON, 100, 10, -1, 0, 4)
.attr(SuppressAbilitiesAttr),
.attr(SuppressAbilitiesAttr)
.reflectable(),
new StatusMove(Moves.LUCKY_CHANT, Type.NORMAL, -1, 30, -1, 0, 4)
.attr(AddArenaTagAttr, ArenaTagType.NO_CRIT, 5, true, true)
.target(MoveTarget.USER_SIDE),
@ -9412,12 +9549,14 @@ export function initMoves() {
new AttackMove(Moves.LAST_RESORT, Type.NORMAL, MoveCategory.PHYSICAL, 140, 100, 5, -1, 0, 4)
.attr(LastResortAttr),
new StatusMove(Moves.WORRY_SEED, Type.GRASS, 100, 10, -1, 0, 4)
.attr(AbilityChangeAttr, Abilities.INSOMNIA),
.attr(AbilityChangeAttr, Abilities.INSOMNIA)
.reflectable(),
new AttackMove(Moves.SUCKER_PUNCH, Type.DARK, MoveCategory.PHYSICAL, 70, 100, 5, -1, 1, 4)
.condition((user, target, move) => globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct?
new StatusMove(Moves.TOXIC_SPIKES, Type.POISON, -1, 20, -1, 0, 4)
.attr(AddArenaTrapTagAttr, ArenaTagType.TOXIC_SPIKES)
.target(MoveTarget.ENEMY_SIDE),
.target(MoveTarget.ENEMY_SIDE)
.reflectable(),
new StatusMove(Moves.HEART_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 4)
.attr(SwapStatStagesAttr, BATTLE_STATS)
.ignoresSubstitute(),
@ -9529,7 +9668,8 @@ export function initMoves() {
.attr(ClearTerrainAttr)
.attr(RemoveScreensAttr, false)
.attr(RemoveArenaTrapAttr, true)
.attr(RemoveArenaTagsAttr, [ ArenaTagType.MIST, ArenaTagType.SAFEGUARD ], false),
.attr(RemoveArenaTagsAttr, [ ArenaTagType.MIST, ArenaTagType.SAFEGUARD ], false)
.reflectable(),
new StatusMove(Moves.TRICK_ROOM, Type.PSYCHIC, -1, 5, -1, -7, 4)
.attr(AddArenaTagAttr, ArenaTagType.TRICK_ROOM, 5)
.ignoresProtect()
@ -9567,10 +9707,12 @@ export function initMoves() {
new StatusMove(Moves.CAPTIVATE, Type.NORMAL, 100, 20, -1, 0, 4)
.attr(StatStageChangeAttr, [ Stat.SPATK ], -2)
.condition((user, target, move) => target.isOppositeGender(user))
.target(MoveTarget.ALL_NEAR_ENEMIES),
.target(MoveTarget.ALL_NEAR_ENEMIES)
.reflectable(),
new StatusMove(Moves.STEALTH_ROCK, Type.ROCK, -1, 20, -1, 0, 4)
.attr(AddArenaTrapTagAttr, ArenaTagType.STEALTH_ROCK)
.target(MoveTarget.ENEMY_SIDE),
.target(MoveTarget.ENEMY_SIDE)
.reflectable(),
new AttackMove(Moves.GRASS_KNOT, Type.GRASS, MoveCategory.SPECIAL, -1, 100, 20, -1, 0, 4)
.attr(WeightPowerAttr)
.makesContact(),
@ -9607,14 +9749,16 @@ export function initMoves() {
new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4)
.attr(SacrificialFullRestoreAttr, true, "moveTriggers:lunarDanceRestore")
.danceMove()
.triageMove(),
.triageMove()
.condition(failIfLastInPartyCondition),
new AttackMove(Moves.CRUSH_GRIP, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4)
.attr(OpponentHighHpPowerAttr, 120),
new AttackMove(Moves.MAGMA_STORM, Type.FIRE, MoveCategory.SPECIAL, 100, 75, 5, -1, 0, 4)
.attr(TrapAttr, BattlerTagType.MAGMA_STORM),
new StatusMove(Moves.DARK_VOID, Type.DARK, 80, 10, -1, 0, 4) //Accuracy from Generations 4-6
.attr(StatusEffectAttr, StatusEffect.SLEEP)
.target(MoveTarget.ALL_NEAR_ENEMIES),
.target(MoveTarget.ALL_NEAR_ENEMIES)
.reflectable(),
new AttackMove(Moves.SEED_FLARE, Type.GRASS, MoveCategory.SPECIAL, 120, 85, 5, 40, 0, 4)
.attr(StatStageChangeAttr, [ Stat.SPDEF ], -2),
new AttackMove(Moves.OMINOUS_WIND, Type.GHOST, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 4)
@ -9654,7 +9798,8 @@ export function initMoves() {
.condition((_user, target, _move) => !(target.species.speciesId === Species.GENGAR && target.getFormKey() === "mega"))
.condition((_user, target, _move) => Utils.isNullOrUndefined(target.getTag(BattlerTagType.INGRAIN)) && Utils.isNullOrUndefined(target.getTag(BattlerTagType.IGNORE_FLYING)))
.attr(AddBattlerTagAttr, BattlerTagType.TELEKINESIS, false, true, 3)
.attr(AddBattlerTagAttr, BattlerTagType.FLOATING, false, true, 3),
.attr(AddBattlerTagAttr, BattlerTagType.FLOATING, false, true, 3)
.reflectable(),
new StatusMove(Moves.MAGIC_ROOM, Type.PSYCHIC, -1, 10, -1, 0, 5)
.ignoresProtect()
.target(MoveTarget.BOTH_SIDES)
@ -9687,7 +9832,8 @@ export function initMoves() {
.attr(ElectroBallPowerAttr)
.ballBombMove(),
new StatusMove(Moves.SOAK, Type.WATER, 100, 20, -1, 0, 5)
.attr(ChangeTypeAttr, Type.WATER),
.attr(ChangeTypeAttr, Type.WATER)
.reflectable(),
new AttackMove(Moves.FLAME_CHARGE, Type.FIRE, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 5)
.attr(StatStageChangeAttr, [ Stat.SPD ], 1, true),
new SelfStatusMove(Moves.COIL, Type.POISON, -1, 20, -1, 0, 5)
@ -9700,9 +9846,11 @@ export function initMoves() {
new AttackMove(Moves.FOUL_PLAY, Type.DARK, MoveCategory.PHYSICAL, 95, 100, 15, -1, 0, 5)
.attr(TargetAtkUserAtkAttr),
new StatusMove(Moves.SIMPLE_BEAM, Type.NORMAL, 100, 15, -1, 0, 5)
.attr(AbilityChangeAttr, Abilities.SIMPLE),
.attr(AbilityChangeAttr, Abilities.SIMPLE)
.reflectable(),
new StatusMove(Moves.ENTRAINMENT, Type.NORMAL, 100, 15, -1, 0, 5)
.attr(AbilityGiveAttr),
.attr(AbilityGiveAttr)
.reflectable(),
new StatusMove(Moves.AFTER_YOU, Type.NORMAL, -1, 15, -1, 0, 5)
.ignoresProtect()
.ignoresSubstitute()
@ -9740,7 +9888,8 @@ export function initMoves() {
new StatusMove(Moves.HEAL_PULSE, Type.PSYCHIC, -1, 10, -1, 0, 5)
.attr(HealAttr, 0.5, false, false)
.pulseMove()
.triageMove(),
.triageMove()
.reflectable(),
new AttackMove(Moves.HEX, Type.GHOST, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5)
.attr(
MovePowerMultiplierAttr,
@ -9943,7 +10092,8 @@ export function initMoves() {
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, { condition: (user, target, move) => target.isOfType(Type.GRASS) && target.isGrounded() }),
new StatusMove(Moves.STICKY_WEB, Type.BUG, -1, 20, -1, 0, 6)
.attr(AddArenaTrapTagAttr, ArenaTagType.STICKY_WEB)
.target(MoveTarget.ENEMY_SIDE),
.target(MoveTarget.ENEMY_SIDE)
.reflectable(),
new AttackMove(Moves.FELL_STINGER, Type.BUG, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 6)
.attr(PostVictoryStatStageChangeAttr, [ Stat.ATK ], 3, true ),
new ChargingAttackMove(Moves.PHANTOM_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6)
@ -9951,10 +10101,12 @@ export function initMoves() {
.chargeAttr(SemiInvulnerableAttr, BattlerTagType.HIDDEN)
.ignoresProtect(),
new StatusMove(Moves.TRICK_OR_TREAT, Type.GHOST, 100, 20, -1, 0, 6)
.attr(AddTypeAttr, Type.GHOST),
.attr(AddTypeAttr, Type.GHOST)
.reflectable(),
new StatusMove(Moves.NOBLE_ROAR, Type.NORMAL, 100, 30, -1, 0, 6)
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1)
.soundBased(),
.soundBased()
.reflectable(),
new StatusMove(Moves.ION_DELUGE, Type.ELECTRIC, -1, 25, -1, 1, 6)
.attr(AddArenaTagAttr, ArenaTagType.ION_DELUGE)
.target(MoveTarget.BOTH_SIDES),
@ -9963,7 +10115,8 @@ export function initMoves() {
.target(MoveTarget.ALL_NEAR_OTHERS)
.triageMove(),
new StatusMove(Moves.FORESTS_CURSE, Type.GRASS, 100, 20, -1, 0, 6)
.attr(AddTypeAttr, Type.GRASS),
.attr(AddTypeAttr, Type.GRASS)
.reflectable(),
new AttackMove(Moves.PETAL_BLIZZARD, Type.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 6)
.windMove()
.makesContact(false)
@ -9977,9 +10130,11 @@ export function initMoves() {
new StatusMove(Moves.PARTING_SHOT, Type.DARK, 100, 20, -1, 0, 6)
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, false, { trigger: MoveEffectTrigger.PRE_APPLY })
.attr(ForceSwitchOutAttr, true)
.soundBased(),
.soundBased()
.reflectable(),
new StatusMove(Moves.TOPSY_TURVY, Type.DARK, -1, 20, -1, 0, 6)
.attr(InvertStatsAttr),
.attr(InvertStatsAttr)
.reflectable(),
new AttackMove(Moves.DRAINING_KISS, Type.FAIRY, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 6)
.attr(HitHealAttr, 0.75)
.makesContact()
@ -10018,10 +10173,12 @@ export function initMoves() {
.condition(failIfLastCondition),
new StatusMove(Moves.PLAY_NICE, Type.NORMAL, -1, 20, -1, 0, 6)
.attr(StatStageChangeAttr, [ Stat.ATK ], -1)
.ignoresSubstitute(),
.ignoresSubstitute()
.reflectable(),
new StatusMove(Moves.CONFIDE, Type.NORMAL, -1, 20, -1, 0, 6)
.attr(StatStageChangeAttr, [ Stat.SPATK ], -1)
.soundBased(),
.soundBased()
.reflectable(),
new AttackMove(Moves.DIAMOND_STORM, Type.ROCK, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 6)
.attr(StatStageChangeAttr, [ Stat.DEF ], 2, true, { firstTargetOnly: true })
.makesContact(false)
@ -10048,14 +10205,17 @@ export function initMoves() {
.condition(failIfSingleBattle)
.target(MoveTarget.NEAR_ALLY),
new StatusMove(Moves.EERIE_IMPULSE, Type.ELECTRIC, 100, 15, -1, 0, 6)
.attr(StatStageChangeAttr, [ Stat.SPATK ], -2),
.attr(StatStageChangeAttr, [ Stat.SPATK ], -2)
.reflectable(),
new StatusMove(Moves.VENOM_DRENCH, Type.POISON, 100, 20, -1, 0, 6)
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], -1, false, { condition: (user, target, move) => target.status?.effect === StatusEffect.POISON || target.status?.effect === StatusEffect.TOXIC })
.target(MoveTarget.ALL_NEAR_ENEMIES),
.target(MoveTarget.ALL_NEAR_ENEMIES)
.reflectable(),
new StatusMove(Moves.POWDER, Type.BUG, 100, 20, -1, 1, 6)
.attr(AddBattlerTagAttr, BattlerTagType.POWDER, false, true)
.ignoresSubstitute()
.powderMove(),
.powderMove()
.reflectable(),
new ChargingSelfStatusMove(Moves.GEOMANCY, Type.FAIRY, -1, 10, -1, 0, 6)
.chargeText(i18next.t("moveTriggers:isChargingPower", { pokemonName: "{USER}" }))
.attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true),
@ -10077,7 +10237,8 @@ export function initMoves() {
.ignoresSubstitute()
.target(MoveTarget.NEAR_ALLY),
new StatusMove(Moves.BABY_DOLL_EYES, Type.FAIRY, 100, 30, -1, 1, 6)
.attr(StatStageChangeAttr, [ Stat.ATK ], -1),
.attr(StatStageChangeAttr, [ Stat.ATK ], -1)
.reflectable(),
new AttackMove(Moves.NUZZLE, Type.ELECTRIC, MoveCategory.PHYSICAL, 20, 100, 20, 100, 0, 6)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS),
new AttackMove(Moves.HOLD_BACK, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 6)
@ -10221,13 +10382,15 @@ export function initMoves() {
.punchingMove(),
new StatusMove(Moves.FLORAL_HEALING, Type.FAIRY, -1, 10, -1, 0, 7)
.attr(BoostHealAttr, 0.5, 2 / 3, true, false, (user, target, move) => globalScene.arena.terrain?.terrainType === TerrainType.GRASSY)
.triageMove(),
.triageMove()
.reflectable(),
new AttackMove(Moves.HIGH_HORSEPOWER, Type.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7),
new StatusMove(Moves.STRENGTH_SAP, Type.GRASS, 100, 10, -1, 0, 7)
.attr(HitHealAttr, null, Stat.ATK)
.attr(StatStageChangeAttr, [ Stat.ATK ], -1)
.condition((user, target, move) => target.getStatStage(Stat.ATK) > -6)
.triageMove(),
.triageMove()
.reflectable(),
new ChargingAttackMove(Moves.SOLAR_BLADE, Type.GRASS, MoveCategory.PHYSICAL, 125, 100, 10, -1, 0, 7)
.chargeText(i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" }))
.chargeAttr(WeatherInstantChargeAttr, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ])
@ -10237,10 +10400,12 @@ export function initMoves() {
.makesContact(false),
new StatusMove(Moves.SPOTLIGHT, Type.NORMAL, -1, 15, -1, 3, 7)
.attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, false)
.condition(failIfSingleBattle),
.condition(failIfSingleBattle)
.reflectable(),
new StatusMove(Moves.TOXIC_THREAD, Type.POISON, 100, 20, -1, 0, 7)
.attr(StatusEffectAttr, StatusEffect.POISON)
.attr(StatStageChangeAttr, [ Stat.SPD ], -1),
.attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.reflectable(),
new SelfStatusMove(Moves.LASER_FOCUS, Type.NORMAL, -1, 30, -1, 0, 7)
.attr(AddBattlerTagAttr, BattlerTagType.ALWAYS_CRIT, true, false),
new StatusMove(Moves.GEAR_UP, Type.STEEL, -1, 20, -1, 0, 7)
@ -10284,7 +10449,8 @@ export function initMoves() {
(user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(target.status?.effect!)) // TODO: is this bang correct?
.attr(HealAttr, 0.5)
.attr(HealStatusEffectAttr, false, getNonVolatileStatusEffects())
.triageMove(),
.triageMove()
.reflectable(),
new AttackMove(Moves.REVELATION_DANCE, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7)
.danceMove()
.attr(MatchUserTypeAttr),
@ -10366,14 +10532,15 @@ export function initMoves() {
new AttackMove(Moves.PRISMATIC_LASER, Type.PSYCHIC, MoveCategory.SPECIAL, 160, 100, 10, -1, 0, 7)
.attr(RechargeAttr),
new AttackMove(Moves.SPECTRAL_THIEF, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 7)
.ignoresSubstitute()
.partial(), // Does not steal stats
.attr(SpectralThiefAttr)
.ignoresSubstitute(),
new AttackMove(Moves.SUNSTEEL_STRIKE, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 7)
.ignoresAbilities(),
new AttackMove(Moves.MOONGEIST_BEAM, Type.GHOST, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7)
.ignoresAbilities(),
new StatusMove(Moves.TEARFUL_LOOK, Type.NORMAL, -1, 20, -1, 0, 7)
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1),
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1)
.reflectable(),
new AttackMove(Moves.ZING_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 7)
.attr(FlinchAttr),
new AttackMove(Moves.NATURES_MADNESS, Type.FAIRY, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 7)
@ -10492,10 +10659,12 @@ export function initMoves() {
.condition((user, target, move) => user.getTag(TrappedTag)?.sourceMove !== Moves.NO_RETREAT), // fails if the user is currently trapped by No Retreat
new StatusMove(Moves.TAR_SHOT, Type.ROCK, 100, 15, -1, 0, 8)
.attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false),
.attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false)
.reflectable(),
new StatusMove(Moves.MAGIC_POWDER, Type.PSYCHIC, 100, 20, -1, 0, 8)
.attr(ChangeTypeAttr, Type.PSYCHIC)
.powderMove(),
.powderMove()
.reflectable(),
new AttackMove(Moves.DRAGON_DARTS, Type.DRAGON, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 8)
.attr(MultiHitAttr, MultiHitType._2)
.makesContact(false)
@ -10672,6 +10841,7 @@ export function initMoves() {
.makesContact(false),
new StatusMove(Moves.CORROSIVE_GAS, Type.POISON, 100, 40, -1, 0, 8)
.target(MoveTarget.ALL_NEAR_OTHERS)
.reflectable()
.unimplemented(),
new StatusMove(Moves.COACHING, Type.FIGHTING, -1, 10, -1, 0, 8)
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], 1)
@ -10916,8 +11086,7 @@ export function initMoves() {
.attr(ConfuseAttr)
.recklessMove(),
new AttackMove(Moves.LAST_RESPECTS, Type.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9)
.partial() // Counter resets every wave instead of on arena reset
.attr(MovePowerMultiplierAttr, (user, target, move) => 1 + Math.min(user.isPlayer() ? globalScene.currentBattle.playerFaints : globalScene.currentBattle.enemyFaints, 100))
.attr(MovePowerMultiplierAttr, (user, target, move) => 1 + Math.min(user.isPlayer() ? globalScene.arena.playerFaints : globalScene.currentBattle.enemyFaints, 100))
.makesContact(false),
new AttackMove(Moves.LUMINA_CRASH, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9)
.attr(StatStageChangeAttr, [ Stat.SPDEF ], -2),

View File

@ -315,7 +315,7 @@ async function summonSafariPokemon() {
const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier);
if (ivScannerModifier) {
globalScene.pushPhase(new ScanIvsPhase(pokemon.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)));
globalScene.pushPhase(new ScanIvsPhase(pokemon.getBattlerIndex()));
}
}

View File

@ -7,7 +7,7 @@ import i18next from "i18next";
import type { AnySound } from "#app/battle-scene";
import { globalScene } from "#app/global-scene";
import type { GameMode } from "#app/game-mode";
import type { StarterMoveset } from "#app/system/game-data";
import { DexAttr, type StarterMoveset } from "#app/system/game-data";
import * as Utils from "#app/utils";
import { uncatchableSpecies } from "#app/data/balance/biomes";
import { speciesEggMoves } from "#app/data/balance/egg-moves";
@ -32,6 +32,37 @@ export enum Region {
PALDEA
}
// TODO: this is horrible and will need to be removed once a refactor/cleanup of forms is executed.
export const normalForm: Species[] = [
Species.PIKACHU,
Species.RAICHU,
Species.EEVEE,
Species.JOLTEON,
Species.FLAREON,
Species.VAPOREON,
Species.ESPEON,
Species.UMBREON,
Species.LEAFEON,
Species.GLACEON,
Species.SYLVEON,
Species.PICHU,
Species.ROTOM,
Species.DIALGA,
Species.PALKIA,
Species.KYUREM,
Species.GENESECT,
Species.FROAKIE,
Species.FROGADIER,
Species.GRENINJA,
Species.ROCKRUFF,
Species.NECROZMA,
Species.MAGEARNA,
Species.MARSHADOW,
Species.CRAMORANT,
Species.ZARUDE,
Species.CALYREX
];
/**
* Gets the {@linkcode PokemonSpecies} object associated with the {@linkcode Species} enum given
* @param species The species to fetch
@ -690,6 +721,56 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
return this.name;
}
/**
* Find the name of species with proper attachments for regionals and separate starter forms (Floette, Ursaluna)
* @returns a string with the region name or other form name attached
*/
getExpandedSpeciesName(): string {
if (this.speciesId < 2000) {
return this.name; // Other special cases could be put here too
} else { // Everything beyond this point essentially follows the pattern of FORMNAME_SPECIES
return i18next.t(`pokemonForm:appendForm.${Species[this.speciesId].split("_")[0]}`, { pokemonName: this.name });
}
}
/**
* Find the form name for species with just one form (regional variants, Floette, Ursaluna)
* @param formIndex The form index to check (defaults to 0)
* @param append Whether to append the species name to the end (defaults to false)
* @returns the pokemon-form locale key for the single form name ("Alolan Form", "Eternal Flower" etc)
*/
getFormNameToDisplay(formIndex: number = 0, append: boolean = false): string {
const formKey = this.forms?.[formIndex!]?.formKey;
const formText = Utils.capitalizeString(formKey, "-", false, false) || "";
const speciesName = Utils.capitalizeString(Species[this.speciesId], "_", true, false);
let ret: string = "";
const region = this.getRegion();
if (this.speciesId === Species.ARCEUS) {
ret = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`);
} else if ([ SpeciesFormKey.MEGA, SpeciesFormKey.MEGA_X, SpeciesFormKey.MEGA_Y, SpeciesFormKey.PRIMAL, SpeciesFormKey.GIGANTAMAX, SpeciesFormKey.GIGANTAMAX_RAPID, SpeciesFormKey.GIGANTAMAX_SINGLE, SpeciesFormKey.ETERNAMAX ].includes(formKey as SpeciesFormKey)) {
return i18next.t(`battlePokemonForm:${formKey}`, { pokemonName: (append ? this.name : "") });
} else if (region === Region.NORMAL || (this.speciesId === Species.GALAR_DARMANITAN && formIndex > 0) || this.speciesId === Species.PALDEA_TAUROS) { // More special cases can be added here
const i18key = `pokemonForm:${speciesName}${formText}`;
if (i18next.exists(i18key)) {
ret = i18next.t(i18key);
} else {
const rootSpeciesName = Utils.capitalizeString(Species[this.getRootSpeciesId()], "_", true, false);
const i18RootKey = `pokemonForm:${rootSpeciesName}${formText}`;
ret = i18next.exists(i18RootKey) ? i18next.t(i18RootKey) : formText;
}
} else if (append) { // Everything beyond this has an expanded name
return this.getExpandedSpeciesName();
} else if (this.speciesId === Species.ETERNAL_FLOETTE) { // Not a real form, so the key is made up
return i18next.t("pokemonForm:floetteEternalFlower");
} else if (this.speciesId === Species.BLOODMOON_URSALUNA) { // Not a real form, so the key is made up
return i18next.t("pokemonForm:ursalunaBloodmoon");
} else { // Only regional forms should be left at this point
return i18next.t(`pokemonForm:regionalForm.${Region[region]}`);
}
return append ? i18next.t("pokemonForm:appendForm.GENERIC", { pokemonName: this.name, formName: ret }) : ret;
}
localize(): void {
this.name = i18next.t(`pokemon:${Species[this.speciesId].toLowerCase()}`);
}
@ -947,25 +1028,55 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
? this.forms[formIndex || 0].getFormSpriteKey()
: "";
}
/**
* Generates a {@linkcode bigint} corresponding to the maximum unlocks possible for this species,
* taking into account if the species has a male/female gender, and which variants are implemented.
* @returns {@linkcode bigint} Maximum unlocks, can be compared with {@linkcode DexEntry.caughtAttr}.
*/
getFullUnlocksData(): bigint {
let caughtAttr: bigint = 0n;
caughtAttr += DexAttr.NON_SHINY;
caughtAttr += DexAttr.SHINY;
if (this.malePercent !== null) {
if (this.malePercent > 0) {
caughtAttr += DexAttr.MALE;
}
if (this.malePercent < 100) {
caughtAttr += DexAttr.FEMALE;
}
}
caughtAttr += DexAttr.DEFAULT_VARIANT;
if (this.hasVariants()) {
caughtAttr += DexAttr.VARIANT_2;
caughtAttr += DexAttr.VARIANT_3;
}
caughtAttr += DexAttr.DEFAULT_FORM;
return caughtAttr;
}
}
export class PokemonForm extends PokemonSpeciesForm {
public formName: string;
public formKey: string;
public formSpriteKey: string | null;
public isUnobtainable: boolean;
// This is a collection of form keys that have in-run form changes, but should still be separately selectable from the start screen
private starterSelectableKeys: string[] = [ "10", "50", "10-pc", "50-pc", "red", "orange", "yellow", "green", "blue", "indigo", "violet" ];
constructor(formName: string, formKey: string, type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities,
baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number,
catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean = false, formSpriteKey: string | null = null, isStarterSelectable: boolean = false
catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean = false, formSpriteKey: string | null = null, isStarterSelectable: boolean = false,
isUnobtainable: boolean = false
) {
super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd,
catchRate, baseFriendship, baseExp, genderDiffs, (isStarterSelectable || !formKey));
this.formName = formName;
this.formKey = formKey;
this.formSpriteKey = formSpriteKey;
this.isUnobtainable = isUnobtainable;
}
getFormSpriteKey(_formIndex?: number) {
@ -1762,7 +1873,7 @@ export function initSpecies() {
new PokemonForm("Dragon", "dragon", Type.DRAGON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360),
new PokemonForm("Dark", "dark", Type.DARK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360),
new PokemonForm("Fairy", "fairy", Type.FAIRY, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360),
new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360),
new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, false, true),
),
new PokemonSpecies(Species.VICTINI, 5, false, false, true, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, Abilities.VICTORY_STAR, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false),
new PokemonSpecies(Species.SNIVY, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.6, 8.1, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false),
@ -2316,7 +2427,7 @@ export function initSpecies() {
),
new PokemonSpecies(Species.MARSHADOW, 7, false, false, true, "Gloomdweller Pokémon", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false, true,
new PokemonForm("Normal", "", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, true),
new PokemonForm("Zenith", "zenith", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300)
new PokemonForm("Zenith", "zenith", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, false, true)
),
new PokemonSpecies(Species.POIPOLE, 7, true, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.6, 1.8, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 420, 67, 73, 67, 73, 67, 73, 45, 0, 210, GrowthRate.SLOW, null, false),
new PokemonSpecies(Species.NAGANADEL, 7, true, false, false, "Poison Pin Pokémon", Type.POISON, Type.DRAGON, 3.6, 150, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 540, 73, 73, 73, 127, 73, 121, 45, 0, 270, GrowthRate.SLOW, null, false),
@ -2415,11 +2526,11 @@ export function initSpecies() {
new PokemonSpecies(Species.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", Type.FIGHTING, null, 1.6, 39, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false),
new PokemonSpecies(Species.SINISTEA, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.MEDIUM_FAST, null, false, false,
new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true),
new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true),
new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true, true),
),
new PokemonSpecies(Species.POLTEAGEIST, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, GrowthRate.MEDIUM_FAST, null, false, false,
new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true),
new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true),
new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true, true),
),
new PokemonSpecies(Species.HATENNA, 8, false, false, false, "Calm Pokémon", Type.PSYCHIC, null, 0.4, 3.4, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 265, 42, 30, 45, 56, 53, 39, 235, 50, 53, GrowthRate.SLOW, 0, false),
new PokemonSpecies(Species.HATTREM, 8, false, false, false, "Serene Pokémon", Type.PSYCHIC, null, 0.6, 4.8, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 370, 57, 40, 65, 86, 73, 49, 120, 50, 130, GrowthRate.SLOW, 0, false),

View File

@ -581,107 +581,107 @@ export class TrainerConfig {
switch (team) {
case "rocket": {
return {
[TrainerPoolTier.COMMON]: [ Species.RATTATA, Species.KOFFING, Species.EKANS, Species.ZUBAT, Species.MAGIKARP, Species.HOUNDOUR, Species.ONIX, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.DROWZEE, Species.VILEPLUME ],
[TrainerPoolTier.UNCOMMON]: [ Species.PORYGON, Species.MANKEY, Species.MAGNEMITE, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO, Species.MAGBY, Species.ELEKID ],
[TrainerPoolTier.RARE]: [ Species.DRATINI, Species.LARVITAR ]
[TrainerPoolTier.COMMON]: [ Species.RATICATE, Species.ARBOK, Species.VILEPLUME, Species.ARCANINE, Species.GENGAR, Species.HYPNO, Species.ELECTRODE, Species.EXEGGUTOR, Species.CUBONE, Species.KOFFING, Species.GYARADOS, Species.CROBAT, Species.STEELIX, Species.HOUNDOOM, Species.HONCHKROW ],
[TrainerPoolTier.UNCOMMON]: [ Species.OMASTAR, Species.KABUTOPS, Species.MAGNEZONE, Species.ELECTIVIRE, Species.MAGMORTAR, Species.PORYGON_Z, Species.ANNIHILAPE, Species.ALOLA_SANDSLASH, Species.ALOLA_PERSIAN, Species.ALOLA_GOLEM, Species.ALOLA_MUK, Species.PALDEA_TAUROS ],
[TrainerPoolTier.RARE]: [ Species.DRAGONITE, Species.TYRANITAR ]
};
}
case "magma": {
return {
[TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.BALTOY, Species.ROLYCOLY, Species.GLIGAR, Species.TORKOAL, Species.HOUNDOUR, Species.MAGBY ],
[TrainerPoolTier.UNCOMMON]: [ Species.TRAPINCH, Species.SILICOBRA, Species.RHYHORN, Species.ANORITH, Species.LILEEP, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.TOEDSCOOL ],
[TrainerPoolTier.RARE]: [ Species.CAPSAKID, Species.CHARCADET ]
[TrainerPoolTier.COMMON]: [ Species.ARCANINE, Species.MAGCARGO, Species.HOUNDOOM, Species.TORKOAL, Species.SOLROCK, Species.CLAYDOL, Species.HIPPOWDON, Species.MAGMORTAR, Species.GLISCOR, Species.COALOSSAL ],
[TrainerPoolTier.UNCOMMON]: [ Species.AGGRON, Species.FLYGON, Species.CRADILY, Species.ARMALDO, Species.RHYPERIOR, Species.TURTONATOR, Species.SANDACONDA, Species.TOEDSCRUEL, Species.HISUI_ARCANINE ],
[TrainerPoolTier.RARE]: [ Species.CHARCADET, Species.SCOVILLAIN ]
};
}
case "aqua": {
return {
[TrainerPoolTier.COMMON]: [ Species.CORPHISH, Species.SPHEAL, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.LOTAD, Species.WAILMER, Species.REMORAID, Species.BARBOACH ],
[TrainerPoolTier.UNCOMMON]: [ Species.MANTYKE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.DHELMISE, Species.CLOBBOPUS, Species.FEEBAS, Species.PALDEA_WOOPER, Species.HORSEA, Species.SKRELP ],
[TrainerPoolTier.RARE]: [ Species.DONDOZO, Species.BASCULEGION ]
[TrainerPoolTier.COMMON]: [ Species.TENTACRUEL, Species.LANTURN, Species.AZUMARILL, Species.QUAGSIRE, Species.OCTILLERY, Species.LUDICOLO, Species.PELIPPER, Species.WAILORD, Species.WHISCASH, Species.CRAWDAUNT, Species.WALREIN, Species.CLAMPERL ],
[TrainerPoolTier.UNCOMMON]: [ Species.QUAGSIRE, Species.MANTINE, Species.KINGDRA, Species.MILOTIC, Species.DRAGALGE, Species.DHELMISE, Species.BARRASKEWDA, Species.GRAPPLOCT, Species.OVERQWIL ],
[TrainerPoolTier.RARE]: [ Species.BASCULEGION, Species.DONDOZO ]
};
}
case "galactic": {
return {
[TrainerPoolTier.COMMON]: [ Species.BRONZOR, Species.SWINUB, Species.YANMA, Species.LICKITUNG, Species.TANGELA, Species.MAGBY, Species.ELEKID, Species.SKORUPI, Species.ZUBAT, Species.MURKROW, Species.MAGIKARP, Species.VOLTORB ],
[TrainerPoolTier.UNCOMMON]: [ Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.DUSKULL, Species.ROTOM, Species.HISUI_VOLTORB, Species.GLIGAR, Species.ABRA ],
[TrainerPoolTier.RARE]: [ Species.URSALUNA, Species.HISUI_LILLIGANT, Species.SPIRITOMB, Species.HISUI_SNEASEL ]
[TrainerPoolTier.COMMON]: [ Species.ELECTRODE, Species.GYARADOS, Species.CROBAT, Species.HONCHKROW, Species.BRONZONG, Species.DRAPION, Species.LICKILICKY, Species.TANGROWTH, Species.ELECTIVIRE, Species.MAGMORTAR, Species.YANMEGA, Species.MAMOSWINE ],
[TrainerPoolTier.UNCOMMON]: [ Species.ALAKAZAM, Species.WEAVILE, Species.GLISCOR, Species.DUSKNOIR, Species.ROTOM, Species.OVERQWIL, Species.HISUI_ARCANINE, Species.HISUI_ELECTRODE ],
[TrainerPoolTier.RARE]: [ Species.SPIRITOMB, Species.URSALUNA, Species.SNEASLER, Species.HISUI_LILLIGANT ]
};
}
case "plasma": {
return {
[TrainerPoolTier.COMMON]: [ Species.YAMASK, Species.ROGGENROLA, Species.JOLTIK, Species.TYMPOLE, Species.FRILLISH, Species.FERROSEED, Species.SANDILE, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.CUBCHOO, Species.VANILLITE ],
[TrainerPoolTier.UNCOMMON]: [ Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK, Species.TYNAMO, Species.GALAR_DARUMAKA, Species.GOLETT, Species.MIENFOO, Species.DURANT, Species.SIGILYPH ],
[TrainerPoolTier.RARE]: [ Species.HISUI_ZORUA, Species.AXEW, Species.DEINO, Species.HISUI_BRAVIARY ]
[TrainerPoolTier.COMMON]: [ Species.GIGALITH, Species.CONKELDURR, Species.SEISMITOAD, Species.KROOKODILE, Species.DARMANITAN, Species.COFAGRIGUS, Species.VANILLUXE, Species.AMOONGUSS, Species.JELLICENT, Species.GALVANTULA, Species.FERROTHORN, Species.BEARTIC ],
[TrainerPoolTier.UNCOMMON]: [ Species.EXCADRILL, Species.SIGILYPH, Species.ZOROARK, Species.KLINKLANG, Species.EELEKTROSS, Species.MIENSHAO, Species.GOLURK, Species.BISHARP, Species.MANDIBUZZ, Species.DURANT, Species.GALAR_DARMANITAN ],
[TrainerPoolTier.RARE]: [ Species.HAXORUS, Species.HYDREIGON, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY ]
};
}
case "plasma_2": {
return {
[TrainerPoolTier.COMMON]: [ Species.MAGNEMITE, Species.GRIMER, Species.VOLTORB, Species.PORYGON, Species.BRONZOR, Species.MUNNA, Species.SOLOSIS, Species.JOLTIK, Species.FERROSEED, Species.TYNAMO, Species.ELGYEM ],
[TrainerPoolTier.UNCOMMON]: [ Species.BELDUM, Species.ROTOM, Species.TIRTOUGA, Species.ARCHEN, Species.GOLETT, Species.DURANT, Species.GRUBBIN, Species.BLIPBUG, Species.VAROOM, Species.ALOLA_GRIMER, Species.HISUI_VOLTORB ],
[TrainerPoolTier.RARE]: [ Species.ELEKID, Species.MAGBY, Species.PAWNIARD, Species.DURALUDON ]
[TrainerPoolTier.COMMON]: [ Species.MUK, Species.ELECTRODE, Species.BRONZONG, Species.MAGNEZONE, Species.PORYGON_Z, Species.MUSHARNA, Species.REUNICLUS, Species.GALVANTULA, Species.FERROTHORN, Species.EELEKTROSS, Species.BEHEEYEM ],
[TrainerPoolTier.UNCOMMON]: [ Species.METAGROSS, Species.ROTOM, Species.CARRACOSTA, Species.ARCHEOPS, Species.GOLURK, Species.DURANT, Species.VIKAVOLT, Species.ORBEETLE, Species.REVAVROOM, Species.ALOLA_MUK, Species.HISUI_ELECTRODE ],
[TrainerPoolTier.RARE]: [ Species.ELECTIVIRE, Species.MAGMORTAR, Species.BISHARP, Species.ARCHALUDON ]
};
}
case "flare": {
return {
[TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.FOONGUS, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKORUPI, Species.PURRLOIN, Species.CLAWITZER, Species.PANCHAM, Species.ESPURR, Species.BUNNELBY ],
[TrainerPoolTier.UNCOMMON]: [ Species.LITWICK, Species.SNEASEL, Species.PUMPKABOO, Species.PHANTUMP, Species.HONEDGE, Species.BINACLE, Species.HOUNDOUR, Species.SKRELP, Species.SLIGGOO ],
[TrainerPoolTier.RARE]: [ Species.NOIBAT, Species.HISUI_AVALUGG, Species.HISUI_SLIGGOO ]
[TrainerPoolTier.COMMON]: [ Species.MANECTRIC, Species.DRAPION, Species.LIEPARD, Species.AMOONGUSS, Species.DIGGERSBY, Species.TALONFLAME, Species.PYROAR, Species.PANGORO, Species.MEOWSTIC, Species.MALAMAR, Species.CLAWITZER, Species.HELIOLISK ],
[TrainerPoolTier.UNCOMMON]: [ Species.HOUNDOOM, Species.WEAVILE, Species.CHANDELURE, Species.AEGISLASH, Species.BARBARACLE, Species.DRAGALGE, Species.GOODRA, Species.TREVENANT, Species.GOURGEIST ],
[TrainerPoolTier.RARE]: [ Species.NOIVERN, Species.HISUI_GOODRA, Species.HISUI_AVALUGG ]
};
}
case "aether": {
return {
[TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU, Species.BLIPBUG, Species.GIRAFARIG, Species.ORANGURU ],
[TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.MEDITITE, Species.BELDUM, Species.HATENNA, Species.INKAY, Species.RALTS, Species.GALAR_MR_MIME ],
[TrainerPoolTier.RARE]: [ Species.ARMAROUGE, Species.HISUI_BRAVIARY, Species.PORYGON ]
[TrainerPoolTier.COMMON]: [ Species.ALAKAZAM, Species.SLOWBRO, Species.EXEGGUTOR, Species.XATU, Species.CLAYDOL, Species.BEHEEYEM, Species.ORANGURU, Species.BRUXISH, Species.ORBEETLE, Species.FARIGIRAF, Species.ALOLA_RAICHU ],
[TrainerPoolTier.UNCOMMON]: [ Species.KIRLIA, Species.MEDICHAM, Species.METAGROSS, Species.MALAMAR, Species.HATTERENE, Species.MR_RIME, Species.GALAR_SLOWKING ],
[TrainerPoolTier.RARE]: [ Species.PORYGON_Z, Species.ARMAROUGE, Species.HISUI_BRAVIARY ]
};
}
case "skull": {
return {
[TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.FOMANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING, Species.STUNKY, Species.CROAGUNK, Species.NIDORAN_F ],
[TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.SKORUPI, Species.PALDEA_WOOPER, Species.VULLABY, Species.HISUI_QWILFISH, Species.GLIMMET ],
[TrainerPoolTier.RARE]: [ Species.SKRELP, Species.HISUI_SNEASEL ]
[TrainerPoolTier.COMMON]: [ Species.NIDOQUEEN, Species.GENGAR, Species.KOFFING, Species.CROBAT, Species.ROSERADE, Species.SKUNTANK, Species.TOXICROAK, Species.SCOLIPEDE, Species.TOXAPEX, Species.LURANTIS, Species.ALOLA_MUK ],
[TrainerPoolTier.UNCOMMON]: [ Species.DRAPION, Species.MANDIBUZZ, Species.OVERQWIL, Species.GLIMMORA, Species.CLODSIRE, Species.GALAR_SLOWBRO ],
[TrainerPoolTier.RARE]: [ Species.DRAGALGE, Species.SNEASLER ]
};
}
case "macro": {
return {
[TrainerPoolTier.COMMON]: [ Species.HATENNA, Species.FEEBAS, Species.BOUNSWEET, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS, Species.VULPIX, Species.FRILLISH, Species.ODDISH, Species.SINISTEA ],
[TrainerPoolTier.UNCOMMON]: [ Species.VULLABY, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.APPLIN ],
[TrainerPoolTier.RARE]: [ Species.TINKATINK, Species.HISUI_LILLIGANT ]
[TrainerPoolTier.COMMON]: [ Species.NINETALES, Species.BELLOSSOM, Species.MILOTIC, Species.FROSLASS, Species.GOTHITELLE, Species.JELLICENT, Species.SALAZZLE, Species.TSAREENA, Species.POLTEAGEIST, Species.HATTERENE, Species.GALAR_RAPIDASH ],
[TrainerPoolTier.UNCOMMON]: [ Species.TOGEKISS, Species.MANDIBUZZ, Species.TOXAPEX, Species.APPLETUN, Species.CURSOLA, Species.ALOLA_NINETALES ],
[TrainerPoolTier.RARE]: [ Species.TINKATON, Species.HISUI_LILLIGANT ]
};
}
case "star_1": {
return {
[TrainerPoolTier.COMMON]: [ Species.MURKROW, Species.SEEDOT, Species.CACNEA, Species.STUNKY, Species.SANDILE, Species.NYMBLE, Species.MASCHIFF, Species.GALAR_ZIGZAGOON ],
[TrainerPoolTier.UNCOMMON]: [ Species.UMBREON, Species.SNEASEL, Species.CORPHISH, Species.ZORUA, Species.INKAY, Species.BOMBIRDIER ],
[TrainerPoolTier.RARE]: [ Species.DEINO, Species.SPRIGATITO ]
[TrainerPoolTier.COMMON]: [ Species.SHIFTRY, Species.CACTURNE, Species.HONCHKROW, Species.SKUNTANK, Species.KROOKODILE, Species.OBSTAGOON, Species.LOKIX, Species.MABOSSTIFF ],
[TrainerPoolTier.UNCOMMON]: [ Species.UMBREON, Species.CRAWDAUNT, Species.WEAVILE, Species.ZOROARK, Species.MALAMAR, Species.BOMBIRDIER ],
[TrainerPoolTier.RARE]: [ Species.HYDREIGON, Species.MEOWSCARADA ]
};
}
case "star_2": {
return {
[TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.HOUNDOUR, Species.NUMEL, Species.LITWICK, Species.FLETCHLING, Species.LITLEO, Species.ROLYCOLY, Species.CAPSAKID ],
[TrainerPoolTier.UNCOMMON]: [ Species.PONYTA, Species.FLAREON, Species.MAGBY, Species.TORKOAL, Species.SALANDIT, Species.TURTONATOR ],
[TrainerPoolTier.RARE]: [ Species.LARVESTA, Species.FUECOCO ]
[TrainerPoolTier.COMMON]: [ Species.ARCANINE, Species.HOUNDOOM, Species.CAMERUPT, Species.CHANDELURE, Species.TALONFLAME, Species.PYROAR, Species.COALOSSAL, Species.SCOVILLAIN ],
[TrainerPoolTier.UNCOMMON]: [ Species.RAPIDASH, Species.FLAREON, Species.TORKOAL, Species.MAGMORTAR, Species.SALAZZLE, Species.TURTONATOR ],
[TrainerPoolTier.RARE]: [ Species.VOLCARONA, Species.SKELEDIRGE ]
};
}
case "star_3": {
return {
[TrainerPoolTier.COMMON]: [ Species.ZUBAT, Species.GRIMER, Species.STUNKY, Species.FOONGUS, Species.MAREANIE, Species.TOXEL, Species.SHROODLE, Species.PALDEA_WOOPER ],
[TrainerPoolTier.UNCOMMON]: [ Species.GASTLY, Species.SEVIPER, Species.SKRELP, Species.ALOLA_GRIMER, Species.GALAR_SLOWPOKE, Species.HISUI_QWILFISH ],
[TrainerPoolTier.RARE]: [ Species.GLIMMET, Species.BULBASAUR ]
[TrainerPoolTier.COMMON]: [ Species.MUK, Species.CROBAT, Species.SKUNTANK, Species.AMOONGUSS, Species.TOXAPEX, Species.TOXTRICITY, Species.GRAFAIAI, Species.CLODSIRE ],
[TrainerPoolTier.UNCOMMON]: [ Species.GENGAR, Species.SEVIPER, Species.DRAGALGE, Species.OVERQWIL, Species.ALOLA_MUK, Species.GALAR_SLOWBRO ],
[TrainerPoolTier.RARE]: [ Species.GLIMMORA, Species.VENUSAUR ]
};
}
case "star_4": {
return {
[TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.IGGLYBUFF, Species.AZURILL, Species.COTTONEE, Species.FLABEBE, Species.HATENNA, Species.IMPIDIMP, Species.TINKATINK ],
[TrainerPoolTier.UNCOMMON]: [ Species.TOGEPI, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_VULPIX ],
[TrainerPoolTier.RARE]: [ Species.GALAR_PONYTA, Species.POPPLIO ]
[TrainerPoolTier.COMMON]: [ Species.CLEFABLE, Species.WIGGLYTUFF, Species.AZUMARILL, Species.WHIMSICOTT, Species.FLORGES, Species.HATTERENE, Species.GRIMMSNARL, Species.TINKATON ],
[TrainerPoolTier.UNCOMMON]: [ Species.TOGEKISS, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_NINETALES ],
[TrainerPoolTier.RARE]: [ Species.GALAR_RAPIDASH, Species.PRIMARINA ]
};
}
case "star_5": {
return {
[TrainerPoolTier.COMMON]: [ Species.SHROOMISH, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.SCRAGGY, Species.MIENFOO, Species.PAWMI, Species.PALDEA_TAUROS ],
[TrainerPoolTier.UNCOMMON]: [ Species.RIOLU, Species.TIMBURR, Species.HAWLUCHA, Species.PASSIMIAN, Species.FALINKS, Species.FLAMIGO ],
[TrainerPoolTier.RARE]: [ Species.JANGMO_O, Species.QUAXLY ]
[TrainerPoolTier.COMMON]: [ Species.BRELOOM, Species.HARIYAMA, Species.MEDICHAM, Species.TOXICROAK, Species.SCRAFTY, Species.MIENSHAO, Species.PAWMOT, Species.PALDEA_TAUROS ],
[TrainerPoolTier.UNCOMMON]: [ Species.LUCARIO, Species.CONKELDURR, Species.HAWLUCHA, Species.PASSIMIAN, Species.FALINKS, Species.FLAMIGO ],
[TrainerPoolTier.RARE]: [ Species.KOMMO_O, Species.QUAQUAVAL ]
};
}
}
@ -1500,9 +1500,9 @@ export const trainerConfigs: TrainerConfigs = {
),
[TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate())
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING, Species.GRIMER, Species.ODDISH, Species.SLOWPOKE ],
[TrainerPoolTier.UNCOMMON]: [ Species.GYARADOS, Species.LICKITUNG, Species.TAUROS, Species.MANKEY, Species.SCYTHER, Species.ELEKID, Species.MAGBY, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.MAGNEMITE ],
[TrainerPoolTier.RARE]: [ Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO ],
[TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.ODDISH, Species.GEODUDE, Species.SLOWPOKE, Species.GRIMER, Species.KOFFING ],
[TrainerPoolTier.UNCOMMON]: [ Species.MANKEY, Species.GROWLITHE, Species.MAGNEMITE, Species.GASTLY, Species.VOLTORB, Species.EXEGGCUTE, Species.CUBONE, Species.LICKITUNG, Species.SCYTHER, Species.TAUROS, Species.GYARADOS, Species.MURKROW, Species.ELEKID, Species.MAGBY ],
[TrainerPoolTier.RARE]: [ Species.PORYGON, Species.OMANYTE, Species.KABUTO, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GEODUDE, Species.ALOLA_GRIMER, Species.PALDEA_TAUROS ],
[TrainerPoolTier.SUPER_RARE]: [ Species.DRATINI, Species.LARVITAR ]
}),
[TrainerType.ARCHER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.HOUNDOOM ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
@ -1511,71 +1511,71 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerType.PETREL]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.WEEZING ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate())
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.GROWLITHE, Species.BALTOY ],
[TrainerPoolTier.UNCOMMON]: [ Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR, Species.RHYHORN, Species.HEATMOR ],
[TrainerPoolTier.RARE]: [ Species.TRAPINCH, Species.LILEEP, Species.ANORITH, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.TOEDSCOOL ],
[TrainerPoolTier.SUPER_RARE]: [ Species.CAPSAKID, Species.CHARCADET ]
[TrainerPoolTier.COMMON]: [ Species.DIGLETT, Species.GROWLITHE, Species.SLUGMA, Species.MAGBY, Species.POOCHYENA, Species.ZIGZAGOON, Species.NUMEL, Species.TORKOAL, Species.BALTOY ],
[TrainerPoolTier.UNCOMMON]: [ Species.RHYHORN, Species.GLIGAR, Species.PHANPY, Species.SOLROCK, Species.HIPPOPOTAS, Species.HEATMOR, Species.ROLYCOLY, Species.SILICOBRA ],
[TrainerPoolTier.RARE]: [ Species.ARON, Species.TRAPINCH, Species.LILEEP, Species.ANORITH, Species.TURTONATOR, Species.TOEDSCOOL, Species.HISUI_GROWLITHE ],
[TrainerPoolTier.SUPER_RARE]: [ Species.CHARCADET, Species.CAPSAKID ]
}),
[TrainerType.TABITHA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin", "magma", [ Species.CAMERUPT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.COURTNEY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin_female", "magma", [ Species.CAMERUPT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate())
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL, Species.REMORAID, Species.QWILFISH, Species.BARBOACH ],
[TrainerPoolTier.UNCOMMON]: [ Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.CLOBBOPUS, Species.HORSEA ],
[TrainerPoolTier.RARE]: [ Species.MANTYKE, Species.DHELMISE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.PALDEA_WOOPER, Species.SKRELP ],
[TrainerPoolTier.SUPER_RARE]: [ Species.DONDOZO, Species.BASCULEGION ]
[TrainerPoolTier.COMMON]: [ Species.QWILFISH, Species.REMORAID, Species.ZIGZAGOON, Species.LOTAD, Species.CARVANHA, Species.WAILMER, Species.BARBOACH, Species.CORPHISH, Species.SPHEAL ],
[TrainerPoolTier.UNCOMMON]: [ Species.TENTACOOL, Species.HORSEA, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.AZURILL, Species.CLAMPERL, Species.CLOBBOPUS ],
[TrainerPoolTier.RARE]: [ Species.MANTYKE, Species.SKRELP, Species.DHELMISE, Species.ARROKUDA, Species.HISUI_QWILFISH, Species.PALDEA_WOOPER ],
[TrainerPoolTier.SUPER_RARE]: [ Species.BASCULEGION, Species.DONDOZO ]
}),
[TrainerType.MATT]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin", "aqua", [ Species.SHARPEDO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.SHELLY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin_female", "aqua", [ Species.SHARPEDO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate())
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY, Species.CARNIVINE ],
[TrainerPoolTier.UNCOMMON]: [ Species.LICKITUNG, Species.RHYHORN, Species.TANGELA, Species.ZUBAT, Species.YANMA, Species.SKORUPI, Species.GLIGAR, Species.SWINUB ],
[TrainerPoolTier.RARE]: [ Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.ELEKID, Species.MAGBY, Species.DUSKULL ],
[TrainerPoolTier.SUPER_RARE]: [ Species.ROTOM, Species.SPIRITOMB, Species.HISUI_SNEASEL ]
[TrainerPoolTier.COMMON]: [ Species.WURMPLE, Species.SHINX, Species.BURMY, Species.DRIFLOON, Species.GLAMEOW, Species.STUNKY, Species.BRONZOR, Species.CROAGUNK, Species.CARNIVINE ],
[TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.LICKITUNG, Species.RHYHORN, Species.TANGELA, Species.YANMA, Species.GLIGAR, Species.SWINUB, Species.SKORUPI ],
[TrainerPoolTier.RARE]: [ Species.SNEASEL, Species.ELEKID, Species.MAGBY, Species.DUSKULL, Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH ],
[TrainerPoolTier.SUPER_RARE]: [ Species.SPIRITOMB, Species.ROTOM, Species.HISUI_SNEASEL ]
}),
[TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [ Species.SKUNTANK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [ Species.PURUGLY ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [ Species.TOXICROAK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate())
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH, Species.TYMPOLE ],
[TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.JOLTIK, Species.CUBCHOO, Species.KLINK ],
[TrainerPoolTier.RARE]: [ Species.PAWNIARD, Species.RUFFLET, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.MIENFOO, Species.DURANT, Species.BOUFFALANT ],
[TrainerPoolTier.SUPER_RARE]: [ Species.DRUDDIGON, Species.HISUI_ZORUA, Species.AXEW, Species.DEINO ]
[TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.WOOBAT, Species.TYMPOLE, Species.SANDILE, Species.SCRAGGY, Species.TRUBBISH, Species.VANILLITE ],
[TrainerPoolTier.UNCOMMON]: [ Species.TIMBURR, Species.VENIPEDE, Species.DARUMAKA, Species.FOONGUS, Species.FRILLISH, Species.JOLTIK, Species.KLINK, Species.CUBCHOO, Species.GOLETT ],
[TrainerPoolTier.RARE]: [ Species.DRILBUR, Species.ZORUA, Species.MIENFOO, Species.PAWNIARD, Species.BOUFFALANT, Species.RUFFLET, Species.VULLABY, Species.DURANT ],
[TrainerPoolTier.SUPER_RARE]: [ Species.AXEW, Species.DRUDDIGON, Species.DEINO, Species.HISUI_ZORUA ]
}),
[TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [ Species.CRYOGONAL ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.COLRESS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_boss", "plasma_2", [ Species.KLINKLANG ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_colress").setMixedBattleBgm("battle_colress").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate())
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK, Species.SCATTERBUG, Species.ESPURR ],
[TrainerPoolTier.UNCOMMON]: [ Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.PANCHAM, Species.PURRLOIN, Species.POOCHYENA, Species.BINACLE, Species.CLAUNCHER, Species.PUMPKABOO, Species.PHANTUMP, Species.FOONGUS ],
[TrainerPoolTier.RARE]: [ Species.LITWICK, Species.SNEASEL, Species.PAWNIARD, Species.SLIGGOO ],
[TrainerPoolTier.COMMON]: [ Species.PONYTA, Species.HOUNDOUR, Species.SKORUPI, Species.CROAGUNK, Species.SCRAGGY, Species.FLETCHLING, Species.SCATTERBUG, Species.LITLEO, Species.ESPURR, Species.INKAY ],
[TrainerPoolTier.UNCOMMON]: [ Species.POOCHYENA, Species.ELECTRIKE, Species.PURRLOIN, Species.FOONGUS, Species.PANCHAM, Species.BINACLE, Species.SKRELP, Species.CLAUNCHER, Species.HELIOPTILE, Species.PHANTUMP, Species.PUMPKABOO ],
[TrainerPoolTier.RARE]: [ Species.SNEASEL, Species.LITWICK, Species.PAWNIARD, Species.SLIGGOO ],
[TrainerPoolTier.SUPER_RARE]: [ Species.NOIBAT, Species.HISUI_SLIGGOO, Species.HISUI_AVALUGG ]
}),
[TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [ Species.LIEPARD ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.XEROSIC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin", "flare", [ Species.MALAMAR ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate())
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.ALOLA_EXEGGUTOR, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.ALOLA_RAICHU, Species.BOUNSWEET, Species.LILLIPUP, Species.KOMALA, Species.MORELULL, Species.COMFEY, Species.TOGEDEMARU ],
[TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.BRUXISH, Species.MINIOR, Species.WISHIWASHI, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.CRABRAWLER, Species.CUTIEFLY, Species.ORICORIO, Species.MUDBRAY, Species.PYUKUMUKU, Species.ALOLA_MAROWAK ],
[TrainerPoolTier.RARE]: [ Species.GALAR_CORSOLA, Species.TURTONATOR, Species.MIMIKYU, Species.MAGNEMITE, Species.DRAMPA ],
[TrainerPoolTier.SUPER_RARE]: [ Species.JANGMO_O, Species.PORYGON ]
[TrainerPoolTier.COMMON]: [ Species.CORSOLA, Species.LILLIPUP, Species.PIKIPEK, Species.YUNGOOS, Species.ROCKRUFF, Species.MORELULL, Species.BOUNSWEET, Species.COMFEY, Species.KOMALA, Species.TOGEDEMARU, Species.ALOLA_RAICHU, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.ALOLA_EXEGGUTOR ],
[TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.CRABRAWLER, Species.ORICORIO, Species.CUTIEFLY, Species.WISHIWASHI, Species.MUDBRAY, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.PYUKUMUKU, Species.MINIOR, Species.BRUXISH, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.ALOLA_MAROWAK ],
[TrainerPoolTier.RARE]: [ Species.MAGNEMITE, Species.TURTONATOR, Species.MIMIKYU, Species.DRAMPA, Species.GALAR_CORSOLA ],
[TrainerPoolTier.SUPER_RARE]: [ Species.PORYGON, Species.JANGMO_O ]
}),
[TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [ Species.HYPNO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate())
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.EKANS, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH, Species.DROWZEE ],
[TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.HOUNDOUR, Species.ALOLA_MAROWAK, Species.GASTLY, Species.PANCHAM, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY ],
[TrainerPoolTier.RARE]: [ Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.WISHIWASHI, Species.NYMBLE ],
[TrainerPoolTier.COMMON]: [ Species.EKANS, Species.DROWZEE, Species.KOFFING, Species.SPINARAK, Species.SCRAGGY, Species.TRUBBISH, Species.MAREANIE, Species.SALANDIT, Species.ALOLA_RATTATA, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER ],
[TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.GASTLY, Species.HOUNDOUR, Species.SABLEYE, Species.VENIPEDE, Species.SANDILE, Species.VULLABY, Species.PANCHAM, Species.FOMANTIS, Species.ALOLA_MAROWAK ],
[TrainerPoolTier.RARE]: [ Species.PAWNIARD, Species.WISHIWASHI, Species.SANDYGAST, Species.MIMIKYU, Species.DHELMISE, Species.NYMBLE ],
[TrainerPoolTier.SUPER_RARE]: [ Species.GRUBBIN, Species.DEWPIDER ]
}),
[TrainerType.PLUMERIA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("skull_admin", "skull", [ Species.SALAZZLE ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
[TrainerType.MACRO_GRUNT]: new TrainerConfig(++t).setHasGenders("Macro Grunt Female").setHasDouble("Macro Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_macro_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate())
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.CUFANT, Species.GALAR_MEOWTH, Species.KLINK, Species.ROOKIDEE, Species.CRAMORANT, Species.GALAR_ZIGZAGOON, Species.SKWOVET, Species.STEELIX, Species.MAWILE, Species.FERROSEED ],
[TrainerPoolTier.UNCOMMON]: [ Species.DRILBUR, Species.MAGNEMITE, Species.HATENNA, Species.ARROKUDA, Species.APPLIN, Species.GALAR_PONYTA, Species.GALAR_YAMASK, Species.SINISTEA, Species.RIOLU ],
[TrainerPoolTier.RARE]: [ Species.FALINKS, Species.BELDUM, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.HONEDGE, Species.SCIZOR, Species.GALAR_DARUMAKA ],
[TrainerPoolTier.COMMON]: [ Species.STEELIX, Species.MAWILE, Species.FERROSEED, Species.KLINK, Species.SKWOVET, Species.ROOKIDEE, Species.CRAMORANT, Species.CUFANT, Species.GALAR_MEOWTH, Species.GALAR_ZIGZAGOON ],
[TrainerPoolTier.UNCOMMON]: [ Species.MAGNEMITE, Species.RIOLU, Species.DRILBUR, Species.APPLIN, Species.ARROKUDA, Species.SINISTEA, Species.HATENNA, Species.GALAR_PONYTA, Species.GALAR_YAMASK ],
[TrainerPoolTier.RARE]: [ Species.SCIZOR, Species.BELDUM, Species.HONEDGE, Species.FALINKS, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.GALAR_DARUMAKA ],
[TrainerPoolTier.SUPER_RARE]: [ Species.DURALUDON, Species.DREEPY ]
}),
[TrainerType.OLEANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("macro_admin", "macro", [ Species.GARBODOR ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_oleana").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()),
@ -2225,7 +2225,11 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DUGTRIO, Species.ALOLA_DUGTRIO ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HONCHKROW ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.NIDOQUEEN, Species.NIDOKING ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RHYPERIOR ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RHYPERIOR ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.abilityIndex = 1; // Solid Rock
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
@ -2234,20 +2238,32 @@ export const trainerConfigs: TrainerConfigs = {
p.generateName();
})),
[TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", [], true).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.IRON_THORNS ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HIPPOWDON ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GARCHOMP, Species.EXCADRILL ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GASTRODON, Species.SEISMITOAD ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GASTRODON, Species.SEISMITOAD ], TrainerSlot.TRAINER, true, p => {
if (p.species.speciesId === Species.GASTRODON) {
p.abilityIndex = 0; // Storm Drain
} else if (p.species.speciesId === Species.SEISMITOAD) {
p.abilityIndex = 2; // Water Absorb
}
}))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GARCHOMP, Species.EXCADRILL ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
if (p.species.speciesId === Species.GARCHOMP) {
p.abilityIndex = 2; // Rough Skin
} else if (p.species.speciesId === Species.EXCADRILL) {
p.abilityIndex = 0; // Sand Rush
}
}))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.RHYPERIOR ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.abilityIndex = 1; // Solid Rock
}))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
@ -2295,7 +2311,10 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset();
p.abilityIndex = 0; // Chlorophyll
}))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ROGUE_BALL;
}))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
@ -2384,7 +2403,10 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset();
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MAGNEZONE ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.UXIE, Species.MESPRIT, Species.AZELF ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.UXIE, Species.MESPRIT, Species.AZELF ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ROGUE_BALL;
}))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
@ -2425,7 +2447,10 @@ export const trainerConfigs: TrainerConfigs = {
p.formIndex = 0;
}))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.KINGAMBIT ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.IRON_MOTH ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.IRON_MOTH ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ROGUE_BALL;
}))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
@ -2448,7 +2473,14 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset();
p.gender = Gender.MALE;
}))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
if (p.species.speciesId === Species.DRAGALGE) {
p.abilityIndex = 2; // Adaptability
} else if (p.species.speciesId === Species.CLAWITZER) {
p.abilityIndex = 0; // Mega Launcher
}
}))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALLADE ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.abilityIndex = 1; // Sharpness
@ -2467,7 +2499,14 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset();
p.gender = Gender.MALE;
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
if (p.species.speciesId === Species.DRAGALGE) {
p.abilityIndex = 2; // Adaptability
} else if (p.species.speciesId === Species.CLAWITZER) {
p.abilityIndex = 0; // Mega Launcher
}
}))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.HISUI_GOODRA ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.IRON_VALIANT ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
@ -2477,7 +2516,7 @@ export const trainerConfigs: TrainerConfigs = {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 1; // Mega Gyardos
p.formIndex = 1; // Mega Gyarados
p.generateName();
p.gender = Gender.MALE;
}))
@ -2597,11 +2636,26 @@ export const trainerConfigs: TrainerConfigs = {
p.pokeball = PokeballType.ULTRA_BALL;
})),
[TrainerType.ROSE]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", []).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ESCAVALIER, Species.FERROTHORN ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KLINKLANG, Species.PERRSERKER ]))
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ESCAVALIER, Species.FERROTHORN ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KLINKLANG, Species.PERRSERKER ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
@ -2614,13 +2668,21 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DRACOZOLT, Species.DRACOVISH ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.abilityIndex = 1; //Strong Jaw Dracovish, Hustle Dracozolt
p.pokeball = PokeballType.ULTRA_BALL;
p.abilityIndex = 1; // Strong Jaw Dracovish, Hustle Dracozolt
}))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
@ -2666,7 +2728,10 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset();
p.formIndex = Utils.randSeedInt(5, 1); // Heat, Wash, Frost, Fan, or Mow
}))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RAIKOU, Species.ENTEI, Species.SUICUNE ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RAIKOU, Species.ENTEI, Species.SUICUNE ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => {
p.formIndex = Utils.randSeedInt(5, 1); // Random Starmobile form
p.generateAndPopulateMoveset();

View File

@ -94,4 +94,5 @@ export enum BattlerTagType {
PSYCHO_SHIFT = "PSYCHO_SHIFT",
ENDURE_TOKEN = "ENDURE_TOKEN",
POWDER = "POWDER",
MAGIC_COAT = "MAGIC_COAT",
}

View File

@ -44,6 +44,11 @@ export class Arena {
public bgm: string;
public ignoreAbilities: boolean;
public ignoringEffectSource: BattlerIndex | null;
/**
* Saves the number of times a party pokemon faints during a arena encounter.
* {@linkcode globalScene.currentBattle.enemyFaints} is the corresponding faint counter for the enemy (this resets every wave).
*/
public playerFaints: number;
private lastTimeOfDay: TimeOfDay;
@ -52,12 +57,13 @@ export class Arena {
public readonly eventTarget: EventTarget = new EventTarget();
constructor(biome: Biome, bgm: string) {
constructor(biome: Biome, bgm: string, playerFaints: number = 0) {
this.biomeType = biome;
this.tags = [];
this.bgm = bgm;
this.trainerPool = biomeTrainerPools[biome];
this.updatePoolsForTimeOfDay();
this.playerFaints = playerFaints;
}
init() {
@ -688,6 +694,7 @@ export class Arena {
this.trySetWeather(WeatherType.NONE, false);
}
this.trySetTerrain(TerrainType.NONE, false, true);
this.resetPlayerFaintCount();
this.removeAllTags();
}
@ -773,6 +780,10 @@ export class Arena {
return 0;
}
}
resetPlayerFaintCount(): void {
this.playerFaints = 0;
}
}
export function getBiomeKey(biome: Biome): string {

View File

@ -7,7 +7,40 @@ import { variantColorCache } from "#app/data/variant";
import { variantData } from "#app/data/variant";
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "#app/ui/battle-info";
import type Move from "#app/data/move";
import { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, MoveTarget, CombinedPledgeStabBoostAttr, VariableMoveTypeChartAttr, HpSplitAttr } from "#app/data/move";
import {
HighCritAttr,
StatChangeBeforeDmgCalcAttr,
HitsTagAttr,
applyMoveAttrs,
FixedDamageAttr,
VariableAtkAttr,
allMoves,
MoveCategory,
TypelessAttr,
CritOnlyAttr,
getMoveTargets,
OneHitKOAttr,
VariableMoveTypeAttr,
VariableDefAttr,
AttackMove,
ModifiedDamageAttr,
VariableMoveTypeMultiplierAttr,
IgnoreOpponentStatStagesAttr,
SacrificialAttr,
VariableMoveCategoryAttr,
CounterDamageAttr,
StatStageChangeAttr,
RechargeAttr,
IgnoreWeatherTypeDebuffAttr,
BypassBurnDamageReductionAttr,
SacrificialAttrOnHit,
OneHitKOAccuracyAttr,
RespectAttackTypeImmunityAttr,
MoveTarget,
CombinedPledgeStabBoostAttr,
VariableMoveTypeChartAttr,
HpSplitAttr
} from "#app/data/move";
import type { PokemonSpeciesForm } from "#app/data/pokemon-species";
import { default as PokemonSpecies, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species";
import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters";
@ -2915,6 +2948,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
isCritical = false;
}
/**
* Applies stat changes from {@linkcode move} and gives it to {@linkcode source}
* before damage calculation
*/
applyMoveAttrs(StatChangeBeforeDmgCalcAttr, source, this, move);
const { cancelled, result, damage: dmg } = this.getAttackDamage(source, move, false, false, isCritical, false);
const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === source.getMoveType(move)) as TypeBoostTag;

View File

@ -2,7 +2,7 @@ import { globalScene } from "#app/global-scene";
import { EvolutionItem, pokemonEvolutions } from "#app/data/balance/pokemon-evolutions";
import { tmPoolTiers, tmSpecies } from "#app/data/balance/tms";
import { getBerryEffectDescription, getBerryName } from "#app/data/berry";
import { allMoves, AttackMove, selfStatLowerMoves } from "#app/data/move";
import { allMoves, AttackMove } from "#app/data/move";
import { getNatureName, getNatureStatMultiplier } from "#app/data/nature";
import { getPokeballCatchMultiplier, getPokeballName, MAX_PER_TYPE_POKEBALLS } from "#app/data/pokeball";
import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeCondition, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms";
@ -1725,7 +1725,7 @@ const modifierPool: ModifierPool = {
if (globalScene.gameMode.isSplicedOnly) {
return 4;
} else if (globalScene.gameMode.isClassic && globalScene.eventManager.areFusionsBoosted()) {
return 1;
return 2;
}
}
return 0;
@ -1833,14 +1833,6 @@ const modifierPool: ModifierPool = {
return false;
}) ? 10 : 0;
}, 10),
new WeightedModifierType(modifierTypes.WHITE_HERB, (party: Pokemon[]) => {
const checkedAbilities = [ Abilities.WEAK_ARMOR, Abilities.CONTRARY, Abilities.MOODY, Abilities.ANGER_SHELL, Abilities.COMPETITIVE, Abilities.DEFIANT ];
const weightMultiplier = party.filter(
p => !p.getHeldItems().some(i => i instanceof ResetNegativeStatStageModifier && i.stackCount >= i.getMaxHeldItemCount(p)) &&
(checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => m && selfStatLowerMoves.includes(m.moveId)))).length;
// If a party member has one of the above moves or abilities and doesn't have max herbs, the herb will appear more frequently
return 0 * (weightMultiplier ? 2 : 1) + (weightMultiplier ? weightMultiplier * 0 : 0);
}, 10),
new WeightedModifierType(modifierTypes.REVIVER_SEED, 4),
new WeightedModifierType(modifierTypes.CANDY_JAR, skipInLastClassicWaveOrDefault(5)),
new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9),
@ -1850,10 +1842,9 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.IV_SCANNER, skipInLastClassicWaveOrDefault(4)),
new WeightedModifierType(modifierTypes.EXP_CHARM, skipInLastClassicWaveOrDefault(8)),
new WeightedModifierType(modifierTypes.EXP_SHARE, skipInLastClassicWaveOrDefault(10)),
new WeightedModifierType(modifierTypes.EXP_BALANCE, skipInLastClassicWaveOrDefault(3)),
new WeightedModifierType(modifierTypes.TERA_ORB, () => Math.min(Math.max(Math.floor(globalScene.currentBattle.waveIndex / 50) * 2, 1), 4), 4),
new WeightedModifierType(modifierTypes.QUICK_CLAW, 3),
new WeightedModifierType(modifierTypes.WIDE_LENS, 4),
new WeightedModifierType(modifierTypes.WIDE_LENS, 7),
].map(m => {
m.setTier(ModifierTier.ULTRA); return m;
}),
@ -1867,8 +1858,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.SCOPE_LENS, 4),
new WeightedModifierType(modifierTypes.BATON, 2),
new WeightedModifierType(modifierTypes.SOUL_DEW, 7),
//new WeightedModifierType(modifierTypes.OVAL_CHARM, 6),
new WeightedModifierType(modifierTypes.CATCHING_CHARM, () => globalScene.gameMode.isDaily || (!globalScene.gameMode.isFreshStartChallenge() && globalScene.gameData.getSpeciesCount(d => !!d.caughtAttr) > 100) ? 4 : 0, 4),
new WeightedModifierType(modifierTypes.CATCHING_CHARM, () => !globalScene.gameMode.isClassic ? 4 : 0, 4),
new WeightedModifierType(modifierTypes.ABILITY_CHARM, skipInClassicAfterWave(189, 6)),
new WeightedModifierType(modifierTypes.FOCUS_BAND, 5),
new WeightedModifierType(modifierTypes.KINGS_ROCK, 3),

View File

@ -165,9 +165,9 @@ export abstract class PersistentModifier extends Modifier {
public stackCount: number;
public virtualStackCount: number;
constructor(type: ModifierType, stackCount?: number) {
constructor(type: ModifierType, stackCount: number = 1) {
super(type);
this.stackCount = stackCount === undefined ? 1 : stackCount;
this.stackCount = stackCount;
this.virtualStackCount = 0;
}
@ -3295,7 +3295,7 @@ export class ContactHeldItemTransferChanceModifier extends HeldItemTransferModif
export class IvScannerModifier extends PersistentModifier {
constructor(type: ModifierType, stackCount?: number) {
super(type, stackCount);
super(type);
}
match(modifier: Modifier): boolean {
@ -3303,7 +3303,7 @@ export class IvScannerModifier extends PersistentModifier {
}
clone(): IvScannerModifier {
return new IvScannerModifier(this.type, this.stackCount);
return new IvScannerModifier(this.type);
}
/**
@ -3311,11 +3311,11 @@ export class IvScannerModifier extends PersistentModifier {
* @returns always `true`
*/
override apply(): boolean {
return true;
return true; //Dude are you kidding me
}
getMaxStackCount(): number {
return 3;
return 1;
}
}

View File

@ -3,7 +3,6 @@ import { globalScene } from "#app/global-scene";
import type { Egg } from "#app/data/egg";
import { EggCountChangedEvent } from "#app/events/egg";
import type { PlayerPokemon } from "#app/field/pokemon";
import { getPokemonNameWithAffix } from "#app/messages";
import { Phase } from "#app/phase";
import { achvs } from "#app/system/achv";
import EggCounterContainer from "#app/ui/egg-counter-container";
@ -356,7 +355,7 @@ export class EggHatchPhase extends Phase {
globalScene.playSoundWithoutBgm("evolution_fanfare");
globalScene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: getPokemonNameWithAffix(this.pokemon) }), null, () => {
globalScene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: this.pokemon.species.getExpandedSpeciesName() }), null, () => {
globalScene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs);
globalScene.gameData.setPokemonCaught(this.pokemon, true, true).then(() => {
globalScene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex).then((value) => {

View File

@ -478,7 +478,7 @@ export class EncounterPhase extends BattlePhase {
}));
const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier);
if (ivScannerModifier) {
enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6))));
enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex())));
}
}

View File

@ -270,7 +270,7 @@ export class EvolutionPhase extends Phase {
globalScene.playSoundWithoutBgm("evolution_fanfare");
evolvedPokemon.destroy();
globalScene.ui.showText(i18next.t("menu:evolutionDone", { pokemonName: this.preEvolvedPokemonName, evolvedPokemonName: this.pokemon.name }), null, () => this.end(), null, true, Utils.fixedInt(4000));
globalScene.ui.showText(i18next.t("menu:evolutionDone", { pokemonName: this.preEvolvedPokemonName, evolvedPokemonName: this.pokemon.species.getExpandedSpeciesName() }), null, () => this.end(), null, true, Utils.fixedInt(4000));
globalScene.time.delayedCall(Utils.fixedInt(4250), () => globalScene.playBgm());
});
});

View File

@ -96,10 +96,9 @@ export class FaintPhase extends PokemonPhase {
doFaint(): void {
const pokemon = this.getPokemon();
// Track total times pokemon have been KO'd for supreme overlord/last respects
// Track total times pokemon have been KO'd for Last Respects/Supreme Overlord
if (pokemon.isPlayer()) {
globalScene.currentBattle.playerFaints += 1;
globalScene.arena.playerFaints += 1;
globalScene.currentBattle.playerFaintsHistory.push({ pokemon: pokemon, turn: globalScene.currentBattle.turn });
} else {
globalScene.currentBattle.enemyFaints += 1;

View File

@ -249,7 +249,8 @@ export class GameOverPhase extends BattlePhase {
timestamp: new Date().getTime(),
challenges: globalScene.gameMode.challenges.map(c => new ChallengeData(c)),
mysteryEncounterType: globalScene.currentBattle.mysteryEncounter?.encounterType ?? -1,
mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData
mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData,
playerFaints: globalScene.arena.playerFaints
} as SessionSaveData;
}
}

View File

@ -12,6 +12,7 @@ import {
PostAttackAbAttr,
PostDamageAbAttr,
PostDefendAbAttr,
ReflectStatusMoveAbAttr,
TypeImmunityAbAttr,
} from "#app/data/ability";
import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag";
@ -31,6 +32,7 @@ import {
AttackMove,
DelayedAttackAttr,
FlinchAttr,
getMoveTargets,
HitsTagAttr,
MissEffectAttr,
MoveCategory,
@ -47,7 +49,7 @@ import {
} from "#app/data/move";
import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms";
import { Type } from "#enums/type";
import type { PokemonMove } from "#app/field/pokemon";
import { PokemonMove } from "#app/field/pokemon";
import type Pokemon from "#app/field/pokemon";
import { HitResult, MoveResult } from "#app/field/pokemon";
import { getPokemonNameWithAffix } from "#app/messages";
@ -60,17 +62,27 @@ import {
} from "#app/modifier/modifier";
import { PokemonPhase } from "#app/phases/pokemon-phase";
import { BooleanHolder, executeIf, isNullOrUndefined, NumberHolder } from "#app/utils";
import { type nil } from "#app/utils";
import { BattlerTagType } from "#enums/battler-tag-type";
import type { Moves } from "#enums/moves";
import i18next from "i18next";
import type { Phase } from "#app/phase";
import { ShowAbilityPhase } from "./show-ability-phase";
import { MovePhase } from "./move-phase";
import { MoveEndPhase } from "./move-end-phase";
export class MoveEffectPhase extends PokemonPhase {
public move: PokemonMove;
protected targets: BattlerIndex[];
protected reflected: boolean = false;
constructor(battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove) {
/**
* @param reflected Indicates that the move was reflected by the user due to magic coat or magic bounce
*/
constructor(battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove, reflected: boolean = false) {
super(battlerIndex);
this.move = move;
this.reflected = reflected;
/**
* In double battles, if the right Pokemon selects a spread move and the left Pokemon dies
* with no party members available to switch in, then the right Pokemon takes the index
@ -184,12 +196,14 @@ export class MoveEffectPhase extends PokemonPhase {
&& (targets[0]?.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move))
&& !targets[0]?.getTag(SemiInvulnerableTag);
const mayBounce = move.hasFlag(MoveFlags.REFLECTABLE) && !this.reflected && targets.some(t => t.hasAbilityWithAttr(ReflectStatusMoveAbAttr) || !!t.getTag(BattlerTagType.MAGIC_COAT));
/**
* If no targets are left for the move to hit (FAIL), or the invoked move is single-target
* If no targets are left for the move to hit (FAIL), or the invoked move is non-reflectable, single-target
* (and not random target) and failed the hit check against its target (MISS), log the move
* as FAILed or MISSed (depending on the conditions above) and end this phase.
*/
if (!hasActiveTargets || (!move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) {
if (!hasActiveTargets || (!mayBounce && !move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) {
this.stopMultiHit();
if (hasActiveTargets) {
globalScene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "" }));
@ -211,12 +225,21 @@ export class MoveEffectPhase extends PokemonPhase {
new MoveAnim(move.id as Moves, user, this.getFirstTarget()!.getBattlerIndex(), playOnEmptyField).play(move.hitsSubstitute(user, this.getFirstTarget()!), () => {
/** Has the move successfully hit a target (for damage) yet? */
let hasHit: boolean = false;
for (const target of targets) {
// Prevent ENEMY_SIDE targeted moves from occurring twice in double battles
if (move.moveTarget === MoveTarget.ENEMY_SIDE && target !== targets[targets.length - 1]) {
continue;
}
// Prevent ENEMY_SIDE targeted moves from occurring twice in double battles
// and check which target will magic bounce.
const trueTargets: Pokemon[] = move.moveTarget !== MoveTarget.ENEMY_SIDE ? targets : (() => {
const magicCoatTargets = targets.filter(t => t.getTag(BattlerTagType.MAGIC_COAT) || t.hasAbilityWithAttr(ReflectStatusMoveAbAttr));
// only magic coat effect cares about order
if (!mayBounce || magicCoatTargets.length === 0) {
return [ targets[0] ];
}
return [ magicCoatTargets[0] ];
})();
const queuedPhases: Phase[] = [];
for (const target of trueTargets) {
/** The {@linkcode ArenaTagSide} to which the target belongs */
const targetSide = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
/** Has the invoked move been cancelled by conditional protection (e.g Quick Guard)? */
@ -229,7 +252,7 @@ export class MoveEffectPhase extends PokemonPhase {
}
/** Is the target protected by Protect, etc. or a relevant conditional protection effect? */
const isProtected = (
const isProtected = !([ MoveTarget.ENEMY_SIDE, MoveTarget.BOTH_SIDES ].includes(this.move.getMove().moveTarget)) && (
bypassIgnoreProtect.value
|| !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target))
&& (hasConditionalProtectApplied.value
@ -238,13 +261,39 @@ export class MoveEffectPhase extends PokemonPhase {
|| (this.move.getMove().category !== MoveCategory.STATUS
&& target.findTags(t => t instanceof DamageProtectedTag).find(t => target.lapseTag(t.tagType))));
/** Is the target hidden by the effects of its Commander ability? */
const isCommanding = globalScene.currentBattle.double && target.getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === target;
/** Is the target reflecting status moves from the magic coat move? */
const isReflecting = !!target.getTag(BattlerTagType.MAGIC_COAT);
/** Is the target's magic bounce ability not ignored and able to reflect this move? */
const canMagicBounce = !isReflecting && !move.checkFlag(MoveFlags.IGNORE_ABILITIES, user, target) && target.hasAbilityWithAttr(ReflectStatusMoveAbAttr);
const semiInvulnerableTag = target.getTag(SemiInvulnerableTag);
/** Is the target reflecting the effect, not protected, and not in an semi-invulnerable state?*/
const willBounce = (!isProtected && !this.reflected && !isCommanding
&& move.hasFlag(MoveFlags.REFLECTABLE)
&& (isReflecting || canMagicBounce)
&& !semiInvulnerableTag);
// If the move will bounce, then queue the bounce and move on to the next target
if (!target.switchOutStatus && willBounce) {
const newTargets = move.isMultiTarget() ? getMoveTargets(target, move.id).targets : [ user.getBattlerIndex() ];
if (!isReflecting) {
queuedPhases.push(new ShowAbilityPhase(target.getBattlerIndex(), target.getPassiveAbility().hasAttr(ReflectStatusMoveAbAttr)));
}
queuedPhases.push(new MovePhase(target, newTargets, new PokemonMove(move.id, 0, 0, true), true, true, true));
continue;
}
/** Is the pokemon immune due to an ablility, and also not in a semi invulnerable state? */
const isImmune = target.hasAbilityWithAttr(TypeImmunityAbAttr)
&& (target.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move))
&& !target.getTag(SemiInvulnerableTag);
&& !semiInvulnerableTag;
/** Is the target hidden by the effects of its Commander ability? */
const isCommanding = globalScene.currentBattle.double && target.getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === target;
/**
* If the move missed a target, stop all future hits against that target
@ -371,6 +420,10 @@ export class MoveEffectPhase extends PokemonPhase {
applyAttrs.push(k);
}
// Apply queued phases
if (queuedPhases.length) {
globalScene.appendToPhase(queuedPhases, MoveEndPhase);
}
// Apply the move's POST_TARGET effects on the move's last hit, after all targeted effects have resolved
const postTarget = (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()) ?
applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, user, null, move) :
@ -586,12 +639,7 @@ export class MoveEffectPhase extends PokemonPhase {
}
}
if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) {
return true;
}
// If the user should ignore accuracy on a target, check who the user targeted last turn and see if they match
if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) {
if (this.checkBypassAccAndInvuln(target)) {
return true;
}
@ -599,15 +647,12 @@ export class MoveEffectPhase extends PokemonPhase {
return true;
}
if (target.getTag(BattlerTagType.TELEKINESIS) && !target.getTag(SemiInvulnerableTag) && !this.move.getMove().hasAttr(OneHitKOAttr)) {
const semiInvulnerableTag = target.getTag(SemiInvulnerableTag);
if (target.getTag(BattlerTagType.TELEKINESIS) && !semiInvulnerableTag && !this.move.getMove().hasAttr(OneHitKOAttr)) {
return true;
}
const semiInvulnerableTag = target.getTag(SemiInvulnerableTag);
if (semiInvulnerableTag
&& !this.move.getMove().getAttrs(HitsTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType)
&& !(this.move.getMove().hasAttr(ToxicAccuracyAttr) && user.isOfType(Type.POISON))
) {
if (semiInvulnerableTag && !this.checkBypassSemiInvuln(semiInvulnerableTag)) {
return false;
}
@ -623,6 +668,52 @@ export class MoveEffectPhase extends PokemonPhase {
return rand < (moveAccuracy * accuracyMultiplier);
}
/**
* Check whether the move should bypass *both* the accuracy *and* semi-invulnerable states.
* @param target - The {@linkcode Pokemon} targeted by the invoked move
* @returns `true` if the move should bypass accuracy and semi-invulnerability
*
* Accuracy and semi-invulnerability can be bypassed by:
* - An ability like {@linkcode Abilities.NO_GUARD | No Guard}
* - A poison type using {@linkcode Moves.TOXIC | Toxic}
* - A move like {@linkcode Moves.LOCK_ON | Lock-On} or {@linkcode Moves.MIND_READER | Mind Reader}.
*
* Does *not* check against effects {@linkcode Moves.GLAIVE_RUSH | Glaive Rush} status (which
* should not bypass semi-invulnerability), or interactions like Earthquake hitting against Dig,
* (which should not bypass the accuracy check).
*
* @see {@linkcode hitCheck}
*/
public checkBypassAccAndInvuln(target: Pokemon) {
const user = this.getUserPokemon();
if (!user) {
return false;
}
if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) {
return true;
}
if ((this.move.getMove().hasAttr(ToxicAccuracyAttr) && user.isOfType(Type.POISON))) {
return true;
}
// TODO: Fix lock on / mind reader check.
if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) {
return true;
}
}
/**
* Check whether the move is able to ignore the given `semiInvulnerableTag`
* @param semiInvulnerableTag - The semiInvulnerbale tag to check against
* @returns `true` if the move can ignore the semi-invulnerable state
*/
public checkBypassSemiInvuln(semiInvulnerableTag: SemiInvulnerableTag | nil): boolean {
if (!semiInvulnerableTag) {
return false;
}
const move = this.move.getMove();
return move.getAttrs(HitsTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType);
}
/** @returns The {@linkcode Pokemon} using this phase's invoked move */
public getUserPokemon(): Pokemon | null {
if (this.battlerIndex > BattlerIndex.ENEMY_2) {

View File

@ -58,6 +58,7 @@ export class MovePhase extends BattlePhase {
protected ignorePp: boolean;
protected failed: boolean = false;
protected cancelled: boolean = false;
protected reflected: boolean = false;
public get pokemon(): Pokemon {
return this._pokemon;
@ -84,10 +85,12 @@ export class MovePhase extends BattlePhase {
}
/**
* @param followUp Indicates that the move being uses is a "follow-up" - for example, a move being used by Metronome or Dancer.
* @param followUp Indicates that the move being used is a "follow-up" - for example, a move being used by Metronome or Dancer.
* Follow-ups bypass a few failure conditions, including flinches, sleep/paralysis/freeze and volatile status checks, etc.
* @param reflected Indicates that the move was reflected by Magic Coat or Magic Bounce.
* Reflected moves cannot be reflected again and will not trigger Dancer.
*/
constructor(pokemon: Pokemon, targets: BattlerIndex[], move: PokemonMove, followUp: boolean = false, ignorePp: boolean = false) {
constructor(pokemon: Pokemon, targets: BattlerIndex[], move: PokemonMove, followUp: boolean = false, ignorePp: boolean = false, reflected: boolean = false) {
super();
this.pokemon = pokemon;
@ -95,6 +98,7 @@ export class MovePhase extends BattlePhase {
this.move = move;
this.followUp = followUp;
this.ignorePp = ignorePp;
this.reflected = reflected;
}
/**
@ -140,7 +144,7 @@ export class MovePhase extends BattlePhase {
}
// Check move to see if arena.ignoreAbilities should be true.
if (!this.followUp) {
if (!this.followUp || this.reflected) {
if (this.move.getMove().checkFlag(MoveFlags.IGNORE_ABILITIES, this.pokemon, null)) {
globalScene.arena.setIgnoreAbilities(true, this.pokemon.getBattlerIndex());
}
@ -335,7 +339,7 @@ export class MovePhase extends BattlePhase {
*/
if (success) {
applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove());
globalScene.unshiftPhase(new MoveEffectPhase(this.pokemon.getBattlerIndex(), this.targets, this.move));
globalScene.unshiftPhase(new MoveEffectPhase(this.pokemon.getBattlerIndex(), this.targets, this.move, this.reflected));
} else {
if ([ Moves.ROAR, Moves.WHIRLWIND, Moves.TRICK_OR_TREAT, Moves.FORESTS_CURSE ].includes(this.move.moveId)) {
@ -543,7 +547,7 @@ export class MovePhase extends BattlePhase {
return;
}
globalScene.queueMessage(i18next.t("battle:useMove", {
globalScene.queueMessage(i18next.t(this.reflected ? "battle:magicCoatActivated" : "battle:useMove", {
pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon),
moveName: this.move.getName()
}), 500);

View File

@ -396,7 +396,7 @@ export class MysteryEncounterBattlePhase extends Phase {
if (encounterMode !== MysteryEncounterMode.TRAINER_BATTLE) {
const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier);
if (ivScannerModifier) {
enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6))));
enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex())));
}
}

View File

@ -1,7 +1,6 @@
import { globalScene } from "#app/global-scene";
import type { BattlerIndex } from "#app/battle";
import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims";
import { Stat } from "#app/enums/stat";
import { PERMANENT_STATS, Stat } from "#app/enums/stat";
import { getPokemonNameWithAffix } from "#app/messages";
import { getTextColor, TextStyle } from "#app/ui/text";
import { Mode } from "#app/ui/ui";
@ -9,21 +8,14 @@ import i18next from "i18next";
import { PokemonPhase } from "./pokemon-phase";
export class ScanIvsPhase extends PokemonPhase {
private shownIvs: number;
constructor(battlerIndex: BattlerIndex, shownIvs: number) {
constructor(battlerIndex: BattlerIndex) {
super(battlerIndex);
this.shownIvs = shownIvs;
}
start() {
super.start();
if (!this.shownIvs) {
return this.end();
}
const pokemon = this.getPokemon();
let enemyIvs: number[] = [];
@ -34,12 +26,11 @@ export class ScanIvsPhase extends PokemonPhase {
for (let e = 0; e < enemyField.length; e++) {
enemyIvs = enemyField[e].ivs;
const currentIvs = globalScene.gameData.dexData[enemyField[e].species.getRootSpeciesId()].ivs; // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists
const ivsToShow = globalScene.ui.getMessageHandler().getTopIvs(enemyIvs, this.shownIvs);
statsContainer = enemyField[e].getBattleInfo().getStatsValueContainer().list as Phaser.GameObjects.Sprite[];
statsContainerLabels = statsContainer.filter(m => m.name.indexOf("icon_stat_label") >= 0);
for (let s = 0; s < statsContainerLabels.length; s++) {
const ivStat = Stat[statsContainerLabels[s].frame.name];
if (enemyIvs[ivStat] > currentIvs[ivStat] && ivsToShow.indexOf(Number(ivStat)) >= 0) {
if (enemyIvs[ivStat] > currentIvs[ivStat] && PERMANENT_STATS.indexOf(Number(ivStat)) >= 0) {
const hexColour = enemyIvs[ivStat] === 31 ? getTextColor(TextStyle.PERFECT_IV, false, uiTheme) : getTextColor(TextStyle.SUMMARY_GREEN, false, uiTheme);
const hexTextColour = Phaser.Display.Color.HexStringToColor(hexColour).color;
statsContainerLabels[s].setTint(hexTextColour);
@ -53,9 +44,7 @@ export class ScanIvsPhase extends PokemonPhase {
globalScene.ui.setMode(Mode.CONFIRM, () => {
globalScene.ui.setMode(Mode.MESSAGE);
globalScene.ui.clearText();
new CommonBattleAnim(CommonAnim.LOCK_ON, pokemon, pokemon).play(false, () => {
globalScene.ui.getMessageHandler().promptIvs(pokemon.id, pokemon.ivs, this.shownIvs).then(() => this.end());
});
globalScene.ui.getMessageHandler().promptIvs(pokemon.id, pokemon.ivs).then(() => this.end());
}, () => {
globalScene.ui.setMode(Mode.MESSAGE);
globalScene.ui.clearText();

View File

@ -141,6 +141,10 @@ export interface SessionSaveData {
challenges: ChallengeData[];
mysteryEncounterType: MysteryEncounterType | -1; // Only defined when current wave is ME,
mysteryEncounterSaveData: MysteryEncounterSaveData;
/**
* Counts the amount of pokemon fainted in your party during the current arena encounter.
*/
playerFaints: number;
}
interface Unlocks {
@ -964,7 +968,8 @@ export class GameData {
timestamp: new Date().getTime(),
challenges: globalScene.gameMode.challenges.map(c => new ChallengeData(c)),
mysteryEncounterType: globalScene.currentBattle.mysteryEncounter?.encounterType ?? -1,
mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData
mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData,
playerFaints: globalScene.arena.playerFaints
} as SessionSaveData;
}
@ -1056,7 +1061,7 @@ export class GameData {
globalScene.mysteryEncounterSaveData = new MysteryEncounterSaveData(sessionData.mysteryEncounterSaveData);
globalScene.newArena(sessionData.arena.biome);
globalScene.newArena(sessionData.arena.biome, sessionData.playerFaints);
const battleType = sessionData.battleType || 0;
const trainerConfig = sessionData.trainer ? trainerConfigs[sessionData.trainer.trainerType] : null;

View File

@ -0,0 +1,351 @@
import { BattlerIndex } from "#app/battle";
import { allAbilities } from "#app/data/ability";
import { ArenaTagSide } from "#app/data/arena-tag";
import { allMoves } from "#app/data/move";
import { ArenaTagType } from "#app/enums/arena-tag-type";
import { BattlerTagType } from "#app/enums/battler-tag-type";
import { Stat } from "#app/enums/stat";
import { StatusEffect } from "#app/enums/status-effect";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
describe("Abilities - Magic Bounce", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override
.ability(Abilities.BALL_FETCH)
.battleType("single")
.moveset( [ Moves.GROWL, Moves.SPLASH ])
.disableCrits()
.enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.MAGIC_BOUNCE)
.enemyMoveset(Moves.SPLASH);
});
it("should reflect basic status moves", async () => {
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1);
});
it("should not bounce moves while the target is in the semi-invulnerable state", async () => {
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.override.moveset([ Moves.GROWL ]);
game.override.enemyMoveset( [ Moves.FLY ]);
game.move.select(Moves.GROWL);
await game.forceEnemyMove(Moves.FLY);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0);
});
it("should individually bounce back multi-target moves", async () => {
game.override.battleType("double");
game.override.moveset([ Moves.GROWL, Moves.SPLASH ]);
await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]);
game.move.select(Moves.GROWL, 0);
game.move.select(Moves.SPLASH, 1);
await game.phaseInterceptor.to("BerryPhase");
const user = game.scene.getPlayerField()[0];
expect(user.getStatStage(Stat.ATK)).toBe(-2);
});
it("should still bounce back a move that would otherwise fail", async () => {
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.scene.getEnemyPokemon()?.setStatStage(Stat.ATK, -6);
game.override.moveset([ Moves.GROWL ]);
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1);
});
it("should not bounce back a move that was just bounced", async () => {
game.override.ability(Abilities.MAGIC_BOUNCE);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1);
});
it("should receive the stat change after reflecting a move back to a mirror armor user", async () => {
game.override.ability(Abilities.MIRROR_ARMOR);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1);
});
it("should not bounce back a move from a mold breaker user", async () => {
game.override.ability(Abilities.MOLD_BREAKER);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1);
});
it("should bounce back a spread status move against both pokemon", async () => {
game.override.battleType("double");
game.override.moveset([ Moves.GROWL, Moves.SPLASH ]);
game.override.enemyMoveset([ Moves.SPLASH ]);
await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]);
game.move.select(Moves.GROWL, 0);
game.move.select(Moves.SPLASH, 1);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerField().every(p => p.getStatStage(Stat.ATK) === -2)).toBeTruthy();
});
it("should only bounce spikes back once in doubles when both targets have magic bounce", async () => {
game.override.battleType("double");
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.override.moveset([ Moves.SPIKES ]);
game.move.select(Moves.SPIKES);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1);
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)).toBeUndefined();
});
it("should bounce spikes even when the target is protected", async () => {
game.override.moveset([ Moves.SPIKES ]);
game.override.enemyMoveset([ Moves.PROTECT ]);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.move.select(Moves.SPIKES);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1);
});
it("should not bounce spikes when the target is in the semi-invulnerable state", async () => {
game.override.moveset([ Moves.SPIKES ]);
game.override.enemyMoveset([ Moves.FLY ]);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.move.select(Moves.SPIKES);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)!["layers"]).toBe(1);
});
it("should not bounce back curse", async() => {
game.override.starterSpecies(Species.GASTLY);
await game.classicMode.startBattle([ Species.GASTLY ]);
game.override.moveset([ Moves.CURSE ]);
game.move.select(Moves.CURSE);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getEnemyPokemon()!.getTag(BattlerTagType.CURSED)).toBeDefined();
});
it("should not cause encore to be interrupted after bouncing", async () => {
game.override.moveset([ Moves.SPLASH, Moves.GROWL, Moves.ENCORE ]);
game.override.enemyMoveset([ Moves.TACKLE, Moves.GROWL ]);
// game.override.ability(Abilities.MOLD_BREAKER);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
const playerPokemon = game.scene.getPlayerPokemon()!;
const enemyPokemon = game.scene.getEnemyPokemon()!;
// Give the player MOLD_BREAKER for this turn to bypass Magic Bounce.
vi.spyOn(playerPokemon, "getAbility").mockReturnValue(allAbilities[Abilities.MOLD_BREAKER]);
// turn 1
game.move.select(Moves.ENCORE);
await game.forceEnemyMove(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.toNextTurn();
expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE);
// turn 2
vi.spyOn(playerPokemon, "getAbility").mockRestore();
game.move.select(Moves.GROWL);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to("BerryPhase");
expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE);
expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE);
});
// TODO: encore is failing if the last move was virtual.
it.todo("should not cause the bounced move to count for encore", async () => {
game.override.moveset([ Moves.SPLASH, Moves.GROWL, Moves.ENCORE ]);
game.override.enemyMoveset([ Moves.GROWL, Moves.TACKLE ]);
game.override.enemyAbility(Abilities.MAGIC_BOUNCE);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
const playerPokemon = game.scene.getPlayerPokemon()!;
const enemyPokemon = game.scene.getEnemyPokemon()!;
// turn 1
game.move.select(Moves.GROWL);
await game.forceEnemyMove(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.toNextTurn();
// Give the player MOLD_BREAKER for this turn to bypass Magic Bounce.
vi.spyOn(playerPokemon, "getAbility").mockReturnValue(allAbilities[Abilities.MOLD_BREAKER]);
// turn 2
game.move.select(Moves.ENCORE);
await game.forceEnemyMove(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to("BerryPhase");
expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE);
expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE);
});
// TODO: stomping tantrum should consider moves that were bounced.
it.todo("should cause stomping tantrum to double in power when the last move was bounced", async () => {
game.override.battleType("single");
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.override.moveset([ Moves.STOMPING_TANTRUM, Moves.CHARM ]);
const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM];
vi.spyOn(stomping_tantrum, "calculateBattlePower");
game.move.select(Moves.CHARM);
await game.toNextTurn();
game.move.select(Moves.STOMPING_TANTRUM);
await game.phaseInterceptor.to("BerryPhase");
expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(150);
});
// TODO: stomping tantrum should consider moves that were bounced.
it.todo("should properly cause the enemy's stomping tantrum to be doubled in power after bouncing and failing", async () => {
game.override.enemyMoveset([ Moves.STOMPING_TANTRUM, Moves.SPLASH, Moves.CHARM ]);
await game.classicMode.startBattle([ Species.BULBASAUR ]);
const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM];
const enemy = game.scene.getEnemyPokemon()!;
vi.spyOn(stomping_tantrum, "calculateBattlePower");
game.move.select(Moves.SPORE);
await game.forceEnemyMove(Moves.CHARM);
await game.phaseInterceptor.to("TurnEndPhase");
expect(enemy.getLastXMoves(1)[0].result).toBe("success");
await game.phaseInterceptor.to("BerryPhase");
expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75);
await game.toNextTurn();
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75);
});
it("should respect immunities when bouncing a move", async () => {
vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100);
game.override.moveset([ Moves.THUNDER_WAVE, Moves.GROWL ]);
game.override.ability(Abilities.SOUNDPROOF);
await game.classicMode.startBattle([ Species.PHANPY ]);
// Turn 1 - thunder wave immunity test
game.move.select(Moves.THUNDER_WAVE);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.status).toBeUndefined();
// Turn 2 - soundproof immunity test
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0);
});
it("should bounce back a move before the accuracy check", async () => {
game.override.moveset([ Moves.SPORE ]);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
const attacker = game.scene.getPlayerPokemon()!;
vi.spyOn(attacker, "getAccuracyMultiplier").mockReturnValue(0.0);
game.move.select(Moves.SPORE);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.SLEEP);
});
it("should take the accuracy of the magic bounce user into account", async () => {
game.override.moveset([ Moves.SPORE ]);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
const opponent = game.scene.getEnemyPokemon()!;
vi.spyOn(opponent, "getAccuracyMultiplier").mockReturnValue(0);
game.move.select(Moves.SPORE);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.status).toBeUndefined();
});
it("should always apply the leftmost available target's magic bounce when bouncing moves like sticky webs in doubles", async () => {
game.override.battleType("double");
game.override.moveset([ Moves.STICKY_WEB, Moves.SPLASH, Moves.TRICK_ROOM ]);
await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]);
const [ enemy_1, enemy_2 ] = game.scene.getEnemyField();
// set speed just incase logic erroneously checks for speed order
enemy_1.setStat(Stat.SPD, enemy_2.getStat(Stat.SPD) + 1);
// turn 1
game.move.select(Moves.STICKY_WEB, 0);
game.move.select(Moves.TRICK_ROOM, 1);
await game.phaseInterceptor.to("TurnEndPhase");
expect(game.scene.arena.getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER)?.getSourcePokemon()?.getBattlerIndex()).toBe(BattlerIndex.ENEMY);
game.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER, true);
// turn 2
game.move.select(Moves.STICKY_WEB, 0);
game.move.select(Moves.TRICK_ROOM, 1);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.arena.getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER)?.getSourcePokemon()?.getBattlerIndex()).toBe(BattlerIndex.ENEMY);
});
it("should not bounce back status moves that hit through semi-invulnerable states", async () => {
game.override.moveset([ Moves.TOXIC, Moves.CHARM ]);
await game.classicMode.startBattle([ Species.BULBASAUR ]);
game.move.select(Moves.TOXIC);
await game.forceEnemyMove(Moves.FLY);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.TOXIC);
expect(game.scene.getPlayerPokemon()!.status).toBeUndefined();
game.override.ability(Abilities.NO_GUARD);
game.move.select(Moves.CHARM);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-2);
expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0);
});
});

View File

@ -0,0 +1,116 @@
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
describe("Abilities - Perish Song", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override.battleType("single");
game.override.disableCrits();
game.override.enemySpecies(Species.MAGIKARP);
game.override.enemyAbility(Abilities.BALL_FETCH);
game.override.starterSpecies(Species.CURSOLA);
game.override.ability(Abilities.PERISH_BODY);
game.override.moveset([ Moves.SPLASH ]);
});
it("should trigger when hit with damaging move", async () => {
game.override.enemyMoveset([ Moves.AQUA_JET ]);
await game.classicMode.startBattle();
const cursola = game.scene.getPlayerPokemon();
const magikarp = game.scene.getEnemyPokemon();
game.move.select(Moves.SPLASH);
await game.toNextTurn();
expect(cursola?.summonData.tags[0].turnCount).toBe(3);
expect(magikarp?.summonData.tags[0].turnCount).toBe(3);
});
it("should trigger even when fainting", async () => {
game.override.enemyMoveset([ Moves.AQUA_JET ])
.enemyLevel(100)
.startingLevel(1);
await game.classicMode.startBattle([ Species.CURSOLA, Species.FEEBAS ]);
const magikarp = game.scene.getEnemyPokemon();
game.move.select(Moves.SPLASH);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
expect(magikarp?.summonData.tags[0].turnCount).toBe(3);
});
it("should not activate if attacker already has perish song", async () => {
game.override.enemyMoveset([ Moves.PERISH_SONG, Moves.AQUA_JET, Moves.SPLASH ]);
await game.classicMode.startBattle([ Species.FEEBAS, Species.CURSOLA ]);
const feebas = game.scene.getPlayerPokemon();
const magikarp = game.scene.getEnemyPokemon();
game.move.select(Moves.SPLASH);
await game.forceEnemyMove(Moves.PERISH_SONG);
await game.toNextTurn();
expect(feebas?.summonData.tags[0].turnCount).toBe(3);
expect(magikarp?.summonData.tags[0].turnCount).toBe(3);
game.doSwitchPokemon(1);
await game.forceEnemyMove(Moves.SPLASH);
await game.toNextTurn();
const cursola = game.scene.getPlayerPokemon();
expect(cursola?.summonData.tags.length).toBe(0);
expect(magikarp?.summonData.tags[0].turnCount).toBe(2);
game.move.select(Moves.SPLASH);
await game.forceEnemyMove(Moves.AQUA_JET);
await game.toNextTurn();
expect(cursola?.summonData.tags.length).toBe(0);
expect(magikarp?.summonData.tags[0].turnCount).toBe(1);
});
it("should activate if cursola already has perish song, but not reset its counter", async () => {
game.override.enemyMoveset([ Moves.PERISH_SONG, Moves.AQUA_JET, Moves.SPLASH ]);
game.override.moveset([ Moves.WHIRLWIND, Moves.SPLASH ]);
game.override.startingWave(5);
await game.classicMode.startBattle([ Species.CURSOLA ]);
const cursola = game.scene.getPlayerPokemon();
game.move.select(Moves.WHIRLWIND);
await game.forceEnemyMove(Moves.PERISH_SONG);
await game.toNextTurn();
const magikarp = game.scene.getEnemyPokemon();
expect(cursola?.summonData.tags[0].turnCount).toBe(3);
expect(magikarp?.summonData.tags.length).toBe(0);
game.move.select(Moves.SPLASH);
await game.forceEnemyMove(Moves.AQUA_JET);
await game.toNextTurn();
expect(cursola?.summonData.tags[0].turnCount).toBe(2);
expect(magikarp?.summonData.tags.length).toBe(1);
expect(magikarp?.summonData.tags[0].turnCount).toBe(3);
});
});

View File

@ -36,7 +36,7 @@ describe("Abilities - Sand Spit", () => {
it("should trigger when hit with damaging move", async () => {
game.override.enemyMoveset([ Moves.TACKLE ]);
await game.startBattle();
await game.classicMode.startBattle();
game.move.select(Moves.SPLASH);
await game.toNextTurn();
@ -44,9 +44,22 @@ describe("Abilities - Sand Spit", () => {
expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SANDSTORM);
}, 20000);
it("should trigger even when fainting", async () => {
game.override.enemyMoveset([ Moves.TACKLE ])
.enemyLevel(100)
.startingLevel(1);
await game.classicMode.startBattle([ Species.SILICOBRA, Species.MAGIKARP ]);
game.move.select(Moves.SPLASH);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SANDSTORM);
});
it("should not trigger when targetted with status moves", async () => {
game.override.enemyMoveset([ Moves.GROWL ]);
await game.startBattle();
await game.classicMode.startBattle();
game.move.select(Moves.COIL);
await game.toNextTurn();

View File

@ -0,0 +1,69 @@
import { TerrainType } from "#app/data/terrain";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
describe("Abilities - Seed Sower", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override.battleType("single");
game.override.disableCrits();
game.override.enemySpecies(Species.MAGIKARP);
game.override.enemyAbility(Abilities.BALL_FETCH);
game.override.starterSpecies(Species.ARBOLIVA);
game.override.ability(Abilities.SEED_SOWER);
game.override.moveset([ Moves.SPLASH ]);
});
it("should trigger when hit with damaging move", async () => {
game.override.enemyMoveset([ Moves.TACKLE ]);
await game.classicMode.startBattle();
game.move.select(Moves.SPLASH);
await game.toNextTurn();
expect(game.scene.arena.terrain?.terrainType).toBe(TerrainType.GRASSY);
});
it("should trigger even when fainting", async () => {
game.override.enemyMoveset([ Moves.TACKLE ])
.enemyLevel(100)
.startingLevel(1);
await game.classicMode.startBattle([ Species.ARBOLIVA, Species.MAGIKARP ]);
game.move.select(Moves.SPLASH);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
expect(game.scene.arena.terrain?.terrainType).toBe(TerrainType.GRASSY);
});
it("should not trigger when targetted with status moves", async () => {
game.override.enemyMoveset([ Moves.GROWL ]);
await game.classicMode.startBattle();
game.move.select(Moves.SPLASH);
await game.toNextTurn();
expect(game.scene.arena.terrain?.terrainType).not.toBe(TerrainType.GRASSY);
});
});

View File

@ -0,0 +1,178 @@
import { Moves } from "#app/enums/moves";
import { Abilities } from "#enums/abilities";
import { Species } from "#enums/species";
import { BattlerIndex } from "#app/battle";
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { allMoves } from "#app/data/move";
describe("Abilities - Supreme Overlord", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
const move = allMoves[Moves.TACKLE];
const basePower = move.power;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override
.battleType("single")
.enemySpecies(Species.MAGIKARP)
.enemyLevel(100)
.startingLevel(1)
.enemyAbility(Abilities.BALL_FETCH)
.ability(Abilities.SUPREME_OVERLORD)
.enemyMoveset([ Moves.SPLASH ])
.moveset([ Moves.TACKLE, Moves.EXPLOSION, Moves.LUNAR_DANCE ]);
vi.spyOn(move, "calculateBattlePower");
});
it("should increase Power by 20% if 2 Pokemon are fainted in the party", async() => {
await game.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]);
game.move.select(Moves.EXPLOSION);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
game.move.select(Moves.EXPLOSION);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
game.doSelectPartyPokemon(2);
await game.toNextTurn();
game.move.select(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to(MoveEffectPhase);
expect(move.calculateBattlePower).toHaveReturnedWith(basePower * 1.2);
});
it("should increase Power by 30% if an ally fainted twice and another one once", async () => {
await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]);
/**
* Bulbasur faints once
*/
game.move.select(Moves.EXPLOSION);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
/**
* Charmander faints once
*/
game.doRevivePokemon(1);
game.move.select(Moves.EXPLOSION);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
/**
* Bulbasur faints twice
*/
game.move.select(Moves.EXPLOSION);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
game.doSelectPartyPokemon(2);
await game.toNextTurn();
game.move.select(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to(MoveEffectPhase);
expect(move.calculateBattlePower).toHaveReturnedWith(basePower * 1.3);
});
it("should maintain its power during next battle if it is within the same arena encounter", async () => {
game.override
.enemySpecies(Species.MAGIKARP)
.startingWave(1)
.enemyLevel(1)
.startingLevel(100);
await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]);
/**
* The first Pokemon faints and another Pokemon in the party is selected.
*/
game.move.select(Moves.LUNAR_DANCE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
/**
* Enemy Pokemon faints and new wave is entered.
*/
game.move.select(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.toNextWave();
game.move.select(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to("TurnEndPhase");
expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower * 1.1);
});
it("should reset playerFaints count if we enter new trainer battle", async () => {
game.override
.enemySpecies(Species.MAGIKARP)
.startingWave(4)
.enemyLevel(1)
.startingLevel(100);
await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]);
game.move.select(Moves.LUNAR_DANCE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
game.move.select(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.toNextWave();
game.move.select(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to("BerryPhase", false);
expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower);
});
it("should reset playerFaints count if we enter new biome", async () => {
game.override
.enemySpecies(Species.MAGIKARP)
.startingWave(10)
.enemyLevel(1)
.startingLevel(100);
await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]);
game.move.select(Moves.LUNAR_DANCE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
game.move.select(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.toNextWave();
game.move.select(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to("BerryPhase", false);
expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower);
});
});

View File

@ -0,0 +1,219 @@
import { Moves } from "#enums/moves";
import { BattlerIndex } from "#app/battle";
import { Species } from "#enums/species";
import { Abilities } from "#enums/abilities";
import GameManager from "#test/utils/gameManager";
import { allMoves } from "#app/data/move";
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
describe("Moves - Last Respects", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
const move = allMoves[Moves.LAST_RESPECTS];
const basePower = move.power;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override
.battleType("single")
.disableCrits()
.moveset([ Moves.LAST_RESPECTS, Moves.EXPLOSION, Moves.LUNAR_DANCE ])
.ability(Abilities.BALL_FETCH)
.enemyAbility(Abilities.BALL_FETCH)
.enemySpecies(Species.MAGIKARP)
.enemyMoveset(Moves.SPLASH)
.startingLevel(1)
.enemyLevel(100);
vi.spyOn(move, "calculateBattlePower");
});
it("should have 150 power if 2 allies faint before using move", async () => {
await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]);
/**
* Bulbasur faints once
*/
game.move.select(Moves.EXPLOSION);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
/**
* Charmander faints once
*/
game.move.select(Moves.EXPLOSION);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
game.doSelectPartyPokemon(2);
await game.toNextTurn();
game.move.select(Moves.LAST_RESPECTS);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to(MoveEffectPhase);
expect(move.calculateBattlePower).toHaveReturnedWith(basePower + (2 * 50));
});
it("should have 200 power if an ally fainted twice and another one once", async () => {
await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]);
/**
* Bulbasur faints once
*/
game.move.select(Moves.EXPLOSION);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
/**
* Charmander faints once
*/
game.doRevivePokemon(1);
game.move.select(Moves.EXPLOSION);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
/**
* Bulbasur faints twice
*/
game.move.select(Moves.EXPLOSION);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
game.doSelectPartyPokemon(2);
await game.toNextTurn();
game.move.select(Moves.LAST_RESPECTS);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to(MoveEffectPhase);
expect(move.calculateBattlePower).toHaveReturnedWith(basePower + (3 * 50));
});
it("should maintain its power for the player during the next battle if it is within the same arena encounter", async () => {
game.override
.enemySpecies(Species.MAGIKARP)
.startingWave(1)
.enemyLevel(1)
.startingLevel(100)
.enemyMoveset(Moves.SPLASH);
await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]);
/**
* The first Pokemon faints and another Pokemon in the party is selected.
*/
game.move.select(Moves.LUNAR_DANCE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
/**
* Enemy Pokemon faints and new wave is entered.
*/
game.move.select(Moves.LAST_RESPECTS);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.toNextWave();
expect(game.scene.arena.playerFaints).toBe(1);
game.move.select(Moves.LAST_RESPECTS);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to("MoveEndPhase");
expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower + (1 * 50));
});
it("should reset enemyFaints count on progressing to the next wave.", async () => {
game.override
.enemySpecies(Species.MAGIKARP)
.startingWave(1)
.enemyLevel(1)
.startingLevel(100)
.enemyMoveset(Moves.LAST_RESPECTS)
.moveset([ Moves.LUNAR_DANCE, Moves.LAST_RESPECTS, Moves.SPLASH ]);
await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]);
/**
* The first Pokemon faints and another Pokemon in the party is selected.
*/
game.move.select(Moves.LUNAR_DANCE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
/**
* Enemy Pokemon faints and new wave is entered.
*/
game.move.select(Moves.LAST_RESPECTS);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.toNextWave();
expect(game.scene.currentBattle.enemyFaints).toBe(0);
game.move.select(Moves.LAST_RESPECTS);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.phaseInterceptor.to("MoveEndPhase");
expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower);
});
it("should reset playerFaints count if we enter new trainer battle", async () => {
game.override
.enemySpecies(Species.MAGIKARP)
.startingWave(4)
.enemyLevel(1)
.startingLevel(100);
await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]);
game.move.select(Moves.LUNAR_DANCE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
game.move.select(Moves.LAST_RESPECTS);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.toNextWave();
game.move.select(Moves.LAST_RESPECTS);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to("BerryPhase", false);
expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower);
});
it("should reset playerFaints count if we enter new biome", async () => {
game.override
.enemySpecies(Species.MAGIKARP)
.startingWave(10)
.enemyLevel(1)
.startingLevel(100);
await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]);
game.move.select(Moves.LUNAR_DANCE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
game.doSelectPartyPokemon(1);
await game.toNextTurn();
game.move.select(Moves.LAST_RESPECTS);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.toNextWave();
game.move.select(Moves.LAST_RESPECTS);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to("BerryPhase", false);
expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower);
});
});

View File

@ -0,0 +1,286 @@
import { BattlerIndex } from "#app/battle";
import { ArenaTagSide } from "#app/data/arena-tag";
import { allMoves } from "#app/data/move";
import { ArenaTagType } from "#app/enums/arena-tag-type";
import { BattlerTagType } from "#app/enums/battler-tag-type";
import { Stat } from "#app/enums/stat";
import { StatusEffect } from "#app/enums/status-effect";
import { MoveResult } from "#app/field/pokemon";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
describe("Moves - Magic Coat", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override
.ability(Abilities.BALL_FETCH)
.battleType("single")
.disableCrits()
.enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH)
.enemyMoveset(Moves.MAGIC_COAT);
});
it("should fail if the user goes last in the turn", async () => {
game.override.moveset([ Moves.PROTECT ]);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.move.select(Moves.PROTECT);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getEnemyPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL);
});
it("should fail if called again in the same turn due to moves like instruct", async () => {
game.override.moveset([ Moves.INSTRUCT ]);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.move.select(Moves.INSTRUCT);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getEnemyPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL);
});
it("should not reflect moves used on the next turn", async () => {
game.override.moveset([ Moves.GROWL, Moves.SPLASH ]);
game.override.enemyMoveset([ Moves.MAGIC_COAT, Moves.SPLASH ]);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
// turn 1
game.move.select(Moves.SPLASH);
await game.forceEnemyMove(Moves.MAGIC_COAT);
await game.toNextTurn();
// turn 2
game.move.select(Moves.GROWL);
await game.forceEnemyMove(Moves.SPLASH);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1);
});
it("should reflect basic status moves", async () => {
game.override.moveset([ Moves.GROWL ]);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1);
});
it("should individually bounce back multi-target moves when used by both targets in doubles", async () => {
game.override.battleType("double");
game.override.moveset([ Moves.GROWL, Moves.SPLASH ]);
await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]);
game.move.select(Moves.GROWL, 0);
game.move.select(Moves.SPLASH, 1);
await game.phaseInterceptor.to("BerryPhase");
const user = game.scene.getPlayerField()[0];
expect(user.getStatStage(Stat.ATK)).toBe(-2);
});
it("should bounce back a spread status move against both pokemon", async () => {
game.override.battleType("double");
game.override.moveset([ Moves.GROWL, Moves.SPLASH ]);
game.override.enemyMoveset([ Moves.SPLASH, Moves.MAGIC_COAT ]);
await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]);
game.move.select(Moves.GROWL, 0);
game.move.select(Moves.SPLASH, 1);
await game.forceEnemyMove(Moves.SPLASH);
await game.forceEnemyMove(Moves.MAGIC_COAT);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerField().every(p => p.getStatStage(Stat.ATK) === -1)).toBeTruthy();
});
it("should still bounce back a move that would otherwise fail", async () => {
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.scene.getEnemyPokemon()?.setStatStage(Stat.ATK, -6);
game.override.moveset([ Moves.GROWL ]);
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1);
});
it("should not bounce back a move that was just bounced", async () => {
game.override.battleType("double");
game.override.ability(Abilities.MAGIC_BOUNCE);
game.override.moveset([ Moves.GROWL, Moves.MAGIC_COAT ]);
game.override.enemyMoveset([ Moves.SPLASH, Moves.MAGIC_COAT ]);
await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]);
game.move.select(Moves.MAGIC_COAT, 0);
game.move.select(Moves.GROWL, 1);
await game.forceEnemyMove(Moves.MAGIC_COAT);
await game.forceEnemyMove(Moves.SPLASH);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getEnemyField()[0].getStatStage(Stat.ATK)).toBe(0);
});
// todo while Mirror Armor is not implemented
it.todo("should receive the stat change after reflecting a move back to a mirror armor user", async () => {
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1);
});
it("should still bounce back a move from a mold breaker user", async () => {
game.override.ability(Abilities.MOLD_BREAKER);
game.override.moveset([ Moves.GROWL ]);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(0);
expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1);
});
it("should only bounce spikes back once when both targets use magic coat in doubles", async () => {
game.override.battleType("double");
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.override.moveset([ Moves.SPIKES ]);
game.move.select(Moves.SPIKES);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1);
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)).toBeUndefined();
});
it("should not bounce back curse", async() => {
game.override.starterSpecies(Species.GASTLY);
await game.classicMode.startBattle([ Species.GASTLY ]);
game.override.moveset([ Moves.CURSE ]);
game.move.select(Moves.CURSE);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getEnemyPokemon()!.getTag(BattlerTagType.CURSED)).toBeDefined();
});
// TODO: encore is failing if the last move was virtual.
it.todo("should not cause the bounced move to count for encore", async () => {
game.override.moveset([ Moves.GROWL, Moves.ENCORE ]);
game.override.enemyMoveset([ Moves.MAGIC_COAT, Moves.TACKLE ]);
game.override.enemyAbility(Abilities.MAGIC_BOUNCE);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
const enemyPokemon = game.scene.getEnemyPokemon()!;
// turn 1
game.move.select(Moves.GROWL);
await game.forceEnemyMove(Moves.MAGIC_COAT);
await game.toNextTurn();
// turn 2
game.move.select(Moves.ENCORE);
await game.forceEnemyMove(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.phaseInterceptor.to("BerryPhase");
expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE);
expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE);
});
// TODO: stomping tantrum should consider moves that were bounced.
it.todo("should cause stomping tantrum to double in power when the last move was bounced", async () => {
game.override.battleType("single");
await game.classicMode.startBattle([ Species.MAGIKARP ]);
game.override.moveset([ Moves.STOMPING_TANTRUM, Moves.CHARM ]);
const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM];
vi.spyOn(stomping_tantrum, "calculateBattlePower");
game.move.select(Moves.CHARM);
await game.toNextTurn();
game.move.select(Moves.STOMPING_TANTRUM);
await game.phaseInterceptor.to("BerryPhase");
expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(150);
});
// TODO: stomping tantrum should consider moves that were bounced.
it.todo("should properly cause the enemy's stomping tantrum to be doubled in power after bouncing and failing", async () => {
game.override.enemyMoveset([ Moves.STOMPING_TANTRUM, Moves.SPLASH, Moves.CHARM ]);
await game.classicMode.startBattle([ Species.BULBASAUR ]);
const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM];
const enemy = game.scene.getEnemyPokemon()!;
vi.spyOn(stomping_tantrum, "calculateBattlePower");
game.move.select(Moves.SPORE);
await game.forceEnemyMove(Moves.CHARM);
await game.phaseInterceptor.to("TurnEndPhase");
expect(enemy.getLastXMoves(1)[0].result).toBe("success");
await game.phaseInterceptor.to("BerryPhase");
expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75);
await game.toNextTurn();
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75);
});
it("should respect immunities when bouncing a move", async () => {
vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100);
game.override.moveset([ Moves.THUNDER_WAVE, Moves.GROWL ]);
game.override.ability(Abilities.SOUNDPROOF);
await game.classicMode.startBattle([ Species.PHANPY ]);
// Turn 1 - thunder wave immunity test
game.move.select(Moves.THUNDER_WAVE);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.status).toBeUndefined();
// Turn 2 - soundproof immunity test
game.move.select(Moves.GROWL);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0);
});
it("should bounce back a move before the accuracy check", async () => {
game.override.moveset([ Moves.SPORE ]);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
const attacker = game.scene.getPlayerPokemon()!;
vi.spyOn(attacker, "getAccuracyMultiplier").mockReturnValue(0.0);
game.move.select(Moves.SPORE);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.SLEEP);
});
it("should take the accuracy of the magic bounce user into account", async () => {
game.override.moveset([ Moves.SPORE ]);
await game.classicMode.startBattle([ Species.MAGIKARP ]);
const opponent = game.scene.getEnemyPokemon()!;
vi.spyOn(opponent, "getAccuracyMultiplier").mockReturnValue(0);
game.move.select(Moves.SPORE);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.getPlayerPokemon()!.status).toBeUndefined();
});
});

View File

@ -0,0 +1,224 @@
import { Abilities } from "#enums/abilities";
import { BattlerIndex } from "#app/battle";
import { Stat } from "#enums/stat";
import { allMoves } from "#app/data/move";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
describe("Moves - Spectral Thief", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({ type: Phaser.HEADLESS });
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override
.enemySpecies(Species.SHUCKLE)
.enemyLevel(100)
.enemyMoveset(Moves.SPLASH)
.enemyAbility(Abilities.BALL_FETCH)
.moveset([ Moves.SPECTRAL_THIEF, Moves.SPLASH ])
.ability(Abilities.BALL_FETCH)
.disableCrits;
});
it("should steal max possible positive stat changes and ignore negative ones.", async () => {
await game.classicMode.startBattle();
const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
enemy.setStatStage(Stat.ATK, 6);
enemy.setStatStage(Stat.DEF, -6);
enemy.setStatStage(Stat.SPATK, 6);
enemy.setStatStage(Stat.SPDEF, -6);
enemy.setStatStage(Stat.SPD, 3);
player.setStatStage(Stat.ATK, 4);
player.setStatStage(Stat.DEF, 1);
player.setStatStage(Stat.SPATK, 0);
player.setStatStage(Stat.SPDEF, 0);
player.setStatStage(Stat.SPD, -2);
game.move.select(Moves.SPECTRAL_THIEF);
await game.phaseInterceptor.to(TurnEndPhase);
/**
* enemy has +6 ATK and player +4 => player only steals +2
* enemy has -6 DEF and player 1 => player should not steal
* enemy has +6 SPATK and player 0 => player only steals +6
* enemy has -6 SPDEF and player 0 => player should not steal
* enemy has +3 SPD and player -2 => player only steals +3
*/
expect(player.getStatStages()).toEqual([ 6, 1, 6, 0, 1, 0, 0 ]);
expect(enemy.getStatStages()).toEqual([ 4, -6, 0, -6, 0, 0, 0 ]);
});
it("should steal stat stages before dmg calculation", async () => {
game.override
.enemySpecies(Species.MAGIKARP)
.enemyLevel(50);
await game.classicMode.startBattle();
const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
const moveToCheck = allMoves[Moves.SPECTRAL_THIEF];
const dmgBefore = enemy.getAttackDamage(player, moveToCheck, false, false, false, false).damage;
enemy.setStatStage(Stat.ATK, 6);
player.setStatStage(Stat.ATK, 0);
game.move.select(Moves.SPECTRAL_THIEF);
await game.phaseInterceptor.to(TurnEndPhase);
expect(dmgBefore).toBeLessThan(enemy.getAttackDamage(player, moveToCheck, false, false, false, false).damage);
});
it("should steal stat stages as a negative value with Contrary.", async () => {
game.override
.ability(Abilities.CONTRARY);
await game.classicMode.startBattle();
const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
enemy.setStatStage(Stat.ATK, 6);
player.setStatStage(Stat.ATK, 0);
game.move.select(Moves.SPECTRAL_THIEF);
await game.phaseInterceptor.to(TurnEndPhase);
expect(player.getStatStage(Stat.ATK)).toEqual(-6);
expect(enemy.getStatStage(Stat.ATK)).toEqual(0);
});
it("should steal double the stat stages with Simple.", async () => {
game.override
.ability(Abilities.SIMPLE);
await game.classicMode.startBattle();
const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
enemy.setStatStage(Stat.ATK, 3);
player.setStatStage(Stat.ATK, 0);
game.move.select(Moves.SPECTRAL_THIEF);
await game.phaseInterceptor.to(TurnEndPhase);
expect(player.getStatStage(Stat.ATK)).toEqual(6);
expect(enemy.getStatStage(Stat.ATK)).toEqual(0);
});
it("should steal the stat stages through Clear Body.", async () => {
game.override
.enemyAbility(Abilities.CLEAR_BODY);
await game.classicMode.startBattle();
const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
enemy.setStatStage(Stat.ATK, 3);
player.setStatStage(Stat.ATK, 0);
game.move.select(Moves.SPECTRAL_THIEF);
await game.phaseInterceptor.to(TurnEndPhase);
expect(player.getStatStage(Stat.ATK)).toEqual(3);
expect(enemy.getStatStage(Stat.ATK)).toEqual(0);
});
it("should steal the stat stages through White Smoke.", async () => {
game.override
.enemyAbility(Abilities.WHITE_SMOKE);
await game.classicMode.startBattle();
const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
enemy.setStatStage(Stat.ATK, 3);
player.setStatStage(Stat.ATK, 0);
game.move.select(Moves.SPECTRAL_THIEF);
await game.phaseInterceptor.to(TurnEndPhase);
expect(player.getStatStage(Stat.ATK)).toEqual(3);
expect(enemy.getStatStage(Stat.ATK)).toEqual(0);
});
it("should steal the stat stages through Hyper Cutter.", async () => {
game.override
.enemyAbility(Abilities.HYPER_CUTTER);
await game.classicMode.startBattle();
const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
enemy.setStatStage(Stat.ATK, 3);
player.setStatStage(Stat.ATK, 0);
game.move.select(Moves.SPECTRAL_THIEF);
await game.phaseInterceptor.to(TurnEndPhase);
expect(player.getStatStage(Stat.ATK)).toEqual(3);
expect(enemy.getStatStage(Stat.ATK)).toEqual(0);
});
it("should bypass Substitute.", async () => {
game.override
.enemyMoveset(Moves.SUBSTITUTE);
await game.classicMode.startBattle();
const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
enemy.setStatStage(Stat.ATK, 3);
player.setStatStage(Stat.ATK, 0);
game.move.select(Moves.SPECTRAL_THIEF);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.phaseInterceptor.to(TurnEndPhase);
expect(player.getStatStage(Stat.ATK)).toEqual(3);
expect(enemy.getStatStage(Stat.ATK)).toEqual(0);
expect(enemy.hp).toBeLessThan(enemy.getMaxHp() - 1);
});
it("should get blocked by protect.", async () => {
game.override
.enemyMoveset(Moves.PROTECT);
await game.classicMode.startBattle();
const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
enemy.setStatStage(Stat.ATK, 3);
player.setStatStage(Stat.ATK, 0);
game.move.select(Moves.SPECTRAL_THIEF);
await game.phaseInterceptor.to(TurnEndPhase);
expect(player.getStatStage(Stat.ATK)).toEqual(0);
expect(enemy.getStatStage(Stat.ATK)).toEqual(3);
expect(enemy.hp).toBe(enemy.getMaxHp());
});
});

View File

@ -38,8 +38,8 @@ describe("Moves - Tera Blast", () => {
.startingHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }])
.enemySpecies(Species.MAGIKARP)
.enemyMoveset(Moves.SPLASH)
.enemyAbility(Abilities.BALL_FETCH)
.enemyLevel(20);
.enemyAbility(Abilities.STURDY)
.enemyLevel(50);
vi.spyOn(moveToCheck, "calculateBattlePower");
});

View File

@ -179,9 +179,20 @@ describe("check if every variant's sprite are correctly set", () => {
expect(errors).toEqual([]);
});
it("check exp back variant files", () => {
it("check exp back female variant files", () => {
const dirPath = `${rootDir}exp${path.sep}back${path.sep}female${path.sep}`;
const errors = getMissingFiles(expVariant.back.female, dirPath);
if (errors.length) {
console.log("errors", errors);
}
expect(errors.length).toBe(0);
});
it("check exp back male variant files", () => {
const dirPath = `${rootDir}exp${path.sep}back${path.sep}`;
const errors = getMissingFiles(expVariant.back, dirPath);
const backMaleVariant = deepCopy(expVariant.back);
delete backMaleVariant.female;
const errors = getMissingFiles(backMaleVariant, dirPath);
if (errors.length) {
console.log("errors", errors);
}
@ -239,8 +250,8 @@ describe("check if every variant's sprite are correctly set", () => {
expect(errors).toEqual([]);
});
it("look over every file in variant exp back and check if present in masterlist", () => {
const dirPath = `${rootDir}exp${path.sep}back${path.sep}`;
it("look over every file in variant exp back female and check if present in masterlist", () => {
const dirPath = `${rootDir}exp${path.sep}back${path.sep}female${path.sep}`;
const errors = getMissingMasterlist(expVariant.back, dirPath);
if (errors.length) {
console.log("errors for ", dirPath, errors);
@ -248,6 +259,15 @@ describe("check if every variant's sprite are correctly set", () => {
expect(errors).toEqual([]);
});
it("look over every file in variant exp back male and check if present in masterlist", () => {
const dirPath = `${rootDir}exp${path.sep}back${path.sep}`;
const errors = getMissingMasterlist(expVariant.back, dirPath, [ "female" ]);
if (errors.length) {
console.log("errors for ", dirPath, errors);
}
expect(errors.length).toBe(0);
});
it("look over every file in variant exp female and check if present in masterlist", () => {
const dirPath = `${rootDir}exp${path.sep}female${path.sep}`;
const errors = getMissingMasterlist(expVariant.female, dirPath);

View File

@ -6,7 +6,7 @@ import { addWindow } from "./ui-theme";
import * as Utils from "../utils";
import { argbFromRgba } from "@material/material-color-utilities";
import { Button } from "#enums/buttons";
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText";
export interface OptionSelectConfig {
xOffset?: number;

View File

@ -6,7 +6,6 @@ import { addWindow } from "./ui-theme";
import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
import { Button } from "#enums/buttons";
import i18next from "i18next";
import type { Stat } from "#app/enums/stat";
import { PERMANENT_STATS, getStatKey } from "#app/enums/stat";
export default class BattleMessageUiHandler extends MessageUiHandler {
@ -191,13 +190,12 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
});
}
promptIvs(pokemonId: number, ivs: number[], shownIvsCount: number): Promise<void> {
promptIvs(pokemonId: number, ivs: number[]): Promise<void> {
return new Promise(resolve => {
globalScene.executeWithSeedOffset(() => {
let levelUpStatsValuesText = "";
const shownStats = this.getTopIvs(ivs, shownIvsCount);
for (const s of PERMANENT_STATS) {
levelUpStatsValuesText += `${shownStats.includes(s) ? this.getIvDescriptor(ivs[s], s, pokemonId) : "???"}\n`;
levelUpStatsValuesText += `${this.getIvDescriptor(ivs[s], s, pokemonId)}\n`;
}
this.levelUpStatsValuesContent.text = levelUpStatsValuesText;
this.levelUpStatsIncrContent.setVisible(false);
@ -211,21 +209,6 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
});
}
getTopIvs(ivs: number[], shownIvsCount: number): Stat[] {
let shownStats: Stat[] = [];
if (shownIvsCount < 6) {
const statsPool = PERMANENT_STATS.slice();
// Sort the stats from highest to lowest iv
statsPool.sort((s1, s2) => ivs[s2] - ivs[s1]);
for (let i = 0; i < shownIvsCount; i++) {
shownStats.push(statsPool[i]);
}
} else {
shownStats = PERMANENT_STATS.slice();
}
return shownStats;
}
getIvDescriptor(value: number, typeIv: number, pokemonId: number): string {
const starterSpecies = globalScene.getPokemonById(pokemonId)!.species.getRootSpeciesId(); // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists
const starterIvs: number[] = globalScene.gameData.dexData[starterSpecies].ivs;

View File

@ -133,7 +133,7 @@ export class FilterText extends Phaser.GameObjects.Container {
const handler = ui.getHandler() as AwaitableUiHandler;
handler.tutorialActive = true;
// Switch to the dialog test window
this.selections[index].setText(String(i18next.t(dialogueName)));
this.selections[index].setText( dialogueName === "" ? this.defaultText : String(i18next.t(dialogueName)));
ui.revertMode();
this.onChange();
},

View File

@ -1,7 +1,17 @@
import type { Variant } from "#app/data/variant";
import { globalScene } from "#app/global-scene";
import { isNullOrUndefined } from "#app/utils";
import type PokemonSpecies from "../data/pokemon-species";
import { addTextObject, TextStyle } from "./text";
interface SpeciesDetails {
shiny?: boolean,
formIndex?: number
female?: boolean,
variant?: Variant
}
export class PokedexMonContainer extends Phaser.GameObjects.Container {
public species: PokemonSpecies;
public icon: Phaser.GameObjects.Sprite;
@ -19,16 +29,34 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container {
public tmMove2Icon: Phaser.GameObjects.Image;
public passive1Icon: Phaser.GameObjects.Image;
public passive2Icon: Phaser.GameObjects.Image;
public passive1OverlayIcon: Phaser.GameObjects.Image;
public passive2OverlayIcon: Phaser.GameObjects.Image;
public cost: number = 0;
constructor(species: PokemonSpecies) {
constructor(species: PokemonSpecies, options: SpeciesDetails = {}) {
super(globalScene, 0, 0);
this.species = species;
const { shiny, formIndex, female, variant } = options;
const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, false, true);
const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr);
if (!isNullOrUndefined(formIndex)) {
defaultProps.formIndex = formIndex;
}
if (!isNullOrUndefined(shiny)) {
defaultProps.shiny = shiny;
}
if (!isNullOrUndefined(variant)) {
defaultProps.variant = variant;
}
if (!isNullOrUndefined(female)) {
defaultProps.female = female;
}
// starter passive bg
const starterPassiveBg = globalScene.add.image(2, 5, "passive_bg");
starterPassiveBg.setOrigin(0, 0);
@ -137,7 +165,7 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container {
this.tmMove2Icon = tmMove2Icon;
// move icons
// passive icons
const passive1Icon = globalScene.add.image(3, 3, "candy");
passive1Icon.setOrigin(0, 0);
passive1Icon.setScale(0.25);
@ -145,13 +173,27 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container {
this.add(passive1Icon);
this.passive1Icon = passive1Icon;
// move icons
const passive1OverlayIcon = globalScene.add.image(12, 12, "candy_overlay");
passive1OverlayIcon.setOrigin(0, 0);
passive1OverlayIcon.setScale(0.25);
passive1OverlayIcon.setVisible(false);
this.add(passive1OverlayIcon);
this.passive1OverlayIcon = passive1OverlayIcon;
// passive icons
const passive2Icon = globalScene.add.image(12, 3, "candy");
passive2Icon.setOrigin(0, 0);
passive2Icon.setScale(0.25);
passive2Icon.setVisible(false);
this.add(passive2Icon);
this.passive2Icon = passive2Icon;
const passive2OverlayIcon = globalScene.add.image(12, 12, "candy_overlay");
passive2OverlayIcon.setOrigin(0, 0);
passive2OverlayIcon.setScale(0.25);
passive2OverlayIcon.setVisible(false);
this.add(passive2OverlayIcon);
this.passive2OverlayIcon = passive2OverlayIcon;
}
checkIconId(female, formIndex, shiny, variant) {

View File

@ -15,9 +15,8 @@ import type { SpeciesFormChange } from "#app/data/pokemon-forms";
import { pokemonFormChanges } from "#app/data/pokemon-forms";
import type { LevelMoves } from "#app/data/balance/pokemon-level-moves";
import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves";
import type { PokemonForm } from "#app/data/pokemon-species";
import type PokemonSpecies from "#app/data/pokemon-species";
import { allSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species";
import { allSpecies, getPokemonSpeciesForm, normalForm } from "#app/data/pokemon-species";
import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters";
import { starterPassiveAbilities } from "#app/data/balance/passives";
import { Type } from "#enums/type";
@ -43,9 +42,8 @@ import type { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { Button } from "#enums/buttons";
import { EggSourceType } from "#enums/egg-source-types";
import { StarterContainer } from "#app/ui/starter-container";
import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters";
import { BooleanHolder, capitalizeString, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, rgbHexToRgba, toReadableString } from "#app/utils";
import { BooleanHolder, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, rgbHexToRgba, toReadableString } from "#app/utils";
import type { Nature } from "#enums/nature";
import BgmBar from "./bgm-bar";
import * as Utils from "../utils";
@ -128,7 +126,6 @@ interface SpeciesDetails {
formIndex?: number
female?: boolean,
variant?: number,
forSeen?: boolean, // default = false
}
enum MenuOptions {
@ -147,8 +144,6 @@ enum MenuOptions {
export default class PokedexPageUiHandler extends MessageUiHandler {
private starterSelectContainer: Phaser.GameObjects.Container;
private shinyOverlay: Phaser.GameObjects.Image;
private starterContainers: StarterContainer[] = [];
private filteredStarterContainers: StarterContainer[] = [];
private pokemonNumberText: Phaser.GameObjects.Text;
private pokemonSprite: Phaser.GameObjects.Sprite;
private pokemonNameText: Phaser.GameObjects.Text;
@ -199,6 +194,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
private allSpecies: PokemonSpecies[] = [];
private species: PokemonSpecies;
private starterId: number;
private formIndex: number;
private speciesLoaded: Map<Species, boolean> = new Map<Species, boolean>();
private levelMoves: LevelMoves;
@ -312,10 +308,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
this.speciesLoaded.set(species.speciesId, false);
this.allSpecies.push(species);
const starterContainer = new StarterContainer(species).setVisible(false);
this.starterContainers.push(starterContainer);
starterBoxContainer.add(starterContainer);
}
this.starterSelectContainer.add(starterBoxContainer);
@ -391,7 +383,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
this.pokemonHatchedIcon.setScale(0.8);
this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedIcon);
this.pokemonShinyIcon = globalScene.add.sprite(14, 76, "shiny_icons");
this.pokemonShinyIcon = globalScene.add.sprite(14, 117, "shiny_icons");
this.pokemonShinyIcon.setOrigin(0.15, 0.2);
this.pokemonShinyIcon.setScale(1);
this.pokemonCaughtHatchedContainer.add(this.pokemonShinyIcon);
@ -513,7 +505,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale;
this.menuBg = addWindow(
(globalScene.game.canvas.width / 6) - (this.optionSelectText.displayWidth + 25),
(globalScene.game.canvas.width / 6 - 83),
0,
this.optionSelectText.displayWidth + 19 + 24 * this.scale,
(globalScene.game.canvas.height / 6) - 2
@ -555,8 +547,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
// Filter bar sits above everything, except the message box
this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer);
this.updateInstructions();
}
show(args: any[]): boolean {
@ -603,13 +593,15 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
const species = this.species;
const formIndex = this.formIndex ?? 0;
this.starterId = this.getStarterSpeciesId(this.species.speciesId);
const allEvolutions = pokemonEvolutions.hasOwnProperty(species.speciesId) ? pokemonEvolutions[species.speciesId] : [];
if (species.forms.length > 0) {
const form = species.forms[formIndex];
// If this form has a specific set of moves, we get them.
this.levelMoves = (formIndex > 0 && pokemonFormLevelMoves.hasOwnProperty(formIndex)) ? pokemonFormLevelMoves[species.speciesId][formIndex] : pokemonSpeciesLevelMoves[species.speciesId];
this.levelMoves = (formIndex > 0 && pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex)) ? pokemonFormLevelMoves[species.speciesId][formIndex] : pokemonSpeciesLevelMoves[species.speciesId];
this.ability1 = form.ability1;
this.ability2 = (form.ability2 === form.ability1) ? undefined : form.ability2;
this.abilityHidden = (form.abilityHidden === form.ability1) ? undefined : form.abilityHidden;
@ -629,17 +621,19 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
this.baseTotal = species.baseTotal;
}
this.eggMoves = speciesEggMoves[this.getStarterSpeciesId(species.speciesId)] ?? [];
this.hasEggMoves = Array.from({ length: 4 }, (_, em) => (globalScene.gameData.starterData[this.getStarterSpeciesId(species.speciesId)].eggMoves & (1 << em)) !== 0);
this.eggMoves = speciesEggMoves[this.starterId] ?? [];
this.hasEggMoves = Array.from({ length: 4 }, (_, em) => (globalScene.gameData.starterData[this.starterId].eggMoves & (1 << em)) !== 0);
const formKey = this.species?.forms.length > 0 ? this.species.forms[this.formIndex].formKey : "";
this.tmMoves = speciesTmMoves[species.speciesId]?.filter(m => Array.isArray(m) ? (m[0] === formKey ? true : false ) : true)
.map(m => Array.isArray(m) ? m[1] : m).sort((a, b) => allMoves[a].name > allMoves[b].name ? 1 : -1) ?? [];
const passives = starterPassiveAbilities[this.getStarterSpeciesId(species.speciesId)];
const passiveId = starterPassiveAbilities.hasOwnProperty(species.speciesId) ? species.speciesId :
starterPassiveAbilities.hasOwnProperty(this.starterId) ? this.starterId : pokemonPrevolutions[this.starterId];
const passives = starterPassiveAbilities[passiveId];
this.passive = (this.formIndex in passives) ? passives[formIndex] : passives[0];
const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(species.speciesId)];
const starterData = globalScene.gameData.starterData[this.starterId];
const abilityAttr = starterData.abilityAttr;
this.hasPassive = starterData.passiveAttr > 0;
@ -655,9 +649,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
const allBiomes = catchableSpecies[species.speciesId] ?? [];
this.preBiomes = this.sanitizeBiomes(
(catchableSpecies[this.getStarterSpeciesId(species.speciesId)] ?? [])
(catchableSpecies[this.starterId] ?? [])
.filter(b => !allBiomes.some(bm => (b.biome === bm.biome && b.tier === bm.tier)) && !(b.biome === Biome.TOWN)),
this.getStarterSpeciesId(species.speciesId));
this.starterId);
this.biomes = this.sanitizeBiomes(allBiomes, species.speciesId);
const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) ? pokemonFormChanges[species.speciesId] : [];
@ -747,14 +741,16 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
return biomes;
}
isCaught(otherSpeciesDexEntry?: DexEntry): bigint {
isCaught(otherSpecies?: PokemonSpecies): bigint {
if (globalScene.dexForDevs) {
return 255n;
}
const dexEntry = otherSpeciesDexEntry ? otherSpeciesDexEntry : this.speciesStarterDexEntry;
const species = otherSpecies ? otherSpecies : this.species;
const dexEntry = globalScene.gameData.dexData[species.speciesId];
const starterDexEntry = globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)];
return dexEntry?.caughtAttr ?? 0n;
return (dexEntry?.caughtAttr ?? 0n) & (starterDexEntry?.caughtAttr ?? 0n) & species.getFullUnlocksData();
}
/**
* Check whether a given form is caught for a given species.
@ -771,11 +767,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
}
const species = otherSpecies ? otherSpecies : this.species;
const formIndex = otherFormIndex !== undefined ? otherFormIndex : this.formIndex;
const dexEntry = globalScene.gameData.dexData[species.speciesId];
const caughtAttr = this.isCaught(species);
const isFormCaught = dexEntry ?
(dexEntry.caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n
: false;
const isFormCaught = (caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n;
return isFormCaught;
}
@ -789,8 +783,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
*/
initStarterPrefs(): StarterAttributes {
const starterAttributes : StarterAttributes | null = this.species ? { ...this.savedStarterAttributes } : null;
const dexEntry = globalScene.gameData.dexData[this.species.speciesId];
const caughtAttr = this.isCaught(dexEntry);
const caughtAttr = this.isCaught();
// no preferences or Pokemon wasn't caught, return empty attribute
if (!starterAttributes || !caughtAttr) {
@ -799,39 +792,43 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
const hasShiny = caughtAttr & DexAttr.SHINY;
const hasNonShiny = caughtAttr & DexAttr.NON_SHINY;
if (starterAttributes.shiny && !hasShiny) {
if (!hasShiny || (starterAttributes.shiny === undefined && hasNonShiny)) {
// shiny form wasn't unlocked, purging shiny and variant setting
starterAttributes.shiny = false;
starterAttributes.variant = 0;
} else if (starterAttributes.shiny === false && !hasNonShiny) {
// non shiny form wasn't unlocked, purging shiny setting
starterAttributes.shiny = false;
} else if (!hasNonShiny || (starterAttributes.shiny === undefined && hasShiny)) {
starterAttributes.shiny = true;
starterAttributes.variant = 0;
}
if (starterAttributes.variant !== undefined) {
const unlockedVariants = [
hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT,
hasShiny && caughtAttr & DexAttr.VARIANT_2,
hasShiny && caughtAttr & DexAttr.VARIANT_3
];
if (isNaN(starterAttributes.variant) || starterAttributes.variant < 0) {
starterAttributes.variant = 0;
} else if (!unlockedVariants[starterAttributes.variant]) {
let highestValidIndex = -1;
for (let i = 0; i <= starterAttributes.variant && i < unlockedVariants.length; i++) {
if (unlockedVariants[i] !== 0n) {
highestValidIndex = i;
}
const unlockedVariants = [
hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT,
hasShiny && caughtAttr & DexAttr.VARIANT_2,
hasShiny && caughtAttr & DexAttr.VARIANT_3
];
if (starterAttributes.variant === undefined || isNaN(starterAttributes.variant) || starterAttributes.variant < 0) {
starterAttributes.variant = 0;
} else if (!unlockedVariants[starterAttributes.variant]) {
let highestValidIndex = -1;
for (let i = 0; i <= starterAttributes.variant && i < unlockedVariants.length; i++) {
if (unlockedVariants[i] !== 0n) {
highestValidIndex = i;
}
// Set to the highest valid index found or default to 0
starterAttributes.variant = highestValidIndex !== -1 ? highestValidIndex : 0;
}
// Set to the highest valid index found or default to 0
starterAttributes.variant = highestValidIndex !== -1 ? highestValidIndex : 0;
}
if (starterAttributes.female !== undefined) {
if ((starterAttributes.female && !(caughtAttr & DexAttr.FEMALE)) || (!starterAttributes.female && !(caughtAttr & DexAttr.MALE))) {
starterAttributes.female = !starterAttributes.female;
}
} else {
if (caughtAttr & DexAttr.FEMALE) {
starterAttributes.female = true;
} else if (caughtAttr & DexAttr.MALE) {
starterAttributes.female = false;
}
}
return starterAttributes;
@ -878,7 +875,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
* @returns the id of the corresponding starter
*/
getStarterSpeciesId(speciesId): number {
if (globalScene.gameData.starterData.hasOwnProperty(speciesId)) {
if (speciesId === Species.PIKACHU) {
if ([ 0, 1, 8 ].includes(this.formIndex)) {
return Species.PICHU;
} else {
return Species.PIKACHU;
}
}
if (speciesStarterCosts.hasOwnProperty(speciesId)) {
return speciesId;
} else {
return pokemonStarters[speciesId];
@ -886,50 +890,13 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
}
getStarterSpecies(species): PokemonSpecies {
if (globalScene.gameData.starterData.hasOwnProperty(species.speciesId)) {
if (speciesStarterCosts.hasOwnProperty(species.speciesId)) {
return species;
} else {
return allSpecies.find(sp => sp.speciesId === pokemonStarters[species.speciesId]) ?? species;
}
}
/**
* Assign a form string to a given species and form
* @param formKey the form to format
* @param species the species to format
* @param speciesId whether the name of the species should be shown at the end
* @returns the formatted string
*/
getFormString(formKey: string, species: PokemonSpecies, append: boolean = false): string {
let label: string;
const formText = capitalizeString(formKey, "-", false, false) ?? "";
const speciesName = capitalizeString(this.getStarterSpecies(species).name, "_", true, false) ?? "";
if (species.speciesId === Species.ARCEUS) {
label = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`);
return label;
}
label = formText ? i18next.t(`pokemonForm:${speciesName}${formText}`) : "";
if (label === `${speciesName}${formText}`) {
label = i18next.t(`battlePokemonForm:${formKey}`, { pokemonName:species.name });
} else {
// If the label is only the form, we can append the name of the pokemon
label += append ? ` ${species.name}` : "";
}
return label;
}
/**
* Find the name of the region for regional species
* @param species the species to check
* @returns a string with the region name
*/
getRegionName(species: PokemonSpecies): string {
const name = species.name;
const label = Species[species.speciesId];
const suffix = label.includes("_") ? " (" + label.split("_")[0].toLowerCase() + ")" : "";
return name + suffix;
}
processInput(button: Button): boolean {
if (this.blockInput) {
return false;
@ -970,7 +937,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
}
} else {
const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(this.species.speciesId)];
const starterData = globalScene.gameData.starterData[this.starterId];
// prepare persistent starter data to store changes
const starterAttributes = this.starterAttributes;
@ -1126,6 +1093,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
if (!isCaught || !isFormCaught) {
error = true;
} else if (this.tmMoves.length < 1) {
ui.showText(i18next.t("pokedexUiHandler:noTmMoves"));
error = true;
} else {
this.blockInput = true;
@ -1264,7 +1234,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
case MenuOptions.BIOMES:
if (!(this.isCaught() || this.speciesStarterDexEntry?.seenAttr)) {
if (!(isCaught || this.speciesStarterDexEntry?.seenAttr)) {
error = true;
} else {
this.blockInput = true;
@ -1366,13 +1336,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
});
this.prevolutions.map(pre => {
const preSpecies = allSpecies.find(species => species.speciesId === pokemonPrevolutions[this.species.speciesId]);
const preFormIndex: number = preSpecies?.forms.find(f => f.formKey === pre.preFormKey)?.formIndex ?? 0;
const conditionText: string = pre.description;
options.push({
label: pre.preFormKey ?
this.getFormString(pre.preFormKey, preSpecies ?? this.species, true) :
this.getRegionName(preSpecies ?? this.species),
(preSpecies ?? this.species).getFormNameToDisplay(preFormIndex, true) :
(preSpecies ?? this.species).getExpandedSpeciesName(),
handler: () => {
const newSpecies = allSpecies.find(species => species.speciesId === pokemonPrevolutions[pre.speciesId]);
// Attempts to find the formIndex of the prevolved species
@ -1400,8 +1371,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
});
this.evolutions.map(evo => {
const evoSpecies = allSpecies.find(species => species.speciesId === evo.speciesId);
const evoSpeciesStarterDexEntry = evoSpecies ? globalScene.gameData.dexData[evoSpecies.speciesId] : undefined;
const isCaughtEvo = this.isCaught(evoSpeciesStarterDexEntry) ? true : false;
const isCaughtEvo = this.isCaught(evoSpecies) ? true : false;
// Attempts to find the formIndex of the evolved species
const newFormKey = evo.evoFormKey ? evo.evoFormKey : (this.species.forms.length > 0 ? this.species.forms[this.formIndex].formKey : "");
const matchingForm = evoSpecies?.forms.find(form => form.formKey === newFormKey);
@ -1412,8 +1382,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
options.push({
label: evo.evoFormKey ?
this.getFormString(evo.evoFormKey, evoSpecies ?? this.species, true) :
this.getRegionName(evoSpecies ?? this.species),
(evoSpecies ?? this.species).getFormNameToDisplay(newFormIndex, true) :
(evoSpecies ?? this.species).getExpandedSpeciesName(),
style: isCaughtEvo && isFormCaughtEvo ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT,
handler: () => {
this.starterAttributes.form = newFormIndex;
@ -1436,6 +1406,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
handler: () => false
});
this.battleForms.map(bf => {
const matchingForm = this.species?.forms.find(form => form.formKey === bf.formKey);
const newFormIndex = matchingForm ? matchingForm.formIndex : 0;
let conditionText:string = "";
if (bf.trigger) {
@ -1443,12 +1415,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
} else {
conditionText = "";
}
let label: string = this.getFormString(bf.formKey, this.species);
let label: string = this.species.getFormNameToDisplay(newFormIndex);
if (label === "") {
label = this.species.name;
}
const matchingForm = this.species?.forms.find(form => form.formKey === bf.formKey);
const newFormIndex = matchingForm ? matchingForm.formIndex : 0;
const isFormCaught = this.isFormCaught(this.species, newFormIndex);
if (conditionText) {
@ -1563,6 +1533,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
this.pokemonShinyIcon.setVisible(true);
starterAttributes.shiny = true;
this.savedStarterAttributes.shiny = starterAttributes.shiny;
} else {
let newVariant = props.variant;
do {
@ -1611,7 +1582,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
if (this.species.forms[newFormIndex].isStarterSelectable || globalScene.dexForDevs) { // TODO: are those bangs correct?
break;
}
} while (newFormIndex !== props.formIndex);
} while (newFormIndex !== props.formIndex || this.species.forms[newFormIndex].isUnobtainable);
starterAttributes.form = newFormIndex; // store the selected form
this.savedStarterAttributes.form = starterAttributes.form;
this.formIndex = newFormIndex;
@ -1633,90 +1604,55 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
error = true;
} else {
const ui = this.getUi();
ui.showText("");
const options: any[] = []; // TODO: add proper type
const passiveAttr = starterData.passiveAttr;
const candyCount = starterData.candyCount;
if (!pokemonPrevolutions.hasOwnProperty(this.species.speciesId)) {
if (!(passiveAttr & PassiveAttr.UNLOCKED)) {
const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.getStarterSpeciesId(this.species.speciesId)]);
options.push({
label: `x${passiveCost} ${i18next.t("pokedexUiHandler:unlockPassive")} (${allAbilities[this.passive].name})`,
handler: () => {
if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) {
starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED;
if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) {
starterData.candyCount -= passiveCost;
}
this.pokemonCandyCountText.setText(`x${starterData.candyCount}`);
globalScene.gameData.saveSystem().then(success => {
if (!success) {
return globalScene.reset(true);
}
});
ui.setMode(Mode.POKEDEX_PAGE, "refresh");
this.setSpeciesDetails(this.species);
globalScene.playSound("se/buy");
return true;
}
return false;
},
item: "candy",
itemArgs: starterColors[this.getStarterSpeciesId(this.species.speciesId)]
});
}
// Reduce cost option
const valueReduction = starterData.valueReduction;
if (valueReduction < valueReductionMax) {
const reductionCost = getValueReductionCandyCounts(speciesStarterCosts[this.getStarterSpeciesId(this.species.speciesId)])[valueReduction];
options.push({
label: `x${reductionCost} ${i18next.t("pokedexUiHandler:reduceCost")}`,
handler: () => {
if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= reductionCost) {
starterData.valueReduction++;
if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) {
starterData.candyCount -= reductionCost;
}
this.pokemonCandyCountText.setText(`x${starterData.candyCount}`);
globalScene.gameData.saveSystem().then(success => {
if (!success) {
return globalScene.reset(true);
}
});
ui.setMode(Mode.POKEDEX_PAGE, "refresh");
globalScene.playSound("se/buy");
return true;
}
return false;
},
item: "candy",
itemArgs: starterColors[this.getStarterSpeciesId(this.species.speciesId)]
});
}
// Same species egg menu option.
const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarterCosts[this.getStarterSpeciesId(this.species.speciesId)]);
if (!(passiveAttr & PassiveAttr.UNLOCKED)) {
const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.starterId]);
options.push({
label: `x${sameSpeciesEggCost} ${i18next.t("pokedexUiHandler:sameSpeciesEgg")}`,
label: `x${passiveCost} ${i18next.t("pokedexUiHandler:unlockPassive")} (${allAbilities[this.passive].name})`,
handler: () => {
if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost) {
if (globalScene.gameData.eggs.length >= 99 && !Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) {
// Egg list full, show error message at the top of the screen and abort
this.showText(i18next.t("egg:tooManyEggs"), undefined, () => this.showText("", 0, () => this.tutorialActive = false), 2000, false, undefined, true);
return false;
}
if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) {
starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED;
if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) {
starterData.candyCount -= sameSpeciesEggCost;
starterData.candyCount -= passiveCost;
}
this.pokemonCandyCountText.setText(`x${starterData.candyCount}`);
globalScene.gameData.saveSystem().then(success => {
if (!success) {
return globalScene.reset(true);
}
});
this.setSpeciesDetails(this.species);
globalScene.playSound("se/buy");
ui.setMode(Mode.POKEDEX_PAGE, "refresh");
const egg = new Egg({ scene: globalScene, species: this.species.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG });
egg.addEggToGameData();
return true;
}
return false;
},
style: this.isPassiveAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT,
item: "candy",
itemArgs: this.isPassiveAvailable() ? starterColors[this.starterId] : [ "808080", "808080" ]
});
}
// Reduce cost option
const valueReduction = starterData.valueReduction;
if (valueReduction < valueReductionMax) {
const reductionCost = getValueReductionCandyCounts(speciesStarterCosts[this.starterId])[valueReduction];
options.push({
label: `x${reductionCost} ${i18next.t("pokedexUiHandler:reduceCost")}`,
handler: () => {
if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= reductionCost) {
starterData.valueReduction++;
if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) {
starterData.candyCount -= reductionCost;
}
this.pokemonCandyCountText.setText(`x${starterData.candyCount}`);
globalScene.gameData.saveSystem().then(success => {
if (!success) {
return globalScene.reset(true);
@ -1729,24 +1665,59 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
}
return false;
},
style: this.isValueReductionAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT,
item: "candy",
itemArgs: starterColors[this.getStarterSpeciesId(this.species.speciesId)]
itemArgs: this.isValueReductionAvailable() ? starterColors[this.starterId] : [ "808080", "808080" ]
});
options.push({
label: i18next.t("menu:cancel"),
handler: () => {
}
// Same species egg menu option.
const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarterCosts[this.starterId]);
options.push({
label: `x${sameSpeciesEggCost} ${i18next.t("pokedexUiHandler:sameSpeciesEgg")}`,
handler: () => {
if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost) {
if (globalScene.gameData.eggs.length >= 99 && !Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) {
// Egg list full, show error message at the top of the screen and abort
this.showText(i18next.t("egg:tooManyEggs"), undefined, () => this.showText("", 0, () => this.tutorialActive = false), 2000, false, undefined, true);
return false;
}
if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) {
starterData.candyCount -= sameSpeciesEggCost;
}
this.pokemonCandyCountText.setText(`x${starterData.candyCount}`);
const egg = new Egg({ scene: globalScene, species: this.starterId, sourceType: EggSourceType.SAME_SPECIES_EGG });
egg.addEggToGameData();
globalScene.gameData.saveSystem().then(success => {
if (!success) {
return globalScene.reset(true);
}
});
ui.setMode(Mode.POKEDEX_PAGE, "refresh");
globalScene.playSound("se/buy");
return true;
}
});
ui.setModeWithoutClear(Mode.OPTION_SELECT, {
options: options,
yOffset: 47
});
success = true;
} else {
error = true;
}
return false;
},
style: this.isSameSpeciesEggAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT,
item: "candy",
itemArgs: this.isSameSpeciesEggAvailable() ? starterColors[this.starterId] : [ "808080", "808080" ]
});
options.push({
label: i18next.t("menu:cancel"),
handler: () => {
ui.setMode(Mode.POKEDEX_PAGE, "refresh");
return true;
}
});
ui.setModeWithoutClear(Mode.OPTION_SELECT, {
options: options,
yOffset: 47
});
success = true;
}
break;
case Button.CYCLE_ABILITY:
@ -1877,15 +1848,16 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
if (this.isCaught()) {
if (isFormCaught) {
if (!pokemonPrevolutions.hasOwnProperty(this.species.speciesId)) {
this.updateButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.candyUpgradeIconElement, this.candyUpgradeLabel);
}
this.updateButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.candyUpgradeIconElement, this.candyUpgradeLabel);
if (this.canCycleShiny) {
this.updateButtonIcon(SettingKeyboard.Button_Cycle_Shiny, gamepadType, this.shinyIconElement, this.shinyLabel);
}
if (this.canCycleGender) {
this.updateButtonIcon(SettingKeyboard.Button_Cycle_Gender, gamepadType, this.genderIconElement, this.genderLabel);
}
} else {
// Making space for "Uncaught" text
this.instructionRowY += 8;
}
if (this.canCycleForm) {
this.updateButtonIcon(SettingKeyboard.Button_Cycle_Form, gamepadType, this.formIconElement, this.formLabel);
@ -1936,16 +1908,51 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
}
getFriendship(speciesId: number) {
let currentFriendship = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].friendship;
let currentFriendship = globalScene.gameData.starterData[this.starterId].friendship;
if (!currentFriendship || currentFriendship === undefined) {
currentFriendship = 0;
}
const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[this.getStarterSpeciesId(speciesId)]);
const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[this.starterId]);
return { currentFriendship, friendshipCap };
}
/**
* Determines if a passive upgrade is available for the current species
* @returns true if the user has enough candies and a passive has not been unlocked already
*/
isPassiveAvailable(): boolean {
// Get this species ID's starter data
const starterData = globalScene.gameData.starterData[this.starterId];
return starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[this.starterId])
&& !(starterData.passiveAttr & PassiveAttr.UNLOCKED);
}
/**
* Determines if a value reduction upgrade is available for the current species
* @returns true if the user has enough candies and all value reductions have not been unlocked already
*/
isValueReductionAvailable(): boolean {
// Get this species ID's starter data
const starterData = globalScene.gameData.starterData[this.starterId];
return starterData.candyCount >= getValueReductionCandyCounts(speciesStarterCosts[this.starterId])[starterData.valueReduction]
&& starterData.valueReduction < valueReductionMax;
}
/**
* Determines if an same species egg can be bought for the current species
* @returns true if the user has enough candies
*/
isSameSpeciesEggAvailable(): boolean {
// Get this species ID's starter data
const starterData = globalScene.gameData.starterData[this.starterId];
return starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarterCosts[this.starterId]);
}
setSpecies() {
const species = this.species;
const starterAttributes : StarterAttributes | null = species ? { ...this.starterAttributes } : null;
@ -1967,88 +1974,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
if (species && (this.speciesStarterDexEntry?.seenAttr || this.isCaught())) {
this.pokemonNumberText.setText(padInt(species.speciesId, 4));
if (starterAttributes?.nickname) {
const name = decodeURIComponent(escape(atob(starterAttributes.nickname)));
this.pokemonNameText.setText(name);
} else {
this.pokemonNameText.setText(species.name);
}
if (this.isCaught()) {
const colorScheme = starterColors[species.speciesId];
const luck = globalScene.gameData.getDexAttrLuck(this.isCaught());
this.pokemonLuckText.setVisible(!!luck);
this.pokemonLuckText.setText(luck.toString());
this.pokemonLuckText.setTint(getVariantTint(Math.min(luck - 1, 2) as Variant));
this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible);
//Growth translate
let growthReadable = toReadableString(GrowthRate[species.growthRate]);
const growthAux = growthReadable.replace(" ", "_");
if (i18next.exists("growth:" + growthAux)) {
growthReadable = i18next.t("growth:" + growthAux as any);
}
this.pokemonGrowthRateText.setText(growthReadable);
this.pokemonGrowthRateText.setColor(getGrowthRateColor(species.growthRate));
this.pokemonGrowthRateText.setShadowColor(getGrowthRateColor(species.growthRate, true));
this.pokemonGrowthRateLabelText.setVisible(true);
this.pokemonUncaughtText.setVisible(false);
this.pokemonCaughtCountText.setText(`${this.speciesStarterDexEntry?.caughtCount}`);
if (species.speciesId === Species.MANAPHY || species.speciesId === Species.PHIONE) {
this.pokemonHatchedIcon.setFrame("manaphy");
} else {
this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species));
}
this.pokemonHatchedCountText.setText(`${this.speciesStarterDexEntry?.hatchedCount}`);
const defaultDexAttr = this.getCurrentDexProps(species.speciesId);
const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr);
const variant = defaultProps.variant;
const tint = getVariantTint(variant);
this.pokemonShinyIcon.setFrame(getVariantIcon(variant));
this.pokemonShinyIcon.setTint(tint);
this.pokemonShinyIcon.setVisible(defaultProps.shiny);
this.pokemonCaughtHatchedContainer.setVisible(true);
this.pokemonFormText.setVisible(true);
if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) {
this.pokemonCaughtHatchedContainer.setY(16);
this.pokemonShinyIcon.setY(135);
this.pokemonShinyIcon.setFrame(getVariantIcon(variant));
[
this.pokemonCandyContainer,
this.pokemonHatchedIcon,
this.pokemonHatchedCountText
].map(c => c.setVisible(false));
this.pokemonFormText.setY(25);
} else {
this.pokemonCaughtHatchedContainer.setY(25);
this.pokemonShinyIcon.setY(117);
this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0])));
this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1])));
this.pokemonCandyCountText.setText(`x${globalScene.gameData.starterData[this.getStarterSpeciesId(species.speciesId)].candyCount}`);
this.pokemonCandyContainer.setVisible(true);
this.pokemonFormText.setY(42);
this.pokemonHatchedIcon.setVisible(true);
this.pokemonHatchedCountText.setVisible(true);
const { currentFriendship, friendshipCap } = this.getFriendship(this.species.speciesId);
const candyCropY = 16 - (16 * (currentFriendship / friendshipCap));
this.pokemonCandyDarknessOverlay.setCrop(0, 0, 16, candyCropY);
this.pokemonCandyContainer.on("pointerover", () => {
globalScene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true);
this.activeTooltip = "CANDY";
});
this.pokemonCandyContainer.on("pointerout", () => {
globalScene.ui.hideTooltip();
this.activeTooltip = undefined;
});
}
// Set default attributes if for some reason starterAttributes does not exist or attributes missing
const props: StarterAttributes = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr);
if (starterAttributes?.variant && !isNaN(starterAttributes.variant)) {
@ -2065,12 +1994,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
female: props.female,
variant: props.variant ?? 0,
});
if (this.isFormCaught(this.species, props.form)) {
const speciesForm = getPokemonSpeciesForm(species.speciesId, props.form ?? 0);
this.setTypeIcons(speciesForm.type1, speciesForm.type2);
this.pokemonSprite.clearTint();
}
} else {
this.pokemonGrowthRateText.setText("");
this.pokemonGrowthRateLabelText.setVisible(false);
@ -2092,7 +2015,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
formIndex: props.formIndex,
female: props.female,
variant: props.variant,
forSeen: true
});
this.pokemonSprite.setTint(0x808080);
}
@ -2123,7 +2045,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}, forceUpdate?: boolean): void {
let { shiny, formIndex, female, variant } = options;
const forSeen: boolean = options.forSeen ?? false;
const oldProps = species ? this.starterAttributes : null;
// We will only update the sprite if there is a change to form, shiny/variant
@ -2174,7 +2095,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
if (species) {
const dexEntry = globalScene.gameData.dexData[species.speciesId];
const caughtAttr = this.isCaught(dexEntry);
const caughtAttr = this.isCaught(species);
if (!caughtAttr) {
const props = this.starterAttributes;
@ -2194,12 +2115,12 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
}
const isFormCaught = this.isFormCaught();
const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false;
this.shinyOverlay.setVisible(shiny ?? false); // TODO: is false the correct default?
this.pokemonNumberText.setColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, false));
this.pokemonNumberText.setShadowColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, true));
const assetLoadCancelled = new BooleanHolder(false);
this.assetLoadCancelled = assetLoadCancelled;
@ -2221,13 +2142,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
this.pokemonSprite.setVisible(!this.statsMode);
}
const currentFilteredContainer = this.filteredStarterContainers.find(p => p.species.speciesId === species.speciesId);
if (currentFilteredContainer) {
const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite;
starterSprite.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female!, formIndex, shiny, variant));
currentFilteredContainer.checkIconId(female, formIndex, shiny, variant);
}
const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY);
const isShinyCaught = !!(caughtAttr & DexAttr.SHINY);
@ -2250,27 +2164,132 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
this.pokemonGenderText.setText("");
}
if (caughtAttr) {
if (isFormCaught) {
this.species.loadAssets(female!, formIndex, shiny, variant as Variant, true).then(() => {
const crier = (this.species.forms && this.species.forms.length > 0) ? this.species.forms[formIndex ?? this.formIndex] : this.species;
crier.cry();
});
this.pokemonSprite.clearTint();
} else {
this.pokemonSprite.setTint(0x000000);
}
// Setting the name
if (isFormCaught || isFormSeen) {
this.pokemonNameText.setText(species.name);
} else {
this.pokemonNameText.setText(species ? "???" : "");
}
if (caughtAttr || forSeen) {
// Setting tint of the sprite
if (isFormCaught) {
this.species.loadAssets(female!, formIndex, shiny, variant as Variant, true).then(() => {
const crier = (this.species.forms && this.species.forms.length > 0) ? this.species.forms[formIndex ?? this.formIndex] : this.species;
crier.cry();
});
this.pokemonSprite.clearTint();
} else if (isFormSeen) {
this.pokemonSprite.setTint(0x808080);
} else {
this.pokemonSprite.setTint(0);
}
// Setting luck text and sparks
if (isFormCaught) {
const luck = globalScene.gameData.getDexAttrLuck(this.isCaught());
this.pokemonLuckText.setVisible(!!luck);
this.pokemonLuckText.setText(luck.toString());
this.pokemonLuckText.setTint(getVariantTint(Math.min(luck - 1, 2) as Variant));
this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible);
} else {
this.pokemonLuckText.setVisible(false);
this.pokemonLuckLabelText.setVisible(false);
}
// Setting growth rate text
if (isFormCaught) {
let growthReadable = toReadableString(GrowthRate[species.growthRate]);
const growthAux = growthReadable.replace(" ", "_");
if (i18next.exists("growth:" + growthAux)) {
growthReadable = i18next.t("growth:" + growthAux as any);
}
this.pokemonGrowthRateText.setText(growthReadable);
this.pokemonGrowthRateText.setColor(getGrowthRateColor(species.growthRate));
this.pokemonGrowthRateText.setShadowColor(getGrowthRateColor(species.growthRate, true));
this.pokemonGrowthRateLabelText.setVisible(true);
} else {
this.pokemonGrowthRateText.setText("");
this.pokemonGrowthRateLabelText.setVisible(false);
}
// Caught and hatched
if (isFormCaught) {
const colorScheme = starterColors[this.starterId];
this.pokemonUncaughtText.setVisible(false);
this.pokemonCaughtCountText.setText(`${this.speciesStarterDexEntry?.caughtCount}`);
if (species.speciesId === Species.MANAPHY || species.speciesId === Species.PHIONE) {
this.pokemonHatchedIcon.setFrame("manaphy");
} else {
this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species));
}
this.pokemonHatchedCountText.setText(`${this.speciesStarterDexEntry?.hatchedCount}`);
const defaultDexAttr = this.getCurrentDexProps(species.speciesId);
const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr);
const variant = defaultProps.variant;
const tint = getVariantTint(variant);
this.pokemonShinyIcon.setFrame(getVariantIcon(variant));
this.pokemonShinyIcon.setTint(tint);
this.pokemonShinyIcon.setVisible(defaultProps.shiny);
this.pokemonCaughtHatchedContainer.setVisible(true);
this.pokemonCaughtHatchedContainer.setY(25);
this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0])));
this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1])));
this.pokemonCandyCountText.setText(`x${globalScene.gameData.starterData[this.starterId].candyCount}`);
this.pokemonCandyContainer.setVisible(true);
if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) {
this.pokemonShinyIcon.setFrame(getVariantIcon(variant));
this.pokemonHatchedIcon.setVisible(false);
this.pokemonHatchedCountText.setVisible(false);
this.pokemonFormText.setY(36);
} else {
this.pokemonHatchedIcon.setVisible(true);
this.pokemonHatchedCountText.setVisible(true);
this.pokemonFormText.setY(42);
const { currentFriendship, friendshipCap } = this.getFriendship(this.species.speciesId);
const candyCropY = 16 - (16 * (currentFriendship / friendshipCap));
this.pokemonCandyDarknessOverlay.setCrop(0, 0, 16, candyCropY);
this.pokemonCandyContainer.on("pointerover", () => {
globalScene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true);
this.activeTooltip = "CANDY";
});
this.pokemonCandyContainer.on("pointerout", () => {
globalScene.ui.hideTooltip();
this.activeTooltip = undefined;
});
}
} else {
this.pokemonUncaughtText.setVisible(true);
this.pokemonCaughtHatchedContainer.setVisible(false);
this.pokemonCandyContainer.setVisible(false);
this.pokemonShinyIcon.setVisible(false);
}
// Setting type icons and form text
if (isFormCaught || isFormSeen) {
const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex!); // TODO: is the bang correct?
this.setTypeIcons(speciesForm.type1, speciesForm.type2);
this.pokemonFormText.setText(this.getFormString((speciesForm as PokemonForm).formKey, species));
// TODO: change this once forms are refactored
if (normalForm.includes(species.speciesId) && !formIndex) {
this.pokemonFormText.setText("");
} else {
this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex));
}
this.pokemonFormText.setVisible(true);
if (!isFormCaught) {
this.pokemonFormText.setY(18);
}
} else {
this.setTypeIcons(null, null);
this.pokemonFormText.setText("");
this.pokemonFormText.setVisible(false);
}
} else {
this.shinyOverlay.setVisible(false);
@ -2307,7 +2326,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
*/
getCurrentDexProps(speciesId: number): bigint {
let props = 0n;
const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr;
const species = allSpecies.find(sp => sp.speciesId === speciesId);
const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & (species?.getFullUnlocksData() ?? 0n);
/* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props
* It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props

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