Merge branch 'beta' into chilly-reception-msg

This commit is contained in:
Sirz Benjie 2025-05-21 19:22:43 -05:00 committed by GitHub
commit df3b386625
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 5066 additions and 3116 deletions

19
.github/test-filters.yml vendored Normal file
View File

@ -0,0 +1,19 @@
all:
- "src/**"
- "test/**"
- "public/**"
# Workflows that can impact tests
- ".github/workflows/test*.yml"
- ".github/test-filters.yml"
# top-level files
- "package*.json"
- ".nvrmc" # Updates to node version can break tests
- "vite*" # vite.config.ts, vite.vitest.config.ts, vitest.workspace.ts
- "tsconfig*.json" # tsconfig.json tweaking can impact compilation
- "global.d.ts"
- ".env*"
# Blanket negations for files that cannot impact tests
- "!**/*.py" # No .py files
- "!**/*.sh" # No .sh files
- "!**/*.md" # No .md files
- "!**/.git*" # .gitkeep and family

View File

@ -12,11 +12,16 @@ on:
totalShards: totalShards:
required: true required: true
type: number type: number
skip:
required: true
type: boolean
default: false
jobs: jobs:
test: test:
name: Shard ${{ inputs.shard }} of ${{ inputs.totalShards }} name: Shard ${{ inputs.shard }} of ${{ inputs.totalShards }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: ${{ !inputs.skip }}
steps: steps:
- name: Check out Git repository - name: Check out Git repository
uses: actions/checkout@v4.2.2 uses: actions/checkout@v4.2.2

View File

@ -7,58 +7,30 @@ on:
branches: branches:
- main # Trigger on push events to the main branch - main # Trigger on push events to the main branch
- beta # Trigger on push events to the beta branch - beta # Trigger on push events to the beta branch
- release # Trigger on push events to the release branch
# go upvote https://github.com/actions/runner/issues/1182 and yell at microsoft until they fix this or ditch yml for workflows
paths:
# src and test files
- "src/**"
- "test/**"
- "public/**"
# Workflows that can impact tests
- ".github/workflows/test*.yml"
# top-level files
- "package*.json"
- ".nvrmc" # Updates to node version can break tests
- "vite.*.ts" # vite.config.ts, vite.vitest.config.ts, vitest.workspace.ts
- "tsconfig*.json" # tsconfig.json tweaking can impact compilation
- "global.d.ts"
- ".env.*"
# Blanket negations for files that cannot impact tests
- "!**/*.py" # No .py files
- "!**/*.sh" # No .sh files
- "!**/*.md" # No .md files
- "!**/.git*" # .gitkeep and family
pull_request: pull_request:
branches: branches:
- main # Trigger on pull request events targeting the main branch - main # Trigger on pull request events targeting the main branch
- beta # Trigger on pull request events targeting the beta branch - beta # Trigger on pull request events targeting the beta branch
- release # Trigger on pull request events targeting the release branch
paths: # go upvote https://github.com/actions/runner/issues/1182 and yell at microsoft because until then we have to duplicate this
# src and test files
- "src/**"
- "test/**"
- "public/**"
# Workflows that can impact tests
- ".github/workflows/test*.yml"
# top-level files
- "package*.json"
- ".nvrmc" # Updates to node version can break tests
- "vite*" # vite.config.ts, vite.vitest.config.ts, vitest.workspace.ts
- "tsconfig*.json" # tsconfig.json tweaking can impact compilation
- "global.d.ts"
- ".env.*"
# Blanket negations for files that cannot impact tests
- "!**/*.py" # No .py files
- "!**/*.sh" # No .sh files
- "!**/*.md" # No .md files
- "!**/.git*" # .gitkeep and family
merge_group: merge_group:
types: [checks_requested] types: [checks_requested]
jobs: jobs:
check-path-change-filter:
runs-on: ubuntu-latest
permissions:
pull-requests: read
outputs:
all: ${{ steps.filter.outputs.all }}
steps:
- name: checkout
uses: actions/checkout@v4
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36
with:
filters: .github/test-filters.yml
run-tests: run-tests:
name: Run Tests name: Run Tests
needs: check-path-change-filter
strategy: strategy:
matrix: matrix:
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
@ -67,3 +39,4 @@ jobs:
project: main project: main
shard: ${{ matrix.shard }} shard: ${{ matrix.shard }}
totalShards: 10 totalShards: 10
skip: ${{ needs.check-path-change-filter.outputs.all == 'false'}}

View File

@ -542,6 +542,79 @@
"volume": 100, "volume": 100,
"pitch": 55, "pitch": 55,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
},
{
"frameIndex": 0,
"resourceName": "PRAS- Sandstorm",
"bgX": -50,
"bgY": 0,
"opacity": 0,
"duration": 5,
"eventType": "AnimTimedAddBgEvent"
},
{
"frameIndex": 0,
"resourceName": "",
"bgX": -50,
"bgY": 0,
"opacity": 96,
"duration": 3,
"eventType": "AnimTimedUpdateBgEvent"
}
],
"3": [
{
"frameIndex": 3,
"resourceName": "",
"bgX": -25,
"bgY": 0,
"opacity": 128,
"duration": 3,
"eventType": "AnimTimedUpdateBgEvent"
}
],
"6": [
{
"frameIndex": 6,
"resourceName": "",
"bgX": 0,
"bgY": 0,
"opacity": 192,
"duration": 3,
"eventType": "AnimTimedUpdateBgEvent"
}
],
"9": [
{
"frameIndex": 9,
"resourceName": "",
"bgX": 25,
"bgY": 0,
"opacity": 128,
"duration": 3,
"eventType": "AnimTimedUpdateBgEvent"
}
],
"12": [
{
"frameIndex": 12,
"resourceName": "",
"bgX": 50,
"bgY": 0,
"opacity": 96,
"duration": 3,
"eventType": "AnimTimedUpdateBgEvent"
}
],
"15": [
{
"frameIndex": 15,
"resourceName": "",
"bgX": 50,
"bgY": 0,
"opacity": 0,
"duration": 3,
"eventType": "AnimTimedUpdateBgEvent"
} }
] ]
}, },

View File

@ -179,8 +179,6 @@
"483-origin", "483-origin",
"484-origin", "484-origin",
"484-origin", "484-origin",
"487-origin",
"487-origin",
"531-mega", "531-mega",
"531-mega", "531-mega",
"569-gigantamax", "569-gigantamax",
@ -1293,8 +1291,6 @@
"483b-origin", "483b-origin",
"484b-origin", "484b-origin",
"484b-origin", "484b-origin",
"487b-origin",
"487b-origin",
"531b-mega", "531b-mega",
"531b-mega", "531b-mega",
"569b-gigantamax", "569b-gigantamax",
@ -2407,8 +2403,6 @@
"483sb-origin", "483sb-origin",
"484sb-origin", "484sb-origin",
"484sb-origin", "484sb-origin",
"487sb-origin",
"487sb-origin",
"531sb-mega", "531sb-mega",
"531sb-mega", "531sb-mega",
"569sb-gigantamax", "569sb-gigantamax",
@ -3526,8 +3520,6 @@
"483s-origin", "483s-origin",
"484s-origin", "484s-origin",
"484s-origin", "484s-origin",
"487s-origin",
"487s-origin",
"531s-mega", "531s-mega",
"531s-mega", "531s-mega",
"569s-gigantamax", "569s-gigantamax",

View File

@ -1,566 +0,0 @@
{
"textures": [
{
"image": "487-origin.png",
"format": "RGBA8888",
"size": {
"w": 318,
"h": 318
},
"scale": 1,
"frames": [
{
"filename": "0023.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 8,
"w": 91,
"h": 77
},
"frame": {
"x": 0,
"y": 0,
"w": 91,
"h": 77
}
},
{
"filename": "0024.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 8,
"w": 91,
"h": 77
},
"frame": {
"x": 0,
"y": 0,
"w": 91,
"h": 77
}
},
{
"filename": "0020.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 9,
"w": 91,
"h": 74
},
"frame": {
"x": 91,
"y": 0,
"w": 91,
"h": 74
}
},
{
"filename": "0021.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 10,
"w": 91,
"h": 74
},
"frame": {
"x": 91,
"y": 0,
"w": 91,
"h": 74
}
},
{
"filename": "0022.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 10,
"w": 91,
"h": 74
},
"frame": {
"x": 91,
"y": 0,
"w": 91,
"h": 74
}
},
{
"filename": "0017.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 6,
"w": 89,
"h": 75
},
"frame": {
"x": 182,
"y": 0,
"w": 89,
"h": 75
}
},
{
"filename": "0018.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 7,
"w": 89,
"h": 75
},
"frame": {
"x": 182,
"y": 0,
"w": 89,
"h": 75
}
},
{
"filename": "0019.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 7,
"w": 89,
"h": 75
},
"frame": {
"x": 182,
"y": 0,
"w": 89,
"h": 75
}
},
{
"filename": "0025.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 3,
"y": 7,
"w": 86,
"h": 79
},
"frame": {
"x": 91,
"y": 74,
"w": 86,
"h": 79
}
},
{
"filename": "0026.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 3,
"y": 8,
"w": 86,
"h": 79
},
"frame": {
"x": 91,
"y": 74,
"w": 86,
"h": 79
}
},
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 3,
"y": 1,
"w": 85,
"h": 83
},
"frame": {
"x": 0,
"y": 77,
"w": 85,
"h": 83
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 3,
"y": 0,
"w": 85,
"h": 83
},
"frame": {
"x": 0,
"y": 77,
"w": 85,
"h": 83
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 3,
"y": 0,
"w": 85,
"h": 82
},
"frame": {
"x": 177,
"y": 75,
"w": 85,
"h": 82
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 4,
"y": 2,
"w": 83,
"h": 83
},
"frame": {
"x": 85,
"y": 153,
"w": 83,
"h": 83
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 4,
"y": 1,
"w": 83,
"h": 83
},
"frame": {
"x": 85,
"y": 153,
"w": 83,
"h": 83
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 6,
"y": 5,
"w": 80,
"h": 82
},
"frame": {
"x": 0,
"y": 236,
"w": 80,
"h": 82
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 6,
"y": 4,
"w": 80,
"h": 82
},
"frame": {
"x": 0,
"y": 236,
"w": 80,
"h": 82
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 6,
"y": 3,
"w": 80,
"h": 82
},
"frame": {
"x": 0,
"y": 236,
"w": 80,
"h": 82
}
},
{
"filename": "0015.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 2,
"y": 4,
"w": 83,
"h": 76
},
"frame": {
"x": 0,
"y": 160,
"w": 83,
"h": 76
}
},
{
"filename": "0016.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 2,
"y": 5,
"w": 83,
"h": 76
},
"frame": {
"x": 0,
"y": 160,
"w": 83,
"h": 76
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 5,
"y": 6,
"w": 81,
"h": 81
},
"frame": {
"x": 80,
"y": 236,
"w": 81,
"h": 81
}
},
{
"filename": "0001.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 5,
"y": 7,
"w": 81,
"h": 80
},
"frame": {
"x": 161,
"y": 236,
"w": 81,
"h": 80
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 5,
"y": 7,
"w": 81,
"h": 80
},
"frame": {
"x": 161,
"y": 236,
"w": 81,
"h": 80
}
},
{
"filename": "0012.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 5,
"y": 3,
"w": 81,
"h": 79
},
"frame": {
"x": 168,
"y": 157,
"w": 81,
"h": 79
}
},
{
"filename": "0013.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 5,
"y": 2,
"w": 81,
"h": 79
},
"frame": {
"x": 168,
"y": 157,
"w": 81,
"h": 79
}
},
{
"filename": "0014.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 5,
"y": 2,
"w": 81,
"h": 79
},
"frame": {
"x": 168,
"y": 157,
"w": 81,
"h": 79
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:f669baef18fc6ae83124ad81c9b726f9:b705ee5bfe7dc7d92c348ffa4a4d6ce2:5d19509f6557fe13b0b6311434ba7e2d$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 900 B

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,566 +0,0 @@
{
"textures": [
{
"image": "487-origin.png",
"format": "RGBA8888",
"size": {
"w": 326,
"h": 326
},
"scale": 1,
"frames": [
{
"filename": "0007.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 2,
"y": 2,
"w": 95,
"h": 84
},
"frame": {
"x": 0,
"y": 0,
"w": 95,
"h": 84
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 2,
"y": 1,
"w": 95,
"h": 84
},
"frame": {
"x": 0,
"y": 0,
"w": 95,
"h": 84
}
},
{
"filename": "0023.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 2,
"y": 7,
"w": 97,
"h": 79
},
"frame": {
"x": 0,
"y": 84,
"w": 97,
"h": 79
}
},
{
"filename": "0024.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 2,
"y": 7,
"w": 97,
"h": 79
},
"frame": {
"x": 0,
"y": 84,
"w": 97,
"h": 79
}
},
{
"filename": "0020.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 4,
"y": 6,
"w": 97,
"h": 78
},
"frame": {
"x": 95,
"y": 0,
"w": 97,
"h": 78
}
},
{
"filename": "0021.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 4,
"y": 7,
"w": 97,
"h": 78
},
"frame": {
"x": 95,
"y": 0,
"w": 97,
"h": 78
}
},
{
"filename": "0022.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 4,
"y": 7,
"w": 97,
"h": 78
},
"frame": {
"x": 95,
"y": 0,
"w": 97,
"h": 78
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 1,
"y": 4,
"w": 94,
"h": 84
},
"frame": {
"x": 97,
"y": 78,
"w": 94,
"h": 84
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 1,
"y": 3,
"w": 94,
"h": 84
},
"frame": {
"x": 97,
"y": 78,
"w": 94,
"h": 84
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 94,
"h": 84
},
"frame": {
"x": 97,
"y": 78,
"w": 94,
"h": 84
}
},
{
"filename": "0025.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 1,
"y": 6,
"w": 95,
"h": 81
},
"frame": {
"x": 97,
"y": 162,
"w": 95,
"h": 81
}
},
{
"filename": "0026.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 1,
"y": 7,
"w": 95,
"h": 81
},
"frame": {
"x": 97,
"y": 162,
"w": 95,
"h": 81
}
},
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 4,
"y": 1,
"w": 94,
"h": 84
},
"frame": {
"x": 191,
"y": 78,
"w": 94,
"h": 84
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 4,
"y": 0,
"w": 94,
"h": 84
},
"frame": {
"x": 191,
"y": 78,
"w": 94,
"h": 84
}
},
{
"filename": "0017.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 5,
"y": 5,
"w": 94,
"h": 77
},
"frame": {
"x": 192,
"y": 0,
"w": 94,
"h": 77
}
},
{
"filename": "0018.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 5,
"y": 6,
"w": 94,
"h": 77
},
"frame": {
"x": 192,
"y": 0,
"w": 94,
"h": 77
}
},
{
"filename": "0019.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 5,
"y": 6,
"w": 94,
"h": 77
},
"frame": {
"x": 192,
"y": 0,
"w": 94,
"h": 77
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 4,
"y": 0,
"w": 94,
"h": 83
},
"frame": {
"x": 0,
"y": 163,
"w": 94,
"h": 83
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 0,
"y": 5,
"w": 92,
"h": 83
},
"frame": {
"x": 192,
"y": 162,
"w": 92,
"h": 83
}
},
{
"filename": "0001.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 0,
"y": 6,
"w": 92,
"h": 82
},
"frame": {
"x": 94,
"y": 243,
"w": 92,
"h": 82
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 0,
"y": 6,
"w": 92,
"h": 82
},
"frame": {
"x": 94,
"y": 243,
"w": 92,
"h": 82
}
},
{
"filename": "0015.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 7,
"y": 3,
"w": 90,
"h": 78
},
"frame": {
"x": 0,
"y": 246,
"w": 90,
"h": 78
}
},
{
"filename": "0016.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 7,
"y": 4,
"w": 90,
"h": 78
},
"frame": {
"x": 0,
"y": 246,
"w": 90,
"h": 78
}
},
{
"filename": "0012.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 5,
"y": 2,
"w": 91,
"h": 81
},
"frame": {
"x": 186,
"y": 245,
"w": 91,
"h": 81
}
},
{
"filename": "0013.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 5,
"y": 1,
"w": 91,
"h": 81
},
"frame": {
"x": 186,
"y": 245,
"w": 91,
"h": 81
}
},
{
"filename": "0014.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 5,
"y": 1,
"w": 91,
"h": 81
},
"frame": {
"x": 186,
"y": 245,
"w": 91,
"h": 81
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:d1a63c2aac4c99e778e6efb9fa120e53:11f49886c328fc8474daefc2533a7f5d:5d19509f6557fe13b0b6311434ba7e2d$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,293 +0,0 @@
{
"textures": [
{
"image": "487-origin.png",
"format": "RGBA8888",
"size": {
"w": 326,
"h": 326
},
"scale": 1,
"frames": [
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 2,
"y": 2,
"w": 95,
"h": 84
},
"frame": {
"x": 0,
"y": 0,
"w": 95,
"h": 84
}
},
{
"filename": "0012.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 2,
"y": 7,
"w": 97,
"h": 79
},
"frame": {
"x": 0,
"y": 84,
"w": 97,
"h": 79
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 4,
"y": 7,
"w": 97,
"h": 78
},
"frame": {
"x": 95,
"y": 0,
"w": 97,
"h": 78
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 1,
"y": 3,
"w": 94,
"h": 84
},
"frame": {
"x": 97,
"y": 78,
"w": 94,
"h": 84
}
},
{
"filename": "0013.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 1,
"y": 6,
"w": 95,
"h": 81
},
"frame": {
"x": 97,
"y": 162,
"w": 95,
"h": 81
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 4,
"y": 1,
"w": 94,
"h": 84
},
"frame": {
"x": 191,
"y": 78,
"w": 94,
"h": 84
}
},
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 5,
"y": 5,
"w": 94,
"h": 77
},
"frame": {
"x": 192,
"y": 0,
"w": 94,
"h": 77
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 5,
"y": 6,
"w": 94,
"h": 77
},
"frame": {
"x": 192,
"y": 0,
"w": 94,
"h": 77
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 4,
"y": 0,
"w": 94,
"h": 83
},
"frame": {
"x": 0,
"y": 163,
"w": 94,
"h": 83
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 0,
"y": 5,
"w": 92,
"h": 83
},
"frame": {
"x": 192,
"y": 162,
"w": 92,
"h": 83
}
},
{
"filename": "0001.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 0,
"y": 6,
"w": 92,
"h": 82
},
"frame": {
"x": 94,
"y": 243,
"w": 92,
"h": 82
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 7,
"y": 3,
"w": 90,
"h": 78
},
"frame": {
"x": 0,
"y": 246,
"w": 90,
"h": 78
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 88
},
"spriteSourceSize": {
"x": 5,
"y": 1,
"w": 91,
"h": 81
},
"frame": {
"x": 186,
"y": 245,
"w": 91,
"h": 81
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:47e13c1a7a77825c7cf7e9fb039c2587:68949a6c55126e61a0a82829cd6ac5a8:5d19509f6557fe13b0b6311434ba7e2d$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,293 +0,0 @@
{
"textures": [
{
"image": "487-origin.png",
"format": "RGBA8888",
"size": {
"w": 318,
"h": 318
},
"scale": 1,
"frames": [
{
"filename": "0012.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 8,
"w": 91,
"h": 77
},
"frame": {
"x": 0,
"y": 0,
"w": 91,
"h": 77
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 10,
"w": 91,
"h": 74
},
"frame": {
"x": 91,
"y": 0,
"w": 91,
"h": 74
}
},
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 6,
"w": 89,
"h": 75
},
"frame": {
"x": 182,
"y": 0,
"w": 89,
"h": 75
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 7,
"w": 89,
"h": 75
},
"frame": {
"x": 182,
"y": 0,
"w": 89,
"h": 75
}
},
{
"filename": "0013.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 3,
"y": 7,
"w": 86,
"h": 79
},
"frame": {
"x": 91,
"y": 74,
"w": 86,
"h": 79
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 3,
"y": 1,
"w": 85,
"h": 83
},
"frame": {
"x": 0,
"y": 77,
"w": 85,
"h": 83
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 3,
"y": 0,
"w": 85,
"h": 82
},
"frame": {
"x": 177,
"y": 75,
"w": 85,
"h": 82
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 4,
"y": 2,
"w": 83,
"h": 83
},
"frame": {
"x": 85,
"y": 153,
"w": 83,
"h": 83
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 6,
"y": 4,
"w": 80,
"h": 82
},
"frame": {
"x": 0,
"y": 236,
"w": 80,
"h": 82
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 2,
"y": 4,
"w": 83,
"h": 76
},
"frame": {
"x": 0,
"y": 160,
"w": 83,
"h": 76
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 5,
"y": 6,
"w": 81,
"h": 81
},
"frame": {
"x": 80,
"y": 236,
"w": 81,
"h": 81
}
},
{
"filename": "0001.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 5,
"y": 7,
"w": 81,
"h": 80
},
"frame": {
"x": 161,
"y": 236,
"w": 81,
"h": 80
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 91,
"h": 87
},
"spriteSourceSize": {
"x": 5,
"y": 2,
"w": 81,
"h": 79
},
"frame": {
"x": 168,
"y": 157,
"w": 81,
"h": 79
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:00abebb007c47ada81d4e754581d7146:4691e19364eb9392dbee1ee37d737c8b:5d19509f6557fe13b0b6311434ba7e2d$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 868 B

After

Width:  |  Height:  |  Size: 1.5 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -8,11 +8,11 @@ export type SignatureSpecies = {
* The signature species for each Gym Leader, Elite Four member, and Champion. * The signature species for each Gym Leader, Elite Four member, and Champion.
* The key is the trainer type, and the value is an array of Species or Species arrays. * The key is the trainer type, and the value is an array of Species or Species arrays.
* This is in a separate const so it can be accessed from other places and not just the trainerConfigs * This is in a separate const so it can be accessed from other places and not just the trainerConfigs
* *
* @remarks * @remarks
* The `Proxy` object allows us to define a handler that will intercept * The `Proxy` object allows us to define a handler that will intercept
* the property access and return an empty array if the property does not exist in the object. * the property access and return an empty array if the property does not exist in the object.
* *
* This means that accessing `signatureSpecies` will not throw an error if the property does not exist, * This means that accessing `signatureSpecies` will not throw an error if the property does not exist,
* but instead default to an empty array. * but instead default to an empty array.
*/ */

View File

@ -19057,8 +19057,15 @@ export const tmSpecies: TmSpecies = {
Species.SLAKING, Species.SLAKING,
Species.HARIYAMA, Species.HARIYAMA,
Species.NOSEPASS, Species.NOSEPASS,
Species.ARON,
Species.LAIRON,
Species.AGGRON,
Species.ELECTRIKE,
Species.MANECTRIC,
Species.GULPIN, Species.GULPIN,
Species.SWALOT, Species.SWALOT,
Species.WAILMER,
Species.WAILORD,
Species.NUMEL, Species.NUMEL,
Species.CAMERUPT, Species.CAMERUPT,
Species.TORKOAL, Species.TORKOAL,
@ -19067,18 +19074,28 @@ export const tmSpecies: TmSpecies = {
Species.ZANGOOSE, Species.ZANGOOSE,
Species.SEVIPER, Species.SEVIPER,
Species.WHISCASH, Species.WHISCASH,
Species.LILEEP,
Species.CRADILY,
Species.ANORITH,
Species.ARMALDO,
Species.SHUPPET, Species.SHUPPET,
Species.BANETTE, Species.BANETTE,
Species.DUSKULL, Species.DUSKULL,
Species.DUSCLOPS, Species.DUSCLOPS,
Species.TROPIUS, Species.TROPIUS,
Species.CHIMECHO, Species.CHIMECHO,
Species.ABSOL,
Species.SPHEAL,
Species.SEALEO,
Species.WALREIN,
Species.REGIROCK, Species.REGIROCK,
Species.REGICE, Species.REGICE,
Species.REGISTEEL, Species.REGISTEEL,
Species.TURTWIG, Species.TURTWIG,
Species.GROTLE, Species.GROTLE,
Species.TORTERRA, Species.TORTERRA,
Species.BIDOOF,
Species.BIBAREL,
Species.CRANIDOS, Species.CRANIDOS,
Species.RAMPARDOS, Species.RAMPARDOS,
Species.SHIELDON, Species.SHIELDON,
@ -19120,6 +19137,11 @@ export const tmSpecies: TmSpecies = {
Species.TEPIG, Species.TEPIG,
Species.PIGNITE, Species.PIGNITE,
Species.EMBOAR, Species.EMBOAR,
Species.MUNNA,
Species.MUSHARNA,
Species.ROGGENROLA,
Species.BOLDORE,
Species.GIGALITH,
Species.DRILBUR, Species.DRILBUR,
Species.EXCADRILL, Species.EXCADRILL,
Species.TIMBURR, Species.TIMBURR,
@ -19128,28 +19150,44 @@ export const tmSpecies: TmSpecies = {
Species.SANDILE, Species.SANDILE,
Species.KROKOROK, Species.KROKOROK,
Species.KROOKODILE, Species.KROOKODILE,
Species.DWEBBLE,
Species.CRUSTLE,
Species.SCRAGGY, Species.SCRAGGY,
Species.SCRAFTY, Species.SCRAFTY,
Species.YAMASK, Species.YAMASK,
Species.COFAGRIGUS, Species.COFAGRIGUS,
Species.TRUBBISH,
Species.GARBODOR,
Species.SAWSBUCK, Species.SAWSBUCK,
Species.FERROSEED,
Species.FERROTHORN,
Species.LITWICK, Species.LITWICK,
Species.LAMPENT, Species.LAMPENT,
Species.CHANDELURE, Species.CHANDELURE,
Species.BEARTIC, Species.BEARTIC,
Species.SHELMET,
Species.ACCELGOR,
Species.STUNFISK,
Species.GOLETT, Species.GOLETT,
Species.GOLURK, Species.GOLURK,
Species.HEATMOR,
Species.CHESPIN, Species.CHESPIN,
Species.QUILLADIN, Species.QUILLADIN,
Species.CHESNAUGHT, Species.CHESNAUGHT,
Species.TYRUNT,
Species.TYRANTRUM,
Species.SYLVEON, Species.SYLVEON,
Species.GOOMY, Species.GOOMY,
Species.SLIGGOO, Species.SLIGGOO,
Species.GOODRA, Species.GOODRA,
Species.PHANTUMP, Species.PHANTUMP,
Species.TREVENANT, Species.TREVENANT,
Species.PUMPKABOO,
Species.GOURGEIST,
Species.BERGMITE, Species.BERGMITE,
Species.AVALUGG, Species.AVALUGG,
Species.ROWLET,
Species.DARTRIX,
Species.DECIDUEYE, Species.DECIDUEYE,
Species.GUMSHOOS, Species.GUMSHOOS,
Species.MUDBRAY, Species.MUDBRAY,
@ -19157,7 +19195,9 @@ export const tmSpecies: TmSpecies = {
Species.PASSIMIAN, Species.PASSIMIAN,
Species.SANDYGAST, Species.SANDYGAST,
Species.PALOSSAND, Species.PALOSSAND,
Species.PYUKUMUKU,
Species.KOMALA, Species.KOMALA,
Species.TURTONATOR,
Species.MIMIKYU, Species.MIMIKYU,
Species.SKWOVET, Species.SKWOVET,
Species.GREEDENT, Species.GREEDENT,
@ -19169,6 +19209,7 @@ export const tmSpecies: TmSpecies = {
Species.SINISTEA, Species.SINISTEA,
Species.POLTEAGEIST, Species.POLTEAGEIST,
Species.PERRSERKER, Species.PERRSERKER,
Species.CURSOLA,
Species.RUNERIGUS, Species.RUNERIGUS,
Species.PINCURCHIN, Species.PINCURCHIN,
Species.STONJOURNER, Species.STONJOURNER,
@ -19236,6 +19277,7 @@ export const tmSpecies: TmSpecies = {
Species.GALAR_WEEZING, Species.GALAR_WEEZING,
Species.GALAR_SLOWKING, Species.GALAR_SLOWKING,
Species.GALAR_YAMASK, Species.GALAR_YAMASK,
Species.GALAR_STUNFISK,
Species.HISUI_ELECTRODE, Species.HISUI_ELECTRODE,
Species.HISUI_TYPHLOSION, Species.HISUI_TYPHLOSION,
Species.HISUI_QWILFISH, Species.HISUI_QWILFISH,
@ -67062,7 +67104,7 @@ export const tmSpecies: TmSpecies = {
Species.CHEWTLE, Species.CHEWTLE,
Species.DREDNAW, Species.DREDNAW,
Species.YAMPER, Species.YAMPER,
Species.BOLTUND, Species.BOLTUND,
Species.ROLYCOLY, Species.ROLYCOLY,
Species.CARKOL, Species.CARKOL,
Species.COALOSSAL, Species.COALOSSAL,
@ -67079,7 +67121,7 @@ export const tmSpecies: TmSpecies = {
Species.SIZZLIPEDE, Species.SIZZLIPEDE,
Species.CENTISKORCH, Species.CENTISKORCH,
Species.CLOBBOPUS, Species.CLOBBOPUS,
Species.GRAPPLOCT, Species.GRAPPLOCT,
Species.SINISTEA, Species.SINISTEA,
Species.POLTEAGEIST, Species.POLTEAGEIST,
Species.HATENNA, Species.HATENNA,

View File

@ -6405,8 +6405,23 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
return (user, target, move) => { return (user, target, move) => {
const switchOutTarget = (this.selfSwitch ? user : target); const switchOutTarget = (this.selfSwitch ? user : target);
const player = switchOutTarget instanceof PlayerPokemon; const player = switchOutTarget instanceof PlayerPokemon;
const forceSwitchAttr = move.getAttrs(ForceSwitchOutAttr).find(attr => attr.switchType === SwitchType.FORCE_SWITCH);
if (!this.selfSwitch) { if (!this.selfSwitch) {
if (move.hitsSubstitute(user, target)) {
return false;
}
// Check if the move is Roar or Whirlwind and if there is a trainer with only Pokémon left.
if (forceSwitchAttr && globalScene.currentBattle.trainer) {
const enemyParty = globalScene.getEnemyParty();
// Filter out any Pokémon that are not allowed in battle (e.g. fainted ones)
const remainingPokemon = enemyParty.filter(p => p.hp > 0 && p.isAllowedInBattle());
if (remainingPokemon.length <= 1) {
return false;
}
}
// Dondozo with an allied Tatsugiri in its mouth cannot be forced out // Dondozo with an allied Tatsugiri in its mouth cannot be forced out
const commandedTag = switchOutTarget.getTag(BattlerTagType.COMMANDED); const commandedTag = switchOutTarget.getTag(BattlerTagType.COMMANDED);
if (commandedTag?.getSourcePokemon()?.isActive(true)) { if (commandedTag?.getSourcePokemon()?.isActive(true)) {
@ -8067,10 +8082,10 @@ export class UpperHandCondition extends MoveCondition {
} }
} }
export class hitsSameTypeAttr extends VariableMoveTypeMultiplierAttr { export class HitsSameTypeAttr extends VariableMoveTypeMultiplierAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const multiplier = args[0] as NumberHolder; const multiplier = args[0] as NumberHolder;
if (!user.getTypes().some(type => target.getTypes().includes(type))) { if (!user.getTypes(true).some(type => target.getTypes(true).includes(type))) {
multiplier.value = 0; multiplier.value = 0;
return true; return true;
} }
@ -9771,7 +9786,7 @@ export function initMoves() {
new AttackMove(Moves.SYNCHRONOISE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5) new AttackMove(Moves.SYNCHRONOISE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5)
.target(MoveTarget.ALL_NEAR_OTHERS) .target(MoveTarget.ALL_NEAR_OTHERS)
.condition(unknownTypeCondition) .condition(unknownTypeCondition)
.attr(hitsSameTypeAttr), .attr(HitsSameTypeAttr),
new AttackMove(Moves.ELECTRO_BALL, PokemonType.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5) new AttackMove(Moves.ELECTRO_BALL, PokemonType.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5)
.attr(ElectroBallPowerAttr) .attr(ElectroBallPowerAttr)
.ballBombMove(), .ballBombMove(),

View File

@ -3500,11 +3500,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
let weight = levelMove[0]; let weight = levelMove[0];
// Evolution Moves // Evolution Moves
if (weight === 0) { if (weight === EVOLVE_MOVE) {
weight = 50; weight = 50;
} }
// Assume level 1 moves with 80+ BP are "move reminder" moves and bump their weight // Assume level 1 moves with 80+ BP are "move reminder" moves and bump their weight. Trainers use actual relearn moves.
if (weight === 1 && allMoves[levelMove[1]].power >= 80) { if (weight === 1 && allMoves[levelMove[1]].power >= 80 || weight === RELEARN_MOVE && this.hasTrainer()) {
weight = 40; weight = 40;
} }
if ( if (
@ -3609,9 +3609,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
// Bosses never get self ko moves or Pain Split // Bosses never get self ko moves or Pain Split
if (this.isBoss()) { if (this.isBoss()) {
movePool = movePool.filter(m => !allMoves[m[0]].hasAttr(SacrificialAttr)); movePool = movePool.filter(m => !allMoves[m[0]].hasAttr(SacrificialAttr) && !allMoves[m[0]].hasAttr(HpSplitAttr));
movePool = movePool.filter(m => !allMoves[m[0]].hasAttr(HpSplitAttr));
} }
// No one gets Memento or Final Gambit
movePool = movePool.filter( movePool = movePool.filter(
m => !allMoves[m[0]].hasAttr(SacrificialAttrOnHit), m => !allMoves[m[0]].hasAttr(SacrificialAttrOnHit),
); );
@ -3623,10 +3623,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
m[0], m[0],
m[1] * (allMoves[m[0]].hasAttr(SacrificialAttr) ? 0.5 : 1), m[1] * (allMoves[m[0]].hasAttr(SacrificialAttr) ? 0.5 : 1),
]); ]);
movePool = movePool.map(m => [
m[0],
m[1] * (allMoves[m[0]].hasAttr(SacrificialAttrOnHit) ? 0.5 : 1),
]);
// Trainers get a weight bump to stat buffing moves // Trainers get a weight bump to stat buffing moves
movePool = movePool.map(m => [ movePool = movePool.map(m => [
m[0], m[0],
@ -3687,10 +3683,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
]); ]);
/** The higher this is the more the game weights towards higher level moves. At `0` all moves are equal weight. */ /** The higher this is the more the game weights towards higher level moves. At `0` all moves are equal weight. */
let weightMultiplier = 0.9; let weightMultiplier = 1.6;
if (this.hasTrainer()) {
weightMultiplier += 0.7;
}
if (this.isBoss()) { if (this.isBoss()) {
weightMultiplier += 0.4; weightMultiplier += 0.4;
} }
@ -3699,37 +3692,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
Math.ceil(Math.pow(m[1], weightMultiplier) * 100), Math.ceil(Math.pow(m[1], weightMultiplier) * 100),
]); ]);
// Trainers and bosses always force a stab move // All Pokemon force a STAB move first
if (this.hasTrainer() || this.isBoss()) { const stabMovePool = baseWeights.filter(
const stabMovePool = baseWeights.filter( m =>
m => allMoves[m[0]].category !== MoveCategory.STATUS &&
allMoves[m[0]].category !== MoveCategory.STATUS && this.isOfType(allMoves[m[0]].type),
this.isOfType(allMoves[m[0]].type), );
);
if (stabMovePool.length) { if (stabMovePool.length) {
const totalWeight = stabMovePool.reduce((v, m) => v + m[1], 0); const totalWeight = stabMovePool.reduce((v, m) => v + m[1], 0);
let rand = randSeedInt(totalWeight); let rand = randSeedInt(totalWeight);
let index = 0; let index = 0;
while (rand > stabMovePool[index][1]) { while (rand > stabMovePool[index][1]) {
rand -= stabMovePool[index++][1]; rand -= stabMovePool[index++][1];
}
this.moveset.push(new PokemonMove(stabMovePool[index][0], 0, 0));
}
} else {
// Normal wild pokemon just force a random damaging move
const attackMovePool = baseWeights.filter(
m => allMoves[m[0]].category !== MoveCategory.STATUS,
);
if (attackMovePool.length) {
const totalWeight = attackMovePool.reduce((v, m) => v + m[1], 0);
let rand = randSeedInt(totalWeight);
let index = 0;
while (rand > attackMovePool[index][1]) {
rand -= attackMovePool[index++][1];
}
this.moveset.push(new PokemonMove(attackMovePool[index][0], 0, 0));
} }
this.moveset.push(new PokemonMove(stabMovePool[index][0], 0, 0));
} }
while ( while (
@ -3741,7 +3718,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
// Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights get 20x if STAB. // Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights get 20x if STAB.
// Status moves remain unchanged on weight, this encourages 1-2 // Status moves remain unchanged on weight, this encourages 1-2
movePool = baseWeights movePool = baseWeights
.filter(m => !this.moveset.some(mo => m[0] === mo.moveId)) .filter(m => !this.moveset.some(
mo =>
m[0] === mo.moveId ||
(allMoves[m[0]].hasAttr(SacrificialAttr) && mo.getMove().hasAttr(SacrificialAttr)) // Only one self-KO move allowed
))
.map(m => { .map(m => {
let ret: number; let ret: number;
if ( if (
@ -3772,7 +3753,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}); });
} else { } else {
// Non-trainer pokemon just use normal weights // Non-trainer pokemon just use normal weights
movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo.moveId)); movePool = baseWeights.filter(m => !this.moveset.some(
mo =>
m[0] === mo.moveId ||
(allMoves[m[0]].hasAttr(SacrificialAttr) && mo.getMove().hasAttr(SacrificialAttr)) // Only one self-KO move allowed
));
} }
const totalWeight = movePool.reduce((v, m) => v + m[1], 0); const totalWeight = movePool.reduce((v, m) => v + m[1], 0);
let rand = randSeedInt(totalWeight); let rand = randSeedInt(totalWeight);
@ -5678,7 +5663,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
/** /**
* Performs the action of clearing a Pokemon's status * Performs the action of clearing a Pokemon's status
* *
* This is a helper to {@linkcode resetStatus}, which should be called directly instead of this method * This is a helper to {@linkcode resetStatus}, which should be called directly instead of this method
*/ */
public clearStatus(confusion: boolean, reloadAssets: boolean) { public clearStatus(confusion: boolean, reloadAssets: boolean) {
@ -7104,7 +7089,6 @@ export class EnemyPokemon extends Pokemon {
if (!dataSource) { if (!dataSource) {
this.generateAndPopulateMoveset(); this.generateAndPopulateMoveset();
if (shinyLock || Overrides.OPP_SHINY_OVERRIDE === false) { if (shinyLock || Overrides.OPP_SHINY_OVERRIDE === false) {
this.shiny = false; this.shiny = false;
} else { } else {

View File

@ -1888,7 +1888,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
if (!(passiveAttr & PassiveAttr.UNLOCKED)) { if (!(passiveAttr & PassiveAttr.UNLOCKED)) {
const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.starterId]); const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.starterId]);
options.push({ options.push({
label: `x${passiveCost} ${i18next.t("pokedexUiHandler:unlockPassive")} (${allAbilities[this.passive].name})`, label: `x${passiveCost} ${i18next.t("pokedexUiHandler:unlockPassive")}`,
handler: () => { handler: () => {
if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) { if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) {
starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED; starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED;

View File

@ -151,8 +151,10 @@ const languageSettings: { [key: string]: LanguageSetting } = {
starterInfoXPos: 30, starterInfoXPos: 30,
}, },
ja: { ja: {
starterInfoTextSize: "51px", starterInfoTextSize: "62px",
instructionTextSize: "38px", instructionTextSize: "38px",
starterInfoYOffset: 0.5,
starterInfoXPos: 33,
}, },
"ca-ES": { "ca-ES": {
starterInfoTextSize: "52px", starterInfoTextSize: "52px",
@ -2182,7 +2184,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
if (!(passiveAttr & PassiveAttr.UNLOCKED)) { if (!(passiveAttr & PassiveAttr.UNLOCKED)) {
const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.lastSpecies.speciesId]); const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.lastSpecies.speciesId]);
options.push({ options.push({
label: `x${passiveCost} ${i18next.t("starterSelectUiHandler:unlockPassive")} (${allAbilities[this.lastSpecies.getPassiveAbility()].name})`, label: `x${passiveCost} ${i18next.t("starterSelectUiHandler:unlockPassive")}`,
handler: () => { handler: () => {
if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) { if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) {
starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED; starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED;

View File

@ -0,0 +1,47 @@
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { PokemonType } from "#enums/pokemon-type";
import { Species } from "#enums/species";
import GameManager from "#test/testUtils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
describe("Moves - Synchronoise", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override
.moveset([Moves.SYNCHRONOISE])
.ability(Abilities.BALL_FETCH)
.battleStyle("single")
.disableCrits()
.enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH)
.enemyMoveset(Moves.SPLASH);
});
it("should consider the user's tera type if it is terastallized", async () => {
await game.classicMode.startBattle([Species.BIDOOF]);
const playerPokemon = game.scene.getPlayerPokemon()!;
const enemyPokemon = game.scene.getEnemyPokemon()!;
// force the player to be terastallized
playerPokemon.teraType = PokemonType.WATER;
playerPokemon.isTerastallized = true;
game.move.select(Moves.SYNCHRONOISE);
await game.phaseInterceptor.to("BerryPhase");
expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp());
});
});

View File

@ -10,6 +10,7 @@ import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { Status } from "#app/data/status-effect"; import { Status } from "#app/data/status-effect";
import { StatusEffect } from "#enums/status-effect"; import { StatusEffect } from "#enums/status-effect";
import { globalScene } from "#app/global-scene";
import { BattlerIndex } from "#app/battle"; import { BattlerIndex } from "#app/battle";
import { BattleType } from "#enums/battle-type"; import { BattleType } from "#enums/battle-type";
import { TrainerType } from "#enums/trainer-type"; import { TrainerType } from "#enums/trainer-type";
@ -161,6 +162,37 @@ describe("Moves - Whirlwind", () => {
expect(eevee.isOnField()).toBe(false); expect(eevee.isOnField()).toBe(false);
}); });
it("should fail when player uses Whirlwind against an opponent with only one available Pokémon", async () => {
// Set up the battle scenario with the player knowing Whirlwind
game.override.startingWave(5).enemySpecies(Species.PIDGEY).moveset([Moves.WHIRLWIND]);
await game.classicMode.startBattle();
const enemyParty = game.scene.getEnemyParty();
// Ensure the opponent has only one available Pokémon
if (enemyParty.length > 1) {
enemyParty.slice(1).forEach(p => {
p.hp = 0;
p.status = new Status(StatusEffect.FAINT);
});
}
const eligibleEnemy = enemyParty.filter(p => p.hp > 0 && p.isAllowedInBattle());
expect(eligibleEnemy.length).toBe(1);
// Spy on the queueMessage function
const queueSpy = vi.spyOn(globalScene, "queueMessage");
// Player uses Whirlwind; opponent uses Splash
game.move.select(Moves.WHIRLWIND);
await game.forceEnemyMove(Moves.SPLASH);
await game.toNextTurn();
// Verify that the failure message is displayed for Whirlwind
expect(queueSpy).toHaveBeenCalledWith(expect.stringContaining("But it failed"));
// Verify the opponent's Splash message
expect(queueSpy).toHaveBeenCalledWith(expect.stringContaining("But nothing happened!"));
});
it("should not pull in the other trainer's pokemon in a partner trainer battle", async () => { it("should not pull in the other trainer's pokemon in a partner trainer battle", async () => {
game.override game.override
.startingWave(2) .startingWave(2)