diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index adac45519ab..2a78ec252b8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,8 +15,8 @@ on: types: [checks_requested] jobs: - run-tests: # Define a job named "run-tests" - name: Run tests # Human-readable name for the job + run-misc-tests: # Define a job named "run-tests" + name: Run misc tests # Human-readable name for the job runs-on: ubuntu-latest # Specify the latest Ubuntu runner for the job steps: @@ -31,5 +31,75 @@ jobs: - name: Install Node.js dependencies # Step to install Node.js dependencies run: npm ci # Use 'npm ci' to install dependencies - - name: tests # Step to run tests - run: npm run test:silent \ No newline at end of file + - name: pre-test # pre-test to check overrides + run: npx vitest run --project pre + - name: test misc + run: npx vitest --project misc + + run-abilities-tests: + name: Run abilities tests + runs-on: ubuntu-latest + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Install Node.js dependencies + run: npm ci + - name: pre-test + run: npx vitest run --project pre + - name: test abilities + run: npx vitest --project abilities + + run-items-tests: + name: Run items tests + runs-on: ubuntu-latest + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Install Node.js dependencies + run: npm ci + - name: pre-test + run: npx vitest run --project pre + - name: test items + run: npx vitest --project items + + run-moves-tests: + name: Run moves tests + runs-on: ubuntu-latest + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Install Node.js dependencies + run: npm ci + - name: pre-test + run: npx vitest run --project pre + - name: test moves + run: npx vitest --project moves + + run-battle-tests: + name: Run battle tests + runs-on: ubuntu-latest + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Install Node.js dependencies + run: npm ci + - name: pre-test + run: npx vitest run --project pre + - name: test battle + run: npx vitest --project battle \ No newline at end of file diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js index bf68258f321..3c53eb1125b 100644 --- a/create-test-boilerplate.js +++ b/create-test-boilerplate.js @@ -4,7 +4,8 @@ import { fileURLToPath } from 'url'; /** * This script creates a test boilerplate file for a move or ability. - * @param {string} type - The type of test to create. Either "move" or "ability". + * @param {string} type - The type of test to create. Either "move", "ability", + * or "item". * @param {string} fileName - The name of the file to create. * @example npm run create-test move tackle */ @@ -19,7 +20,7 @@ const type = args[0]; // "move" or "ability" let fileName = args[1]; // The file name if (!type || !fileName) { - console.error('Please provide both a type ("move" or "ability") and a file name.'); + console.error('Please provide both a type ("move", "ability", or "item") and a file name.'); process.exit(1); } @@ -40,8 +41,11 @@ if (type === 'move') { } else if (type === 'ability') { dir = path.join(__dirname, 'src', 'test', 'abilities'); description = `Abilities - ${formattedName}`; +} else if (type === "item") { + dir = path.join(__dirname, 'src', 'test', 'items'); + description = `Items - ${formattedName}`; } else { - console.error('Invalid type. Please use "move" or "ability".'); + console.error('Invalid type. Please use "move", "ability", or "item".'); process.exit(1); } @@ -98,4 +102,4 @@ describe("${description}", () => { // Write the template content to the file fs.writeFileSync(filePath, content, 'utf8'); -console.log(`File created at: ${filePath}`); \ No newline at end of file +console.log(`File created at: ${filePath}`); diff --git a/public/images/pokemon/variant/465.json b/public/images/pokemon/variant/465.json new file mode 100644 index 00000000000..a7ff2338057 --- /dev/null +++ b/public/images/pokemon/variant/465.json @@ -0,0 +1,22 @@ +{ + "1": { + "529cc5": "8153c7", + "d65a94": "5ad662", + "3a73ad": "6b3aad", + "bd216b": "21bd69", + "5a193a": "195a2a", + "193a63": "391963", + "295a84": "472984" + }, + "2": { + "529cc5": "ffedb6", + "d65a94": "e67d2f", + "3a73ad": "ebc582", + "bd216b": "b35131", + "31313a": "3d1519", + "5a193a": "752e2e", + "193a63": "705040", + "295a84": "ad875a", + "4a4a52": "57211a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/465_2.json b/public/images/pokemon/variant/465_2.json deleted file mode 100644 index 7c6d5ea081a..00000000000 --- a/public/images/pokemon/variant/465_2.json +++ /dev/null @@ -1,4094 +0,0 @@ -{ - "textures": [ - { - "image": "465_2.png", - "format": "RGBA8888", - "size": { - "w": 407, - "h": 407 - }, - "scale": 1, - "frames": [ - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0171.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0172.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0169.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0170.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0185.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0186.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0187.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0188.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0179.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0180.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0173.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0174.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0166.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0189.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0190.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0167.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0168.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0177.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0178.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0193.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0194.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0181.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0182.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0175.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0176.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0183.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0184.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 196, - "w": 86, - "h": 66 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 196, - "w": 86, - "h": 66 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 176, - "y": 198, - "w": 94, - "h": 66 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 176, - "y": 198, - "w": 94, - "h": 66 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 270, - "y": 198, - "w": 97, - "h": 66 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 270, - "y": 198, - "w": 97, - "h": 66 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 86, - "h": 66 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 86, - "h": 66 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0191.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0192.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 254, - "y": 264, - "w": 97, - "h": 66 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 254, - "y": 264, - "w": 97, - "h": 66 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 0, - "y": 330, - "w": 98, - "h": 66 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 0, - "y": 330, - "w": 98, - "h": 66 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 98, - "y": 330, - "w": 97, - "h": 66 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 98, - "y": 330, - "w": 97, - "h": 66 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 195, - "y": 330, - "w": 97, - "h": 66 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 195, - "y": 330, - "w": 97, - "h": 66 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 292, - "y": 330, - "w": 94, - "h": 66 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 292, - "y": 330, - "w": 94, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9fb6238f8e585be9be5e520abb59e23d:2204e0edc6a9e184240a16c4ee5faa7c:06d67de9e8d7f60fc986e0c00145d6b1$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/465_2.png b/public/images/pokemon/variant/465_2.png deleted file mode 100644 index db25e88ad98..00000000000 Binary files a/public/images/pokemon/variant/465_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/465_3.json b/public/images/pokemon/variant/465_3.json deleted file mode 100644 index c092ec585e7..00000000000 --- a/public/images/pokemon/variant/465_3.json +++ /dev/null @@ -1,4094 +0,0 @@ -{ - "textures": [ - { - "image": "465_3.png", - "format": "RGBA8888", - "size": { - "w": 407, - "h": 407 - }, - "scale": 1, - "frames": [ - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0171.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0172.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0169.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0170.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0185.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0186.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0187.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0188.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0179.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0180.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0173.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0174.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0166.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0189.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0190.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0167.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0168.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0177.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0178.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0193.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0194.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0181.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0182.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0175.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0176.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0183.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0184.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 196, - "w": 86, - "h": 66 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 196, - "w": 86, - "h": 66 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 176, - "y": 198, - "w": 94, - "h": 66 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 176, - "y": 198, - "w": 94, - "h": 66 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 270, - "y": 198, - "w": 97, - "h": 66 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 270, - "y": 198, - "w": 97, - "h": 66 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 86, - "h": 66 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 86, - "h": 66 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0191.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0192.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 254, - "y": 264, - "w": 97, - "h": 66 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 254, - "y": 264, - "w": 97, - "h": 66 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 0, - "y": 330, - "w": 98, - "h": 66 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 0, - "y": 330, - "w": 98, - "h": 66 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 98, - "y": 330, - "w": 97, - "h": 66 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 98, - "y": 330, - "w": 97, - "h": 66 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 195, - "y": 330, - "w": 97, - "h": 66 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 195, - "y": 330, - "w": 97, - "h": 66 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 292, - "y": 330, - "w": 94, - "h": 66 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 292, - "y": 330, - "w": 94, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9fb6238f8e585be9be5e520abb59e23d:2204e0edc6a9e184240a16c4ee5faa7c:06d67de9e8d7f60fc986e0c00145d6b1$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/465_3.png b/public/images/pokemon/variant/465_3.png deleted file mode 100644 index fe8e764028b..00000000000 Binary files a/public/images/pokemon/variant/465_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index 9efbf5bc150..938c92f5056 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -1691,8 +1691,8 @@ ], "465": [ 0, - 2, - 2 + 1, + 1 ], "466": [ 1, @@ -3980,6 +3980,11 @@ 1, 1 ], + "465": [ + 0, + 1, + 1 + ], "592": [ 1, 1, @@ -5690,7 +5695,7 @@ "465": [ 0, 1, - 2 + 1 ], "466": [ 2, @@ -8008,6 +8013,11 @@ 1, 1 ], + "465": [ + 0, + 1, + 1 + ], "592": [ 1, 1, diff --git a/public/images/pokemon/variant/back/465.json b/public/images/pokemon/variant/back/465.json index c8dad539b75..cc868023c2b 100644 --- a/public/images/pokemon/variant/back/465.json +++ b/public/images/pokemon/variant/back/465.json @@ -8,5 +8,14 @@ "bd216b": "21bd69", "31313a": "31313a", "d65a94": "5ad662" + }, + "2": { + "5a193a": "752e2e", + "31313a": "3d1519", + "d65a94": "e67d2f", + "3a73ad": "ebc582", + "295a84": "ad875a", + "bd216b": "b35131", + "193a63": "705040" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/back/465_3.json b/public/images/pokemon/variant/back/465_3.json deleted file mode 100644 index 3141b3c6cee..00000000000 --- a/public/images/pokemon/variant/back/465_3.json +++ /dev/null @@ -1,4094 +0,0 @@ -{ - "textures": [ - { - "image": "465_3.png", - "format": "RGBA8888", - "size": { - "w": 407, - "h": 407 - }, - "scale": 1, - "frames": [ - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0185.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0186.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0187.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0188.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0169.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0170.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0171.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0172.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0183.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0184.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0189.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0190.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0179.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0180.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 148, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 148, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 148, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 148, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0166.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0173.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0174.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0167.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0168.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0177.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0178.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0191.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0192.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0181.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0182.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0193.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0194.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 196, - "w": 86, - "h": 66 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 196, - "w": 86, - "h": 66 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 196, - "w": 90, - "h": 66 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 196, - "w": 90, - "h": 66 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 196, - "w": 90, - "h": 66 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 196, - "w": 90, - "h": 66 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 176, - "y": 197, - "w": 94, - "h": 66 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 176, - "y": 197, - "w": 94, - "h": 66 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 270, - "y": 197, - "w": 97, - "h": 66 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 270, - "y": 197, - "w": 97, - "h": 66 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 98, - "h": 66 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 98, - "h": 66 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 98, - "h": 66 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 98, - "h": 66 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0175.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0176.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 168, - "y": 263, - "w": 97, - "h": 66 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 168, - "y": 263, - "w": 97, - "h": 66 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 265, - "y": 263, - "w": 98, - "h": 66 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 265, - "y": 263, - "w": 98, - "h": 66 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 0, - "y": 328, - "w": 97, - "h": 66 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 0, - "y": 328, - "w": 97, - "h": 66 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 97, - "y": 329, - "w": 97, - "h": 66 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 97, - "y": 329, - "w": 97, - "h": 66 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 194, - "y": 329, - "w": 94, - "h": 66 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 194, - "y": 329, - "w": 94, - "h": 66 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 288, - "y": 329, - "w": 86, - "h": 66 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 288, - "y": 329, - "w": 86, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cd959f202c47f9ac8c3bb6f34f5e04e0:4fa06c9f7e584689369e76122c6343e8:06d67de9e8d7f60fc986e0c00145d6b1$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/465_3.png b/public/images/pokemon/variant/back/465_3.png deleted file mode 100644 index 876725447af..00000000000 Binary files a/public/images/pokemon/variant/back/465_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/female/465.json b/public/images/pokemon/variant/back/female/465.json new file mode 100644 index 00000000000..ed257655add --- /dev/null +++ b/public/images/pokemon/variant/back/female/465.json @@ -0,0 +1,21 @@ +{ + "1": { + "193a63": "391963", + "295a84": "472984", + "3a73ad": "6b3aad", + "000000": "000000", + "5a193a": "195a2a", + "bd216b": "21bd69", + "31313a": "31313a", + "d65a94": "5ad662" + }, + "2": { + "5a193a": "752e2e", + "31313a": "3d1519", + "d65a94": "e67d2f", + "3a73ad": "ebc582", + "295a84": "ad875a", + "bd216b": "b35131", + "193a63": "705040" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/465.json b/public/images/pokemon/variant/female/465.json new file mode 100644 index 00000000000..a7ff2338057 --- /dev/null +++ b/public/images/pokemon/variant/female/465.json @@ -0,0 +1,22 @@ +{ + "1": { + "529cc5": "8153c7", + "d65a94": "5ad662", + "3a73ad": "6b3aad", + "bd216b": "21bd69", + "5a193a": "195a2a", + "193a63": "391963", + "295a84": "472984" + }, + "2": { + "529cc5": "ffedb6", + "d65a94": "e67d2f", + "3a73ad": "ebc582", + "bd216b": "b35131", + "31313a": "3d1519", + "5a193a": "752e2e", + "193a63": "705040", + "295a84": "ad875a", + "4a4a52": "57211a" + } +} \ No newline at end of file diff --git a/public/images/types_ja.png b/public/images/types_ja.png index e60d8e071aa..a6f3b00607f 100644 Binary files a/public/images/types_ja.png and b/public/images/types_ja.png differ diff --git a/public/images/ui/egg_summary_bg.png b/public/images/ui/egg_summary_bg.png index 658f5df0e96..e81934b9d75 100644 Binary files a/public/images/ui/egg_summary_bg.png and b/public/images/ui/egg_summary_bg.png differ diff --git a/src/@types/common.ts b/src/@types/common.ts index 6868d766008..fcd946656dc 100644 --- a/src/@types/common.ts +++ b/src/@types/common.ts @@ -1,3 +1,3 @@ -import BattleScene from "#app/battle-scene.js"; +import BattleScene from "#app/battle-scene"; export type ConditionFn = (scene: BattleScene, args?: any[]) => boolean; diff --git a/src/@types/i18next.d.ts b/src/@types/i18next.d.ts index d895659acef..9e8418a8977 100644 --- a/src/@types/i18next.d.ts +++ b/src/@types/i18next.d.ts @@ -1,4 +1,4 @@ -import { type enConfig } from "#app/locales/en/config.js"; +import { type enConfig } from "#app/locales/en/config"; import { TOptions } from "i18next"; //TODO: this needs to be type properly in the future diff --git a/src/battle-scene.ts b/src/battle-scene.ts index d4c33663c14..ff4258a13f5 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -63,7 +63,7 @@ import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { UiTheme } from "#enums/ui-theme"; -import { TimedEventManager } from "#app/timed-event-manager.js"; +import { TimedEventManager } from "#app/timed-event-manager"; import i18next from "i18next"; import { TrainerType } from "#enums/trainer-type"; import { battleSpecDialogue } from "./data/dialogue"; @@ -855,7 +855,7 @@ export default class BattleScene extends SceneBase { overrideModifiers(this, false); overrideHeldItems(this, pokemon, false); if (boss && !dataSource) { - const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); + const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967296)); for (let s = 0; s < pokemon.ivs.length; s++) { pokemon.ivs[s] = Math.round(Phaser.Math.Linear(Math.min(pokemon.ivs[s], secondaryIvs[s]), Math.max(pokemon.ivs[s], secondaryIvs[s]), 0.75)); @@ -961,6 +961,16 @@ export default class BattleScene extends SceneBase { this.offsetGym = this.gameMode.isClassic && this.getGeneratedOffsetGym(); } + /** + * Generates a random number using the current battle's seed + * + * This calls {@linkcode Battle.randSeedInt}(`scene`, {@linkcode range}, {@linkcode min}) in `src/battle.ts` + * which calls {@linkcode Utils.randSeedInt randSeedInt}({@linkcode range}, {@linkcode min}) in `src/utils.ts` + * + * @param range How large of a range of random numbers to choose from. If {@linkcode range} <= 1, returns {@linkcode min} + * @param min The minimum integer to pick, default `0` + * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) + */ randBattleSeedInt(range: integer, min: integer = 0): integer { return this.currentBattle?.randSeedInt(this, range, min); } @@ -1112,7 +1122,8 @@ export default class BattleScene extends SceneBase { doubleTrainer = false; } } - newTrainer = trainerData !== undefined ? trainerData.toTrainer(this) : new Trainer(this, trainerType, doubleTrainer ? TrainerVariant.DOUBLE : Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT); + const variant = doubleTrainer ? TrainerVariant.DOUBLE : (Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT); + newTrainer = trainerData !== undefined ? trainerData.toTrainer(this) : new Trainer(this, trainerType, variant); this.field.add(newTrainer); } } @@ -2620,7 +2631,7 @@ export default class BattleScene extends SceneBase { if (mods.length < 1) { return mods; } - const rand = Math.floor(Utils.randSeedInt(mods.length)); + const rand = Utils.randSeedInt(mods.length); return [mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand))]; }; modifiers = shuffleModifiers(modifiers); diff --git a/src/battle.ts b/src/battle.ts index 0f1245a4397..b80caa9e679 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -354,6 +354,12 @@ export default class Battle { return null; } + /** + * Generates a random number using the current battle's seed. Calls {@linkcode Utils.randSeedInt} + * @param range How large of a range of random numbers to choose from. If {@linkcode range} <= 1, returns {@linkcode min} + * @param min The minimum integer to pick, default `0` + * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) + */ randSeedInt(scene: BattleScene, range: number, min: number = 0): number { if (range <= 1) { return min; diff --git a/src/configs/inputs/pad_procon.ts b/src/configs/inputs/pad_procon.ts index 8cb707f882a..be751cc3acc 100644 --- a/src/configs/inputs/pad_procon.ts +++ b/src/configs/inputs/pad_procon.ts @@ -1,4 +1,4 @@ -import {SettingGamepad} from "#app/system/settings/settings-gamepad.js"; +import {SettingGamepad} from "#app/system/settings/settings-gamepad"; import {Button} from "#enums/buttons"; /** diff --git a/src/data/ability.ts b/src/data/ability.ts index 329a3cb75ed..933cf6e47d2 100755 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2656,7 +2656,7 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { if (simulated) { return defender.canAddTag(BattlerTagType.CONFUSED); } else { - return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedInt(3, 2), move.id, defender.id); + return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 5), move.id, defender.id); } } return false; @@ -5347,8 +5347,10 @@ export function initAbilities() { .attr(FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 4 / 3), new Ability(Abilities.AURA_BREAK, 6) .ignorable() - .conditionalAttr(target => target.hasAbility(Abilities.DARK_AURA), FieldMoveTypePowerBoostAbAttr, Type.DARK, 9 / 16) - .conditionalAttr(target => target.hasAbility(Abilities.FAIRY_AURA), FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 9 / 16), + .conditionalAttr(pokemon => pokemon.scene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA)), FieldMoveTypePowerBoostAbAttr, Type.DARK, 9 / 16) + .conditionalAttr(pokemon => pokemon.scene.getField(true).some(p => p.hasAbility(Abilities.FAIRY_AURA)), FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 9 / 16) + .conditionalAttr(pokemon => pokemon.scene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA) || p.hasAbility(Abilities.FAIRY_AURA)), + PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonAuraBreak", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })), new Ability(Abilities.PRIMORDIAL_SEA, 6) .attr(PostSummonWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index ef91dda7b63..ddb85600c18 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -486,7 +486,7 @@ export class ConfusedTag extends BattlerTag { if (pokemon.randSeedInt(3) === 0) { const atk = pokemon.getEffectiveStat(Stat.ATK); const def = pokemon.getEffectiveStat(Stat.DEF); - const damage = Utils.toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedInt(15, 85) / 100)); + const damage = Utils.toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedIntRange(85, 100) / 100)); pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself")); pokemon.damageAndUpdate(damage); pokemon.battleData.hitCount++; diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 62751b92f9c..2205519c532 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -1,18 +1,18 @@ import * as Utils from "../utils"; import i18next from "i18next"; -import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data.js"; +import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data"; import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./pokemon-species"; -import Pokemon, { PokemonMove } from "#app/field/pokemon.js"; -import { BattleType, FixedBattleConfig } from "#app/battle.js"; -import Trainer, { TrainerVariant } from "#app/field/trainer.js"; -import { GameMode } from "#app/game-mode.js"; +import Pokemon, { PokemonMove } from "#app/field/pokemon"; +import { BattleType, FixedBattleConfig } from "#app/battle"; +import Trainer, { TrainerVariant } from "#app/field/trainer"; +import { GameMode } from "#app/game-mode"; import { Type } from "./type"; import { Challenges } from "#enums/challenges"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { Nature } from "./nature"; -import { Moves } from "#app/enums/moves.js"; -import { TypeColor, TypeShadow } from "#app/enums/color.js"; +import { Moves } from "#app/enums/moves"; +import { TypeColor, TypeShadow } from "#app/enums/color"; import { pokemonEvolutions } from "./pokemon-evolutions"; import { pokemonFormChanges } from "./pokemon-forms"; diff --git a/src/data/egg.ts b/src/data/egg.ts index 508263c9c8e..ce27030ebef 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -8,7 +8,7 @@ import { PlayerPokemon } from "#app/field/pokemon"; import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; import { Species } from "#enums/species"; -import { EggSourceType } from "#app/enums/egg-source-types.js"; +import { EggSourceType } from "#app/enums/egg-source-types"; export const EGG_SEED = 1073741824; diff --git a/src/data/move.ts b/src/data/move.ts index 252c474864c..e6e7f574671 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -757,7 +757,10 @@ export default class Move implements Localizable { const fieldAuras = new Set( source.scene.getField(true) - .map((p) => p.getAbilityAttrs(FieldMoveTypePowerBoostAbAttr) as FieldMoveTypePowerBoostAbAttr[]) + .map((p) => p.getAbilityAttrs(FieldMoveTypePowerBoostAbAttr).filter(attr => { + const condition = attr.getCondition(); + return (!condition || condition(p)); + }) as FieldMoveTypePowerBoostAbAttr[]) .flat(), ); for (const aura of fieldAuras) { @@ -3469,7 +3472,7 @@ export class SpitUpPowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const stockpilingTag = user.getTag(StockpilingTag); - if (stockpilingTag !== null && stockpilingTag.stockpiledCount > 0) { + if (stockpilingTag && stockpilingTag.stockpiledCount > 0) { const power = args[0] as Utils.IntegerHolder; power.value = this.multiplier * stockpilingTag.stockpiledCount; return true; @@ -3487,7 +3490,7 @@ export class SwallowHealAttr extends HealAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const stockpilingTag = user.getTag(StockpilingTag); - if (stockpilingTag !== null && stockpilingTag?.stockpiledCount > 0) { + if (stockpilingTag && stockpilingTag.stockpiledCount > 0) { const stockpiled = stockpilingTag.stockpiledCount; let healRatio: number; @@ -4400,7 +4403,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true); if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) { - return (this.selfTarget ? user : target).addTag(this.tagType, user.randSeedInt(this.turnCountMax - this.turnCountMin, this.turnCountMin), move.id, user.id); + return (this.selfTarget ? user : target).addTag(this.tagType, user.randSeedIntRange(this.turnCountMin, this.turnCountMax), move.id, user.id); } return false; diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index bc815b91f3a..0d3e511bcba 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -8,7 +8,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; -import { getPokemonNameWithAffix } from "#app/messages.js"; +import { getPokemonNameWithAffix } from "#app/messages"; import i18next from "i18next"; import { WeatherType } from "./weather"; diff --git a/src/data/terrain.ts b/src/data/terrain.ts index d4789078af7..6db68b92239 100644 --- a/src/data/terrain.ts +++ b/src/data/terrain.ts @@ -4,7 +4,7 @@ import { Type } from "./type"; import * as Utils from "../utils"; import { ChangeMovePriorityAbAttr, applyAbAttrs } from "./ability"; import { ProtectAttr } from "./move"; -import { BattlerIndex } from "#app/battle.js"; +import { BattlerIndex } from "#app/battle"; import i18next from "i18next"; export enum TerrainType { diff --git a/src/data/variant.ts b/src/data/variant.ts index 48369d112db..b7a01a4be89 100644 --- a/src/data/variant.ts +++ b/src/data/variant.ts @@ -1,4 +1,4 @@ -import { VariantTier } from "#app/enums/variant-tier.js"; +import { VariantTier } from "#app/enums/variant-tier"; export type Variant = 0 | 1 | 2; diff --git a/src/events/arena.ts b/src/events/arena.ts index 9fbbe572601..c05e67d353c 100644 --- a/src/events/arena.ts +++ b/src/events/arena.ts @@ -1,7 +1,7 @@ -import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { ArenaTagSide } from "#app/data/arena-tag"; import { ArenaTagType } from "#enums/arena-tag-type"; -import { TerrainType } from "#app/data/terrain.js"; -import { WeatherType } from "#app/data/weather.js"; +import { TerrainType } from "#app/data/terrain"; +import { WeatherType } from "#app/data/weather"; /** Alias for all {@linkcode ArenaEvent} type strings */ export enum ArenaEventType { diff --git a/src/field/arena.ts b/src/field/arena.ts index e8defbd1a8e..5b167791769 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -60,7 +60,7 @@ export class Arena { this.scene.arenaBg.setTexture(`${biomeKey}_bg`); this.scene.arenaBgTransition.setTexture(`${biomeKey}_bg`); - // Redo this on initialise because during save/load the current wave isn't always + // Redo this on initialize because during save/load the current wave isn't always // set correctly during construction this.updatePoolsForTimeOfDay(); } @@ -289,7 +289,7 @@ export class Arena { /** * Sets weather to the override specified in overrides.ts - * @param weather new weather to set of type WeatherType + * @param weather new {@linkcode WeatherType} to set * @returns true to force trySetWeather to return true */ trySetWeatherOverride(weather: WeatherType): boolean { @@ -301,8 +301,8 @@ export class Arena { /** * Attempts to set a new weather to the battle - * @param weather new weather to set of type WeatherType - * @param hasPokemonSource is the new weather from a pokemon + * @param weather {@linkcode WeatherType} new {@linkcode WeatherType} to set + * @param hasPokemonSource boolean if the new weather is from a pokemon * @returns true if new weather set, false if no weather provided or attempting to set the same weather as currently in use */ trySetWeather(weather: WeatherType, hasPokemonSource: boolean): boolean { @@ -573,6 +573,12 @@ export class Arena { this.ignoreAbilities = ignoreAbilities; } + /** + * Applies each `ArenaTag` in this Arena, based on which side (self, enemy, or both) is passed in as a parameter + * @param tagType Either an {@linkcode ArenaTagType} string, or an actual {@linkcode ArenaTag} class to filter which ones to apply + * @param side {@linkcode ArenaTagSide} which side's arena tags to apply + * @param args array of parameters that the called upon tags may need + */ applyTagsForSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide, ...args: unknown[]): void { let tags = typeof tagType === "string" ? this.tags.filter(t => t.tagType === tagType) @@ -583,11 +589,28 @@ export class Arena { tags.forEach(t => t.apply(this, args)); } + /** + * Applies the specified tag to both sides (ie: both user and trainer's tag that match the Tag specified) + * by calling {@linkcode applyTagsForSide()} + * @param tagType Either an {@linkcode ArenaTagType} string, or an actual {@linkcode ArenaTag} class to filter which ones to apply + * @param args array of parameters that the called upon tags may need + */ applyTags(tagType: ArenaTagType | Constructor, ...args: unknown[]): void { this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args); } - addTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId: integer, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean { + /** + * Adds a new tag to the arena + * @param tagType {@linkcode ArenaTagType} the tag being added + * @param turnCount How many turns the tag lasts + * @param sourceMove {@linkcode Moves} the move the tag came from, or `undefined` if not from a move + * @param sourceId The ID of the pokemon in play the tag came from (see {@linkcode BattleScene.getPokemonById}) + * @param side {@linkcode ArenaTagSide} which side(s) the tag applies to + * @param quiet If a message should be queued on screen to announce the tag being added + * @param targetIndex The {@linkcode BattlerIndex} of the target pokemon + * @returns `false` if there already exists a tag of this type in the Arena + */ + addTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean { const existingTag = this.getTagOnSide(tagType, side); if (existingTag) { existingTag.onOverlap(this); @@ -600,6 +623,7 @@ export class Arena { return false; } + // creates a new tag object const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side); if (newTag) { this.tags.push(newTag); @@ -613,6 +637,11 @@ export class Arena { return true; } + /** + * Attempts to get a tag from the Arena via {@linkcode getTagOnSide} that applies to both sides + * @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get + * @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there + */ getTag(tagType: ArenaTagType | Constructor): ArenaTag | undefined { return this.getTagOnSide(tagType, ArenaTagSide.BOTH); } @@ -621,16 +650,35 @@ export class Arena { return !!this.getTag(tagType); } + /** + * Attempts to get a tag from the Arena from a specific side (the tag passed in has to either apply to both sides, or the specific side only) + * + * eg: `MIST` only applies to the user's side, while `MUD_SPORT` applies to both user and enemy side + * @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get + * @param side The {@linkcode ArenaTagSide} to look at + * @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there + */ getTagOnSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide): ArenaTag | undefined { return typeof(tagType) === "string" ? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)) : this.tags.find(t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)); } + /** + * Uses {@linkcode findTagsOnSide} to filter (using the parameter function) for specific tags that apply to both sides + * @param tagPredicate a function mapping {@linkcode ArenaTag}s to `boolean`s + * @returns array of {@linkcode ArenaTag}s from which the Arena's tags return true and apply to both sides + */ findTags(tagPredicate: (t: ArenaTag) => boolean): ArenaTag[] { return this.findTagsOnSide(tagPredicate, ArenaTagSide.BOTH); } + /** + * Returns specific tags from the arena that pass the `tagPredicate` function passed in as a parameter, and apply to the given side + * @param tagPredicate a function mapping {@linkcode ArenaTag}s to `boolean`s + * @param side The {@linkcode ArenaTagSide} to look at + * @returns array of {@linkcode ArenaTag}s from which the Arena's tags return `true` and apply to the given side + */ findTagsOnSide(tagPredicate: (t: ArenaTag) => boolean, side: ArenaTagSide): ArenaTag[] { return this.tags.filter(t => tagPredicate(t) && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)); } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index ed0c6162c36..9a68a0b66e3 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1049,6 +1049,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const teraType = this.getTeraType(); if (teraType !== Type.UNKNOWN) { types.push(teraType); + if (forDefend) { + return types; + } } } @@ -1368,7 +1371,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { : 1); applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); - if (this.getTypes().find(t => move.isTypeImmune(source, this, t))) { + if (this.getTypes(true, true).find(t => move.isTypeImmune(source, this, t))) { typeMultiplier.value = 0; } @@ -1427,22 +1430,26 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } let multiplier = types.map(defType => { + const multiplier = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, defType)); + applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier); if (source) { const ignoreImmunity = new Utils.BooleanHolder(false); if (source.isActive(true) && source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr)) { applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, simulated, moveType, defType); } if (ignoreImmunity.value) { - return 1; + if (multiplier.value === 0) { + return 1; + } } const exposedTags = this.findTags(tag => tag instanceof ExposedTag) as ExposedTag[]; if (exposedTags.some(t => t.ignoreImmunity(defType, moveType))) { - return 1; + if (multiplier.value === 0) { + return 1; + } } } - const multiplier = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, defType)); - applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier); return multiplier.value; }).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier; @@ -1720,7 +1727,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }; this.fusionSpecies = this.scene.randomSpecies(this.scene.currentBattle?.waveIndex || 0, this.level, false, filter, true); - this.fusionAbilityIndex = (this.fusionSpecies.abilityHidden && hasHiddenAbility ? this.fusionSpecies.ability2 ? 2 : 1 : this.fusionSpecies.ability2 ? randAbilityIndex : 0); + this.fusionAbilityIndex = (this.fusionSpecies.abilityHidden && hasHiddenAbility ? 2 : this.fusionSpecies.ability2 !== this.fusionSpecies.ability1 ? randAbilityIndex : 0); this.fusionShiny = this.shiny; this.fusionVariant = this.variant; @@ -2278,7 +2285,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!isTypeImmune) { const levelMultiplier = (2 * source.level / 5 + 2); - const randomMultiplier = ((this.scene.randBattleSeedInt(16) + 85) / 100); + const randomMultiplier = (this.randSeedIntRange(85, 100) / 100); damage.value = Utils.toDmgValue((((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier @@ -3448,12 +3455,30 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { fusionCanvas.remove(); } + /** + * Generates a random number using the current battle's seed, or the global seed if `this.scene.currentBattle` is falsy + * + * This calls either {@linkcode BattleScene.randBattleSeedInt}({@linkcode range}, {@linkcode min}) in `src/battle-scene.ts` + * which calls {@linkcode Battle.randSeedInt}(`scene`, {@linkcode range}, {@linkcode min}) in `src/battle.ts` + * which calls {@linkcode Utils.randSeedInt randSeedInt}({@linkcode range}, {@linkcode min}) in `src/utils.ts`, + * or it directly calls {@linkcode Utils.randSeedInt randSeedInt}({@linkcode range}, {@linkcode min}) in `src/utils.ts` if there is no current battle + * + * @param range How large of a range of random numbers to choose from. If {@linkcode range} <= 1, returns {@linkcode min} + * @param min The minimum integer to pick, default `0` + * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) + */ randSeedInt(range: integer, min: integer = 0): integer { return this.scene.currentBattle ? this.scene.randBattleSeedInt(range, min) : Utils.randSeedInt(range, min); } + /** + * Generates a random number using the current battle's seed, or the global seed if `this.scene.currentBattle` is falsy + * @param min The minimum integer to generate + * @param max The maximum integer to generate + * @returns a random integer between {@linkcode min} and {@linkcode max} inclusive + */ randSeedIntRange(min: integer, max: integer): integer { return this.randSeedInt((max - min) + 1, min); } @@ -4483,6 +4508,7 @@ export interface AttackMoveResult { } export class PokemonSummonData { + /** [Atk, Def, SpAtk, SpDef, Spd, Acc, Eva] */ public statStages: number[] = [ 0, 0, 0, 0, 0, 0, 0 ]; public moveQueue: QueuedMove[] = []; public tags: BattlerTag[] = []; diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts index 652e3d58062..bb3cfcbeb3b 100644 --- a/src/inputs-controller.ts +++ b/src/inputs-controller.ts @@ -16,7 +16,7 @@ import { getIconForLatestInput, swap, } from "#app/configs/inputs/configHandler"; import BattleScene from "./battle-scene"; -import {SettingGamepad} from "#app/system/settings/settings-gamepad.js"; +import {SettingGamepad} from "#app/system/settings/settings-gamepad"; import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; import TouchControl from "#app/touch-controls"; import { Button } from "#enums/buttons"; diff --git a/src/locales/de/ability-trigger.json b/src/locales/de/ability-trigger.json index 60f3432df98..379692c45ae 100644 --- a/src/locales/de/ability-trigger.json +++ b/src/locales/de/ability-trigger.json @@ -12,6 +12,7 @@ "typeImmunityHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} vermeidet Schaden mit {{abilityName}}!", "disguiseAvoidedDamage": "Die Tarnung von {{pokemonNameWithAffix}} ist aufgeflogen!!", + "fullHpResistType": "Der Panzer von {{pokemonNameWithAffix}} funkelt und verzerrt die Wechselwirkungen zwischen den Typen!", "moveImmunity": "Es hat keine Wirkung auf {{pokemonNameWithAffix}}...", "reverseDrain": "{{pokemonNameWithAffix}} saugt Kloakensoße auf!", "postDefendTypeChange": "{{abilityName}} von {{pokemonNameWithAffix}} macht es zu einem {{typeName}}-Typ!", @@ -51,6 +52,7 @@ "postSummonTeravolt": "{{pokemonNameWithAffix}} strahlt eine knisternde Aura aus!", "postSummonDarkAura": "{{pokemonNameWithAffix}} strahlt eine dunkle Aura aus!", "postSummonFairyAura": "{{pokemonNameWithAffix}} strahlt eine Feenaura aus!", + "postSummonAuraBreak": "{{pokemonNameWithAffix}} kehrt die Wirkung aller Aura-Fähigkeiten um!", "postSummonNeutralizingGas": "Reaktionsgas von {{pokemonNameWithAffix}} hat sich in der Umgebung ausgebreitet!", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!", @@ -59,4 +61,4 @@ "postSummonTabletsOfRuin": "Unheilstafeln von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", "postSummonBeadsOfRuin": "Unheilsjuwelen von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", "preventBerryUse": "{{pokemonNameWithAffix}} kriegt vor Anspannung keine Beeren mehr runter!" -} \ No newline at end of file +} diff --git a/src/locales/de/battle.json b/src/locales/de/battle.json index 05205b001b6..38e36d4b2da 100644 --- a/src/locales/de/battle.json +++ b/src/locales/de/battle.json @@ -44,6 +44,7 @@ "moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.", "moveNoPP": "Es sind keine AP für diese Attacke mehr übrig!", "moveDisabled": "{{moveName}} ist deaktiviert!", + "disableInterruptedMove": "{{moveName}} von {{pokemonNameWithAffix}} ist blockiert!", "noPokeballForce": "Eine unsichtbare Kraft verhindert die Nutzung von Pokébällen.", "noPokeballTrainer": "Du kannst das Pokémon eines anderen Trainers nicht fangen!", "noPokeballMulti": "Du kannst erst einen Pokéball werfen, wenn nur noch ein Pokémon übrig ist!", @@ -96,4 +97,4 @@ "congratulations": "Glückwunsch!", "beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!", "eggSkipPrompt": "Zur Ei-Zusammenfassung springen?" -} \ No newline at end of file +} diff --git a/src/locales/de/battler-tags.json b/src/locales/de/battler-tags.json index 5509cc11b0a..e65e1ddfe75 100644 --- a/src/locales/de/battler-tags.json +++ b/src/locales/de/battler-tags.json @@ -67,5 +67,7 @@ "saltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!", "cursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!", "cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!", - "stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!" -} \ No newline at end of file + "stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!", + "disabledOnAdd": " {{moveName}} von {{pokemonNameWithAffix}} wurde blockiert!", + "disabledLapse": "{{moveName}} von {{pokemonNameWithAffix}} ist nicht länger blockiert!" +} diff --git a/src/locales/de/menu.json b/src/locales/de/menu.json index e5c1c700425..0e2ba4dc0b3 100644 --- a/src/locales/de/menu.json +++ b/src/locales/de/menu.json @@ -51,5 +51,7 @@ "renamePokemon": "Pokémon umbennenen", "rename": "Umbenennen", "nickname": "Spitzname", - "errorServerDown": "Ups! Es gab einen Fehler beim Versuch\nden Server zu kontaktieren\nLasse dieses Fenster offen\nDu wirst automatisch neu verbunden." -} \ No newline at end of file + "errorServerDown": "Ups! Es gab einen Fehler beim Versuch\nden Server zu kontaktieren\nLasse dieses Fenster offen\nDu wirst automatisch neu verbunden.", + "noSaves": "Du hast keine gespeicherten Dateien!", + "tooManySaves": "Du hast zu viele gespeicherte Dateien!" +} diff --git a/src/locales/de/modifier-type.json b/src/locales/de/modifier-type.json index 8e2372cb447..7c7972343d6 100644 --- a/src/locales/de/modifier-type.json +++ b/src/locales/de/modifier-type.json @@ -47,10 +47,14 @@ "description": "Ändert das Wesen zu {{natureName}}. Schaltet dieses Wesen permanent für diesen Starter frei." }, "DoubleBattleChanceBoosterModifierType": { - "description": "Verdoppelt die Wahrscheinlichkeit, dass die nächsten {{battleCount}} Begegnungen mit wilden Pokémon ein Doppelkampf sind." + "description": "Vervierfacht die Chance, dass ein Kampf ein Doppelkampf wird, für bis zu {{battleCount}} Kämpfe." }, "TempStatStageBoosterModifierType": { - "description": "Erhöht die {{stat}} aller Teammitglieder für 5 Kämpfe um eine Stufe." + "description": "Erhöht {{stat}} aller Teammitglieder um {{amount}} für bis zu 5 Kämpfe.", + "extra": { + "stage": "eine Stufe", + "percentage": "30%" + } }, "AttackTypeBoosterModifierType": { "description": "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%." diff --git a/src/locales/en/ability-trigger.json b/src/locales/en/ability-trigger.json index 4f1d4dac766..da21d80e3c7 100644 --- a/src/locales/en/ability-trigger.json +++ b/src/locales/en/ability-trigger.json @@ -3,7 +3,7 @@ "badDreams": "{{pokemonName}} is tormented!", "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} avoided\ndamage with {{abilityName}}!", - "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", + "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both Pokémon in 3 turns!", "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", @@ -52,6 +52,7 @@ "postSummonTeravolt": "{{pokemonNameWithAffix}} is radiating a bursting aura!", "postSummonDarkAura": "{{pokemonNameWithAffix}} is radiating a Dark Aura!", "postSummonFairyAura": "{{pokemonNameWithAffix}} is radiating a Fairy Aura!", + "postSummonAuraBreak": "{{pokemonNameWithAffix}} reversed all other Pokémon's auras!", "postSummonNeutralizingGas": "{{pokemonNameWithAffix}}'s Neutralizing Gas filled the area!", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} has two Abilities!", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} has two Abilities!", @@ -60,4 +61,4 @@ "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "preventBerryUse": "{{pokemonNameWithAffix}} is too\nnervous to eat berries!" -} \ No newline at end of file +} diff --git a/src/locales/en/challenges.json b/src/locales/en/challenges.json index 7d330401407..7792755d626 100644 --- a/src/locales/en/challenges.json +++ b/src/locales/en/challenges.json @@ -1,6 +1,6 @@ { "title": "Challenge Modifiers", - "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", + "illegalEvolution": "{{pokemon}} changed into an ineligible Pokémon\nfor this challenge!", "noneSelected": "None Selected", "singleGeneration": { "name": "Mono Gen", @@ -34,4 +34,4 @@ "value.0": "Off", "value.1": "On" } -} \ No newline at end of file +} diff --git a/src/locales/en/menu.json b/src/locales/en/menu.json index 97cfc0b019d..91888e9db31 100644 --- a/src/locales/en/menu.json +++ b/src/locales/en/menu.json @@ -51,5 +51,7 @@ "renamePokemon": "Rename Pokémon", "rename": "Rename", "nickname": "Nickname", - "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect." + "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", + "noSaves": "You don't have any save files on record!", + "tooManySaves": "You have too many save files on record!" } \ No newline at end of file diff --git a/src/locales/en/modifier-type.json b/src/locales/en/modifier-type.json index f73a3dcccae..babad57b81b 100644 --- a/src/locales/en/modifier-type.json +++ b/src/locales/en/modifier-type.json @@ -47,10 +47,14 @@ "description": "Changes a Pokémon's nature to {{natureName}} and permanently unlocks the nature for the starter." }, "DoubleBattleChanceBoosterModifierType": { - "description": "Doubles the chance of an encounter being a double battle for {{battleCount}} battles." + "description": "Quadruples the chance of an encounter being a double battle for up to {{battleCount}} battles." }, "TempStatStageBoosterModifierType": { - "description": "Increases the {{stat}} of all party members by 1 stage for 5 battles." + "description": "Increases the {{stat}} of all party members by {{amount}} for up to 5 battles.", + "extra": { + "stage": "1 stage", + "percentage": "30%" + } }, "AttackTypeBoosterModifierType": { "description": "Increases the power of a Pokémon's {{moveType}}-type moves by 20%." diff --git a/src/locales/es/ability-trigger.json b/src/locales/es/ability-trigger.json index 8bbcc80662c..4380c84b8e9 100644 --- a/src/locales/es/ability-trigger.json +++ b/src/locales/es/ability-trigger.json @@ -12,6 +12,7 @@ "blockItemTheft": "¡{{pokemonNameWithAffix}} evitó el robo gracias a {{abilityName}}!", "typeImmunityHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", "nonSuperEffectiveImmunity": "¡{{pokemonNameWithAffix}} evitó el daño gracias a {{abilityName}}!", + "fullHpResistType": "¡{{pokemonNameWithAffix}} ha hecho brillar su caparazón\ny ha alterado su compatibilidad entre tipos!", "moveImmunity": "¡No afecta a {{pokemonNameWithAffix}}!", "reverseDrain": "¡{{pokemonNameWithAffix}} absorbió lodo líquido!", "postDefendTypeChange": "¡{{abilityName}} de {{pokemonNameWithAffix}} cambió a tipo {{typeName}}!", @@ -51,6 +52,7 @@ "postSummonTeravolt": "¡{{pokemonNameWithAffix}} irradia un aura chisporroteante!", "postSummonDarkAura": "¡{{pokemonNameWithAffix}} irradia un aura oscura!", "postSummonFairyAura": "¡{{pokemonNameWithAffix}} irradia un aura feérica!", + "postSummonAuraBreak": "¡{{pokemonNameWithAffix}} ha invertido todas las auras!", "postSummonNeutralizingGas": "¡El Gas Reactivo de {{pokemonNameWithAffix}} se propaga por toda la zona!", "postSummonAsOneGlastrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!", "postSummonAsOneSpectrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!", diff --git a/src/locales/es/battle.json b/src/locales/es/battle.json index 8573f74a94e..c79315f297b 100644 --- a/src/locales/es/battle.json +++ b/src/locales/es/battle.json @@ -42,6 +42,7 @@ "moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.", "moveNoPP": "¡No hay suficientes PP\npara este movimiento!", "moveDisabled": "!No puede usar {{moveName}} porque ha sido anulado!", + "disableInterruptedMove": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!", "noPokeballForce": "Una fuerza misteriosa\nte impide usar Poké Balls.", "noPokeballTrainer": "¡No puedes atrapar a los\nPokémon de los demás!", "noPokeballMulti": "¡No se pueden lanzar Poké Balls\ncuando hay más de un Pokémon!", @@ -85,4 +86,4 @@ "statSeverelyFell_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han bajado muchísimo!", "statWontGoAnyLower_one": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!", "statWontGoAnyLower_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} no pueden bajar más!" -} \ No newline at end of file +} diff --git a/src/locales/es/battler-tags.json b/src/locales/es/battler-tags.json index d917b6c74b5..891fda53c5d 100644 --- a/src/locales/es/battler-tags.json +++ b/src/locales/es/battler-tags.json @@ -67,5 +67,7 @@ "saltCuredLapse": "¡{{moveName}} ha herido a {{pokemonNameWithAffix}}!", "cursedOnAdd": "¡{{pokemonNameWithAffix}} sacrifica algunos PS y maldice a {{pokemonName}}!", "cursedLapse": "¡{{pokemonNameWithAffix}} es víctima de una maldición!", - "stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!" + "stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!", + "disabledOnAdd": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!", + "disabledLapse": "¡El movimiento {{moveName}} de {{pokemonNameWithAffix}} \n ya no está anulado!" } diff --git a/src/locales/es/menu.json b/src/locales/es/menu.json index 3f2caafac21..ef1ae93dd82 100644 --- a/src/locales/es/menu.json +++ b/src/locales/es/menu.json @@ -51,5 +51,7 @@ "renamePokemon": "Renombrar Pokémon.", "rename": "Renombrar", "nickname": "Apodo", - "errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta, el juego se reconectará automáticamente." + "errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta, el juego se reconectará automáticamente.", + "noSaves": "No tienes ninguna partida guardada registrada!", + "tooManySaves": "¡Tienes demasiadas partidas guardadas registradas!" } diff --git a/src/locales/es/modifier-type.json b/src/locales/es/modifier-type.json index e18cb19244d..3ac4d85f793 100644 --- a/src/locales/es/modifier-type.json +++ b/src/locales/es/modifier-type.json @@ -47,10 +47,14 @@ "description": "Cambia la naturaleza de un Pokémon a {{natureName}} y desbloquea permanentemente dicha naturaleza para el inicial." }, "DoubleBattleChanceBoosterModifierType": { - "description": "Duplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates." + "description": "Cuadruplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates." }, "TempStatStageBoosterModifierType": { - "description": "Aumenta la est. {{stat}} de todos los miembros del equipo en 1 nivel durante 5 combates." + "description": "Aumenta la est. {{stat}} de todos los miembros del equipo en {{amount}} durante 5 combates.", + "extra": { + "stage": "1 nivel", + "percentage": "30%" + } }, "AttackTypeBoosterModifierType": { "description": "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%." diff --git a/src/locales/fr/ability-trigger.json b/src/locales/fr/ability-trigger.json index d10fc18a146..761242b3d94 100644 --- a/src/locales/fr/ability-trigger.json +++ b/src/locales/fr/ability-trigger.json @@ -3,14 +3,15 @@ "badDreams": "{{pokemonName}} a le sommeil agité !", "costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} évite les dégâts\navec {{abilityName}} !", - "perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !", - "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !", + "perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !", + "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !", "trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !", - "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !", + "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !", "quickDraw": "Tir Vif permet à {{pokemonName}}\nd’agir plus vite que d’habitude !", "blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche son objet d’être volé !", - "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} évite\nles dégâts avec {{abilityName}} !", + "fullHpResistType": "{{pokemonNameWithAffix}} fait briller sa carapace\net fausse les affinités de type !", "disguiseAvoidedDamage": "Le déguisement de {{pokemonNameWithAffix}}\ntombe !", "moveImmunity": "Ça n’affecte pas {{pokemonNameWithAffix}}…", "reverseDrain": "{{pokemonNameWithAffix}} aspire\nle suintement !", @@ -33,12 +34,12 @@ "battlerTagImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche {{battlerTagName}} !", "forewarn": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} a été détectée !", "frisk": "{{pokemonNameWithAffix}} fouille {{opponentName}}\net trouve son talent {{opponentAbilityName}} !", - "postWeatherLapseHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "postWeatherLapseHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", "postWeatherLapseDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !", "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} a récolté\nune {{berryName}} !", - "postTurnHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "postTurnHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", "fetchBall": "{{pokemonNameWithAffix}} trouve\nune {{pokeballName}} !", - "healFromBerryUse": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "healFromBerryUse": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", "arenaTrap": "{{pokemonNameWithAffix}} empêche\nles changements grâce à son talent {{abilityName}} !", "postBattleLoot": "{{pokemonNameWithAffix}} ramasse\nl’objet {{itemName}} !", "postFaintContactDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !", @@ -49,8 +50,9 @@ "postSummonAnticipation": "{{pokemonNameWithAffix}}\nest tout tremblant !", "postSummonTurboblaze": "{{pokemonNameWithAffix}} dégage\nune aura de flammes incandescentes !", "postSummonTeravolt": "{{pokemonNameWithAffix}} dégage\nune aura électrique instable !", - "postSummonDarkAura": "{{pokemonNameWithAffix}} dégage\nune aura ténébreuse !", + "postSummonDarkAura": "{{pokemonNameWithAffix}} dégage\nune aura ténébreuse !", "postSummonFairyAura": "{{pokemonNameWithAffix}} dégage\nune aura enchanteresse !", + "postSummonAuraBreak": "{{pokemonNameWithAffix}} inverse\ntoutes les auras !", "postSummonNeutralizingGas": "Le gaz inhibiteur {{pokemonNameWithAffix}}\nenvahit les lieux !", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\na deux talents !", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\na deux talents !", diff --git a/src/locales/fr/achv.json b/src/locales/fr/achv.json index 3e95f9326ca..a557a423db7 100644 --- a/src/locales/fr/achv.json +++ b/src/locales/fr/achv.json @@ -227,7 +227,7 @@ "name": "Angry Birds" }, "MONO_POISON": { - "name": "Touche moi je t’empoisonne !" + "name": "Touche moi je t’empoisonne !" }, "MONO_GROUND": { "name": "Prévisions : Séisme" @@ -242,7 +242,7 @@ "name": "SOS Fantômes" }, "MONO_STEEL": { - "name": "De type Acier !" + "name": "De type Acier !" }, "MONO_FIRE": { "name": "Allumer le feu" diff --git a/src/locales/fr/arena-tag.json b/src/locales/fr/arena-tag.json index c3c705290fa..9cb2f342068 100644 --- a/src/locales/fr/arena-tag.json +++ b/src/locales/fr/arena-tag.json @@ -54,4 +54,4 @@ "safeguardOnRemove": "Le terrain n’est plus protégé\npar le voile mystérieux !", "safeguardOnRemovePlayer": "Votre équipe n’est plus protégée\npar le voile mystérieux !", "safeguardOnRemoveEnemy": "L’équipe ennemie n’est plus protégée\npar le voile mystérieux !" -} \ No newline at end of file +} diff --git a/src/locales/fr/battle.json b/src/locales/fr/battle.json index b8da3a953ae..7b78c963187 100644 --- a/src/locales/fr/battle.json +++ b/src/locales/fr/battle.json @@ -1,70 +1,71 @@ { "bossAppeared": "Un {{bossName}} apparait.", - "trainerAppeared": "Un combat est lancé\npar {{trainerName}} !", - "trainerAppearedDouble": "Un combat est lancé\npar {{trainerName}} !", + "trainerAppeared": "Un combat est lancé\npar {{trainerName}} !", + "trainerAppearedDouble": "Un combat est lancé\npar {{trainerName}} !", "trainerSendOut": "{{pokemonName}} est envoyé par\n{{trainerName}} !", - "singleWildAppeared": "Un {{pokemonName}} sauvage apparait !", - "multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !", - "playerComeBack": "{{pokemonName}} !\nReviens !", - "trainerComeBack": "{{trainerName}} retire {{pokemonName}} !", - "playerGo": "{{pokemonName}} ! Go !", - "trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !", - "switchQuestion": "Voulez-vous changer\nvotre {{pokemonName}} ?", - "trainerDefeated": "Vous avez battu\n{{trainerName}} !", - "moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !", + "singleWildAppeared": "Un {{pokemonName}} sauvage apparait !", + "multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !", + "playerComeBack": "{{pokemonName}} !\nReviens !", + "trainerComeBack": "{{trainerName}} retire\n{{pokemonName}} !", + "playerGo": "{{pokemonName}} ! Go !", + "trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !", + "switchQuestion": "Voulez-vous changer\n{{pokemonName}} ?", + "trainerDefeated": "Vous avez battu\n{{trainerName}} !", + "moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !", "moneyPickedUp": "Vous obtenez {{moneyAmount}} ₽ !", - "pokemonCaught": "Vous avez attrapé {{pokemonName}} !", + "pokemonCaught": "Vous avez attrapé\n{{pokemonName}} !", "addedAsAStarter": "{{pokemonName}} est ajouté\ncomme starter !", "partyFull": "Votre équipe est pleine.\nRelâcher un Pokémon pour {{pokemonName}} ?", - "pokemon": "Pokémon", - "sendOutPokemon": "{{pokemonName}} ! Go !", + "pokemon": "de Pokémon", + "sendOutPokemon": "{{pokemonName}} ! Go !", "hitResultCriticalHit": "Coup critique !", "hitResultSuperEffective": "C’est super efficace !", "hitResultNotVeryEffective": "Ce n’est pas très efficace…", "hitResultNoEffect": "Ça n’affecte pas {{pokemonName}}…", "hitResultImmune": "{{pokemonName}} n’est pas affecté !", "hitResultOneHitKO": "K.O. en un coup !", - "attackFailed": "Mais cela échoue !", + "attackFailed": "Mais cela échoue !", "attackMissed": "{{pokemonNameWithAffix}}\névite l’attaque !", - "attackHitsCount": "Touché {{count}} fois !", + "attackHitsCount": "Touché {{count}} fois !", "rewardGain": "Vous recevez\n{{modifierName}} !", - "expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !", - "levelUp": "{{pokemonName}} monte au\nN. {{level}} !", - "learnMove": "{{pokemonName}} apprend\n{{moveName}} !", + "expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !", + "levelUp": "{{pokemonName}} monte au\nN. {{level}} !", + "learnMove": "{{pokemonName}} apprend\n{{moveName}} !", "learnMovePrompt": "{{pokemonName}} veut apprendre\n{{moveName}}.", "learnMoveLimitReached": "Cependant, {{pokemonName}} connait\ndéjà quatre capacités.", - "learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?", - "learnMoveStopTeaching": "Arrêter d’apprendre\n{{moveName}} ?", + "learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?", + "learnMoveStopTeaching": "Arrêter d’apprendre\n{{moveName}} ?", "learnMoveNotLearned": "{{pokemonName}} n’a pas appris\n{{moveName}}.", - "learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?", + "learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?", "learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.", "countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Tadaaa !", "learnMoveAnd": "Et…", - "levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !", + "levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !", "moveNotImplemented": "{{moveName}} n’est pas encore implémenté et ne peut pas être sélectionné.", "moveNoPP": "Il n’y a plus de PP pour\ncette capacité !", - "moveDisabled": "{{moveName}} est sous entrave !", + "moveDisabled": "{{moveName}} est sous entrave !", + "disableInterruptedMove": "Il y a une entrave sur la capacité {{moveName}}\nde{{pokemonNameWithAffix}} !", "noPokeballForce": "Une force mystérieuse\nempêche l’utilisation des Poké Balls.", - "noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, c’est mal !", - "noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon !", - "noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez d’abord l’affaiblir !", + "noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, c’est mal !", + "noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon !", + "noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez d’abord l’affaiblir !", "noEscapeForce": "Une force mystérieuse\nempêche la fuite.", - "noEscapeTrainer": "On ne s’enfuit pas d’un\ncombat de Dresseurs !", - "noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !", - "runAwaySuccess": "Vous prenez la fuite !", - "runAwayCannotEscape": "Fuite impossible !", + "noEscapeTrainer": "On ne s’enfuit pas d’un\ncombat de Dresseurs !", + "noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !", + "runAwaySuccess": "Vous prenez la fuite !", + "runAwayCannotEscape": "Fuite impossible !", "escapeVerbSwitch": "le changement", "escapeVerbFlee": "la fuite", - "notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} n’est plus sous entrave !", + "notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} n’est plus sous entrave !", "turnEndHpRestore": "{{pokemonName}} récupère des PV !", "hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !", - "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?", + "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?", "itemStackFull": "Quantité maximale de {{fullItemName}} atteinte.\nVous recevez {{itemName}} à la place.", - "eggHatching": "Hein ?", - "ivScannerUseQuestion": "Utiliser le Scanner d’IV\nsur {{pokemonName}} ?", + "eggHatching": "Hein ?", + "ivScannerUseQuestion": "Utiliser le Scanner d’IV\nsur {{pokemonName}} ?", "wildPokemonWithAffix": "{{pokemonName}} sauvage", "foePokemonWithAffix": "{{pokemonName}} ennemi", - "useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !", + "useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !", "stealEatBerry": "{{pokemonName}} vole et mange\nla {{berryName}} de {{targetName}} !", "ppHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure les PP de sa capacité {{moveName}} !", "hpHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure son énergie !", @@ -73,27 +74,27 @@ "fainted": "{{pokemonNameWithAffix}}\nest K.O. !", "statsAnd": "et", "stats": "Les stats", - "statRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !", - "statRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent !", - "statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !", - "statSharplyRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent beaucoup !", - "statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !", - "statRoseDrastically_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent énormément !", - "statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !", - "statWontGoAnyHigher_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus augmenter !", - "statFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !", - "statFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent !", - "statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !", - "statHarshlyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent beaucoup !", - "statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !", - "statSeverelyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent énormément !", - "statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !", - "statWontGoAnyLower_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus baisser !", - "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", - "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !", - "retryBattle": "Voulez-vous réessayer depuis le début du combat ?", + "statRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !", + "statRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent !", + "statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !", + "statSharplyRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent beaucoup !", + "statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !", + "statRoseDrastically_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent énormément !", + "statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !", + "statWontGoAnyHigher_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus augmenter !", + "statFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !", + "statFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent !", + "statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !", + "statHarshlyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent beaucoup !", + "statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !", + "statSeverelyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent énormément !", + "statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !", + "statWontGoAnyLower_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus baisser !", + "transformedIntoType": "{{pokemonName}} prend\nle type {{type}} !", + "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !", + "retryBattle": "Voulez-vous réessayer depuis le début du combat ?", "unlockedSomething": "{{unlockedThing}}\na été débloqué.", - "congratulations": "Félicitations !", - "beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !", - "eggSkipPrompt": "Aller directement au résumé des Œufs éclos ?" + "congratulations": "Félicitations !", + "beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !", + "eggSkipPrompt": "Aller directement au résumé des Œufs éclos ?" } diff --git a/src/locales/fr/battler-tags.json b/src/locales/fr/battler-tags.json index 46b086938b3..f523eb7f07d 100644 --- a/src/locales/fr/battler-tags.json +++ b/src/locales/fr/battler-tags.json @@ -29,8 +29,8 @@ "nightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !", "nightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier d’un cauchemar !", "nightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier d’un cauchemar !", - "encoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !", - "encoreOnRemove": "{{pokemonNameWithAffix}} n’est\nplus obligé d’utiliser la même capacité !", + "encoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !", + "encoreOnRemove": "{{pokemonNameWithAffix}} n’est\nplus obligé d’utiliser la même capacité !", "helpingHandOnAdd": "{{pokemonNameWithAffix}} est prêt\nà aider {{pokemonName}} !", "ingrainLapse": "{{pokemonNameWithAffix}} absorbe\ndes nutriments avec ses racines !", "ingrainOnTrap": "{{pokemonNameWithAffix}}\nplante ses racines !", @@ -50,22 +50,24 @@ "protectedOnAdd": "{{pokemonNameWithAffix}}\nest prêt à se protéger !", "protectedLapse": "{{pokemonNameWithAffix}}\nse protège !", "enduringOnAdd": "{{pokemonNameWithAffix}} se prépare\nà encaisser les coups !", - "enduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", - "sturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", + "enduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", + "sturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", "perishSongLapse": "Le compte à rebours de Requiem\nde {{pokemonNameWithAffix}} descend à {{turnCount}} !", - "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de l’attention !", - "truantLapse": "{{pokemonNameWithAffix}} paresse !", - "slowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !", - "slowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !", - "highestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !", - "highestStatBoostOnRemove": "L’effet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !", - "magnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !", - "magnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse dissipe !", + "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de l’attention !", + "truantLapse": "{{pokemonNameWithAffix}} paresse !", + "slowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !", + "slowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !", + "highestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !", + "highestStatBoostOnRemove": "L’effet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !", + "magnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !", + "magnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse dissipe !", "critBoostOnAdd": "{{pokemonNameWithAffix}}\nest prêt à tout donner !", "critBoostOnRemove": "{{pokemonNameWithAffix}} se détend.", - "saltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !", + "saltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !", "saltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !", "cursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !", "cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !", - "stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !" -} \ No newline at end of file + "stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !", + "disabledOnAdd": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} est mise sous entrave !", + "disabledLapse": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} n’est plus sous entrave !" +} diff --git a/src/locales/fr/command-ui-handler.json b/src/locales/fr/command-ui-handler.json index a991c618820..82733837375 100644 --- a/src/locales/fr/command-ui-handler.json +++ b/src/locales/fr/command-ui-handler.json @@ -3,5 +3,5 @@ "ball": "Ball", "pokemon": "Pokémon", "run": "Fuite", - "actionMessage": "Que doit faire\n{{pokemonName}} ?" -} \ No newline at end of file + "actionMessage": "Que doit faire\n{{pokemonName}} ?" +} diff --git a/src/locales/fr/dialogue-double-battle.json b/src/locales/fr/dialogue-double-battle.json index d35e9d87ced..fbc5d56ed26 100644 --- a/src/locales/fr/dialogue-double-battle.json +++ b/src/locales/fr/dialogue-double-battle.json @@ -1,83 +1,83 @@ { "blue_red_double": { "encounter": { - "1": "Blue : Hé Red, montrons-lui de quel bois on se chauffe !\n$Red : …\n$Blue : Voilà la puissance du Bourg Palette !" + "1": "Blue : Hé Red, montrons-lui de quel bois on se chauffe !\n$Red : …\n$Blue : Voilà la puissance du Bourg Palette !" }, "victory": { - "1": "Blue : C’était un magnifique combat !\n$Red : …" + "1": "Blue : C’était un magnifique combat !\n$Red : …" } }, "red_blue_double": { "encounter": { - "1": "Red : … !\n$Blue : Il est pas très loquace.\n$Blue : Mais ne te laisse pas avoir, ça reste un Maitre Pokémon !" + "1": "Red : … !\n$Blue : Il est pas très loquace.\n$Blue : Mais ne te laisse pas avoir, ça reste un Maitre Pokémon !" }, "victory": { - "1": "Red : … !\n$Blue : La prochaine fois, on va te battre !" + "1": "Red : … !\n$Blue : La prochaine fois, on va te battre !" } }, "tate_liza_double": { "encounter": { - "1": "Lévy : Héhéhé… Tu en fais une drôle de tête.\n$Tatia : Tu ne t’attendais pas à rencontrer deux Champions, n’est-ce pas ?\n$Lévy : Nous sommes des jumeaux !\n$Tatia : Nous n’avons pas besoin de parler entre nous !\n$Lévy : Tu crois pouvoir briser…\n$Tatia : … Notre duo parfait ?" + "1": "Lévy : Héhéhé… Tu en fais une drôle de tête.\n$Tatia : Tu ne t’attendais pas à rencontrer deux Champions, n’est-ce pas ?\n$Lévy : Nous sommes des jumeaux !\n$Tatia : Nous n’avons pas besoin de parler entre nous !\n$Lévy : Tu crois pouvoir briser…\n$Tatia : … Notre duo parfait ?" }, "victory": { - "1": "Lévy : Quoi ? Notre combinaison était parfaite !\n$Tatia : Nous avons encore besoin d’entrainement…" + "1": "Lévy : Quoi ? Notre combinaison était parfaite !\n$Tatia : Nous avons encore besoin d’entrainement…" } }, "liza_tate_double": { "encounter": { - "1": "Tatia : Hihih… Si tu voyais ta tête !\n$Lévy : Oui, nous sommes deux Champions en un !\n$Tatia : Voici mon frère, Lévy…\n$Lévy : … Et ma sœur, Tatia !\n$Tatia : Tu ne penses pas que notre combinaison est parfaite ?" + "1": "Tatia : Hihih… Si tu voyais ta tête !\n$Lévy : Oui, nous sommes deux Champions en un !\n$Tatia : Voici mon frère, Lévy…\n$Lévy : … Et ma sœur, Tatia !\n$Tatia : Tu ne penses pas que notre combinaison est parfaite ?" }, "victory": { - "1": "Tatia : Quoi ? Notre combinaison…\n$Lévy : … a échoué !" + "1": "Tatia : Quoi ? Notre combinaison…\n$Lévy : … a échoué !" } }, "wallace_steven_double": { "encounter": { - "1": "Pierre R. : Marc, montrons-lui la puissance des Maitres !\n$Marc : Tu vas gouter au pouvoir de Hoenn !\n$Pierre R. : C’est parti !" + "1": "Pierre R. : Marc, montrons-lui la puissance des Maitres !\n$Marc : Tu vas gouter au pouvoir de Hoenn !\n$Pierre R. : C’est parti !" }, "victory": { - "1": "Pierre R. : C’était un beau combat !\n$Marc : Ce sera notre tour la prochaine fois !" + "1": "Pierre R. : C’était un beau combat !\n$Marc : Ce sera notre tour la prochaine fois !" } }, "steven_wallace_double": { "encounter": { - "1": "Pierre R. : Excuse-moi, aurais-tu des Pokémon rares ?\n$Marc : Pierre… Nous sommes là pour nous battre, pas pour frimer avec nos Pokémon.\n$Pierre R. : Oh… Je vois… Commençons alors !" + "1": "Pierre R. : Excuse-moi, aurais-tu des Pokémon rares ?\n$Marc : Pierre… Nous sommes là pour nous battre, pas pour frimer avec nos Pokémon.\n$Pierre R. : Oh… Je vois… Commençons alors !" }, "victory": { - "1": "Pierre R. : Bien, maintenant que ce combat est clos, montrons-nous nos Pokémon !\n$Marc : Pierre…" + "1": "Pierre R. : Bien, maintenant que ce combat est clos, montrons-nous nos Pokémon !\n$Marc : Pierre…" } }, "alder_iris_double": { "encounter": { - "1": "Goyah : Nous sommes l’élite des Dresseurs d’Unys !\n$Iris : Rien de mieux que des combats contre des prodiges !" + "1": "Goyah : Nous sommes l’élite des Dresseurs d’Unys !\n$Iris : Rien de mieux que des combats contre des prodiges !" }, "victory": { - "1": "Goyah : INCROYABLE ! T’es trop doué !\n$Iris : On gagnera la prochaine fois !" + "1": "Goyah : INCROYABLE ! T’es trop doué !\n$Iris : On gagnera la prochaine fois !" } }, "iris_alder_double": { "encounter": { - "1": "Iris : Bienvenue, Dresseur ! Je suis LA Maitresse d’Unys !\n$Goyah : Iris, concentre-toi s’il te plait…" + "1": "Iris : Bienvenue, Dresseur ! Je suis LA Maitresse d’Unys !\n$Goyah : Iris, concentre-toi s’il te plait…" }, "victory": { - "1": "Iris : On a tout donné et pourtant…\n$Goyah : Cette défaite ne pourra que nous être bénéfique !" + "1": "Iris : On a tout donné et pourtant…\n$Goyah : Cette défaite ne pourra que nous être bénéfique !" } }, "piers_marnie_double": { "encounter": { - "1": "Rosemary : Frérot, montrons-lui la puissance de Smashings !\n$Peterson : Nous sommes les ténèbres !" + "1": "Rosemary : Frérot, montrons-lui la puissance de Smashings !\n$Peterson : Nous sommes les ténèbres !" }, "victory": { - "1": "Rosemary : T’as amené la lumière dans les ténèbres !\n$Peterson : P’têtre un peu trop…" + "1": "Rosemary : T’as amené la lumière dans les ténèbres !\n$Peterson : P’têtre un peu trop…" } }, "marnie_piers_double": { "encounter": { - "1": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Il est pas là pour chanter, mais se battre…", - "1_female": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Elle est pas là pour chanter, mais se battre…" + "1": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Il est pas là pour chanter, mais se battre…", + "1_female": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Elle est pas là pour chanter, mais se battre…" }, "victory": { - "1": "Peterson : Ça c’est du rock !\n$Rosemary : Frérot…" + "1": "Peterson : Ça c’est du rock !\n$Rosemary : Frérot…" } } } diff --git a/src/locales/fr/dialogue-final-boss.json b/src/locales/fr/dialogue-final-boss.json index c5a5e3b7d89..b7226ebb480 100644 --- a/src/locales/fr/dialogue-final-boss.json +++ b/src/locales/fr/dialogue-final-boss.json @@ -1,6 +1,6 @@ { - "encounter": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelé ici parce que t’y es déjà venu.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.", - "encounter_female": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelée ici parce que t’y es déjà venue.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.", + "encounter": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelé ici parce que t’y es déjà venu.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.", + "encounter_female": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelée ici parce que t’y es déjà venue.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.", "firstStageWin": "Je vois. Cette présence était bien réelle.\nJe n’ai donc plus besoin de retenir mes coups.\n$Ne me déçoit pas.", "secondStageWin": "… Magnifique." -} \ No newline at end of file +} diff --git a/src/locales/fr/dialogue-misc.json b/src/locales/fr/dialogue-misc.json index c8c781002b9..864bd53eab5 100644 --- a/src/locales/fr/dialogue-misc.json +++ b/src/locales/fr/dialogue-misc.json @@ -1,6 +1,6 @@ { - "ending": "@c{shock}T’es revenu ?@d{32} Ça veut dire…@d{96} que t’as gagné ?!\n@c{smile_ehalf}J’aurais dû m’en douter.\n$@c{smile_eclosed}Bien sûr… J’ai toujours eu ce sentiment.\n@c{smile}C’est fini maintenant hein ? T’as brisé ce cycle.\n$@c{smile_ehalf}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que t’as fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile}Jamais j’oublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un p’tit combat, comme au bon vieux temps ?", - "ending_female": "@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J’aurais dû m’en douter.\nMais te voilà enfin de retour.\n$@c{smile}C’est terminé.@d{64} T’as brisé ce cycle infernal.\n$@c{serious_smile_fists}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que t’as fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, j’en ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un p’tit combat une fois rentrés ?\nSi t’es d’accord.", - "ending_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !", + "ending": "@c{shock}T’es revenu ?@d{32} Ça veut dire…@d{96} que t’as gagné ?!\n@c{smile_ehalf}J’aurais dû m’en douter.\n$@c{smile_eclosed}Bien sûr… J’ai toujours eu ce sentiment.\n@c{smile}C’est fini maintenant hein ? T’as brisé ce cycle.\n$@c{smile_ehalf}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que t’as fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile}Jamais j’oublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un p’tit combat, comme au bon vieux temps ?", + "ending_female": "@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J’aurais dû m’en douter.\nMais te voilà enfin de retour.\n$@c{smile}C’est terminé.@d{64} T’as brisé ce cycle infernal.\n$@c{serious_smile_fists}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que t’as fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, j’en ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un p’tit combat une fois rentrés ?\nSi t’es d’accord.", + "ending_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !", "ending_name": "Les devs" } diff --git a/src/locales/fr/dialogue.json b/src/locales/fr/dialogue.json index d9d13a8f1e8..dddd0d8e5b7 100644 --- a/src/locales/fr/dialogue.json +++ b/src/locales/fr/dialogue.json @@ -1,50 +1,50 @@ { "youngster": { "encounter": { - "1": "Hé ! Combat ?", - "2": "Toi aussi tu débutes ?", - "3": "Hé, j’me souviens pas de ta tête. Combat !", - "4": "J’ai perdu, alors j’essaye de capturer d’autres Pokémon.\nHé, t’as l’air faible toi ! Allez, combat !", - "5": "On s’connait ? J’ai comme un doute. Dans tous les cas, sympa de te rencontrer !", - "6": "Allez, c’est parti !", - "7": "Attention, me voilà !\nTu vas voir comment j’suis fort !", - "8": "Coucou… Tu veux voir mes bô Pokémon ?", - "9": "Trêve de mondanités. Ramène-toi quand tu le sens !", + "1": "Hé ! Combat ?", + "2": "Toi aussi tu débutes ?", + "3": "Hé, j’me souviens pas de ta tête. Combat !", + "4": "J’ai perdu, alors j’essaye de capturer d’autres Pokémon.\nHé, t’as l’air faible toi ! Allez, combat !", + "5": "On s’connait ? J’ai comme un doute. Dans tous les cas, sympa de te rencontrer !", + "6": "Allez, c’est parti !", + "7": "Attention, me voilà !\nTu vas voir comment j’suis fort !", + "8": "Coucou… Tu veux voir mes bô Pokémon ?", + "9": "Trêve de mondanités. Ramène-toi quand tu le sens !", "10": "Baisse pas ta garde si tu veux pas pleurer d’avoir perdu face à un gamin.", - "11": "J’ai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !", - "12": "Incroyable que t’y sois parvenu ! Mais la suite va pas être une partie de plaisir.", - "12_female": "Incroyable que t’y sois parvenue ! Mais la suite va pas être une partie de plaisir.", - "13": "Les combats sont éternels ! Bienvenue dans un monde sans fin !" + "11": "J’ai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !", + "12": "Incroyable que t’y sois parvenu ! Mais la suite va pas être une partie de plaisir.", + "12_female": "Incroyable que t’y sois parvenue ! Mais la suite va pas être une partie de plaisir.", + "13": "Les combats sont éternels ! Bienvenue dans un monde sans fin !" }, "victory": { - "1": "Hé, mais t’es trop fort !", - "1_female": "Hé, mais t’es trop forte !", - "2": "En vrai j’avais aucune chance hein ?", - "3": "J’te retrouverai un jour, et là j’te battrai !", + "1": "Hé, mais t’es trop fort !", + "1_female": "Hé, mais t’es trop forte !", + "2": "En vrai j’avais aucune chance hein ?", + "3": "J’te retrouverai un jour, et là j’te battrai !", "4": "Arg… J’ai plus aucun Pokémon.", - "5": "Non… IMPOSSIBLE ! Pourquoi j’ai encore perdu…", - "6": "Non ! J’ai perdu !", - "7": "Waah ! T’es trop incroyable ! J’suis bouche bée !", + "5": "Non… IMPOSSIBLE ! Pourquoi j’ai encore perdu…", + "6": "Non ! J’ai perdu !", + "7": "Waah ! T’es trop incroyable ! J’suis bouche bée !", "8": "Pourquoi… Comment… Pourtant on est les plus forts, mes Pokémon et moi…", - "9": "J’perdrai pas la prochaine fois ! Remettons ça un jour !", - "10": "Weeeesh ! Tu vois que j’suis qu’un gamin ? C’est pas juste de me bully comme ça !", - "11": "Tes Pokémon sont trop incroyables !\n… P’tit échange ?", - "12": "Je me suis fait un peu aider plus tôt, mais de quel taf je parlais ?", - "13": "Ahaha ! Et voilà, ça y est !\nT’es déjà comme chez toi dans ce monde !" + "9": "J’perdrai pas la prochaine fois ! Remettons ça un jour !", + "10": "Weeeesh ! Tu vois que j’suis qu’un gamin ? C’est pas juste de me bully comme ça !", + "11": "Tes Pokémon sont trop incroyables !\n… P’tit échange ?", + "12": "Je me suis fait un peu aider plus tôt, mais de quel taf je parlais ?", + "13": "Ahaha ! Et voilà, ça y est !\nT’es déjà comme chez toi dans ce monde !" } }, "lass": { "encounter": { - "1": "Affrontons-nous, d’accord ?", - "2": "T’as l’air d’un nouveau Dresseur. Battons nous !", - "2_female": "T’as l’air d’une nouvelle Dresseuse. Battons nous !", - "3": "Je te connais pas. Ça te dis de te battre ?", - "4": "Prenons du bon temps avec ce combat Pokémon !", - "5": "Je vais t’apprendre à te battre avec tes Pokémon !", + "1": "Affrontons-nous, d’accord ?", + "2": "T’as l’air d’un nouveau Dresseur. Battons nous !", + "2_female": "T’as l’air d’une nouvelle Dresseuse. Battons nous !", + "3": "Je te connais pas. Ça te dis de te battre ?", + "4": "Prenons du bon temps avec ce combat Pokémon !", + "5": "Je vais t’apprendre à te battre avec tes Pokémon !", "6": "Un combat doit toujours être pris au sérieux.\nT’es prêt à te battre ?", - "6_female": "Un combat doit toujours être pris au sérieux.\nT’es prête à te battre ?", + "6_female": "Un combat doit toujours être pris au sérieux.\nT’es prête à te battre ?", "7": "Tu seras pas jeune éternellement. T’as qu’une chance pendant un combat. Bientôt, tu seras plus qu’un souvenir.", - "8": "Tu ferais mieux d’y aller doucement avec moi. Mais je vais me battre sérieusement !", + "8": "Tu ferais mieux d’y aller doucement avec moi. Mais je vais me battre sérieusement !", "9": "Je m’ennuie à l’école. Y’a rien à y faire. *Baille*\nJe me bats juste pour passer le temps." }, "victory": { @@ -52,12 +52,12 @@ "2": "Je ne pensais pas que je perdrais comme ça…", "2_female": "Je pensais pas que je perdrais comme ça…", "3": "J’espère que j’aurai ma revanche un jour.", - "4": "C’était super amusant ! Mais ce combat m’a épuisée…", - "5": "Tu m’as appris une belle leçon ! T’es vraiment incroyable !", - "6": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais tu es vraiment très cool.", - "6_female": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais t’es vraiment très cool.", + "4": "C’était super amusant ! Mais ce combat m’a épuisée…", + "5": "Tu m’as appris une belle leçon ! T’es vraiment incroyable !", + "6": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais tu es vraiment très cool.", + "6_female": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais t’es vraiment très cool.", "7": "J’ai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*", - "8": "Hé ! Je t’avais dit d’y aller doucement avec moi ! Mais t’es vraiment si cool quand tu te bats sérieusement…", + "8": "Hé ! Je t’avais dit d’y aller doucement avec moi ! Mais t’es vraiment si cool quand tu te bats sérieusement…", "9": "J’en ai marre des combats Pokémon…\nJe vais chercher d’autres trucs à faire…" } }, @@ -123,7 +123,7 @@ "encounter": { "1": "C’est l’heure de plonger dans le vif !", "2": "C’est le moment de surfer sur les vagues de la victoire !", - "3": "Je vais t’éclabousser de mon talent !" + "3": "Je vais t’éclabousser de mon talent !" }, "victory": { "1": "Tu m’as complètement séché", @@ -169,10 +169,10 @@ }, "parasol_lady": { "encounter": { - "1": "Honorons ce terrain de combat avec élégance et équilibre !" + "1": "Honorons ce terrain de combat avec élégance et équilibre !" }, "victory": { - "1": "Mon élégance demeure inébranlable !" + "1": "Mon élégance demeure inébranlable !" } }, "rocket_grunt": { @@ -528,14 +528,14 @@ "3": "Ouah ! T’es super balèze !" }, "defeat": { - "1": "Qu’en dis-tu? C’est ça, la puissance des Pokémon Eau !", + "1": "Qu’en dis-tu ? C’est ça, la puissance des Pokémon Eau !", "2": "J’espère que t’as pris note des élégantes techniques de nage de mes Pokémon !", "3": "Tes Pokémon ne jouent visiblement pas dans le même bassin…" } }, "lt_surge": { "encounter": { - "1": "T’as pas froid aux yeux, soldat ! Les combats Pokémon, c’est la guerre !", + "1": "T’as pas froid aux yeux, soldat ! Les combats Pokémon, c’est la guerre !", "2": "Tu as du guts pour venir me fight ici ! Je vais te shock !", "3": "Compte tes dents, tu vas morfler !\nMes Pokémon Électrik vont t’atomiser !" }, @@ -573,56 +573,56 @@ }, "alder": { "encounter": { - "1": "Prépare-toi pour un combat contre le meilleur Dresseur d’Unys !" + "1": "Prépare-toi pour un combat contre le meilleur Dresseur d’Unys !" }, "victory": { - "1": "Bien joué ! Tu as sans aucun doute un talent inégalé." + "1": "Bien joué ! Tu as sans aucun doute un talent inégalé." }, "defeat": { - "1": "Une brise fraiche traverse mon cœur…\n$Quel effort extraordinaire !" + "1": "Une brise fraiche traverse mon cœur…\n$Quel effort extraordinaire !" } }, "kieran": { "encounter": { - "1": "Grâce à un travail acharné, je deviens de plus en plus fort !\n$Je ne perdrai pas." + "1": "Grâce à un travail acharné, je deviens de plus en plus fort !\n$Je ne perdrai pas." }, "victory": { - "1": "Je n’y crois pas…\n$Quel combat amusant et palpitant !" + "1": "Je n’y crois pas…\n$Quel combat amusant et palpitant !" }, "defeat": { - "1": "Eh beh, quel combat !\n$Il est temps pour toi de t’entrainer encore plus dur." + "1": "Eh beh, quel combat !\n$Il est temps pour toi de t’entrainer encore plus dur." } }, "rival": { "encounter": { - "1": "@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir…\n$@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire.\n$@c{serious_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !" + "1": "@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir…\n$@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire.\n$@c{serious_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !" }, "victory": { - "1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !" + "1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !" } }, "rival_female": { "encounter": { - "1": "@c{smile_wave}Ah, te voilà ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?" + "1": "@c{smile_wave}Ah, te voilà ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?" }, "victory": { - "1": "@c{shock}Tu viens de commencer et t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.\n$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !" + "1": "@c{shock}Tu viens de commencer et t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.\n$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !" } }, "rival_2": { "encounter": { - "1": "@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nC’est parti !" + "1": "@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nC’est parti !" }, "victory": { - "1": "@c{neutral_eclosed}Oh. Je crois que j’ai trop pris la confiance.\n$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n\n$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n\n$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi !" + "1": "@c{neutral_eclosed}Oh. Je crois que j’ai trop pris la confiance.\n$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n\n$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n\n$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi !" } }, "rival_2_female": { "encounter": { - "1": "@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas.\n@c{smile_eclosed}C’est juste que j’étais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, t’as intérêt à tout donner !" + "1": "@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas.\n@c{smile_eclosed}C’est juste que j’étais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, t’as intérêt à tout donner !" }, "victory": { - "1": "@c{neutral}Je… J’étais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !\n$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}C’étaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup !" + "1": "@c{neutral}Je… J’étais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !\n$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}C’étaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup !" }, "defeat": { "1": "Je suppose que c’est parfois normal de perdre…" @@ -630,18 +630,18 @@ }, "rival_3": { "encounter": { - "1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village.\n$@c{serious}Je sais que c’est égoïste, mais j’ai besoin d’expier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre.\n$@c{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prête pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le." + "1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village.\n$@c{serious}Je sais que c’est égoïste, mais j’ai besoin d’expier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre.\n$@c{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prête pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le." }, "victory": { - "1": "@c{angry_mhalf}C’est lunaire… J’ai presque fait que m’entrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?" + "1": "@c{angry_mhalf}C’est lunaire… J’ai presque fait que m’entrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?" } }, "rival_3_female": { "encounter": { - "1": "@c{smile_wave}Ça fait une éternité ! Toujours debout hein ?\n@c{angry}Tu commences à me pousser à bout là. @c{smile_wave_wink}T’inquiètes j’déconne !\n$@c{smile_ehalf}Mais en vrai, ta maison te manque pas ? Ou… Moi ?\nJ… Je veux dire… Tu me manques vraiment beaucoup.\n$@c{smile_eclosed}Je te soutiendrai toujours dans tes ambitions, mais la vérité est que tu finiras par perdre un jour ou l’autre.\n$@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point t’es devenu fort !" + "1": "@c{smile_wave}Ça fait une éternité ! Toujours debout hein ?\n@c{angry}Tu commences à me pousser à bout là. @c{smile_wave_wink}T’inquiètes j’déconne !\n$@c{smile_ehalf}Mais en vrai, ta maison te manque pas ? Ou… Moi ?\nJ… Je veux dire… Tu me manques vraiment beaucoup.\n$@c{smile_eclosed}Je te soutiendrai toujours dans tes ambitions, mais la vérité est que tu finiras par perdre un jour ou l’autre.\n$@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point t’es devenu fort !" }, "victory": { - "1": "@c{shock}Après tout ça… Ça te suffit toujours pas… ?\nTu reviendras jamais à ce rythme…" + "1": "@c{shock}Après tout ça… Ça te suffit toujours pas… ?\nTu reviendras jamais à ce rythme…" }, "defeat": { "1": "T’as fait de ton mieux.\nAllez, rentrons à la maison." @@ -652,15 +652,15 @@ "1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}J’ai appris à maximiser tout mon potentiel en m’entrainant d’arrachepied.\n$@c{smile}C’est fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien n’a d’importance désormais, pas tant que j’aurai pas gagné.\n$@c{neutral_eclosed}J’ai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, c’est pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prête." }, "victory": { - "1": "@c{neutral}Que…@d{64} Qui es-tu ?" + "1": "@c{neutral}Que…@d{64} Qui es-tu ?" } }, "rival_4_female": { "encounter": { - "1": "@c{neutral}C’est moi ! Tu m’as pas encore oubliée… n’est-ce pas ?\n$@c{smile}Tu devrais être fier d’être arrivé aussi loin. GG !\nMais c’est certainement pas la fin de ton aventure.\n$@c{smile_eclosed}T’as éveillé en moi quelque chose que j’ignorais.\nTout mon temps passe dans l’entrainement.\n$@c{smile_ehalf}Je dors et je mange à peine, je m’entraine juste tous les jours, et deviens de plus en plus forte.\n$@c{neutral}En vrai, Je… J’ai de la peine à me reconnaitre.\n$Mais maintenant, je suis au top de mes capacités.\nJe doute que tu sois de nouveau capable de me battre.\n$Et tu sais quoi ? Tout ça, c’est de ta faute.\n@c{smile_ehalf}Et j’ignore si je dois te remercier ou te haïr.\n$@c{angry_mopen}Tiens-toi prêt." + "1": "@c{neutral}C’est moi ! Tu m’as pas encore oubliée… n’est-ce pas ?\n$@c{smile}Tu devrais être fier d’être arrivé aussi loin. GG !\nMais c’est certainement pas la fin de ton aventure.\n$@c{smile_eclosed}T’as éveillé en moi quelque chose que j’ignorais.\nTout mon temps passe dans l’entrainement.\n$@c{smile_ehalf}Je dors et je mange à peine, je m’entraine juste tous les jours, et deviens de plus en plus forte.\n$@c{neutral}En vrai, Je… J’ai de la peine à me reconnaitre.\n$Mais maintenant, je suis au top de mes capacités.\nJe doute que tu sois de nouveau capable de me battre.\n$Et tu sais quoi ? Tout ça, c’est de ta faute.\n@c{smile_ehalf}Et j’ignore si je dois te remercier ou te haïr.\n$@c{angry_mopen}Tiens-toi prêt." }, "victory": { - "1": "@c{neutral}Que…@d{64} Qui es-tu ?" + "1": "@c{neutral}Que…@d{64} Qui es-tu ?" }, "defeat": { "1": "$@c{smile}Tu devrais être fier d’être arrivé jusque là." @@ -687,7 +687,7 @@ }, "rival_6": { "encounter": { - "1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}J’ai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}C’est même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et c’est comme si quelque chose ici me parlait.\n$Comme si c’était tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance." + "1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}J’ai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}C’est même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et c’est comme si quelque chose ici me parlait.\n$Comme si c’était tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance." }, "victory": { "1": "@c{smile_eclosed}J’ai fait ce que j’avais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison." @@ -695,7 +695,7 @@ }, "rival_6_female": { "encounter": { - "1": "@c{smile_ehalf}C’est donc encore entre toi et moi.\n$@c{smile_eclosed}Tu sais, j’ai beau retouner ça dans tous les sens…\n$@c{smile_ehalf}Quelque chose peut expliquer tout ça, pourquoi tout semble si étrange…\n$@c{smile}T’as tes rêves, j’ai mes ambitions…\n$J’ai juste le sentiment qu’il y a un grand dessein derrière tout ça, derrière ce qu’on fait toi et moi.\n$@c{smile_eclosed}Je crois que mon but est de… repousser tes limites.\n$@c{smile_ehalf}Je suis pas certaine de bien être douée à cet exercice, mais je fais de mon mieux.\n$Cet endroit épouvantable cache quelque chose d’étrange… Tout semble si limpide…\n$Comme… si c’était tout ce que ce monde avait toujours connu.\n$@c{smile_eclosed}J’ai le sentiment que nos précieux moments ensemble sont devenus si flous.\n$@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant…\n$@c{angry_mopen}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es le seul à en être capable.\n$@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité.\n$@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance." + "1": "@c{smile_ehalf}C’est donc encore entre toi et moi.\n$@c{smile_eclosed}Tu sais, j’ai beau retouner ça dans tous les sens…\n$@c{smile_ehalf}Quelque chose peut expliquer tout ça, pourquoi tout semble si étrange…\n$@c{smile}T’as tes rêves, j’ai mes ambitions…\n$J’ai juste le sentiment qu’il y a un grand dessein derrière tout ça, derrière ce qu’on fait toi et moi.\n$@c{smile_eclosed}Je crois que mon but est de… repousser tes limites.\n$@c{smile_ehalf}Je suis pas certaine de bien être douée à cet exercice, mais je fais de mon mieux.\n$Cet endroit épouvantable cache quelque chose d’étrange… Tout semble si limpide…\n$Comme… si c’était tout ce que ce monde avait toujours connu.\n$@c{smile_eclosed}J’ai le sentiment que nos précieux moments ensemble sont devenus si flous.\n$@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant…\n$@c{angry_mopen}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es le seul à en être capable.\n$@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité.\n$@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance." }, "victory": { "1": "@c{smile_ehalf}Je… Je crois que j’ai rempli ma mission…\n$@c{smile_eclosed}Promets-moi… Après avoir réparé ce monde… Reviens à la maison sain et sauf.\n$@c{smile_ehalf}… Merci." diff --git a/src/locales/fr/egg.json b/src/locales/fr/egg.json index 64f22aa330d..cbc912e9d50 100644 --- a/src/locales/fr/egg.json +++ b/src/locales/fr/egg.json @@ -4,7 +4,7 @@ "ultraTier": "Épique", "masterTier": "Légendaire", "defaultTier": "Commun", - "hatchWavesMessageSoon": "Il fait du bruit. Il va éclore !", + "hatchWavesMessageSoon": "Il fait du bruit.\nIl va éclore !", "hatchWavesMessageClose": "Il bouge de temps en temps. Il devrait bientôt éclore.", "hatchWavesMessageNotClose": "Qu’est-ce qui va en sortir ? Ça va mettre du temps.", "hatchWavesMessageLongTime": "Cet Œuf va surement mettre du temps à éclore.", @@ -16,7 +16,7 @@ "tooManyEggs": "Vous avez trop d’Œufs !", "pull": "Tirage", "pulls": "Tirages", - "sameSpeciesEgg": "{{species}} sortira de cet Œuf !", + "sameSpeciesEgg": "Un {{species}} sortira de cet Œuf !", "hatchFromTheEgg": "{{pokemonName}} sort de l’Œuf !", "eggMoveUnlock": "Capacité Œuf débloquée :\n{{moveName}}", "rareEggMoveUnlock": "Capacité Œuf Rare débloquée :\n{{moveName}}", diff --git a/src/locales/fr/menu.json b/src/locales/fr/menu.json index 83626a1f33f..277b0f5fd04 100644 --- a/src/locales/fr/menu.json +++ b/src/locales/fr/menu.json @@ -6,7 +6,7 @@ "newGame": "Nouvelle partie", "settings": "Paramètres", "selectGameMode": "Sélectionnez un mode de jeu.", - "logInOrCreateAccount": "Connectez-vous ou créez un compte pour commencer. Aucun e-mail requis !", + "logInOrCreateAccount": "Connectez-vous ou créez un compte pour commencer.\nAucun e-mail requis !", "username": "Nom d’utilisateur", "password": "Mot de passe", "login": "Connexion", @@ -19,29 +19,29 @@ "invalidRegisterPassword": "Le mot de passe doit contenir 6 caractères ou plus", "usernameAlreadyUsed": "Le nom d’utilisateur est déjà utilisé", "accountNonExistent": "Le nom d’utilisateur n’existe pas", - "unmatchingPassword": "Le mot de passe n’est pas correct", + "unmatchingPassword": "Le mot de passe est incorrect", "passwordNotMatchingConfirmPassword": "Les mots de passe ne correspondent pas", "confirmPassword": "Confirmer le MDP", - "registrationAgeWarning": "Vous confirmez en vous inscrivant que vous avez 13 ans ou plus.", + "registrationAgeWarning": "En vous inscrivant, vous certifiez que vous avez 13 ans ou plus.", "backToLogin": "Retour", "failedToLoadSaveData": "Échec du chargement des données. Veuillez recharger\nla page. Si cela persiste, contactez l’administrateur.", "sessionSuccess": "Session chargée avec succès.", "failedToLoadSession": "Vos données de session n’ont pas pu être chargées.\nElles pourraient être corrompues.", - "boyOrGirl": "Es-tu un garçon ou une fille ?", + "boyOrGirl": "Es-tu un garçon ou une fille ?", "evolving": "Quoi ?\n{{pokemonName}} évolue !", - "stoppedEvolving": "Hein ?\n{{pokemonName}} n’évolue plus !", - "pauseEvolutionsQuestion": "Mettre en pause les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis l’écran d’équipe.", - "evolutionsPaused": "Les évolutions ont été mises en pause pour {{pokemonName}}.", + "stoppedEvolving": "Hein ?\n{{pokemonName}} n’évolue plus !", + "pauseEvolutionsQuestion": "Interrompre les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis l’écran d’équipe.", + "evolutionsPaused": "Les évolutions de {{pokemonName}}\nsont interrompues.", "evolutionDone": "Félicitations !\n{{pokemonName}} a évolué en {{evolvedPokemonName}} !", - "dailyRankings": "Classement du Jour", - "weeklyRankings": "Classement de la Semaine", - "noRankings": "Pas de Classement", + "dailyRankings": "Classement du jour", + "weeklyRankings": "Classement de la semaine", + "noRankings": "Pas de classement", "positionIcon": "#", "usernameScoreboard": "Utilisateur", "score": "Score", "wave": "Vague", "loading": "Chargement…", - "loadingAsset": "Chargement de la ressource : {{assetName}}", + "loadingAsset": "Chargement des ressources : {{assetName}}", "playersOnline": "Joueurs connectés", "yes": "Oui", "no": "Non", @@ -51,5 +51,7 @@ "renamePokemon": "Renommer le Pokémon", "rename": "Renommer", "nickname": "Surnom", - "errorServerDown": "Oupsi ! Un problème de connexion au serveur est survenu.\n\nVous pouvez garder cette fenêtre ouverte,\nle jeu se reconnectera automatiquement." + "errorServerDown": "Oupsi ! Un problème de connexion au serveur est survenu.\n\nVous pouvez garder cette fenêtre ouverte,\nle jeu se reconnectera automatiquement.", + "noSaves": "Vous n’avez aucune sauvegarde enregistrée !", + "tooManySaves": "Vous avez trop de sauvegardes enregistrées !" } diff --git a/src/locales/fr/modifier-type.json b/src/locales/fr/modifier-type.json index 509a8b11112..78be62cd88f 100644 --- a/src/locales/fr/modifier-type.json +++ b/src/locales/fr/modifier-type.json @@ -2,7 +2,7 @@ "ModifierType": { "AddPokeballModifierType": { "name": "{{pokeballName}} x{{modifierCount}}", - "description": "Recevez {{modifierCount}} {{pokeballName}}·s. (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}" + "description": "Recevez {{modifierCount}} {{pokeballName}}·s. (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}" }, "AddVoucherModifierType": { "name": "{{voucherTypeName}} x{{modifierCount}}", @@ -10,8 +10,8 @@ }, "PokemonHeldItemModifierType": { "extra": { - "inoperable": "{{pokemonName}} ne peut pas\nporter cet objet !", - "tooMany": "{{pokemonName}} porte trop\nd’exemplaires de cet objet !" + "inoperable": "{{pokemonName}} ne peut pas\nporter cet objet !", + "tooMany": "{{pokemonName}} porte trop\nd’exemplaires de cet objet !" } }, "PokemonHpRestoreModifierType": { @@ -47,10 +47,14 @@ "description": "Donne la nature {{natureName}} à un Pokémon et la débloque pour le starter lui étant lié." }, "DoubleBattleChanceBoosterModifierType": { - "description": "Double les chances de tomber sur un combat double pendant {{battleCount}} combats." + "description": "Quadruple les chances de tomber sur un combat double pendant {{battleCount}} combats." }, "TempStatStageBoosterModifierType": { - "description": "Augmente d’un cran {{stat}} pour toute l’équipe pendant 5 combats." + "description": "Augmente {{amount}} {{stat}} de toute l’équipe pendant 5 combats.", + "extra": { + "stage": "d’un cran", + "percentage": "de 30%" + } }, "AttackTypeBoosterModifierType": { "description": "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon." @@ -85,7 +89,7 @@ "description": "Augmente de {{boostPercent}}% le gain de Points d’Exp du porteur." }, "PokemonFriendshipBoosterModifierType": { - "description": "Augmente le gain d’amitié de 50% par victoire." + "description": "Augmente le gain de bonheur de 50% par victoire." }, "PokemonMoveAccuracyBoosterModifierType": { "description": "Augmente de {{accuracyAmount}} la précision des capacités (maximum 100)." @@ -102,17 +106,17 @@ "description": "Apprend la capacité {{moveName}} à un Pokémon.\n(Maintenez C ou Maj pour plus d’infos)" }, "EvolutionItemModifierType": { - "description": "Permet à certains Pokémon d’évoluer." + "description": "Permet à certains Pokémon d’évoluer à son contact." }, "FormChangeItemModifierType": { - "description": "Permet à certains Pokémon de changer de forme." + "description": "Permet à certains Pokémon de changer de forme à son contact." }, "FusePokemonModifierType": { "description": "Fusionne deux Pokémon (transfère le talent, sépare les stats de base et les types, partage les capacités)." }, "TerastallizeModifierType": { "name": "Téra-Éclat {{teraType}}", - "description": "{{teraType}} Téracristallise son porteur pendant 10 combats." + "description": "Téracristallise son porteur en type {{teraType}} pendant 10 combats." }, "ContactHeldItemTransferChanceModifierType": { "description": "{{chancePercent}}% de chances de voler un objet de l’adversaire en l’attaquant." @@ -247,7 +251,7 @@ }, "SpeciesBoosterItem": { "LIGHT_BALL": { "name": "Balle Lumière", "description": "À faire tenir à Pikachu. Un orbe énigmatique qui double son Attaque et son Atq. Spé. ." }, - "THICK_CLUB": { "name": "Masse Os", "description": "À faire tenir à Osselait ou Ossatueur. Un os dur qui double leur Attaque." }, + "THICK_CLUB": { "name": "Masse Os", "description": "À faire tenir à Osselait ou à Ossatueur, formes d’Alola incluses. Un os dur qui double leur Attaque." }, "METAL_POWDER": { "name": "Poudre Métal", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Défense." }, "QUICK_POWDER": { "name": "Poudre Vite", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Vitesse." } }, diff --git a/src/locales/fr/modifier.json b/src/locales/fr/modifier.json index 0ec228a22c2..101b1d56164 100644 --- a/src/locales/fr/modifier.json +++ b/src/locales/fr/modifier.json @@ -3,7 +3,7 @@ "turnHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par les {{typeName}} !", "hitHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par le {{typeName}} !", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} a repris connaissance\navec sa {{typeName}} et est prêt à se battre de nouveau !", - "resetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l’{{typeName}} !", + "resetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l’{{typeName}} !", "moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}} ₽ d’intérêts !", "turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !", "contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l’{{typeName}} de {{pokemonName}} !", diff --git a/src/locales/fr/move-trigger.json b/src/locales/fr/move-trigger.json index b9bc929c619..d9d800c52cc 100644 --- a/src/locales/fr/move-trigger.json +++ b/src/locales/fr/move-trigger.json @@ -3,10 +3,10 @@ "cutHpPowerUpMove": "{{pokemonName}} sacrifie des PV\net augmente la puissance ses capacités !", "absorbedElectricity": "{{pokemonName}} absorbe de l’électricité !", "switchedStatChanges": "{{pokemonName}} permute\nles changements de stats avec ceux de sa cible !", - "switchedTwoStatChanges": "{{pokemonName}} permute les changements de {{firstStat} et de {{secondStat}} avec ceux de sa cible !", - "switchedStat": "{{pokemonName}} et sa cible échangent leur {{stat}} !", - "sharedGuard": "{{pokemonName}} additionne sa garde à celle de sa cible et redistribue le tout équitablement !", - "sharedPower": "{{pokemonName}} additionne sa force à celle de sa cible et redistribue le tout équitablement !", + "switchedTwoStatChanges": "{{pokemonName}} permute les changements de {{firstStat} et de {{secondStat}} avec ceux de sa cible !", + "switchedStat": "{{pokemonName}} et sa cible échangent leur {{stat}} !", + "sharedGuard": "{{pokemonName}} additionne sa garde à celle de sa cible et redistribue le tout équitablement !", + "sharedPower": "{{pokemonName}} additionne sa force à celle de sa cible et redistribue le tout équitablement !", "goingAllOutForAttack": "{{pokemonName}} a pris\ncette capacité au sérieux !", "regainedHealth": "{{pokemonName}}\nrécupère des PV !", "keptGoingAndCrashed": "{{pokemonName}}\ns’écrase au sol !", @@ -22,7 +22,7 @@ "loweredItsHead": "{{pokemonName}}\nbaisse la tête !", "isGlowing": "{{pokemonName}} est entouré\nd’une lumière intense !", "bellChimed": "Un grelot sonne !", - "foresawAnAttack": "{{pokemonName}}\nprévoit une attaque !", + "foresawAnAttack": "{{pokemonName}}\nprévoit une attaque !", "isTighteningFocus": "{{pokemonName}} se concentre\nau maximum !", "hidUnderwater": "{{pokemonName}}\nse cache sous l’eau !", "soothingAromaWaftedThroughArea": "Une odeur apaisante flotte dans l’air !", @@ -34,7 +34,7 @@ "becameCloakedInFreezingAir": "{{pokemonName}} est entouré\nd’un air glacial !", "isChargingPower": "{{pokemonName}}\nconcentre son énergie !", "burnedItselfOut": "Le feu intérieur de {{pokemonName}}\ns’est entièrement consumé !", - "startedHeatingUpBeak": "{{pokemonName}}\nfait chauffer son bec !", + "startedHeatingUpBeak": "{{pokemonName}}\nfait chauffer son bec !", "setUpShellTrap": "{{pokemonName}} déclenche\nle Carapiège !", "isOverflowingWithSpacePower": "La puissance du cosmos afflue dans le corps\nde {{pokemonName}} !", "usedUpAllElectricity": "{{pokemonName}}a utilisé\ntoute son électricité !", @@ -66,5 +66,5 @@ "revivalBlessing": "{{pokemonName}} a repris connaissance\net est prêt à se battre de nouveau !", "swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !", "exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !", - "safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !" -} \ No newline at end of file + "safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !" +} diff --git a/src/locales/fr/pokemon-info-container.json b/src/locales/fr/pokemon-info-container.json index 46b5b80bab0..084310f7c94 100644 --- a/src/locales/fr/pokemon-info-container.json +++ b/src/locales/fr/pokemon-info-container.json @@ -1,7 +1,7 @@ { "moveset": "Capacités", - "gender": "Sexe :", - "ability": "Talent :", - "nature": "Nature :", + "gender": "Sexe :", + "ability": "Talent :", + "nature": "Nature :", "form": "Forme :" -} \ No newline at end of file +} diff --git a/src/locales/fr/pokemon-info.json b/src/locales/fr/pokemon-info.json index 1160ec95b75..a23b320ea3e 100644 --- a/src/locales/fr/pokemon-info.json +++ b/src/locales/fr/pokemon-info.json @@ -6,9 +6,9 @@ "ATKshortened": "Atq", "DEF": "Défense", "DEFshortened": "Déf", - "SPATK": "Atq. Spé.", + "SPATK": "Atq. Spé.", "SPATKshortened": "AtqSp", - "SPDEF": "Déf. Spé.", + "SPDEF": "Déf. Spé.", "SPDEFshortened": "DéfSp", "SPD": "Vitesse", "SPDshortened": "Vit", diff --git a/src/locales/fr/splash-messages.json b/src/locales/fr/splash-messages.json index 499a32d2cbd..9dd3e86fb32 100644 --- a/src/locales/fr/splash-messages.json +++ b/src/locales/fr/splash-messages.json @@ -1,36 +1,36 @@ { - "battlesWon": "combats gagnés !", - "joinTheDiscord": "Rejoins le Discord !", - "infiniteLevels": "Niveaux infinis !", - "everythingStacks": "Tout se cumule !", - "optionalSaveScumming": "Optional Save Scumming!", - "biomes": "35 biomes !", - "openSource": "Open Source !", - "playWithSpeed": "Joue en vitesse x5 !", - "liveBugTesting": "Tests de bugs en direct !", - "heavyInfluence": "Grosse influence de RoR2 !", - "pokemonRiskAndPokemonRain": "Pokémon Risk et Pokémon Rain !", - "nowWithMoreSalt": "Désormais avec 33% de sel en plus !", - "infiniteFusionAtHome": "Infinite Fusion, chez vous !", - "brokenEggMoves": "Des Capacités Œuf craquées !", - "magnificent": "Magnifique !", - "mubstitute": "Mubstitute !", - "thatsCrazy": "C’est une dinguerie !", - "oranceJuice": "Jus d’orange !", - "questionableBalancing": "Équilibrage douteux !", - "coolShaders": "Cool shaders !", - "aiFree": "Garanti sans IA !", - "suddenDifficultySpikes": "De soudains pics de difficultés !", - "basedOnAnUnfinishedFlashGame": "Basé sur un jeu Flash abandonné !", - "moreAddictiveThanIntended": "Plus addictif que prévu !", - "mostlyConsistentSeeds": "Des seeds à peu près stables !", - "achievementPointsDontDoAnything": "Les Points de Succès servent à rien !", - "youDoNotStartAtLevel": "Ne commence pas au Niveau 2000 !", - "dontTalkAboutTheManaphyEggIncident": "Ne parle pas de l’incident de l’Œuf de Manaphy !", - "alsoTryPokengine": "Essaye aussi Pokéngine !", + "battlesWon": "combats gagnés !", + "joinTheDiscord": "Rejoins le Discord !", + "infiniteLevels": "Niveaux infinis !", + "everythingStacks": "Tout se cumule !", + "optionalSaveScumming": "Optional Save Scumming !", + "biomes": "35 biomes !", + "openSource": "Open Source !", + "playWithSpeed": "Joue en vitesse x5 !", + "liveBugTesting": "Tests de bugs en direct !", + "heavyInfluence": "Grosse influence de RoR2 !", + "pokemonRiskAndPokemonRain": "Pokémon Risk et Pokémon Rain !", + "nowWithMoreSalt": "Désormais avec 33% de sel en plus !", + "infiniteFusionAtHome": "Infinite Fusion, chez vous !", + "brokenEggMoves": "Des Capacités Œuf craquées !", + "magnificent": "Magnifique !", + "mubstitute": "Mubstitute !", + "thatsCrazy": "C’est une dinguerie !", + "oranceJuice": "Jus d’orange !", + "questionableBalancing": "Équilibrage douteux !", + "coolShaders": "Cool shaders !", + "aiFree": "Garanti sans IA !", + "suddenDifficultySpikes": "De soudains pics de difficultés !", + "basedOnAnUnfinishedFlashGame": "Basé sur un jeu Flash abandonné !", + "moreAddictiveThanIntended": "Plus addictif que prévu !", + "mostlyConsistentSeeds": "Des seeds à peu près stables !", + "achievementPointsDontDoAnything": "Les Points de Succès servent à rien !", + "youDoNotStartAtLevel": "Ne commence pas au Niveau 2000 !", + "dontTalkAboutTheManaphyEggIncident": "Ne parle pas de l’incident de l’Œuf de Manaphy !", + "alsoTryPokengine": "Essaye aussi Pokéngine !", "alsoTryEmeraldRogue": "Essaye aussi Emerald Rogue!", - "alsoTryRadicalRed": "Essaye aussi Radical Red !", - "eeveeExpo": "Eevee Expo !", - "ynoproject": "YNOproject !", + "alsoTryRadicalRed": "Essaye aussi Radical Red !", + "eeveeExpo": "Eevee Expo !", + "ynoproject": "YNOproject !", "breedersInSpace": "Des Éleveurs dans l’espace !" -} \ No newline at end of file +} diff --git a/src/locales/fr/status-effect.json b/src/locales/fr/status-effect.json index 4a58f804906..bfb7121f522 100644 --- a/src/locales/fr/status-effect.json +++ b/src/locales/fr/status-effect.json @@ -33,7 +33,7 @@ "obtainSource": "{{pokemonNameWithAffix}} est paralysé\npar {{sourceText}} ! Il aura du mal à attaquer !", "activation": "{{pokemonNameWithAffix}} est paralysé !\nIl n’a pas pu attaquer !", "overlap": "{{pokemonNameWithAffix}} est\ndéjà paralysé.", - "heal": "{{pokemonNameWithAffix}} n’est\nplus paralysé !" + "heal": "{{pokemonNameWithAffix}} n’est\nplus paralysé !" }, "sleep": { "name": "Sommeil", @@ -62,4 +62,4 @@ "overlap": "{{pokemonNameWithAffix}} est\ndéjà brulé.", "heal": "{{pokemonNameWithAffix}} n’est\nplus brulé !" } -} \ No newline at end of file +} diff --git a/src/locales/fr/tutorial.json b/src/locales/fr/tutorial.json index 53ec05c7d81..f15a7c7c6d4 100644 --- a/src/locales/fr/tutorial.json +++ b/src/locales/fr/tutorial.json @@ -1,10 +1,10 @@ { - "intro": "Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite !\n$Ce jeu n’est pas monétisé et nous ne prétendons pas à la propriété de Pokémon, ni des éléments sous copyright\n$utilisés.\n$Ce jeu est toujours en développement, mais entièrement jouable.\n$Tout signalement de bugs passe par le serveur Discord.\n$Si le jeu est lent, vérifiez que l’Accélération Matérielle est activée dans les paramètres du navigateur.", - "accessMenu": "Accédez au menu avec M ou Échap lors de l’attente d’une\naction.\n$Il contient les paramètres et diverses fonctionnalités", - "menu": "Vous pouvez accéder aux paramètres depuis ce menu.\n$Vous pouvez entre autres y changer la vitesse du jeu ou le style de fenêtre.\n$Il y a également toute une variété d’autres fonctionnalités,\n$jetez-y un œil !", - "starterSelect": "Choisissez vos starters depuis cet écran avec Z ou Espace.\nIls formeront votre équipe de départ.\n$Chacun possède une valeur. Votre équipe peut avoir jusqu’à\n6 membres, tant que vous ne dépassez pas un cout de 10.\n$Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos.\n$Les IVs d’un starter sont les meilleurs de tous ceux de son\nespèce déjà obtenus. Essayez donc d’en obtenir plusieurs !", - "pokerus": "Chaque jour, 3 starters tirés aléatoirement ont un contour\n$violet. Si un starter que vous possédez l’a, essayez de\n$l’ajouter à votre équipe. Vérifiez bien son résumé !", - "statChange": "Les changements de stats restent à travers les combats tant que le Pokémon n’est pas rappelé.\n$Vos Pokémon sont rappelés avant un combat de Dresseur et avant d’entrer dans un nouveau biome.\n$Vous pouvez voir en combat les changements de stats d’un Pokémon en maintenant C ou Maj.\n$Vous pouvez également voir les capacités de l’adversaire en maintenant V.\n$Seules les capacités que le Pokémon a utilisées dans ce combat sont consultables.", - "selectItem": "Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre qu’un.\n$Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents.\n$La plupart des effets des objets non-consommables se cumuleront de diverses manières.\n$Certains objets apparaitront s’ils peuvent être utilisés, comme les objets d’évolution.\n$Vous pouvez aussi transférer des objets tenus entre Pokémon en utilisant l’option de transfert.\n$L’option de transfert apparait en bas à droite dès que vous avez obtenu un objet à faire tenir.\n$Vous pouvez acheter des consommables avec de l’argent.\nPlus vous progressez, plus le choix sera varié.\n$Choisir un des objets gratuits déclenchera le prochain combat, donc faites bien tous vos achats avant.", - "eggGacha": "Depuis cet écran, vous pouvez échanger vos coupons\ncontre des Œufs de Pokémon.\n$Les Œufs éclosent après avoir remporté un certain nombre\nde combats. Les plus rares mettent plus de temps.\n$Les Pokémon éclos ne rejoindront pas votre équipe,\nmais seront ajoutés à vos starters.\n$Les Pokémon issus d’Œufs ont généralement de\nmeilleurs IVs que les Pokémon sauvages.\n$Certains Pokémon ne peuvent être obtenus\nque dans des Œufs.\n$Il y a 3 différentes machines à actionner avec différents\nbonus, prenez celle qui vous convient le mieux !" -} \ No newline at end of file + "intro": "Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite !\n$Ce jeu n’est pas monétisé et nous ne prétendons à la propriété d’aucun élément sous copyright utilisé.\n$Bien qu’en développement permanent, PokéRogue reste entièrement jouable.\n$Tout signalement de bugs et d’erreurs quelconques passe par le serveur Discord.\n$Si le jeu est lent, vérifiez que l’Accélération Matérielle est activée dans les paramètres du navigateur.", + "accessMenu": "Accédez au menu avec M ou Échap lors de l’attente d’une\naction.\n$Il contient les paramètres et diverses fonctionnalités.", + "menu": "Vous pouvez accéder aux paramètres depuis ce menu.\n$Vous pouvez entre autres y changer la vitesse du jeu ou le style de fenêtre…\n$Mais également des tonnes d’autres fonctionnalités, jetez-y un œil !", + "starterSelect": "Choisissez vos starters depuis cet écran avec Z ou Espace.\nIls formeront votre équipe de départ.\n$Chacun possède une valeur. Votre équipe peut avoir jusqu’à 6 membres, sans dépasser un cout de 10.\n$Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos.\n$Les IV d’un starter sont les meilleurs de tous ceux de son espèce déjà possédés. Obtenez-en plusieurs !", + "pokerus": "Chaque jour, 3 starters tirés aléatoirement ont un contour violet.\n$Si un starter que vous possédez l’a, essayez de l’ajouter à votre équipe. Vérifiez bien son résumé !", + "statChange": "Les changements de stats persistent à travers les combats tant que le Pokémon n’est pas rappelé.\n$Vos Pokémon sont rappelés avant un combat de Dresseur et avant d’entrer dans un nouveau biome.\n$Vous pouvez voir en combat les changements de stats d’un Pokémon en maintenant C ou Maj.\n$Vous pouvez également voir les capacités de l’adversaire en maintenant V.\n$Seules les capacités que le Pokémon a utilisées dans ce combat sont consultables.", + "selectItem": "Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre qu’un.\n$Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents.\n$La plupart des effets des objets non-consommables se cumuleront de diverses manières.\n$Certains objets n’apparaitront que s’ils ont une utilité immédiate, comme les objets d’évolution.\n$Vous pouvez aussi transférer des objets tenus entre Pokémon en utilisant l’option de transfert.\n$L’option de transfert apparait en bas à droite dès qu’un Pokémon de l’équipe porte un objet.\n$Vous pouvez acheter des consommables avec de l’argent.\nPlus vous progressez, plus le choix sera large.\n$Choisir un des objets gratuits déclenchera le prochain combat, donc faites bien tous vos achats avant.", + "eggGacha": "Depuis cet écran, vous pouvez utiliser vos coupons\npour recevoir Œufs de Pokémon au hasard.\n$Les Œufs éclosent après avoir remporté un certain nombre de combats. Plus ils sont rares, plus ils mettent de temps.\n$Les Pokémon éclos ne rejoindront pas votre équipe, mais seront ajoutés à vos starters.\n$Les Pokémon issus d’Œufs ont généralement de meilleurs IV que les Pokémon sauvages.\n$Certains Pokémon ne peuvent être obtenus que dans des Œufs.\n$Il y a 3 différentes machines à actionner avec différents\nbonus, prenez celle qui vous convient le mieux !" +} diff --git a/src/locales/fr/voucher.json b/src/locales/fr/voucher.json index 5e26adfcc49..ef6126b4435 100644 --- a/src/locales/fr/voucher.json +++ b/src/locales/fr/voucher.json @@ -1,9 +1,9 @@ { "vouchers": "Coupons", - "eggVoucher": "Coupon Œuf", - "eggVoucherPlus": "Coupon Œuf +", - "eggVoucherPremium": "Coupon Œuf Premium", - "eggVoucherGold": "Coupon Œuf Or", + "eggVoucher": "Coupon Œuf", + "eggVoucherPlus": "Coupon Œuf +", + "eggVoucherPremium": "Coupon Œuf Premium", + "eggVoucherGold": "Coupon Œuf Or", "locked": "Verrouillé", "defeatTrainer": "Vaincre {{trainerName}}" -} \ No newline at end of file +} diff --git a/src/locales/fr/weather.json b/src/locales/fr/weather.json index 7cd8a83fd09..7afe538b064 100644 --- a/src/locales/fr/weather.json +++ b/src/locales/fr/weather.json @@ -1,32 +1,32 @@ { - "sunnyStartMessage": "Les rayons du soleil brillent !", - "sunnyLapseMessage": "Les rayons du soleil brillent fort !", - "sunnyClearMessage": "Les rayons du soleil s’affaiblissent !", - "rainStartMessage": "Il commence à pleuvoir !", - "rainLapseMessage": "La pluie continue de tomber !", - "rainClearMessage": "La pluie s’est arrêtée !", - "sandstormStartMessage": "Une tempête de sable se prépare !", - "sandstormLapseMessage": "La tempête de sable fait rage !", - "sandstormClearMessage": "La tempête de sable se calme !", - "sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonNameWithAffix}} !", - "hailStartMessage": "Il commence à grêler !", - "hailLapseMessage": "La grêle continue de tomber !", - "hailClearMessage": "La grêle s’est arrêtée !", - "hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonNameWithAffix}} !", - "snowStartMessage": "Il commence à neiger !", - "snowLapseMessage": "Il y a une tempête de neige !", - "snowClearMessage": "La neige s’est arrêtée !", + "sunnyStartMessage": "Les rayons du soleil brillent !", + "sunnyLapseMessage": "Les rayons du soleil brillent fort !", + "sunnyClearMessage": "Les rayons du soleil s’affaiblissent !", + "rainStartMessage": "Il commence à pleuvoir !", + "rainLapseMessage": "La pluie continue de tomber !", + "rainClearMessage": "La pluie s’est arrêtée !", + "sandstormStartMessage": "Une tempête de sable se prépare !", + "sandstormLapseMessage": "La tempête de sable fait rage !", + "sandstormClearMessage": "La tempête de sable se calme !", + "sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonNameWithAffix}} !", + "hailStartMessage": "Il commence à grêler !", + "hailLapseMessage": "La grêle continue de tomber !", + "hailClearMessage": "La grêle s’est arrêtée !", + "hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonNameWithAffix}} !", + "snowStartMessage": "Il commence à neiger !", + "snowLapseMessage": "Il y a une tempête de neige !", + "snowClearMessage": "La neige s’est arrêtée !", "fogStartMessage": "Le brouillard devient épais…", - "fogLapseMessage": "Le brouillard continue !", - "fogClearMessage": "Le brouillard s’est dissipé !", - "heavyRainStartMessage": "Une pluie battante s’abat soudainement !", + "fogLapseMessage": "Le brouillard continue !", + "fogClearMessage": "Le brouillard s’est dissipé !", + "heavyRainStartMessage": "Une pluie battante s’abat soudainement !", "heavyRainLapseMessage": "La pluie battante continue.", "heavyRainClearMessage": "La pluie battante s’est arrêtée…", - "harshSunStartMessage": "Les rayons du soleil s’intensifient !", - "harshSunLapseMessage": "Les rayons du soleil sont brulants !", - "harshSunClearMessage": "Les rayons du soleil s’affaiblissent !", - "strongWindsStartMessage": "Un vent mystérieux se lève !", - "strongWindsLapseMessage": "Le vent mystérieux souffle violemment !", - "strongWindsEffectMessage": "Le courant aérien mystérieux affaiblit l’attaque !", + "harshSunStartMessage": "Les rayons du soleil s’intensifient !", + "harshSunLapseMessage": "Les rayons du soleil sont brulants !", + "harshSunClearMessage": "Les rayons du soleil s’affaiblissent !", + "strongWindsStartMessage": "Un vent mystérieux se lève !", + "strongWindsLapseMessage": "Le vent mystérieux souffle violemment !", + "strongWindsEffectMessage": "Le courant aérien mystérieux affaiblit l’attaque !", "strongWindsClearMessage": "Le vent mystérieux s’est dissipé…" -} \ No newline at end of file +} diff --git a/src/locales/it/ability-trigger.json b/src/locales/it/ability-trigger.json index 7f55b289c0b..333cb5719d8 100644 --- a/src/locales/it/ability-trigger.json +++ b/src/locales/it/ability-trigger.json @@ -11,6 +11,7 @@ "blockItemTheft": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo rende immune ai furti!", "typeImmunityHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evita il colpo\ncon {{abilityName}}!", + "fullHpResistType": "{{pokemonNameWithAffix}} fa risplendere la sua corazza\ne altera i rapporti tra i tipi!", "disguiseAvoidedDamage": "{{pokemonNameWithAffix}} è stato smascherato!", "moveImmunity": "Non ha effetto su {{pokemonNameWithAffix}}!", "reverseDrain": "{{pokemonNameWithAffix}} ha assorbito la melma!", @@ -51,6 +52,7 @@ "postSummonTeravolt": "{{pokemonNameWithAffix}} emana un’aura repulsiva!", "postSummonDarkAura": "L’abilità Auratetra di {{pokemonNameWithAffix}} è attiva.", "postSummonFairyAura": "L’abilità Aurafolletto di {{pokemonNameWithAffix}} è attiva.", + "postSummonAuraBreak": "{{pokemonNameWithAffix}} inverte gli effetti di tutte le aure!", "postSummonNeutralizingGas": "Il Gas Reagente di {{pokemonNameWithAffix}}\nsi diffonde tutt’intorno!", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} ha due abilità!", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} ha due abilità!", @@ -59,4 +61,4 @@ "postSummonTabletsOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Amuleto Nefasto di {{pokemonNameWithAffix}}!", "postSummonBeadsOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Monile Nefasto di {{pokemonNameWithAffix}}!", "preventBerryUse": "{{pokemonNameWithAffix}} non riesce a\nmangiare le bacche per l'agitazione!" -} \ No newline at end of file +} diff --git a/src/locales/it/battle.json b/src/locales/it/battle.json index f0339f761c7..9b187756025 100644 --- a/src/locales/it/battle.json +++ b/src/locales/it/battle.json @@ -44,6 +44,7 @@ "moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.", "moveNoPP": "Non ci sono PP rimanenti\nper questa mossa!", "moveDisabled": "{{moveName}} è disabilitata!", + "disableInterruptedMove": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} è bloccata!", "noPokeballForce": "Una forza misteriosa\nimpedisce l'uso delle Poké Ball.", "noPokeballTrainer": "Non puoi catturare\nPokémon di altri allenatori!", "noPokeballMulti": "Puoi lanciare una Poké Ball\nsolo quando rimane un singolo Pokémon!", @@ -95,4 +96,4 @@ "congratulations": "Congratulazioni!", "beatModeFirstTime": "{{speciesName}} ha completato la modalità {{gameMode}} per la prima volta!\nHai ricevuto {{newModifier}}!", "ppReduced": "I PP della mossa {{moveName}} di\n{{targetName}} sono stati ridotti di {{reduction}}!" -} \ No newline at end of file +} diff --git a/src/locales/it/battler-tags.json b/src/locales/it/battler-tags.json index a0f852141f9..e8bda9cfd1e 100644 --- a/src/locales/it/battler-tags.json +++ b/src/locales/it/battler-tags.json @@ -67,5 +67,7 @@ "saltCuredLapse": "{{pokemonNameWithAffix}} viene colpito da {{moveName}}!", "cursedOnAdd": "{{pokemonNameWithAffix}} ha sacrificato metà dei suoi PS per\nlanciare una maledizione su {{pokemonName}}!", "cursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!", - "stockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!" -} \ No newline at end of file + "stockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!", + "disabledOnAdd": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} è stata bloccata!", + "disabledLapse": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} non è più bloccata!" +} diff --git a/src/locales/it/menu.json b/src/locales/it/menu.json index 2d37f9db912..5a40ae05087 100644 --- a/src/locales/it/menu.json +++ b/src/locales/it/menu.json @@ -51,5 +51,7 @@ "renamePokemon": "Rinomina un Pokémon", "rename": "Rinomina", "nickname": "Nickname", - "errorServerDown": "Poffarbacco! C'è stato un errore nella comunicazione col server.\n\nPuoi lasciare questa finestra aperta,\nil gioco si riconnetterà automaticamente." -} \ No newline at end of file + "errorServerDown": "Poffarbacco! C'è stato un errore nella comunicazione col server.\n\nPuoi lasciare questa finestra aperta,\nil gioco si riconnetterà automaticamente.", + "noSaves": "Non ci sono file di salvataggio registrati!", + "tooManySaves": "Ci sono troppi file di salvataggio registrati!" +} diff --git a/src/locales/it/modifier-type.json b/src/locales/it/modifier-type.json index 99c06bb2038..f06755bdfa0 100644 --- a/src/locales/it/modifier-type.json +++ b/src/locales/it/modifier-type.json @@ -47,10 +47,14 @@ "description": "Cambia la natura del Pokémon in {{natureName}} e sblocca la natura nel menu degli starter." }, "DoubleBattleChanceBoosterModifierType": { - "description": "Raddoppia la possibilità di imbattersi in doppie battaglie per {{battleCount}} battaglie." + "description": "Quadruplica la possibilità di imbattersi in doppie battaglie per {{battleCount}} battaglie." }, "TempStatStageBoosterModifierType": { - "description": "Aumenta la statistica {{stat}} di un livello\na tutti i Pokémon nel gruppo per 5 battaglie." + "description": "Aumenta la statistica {{stat}} di {{amount}}\na tutti i Pokémon nel gruppo per 5 battaglie", + "extra": { + "stage": "un livello", + "percentage": "30%" + } }, "AttackTypeBoosterModifierType": { "description": "Aumenta la potenza delle mosse di tipo {{moveType}} del 20% per un Pokémon." diff --git a/src/locales/ja/ability-trigger.json b/src/locales/ja/ability-trigger.json index ec77d4d97d3..1b30e52c490 100644 --- a/src/locales/ja/ability-trigger.json +++ b/src/locales/ja/ability-trigger.json @@ -8,10 +8,11 @@ "trace": "{{pokemonName}}は 相手の {{targetName}}の\n{{abilityName}}を トレースした!", "windPowerCharged": "{{pokemonName}}は\n{{moveName}}を 受けて じゅうでんした!", "quickDraw": "{{pokemonName}}は クイックドロウで\n行動が はやくなった!", - "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}'s disguise was busted!", + "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}の\nばけのかわが はがれた!", "blockItemTheft": "{{pokemonNameWithAffix}}の {{abilityName}}で\n道具を うばわれない!", "typeImmunityHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で\nダメージを 受けない。", + "fullHpResistType": "{{pokemonNameWithAffix}}は\n甲羅を かがやかせ タイプ相性を 歪める!", "moveImmunity": "{{pokemonNameWithAffix}}には\n効果が ないようだ…", "reverseDrain": "{{pokemonNameWithAffix}}は\nヘドロえきを 吸い取った!", "postDefendTypeChange": "{{pokemonNameWithAffix}}は {{abilityName}}で\n{{typeName}}タイプに なった!", @@ -51,6 +52,7 @@ "postSummonTeravolt": "{{pokemonNameWithAffix}}は\n弾(はじ)ける オーラを 放っている!", "postSummonDarkAura": "{{pokemonNameWithAffix}}は\nダークオーラを 放っている!", "postSummonFairyAura": "{{pokemonNameWithAffix}}は\nフェアリーオーラを 放っている!", + "postSummonAuraBreak": "{{pokemonNameWithAffix}}は\nすべての オーラを 制圧する!", "postSummonNeutralizingGas": "あたりに かがくへんかガスが 充満した!", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}は\nふたつの 特性を あわせ持つ!", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}は\nふたつの 特性を あわせ持つ!", diff --git a/src/locales/ja/battle.json b/src/locales/ja/battle.json index f3f1d134d16..636d17f23d6 100644 --- a/src/locales/ja/battle.json +++ b/src/locales/ja/battle.json @@ -44,6 +44,7 @@ "moveNotImplemented": "{{moveName}}は まだ 実装されておらず 選択できません。", "moveNoPP": "しかし 技の\n残りポイントが なかった!", "moveDisabled": "かなしばりで\n{{moveName}}が 出せない!", + "disableInterruptedMove": "{{pokemonNameWithAffix}}は かなしばりで\n{{moveName}}が 出せない!", "noPokeballForce": "見えない 力の せいで\nボールが 投げられない!", "noPokeballTrainer": "人の ものを 取ったら 泥棒!", "noPokeballMulti": "相手の ポケモンが 一つしか\nいない 前に ボールが 使えない!", @@ -95,4 +96,4 @@ "congratulations": "おめでとうございます!!", "beatModeFirstTime": "初めて {{speciesName}}が {{gameMode}}モードを クリアした!\n{{newModifier}}を 手に入れた!", "ppReduced": "{{targetName}}の {{moveName}}を {{reduction}}削った!" -} \ No newline at end of file +} diff --git a/src/locales/ja/battler-tags.json b/src/locales/ja/battler-tags.json index 25412c971e9..2b6382a3a9f 100644 --- a/src/locales/ja/battler-tags.json +++ b/src/locales/ja/battler-tags.json @@ -67,5 +67,7 @@ "saltCuredLapse": "{{pokemonNameWithAffix}}は {{moveName}}の\n ダメージを 受けている", "cursedOnAdd": "{{pokemonNameWithAffix}}は 自分の 体力を 削って\n{{pokemonName}}に のろいを かけた!", "cursedLapse": "{{pokemonNameWithAffix}}は のろわれている!", - "stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!" + "stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!", + "disabledOnAdd": "{{pokemonNameWithAffix}}の\n{{moveName}}\nを 封じこめた!", + "disabledLapse": "{{pokemonNameWithAffix}}の\nかなしばりが 解けた!" } diff --git a/src/locales/ja/bgm-name.json b/src/locales/ja/bgm-name.json index 8838942c8a6..fc3d4c0fdd2 100644 --- a/src/locales/ja/bgm-name.json +++ b/src/locales/ja/bgm-name.json @@ -1,150 +1,150 @@ { - "music": "Music: ", + "music": "BGM: ", "missing_entries": "{{name}}", - "battle_kanto_champion": "B2W2 Kanto Champion Battle", - "battle_johto_champion": "B2W2 Johto Champion Battle", - "battle_hoenn_champion_g5": "B2W2 Hoenn Champion Battle", - "battle_hoenn_champion_g6": "ORAS Hoenn Champion Battle", - "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", - "battle_champion_alder": "BW Unova Champion Battle", - "battle_champion_iris": "B2W2 Unova Champion Battle", - "battle_kalos_champion": "XY Kalos Champion Battle", - "battle_alola_champion": "USUM Alola Champion Battle", - "battle_galar_champion": "SWSH Galar Champion Battle", - "battle_champion_geeta": "SV Champion Geeta Battle", - "battle_champion_nemona": "SV Champion Nemona Battle", - "battle_champion_kieran": "SV Champion Kieran Battle", - "battle_hoenn_elite": "ORAS Elite Four Battle", - "battle_unova_elite": "BW Elite Four Battle", - "battle_kalos_elite": "XY Elite Four Battle", - "battle_alola_elite": "SM Elite Four Battle", - "battle_galar_elite": "SWSH League Tournament Battle", - "battle_paldea_elite": "SV Elite Four Battle", - "battle_bb_elite": "SV BB League Elite Four Battle", - "battle_final_encounter": "PMD RTDX Rayquaza's Domain", - "battle_final": "BW Ghetsis Battle", - "battle_kanto_gym": "B2W2 Kanto Gym Battle", - "battle_johto_gym": "B2W2 Johto Gym Battle", - "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", - "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", - "battle_unova_gym": "BW Unova Gym Battle", - "battle_kalos_gym": "XY Kalos Gym Battle", - "battle_galar_gym": "SWSH Galar Gym Battle", - "battle_paldea_gym": "SV Paldea Gym Battle", - "battle_legendary_kanto": "XY Kanto Legendary Battle", - "battle_legendary_raikou": "HGSS Raikou Battle", - "battle_legendary_entei": "HGSS Entei Battle", - "battle_legendary_suicune": "HGSS Suicune Battle", - "battle_legendary_lugia": "HGSS Lugia Battle", - "battle_legendary_ho_oh": "HGSS Ho-oh Battle", - "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", - "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", - "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", - "battle_legendary_rayquaza": "ORAS Rayquaza Battle", - "battle_legendary_deoxys": "ORAS Deoxys Battle", - "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", - "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", - "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", - "battle_legendary_origin_forme": "LA Origin Dialga & Palkia Battle", - "battle_legendary_giratina": "ORAS Giratina Battle", - "battle_legendary_arceus": "HGSS Arceus Battle", - "battle_legendary_unova": "BW Unova Legendary Battle", - "battle_legendary_kyurem": "BW Kyurem Battle", - "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", - "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", - "battle_legendary_tapu": "SM Tapu Battle", - "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", - "battle_legendary_ub": "SM Ultra Beast Battle", - "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", - "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", - "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", - "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", - "battle_legendary_calyrex": "SWSH Calyrex Battle", - "battle_legendary_riders": "SWSH Ice & Shadow Rider Calyrex Battle", - "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", - "battle_legendary_ruinous": "SV Treasures of Ruin Battle", - "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", - "battle_legendary_loyal_three": "SV Loyal Three Battle", - "battle_legendary_ogerpon": "SV Ogerpon Battle", - "battle_legendary_terapagos": "SV Terapagos Battle", - "battle_legendary_pecharunt": "SV Pecharunt Battle", - "battle_rival": "BW Rival Battle", - "battle_rival_2": "BW N Battle", - "battle_rival_3": "BW Final N Battle", - "battle_trainer": "BW Trainer Battle", - "battle_wild": "BW Wild Battle", - "battle_wild_strong": "BW Strong Wild Battle", - "end_summit": "PMD RTDX Sky Tower Summit", - "battle_rocket_grunt": "HGSS Team Rocket Battle", - "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", - "battle_galactic_grunt": "BDSP Team Galactic Battle", - "battle_plasma_grunt": "BW Team Plasma Battle", - "battle_flare_grunt": "XY Team Flare Battle", - "battle_aether_grunt": "SM Aether Foundation Battle", - "battle_skull_grunt": "SM Team Skull Battle", - "battle_macro_grunt": "SWSH Trainer Battle", - "battle_galactic_admin": "BDSP Team Galactic Admin Battle", - "battle_skull_admin": "SM Team Skull Admin Battle", - "battle_oleana": "SWSH Oleana Battle", - "battle_rocket_boss": "USUM Giovanni Battle", - "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", - "battle_galactic_boss": "BDSP Cyrus Battle", - "battle_plasma_boss": "B2W2 Ghetsis Battle", - "battle_flare_boss": "XY Lysandre Battle", - "battle_aether_boss": "SM Lusamine Battle", - "battle_skull_boss": "SM Guzma Battle", - "battle_macro_boss": "SWSH Rose Battle", + "battle_kanto_champion": "B2W2 戦闘!チャンピオン(カントー)", + "battle_johto_champion": "B2W2 戦闘!チャンピオン(ジョウト)", + "battle_hoenn_champion_g5": "B2W2 戦闘!チャンピオン(ホウエン)", + "battle_hoenn_champion_g6": "ORAS 決戦!ダイゴ", + "battle_sinnoh_champion": "B2W2 戦闘!チャンピオン(シンオウ)", + "battle_champion_alder": "BW チャンピオン アデク", + "battle_champion_iris": "B2W2 戦闘!チャンピオンアイリス", + "battle_kalos_champion": "XY 戦闘!チャンピオン", + "battle_alola_champion": "USUM 頂上決戦!ハウ", + "battle_galar_champion": "SWSH 決戦!チャンピオンダンデ", + "battle_champion_geeta": "SV 戦闘!トップチャンピオン", + "battle_champion_nemona": "SV 戦闘!チャンピオンネモ", + "battle_champion_kieran": "SV 戦闘!チャンピオンスグリ", + "battle_hoenn_elite": "ORAS 戦闘!四天王", + "battle_unova_elite": "BW 戦闘!四天王", + "battle_kalos_elite": "XY 戦闘!四天王", + "battle_alola_elite": "SM 戦闘!四天王", + "battle_galar_elite": "SWSH 戦闘!ファイナルトーナメント!", + "battle_paldea_elite": "SV 戦闘!四天王", + "battle_bb_elite": "SV 戦闘!ブルベリーグ四天王", + "battle_final_encounter": "ポケダンDX レックウザ登場", + "battle_final": "BW 戦闘!ゲーチス", + "battle_kanto_gym": "B2W2 戦闘!ジムリーダー(カントー)", + "battle_johto_gym": "B2W2 戦闘!ジムリーダー(ジョウト)", + "battle_hoenn_gym": "B2W2 戦闘!ジムリーダー(ホウエン)", + "battle_sinnoh_gym": "B2W2 戦闘!ジムリーダー(シンオウ)", + "battle_unova_gym": "BW 戦闘!ジムリーダー", + "battle_kalos_gym": "XY 戦闘!ジムリーダー", + "battle_galar_gym": "SWSH 戦闘!ジムリーダー", + "battle_paldea_gym": "SV 戦闘!ジムリーダー", + "battle_legendary_kanto": "XY 戦闘!ミュウツー", + "battle_legendary_raikou": "HGSS 戦闘!ライコウ", + "battle_legendary_entei": "HGSS 戦闘!エンテイ", + "battle_legendary_suicune": "HGSS 戦闘!スイクン", + "battle_legendary_lugia": "HGSS 戦闘!ルギア", + "battle_legendary_ho_oh": "HGSS 戦闘!ホウオウ", + "battle_legendary_regis_g5": "B2W2 戦闘!レジロック・レジアイス・レジスチル", + "battle_legendary_regis_g6": "ORAS 戦闘!レジロック・レジアイス・レジスチル", + "battle_legendary_gro_kyo": "ORAS 戦闘!ゲンシカイキ", + "battle_legendary_rayquaza": "ORAS 戦闘!超古代ポケモン", + "battle_legendary_deoxys": "ORAS 戦闘!デオキシス", + "battle_legendary_lake_trio": "ORAS 戦闘!ユクシー・エムリット・アグノム", + "battle_legendary_sinnoh": "ORAS 戦闘!伝説のポケモン(シンオウ)", + "battle_legendary_dia_pal": "ORAS 戦闘!ディアルガ・パルキア", + "battle_legendary_origin_forme": "LA 戦い:ディアルガ・パルキア(オリジンフォルム)", + "battle_legendary_giratina": "ORAS 戦闘!ギラティナ", + "battle_legendary_arceus": "HGSS アルセウス", + "battle_legendary_unova": "BW 戦闘!伝説のポケモン", + "battle_legendary_kyurem": "BW 戦闘!キュレム", + "battle_legendary_res_zek": "BW 戦闘!ゼクロム・レシラム", + "battle_legendary_xern_yvel": "XY 戦闘!ゼルネアス・イベルタル・ジガルデ", + "battle_legendary_tapu": "SM 戦闘!カプ", + "battle_legendary_sol_lun": "SM 戦闘!ソルガレオ・ルナアーラ", + "battle_legendary_ub": "SM 戦闘!ウルトラビースト", + "battle_legendary_dusk_dawn": "USUM 戦闘!日食・月食ネクロズマ", + "battle_legendary_ultra_nec": "USUM 戦闘!ウルトラネクロズマ", + "battle_legendary_zac_zam": "SWSH 戦闘!ザシアン・ザマゼンタ", + "battle_legendary_glas_spec": "SWSH 戦闘!ブリザポス・レイスポス", + "battle_legendary_calyrex": "SWSH 戦闘!バドレックス", + "battle_legendary_riders": "SWSH 戦闘!豊穣の王", + "battle_legendary_birds_galar": "SWSH 戦闘!伝説のとりポケモン", + "battle_legendary_ruinous": "SV 戦闘!災厄ポケモン", + "battle_legendary_kor_mir": "SV 戦闘!エリアゼロのポケモン", + "battle_legendary_loyal_three": "SV 戦闘!ともっこ", + "battle_legendary_ogerpon": "SV 戦闘!オーガポン", + "battle_legendary_terapagos": "SV 戦闘!テラパゴス", + "battle_legendary_pecharunt": "SV 戦闘!モモワロウ", + "battle_rival": "BW 戦闘!チェレン・ベル", + "battle_rival_2": "BW 戦闘!N", + "battle_rival_3": "BW 決戦!N", + "battle_trainer": "BW 戦闘!トレーナー", + "battle_wild": "BW 戦闘!野生ポケモン", + "battle_wild_strong": "BW 戦闘!強い野生ポケモン", + "end_summit": "ポケダンDX 天空の塔 最上階", + "battle_rocket_grunt": "HGSS 戦闘!ロケット団", + "battle_aqua_magma_grunt": "ORAS 戦闘!アクア団・マグマ団", + "battle_galactic_grunt": "BDSP 戦闘!ギンガ団", + "battle_plasma_grunt": "BW 戦闘!プラズマ団", + "battle_flare_grunt": "XY 戦闘!フレア団", + "battle_aether_grunt": "SM 戦闘!エーテル財団トレーナー", + "battle_skull_grunt": "SM 戦闘!スカル団", + "battle_macro_grunt": "SWSH 戦闘!トレーナー", + "battle_galactic_admin": "BDSP 戦闘!ギンガ団幹部", + "battle_skull_admin": "SM 戦闘!スカル団幹部", + "battle_oleana": "SWSH 戦闘!オリーヴ", + "battle_rocket_boss": "USUM 戦闘!レインボーロケット団ボス", + "battle_aqua_magma_boss": "ORAS 戦闘!アクア団・マグマ団のリーダー", + "battle_galactic_boss": "BDSP 戦闘!ギンガ団ボス", + "battle_plasma_boss": "B2W2 戦闘!ゲーチス", + "battle_flare_boss": "XY 戦闘!フラダリ", + "battle_aether_boss": "SM 戦闘!ルザミーネ", + "battle_skull_boss": "SM 戦闘!スカル団ボス", + "battle_macro_boss": "SWSH 戦闘!ローズ", - "abyss": "PMD EoS Dark Crater", - "badlands": "PMD EoS Barren Valley", - "beach": "PMD EoS Drenched Bluff", - "cave": "PMD EoS Sky Peak Cave", - "construction_site": "PMD EoS Boulder Quarry", - "desert": "PMD EoS Northern Desert", - "dojo": "PMD EoS Marowak Dojo", - "end": "PMD RTDX Sky Tower", - "factory": "PMD EoS Concealed Ruins", - "fairy_cave": "PMD EoS Star Cave", - "forest": "PMD EoS Dusk Forest", - "grass": "PMD EoS Apple Woods", - "graveyard": "PMD EoS Mystifying Forest", - "ice_cave": "PMD EoS Vast Ice Mountain", - "island": "PMD EoS Craggy Coast", - "jungle": "Lmz - Jungle", - "laboratory": "Firel - Laboratory", - "lake": "PMD EoS Crystal Cave", - "meadow": "PMD EoS Sky Peak Forest", - "metropolis": "Firel - Metropolis", - "mountain": "PMD EoS Mt. Horn", - "plains": "PMD EoS Sky Peak Prairie", - "power_plant": "PMD EoS Far Amp Plains", - "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "Andr06 - Marine Mystique", - "seabed": "Firel - Seabed", - "slum": "Andr06 - Sneaky Snom", - "snowy_forest": "PMD EoS Sky Peak Snowfield", - "space": "Firel - Aether", - "swamp": "PMD EoS Surrounded Sea", - "tall_grass": "PMD EoS Foggy Forest", - "temple": "PMD EoS Aegis Cave", - "town": "PMD EoS Random Dungeon Theme 3", - "volcano": "PMD EoS Steam Cave", - "wasteland": "PMD EoS Hidden Highland", - "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", - "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", - "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", - "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", - "encounter_lass": "BW Trainers' Eyes Meet (Lass)", - "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", - "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", - "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", - "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", - "encounter_rival": "BW Cheren", - "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", - "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", - "encounter_twins": "BW Trainers' Eyes Meet (Twins)", - "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", - "heal": "BW Pokémon Heal", - "menu": "PMD EoS Welcome to the World of Pokémon!", - "title": "PMD EoS Top Menu Theme" + "abyss": "ポケダン空 やみのかこう", + "badlands": "ポケダン空 こかつのたに", + "beach": "ポケダン空 しめったいわば", + "cave": "ポケダン空 そらのいただき(どうくつ)", + "construction_site": "ポケダン空 きょだいがんせきぐん", + "desert": "ポケダン空 きたのさばく", + "dojo": "ポケダン空 ガラガラどうじょう", + "end": "ポケダンDX 天空の塔", + "factory": "ポケダン空 かくされたいせき", + "fairy_cave": "ポケダン空 ほしのどうくつ", + "forest": "ポケダン空 くろのもり", + "grass": "ポケダン空 リンゴのもり", + "graveyard": "ポケダン空 しんぴのもり", + "ice_cave": "ポケダン空 だいひょうざん", + "island": "ポケダン空 えんがんのいわば", + "jungle": "Lmz - Jungle(ジャングル)", + "laboratory": "Firel - Laboratory(ラボラトリー)", + "lake": "ポケダン空 すいしょうのどうくつ", + "meadow": "ポケダン空 そらのいただき(もり)", + "metropolis": "Firel - Metropolis(大都市)", + "mountain": "ポケダン空 ツノやま", + "plains": "ポケダン空 そらのいただき(そうげん)", + "power_plant": "ポケダン空 エレキへいげん", + "ruins": "ポケダン空 ふういんのいわば", + "sea": "Andr06 - Marine Mystique(海の神秘性)", + "seabed": "Firel - Seabed(海底)", + "slum": "Andr06 - Sneaky Snom(ずるいユキハミ)", + "snowy_forest": "ポケダン空 そらのいただき(ゆきやま)", + "space": "Firel - Aether(エーテル)", + "swamp": "ポケダン空 とざされたうみ", + "tall_grass": "ポケダン空 のうむのもり", + "temple": "ポケダン空 ばんにんのどうくつ", + "town": "ポケダン空 ランダムダンジョン3", + "volcano": "ポケダン空 ねっすいのどうくつ", + "wasteland": "ポケダン空 まぼろしのだいち", + "encounter_ace_trainer": "BW 視線!エリートトレーナー", + "encounter_backpacker": "BW 視線!バックパッカー", + "encounter_clerk": "BW 視線!ビジネスマン", + "encounter_cyclist": "BW 視線!サイクリング", + "encounter_lass": "BW 視線!ミニスカート", + "encounter_parasol_lady": "BW 視線!パラソルおねえさん", + "encounter_pokefan": "BW 視線!だいすきクラブ", + "encounter_psychic": "BW 視線!サイキッカー", + "encounter_rich": "BW 視線!ジェントルマン", + "encounter_rival": "BW チェレンのテーマ", + "encounter_roughneck": "BW 視線!スキンヘッズ", + "encounter_scientist": "BW 視線!けんきゅういん", + "encounter_twins": "BW 視線!ふたごちゃん", + "encounter_youngster": "BW 視線!たんぱんこぞう", + "heal": "BW 回復", + "menu": "ポケダン空 ようこそ! ポケモンたちのせかいへ!", + "title": "ポケダン空 トップメニュー" } diff --git a/src/locales/ja/menu.json b/src/locales/ja/menu.json index 0e7701578bf..3630f7590ba 100644 --- a/src/locales/ja/menu.json +++ b/src/locales/ja/menu.json @@ -51,5 +51,7 @@ "renamePokemon": "ニックネームを変える", "rename": "変える", "nickname": "ニックネーム", - "errorServerDown": "おや!\nサーバーとの 接続中に 問題が 発生しました。\nゲームは 自動的に 再接続されます から\nウィンドウは 開いたままに しておいても よろしいです。" + "errorServerDown": "おや!\nサーバーとの 接続中に 問題が 発生しました。\nゲームは 自動的に 再接続されます から\nウィンドウは 開いたままに しておいても よろしいです。", + "noSaves": "何の セーブファイルも ありません!", + "tooManySaves": "セーブファイルが いっぱいです!" } diff --git a/src/locales/ja/modifier-type.json b/src/locales/ja/modifier-type.json index e249e3c430f..e78ffaf652e 100644 --- a/src/locales/ja/modifier-type.json +++ b/src/locales/ja/modifier-type.json @@ -47,10 +47,14 @@ "description": "ポケモンのせいかくを {{natureName}}にかえて スターターのせいかくをえいきゅうにかいじょする" }, "DoubleBattleChanceBoosterModifierType": { - "description": "バトル{{battleCount}}かいのあいだ ダブルバトルになるかくりつを2ばいにする" + "description": "バトル{{battleCount}}回の間  ダブルバトルになる  確率を 4倍に する" }, "TempStatStageBoosterModifierType": { - "description": "すべてのパーティメンバーの {{stat}}を5かいのバトルのあいだ 1だんかいあげる" + "description": "全員の 手持ちポケモンの {{stat}}を 最大5回の バトルの間に {{amount}}あげる.", + "extra": { + "stage": "1段階", + "percentage": "30%" + } }, "AttackTypeBoosterModifierType": { "description": "ポケモンの {{moveType}}タイプのわざのいりょくを20パーセントあげる" diff --git a/src/locales/ko/ability-trigger.json b/src/locales/ko/ability-trigger.json index 5cf94e92235..b1f100c5c36 100644 --- a/src/locales/ko/ability-trigger.json +++ b/src/locales/ko/ability-trigger.json @@ -12,6 +12,7 @@ "blockItemTheft": "{{pokemonNameWithAffix}}의 {{abilityName}}에 의해\n도구를 빼앗기지 않는다!", "typeImmunityHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 입지 않는다!", + "fullHpResistType": "{{pokemonNameWithAffix}}[[는]] 등껍질을 빛나게 하여\n타입 상성을 왜곡시켰다!!", "moveImmunity": "{{pokemonNameWithAffix}}에게는\n효과가 없는 것 같다...", "reverseDrain": "{{pokemonNameWithAffix}}[[는]]\n해감액을 흡수했다!", "postDefendTypeChange": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]] 인해\n{{typeName}}타입이 됐다!", @@ -51,6 +52,7 @@ "postSummonTeravolt": "{{pokemonNameWithAffix}}[[는]]\n세차게 튀는 오라를 발산하고 있다!", "postSummonDarkAura": "{{pokemonNameWithAffix}}[[는]]\n다크오라를 발산하고 있다!", "postSummonFairyAura": "{{pokemonNameWithAffix}}[[는]]\n페어리오라를 발산하고 있다!", + "postSummonAuraBreak": "{{pokemonNameWithAffix}}[[는]]\n모든 오라를 제압한다!", "postSummonNeutralizingGas": "주위가 화학변화가스로 가득 찼다!", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}[[는]]\n두 가지 특성을 겸비한다!", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}[[는]]\n두 가지 특성을 겸비한다!", @@ -59,4 +61,4 @@ "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}의 재앙의목간에 의해\n주위의 {{statName}}[[가]] 약해졌다!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}의 재앙의구슬에 의해\n주위의 {{statName}}[[가]] 약해졌다!", "preventBerryUse": "{{pokemonNameWithAffix}}[[는]] 긴장해서\n나무열매를 먹을 수 없게 되었다!" -} \ No newline at end of file +} diff --git a/src/locales/ko/battle.json b/src/locales/ko/battle.json index 001720e4e5c..fd715fd0e7e 100644 --- a/src/locales/ko/battle.json +++ b/src/locales/ko/battle.json @@ -44,6 +44,7 @@ "moveNotImplemented": "{{moveName}}[[는]] 아직 구현되지 않아 사용할 수 없다…", "moveNoPP": "기술의 남은 포인트가 없다!", "moveDisabled": "{{moveName}}[[를]] 쓸 수 없다!", + "disableInterruptedMove": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다.", "noPokeballForce": "본 적 없는 힘이\n볼을 사용하지 못하게 한다.", "noPokeballTrainer": "다른 트레이너의 포켓몬은 잡을 수 없다!", "noPokeballMulti": "안돼! 2마리 있어서\n목표를 정할 수가 없어…!", @@ -95,4 +96,4 @@ "congratulations": "축하합니다!", "beatModeFirstTime": "{{speciesName}}[[가]] {{gameMode}} 모드를 처음으로 클리어했다!\n{{newModifier}}[[를]] 손에 넣었다!", "ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{reduction}} 깎았다!" -} \ No newline at end of file +} diff --git a/src/locales/ko/battler-tags.json b/src/locales/ko/battler-tags.json index 47ddb26c183..0993cafa04a 100644 --- a/src/locales/ko/battler-tags.json +++ b/src/locales/ko/battler-tags.json @@ -67,5 +67,7 @@ "saltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.", "cursedOnAdd": "{{pokemonNameWithAffix}}[[는]] 자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!", "cursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!", - "stockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!" -} \ No newline at end of file + "stockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!", + "disabledOnAdd": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다!", + "disabledLapse": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n이제 사용할 수 있다." +} diff --git a/src/locales/ko/menu.json b/src/locales/ko/menu.json index 7976e0bedcf..a9db630f7a1 100644 --- a/src/locales/ko/menu.json +++ b/src/locales/ko/menu.json @@ -51,5 +51,7 @@ "renamePokemon": "포켓몬의 닉네임은?", "rename": "닉네임 바꾸기", "nickname": "닉네임", - "errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다." + "errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다.", + "noSaves": "기기에 세이브 파일이 없습니다!", + "tooManySaves": "기기에 세이브 파일이 너무 많습니다!" } diff --git a/src/locales/ko/modifier-type.json b/src/locales/ko/modifier-type.json index d94837bb0d2..e957fd0d58a 100644 --- a/src/locales/ko/modifier-type.json +++ b/src/locales/ko/modifier-type.json @@ -47,10 +47,14 @@ "description": "포켓몬의 성격을 {{natureName}}[[로]] 바꾸고 스타팅에도 등록한다." }, "DoubleBattleChanceBoosterModifierType": { - "description": "{{battleCount}}번의 배틀 동안 더블 배틀이 등장할 확률이 두 배가 된다." + "description": "{{battleCount}}번의 배틀 동안 더블 배틀이 등장할 확률이 4배가 된다." }, "TempStatStageBoosterModifierType": { - "description": "자신의 모든 포켓몬이 5번의 배틀 동안 {{stat}}[[가]] 한 단계 증가한다." + "description": "자신의 모든 포켓몬이 5번의 배틀 동안 {{stat}}[[가]] {{amount}}단계 증가한다.", + "extra": { + "stage": "1 스테이지", + "percentage": "30%" + } }, "AttackTypeBoosterModifierType": { "description": "지니게 하면 {{moveType}}타입 기술의 위력이 20% 상승한다." diff --git a/src/locales/pt_BR/battle.json b/src/locales/pt_BR/battle.json index e34ce8efdca..2b20e0062ea 100644 --- a/src/locales/pt_BR/battle.json +++ b/src/locales/pt_BR/battle.json @@ -95,4 +95,4 @@ "unlockedSomething": "{{unlockedThing}}\nfoi desbloqueado.", "congratulations": "Parabéns!", "beatModeFirstTime": "{{speciesName}} venceu o Modo {{gameMode}} pela primeira vez!\nVocê recebeu {{newModifier}}!" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/battler-tags.json b/src/locales/pt_BR/battler-tags.json index 560da13cc6f..e0f6538404b 100644 --- a/src/locales/pt_BR/battler-tags.json +++ b/src/locales/pt_BR/battler-tags.json @@ -68,4 +68,4 @@ "cursedOnAdd": "{{pokemonNameWithAffix}} cortou seus PS pela metade e amaldiçoou {{pokemonName}}!", "cursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!", "stockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/modifier-type.json b/src/locales/pt_BR/modifier-type.json index 823d6b35e16..f20a4ef3d0f 100644 --- a/src/locales/pt_BR/modifier-type.json +++ b/src/locales/pt_BR/modifier-type.json @@ -47,10 +47,14 @@ "description": "Muda a natureza do Pokémon para {{natureName}} e a desbloqueia permanentemente." }, "DoubleBattleChanceBoosterModifierType": { - "description": "Dobra as chances de encontrar uma batalha em dupla por {{battleCount}} batalhas." + "description": "Quadruplica as chances de encontrar uma batalha em dupla por {{battleCount}} batalhas." }, "TempStatStageBoosterModifierType": { - "description": "Aumenta o atributo de {{stat}} para todos os membros da equipe por 5 batalhas." + "description": "Aumenta o atributo de {{stat}} para todos os membros da equipe em {{amount}} por 5 batalhas.", + "extra": { + "stage": "um nível", + "percentage": "30%" + } }, "AttackTypeBoosterModifierType": { "description": "Aumenta o poder dos ataques do tipo {{moveType}} de um Pokémon em 20%." diff --git a/src/locales/zh_CN/ability-trigger.json b/src/locales/zh_CN/ability-trigger.json index f4289b598a0..0bb9c3a56ef 100644 --- a/src/locales/zh_CN/ability-trigger.json +++ b/src/locales/zh_CN/ability-trigger.json @@ -12,6 +12,7 @@ "blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了对方夺取道具!", "typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了伤害!", + "fullHpResistType": "{{pokemonNameWithAffix}}\n让甲壳发出光辉,使属性相克发生扭曲!", "moveImmunity": "对{{pokemonNameWithAffix}}没有效果!", "reverseDrain": "{{pokemonNameWithAffix}}\n吸到了污泥浆!", "postDefendTypeChange": "{{pokemonNameWithAffix}}因{{abilityName}}\n变成了{{typeName}}属性!", @@ -51,6 +52,7 @@ "postSummonTeravolt": "{{pokemonNameWithAffix}}\n正在释放溅射气场!", "postSummonDarkAura": "{{pokemonNameWithAffix}}\n正在释放暗黑气场!", "postSummonFairyAura": "{{pokemonNameWithAffix}}\n正在释放妖精气场!", + "postSummonAuraBreak": "{{pokemonNameWithAffix}}\n压制了所有气场!", "postSummonNeutralizingGas": "周围充满了\n{{pokemonNameWithAffix}}的化学变化气体!", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\n同时拥有了两种特性!", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\n同时拥有了两种特性!", @@ -59,4 +61,4 @@ "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}的灾祸之简\n令周围的宝可梦的{{statName}}减弱了!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}的灾祸之玉\n令周围的宝可梦的{{statName}}减弱了!", "preventBerryUse": "{{pokemonNameWithAffix}}因太紧张\n而无法食用树果!" -} \ No newline at end of file +} diff --git a/src/locales/zh_CN/battle.json b/src/locales/zh_CN/battle.json index 84f468a4a4b..4197786b7d8 100644 --- a/src/locales/zh_CN/battle.json +++ b/src/locales/zh_CN/battle.json @@ -44,6 +44,7 @@ "moveNotImplemented": "{{moveName}}尚未实装,无法选择。", "moveNoPP": "这个技能的PP用完了", "moveDisabled": "{{moveName}}被禁用!", + "disableInterruptedMove": "{{pokemonNameWithAffix}}的{{moveName}}\n被无效化了!", "noPokeballForce": "一股无形的力量阻止了你使用精灵球。", "noPokeballTrainer": "你不能捕捉其他训练家的宝可梦!", "noPokeballMulti": "只能在剩下一只宝可梦时才能扔出精灵球!", @@ -87,4 +88,4 @@ "unlockedSomething": "{{unlockedThing}}\n已解锁。", "congratulations": "恭喜!", "beatModeFirstTime": "{{speciesName}}首次击败了{{gameMode}}!\n你获得了{{newModifier}}!" -} \ No newline at end of file +} diff --git a/src/locales/zh_CN/battler-tags.json b/src/locales/zh_CN/battler-tags.json index 81838b5023a..792551d1ab1 100644 --- a/src/locales/zh_CN/battler-tags.json +++ b/src/locales/zh_CN/battler-tags.json @@ -67,5 +67,7 @@ "saltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!", "cursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}!", "cursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!", - "stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!" -} \ No newline at end of file + "stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!", + "disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{{moveName}}!", + "disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了!" +} diff --git a/src/locales/zh_CN/menu.json b/src/locales/zh_CN/menu.json index 59146d30ee9..8946b5b8df6 100644 --- a/src/locales/zh_CN/menu.json +++ b/src/locales/zh_CN/menu.json @@ -51,5 +51,7 @@ "renamePokemon": "给宝可梦起名", "rename": "起名", "nickname": "昵称", - "errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启,\n游戏会自动重新连接。" -} \ No newline at end of file + "errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启,\n游戏会自动重新连接。", + "noSaves": "你没有任何记录文件!", + "tooManySaves": "你的记录文件太多了!" +} diff --git a/src/locales/zh_CN/modifier-type.json b/src/locales/zh_CN/modifier-type.json index 5d6184640b1..26e4c2dc110 100644 --- a/src/locales/zh_CN/modifier-type.json +++ b/src/locales/zh_CN/modifier-type.json @@ -47,10 +47,14 @@ "description": "将一只宝可梦的性格改为{{natureName}}并为\n该宝可梦永久解锁该性格。" }, "DoubleBattleChanceBoosterModifierType": { - "description": "接下来的{{battleCount}}场战斗是双打的概率翻倍。" + "description": "遭遇双打概率提升四倍,持续{{battleCount}}场战斗。" }, "TempStatStageBoosterModifierType": { - "description": "为所有成员宝可梦提升一级{{stat}},持续5场战斗。" + "description": "提升全队的{{stat}}{{amount}}级,持续5场战斗。", + "extra": { + "stage": "1阶", + "percentage": "30%" + } }, "AttackTypeBoosterModifierType": { "description": "一只宝可梦的{{moveType}}系招式威力提升20%。" diff --git a/src/locales/zh_TW/ability-trigger.json b/src/locales/zh_TW/ability-trigger.json index 3286d97b10c..f31fb12bc35 100644 --- a/src/locales/zh_TW/ability-trigger.json +++ b/src/locales/zh_TW/ability-trigger.json @@ -6,6 +6,8 @@ "trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!", "windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!", "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}的畫皮脫落了!", + "fullHpResistType": "{{pokemonNameWithAffix}}讓甲殼綻放光輝,扭曲了屬性相剋關係!", "weatherEffectDisappeared": "天氣的影響消失了!", + "postSummonAuraBreak": "{{pokemonNameWithAffix}}壓制了所有氣場!", "preventBerryUse": "{{pokemonNameWithAffix}}因太緊張\n而無法食用樹果!" -} \ No newline at end of file +} diff --git a/src/locales/zh_TW/battle.json b/src/locales/zh_TW/battle.json index 97b85a9cd5a..0d44688ff4a 100644 --- a/src/locales/zh_TW/battle.json +++ b/src/locales/zh_TW/battle.json @@ -40,6 +40,7 @@ "moveNotImplemented": "{{moveName}} 未實裝,無法選擇。", "moveNoPP": "這個技能的PP用完了", "moveDisabled": "{{moveName}} 被禁用!", + "disableInterruptedMove": "{{pokemonNameWithAffix}}的{{moveName}}\n被無效化了!", "noPokeballForce": "一股無形的力量阻止了你使用精靈球。", "noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!", "noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!", @@ -65,4 +66,4 @@ "regainHealth": "{{pokemonName}} 回復了體力!", "fainted": "{{pokemonNameWithAffix}} 倒下了!", "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!" -} \ No newline at end of file +} diff --git a/src/locales/zh_TW/battler-tags.json b/src/locales/zh_TW/battler-tags.json index 9a35bb0d03f..b5a2760f7ac 100644 --- a/src/locales/zh_TW/battler-tags.json +++ b/src/locales/zh_TW/battler-tags.json @@ -66,5 +66,7 @@ "saltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!", "saltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!", "cursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}!", - "cursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!" -} \ No newline at end of file + "cursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!", + "disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{moveName}}!", + "disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了!" +} diff --git a/src/locales/zh_TW/menu.json b/src/locales/zh_TW/menu.json index 1ec0b7124d8..b56a39bbda2 100644 --- a/src/locales/zh_TW/menu.json +++ b/src/locales/zh_TW/menu.json @@ -40,5 +40,7 @@ "loading": "加載中…", "playersOnline": "在線玩家", "yes": "是", - "no": "否" -} \ No newline at end of file + "no": "否", + "noSaves": "你沒有任何記錄檔!", + "tooManySaves": "你的記錄檔太多了!" +} diff --git a/src/locales/zh_TW/modifier-type.json b/src/locales/zh_TW/modifier-type.json index 68881a206cb..ec066277cda 100644 --- a/src/locales/zh_TW/modifier-type.json +++ b/src/locales/zh_TW/modifier-type.json @@ -47,10 +47,14 @@ "description": "將一隻寶可夢的性格改爲{{natureName}}併爲該寶可\n夢永久解鎖該性格。" }, "DoubleBattleChanceBoosterModifierType": { - "description": "接下來的{{battleCount}}場戰鬥是雙打的概率翻倍。" + "description": "遭遇雙打機率提升四倍,持續{{battleCount}}場戰鬥。" }, "TempStatStageBoosterModifierType": { - "description": "爲所有成員寶可夢提升一級{{stat}},持續5場戰鬥。" + "description": "提升全隊的{{stat}}{{amount}}級,持續5場戰鬥。", + "extra": { + "stage": "1階", + "percentage": "30%" + } }, "AttackTypeBoosterModifierType": { "description": "一隻寶可夢的{{moveType}}系招式威力提升20%。" diff --git a/src/main.ts b/src/main.ts index 8a69d3f1b72..b5f813bdf2f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,8 +4,8 @@ import InvertPostFX from "./pipelines/invert"; import { version } from "../package.json"; import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; import BBCodeTextPlugin from "phaser3-rex-plugins/plugins/bbcodetext-plugin"; -import InputTextPlugin from "phaser3-rex-plugins/plugins/inputtext-plugin.js"; -import TransitionImagePackPlugin from "phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin.js"; +import InputTextPlugin from "phaser3-rex-plugins/plugins/inputtext-plugin"; +import TransitionImagePackPlugin from "phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin"; import { LoadingScene } from "./loading-scene"; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index fe586074c79..fdfe60332f5 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -25,7 +25,7 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { getPokemonNameWithAffix } from "#app/messages.js"; +import { getPokemonNameWithAffix } from "#app/messages"; import { PermanentStat, TEMP_BATTLE_STATS, TempBattleStat, Stat, getStatKey } from "#app/enums/stat"; const outputModifierData = false; @@ -433,37 +433,44 @@ export class RememberMoveModifierType extends PokemonModifierType { } export class DoubleBattleChanceBoosterModifierType extends ModifierType { - public battleCount: integer; + private maxBattles: number; - constructor(localeKey: string, iconImage: string, battleCount: integer) { - super(localeKey, iconImage, (_type, _args) => new Modifiers.DoubleBattleChanceBoosterModifier(this, this.battleCount), "lure"); + constructor(localeKey: string, iconImage: string, maxBattles: number) { + super(localeKey, iconImage, (_type, _args) => new Modifiers.DoubleBattleChanceBoosterModifier(this, maxBattles), "lure"); - this.battleCount = battleCount; + this.maxBattles = maxBattles; } - getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.DoubleBattleChanceBoosterModifierType.description", { battleCount: this.battleCount }); + getDescription(_scene: BattleScene): string { + return i18next.t("modifierType:ModifierType.DoubleBattleChanceBoosterModifierType.description", { + battleCount: this.maxBattles + }); } } export class TempStatStageBoosterModifierType extends ModifierType implements GeneratedPersistentModifierType { private stat: TempBattleStat; - private key: string; + private nameKey: string; + private quantityKey: string; constructor(stat: TempBattleStat) { - const key = TempStatStageBoosterModifierTypeGenerator.items[stat]; - super("", key, (_type, _args) => new Modifiers.TempStatStageBoosterModifier(this, this.stat)); + const nameKey = TempStatStageBoosterModifierTypeGenerator.items[stat]; + super("", nameKey, (_type, _args) => new Modifiers.TempStatStageBoosterModifier(this, this.stat, 5)); this.stat = stat; - this.key = key; + this.nameKey = nameKey; + this.quantityKey = (stat !== Stat.ACC) ? "percentage" : "stage"; } get name(): string { - return i18next.t(`modifierType:TempStatStageBoosterItem.${this.key}`); + return i18next.t(`modifierType:TempStatStageBoosterItem.${this.nameKey}`); } getDescription(_scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.description", { stat: i18next.t(getStatKey(this.stat)) }); + return i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.description", { + stat: i18next.t(getStatKey(this.stat)), + amount: i18next.t(`modifierType:ModifierType.TempStatStageBoosterModifierType.extra.${this.quantityKey}`) + }); } getPregenArgs(): any[] { @@ -1348,9 +1355,9 @@ export const modifierTypes = { SUPER_REPEL: () => new DoubleBattleChanceBoosterModifierType('Super Repel', 10), MAX_REPEL: () => new DoubleBattleChanceBoosterModifierType('Max Repel', 25),*/ - LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.LURE", "lure", 5), - SUPER_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.SUPER_LURE", "super_lure", 10), - MAX_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.MAX_LURE", "max_lure", 25), + LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.LURE", "lure", 10), + SUPER_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.SUPER_LURE", "super_lure", 15), + MAX_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.MAX_LURE", "max_lure", 30), SPECIES_STAT_BOOSTER: () => new SpeciesStatBoosterModifierTypeGenerator(), @@ -1358,9 +1365,12 @@ export const modifierTypes = { DIRE_HIT: () => new class extends ModifierType { getDescription(_scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.description", { stat: i18next.t("modifierType:ModifierType.DIRE_HIT.extra.raises") }); + return i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.description", { + stat: i18next.t("modifierType:ModifierType.DIRE_HIT.extra.raises"), + amount: i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.extra.stage") + }); } - }("modifierType:ModifierType.DIRE_HIT", "dire_hit", (type, _args) => new Modifiers.TempCritBoosterModifier(type)), + }("modifierType:ModifierType.DIRE_HIT", "dire_hit", (type, _args) => new Modifiers.TempCritBoosterModifier(type, 5)), BASE_STAT_BOOSTER: () => new BaseStatBoosterModifierTypeGenerator(), diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index f3219c8bf73..0b105a0c852 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -26,9 +26,9 @@ import i18next from "i18next"; import { allMoves } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; -import { LearnMovePhase } from "#app/phases/learn-move-phase.js"; -import { LevelUpPhase } from "#app/phases/level-up-phase.js"; -import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js"; +import { LearnMovePhase } from "#app/phases/learn-move-phase"; +import { LevelUpPhase } from "#app/phases/level-up-phase"; +import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; export type ModifierPredicate = (modifier: Modifier) => boolean; @@ -292,70 +292,131 @@ export class AddVoucherModifier extends ConsumableModifier { } } +/** + * Modifier used for party-wide or passive items that start an initial + * {@linkcode battleCount} equal to {@linkcode maxBattles} that, for every + * battle, decrements. Typically, when {@linkcode battleCount} reaches 0, the + * modifier will be removed. If a modifier of the same type is to be added, it + * will reset {@linkcode battleCount} back to {@linkcode maxBattles} of the + * existing modifier instead of adding that modifier directly. + * @extends PersistentModifier + * @abstract + * @see {@linkcode add} + */ export abstract class LapsingPersistentModifier extends PersistentModifier { - protected battlesLeft: integer; + /** The maximum amount of battles the modifier will exist for */ + private maxBattles: number; + /** The current amount of battles the modifier will exist for */ + private battleCount: number; - constructor(type: ModifierTypes.ModifierType, battlesLeft?: integer, stackCount?: integer) { + constructor(type: ModifierTypes.ModifierType, maxBattles: number, battleCount?: number, stackCount?: integer) { super(type, stackCount); - this.battlesLeft = battlesLeft!; // TODO: is this bang correct? + this.maxBattles = maxBattles; + this.battleCount = battleCount ?? this.maxBattles; } - lapse(args: any[]): boolean { - return !!--this.battlesLeft; + /** + * Goes through existing modifiers for any that match the selected modifier, + * which will then either add it to the existing modifiers if none were found + * or, if one was found, it will refresh {@linkcode battleCount}. + * @param modifiers {@linkcode PersistentModifier} array of the player's modifiers + * @param _virtual N/A + * @param _scene N/A + * @returns true if the modifier was successfully added or applied, false otherwise + */ + add(modifiers: PersistentModifier[], _virtual: boolean, scene: BattleScene): boolean { + for (const modifier of modifiers) { + if (this.match(modifier)) { + const modifierInstance = modifier as LapsingPersistentModifier; + if (modifierInstance.getBattleCount() < modifierInstance.getMaxBattles()) { + modifierInstance.resetBattleCount(); + scene.playSound("se/restore"); + return true; + } + // should never get here + return false; + } + } + + modifiers.push(this); + return true; + } + + lapse(_args: any[]): boolean { + this.battleCount--; + return this.battleCount > 0; } getIcon(scene: BattleScene): Phaser.GameObjects.Container { const container = super.getIcon(scene); - const battleCountText = addTextObject(scene, 27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { fontSize: "66px", color: "#f89890" }); + // Linear interpolation on hue + const hue = Math.floor(120 * (this.battleCount / this.maxBattles) + 5); + + // Generates the color hex code with a constant saturation and lightness but varying hue + const typeHex = Utils.hslToHex(hue, 0.50, 0.90); + const strokeHex = Utils.hslToHex(hue, 0.70, 0.30); + + const battleCountText = addTextObject(scene, 27, 0, this.battleCount.toString(), TextStyle.PARTY, { fontSize: "66px", color: typeHex }); battleCountText.setShadow(0, 0); - battleCountText.setStroke("#984038", 16); + battleCountText.setStroke(strokeHex, 16); battleCountText.setOrigin(1, 0); container.add(battleCountText); return container; } - getBattlesLeft(): integer { - return this.battlesLeft; + getBattleCount(): number { + return this.battleCount; } - getMaxStackCount(scene: BattleScene, forThreshold?: boolean): number { - return 99; - } -} - -export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier { - constructor(type: ModifierTypes.DoubleBattleChanceBoosterModifierType, battlesLeft: integer, stackCount?: integer) { - super(type, battlesLeft, stackCount); + resetBattleCount(): void { + this.battleCount = this.maxBattles; } - match(modifier: Modifier): boolean { - if (modifier instanceof DoubleBattleChanceBoosterModifier) { - // Check type id to not match different tiers of lures - return modifier.type.id === this.type.id && modifier.battlesLeft === this.battlesLeft; - } - return false; - } - - clone(): DoubleBattleChanceBoosterModifier { - return new DoubleBattleChanceBoosterModifier(this.type as ModifierTypes.DoubleBattleChanceBoosterModifierType, this.battlesLeft, this.stackCount); + getMaxBattles(): number { + return this.maxBattles; } getArgs(): any[] { - return [ this.battlesLeft ]; + return [ this.maxBattles, this.battleCount ]; } + + getMaxStackCount(_scene: BattleScene, _forThreshold?: boolean): number { + return 1; + } +} + +/** + * Modifier used for passive items, specifically lures, that + * temporarily increases the chance of a double battle. + * @extends LapsingPersistentModifier + * @see {@linkcode apply} + */ +export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier { + constructor(type: ModifierType, maxBattles:number, battleCount?: number, stackCount?: integer) { + super(type, maxBattles, battleCount, stackCount); + } + + match(modifier: Modifier): boolean { + return (modifier instanceof DoubleBattleChanceBoosterModifier) && (modifier.getMaxBattles() === this.getMaxBattles()); + } + + clone(): DoubleBattleChanceBoosterModifier { + return new DoubleBattleChanceBoosterModifier(this.type as ModifierTypes.DoubleBattleChanceBoosterModifierType, this.getMaxBattles(), this.getBattleCount(), this.stackCount); + } + /** * Modifies the chance of a double battle occurring - * @param args A single element array containing the double battle chance as a NumberHolder - * @returns {boolean} Returns true if the modifier was applied + * @param args [0] {@linkcode Utils.NumberHolder} for double battle chance + * @returns true if the modifier was applied */ apply(args: any[]): boolean { const doubleBattleChance = args[0] as Utils.NumberHolder; // This is divided because the chance is generated as a number from 0 to doubleBattleChance.value using Utils.randSeedInt // A double battle will initiate if the generated number is 0 - doubleBattleChance.value = Math.ceil(doubleBattleChance.value / 2); + doubleBattleChance.value = Math.ceil(doubleBattleChance.value / 4); return true; } @@ -369,16 +430,18 @@ export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier * @see {@linkcode apply} */ export class TempStatStageBoosterModifier extends LapsingPersistentModifier { + /** The stat whose stat stage multiplier will be temporarily increased */ private stat: TempBattleStat; - private multiplierBoost: number; + /** The amount by which the stat stage itself or its multiplier will be increased by */ + private boost: number; - constructor(type: ModifierType, stat: TempBattleStat, battlesLeft?: number, stackCount?: number) { - super(type, battlesLeft ?? 5, stackCount); + constructor(type: ModifierType, stat: TempBattleStat, maxBattles: number, battleCount?: number, stackCount?: number) { + super(type, maxBattles, battleCount, stackCount); this.stat = stat; // Note that, because we want X Accuracy to maintain its original behavior, // it will increment as it did previously, directly to the stat stage. - this.multiplierBoost = stat !== Stat.ACC ? 0.3 : 1; + this.boost = (stat !== Stat.ACC) ? 0.3 : 1; } match(modifier: Modifier): boolean { @@ -390,11 +453,11 @@ export class TempStatStageBoosterModifier extends LapsingPersistentModifier { } clone() { - return new TempStatStageBoosterModifier(this.type, this.stat, this.battlesLeft, this.stackCount); + return new TempStatStageBoosterModifier(this.type, this.stat, this.getMaxBattles(), this.getBattleCount(), this.stackCount); } getArgs(): any[] { - return [ this.stat, this.battlesLeft ]; + return [ this.stat, ...super.getArgs() ]; } /** @@ -409,44 +472,14 @@ export class TempStatStageBoosterModifier extends LapsingPersistentModifier { } /** - * Increases the incoming stat stage matching {@linkcode stat} by {@linkcode multiplierBoost}. + * Increases the incoming stat stage matching {@linkcode stat} by {@linkcode boost}. * @param args [0] {@linkcode TempBattleStat} N/A * [1] {@linkcode Utils.NumberHolder} that holds the resulting value of the stat stage multiplier */ apply(args: any[]): boolean { - (args[1] as Utils.NumberHolder).value += this.multiplierBoost; + (args[1] as Utils.NumberHolder).value += this.boost; return true; } - - /** - * Goes through existing modifiers for any that match the selected modifier, - * which will then either add it to the existing modifiers if none were found - * or, if one was found, it will refresh {@linkcode battlesLeft}. - * @param modifiers {@linkcode PersistentModifier} array of the player's modifiers - * @param _virtual N/A - * @param _scene N/A - * @returns true if the modifier was successfully added or applied, false otherwise - */ - add(modifiers: PersistentModifier[], _virtual: boolean, _scene: BattleScene): boolean { - for (const modifier of modifiers) { - if (this.match(modifier)) { - const modifierInstance = modifier as TempStatStageBoosterModifier; - if (modifierInstance.getBattlesLeft() < 5) { - modifierInstance.battlesLeft = 5; - return true; - } - // should never get here - return false; - } - } - - modifiers.push(this); - return true; - } - - getMaxStackCount(_scene: BattleScene, _forThreshold?: boolean): number { - return 1; - } } /** @@ -456,12 +489,12 @@ export class TempStatStageBoosterModifier extends LapsingPersistentModifier { * @see {@linkcode apply} */ export class TempCritBoosterModifier extends LapsingPersistentModifier { - constructor(type: ModifierType, battlesLeft?: integer, stackCount?: number) { - super(type, battlesLeft || 5, stackCount); + constructor(type: ModifierType, maxBattles: number, battleCount?: number, stackCount?: number) { + super(type, maxBattles, battleCount, stackCount); } clone() { - return new TempCritBoosterModifier(this.type, this.stackCount); + return new TempCritBoosterModifier(this.type, this.getMaxBattles(), this.getBattleCount(), this.stackCount); } match(modifier: Modifier): boolean { @@ -486,36 +519,6 @@ export class TempCritBoosterModifier extends LapsingPersistentModifier { (args[0] as Utils.NumberHolder).value++; return true; } - - /** - * Goes through existing modifiers for any that match the selected modifier, - * which will then either add it to the existing modifiers if none were found - * or, if one was found, it will refresh {@linkcode battlesLeft}. - * @param modifiers {@linkcode PersistentModifier} array of the player's modifiers - * @param _virtual N/A - * @param _scene N/A - * @returns true if the modifier was successfully added or applied, false otherwise - */ - add(modifiers: PersistentModifier[], _virtual: boolean, _scene: BattleScene): boolean { - for (const modifier of modifiers) { - if (this.match(modifier)) { - const modifierInstance = modifier as TempCritBoosterModifier; - if (modifierInstance.getBattlesLeft() < 5) { - modifierInstance.battlesLeft = 5; - return true; - } - // should never get here - return false; - } - } - - modifiers.push(this); - return true; - } - - getMaxStackCount(_scene: BattleScene, _forThreshold?: boolean): number { - return 1; - } } export class MapModifier extends PersistentModifier { diff --git a/src/phases/add-enemy-buff-modifier-phase.ts b/src/phases/add-enemy-buff-modifier-phase.ts index a9936eb765d..451e6e2662c 100644 --- a/src/phases/add-enemy-buff-modifier-phase.ts +++ b/src/phases/add-enemy-buff-modifier-phase.ts @@ -1,8 +1,8 @@ -import BattleScene from "#app/battle-scene.js"; -import { ModifierTier } from "#app/modifier/modifier-tier.js"; -import { regenerateModifierPoolThresholds, ModifierPoolType, getEnemyBuffModifierForWave } from "#app/modifier/modifier-type.js"; -import { EnemyPersistentModifier } from "#app/modifier/modifier.js"; -import { Phase } from "#app/phase.js"; +import BattleScene from "#app/battle-scene"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { regenerateModifierPoolThresholds, ModifierPoolType, getEnemyBuffModifierForWave } from "#app/modifier/modifier-type"; +import { EnemyPersistentModifier } from "#app/modifier/modifier"; +import { Phase } from "#app/phase"; export class AddEnemyBuffModifierPhase extends Phase { constructor(scene: BattleScene) { diff --git a/src/phases/attempt-capture-phase.ts b/src/phases/attempt-capture-phase.ts index 72995c0f006..55a82affaf6 100644 --- a/src/phases/attempt-capture-phase.ts +++ b/src/phases/attempt-capture-phase.ts @@ -1,17 +1,17 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { getPokeballCatchMultiplier, getPokeballAtlasKey, getPokeballTintColor, doPokeballBounceAnim } from "#app/data/pokeball.js"; -import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect.js"; -import { PokeballType } from "#app/enums/pokeball.js"; -import { StatusEffect } from "#app/enums/status-effect.js"; -import { addPokeballOpenParticles, addPokeballCaptureStars } from "#app/field/anims.js"; -import { EnemyPokemon } from "#app/field/pokemon.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import { PokemonHeldItemModifier } from "#app/modifier/modifier.js"; -import { achvs } from "#app/system/achv.js"; -import { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler.js"; -import { SummaryUiMode } from "#app/ui/summary-ui-handler.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { getPokeballCatchMultiplier, getPokeballAtlasKey, getPokeballTintColor, doPokeballBounceAnim } from "#app/data/pokeball"; +import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; +import { PokeballType } from "#app/enums/pokeball"; +import { StatusEffect } from "#app/enums/status-effect"; +import { addPokeballOpenParticles, addPokeballCaptureStars } from "#app/field/anims"; +import { EnemyPokemon } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { achvs } from "#app/system/achv"; +import { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler"; +import { SummaryUiMode } from "#app/ui/summary-ui-handler"; +import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { PokemonPhase } from "./pokemon-phase"; import { VictoryPhase } from "./victory-phase"; diff --git a/src/phases/attempt-run-phase.ts b/src/phases/attempt-run-phase.ts index 9cf86fed592..46d68f6005a 100644 --- a/src/phases/attempt-run-phase.ts +++ b/src/phases/attempt-run-phase.ts @@ -28,7 +28,7 @@ export class AttemptRunPhase extends PokemonPhase { applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, false, escapeChance); - if (Utils.randSeedInt(100) < escapeChance.value) { + if (playerPokemon.randSeedInt(100) < escapeChance.value) { this.scene.playSound("se/flee"); this.scene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500); diff --git a/src/phases/battle-end-phase.ts b/src/phases/battle-end-phase.ts index 06315668a8b..f08e04b443a 100644 --- a/src/phases/battle-end-phase.ts +++ b/src/phases/battle-end-phase.ts @@ -1,5 +1,5 @@ -import { applyPostBattleAbAttrs, PostBattleAbAttr } from "#app/data/ability.js"; -import { LapsingPersistentModifier, LapsingPokemonHeldItemModifier } from "#app/modifier/modifier.js"; +import { applyPostBattleAbAttrs, PostBattleAbAttr } from "#app/data/ability"; +import { LapsingPersistentModifier, LapsingPokemonHeldItemModifier } from "#app/modifier/modifier"; import { BattlePhase } from "./battle-phase"; import { GameOverPhase } from "./game-over-phase"; diff --git a/src/phases/battle-phase.ts b/src/phases/battle-phase.ts index 3e7e0e28596..b51e19bdf0e 100644 --- a/src/phases/battle-phase.ts +++ b/src/phases/battle-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { TrainerSlot } from "#app/data/trainer-config.js"; -import { Phase } from "#app/phase.js"; +import BattleScene from "#app/battle-scene"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { Phase } from "#app/phase"; export class BattlePhase extends Phase { constructor(scene: BattleScene) { diff --git a/src/phases/berry-phase.ts b/src/phases/berry-phase.ts index 504fb6ec163..66ecaa6c7f8 100644 --- a/src/phases/berry-phase.ts +++ b/src/phases/berry-phase.ts @@ -1,10 +1,10 @@ -import { applyAbAttrs, PreventBerryUseAbAttr, HealFromBerryUseAbAttr } from "#app/data/ability.js"; -import { CommonAnim } from "#app/data/battle-anims.js"; -import { BerryUsedEvent } from "#app/events/battle-scene.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import { BerryModifier } from "#app/modifier/modifier.js"; +import { applyAbAttrs, PreventBerryUseAbAttr, HealFromBerryUseAbAttr } from "#app/data/ability"; +import { CommonAnim } from "#app/data/battle-anims"; +import { BerryUsedEvent } from "#app/events/battle-scene"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { BerryModifier } from "#app/modifier/modifier"; import i18next from "i18next"; -import * as Utils from "#app/utils.js"; +import * as Utils from "#app/utils"; import { FieldPhase } from "./field-phase"; import { CommonAnimPhase } from "./common-anim-phase"; diff --git a/src/phases/check-switch-phase.ts b/src/phases/check-switch-phase.ts index cd8f2b00c46..a069ba224a2 100644 --- a/src/phases/check-switch-phase.ts +++ b/src/phases/check-switch-phase.ts @@ -1,8 +1,8 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattleStyle } from "#app/enums/battle-style.js"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { BattleStyle } from "#app/enums/battle-style"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { BattlePhase } from "./battle-phase"; import { PostSummonPhase } from "./post-summon-phase"; diff --git a/src/phases/common-anim-phase.ts b/src/phases/common-anim-phase.ts index d3663abe3b6..a85cd7629d9 100644 --- a/src/phases/common-anim-phase.ts +++ b/src/phases/common-anim-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; import { PokemonPhase } from "./pokemon-phase"; export class CommonAnimPhase extends PokemonPhase { diff --git a/src/phases/damage-phase.ts b/src/phases/damage-phase.ts index 029c1e717f1..5add0345358 100644 --- a/src/phases/damage-phase.ts +++ b/src/phases/damage-phase.ts @@ -1,8 +1,8 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { BattleSpec } from "#app/enums/battle-spec.js"; -import { DamageResult, HitResult } from "#app/field/pokemon.js"; -import * as Utils from "#app/utils.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { BattleSpec } from "#app/enums/battle-spec"; +import { DamageResult, HitResult } from "#app/field/pokemon"; +import * as Utils from "#app/utils"; import { PokemonPhase } from "./pokemon-phase"; export class DamagePhase extends PokemonPhase { diff --git a/src/phases/end-card-phase.ts b/src/phases/end-card-phase.ts index 0b70664b993..274a745017a 100644 --- a/src/phases/end-card-phase.ts +++ b/src/phases/end-card-phase.ts @@ -1,7 +1,7 @@ -import BattleScene from "#app/battle-scene.js"; -import { PlayerGender } from "#app/enums/player-gender.js"; -import { Phase } from "#app/phase.js"; -import { addTextObject, TextStyle } from "#app/ui/text.js"; +import BattleScene from "#app/battle-scene"; +import { PlayerGender } from "#app/enums/player-gender"; +import { Phase } from "#app/phase"; +import { addTextObject, TextStyle } from "#app/ui/text"; import i18next from "i18next"; export class EndCardPhase extends Phase { diff --git a/src/phases/end-evolution-phase.ts b/src/phases/end-evolution-phase.ts index 2a6d492a425..8a6ce52553d 100644 --- a/src/phases/end-evolution-phase.ts +++ b/src/phases/end-evolution-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { Phase } from "#app/phase.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { Mode } from "#app/ui/ui"; export class EndEvolutionPhase extends Phase { diff --git a/src/phases/enemy-party-member-pokemon-phase.ts b/src/phases/enemy-party-member-pokemon-phase.ts index 10af0913f93..bb34f53b475 100644 --- a/src/phases/enemy-party-member-pokemon-phase.ts +++ b/src/phases/enemy-party-member-pokemon-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { EnemyPokemon } from "#app/field/pokemon.js"; +import BattleScene from "#app/battle-scene"; +import { EnemyPokemon } from "#app/field/pokemon"; import { PartyMemberPokemonPhase } from "./party-member-pokemon-phase"; export abstract class EnemyPartyMemberPokemonPhase extends PartyMemberPokemonPhase { diff --git a/src/phases/exp-phase.ts b/src/phases/exp-phase.ts index 9c2ba95d550..81982980d2a 100644 --- a/src/phases/exp-phase.ts +++ b/src/phases/exp-phase.ts @@ -1,8 +1,8 @@ -import BattleScene from "#app/battle-scene.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import { ExpBoosterModifier } from "#app/modifier/modifier.js"; +import BattleScene from "#app/battle-scene"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { ExpBoosterModifier } from "#app/modifier/modifier"; import i18next from "i18next"; -import * as Utils from "#app/utils.js"; +import * as Utils from "#app/utils"; import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase"; import { LevelUpPhase } from "./level-up-phase"; diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index d5dd9f61340..48366afaad4 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -17,6 +17,7 @@ import { ToggleDoublePositionPhase } from "./toggle-double-position-phase"; import { GameOverPhase } from "./game-over-phase"; import { SwitchPhase } from "./switch-phase"; import { VictoryPhase } from "./victory-phase"; +import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; export class FaintPhase extends PokemonPhase { private preventEndure: boolean; @@ -59,6 +60,7 @@ export class FaintPhase extends PokemonPhase { } this.scene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true); + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); if (pokemon.turnData?.attacksReceived?.length) { const lastAttack = pokemon.turnData.attacksReceived[0]; diff --git a/src/phases/field-phase.ts b/src/phases/field-phase.ts index b65e903a32b..46c3c4983b4 100644 --- a/src/phases/field-phase.ts +++ b/src/phases/field-phase.ts @@ -1,4 +1,4 @@ -import Pokemon from "#app/field/pokemon.js"; +import Pokemon from "#app/field/pokemon"; import { BattlePhase } from "./battle-phase"; type PokemonFunc = (pokemon: Pokemon) => void; diff --git a/src/phases/game-over-modifier-reward-phase.ts b/src/phases/game-over-modifier-reward-phase.ts index c27659bf9d4..a698e62e2e1 100644 --- a/src/phases/game-over-modifier-reward-phase.ts +++ b/src/phases/game-over-modifier-reward-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { ModifierTypeFunc } from "#app/modifier/modifier-type.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { ModifierTypeFunc } from "#app/modifier/modifier-type"; +import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { ModifierRewardPhase } from "./modifier-reward-phase"; diff --git a/src/phases/game-over-phase.ts b/src/phases/game-over-phase.ts index ebe58b20d3e..17805e90f0f 100644 --- a/src/phases/game-over-phase.ts +++ b/src/phases/game-over-phase.ts @@ -49,7 +49,9 @@ export class GameOverPhase extends BattlePhase { } if (this.victory && this.scene.gameMode.isEndless) { - this.scene.ui.showDialogue(i18next.t("PGMmiscDialogue:ending_endless"), i18next.t("PGMmiscDialogue:ending_name"), 0, () => this.handleGameOver()); + const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + const genderStr = PlayerGender[genderIndex].toLowerCase(); + this.scene.ui.showDialogue(i18next.t("miscDialogue:ending_endless", { context: genderStr }), i18next.t("miscDialogue:ending_name"), 0, () => this.handleGameOver()); } else if (this.victory || !this.scene.enableRetries) { this.handleGameOver(); } else { diff --git a/src/phases/hide-party-exp-bar-phase.ts b/src/phases/hide-party-exp-bar-phase.ts index c2c9d96462e..303650ea1ad 100644 --- a/src/phases/hide-party-exp-bar-phase.ts +++ b/src/phases/hide-party-exp-bar-phase.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene.js"; +import BattleScene from "#app/battle-scene"; import { BattlePhase } from "./battle-phase"; export class HidePartyExpBarPhase extends BattlePhase { diff --git a/src/phases/learn-move-phase.ts b/src/phases/learn-move-phase.ts index 201019e8860..049fc6951b6 100644 --- a/src/phases/learn-move-phase.ts +++ b/src/phases/learn-move-phase.ts @@ -1,12 +1,12 @@ -import BattleScene from "#app/battle-scene.js"; -import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims.js"; -import { allMoves } from "#app/data/move.js"; -import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms.js"; -import { Moves } from "#app/enums/moves.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import EvolutionSceneHandler from "#app/ui/evolution-scene-handler.js"; -import { SummaryUiMode } from "#app/ui/summary-ui-handler.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; +import { allMoves } from "#app/data/move"; +import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms"; +import { Moves } from "#app/enums/moves"; +import { getPokemonNameWithAffix } from "#app/messages"; +import EvolutionSceneHandler from "#app/ui/evolution-scene-handler"; +import { SummaryUiMode } from "#app/ui/summary-ui-handler"; +import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase"; diff --git a/src/phases/level-cap-phase.ts b/src/phases/level-cap-phase.ts index db59fbd6473..d1404e45010 100644 --- a/src/phases/level-cap-phase.ts +++ b/src/phases/level-cap-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { FieldPhase } from "./field-phase"; diff --git a/src/phases/level-up-phase.ts b/src/phases/level-up-phase.ts index a8a6b8f3d80..a99e038acba 100644 --- a/src/phases/level-up-phase.ts +++ b/src/phases/level-up-phase.ts @@ -1,11 +1,11 @@ -import BattleScene from "#app/battle-scene.js"; -import { ExpNotification } from "#app/enums/exp-notification.js"; -import { EvolutionPhase } from "#app/phases/evolution-phase.js"; -import { PlayerPokemon } from "#app/field/pokemon.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import { LevelAchv } from "#app/system/achv.js"; +import BattleScene from "#app/battle-scene"; +import { ExpNotification } from "#app/enums/exp-notification"; +import { EvolutionPhase } from "#app/phases/evolution-phase"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { LevelAchv } from "#app/system/achv"; import i18next from "i18next"; -import * as Utils from "#app/utils.js"; +import * as Utils from "#app/utils"; import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase"; import { LearnMovePhase } from "./learn-move-phase"; diff --git a/src/phases/login-phase.ts b/src/phases/login-phase.ts index b58cc9bca1f..89ced201e9e 100644 --- a/src/phases/login-phase.ts +++ b/src/phases/login-phase.ts @@ -1,10 +1,10 @@ -import { updateUserInfo } from "#app/account.js"; -import BattleScene, { bypassLogin } from "#app/battle-scene.js"; -import { Phase } from "#app/phase.js"; -import { handleTutorial, Tutorial } from "#app/tutorial.js"; -import { Mode } from "#app/ui/ui.js"; +import { updateUserInfo } from "#app/account"; +import BattleScene, { bypassLogin } from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { handleTutorial, Tutorial } from "#app/tutorial"; +import { Mode } from "#app/ui/ui"; import i18next, { t } from "i18next"; -import * as Utils from "#app/utils.js"; +import * as Utils from "#app/utils"; import { SelectGenderPhase } from "./select-gender-phase"; import { UnavailablePhase } from "./unavailable-phase"; diff --git a/src/phases/message-phase.ts b/src/phases/message-phase.ts index 46e907ae2ba..2244980c899 100644 --- a/src/phases/message-phase.ts +++ b/src/phases/message-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { Phase } from "#app/phase.js"; +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; export class MessagePhase extends Phase { private text: string; diff --git a/src/phases/modifier-reward-phase.ts b/src/phases/modifier-reward-phase.ts index 4d083a367a6..20a8366d9c6 100644 --- a/src/phases/modifier-reward-phase.ts +++ b/src/phases/modifier-reward-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { ModifierType, ModifierTypeFunc, getModifierType } from "#app/modifier/modifier-type.js"; +import BattleScene from "#app/battle-scene"; +import { ModifierType, ModifierTypeFunc, getModifierType } from "#app/modifier/modifier-type"; import i18next from "i18next"; import { BattlePhase } from "./battle-phase"; diff --git a/src/phases/money-reward-phase.ts b/src/phases/money-reward-phase.ts index e0bff608972..2f0a4f7b990 100644 --- a/src/phases/money-reward-phase.ts +++ b/src/phases/money-reward-phase.ts @@ -1,8 +1,8 @@ -import BattleScene from "#app/battle-scene.js"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; -import { MoneyMultiplierModifier } from "#app/modifier/modifier.js"; +import BattleScene from "#app/battle-scene"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { MoneyMultiplierModifier } from "#app/modifier/modifier"; import i18next from "i18next"; -import * as Utils from "#app/utils.js"; +import * as Utils from "#app/utils"; import { BattlePhase } from "./battle-phase"; export class MoneyRewardPhase extends BattlePhase { diff --git a/src/phases/move-anim-test-phase.ts b/src/phases/move-anim-test-phase.ts index 7fb3c1d61e7..2d3b54bfd9a 100644 --- a/src/phases/move-anim-test-phase.ts +++ b/src/phases/move-anim-test-phase.ts @@ -1,8 +1,8 @@ -import BattleScene from "#app/battle-scene.js"; -import { initMoveAnim, loadMoveAnimAssets, MoveAnim } from "#app/data/battle-anims.js"; -import { allMoves, SelfStatusMove } from "#app/data/move.js"; -import { Moves } from "#app/enums/moves.js"; -import * as Utils from "#app/utils.js"; +import BattleScene from "#app/battle-scene"; +import { initMoveAnim, loadMoveAnimAssets, MoveAnim } from "#app/data/battle-anims"; +import { allMoves, SelfStatusMove } from "#app/data/move"; +import { Moves } from "#app/enums/moves"; +import * as Utils from "#app/utils"; import { BattlePhase } from "./battle-phase"; export class MoveAnimTestPhase extends BattlePhase { diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index f100a763219..fb2b82ada03 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -1,18 +1,18 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { applyPreAttackAbAttrs, AddSecondStrikeAbAttr, IgnoreMoveEffectsAbAttr, applyPostDefendAbAttrs, PostDefendAbAttr, applyPostAttackAbAttrs, PostAttackAbAttr, MaxMultiHitAbAttr, AlwaysHitAbAttr } from "#app/data/ability.js"; -import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag.js"; -import { MoveAnim } from "#app/data/battle-anims.js"; -import { BattlerTagLapseType, ProtectedTag, SemiInvulnerableTag } from "#app/data/battler-tags.js"; -import { MoveTarget, applyMoveAttrs, OverrideMoveEffectAttr, MultiHitAttr, AttackMove, FixedDamageAttr, VariableTargetAttr, MissEffectAttr, MoveFlags, applyFilteredMoveAttrs, MoveAttr, MoveEffectAttr, MoveEffectTrigger, ChargeAttr, MoveCategory, NoEffectAttr, HitsTagAttr } from "#app/data/move.js"; -import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms.js"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { Moves } from "#app/enums/moves.js"; -import Pokemon, { PokemonMove, MoveResult, HitResult } from "#app/field/pokemon.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import { PokemonMultiHitModifier, FlinchChanceModifier, EnemyAttackStatusEffectChanceModifier, ContactHeldItemTransferChanceModifier, HitHealModifier } from "#app/modifier/modifier.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { applyPreAttackAbAttrs, AddSecondStrikeAbAttr, IgnoreMoveEffectsAbAttr, applyPostDefendAbAttrs, PostDefendAbAttr, applyPostAttackAbAttrs, PostAttackAbAttr, MaxMultiHitAbAttr, AlwaysHitAbAttr } from "#app/data/ability"; +import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag"; +import { MoveAnim } from "#app/data/battle-anims"; +import { BattlerTagLapseType, ProtectedTag, SemiInvulnerableTag } from "#app/data/battler-tags"; +import { MoveTarget, applyMoveAttrs, OverrideMoveEffectAttr, MultiHitAttr, AttackMove, FixedDamageAttr, VariableTargetAttr, MissEffectAttr, MoveFlags, applyFilteredMoveAttrs, MoveAttr, MoveEffectAttr, MoveEffectTrigger, ChargeAttr, MoveCategory, NoEffectAttr, HitsTagAttr } from "#app/data/move"; +import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Moves } from "#app/enums/moves"; +import Pokemon, { PokemonMove, MoveResult, HitResult } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { PokemonMultiHitModifier, FlinchChanceModifier, EnemyAttackStatusEffectChanceModifier, ContactHeldItemTransferChanceModifier, HitHealModifier } from "#app/modifier/modifier"; import i18next from "i18next"; -import * as Utils from "#app/utils.js"; +import * as Utils from "#app/utils"; import { PokemonPhase } from "./pokemon-phase"; export class MoveEffectPhase extends PokemonPhase { @@ -377,16 +377,16 @@ export class MoveEffectPhase extends PokemonPhase { return false; } - const moveAccuracy = this.move.getMove().calculateBattleAccuracy(user!, target); // TODO: is the bang correct here? + const moveAccuracy = this.move.getMove().calculateBattleAccuracy(user, target); if (moveAccuracy === -1) { return true; } const accuracyMultiplier = user.getAccuracyMultiplier(target, this.move.getMove()); - const rand = user.randSeedInt(100, 1); + const rand = user.randSeedInt(100); - return rand <= moveAccuracy * (accuracyMultiplier!); // TODO: is this bang correct? + return rand < (moveAccuracy * accuracyMultiplier); } /** Returns the {@linkcode Pokemon} using this phase's invoked move */ diff --git a/src/phases/move-end-phase.ts b/src/phases/move-end-phase.ts index 4bce2185aea..e03f2ec14b0 100644 --- a/src/phases/move-end-phase.ts +++ b/src/phases/move-end-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { BattlerTagLapseType } from "#app/data/battler-tags.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { BattlerTagLapseType } from "#app/data/battler-tags"; import { PokemonPhase } from "./pokemon-phase"; export class MoveEndPhase extends PokemonPhase { diff --git a/src/phases/move-header-phase.ts b/src/phases/move-header-phase.ts index 5166f287731..c307ff0be6e 100644 --- a/src/phases/move-header-phase.ts +++ b/src/phases/move-header-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { applyMoveAttrs, MoveHeaderAttr } from "#app/data/move.js"; -import Pokemon, { PokemonMove } from "#app/field/pokemon.js"; +import BattleScene from "#app/battle-scene"; +import { applyMoveAttrs, MoveHeaderAttr } from "#app/data/move"; +import Pokemon, { PokemonMove } from "#app/field/pokemon"; import { BattlePhase } from "./battle-phase"; export class MoveHeaderPhase extends BattlePhase { diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 0ccf19a462f..8209bdd44d1 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -1,21 +1,21 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { applyAbAttrs, applyPostMoveUsedAbAttrs, applyPreAttackAbAttrs, BlockRedirectAbAttr, IncreasePpAbAttr, PokemonTypeChangeAbAttr, PostMoveUsedAbAttr, RedirectMoveAbAttr } from "#app/data/ability.js"; -import { CommonAnim } from "#app/data/battle-anims.js"; -import { BattlerTagLapseType, CenterOfAttentionTag } from "#app/data/battler-tags.js"; -import { allMoves, applyMoveAttrs, BypassRedirectAttr, BypassSleepAttr, ChargeAttr, CopyMoveAttr, HealStatusEffectAttr, MoveFlags, PreMoveMessageAttr } from "#app/data/move.js"; -import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms.js"; -import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect.js"; -import { Type } from "#app/data/type.js"; -import { getTerrainBlockMessage } from "#app/data/weather.js"; -import { Abilities } from "#app/enums/abilities.js"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { Moves } from "#app/enums/moves.js"; -import { StatusEffect } from "#app/enums/status-effect.js"; -import { MoveUsedEvent } from "#app/events/battle-scene.js"; -import Pokemon, { MoveResult, PokemonMove, TurnMove } from "#app/field/pokemon.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import * as Utils from "#app/utils.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { applyAbAttrs, applyPostMoveUsedAbAttrs, applyPreAttackAbAttrs, BlockRedirectAbAttr, IncreasePpAbAttr, PokemonTypeChangeAbAttr, PostMoveUsedAbAttr, RedirectMoveAbAttr } from "#app/data/ability"; +import { CommonAnim } from "#app/data/battle-anims"; +import { BattlerTagLapseType, CenterOfAttentionTag } from "#app/data/battler-tags"; +import { allMoves, applyMoveAttrs, BypassRedirectAttr, BypassSleepAttr, ChargeAttr, CopyMoveAttr, HealStatusEffectAttr, MoveFlags, PreMoveMessageAttr } from "#app/data/move"; +import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms"; +import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect"; +import { Type } from "#app/data/type"; +import { getTerrainBlockMessage } from "#app/data/weather"; +import { Abilities } from "#app/enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Moves } from "#app/enums/moves"; +import { StatusEffect } from "#app/enums/status-effect"; +import { MoveUsedEvent } from "#app/events/battle-scene"; +import Pokemon, { MoveResult, PokemonMove, TurnMove } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import * as Utils from "#app/utils"; import i18next from "i18next"; import { BattlePhase } from "./battle-phase"; import { CommonAnimPhase } from "./common-anim-phase"; diff --git a/src/phases/new-biome-encounter-phase.ts b/src/phases/new-biome-encounter-phase.ts index c447e78f7b1..9f1209fb7ee 100644 --- a/src/phases/new-biome-encounter-phase.ts +++ b/src/phases/new-biome-encounter-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { applyAbAttrs, PostBiomeChangeAbAttr } from "#app/data/ability.js"; -import { getRandomWeatherType } from "#app/data/weather.js"; +import BattleScene from "#app/battle-scene"; +import { applyAbAttrs, PostBiomeChangeAbAttr } from "#app/data/ability"; +import { getRandomWeatherType } from "#app/data/weather"; import { NextEncounterPhase } from "./next-encounter-phase"; export class NewBiomeEncounterPhase extends NextEncounterPhase { diff --git a/src/phases/next-encounter-phase.ts b/src/phases/next-encounter-phase.ts index 89987534fc0..d51aa374b6e 100644 --- a/src/phases/next-encounter-phase.ts +++ b/src/phases/next-encounter-phase.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene.js"; +import BattleScene from "#app/battle-scene"; import { EncounterPhase } from "./encounter-phase"; export class NextEncounterPhase extends EncounterPhase { diff --git a/src/phases/obtain-status-effect-phase.ts b/src/phases/obtain-status-effect-phase.ts index ac6e66a2e9f..bb06fafb1c9 100644 --- a/src/phases/obtain-status-effect-phase.ts +++ b/src/phases/obtain-status-effect-phase.ts @@ -1,10 +1,10 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims.js"; -import { getStatusEffectObtainText, getStatusEffectOverlapText } from "#app/data/status-effect.js"; -import { StatusEffect } from "#app/enums/status-effect.js"; -import Pokemon from "#app/field/pokemon.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; +import { getStatusEffectObtainText, getStatusEffectOverlapText } from "#app/data/status-effect"; +import { StatusEffect } from "#app/enums/status-effect"; +import Pokemon from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; import { PokemonPhase } from "./pokemon-phase"; import { PostTurnStatusEffectPhase } from "./post-turn-status-effect-phase"; diff --git a/src/phases/outdated-phase.ts b/src/phases/outdated-phase.ts index 72d1bb3671d..4baf16d2f56 100644 --- a/src/phases/outdated-phase.ts +++ b/src/phases/outdated-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { Phase } from "#app/phase.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { Mode } from "#app/ui/ui"; export class OutdatedPhase extends Phase { constructor(scene: BattleScene) { diff --git a/src/phases/party-heal-phase.ts b/src/phases/party-heal-phase.ts index d9179826a19..e6ee11202df 100644 --- a/src/phases/party-heal-phase.ts +++ b/src/phases/party-heal-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import * as Utils from "#app/utils.js"; +import BattleScene from "#app/battle-scene"; +import * as Utils from "#app/utils"; import { BattlePhase } from "./battle-phase"; export class PartyHealPhase extends BattlePhase { diff --git a/src/phases/party-member-pokemon-phase.ts b/src/phases/party-member-pokemon-phase.ts index 1f27826884e..2b6ca01261d 100644 --- a/src/phases/party-member-pokemon-phase.ts +++ b/src/phases/party-member-pokemon-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import Pokemon from "#app/field/pokemon.js"; +import BattleScene from "#app/battle-scene"; +import Pokemon from "#app/field/pokemon"; import { FieldPhase } from "./field-phase"; export abstract class PartyMemberPokemonPhase extends FieldPhase { diff --git a/src/phases/party-status-cure-phase.ts b/src/phases/party-status-cure-phase.ts index a11aa01b63a..e4903c7fc1f 100644 --- a/src/phases/party-status-cure-phase.ts +++ b/src/phases/party-status-cure-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { Abilities } from "#app/enums/abilities.js"; -import Pokemon from "#app/field/pokemon.js"; +import BattleScene from "#app/battle-scene"; +import { Abilities } from "#app/enums/abilities"; +import Pokemon from "#app/field/pokemon"; import { BattlePhase } from "./battle-phase"; import { ShowAbilityPhase } from "./show-ability-phase"; diff --git a/src/phases/player-party-member-pokemon-phase.ts b/src/phases/player-party-member-pokemon-phase.ts index 4b1600b33d2..87855b9334c 100644 --- a/src/phases/player-party-member-pokemon-phase.ts +++ b/src/phases/player-party-member-pokemon-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { PlayerPokemon } from "#app/field/pokemon.js"; +import BattleScene from "#app/battle-scene"; +import { PlayerPokemon } from "#app/field/pokemon"; import { PartyMemberPokemonPhase } from "./party-member-pokemon-phase"; export abstract class PlayerPartyMemberPokemonPhase extends PartyMemberPokemonPhase { diff --git a/src/phases/pokemon-heal-phase.ts b/src/phases/pokemon-heal-phase.ts index 6db8aeb4fca..49db2641e98 100644 --- a/src/phases/pokemon-heal-phase.ts +++ b/src/phases/pokemon-heal-phase.ts @@ -1,14 +1,14 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { CommonAnim } from "#app/data/battle-anims.js"; -import { getStatusEffectHealText } from "#app/data/status-effect.js"; -import { StatusEffect } from "#app/enums/status-effect.js"; -import { HitResult, DamageResult } from "#app/field/pokemon.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import { HealingBoosterModifier } from "#app/modifier/modifier.js"; -import { HealAchv } from "#app/system/achv.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { CommonAnim } from "#app/data/battle-anims"; +import { getStatusEffectHealText } from "#app/data/status-effect"; +import { StatusEffect } from "#app/enums/status-effect"; +import { HitResult, DamageResult } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { HealingBoosterModifier } from "#app/modifier/modifier"; +import { HealAchv } from "#app/system/achv"; import i18next from "i18next"; -import * as Utils from "#app/utils.js"; +import * as Utils from "#app/utils"; import { CommonAnimPhase } from "./common-anim-phase"; export class PokemonHealPhase extends CommonAnimPhase { diff --git a/src/phases/pokemon-phase.ts b/src/phases/pokemon-phase.ts index 871ee57d7a5..b980c1d1719 100644 --- a/src/phases/pokemon-phase.ts +++ b/src/phases/pokemon-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import Pokemon from "#app/field/pokemon.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import Pokemon from "#app/field/pokemon"; import { FieldPhase } from "./field-phase"; export abstract class PokemonPhase extends FieldPhase { diff --git a/src/phases/post-game-over-phase.ts b/src/phases/post-game-over-phase.ts index 02413b41a23..beeb30c7260 100644 --- a/src/phases/post-game-over-phase.ts +++ b/src/phases/post-game-over-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { Phase } from "#app/phase.js"; +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; import { EndCardPhase } from "./end-card-phase"; import { TitlePhase } from "./title-phase"; diff --git a/src/phases/post-summon-phase.ts b/src/phases/post-summon-phase.ts index e671bf30ed1..47a5513f0eb 100644 --- a/src/phases/post-summon-phase.ts +++ b/src/phases/post-summon-phase.ts @@ -1,8 +1,8 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { applyPostSummonAbAttrs, PostSummonAbAttr } from "#app/data/ability.js"; -import { ArenaTrapTag } from "#app/data/arena-tag.js"; -import { StatusEffect } from "#app/enums/status-effect.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { applyPostSummonAbAttrs, PostSummonAbAttr } from "#app/data/ability"; +import { ArenaTrapTag } from "#app/data/arena-tag"; +import { StatusEffect } from "#app/enums/status-effect"; import { PokemonPhase } from "./pokemon-phase"; export class PostSummonPhase extends PokemonPhase { diff --git a/src/phases/post-turn-status-effect-phase.ts b/src/phases/post-turn-status-effect-phase.ts index 47db32303a5..413f9eae65e 100644 --- a/src/phases/post-turn-status-effect-phase.ts +++ b/src/phases/post-turn-status-effect-phase.ts @@ -1,12 +1,12 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { applyAbAttrs, BlockNonDirectDamageAbAttr, BlockStatusDamageAbAttr, ReduceBurnDamageAbAttr } from "#app/data/ability.js"; -import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims.js"; -import { getStatusEffectActivationText } from "#app/data/status-effect.js"; -import { BattleSpec } from "#app/enums/battle-spec.js"; -import { StatusEffect } from "#app/enums/status-effect.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import * as Utils from "#app/utils.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { applyAbAttrs, BlockNonDirectDamageAbAttr, BlockStatusDamageAbAttr, ReduceBurnDamageAbAttr } from "#app/data/ability"; +import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; +import { getStatusEffectActivationText } from "#app/data/status-effect"; +import { BattleSpec } from "#app/enums/battle-spec"; +import { StatusEffect } from "#app/enums/status-effect"; +import { getPokemonNameWithAffix } from "#app/messages"; +import * as Utils from "#app/utils"; import { PokemonPhase } from "./pokemon-phase"; export class PostTurnStatusEffectPhase extends PokemonPhase { diff --git a/src/phases/quiet-form-change-phase.ts b/src/phases/quiet-form-change-phase.ts index 3d30d36907e..6a1d31d137d 100644 --- a/src/phases/quiet-form-change-phase.ts +++ b/src/phases/quiet-form-change-phase.ts @@ -1,10 +1,10 @@ -import BattleScene from "#app/battle-scene.js"; -import { SemiInvulnerableTag } from "#app/data/battler-tags.js"; -import { SpeciesFormChange, getSpeciesFormChangeMessage } from "#app/data/pokemon-forms.js"; -import { getTypeRgb } from "#app/data/type.js"; -import { BattleSpec } from "#app/enums/battle-spec.js"; -import Pokemon, { EnemyPokemon } from "#app/field/pokemon.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; +import BattleScene from "#app/battle-scene"; +import { SemiInvulnerableTag } from "#app/data/battler-tags"; +import { SpeciesFormChange, getSpeciesFormChangeMessage } from "#app/data/pokemon-forms"; +import { getTypeRgb } from "#app/data/type"; +import { BattleSpec } from "#app/enums/battle-spec"; +import Pokemon, { EnemyPokemon } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; import { BattlePhase } from "./battle-phase"; import { MovePhase } from "./move-phase"; import { PokemonHealPhase } from "./pokemon-heal-phase"; diff --git a/src/phases/reload-session-phase.ts b/src/phases/reload-session-phase.ts index a61c52323bf..f8a38105869 100644 --- a/src/phases/reload-session-phase.ts +++ b/src/phases/reload-session-phase.ts @@ -1,7 +1,7 @@ -import BattleScene from "#app/battle-scene.js"; -import { Phase } from "#app/phase.js"; -import { Mode } from "#app/ui/ui.js"; -import * as Utils from "#app/utils.js"; +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { Mode } from "#app/ui/ui"; +import * as Utils from "#app/utils"; export class ReloadSessionPhase extends Phase { private systemDataStr: string | null; diff --git a/src/phases/return-phase.ts b/src/phases/return-phase.ts index e1753670ad4..dfc458eb817 100644 --- a/src/phases/return-phase.ts +++ b/src/phases/return-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms.js"; +import BattleScene from "#app/battle-scene"; +import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; import { SwitchSummonPhase } from "./switch-summon-phase"; export class ReturnPhase extends SwitchSummonPhase { diff --git a/src/phases/ribbon-modifier-reward-phase.ts b/src/phases/ribbon-modifier-reward-phase.ts index 4a80325b7e7..fabb3bfa1b1 100644 --- a/src/phases/ribbon-modifier-reward-phase.ts +++ b/src/phases/ribbon-modifier-reward-phase.ts @@ -1,7 +1,7 @@ -import BattleScene from "#app/battle-scene.js"; -import PokemonSpecies from "#app/data/pokemon-species.js"; -import { ModifierTypeFunc } from "#app/modifier/modifier-type.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import PokemonSpecies from "#app/data/pokemon-species"; +import { ModifierTypeFunc } from "#app/modifier/modifier-type"; +import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { ModifierRewardPhase } from "./modifier-reward-phase"; diff --git a/src/phases/scan-ivs-phase.ts b/src/phases/scan-ivs-phase.ts index f5e1a814612..ba27e4f1943 100644 --- a/src/phases/scan-ivs-phase.ts +++ b/src/phases/scan-ivs-phase.ts @@ -1,10 +1,10 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims.js"; -import { Stat } from "#app/enums/stat.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import { getTextColor, TextStyle } from "#app/ui/text.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; +import { Stat } from "#app/enums/stat"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { getTextColor, TextStyle } from "#app/ui/text"; +import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { PokemonPhase } from "./pokemon-phase"; diff --git a/src/phases/select-biome-phase.ts b/src/phases/select-biome-phase.ts index 68c2cd29f26..fe9b5b3996b 100644 --- a/src/phases/select-biome-phase.ts +++ b/src/phases/select-biome-phase.ts @@ -1,11 +1,11 @@ -import BattleScene from "#app/battle-scene.js"; -import { biomeLinks, getBiomeName } from "#app/data/biomes.js"; -import { Biome } from "#app/enums/biome.js"; -import { MoneyInterestModifier, MapModifier } from "#app/modifier/modifier.js"; -import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { biomeLinks, getBiomeName } from "#app/data/biomes"; +import { Biome } from "#app/enums/biome"; +import { MoneyInterestModifier, MapModifier } from "#app/modifier/modifier"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { Mode } from "#app/ui/ui"; import { BattlePhase } from "./battle-phase"; -import * as Utils from "#app/utils.js"; +import * as Utils from "#app/utils"; import { PartyHealPhase } from "./party-heal-phase"; import { SwitchBiomePhase } from "./switch-biome-phase"; diff --git a/src/phases/select-challenge-phase.ts b/src/phases/select-challenge-phase.ts index eaf830e0059..9450c60fec5 100644 --- a/src/phases/select-challenge-phase.ts +++ b/src/phases/select-challenge-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { Phase } from "#app/phase.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { Mode } from "#app/ui/ui"; export class SelectChallengePhase extends Phase { constructor(scene: BattleScene) { diff --git a/src/phases/select-gender-phase.ts b/src/phases/select-gender-phase.ts index 3fc6916e233..7f2c965f1d1 100644 --- a/src/phases/select-gender-phase.ts +++ b/src/phases/select-gender-phase.ts @@ -1,8 +1,8 @@ -import BattleScene from "#app/battle-scene.js"; -import { PlayerGender } from "#app/enums/player-gender.js"; -import { Phase } from "#app/phase.js"; -import { SettingKeys } from "#app/system/settings/settings.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { PlayerGender } from "#app/enums/player-gender"; +import { Phase } from "#app/phase"; +import { SettingKeys } from "#app/system/settings/settings"; +import { Mode } from "#app/ui/ui"; import i18next from "i18next"; export class SelectGenderPhase extends Phase { diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts index 1c96d278d69..e14638c5dd2 100644 --- a/src/phases/select-modifier-phase.ts +++ b/src/phases/select-modifier-phase.ts @@ -1,12 +1,12 @@ -import BattleScene from "#app/battle-scene.js"; -import { ModifierTier } from "#app/modifier/modifier-tier.js"; -import { regenerateModifierPoolThresholds, ModifierTypeOption, ModifierType, getPlayerShopModifierTypeOptionsForWave, PokemonModifierType, FusePokemonModifierType, PokemonMoveModifierType, TmModifierType, RememberMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, ModifierPoolType, getPlayerModifierTypeOptions } from "#app/modifier/modifier-type.js"; -import { ExtraModifierModifier, Modifier, PokemonHeldItemModifier } from "#app/modifier/modifier.js"; -import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler.js"; -import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { regenerateModifierPoolThresholds, ModifierTypeOption, ModifierType, getPlayerShopModifierTypeOptionsForWave, PokemonModifierType, FusePokemonModifierType, PokemonMoveModifierType, TmModifierType, RememberMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, ModifierPoolType, getPlayerModifierTypeOptions } from "#app/modifier/modifier-type"; +import { ExtraModifierModifier, Modifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; +import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; +import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler"; +import { Mode } from "#app/ui/ui"; import i18next from "i18next"; -import * as Utils from "#app/utils.js"; +import * as Utils from "#app/utils"; import { BattlePhase } from "./battle-phase"; import Overrides from "#app/overrides"; diff --git a/src/phases/select-starter-phase.ts b/src/phases/select-starter-phase.ts index ad972a49225..cd3c112549c 100644 --- a/src/phases/select-starter-phase.ts +++ b/src/phases/select-starter-phase.ts @@ -1,15 +1,15 @@ -import BattleScene from "#app/battle-scene.js"; -import { applyChallenges, ChallengeType } from "#app/data/challenge.js"; -import { Gender } from "#app/data/gender.js"; -import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms.js"; -import { getPokemonSpecies } from "#app/data/pokemon-species.js"; -import { Species } from "#app/enums/species.js"; -import { PlayerPokemon } from "#app/field/pokemon.js"; -import { overrideModifiers, overrideHeldItems } from "#app/modifier/modifier.js"; -import { Phase } from "#app/phase.js"; -import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler.js"; -import { Starter } from "#app/ui/starter-select-ui-handler.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { applyChallenges, ChallengeType } from "#app/data/challenge"; +import { Gender } from "#app/data/gender"; +import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Species } from "#app/enums/species"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { overrideModifiers, overrideHeldItems } from "#app/modifier/modifier"; +import { Phase } from "#app/phase"; +import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler"; +import { Starter } from "#app/ui/starter-select-ui-handler"; +import { Mode } from "#app/ui/ui"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import { TitlePhase } from "./title-phase"; import Overrides from "#app/overrides"; diff --git a/src/phases/select-target-phase.ts b/src/phases/select-target-phase.ts index fe72335e312..716d2737a6c 100644 --- a/src/phases/select-target-phase.ts +++ b/src/phases/select-target-phase.ts @@ -1,7 +1,7 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { Command } from "#app/ui/command-ui-handler.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import { CommandPhase } from "./command-phase"; import { PokemonPhase } from "./pokemon-phase"; diff --git a/src/phases/shiny-sparkle-phase.ts b/src/phases/shiny-sparkle-phase.ts index 4cd2b68f881..49c60a82dd5 100644 --- a/src/phases/shiny-sparkle-phase.ts +++ b/src/phases/shiny-sparkle-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; import { PokemonPhase } from "./pokemon-phase"; export class ShinySparklePhase extends PokemonPhase { diff --git a/src/phases/show-ability-phase.ts b/src/phases/show-ability-phase.ts index ee0b98f7886..cf34e327b4f 100644 --- a/src/phases/show-ability-phase.ts +++ b/src/phases/show-ability-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; import { PokemonPhase } from "./pokemon-phase"; export class ShowAbilityPhase extends PokemonPhase { diff --git a/src/phases/show-party-exp-bar-phase.ts b/src/phases/show-party-exp-bar-phase.ts index 9920472e801..9e019b202a5 100644 --- a/src/phases/show-party-exp-bar-phase.ts +++ b/src/phases/show-party-exp-bar-phase.ts @@ -1,7 +1,7 @@ -import BattleScene from "#app/battle-scene.js"; -import { ExpNotification } from "#app/enums/exp-notification.js"; -import { ExpBoosterModifier } from "#app/modifier/modifier.js"; -import * as Utils from "#app/utils.js"; +import BattleScene from "#app/battle-scene"; +import { ExpNotification } from "#app/enums/exp-notification"; +import { ExpBoosterModifier } from "#app/modifier/modifier"; +import * as Utils from "#app/utils"; import { HidePartyExpBarPhase } from "./hide-party-exp-bar-phase"; import { LevelUpPhase } from "./level-up-phase"; import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase"; diff --git a/src/phases/show-trainer-phase.ts b/src/phases/show-trainer-phase.ts index 8a869f582d8..26ccddd53fc 100644 --- a/src/phases/show-trainer-phase.ts +++ b/src/phases/show-trainer-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { PlayerGender } from "#app/enums/player-gender.js"; +import BattleScene from "#app/battle-scene"; +import { PlayerGender } from "#app/enums/player-gender"; import { BattlePhase } from "./battle-phase"; export class ShowTrainerPhase extends BattlePhase { diff --git a/src/phases/summon-missing-phase.ts b/src/phases/summon-missing-phase.ts index bb9607285ad..83ac8779dd8 100644 --- a/src/phases/summon-missing-phase.ts +++ b/src/phases/summon-missing-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; +import BattleScene from "#app/battle-scene"; +import { getPokemonNameWithAffix } from "#app/messages"; import i18next from "i18next"; import { SummonPhase } from "./summon-phase"; diff --git a/src/phases/summon-phase.ts b/src/phases/summon-phase.ts index f65a2063d4c..2645060c547 100644 --- a/src/phases/summon-phase.ts +++ b/src/phases/summon-phase.ts @@ -1,12 +1,12 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattleType } from "#app/battle.js"; -import { getPokeballAtlasKey, getPokeballTintColor } from "#app/data/pokeball.js"; -import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms.js"; -import { TrainerSlot } from "#app/data/trainer-config.js"; -import { PlayerGender } from "#app/enums/player-gender.js"; -import { addPokeballOpenParticles } from "#app/field/anims.js"; -import Pokemon, { FieldPosition } from "#app/field/pokemon.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; +import BattleScene from "#app/battle-scene"; +import { BattleType } from "#app/battle"; +import { getPokeballAtlasKey, getPokeballTintColor } from "#app/data/pokeball"; +import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { PlayerGender } from "#app/enums/player-gender"; +import { addPokeballOpenParticles } from "#app/field/anims"; +import Pokemon, { FieldPosition } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; import i18next from "i18next"; import { PartyMemberPokemonPhase } from "./party-member-pokemon-phase"; import { PostSummonPhase } from "./post-summon-phase"; diff --git a/src/phases/switch-biome-phase.ts b/src/phases/switch-biome-phase.ts index f20cd59b240..9cf5635a39f 100644 --- a/src/phases/switch-biome-phase.ts +++ b/src/phases/switch-biome-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { Biome } from "#app/enums/biome.js"; -import { getBiomeKey } from "#app/field/arena.js"; +import BattleScene from "#app/battle-scene"; +import { Biome } from "#app/enums/biome"; +import { getBiomeKey } from "#app/field/arena"; import { BattlePhase } from "./battle-phase"; export class SwitchBiomePhase extends BattlePhase { diff --git a/src/phases/switch-phase.ts b/src/phases/switch-phase.ts index 93b0943febf..b1a2e991ed8 100644 --- a/src/phases/switch-phase.ts +++ b/src/phases/switch-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler"; +import { Mode } from "#app/ui/ui"; import { BattlePhase } from "./battle-phase"; import { SwitchSummonPhase } from "./switch-summon-phase"; diff --git a/src/phases/switch-summon-phase.ts b/src/phases/switch-summon-phase.ts index 8201f2879ed..2a5fd0cc3ac 100644 --- a/src/phases/switch-summon-phase.ts +++ b/src/phases/switch-summon-phase.ts @@ -1,13 +1,13 @@ -import BattleScene from "#app/battle-scene.js"; -import { applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr } from "#app/data/ability.js"; -import { allMoves, ForceSwitchOutAttr } from "#app/data/move.js"; -import { getPokeballTintColor } from "#app/data/pokeball.js"; -import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms.js"; -import { TrainerSlot } from "#app/data/trainer-config.js"; -import Pokemon from "#app/field/pokemon.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import { SwitchEffectTransferModifier } from "#app/modifier/modifier.js"; -import { Command } from "#app/ui/command-ui-handler.js"; +import BattleScene from "#app/battle-scene"; +import { applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr } from "#app/data/ability"; +import { allMoves, ForceSwitchOutAttr } from "#app/data/move"; +import { getPokeballTintColor } from "#app/data/pokeball"; +import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; +import { TrainerSlot } from "#app/data/trainer-config"; +import Pokemon from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { SwitchEffectTransferModifier } from "#app/modifier/modifier"; +import { Command } from "#app/ui/command-ui-handler"; import i18next from "i18next"; import { PostSummonPhase } from "./post-summon-phase"; import { SummonPhase } from "./summon-phase"; diff --git a/src/phases/test-message-phase.ts b/src/phases/test-message-phase.ts index 14fed24ef4b..464a5ed1f94 100644 --- a/src/phases/test-message-phase.ts +++ b/src/phases/test-message-phase.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene.js"; +import BattleScene from "#app/battle-scene"; import { MessagePhase } from "./message-phase"; export class TestMessagePhase extends MessagePhase { diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts index 4c89b725c2d..52503501837 100644 --- a/src/phases/title-phase.ts +++ b/src/phases/title-phase.ts @@ -1,21 +1,21 @@ -import { loggedInUser } from "#app/account.js"; -import BattleScene from "#app/battle-scene.js"; -import { BattleType } from "#app/battle.js"; -import { getDailyRunStarters, fetchDailyRunSeed } from "#app/data/daily-run.js"; -import { Gender } from "#app/data/gender.js"; -import { getBiomeKey } from "#app/field/arena.js"; -import { GameModes, GameMode, getGameMode } from "#app/game-mode.js"; -import { regenerateModifierPoolThresholds, ModifierPoolType, modifierTypes, getDailyRunStarterModifiers } from "#app/modifier/modifier-type.js"; -import { Phase } from "#app/phase.js"; -import { SessionSaveData } from "#app/system/game-data.js"; -import { Unlockables } from "#app/system/unlockables.js"; -import { vouchers } from "#app/system/voucher.js"; -import { OptionSelectItem, OptionSelectConfig } from "#app/ui/abstact-option-select-ui-handler.js"; -import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler.js"; -import { Mode } from "#app/ui/ui.js"; +import { loggedInUser } from "#app/account"; +import BattleScene from "#app/battle-scene"; +import { BattleType } from "#app/battle"; +import { getDailyRunStarters, fetchDailyRunSeed } from "#app/data/daily-run"; +import { Gender } from "#app/data/gender"; +import { getBiomeKey } from "#app/field/arena"; +import { GameModes, GameMode, getGameMode } from "#app/game-mode"; +import { regenerateModifierPoolThresholds, ModifierPoolType, modifierTypes, getDailyRunStarterModifiers } from "#app/modifier/modifier-type"; +import { Phase } from "#app/phase"; +import { SessionSaveData } from "#app/system/game-data"; +import { Unlockables } from "#app/system/unlockables"; +import { vouchers } from "#app/system/voucher"; +import { OptionSelectItem, OptionSelectConfig } from "#app/ui/abstact-option-select-ui-handler"; +import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler"; +import { Mode } from "#app/ui/ui"; import i18next from "i18next"; -import * as Utils from "#app/utils.js"; -import { Modifier } from "#app/modifier/modifier.js"; +import * as Utils from "#app/utils"; +import { Modifier } from "#app/modifier/modifier"; import { CheckSwitchPhase } from "./check-switch-phase"; import { EncounterPhase } from "./encounter-phase"; import { SelectChallengePhase } from "./select-challenge-phase"; diff --git a/src/phases/toggle-double-position-phase.ts b/src/phases/toggle-double-position-phase.ts index fe3d0482483..563af8575d7 100644 --- a/src/phases/toggle-double-position-phase.ts +++ b/src/phases/toggle-double-position-phase.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { FieldPosition } from "#app/field/pokemon.js"; +import BattleScene from "#app/battle-scene"; +import { FieldPosition } from "#app/field/pokemon"; import { BattlePhase } from "./battle-phase"; export class ToggleDoublePositionPhase extends BattlePhase { diff --git a/src/phases/trainer-message-test-phase.ts b/src/phases/trainer-message-test-phase.ts index 4ea451660c3..8075dd761e2 100644 --- a/src/phases/trainer-message-test-phase.ts +++ b/src/phases/trainer-message-test-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { trainerConfigs } from "#app/data/trainer-config.js"; -import { TrainerType } from "#app/enums/trainer-type.js"; +import BattleScene from "#app/battle-scene"; +import { trainerConfigs } from "#app/data/trainer-config"; +import { TrainerType } from "#app/enums/trainer-type"; import { BattlePhase } from "./battle-phase"; import { TestMessagePhase } from "./test-message-phase"; diff --git a/src/phases/trainer-victory-phase.ts b/src/phases/trainer-victory-phase.ts index a38874c9acd..e925f0c47d4 100644 --- a/src/phases/trainer-victory-phase.ts +++ b/src/phases/trainer-victory-phase.ts @@ -1,10 +1,10 @@ -import BattleScene from "#app/battle-scene.js"; -import { getCharVariantFromDialogue } from "#app/data/dialogue.js"; -import { TrainerType } from "#app/enums/trainer-type.js"; -import { modifierTypes } from "#app/modifier/modifier-type.js"; -import { vouchers } from "#app/system/voucher.js"; +import BattleScene from "#app/battle-scene"; +import { getCharVariantFromDialogue } from "#app/data/dialogue"; +import { TrainerType } from "#app/enums/trainer-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { vouchers } from "#app/system/voucher"; import i18next from "i18next"; -import * as Utils from "#app/utils.js"; +import * as Utils from "#app/utils"; import { BattlePhase } from "./battle-phase"; import { ModifierRewardPhase } from "./modifier-reward-phase"; import { MoneyRewardPhase } from "./money-reward-phase"; diff --git a/src/phases/turn-end-phase.ts b/src/phases/turn-end-phase.ts index c8bd3398bb5..724a5206d74 100644 --- a/src/phases/turn-end-phase.ts +++ b/src/phases/turn-end-phase.ts @@ -1,12 +1,12 @@ -import BattleScene from "#app/battle-scene.js"; -import { applyPostTurnAbAttrs, PostTurnAbAttr } from "#app/data/ability.js"; -import { BattlerTagLapseType } from "#app/data/battler-tags.js"; -import { TerrainType } from "#app/data/terrain.js"; -import { WeatherType } from "#app/enums/weather-type.js"; -import { TurnEndEvent } from "#app/events/battle-scene.js"; -import Pokemon from "#app/field/pokemon.js"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import { TurnHealModifier, EnemyTurnHealModifier, EnemyStatusEffectHealChanceModifier, TurnStatusEffectModifier, TurnHeldItemTransferModifier } from "#app/modifier/modifier.js"; +import BattleScene from "#app/battle-scene"; +import { applyPostTurnAbAttrs, PostTurnAbAttr } from "#app/data/ability"; +import { BattlerTagLapseType } from "#app/data/battler-tags"; +import { TerrainType } from "#app/data/terrain"; +import { WeatherType } from "#app/enums/weather-type"; +import { TurnEndEvent } from "#app/events/battle-scene"; +import Pokemon from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { TurnHealModifier, EnemyTurnHealModifier, EnemyStatusEffectHealChanceModifier, TurnStatusEffectModifier, TurnHeldItemTransferModifier } from "#app/modifier/modifier"; import i18next from "i18next"; import { FieldPhase } from "./field-phase"; import { PokemonHealPhase } from "./pokemon-heal-phase"; diff --git a/src/phases/turn-init-phase.ts b/src/phases/turn-init-phase.ts index a999d57ca0f..568cfdc5714 100644 --- a/src/phases/turn-init-phase.ts +++ b/src/phases/turn-init-phase.ts @@ -1,7 +1,7 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex } from "#app/battle.js"; -import { TurnInitEvent } from "#app/events/battle-scene.js"; -import { PlayerPokemon } from "#app/field/pokemon.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { TurnInitEvent } from "#app/events/battle-scene"; +import { PlayerPokemon } from "#app/field/pokemon"; import i18next from "i18next"; import { FieldPhase } from "./field-phase"; import { ToggleDoublePositionPhase } from "./toggle-double-position-phase"; diff --git a/src/phases/unavailable-phase.ts b/src/phases/unavailable-phase.ts index 4757af5e15d..59bfca7875e 100644 --- a/src/phases/unavailable-phase.ts +++ b/src/phases/unavailable-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene.js"; -import { Phase } from "#app/phase.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { Mode } from "#app/ui/ui"; import { LoginPhase } from "./login-phase"; export class UnavailablePhase extends Phase { diff --git a/src/phases/unlock-phase.ts b/src/phases/unlock-phase.ts index 1662afaa758..65060309a6c 100644 --- a/src/phases/unlock-phase.ts +++ b/src/phases/unlock-phase.ts @@ -1,7 +1,7 @@ -import BattleScene from "#app/battle-scene.js"; -import { Phase } from "#app/phase.js"; -import { Unlockables, getUnlockableName } from "#app/system/unlockables.js"; -import { Mode } from "#app/ui/ui.js"; +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { Unlockables, getUnlockableName } from "#app/system/unlockables"; +import { Mode } from "#app/ui/ui"; import i18next from "i18next"; export class UnlockPhase extends Phase { diff --git a/src/phases/victory-phase.ts b/src/phases/victory-phase.ts index b7587de4dbb..9679a79a37d 100644 --- a/src/phases/victory-phase.ts +++ b/src/phases/victory-phase.ts @@ -1,8 +1,8 @@ -import BattleScene from "#app/battle-scene.js"; -import { BattlerIndex, BattleType } from "#app/battle.js"; -import { modifierTypes } from "#app/modifier/modifier-type.js"; -import { ExpShareModifier, ExpBalanceModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier.js"; -import * as Utils from "#app/utils.js"; +import BattleScene from "#app/battle-scene"; +import { BattlerIndex, BattleType } from "#app/battle"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { ExpShareModifier, ExpBalanceModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; +import * as Utils from "#app/utils"; import Overrides from "#app/overrides"; import { BattleEndPhase } from "./battle-end-phase"; import { NewBattlePhase } from "./new-battle-phase"; diff --git a/src/phases/weather-effect-phase.ts b/src/phases/weather-effect-phase.ts index 71ca7f9b505..e85ef0326f6 100644 --- a/src/phases/weather-effect-phase.ts +++ b/src/phases/weather-effect-phase.ts @@ -1,10 +1,11 @@ -import BattleScene from "#app/battle-scene.js"; +import BattleScene from "#app/battle-scene"; import { applyPreWeatherEffectAbAttrs, SuppressWeatherEffectAbAttr, PreWeatherDamageAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPostWeatherLapseAbAttrs, PostWeatherLapseAbAttr } from "#app/data/ability.js"; -import { CommonAnim } from "#app/data/battle-anims.js"; -import { Weather, getWeatherDamageMessage, getWeatherLapseMessage } from "#app/data/weather.js"; -import { WeatherType } from "#app/enums/weather-type.js"; -import Pokemon, { HitResult } from "#app/field/pokemon.js"; -import * as Utils from "#app/utils.js"; +import { CommonAnim } from "#app/data/battle-anims"; +import { Weather, getWeatherDamageMessage, getWeatherLapseMessage } from "#app/data/weather"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { WeatherType } from "#app/enums/weather-type"; +import Pokemon, { HitResult } from "#app/field/pokemon"; +import * as Utils from "#app/utils"; import { CommonAnimPhase } from "./common-anim-phase"; export class WeatherEffectPhase extends CommonAnimPhase { @@ -39,7 +40,7 @@ export class WeatherEffectPhase extends CommonAnimPhase { applyPreWeatherEffectAbAttrs(PreWeatherDamageAbAttr, pokemon, this.weather, cancelled); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); - if (cancelled.value) { + if (cancelled.value || pokemon.getTag(BattlerTagType.UNDERGROUND) || pokemon.getTag(BattlerTagType.UNDERWATER)) { return; } diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 3d24458a06c..705fd5143a4 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -2,17 +2,17 @@ import i18next from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import processor, { KoreanPostpositionProcessor } from "i18next-korean-postposition-processor"; -import { caEsConfig} from "#app/locales/ca_ES/config.js"; -import { deConfig } from "#app/locales/de/config.js"; -import { enConfig } from "#app/locales/en/config.js"; -import { esConfig } from "#app/locales/es/config.js"; -import { frConfig } from "#app/locales/fr/config.js"; -import { itConfig } from "#app/locales/it/config.js"; -import { koConfig } from "#app/locales/ko/config.js"; -import { jaConfig } from "#app/locales/ja/config.js"; -import { ptBrConfig } from "#app/locales/pt_BR/config.js"; -import { zhCnConfig } from "#app/locales/zh_CN/config.js"; -import { zhTwConfig } from "#app/locales/zh_TW/config.js"; +import { caEsConfig} from "#app/locales/ca_ES/config"; +import { deConfig } from "#app/locales/de/config"; +import { enConfig } from "#app/locales/en/config"; +import { esConfig } from "#app/locales/es/config"; +import { frConfig } from "#app/locales/fr/config"; +import { itConfig } from "#app/locales/it/config"; +import { koConfig } from "#app/locales/ko/config"; +import { jaConfig } from "#app/locales/ja/config"; +import { ptBrConfig } from "#app/locales/pt_BR/config"; +import { zhCnConfig } from "#app/locales/zh_CN/config"; +import { zhTwConfig } from "#app/locales/zh_TW/config"; interface LoadingFontFaceProperty { face: FontFace, diff --git a/src/system/arena-data.ts b/src/system/arena-data.ts index 886129edcf6..5b907805372 100644 --- a/src/system/arena-data.ts +++ b/src/system/arena-data.ts @@ -2,7 +2,7 @@ import { Arena } from "../field/arena"; import { ArenaTag } from "../data/arena-tag"; import { Biome } from "#enums/biome"; import { Weather } from "../data/weather"; -import { Terrain } from "#app/data/terrain.js"; +import { Terrain } from "#app/data/terrain"; export default class ArenaData { public biome: Biome; diff --git a/src/system/challenge-data.ts b/src/system/challenge-data.ts index 69df11dd395..394d63867be 100644 --- a/src/system/challenge-data.ts +++ b/src/system/challenge-data.ts @@ -1,4 +1,4 @@ -import { Challenge, copyChallenge } from "#app/data/challenge.js"; +import { Challenge, copyChallenge } from "#app/data/challenge"; export default class ChallengeData { public id: integer; diff --git a/src/system/egg-data.ts b/src/system/egg-data.ts index b4bd4368bd9..785ae364efe 100644 --- a/src/system/egg-data.ts +++ b/src/system/egg-data.ts @@ -2,7 +2,7 @@ import { EggTier } from "#enums/egg-type"; import { Species } from "#enums/species"; import { VariantTier } from "#enums/variant-tiers"; import { EGG_SEED, Egg } from "../data/egg"; -import { EggSourceType } from "#app/enums/egg-source-types.js"; +import { EggSourceType } from "#app/enums/egg-source-types"; export default class EggData { public id: integer; diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 1a47294906e..677bbe4add6 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1,7 +1,7 @@ import i18next from "i18next"; import BattleScene, { PokeballCounts, bypassLogin } from "../battle-scene"; import Pokemon, { EnemyPokemon, PlayerPokemon } from "../field/pokemon"; -import { pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions"; +import { pokemonPrevolutions } from "../data/pokemon-evolutions"; import PokemonSpecies, { allSpecies, getPokemonSpecies, noStarterFormKeys, speciesStarters } from "../data/pokemon-species"; import * as Utils from "../utils"; import Overrides from "#app/overrides"; @@ -27,24 +27,25 @@ import { Tutorial } from "../tutorial"; import { speciesEggMoves } from "../data/egg-moves"; import { allMoves } from "../data/move"; import { TrainerVariant } from "../field/trainer"; -import { Variant, variantData } from "#app/data/variant"; +import { Variant } from "#app/data/variant"; import {setSettingGamepad, SettingGamepad, settingGamepadDefaults} from "./settings/settings-gamepad"; import {setSettingKeyboard, SettingKeyboard} from "#app/system/settings/settings-keyboard"; -import { TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena.js"; -import { EnemyAttackStatusEffectChanceModifier } from "../modifier/modifier"; -import { StatusEffect } from "#app/data/status-effect.js"; +import { TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena"; +import * as Modifier from "../modifier/modifier"; +import { StatusEffect } from "#app/data/status-effect"; import ChallengeData from "./challenge-data"; import { Device } from "#enums/devices"; import { GameDataType } from "#enums/game-data-type"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; -import { applyChallenges, ChallengeType } from "#app/data/challenge.js"; -import { WeatherType } from "#app/enums/weather-type.js"; -import { TerrainType } from "#app/data/terrain.js"; -import { OutdatedPhase } from "#app/phases/outdated-phase.js"; -import { ReloadSessionPhase } from "#app/phases/reload-session-phase.js"; +import { applyChallenges, ChallengeType } from "#app/data/challenge"; +import { WeatherType } from "#app/enums/weather-type"; +import { TerrainType } from "#app/data/terrain"; +import { OutdatedPhase } from "#app/phases/outdated-phase"; +import { ReloadSessionPhase } from "#app/phases/reload-session-phase"; import { RUN_HISTORY_LIMIT } from "#app/ui/run-history-ui-handler"; +import { applySessionDataPatches, applySettingsDataPatches, applySystemDataPatches } from "./version-converter"; export const defaultStarterSpecies: Species[] = [ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, @@ -93,7 +94,7 @@ export function decrypt(data: string, bypassLogin: boolean): string { : (data: string) => AES.decrypt(data, saveKey).toString(enc.Utf8))(data); } -interface SystemSaveData { +export interface SystemSaveData { trainerId: integer; secretId: integer; gender: PlayerGender; @@ -456,17 +457,14 @@ export class GameData { localStorage.setItem(`data_${loggedInUser?.username}`, encrypt(systemDataStr, bypassLogin)); - /*const versions = [ this.scene.game.config.gameVersion, data.gameVersion || '0.0.0' ]; - - if (versions[0] !== versions[1]) { - const [ versionNumbers, oldVersionNumbers ] = versions.map(ver => ver.split('.').map(v => parseInt(v))); - }*/ const lsItemKey = `runHistoryData_${loggedInUser?.username}`; const lsItem = localStorage.getItem(lsItemKey); if (!lsItem) { localStorage.setItem(lsItemKey, ""); } + applySystemDataPatches(systemData); + this.trainerId = systemData.trainerId; this.secretId = systemData.secretId; @@ -474,9 +472,7 @@ export class GameData { this.saveSetting(SettingKeys.Player_Gender, systemData.gender === PlayerGender.FEMALE ? 1 : 0); - const initStarterData = !systemData.starterData; - - if (initStarterData) { + if (!systemData.starterData) { this.initStarterData(); if (systemData["starterMoveData"]) { @@ -494,25 +490,20 @@ export class GameData { } this.migrateStarterAbilities(systemData, this.starterData); - } else { - if ([ "1.0.0", "1.0.1" ].includes(systemData.gameVersion)) { - this.migrateStarterAbilities(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) { - systemData.starterData[sd].abilityAttr = 1; + + const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); + for (const s of starterIds) { + this.starterData[s].candyCount += this.dexData[s].caughtCount; + this.starterData[s].candyCount += this.dexData[s].hatchedCount * 2; + if (this.dexData[s].caughtAttr & DexAttr.SHINY) { + this.starterData[s].candyCount += 4; } - }); + } + } else { this.starterData = systemData.starterData; } if (systemData.gameStats) { - if (systemData.gameStats.legendaryPokemonCaught !== undefined && systemData.gameStats.subLegendaryPokemonCaught === undefined) { - this.fixLegendaryStats(systemData); - } this.gameStats = systemData.gameStats; } @@ -558,17 +549,6 @@ export class GameData { this.consolidateDexData(this.dexData); this.defaultDexData = null; - if (initStarterData) { - const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); - for (const s of starterIds) { - this.starterData[s].candyCount += this.dexData[s].caughtCount; - this.starterData[s].candyCount += this.dexData[s].hatchedCount * 2; - if (this.dexData[s].caughtAttr & DexAttr.SHINY) { - this.starterData[s].candyCount += 4; - } - } - } - resolve(true); } catch (err) { console.error(err); @@ -747,6 +727,7 @@ export class GameData { setSetting(this.scene, setting, valueIndex); settings[setting] = valueIndex; + settings["gameVersion"] = this.scene.game.config.gameVersion; localStorage.setItem("settings", JSON.stringify(settings)); @@ -857,6 +838,8 @@ export class GameData { const settings = JSON.parse(localStorage.getItem("settings")!); // TODO: is this bang correct? + applySettingsDataPatches(settings); + for (const setting of Object.keys(settings)) { setSetting(this.scene, setting, settings[setting]); } @@ -1082,10 +1065,8 @@ export class GameData { // TODO //scene.arena.tags = sessionData.arena.tags; - const modifiersModule = await import("../modifier/modifier"); - for (const modifierData of sessionData.modifiers) { - const modifier = modifierData.toModifier(scene, modifiersModule[modifierData.className]); + const modifier = modifierData.toModifier(scene, Modifier[modifierData.className]); if (modifier) { scene.addModifier(modifier, true); } @@ -1094,7 +1075,7 @@ export class GameData { scene.updateModifiers(true); for (const enemyModifierData of sessionData.enemyModifiers) { - const modifier = enemyModifierData.toModifier(scene, modifiersModule[enemyModifierData.className]); + const modifier = enemyModifierData.toModifier(scene, Modifier[enemyModifierData.className]); if (modifier) { scene.addEnemyModifier(modifier, true); } @@ -1218,7 +1199,7 @@ export class GameData { } parseSessionData(dataStr: string): SessionSaveData { - return JSON.parse(dataStr, (k: string, v: any) => { + const sessionData = JSON.parse(dataStr, (k: string, v: any) => { /*const versions = [ scene.game.config.gameVersion, sessionData.gameVersion || '0.0.0' ]; if (versions[0] !== versions[1]) { @@ -1250,7 +1231,7 @@ export class GameData { if (md?.className === "ExpBalanceModifier") { // Temporarily limit EXP Balance until it gets reworked md.stackCount = Math.min(md.stackCount, 4); } - if (md instanceof EnemyAttackStatusEffectChanceModifier && md.effect === StatusEffect.FREEZE || md.effect === StatusEffect.SLEEP) { + if (md instanceof Modifier.EnemyAttackStatusEffectChanceModifier && md.effect === StatusEffect.FREEZE || md.effect === StatusEffect.SLEEP) { continue; } ret.push(new PersistentModifierData(md, player)); @@ -1275,6 +1256,10 @@ export class GameData { return v; }) as SessionSaveData; + + applySessionDataPatches(sessionData); + + return sessionData; } saveAll(scene: BattleScene, skipVerification: boolean = false, sync: boolean = false, useCachedSession: boolean = false, useCachedSystem: boolean = false): Promise { @@ -1877,75 +1862,4 @@ export class GameData { } } } - - fixVariantData(systemData: SystemSaveData): void { - const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); - const starterData = systemData.starterData; - const dexData = systemData.dexData; - if (starterIds.find(id => (dexData[id].caughtAttr & DexAttr.VARIANT_2 || dexData[id].caughtAttr & DexAttr.VARIANT_3) && !variantData[id])) { - for (const s of starterIds) { - const species = getPokemonSpecies(s); - if (variantData[s]) { - const tempCaughtAttr = dexData[s].caughtAttr; - let seenVariant2 = false; - let seenVariant3 = false; - const checkEvoSpecies = (es: Species) => { - seenVariant2 ||= !!(dexData[es].seenAttr & DexAttr.VARIANT_2); - seenVariant3 ||= !!(dexData[es].seenAttr & DexAttr.VARIANT_3); - if (pokemonEvolutions.hasOwnProperty(es)) { - for (const pe of pokemonEvolutions[es]) { - checkEvoSpecies(pe.speciesId); - } - } - }; - checkEvoSpecies(s); - if (dexData[s].caughtAttr & DexAttr.VARIANT_2 && !seenVariant2) { - dexData[s].caughtAttr ^= DexAttr.VARIANT_2; - } - if (dexData[s].caughtAttr & DexAttr.VARIANT_3 && !seenVariant3) { - dexData[s].caughtAttr ^= DexAttr.VARIANT_3; - } - starterData[s].abilityAttr = (tempCaughtAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0) - | (tempCaughtAttr & DexAttr.VARIANT_2 && species.ability2 ? AbilityAttr.ABILITY_2 : 0) - | (tempCaughtAttr & DexAttr.VARIANT_3 && species.abilityHidden ? AbilityAttr.ABILITY_HIDDEN : 0); - } else { - const tempCaughtAttr = dexData[s].caughtAttr; - if (dexData[s].caughtAttr & DexAttr.VARIANT_2) { - dexData[s].caughtAttr ^= DexAttr.VARIANT_2; - } - if (dexData[s].caughtAttr & DexAttr.VARIANT_3) { - dexData[s].caughtAttr ^= DexAttr.VARIANT_3; - } - starterData[s].abilityAttr = (tempCaughtAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0) - | (tempCaughtAttr & DexAttr.VARIANT_2 && species.ability2 ? AbilityAttr.ABILITY_2 : 0) - | (tempCaughtAttr & DexAttr.VARIANT_3 && species.abilityHidden ? AbilityAttr.ABILITY_HIDDEN : 0); - } - } - } - } - - fixStarterData(systemData: SystemSaveData): void { - for (const starterId of defaultStarterSpecies) { - systemData.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; - systemData.dexData[starterId].caughtAttr |= DexAttr.FEMALE; - } - } - - fixLegendaryStats(systemData: SystemSaveData): void { - systemData.gameStats.subLegendaryPokemonSeen = 0; - systemData.gameStats.subLegendaryPokemonCaught = 0; - systemData.gameStats.subLegendaryPokemonHatched = 0; - allSpecies.filter(s => s.subLegendary).forEach(s => { - const dexEntry = systemData.dexData[s.speciesId]; - systemData.gameStats.subLegendaryPokemonSeen += dexEntry.seenCount; - systemData.gameStats.legendaryPokemonSeen = Math.max(systemData.gameStats.legendaryPokemonSeen - dexEntry.seenCount, 0); - systemData.gameStats.subLegendaryPokemonCaught += dexEntry.caughtCount; - systemData.gameStats.legendaryPokemonCaught = Math.max(systemData.gameStats.legendaryPokemonCaught - dexEntry.caughtCount, 0); - systemData.gameStats.subLegendaryPokemonHatched += dexEntry.hatchedCount; - systemData.gameStats.legendaryPokemonHatched = Math.max(systemData.gameStats.legendaryPokemonHatched - dexEntry.hatchedCount, 0); - }); - systemData.gameStats.subLegendaryPokemonSeen = Math.max(systemData.gameStats.subLegendaryPokemonSeen, systemData.gameStats.subLegendaryPokemonCaught); - systemData.gameStats.legendaryPokemonSeen = Math.max(systemData.gameStats.legendaryPokemonSeen, systemData.gameStats.legendaryPokemonCaught); - systemData.gameStats.mythicalPokemonSeen = Math.max(systemData.gameStats.mythicalPokemonSeen, systemData.gameStats.mythicalPokemonCaught); - } } diff --git a/src/system/modifier-data.ts b/src/system/modifier-data.ts index 0f3e28fe11c..1514f7e3fb3 100644 --- a/src/system/modifier-data.ts +++ b/src/system/modifier-data.ts @@ -3,11 +3,11 @@ import { PersistentModifier } from "../modifier/modifier"; import { GeneratedPersistentModifierType, ModifierType, ModifierTypeGenerator, getModifierTypeFuncById } from "../modifier/modifier-type"; export default class ModifierData { - private player: boolean; - private typeId: string; - private typePregenArgs: any[]; - private args: any[]; - private stackCount: integer; + public player: boolean; + public typeId: string; + public typePregenArgs: any[]; + public args: any[]; + public stackCount: integer; public className: string; diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index 6b46b6fe96c..bc88c21e1e1 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -8,7 +8,7 @@ import SettingsUiHandler from "#app/ui/settings/settings-ui-handler"; import { EaseType } from "#enums/ease-type"; import { MoneyFormat } from "#enums/money-format"; import { PlayerGender } from "#enums/player-gender"; -import { getIsInitialized, initI18n } from "#app/plugins/i18n.js"; +import { getIsInitialized, initI18n } from "#app/plugins/i18n"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; function getTranslation(key: string): string { diff --git a/src/system/version-converter.ts b/src/system/version-converter.ts new file mode 100644 index 00000000000..ed65fcd99b8 --- /dev/null +++ b/src/system/version-converter.ts @@ -0,0 +1,137 @@ +import { allSpecies } from "#app/data/pokemon-species.js"; +import { AbilityAttr, defaultStarterSpecies, DexAttr, SessionSaveData, SystemSaveData } from "./game-data"; +import { SettingKeys } from "./settings/settings"; + +const LATEST_VERSION = "1.0.5"; + +export function applySessionDataPatches(data: SessionSaveData) { + const curVersion = data.gameVersion; + if (curVersion !== LATEST_VERSION) { + switch (curVersion) { + case "1.0.0": + case "1.0.1": + case "1.0.2": + case "1.0.3": + case "1.0.4": + // --- PATCHES --- + + // Fix Battle Items, Vitamins, and Lures + data.modifiers.forEach((m) => { + if (m.className === "PokemonBaseStatModifier") { + m.className = "BaseStatModifier"; + } else if (m.className === "PokemonResetNegativeStatStageModifier") { + m.className = "ResetNegativeStatStageModifier"; + } else if (m.className === "TempBattleStatBoosterModifier") { + m.className = "TempStatStageBoosterModifier"; + m.typeId = "TEMP_STAT_STAGE_BOOSTER"; + + // Migration from TempBattleStat to Stat + const newStat = m.typePregenArgs[0] + 1; + m.typePregenArgs[0] = newStat; + + // From [ stat, battlesLeft ] to [ stat, maxBattles, battleCount ] + m.args = [ newStat, 5, m.args[1] ]; + } else if (m.className === "DoubleBattleChanceBoosterModifier") { + let maxBattles: number; + switch (m.typeId) { + case "MAX_LURE": + maxBattles = 30; + break; + case "SUPER_LURE": + maxBattles = 15; + break; + default: + maxBattles = 10; + break; + } + + // From [ battlesLeft ] to [ maxBattles, battleCount ] + m.args = [ maxBattles, m.args[0] ]; + } + }); + + data.enemyModifiers.forEach((m) => { + if (m.className === "PokemonBaseStatModifier") { + m.className = "BaseStatModifier"; + } + }); + } + + data.gameVersion = LATEST_VERSION; + } +} + +export function applySystemDataPatches(data: SystemSaveData) { + const curVersion = data.gameVersion; + if (curVersion !== LATEST_VERSION) { + switch (curVersion) { + case "1.0.0": + case "1.0.1": + case "1.0.2": + case "1.0.3": + case "1.0.4": + // --- LEGACY PATCHES --- + if (data.starterData) { + // Migrate ability starter data if empty for caught species + Object.keys(data.starterData).forEach(sd => { + if (data.dexData[sd].caughtAttr && !data.starterData[sd].abilityAttr) { + data.starterData[sd].abilityAttr = 1; + } + }); + } + + // Fix Legendary Stats + if (data.gameStats && (data.gameStats.legendaryPokemonCaught !== undefined && data.gameStats.subLegendaryPokemonCaught === undefined)) { + data.gameStats.subLegendaryPokemonSeen = 0; + data.gameStats.subLegendaryPokemonCaught = 0; + data.gameStats.subLegendaryPokemonHatched = 0; + allSpecies.filter(s => s.subLegendary).forEach(s => { + const dexEntry = data.dexData[s.speciesId]; + data.gameStats.subLegendaryPokemonSeen += dexEntry.seenCount; + data.gameStats.legendaryPokemonSeen = Math.max(data.gameStats.legendaryPokemonSeen - dexEntry.seenCount, 0); + data.gameStats.subLegendaryPokemonCaught += dexEntry.caughtCount; + data.gameStats.legendaryPokemonCaught = Math.max(data.gameStats.legendaryPokemonCaught - dexEntry.caughtCount, 0); + data.gameStats.subLegendaryPokemonHatched += dexEntry.hatchedCount; + data.gameStats.legendaryPokemonHatched = Math.max(data.gameStats.legendaryPokemonHatched - dexEntry.hatchedCount, 0); + }); + data.gameStats.subLegendaryPokemonSeen = Math.max(data.gameStats.subLegendaryPokemonSeen, data.gameStats.subLegendaryPokemonCaught); + data.gameStats.legendaryPokemonSeen = Math.max(data.gameStats.legendaryPokemonSeen, data.gameStats.legendaryPokemonCaught); + data.gameStats.mythicalPokemonSeen = Math.max(data.gameStats.mythicalPokemonSeen, data.gameStats.mythicalPokemonCaught); + } + + // --- PATCHES --- + + // Fix Starter Data + if (data.gameVersion) { + for (const starterId of defaultStarterSpecies) { + data.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; + data.dexData[starterId].caughtAttr |= DexAttr.FEMALE; + } + } + } + + data.gameVersion = LATEST_VERSION; + } +} + +export function applySettingsDataPatches(settings: Object) { + const curVersion = settings.hasOwnProperty("gameVersion") ? settings["gameVersion"] : "1.0.0"; + if (curVersion !== LATEST_VERSION) { + switch (curVersion) { + case "1.0.0": + case "1.0.1": + case "1.0.2": + case "1.0.3": + case "1.0.4": + // --- PATCHES --- + + // Fix Reward Cursor Target + if (settings.hasOwnProperty("REROLL_TARGET") && !settings.hasOwnProperty(SettingKeys.Shop_Cursor_Target)) { + settings[SettingKeys.Shop_Cursor_Target] = settings["REROLL_TARGET"]; + delete settings["REROLL_TARGET"]; + localStorage.setItem("settings", JSON.stringify(settings)); + } + } + // Note that the current game version will be written at `saveSettings` + } +} diff --git a/src/system/voucher.ts b/src/system/voucher.ts index 2f94308d9c8..06edfe5c6a6 100644 --- a/src/system/voucher.ts +++ b/src/system/voucher.ts @@ -3,8 +3,8 @@ import i18next from "i18next"; import { AchvTier, achvs, getAchievementDescription } from "./achv"; import { PlayerGender } from "#enums/player-gender"; import { TrainerType } from "#enums/trainer-type"; -import { ConditionFn } from "#app/@types/common.js"; -import { trainerConfigs } from "#app/data/trainer-config.js"; +import { ConditionFn } from "#app/@types/common"; +import { trainerConfigs } from "#app/data/trainer-config"; export enum VoucherType { REGULAR, diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts index 7de300c157a..0fb2212d817 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/src/test/abilities/aura_break.test.ts @@ -1,5 +1,4 @@ import { allMoves } from "#app/data/move"; -import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -33,31 +32,45 @@ describe("Abilities - Aura Break", () => { game.override.enemySpecies(Species.SHUCKLE); }); - it("reverses the effect of fairy aura", async () => { + it("reverses the effect of Fairy Aura", async () => { const moveToCheck = allMoves[Moves.MOONBLAST]; const basePower = moveToCheck.power; game.override.ability(Abilities.FAIRY_AURA); vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([Species.PIKACHU]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.MOONBLAST); - await game.phaseInterceptor.to(MoveEffectPhase); + await game.phaseInterceptor.to("MoveEffectPhase"); expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(expect.closeTo(basePower * auraBreakMultiplier)); }); - it("reverses the effect of dark aura", async () => { + it("reverses the effect of Dark Aura", async () => { const moveToCheck = allMoves[Moves.DARK_PULSE]; const basePower = moveToCheck.power; game.override.ability(Abilities.DARK_AURA); vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([Species.PIKACHU]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.DARK_PULSE); - await game.phaseInterceptor.to(MoveEffectPhase); + await game.phaseInterceptor.to("MoveEffectPhase"); expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(expect.closeTo(basePower * auraBreakMultiplier)); }); + + it("has no effect if neither Fairy Aura nor Dark Aura are present", async () => { + const moveToCheck = allMoves[Moves.MOONBLAST]; + const basePower = moveToCheck.power; + + game.override.ability(Abilities.BALL_FETCH); + vi.spyOn(moveToCheck, "calculateBattlePower"); + + await game.classicMode.startBattle([Species.PIKACHU]); + game.move.select(Moves.MOONBLAST); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower); + }); }); diff --git a/src/test/abilities/tera_shell.test.ts b/src/test/abilities/tera_shell.test.ts index f9cb2935619..6a6b7bb252b 100644 --- a/src/test/abilities/tera_shell.test.ts +++ b/src/test/abilities/tera_shell.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; -import { HitResult } from "#app/field/pokemon.js"; +import { HitResult } from "#app/field/pokemon"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/arena/weather_hail.test.ts b/src/test/arena/weather_hail.test.ts new file mode 100644 index 00000000000..75125b3448c --- /dev/null +++ b/src/test/arena/weather_hail.test.ts @@ -0,0 +1,62 @@ +import { WeatherType } from "#app/data/weather"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; +import { BattlerIndex } from "#app/battle"; + +describe("Weather - Hail", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .weather(WeatherType.HAIL) + .battleType("single") + .moveset(SPLASH_ONLY) + .enemyMoveset(SPLASH_ONLY) + .enemySpecies(Species.MAGIKARP); + }); + + it("inflicts damage equal to 1/16 of Pokemon's max HP at turn end", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + await game.phaseInterceptor.to("TurnEndPhase"); + + game.scene.getField(true).forEach(pokemon => { + expect(pokemon.hp).toBeLessThan(pokemon.getMaxHp() - Math.floor(pokemon.getMaxHp() / 16)); + }); + }); + + it("does not inflict damage to a Pokemon that is underwater (Dive) or underground (Dig)", async () => { + game.override.moveset([Moves.DIG]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.DIG); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + await game.phaseInterceptor.to("TurnEndPhase"); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp() - Math.floor(enemyPokemon.getMaxHp() / 16)); + }); +}); diff --git a/src/test/arena/weather_sandstorm.test.ts b/src/test/arena/weather_sandstorm.test.ts new file mode 100644 index 00000000000..978774ba4c1 --- /dev/null +++ b/src/test/arena/weather_sandstorm.test.ts @@ -0,0 +1,59 @@ +import { WeatherType } from "#app/data/weather"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; + +describe("Weather - Sandstorm", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .weather(WeatherType.SANDSTORM) + .battleType("single") + .moveset(SPLASH_ONLY) + .enemyMoveset(SPLASH_ONLY) + .enemySpecies(Species.MAGIKARP); + }); + + it("inflicts damage equal to 1/16 of Pokemon's max HP at turn end", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("TurnEndPhase"); + + game.scene.getField(true).forEach(pokemon => { + expect(pokemon.hp).toBeLessThan(pokemon.getMaxHp() - Math.floor(pokemon.getMaxHp() / 16)); + }); + }); + + it("does not inflict damage to a Pokemon that is underwater (Dive) or underground (Dig)", async () => { + game.override.moveset([Moves.DIVE]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.DIVE); + + await game.phaseInterceptor.to("TurnEndPhase"); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp() - Math.floor(enemyPokemon.getMaxHp() / 16)); + }); +}); diff --git a/src/test/battle/damage_calculation.test.ts b/src/test/battle/damage_calculation.test.ts index 665000450be..9c7c9dc9d3e 100644 --- a/src/test/battle/damage_calculation.test.ts +++ b/src/test/battle/damage_calculation.test.ts @@ -1,4 +1,4 @@ -import { DamagePhase } from "#app/phases/damage-phase.js"; +import { DamagePhase } from "#app/phases/damage-phase"; import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; diff --git a/src/test/battle/inverse_battle.test.ts b/src/test/battle/inverse_battle.test.ts index be8b04155eb..2a561a09e5e 100644 --- a/src/test/battle/inverse_battle.test.ts +++ b/src/test/battle/inverse_battle.test.ts @@ -1,8 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; import { Type } from "#app/data/type"; -import { MoveEndPhase } from "#app/phases/move-end-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Challenges } from "#enums/challenges"; @@ -11,7 +8,8 @@ import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const TIMEOUT = 20 * 1000; @@ -39,43 +37,63 @@ describe("Inverse Battle", () => { .starterSpecies(Species.FEEBAS) .ability(Abilities.BALL_FETCH) .enemySpecies(Species.MAGIKARP) - .enemyAbility(Abilities.BALL_FETCH); + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(SPLASH_ONLY); }); - it("1. immune types are 2x effective - Thunderbolt against Ground Type", async () => { - game.override.enemySpecies(Species.SANDSHREW); + it("Immune types are 2x effective - Thunderbolt against Ground Type", async () => { + game.override + .moveset([Moves.THUNDERBOLT]) + .enemySpecies(Species.SANDSHREW); + await game.challengeMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); - expect(enemy.getMoveEffectiveness(player, allMoves[Moves.THUNDERBOLT])).toBe(2); + game.move.select(Moves.THUNDERBOLT); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }, TIMEOUT); - it("2. 2x effective types are 0.5x effective - Thunderbolt against Flying Type", async () => { - game.override.enemySpecies(Species.PIDGEY); + it("2x effective types are 0.5x effective - Thunderbolt against Flying Type", async () => { + game.override + .moveset([Moves.THUNDERBOLT]) + .enemySpecies(Species.PIDGEY); await game.challengeMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); - expect(enemy.getMoveEffectiveness(player, allMoves[Moves.THUNDERBOLT])).toBe(0.5); + game.move.select(Moves.THUNDERBOLT); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(0.5); }, TIMEOUT); - it("3. 0.5x effective types are 2x effective - Thunderbolt against Electric Type", async () => { - game.override.enemySpecies(Species.CHIKORITA); + it("0.5x effective types are 2x effective - Thunderbolt against Electric Type", async () => { + game.override + .moveset([Moves.THUNDERBOLT]) + .enemySpecies(Species.CHIKORITA); await game.challengeMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); - expect(enemy.getMoveEffectiveness(player, allMoves[Moves.THUNDERBOLT])).toBe(2); + game.move.select(Moves.THUNDERBOLT); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }, TIMEOUT); - it("4. Stealth Rock follows the inverse matchups - Stealth Rock against Charizard deals 1/32 of max HP", async () => { + it("Stealth Rock follows the inverse matchups - Stealth Rock against Charizard deals 1/32 of max HP", async () => { game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0); game.override .enemySpecies(Species.CHARIZARD) @@ -95,18 +113,24 @@ describe("Inverse Battle", () => { expect(currentHp).toBeGreaterThan(maxHp * 31 / 32 - 1); }, TIMEOUT); - it("5. Freeze Dry is 2x effective against Water Type like other Ice type Move - Freeze Dry against Squirtle", async () => { - game.override.enemySpecies(Species.SQUIRTLE); + it("Freeze Dry is 2x effective against Water Type like other Ice type Move - Freeze Dry against Squirtle", async () => { + game.override + .moveset([Moves.FREEZE_DRY]) + .enemySpecies(Species.SQUIRTLE); await game.challengeMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); - expect(enemy.getMoveEffectiveness(player, allMoves[Moves.FREEZE_DRY])).toBe(2); + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }, TIMEOUT); - it("6. Water Absorb should heal against water moves - Water Absorb against Water gun", async () => { + it("Water Absorb should heal against water moves - Water Absorb against Water gun", async () => { game.override .moveset([Moves.WATER_GUN]) .enemyAbility(Abilities.WATER_ABSORB); @@ -117,13 +141,12 @@ describe("Inverse Battle", () => { enemy.hp = enemy.getMaxHp() - 1; game.move.select(Moves.WATER_GUN); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); - - await game.phaseInterceptor.to(MoveEndPhase); + await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.hp).toBe(enemy.getMaxHp()); }, TIMEOUT); - it("7. Fire type does not get burned - Will-O-Wisp against Charmander", async () => { + it("Fire type does not get burned - Will-O-Wisp against Charmander", async () => { game.override .moveset([Moves.WILL_O_WISP]) .enemySpecies(Species.CHARMANDER); @@ -135,13 +158,12 @@ describe("Inverse Battle", () => { game.move.select(Moves.WILL_O_WISP); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); - - await game.phaseInterceptor.to(MoveEndPhase); + await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.status?.effect).not.toBe(StatusEffect.BURN); }, TIMEOUT); - it("8. Electric type does not get paralyzed - Nuzzle against Pikachu", async () => { + it("Electric type does not get paralyzed - Nuzzle against Pikachu", async () => { game.override .moveset([Moves.NUZZLE]) .enemySpecies(Species.PIKACHU) @@ -153,14 +175,30 @@ describe("Inverse Battle", () => { game.move.select(Moves.NUZZLE); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); - - await game.phaseInterceptor.to(MoveEndPhase); + await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.status?.effect).not.toBe(StatusEffect.PARALYSIS); }, TIMEOUT); + it("Ground type is not immune to Thunder Wave - Thunder Wave against Sandshrew", async () => { + game.override + .moveset([Moves.THUNDER_WAVE]) + .enemySpecies(Species.SANDSHREW); - it("10. Anticipation should trigger on 2x effective moves - Anticipation against Thunderbolt", async () => { + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDER_WAVE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceHit(); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(enemy.status?.effect).toBe(StatusEffect.PARALYSIS); + }, TIMEOUT); + + + it("Anticipation should trigger on 2x effective moves - Anticipation against Thunderbolt", async () => { game.override .moveset([Moves.THUNDERBOLT]) .enemySpecies(Species.SANDSHREW) @@ -171,7 +209,7 @@ describe("Inverse Battle", () => { expect(game.scene.getEnemyPokemon()?.summonData.abilitiesApplied[0]).toBe(Abilities.ANTICIPATION); }, TIMEOUT); - it("11. Conversion 2 should change the type to the resistive type - Conversion 2 against Dragonite", async () => { + it("Conversion 2 should change the type to the resistive type - Conversion 2 against Dragonite", async () => { game.override .moveset([Moves.CONVERSION_2]) .enemyMoveset([Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW]); @@ -183,21 +221,64 @@ describe("Inverse Battle", () => { game.move.select(Moves.CONVERSION_2); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(player.getTypes()[0]).toBe(Type.DRAGON); }, TIMEOUT); - it("12. Flying Press should be 0.25x effective against Grass + Dark Type - Flying Press against Meowscarada", async () => { + it("Flying Press should be 0.25x effective against Grass + Dark Type - Flying Press against Meowscarada", async () => { game.override .moveset([Moves.FLYING_PRESS]) .enemySpecies(Species.MEOWSCARADA); await game.challengeMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); - expect(enemy.getMoveEffectiveness(player, allMoves[Moves.FLYING_PRESS])).toBe(0.25); + game.move.select(Moves.FLYING_PRESS); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(0.25); + }, TIMEOUT); + + it("Scrappy ability has no effect - Tackle against Ghost Type still 2x effective with Scrappy", async () => { + game.override + .moveset([Moves.TACKLE]) + .ability(Abilities.SCRAPPY) + .enemySpecies(Species.GASTLY); + + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); + }, TIMEOUT); + + it("FORESIGHT has no effect - Tackle against Ghost Type still 2x effective with Foresight", async () => { + game.override + .moveset([Moves.FORESIGHT, Moves.TACKLE]) + .enemySpecies(Species.GASTLY); + + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FORESIGHT); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("TurnEndPhase"); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }, TIMEOUT); }); diff --git a/src/test/items/dire_hit.test.ts b/src/test/items/dire_hit.test.ts index 02f7c0d06a4..4b5988294f3 100644 --- a/src/test/items/dire_hit.test.ts +++ b/src/test/items/dire_hit.test.ts @@ -72,7 +72,7 @@ describe("Items - Dire Hit", () => { await game.phaseInterceptor.to(BattleEndPhase); const modifier = game.scene.findModifier(m => m instanceof TempCritBoosterModifier) as TempCritBoosterModifier; - expect(modifier.getBattlesLeft()).toBe(4); + expect(modifier.getBattleCount()).toBe(4); // Forced DIRE_HIT to spawn in the first slot with override game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { @@ -90,7 +90,7 @@ describe("Items - Dire Hit", () => { for (const m of game.scene.modifiers) { if (m instanceof TempCritBoosterModifier) { count++; - expect((m as TempCritBoosterModifier).getBattlesLeft()).toBe(5); + expect((m as TempCritBoosterModifier).getBattleCount()).toBe(5); } } expect(count).toBe(1); diff --git a/src/test/items/double_battle_chance_booster.test.ts b/src/test/items/double_battle_chance_booster.test.ts new file mode 100644 index 00000000000..808d4c7ca51 --- /dev/null +++ b/src/test/items/double_battle_chance_booster.test.ts @@ -0,0 +1,105 @@ +import { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; +import { DoubleBattleChanceBoosterModifier } from "#app/modifier/modifier"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; +import { ShopCursorTarget } from "#app/enums/shop-cursor-target.js"; +import { Mode } from "#app/ui/ui.js"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler.js"; +import { Button } from "#app/enums/buttons.js"; + +describe("Items - Double Battle Chance Boosters", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const TIMEOUT = 20 * 1000; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + }); + + it("should guarantee double battle with 2 unique tiers", async () => { + game.override + .startingModifier([ + { name: "LURE" }, + { name: "SUPER_LURE" } + ]) + .startingWave(2); + + await game.classicMode.startBattle(); + + expect(game.scene.getEnemyField().length).toBe(2); + }, TIMEOUT); + + it("should guarantee double boss battle with 3 unique tiers", async () => { + game.override + .startingModifier([ + { name: "LURE" }, + { name: "SUPER_LURE" }, + { name: "MAX_LURE" } + ]) + .startingWave(10); + + await game.classicMode.startBattle(); + + const enemyField = game.scene.getEnemyField(); + + expect(enemyField.length).toBe(2); + expect(enemyField[0].isBoss()).toBe(true); + expect(enemyField[1].isBoss()).toBe(true); + }, TIMEOUT); + + it("should renew how many battles are left of existing booster when picking up new booster of same tier", async() => { + game.override + .startingModifier([{ name: "LURE" }]) + .itemRewards([{ name: "LURE" }]) + .moveset(SPLASH_ONLY) + .startingLevel(200); + + await game.classicMode.startBattle([ + Species.PIKACHU + ]); + + game.move.select(Moves.SPLASH); + + await game.doKillOpponents(); + + await game.phaseInterceptor.to("BattleEndPhase"); + + const modifier = game.scene.findModifier(m => m instanceof DoubleBattleChanceBoosterModifier) as DoubleBattleChanceBoosterModifier; + expect(modifier.getBattleCount()).toBe(9); + + // Forced LURE to spawn in the first slot with override + game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + // Traverse to first modifier slot + handler.setCursor(0); + handler.setRowCursor(ShopCursorTarget.REWARDS); + handler.processInput(Button.ACTION); + }, () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("NewBattlePhase"), true); + + await game.phaseInterceptor.to("TurnInitPhase"); + + // Making sure only one booster is in the modifier list even after picking up another + let count = 0; + for (const m of game.scene.modifiers) { + if (m instanceof DoubleBattleChanceBoosterModifier) { + count++; + const modifierInstance = m as DoubleBattleChanceBoosterModifier; + expect(modifierInstance.getBattleCount()).toBe(modifierInstance.getMaxBattles()); + } + } + expect(count).toBe(1); + }, TIMEOUT); +}); diff --git a/src/test/items/temp_stat_stage_booster.test.ts b/src/test/items/temp_stat_stage_booster.test.ts index c81703220db..3e32fa13a04 100644 --- a/src/test/items/temp_stat_stage_booster.test.ts +++ b/src/test/items/temp_stat_stage_booster.test.ts @@ -10,12 +10,7 @@ import { Abilities } from "#app/enums/abilities"; import { TempStatStageBoosterModifier } from "#app/modifier/modifier"; import { Mode } from "#app/ui/ui"; import { Button } from "#app/enums/buttons"; -import { CommandPhase } from "#app/phases/command-phase"; -import { NewBattlePhase } from "#app/phases/new-battle-phase"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; -import { TurnInitPhase } from "#app/phases/turn-init-phase"; -import { BattleEndPhase } from "#app/phases/battle-end-phase"; -import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; @@ -46,7 +41,7 @@ describe("Items - Temporary Stat Stage Boosters", () => { }); it("should provide a x1.3 stat stage multiplier", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU ]); @@ -56,7 +51,7 @@ describe("Items - Temporary Stat Stage Boosters", () => { game.move.select(Moves.TACKLE); - await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnEndPhase); + await game.phaseInterceptor.runFrom("EnemyCommandPhase").to(TurnEndPhase); expect(partyMember.getStatStageMultiplier).toHaveReturnedWith(1.3); }, 20000); @@ -66,7 +61,7 @@ describe("Items - Temporary Stat Stage Boosters", () => { .startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }]) .ability(Abilities.SIMPLE); - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU ]); @@ -89,7 +84,7 @@ describe("Items - Temporary Stat Stage Boosters", () => { it("should increase existing stat stage multiplier by 3/10 for the rest of the boosters", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU ]); @@ -113,7 +108,7 @@ describe("Items - Temporary Stat Stage Boosters", () => { it("should not increase past maximum stat stage multiplier", async() => { game.override.startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }, { name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]); - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU ]); @@ -138,7 +133,7 @@ describe("Items - Temporary Stat Stage Boosters", () => { .startingLevel(200) .itemRewards([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]); - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU ]); @@ -146,10 +141,10 @@ describe("Items - Temporary Stat Stage Boosters", () => { await game.doKillOpponents(); - await game.phaseInterceptor.to(BattleEndPhase); + await game.phaseInterceptor.to("BattleEndPhase"); const modifier = game.scene.findModifier(m => m instanceof TempStatStageBoosterModifier) as TempStatStageBoosterModifier; - expect(modifier.getBattlesLeft()).toBe(4); + expect(modifier.getBattleCount()).toBe(4); // Forced X_ATTACK to spawn in the first slot with override game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { @@ -158,16 +153,17 @@ describe("Items - Temporary Stat Stage Boosters", () => { handler.setCursor(0); handler.setRowCursor(ShopCursorTarget.REWARDS); handler.processInput(Button.ACTION); - }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(NewBattlePhase), true); + }, () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("NewBattlePhase"), true); - await game.phaseInterceptor.to(TurnInitPhase); + await game.phaseInterceptor.to("TurnInitPhase"); // Making sure only one booster is in the modifier list even after picking up another let count = 0; for (const m of game.scene.modifiers) { if (m instanceof TempStatStageBoosterModifier) { count++; - expect((m as TempStatStageBoosterModifier).getBattlesLeft()).toBe(5); + const modifierInstance = m as TempStatStageBoosterModifier; + expect(modifierInstance.getBattleCount()).toBe(modifierInstance.getMaxBattles()); } } expect(count).toBe(1); diff --git a/src/test/moves/dragon_cheer.test.ts b/src/test/moves/dragon_cheer.test.ts new file mode 100644 index 00000000000..747d71bd000 --- /dev/null +++ b/src/test/moves/dragon_cheer.test.ts @@ -0,0 +1,101 @@ +import { BattlerIndex } from "#app/battle"; +import { Type } from "#app/data/type"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Dragon Cheer", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const TIMEOUT = 20 * 1000; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("double") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(SPLASH_ONLY) + .enemyLevel(20) + .moveset([Moves.DRAGON_CHEER, Moves.TACKLE, Moves.SPLASH]); + }); + + it("increases the user's allies' critical hit ratio by one stage", async () => { + await game.classicMode.startBattle([Species.DRAGONAIR, Species.MAGIKARP]); + + const enemy = game.scene.getEnemyField()[0]; + + vi.spyOn(enemy, "getCritStage"); + + game.move.select(Moves.DRAGON_CHEER, 0); + game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + // After Tackle + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getCritStage).toHaveReturnedWith(1); // getCritStage is called on defender + }, TIMEOUT); + + it("increases the user's Dragon-type allies' critical hit ratio by two stages", async () => { + await game.classicMode.startBattle([Species.MAGIKARP, Species.DRAGONAIR]); + + const enemy = game.scene.getEnemyField()[0]; + + vi.spyOn(enemy, "getCritStage"); + + game.move.select(Moves.DRAGON_CHEER, 0); + game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + // After Tackle + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getCritStage).toHaveReturnedWith(2); // getCritStage is called on defender + }, TIMEOUT); + + it("applies the effect based on the allies' type upon use of the move, and do not change if the allies' type changes later in battle", async () => { + await game.classicMode.startBattle([Species.DRAGONAIR, Species.MAGIKARP]); + + const magikarp = game.scene.getPlayerField()[1]; + const enemy = game.scene.getEnemyField()[0]; + + vi.spyOn(enemy, "getCritStage"); + + game.move.select(Moves.DRAGON_CHEER, 0); + game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + // After Tackle + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getCritStage).toHaveReturnedWith(1); // getCritStage is called on defender + + await game.toNextTurn(); + + // Change Magikarp's type to Dragon + vi.spyOn(magikarp, "getTypes").mockReturnValue([Type.DRAGON]); + expect(magikarp.getTypes()).toEqual([Type.DRAGON]); + + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemy.getCritStage).toHaveReturnedWith(1); // getCritStage is called on defender + }, TIMEOUT); +}); diff --git a/src/test/moves/effectiveness.test.ts b/src/test/moves/effectiveness.test.ts index af44586b69d..d1903c79844 100644 --- a/src/test/moves/effectiveness.test.ts +++ b/src/test/moves/effectiveness.test.ts @@ -1,23 +1,32 @@ import { allMoves } from "#app/data/move"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { TrainerSlot } from "#app/data/trainer-config"; +import { Type } from "#app/data/type"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import * as Messages from "#app/messages"; +import { TerastallizeModifier } from "#app/modifier/modifier"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; function testMoveEffectiveness(game: GameManager, move: Moves, targetSpecies: Species, - expected: number, targetAbility: Abilities = Abilities.BALL_FETCH): void { + expected: number, targetAbility: Abilities = Abilities.BALL_FETCH, teraType?: Type): void { // Suppress getPokemonNameWithAffix because it calls on a null battle spec vi.spyOn(Messages, "getPokemonNameWithAffix").mockReturnValue(""); game.override.enemyAbility(targetAbility); + + if (teraType !== undefined) { + game.override.enemyHeldItems([{ name:"TERA_SHARD", type: teraType }]); + } + const user = game.scene.addPlayerPokemon(getPokemonSpecies(Species.SNORLAX), 5); const target = game.scene.addEnemyPokemon(getPokemonSpecies(targetSpecies), 5, TrainerSlot.NONE); expect(target.getMoveEffectiveness(user, allMoves[move])).toBe(expected); + user.destroy(); + target.destroy(); } describe("Moves - Type Effectiveness", () => { @@ -29,6 +38,8 @@ describe("Moves - Type Effectiveness", () => { type: Phaser.HEADLESS, }); game = new GameManager(phaserGame); + TerastallizeModifier.prototype.apply = (args) => true; + game.override.ability(Abilities.BALL_FETCH); }); @@ -67,4 +78,30 @@ describe("Moves - Type Effectiveness", () => { it("Electric-type attacks are negated by Volt Absorb", () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 0, Abilities.VOLT_ABSORB) ); + + it("Electric-type attacks are super-effective against Tera-Water Pokemon", + () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.EXCADRILL, 2, Abilities.BALL_FETCH, Type.WATER) + ); + + it("Powder moves have no effect on Grass-type Pokemon", + () => testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.AMOONGUSS, 0) + ); + + it("Powder moves have no effect on Tera-Grass Pokemon", + () => testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.SNORLAX, 0, Abilities.BALL_FETCH, Type.GRASS) + ); + + it("Prankster-boosted status moves have no effect on Dark-type Pokemon", + () => { + game.override.ability(Abilities.PRANKSTER); + testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.MIGHTYENA, 0); + } + ); + + it("Prankster-boosted status moves have no effect on Tera-Dark Pokemon", + () => { + game.override.ability(Abilities.PRANKSTER); + testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.SNORLAX, 0, Abilities.BALL_FETCH, Type.DARK); + } + ); }); diff --git a/src/test/moves/gigaton_hammer.test.ts b/src/test/moves/gigaton_hammer.test.ts index 9379e9d98b2..0162375cdb2 100644 --- a/src/test/moves/gigaton_hammer.test.ts +++ b/src/test/moves/gigaton_hammer.test.ts @@ -1,4 +1,4 @@ -import { BattlerIndex } from "#app/battle.js"; +import { BattlerIndex } from "#app/battle"; import GameManager from "#app/test/utils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index 1eac3c32bb4..5867ef751b8 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -1,13 +1,12 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; -import { DamagePhase } from "#app/phases/damage-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +const TIMEOUT = 20 * 1000; describe("Moves - Glaive Rush", () => { let phaserGame: Phaser.Game; @@ -25,131 +24,142 @@ describe("Moves - Glaive Rush", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single"); - game.override.disableCrits(); - game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset(Array(4).fill(Moves.GLAIVE_RUSH)); - game.override.starterSpecies(Species.KLINK); - game.override.ability(Abilities.UNNERVE); - game.override.passiveAbility(Abilities.FUR_COAT); - game.override.moveset([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); + game.override + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Array(4).fill(Moves.GLAIVE_RUSH)) + .starterSpecies(Species.KLINK) + .ability(Abilities.BALL_FETCH) + .moveset([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); }); it("takes double damage from attacks", async () => { - await game.startBattle(); + await game.classicMode.startBattle(); + const enemy = game.scene.getEnemyPokemon()!; enemy.hp = 1000; - vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(0); game.move.select(Moves.SHADOW_SNEAK); - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("DamagePhase"); const damageDealt = 1000 - enemy.hp; - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); game.move.select(Moves.SHADOW_SNEAK); - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("DamagePhase"); expect(enemy.hp).toBeLessThanOrEqual(1001 - (damageDealt * 3)); - }, 5000); // TODO: revert back to 20s + }, TIMEOUT); it("always gets hit by attacks", async () => { - await game.startBattle(); + await game.classicMode.startBattle(); + const enemy = game.scene.getEnemyPokemon()!; enemy.hp = 1000; allMoves[Moves.AVALANCHE].accuracy = 0; game.move.select(Moves.AVALANCHE); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(enemy.hp).toBeLessThan(1000); - }, 20000); + }, TIMEOUT); it("interacts properly with multi-lens", async () => { - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 2 }]); - game.override.enemyMoveset(Array(4).fill(Moves.AVALANCHE)); - await game.startBattle(); + game.override + .startingHeldItems([{ name: "MULTI_LENS", count: 2 }]) + .enemyMoveset(Array(4).fill(Moves.AVALANCHE)); + await game.classicMode.startBattle(); + const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; + enemy.hp = 1000; player.hp = 1000; allMoves[Moves.AVALANCHE].accuracy = 0; game.move.select(Moves.GLAIVE_RUSH); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBeLessThan(1000); player.hp = 1000; game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(1000); - }, 20000); + }, TIMEOUT); it("secondary effects only last until next move", async () => { game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)); - await game.startBattle(); + await game.classicMode.startBattle(); + const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; + enemy.hp = 1000; player.hp = 1000; allMoves[Moves.SHADOW_SNEAK].accuracy = 0; game.move.select(Moves.GLAIVE_RUSH); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(1000); game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); const damagedHp = player.hp; expect(player.hp).toBeLessThan(1000); game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(damagedHp); - }, 20000); + }, TIMEOUT); it("secondary effects are removed upon switching", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)); - game.override.starterSpecies(0); - await game.startBattle([Species.KLINK, Species.FEEBAS]); + game.override + .enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)) + .starterSpecies(0); + await game.classicMode.startBattle([Species.KLINK, Species.FEEBAS]); + const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; + enemy.hp = 1000; allMoves[Moves.SHADOW_SNEAK].accuracy = 0; game.move.select(Moves.GLAIVE_RUSH); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(player.getMaxHp()); game.doSwitchPokemon(1); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); game.doSwitchPokemon(1); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(player.getMaxHp()); - }, 20000); + }, TIMEOUT); it("secondary effects don't activate if move fails", async () => { game.override.moveset([Moves.SHADOW_SNEAK, Moves.PROTECT, Moves.SPLASH, Moves.GLAIVE_RUSH]); - await game.startBattle(); + await game.classicMode.startBattle(); + const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; + enemy.hp = 1000; player.hp = 1000; game.move.select(Moves.PROTECT); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); game.move.select(Moves.SHADOW_SNEAK); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); const damagedHP1 = 1000 - enemy.hp; enemy.hp = 1000; game.move.select(Moves.SHADOW_SNEAK); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); const damagedHP2 = 1000 - enemy.hp; expect(damagedHP2).toBeGreaterThanOrEqual((damagedHP1 * 2) - 1); - }, 20000); + }, TIMEOUT); }); diff --git a/src/test/moves/lunar_blessing.test.ts b/src/test/moves/lunar_blessing.test.ts index 73647716f06..92428c39029 100644 --- a/src/test/moves/lunar_blessing.test.ts +++ b/src/test/moves/lunar_blessing.test.ts @@ -1,5 +1,5 @@ -import { StatusEffect } from "#app/enums/status-effect.js"; -import { CommandPhase } from "#app/phases/command-phase.js"; +import { StatusEffect } from "#app/enums/status-effect"; +import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index f367fc70936..ade33aa1148 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -76,7 +76,7 @@ export default class GameManager { constructor(phaserGame: Phaser.Game, bypassLogin: boolean = true) { localStorage.clear(); ErrorInterceptor.getInstance().clear(); - BattleScene.prototype.randBattleSeedInt = (arg) => arg-1; + BattleScene.prototype.randBattleSeedInt = (range, min: number = 0) => min + range - 1; // This simulates a max roll this.gameWrapper = new GameWrapper(phaserGame, bypassLogin); this.scene = new BattleScene(); this.phaseInterceptor = new PhaseInterceptor(this.scene); diff --git a/src/test/utils/helpers/overridesHelper.ts b/src/test/utils/helpers/overridesHelper.ts index cc5f9018325..a42ef84b496 100644 --- a/src/test/utils/helpers/overridesHelper.ts +++ b/src/test/utils/helpers/overridesHelper.ts @@ -1,12 +1,12 @@ -import { StatusEffect } from "#app/data/status-effect.js"; +import { StatusEffect } from "#app/data/status-effect"; import { Weather, WeatherType } from "#app/data/weather"; -import { Abilities } from "#app/enums/abilities.js"; +import { Abilities } from "#app/enums/abilities"; import { Biome } from "#app/enums/biome"; -import { Moves } from "#app/enums/moves.js"; -import { Species } from "#app/enums/species.js"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; import * as GameMode from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode"; -import { ModifierOverride } from "#app/modifier/modifier-type.js"; +import { ModifierOverride } from "#app/modifier/modifier-type"; import Overrides from "#app/overrides"; import { vi } from "vitest"; import { GameManagerHelper } from "./gameManagerHelper"; diff --git a/src/test/utils/mocks/mocksContainer/mockContainer.ts b/src/test/utils/mocks/mocksContainer/mockContainer.ts index 5babd9e71b2..d2cdd852257 100644 --- a/src/test/utils/mocks/mocksContainer/mockContainer.ts +++ b/src/test/utils/mocks/mocksContainer/mockContainer.ts @@ -208,4 +208,5 @@ export default class MockContainer implements MockGameObject { return this.list; } + disableInteractive = vi.fn(); } diff --git a/src/test/utils/testUtils.ts b/src/test/utils/testUtils.ts index 378c3d23fde..2265cf8d79c 100644 --- a/src/test/utils/testUtils.ts +++ b/src/test/utils/testUtils.ts @@ -1,4 +1,4 @@ -import { Moves } from "#app/enums/moves.js"; +import { Moves } from "#app/enums/moves"; import i18next, { type ParseKeys } from "i18next"; import { vi } from "vitest"; diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index b8259af9f3d..a924d545852 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -1,4 +1,4 @@ -import { getPokemonNameWithAffix } from "#app/messages.js"; +import { getPokemonNameWithAffix } from "#app/messages"; import BattleScene from "../battle-scene"; import Pokemon from "../field/pokemon"; import { TextStyle, addTextObject } from "./text"; diff --git a/src/ui/admin-ui-handler.ts b/src/ui/admin-ui-handler.ts index 5c91a36ab64..c48138853fc 100644 --- a/src/ui/admin-ui-handler.ts +++ b/src/ui/admin-ui-handler.ts @@ -1,9 +1,9 @@ -import BattleScene from "#app/battle-scene.js"; +import BattleScene from "#app/battle-scene"; import { ModalConfig } from "./modal-ui-handler"; import { Mode } from "./ui"; import * as Utils from "../utils"; import { FormModalUiHandler } from "./form-modal-ui-handler"; -import { Button } from "#app/enums/buttons.js"; +import { Button } from "#app/enums/buttons"; export default class AdminUiHandler extends FormModalUiHandler { diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index 882c15d3d8c..42a2396e665 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -1,10 +1,10 @@ import { addTextObject, TextStyle } from "./text"; -import BattleScene from "#app/battle-scene.js"; -import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag.js"; -import { WeatherType } from "#app/data/weather.js"; -import { TerrainType } from "#app/data/terrain.js"; +import BattleScene from "#app/battle-scene"; +import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; +import { WeatherType } from "#app/data/weather"; +import { TerrainType } from "#app/data/terrain"; import { addWindow, WindowVariant } from "./ui-theme"; -import { ArenaEvent, ArenaEventType, TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena.js"; +import { ArenaEvent, ArenaEventType, TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena"; import { BattleSceneEventType, TurnEndEvent } from "../events/battle-scene"; import { ArenaTagType } from "#enums/arena-tag-type"; import TimeOfDayWidget from "./time-of-day-widget"; diff --git a/src/ui/ball-ui-handler.ts b/src/ui/ball-ui-handler.ts index 04691886d9c..332fe5f65b9 100644 --- a/src/ui/ball-ui-handler.ts +++ b/src/ui/ball-ui-handler.ts @@ -6,7 +6,7 @@ import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { addWindow } from "./ui-theme"; import {Button} from "#enums/buttons"; -import { CommandPhase } from "#app/phases/command-phase.js"; +import { CommandPhase } from "#app/phases/command-phase"; export default class BallUiHandler extends UiHandler { private pokeballSelectContainer: Phaser.GameObjects.Container; diff --git a/src/ui/battle-flyout.ts b/src/ui/battle-flyout.ts index 6204fa2f928..fe561b76c9f 100644 --- a/src/ui/battle-flyout.ts +++ b/src/ui/battle-flyout.ts @@ -1,13 +1,13 @@ import { default as Pokemon } from "../field/pokemon"; import { addTextObject, TextStyle } from "./text"; import * as Utils from "../utils"; -import BattleScene from "#app/battle-scene.js"; -import Move from "#app/data/move.js"; +import BattleScene from "#app/battle-scene"; +import Move from "#app/data/move"; import { BattleSceneEventType, BerryUsedEvent, MoveUsedEvent } from "../events/battle-scene"; import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { UiTheme } from "#enums/ui-theme"; -import { getPokemonNameWithAffix } from "#app/messages.js"; +import { getPokemonNameWithAffix } from "#app/messages"; /** Container for info about a {@linkcode Move} */ interface MoveInfo { diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 27ff923e9a3..764e71a8c3f 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -5,8 +5,8 @@ import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import i18next from "i18next"; import {Button} from "#enums/buttons"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import { CommandPhase } from "#app/phases/command-phase.js"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { CommandPhase } from "#app/phases/command-phase"; export enum Command { FIGHT = 0, diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts index 08d55b03cdb..4e1235c211d 100644 --- a/src/ui/dropdown.ts +++ b/src/ui/dropdown.ts @@ -1,5 +1,5 @@ -import BattleScene from "#app/battle-scene.js"; -import { SceneBase } from "#app/scene-base.js"; +import BattleScene from "#app/battle-scene"; +import { SceneBase } from "#app/scene-base"; import { addTextObject, TextStyle } from "./text"; import { addWindow, WindowVariant } from "./ui-theme"; import i18next from "i18next"; diff --git a/src/ui/egg-counter-container.ts b/src/ui/egg-counter-container.ts index a688b8b7efc..21cebf5d97e 100644 --- a/src/ui/egg-counter-container.ts +++ b/src/ui/egg-counter-container.ts @@ -1,7 +1,7 @@ -import BattleScene from "#app/battle-scene.js"; +import BattleScene from "#app/battle-scene"; import { addWindow } from "./ui-theme"; import { addTextObject, TextStyle } from "./text"; -import { EggCountChangedEvent, EggEventType } from "#app/events/egg.js"; +import { EggCountChangedEvent, EggEventType } from "#app/events/egg"; import EggHatchSceneHandler from "./egg-hatch-scene-handler"; /** diff --git a/src/ui/egg-hatch-scene-handler.ts b/src/ui/egg-hatch-scene-handler.ts index 733873b974e..7b01ef7a3a6 100644 --- a/src/ui/egg-hatch-scene-handler.ts +++ b/src/ui/egg-hatch-scene-handler.ts @@ -2,7 +2,7 @@ import BattleScene from "../battle-scene"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import {Button} from "#enums/buttons"; -import { EggHatchPhase } from "#app/phases/egg-hatch-phase.js"; +import { EggHatchPhase } from "#app/phases/egg-hatch-phase"; export default class EggHatchSceneHandler extends UiHandler { public eggHatchContainer: Phaser.GameObjects.Container; diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 4bbe88dabd9..60db9d19eef 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -5,11 +5,11 @@ import { Command } from "./command-ui-handler"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import * as Utils from "../utils"; -import { MoveCategory } from "#app/data/move.js"; +import { MoveCategory } from "#app/data/move"; import i18next from "i18next"; import {Button} from "#enums/buttons"; -import Pokemon, { PokemonMove } from "#app/field/pokemon.js"; -import { CommandPhase } from "#app/phases/command-phase.js"; +import Pokemon, { PokemonMove } from "#app/field/pokemon"; +import { CommandPhase } from "#app/phases/command-phase"; export default class FightUiHandler extends UiHandler { public static readonly MOVES_CONTAINER_NAME = "moves"; diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts index 31d7c562da2..aa0f575d398 100644 --- a/src/ui/filter-bar.ts +++ b/src/ui/filter-bar.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene.js"; +import BattleScene from "#app/battle-scene"; import { DropDown, DropDownType } from "./dropdown"; import { StarterContainer } from "./starter-container"; import { addTextObject, getTextColor, TextStyle } from "./text"; diff --git a/src/ui/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index 87b7730e8df..631b2e50b02 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -8,7 +8,21 @@ import { addTextObject, TextStyle } from "./text"; import { addWindow } from "./ui-theme"; import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +interface BuildInteractableImageOpts { + scale?: number; + x?: number; + y?: number; + origin?: { x: number; y: number }; +} + export default class LoginFormUiHandler extends FormModalUiHandler { + private readonly ERR_USERNAME: string = "invalid username"; + private readonly ERR_PASSWORD: string = "invalid password"; + private readonly ERR_ACCOUNT_EXIST: string = "account doesn't exist"; + private readonly ERR_PASSWORD_MATCH: string = "password doesn't match"; + private readonly ERR_NO_SAVES: string = "No save files found"; + private readonly ERR_TOO_MANY_SAVES: string = "Too many save files found"; + private googleImage: Phaser.GameObjects.Image; private discordImage: Phaser.GameObjects.Image; private usernameInfoImage: Phaser.GameObjects.Image; @@ -21,8 +35,23 @@ export default class LoginFormUiHandler extends FormModalUiHandler { } setup(): void { - super.setup(); + this.buildExternalPartyContainer(); + + this.infoContainer = this.scene.add.container(0, 0); + + this.usernameInfoImage = this.buildInteractableImage("settings_icon", "username-info-icon", { + x: 20, + scale: 0.5 + }); + + this.infoContainer.add(this.usernameInfoImage); + this.getUi().add(this.infoContainer); + this.infoContainer.setVisible(false); + this.infoContainer.disableInteractive(); + } + + private buildExternalPartyContainer() { this.externalPartyContainer = this.scene.add.container(0, 0); this.externalPartyContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 12, this.scene.game.canvas.height / 12), Phaser.Geom.Rectangle.Contains); this.externalPartyTitle = addTextObject(this.scene, 0, 4, "", TextStyle.SETTINGS_LABEL); @@ -31,23 +60,8 @@ export default class LoginFormUiHandler extends FormModalUiHandler { this.externalPartyContainer.add(this.externalPartyBg); this.externalPartyContainer.add(this.externalPartyTitle); - this.infoContainer = this.scene.add.container(0, 0); - this.infoContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 12, this.scene.game.canvas.height / 12), Phaser.Geom.Rectangle.Contains); - - const googleImage = this.scene.add.image(0, 0, "google"); - googleImage.setOrigin(0, 0); - googleImage.setScale(0.07); - googleImage.setInteractive(); - googleImage.setName("google-icon"); - this.googleImage = googleImage; - - const discordImage = this.scene.add.image(20, 0, "discord"); - discordImage.setOrigin(0, 0); - discordImage.setScale(0.07); - discordImage.setInteractive(); - discordImage.setName("discord-icon"); - - this.discordImage = discordImage; + this.googleImage = this.buildInteractableImage("google", "google-icon"); + this.discordImage = this.buildInteractableImage("discord", "discord-icon"); this.externalPartyContainer.add(this.googleImage); this.externalPartyContainer.add(this.discordImage); @@ -55,59 +69,52 @@ export default class LoginFormUiHandler extends FormModalUiHandler { this.externalPartyContainer.add(this.googleImage); this.externalPartyContainer.add(this.discordImage); this.externalPartyContainer.setVisible(false); - - const usernameInfoImage = this.scene.add.image(20, 0, "settings_icon"); - usernameInfoImage.setOrigin(0, 0); - usernameInfoImage.setScale(0.5); - usernameInfoImage.setInteractive(); - usernameInfoImage.setName("username-info-icon"); - this.usernameInfoImage = usernameInfoImage; - - this.infoContainer.add(this.usernameInfoImage); - this.getUi().add(this.infoContainer); - this.infoContainer.setVisible(false); } - getModalTitle(config?: ModalConfig): string { + override getModalTitle(_config?: ModalConfig): string { return i18next.t("menu:login"); } - getFields(config?: ModalConfig): string[] { + override getFields(_config?: ModalConfig): string[] { return [ i18next.t("menu:username"), i18next.t("menu:password") ]; } - getWidth(config?: ModalConfig): number { + override getWidth(_config?: ModalConfig): number { return 160; } - getMargin(config?: ModalConfig): [number, number, number, number] { + override getMargin(_config?: ModalConfig): [number, number, number, number] { return [ 0, 0, 48, 0 ]; } - getButtonLabels(config?: ModalConfig): string[] { + override getButtonLabels(_config?: ModalConfig): string[] { return [ i18next.t("menu:login"), i18next.t("menu:register")]; } - getReadableErrorMessage(error: string): string { + override getReadableErrorMessage(error: string): string { const colonIndex = error?.indexOf(":"); if (colonIndex > 0) { error = error.slice(0, colonIndex); } switch (error) { - case "invalid username": + case this.ERR_USERNAME: return i18next.t("menu:invalidLoginUsername"); - case "invalid password": + case this.ERR_PASSWORD: return i18next.t("menu:invalidLoginPassword"); - case "account doesn't exist": + case this.ERR_ACCOUNT_EXIST: return i18next.t("menu:accountNonExistent"); - case "password doesn't match": + case this.ERR_PASSWORD_MATCH: return i18next.t("menu:unmatchingPassword"); + case this.ERR_NO_SAVES: + return i18next.t("menu:noSaves"); + case this.ERR_TOO_MANY_SAVES: + return i18next.t("menu:tooManySaves"); } return super.getReadableErrorMessage(error); } - show(args: any[]): boolean { + override show(args: any[]): boolean { if (super.show(args)) { const config = args[0] as ModalConfig; @@ -148,17 +155,16 @@ export default class LoginFormUiHandler extends FormModalUiHandler { return false; } - clear() { + override clear() { super.clear(); this.externalPartyContainer.setVisible(false); this.infoContainer.setVisible(false); + this.setMouseCursorStyle("default"); //reset cursor - this.discordImage.off("pointerdown"); - this.googleImage.off("pointerdown"); - this.usernameInfoImage.off("pointerdown"); + [this.discordImage, this.googleImage, this.usernameInfoImage].forEach((img) => img.off("pointerdown")); } - processExternalProvider(config: ModalConfig) : void { + private processExternalProvider(config: ModalConfig) : void { this.externalPartyTitle.setText(i18next.t("menu:orUse") ?? ""); this.externalPartyTitle.setX(20+this.externalPartyTitle.text.length); this.externalPartyTitle.setVisible(true); @@ -205,6 +211,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler { label: dataKeys[i].replace(keyToFind, ""), handler: () => { this.scene.ui.revertMode(); + this.infoContainer.disableInteractive(); return true; } }); @@ -213,8 +220,13 @@ export default class LoginFormUiHandler extends FormModalUiHandler { options: options, delay: 1000 }); + this.infoContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width, this.scene.game.canvas.height), Phaser.Geom.Rectangle.Contains); } else { - return onFail("You have too many save files to use this"); + if (dataKeys.length > 2) { + return onFail(this.ERR_TOO_MANY_SAVES); + } else { + return onFail(this.ERR_NO_SAVES); + } } }); @@ -236,4 +248,21 @@ export default class LoginFormUiHandler extends FormModalUiHandler { alpha: 1 }); } + + private buildInteractableImage(texture: string, name: string, opts: BuildInteractableImageOpts = {}) { + const { + scale = 0.07, + x = 0, + y = 0, + origin = { x: 0, y: 0 } + } = opts; + const img = this.scene.add.image(x, y, texture); + img.setName(name); + img.setOrigin(origin.x, origin.y); + img.setScale(scale); + img.setInteractive(); + this.addInteractionHoverEffect(img); + + return img; + } } diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index cecdacc1eb9..5f586ec8db7 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -57,29 +57,35 @@ export abstract class ModalUiHandler extends UiHandler { const buttonLabels = this.getButtonLabels(); - const buttonTopMargin = this.getButtonTopMargin(); - for (const label of buttonLabels) { - const buttonLabel = addTextObject(this.scene, 0, 8, label, TextStyle.TOOLTIP_CONTENT); - buttonLabel.setOrigin(0.5, 0.5); - - const buttonBg = addWindow(this.scene, 0, 0, buttonLabel.getBounds().width + 8, 16, false, false, 0, 0, WindowVariant.THIN); - buttonBg.setOrigin(0.5, 0); - buttonBg.setInteractive(new Phaser.Geom.Rectangle(0, 0, buttonBg.width, buttonBg.height), Phaser.Geom.Rectangle.Contains); - - const buttonContainer = this.scene.add.container(0, buttonTopMargin); - - this.buttonBgs.push(buttonBg); - this.buttonContainers.push(buttonContainer); - - buttonContainer.add(buttonBg); - buttonContainer.add(buttonLabel); - this.modalContainer.add(buttonContainer); + this.addButton(label); } this.modalContainer.setVisible(false); } + private addButton(label: string) { + const buttonTopMargin = this.getButtonTopMargin(); + const buttonLabel = addTextObject(this.scene, 0, 8, label, TextStyle.TOOLTIP_CONTENT); + buttonLabel.setOrigin(0.5, 0.5); + + const buttonBg = addWindow(this.scene, 0, 0, buttonLabel.getBounds().width + 8, 16, false, false, 0, 0, WindowVariant.THIN); + buttonBg.setOrigin(0.5, 0); + buttonBg.setInteractive(new Phaser.Geom.Rectangle(0, 0, buttonBg.width, buttonBg.height), Phaser.Geom.Rectangle.Contains); + + const buttonContainer = this.scene.add.container(0, buttonTopMargin); + + this.buttonBgs.push(buttonBg); + this.buttonContainers.push(buttonContainer); + + buttonContainer.add(buttonBg); + buttonContainer.add(buttonLabel); + + this.addInteractionHoverEffect(buttonBg); + + this.modalContainer.add(buttonContainer); + } + show(args: any[]): boolean { if (args.length >= 1 && "buttonActions" in args[0]) { super.show(args); @@ -135,4 +141,20 @@ export abstract class ModalUiHandler extends UiHandler { this.buttonBgs.map(bg => bg.off("pointerdown")); } + + /** + * Adds a hover effect to a game object which changes the cursor to a `pointer` and tints it slighly + * @param gameObject the game object to add hover events/effects to + */ + protected addInteractionHoverEffect(gameObject: Phaser.GameObjects.Image | Phaser.GameObjects.NineSlice | Phaser.GameObjects.Sprite) { + gameObject.on("pointerover", () => { + this.setMouseCursorStyle("pointer"); + gameObject.setTint(0xbbbbbb); + }); + + gameObject.on("pointerout", () => { + this.setMouseCursorStyle("default"); + gameObject.clearTint(); + }); + } } diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 98a19402a2b..9e025dbe086 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -15,15 +15,15 @@ import { addWindow } from "./ui-theme"; import { SpeciesFormChangeItemTrigger, FormChangeItem } from "../data/pokemon-forms"; import { getVariantTint } from "#app/data/variant"; import {Button} from "#enums/buttons"; -import { applyChallenges, ChallengeType } from "#app/data/challenge.js"; +import { applyChallenges, ChallengeType } from "#app/data/challenge"; import MoveInfoOverlay from "./move-info-overlay"; import i18next from "i18next"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { getPokemonNameWithAffix } from "#app/messages.js"; -import { CommandPhase } from "#app/phases/command-phase.js"; -import { SelectModifierPhase } from "#app/phases/select-modifier-phase.js"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { CommandPhase } from "#app/phases/command-phase"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; const defaultMessage = i18next.t("partyUiHandler:choosePokemon"); diff --git a/src/ui/rename-form-ui-handler.ts b/src/ui/rename-form-ui-handler.ts index 33885509344..078177cafb1 100644 --- a/src/ui/rename-form-ui-handler.ts +++ b/src/ui/rename-form-ui-handler.ts @@ -1,7 +1,7 @@ import { FormModalUiHandler } from "./form-modal-ui-handler"; import { ModalConfig } from "./modal-ui-handler"; import i18next from "i18next"; -import { PlayerPokemon } from "#app/field/pokemon.js"; +import { PlayerPokemon } from "#app/field/pokemon"; export default class RenameFormUiHandler extends FormModalUiHandler { getModalTitle(config?: ModalConfig): string { diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index 7a183a11d29..d6bafb8599e 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -18,8 +18,7 @@ import { Type, getTypeRgb } from "../data/type"; import { TypeColor, TypeShadow } from "#app/enums/color"; import { getNatureStatMultiplier, getNatureName } from "../data/nature"; import { getVariantTint } from "#app/data/variant"; -import { PokemonHeldItemModifier, TerastallizeModifier } from "../modifier/modifier"; -import {modifierSortFunc} from "../modifier/modifier"; +import * as Modifier from "../modifier/modifier"; import { Species } from "#enums/species"; import { PlayerGender } from "#enums/player-gender"; @@ -68,7 +67,7 @@ export default class RunInfoUiHandler extends UiHandler { override async setup() { this.runContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); // The import of the modifiersModule is loaded here to sidestep async/await issues. - this.modifiersModule = await import("../modifier/modifier"); + this.modifiersModule = Modifier; this.runContainer.setVisible(false); } @@ -303,7 +302,7 @@ export default class RunInfoUiHandler extends UiHandler { const teraPokemon = {}; this.runInfo.enemyModifiers.forEach((m) => { const modifier = m.toModifier(this.scene, this.modifiersModule[m.className]); - if (modifier instanceof TerastallizeModifier) { + if (modifier instanceof Modifier.TerastallizeModifier) { const teraDetails = modifier?.getArgs(); const pkmnId = teraDetails[0]; teraPokemon[pkmnId] = teraDetails[1]; @@ -434,7 +433,7 @@ export default class RunInfoUiHandler extends UiHandler { modifierIconsContainer.setScale(0.45); for (const m of this.runInfo.modifiers) { const modifier = m.toModifier(this.scene, this.modifiersModule[m.className]); - if (modifier instanceof PokemonHeldItemModifier) { + if (modifier instanceof Modifier.PokemonHeldItemModifier) { continue; } const icon = modifier?.getIcon(this.scene, false); @@ -635,17 +634,17 @@ export default class RunInfoUiHandler extends UiHandler { // Endless/Endless Spliced have a different scale because Pokemon tend to accumulate more items in these runs. const heldItemsScale = (this.runInfo.gameMode === GameModes.SPLICED_ENDLESS || this.runInfo.gameMode === GameModes.ENDLESS) ? 0.25 : 0.5; const heldItemsContainer = this.scene.add.container(-82, 2); - const heldItemsList : PokemonHeldItemModifier[] = []; + const heldItemsList : Modifier.PokemonHeldItemModifier[] = []; if (this.runInfo.modifiers.length) { for (const m of this.runInfo.modifiers) { const modifier = m.toModifier(this.scene, this.modifiersModule[m.className]); - if (modifier instanceof PokemonHeldItemModifier && modifier.pokemonId === pokemon.id) { + if (modifier instanceof Modifier.PokemonHeldItemModifier && modifier.pokemonId === pokemon.id) { modifier.stackCount = m["stackCount"]; heldItemsList.push(modifier); } } if (heldItemsList.length > 0) { - (heldItemsList as PokemonHeldItemModifier[]).sort(modifierSortFunc); + (heldItemsList as Modifier.PokemonHeldItemModifier[]).sort(Modifier.modifierSortFunc); let row = 0; for (const [index, item] of heldItemsList.entries()) { if ( index > 36 ) { diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index e6ab0d3b3c3..89b20322a68 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -2,7 +2,7 @@ import i18next from "i18next"; import BattleScene from "../battle-scene"; import { Button } from "#enums/buttons"; import { GameMode } from "../game-mode"; -import { PokemonHeldItemModifier } from "../modifier/modifier"; +import * as Modifier from "../modifier/modifier"; import { SessionSaveData } from "../system/game-data"; import PokemonData from "../system/pokemon-data"; import * as Utils from "../utils"; @@ -306,14 +306,12 @@ class SessionSlot extends Phaser.GameObjects.Container { this.add(pokemonIconsContainer); - const modifiersModule = await import("../modifier/modifier"); - const modifierIconsContainer = this.scene.add.container(148, 30); modifierIconsContainer.setScale(0.5); let visibleModifierIndex = 0; for (const m of data.modifiers) { - const modifier = m.toModifier(this.scene, modifiersModule[m.className]); - if (modifier instanceof PokemonHeldItemModifier) { + const modifier = m.toModifier(this.scene, Modifier[m.className]); + if (modifier instanceof Modifier.PokemonHeldItemModifier) { continue; } const icon = modifier?.getIcon(this.scene, false); diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index f21f2ebcc9d..570377eab43 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -5,7 +5,7 @@ import { Mode } from "../ui"; import UiHandler from "../ui-handler"; import { addWindow } from "../ui-theme"; import {Button} from "#enums/buttons"; -import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler.js"; +import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler"; import NavigationMenu, {NavigationManager} from "#app/ui/settings/navigationMenu"; import { Setting, SettingKeys, SettingType } from "#app/system/settings/settings"; import i18next from "i18next"; diff --git a/src/ui/settings/move-touch-controls-handler.ts b/src/ui/settings/move-touch-controls-handler.ts index cf56bf47d3b..cff68fa523d 100644 --- a/src/ui/settings/move-touch-controls-handler.ts +++ b/src/ui/settings/move-touch-controls-handler.ts @@ -1,5 +1,5 @@ -import TouchControl from "#app/touch-controls.js"; -import UI from "#app/ui/ui.js"; +import TouchControl from "#app/touch-controls"; +import UI from "#app/ui/ui"; import { Scene } from "phaser"; export const TOUCH_CONTROL_POSITIONS_LANDSCAPE = "touchControlPositionsLandscape"; diff --git a/src/ui/settings/navigationMenu.ts b/src/ui/settings/navigationMenu.ts index 370b6f67c76..7d7761b7b69 100644 --- a/src/ui/settings/navigationMenu.ts +++ b/src/ui/settings/navigationMenu.ts @@ -1,6 +1,6 @@ import BattleScene from "#app/battle-scene"; import {Mode} from "#app/ui/ui"; -import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler.js"; +import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler"; import {addTextObject, setTextStyle, TextStyle} from "#app/ui/text"; import {addWindow} from "#app/ui/ui-theme"; import {Button} from "#enums/buttons"; diff --git a/src/ui/settings/settings-audio-ui-handler.ts b/src/ui/settings/settings-audio-ui-handler.ts index 4a895fc3170..86c6a9bce40 100644 --- a/src/ui/settings/settings-audio-ui-handler.ts +++ b/src/ui/settings/settings-audio-ui-handler.ts @@ -1,6 +1,6 @@ import BattleScene from "../../battle-scene"; import { Mode } from "../ui"; -"#app/inputs-controller.js"; +"#app/inputs-controller"; import AbstractSettingsUiHandler from "./abstract-settings-ui-handler"; import { SettingType } from "#app/system/settings/settings"; diff --git a/src/ui/settings/settings-display-ui-handler.ts b/src/ui/settings/settings-display-ui-handler.ts index 25dda6e9bfb..3d602c50a78 100644 --- a/src/ui/settings/settings-display-ui-handler.ts +++ b/src/ui/settings/settings-display-ui-handler.ts @@ -1,6 +1,6 @@ import BattleScene from "../../battle-scene"; import { Mode } from "../ui"; -"#app/inputs-controller.js"; +"#app/inputs-controller"; import AbstractSettingsUiHandler from "./abstract-settings-ui-handler"; import { SettingKeys, SettingType } from "#app/system/settings/settings"; diff --git a/src/ui/settings/settings-gamepad-ui-handler.ts b/src/ui/settings/settings-gamepad-ui-handler.ts index 902d7eff34e..63a9d2ab23b 100644 --- a/src/ui/settings/settings-gamepad-ui-handler.ts +++ b/src/ui/settings/settings-gamepad-ui-handler.ts @@ -12,7 +12,7 @@ import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; import pad_dualshock from "#app/configs/inputs/pad_dualshock"; import pad_unlicensedSNES from "#app/configs/inputs/pad_unlicensedSNES"; import {InterfaceConfig} from "#app/inputs-controller"; -import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler.js"; +import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler"; import {Device} from "#enums/devices"; import {truncateString} from "#app/utils"; import i18next from "i18next"; diff --git a/src/ui/settings/settings-keyboard-ui-handler.ts b/src/ui/settings/settings-keyboard-ui-handler.ts index dc6de8c90dc..7e020034bc6 100644 --- a/src/ui/settings/settings-keyboard-ui-handler.ts +++ b/src/ui/settings/settings-keyboard-ui-handler.ts @@ -9,7 +9,7 @@ import { settingKeyboardOptions } from "#app/system/settings/settings-keyboard"; import {reverseValueToKeySetting, truncateString} from "#app/utils"; -import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler.js"; +import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler"; import {InterfaceConfig} from "#app/inputs-controller"; import {addTextObject, TextStyle} from "#app/ui/text"; import {deleteBind} from "#app/configs/inputs/configHandler"; diff --git a/src/ui/time-of-day-widget.ts b/src/ui/time-of-day-widget.ts index 5d2f184e679..ea80a6e524a 100644 --- a/src/ui/time-of-day-widget.ts +++ b/src/ui/time-of-day-widget.ts @@ -1,5 +1,5 @@ import * as Utils from "../utils"; -import BattleScene from "#app/battle-scene.js"; +import BattleScene from "#app/battle-scene"; import { BattleSceneEventType } from "../events/battle-scene"; import { EaseType } from "#enums/ease-type"; import { TimeOfDay } from "#enums/time-of-day"; diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 3c25ed34d61..67a4f7260e6 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -5,7 +5,7 @@ import * as Utils from "../utils"; import { TextStyle, addTextObject, getTextStyleOptions } from "./text"; import { getBattleCountSplashMessage, getSplashMessages } from "../data/splash-messages"; import i18next from "i18next"; -import { TimedEventDisplay } from "#app/timed-event-manager.js"; +import { TimedEventDisplay } from "#app/timed-event-manager"; export default class TitleUiHandler extends OptionSelectUiHandler { private titleContainer: Phaser.GameObjects.Container; diff --git a/src/ui/ui-handler.ts b/src/ui/ui-handler.ts index 94625efaa75..d9f0a876b71 100644 --- a/src/ui/ui-handler.ts +++ b/src/ui/ui-handler.ts @@ -52,6 +52,15 @@ export default abstract class UiHandler { return changed; } + /** + * Changes the style of the mouse cursor. + * @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/cursor} + * @param cursorStyle cursor style to apply + */ + protected setMouseCursorStyle(cursorStyle: "pointer" | "default") { + this.scene.input.manager.canvas.style.cursor = cursorStyle; + } + clear() { this.active = false; } diff --git a/src/utils.ts b/src/utils.ts index 173ea25b17c..592981c7643 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,5 +1,5 @@ -import i18next from "i18next"; import { MoneyFormat } from "#enums/money-format"; +import i18next from "i18next"; export const MissingTextureKey = "__MISSING"; @@ -82,6 +82,12 @@ export function randInt(range: integer, min: integer = 0): integer { return Math.floor(Math.random() * range) + min; } +/** + * Generates a random number using the global seed, or the current battle's seed if called via `Battle.randSeedInt` + * @param range How large of a range of random numbers to choose from. If {@linkcode range} <= 1, returns {@linkcode min} + * @param min The minimum integer to pick, default `0` + * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) + */ export function randSeedInt(range: integer, min: integer = 0): integer { if (range <= 1) { return min; @@ -449,6 +455,26 @@ export function rgbaToInt(rgba: integer[]): integer { return (rgba[0] << 24) + (rgba[1] << 16) + (rgba[2] << 8) + rgba[3]; } +/** + * Provided valid HSV values, calculates and stitches together a string of that + * HSV color's corresponding hex code. + * + * Sourced from {@link https://stackoverflow.com/a/44134328}. + * @param h Hue in degrees, must be in a range of [0, 360] + * @param s Saturation percentage, must be in a range of [0, 1] + * @param l Ligthness percentage, must be in a range of [0, 1] + * @returns a string of the corresponding color hex code with a "#" prefix + */ +export function hslToHex(h: number, s: number, l: number): string { + const a = s * Math.min(l, 1 - l); + const f = (n: number) => { + const k = (n + h / 30) % 12; + const rgb = l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1)); + return Math.round(rgb * 255).toString(16).padStart(2, "0"); + }; + return `#${f(0)}${f(8)}${f(4)}`; +} + /*This function returns true if the current lang is available for some functions If the lang is not in the function, it usually means that lang is going to use the default english version This function is used in: diff --git a/vite.config.ts b/vite.config.ts index 8fa7d799f27..1fd85e2572f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -10,6 +10,7 @@ export const defaultConfig: UserConfig = { clearScreen: false, appType: "mpa", build: { + chunkSizeWarningLimit: 10000, minify: 'esbuild', sourcemap: false, rollupOptions: { diff --git a/vitest.config.ts b/vitest.config.ts index d1827103807..9a765a89ae7 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,38 +1,43 @@ -import { defineProject } from 'vitest/config'; +import { defineProject, UserWorkspaceConfig } from 'vitest/config'; import { defaultConfig } from './vite.config'; +export const defaultProjectTestConfig: UserWorkspaceConfig["test"] = { + setupFiles: ['./src/test/vitest.setup.ts'], + server: { + deps: { + inline: ['vitest-canvas-mock'], + //@ts-ignore + optimizer: { + web: { + include: ['vitest-canvas-mock'], + } + } + } + }, + environment: 'jsdom' as const, + environmentOptions: { + jsdom: { + resources: 'usable', + }, + }, + threads: false, + trace: true, + restoreMocks: true, + watch: false, + coverage: { + provider: 'istanbul' as const, + reportsDirectory: 'coverage' as const, + reporters: ['text-summary', 'html'], + }, +} + export default defineProject(({ mode }) => ({ ...defaultConfig, test: { + ...defaultProjectTestConfig, name: "main", include: ["./src/test/**/*.{test,spec}.ts"], exclude: ["./src/test/pre.test.ts"], - setupFiles: ['./src/test/vitest.setup.ts'], - server: { - deps: { - inline: ['vitest-canvas-mock'], - optimizer: { - web: { - include: ['vitest-canvas-mock'], - } - } - } - }, - environment: 'jsdom' as const, - environmentOptions: { - jsdom: { - resources: 'usable', - }, - }, - threads: false, - trace: true, - restoreMocks: true, - watch: false, - coverage: { - provider: 'istanbul' as const, - reportsDirectory: 'coverage' as const, - reporters: ['text-summary', 'html'], - }, }, esbuild: { pure: mode === 'production' ? [ 'console.log' ] : [], diff --git a/vitest.workspace.ts b/vitest.workspace.ts index 38121942004..a885b77dc9d 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -1,5 +1,6 @@ import { defineWorkspace } from "vitest/config"; import { defaultConfig } from "./vite.config"; +import { defaultProjectTestConfig } from "./vitest.config"; export default defineWorkspace([ { @@ -10,5 +11,58 @@ export default defineWorkspace([ environment: "jsdom", }, }, + { + ...defaultConfig, + test: { + ...defaultProjectTestConfig, + name: "misc", + include: [ + "src/test/achievements/**/*.{test,spec}.ts", + "src/test/arena/**/*.{test,spec}.ts", + "src/test/battlerTags/**/*.{test,spec}.ts", + "src/test/eggs/**/*.{test,spec}.ts", + "src/test/field/**/*.{test,spec}.ts", + "src/test/inputs/**/*.{test,spec}.ts", + "src/test/localization/**/*.{test,spec}.ts", + "src/test/phases/**/*.{test,spec}.ts", + "src/test/settingMenu/**/*.{test,spec}.ts", + "src/test/sprites/**/*.{test,spec}.ts", + "src/test/ui/**/*.{test,spec}.ts", + "src/test/*.{test,spec}.ts", + ], + }, + }, + { + ...defaultConfig, + test: { + ...defaultProjectTestConfig, + name: "abilities", + include: ["src/test/abilities/**/*.{test,spec}.ts"], + }, + }, + { + ...defaultConfig, + test: { + ...defaultProjectTestConfig, + name: "battle", + include: ["src/test/battle/**/*.{test,spec}.ts"], + }, + }, + { + ...defaultConfig, + test: { + ...defaultProjectTestConfig, + name: "items", + include: ["src/test/items/**/*.{test,spec}.ts"], + }, + }, + { + ...defaultConfig, + test: { + ...defaultProjectTestConfig, + name: "moves", + include: ["src/test/moves/**/*.{test,spec}.ts"], + }, + }, "./vitest.config.ts", ]);