Merge branch 'beta' into prabbyd4867

This commit is contained in:
NightKev 2024-11-29 13:40:38 -08:00 committed by GitHub
commit 75f81a92a6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
26 changed files with 2430 additions and 6279 deletions

87
package-lock.json generated
View File

@ -16,6 +16,7 @@
"i18next-http-backend": "^2.6.1",
"i18next-korean-postposition-processor": "^1.0.0",
"json-stable-stringify": "^1.1.0",
"jszip": "^3.10.1",
"phaser": "^3.70.0",
"phaser3-rex-plugins": "^1.1.84"
},
@ -2723,6 +2724,11 @@
"node": ">= 0.6"
}
},
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"node_modules/cross-fetch": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
@ -4045,6 +4051,11 @@
"node": ">= 4"
}
},
"node_modules/immediate": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
"integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
},
"node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@ -4072,6 +4083,11 @@
"node": ">=0.8.19"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/ini": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
@ -4481,6 +4497,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/jszip": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
"integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
"dependencies": {
"lie": "~3.3.0",
"pako": "~1.0.2",
"readable-stream": "~2.3.6",
"setimmediate": "^1.0.5"
}
},
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@ -4648,6 +4675,14 @@
"node": ">= 0.8.0"
}
},
"node_modules/lie": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
"integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
"dependencies": {
"immediate": "~3.0.5"
}
},
"node_modules/linkify-it": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
@ -5237,6 +5272,11 @@
"dev": true,
"license": "BlueOak-1.0.0"
},
"node_modules/pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
},
"node_modules/papaparse": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz",
@ -5485,6 +5525,11 @@
"node": ">= 0.8.0"
}
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"node_modules/prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@ -5551,6 +5596,25 @@
}
]
},
"node_modules/readable-stream": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/readable-stream/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
},
"node_modules/rechoir": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
@ -5741,6 +5805,11 @@
"tslib": "^2.1.0"
}
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"node_modules/safe-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz",
@ -5800,6 +5869,11 @@
"node": ">= 0.4"
}
},
"node_modules/setimmediate": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
"integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@ -5917,6 +5991,14 @@
"dev": true,
"license": "MIT"
},
"node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/string-width": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
@ -6473,6 +6555,11 @@
"requires-port": "^1.0.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
"node_modules/vite": {
"version": "5.4.8",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz",

View File

@ -55,6 +55,7 @@
"i18next-http-backend": "^2.6.1",
"i18next-korean-postposition-processor": "^1.0.0",
"json-stable-stringify": "^1.1.0",
"jszip": "^3.10.1",
"phaser": "^3.70.0",
"phaser3-rex-plugins": "^1.1.84"
},

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@ -1,776 +1,299 @@
{
"textures": [
{
"image": "47.png",
"format": "RGBA8888",
"size": {
"w": 230,
"h": 230
},
"scale": 1,
"frames": [
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 6,
"y": 12,
"w": 56,
"h": 49
},
"frame": {
"x": 0,
"y": 0,
"w": 56,
"h": 49
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 6,
"y": 12,
"w": 56,
"h": 49
},
"frame": {
"x": 0,
"y": 0,
"w": 56,
"h": 49
}
},
{
"filename": "0027.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 12,
"w": 62,
"h": 51
},
"frame": {
"x": 56,
"y": 0,
"w": 62,
"h": 51
}
},
{
"filename": "0028.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 12,
"w": 62,
"h": 51
},
"frame": {
"x": 56,
"y": 0,
"w": 62,
"h": 51
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 7,
"y": 8,
"w": 55,
"h": 53
},
"frame": {
"x": 118,
"y": 0,
"w": 55,
"h": 53
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 7,
"y": 8,
"w": 55,
"h": 53
},
"frame": {
"x": 118,
"y": 0,
"w": 55,
"h": 53
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 7,
"y": 7,
"w": 55,
"h": 54
},
"frame": {
"x": 173,
"y": 0,
"w": 55,
"h": 54
}
},
{
"filename": "0012.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 7,
"y": 7,
"w": 55,
"h": 54
},
"frame": {
"x": 173,
"y": 0,
"w": 55,
"h": 54
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 8,
"y": 5,
"w": 53,
"h": 56
},
"frame": {
"x": 0,
"y": 49,
"w": 53,
"h": 56
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 8,
"y": 5,
"w": 53,
"h": 56
},
"frame": {
"x": 0,
"y": 49,
"w": 53,
"h": 56
}
},
{
"filename": "0025.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 8,
"w": 62,
"h": 55
},
"frame": {
"x": 53,
"y": 51,
"w": 62,
"h": 55
}
},
{
"filename": "0026.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 8,
"w": 62,
"h": 55
},
"frame": {
"x": 53,
"y": 51,
"w": 62,
"h": 55
}
},
{
"filename": "0013.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 8,
"y": 4,
"w": 53,
"h": 57
},
"frame": {
"x": 115,
"y": 53,
"w": 53,
"h": 57
}
},
{
"filename": "0014.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 8,
"y": 4,
"w": 53,
"h": 57
},
"frame": {
"x": 115,
"y": 53,
"w": 53,
"h": 57
}
},
{
"filename": "0029.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 7,
"w": 62,
"h": 56
},
"frame": {
"x": 168,
"y": 54,
"w": 62,
"h": 56
}
},
{
"filename": "0030.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 7,
"w": 62,
"h": 56
},
"frame": {
"x": 168,
"y": 54,
"w": 62,
"h": 56
}
},
{
"filename": "0023.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 5,
"w": 61,
"h": 58
},
"frame": {
"x": 0,
"y": 106,
"w": 61,
"h": 58
}
},
{
"filename": "0024.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 5,
"w": 61,
"h": 58
},
"frame": {
"x": 0,
"y": 106,
"w": 61,
"h": 58
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 6,
"y": 2,
"w": 54,
"h": 59
},
"frame": {
"x": 61,
"y": 106,
"w": 54,
"h": 59
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 6,
"y": 2,
"w": 54,
"h": 59
},
"frame": {
"x": 61,
"y": 106,
"w": 54,
"h": 59
}
},
{ "frames": [
{
"filename": "0001.png",
"frame": { "x": 0, "y": 58, "w": 55, "h": 57 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 2,
"w": 57,
"h": 59
},
"frame": {
"x": 115,
"y": 110,
"w": 57,
"h": 59
}
"spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0002.png",
"frame": { "x": 0, "y": 58, "w": 55, "h": 57 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 2,
"w": 57,
"h": 59
},
"frame": {
"x": 115,
"y": 110,
"w": 57,
"h": 59
}
"spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0019.png",
"filename": "0003.png",
"frame": { "x": 166, "y": 114, "w": 52, "h": 56 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 2,
"w": 57,
"h": 59
},
"frame": {
"x": 115,
"y": 110,
"w": 57,
"h": 59
}
"spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 56 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0020.png",
"filename": "0004.png",
"frame": { "x": 166, "y": 114, "w": 52, "h": 56 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
"spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 56 },
"sourceSize": { "w": 65, "h": 65 }
},
"spriteSourceSize": {
"x": 2,
"y": 2,
"w": 57,
"h": 59
{
"filename": "0005.png",
"frame": { "x": 0, "y": 169, "w": 51, "h": 54 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 7, "w": 51, "h": 54 },
"sourceSize": { "w": 65, "h": 65 }
},
"frame": {
"x": 115,
"y": 110,
"w": 57,
"h": 59
}
{
"filename": "0006.png",
"frame": { "x": 0, "y": 169, "w": 51, "h": 54 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 7, "w": 51, "h": 54 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0007.png",
"frame": { "x": 104, "y": 166, "w": 53, "h": 52 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 9, "w": 53, "h": 52 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0008.png",
"frame": { "x": 104, "y": 166, "w": 53, "h": 52 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 9, "w": 53, "h": 52 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0009.png",
"frame": { "x": 157, "y": 170, "w": 55, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 9, "y": 12, "w": 55, "h": 49 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0010.png",
"frame": { "x": 157, "y": 170, "w": 55, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 9, "y": 12, "w": 55, "h": 49 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0011.png",
"frame": { "x": 0, "y": 115, "w": 53, "h": 54 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 8, "w": 53, "h": 54 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0012.png",
"frame": { "x": 0, "y": 115, "w": 53, "h": 54 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 8, "w": 53, "h": 54 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0013.png",
"frame": { "x": 53, "y": 116, "w": 51, "h": 56 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 6, "w": 51, "h": 56 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0014.png",
"frame": { "x": 53, "y": 116, "w": 51, "h": 56 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 6, "w": 51, "h": 56 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0015.png",
"frame": { "x": 114, "y": 109, "w": 52, "h": 57 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 6,
"y": 2,
"w": 54,
"h": 59
},
"frame": {
"x": 172,
"y": 110,
"w": 54,
"h": 59
}
"spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0016.png",
"frame": { "x": 114, "y": 109, "w": 52, "h": 57 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 6,
"y": 2,
"w": 54,
"h": 59
},
"frame": {
"x": 172,
"y": 110,
"w": 54,
"h": 59
}
},
{
"filename": "0031.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 4,
"w": 61,
"h": 59
},
"frame": {
"x": 0,
"y": 164,
"w": 61,
"h": 59
}
},
{
"filename": "0032.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 4,
"w": 61,
"h": 59
},
"frame": {
"x": 0,
"y": 164,
"w": 61,
"h": 59
}
"spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0017.png",
"frame": { "x": 59, "y": 57, "w": 55, "h": 59 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 0,
"w": 57,
"h": 61
},
"frame": {
"x": 61,
"y": 169,
"w": 57,
"h": 61
}
"spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0018.png",
"frame": { "x": 59, "y": 57, "w": 55, "h": 59 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 0,
"w": 57,
"h": 61
},
"frame": {
"x": 61,
"y": 169,
"w": 57,
"h": 61
}
"spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0035.png",
"filename": "0019.png",
"frame": { "x": 0, "y": 58, "w": 55, "h": 57 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 0,
"w": 57,
"h": 61
},
"frame": {
"x": 61,
"y": 169,
"w": 57,
"h": 61
}
"spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0036.png",
"filename": "0020.png",
"frame": { "x": 0, "y": 58, "w": 55, "h": 57 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 0,
"w": 57,
"h": 61
},
"frame": {
"x": 61,
"y": 169,
"w": 57,
"h": 61
}
"spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0021.png",
"frame": { "x": 178, "y": 56, "w": 57, "h": 58 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 60,
"h": 61
},
"frame": {
"x": 118,
"y": 169,
"w": 60,
"h": 61
}
"spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0022.png",
"frame": { "x": 178, "y": 56, "w": 57, "h": 58 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
"spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 },
"sourceSize": { "w": 65, "h": 65 }
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 60,
"h": 61
{
"filename": "0023.png",
"frame": { "x": 119, "y": 0, "w": 59, "h": 57 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 59, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
"frame": {
"x": 118,
"y": 169,
"w": 60,
"h": 61
}
{
"filename": "0024.png",
"frame": { "x": 119, "y": 0, "w": 59, "h": 57 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 59, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0025.png",
"frame": { "x": 178, "y": 0, "w": 60, "h": 56 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 9, "w": 60, "h": 56 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0026.png",
"frame": { "x": 178, "y": 0, "w": 60, "h": 56 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 9, "w": 60, "h": 56 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0027.png",
"frame": { "x": 114, "y": 57, "w": 62, "h": 52 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 12, "w": 62, "h": 52 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0028.png",
"frame": { "x": 114, "y": 57, "w": 62, "h": 52 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 12, "w": 62, "h": 52 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0029.png",
"frame": { "x": 59, "y": 0, "w": 60, "h": 57 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 60, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0030.png",
"frame": { "x": 59, "y": 0, "w": 60, "h": 57 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 60, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0031.png",
"frame": { "x": 0, "y": 0, "w": 59, "h": 58 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 59, "h": 58 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0032.png",
"frame": { "x": 0, "y": 0, "w": 59, "h": 58 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 59, "h": 58 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0033.png",
"frame": { "x": 178, "y": 56, "w": 57, "h": 58 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 60,
"h": 61
},
"frame": {
"x": 118,
"y": 169,
"w": 60,
"h": 61
}
"spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0034.png",
"frame": { "x": 178, "y": 56, "w": 57, "h": 58 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
"spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 },
"sourceSize": { "w": 65, "h": 65 }
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 60,
"h": 61
{
"filename": "0035.png",
"frame": { "x": 59, "y": 57, "w": 55, "h": 59 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 },
"sourceSize": { "w": 65, "h": 65 }
},
"frame": {
"x": 118,
"y": 169,
"w": 60,
"h": 61
}
}
]
{
"filename": "0036.png",
"frame": { "x": 59, "y": 57, "w": 55, "h": 59 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 },
"sourceSize": { "w": 65, "h": 65 }
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:b28fe643197bcc1def0e0ac2ba9f4e67:516d08c8e1ff13b49a109b082ef12860:fe45e2d628a6cef0908f7b82468c8798$"
"app": "https://www.aseprite.org/",
"version": "1.3.8.1-x64",
"image": "47.png",
"format": "I8",
"size": { "w": 238, "h": 223 },
"scale": "1"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@ -1,776 +1,299 @@
{
"textures": [
{
"image": "47.png",
"format": "RGBA8888",
"size": {
"w": 230,
"h": 230
},
"scale": 1,
"frames": [
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 6,
"y": 12,
"w": 56,
"h": 49
},
"frame": {
"x": 0,
"y": 0,
"w": 56,
"h": 49
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 6,
"y": 12,
"w": 56,
"h": 49
},
"frame": {
"x": 0,
"y": 0,
"w": 56,
"h": 49
}
},
{
"filename": "0027.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 12,
"w": 62,
"h": 51
},
"frame": {
"x": 56,
"y": 0,
"w": 62,
"h": 51
}
},
{
"filename": "0028.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 12,
"w": 62,
"h": 51
},
"frame": {
"x": 56,
"y": 0,
"w": 62,
"h": 51
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 7,
"y": 8,
"w": 55,
"h": 53
},
"frame": {
"x": 118,
"y": 0,
"w": 55,
"h": 53
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 7,
"y": 8,
"w": 55,
"h": 53
},
"frame": {
"x": 118,
"y": 0,
"w": 55,
"h": 53
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 7,
"y": 7,
"w": 55,
"h": 54
},
"frame": {
"x": 173,
"y": 0,
"w": 55,
"h": 54
}
},
{
"filename": "0012.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 7,
"y": 7,
"w": 55,
"h": 54
},
"frame": {
"x": 173,
"y": 0,
"w": 55,
"h": 54
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 8,
"y": 5,
"w": 53,
"h": 56
},
"frame": {
"x": 0,
"y": 49,
"w": 53,
"h": 56
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 8,
"y": 5,
"w": 53,
"h": 56
},
"frame": {
"x": 0,
"y": 49,
"w": 53,
"h": 56
}
},
{
"filename": "0025.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 8,
"w": 62,
"h": 55
},
"frame": {
"x": 53,
"y": 51,
"w": 62,
"h": 55
}
},
{
"filename": "0026.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 8,
"w": 62,
"h": 55
},
"frame": {
"x": 53,
"y": 51,
"w": 62,
"h": 55
}
},
{
"filename": "0013.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 8,
"y": 4,
"w": 53,
"h": 57
},
"frame": {
"x": 115,
"y": 53,
"w": 53,
"h": 57
}
},
{
"filename": "0014.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 8,
"y": 4,
"w": 53,
"h": 57
},
"frame": {
"x": 115,
"y": 53,
"w": 53,
"h": 57
}
},
{
"filename": "0029.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 7,
"w": 62,
"h": 56
},
"frame": {
"x": 168,
"y": 54,
"w": 62,
"h": 56
}
},
{
"filename": "0030.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 7,
"w": 62,
"h": 56
},
"frame": {
"x": 168,
"y": 54,
"w": 62,
"h": 56
}
},
{
"filename": "0023.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 5,
"w": 61,
"h": 58
},
"frame": {
"x": 0,
"y": 106,
"w": 61,
"h": 58
}
},
{
"filename": "0024.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 5,
"w": 61,
"h": 58
},
"frame": {
"x": 0,
"y": 106,
"w": 61,
"h": 58
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 6,
"y": 2,
"w": 54,
"h": 59
},
"frame": {
"x": 61,
"y": 106,
"w": 54,
"h": 59
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 6,
"y": 2,
"w": 54,
"h": 59
},
"frame": {
"x": 61,
"y": 106,
"w": 54,
"h": 59
}
},
{ "frames": [
{
"filename": "0001.png",
"frame": { "x": 0, "y": 58, "w": 55, "h": 57 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 2,
"w": 57,
"h": 59
},
"frame": {
"x": 115,
"y": 110,
"w": 57,
"h": 59
}
"spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0002.png",
"frame": { "x": 0, "y": 58, "w": 55, "h": 57 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 2,
"w": 57,
"h": 59
},
"frame": {
"x": 115,
"y": 110,
"w": 57,
"h": 59
}
"spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0019.png",
"filename": "0003.png",
"frame": { "x": 166, "y": 114, "w": 52, "h": 56 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 2,
"w": 57,
"h": 59
},
"frame": {
"x": 115,
"y": 110,
"w": 57,
"h": 59
}
"spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 56 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0020.png",
"filename": "0004.png",
"frame": { "x": 166, "y": 114, "w": 52, "h": 56 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
"spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 56 },
"sourceSize": { "w": 65, "h": 65 }
},
"spriteSourceSize": {
"x": 2,
"y": 2,
"w": 57,
"h": 59
{
"filename": "0005.png",
"frame": { "x": 0, "y": 169, "w": 51, "h": 54 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 7, "w": 51, "h": 54 },
"sourceSize": { "w": 65, "h": 65 }
},
"frame": {
"x": 115,
"y": 110,
"w": 57,
"h": 59
}
{
"filename": "0006.png",
"frame": { "x": 0, "y": 169, "w": 51, "h": 54 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 7, "w": 51, "h": 54 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0007.png",
"frame": { "x": 104, "y": 166, "w": 53, "h": 52 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 9, "w": 53, "h": 52 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0008.png",
"frame": { "x": 104, "y": 166, "w": 53, "h": 52 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 9, "w": 53, "h": 52 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0009.png",
"frame": { "x": 157, "y": 170, "w": 55, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 9, "y": 12, "w": 55, "h": 49 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0010.png",
"frame": { "x": 157, "y": 170, "w": 55, "h": 49 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 9, "y": 12, "w": 55, "h": 49 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0011.png",
"frame": { "x": 0, "y": 115, "w": 53, "h": 54 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 8, "w": 53, "h": 54 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0012.png",
"frame": { "x": 0, "y": 115, "w": 53, "h": 54 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 10, "y": 8, "w": 53, "h": 54 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0013.png",
"frame": { "x": 53, "y": 116, "w": 51, "h": 56 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 6, "w": 51, "h": 56 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0014.png",
"frame": { "x": 53, "y": 116, "w": 51, "h": 56 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 11, "y": 6, "w": 51, "h": 56 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0015.png",
"frame": { "x": 114, "y": 109, "w": 52, "h": 57 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 6,
"y": 2,
"w": 54,
"h": 59
},
"frame": {
"x": 172,
"y": 110,
"w": 54,
"h": 59
}
"spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0016.png",
"frame": { "x": 114, "y": 109, "w": 52, "h": 57 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 6,
"y": 2,
"w": 54,
"h": 59
},
"frame": {
"x": 172,
"y": 110,
"w": 54,
"h": 59
}
},
{
"filename": "0031.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 4,
"w": 61,
"h": 59
},
"frame": {
"x": 0,
"y": 164,
"w": 61,
"h": 59
}
},
{
"filename": "0032.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 4,
"w": 61,
"h": 59
},
"frame": {
"x": 0,
"y": 164,
"w": 61,
"h": 59
}
"spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0017.png",
"frame": { "x": 59, "y": 57, "w": 55, "h": 59 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 0,
"w": 57,
"h": 61
},
"frame": {
"x": 61,
"y": 169,
"w": 57,
"h": 61
}
"spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0018.png",
"frame": { "x": 59, "y": 57, "w": 55, "h": 59 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 0,
"w": 57,
"h": 61
},
"frame": {
"x": 61,
"y": 169,
"w": 57,
"h": 61
}
"spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0035.png",
"filename": "0019.png",
"frame": { "x": 0, "y": 58, "w": 55, "h": 57 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 0,
"w": 57,
"h": 61
},
"frame": {
"x": 61,
"y": 169,
"w": 57,
"h": 61
}
"spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0036.png",
"filename": "0020.png",
"frame": { "x": 0, "y": 58, "w": 55, "h": 57 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 2,
"y": 0,
"w": 57,
"h": 61
},
"frame": {
"x": 61,
"y": 169,
"w": 57,
"h": 61
}
"spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0021.png",
"frame": { "x": 178, "y": 56, "w": 57, "h": 58 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 60,
"h": 61
},
"frame": {
"x": 118,
"y": 169,
"w": 60,
"h": 61
}
"spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0022.png",
"frame": { "x": 178, "y": 56, "w": 57, "h": 58 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
"spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 },
"sourceSize": { "w": 65, "h": 65 }
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 60,
"h": 61
{
"filename": "0023.png",
"frame": { "x": 119, "y": 0, "w": 59, "h": 57 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 59, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
"frame": {
"x": 118,
"y": 169,
"w": 60,
"h": 61
}
{
"filename": "0024.png",
"frame": { "x": 119, "y": 0, "w": 59, "h": 57 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 7, "w": 59, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0025.png",
"frame": { "x": 178, "y": 0, "w": 60, "h": 56 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 9, "w": 60, "h": 56 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0026.png",
"frame": { "x": 178, "y": 0, "w": 60, "h": 56 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 9, "w": 60, "h": 56 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0027.png",
"frame": { "x": 114, "y": 57, "w": 62, "h": 52 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 12, "w": 62, "h": 52 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0028.png",
"frame": { "x": 114, "y": 57, "w": 62, "h": 52 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 2, "y": 12, "w": 62, "h": 52 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0029.png",
"frame": { "x": 59, "y": 0, "w": 60, "h": 57 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 60, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0030.png",
"frame": { "x": 59, "y": 0, "w": 60, "h": 57 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 8, "w": 60, "h": 57 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0031.png",
"frame": { "x": 0, "y": 0, "w": 59, "h": 58 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 59, "h": 58 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0032.png",
"frame": { "x": 0, "y": 0, "w": 59, "h": 58 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 3, "y": 6, "w": 59, "h": 58 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0033.png",
"frame": { "x": 178, "y": 56, "w": 57, "h": 58 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 60,
"h": 61
},
"frame": {
"x": 118,
"y": 169,
"w": 60,
"h": 61
}
"spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 },
"sourceSize": { "w": 65, "h": 65 }
},
{
"filename": "0034.png",
"frame": { "x": 178, "y": 56, "w": 57, "h": 58 },
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 63
"spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 },
"sourceSize": { "w": 65, "h": 65 }
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 60,
"h": 61
{
"filename": "0035.png",
"frame": { "x": 59, "y": 57, "w": 55, "h": 59 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 },
"sourceSize": { "w": 65, "h": 65 }
},
"frame": {
"x": 118,
"y": 169,
"w": 60,
"h": 61
}
}
]
{
"filename": "0036.png",
"frame": { "x": 59, "y": 57, "w": 55, "h": 59 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 },
"sourceSize": { "w": 65, "h": 65 }
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:38ba9918eb8f68ab2190b03c6512ef47:46578d6dd482a1b04fa7c2884107a0f5:fe45e2d628a6cef0908f7b82468c8798$"
"app": "https://www.aseprite.org/",
"version": "1.3.8.1-x64",
"image": "47.png",
"format": "I8",
"size": { "w": 238, "h": 223 },
"scale": "1"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -3008,7 +3008,8 @@ export default class BattleScene extends SceneBase {
}
validateAchv(achv: Achv, args?: unknown[]): boolean {
if (!this.gameData.achvUnlocks.hasOwnProperty(achv.id) && achv.validate(this, args)) {
if ((!this.gameData.achvUnlocks.hasOwnProperty(achv.id) || Overrides.ACHIEVEMENTS_REUNLOCK_OVERRIDE)
&& achv.validate(this, args)) {
this.gameData.achvUnlocks[achv.id] = new Date().getTime();
this.ui.achvBar.showAchv(achv);
if (vouchers.hasOwnProperty(achv.id)) {

View File

@ -4112,9 +4112,13 @@ export class PostBattleAbAttr extends AbAttr {
}
export class PostBattleLootAbAttr extends PostBattleAbAttr {
/**
* @param args - `[0]`: boolean for if the battle ended in a victory
* @returns `true` if successful
*/
applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean {
const postBattleLoot = pokemon.scene.currentBattle.postBattleLoot;
if (!simulated && postBattleLoot.length) {
if (!simulated && postBattleLoot.length && args[0]) {
const randItem = Utils.randSeedItem(postBattleLoot);
//@ts-ignore - TODO see below
if (pokemon.scene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true, undefined, false)) { // TODO: fix. This is a promise!?
@ -4575,28 +4579,28 @@ export class MoneyAbAttr extends PostBattleAbAttr {
/**
* @param pokemon {@linkcode Pokemon} that is the user of this ability.
* @param passive N/A
* @param args N/A
* @returns true
* @param args - `[0]`: boolean for if the battle ended in a victory
* @returns `true` if successful
*/
applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean {
if (!simulated) {
if (!simulated && args[0]) {
pokemon.scene.currentBattle.moneyScattered += pokemon.scene.getWaveMoneyAmount(0.2);
}
return true;
}
return false;
}
}
/**
* Applies a stat change after a Pokémon is summoned,
* conditioned on the presence of a specific arena tag.
*
* @extends {PostSummonStatStageChangeAbAttr}
* @extends PostSummonStatStageChangeAbAttr
*/
export class PostSummonStatStageChangeOnArenaAbAttr extends PostSummonStatStageChangeAbAttr {
/**
* The type of arena tag that conditions the stat change.
* @private
* @type {ArenaTagType}
*/
private tagType: ArenaTagType;
@ -4972,7 +4976,7 @@ class ForceSwitchOutHelper {
pokemon.scene.clearEnemyHeldItemModifiers();
if (switchOutTarget.hp) {
pokemon.scene.pushPhase(new BattleEndPhase(pokemon.scene));
pokemon.scene.pushPhase(new BattleEndPhase(pokemon.scene, false));
pokemon.scene.pushPhase(new NewBattlePhase(pokemon.scene));
}
}
@ -5779,9 +5783,10 @@ export function initAbilities() {
.attr(WonderSkinAbAttr)
.ignorable(),
new Ability(Abilities.ANALYTIC, 5)
.attr(MovePowerBoostAbAttr, (user, target, move) =>
!!target?.getLastXMoves(1).find(m => m.turn === target?.scene.currentBattle.turn)
|| user?.scene.currentBattle.turnCommands[target?.getBattlerIndex() ?? BattlerIndex.ATTACKER]?.command !== Command.FIGHT, 1.3),
.attr(MovePowerBoostAbAttr, (user, target, move) => {
const movePhase = user?.scene.findPhase((phase) => phase instanceof MovePhase && phase.pokemon.id !== user.id);
return Utils.isNullOrUndefined(movePhase);
}, 1.3),
new Ability(Abilities.ILLUSION, 5)
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr)
@ -5929,10 +5934,10 @@ export function initAbilities() {
.attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, Stat.DEF, 1),
new Ability(Abilities.WIMP_OUT, 7)
.attr(PostDamageForceSwitchAbAttr)
.edgeCase(), // Should not trigger when hurting itself in confusion
.edgeCase(), // Should not trigger when hurting itself in confusion, causes Fake Out to fail turn 1 and succeed turn 2 if pokemon is switched out before battle start via playing in Switch Mode
new Ability(Abilities.EMERGENCY_EXIT, 7)
.attr(PostDamageForceSwitchAbAttr)
.edgeCase(), // Should not trigger when hurting itself in confusion
.edgeCase(), // Should not trigger when hurting itself in confusion, causes Fake Out to fail turn 1 and succeed turn 2 if pokemon is switched out before battle start via playing in Switch Mode
new Ability(Abilities.WATER_COMPACTION, 7)
.attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === Type.WATER && move.category !== MoveCategory.STATUS, Stat.DEF, 2),
new Ability(Abilities.MERCILESS, 7)
@ -6340,8 +6345,7 @@ export function initAbilities() {
.attr(IgnoreOpponentStatStagesAbAttr, [ Stat.EVA ])
.ignorable(),
new Ability(Abilities.SUPERSWEET_SYRUP, 9)
.attr(PostSummonStatStageChangeAbAttr, [ Stat.EVA ], -1)
.condition(getOncePerBattleCondition(Abilities.SUPERSWEET_SYRUP)),
.attr(PostSummonStatStageChangeAbAttr, [ Stat.EVA ], -1),
new Ability(Abilities.HOSPITALITY, 9)
.attr(PostSummonAllyHealAbAttr, 4, true),
new Ability(Abilities.TOXIC_CHAIN, 9)

View File

@ -5967,50 +5967,97 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
* Check if Wimp Out/Emergency Exit activates due to being hit by U-turn or Volt Switch
* If it did, the user of U-turn or Volt Switch will not be switched out.
*/
if (target.getAbility().hasAttr(PostDamageForceSwitchAbAttr) &&
(move.id === Moves.U_TURN || move.id === Moves.VOLT_SWITCH || move.id === Moves.FLIP_TURN)
if (target.getAbility().hasAttr(PostDamageForceSwitchAbAttr)
&& [ Moves.U_TURN, Moves.VOLT_SWITCH, Moves.FLIP_TURN ].includes(move.id)
) {
if (this.hpDroppedBelowHalf(target)) {
return false;
}
}
// Switch out logic for the player's Pokemon
if (switchOutTarget.scene.getPlayerParty().filter((p) => p.isAllowedInBattle() && !p.isOnField()).length < 1) {
return false;
}
if (switchOutTarget.hp > 0) {
if (this.switchType === SwitchType.FORCE_SWITCH) {
switchOutTarget.leaveField(true);
const slotIndex = Utils.randIntRange(user.scene.currentBattle.getBattlerCount(), user.scene.getPlayerParty().length);
user.scene.prependToPhase(
new SwitchSummonPhase(
user.scene,
this.switchType,
switchOutTarget.getFieldIndex(),
slotIndex,
false,
true
),
MoveEndPhase
);
} else {
switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH);
user.scene.prependToPhase(new SwitchPhase(user.scene, this.switchType, switchOutTarget.getFieldIndex(), true, true), MoveEndPhase);
user.scene.prependToPhase(
new SwitchPhase(
user.scene,
this.switchType,
switchOutTarget.getFieldIndex(),
true,
true
),
MoveEndPhase
);
return true;
}
}
return false;
} else if (user.scene.currentBattle.battleType !== BattleType.WILD) {
// Switch out logic for trainer battles
} else if (user.scene.currentBattle.battleType !== BattleType.WILD) { // Switch out logic for enemy trainers
if (switchOutTarget.scene.getEnemyParty().filter((p) => p.isAllowedInBattle() && !p.isOnField()).length < 1) {
return false;
}
if (switchOutTarget.hp > 0) {
// for opponent switching out
switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH);
user.scene.prependToPhase(new SwitchSummonPhase(user.scene, this.switchType, switchOutTarget.getFieldIndex(),
(user.scene.currentBattle.trainer ? user.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot) : 0),
false, false), MoveEndPhase);
}
if (this.switchType === SwitchType.FORCE_SWITCH) {
switchOutTarget.leaveField(true);
const slotIndex = Utils.randIntRange(user.scene.currentBattle.getBattlerCount(), user.scene.getEnemyParty().length);
user.scene.prependToPhase(
new SwitchSummonPhase(
user.scene,
this.switchType,
switchOutTarget.getFieldIndex(),
slotIndex,
false,
false
),
MoveEndPhase
);
} else {
switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH);
user.scene.prependToPhase(
new SwitchSummonPhase(
user.scene,
this.switchType,
switchOutTarget.getFieldIndex(),
(user.scene.currentBattle.trainer ? user.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot) : 0),
false,
false
),
MoveEndPhase
);
}
}
} else { // Switch out logic for wild pokemon
/**
* Check if Wimp Out/Emergency Exit activates due to being hit by U-turn or Volt Switch
* If it did, the user of U-turn or Volt Switch will not be switched out.
*/
if (target.getAbility().hasAttr(PostDamageForceSwitchAbAttr) &&
(move.id === Moves.U_TURN || move.id === Moves.VOLT_SWITCH) || move.id === Moves.FLIP_TURN) {
if (target.getAbility().hasAttr(PostDamageForceSwitchAbAttr)
&& [ Moves.U_TURN, Moves.VOLT_SWITCH, Moves.FLIP_TURN ].includes(move.id)
) {
if (this.hpDroppedBelowHalf(target)) {
return false;
}
}
// Switch out logic for everything else (eg: WILD battles)
if (user.scene.currentBattle.waveIndex % 10 === 0) {
return false;
}
@ -6035,7 +6082,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
user.scene.clearEnemyHeldItemModifiers();
if (switchOutTarget.hp) {
user.scene.pushPhase(new BattleEndPhase(user.scene));
user.scene.pushPhase(new BattleEndPhase(user.scene, false));
user.scene.pushPhase(new NewBattlePhase(user.scene));
}
}
@ -7779,11 +7826,10 @@ export function initMoves() {
.windMove(),
new AttackMove(Moves.WING_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 35, -1, 0, 1),
new StatusMove(Moves.WHIRLWIND, Type.NORMAL, -1, 20, -1, -6, 1)
.attr(ForceSwitchOutAttr)
.attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH)
.ignoresSubstitute()
.hidesTarget()
.windMove()
.partial(), // Should force random switches
.windMove(),
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)
@ -7859,10 +7905,9 @@ export function initMoves() {
.soundBased()
.target(MoveTarget.ALL_NEAR_ENEMIES),
new StatusMove(Moves.ROAR, Type.NORMAL, -1, 20, -1, -6, 1)
.attr(ForceSwitchOutAttr)
.attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH)
.soundBased()
.hidesTarget()
.partial(), // Should force random switching
.hidesTarget(),
new StatusMove(Moves.SING, Type.NORMAL, 55, 15, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.SLEEP)
.soundBased(),
@ -9227,8 +9272,8 @@ export function initMoves() {
.attr(StatStageChangeAttr, [ Stat.ATK ], 1, true)
.attr(StatStageChangeAttr, [ Stat.SPD ], 2, true),
new AttackMove(Moves.CIRCLE_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 90, 10, -1, -6, 5)
.attr(ForceSwitchOutAttr)
.partial(), // Should force random switches
.attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH)
.hidesTarget(),
new AttackMove(Moves.INCINERATE, Type.FIRE, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5)
.target(MoveTarget.ALL_NEAR_ENEMIES)
.attr(RemoveHeldItemAttr, true),
@ -9296,9 +9341,8 @@ export function initMoves() {
new AttackMove(Moves.FROST_BREATH, Type.ICE, MoveCategory.SPECIAL, 60, 90, 10, 100, 0, 5)
.attr(CritOnlyAttr),
new AttackMove(Moves.DRAGON_TAIL, Type.DRAGON, MoveCategory.PHYSICAL, 60, 90, 10, -1, -6, 5)
.attr(ForceSwitchOutAttr)
.hidesTarget()
.partial(), // Should force random switches
.attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH)
.hidesTarget(),
new SelfStatusMove(Moves.WORK_UP, Type.NORMAL, -1, 30, -1, 0, 5)
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, true),
new AttackMove(Moves.ELECTROWEB, Type.ELECTRIC, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5)
@ -10560,6 +10604,7 @@ export function initMoves() {
new AttackMove(Moves.TWIN_BEAM, Type.PSYCHIC, MoveCategory.SPECIAL, 40, 100, 10, -1, 0, 9)
.attr(MultiHitAttr, MultiHitType._2),
new AttackMove(Moves.RAGE_FIST, Type.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9)
.partial() // Counter resets every wave instead of on arena reset
.attr(HitCountPowerAttr)
.punchingMove(),
new AttackMove(Moves.ARMOR_CANNON, Type.FIRE, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9)

View File

@ -21,7 +21,6 @@ import { EggSourceType } from "#enums/egg-source-types";
import { EggTier } from "#enums/egg-type";
import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option";
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
import { achvs } from "#app/system/achv";
import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type";
import { Type } from "#enums/type";
import { getPokeballTintColor } from "#app/data/pokeball";
@ -520,12 +519,6 @@ function removePokemonFromPartyAndStoreHeldItems(scene: BattleScene, encounter:
];
}
function checkAchievement(scene: BattleScene) {
if (scene.arena.biomeType === Biome.SPACE) {
scene.validateAchv(achvs.BREEDERS_IN_SPACE);
}
}
function restorePartyAndHeldItems(scene: BattleScene) {
const encounter = scene.currentBattle.mysteryEncounter!;
// Restore original party
@ -617,8 +610,6 @@ function onGameOver(scene: BattleScene) {
function doPostEncounterCleanup(scene: BattleScene) {
const encounter = scene.currentBattle.mysteryEncounter!;
if (!encounter.misc.encounterFailed) {
// Give achievement if in Space biome
checkAchievement(scene);
// Give 20 friendship to the chosen pokemon
encounter.misc.chosenPokemon.addFriendship(FRIENDSHIP_ADDED);
restorePartyAndHeldItems(scene);

View File

@ -731,7 +731,7 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase:
scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase));
scene.pushPhase(new EggLapsePhase(scene));
} else if (!scene.getEnemyParty().find(p => encounter.encounterMode !== MysteryEncounterMode.TRAINER_BATTLE ? p.isOnField() : !p?.isFainted(true))) {
scene.pushPhase(new BattleEndPhase(scene));
scene.pushPhase(new BattleEndPhase(scene, true));
if (encounter.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) {
scene.pushPhase(new TrainerVictoryPhase(scene));
}

View File

@ -10,5 +10,7 @@ export enum SwitchType {
/** Transfers stat stages and other effects from the returning Pokemon to the switched in Pokemon */
BATON_PASS,
/** Transfers the returning Pokemon's Substitute to the switched in Pokemon */
SHED_TAIL
SHED_TAIL,
/** Force switchout to a random party member */
FORCE_SWITCH,
}

View File

@ -86,6 +86,8 @@ class DefaultOverrides {
readonly ITEM_UNLOCK_OVERRIDE: Unlockables[] = [];
/** Set to `true` to show all tutorials */
readonly BYPASS_TUTORIAL_SKIP_OVERRIDE: boolean = false;
/** Set to `true` to be able to re-earn already unlocked achievements */
readonly ACHIEVEMENTS_REUNLOCK_OVERRIDE: boolean = false;
/** Set to `true` to force Paralysis and Freeze to always activate, or `false` to force them to not activate */
readonly STATUS_ACTIVATION_OVERRIDE: boolean | null = null;

View File

@ -52,7 +52,7 @@ export class AttemptRunPhase extends PokemonPhase {
enemyPokemon.trySetStatus(StatusEffect.FAINT);
});
this.scene.pushPhase(new BattleEndPhase(this.scene));
this.scene.pushPhase(new BattleEndPhase(this.scene, false));
this.scene.pushPhase(new NewBattlePhase(this.scene));
} else {
playerPokemon.turnData.failedRunAway = true;

View File

@ -8,7 +8,7 @@ export class BattleEndPhase extends BattlePhase {
/** If true, will increment battles won */
isVictory: boolean;
constructor(scene: BattleScene, isVictory: boolean = true) {
constructor(scene: BattleScene, isVictory: boolean) {
super(scene);
this.isVictory = isVictory;
@ -17,16 +17,17 @@ export class BattleEndPhase extends BattlePhase {
start() {
super.start();
this.scene.gameData.gameStats.battles++;
if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex + 1 > this.scene.gameData.gameStats.highestEndlessWave) {
this.scene.gameData.gameStats.highestEndlessWave = this.scene.currentBattle.waveIndex + 1;
}
if (this.isVictory) {
this.scene.currentBattle.addBattleScore(this.scene);
this.scene.gameData.gameStats.battles++;
if (this.scene.currentBattle.trainer) {
this.scene.gameData.gameStats.trainersDefeated++;
}
if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex + 1 > this.scene.gameData.gameStats.highestEndlessWave) {
this.scene.gameData.gameStats.highestEndlessWave = this.scene.currentBattle.waveIndex + 1;
}
}
// Endless graceful end
@ -42,7 +43,7 @@ export class BattleEndPhase extends BattlePhase {
}
for (const pokemon of this.scene.getPokemonAllowedInBattle()) {
applyPostBattleAbAttrs(PostBattleAbAttr, pokemon);
applyPostBattleAbAttrs(PostBattleAbAttr, pokemon, false, this.isVictory);
}
if (this.scene.currentBattle.moneyScattered) {

View File

@ -1,5 +1,5 @@
import BattleScene from "#app/battle-scene";
import { applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr } from "#app/data/ability";
import { applyPreSwitchOutAbAttrs, PostDamageForceSwitchAbAttr, PreSwitchOutAbAttr } from "#app/data/ability";
import { allMoves, ForceSwitchOutAttr } from "#app/data/move";
import { getPokeballTintColor } from "#app/data/pokeball";
import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms";
@ -166,10 +166,11 @@ export class SwitchSummonPhase extends SummonPhase {
const currentCommand = pokemon.scene.currentBattle.turnCommands[this.fieldIndex]?.command;
const lastPokemonIsForceSwitchedAndNotFainted = lastUsedMove?.hasAttr(ForceSwitchOutAttr) && !this.lastPokemon.isFainted();
const lastPokemonHasForceSwitchAbAttr = this.lastPokemon.hasAbilityWithAttr(PostDamageForceSwitchAbAttr) && !this.lastPokemon.isFainted();
// Compensate for turn spent summoning
// Or compensate for force switch move if switched out pokemon is not fainted
if (currentCommand === Command.POKEMON || lastPokemonIsForceSwitchedAndNotFainted) {
if (currentCommand === Command.POKEMON || lastPokemonIsForceSwitchedAndNotFainted || lastPokemonHasForceSwitchAbAttr) {
pokemon.battleSummonData.turnCount--;
pokemon.battleSummonData.waveTurnCount--;
}

View File

@ -9,6 +9,8 @@ import { BattlePhase } from "./battle-phase";
import { ModifierRewardPhase } from "./modifier-reward-phase";
import { MoneyRewardPhase } from "./money-reward-phase";
import { TrainerSlot } from "#app/data/trainer-config";
import { Biome } from "#app/enums/biome";
import { achvs } from "#app/system/achv";
export class TrainerVictoryPhase extends BattlePhase {
constructor(scene: BattleScene) {
@ -34,11 +36,17 @@ export class TrainerVictoryPhase extends BattlePhase {
}
const trainerType = this.scene.currentBattle.trainer?.config.trainerType!; // TODO: is this bang correct?
// Validate Voucher for boss trainers
if (vouchers.hasOwnProperty(TrainerType[trainerType])) {
if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer?.config.isBoss) {
this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [ modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM ][vouchers[TrainerType[trainerType]].voucherType]));
}
}
// Breeders in Space achievement
if (this.scene.arena.biomeType === Biome.SPACE
&& (trainerType === TrainerType.BREEDER || trainerType === TrainerType.EXPERT_POKEMON_BREEDER)) {
this.scene.validateAchv(achvs.BREEDERS_IN_SPACE);
}
this.scene.ui.showText(i18next.t("battle:trainerDefeated", { trainerName: this.scene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }), null, () => {
const victoryMessages = this.scene.currentBattle.trainer?.getVictoryMessages()!; // TODO: is this bang correct?

View File

@ -41,7 +41,7 @@ export class VictoryPhase extends PokemonPhase {
}
if (!this.scene.getEnemyParty().find(p => this.scene.currentBattle.battleType === BattleType.WILD ? p.isOnField() : !p?.isFainted(true))) {
this.scene.pushPhase(new BattleEndPhase(this.scene));
this.scene.pushPhase(new BattleEndPhase(this.scene, true));
if (this.scene.currentBattle.battleType === BattleType.TRAINER) {
this.scene.pushPhase(new TrainerVictoryPhase(this.scene));
}

View File

@ -358,7 +358,7 @@ export const achvs = {
MONO_FAIRY: new ChallengeAchv("MONO_FAIRY", "", "MONO_FAIRY.description", "fairy_feather", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 18 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
FRESH_START: new ChallengeAchv("FRESH_START", "", "FRESH_START.description", "reviver_seed", 100, (c, scene) => c instanceof FreshStartChallenge && c.value > 0 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
INVERSE_BATTLE: new ChallengeAchv("INVERSE_BATTLE", "", "INVERSE_BATTLE.description", "inverse", 100, c => c instanceof InverseBattleChallenge && c.value > 0),
BREEDERS_IN_SPACE: new Achv("BREEDERS_IN_SPACE", "", "BREEDERS_IN_SPACE.description", "moon_stone", 100).setSecret(),
BREEDERS_IN_SPACE: new Achv("BREEDERS_IN_SPACE", "", "BREEDERS_IN_SPACE.description", "moon_stone", 50).setSecret(),
};
export function initAchievements() {

View File

@ -0,0 +1,81 @@
import { BattlerIndex } from "#app/battle";
import { isBetween, toDmgValue } from "#app/utils";
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 - Analytic", () => {
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
.moveset([ Moves.SPLASH, Moves.TACKLE ])
.ability(Abilities.ANALYTIC)
.battleType("single")
.disableCrits()
.startingLevel(200)
.enemyLevel(200)
.enemySpecies(Species.SNORLAX)
.enemyAbility(Abilities.BALL_FETCH)
.enemyMoveset(Moves.SPLASH);
});
it("should increase damage if the user moves last", async () => {
await game.classicMode.startBattle([ Species.ARCEUS ]);
const enemy = game.scene.getEnemyPokemon()!;
game.move.select(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]);
await game.toNextTurn();
const damage1 = enemy.getInverseHp();
enemy.hp = enemy.getMaxHp();
game.move.select(Moves.TACKLE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.phaseInterceptor.to("BerryPhase");
expect(isBetween(enemy.getInverseHp(), toDmgValue(damage1 * 1.3) - 3, toDmgValue(damage1 * 1.3) + 3)).toBe(true);
});
it("should increase damage only if the user moves last in doubles", async () => {
game.override.battleType("double");
await game.classicMode.startBattle([ Species.GENGAR, Species.SHUCKLE ]);
const [ enemy, ] = game.scene.getEnemyField();
game.move.select(Moves.TACKLE, 0, BattlerIndex.ENEMY);
game.move.select(Moves.SPLASH, 1);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]);
await game.toNextTurn();
const damage1 = enemy.getInverseHp();
enemy.hp = enemy.getMaxHp();
game.move.select(Moves.TACKLE, 0, BattlerIndex.ENEMY);
game.move.select(Moves.SPLASH, 1);
await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER ]);
await game.toNextTurn();
expect(isBetween(enemy.getInverseHp(), toDmgValue(damage1 * 1.3) - 3, toDmgValue(damage1 * 1.3) + 3)).toBe(true);
enemy.hp = enemy.getMaxHp();
game.move.select(Moves.TACKLE, 0, BattlerIndex.ENEMY);
game.move.select(Moves.SPLASH, 1);
await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]);
await game.phaseInterceptor.to("BerryPhase");
expect(enemy.getInverseHp()).toBe(damage1);
});
});

View File

@ -0,0 +1,74 @@
import type { CommandPhase } from "#app/phases/command-phase";
import { Command } from "#app/ui/command-ui-handler";
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, vi } from "vitest";
describe("Abilities - Honey Gather", () => {
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
.moveset([ Moves.SPLASH, Moves.ROAR, Moves.THUNDERBOLT ])
.startingLevel(100)
.ability(Abilities.HONEY_GATHER)
.passiveAbility(Abilities.RUN_AWAY)
.battleType("single")
.disableCrits()
.enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH)
.enemyMoveset(Moves.SPLASH);
});
it("should give money when winning a battle", async () => {
await game.classicMode.startBattle([ Species.MILOTIC ]);
game.scene.money = 1000;
game.move.select(Moves.THUNDERBOLT);
await game.toNextWave();
expect(game.scene.money).toBeGreaterThan(1000);
});
it("should not give money when the enemy pokemon flees", async () => {
await game.classicMode.startBattle([ Species.MILOTIC ]);
game.scene.money = 1000;
game.move.select(Moves.ROAR);
await game.toNextTurn();
expect(game.scene.money).toBe(1000);
expect(game.scene.currentBattle.waveIndex).toBe(2);
});
it("should not give money when the player flees", async () => {
await game.classicMode.startBattle([ Species.MILOTIC ]);
game.scene.money = 1000;
// something weird is going on with the test framework, so this is required to prevent a crash
const enemy = game.scene.getEnemyPokemon()!;
vi.spyOn(enemy, "scene", "get").mockReturnValue(game.scene);
const commandPhase = game.scene.getCurrentPhase() as CommandPhase;
commandPhase.handleCommand(Command.RUN, 0);
await game.toNextTurn();
expect(game.scene.money).toBe(1000);
expect(game.scene.currentBattle.waveIndex).toBe(2);
});
});

View File

@ -8,6 +8,7 @@ import { addTextObject, TextStyle } from "./text";
import { addWindow } from "./ui-theme";
import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
import { pokerogueApi } from "#app/plugins/api/pokerogue-api";
import JSZip from "jszip";
interface BuildInteractableImageOpts {
scale?: number;
@ -27,6 +28,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler {
private googleImage: Phaser.GameObjects.Image;
private discordImage: Phaser.GameObjects.Image;
private usernameInfoImage: Phaser.GameObjects.Image;
private saveDownloadImage: Phaser.GameObjects.Image;
private externalPartyContainer: Phaser.GameObjects.Container;
private infoContainer: Phaser.GameObjects.Container;
private externalPartyBg: Phaser.GameObjects.NineSlice;
@ -46,7 +48,13 @@ export default class LoginFormUiHandler extends FormModalUiHandler {
scale: 0.5
});
this.saveDownloadImage = this.buildInteractableImage("saving_icon", "save-download-icon", {
x: 0,
scale: 0.75
});
this.infoContainer.add(this.usernameInfoImage);
this.infoContainer.add(this.saveDownloadImage);
this.getUi().add(this.infoContainer);
this.infoContainer.setVisible(false);
this.infoContainer.disableInteractive();
@ -160,7 +168,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler {
this.infoContainer.setVisible(false);
this.setMouseCursorStyle("default"); //reset cursor
[ this.discordImage, this.googleImage, this.usernameInfoImage ].forEach((img) => img.off("pointerdown"));
[ this.discordImage, this.googleImage, this.usernameInfoImage, this.saveDownloadImage ].forEach((img) => img.off("pointerdown"));
}
private processExternalProvider(config: ModalConfig): void {
@ -178,6 +186,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler {
this.infoContainer.setVisible(true);
this.getUi().moveTo(this.infoContainer, this.getUi().length - 1);
this.usernameInfoImage.setPositionRelative(this.infoContainer, 0, 0);
this.saveDownloadImage.setPositionRelative(this.infoContainer, 20, 0);
this.discordImage.on("pointerdown", () => {
const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/discord/callback`);
@ -229,6 +238,34 @@ export default class LoginFormUiHandler extends FormModalUiHandler {
}
});
this.saveDownloadImage.on("pointerdown", () => {
// find all data_ and sessionData keys, put them in a .txt file and download everything in a single zip
const localStorageKeys = Object.keys(localStorage); // this gets the keys for localStorage
const keyToFind = "data_";
const sessionKeyToFind = "sessionData";
const dataKeys = localStorageKeys.filter(ls => ls.indexOf(keyToFind) >= 0);
const sessionKeys = localStorageKeys.filter(ls => ls.indexOf(sessionKeyToFind) >= 0);
if (dataKeys.length > 0 || sessionKeys.length > 0) {
const zip = new JSZip();
for (let i = 0; i < dataKeys.length; i++) {
zip.file(dataKeys[i] + ".prsv", localStorage.getItem(dataKeys[i])!);
}
for (let i = 0; i < sessionKeys.length; i++) {
zip.file(sessionKeys[i] + ".prsv", localStorage.getItem(sessionKeys[i])!);
}
zip.generateAsync({ type: "blob" }).then(content => {
const url = URL.createObjectURL(content);
const a = document.createElement("a");
a.href = url;
a.download = "pokerogue_saves.zip";
a.click();
URL.revokeObjectURL(url);
});
} else {
return onFail(this.ERR_NO_SAVES);
}
});
this.externalPartyContainer.setAlpha(0);
this.scene.tweens.add({
targets: this.externalPartyContainer,