Merge branch 'beta' into learnMovePhase

This commit is contained in:
Mumble 2024-09-03 09:19:36 -07:00 committed by GitHub
commit fe032bcf71
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
23 changed files with 783 additions and 645 deletions

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -1,604 +1,529 @@
{"frames": [ { "frames": {
"0.png": {
{ "frame": { "x": 12, "y": 44, "w": 12, "h": 11 },
"filename": "0.png",
"frame": {"x":0,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "1.png": {
"filename": "1.png", "frame": { "x": 36, "y": 44, "w": 12, "h": 11 },
"frame": {"x":12,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "2.png": {
"filename": "2.png", "frame": { "x": 0, "y": 55, "w": 12, "h": 11 },
"frame": {"x":24,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "3.png": {
"filename": "3.png", "frame": { "x": 12, "y": 55, "w": 12, "h": 11 },
"frame": {"x":36,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "4.png": {
"filename": "4.png", "frame": { "x": 24, "y": 55, "w": 12, "h": 11 },
"frame": {"x":48,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "5.png": {
"filename": "5.png", "frame": { "x": 84, "y": 55, "w": 12, "h": 11 },
"frame": {"x":60,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "6.png": {
"filename": "6.png", "frame": { "x": 96, "y": 55, "w": 12, "h": 11 },
"frame": {"x":72,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "7.png": {
"filename": "7.png", "frame": { "x": 120, "y": 55, "w": 12, "h": 11 },
"frame": {"x":84,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "8.png": {
"filename": "8.png", "frame": { "x": 132, "y": 55, "w": 12, "h": 11 },
"frame": {"x":96,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "9.png": {
"filename": "9.png", "frame": { "x": 52, "y": 33, "w": 12, "h": 11 },
"frame": {"x":108,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "A.png": {
"filename": "A.png", "frame": { "x": 64, "y": 33, "w": 12, "h": 11 },
"frame": {"x":120,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "ALT.png": {
"filename": "ALT.png", "frame": { "x": 0, "y": 22, "w": 16, "h": 11 },
"frame": {"x":132,"y":0,"w":16,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":16,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 16, "h": 11 },
"sourceSize": {"w":16,"h":12} "sourceSize": { "w": 16, "h": 11 }
}, },
{ "B.png": {
"filename": "B.png", "frame": { "x": 76, "y": 33, "w": 12, "h": 11 },
"frame": {"x":148,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "BACK.png": {
"filename": "BACK.png", "frame": { "x": 80, "y": 0, "w": 24, "h": 11 },
"frame": {"x":160,"y":0,"w":24,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":24,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 24, "h": 11 },
"sourceSize": {"w":24,"h":12} "sourceSize": { "w": 24, "h": 11 }
}, },
{ "C.png": {
"filename": "C.png", "frame": { "x": 88, "y": 33, "w": 12, "h": 11 },
"frame": {"x":184,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "CTRL.png": {
"filename": "CTRL.png", "frame": { "x": 0, "y": 11, "w": 22, "h": 11 },
"frame": {"x":196,"y":0,"w":22,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":22,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 22, "h": 11 },
"sourceSize": {"w":22,"h":12} "sourceSize": { "w": 22, "h": 11 }
}, },
{ "D.png": {
"filename": "D.png", "frame": { "x": 100, "y": 33, "w": 12, "h": 11 },
"frame": {"x":218,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "DEL.png": {
"filename": "DEL.png", "frame": { "x": 116, "y": 11, "w": 17, "h": 11 },
"frame": {"x":230,"y":0,"w":17,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":17,"h":12},
"sourceSize": {"w":17,"h":12}
},
{
"filename": "E.png",
"frame": {"x":247,"y":0,"w":12,"h":12},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
"sourceSize": {"w":12,"h":12}
},
{
"filename": "END.png",
"frame": {"x":259,"y":0,"w":18,"h":12},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":18,"h":12},
"sourceSize": {"w":18,"h":12}
},
{
"filename": "ENTER.png",
"frame": {"x":277,"y":0,"w":27,"h":11},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":27,"h":11},
"sourceSize": {"w":27,"h":11}
},
{
"filename": "ESC.png",
"frame": {"x":304,"y":0,"w":17,"h":11},
"rotated": false,
"trimmed": false,
"spriteSourceSize": { "x": 0, "y": 0, "w": 17, "h": 11 }, "spriteSourceSize": { "x": 0, "y": 0, "w": 17, "h": 11 },
"sourceSize": { "w": 17, "h": 11 } "sourceSize": { "w": 17, "h": 11 }
}, },
{ "E.png": {
"filename": "F.png", "frame": { "x": 112, "y": 33, "w": 12, "h": 11 },
"frame": {"x":321,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "END.png": {
"filename": "F1.png", "frame": { "x": 81, "y": 11, "w": 18, "h": 11 },
"frame": {"x":333,"y":0,"w":13,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 18, "h": 11 },
"sourceSize": {"w":13,"h":12} "sourceSize": { "w": 18, "h": 11 }
}, },
{ "ENTER.png": {
"filename": "F2.png", "frame": { "x": 28, "y": 0, "w": 27, "h": 11 },
"frame": {"x":346,"y":0,"w":13,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 27, "h": 11 },
"sourceSize": {"w":13,"h":12} "sourceSize": { "w": 27, "h": 11 }
}, },
{ "ESC.png": {
"filename": "F3.png", "frame": { "x": 99, "y": 11, "w": 17, "h": 11 },
"frame": {"x":359,"y":0,"w":13,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 17, "h": 11 },
"sourceSize": {"w":13,"h":12} "sourceSize": { "w": 17, "h": 11 }
}, },
{ "F.png": {
"filename": "F4.png", "frame": { "x": 124, "y": 33, "w": 12, "h": 11 },
"frame": {"x":372,"y":0,"w":13,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":13,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "F1.png": {
"filename": "F5.png", "frame": { "x": 78, "y": 22, "w": 13, "h": 11 },
"frame": {"x":385,"y":0,"w":13,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
"sourceSize": {"w":13,"h":12} "sourceSize": { "w": 13, "h": 11 }
}, },
{ "F2.png": {
"filename": "F6.png", "frame": { "x": 91, "y": 22, "w": 13, "h": 11 },
"frame": {"x":398,"y":0,"w":13,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
"sourceSize": {"w":13,"h":12} "sourceSize": { "w": 13, "h": 11 }
}, },
{ "F3.png": {
"filename": "F7.png", "frame": { "x": 104, "y": 22, "w": 13, "h": 11 },
"frame": {"x":411,"y":0,"w":13,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
"sourceSize": {"w":13,"h":12} "sourceSize": { "w": 13, "h": 11 }
}, },
{ "F4.png": {
"filename": "F8.png", "frame": { "x": 117, "y": 22, "w": 13, "h": 11 },
"frame": {"x":424,"y":0,"w":13,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
"sourceSize": {"w":13,"h":12} "sourceSize": { "w": 13, "h": 11 }
}, },
{ "F5.png": {
"filename": "F9.png", "frame": { "x": 130, "y": 22, "w": 13, "h": 11 },
"frame": {"x":437,"y":0,"w":13,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
"sourceSize": {"w":13,"h":12} "sourceSize": { "w": 13, "h": 11 }
}, },
{ "F6.png": {
"filename": "F10.png", "frame": { "x": 0, "y": 33, "w": 13, "h": 11 },
"frame": {"x":450,"y":0,"w":16,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":16,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
"sourceSize": {"w":16,"h":12} "sourceSize": { "w": 13, "h": 11 }
}, },
{ "F7.png": {
"filename": "F11.png", "frame": { "x": 13, "y": 33, "w": 13, "h": 11 },
"frame": {"x":466,"y":0,"w":15,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":15,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
"sourceSize": {"w":15,"h":12} "sourceSize": { "w": 13, "h": 11 }
}, },
{ "F8.png": {
"filename": "F12.png", "frame": { "x": 26, "y": 33, "w": 13, "h": 11 },
"frame": {"x":481,"y":0,"w":16,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":16,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
"sourceSize": {"w":16,"h":12} "sourceSize": { "w": 13, "h": 11 }
}, },
{ "F9.png": {
"filename": "G.png", "frame": { "x": 39, "y": 33, "w": 13, "h": 11 },
"frame": {"x":497,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 13, "h": 11 }
}, },
{ "F10.png": {
"filename": "H.png", "frame": { "x": 16, "y": 22, "w": 16, "h": 11 },
"frame": {"x":509,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 16, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 16, "h": 11 }
}, },
{ "F11.png": {
"filename": "HOME.png", "frame": { "x": 48, "y": 22, "w": 15, "h": 11 },
"frame": {"x":521,"y":0,"w":23,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":23,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 15, "h": 11 },
"sourceSize": {"w":23,"h":12} "sourceSize": { "w": 15, "h": 11 }
}, },
{ "F12.png": {
"filename": "I.png", "frame": { "x": 133, "y": 11, "w": 16, "h": 11 },
"frame": {"x":544,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 16, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 16, "h": 11 }
}, },
{ "G.png": {
"filename": "INS.png", "frame": { "x": 136, "y": 33, "w": 12, "h": 11 },
"frame": {"x":556,"y":0,"w":16,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":16,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":16,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "H.png": {
"filename": "J.png", "frame": { "x": 0, "y": 44, "w": 12, "h": 11 },
"frame": {"x":572,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "HOME.png": {
"filename": "K.png", "frame": { "x": 104, "y": 0, "w": 23, "h": 11 },
"frame": {"x":584,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 23, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 23, "h": 11 }
}, },
{ "I.png": {
"filename": "KEY_ARROW_DOWN.png", "frame": { "x": 24, "y": 44, "w": 12, "h": 11 },
"frame": {"x":596,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "INS.png": {
"filename": "KEY_ARROW_LEFT.png", "frame": { "x": 32, "y": 22, "w": 16, "h": 11 },
"frame": {"x":608,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 16, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 16, "h": 11 }
}, },
{ "J.png": {
"filename": "KEY_ARROW_RIGHT.png", "frame": { "x": 48, "y": 44, "w": 12, "h": 11 },
"frame": {"x":620,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "K.png": {
"filename": "KEY_ARROW_UP.png", "frame": { "x": 60, "y": 44, "w": 12, "h": 11 },
"frame": {"x":632,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "KEY_ARROW_DOWN.png": {
"filename": "L.png", "frame": { "x": 72, "y": 66, "w": 11, "h": 11 },
"frame": {"x":644,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 11, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 11, "h": 11 }
}, },
{ "KEY_ARROW_LEFT.png": {
"filename": "LEFT_BRACKET.png", "frame": { "x": 72, "y": 44, "w": 12, "h": 11 },
"frame": {"x":656,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "KEY_ARROW_RIGHT.png": {
"filename": "M.png", "frame": { "x": 84, "y": 44, "w": 12, "h": 11 },
"frame": {"x":668,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "KEY_ARROW_UP.png": {
"filename": "MINUS.png", "frame": { "x": 94, "y": 66, "w": 11, "h": 11 },
"frame": {"x":680,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 11, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 11, "h": 11 }
}, },
{ "L.png": {
"filename": "N.png", "frame": { "x": 96, "y": 44, "w": 12, "h": 11 },
"frame": {"x":692,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "LEFT_BRACKET.png": {
"filename": "O.png", "frame": { "x": 127, "y": 66, "w": 10, "h": 11 },
"frame": {"x":704,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 10, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 10, "h": 11 }
}, },
{ "M.png": {
"filename": "P.png", "frame": { "x": 108, "y": 44, "w": 12, "h": 11 },
"frame": {"x":716,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "MINUS.png": {
"filename": "PAGE_DOWN.png", "frame": { "x": 105, "y": 66, "w": 11, "h": 11 },
"frame": {"x":728,"y":0,"w":20,"h":11},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 11, "h": 11 },
"sourceSize": { "w": 11, "h": 11 }
},
"N.png": {
"frame": { "x": 120, "y": 44, "w": 12, "h": 11 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": { "w": 12, "h": 11 }
},
"O.png": {
"frame": { "x": 12, "y": 44, "w": 12, "h": 11 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": { "w": 12, "h": 11 }
},
"P.png": {
"frame": { "x": 132, "y": 44, "w": 12, "h": 11 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": { "w": 12, "h": 11 }
},
"PAGE_DOWN.png": {
"frame": { "x": 22, "y": 11, "w": 20, "h": 11 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 20, "h": 11 }, "spriteSourceSize": { "x": 0, "y": 0, "w": 20, "h": 11 },
"sourceSize": { "w": 20, "h": 11 } "sourceSize": { "w": 20, "h": 11 }
}, },
{ "PAGE_UP.png": {
"filename": "PAGE_UP.png", "frame": { "x": 42, "y": 11, "w": 20, "h": 11 },
"frame": {"x":748,"y":0,"w":20,"h":11},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 20, "h": 11 }, "spriteSourceSize": { "x": 0, "y": 0, "w": 20, "h": 11 },
"sourceSize": { "w": 20, "h": 11 } "sourceSize": { "w": 20, "h": 11 }
}, },
{ "PLUS.png": {
"filename": "PLUS.png", "frame": { "x": 116, "y": 66, "w": 11, "h": 11 },
"frame": {"x":768,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 11, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 11, "h": 11 }
}, },
{ "Q.png": {
"filename": "Q.png", "frame": { "x": 36, "y": 55, "w": 12, "h": 11 },
"frame": {"x":780,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "QUOTE.png": {
"filename": "QUOTE.png", "frame": { "x": 83, "y": 66, "w": 11, "h": 11 },
"frame": {"x":792,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 11, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 11, "h": 11 }
}, },
{ "R.png": {
"filename": "R.png", "frame": { "x": 48, "y": 55, "w": 12, "h": 11 },
"frame": {"x":804,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "RIGHT_BRACKET.png": {
"filename": "RIGHT_BRACKET.png", "frame": { "x": 137, "y": 66, "w": 10, "h": 11 },
"frame": {"x":816,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 10, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 10, "h": 11 }
}, },
{ "S.png": {
"filename": "S.png", "frame": { "x": 60, "y": 55, "w": 12, "h": 11 },
"frame": {"x":828,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "SEMICOLON.png": {
"filename": "SEMICOLON.png", "frame": { "x": 72, "y": 55, "w": 12, "h": 11 },
"frame": {"x":840,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "SHIFT.png": {
"filename": "SHIFT.png", "frame": { "x": 127, "y": 0, "w": 23, "h": 11 },
"frame": {"x":852,"y":0,"w":23,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":23,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 23, "h": 11 },
"sourceSize": {"w":23,"h":12} "sourceSize": { "w": 23, "h": 11 }
}, },
{ "SPACE.png": {
"filename": "SPACE.png", "frame": { "x": 55, "y": 0, "w": 25, "h": 11 },
"frame": {"x":875,"y":0,"w":25,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":25,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 25, "h": 11 },
"sourceSize": {"w":25,"h":12} "sourceSize": { "w": 25, "h": 11 }
}, },
{ "T.png": {
"filename": "T.png", "frame": { "x": 108, "y": 55, "w": 12, "h": 11 },
"frame": {"x":900,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "TAB.png": {
"filename": "TAB.png", "frame": { "x": 62, "y": 11, "w": 19, "h": 11 },
"frame": {"x":912,"y":0,"w":19,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 19, "h": 11 },
"sourceSize": {"w":19,"h":12} "sourceSize": { "w": 19, "h": 11 }
}, },
{ "TILDE.png": {
"filename": "TILDE.png", "frame": { "x": 63, "y": 22, "w": 15, "h": 11 },
"frame": {"x":931,"y":0,"w":15,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":15,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 15, "h": 11 },
"sourceSize": {"w":15,"h":12} "sourceSize": { "w": 15, "h": 11 }
}, },
{ "U.png": {
"filename": "U.png", "frame": { "x": 0, "y": 66, "w": 12, "h": 11 },
"frame": {"x":946,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "V.png": {
"filename": "V.png", "frame": { "x": 12, "y": 66, "w": 12, "h": 11 },
"frame": {"x":958,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "W.png": {
"filename": "W.png", "frame": { "x": 24, "y": 66, "w": 12, "h": 11 },
"frame": {"x":970,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "X.png": {
"filename": "X.png", "frame": { "x": 36, "y": 66, "w": 12, "h": 11 },
"frame": {"x":982,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "Y.png": {
"filename": "Y.png", "frame": { "x": 48, "y": 66, "w": 12, "h": 11 },
"frame": {"x":994,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "Z.png": {
"filename": "Z.png", "frame": { "x": 60, "y": 66, "w": 12, "h": 11 },
"frame": {"x":1006,"y":0,"w":12,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
"sourceSize": {"w":12,"h":12} "sourceSize": { "w": 12, "h": 11 }
}, },
{ "ACTION.png": {
"filename": "ACTION.png", "frame": { "x": 0, "y": 0, "w": 28, "h": 11 },
"frame": {"x":1018,"y":0,"w":28,"h":12},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":28,"h":12}, "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 11 },
"sourceSize": {"w":28,"h":12} "sourceSize": { "w": 28, "h": 11 }
}], }
},
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.aseprite.org/",
"version": "1.0", "version": "1.3.7-dev",
"image": "keyboard.png", "image": "keyboard.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": {"w":1018,"h":12}, "size": { "w": 150, "h": 77 },
"scale": "1", "scale": "1"
"smartupdate": "$TexturePacker:SmartUpdate:085d4353a5c4d18c90f82f8926710d72:45908b22b446cf7f4904d4e0b658b16a:bad03abb89ad027d879c383c13fd51bc$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -3475,12 +3475,12 @@ export class MoodyAbAttr extends PostTurnAbAttr {
if (!simulated) { if (!simulated) {
if (canRaise.length > 0) { if (canRaise.length > 0) {
const raisedStat = Utils.randSeedItem(canRaise); const raisedStat = canRaise[pokemon.randSeedInt(canRaise.length)];
canLower = canRaise.filter(s => s !== raisedStat); canLower = canRaise.filter(s => s !== raisedStat);
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ raisedStat ], 2)); pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ raisedStat ], 2));
} }
if (canLower.length > 0) { if (canLower.length > 0) {
const loweredStat = Utils.randSeedItem(canLower); const loweredStat = canLower[pokemon.randSeedInt(canLower.length)];
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ loweredStat ], -1)); pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ loweredStat ], -1));
} }
} }

View File

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

View File

@ -2675,7 +2675,7 @@ export class AcupressureStatStageChangeAttr extends MoveEffectAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> {
const randStats = BATTLE_STATS.filter(s => target.getStatStage(s) < 6); const randStats = BATTLE_STATS.filter(s => target.getStatStage(s) < 6);
if (randStats.length > 0) { if (randStats.length > 0) {
const boostStat = [randStats[Utils.randInt(randStats.length)]]; const boostStat = [randStats[user.randSeedInt(randStats.length)]];
user.scene.unshiftPhase(new StatStageChangePhase(user.scene, target.getBattlerIndex(), this.selfTarget, boostStat, 2)); user.scene.unshiftPhase(new StatStageChangePhase(user.scene, target.getBattlerIndex(), this.selfTarget, boostStat, 2));
return true; return true;
} }

View File

@ -944,7 +944,7 @@ export function initSpecies() {
new PokemonSpecies(Species.METAPOD, 1, false, false, false, "Cocoon Pokémon", Type.BUG, null, 0.7, 9.9, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 20, 55, 25, 25, 30, 120, 50, 72, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.METAPOD, 1, false, false, false, "Cocoon Pokémon", Type.BUG, null, 0.7, 9.9, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 20, 55, 25, 25, 30, 120, 50, 72, GrowthRate.MEDIUM_FAST, 50, false),
new PokemonSpecies(Species.BUTTERFREE, 1, false, false, false, "Butterfly Pokémon", Type.BUG, Type.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, GrowthRate.MEDIUM_FAST, 50, true, true, new PokemonSpecies(Species.BUTTERFREE, 1, false, false, false, "Butterfly Pokémon", Type.BUG, Type.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, GrowthRate.MEDIUM_FAST, 50, true, true,
new PokemonForm("Normal", "", Type.BUG, Type.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, true, null, true), new PokemonForm("Normal", "", Type.BUG, Type.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, true, null, true),
new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.FLYING, 17, 32, Abilities.TINTED_LENS, Abilities.TINTED_LENS, Abilities.TINTED_LENS, 495, 85, 35, 80, 120, 90, 85, 45, 50, 198, true), new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.FLYING, 17, 32, Abilities.COMPOUND_EYES, Abilities.COMPOUND_EYES, Abilities.COMPOUND_EYES, 495, 85, 35, 80, 120, 90, 85, 45, 50, 198, true),
), ),
new PokemonSpecies(Species.WEEDLE, 1, false, false, false, "Hairy Bug Pokémon", Type.BUG, Type.POISON, 0.3, 3.2, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.WEEDLE, 1, false, false, false, "Hairy Bug Pokémon", Type.BUG, Type.POISON, 0.3, 3.2, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, 50, false),
new PokemonSpecies(Species.KAKUNA, 1, false, false, false, "Cocoon Pokémon", Type.BUG, Type.POISON, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.KAKUNA, 1, false, false, false, "Cocoon Pokémon", Type.BUG, Type.POISON, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false),

View File

@ -246,7 +246,7 @@ export class LoadingScene extends SceneBase {
} else { } else {
this.loadAtlas("types", ""); this.loadAtlas("types", "");
} }
const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es", "pt_BR", "zh_CN"]; const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN"];
if (lang && availableLangs.includes(lang)) { if (lang && availableLangs.includes(lang)) {
this.loadImage("september-update-"+lang, "events"); this.loadImage("september-update-"+lang, "events");
} else { } else {

View File

@ -94,5 +94,6 @@
"retryBattle": "Möchtest du vom Beginn des Kampfes neustarten?", "retryBattle": "Möchtest du vom Beginn des Kampfes neustarten?",
"unlockedSomething": "{{unlockedThing}} wurde freigeschaltet.", "unlockedSomething": "{{unlockedThing}} wurde freigeschaltet.",
"congratulations": "Glückwunsch!", "congratulations": "Glückwunsch!",
"beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!" "beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!",
"eggSkipPrompt": "Zur Ei-Zusammenfassung springen?"
} }

View File

@ -1,10 +1,11 @@
{ {
"noneSelected": "Keine ausgewählt",
"title": "Herausforderungsmodifikatoren", "title": "Herausforderungsmodifikatoren",
"illegalEvolution": "{{pokemon}} hat sich in ein Pokémon verwandelt, dass für diese Herausforderung nicht zulässig ist!", "illegalEvolution": "{{pokemon}} hat sich in ein Pokémon verwandelt, dass für diese Herausforderung nicht zulässig ist!",
"singleGeneration": { "singleGeneration": {
"name": "Mono-Generation", "name": "Mono-Generation",
"desc": "Du kannst nur Pokémon aus der {{gen}} Generation verwenden.", "desc": "Du kannst nur Pokémon aus der {{gen}} Generation verwenden.",
"desc_default": "Du kannst nur Pokémon gewählten Generation verwenden.", "desc_default": "Du kannst nur Pokémon aus der gewählten Generation verwenden.",
"gen_1": "ersten", "gen_1": "ersten",
"gen_2": "zweiten", "gen_2": "zweiten",
"gen_3": "dritten", "gen_3": "dritten",

View File

@ -25,5 +25,6 @@
"unlinkGoogle": "Google trennen", "unlinkGoogle": "Google trennen",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?", "losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?",
"noEggs": "Du brütest aktuell keine Eier aus!" "noEggs": "Du brütest aktuell keine Eier aus!",
"donate": "Spenden"
} }

View File

@ -94,5 +94,6 @@
"retryBattle": "Voulez-vous réessayer depuis le début du combat ?", "retryBattle": "Voulez-vous réessayer depuis le début du combat ?",
"unlockedSomething": "{{unlockedThing}}\na été débloqué.", "unlockedSomething": "{{unlockedThing}}\na été débloqué.",
"congratulations": "Félicitations !", "congratulations": "Félicitations !",
"beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !" "beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !",
"eggSkipPrompt": "Aller directement au résumé des Œufs éclos ?"
} }

View File

@ -25,5 +25,6 @@
"unlinkGoogle": "Délier Google", "unlinkGoogle": "Délier Google",
"cancel": "Retour", "cancel": "Retour",
"losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?", "losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?",
"noEggs": "Vous ne faites actuellement\néclore aucun Œuf !" "noEggs": "Vous ne faites actuellement\néclore aucun Œuf !",
"donate": "Faire un don"
} }

View File

@ -161,9 +161,11 @@ export class EncounterPhase extends BattlePhase {
return this.scene.reset(true); return this.scene.reset(true);
} }
this.doEncounter(); this.doEncounter();
this.scene.resetSeed();
}); });
} else { } else {
this.doEncounter(); this.doEncounter();
this.scene.resetSeed();
} }
}); });
}); });

View File

@ -946,7 +946,7 @@ export class GameData {
return ret; return ret;
} }
private getSessionSaveData(scene: BattleScene): SessionSaveData { public getSessionSaveData(scene: BattleScene): SessionSaveData {
return { return {
seed: scene.seed, seed: scene.seed,
playTime: scene.sessionPlayTime, playTime: scene.sessionPlayTime,

View File

@ -1,15 +1,12 @@
import { Stat } from "#enums/stat"; import { BattlerIndex } from "#app/battle";
import GameManager from "#test/utils/gameManager";
import { Abilities } from "#enums/abilities"; import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves"; import { Moves } from "#enums/moves";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import { Stat } from "#enums/stat";
import GameManager from "#test/utils/gameManager";
import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser"; import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { SPLASH_ONLY } from "../utils/testUtils";
import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
import { VictoryPhase } from "#app/phases/victory-phase";
import { TurnStartPhase } from "#app/phases/turn-start-phase";
import { BattlerIndex } from "#app/battle";
describe("Abilities - Beast Boost", () => { describe("Abilities - Beast Boost", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
@ -37,49 +34,44 @@ describe("Abilities - Beast Boost", () => {
.enemyMoveset(SPLASH_ONLY); .enemyMoveset(SPLASH_ONLY);
}); });
// Note that both MOXIE and BEAST_BOOST test for their current implementation and not their mainline behavior.
it("should prefer highest stat to boost its corresponding stat stage by 1 when winning a battle", async() => { it("should prefer highest stat to boost its corresponding stat stage by 1 when winning a battle", async() => {
// SLOWBRO's highest stat is DEF, so it should be picked here await game.classicMode.startBattle([Species.SLOWBRO]);
await game.startBattle([
Species.SLOWBRO
]);
const playerPokemon = game.scene.getPlayerPokemon()!; const playerPokemon = game.scene.getPlayerPokemon()!;
// Set the pokemon's highest stat to DEF, so it should be picked by Beast Boost
vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([ 10000, 100, 1000, 200, 100, 100 ]);
console.log(playerPokemon.stats);
expect(playerPokemon.getStatStage(Stat.DEF)).toBe(0); expect(playerPokemon.getStatStage(Stat.DEF)).toBe(0);
game.move.select(Moves.FLAMETHROWER); game.move.select(Moves.FLAMETHROWER);
await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(VictoryPhase); await game.phaseInterceptor.to("VictoryPhase");
expect(playerPokemon.getStatStage(Stat.DEF)).toBe(1); expect(playerPokemon.getStatStage(Stat.DEF)).toBe(1);
}, 20000); }, 20000);
it("should use in-battle overriden stats when determining the stat stage to raise by 1", async() => { it("should use in-battle overriden stats when determining the stat stage to raise by 1", async() => {
// If the opponent can GUARD_SPLIT, SLOWBRO's second highest stat should be SPATK
game.override.enemyMoveset(new Array(4).fill(Moves.GUARD_SPLIT)); game.override.enemyMoveset(new Array(4).fill(Moves.GUARD_SPLIT));
await game.startBattle([ await game.classicMode.startBattle([Species.SLOWBRO]);
Species.SLOWBRO
]);
const playerPokemon = game.scene.getPlayerPokemon()!; const playerPokemon = game.scene.getPlayerPokemon()!;
// If the opponent uses Guard Split, the pokemon's second highest stat (SPATK) should be chosen
vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([ 10000, 100, 201, 200, 100, 100 ]);
expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(0); expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(0);
game.move.select(Moves.FLAMETHROWER); game.move.select(Moves.FLAMETHROWER);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.phaseInterceptor.to("VictoryPhase");
await game.phaseInterceptor.runFrom(TurnStartPhase).to(VictoryPhase);
expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1); expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1);
}, 20000); }, 20000);
it("should have order preference in case of stat ties", async() => { it("should have order preference in case of stat ties", async() => {
// Order preference follows the order of EFFECTIVE_STAT // Order preference follows the order of EFFECTIVE_STAT
await game.startBattle([ await game.classicMode.startBattle([Species.SLOWBRO]);
Species.SLOWBRO
]);
const playerPokemon = game.scene.getPlayerPokemon()!; const playerPokemon = game.scene.getPlayerPokemon()!;
@ -90,7 +82,7 @@ describe("Abilities - Beast Boost", () => {
game.move.select(Moves.FLAMETHROWER); game.move.select(Moves.FLAMETHROWER);
await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(VictoryPhase); await game.phaseInterceptor.to("VictoryPhase");
expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1); expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1);
}, 20000); }, 20000);

View File

@ -10,7 +10,7 @@ import { EnemyPokemon } from "#app/field/pokemon";
import { toDmgValue } from "#app/utils"; import { toDmgValue } from "#app/utils";
describe("Boss Pokemon / Shields", () => { describe("Boss Pokemon / Shields", () => {
const TIMEOUT = 2500; const TIMEOUT = 20 * 1000;
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;

137
src/test/reload.test.ts Normal file
View File

@ -0,0 +1,137 @@
import { Species } from "#app/enums/species";
import { GameModes } from "#app/game-mode";
import GameManager from "#test/utils/gameManager";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import { SPLASH_ONLY } from "./utils/testUtils";
import { Moves } from "#app/enums/moves";
import { Biome } from "#app/enums/biome";
describe("Reload", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
});
it("should not have RNG inconsistencies in a Classic run", async () => {
await game.classicMode.startBattle();
const preReloadRngState = Phaser.Math.RND.state();
await game.reload.reloadSession();
const postReloadRngState = Phaser.Math.RND.state();
expect(preReloadRngState).toBe(postReloadRngState);
}, 20000);
it("should not have RNG inconsistencies after a biome switch", async () => {
game.override
.startingWave(10)
.startingBiome(Biome.CAVE) // Will lead to biomes with randomly generated weather
.battleType("single")
.startingLevel(100)
.enemyLevel(1000)
.disableTrainerWaves()
.moveset([Moves.KOWTOW_CLEAVE])
.enemyMoveset(SPLASH_ONLY);
await game.dailyMode.startBattle();
// Transition from Daily Run Wave 10 to Wave 11 in order to trigger biome switch
game.move.select(Moves.KOWTOW_CLEAVE);
await game.phaseInterceptor.to("DamagePhase");
await game.doKillOpponents();
await game.toNextWave();
expect(game.phaseInterceptor.log).toContain("NewBiomeEncounterPhase");
const preReloadRngState = Phaser.Math.RND.state();
await game.reload.reloadSession();
const postReloadRngState = Phaser.Math.RND.state();
expect(preReloadRngState).toBe(postReloadRngState);
}, 20000);
it("should not have RNG inconsistencies at a Daily run wild Pokemon fight", async () => {
await game.dailyMode.startBattle();
const preReloadRngState = Phaser.Math.RND.state();
await game.reload.reloadSession();
const postReloadRngState = Phaser.Math.RND.state();
expect(preReloadRngState).toBe(postReloadRngState);
}, 20000);
it("should not have RNG inconsistencies at a Daily run double battle", async () => {
game.override
.battleType("double");
await game.dailyMode.startBattle();
const preReloadRngState = Phaser.Math.RND.state();
await game.reload.reloadSession();
const postReloadRngState = Phaser.Math.RND.state();
expect(preReloadRngState).toBe(postReloadRngState);
}, 20000);
it("should not have RNG inconsistencies at a Daily run Gym Leader fight", async () => {
game.override
.battleType("single")
.startingWave(40);
await game.dailyMode.startBattle();
const preReloadRngState = Phaser.Math.RND.state();
await game.reload.reloadSession();
const postReloadRngState = Phaser.Math.RND.state();
expect(preReloadRngState).toBe(postReloadRngState);
}, 20000);
it("should not have RNG inconsistencies at a Daily run regular trainer fight", async () => {
game.override
.battleType("single")
.startingWave(45);
await game.dailyMode.startBattle();
const preReloadRngState = Phaser.Math.RND.state();
await game.reload.reloadSession();
const postReloadRngState = Phaser.Math.RND.state();
expect(preReloadRngState).toBe(postReloadRngState);
}, 20000);
it("should not have RNG inconsistencies at a Daily run wave 50 Boss fight", async () => {
game.override
.battleType("single")
.startingWave(50);
await game.runToFinalBossEncounter([Species.BULBASAUR], GameModes.DAILY);
const preReloadRngState = Phaser.Math.RND.state();
await game.reload.reloadSession();
const postReloadRngState = Phaser.Math.RND.state();
expect(preReloadRngState).toBe(postReloadRngState);
}, 20000);
});

View File

@ -45,6 +45,8 @@ import { ChallengeModeHelper } from "./helpers/challengeModeHelper";
import { MoveHelper } from "./helpers/moveHelper"; import { MoveHelper } from "./helpers/moveHelper";
import { OverridesHelper } from "./helpers/overridesHelper"; import { OverridesHelper } from "./helpers/overridesHelper";
import { SettingsHelper } from "./helpers/settingsHelper"; import { SettingsHelper } from "./helpers/settingsHelper";
import { ReloadHelper } from "./helpers/reloadHelper";
import { CheckSwitchPhase } from "#app/phases/check-switch-phase";
/** /**
* Class to manage the game state and transitions between phases. * Class to manage the game state and transitions between phases.
@ -61,6 +63,7 @@ export default class GameManager {
public readonly dailyMode: DailyModeHelper; public readonly dailyMode: DailyModeHelper;
public readonly challengeMode: ChallengeModeHelper; public readonly challengeMode: ChallengeModeHelper;
public readonly settings: SettingsHelper; public readonly settings: SettingsHelper;
public readonly reload: ReloadHelper;
/** /**
* Creates an instance of GameManager. * Creates an instance of GameManager.
@ -82,6 +85,7 @@ export default class GameManager {
this.dailyMode = new DailyModeHelper(this); this.dailyMode = new DailyModeHelper(this);
this.challengeMode = new ChallengeModeHelper(this); this.challengeMode = new ChallengeModeHelper(this);
this.settings = new SettingsHelper(this); this.settings = new SettingsHelper(this);
this.reload = new ReloadHelper(this);
} }
/** /**
@ -231,12 +235,12 @@ export default class GameManager {
this.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { this.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => {
const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler; const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler;
handler.processInput(Button.CANCEL); handler.processInput(Button.CANCEL);
}, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase), true); }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase) || this.isCurrentPhase(CheckSwitchPhase), true);
this.onNextPrompt("SelectModifierPhase", Mode.CONFIRM, () => { this.onNextPrompt("SelectModifierPhase", Mode.CONFIRM, () => {
const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler; const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler;
handler.processInput(Button.ACTION); handler.processInput(Button.ACTION);
}, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase)); }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase) || this.isCurrentPhase(CheckSwitchPhase));
} }
forceOpponentToSwitch() { forceOpponentToSwitch() {

View File

@ -0,0 +1,53 @@
import { GameManagerHelper } from "./gameManagerHelper";
import { TitlePhase } from "#app/phases/title-phase";
import { Mode } from "#app/ui/ui";
import { vi } from "vitest";
import { BattleStyle } from "#app/enums/battle-style";
import { CommandPhase } from "#app/phases/command-phase";
import { TurnInitPhase } from "#app/phases/turn-init-phase";
/**
* Helper to allow reloading sessions in unit tests.
*/
export class ReloadHelper extends GameManagerHelper {
/**
* Simulate reloading the session from the title screen, until reaching the
* beginning of the first turn (equivalent to running `startBattle()`) for
* the reloaded session.
*/
async reloadSession() : Promise<void> {
const scene = this.game.scene;
const sessionData = scene.gameData.getSessionSaveData(scene);
const titlePhase = new TitlePhase(scene);
scene.clearPhaseQueue();
// Set the last saved session to the desired session data
vi.spyOn(scene.gameData, "getSession").mockReturnValue(
new Promise((resolve, reject) => {
resolve(sessionData);
})
);
scene.unshiftPhase(titlePhase);
this.game.endPhase(); // End the currently ongoing battle
titlePhase.loadSaveSlot(-1); // Load the desired session data
this.game.phaseInterceptor.shift(); // Loading the save slot also ended TitlePhase, clean it up
// Run through prompts for switching Pokemon, copied from classicModeHelper.ts
if (this.game.scene.battleStyle === BattleStyle.SWITCH) {
this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => {
this.game.setMode(Mode.MESSAGE);
this.game.endPhase();
}, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase));
this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => {
this.game.setMode(Mode.MESSAGE);
this.game.endPhase();
}, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase));
}
await this.game.phaseInterceptor.to(CommandPhase);
console.log("==================[New Turn]==================");
}
}

View File

@ -12,12 +12,14 @@ import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
import { EvolutionPhase } from "#app/phases/evolution-phase"; import { EvolutionPhase } from "#app/phases/evolution-phase";
import { FaintPhase } from "#app/phases/faint-phase"; import { FaintPhase } from "#app/phases/faint-phase";
import { LearnMovePhase } from "#app/phases/learn-move-phase"; import { LearnMovePhase } from "#app/phases/learn-move-phase";
import { LevelCapPhase } from "#app/phases/level-cap-phase";
import { LoginPhase } from "#app/phases/login-phase"; import { LoginPhase } from "#app/phases/login-phase";
import { MessagePhase } from "#app/phases/message-phase"; import { MessagePhase } from "#app/phases/message-phase";
import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase";
import { MovePhase } from "#app/phases/move-phase"; import { MovePhase } from "#app/phases/move-phase";
import { NewBattlePhase } from "#app/phases/new-battle-phase"; import { NewBattlePhase } from "#app/phases/new-battle-phase";
import { NewBiomeEncounterPhase } from "#app/phases/new-biome-encounter-phase";
import { NextEncounterPhase } from "#app/phases/next-encounter-phase"; import { NextEncounterPhase } from "#app/phases/next-encounter-phase";
import { PostSummonPhase } from "#app/phases/post-summon-phase"; import { PostSummonPhase } from "#app/phases/post-summon-phase";
import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase";
@ -63,6 +65,7 @@ export default class PhaseInterceptor {
[TitlePhase, this.startPhase], [TitlePhase, this.startPhase],
[SelectGenderPhase, this.startPhase], [SelectGenderPhase, this.startPhase],
[EncounterPhase, this.startPhase], [EncounterPhase, this.startPhase],
[NewBiomeEncounterPhase, this.startPhase],
[SelectStarterPhase, this.startPhase], [SelectStarterPhase, this.startPhase],
[PostSummonPhase, this.startPhase], [PostSummonPhase, this.startPhase],
[SummonPhase, this.startPhase], [SummonPhase, this.startPhase],
@ -98,6 +101,7 @@ export default class PhaseInterceptor {
[PartyHealPhase, this.startPhase], [PartyHealPhase, this.startPhase],
[EvolutionPhase, this.startPhase], [EvolutionPhase, this.startPhase],
[EndEvolutionPhase, this.startPhase], [EndEvolutionPhase, this.startPhase],
[LevelCapPhase, this.startPhase],
]; ];
private endBySetMode = [ private endBySetMode = [
@ -239,6 +243,22 @@ export default class PhaseInterceptor {
this.scene.shiftPhase(); this.scene.shiftPhase();
} }
/**
* Remove the current phase from the phase interceptor.
*
* Do not call this unless absolutely necessary. This function is intended
* for cleaning up the phase interceptor when, for whatever reason, a phase
* is manually ended without using the phase interceptor.
*
* @param shouldRun Whether or not the current scene should also be run.
*/
shift(shouldRun: boolean = false) : void {
this.onHold.shift();
if (shouldRun) {
this.scene.shiftPhase();
}
}
/** /**
* Method to initialize phases and their corresponding methods. * Method to initialize phases and their corresponding methods.
*/ */

View File

@ -33,7 +33,7 @@ const timedEvents: TimedEvent[] = [
xPosition: 19, xPosition: 19,
yPosition: 115, yPosition: 115,
scale: 0.30, scale: 0.30,
availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es", "pt_BR", "zh_CN"] availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN"]
} }
]; ];