Merge branch 'pagefaultgames:main' into main

This commit is contained in:
Ice 2024-04-30 22:58:14 -05:00 committed by GitHub
commit 677ff6d606
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
104 changed files with 2159 additions and 999 deletions

1
.gitignore vendored
View File

@ -33,5 +33,6 @@ public/images/pokemon/icons/input/output/*
public/images/character/*/ public/images/character/*/
src/data/battle-anim-raw-data*.ts src/data/battle-anim-raw-data*.ts
src/data/battle-anim-data.ts src/data/battle-anim-data.ts
src/overrides.ts
coverage coverage

View File

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

View File

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

13
package-lock.json generated
View File

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

View File

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

View File

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

View File

@ -4,30 +4,30 @@
"image": "676-dandy.png", "image": "676-dandy.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 72, "w": 66,
"h": 72 "h": 66
}, },
"scale": 1, "scale": 0.333,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 62, "w": 96,
"h": 72 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 20,
"y": 0, "y": 14,
"w": 62, "w": 56,
"h": 72 "h": 66
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 62, "w": 56,
"h": 72 "h": 66
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:9a72775f436bbda574bf3721630310fb:f01538e7a19ca3d0d2fea48cd27d8a4c:b5a287256e260744fe6660dc2ceefd11$" "smartupdate": "$TexturePacker:SmartUpdate:30c2972a226f8e360e323bea40a8005e:232a9bbcc4dba00a033204f1ec06cffd:b5a287256e260744fe6660dc2ceefd11$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 711 B

View File

@ -4,30 +4,30 @@
"image": "676-debutante.png", "image": "676-debutante.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 68, "w": 62,
"h": 68 "h": 62
}, },
"scale": 1, "scale": 0.333,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 57, "w": 96,
"h": 68 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 25,
"y": 0, "y": 18,
"w": 57, "w": 51,
"h": 68 "h": 62
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 57, "w": 51,
"h": 68 "h": 62
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:6d038d8d188d6e545741353c2dd5b812:6f39eb82deb32d251df708f5d4edc9f1:bf2f862a1c8881133f9f3ffbf44602fa$" "smartupdate": "$TexturePacker:SmartUpdate:5a68081e37dfebc3935ecf4a4fbee3ad:71cbee6966c08512b0617eba3ce34a49:bf2f862a1c8881133f9f3ffbf44602fa$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 775 B

View File

@ -4,30 +4,30 @@
"image": "676-diamond.png", "image": "676-diamond.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 74, "w": 68,
"h": 74 "h": 68
}, },
"scale": 1, "scale": 0.333,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 51, "w": 96,
"h": 74 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 27,
"y": 0, "y": 12,
"w": 51, "w": 45,
"h": 74 "h": 68
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 51, "w": 45,
"h": 74 "h": 68
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:6e2189160ebb9fff02e9a051ee296d91:47037a1746645a551e31781cb8262e1f:88c467fc09249b0d2f579d44eacd528d$" "smartupdate": "$TexturePacker:SmartUpdate:2d32af44d56592301808b561e6fa22f6:c70b6710f9c7ebb5268979a777193386:88c467fc09249b0d2f579d44eacd528d$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 693 B

View File

@ -4,30 +4,30 @@
"image": "676-heart.png", "image": "676-heart.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 71, "w": 65,
"h": 71 "h": 65
}, },
"scale": 1, "scale": 0.333,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 52, "w": 96,
"h": 71 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 26,
"y": 0, "y": 15,
"w": 52, "w": 46,
"h": 71 "h": 65
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 52, "w": 46,
"h": 71 "h": 65
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:bd54cfc49b95a12709696441044b115c:dce25f0e6474cad17709f18c96ffb3e5:e11d4dd16bff2ef69bc5ca683c44ca7c$" "smartupdate": "$TexturePacker:SmartUpdate:e936d451ba0b36434d6444cb1b80f4d9:0b0d0b49e11fcc790a20130e3ab18ca5:e11d4dd16bff2ef69bc5ca683c44ca7c$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 717 B

View File

@ -4,30 +4,30 @@
"image": "676-kabuki.png", "image": "676-kabuki.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 71, "w": 65,
"h": 71 "h": 65
}, },
"scale": 1, "scale": 0.333,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 55, "w": 96,
"h": 71 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 23,
"y": 0, "y": 15,
"w": 55, "w": 49,
"h": 71 "h": 65
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 55, "w": 49,
"h": 71 "h": 65
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:5bd5ad9678c59b2b1d85a6af103ba1ba:2f6c7f2792f64728b478333fc2c65138:c3cad56aa65d2ee971ceebc435a14ee6$" "smartupdate": "$TexturePacker:SmartUpdate:517d96cd6baa5b7616a51e8c4fed7a55:0a0f239ab3df60459410fab5eba8a4e6:c3cad56aa65d2ee971ceebc435a14ee6$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 731 B

View File

@ -4,30 +4,30 @@
"image": "676-la-reine.png", "image": "676-la-reine.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 69, "w": 63,
"h": 69 "h": 63
}, },
"scale": 1, "scale": 0.333,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 54, "w": 96,
"h": 69 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 24,
"y": 0, "y": 17,
"w": 54, "w": 48,
"h": 69 "h": 63
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 54, "w": 48,
"h": 69 "h": 63
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:e01297ffc2dd40460e87b64750997ca6:3261fa54b4c9574937d670de782ca3e8:b99821e87dffda3297dd25a224a9029f$" "smartupdate": "$TexturePacker:SmartUpdate:e2179e3c9dfa079f84af302283187a80:518e57f1e0614d1aedad1d9826def3d4:b99821e87dffda3297dd25a224a9029f$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 660 B

View File

@ -4,30 +4,30 @@
"image": "676-matron.png", "image": "676-matron.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 68, "w": 62,
"h": 68 "h": 62
}, },
"scale": 1, "scale": 0.333,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 53, "w": 96,
"h": 68 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 26,
"y": 0, "y": 18,
"w": 53, "w": 47,
"h": 68 "h": 62
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 53, "w": 47,
"h": 68 "h": 62
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:262f28877dc9ef9e7920282c4b36b8dd:18b55adc9c377d1b24d6b236e1f39177:020798583d07c479020bb0af34cf8bb6$" "smartupdate": "$TexturePacker:SmartUpdate:6c9b45763eb4fedb5ec7099762f23606:884e9813686e91cf2a2cd9f51652a875:020798583d07c479020bb0af34cf8bb6$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 734 B

View File

@ -4,30 +4,30 @@
"image": "676-pharaoh.png", "image": "676-pharaoh.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 70, "w": 64,
"h": 70 "h": 64
}, },
"scale": 1, "scale": 0.333,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 53, "w": 96,
"h": 70 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 25,
"y": 0, "y": 16,
"w": 53, "w": 47,
"h": 70 "h": 64
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 53, "w": 47,
"h": 70 "h": 64
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:a5d56fc494b2194036a8d6d1d876a296:6260eeb9aa48a1047c8ec12842ac28c6:904b7ab6f57249c96beea4b5f72deb53$" "smartupdate": "$TexturePacker:SmartUpdate:5143f43786377eae745a9355e5e1cc24:158aa35a349be4cf7c56820170aa4546:904b7ab6f57249c96beea4b5f72deb53$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 726 B

View File

@ -4,30 +4,30 @@
"image": "676-star.png", "image": "676-star.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 72, "w": 66,
"h": 72 "h": 66
}, },
"scale": 1, "scale": 0.333,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 54, "w": 96,
"h": 72 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 24,
"y": 0, "y": 14,
"w": 54, "w": 48,
"h": 72 "h": 66
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 54, "w": 48,
"h": 72 "h": 66
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:6be66775c485bf44d69f7cd44e346324:c9e3d3db02b6ea0720a20b9bbd159d79:dd7fedf66b493b0bbdef5d25e0041dd8$" "smartupdate": "$TexturePacker:SmartUpdate:d9af00245cb6498c9dec7508ed563454:12f19bad174b64678e8b8be8455f2b5a:dd7fedf66b493b0bbdef5d25e0041dd8$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 734 B

View File

@ -4,219 +4,30 @@
"image": "678.png", "image": "678.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 157, "w": 55,
"h": 157 "h": 55
}, },
"scale": 1, "scale": 0.333,
"frames": [ "frames": [
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 96,
"h": 96
},
"spriteSourceSize": {
"x": 25,
"y": 16,
"w": 54,
"h": 60
},
"frame": {
"x": 0,
"y": 0,
"w": 54,
"h": 60
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 96,
"h": 96
},
"spriteSourceSize": {
"x": 25,
"y": 16,
"w": 54,
"h": 60
},
"frame": {
"x": 0,
"y": 0,
"w": 54,
"h": 60
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 96,
"h": 96
},
"spriteSourceSize": {
"x": 25,
"y": 15,
"w": 53,
"h": 61
},
"frame": {
"x": 54,
"y": 0,
"w": 53,
"h": 61
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 96,
"h": 96
},
"spriteSourceSize": {
"x": 25,
"y": 15,
"w": 53,
"h": 61
},
"frame": {
"x": 54,
"y": 0,
"w": 53,
"h": 61
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 96,
"h": 96
},
"spriteSourceSize": {
"x": 24,
"y": 15,
"w": 52,
"h": 61
},
"frame": {
"x": 0,
"y": 60,
"w": 52,
"h": 61
}
},
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 96,
"h": 96
},
"spriteSourceSize": {
"x": 24,
"y": 15,
"w": 52,
"h": 61
},
"frame": {
"x": 0,
"y": 60,
"w": 52,
"h": 61
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 96,
"h": 96
},
"spriteSourceSize": {
"x": 26,
"y": 16,
"w": 54,
"h": 60
},
"frame": {
"x": 52,
"y": 61,
"w": 54,
"h": 60
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 96,
"h": 96
},
"spriteSourceSize": {
"x": 24,
"y": 17,
"w": 51,
"h": 59
},
"frame": {
"x": 106,
"y": 61,
"w": 51,
"h": 59
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 96,
"h": 96
},
"spriteSourceSize": {
"x": 24,
"y": 17,
"w": 51,
"h": 59
},
"frame": {
"x": 106,
"y": 61,
"w": 51,
"h": 59
}
},
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 96, "w": 96,
"h": 96 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 23, "x": 25,
"y": 19, "y": 20,
"w": 50, "w": 46,
"h": 57 "h": 55
}, },
"frame": { "frame": {
"x": 107, "x": 0,
"y": 0, "y": 0,
"w": 50, "w": 46,
"h": 57 "h": 55
} }
} }
] ]
@ -225,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:ab77ad452685ab677c7e5e70a386e880:27bb9b07316cb5c401e67e15e2b0f06a:887aa14e4a3a3e9141c6ae460f968db1$" "smartupdate": "$TexturePacker:SmartUpdate:7b46b2656390e5ddac94370837e7cdaa:7f76286d5acb65066eff0c2532fa7fea:887aa14e4a3a3e9141c6ae460f968db1$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 589 B

View File

@ -4,30 +4,30 @@
"image": "676-dandy.png", "image": "676-dandy.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 71, "w": 65,
"h": 71 "h": 65
}, },
"scale": 1, "scale": 0.5,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 56, "w": 96,
"h": 71 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 22,
"y": 0, "y": 15,
"w": 56, "w": 50,
"h": 71 "h": 65
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 56, "w": 50,
"h": 71 "h": 65
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:cd88917bff3fae3d6ff808096f539d70:17a1912fd81d23ce8a7209e27ad3e9ed:b5a287256e260744fe6660dc2ceefd11$" "smartupdate": "$TexturePacker:SmartUpdate:30639f5b87709c77f1b970be4078abf4:7b6183e776852f811a1e5c3fa15805fc:b5a287256e260744fe6660dc2ceefd11$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 759 B

View File

@ -4,30 +4,30 @@
"image": "676-debutante.png", "image": "676-debutante.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 67, "w": 61,
"h": 67 "h": 61
}, },
"scale": 1, "scale": 0.5,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 56, "w": 96,
"h": 67 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 20,
"y": 0, "y": 19,
"w": 56, "w": 50,
"h": 67 "h": 61
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 56, "w": 50,
"h": 67 "h": 61
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:68f3a2720b7b1e5e59f628f021cac698:07d06d321fff31976e1b993edb972e4f:bf2f862a1c8881133f9f3ffbf44602fa$" "smartupdate": "$TexturePacker:SmartUpdate:2ccaadba59ae7a3f23287601b725067d:18ae045d433354fd8b461b528bba113d:bf2f862a1c8881133f9f3ffbf44602fa$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 794 B

View File

@ -4,30 +4,30 @@
"image": "676-diamond.png", "image": "676-diamond.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 74, "w": 68,
"h": 74 "h": 68
}, },
"scale": 1, "scale": 0.5,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 53, "w": 96,
"h": 74 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 24,
"y": 0, "y": 12,
"w": 53, "w": 47,
"h": 74 "h": 68
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 53, "w": 47,
"h": 74 "h": 68
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:e054ccb4d021c87a6a02c6728403d87a:c7e104da9393ec52b9e6d37f92fc20d9:88c467fc09249b0d2f579d44eacd528d$" "smartupdate": "$TexturePacker:SmartUpdate:bd55e138e32873b99b7a1a2e237d5278:befb394d45c46c22e2711f4c6d5d9623:88c467fc09249b0d2f579d44eacd528d$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 806 B

View File

@ -4,30 +4,30 @@
"image": "676-heart.png", "image": "676-heart.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 72, "w": 66,
"h": 72 "h": 66
}, },
"scale": 1, "scale": 0.5,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 54, "w": 96,
"h": 72 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 24,
"y": 0, "y": 14,
"w": 54, "w": 48,
"h": 72 "h": 66
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 54, "w": 48,
"h": 72 "h": 66
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:adb921bf32ae497738fbecc12e2aab07:421a40542b16cdb2cc154c85e963b40d:e11d4dd16bff2ef69bc5ca683c44ca7c$" "smartupdate": "$TexturePacker:SmartUpdate:6a000209d8789ed27cdd0700711ccc27:75157608bd339b63c9a7ce68e259b3b7:e11d4dd16bff2ef69bc5ca683c44ca7c$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 814 B

View File

@ -4,30 +4,30 @@
"image": "676-kabuki.png", "image": "676-kabuki.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 70, "w": 64,
"h": 70 "h": 64
}, },
"scale": 1, "scale": 0.5,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 58, "w": 96,
"h": 70 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 22,
"y": 0, "y": 16,
"w": 58, "w": 52,
"h": 70 "h": 64
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 58, "w": 52,
"h": 70 "h": 64
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:ef8ecfc1b406aa668e3f8daf0dfbaae7:08eecd31f557298e1570ec3490acffe2:c3cad56aa65d2ee971ceebc435a14ee6$" "smartupdate": "$TexturePacker:SmartUpdate:cd44f74e9b1dc4a581bd72f235552344:1404c36e03543b4eb1d1a4d5916a6652:c3cad56aa65d2ee971ceebc435a14ee6$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 837 B

View File

@ -4,30 +4,30 @@
"image": "676-la-reine.png", "image": "676-la-reine.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 69, "w": 63,
"h": 69 "h": 63
}, },
"scale": 1, "scale": 0.5,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 55, "w": 96,
"h": 69 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 23,
"y": 0, "y": 17,
"w": 55, "w": 49,
"h": 69 "h": 63
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 55, "w": 49,
"h": 69 "h": 63
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:6ba780e3e4c772966f8fa209410a9370:c56ae957d7acb10c7373b842af3a8786:b99821e87dffda3297dd25a224a9029f$" "smartupdate": "$TexturePacker:SmartUpdate:1982df9d4acf87f005bb76829bd78a65:e3590ee437367a91742856b3887339a8:b99821e87dffda3297dd25a224a9029f$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 711 B

View File

@ -4,30 +4,30 @@
"image": "676-matron.png", "image": "676-matron.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 68, "w": 62,
"h": 68 "h": 62
}, },
"scale": 1, "scale": 0.5,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 52, "w": 96,
"h": 68 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 23,
"y": 0, "y": 18,
"w": 52, "w": 46,
"h": 68 "h": 62
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 52, "w": 46,
"h": 68 "h": 62
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:89ab717076c514df8295db07981b18e9:72a9977db421d061829c639e3b50a617:020798583d07c479020bb0af34cf8bb6$" "smartupdate": "$TexturePacker:SmartUpdate:e2bcb6e27807980dfb68c17e65a7e8bd:d2409a3631a4a2263717bf5aa7e273b2:020798583d07c479020bb0af34cf8bb6$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 782 B

View File

@ -4,30 +4,30 @@
"image": "676-pharaoh.png", "image": "676-pharaoh.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 69, "w": 63,
"h": 69 "h": 63
}, },
"scale": 1, "scale": 0.5,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 52, "w": 96,
"h": 69 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 25,
"y": 0, "y": 17,
"w": 52, "w": 46,
"h": 69 "h": 63
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 52, "w": 46,
"h": 69 "h": 63
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:85c709f8538d07088a17e53a7c85afa0:623b4bc6698ef1a984b6bad42e68115b:904b7ab6f57249c96beea4b5f72deb53$" "smartupdate": "$TexturePacker:SmartUpdate:bdf2959fe7e2556fe6d031d7de04fc6c:fbff7f59a6ed25ee3eef955cbb3b9a56:904b7ab6f57249c96beea4b5f72deb53$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 768 B

View File

@ -4,30 +4,30 @@
"image": "676-star.png", "image": "676-star.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 72, "w": 66,
"h": 72 "h": 66
}, },
"scale": 1, "scale": 0.5,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 56, "w": 96,
"h": 72 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 24,
"y": 0, "y": 14,
"w": 56, "w": 50,
"h": 72 "h": 66
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 56, "w": 50,
"h": 72 "h": 66
} }
} }
] ]
@ -36,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:56c2df4ee634b690a816b79120bc3600:d7eefc05e299310d05d389e05997e449:dd7fedf66b493b0bbdef5d25e0041dd8$" "smartupdate": "$TexturePacker:SmartUpdate:a3f92eef83bcae7716ee78c669738785:156a85da733d2e878a00be0efc1c4d38:dd7fedf66b493b0bbdef5d25e0041dd8$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 838 B

View File

@ -4,240 +4,30 @@
"image": "678.png", "image": "678.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 130, "w": 56,
"h": 130 "h": 56
}, },
"scale": 1, "scale": 0.5,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 80, "w": 96,
"h": 80 "h": 96
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 18, "x": 25,
"y": 11, "y": 20,
"w": 44, "w": 45,
"h": 57 "h": 56
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 44, "w": 45,
"h": 57
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 18,
"y": 11,
"w": 44,
"h": 57
},
"frame": {
"x": 0,
"y": 57,
"w": 44,
"h": 57
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 18,
"y": 11,
"w": 44,
"h": 57
},
"frame": {
"x": 0,
"y": 57,
"w": 44,
"h": 57
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 21,
"y": 15,
"w": 44,
"h": 53
},
"frame": {
"x": 44,
"y": 0,
"w": 44,
"h": 53
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 21,
"y": 15,
"w": 44,
"h": 53
},
"frame": {
"x": 44,
"y": 0,
"w": 44,
"h": 53
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 24,
"y": 12,
"w": 42,
"h": 56 "h": 56
},
"frame": {
"x": 88,
"y": 0,
"w": 42,
"h": 56
}
},
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 24,
"y": 12,
"w": 42,
"h": 56
},
"frame": {
"x": 88,
"y": 0,
"w": 42,
"h": 56
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 20,
"y": 11,
"w": 43,
"h": 57
},
"frame": {
"x": 44,
"y": 53,
"w": 43,
"h": 57
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 20,
"y": 11,
"w": 43,
"h": 57
},
"frame": {
"x": 44,
"y": 53,
"w": 43,
"h": 57
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 22,
"y": 13,
"w": 43,
"h": 55
},
"frame": {
"x": 87,
"y": 56,
"w": 43,
"h": 55
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 22,
"y": 13,
"w": 43,
"h": 55
},
"frame": {
"x": 87,
"y": 56,
"w": 43,
"h": 55
} }
} }
] ]
@ -246,6 +36,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:9579cbb834c4127f905679ba92633a05:64ed3d991add5e47034b1ca9aad80a4c:887aa14e4a3a3e9141c6ae460f968db1$" "smartupdate": "$TexturePacker:SmartUpdate:ee6cbb7807c28f4b3f12e8dcf4da4888:77056356d7cbf2a4fb20508f50dbd3ce:887aa14e4a3a3e9141c6ae460f968db1$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 746 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 B

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 B

After

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 888 B

After

Width:  |  Height:  |  Size: 851 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 654 B

After

Width:  |  Height:  |  Size: 619 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 898 B

After

Width:  |  Height:  |  Size: 860 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

View File

@ -60,25 +60,10 @@ import { SceneBase } from './scene-base';
import CandyBar from './ui/candy-bar'; import CandyBar from './ui/candy-bar';
import { Variant, variantData } from './data/variant'; import { Variant, variantData } from './data/variant';
import { Localizable } from './plugins/i18n'; import { Localizable } from './plugins/i18n';
import { STARTING_WAVE_OVERRIDE, OPP_SPECIES_OVERRIDE, SEED_OVERRIDE, STARTING_BIOME_OVERRIDE } from './overrides';
export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1";
export const SEED_OVERRIDE = '';
export const STARTER_SPECIES_OVERRIDE = 0;
export const STARTER_FORM_OVERRIDE = 0;
export const STARTING_LEVEL_OVERRIDE = 0;
export const STARTING_WAVE_OVERRIDE = 0;
export const STARTING_BIOME_OVERRIDE = Biome.TOWN;
export const STARTING_MONEY_OVERRIDE = 0;
export const ABILITY_OVERRIDE = Abilities.NONE;
export const MOVE_OVERRIDE = Moves.NONE;
export const OPP_SPECIES_OVERRIDE = 0;
export const OPP_ABILITY_OVERRIDE = Abilities.NONE;
export const OPP_MOVE_OVERRIDE = Moves.NONE;
export const OPP_SHINY_OVERRIDE = false;
export const OPP_VARIANT_OVERRIDE = 0;
const DEBUG_RNG = false; const DEBUG_RNG = false;
export const startingWave = STARTING_WAVE_OVERRIDE || 1; export const startingWave = STARTING_WAVE_OVERRIDE || 1;
@ -100,6 +85,7 @@ export enum Button {
ACTION, ACTION,
CANCEL, CANCEL,
MENU, MENU,
STATS,
CYCLE_SHINY, CYCLE_SHINY,
CYCLE_FORM, CYCLE_FORM,
CYCLE_GENDER, CYCLE_GENDER,
@ -219,7 +205,8 @@ export default class BattleScene extends SceneBase {
[Button.SUBMIT]: 17, // touchpad [Button.SUBMIT]: 17, // touchpad
[Button.ACTION]: 0, // X [Button.ACTION]: 0, // X
[Button.CANCEL]: 1, // O [Button.CANCEL]: 1, // O
[Button.MENU]: 9, // options [Button.MENU]: 8, // share
[Button.STATS]: 9, // options
[Button.CYCLE_SHINY]: 5, // RB [Button.CYCLE_SHINY]: 5, // RB
[Button.CYCLE_FORM]: 4, // LB [Button.CYCLE_FORM]: 4, // LB
[Button.CYCLE_GENDER]: 6, // LT [Button.CYCLE_GENDER]: 6, // LT
@ -630,6 +617,7 @@ export default class BattleScene extends SceneBase {
[Button.ACTION]: [keyCodes.SPACE, keyCodes.ENTER, keyCodes.Z], [Button.ACTION]: [keyCodes.SPACE, keyCodes.ENTER, keyCodes.Z],
[Button.CANCEL]: [keyCodes.BACKSPACE, keyCodes.X], [Button.CANCEL]: [keyCodes.BACKSPACE, keyCodes.X],
[Button.MENU]: [keyCodes.ESC, keyCodes.M], [Button.MENU]: [keyCodes.ESC, keyCodes.M],
[Button.STATS]: [keyCodes.C],
[Button.CYCLE_SHINY]: [keyCodes.R], [Button.CYCLE_SHINY]: [keyCodes.R],
[Button.CYCLE_FORM]: [keyCodes.F], [Button.CYCLE_FORM]: [keyCodes.F],
[Button.CYCLE_GENDER]: [keyCodes.G], [Button.CYCLE_GENDER]: [keyCodes.G],
@ -1447,8 +1435,16 @@ export default class BattleScene extends SceneBase {
if (this.ui?.getMode() === Mode.SETTINGS) if (this.ui?.getMode() === Mode.SETTINGS)
(this.ui.getHandler() as SettingsUiHandler).show([]); (this.ui.getHandler() as SettingsUiHandler).show([]);
} }
} else {
let pressed = false;
if (this.buttonJustReleased(Button.STATS) || (pressed = this.buttonJustPressed(Button.STATS))) {
for (let p of this.getField().filter(p => p?.isActive(true)))
p.toggleStats(pressed);
if (pressed)
this.setLastProcessedMovementTime(Button.STATS);
} else } else
return; return;
}
if (inputSuccess && this.enableVibration && typeof navigator.vibrate !== 'undefined') if (inputSuccess && this.enableVibration && typeof navigator.vibrate !== 'undefined')
navigator.vibrate(vibrationLength || 10); navigator.vibrate(vibrationLength || 10);
} }
@ -1458,7 +1454,7 @@ export default class BattleScene extends SceneBase {
* or not. It will only return true once, until the key is released and pressed down * or not. It will only return true once, until the key is released and pressed down
* again. * again.
*/ */
gamepadButtonJustDown(button: Phaser.Input.Gamepad.Button) : boolean { gamepadButtonJustDown(button: Phaser.Input.Gamepad.Button): boolean {
if (!button || !this.gamepadSupport) if (!button || !this.gamepadSupport)
return false; return false;
@ -1478,6 +1474,23 @@ export default class BattleScene extends SceneBase {
return this.buttonKeys[button].some(k => Phaser.Input.Keyboard.JustDown(k)) || this.gamepadButtonJustDown(gamepad?.buttons[this.gamepadKeyConfig[button]]); return this.buttonKeys[button].some(k => Phaser.Input.Keyboard.JustDown(k)) || this.gamepadButtonJustDown(gamepad?.buttons[this.gamepadKeyConfig[button]]);
} }
/**
* gamepadButtonJustUp returns true if @param button has just been released
* or not. It will only return true once, until the key is released and pressed down
* again.
*/
gamepadButtonJustUp(button: Phaser.Input.Gamepad.Button): boolean {
if (!button || !this.gamepadSupport)
return false;
return !this.gamepadButtonStates[button.index];
}
buttonJustReleased(button: Button): boolean {
const gamepad = this.input.gamepad?.gamepads[0];
return this.buttonKeys[button].some(k => Phaser.Input.Keyboard.JustUp(k)) || this.gamepadButtonJustUp(gamepad?.buttons[this.gamepadKeyConfig[button]]);
}
/** /**
* repeatInputDurationJustPassed returns true if @param button has been held down long * repeatInputDurationJustPassed returns true if @param button has been held down long
* enough to fire a repeated input. A button must claim the movementButtonLock before * enough to fire a repeated input. A button must claim the movementButtonLock before

View File

@ -976,16 +976,19 @@ export class FieldMoveTypePowerBoostAbAttr extends FieldMovePowerBoostAbAttr {
export class BattleStatMultiplierAbAttr extends AbAttr { export class BattleStatMultiplierAbAttr extends AbAttr {
private battleStat: BattleStat; private battleStat: BattleStat;
private multiplier: number; private multiplier: number;
private condition: PokemonAttackCondition;
constructor(battleStat: BattleStat, multiplier: number) { constructor(battleStat: BattleStat, multiplier: number, condition?: PokemonAttackCondition) {
super(false); super(false);
this.battleStat = battleStat; this.battleStat = battleStat;
this.multiplier = multiplier; this.multiplier = multiplier;
this.condition = condition;
} }
applyBattleStat(pokemon: Pokemon, passive: boolean, battleStat: BattleStat, statValue: Utils.NumberHolder, args: any[]): boolean | Promise<boolean> { applyBattleStat(pokemon: Pokemon, passive: boolean, battleStat: BattleStat, statValue: Utils.NumberHolder, args: any[]): boolean | Promise<boolean> {
if (battleStat === this.battleStat) { const move = (args[0] as Move);
if (battleStat === this.battleStat && (!this.condition || this.condition(pokemon, null, move))) {
statValue.value *= this.multiplier; statValue.value *= this.multiplier;
return true; return true;
} }
@ -1402,6 +1405,7 @@ export class TraceAbAttr extends PostSummonAbAttr {
const targets = pokemon.getOpponents(); const targets = pokemon.getOpponents();
if (!targets.length) if (!targets.length)
return false; return false;
let target: Pokemon; let target: Pokemon;
if (targets.length > 1) if (targets.length > 1)
pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex); pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex);
@ -1427,6 +1431,9 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr {
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
const targets = pokemon.getOpponents(); const targets = pokemon.getOpponents();
if (!targets.length)
return false;
let target: Pokemon; let target: Pokemon;
if (targets.length > 1) if (targets.length > 1)
pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex); pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex);
@ -2642,8 +2649,8 @@ export function initAbilities() {
new Ability(Abilities.TRUANT, 3) new Ability(Abilities.TRUANT, 3)
.attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.TRUANT, 1, false), .attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.TRUANT, 1, false),
new Ability(Abilities.HUSTLE, 3) new Ability(Abilities.HUSTLE, 3)
.attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5) .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5, (user, target, move) => move.category == MoveCategory.PHYSICAL)
.attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 0.8), .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 0.8, (user, target, move) => move.category == MoveCategory.PHYSICAL),
new Ability(Abilities.CUTE_CHARM, 3) new Ability(Abilities.CUTE_CHARM, 3)
.attr(PostDefendContactApplyTagChanceAbAttr, 30, BattlerTagType.INFATUATED), .attr(PostDefendContactApplyTagChanceAbAttr, 30, BattlerTagType.INFATUATED),
new Ability(Abilities.PLUS, 3) new Ability(Abilities.PLUS, 3)

View File

@ -1,10 +1,10 @@
import { Arena } from "../field/arena"; import { Arena } from "../field/arena";
import { Type } from "./type"; import { Type } from "./type";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { MoveCategory, StatChangeAttr, allMoves } from "./move"; import { MoveCategory, allMoves } from "./move";
import { getPokemonMessage } from "../messages"; import { getPokemonMessage } from "../messages";
import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; import Pokemon, { HitResult, PokemonMove } from "../field/pokemon";
import { MoveEffectPhase, StatChangePhase } from "../phases"; import { MoveEffectPhase, PokemonHealPhase, StatChangePhase} from "../phases";
import { StatusEffect } from "./status-effect"; import { StatusEffect } from "./status-effect";
import { BattlerIndex } from "../battle"; import { BattlerIndex } from "../battle";
import { Moves } from "./enums/moves"; import { Moves } from "./enums/moves";
@ -146,6 +146,31 @@ class AuroraVeilTag extends WeakenMoveScreenTag {
} }
} }
class WishTag extends ArenaTag {
private battlerIndex: BattlerIndex;
private triggerMessage: string;
private healHp: number;
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
super(ArenaTagType.WISH, turnCount, Moves.WISH, sourceId, side);
}
onAdd(arena: Arena): void {
const user = arena.scene.getPokemonById(this.sourceId);
this.battlerIndex = user.getBattlerIndex();
this.triggerMessage = getPokemonMessage(user, '\'s wish\ncame true!');
this.healHp = Math.max(Math.floor(user.getMaxHp() / 2), 1);
}
onRemove(arena: Arena): void {
const target = arena.scene.getField()[this.battlerIndex];
if (target?.isActive(true)) {
arena.scene.queueMessage(this.triggerMessage);
arena.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), this.healHp, null, true, false));
}
}
}
export class WeakenMoveTypeTag extends ArenaTag { export class WeakenMoveTypeTag extends ArenaTag {
private weakenedType: Type; private weakenedType: Type;
@ -472,6 +497,8 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov
case ArenaTagType.FUTURE_SIGHT: case ArenaTagType.FUTURE_SIGHT:
case ArenaTagType.DOOM_DESIRE: case ArenaTagType.DOOM_DESIRE:
return new DelayedAttackTag(tagType, sourceMove, sourceId, targetIndex); return new DelayedAttackTag(tagType, sourceMove, sourceId, targetIndex);
case ArenaTagType.WISH:
return new WishTag(turnCount, sourceId, side);
case ArenaTagType.STEALTH_ROCK: case ArenaTagType.STEALTH_ROCK:
return new StealthRockTag(sourceId, side); return new StealthRockTag(sourceId, side);
case ArenaTagType.STICKY_WEB: case ArenaTagType.STICKY_WEB:

View File

@ -8,6 +8,7 @@ export enum ArenaTagType {
MIST = "MIST", MIST = "MIST",
FUTURE_SIGHT = "FUTURE_SIGHT", FUTURE_SIGHT = "FUTURE_SIGHT",
DOOM_DESIRE = "DOOM_DESIRE", DOOM_DESIRE = "DOOM_DESIRE",
WISH = "WISH",
STEALTH_ROCK = "STEALTH_ROCK", STEALTH_ROCK = "STEALTH_ROCK",
STICKY_WEB = "STICKY_WEB", STICKY_WEB = "STICKY_WEB",
TRICK_ROOM = "TRICK_ROOM", TRICK_ROOM = "TRICK_ROOM",

View File

@ -1009,6 +1009,25 @@ export class StatusEffectAttr extends MoveEffectAttr {
} }
} }
export class MultiStatusEffectAttr extends StatusEffectAttr {
public effects: StatusEffect[];
constructor(effects: StatusEffect[], selfTarget?: boolean, cureTurn?: integer, overrideStatus?: boolean) {
super(effects[0], selfTarget, cureTurn, overrideStatus);
this.effects = effects;
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
this.effect = Utils.randSeedItem(this.effects);
const result = super.apply(user, target, move, args);
return result;
}
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true) ? Math.floor(move.chance * -0.1) : 0;
}
}
export class PsychoShiftEffectAttr extends MoveEffectAttr { export class PsychoShiftEffectAttr extends MoveEffectAttr {
constructor() { constructor() {
super(false, MoveEffectTrigger.HIT); super(false, MoveEffectTrigger.HIT);
@ -1552,6 +1571,8 @@ export class CopyStatsAttr extends MoveEffectAttr {
else else
user.removeTag(BattlerTagType.CRIT_BOOST); user.removeTag(BattlerTagType.CRIT_BOOST);
user.updateInfo();
target.scene.queueMessage(getPokemonMessage(user, 'copied\n') + getPokemonMessage(target, `'s stat changes!`)); target.scene.queueMessage(getPokemonMessage(user, 'copied\n') + getPokemonMessage(target, `'s stat changes!`));
return true; return true;
@ -1566,6 +1587,8 @@ export class InvertStatsAttr extends MoveEffectAttr {
for (let s = 0; s < target.summonData.battleStats.length; s++) for (let s = 0; s < target.summonData.battleStats.length; s++)
target.summonData.battleStats[s] *= -1; target.summonData.battleStats[s] *= -1;
user.updateInfo();
target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere all reversed!`)); target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere all reversed!`));
return true; return true;
@ -1580,6 +1603,8 @@ export class ResetStatsAttr extends MoveEffectAttr {
for (let s = 0; s < target.summonData.battleStats.length; s++) for (let s = 0; s < target.summonData.battleStats.length; s++)
target.summonData.battleStats[s] = 0; target.summonData.battleStats[s] = 0;
user.updateInfo();
target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere eliminated!`)); target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere eliminated!`));
return true; return true;
@ -3099,11 +3124,23 @@ export class RandomMovesetMoveAttr extends OverrideMoveEffectAttr {
const moveTargets = getMoveTargets(user, move.moveId); const moveTargets = getMoveTargets(user, move.moveId);
if (!moveTargets.targets.length) if (!moveTargets.targets.length)
return false; return false;
const targets = moveTargets.multiple || moveTargets.targets.length === 1 let selectTargets: BattlerIndex[];
? moveTargets.targets switch (true) {
: moveTargets.targets.indexOf(target.getBattlerIndex()) > -1 case (moveTargets.multiple || moveTargets.targets.length === 1): {
? [ target.getBattlerIndex() ] selectTargets = moveTargets.targets;
: [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; break;
}
case (moveTargets.targets.indexOf(target.getBattlerIndex()) > -1): {
selectTargets = [ target.getBattlerIndex() ];
break;
}
default: {
moveTargets.targets.splice(moveTargets.targets.indexOf(user.getAlly().getBattlerIndex()));
selectTargets = [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ];
break;
}
}
const targets = selectTargets;
user.getMoveQueue().push({ move: move.moveId, targets: targets, ignorePP: true }); user.getMoveQueue().push({ move: move.moveId, targets: targets, ignorePP: true });
user.scene.unshiftPhase(new MovePhase(user.scene, user, targets, moveset[moveIndex], true)); user.scene.unshiftPhase(new MovePhase(user.scene, user, targets, moveset[moveIndex], true));
return true; return true;
@ -4170,9 +4207,7 @@ export function initMoves() {
new SelfStatusMove(Moves.CONVERSION, Type.NORMAL, -1, 30, -1, 0, 1) new SelfStatusMove(Moves.CONVERSION, Type.NORMAL, -1, 30, -1, 0, 1)
.attr(FirstMoveTypeAttr), .attr(FirstMoveTypeAttr),
new AttackMove(Moves.TRI_ATTACK, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, 20, 0, 1) new AttackMove(Moves.TRI_ATTACK, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, 20, 0, 1)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS) .attr(MultiStatusEffectAttr, [StatusEffect.BURN, StatusEffect.FREEZE, StatusEffect.PARALYSIS]),
.attr(StatusEffectAttr, StatusEffect.BURN)
.attr(StatusEffectAttr, StatusEffect.FREEZE),
new AttackMove(Moves.SUPER_FANG, Type.NORMAL, MoveCategory.PHYSICAL, -1, 90, 10, -1, 0, 1) new AttackMove(Moves.SUPER_FANG, Type.NORMAL, MoveCategory.PHYSICAL, -1, 90, 10, -1, 0, 1)
.attr(TargetHalfHpDamageAttr), .attr(TargetHalfHpDamageAttr),
new AttackMove(Moves.SLASH, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 1) new AttackMove(Moves.SLASH, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 1)
@ -4499,7 +4534,7 @@ export function initMoves() {
.attr(AbilityCopyAttr), .attr(AbilityCopyAttr),
new SelfStatusMove(Moves.WISH, Type.NORMAL, -1, 10, -1, 0, 3) new SelfStatusMove(Moves.WISH, Type.NORMAL, -1, 10, -1, 0, 3)
.triageMove() .triageMove()
.unimplemented(), .attr(AddArenaTagAttr, ArenaTagType.WISH, 2, true),
new SelfStatusMove(Moves.ASSIST, Type.NORMAL, -1, 20, -1, 0, 3) new SelfStatusMove(Moves.ASSIST, Type.NORMAL, -1, 20, -1, 0, 3)
.attr(RandomMovesetMoveAttr, true) .attr(RandomMovesetMoveAttr, true)
.ignoresVirtual(), .ignoresVirtual(),
@ -5986,9 +6021,7 @@ export function initMoves() {
.soundBased() .soundBased()
.attr(ReducePpMoveAttr, 3, false), .attr(ReducePpMoveAttr, 3, false),
new AttackMove(Moves.DIRE_CLAW, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8) new AttackMove(Moves.DIRE_CLAW, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8)
.attr(StatusEffectAttr, StatusEffect.POISON) .attr(MultiStatusEffectAttr, [StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP]),
.attr(StatusEffectAttr, StatusEffect.PARALYSIS)
.attr(StatusEffectAttr, StatusEffect.SLEEP),
new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8)
.attr(StatChangeAttr, BattleStat.DEF, 1, true), .attr(StatChangeAttr, BattleStat.DEF, 1, true),
new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, 100, 0, 8) new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, 100, 0, 8)

View File

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

View File

@ -18,8 +18,7 @@ import { TimeOfDay } from "../data/enums/time-of-day";
import { Terrain, TerrainType } from "../data/terrain"; import { Terrain, TerrainType } from "../data/terrain";
import { PostTerrainChangeAbAttr, PostWeatherChangeAbAttr, applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs } from "../data/ability"; import { PostTerrainChangeAbAttr, PostWeatherChangeAbAttr, applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs } from "../data/ability";
import Pokemon from "./pokemon"; import Pokemon from "./pokemon";
import { WEATHER_OVERRIDE } from '../overrides';
const WEATHER_OVERRIDE = WeatherType.NONE;
export class Arena { export class Arena {
public scene: BattleScene; public scene: BattleScene;

View File

@ -1,5 +1,5 @@
import Phaser from 'phaser'; import Phaser from 'phaser';
import BattleScene, { ABILITY_OVERRIDE, AnySound, MOVE_OVERRIDE, OPP_ABILITY_OVERRIDE, OPP_MOVE_OVERRIDE, OPP_SHINY_OVERRIDE, OPP_VARIANT_OVERRIDE } from '../battle-scene'; import BattleScene, { AnySound } from '../battle-scene';
import { Variant, VariantSet, variantColorCache } from '#app/data/variant'; import { Variant, VariantSet, variantColorCache } from '#app/data/variant';
import { variantData } from '#app/data/variant'; import { variantData } from '#app/data/variant';
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from '../ui/battle-info'; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from '../ui/battle-info';
@ -43,6 +43,7 @@ import { Nature, getNatureStatMultiplier } from '../data/nature';
import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from '../data/pokemon-forms'; import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from '../data/pokemon-forms';
import { TerrainType } from '../data/terrain'; import { TerrainType } from '../data/terrain';
import { TrainerSlot } from '../data/trainer-config'; import { TrainerSlot } from '../data/trainer-config';
import { ABILITY_OVERRIDE, MOVE_OVERRIDE, OPP_ABILITY_OVERRIDE, OPP_MOVE_OVERRIDE, OPP_SHINY_OVERRIDE, OPP_VARIANT_OVERRIDE } from '../overrides';
export enum FieldPosition { export enum FieldPosition {
CENTER, CENTER,
@ -657,7 +658,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
getHpRatio(precise: boolean = false): number { getHpRatio(precise: boolean = false): number {
return precise return precise
? this.hp / this.getMaxHp() ? this.hp / this.getMaxHp()
: ((this.hp / this.getMaxHp()) * 100) / 100; : Math.round((this.hp / this.getMaxHp()) * 100) / 100;
} }
generateGender(): void { generateGender(): void {
@ -1178,6 +1179,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return this.battleInfo.updateInfo(this, instant); return this.battleInfo.updateInfo(this, instant);
} }
toggleStats(visible: boolean): void {
this.battleInfo.toggleStats(visible);
}
addExp(exp: integer) { addExp(exp: integer) {
const maxExpLevel = this.scene.getMaxExpLevel(); const maxExpLevel = this.scene.getMaxExpLevel();
const initialExp = this.exp; const initialExp = this.exp;
@ -1619,6 +1624,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.summonData.tags.push(tag); this.summonData.tags.push(tag);
if (this instanceof PlayerPokemon && source.summonData.battleStats.find(bs => bs === 6)) if (this instanceof PlayerPokemon && source.summonData.battleStats.find(bs => bs === 6))
this.scene.validateAchv(achvs.TRANSFER_MAX_BATTLE_STAT); this.scene.validateAchv(achvs.TRANSFER_MAX_BATTLE_STAT);
this.updateInfo();
} }
getMoveHistory(): TurnMove[] { getMoveHistory(): TurnMove[] {
@ -1919,6 +1925,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
this.summonDataPrimer = null; this.summonDataPrimer = null;
} }
this.updateInfo();
} }
resetBattleData(): void { resetBattleData(): void {

View File

@ -1,10 +1,11 @@
import { fixedBattles } from "./battle"; import { fixedBattles } from "./battle";
import BattleScene, { STARTING_BIOME_OVERRIDE, STARTING_LEVEL_OVERRIDE, STARTING_MONEY_OVERRIDE } from "./battle-scene"; import BattleScene from "./battle-scene";
import { Biome } from "./data/enums/biome"; import { Biome } from "./data/enums/biome";
import { Species } from "./data/enums/species"; import { Species } from "./data/enums/species";
import PokemonSpecies, { allSpecies } from "./data/pokemon-species"; import PokemonSpecies, { allSpecies } from "./data/pokemon-species";
import { Arena } from "./field/arena"; import { Arena } from "./field/arena";
import * as Utils from "./utils"; import * as Utils from "./utils";
import { STARTING_BIOME_OVERRIDE, STARTING_LEVEL_OVERRIDE, STARTING_MONEY_OVERRIDE } from './overrides';
export enum GameModes { export enum GameModes {
CLASSIC, CLASSIC,

View File

@ -39,15 +39,21 @@ export class LoadingScene extends SceneBase {
} }
this.loadAtlas('namebox', 'ui'); this.loadAtlas('namebox', 'ui');
this.loadImage('pbinfo_player', 'ui'); this.loadImage('pbinfo_player', 'ui');
this.loadImage('pbinfo_player_stats', 'ui');
this.loadImage('pbinfo_player_mini', 'ui'); this.loadImage('pbinfo_player_mini', 'ui');
this.loadImage('pbinfo_player_mini_stats', 'ui');
this.loadAtlas('pbinfo_player_type', 'ui'); this.loadAtlas('pbinfo_player_type', 'ui');
this.loadAtlas('pbinfo_player_type1', 'ui'); this.loadAtlas('pbinfo_player_type1', 'ui');
this.loadAtlas('pbinfo_player_type2', 'ui'); this.loadAtlas('pbinfo_player_type2', 'ui');
this.loadImage('pbinfo_enemy_mini', 'ui'); this.loadImage('pbinfo_enemy_mini', 'ui');
this.loadImage('pbinfo_enemy_mini_stats', 'ui');
this.loadImage('pbinfo_enemy_boss', 'ui'); this.loadImage('pbinfo_enemy_boss', 'ui');
this.loadImage('pbinfo_enemy_boss_stats', 'ui');
this.loadAtlas('pbinfo_enemy_type', 'ui'); this.loadAtlas('pbinfo_enemy_type', 'ui');
this.loadAtlas('pbinfo_enemy_type1', 'ui'); this.loadAtlas('pbinfo_enemy_type1', 'ui');
this.loadAtlas('pbinfo_enemy_type2', 'ui'); this.loadAtlas('pbinfo_enemy_type2', 'ui');
this.loadAtlas('pbinfo_stat', 'ui');
this.loadAtlas('pbinfo_stat_numbers', 'ui');
this.loadImage('overlay_lv', 'ui'); this.loadImage('overlay_lv', 'ui');
this.loadAtlas('numbers', 'ui'); this.loadAtlas('numbers', 'ui');
this.loadAtlas('numbers_red', 'ui'); this.loadAtlas('numbers_red', 'ui');

View File

@ -59,4 +59,9 @@ export const menu: SimpleTranslationEntries = {
"escapeVerbSwitch": "auswechseln", "escapeVerbSwitch": "auswechseln",
"escapeVerbFlee": "flucht", "escapeVerbFlee": "flucht",
"notDisabled": "{{moveName}} ist\nnicht mehr deaktiviert!", "notDisabled": "{{moveName}} ist\nnicht mehr deaktiviert!",
"rankings": "Rankings",
"dailyRankings": "Daily Rankings",
"noRankings": "No Rankings",
"loading": "Loading…",
"playersOnline": "Players Online"
} as const; } as const;

View File

@ -387,102 +387,102 @@ export const pokemon: SimpleTranslationEntries = {
"rayquaza": "Rayquaza", "rayquaza": "Rayquaza",
"jirachi": "Jirachi", "jirachi": "Jirachi",
"deoxys": "Deoxys", "deoxys": "Deoxys",
"turtwig": "Turtwig", "turtwig": "Chelast",
"grotle": "Grotle", "grotle": "Chelcarain",
"torterra": "Torterra", "torterra": "Chelterrar",
"chimchar": "Chimchar", "chimchar": "Panflam",
"monferno": "Monferno", "monferno": "Panpyro",
"infernape": "Infernape", "infernape": "Panferno",
"piplup": "Piplup", "piplup": "Plinfa",
"prinplup": "Prinplup", "prinplup": "Pilprin",
"empoleon": "Empoleon", "empoleon": "Impoleon",
"starly": "Starly", "starly": "Staralili",
"staravia": "Staravia", "staravia": "Staravia",
"staraptor": "Staraptor", "staraptor": "Staraptor",
"bidoof": "Bidoof", "bidoof": "Bidiza",
"bibarel": "Bibarel", "bibarel": "Bidifas",
"kricketot": "Kricketot", "kricketot": "Zirpurze",
"kricketune": "Kricketune", "kricketune": "Zirpeise",
"shinx": "Shinx", "shinx": "Sheinux",
"luxio": "Luxio", "luxio": "Luxio",
"luxray": "Luxray", "luxray": "Luxray",
"budew": "Budew", "budew": "Knospi",
"roserade": "Roserade", "roserade": "Roserade",
"cranidos": "Cranidos", "cranidos": "Koknodon",
"rampardos": "Rampardos", "rampardos": "Rameidon",
"shieldon": "Shieldon", "shieldon": "Schilterus",
"bastiodon": "Bastiodon", "bastiodon": "Bollterus",
"burmy": "Burmy", "burmy": "Burmy",
"wormadam": "Wormadam", "wormadam": "Burmadame",
"mothim": "Mothim", "mothim": "Moterpel",
"combee": "Combee", "combee": "Wadribie",
"vespiquen": "Vespiquen", "vespiquen": "Hornwiesel",
"pachirisu": "Pachirisu", "pachirisu": "Pachirisu",
"buizel": "Buizel", "buizel": "Bamelin",
"floatzel": "Floatzel", "floatzel": "Bojelin",
"cherubi": "Cherubi", "cherubi": "Kikugi",
"cherrim": "Cherrim", "cherrim": "Kinoso",
"shellos": "Shellos", "shellos": "Schalellos",
"gastrodon": "Gastrodon", "gastrodon": "Gastrodon",
"ambipom": "Ambipom", "ambipom": "Ambidifel",
"drifloon": "Drifloon", "drifloon": "Driftlon",
"drifblim": "Drifblim", "drifblim": "Drifzepeli",
"buneary": "Buneary", "buneary": "Haspiror",
"lopunny": "Lopunny", "lopunny": "Schlapor",
"mismagius": "Mismagius", "mismagius": "Traunmagil",
"honchkrow": "Honchkrow", "honchkrow": "Kramshef",
"glameow": "Glameow", "glameow": "Charmian",
"purugly": "Purugly", "purugly": "Shnurgarst",
"chingling": "Chingling", "chingling": "Klingplim",
"stunky": "Stunky", "stunky": "Skunkapuh",
"skuntank": "Skuntank", "skuntank": "Skuntank",
"bronzor": "Bronzor", "bronzor": "Bronzel",
"bronzong": "Bronzong", "bronzong": "Bronzong",
"bonsly": "Bonsly", "bonsly": "Mobai",
"mime_jr": "Mime Jr.", "mime_jr": "Pantimimi",
"happiny": "Happiny", "happiny": "Wonneira",
"chatot": "Chatot", "chatot": "Plaudagei",
"spiritomb": "Spiritomb", "spiritomb": "Kryppuk",
"gible": "Gible", "gible": "Kaumalat",
"gabite": "Gabite", "gabite": "Knarksel",
"garchomp": "Garchomp", "garchomp": "Knackrack",
"munchlax": "Munchlax", "munchlax": "Mampfaxo",
"riolu": "Riolu", "riolu": "Riolu",
"lucario": "Lucario", "lucario": "Lucario",
"hippopotas": "Hippopotas", "hippopotas": "Hippopotas",
"hippowdon": "Hippowdon", "hippowdon": "Hippoterus",
"skorupi": "Skorupi", "skorupi": "Pionskora",
"drapion": "Drapion", "drapion": "Piondragi",
"croagunk": "Croagunk", "croagunk": "Glibunkel",
"toxicroak": "Toxicroak", "toxicroak": "Toxiquak",
"carnivine": "Carnivine", "carnivine": "Venuflibis",
"finneon": "Finneon", "finneon": "Finneon",
"lumineon": "Lumineon", "lumineon": "Lumineon",
"mantyke": "Mantyke", "mantyke": "Mantirps",
"snover": "Snover", "snover": "Shnebedeck",
"abomasnow": "Abomasnow", "abomasnow": "Rexblisar",
"weavile": "Weavile", "weavile": "Snibunna",
"magnezone": "Magnezone", "magnezone": "Magnezone",
"lickilicky": "Lickilicky", "lickilicky": "Schlurplek",
"rhyperior": "Rhyperior", "rhyperior": "Rihornior",
"tangrowth": "Tangrowth", "tangrowth": "Tangoloss",
"electivire": "Electivire", "electivire": "Elevoltek",
"magmortar": "Magmortar", "magmortar": "Magbrant",
"togekiss": "Togekiss", "togekiss": "Togekiss",
"yanmega": "Yanmega", "yanmega": "Yanmega",
"leafeon": "Leafeon", "leafeon": "Folipurba",
"glaceon": "Glaceon", "glaceon": "Glaziola",
"gliscor": "Gliscor", "gliscor": "Skorgro",
"mamoswine": "Mamoswine", "mamoswine": "Mamutel",
"porygon_z": "Porygon-Z", "porygon_z": "Porygon-Z",
"gallade": "Gallade", "gallade": "Galagladi",
"probopass": "Probopass", "probopass": "Voluminas",
"dusknoir": "Dusknoir", "dusknoir": "Zwirrfinst",
"froslass": "Froslass", "froslass": "Frosdedje",
"rotom": "Rotom", "rotom": "Rotom",
"uxie": "Uxie", "uxie": "Selfe",
"mesprit": "Mesprit", "mesprit": "Vesprit",
"azelf": "Azelf", "azelf": "Tobutz",
"dialga": "Dialga", "dialga": "Dialga",
"palkia": "Palkia", "palkia": "Palkia",
"heatran": "Heatran", "heatran": "Heatran",
@ -495,116 +495,116 @@ export const pokemon: SimpleTranslationEntries = {
"shaymin": "Shaymin", "shaymin": "Shaymin",
"arceus": "Arceus", "arceus": "Arceus",
"victini": "Victini", "victini": "Victini",
"snivy": "Snivy", "snivy": "Serpifeu",
"servine": "Servine", "servine": "Efoserp",
"serperior": "Serperior", "serperior": "Serpiroyal",
"tepig": "Tepig", "tepig": "Floink",
"pignite": "Pignite", "pignite": "Ferkokel",
"emboar": "Emboar", "emboar": "Flambirex",
"oshawott": "Oshawott", "oshawott": "Ottaro",
"dewott": "Dewott", "dewott": "Zwottronin",
"samurott": "Samurott", "samurott": "Admurai",
"patrat": "Patrat", "patrat": "Nagelotz",
"watchog": "Watchog", "watchog": "Kukmarda",
"lillipup": "Lillipup", "lillipup": "Yorkleff",
"herdier": "Herdier", "herdier": "Terribark",
"stoutland": "Stoutland", "stoutland": "Bissbark",
"purrloin": "Purrloin", "purrloin": "Felilou",
"liepard": "Liepard", "liepard": "Kleoparda",
"pansage": "Pansage", "pansage": "Vegimak",
"simisage": "Simisage", "simisage": "Vegichita",
"pansear": "Pansear", "pansear": "Grillmak",
"simisear": "Simisear", "simisear": "Grillchita",
"panpour": "Panpour", "panpour": "Sodamak",
"simipour": "Simipour", "simipour": "Sodachita",
"munna": "Munna", "munna": "Somniam",
"musharna": "Musharna", "musharna": "Somnivora",
"pidove": "Pidove", "pidove": "Dusslgurr",
"tranquill": "Tranquill", "tranquill": "Navitaub",
"unfezant": "Unfezant", "unfezant": "Fasasnob",
"blitzle": "Blitzle", "blitzle": "Elezeba",
"zebstrika": "Zebstrika", "zebstrika": "Zebritz",
"roggenrola": "Roggenrola", "roggenrola": "Kiesling",
"boldore": "Boldore", "boldore": "Sedimantur",
"gigalith": "Gigalith", "gigalith": "Brockoloss",
"woobat": "Woobat", "woobat": "Fleknoil",
"swoobat": "Swoobat", "swoobat": "Fletiamo",
"drilbur": "Drilbur", "drilbur": "Rotomurf",
"excadrill": "Excadrill", "excadrill": "Stalobor",
"audino": "Audino", "audino": "Ohrdoch",
"timburr": "Timburr", "timburr": "Praktibalk",
"gurdurr": "Gurdurr", "gurdurr": "Strepoli",
"conkeldurr": "Conkeldurr", "conkeldurr": "Meistagriff",
"tympole": "Tympole", "tympole": "Schallquap",
"palpitoad": "Palpitoad", "palpitoad": "Membrana",
"seismitoad": "Seismitoad", "seismitoad": "Branawarz",
"throh": "Throh", "throh": "Juitesto",
"sawk": "Sawk", "sawk": "Karadonis",
"sewaddle": "Sewaddle", "sewaddle": "Strawickl",
"swadloon": "Swadloon", "swadloon": "Folikon",
"leavanny": "Leavanny", "leavanny": "Matrifol",
"venipede": "Venipede", "venipede": "Toxiped",
"whirlipede": "Whirlipede", "whirlipede": "Rollum",
"scolipede": "Scolipede", "scolipede": "Cerapendra",
"cottonee": "Cottonee", "cottonee": "Waumboll",
"whimsicott": "Whimsicott", "whimsicott": "Elfun",
"petilil": "Petilil", "petilil": "Lilminip",
"lilligant": "Lilligant", "lilligant": "Dressella",
"basculin": "Basculin", "basculin": "Barschuft",
"sandile": "Sandile", "sandile": "Ganovil",
"krokorok": "Krokorok", "krokorok": "Rokkaiman",
"krookodile": "Krookodile", "krookodile": "Rabigator",
"darumaka": "Darumaka", "darumaka": "Flampion",
"darmanitan": "Darmanitan", "darmanitan": "Flampavian",
"maractus": "Maractus", "maractus": "Maracamba",
"dwebble": "Dwebble", "dwebble": "Lithomith",
"crustle": "Crustle", "crustle": "Castellith",
"scraggy": "Scraggy", "scraggy": "Zurrokex",
"scrafty": "Scrafty", "scrafty": "Irokex",
"sigilyph": "Sigilyph", "sigilyph": "Symvolara",
"yamask": "Yamask", "yamask": "Makabaja",
"cofagrigus": "Cofagrigus", "cofagrigus": "Echnatoll",
"tirtouga": "Tirtouga", "tirtouga": "Galapaflos",
"carracosta": "Carracosta", "carracosta": "Karippas",
"archen": "Archen", "archen": "Flapteryx",
"archeops": "Archeops", "archeops": "Aeropteryx",
"trubbish": "Trubbish", "trubbish": "Unratütox",
"garbodor": "Garbodor", "garbodor": "Deponitox",
"zorua": "Zorua", "zorua": "Zorua",
"zoroark": "Zoroark", "zoroark": "Zoroark",
"minccino": "Minccino", "minccino": "Picochilla",
"cinccino": "Cinccino", "cinccino": "Chillabell",
"gothita": "Gothita", "gothita": "Mollimorba",
"gothorita": "Gothorita", "gothorita": "Hypnomorba",
"gothitelle": "Gothitelle", "gothitelle": "Morbitesse",
"solosis": "Solosis", "solosis": "Monozyto",
"duosion": "Duosion", "duosion": "Mitodos",
"reuniclus": "Reuniclus", "reuniclus": "Zytomega",
"ducklett": "Ducklett", "ducklett": "Piccolente",
"swanna": "Swanna", "swanna": "Swaroness",
"vanillite": "Vanillite", "vanillite": "Gelatini",
"vanillish": "Vanillish", "vanillish": "Gelatroppo",
"vanilluxe": "Vanilluxe", "vanilluxe": "Gelatwino",
"deerling": "Deerling", "deerling": "Sesokitz",
"sawsbuck": "Sawsbuck", "sawsbuck": "Kronjuwild",
"emolga": "Emolga", "emolga": "Emolga",
"karrablast": "Karrablast", "karrablast": "Laukaps",
"escavalier": "Escavalier", "escavalier": "Cavalanzas",
"foongus": "Foongus", "foongus": "Tarnpignon",
"amoonguss": "Amoonguss", "amoonguss": "Hutsassa",
"frillish": "Frillish", "frillish": "Quabbel",
"jellicent": "Jellicent", "jellicent": "Apoquallyp",
"alomomola": "Alomomola", "alomomola": "Mamolida",
"joltik": "Joltik", "joltik": "Wattzapf",
"galvantula": "Galvantula", "galvantula": "Voltula",
"ferroseed": "Ferroseed", "ferroseed": "Kastadur",
"ferrothorn": "Ferrothorn", "ferrothorn": "Tentantel",
"klink": "Klink", "klink": "Klikk",
"klang": "Klang", "klang": "Kliklak",
"klinklang": "Klinklang", "klinklang": "Klikdiklak",
"tynamo": "Tynamo", "tynamo": "Zapplardin",
"eelektrik": "Eelektrik", "eelektrik": "Zapplalek",
"eelektross": "Eelektross", "eelektross": "Zapplarang",
"elgyem": "Elgyem", "elgyem": "Elgyem",
"beheeyem": "Beheeyem", "beheeyem": "Beheeyem",
"litwick": "Litwick", "litwick": "Litwick",

View File

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

View File

@ -78,4 +78,9 @@ export const menu: SimpleTranslationEntries = {
"skipItemQuestion": "Are you sure you want to skip taking an item?", "skipItemQuestion": "Are you sure you want to skip taking an item?",
"eggHatching": "Oh?", "eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?", "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?",
"rankings": "Rankings",
"dailyRankings": "Daily Rankings",
"noRankings": "No Rankings",
"loading": "Loading…",
"playersOnline": "Players Online"
} as const; } as const;

View File

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

View File

@ -61,5 +61,10 @@ export const menu: SimpleTranslationEntries = {
"notDisabled": "¡El movimiento {{moveName}}\nya no está anulado!", "notDisabled": "¡El movimiento {{moveName}}\nya no está anulado!",
"skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?", "skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?",
"eggHatching": "¿Y esto?", "eggHatching": "¿Y esto?",
"ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?" "ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?",
"rankings": "Rankings",
"dailyRankings": "Daily Rankings",
"noRankings": "No Rankings",
"loading": "Loading…",
"playersOnline": "Players Online"
} as const; } as const;

View File

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

View File

@ -73,4 +73,9 @@ export const menu: SimpleTranslationEntries = {
"skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre dobjet ?", "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre dobjet ?",
"eggHatching": "Oh ?", "eggHatching": "Oh ?",
"ivScannerUseQuestion": "Utiliser le Scanner dIV sur {{pokemonName}} ?", "ivScannerUseQuestion": "Utiliser le Scanner dIV sur {{pokemonName}} ?",
"rankings": "Classement",
"dailyRankings": "Classement du Jour",
"noRankings": "Pas de Classement",
"loading": "Chargement…",
"playersOnline": "Joueurs Connectés"
} as const; } as const;

View File

@ -1,38 +1,47 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const tutorial: SimpleTranslationEntries = { export const tutorial: SimpleTranslationEntries = {
"intro": `Welcome to PokéRogue! This is a battle-focused Pokémon fangame with roguelite elements. "intro": `Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite !
$This game is not monetized and we claim no ownership of Pokémon nor of the copyrighted assets used. $Ce jeu nest pas monétisé et nous ne prétendons pas à la propriété de Pokémon, ni des éléments sous copyright
$The game is a work in progress, but fully playable.\nFor bug reports, please use the Discord community. $utilisés.
$If the game runs slowly, please ensure 'Hardware Acceleration' is turned on in your browser settings.`, $Ce jeu est toujours en développement, mais entièrement jouable.
$Tout signalement de bugs passe par le serveur Discord.
$Si le jeu est lent, vérifiez que lAccélération Matérielle est activée dans les paramètres du navigateur.`,
"accessMenu": `To access the menu, press M or Escape while awaiting input.\nThe menu contains settings and various features.`, "accessMenu": `Accédez au menu avec M ou Échap lors de l'attente dune\naction.
$Il contient les paramètres et diverses fonctionnalités`,
"menu": `From this menu you can access the settings. "menu": `Vous pouvez accéder aux paramètres depuis ce menu.
$From the settings you can change game speed, window style, and other options. $Vous pouvez entre autres y changer la vitesse du jeu ou le style de fenêtre.
$There are also various other features here, so be sure to check them all!`, $Il y a également toute une variété dautres fonctionnalités,
$jetez-y un œil !`,
"starterSelect": `From this screen, you can select your starters.\nThese are your initial party members. "starterSelect": `Choisissez vos starters depuis cet écran.\nIls formeront votre équipe de départ.
$Each starter has a value. Your party can have up to\n6 members as long as the total does not exceed 10. $Chacun possède une valeur. Votre équipe peut avoir jusquà\n6 membres, tant que vous ne dépassez pas un coût de 10.
$You can also select gender, ability, and form depending on\nthe variants you've caught or hatched. $Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos.
$The IVs for a species are also the best of every one you've\ncaught or hatched, so try to get lots of the same species!`, $Les IVs dun starter sont les meilleurs de tous ceux de son\nespèce déjà obtenus. Essayez donc den obtenir plusieurs !`,
"pokerus": `A daily random 3 selectable starters have a purple border. "pokerus": `Chaque jour, 3 starters tirés aléatoirement ont un contour
$If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`, $violet. Si un starter que vous possédez la, essayez de
$ lajouter à votre équipe. Vérifiez bien son résumé !`,
"selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled.
$These range from consumables, to Pokémon held items, to passive permanent items. $Your Pokémon are recalled before a trainer battle and before entering a new biome.
$Most non-consumable item effects will stack in various ways. $You can also view the stat changes for the Pokémon on the field by holding C.`,
$Some items will only show up if they can be used, such as evolution items.
$You can also transfer held items between Pokémon using the transfer option.
$The transfer option will appear in the bottom right once you have obtained a held item.
$You may purchase consumable items with money, and a larger variety will be available the further you get.
$Be sure to buy these before you pick your random item, as it will progress to the next battle once you do.`,
"eggGacha": `From this screen, you can redeem your vouchers for\nPokémon eggs. "selectItem": `Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre quun.
$Eggs have to be hatched and get closer to hatching after\nevery battle. Rarer eggs take longer to hatch. $Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents.
$Hatched Pokémon also won't be added to your party, they will\nbe added to your starters. $La plupart des effets des objets non-consommables se cumuleront de diverses manières.
$Pokémon hatched from eggs generally have better IVs than\nwild Pokémon. $Certains objets apparaîtront sils peuvent être utilisés, comme les objets dévolution.
$Some Pokémon can only even be obtained from eggs. $Vous pouvez aussi transférer des objets tenus entre Pokémon en utilisant loption de transfert.
$There are 3 different machines to pull from with different\nbonuses, so pick the one that suits you best!`, $Loption de transfert apparaît en bas à droite dès que vous avez obtenu un objet à faire tenir.
$Vous pouvez acheter des consommables avec de largent.\nPlus vous progressez, plus le choix sera varié.
$Choisir un des objets gratuits déclenchera le prochain combat, donc faites bien tous vos achats avant.`,
"eggGacha": `Depuis cet écran, vous pouvez échanger vos coupons\ncontre des Œufs de Pokémon.
$Les Œufs éclosent après avoir remporté un certain nombre\nde combats. Les plus rares mettent plus de temps.
$Les Pokémon éclos ne rejoindront pas votre équipe,\nmais seront ajoutés à vos starters.
$Les Pokémon issus dŒufs ont généralement de\nmeilleurs IVs que les Pokémon sauvages.
$Certains Pokémon ne peuvent être obtenus\nque dans des Œufs.
$Il y a 3 différentes machines à actionner avec différents\nbonus, prenez celle qui vous convient le mieux !`,
} as const; } as const;

View File

@ -6,5 +6,10 @@ export const menu: SimpleTranslationEntries = {
"newGame": "Nuova Partita", "newGame": "Nuova Partita",
"loadGame": "Carica Partita", "loadGame": "Carica Partita",
"dailyRun": "Corsa Giornaliera (Beta)", "dailyRun": "Corsa Giornaliera (Beta)",
"selectGameMode": "Seleziona una modalità di gioco." "selectGameMode": "Seleziona una modalità di gioco.",
"rankings": "Rankings",
"dailyRankings": "Daily Rankings",
"noRankings": "No Rankings",
"loading": "Loading…",
"playersOnline": "Players Online"
} as const; } as const;

View File

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

23
src/overrides.ts Normal file
View File

@ -0,0 +1,23 @@
import { Species } from './data/enums/species';
import { Abilities } from "./data/enums/abilities";
import { Biome } from "./data/enums/biome";
import { Moves } from "./data/enums/moves";
import { WeatherType } from "./data/weather";
export const SEED_OVERRIDE = '';
export const STARTER_SPECIES_OVERRIDE = 0;
export const STARTER_FORM_OVERRIDE = 0;
export const STARTING_LEVEL_OVERRIDE = 0;
export const STARTING_WAVE_OVERRIDE = 0;
export const STARTING_BIOME_OVERRIDE = Biome.TOWN;
export const STARTING_MONEY_OVERRIDE = 0;
export const WEATHER_OVERRIDE = WeatherType.NONE;
export const ABILITY_OVERRIDE = Abilities.NONE;
export const MOVE_OVERRIDE = Moves.NONE;
export const OPP_SPECIES_OVERRIDE = 0;
export const OPP_ABILITY_OVERRIDE = Abilities.NONE;
export const OPP_MOVE_OVERRIDE = Moves.NONE;
export const OPP_SHINY_OVERRIDE = false;
export const OPP_VARIANT_OVERRIDE = 0;

View File

@ -1,4 +1,4 @@
import BattleScene, { STARTER_FORM_OVERRIDE, STARTER_SPECIES_OVERRIDE, bypassLogin, startingWave } from "./battle-scene"; import BattleScene, { bypassLogin, startingWave } from "./battle-scene";
import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove, MoveResult, DamageResult, FieldPosition, HitResult, TurnMove } from "./field/pokemon"; import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove, MoveResult, DamageResult, FieldPosition, HitResult, TurnMove } from "./field/pokemon";
import * as Utils from './utils'; import * as Utils from './utils';
import { Moves } from "./data/enums/moves"; import { Moves } from "./data/enums/moves";
@ -57,6 +57,7 @@ import { fetchDailyRunSeed, getDailyRunStarters } from "./data/daily-run";
import { GameModes, gameModes } from "./game-mode"; import { GameModes, gameModes } from "./game-mode";
import { getPokemonSpecies, speciesStarters } from "./data/pokemon-species"; import { getPokemonSpecies, speciesStarters } from "./data/pokemon-species";
import i18next from './plugins/i18n'; import i18next from './plugins/i18n';
import { STARTER_FORM_OVERRIDE, STARTER_SPECIES_OVERRIDE } from './overrides';
export class LoginPhase extends Phase { export class LoginPhase extends Phase {
private showText: boolean; private showText: boolean;
@ -2547,7 +2548,7 @@ export class MoveEffectPhase extends PokemonPhase {
: 3 / (3 + Math.min(targetEvasionLevel.value - userAccuracyLevel.value, 6)); : 3 / (3 + Math.min(targetEvasionLevel.value - userAccuracyLevel.value, 6));
} }
applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, user, BattleStat.ACC, accuracyMultiplier); applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, user, BattleStat.ACC, accuracyMultiplier, this.move.getMove());
const evasionMultiplier = new Utils.NumberHolder(1); const evasionMultiplier = new Utils.NumberHolder(1);
applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this.getTarget(), BattleStat.EVA, evasionMultiplier); applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this.getTarget(), BattleStat.EVA, evasionMultiplier);
@ -2670,7 +2671,6 @@ export class StatChangePhase extends PokemonPhase {
let random = false; let random = false;
const allStats = Utils.getEnumValues(BattleStat);
if (this.stats.length === 1 && this.stats[0] === BattleStat.RAND) { if (this.stats.length === 1 && this.stats[0] === BattleStat.RAND) {
this.stats[0] = this.getRandomStat(); this.stats[0] = this.getRandomStat();
random = true; random = true;
@ -2711,8 +2711,11 @@ export class StatChangePhase extends PokemonPhase {
for (let stat of filteredStats) for (let stat of filteredStats)
pokemon.summonData.battleStats[stat] = Math.max(Math.min(pokemon.summonData.battleStats[stat] + levels.value, 6), -6); pokemon.summonData.battleStats[stat] = Math.max(Math.min(pokemon.summonData.battleStats[stat] + levels.value, 6), -6);
applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget) applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget);
this.end();
pokemon.updateInfo();
handleTutorial(this.scene, Tutorial.Stat_Change).then(() => super.end());
}; };
if (relLevels.filter(l => l).length && this.scene.moveAnimations) { if (relLevels.filter(l => l).length && this.scene.moveAnimations) {
@ -3336,7 +3339,7 @@ export class TrainerVictoryPhase extends BattlePhase {
const trainerType = this.scene.currentBattle.trainer.config.trainerType; const trainerType = this.scene.currentBattle.trainer.config.trainerType;
if (vouchers.hasOwnProperty(TrainerType[trainerType])) { if (vouchers.hasOwnProperty(TrainerType[trainerType])) {
if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer.config.isBoss) if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer.config.isBoss)
this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.VOUCHER)); this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [ modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM ][vouchers[TrainerType[trainerType]].voucherType]));
} }
this.scene.ui.showText(i18next.t('menu:trainerDefeated', { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }), null, () => { this.scene.ui.showText(i18next.t('menu:trainerDefeated', { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }), null, () => {

View File

@ -1,4 +1,6 @@
import i18next from 'i18next'; import i18next from 'i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import { menu as enMenu } from '../locales/en/menu'; import { menu as enMenu } from '../locales/en/menu';
import { menu as esMenu } from '../locales/es/menu'; import { menu as esMenu } from '../locales/es/menu';
import { menu as itMenu } from '../locales/it/menu'; import { menu as itMenu } from '../locales/it/menu';
@ -55,7 +57,6 @@ export interface SimpleTranslationEntries {
[key: string]: string [key: string]: string
} }
export interface MoveTranslationEntry { export interface MoveTranslationEntry {
name: string, name: string,
effect: string effect: string
@ -78,10 +79,8 @@ export interface Localizable {
localize(): void; localize(): void;
} }
const DEFAULT_LANGUAGE_OVERRIDE = '';
export function initI18n(): void { export function initI18n(): void {
let lang = 'en'; let lang = '';
if (localStorage.getItem('prLang')) if (localStorage.getItem('prLang'))
lang = localStorage.getItem('prLang'); lang = localStorage.getItem('prLang');
@ -92,6 +91,7 @@ export function initI18n(): void {
* Q: How do I add a new language? * Q: How do I add a new language?
* A: To add a new language, create a new folder in the locales directory with the language code. * A: To add a new language, create a new folder in the locales directory with the language code.
* Each language folder should contain a file for each namespace (ex. menu.ts) with the translations. * Each language folder should contain a file for each namespace (ex. menu.ts) with the translations.
* Don't forget to declare new language in `supportedLngs` i18next initializer
* *
* Q: How do I add a new namespace? * Q: How do I add a new namespace?
* A: To add a new namespace, create a new file in each language folder with the translations. * A: To add a new namespace, create a new file in each language folder with the translations.
@ -101,9 +101,10 @@ export function initI18n(): void {
* A: In src/system/settings.ts, add a new case to the Setting.Language switch statement. * A: In src/system/settings.ts, add a new case to the Setting.Language switch statement.
*/ */
i18next.init({ i18next.use(LanguageDetector).init({
lng: DEFAULT_LANGUAGE_OVERRIDE ? DEFAULT_LANGUAGE_OVERRIDE : lang, lng: lang,
fallbackLng: 'en', fallbackLng: 'en',
supportedLngs: ['en', 'es', 'fr', 'it', 'de'],
debug: true, debug: true,
interpolation: { interpolation: {
escapeValue: false, escapeValue: false,

View File

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

View File

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

View File

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

View File

@ -2,6 +2,7 @@ import BattleScene from "../battle-scene";
import { TextStyle, addTextObject } from "./text"; import { TextStyle, addTextObject } from "./text";
import { WindowVariant, addWindow } from "./ui-theme"; import { WindowVariant, addWindow } from "./ui-theme";
import * as Utils from "../utils"; import * as Utils from "../utils";
import i18next from "i18next";
interface RankingEntry { interface RankingEntry {
rank: integer, rank: integer,
@ -39,7 +40,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
const titleWindow = addWindow(this.scene, 0, 0, 114, 18, false, false, null, null, WindowVariant.THIN); const titleWindow = addWindow(this.scene, 0, 0, 114, 18, false, false, null, null, WindowVariant.THIN);
this.add(titleWindow); this.add(titleWindow);
this.titleLabel = addTextObject(this.scene, titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, 'Daily Rankings', TextStyle.WINDOW, { fontSize: '64px' }); this.titleLabel = addTextObject(this.scene, titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, i18next.t('menu:dailyRankings'), TextStyle.WINDOW, { fontSize: '64px' });
this.titleLabel.setOrigin(0.5, 0.5); this.titleLabel.setOrigin(0.5, 0.5);
this.add(this.titleLabel); this.add(this.titleLabel);
@ -141,7 +142,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
update(category: ScoreboardCategory = this.category, page: integer = this.page) { update(category: ScoreboardCategory = this.category, page: integer = this.page) {
this.rankingsContainer.removeAll(true); this.rankingsContainer.removeAll(true);
this.loadingLabel.setText('Loading…'); this.loadingLabel.setText(i18next.t('menu:loading'));
this.loadingLabel.setVisible(true); this.loadingLabel.setVisible(true);
if (category !== this.category) if (category !== this.category)
@ -155,7 +156,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
.then(jsonResponse => { .then(jsonResponse => {
this.page = page; this.page = page;
this.category = category; this.category = category;
this.titleLabel.setText(`${Utils.toReadableString(ScoreboardCategory[category])} Rankings`); this.titleLabel.setText(`${Utils.toReadableString(ScoreboardCategory[category])} ${i18next.t("menu:rankings")}`);
this.prevPageButton.setAlpha(page > 1 ? 1 : 0.5); this.prevPageButton.setAlpha(page > 1 ? 1 : 0.5);
this.nextPageButton.setAlpha(page < this.pageCount ? 1 : 0.5); this.nextPageButton.setAlpha(page < this.pageCount ? 1 : 0.5);
this.pageNumberLabel.setText(page.toString()); this.pageNumberLabel.setText(page.toString());
@ -163,7 +164,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
this.loadingLabel.setVisible(false); this.loadingLabel.setVisible(false);
this.updateRankings(jsonResponse); this.updateRankings(jsonResponse);
} else } else
this.loadingLabel.setText('No Rankings'); this.loadingLabel.setText(i18next.t('menu:noRankings'));
}); });
}); });
} }

View File

@ -383,6 +383,7 @@ export default class PartyUiHandler extends MessageUiHandler {
} }
const slotCount = this.partySlots.length; const slotCount = this.partySlots.length;
const battlerCount = this.scene.currentBattle.getBattlerCount();
switch (button) { switch (button) {
case Button.UP: case Button.UP:
@ -392,16 +393,22 @@ export default class PartyUiHandler extends MessageUiHandler {
success = this.setCursor(this.cursor < 6 ? this.cursor < slotCount - 1 ? this.cursor + 1 : 6 : 0); success = this.setCursor(this.cursor < 6 ? this.cursor < slotCount - 1 ? this.cursor + 1 : 6 : 0);
break; break;
case Button.LEFT: case Button.LEFT:
if (this.cursor >= this.scene.currentBattle.getBattlerCount() && this.cursor < 6) if (this.cursor >= battlerCount && this.cursor <= 6)
success = this.setCursor(0); success = this.setCursor(0);
break; break;
case Button.RIGHT: case Button.RIGHT:
const battlerCount = this.scene.currentBattle.getBattlerCount(); if (slotCount === battlerCount){
if (slotCount > battlerCount && this.cursor < battlerCount) success = this.setCursor(6);
break;
} else if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1){
success = this.setCursor(2);
break;
} else if (slotCount > battlerCount && this.cursor < battlerCount){
success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount);
break; break;
} }
} }
}
if (success) if (success)
ui.playSelect(); ui.playSelect();

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