diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index aad509c3a7e..db8fa2777e5 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -28,11 +28,6 @@ jobs: ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts - name: Deploy build on server if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch - run: rsync -vrm dist/* ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:${{ secrets.DESTINATION_DIR }} - - name: Purge Cloudflare Cache - if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch - id: purge-cache - uses: NathanVaughn/actions-cloudflare-purge@v3.1.0 - with: - cf_auth: ${{ secrets.CLOUDFLARE_API_TOKEN }} - cf_zone: ${{ secrets.CLOUDFLARE_ZONE_ID }} + run: | + rsync --del -vrm dist/* ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:${{ secrets.DESTINATION_DIR }} + ssh -t ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "~/prmanifest --inpath ${{ secrets.DESTINATION_DIR }} --outpath ${{ secrets.DESTINATION_DIR }}/manifest.json" diff --git a/public/battle-anims/common-snap-trap.json b/public/battle-anims/common-snap-trap.json new file mode 100644 index 00000000000..d9b2cf0ab2d --- /dev/null +++ b/public/battle-anims/common-snap-trap.json @@ -0,0 +1,1208 @@ +{ + "id": 779, + "graphic": "PRAS- Elemental Fangs", + "frames": [ + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -95, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -33, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -94, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -34, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -94, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -34, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -95, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -33, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -96, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -32, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -100, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -28, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -104, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -24, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -104, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -24, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -104, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -24, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -104, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -24, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 90, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -96, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -32, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 80, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -88, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -40, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 70, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -80, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -48, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 70, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -76, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -52, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 70, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -76, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -52, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 70, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -76, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -52, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 70, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -76, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -52, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 70, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -76, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + }, + { + "x": 128, + "y": -52, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "tone": [ + -50, + -50, + -50, + 0 + ], + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + } + ] + ], + "frameTimedEvents": { + "7": [ + { + "frameIndex": 7, + "resourceName": "metal.m4a", + "volume": 80, + "pitch": 100, + "eventType": "AnimTimedSoundEvent" + } + ], + "11": [ + { + "frameIndex": 11, + "resourceName": "PRSFX- Bite.wav", + "volume": 80, + "pitch": 100, + "eventType": "AnimTimedSoundEvent" + } + ] + }, + "position": 1, + "hue": 0 +} \ No newline at end of file diff --git a/public/images/pokemon/variant/31_1.png b/public/images/pokemon/variant/31_1.png index 082e2a3d1b9..d471b062136 100644 Binary files a/public/images/pokemon/variant/31_1.png and b/public/images/pokemon/variant/31_1.png differ diff --git a/public/images/pokemon/variant/back/female/399_2.json b/public/images/pokemon/variant/back/female/399_2.json new file mode 100644 index 00000000000..c2e9b3f1735 --- /dev/null +++ b/public/images/pokemon/variant/back/female/399_2.json @@ -0,0 +1,2414 @@ +{ + "textures": [ + { + "image": "399_2.png", + "format": "RGBA8888", + "size": { + "w": 180, + "h": 180 + }, + "scale": 1, + "frames": [ + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 49, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 37 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 49, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 37 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 49, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 37 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 49, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 37 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 49, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 37 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 49, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 37 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 49, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 37 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 49, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 37 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 49, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 37 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 49, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 37 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 44, + "h": 39 + }, + "frame": { + "x": 49, + "y": 0, + "w": 44, + "h": 39 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 49, + "h": 40 + }, + "frame": { + "x": 93, + "y": 0, + "w": 49, + "h": 40 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 49, + "h": 40 + }, + "frame": { + "x": 93, + "y": 0, + "w": 49, + "h": 40 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 49, + "h": 40 + }, + "frame": { + "x": 93, + "y": 0, + "w": 49, + "h": 40 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 49, + "h": 40 + }, + "frame": { + "x": 93, + "y": 0, + "w": 49, + "h": 40 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 49, + "h": 40 + }, + "frame": { + "x": 93, + "y": 0, + "w": 49, + "h": 40 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 49, + "h": 40 + }, + "frame": { + "x": 93, + "y": 0, + "w": 49, + "h": 40 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 49, + "h": 40 + }, + "frame": { + "x": 93, + "y": 0, + "w": 49, + "h": 40 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 49, + "h": 40 + }, + "frame": { + "x": 93, + "y": 0, + "w": 49, + "h": 40 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 49, + "h": 40 + }, + "frame": { + "x": 93, + "y": 0, + "w": 49, + "h": 40 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 49, + "h": 40 + }, + "frame": { + "x": 93, + "y": 0, + "w": 49, + "h": 40 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 45, + "h": 40 + }, + "frame": { + "x": 0, + "y": 37, + "w": 45, + "h": 40 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 45, + "h": 40 + }, + "frame": { + "x": 0, + "y": 37, + "w": 45, + "h": 40 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 45, + "h": 40 + }, + "frame": { + "x": 0, + "y": 37, + "w": 45, + "h": 40 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 45, + "h": 40 + }, + "frame": { + "x": 0, + "y": 37, + "w": 45, + "h": 40 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 47, + "h": 40 + }, + "frame": { + "x": 45, + "y": 39, + "w": 47, + "h": 40 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 47, + "h": 40 + }, + "frame": { + "x": 45, + "y": 39, + "w": 47, + "h": 40 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 47, + "h": 40 + }, + "frame": { + "x": 45, + "y": 39, + "w": 47, + "h": 40 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 47, + "h": 40 + }, + "frame": { + "x": 45, + "y": 39, + "w": 47, + "h": 40 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 44, + "h": 40 + }, + "frame": { + "x": 92, + "y": 40, + "w": 44, + "h": 40 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 44, + "h": 40 + }, + "frame": { + "x": 92, + "y": 40, + "w": 44, + "h": 40 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 44, + "h": 40 + }, + "frame": { + "x": 92, + "y": 40, + "w": 44, + "h": 40 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 44, + "h": 40 + }, + "frame": { + "x": 92, + "y": 40, + "w": 44, + "h": 40 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 40, + "w": 44, + "h": 41 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 40, + "w": 44, + "h": 41 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 40, + "w": 44, + "h": 41 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 40, + "w": 44, + "h": 41 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 40, + "w": 44, + "h": 41 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 40, + "w": 44, + "h": 41 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 40, + "w": 44, + "h": 41 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 40, + "w": 44, + "h": 41 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 40, + "w": 44, + "h": 41 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 40, + "w": 44, + "h": 41 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 44, + "h": 41 + }, + "frame": { + "x": 0, + "y": 77, + "w": 44, + "h": 41 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 44, + "h": 41 + }, + "frame": { + "x": 0, + "y": 77, + "w": 44, + "h": 41 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 44, + "h": 41 + }, + "frame": { + "x": 0, + "y": 77, + "w": 44, + "h": 41 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 44, + "h": 41 + }, + "frame": { + "x": 0, + "y": 77, + "w": 44, + "h": 41 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 44, + "h": 41 + }, + "frame": { + "x": 0, + "y": 77, + "w": 44, + "h": 41 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 44, + "h": 41 + }, + "frame": { + "x": 0, + "y": 77, + "w": 44, + "h": 41 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 44, + "h": 41 + }, + "frame": { + "x": 0, + "y": 77, + "w": 44, + "h": 41 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 44, + "h": 41 + }, + "frame": { + "x": 0, + "y": 77, + "w": 44, + "h": 41 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 44, + "h": 41 + }, + "frame": { + "x": 0, + "y": 77, + "w": 44, + "h": 41 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 44, + "h": 41 + }, + "frame": { + "x": 0, + "y": 77, + "w": 44, + "h": 41 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 46, + "h": 40 + }, + "frame": { + "x": 44, + "y": 79, + "w": 46, + "h": 40 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 46, + "h": 40 + }, + "frame": { + "x": 44, + "y": 79, + "w": 46, + "h": 40 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 46, + "h": 40 + }, + "frame": { + "x": 44, + "y": 79, + "w": 46, + "h": 40 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 46, + "h": 40 + }, + "frame": { + "x": 44, + "y": 79, + "w": 46, + "h": 40 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 46, + "h": 41 + }, + "frame": { + "x": 90, + "y": 80, + "w": 46, + "h": 41 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 46, + "h": 41 + }, + "frame": { + "x": 90, + "y": 80, + "w": 46, + "h": 41 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 46, + "h": 41 + }, + "frame": { + "x": 90, + "y": 80, + "w": 46, + "h": 41 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 46, + "h": 41 + }, + "frame": { + "x": 90, + "y": 80, + "w": 46, + "h": 41 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 46, + "h": 41 + }, + "frame": { + "x": 90, + "y": 80, + "w": 46, + "h": 41 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 46, + "h": 41 + }, + "frame": { + "x": 90, + "y": 80, + "w": 46, + "h": 41 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 46, + "h": 41 + }, + "frame": { + "x": 90, + "y": 80, + "w": 46, + "h": 41 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 46, + "h": 41 + }, + "frame": { + "x": 90, + "y": 80, + "w": 46, + "h": 41 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 46, + "h": 41 + }, + "frame": { + "x": 90, + "y": 80, + "w": 46, + "h": 41 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 46, + "h": 41 + }, + "frame": { + "x": 90, + "y": 80, + "w": 46, + "h": 41 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 81, + "w": 44, + "h": 41 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 81, + "w": 44, + "h": 41 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 81, + "w": 44, + "h": 41 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 44, + "h": 41 + }, + "frame": { + "x": 136, + "y": 81, + "w": 44, + "h": 41 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 44, + "h": 42 + }, + "frame": { + "x": 0, + "y": 118, + "w": 44, + "h": 42 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 44, + "h": 42 + }, + "frame": { + "x": 0, + "y": 118, + "w": 44, + "h": 42 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 44, + "h": 42 + }, + "frame": { + "x": 0, + "y": 118, + "w": 44, + "h": 42 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 44, + "h": 42 + }, + "frame": { + "x": 0, + "y": 118, + "w": 44, + "h": 42 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 44, + "h": 42 + }, + "frame": { + "x": 0, + "y": 118, + "w": 44, + "h": 42 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 44, + "h": 42 + }, + "frame": { + "x": 0, + "y": 118, + "w": 44, + "h": 42 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 44, + "h": 42 + }, + "frame": { + "x": 0, + "y": 118, + "w": 44, + "h": 42 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 44, + "h": 42 + }, + "frame": { + "x": 0, + "y": 118, + "w": 44, + "h": 42 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 44, + "h": 42 + }, + "frame": { + "x": 0, + "y": 118, + "w": 44, + "h": 42 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 44, + "h": 42 + }, + "frame": { + "x": 0, + "y": 118, + "w": 44, + "h": 42 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 46, + "h": 41 + }, + "frame": { + "x": 44, + "y": 119, + "w": 46, + "h": 41 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 46, + "h": 41 + }, + "frame": { + "x": 44, + "y": 119, + "w": 46, + "h": 41 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 46, + "h": 41 + }, + "frame": { + "x": 44, + "y": 119, + "w": 46, + "h": 41 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 46, + "h": 41 + }, + "frame": { + "x": 44, + "y": 119, + "w": 46, + "h": 41 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 46, + "h": 42 + }, + "frame": { + "x": 90, + "y": 121, + "w": 46, + "h": 42 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 46, + "h": 42 + }, + "frame": { + "x": 90, + "y": 121, + "w": 46, + "h": 42 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 42 + }, + "frame": { + "x": 136, + "y": 122, + "w": 44, + "h": 42 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 51, + "h": 45 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 42 + }, + "frame": { + "x": 136, + "y": 122, + "w": 44, + "h": 42 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:166d6bff38ea8945fae5e64c1106413a:2aa7b9b68f399a27af5a5270b38116ce:7b55afdea5fe8b0745f3f525c240592c$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/399_2.png b/public/images/pokemon/variant/back/female/399_2.png new file mode 100644 index 00000000000..fcd948a0ef9 Binary files /dev/null and b/public/images/pokemon/variant/back/female/399_2.png differ diff --git a/public/images/pokemon/variant/back/female/400.json b/public/images/pokemon/variant/back/female/400.json new file mode 100644 index 00000000000..c7e831cae97 --- /dev/null +++ b/public/images/pokemon/variant/back/female/400.json @@ -0,0 +1,13 @@ +{ + "1": { + "ad947b": "bd9171", + "e6d69c": "fff5d1", + "5a3a31": "70323f", + "3a3129": "3a3129", + "bd844a": "dba0ac", + "8c5a31": "c46269", + "101010": "101010", + "423a31": "3e3040", + "63523a": "824561" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/399.json b/public/images/pokemon/variant/female/399.json new file mode 100644 index 00000000000..3eff691158a --- /dev/null +++ b/public/images/pokemon/variant/female/399.json @@ -0,0 +1,16 @@ +{ + "1": { + "423110": "423110", + "9c6331": "d46378", + "c58c42": "e5a5bb", + "634a31": "70323f", + "101010": "101010", + "cebd84": "eba978", + "ffefbd": "fff5d1", + "ffffff": "ffffff", + "5a4229": "824561", + "ef5a4a": "ffa488", + "cec5c5": "b7b9d0", + "848484": "848484" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/400.json b/public/images/pokemon/variant/female/400.json new file mode 100644 index 00000000000..616586d3539 --- /dev/null +++ b/public/images/pokemon/variant/female/400.json @@ -0,0 +1,16 @@ +{ + "1": { + "5a3a31": "5a3a31", + "bd844a": "dba0ac", + "101010": "101010", + "8c5a31": "c46269", + "e6d69c": "fff5d1", + "ad947b": "bd9171", + "c5c5b5": "b7b9d0", + "ffffff": "ffffff", + "3a3129": "3a3129", + "63523a": "824561", + "de4a4a": "ffa488", + "423a31": "3e3040" + } +} \ No newline at end of file diff --git a/src/battle-scene.ts b/src/battle-scene.ts index a60b040b202..7cb92c451a9 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -271,7 +271,7 @@ export default class BattleScene extends SceneBase { populateAnims(); - await fetch('./images/pokemon/variant/_masterlist.json').then(res => res.json()).then(v => Object.keys(v).forEach(k => variantData[k] = v[k])); + await this.cachedFetch('./images/pokemon/variant/_masterlist.json').then(res => res.json()).then(v => Object.keys(v).forEach(k => variantData[k] = v[k])); } create() { @@ -468,8 +468,8 @@ export default class BattleScene extends SceneBase { Promise.all([ Promise.all(loadPokemonAssets), - initCommonAnims().then(() => loadCommonAnimAssets(this, true)), - Promise.all([ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ].map(m => initMoveAnim(m))).then(() => loadMoveAnimAssets(this, defaultMoves, true)), + initCommonAnims(this).then(() => loadCommonAnimAssets(this, true)), + Promise.all([ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ].map(m => initMoveAnim(this, m))).then(() => loadMoveAnimAssets(this, defaultMoves, true)), this.initStarterColors() ]).then(() => { this.pushPhase(new LoginPhase(this)); @@ -505,19 +505,29 @@ export default class BattleScene extends SceneBase { async initExpSprites(): Promise { if (expSpriteKeys.length) return; - fetch('./exp-sprites.json').then(res => res.json()).then(keys => { + this.cachedFetch('./exp-sprites.json').then(res => res.json()).then(keys => { if (Array.isArray(keys)) expSpriteKeys.push(...keys); Promise.resolve(); }); } + cachedFetch(url: string, init?: RequestInit): Promise { + const manifest = this.game['manifest']; + if (manifest) { + const timestamp = manifest[`/${url.replace('./', '')}`]; + if (timestamp) + url += `?t=${timestamp}`; + } + return fetch(url, init); + } + initStarterColors(): Promise { return new Promise(resolve => { if (starterColors) return resolve(); - fetch('./starter-colors.json').then(res => res.json()).then(sc => { + this.cachedFetch('./starter-colors.json').then(res => res.json()).then(sc => { starterColors = {}; Object.keys(sc).forEach(key => { starterColors[key] = sc[key]; diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index e35914c941e..db00ea600fd 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -78,6 +78,7 @@ export enum CommonAnim { CURSE, MAGMA_STORM, CLAMP, + SNAP_TRAP, THUNDER_CAGE, INFESTATION, ORDER_UP_CURLY, @@ -423,14 +424,14 @@ export const moveAnims = new Map() export const chargeAnims = new Map(); export const commonAnims = new Map(); -export function initCommonAnims(): Promise { +export function initCommonAnims(scene: BattleScene): Promise { return new Promise(resolve => { const commonAnimNames = Utils.getEnumKeys(CommonAnim); const commonAnimIds = Utils.getEnumValues(CommonAnim); const commonAnimFetches = []; for (let ca = 0; ca < commonAnimIds.length; ca++) { const commonAnimId = commonAnimIds[ca]; - commonAnimFetches.push(fetch(`./battle-anims/common-${commonAnimNames[ca].toLowerCase().replace(/\_/g, '-')}.json`) + commonAnimFetches.push(scene.cachedFetch(`./battle-anims/common-${commonAnimNames[ca].toLowerCase().replace(/\_/g, '-')}.json`) .then(response => response.json()) .then(cas => commonAnims.set(commonAnimId, new AnimConfig(cas)))); } @@ -438,7 +439,7 @@ export function initCommonAnims(): Promise { }); } -export function initMoveAnim(move: Moves): Promise { +export function initMoveAnim(scene: BattleScene, move: Moves): Promise { return new Promise(resolve => { if (moveAnims.has(move)) { if (moveAnims.get(move) !== null) @@ -459,7 +460,7 @@ export function initMoveAnim(move: Moves): Promise { const defaultMoveAnim = allMoves[move] instanceof AttackMove ? Moves.TACKLE : allMoves[move] instanceof SelfStatusMove ? Moves.FOCUS_ENERGY : Moves.TAIL_WHIP; const moveName = Moves[move].toLowerCase().replace(/\_/g, '-'); const fetchAnimAndResolve = (move: Moves) => { - fetch(`./battle-anims/${moveName}.json`) + scene.cachedFetch(`./battle-anims/${moveName}.json`) .then(response => { if (!response.ok) { console.error(`Could not load animation file for move '${moveName}'`, response.status, response.statusText); @@ -476,7 +477,7 @@ export function initMoveAnim(move: Moves): Promise { populateMoveAnim(move, ba); const chargeAttr = allMoves[move].getAttrs(ChargeAttr).find(() => true) as ChargeAttr || allMoves[move].getAttrs(DelayedAttackAttr).find(() => true) as DelayedAttackAttr; if (chargeAttr) - initMoveChargeAnim(chargeAttr.chargeAnim).then(() => resolve()); + initMoveChargeAnim(scene, chargeAttr.chargeAnim).then(() => resolve()); else resolve(); }); @@ -486,7 +487,7 @@ export function initMoveAnim(move: Moves): Promise { }); } -export function initMoveChargeAnim(chargeAnim: ChargeAnim): Promise { +export function initMoveChargeAnim(scene: BattleScene, chargeAnim: ChargeAnim): Promise { return new Promise(resolve => { if (chargeAnims.has(chargeAnim)) { if (chargeAnims.get(chargeAnim) !== null) @@ -501,7 +502,7 @@ export function initMoveChargeAnim(chargeAnim: ChargeAnim): Promise { } } else { chargeAnims.set(chargeAnim, null); - fetch(`./battle-anims/${ChargeAnim[chargeAnim].toLowerCase().replace(/\_/g, '-')}.json`) + scene.cachedFetch(`./battle-anims/${ChargeAnim[chargeAnim].toLowerCase().replace(/\_/g, '-')}.json`) .then(response => response.json()) .then(ca => { if (Array.isArray(ca)) { diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index d4fc6da2196..b12d15968f6 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -614,6 +614,16 @@ export class MagmaStormTag extends DamagingTrapTag { } } +export class SnapTrapTag extends DamagingTrapTag { + constructor(turnCount: integer, sourceId: integer) { + super(BattlerTagType.SNAP_TRAP, CommonAnim.SNAP_TRAP, turnCount, Moves.SNAP_TRAP, sourceId); + } + + getTrapMessage(pokemon: Pokemon): string { + return getPokemonMessage(pokemon, ` got trapped\nby a snap trap!`); + } +} + export class ThunderCageTag extends DamagingTrapTag { constructor(turnCount: integer, sourceId: integer) { super(BattlerTagType.THUNDER_CAGE, CommonAnim.THUNDER_CAGE, turnCount, Moves.THUNDER_CAGE, sourceId); @@ -1103,6 +1113,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc return new SandTombTag(turnCount, sourceId); case BattlerTagType.MAGMA_STORM: return new MagmaStormTag(turnCount, sourceId); + case BattlerTagType.SNAP_TRAP: + return new SnapTrapTag(turnCount, sourceId); case BattlerTagType.THUNDER_CAGE: return new ThunderCageTag(turnCount, sourceId); case BattlerTagType.INFESTATION: diff --git a/src/data/biomes.ts b/src/data/biomes.ts index 4f5a4e5af64..d6e84bcbc7c 100644 --- a/src/data/biomes.ts +++ b/src/data/biomes.ts @@ -1844,7 +1844,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.BRAWLY, TrainerType.KORRINA, TrainerType.BEA, TrainerType.MAYLENE ], + [BiomePoolTier.BOSS]: [ TrainerType.BRAWLY, TrainerType.MAYLENE, TrainerType.KORRINA, TrainerType.BEA ], [BiomePoolTier.BOSS_RARE]: [], [BiomePoolTier.BOSS_SUPER_RARE]: [], [BiomePoolTier.BOSS_ULTRA_RARE]: [] diff --git a/src/data/enums/battler-tag-type.ts b/src/data/enums/battler-tag-type.ts index 9c740ef4629..4d810b737aa 100644 --- a/src/data/enums/battler-tag-type.ts +++ b/src/data/enums/battler-tag-type.ts @@ -21,6 +21,7 @@ export enum BattlerTagType { CLAMP = "CLAMP", SAND_TOMB = "SAND_TOMB", MAGMA_STORM = "MAGMA_STORM", + SNAP_TRAP = "SNAP_TRAP", THUNDER_CAGE = "THUNDER_CAGE", INFESTATION = "INFESTATION", PROTECTED = "PROTECTED", diff --git a/src/data/move.ts b/src/data/move.ts index f4a98ca8f8e..53244082bd3 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -2301,6 +2301,14 @@ export class WaterSuperEffectTypeMultiplierAttr extends VariableMoveTypeMultipli } } +export class FlyingTypeMultiplierAttr extends VariableMoveTypeMultiplierAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const multiplier = args[0] as Utils.NumberHolder; + multiplier.value *= target.getAttackTypeEffectiveness(Type.FLYING); + return true; + } +} + export class OneHitKOAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const accuracy = args[0] as Utils.NumberHolder; @@ -2511,6 +2519,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { case BattlerTagType.CLAMP: case BattlerTagType.SAND_TOMB: case BattlerTagType.MAGMA_STORM: + case BattlerTagType.SNAP_TRAP: case BattlerTagType.THUNDER_CAGE: case BattlerTagType.INFESTATION: return -3; @@ -3095,7 +3104,7 @@ export class RandomMoveAttr extends OverrideMoveEffectAttr { : [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; user.getMoveQueue().push({ move: moveId, targets: targets, ignorePP: true }); user.scene.unshiftPhase(new MovePhase(user.scene, user, targets, new PokemonMove(moveId, 0, 0, true), true)); - initMoveAnim(moveId).then(() => { + initMoveAnim(user.scene, moveId).then(() => { loadMoveAnimAssets(user.scene, [ moveId ], true) .then(() => resolve(true)); }); @@ -3238,7 +3247,7 @@ export class NaturePowerAttr extends OverrideMoveEffectAttr { user.getMoveQueue().push({ move: moveId, targets: [target.getBattlerIndex()], ignorePP: true }); user.scene.unshiftPhase(new MovePhase(user.scene, user, [target.getBattlerIndex()], new PokemonMove(moveId, 0, 0, true), true)); - initMoveAnim(moveId).then(() => { + initMoveAnim(user.scene, moveId).then(() => { loadMoveAnimAssets(user.scene, [ moveId ], true) .then(() => resolve(true)); }); @@ -4313,6 +4322,7 @@ export function initMoves() { BattlerTagType.CLAMP, BattlerTagType.SAND_TOMB, BattlerTagType.MAGMA_STORM, + BattlerTagType.SNAP_TRAP, BattlerTagType.THUNDER_CAGE, BattlerTagType.SEEDED, BattlerTagType.INFESTATION @@ -5202,7 +5212,8 @@ export function initMoves() { .makesContact(false) .partial(), new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6) - .partial(), + .attr(FlyingTypeMultiplierAttr) + .condition(failOnGravityCondition), new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6) .unimplemented(), new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6) @@ -5784,7 +5795,7 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPD, -1) .makesContact(false), new AttackMove(Moves.SNAP_TRAP, Type.GRASS, MoveCategory.PHYSICAL, 35, 100, 15, 100, 0, 8) - .partial(), + .attr(TrapAttr, BattlerTagType.SNAP_TRAP), new AttackMove(Moves.PYRO_BALL, Type.FIRE, MoveCategory.PHYSICAL, 120, 90, 5, 10, 0, 8) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) @@ -6147,6 +6158,7 @@ export function initMoves() { BattlerTagType.CLAMP, BattlerTagType.SAND_TOMB, BattlerTagType.MAGMA_STORM, + BattlerTagType.SNAP_TRAP, BattlerTagType.THUNDER_CAGE, BattlerTagType.SEEDED, BattlerTagType.INFESTATION diff --git a/src/data/pokemon-evolutions.ts b/src/data/pokemon-evolutions.ts index 68369389066..04e49f17dcf 100644 --- a/src/data/pokemon-evolutions.ts +++ b/src/data/pokemon-evolutions.ts @@ -625,6 +625,10 @@ export const pokemonEvolutions: PokemonEvolutions = { [Species.FINNEON]: [ new SpeciesEvolution(Species.LUMINEON, 31, null, null) ], + [Species.MANTYKE]: [ + new SpeciesEvolution(Species.MANTINE, 1, null, new SpeciesEvolutionCondition(p => !!p.scene.getParty().find(p => p.species.speciesId === Species.REMORAID)), SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.MANTINE, 32, null, new SpeciesEvolutionCondition(p => !!p.scene.gameData.dexData[Species.REMORAID].caughtAttr), SpeciesWildEvolutionDelay.MEDIUM) + ], [Species.SNOVER]: [ new SpeciesEvolution(Species.ABOMASNOW, 40, null, null) ], @@ -1341,9 +1345,6 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GALAR_MR_MIME, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.MIMIC).length > 0 && (p.scene.arena.biomeType === Biome.ICE_CAVE || p.scene.arena.biomeType === Biome.SNOWY_FOREST)), SpeciesWildEvolutionDelay.MEDIUM), new SpeciesEvolution(Species.MR_MIME, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.MIMIC).length > 0), SpeciesWildEvolutionDelay.MEDIUM) ], - [Species.MANTYKE]: [ - new SpeciesEvolution(Species.MANTINE, 1, null, new SpeciesEvolutionCondition(p => !!p.scene.getParty().find(p => p.species.speciesId === Species.REMORAID)), SpeciesWildEvolutionDelay.MEDIUM) - ], [Species.PANSAGE]: [ new SpeciesEvolution(Species.SIMISAGE, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) ], diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index ed55bbf4d74..ceeca373b97 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -394,7 +394,7 @@ export abstract class PokemonSpeciesForm { return new Promise(resolve => { if (variantColorCache.hasOwnProperty(key)) return resolve(); - fetch(`./images/pokemon/variant/${spritePath}.json`).then(res => res.json()).then(c => { + scene.cachedFetch(`./images/pokemon/variant/${spritePath}.json`).then(res => res.json()).then(c => { variantColorCache[key] = c; resolve(); }); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 0989c769f0f..97b228a24ca 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -275,7 +275,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { loadAssets(ignoreOverride: boolean = true): Promise { return new Promise(resolve => { const moveIds = this.getMoveset().map(m => m.getMove().id); - Promise.allSettled(moveIds.map(m => initMoveAnim(m))) + Promise.allSettled(moveIds.map(m => initMoveAnim(this.scene, m))) .then(() => { loadMoveAnimAssets(this.scene, moveIds); this.getSpeciesForm().loadAssets(this.scene, this.getGender() === Gender.FEMALE, this.formIndex, this.shiny, this.variant); @@ -317,7 +317,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (variantSet && variantSet[this.variant] === 1) { if (variantColorCache.hasOwnProperty(key)) return resolve(); - fetch(`./images/pokemon/variant/${battleSpritePath}.json`).then(res => res.json()).then(c => { + this.scene.cachedFetch(`./images/pokemon/variant/${battleSpritePath}.json`).then(res => res.json()).then(c => { variantColorCache[key] = c; resolve(); }); diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 74deaa5fdbd..38f82ff060e 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -19,12 +19,7 @@ export class LoadingScene extends SceneBase { } preload() { - const indexFile = Array.from(document.querySelectorAll('script')).map(s => s.src).find(s => /\/index/.test(s)); - if (indexFile) { - const buildIdMatch = /index\-(.*?)\.js$/.exec(indexFile); - if (buildIdMatch) - this.load['cacheBuster'] = buildIdMatch[1]; - } + this.load['manifest'] = this.game['manifest']; if (!isMobile()) this.load.video('intro_dark', 'images/intro_dark.mp4', true); diff --git a/src/locales/en/command-ui-handler.ts b/src/locales/en/command-ui-handler.ts new file mode 100644 index 00000000000..889c1378b08 --- /dev/null +++ b/src/locales/en/command-ui-handler.ts @@ -0,0 +1,9 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const commandUiHandler: SimpleTranslationEntries = { + "fight": "Fight", + "ball": "Ball", + "pokemon": "Pokémon", + "run": "Run", + "actionMessage": "What will\n{{pokemonName}} do?", +} as const; \ No newline at end of file diff --git a/src/locales/es/command-ui-handler.ts b/src/locales/es/command-ui-handler.ts new file mode 100644 index 00000000000..889c1378b08 --- /dev/null +++ b/src/locales/es/command-ui-handler.ts @@ -0,0 +1,9 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const commandUiHandler: SimpleTranslationEntries = { + "fight": "Fight", + "ball": "Ball", + "pokemon": "Pokémon", + "run": "Run", + "actionMessage": "What will\n{{pokemonName}} do?", +} as const; \ No newline at end of file diff --git a/src/locales/es/pokemon.ts b/src/locales/es/pokemon.ts new file mode 100644 index 00000000000..09be8894eb4 --- /dev/null +++ b/src/locales/es/pokemon.ts @@ -0,0 +1,1086 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const pokemon: SimpleTranslationEntries = { + "bulbasaur": "Bulbasaur", + "ivysaur": "Ivysaur", + "venusaur": "Venusaur", + "charmander": "Charmander", + "charmeleon": "Charmeleon", + "charizard": "Charizard", + "squirtle": "Squirtle", + "wartortle": "Wartortle", + "blastoise": "Blastoise", + "caterpie": "Caterpie", + "metapod": "Metapod", + "butterfree": "Butterfree", + "weedle": "Weedle", + "kakuna": "Kakuna", + "beedrill": "Beedrill", + "pidgey": "Pidgey", + "pidgeotto": "Pidgeotto", + "pidgeot": "Pidgeot", + "rattata": "Rattata", + "raticate": "Raticate", + "spearow": "Spearow", + "fearow": "Fearow", + "ekans": "Ekans", + "arbok": "Arbok", + "pikachu": "Pikachu", + "raichu": "Raichu", + "sandshrew": "Sandshrew", + "sandslash": "Sandslash", + "nidoran_f": "Nidoran♀", + "nidorina": "Nidorina", + "nidoqueen": "Nidoqueen", + "nidoran_m": "Nidoran♂", + "nidorino": "Nidorino", + "nidoking": "Nidoking", + "clefairy": "Clefairy", + "clefable": "Clefable", + "vulpix": "Vulpix", + "ninetales": "Ninetales", + "jigglypuff": "Jigglypuff", + "wigglytuff": "Wigglytuff", + "zubat": "Zubat", + "golbat": "Golbat", + "oddish": "Oddish", + "gloom": "Gloom", + "vileplume": "Vileplume", + "paras": "Paras", + "parasect": "Parasect", + "venonat": "Venonat", + "venomoth": "Venomoth", + "diglett": "Diglett", + "dugtrio": "Dugtrio", + "meowth": "Meowth", + "persian": "Persian", + "psyduck": "Psyduck", + "golduck": "Golduck", + "mankey": "Mankey", + "primeape": "Primeape", + "growlithe": "Growlithe", + "arcanine": "Arcanine", + "poliwag": "Poliwag", + "poliwhirl": "Poliwhirl", + "poliwrath": "Poliwrath", + "abra": "Abra", + "kadabra": "Kadabra", + "alakazam": "Alakazam", + "machop": "Machop", + "machoke": "Machoke", + "machamp": "Machamp", + "bellsprout": "Bellsprout", + "weepinbell": "Weepinbell", + "victreebel": "Victreebel", + "tentacool": "Tentacool", + "tentacruel": "Tentacruel", + "geodude": "Geodude", + "graveler": "Graveler", + "golem": "Golem", + "ponyta": "Ponyta", + "rapidash": "Rapidash", + "slowpoke": "Slowpoke", + "slowbro": "Slowbro", + "magnemite": "Magnemite", + "magneton": "Magneton", + "farfetchd": "Farfetch'd", + "doduo": "Doduo", + "dodrio": "Dodrio", + "seel": "Seel", + "dewgong": "Dewgong", + "grimer": "Grimer", + "muk": "Muk", + "shellder": "Shellder", + "cloyster": "Cloyster", + "gastly": "Gastly", + "haunter": "Haunter", + "gengar": "Gengar", + "onix": "Onix", + "drowzee": "Drowzee", + "hypno": "Hypno", + "krabby": "Krabby", + "kingler": "Kingler", + "voltorb": "Voltorb", + "electrode": "Electrode", + "exeggcute": "Exeggcute", + "exeggutor": "Exeggutor", + "cubone": "Cubone", + "marowak": "Marowak", + "hitmonlee": "Hitmonlee", + "hitmonchan": "Hitmonchan", + "lickitung": "Lickitung", + "koffing": "Koffing", + "weezing": "Weezing", + "rhyhorn": "Rhyhorn", + "rhydon": "Rhydon", + "chansey": "Chansey", + "tangela": "Tangela", + "kangaskhan": "Kangaskhan", + "horsea": "Horsea", + "seadra": "Seadra", + "goldeen": "Goldeen", + "seaking": "Seaking", + "staryu": "Staryu", + "starmie": "Starmie", + "mr_mime": "Mr. Mime", + "scyther": "Scyther", + "jynx": "Jynx", + "electabuzz": "Electabuzz", + "magmar": "Magmar", + "pinsir": "Pinsir", + "tauros": "Tauros", + "magikarp": "Magikarp", + "gyarados": "Gyarados", + "lapras": "Lapras", + "ditto": "Ditto", + "eevee": "Eevee", + "vaporeon": "Vaporeon", + "jolteon": "Jolteon", + "flareon": "Flareon", + "porygon": "Porygon", + "omanyte": "Omanyte", + "omastar": "Omastar", + "kabuto": "Kabuto", + "kabutops": "Kabutops", + "aerodactyl": "Aerodactyl", + "snorlax": "Snorlax", + "articuno": "Articuno", + "zapdos": "Zapdos", + "moltres": "Moltres", + "dratini": "Dratini", + "dragonair": "Dragonair", + "dragonite": "Dragonite", + "mewtwo": "Mewtwo", + "mew": "Mew", + "chikorita": "Chikorita", + "bayleef": "Bayleef", + "meganium": "Meganium", + "cyndaquil": "Cyndaquil", + "quilava": "Quilava", + "typhlosion": "Typhlosion", + "totodile": "Totodile", + "croconaw": "Croconaw", + "feraligatr": "Feraligatr", + "sentret": "Sentret", + "furret": "Furret", + "hoothoot": "Hoothoot", + "noctowl": "Noctowl", + "ledyba": "Ledyba", + "ledian": "Ledian", + "spinarak": "Spinarak", + "ariados": "Ariados", + "crobat": "Crobat", + "chinchou": "Chinchou", + "lanturn": "Lanturn", + "pichu": "Pichu", + "cleffa": "Cleffa", + "igglybuff": "Igglybuff", + "togepi": "Togepi", + "togetic": "Togetic", + "natu": "Natu", + "xatu": "Xatu", + "mareep": "Mareep", + "flaaffy": "Flaaffy", + "ampharos": "Ampharos", + "bellossom": "Bellossom", + "marill": "Marill", + "azumarill": "Azumarill", + "sudowoodo": "Sudowoodo", + "politoed": "Politoed", + "hoppip": "Hoppip", + "skiploom": "Skiploom", + "jumpluff": "Jumpluff", + "aipom": "Aipom", + "sunkern": "Sunkern", + "sunflora": "Sunflora", + "yanma": "Yanma", + "wooper": "Wooper", + "quagsire": "Quagsire", + "espeon": "Espeon", + "umbreon": "Umbreon", + "murkrow": "Murkrow", + "slowking": "Slowking", + "misdreavus": "Misdreavus", + "unown": "Unown", + "wobbuffet": "Wobbuffet", + "girafarig": "Girafarig", + "pineco": "Pineco", + "forretress": "Forretress", + "dunsparce": "Dunsparce", + "gligar": "Gligar", + "steelix": "Steelix", + "snubbull": "Snubbull", + "granbull": "Granbull", + "qwilfish": "Qwilfish", + "scizor": "Scizor", + "shuckle": "Shuckle", + "heracross": "Heracross", + "sneasel": "Sneasel", + "teddiursa": "Teddiursa", + "ursaring": "Ursaring", + "slugma": "Slugma", + "magcargo": "Magcargo", + "swinub": "Swinub", + "piloswine": "Piloswine", + "corsola": "Corsola", + "remoraid": "Remoraid", + "octillery": "Octillery", + "delibird": "Delibird", + "mantine": "Mantine", + "skarmory": "Skarmory", + "houndour": "Houndour", + "houndoom": "Houndoom", + "kingdra": "Kingdra", + "phanpy": "Phanpy", + "donphan": "Donphan", + "porygon2": "Porygon2", + "stantler": "Stantler", + "smeargle": "Smeargle", + "tyrogue": "Tyrogue", + "hitmontop": "Hitmontop", + "smoochum": "Smoochum", + "elekid": "Elekid", + "magby": "Magby", + "miltank": "Miltank", + "blissey": "Blissey", + "raikou": "Raikou", + "entei": "Entei", + "suicune": "Suicune", + "larvitar": "Larvitar", + "pupitar": "Pupitar", + "tyranitar": "Tyranitar", + "lugia": "Lugia", + "ho_oh": "Ho-Oh", + "celebi": "Celebi", + "treecko": "Treecko", + "grovyle": "Grovyle", + "sceptile": "Sceptile", + "torchic": "Torchic", + "combusken": "Combusken", + "blaziken": "Blaziken", + "mudkip": "Mudkip", + "marshtomp": "Marshtomp", + "swampert": "Swampert", + "poochyena": "Poochyena", + "mightyena": "Mightyena", + "zigzagoon": "Zigzagoon", + "linoone": "Linoone", + "wurmple": "Wurmple", + "silcoon": "Silcoon", + "beautifly": "Beautifly", + "cascoon": "Cascoon", + "dustox": "Dustox", + "lotad": "Lotad", + "lombre": "Lombre", + "ludicolo": "Ludicolo", + "seedot": "Seedot", + "nuzleaf": "Nuzleaf", + "shiftry": "Shiftry", + "taillow": "Taillow", + "swellow": "Swellow", + "wingull": "Wingull", + "pelipper": "Pelipper", + "ralts": "Ralts", + "kirlia": "Kirlia", + "gardevoir": "Gardevoir", + "surskit": "Surskit", + "masquerain": "Masquerain", + "shroomish": "Shroomish", + "breloom": "Breloom", + "slakoth": "Slakoth", + "vigoroth": "Vigoroth", + "slaking": "Slaking", + "nincada": "Nincada", + "ninjask": "Ninjask", + "shedinja": "Shedinja", + "whismur": "Whismur", + "loudred": "Loudred", + "exploud": "Exploud", + "makuhita": "Makuhita", + "hariyama": "Hariyama", + "azurill": "Azurill", + "nosepass": "Nosepass", + "skitty": "Skitty", + "delcatty": "Delcatty", + "sableye": "Sableye", + "mawile": "Mawile", + "aron": "Aron", + "lairon": "Lairon", + "aggron": "Aggron", + "meditite": "Meditite", + "medicham": "Medicham", + "electrike": "Electrike", + "manectric": "Manectric", + "plusle": "Plusle", + "minun": "Minun", + "volbeat": "Volbeat", + "illumise": "Illumise", + "roselia": "Roselia", + "gulpin": "Gulpin", + "swalot": "Swalot", + "carvanha": "Carvanha", + "sharpedo": "Sharpedo", + "wailmer": "Wailmer", + "wailord": "Wailord", + "numel": "Numel", + "camerupt": "Camerupt", + "torkoal": "Torkoal", + "spoink": "Spoink", + "grumpig": "Grumpig", + "spinda": "Spinda", + "trapinch": "Trapinch", + "vibrava": "Vibrava", + "flygon": "Flygon", + "cacnea": "Cacnea", + "cacturne": "Cacturne", + "swablu": "Swablu", + "altaria": "Altaria", + "zangoose": "Zangoose", + "seviper": "Seviper", + "lunatone": "Lunatone", + "solrock": "Solrock", + "barboach": "Barboach", + "whiscash": "Whiscash", + "corphish": "Corphish", + "crawdaunt": "Crawdaunt", + "baltoy": "Baltoy", + "claydol": "Claydol", + "lileep": "Lileep", + "cradily": "Cradily", + "anorith": "Anorith", + "armaldo": "Armaldo", + "feebas": "Feebas", + "milotic": "Milotic", + "castform": "Castform", + "kecleon": "Kecleon", + "shuppet": "Shuppet", + "banette": "Banette", + "duskull": "Duskull", + "dusclops": "Dusclops", + "tropius": "Tropius", + "chimecho": "Chimecho", + "absol": "Absol", + "wynaut": "Wynaut", + "snorunt": "Snorunt", + "glalie": "Glalie", + "spheal": "Spheal", + "sealeo": "Sealeo", + "walrein": "Walrein", + "clamperl": "Clamperl", + "huntail": "Huntail", + "gorebyss": "Gorebyss", + "relicanth": "Relicanth", + "luvdisc": "Luvdisc", + "bagon": "Bagon", + "shelgon": "Shelgon", + "salamence": "Salamence", + "beldum": "Beldum", + "metang": "Metang", + "metagross": "Metagross", + "regirock": "Regirock", + "regice": "Regice", + "registeel": "Registeel", + "latias": "Latias", + "latios": "Latios", + "kyogre": "Kyogre", + "groudon": "Groudon", + "rayquaza": "Rayquaza", + "jirachi": "Jirachi", + "deoxys": "Deoxys", + "turtwig": "Turtwig", + "grotle": "Grotle", + "torterra": "Torterra", + "chimchar": "Chimchar", + "monferno": "Monferno", + "infernape": "Infernape", + "piplup": "Piplup", + "prinplup": "Prinplup", + "empoleon": "Empoleon", + "starly": "Starly", + "staravia": "Staravia", + "staraptor": "Staraptor", + "bidoof": "Bidoof", + "bibarel": "Bibarel", + "kricketot": "Kricketot", + "kricketune": "Kricketune", + "shinx": "Shinx", + "luxio": "Luxio", + "luxray": "Luxray", + "budew": "Budew", + "roserade": "Roserade", + "cranidos": "Cranidos", + "rampardos": "Rampardos", + "shieldon": "Shieldon", + "bastiodon": "Bastiodon", + "burmy": "Burmy", + "wormadam": "Wormadam", + "mothim": "Mothim", + "combee": "Combee", + "vespiquen": "Vespiquen", + "pachirisu": "Pachirisu", + "buizel": "Buizel", + "floatzel": "Floatzel", + "cherubi": "Cherubi", + "cherrim": "Cherrim", + "shellos": "Shellos", + "gastrodon": "Gastrodon", + "ambipom": "Ambipom", + "drifloon": "Drifloon", + "drifblim": "Drifblim", + "buneary": "Buneary", + "lopunny": "Lopunny", + "mismagius": "Mismagius", + "honchkrow": "Honchkrow", + "glameow": "Glameow", + "purugly": "Purugly", + "chingling": "Chingling", + "stunky": "Stunky", + "skuntank": "Skuntank", + "bronzor": "Bronzor", + "bronzong": "Bronzong", + "bonsly": "Bonsly", + "mime_jr": "Mime Jr.", + "happiny": "Happiny", + "chatot": "Chatot", + "spiritomb": "Spiritomb", + "gible": "Gible", + "gabite": "Gabite", + "garchomp": "Garchomp", + "munchlax": "Munchlax", + "riolu": "Riolu", + "lucario": "Lucario", + "hippopotas": "Hippopotas", + "hippowdon": "Hippowdon", + "skorupi": "Skorupi", + "drapion": "Drapion", + "croagunk": "Croagunk", + "toxicroak": "Toxicroak", + "carnivine": "Carnivine", + "finneon": "Finneon", + "lumineon": "Lumineon", + "mantyke": "Mantyke", + "snover": "Snover", + "abomasnow": "Abomasnow", + "weavile": "Weavile", + "magnezone": "Magnezone", + "lickilicky": "Lickilicky", + "rhyperior": "Rhyperior", + "tangrowth": "Tangrowth", + "electivire": "Electivire", + "magmortar": "Magmortar", + "togekiss": "Togekiss", + "yanmega": "Yanmega", + "leafeon": "Leafeon", + "glaceon": "Glaceon", + "gliscor": "Gliscor", + "mamoswine": "Mamoswine", + "porygon_z": "Porygon-Z", + "gallade": "Gallade", + "probopass": "Probopass", + "dusknoir": "Dusknoir", + "froslass": "Froslass", + "rotom": "Rotom", + "uxie": "Uxie", + "mesprit": "Mesprit", + "azelf": "Azelf", + "dialga": "Dialga", + "palkia": "Palkia", + "heatran": "Heatran", + "regigigas": "Regigigas", + "giratina": "Giratina", + "cresselia": "Cresselia", + "phione": "Phione", + "manaphy": "Manaphy", + "darkrai": "Darkrai", + "shaymin": "Shaymin", + "arceus": "Arceus", + "victini": "Victini", + "snivy": "Snivy", + "servine": "Servine", + "serperior": "Serperior", + "tepig": "Tepig", + "pignite": "Pignite", + "emboar": "Emboar", + "oshawott": "Oshawott", + "dewott": "Dewott", + "samurott": "Samurott", + "patrat": "Patrat", + "watchog": "Watchog", + "lillipup": "Lillipup", + "herdier": "Herdier", + "stoutland": "Stoutland", + "purrloin": "Purrloin", + "liepard": "Liepard", + "pansage": "Pansage", + "simisage": "Simisage", + "pansear": "Pansear", + "simisear": "Simisear", + "panpour": "Panpour", + "simipour": "Simipour", + "munna": "Munna", + "musharna": "Musharna", + "pidove": "Pidove", + "tranquill": "Tranquill", + "unfezant": "Unfezant", + "blitzle": "Blitzle", + "zebstrika": "Zebstrika", + "roggenrola": "Roggenrola", + "boldore": "Boldore", + "gigalith": "Gigalith", + "woobat": "Woobat", + "swoobat": "Swoobat", + "drilbur": "Drilbur", + "excadrill": "Excadrill", + "audino": "Audino", + "timburr": "Timburr", + "gurdurr": "Gurdurr", + "conkeldurr": "Conkeldurr", + "tympole": "Tympole", + "palpitoad": "Palpitoad", + "seismitoad": "Seismitoad", + "throh": "Throh", + "sawk": "Sawk", + "sewaddle": "Sewaddle", + "swadloon": "Swadloon", + "leavanny": "Leavanny", + "venipede": "Venipede", + "whirlipede": "Whirlipede", + "scolipede": "Scolipede", + "cottonee": "Cottonee", + "whimsicott": "Whimsicott", + "petilil": "Petilil", + "lilligant": "Lilligant", + "basculin": "Basculin", + "sandile": "Sandile", + "krokorok": "Krokorok", + "krookodile": "Krookodile", + "darumaka": "Darumaka", + "darmanitan": "Darmanitan", + "maractus": "Maractus", + "dwebble": "Dwebble", + "crustle": "Crustle", + "scraggy": "Scraggy", + "scrafty": "Scrafty", + "sigilyph": "Sigilyph", + "yamask": "Yamask", + "cofagrigus": "Cofagrigus", + "tirtouga": "Tirtouga", + "carracosta": "Carracosta", + "archen": "Archen", + "archeops": "Archeops", + "trubbish": "Trubbish", + "garbodor": "Garbodor", + "zorua": "Zorua", + "zoroark": "Zoroark", + "minccino": "Minccino", + "cinccino": "Cinccino", + "gothita": "Gothita", + "gothorita": "Gothorita", + "gothitelle": "Gothitelle", + "solosis": "Solosis", + "duosion": "Duosion", + "reuniclus": "Reuniclus", + "ducklett": "Ducklett", + "swanna": "Swanna", + "vanillite": "Vanillite", + "vanillish": "Vanillish", + "vanilluxe": "Vanilluxe", + "deerling": "Deerling", + "sawsbuck": "Sawsbuck", + "emolga": "Emolga", + "karrablast": "Karrablast", + "escavalier": "Escavalier", + "foongus": "Foongus", + "amoonguss": "Amoonguss", + "frillish": "Frillish", + "jellicent": "Jellicent", + "alomomola": "Alomomola", + "joltik": "Joltik", + "galvantula": "Galvantula", + "ferroseed": "Ferroseed", + "ferrothorn": "Ferrothorn", + "klink": "Klink", + "klang": "Klang", + "klinklang": "Klinklang", + "tynamo": "Tynamo", + "eelektrik": "Eelektrik", + "eelektross": "Eelektross", + "elgyem": "Elgyem", + "beheeyem": "Beheeyem", + "litwick": "Litwick", + "lampent": "Lampent", + "chandelure": "Chandelure", + "axew": "Axew", + "fraxure": "Fraxure", + "haxorus": "Haxorus", + "cubchoo": "Cubchoo", + "beartic": "Beartic", + "cryogonal": "Cryogonal", + "shelmet": "Shelmet", + "accelgor": "Accelgor", + "stunfisk": "Stunfisk", + "mienfoo": "Mienfoo", + "mienshao": "Mienshao", + "druddigon": "Druddigon", + "golett": "Golett", + "golurk": "Golurk", + "pawniard": "Pawniard", + "bisharp": "Bisharp", + "bouffalant": "Bouffalant", + "rufflet": "Rufflet", + "braviary": "Braviary", + "vullaby": "Vullaby", + "mandibuzz": "Mandibuzz", + "heatmor": "Heatmor", + "durant": "Durant", + "deino": "Deino", + "zweilous": "Zweilous", + "hydreigon": "Hydreigon", + "larvesta": "Larvesta", + "volcarona": "Volcarona", + "cobalion": "Cobalion", + "terrakion": "Terrakion", + "virizion": "Virizion", + "tornadus": "Tornadus", + "thundurus": "Thundurus", + "reshiram": "Reshiram", + "zekrom": "Zekrom", + "landorus": "Landorus", + "kyurem": "Kyurem", + "keldeo": "Keldeo", + "meloetta": "Meloetta", + "genesect": "Genesect", + "chespin": "Chespin", + "quilladin": "Quilladin", + "chesnaught": "Chesnaught", + "fennekin": "Fennekin", + "braixen": "Braixen", + "delphox": "Delphox", + "froakie": "Froakie", + "frogadier": "Frogadier", + "greninja": "Greninja", + "bunnelby": "Bunnelby", + "diggersby": "Diggersby", + "fletchling": "Fletchling", + "fletchinder": "Fletchinder", + "talonflame": "Talonflame", + "scatterbug": "Scatterbug", + "spewpa": "Spewpa", + "vivillon": "Vivillon", + "litleo": "Litleo", + "pyroar": "Pyroar", + "flabebe": "Flabébé", + "floette": "Floette", + "florges": "Florges", + "skiddo": "Skiddo", + "gogoat": "Gogoat", + "pancham": "Pancham", + "pangoro": "Pangoro", + "furfrou": "Furfrou", + "espurr": "Espurr", + "meowstic": "Meowstic", + "honedge": "Honedge", + "doublade": "Doublade", + "aegislash": "Aegislash", + "spritzee": "Spritzee", + "aromatisse": "Aromatisse", + "swirlix": "Swirlix", + "slurpuff": "Slurpuff", + "inkay": "Inkay", + "malamar": "Malamar", + "binacle": "Binacle", + "barbaracle": "Barbaracle", + "skrelp": "Skrelp", + "dragalge": "Dragalge", + "clauncher": "Clauncher", + "clawitzer": "Clawitzer", + "helioptile": "Helioptile", + "heliolisk": "Heliolisk", + "tyrunt": "Tyrunt", + "tyrantrum": "Tyrantrum", + "amaura": "Amaura", + "aurorus": "Aurorus", + "sylveon": "Sylveon", + "hawlucha": "Hawlucha", + "dedenne": "Dedenne", + "carbink": "Carbink", + "goomy": "Goomy", + "sliggoo": "Sliggoo", + "goodra": "Goodra", + "klefki": "Klefki", + "phantump": "Phantump", + "trevenant": "Trevenant", + "pumpkaboo": "Pumpkaboo", + "gourgeist": "Gourgeist", + "bergmite": "Bergmite", + "avalugg": "Avalugg", + "noibat": "Noibat", + "noivern": "Noivern", + "xerneas": "Xerneas", + "yveltal": "Yveltal", + "zygarde": "Zygarde", + "diancie": "Diancie", + "hoopa": "Hoopa", + "volcanion": "Volcanion", + "rowlet": "Rowlet", + "dartrix": "Dartrix", + "decidueye": "Decidueye", + "litten": "Litten", + "torracat": "Torracat", + "incineroar": "Incineroar", + "popplio": "Popplio", + "brionne": "Brionne", + "primarina": "Primarina", + "pikipek": "Pikipek", + "trumbeak": "Trumbeak", + "toucannon": "Toucannon", + "yungoos": "Yungoos", + "gumshoos": "Gumshoos", + "grubbin": "Grubbin", + "charjabug": "Charjabug", + "vikavolt": "Vikavolt", + "crabrawler": "Crabrawler", + "crabominable": "Crabominable", + "oricorio": "Oricorio", + "cutiefly": "Cutiefly", + "ribombee": "Ribombee", + "rockruff": "Rockruff", + "lycanroc": "Lycanroc", + "wishiwashi": "Wishiwashi", + "mareanie": "Mareanie", + "toxapex": "Toxapex", + "mudbray": "Mudbray", + "mudsdale": "Mudsdale", + "dewpider": "Dewpider", + "araquanid": "Araquanid", + "fomantis": "Fomantis", + "lurantis": "Lurantis", + "morelull": "Morelull", + "shiinotic": "Shiinotic", + "salandit": "Salandit", + "salazzle": "Salazzle", + "stufful": "Stufful", + "bewear": "Bewear", + "bounsweet": "Bounsweet", + "steenee": "Steenee", + "tsareena": "Tsareena", + "comfey": "Comfey", + "oranguru": "Oranguru", + "passimian": "Passimian", + "wimpod": "Wimpod", + "golisopod": "Golisopod", + "sandygast": "Sandygast", + "palossand": "Palossand", + "pyukumuku": "Pyukumuku", + "type_null": "Type: Null", + "silvally": "Silvally", + "minior": "Minior", + "komala": "Komala", + "turtonator": "Turtonator", + "togedemaru": "Togedemaru", + "mimikyu": "Mimikyu", + "bruxish": "Bruxish", + "drampa": "Drampa", + "dhelmise": "Dhelmise", + "jangmo_o": "Jangmo-o", + "hakamo_o": "Hakamo-o", + "kommo_o": "Kommo-o", + "tapu_koko": "Tapu Koko", + "tapu_lele": "Tapu Lele", + "tapu_bulu": "Tapu Bulu", + "tapu_fini": "Tapu Fini", + "cosmog": "Cosmog", + "cosmoem": "Cosmoem", + "solgaleo": "Solgaleo", + "lunala": "Lunala", + "nihilego": "Nihilego", + "buzzwole": "Buzzwole", + "pheromosa": "Pheromosa", + "xurkitree": "Xurkitree", + "celesteela": "Celesteela", + "kartana": "Kartana", + "guzzlord": "Guzzlord", + "necrozma": "Necrozma", + "magearna": "Magearna", + "marshadow": "Marshadow", + "poipole": "Poipole", + "naganadel": "Naganadel", + "stakataka": "Stakataka", + "blacephalon": "Blacephalon", + "zeraora": "Zeraora", + "meltan": "Meltan", + "melmetal": "Melmetal", + "grookey": "Grookey", + "thwackey": "Thwackey", + "rillaboom": "Rillaboom", + "scorbunny": "Scorbunny", + "raboot": "Raboot", + "cinderace": "Cinderace", + "sobble": "Sobble", + "drizzile": "Drizzile", + "inteleon": "Inteleon", + "skwovet": "Skwovet", + "greedent": "Greedent", + "rookidee": "Rookidee", + "corvisquire": "Corvisquire", + "corviknight": "Corviknight", + "blipbug": "Blipbug", + "dottler": "Dottler", + "orbeetle": "Orbeetle", + "nickit": "Nickit", + "thievul": "Thievul", + "gossifleur": "Gossifleur", + "eldegoss": "Eldegoss", + "wooloo": "Wooloo", + "dubwool": "Dubwool", + "chewtle": "Chewtle", + "drednaw": "Drednaw", + "yamper": "Yamper", + "boltund": "Boltund", + "rolycoly": "Rolycoly", + "carkol": "Carkol", + "coalossal": "Coalossal", + "applin": "Applin", + "flapple": "Flapple", + "appletun": "Appletun", + "silicobra": "Silicobra", + "sandaconda": "Sandaconda", + "cramorant": "Cramorant", + "arrokuda": "Arrokuda", + "barraskewda": "Barraskewda", + "toxel": "Toxel", + "toxtricity": "Toxtricity", + "sizzlipede": "Sizzlipede", + "centiskorch": "Centiskorch", + "clobbopus": "Clobbopus", + "grapploct": "Grapploct", + "sinistea": "Sinistea", + "polteageist": "Polteageist", + "hatenna": "Hatenna", + "hattrem": "Hattrem", + "hatterene": "Hatterene", + "impidimp": "Impidimp", + "morgrem": "Morgrem", + "grimmsnarl": "Grimmsnarl", + "obstagoon": "Obstagoon", + "perrserker": "Perrserker", + "cursola": "Cursola", + "sirfetchd": "Sirfetch'd", + "mr_rime": "Mr. Rime", + "runerigus": "Runerigus", + "milcery": "Milcery", + "alcremie": "Alcremie", + "falinks": "Falinks", + "pincurchin": "Pincurchin", + "snom": "Snom", + "frosmoth": "Frosmoth", + "stonjourner": "Stonjourner", + "eiscue": "Eiscue", + "indeedee": "Indeedee", + "morpeko": "Morpeko", + "cufant": "Cufant", + "copperajah": "Copperajah", + "dracozolt": "Dracozolt", + "arctozolt": "Arctozolt", + "dracovish": "Dracovish", + "arctovish": "Arctovish", + "duraludon": "Duraludon", + "dreepy": "Dreepy", + "drakloak": "Drakloak", + "dragapult": "Dragapult", + "zacian": "Zacian", + "zamazenta": "Zamazenta", + "eternatus": "Eternatus", + "kubfu": "Kubfu", + "urshifu": "Urshifu", + "zarude": "Zarude", + "regieleki": "Regieleki", + "regidrago": "Regidrago", + "glastrier": "Glastrier", + "spectrier": "Spectrier", + "calyrex": "Calyrex", + "wyrdeer": "Wyrdeer", + "kleavor": "Kleavor", + "ursaluna": "Ursaluna", + "basculegion": "Basculegion", + "sneasler": "Sneasler", + "overqwil": "Overqwil", + "enamorus": "Enamorus", + "sprigatito": "Sprigatito", + "floragato": "Floragato", + "meowscarada": "Meowscarada", + "fuecoco": "Fuecoco", + "crocalor": "Crocalor", + "skeledirge": "Skeledirge", + "quaxly": "Quaxly", + "quaxwell": "Quaxwell", + "quaquaval": "Quaquaval", + "lechonk": "Lechonk", + "oinkologne": "Oinkologne", + "tarountula": "Tarountula", + "spidops": "Spidops", + "nymble": "Nymble", + "lokix": "Lokix", + "pawmi": "Pawmi", + "pawmo": "Pawmo", + "pawmot": "Pawmot", + "tandemaus": "Tandemaus", + "maushold": "Maushold", + "fidough": "Fidough", + "dachsbun": "Dachsbun", + "smoliv": "Smoliv", + "dolliv": "Dolliv", + "arboliva": "Arboliva", + "squawkabilly": "Squawkabilly", + "nacli": "Nacli", + "naclstack": "Naclstack", + "garganacl": "Garganacl", + "charcadet": "Charcadet", + "armarouge": "Armarouge", + "ceruledge": "Ceruledge", + "tadbulb": "Tadbulb", + "bellibolt": "Bellibolt", + "wattrel": "Wattrel", + "kilowattrel": "Kilowattrel", + "maschiff": "Maschiff", + "mabosstiff": "Mabosstiff", + "shroodle": "Shroodle", + "grafaiai": "Grafaiai", + "bramblin": "Bramblin", + "brambleghast": "Brambleghast", + "toedscool": "Toedscool", + "toedscruel": "Toedscruel", + "klawf": "Klawf", + "capsakid": "Capsakid", + "scovillain": "Scovillain", + "rellor": "Rellor", + "rabsca": "Rabsca", + "flittle": "Flittle", + "espathra": "Espathra", + "tinkatink": "Tinkatink", + "tinkatuff": "Tinkatuff", + "tinkaton": "Tinkaton", + "wiglett": "Wiglett", + "wugtrio": "Wugtrio", + "bombirdier": "Bombirdier", + "finizen": "Finizen", + "palafin": "Palafin", + "varoom": "Varoom", + "revavroom": "Revavroom", + "cyclizar": "Cyclizar", + "orthworm": "Orthworm", + "glimmet": "Glimmet", + "glimmora": "Glimmora", + "greavard": "Greavard", + "houndstone": "Houndstone", + "flamigo": "Flamigo", + "cetoddle": "Cetoddle", + "cetitan": "Cetitan", + "veluza": "Veluza", + "dondozo": "Dondozo", + "tatsugiri": "Tatsugiri", + "annihilape": "Annihilape", + "clodsire": "Clodsire", + "farigiraf": "Farigiraf", + "dudunsparce": "Dudunsparce", + "kingambit": "Kingambit", + "great_tusk": "Great Tusk", + "scream_tail": "Scream Tail", + "brute_bonnet": "Brute Bonnet", + "flutter_mane": "Flutter Mane", + "slither_wing": "Slither Wing", + "sandy_shocks": "Sandy Shocks", + "iron_treads": "Iron Treads", + "iron_bundle": "Iron Bundle", + "iron_hands": "Iron Hands", + "iron_jugulis": "Iron Jugulis", + "iron_moth": "Iron Moth", + "iron_thorns": "Iron Thorns", + "frigibax": "Frigibax", + "arctibax": "Arctibax", + "baxcalibur": "Baxcalibur", + "gimmighoul": "Gimmighoul", + "gholdengo": "Gholdengo", + "wo_chien": "Wo-Chien", + "chien_pao": "Chien-Pao", + "ting_lu": "Ting-Lu", + "chi_yu": "Chi-Yu", + "roaring_moon": "Roaring Moon", + "iron_valiant": "Iron Valiant", + "koraidon": "Koraidon", + "miraidon": "Miraidon", + "walking_wake": "Walking Wake", + "iron_leaves": "Iron Leaves", + "dipplin": "Dipplin", + "poltchageist": "Poltchageist", + "sinistcha": "Sinistcha", + "okidogi": "Okidogi", + "munkidori": "Munkidori", + "fezandipiti": "Fezandipiti", + "ogerpon": "Ogerpon", + "archaludon": "Archaludon", + "hydrapple": "Hydrapple", + "gouging_fire": "Gouging Fire", + "raging_bolt": "Raging Bolt", + "iron_boulder": "Iron Boulder", + "iron_crown": "Iron Crown", + "terapagos": "Terapagos", + "pecharunt": "Pecharunt", + "alola_rattata": "Rattata", + "alola_raticate": "Raticate", + "alola_raichu": "Raichu", + "alola_sandshrew": "Sandshrew", + "alola_sandslash": "Sandslash", + "alola_vulpix": "Vulpix", + "alola_ninetales": "Ninetales", + "alola_diglett": "Diglett", + "alola_dugtrio": "Dugtrio", + "alola_meowth": "Meowth", + "alola_persian": "Persian", + "alola_geodude": "Geodude", + "alola_graveler": "Graveler", + "alola_golem": "Golem", + "alola_grimer": "Grimer", + "alola_muk": "Muk", + "alola_exeggutor": "Exeggutor", + "alola_marowak": "Marowak", + "eternal_floette": "Floette", + "galar_meowth": "Meowth", + "galar_ponyta": "Ponyta", + "galar_rapidash": "Rapidash", + "galar_slowpoke": "Slowpoke", + "galar_slowbro": "Slowbro", + "galar_farfetchd": "Farfetch'd", + "galar_weezing": "Weezing", + "galar_mr_mime": "Mr. Mime", + "galar_articuno": "Articuno", + "galar_zapdos": "Zapdos", + "galar_moltres": "Moltres", + "galar_slowking": "Slowking", + "galar_corsola": "Corsola", + "galar_zigzagoon": "Zigzagoon", + "galar_linoone": "Linoone", + "galar_darumaka": "Darumaka", + "galar_darmanitan": "Darmanitan", + "galar_yamask": "Yamask", + "galar_stunfisk": "Stunfisk", + "hisui_growlithe": "Growlithe", + "hisui_arcanine": "Arcanine", + "hisui_voltorb": "Voltorb", + "hisui_electrode": "Electrode", + "hisui_typhlosion": "Typhlosion", + "hisui_qwilfish": "Qwilfish", + "hisui_sneasel": "Sneasel", + "hisui_samurott": "Samurott", + "hisui_lilligant": "Lilligant", + "hisui_zorua": "Zorua", + "hisui_zoroark": "Zoroark", + "hisui_braviary": "Braviary", + "hisui_sliggoo": "Sliggoo", + "hisui_goodra": "Goodra", + "hisui_avalugg": "Avalugg", + "hisui_decidueye": "Decidueye", + "paldea_tauros": "Tauros", + "paldea_wooper": "Wooper", + "bloodmoon_ursaluna": "Ursaluna", +} as const; \ No newline at end of file diff --git a/src/locales/fr/command-ui-handler.ts b/src/locales/fr/command-ui-handler.ts new file mode 100644 index 00000000000..3df0ba58587 --- /dev/null +++ b/src/locales/fr/command-ui-handler.ts @@ -0,0 +1,9 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const commandUiHandler: SimpleTranslationEntries = { + "fight": "Attaque", + "ball": "Ball", + "pokemon": "Pokémon", + "run": "Fuite", + "actionMessage": "Que doit faire\n{{pokemonName}}?", +} as const; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 13aa5076ff4..6a00693fc71 100644 --- a/src/main.ts +++ b/src/main.ts @@ -76,7 +76,21 @@ Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative document.fonts.load('16px emerald').then(() => document.fonts.load('10px pkmnems')); -const game = new Phaser.Game(config); -game.sound.pauseOnBlur = false; +let game; + +const startGame = () => { + game = new Phaser.Game(config); + game.sound.pauseOnBlur = false; +}; + +fetch('/manifest.json') + .then(res => res.json()) + .then(jsonResponse => { + startGame(); + game['manifest'] = jsonResponse.manifest; + }).catch(() => { + // Manifest not found (likely local build) + startGame(); + }); export default game; diff --git a/src/phases.ts b/src/phases.ts index 62e53d79717..e6e72b355ac 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -2613,7 +2613,7 @@ export class MoveAnimTestPhase extends BattlePhase { } else if (player) console.log(Moves[moveId]); - initMoveAnim(moveId).then(() => { + initMoveAnim(this.scene, moveId).then(() => { loadMoveAnimAssets(this.scene, [ moveId ], true) .then(() => { new MoveAnim(moveId, player ? this.scene.getPlayerPokemon() : this.scene.getEnemyPokemon(), (player !== (allMoves[moveId] instanceof SelfStatusMove) ? this.scene.getEnemyPokemon() : this.scene.getPlayerPokemon()).getBattlerIndex()).play(this.scene, () => { @@ -2665,11 +2665,20 @@ export class StatChangePhase extends PokemonPhase { start() { const pokemon = this.getPokemon(); - if (!pokemon.isActive(true)) - return this.end(); + let random = false; const allStats = Utils.getEnumValues(BattleStat); - const filteredStats = this.stats.map(s => s !== BattleStat.RAND ? s : allStats[pokemon.randSeedInt(BattleStat.SPD + 1)]).filter(stat => { + if (this.stats.length === 1 && this.stats[0] === BattleStat.RAND) { + this.stats[0] = this.getRandomStat(); + random = true; + } + + this.aggregateStatChanges(random); + + if (!pokemon.isActive(true)) + return this.end(); + + const filteredStats = this.stats.map(s => s !== BattleStat.RAND ? s : this.getRandomStat()).filter(stat => { const cancelled = new Utils.BooleanHolder(false); if (!this.selfTarget && this.levels < 0) @@ -2750,11 +2759,62 @@ export class StatChangePhase extends PokemonPhase { end(); } + getRandomStat(): BattleStat { + const allStats = Utils.getEnumValues(BattleStat); + return allStats[this.getPokemon().randSeedInt(BattleStat.SPD + 1)]; + } + + aggregateStatChanges(random: boolean = false): void { + const isAccEva = [ BattleStat.ACC, BattleStat.EVA ].some(s => this.stats.includes(s)); + let existingPhase: StatChangePhase; + if (this.stats.length === 1) { + while ((existingPhase = (this.scene.findPhase(p => p instanceof StatChangePhase && p.battlerIndex === this.battlerIndex && p.stats.length === 1 + && (p.stats[0] === this.stats[0] || (random && p.stats[0] === BattleStat.RAND)) + && p.selfTarget === this.selfTarget && p.showMessage === this.showMessage && p.ignoreAbilities === this.ignoreAbilities) as StatChangePhase))) { + if (existingPhase.stats[0] === BattleStat.RAND) { + existingPhase.stats[0] = this.getRandomStat(); + if (existingPhase.stats[0] !== this.stats[0]) + continue; + } + this.levels += existingPhase.levels; + + if (!this.scene.tryRemovePhase(p => p === existingPhase)) + break; + } + } + while ((existingPhase = (this.scene.findPhase(p => p instanceof StatChangePhase && p.battlerIndex === this.battlerIndex && p.selfTarget === this.selfTarget + && ([ BattleStat.ACC, BattleStat.EVA ].some(s => p.stats.includes(s)) === isAccEva) + && p.levels === this.levels && p.showMessage === this.showMessage && p.ignoreAbilities === this.ignoreAbilities) as StatChangePhase))) { + this.stats.push(...existingPhase.stats); + if (!this.scene.tryRemovePhase(p => p === existingPhase)) + break; + } + } + getStatChangeMessages(stats: BattleStat[], levels: integer, relLevels: integer[]): string[] { const messages: string[] = []; - - for (let s = 0; s < stats.length; s++) - messages.push(getPokemonMessage(this.getPokemon(), `'s ${getBattleStatName(stats[s])} ${getBattleStatLevelChangeDescription(Math.abs(relLevels[s]), levels >= 1)}!`)); + + const relLevelStatIndexes = {}; + for (let rl = 0; rl < relLevels.length; rl++) { + const relLevel = relLevels[rl]; + if (!relLevelStatIndexes[relLevel]) + relLevelStatIndexes[relLevel] = []; + relLevelStatIndexes[relLevel].push(rl); + } + + Object.keys(relLevelStatIndexes).forEach(rl => { + const relLevelStats = stats.filter((_, i) => relLevelStatIndexes[rl].includes(i)); + let statsFragment = ''; + + if (relLevelStats.length > 1) { + statsFragment = relLevelStats.length >= 5 + ? 'stats' + : `${relLevelStats.slice(0, -1).map(s => getBattleStatName(s)).join(', ')}, and ${getBattleStatName(relLevelStats[relLevelStats.length - 1])}`; + } else + statsFragment = getBattleStatName(relLevelStats[0]); + messages.push(getPokemonMessage(this.getPokemon(), `'s ${statsFragment} ${getBattleStatLevelChangeDescription(Math.abs(parseInt(rl)), levels >= 1)}!`)); + }); + return messages; } } @@ -3675,7 +3735,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { if (emptyMoveIndex > -1) { pokemon.setMove(emptyMoveIndex, this.moveId); - initMoveAnim(this.moveId).then(() => { + initMoveAnim(this.scene, this.moveId).then(() => { loadMoveAnimAssets(this.scene, [ this.moveId ], true) .then(() => { this.scene.ui.setMode(messageMode).then(() => { diff --git a/src/plugins/cache-busted-loader-plugin.ts b/src/plugins/cache-busted-loader-plugin.ts index e1ee78709df..449c99454c2 100644 --- a/src/plugins/cache-busted-loader-plugin.ts +++ b/src/plugins/cache-busted-loader-plugin.ts @@ -1,26 +1,29 @@ -let cacheBuster = ''; - -const ignoredFiles = [ 'intro_dark' ]; +let manifest: object; export default class CacheBustedLoaderPlugin extends Phaser.Loader.LoaderPlugin { constructor(scene: Phaser.Scene) { super(scene) } - get cacheBuster() { - return cacheBuster + get manifest() { + return manifest; } - set cacheBuster(version) { - cacheBuster = version + set manifest(manifestObj: object) { + manifest = manifestObj; } addFile(file): void { if (!Array.isArray(file)) file = [ file ]; - if (!ignoredFiles.includes(file?.key) && cacheBuster) - file.forEach(item => item.url += '?v=' + cacheBuster); + file.forEach(item => { + if (manifest) { + const timestamp = manifest[`/${item.url.replace(/\/\//g, '/')}` ]; + if (timestamp) + item.url += `?t=${timestamp}`; + } + }); super.addFile(file); } diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 65565dc8eda..23a7a8e1d7d 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -13,12 +13,18 @@ import { pokeball as esPokeball } from '../locales/es/pokeball'; import { pokeball as frPokeball } from '../locales/fr/pokeball'; import { pokemon as enPokemon } from '../locales/en/pokemon'; +import { pokemon as esPokemon } from '../locales/es/pokemon'; import { pokemon as frPokemon } from '../locales/fr/pokemon'; +import { commandUiHandler as enCommandUiHandler } from '../locales/en/command-ui-handler'; +import { commandUiHandler as esCommandUiHandler } from '../locales/es/command-ui-handler'; +import { commandUiHandler as frCommandUiHandler } from '../locales/fr/command-ui-handler'; + export interface SimpleTranslationEntries { [key: string]: string } + export interface MoveTranslationEntry { name: string, effect: string @@ -65,21 +71,25 @@ export function initI18n(): void { move: enMove, pokeball: enPokeball, pokemon: enPokemon, + commandUiHandler: enCommandUiHandler, }, es: { menu: esMenu, move: esMove, pokeball: esPokeball, - }, - it: { - menu: itMenu, + pokemon: esPokemon, + commandUiHandler: esCommandUiHandler, }, fr: { menu: frMenu, move: frMove, pokeball: frPokeball, pokemon: frPokemon, - } + commandUiHandler: frCommandUiHandler, + }, + it: { + menu: itMenu, + }, }, }); } @@ -92,6 +102,7 @@ declare module 'i18next' { move: typeof enMove; pokeball: typeof enPokeball; pokemon: typeof enPokemon; + commandUiHandler: typeof enCommandUiHandler; }; } } diff --git a/src/scene-base.ts b/src/scene-base.ts index 1098788c42e..a990492f57b 100644 --- a/src/scene-base.ts +++ b/src/scene-base.ts @@ -5,25 +5,35 @@ export class SceneBase extends Phaser.Scene { super(config); } + getCachedUrl(url: string): string { + const manifest = this.game['manifest']; + if (manifest) { + const timestamp = manifest[`/${url}`]; + if (timestamp) + url += `?t=${timestamp}`; + } + return url; + } + loadImage(key: string, folder: string, filename?: string) { if (!filename) filename = `${key}.png`; - this.load.image(key, `images/${folder}/${filename}`); + this.load.image(key, this.getCachedUrl(`images/${folder}/${filename}`)); if (folder.startsWith('ui')) { legacyCompatibleImages.push(key); folder = folder.replace('ui', 'ui/legacy'); - this.load.image(`${key}_legacy`, `images/${folder}/${filename}`); + this.load.image(`${key}_legacy`, this.getCachedUrl(`images/${folder}/${filename}`)); } } loadSpritesheet(key: string, folder: string, size: integer, filename?: string) { if (!filename) filename = `${key}.png`; - this.load.spritesheet(key, `images/${folder}/${filename}`, { frameWidth: size, frameHeight: size }); + this.load.spritesheet(key, this.getCachedUrl(`images/${folder}/${filename}`), { frameWidth: size, frameHeight: size }); if (folder.startsWith('ui')) { legacyCompatibleImages.push(key); folder = folder.replace('ui', 'ui/legacy'); - this.load.spritesheet(`${key}_legacy`, `images/${folder}/${filename}`, { frameWidth: size, frameHeight: size }); + this.load.spritesheet(`${key}_legacy`, this.getCachedUrl(`images/${folder}/${filename}`), { frameWidth: size, frameHeight: size }); } } @@ -32,11 +42,11 @@ export class SceneBase extends Phaser.Scene { filenameRoot = key; if (folder) folder += '/'; - this.load.atlas(key, `images/${folder}${filenameRoot}.png`, `images/${folder}/${filenameRoot}.json`); + this.load.atlas(key, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}/${filenameRoot}.json`)); if (folder.startsWith('ui')) { legacyCompatibleImages.push(key); folder = folder.replace('ui', 'ui/legacy'); - this.load.atlas(`${key}_legacy`, `images/${folder}${filenameRoot}.png`, `images/${folder}/${filenameRoot}.json`); + this.load.atlas(`${key}_legacy`, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}/${filenameRoot}.json`)); } } @@ -49,14 +59,13 @@ export class SceneBase extends Phaser.Scene { folder += '/'; if (!Array.isArray(filenames)) filenames = [ filenames ]; - for (let f of filenames as string[]) { - this.load.audio(key, `audio/se/${folder}${f}`); - } + for (let f of filenames as string[]) + this.load.audio(key, this.getCachedUrl(`audio/se/${folder}${f}`)); } loadBgm(key: string, filename?: string) { if (!filename) filename = `${key}.mp3`; - this.load.audio(key, `audio/bgm/${filename}`); + this.load.audio(key, this.getCachedUrl(`audio/bgm/${filename}`)); } } \ No newline at end of file diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 0c176e446d9..575701eb484 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -347,7 +347,8 @@ export class GameData { } else { if ([ '1.0.0', '1.0.1' ].includes(systemData.gameVersion)) this.migrateStarterAbilities(systemData); - this.fixVariantData(systemData); + //this.fixVariantData(systemData); + this.fixStarterData(systemData); // Migrate ability starter data if empty for caught species Object.keys(systemData.starterData).forEach(sd => { if (systemData.dexData[sd].caughtAttr && !systemData.starterData[sd].abilityAttr) @@ -984,7 +985,7 @@ export class GameData { moveset: null, eggMoves: 0, candyCount: 0, - abilityAttr: 0, + abilityAttr: defaultStarterSpecies.includes(speciesId) ? AbilityAttr.ABILITY_1 : 0, passiveAttr: 0, valueReduction: 0 }; @@ -1291,4 +1292,9 @@ export class GameData { } } } + + fixStarterData(systemData: SystemSaveData): void { + for (let starterId of defaultStarterSpecies) + systemData.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; + } } \ No newline at end of file diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index c0fdd43fa84..b8223694b4c 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -4,6 +4,7 @@ import { addTextObject, TextStyle } from "./text"; import PartyUiHandler, { PartyUiMode } from "./party-ui-handler"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; +import i18next from '../plugins/i18n'; export enum Command { FIGHT = 0, @@ -25,7 +26,12 @@ export default class CommandUiHandler extends UiHandler { setup() { const ui = this.getUi(); - const commands = [ 'Fight', 'Ball', 'Pokémon', 'Run' ]; + const commands = [ + i18next.t('commandUiHandler:fight'), + i18next.t('commandUiHandler:ball'), + i18next.t('commandUiHandler:pokemon'), + i18next.t('commandUiHandler:run') + ]; this.commandsContainer = this.scene.add.container(216, -38.7); this.commandsContainer.setVisible(false); @@ -55,7 +61,7 @@ export default class CommandUiHandler extends UiHandler { messageHandler.commandWindow.setVisible(true); messageHandler.movesWindowContainer.setVisible(false); messageHandler.message.setWordWrapWidth(1110); - messageHandler.showText(`What will\n${commandPhase.getPokemon().name} do?`, 0); + messageHandler.showText(i18next.t('commandUiHandler:actionMessage', {pokemonName: commandPhase.getPokemon().name}), 0); this.setCursor(this.getCursor()); return true; diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index 3e326322c17..ec5f4147c58 100644 --- a/src/ui/form-modal-ui-handler.ts +++ b/src/ui/form-modal-ui-handler.ts @@ -5,6 +5,7 @@ import { TextStyle, addTextInputObject, addTextObject } from "./text"; import { WindowVariant, addWindow } from "./ui-theme"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; import * as Utils from "../utils"; +import i18next from '../plugins/i18n'; export interface FormModalConfig extends ModalConfig { errorMessage?: string; @@ -55,7 +56,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler { const inputBg = addWindow(this.scene, 0, 0, 80, 16, false, false, 0, 0, WindowVariant.XTHIN); - const isPassword = field.includes('Password'); + const isPassword = field.includes(i18next.t("menu:password")) || field.includes(i18next.t("menu:confirmPassword")); const input = addTextInputObject(this.scene, 4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { type: isPassword ? 'password' : 'text', maxLength: isPassword ? 64 : 16 }); input.setOrigin(0, 0); diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index 21865045141..181b0643cb9 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -7,10 +7,9 @@ import { addWindow } from "./ui-theme"; import * as Utils from "../utils"; import PokemonData from "../system/pokemon-data"; import { PokemonHeldItemModifier } from "../modifier/modifier"; -import { TitlePhase } from "../phases"; import MessageUiHandler from "./message-ui-handler"; -const sessionSlotCount = 3; +const sessionSlotCount = 5; export enum SaveSlotUiMode { LOAD, @@ -30,8 +29,12 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { private uiMode: SaveSlotUiMode; private saveSlotSelectCallback: SaveSlotSelectCallback; + private scrollCursor: integer = 0; + private cursorObj: Phaser.GameObjects.NineSlice; + private sessionSlotsContainerInitialY: number; + constructor(scene: BattleScene) { super(scene, Mode.SAVE_SLOT); } @@ -47,7 +50,9 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { loadSessionBg.setOrigin(0, 0); this.saveSlotSelectContainer.add(loadSessionBg); - this.sessionSlotsContainer = this.scene.add.container(8, -this.scene.game.canvas.height / 6 + 8); + this.sessionSlotsContainerInitialY = -this.scene.game.canvas.height / 6 + 8; + + this.sessionSlotsContainer = this.scene.add.container(8, this.sessionSlotsContainerInitialY); this.saveSlotSelectContainer.add(this.sessionSlotsContainer); this.saveSlotSelectMessageBoxContainer = this.scene.add.container(0, 0); @@ -76,6 +81,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { this.saveSlotSelectContainer.setVisible(true); this.populateSessionSlots(); + this.setScrollCursor(0); this.setCursor(0); return true; @@ -90,13 +96,14 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { if (button === Button.ACTION || button === Button.CANCEL) { const originalCallback = this.saveSlotSelectCallback; if (button === Button.ACTION) { - if (this.uiMode === SaveSlotUiMode.LOAD && !this.sessionSlots[this.cursor].hasData) + const cursor = this.cursor + this.scrollCursor; + if (this.uiMode === SaveSlotUiMode.LOAD && !this.sessionSlots[cursor].hasData) error = true; else { switch (this.uiMode) { case SaveSlotUiMode.LOAD: this.saveSlotSelectCallback = null; - originalCallback(this.cursor); + originalCallback(cursor); break; case SaveSlotUiMode.SAVE: const saveAndCallback = () => { @@ -105,16 +112,16 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { ui.revertMode(); ui.showText(null, 0); ui.setMode(Mode.MESSAGE); - originalCallback(this.cursor); + originalCallback(cursor); }; - if (this.sessionSlots[this.cursor].hasData) { + if (this.sessionSlots[cursor].hasData) { ui.showText('Overwrite the data in the selected slot?', null, () => { ui.setOverlayMode(Mode.CONFIRM, () => saveAndCallback(), () => { ui.revertMode(); ui.showText(null, 0); }, false, 0, 19, 2000); }); - } else if (this.sessionSlots[this.cursor].hasData === false) + } else if (this.sessionSlots[cursor].hasData === false) saveAndCallback(); else return false; @@ -130,10 +137,16 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } else { switch (button) { case Button.UP: - success = this.setCursor(this.cursor ? this.cursor - 1 : 0); + if (this.cursor) + success = this.setCursor(this.cursor - 1); + else if (this.scrollCursor) + success = this.setScrollCursor(this.scrollCursor - 1); break; case Button.DOWN: - success = this.setCursor(this.cursor < sessionSlotCount - 1 ? this.cursor + 1 : 2); + if (this.cursor < 2) + success = this.setCursor(this.cursor + 1); + else if (this.scrollCursor < sessionSlotCount - 3) + success = this.setScrollCursor(this.scrollCursor + 1); break; } } @@ -178,7 +191,24 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { this.cursorObj.setOrigin(0, 0); this.sessionSlotsContainer.add(this.cursorObj); } - this.cursorObj.setPosition(4, 4 + cursor * 56); + this.cursorObj.setPosition(4, 4 + (cursor + this.scrollCursor) * 56); + + return changed; + } + + setScrollCursor(scrollCursor: integer): boolean { + let changed = scrollCursor !== this.scrollCursor; + + if (changed) { + this.scrollCursor = scrollCursor; + this.setCursor(this.cursor); + this.scene.tweens.add({ + targets: this.sessionSlotsContainer, + y: this.sessionSlotsContainerInitialY - 56 * scrollCursor, + duration: Utils.fixedInt(325), + ease: 'Sine.easeInOut' + }); + } return changed; }