diff --git a/.github/old_workflows/eslint.yml b/.github/old_workflows/eslint.yml
index 9068f1ae9a2..2850418bc59 100644
--- a/.github/old_workflows/eslint.yml
+++ b/.github/old_workflows/eslint.yml
@@ -11,6 +11,8 @@ on:
branches:
- main # Trigger on pull request events targeting the main branch
- beta # Trigger on pull request events targeting the beta branch
+ merge_group:
+ types: [checks_requested]
jobs:
run-linters: # Define a job named "run-linters"
diff --git a/.github/old_workflows/github-pages.yml b/.github/old_workflows/github-pages.yml
index 3b7617c45f4..a092ccb425a 100644
--- a/.github/old_workflows/github-pages.yml
+++ b/.github/old_workflows/github-pages.yml
@@ -8,6 +8,8 @@ on:
branches:
- main
- beta
+ merge_group:
+ types: [checks_requested]
jobs:
pages:
diff --git a/.github/old_workflows/tests.yml b/.github/old_workflows/tests.yml
index 9ce1d1c5038..2a78ec252b8 100644
--- a/.github/old_workflows/tests.yml
+++ b/.github/old_workflows/tests.yml
@@ -11,10 +11,12 @@ on:
branches:
- main # Trigger on pull request events targeting the main branch
- beta # Trigger on pull request events targeting the beta branch
+ merge_group:
+ 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:
@@ -29,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/docs/enemy-ai.md b/docs/enemy-ai.md
index f53a8511893..46482f56a90 100644
--- a/docs/enemy-ai.md
+++ b/docs/enemy-ai.md
@@ -191,15 +191,15 @@ Now that the enemy Pokémon with the best matchup score is on the field (assumin
We then need to apply a 2x multiplier for the move's type effectiveness and a 1.5x multiplier since STAB applies. After applying these multipliers, the final score for this move is **75**.
-- **Swords Dance**: As a non-attacking move, this move's benefit score is derived entirely from the sum of its attributes' benefit scores. Swords Dance's `StatChangeAttr` has a user benefit score of 0 and a target benefit score that, in this case, simplifies to
+- **Swords Dance**: As a non-attacking move, this move's benefit score is derived entirely from the sum of its attributes' benefit scores. Swords Dance's `StatStageChangeAttr` has a user benefit score of 0 and a target benefit score that, in this case, simplifies to
$\text{TBS}=4\times \text{levels} + (-2\times \text{sign(levels)})$
where `levels` is the number of stat stages added by the attribute (in this case, +2). The final score for this move is **6** (Note: because this move is self-targeted, we don't flip the sign of TBS when computing the target score).
-- **Crush Claw**: This move is a 75-power Normal-type physical attack with a 50 percent chance to lower the target's Defense by one stage. The additional effect is implemented by the same `StatChangeAttr` as Swords Dance, so we can use the same formulas from before to compute the total TBS and base target score.
+- **Crush Claw**: This move is a 75-power Normal-type physical attack with a 50 percent chance to lower the target's Defense by one stage. The additional effect is implemented by the same `StatStageChangeAttr` as Swords Dance, so we can use the same formulas from before to compute the total TBS and base target score.
- $\text{TBS}=\text{getTargetBenefitScore(StatChangeAttr)}-\text{attackScore}$
+ $\text{TBS}=\text{getTargetBenefitScore(StatStageChangeAttr)}-\text{attackScore}$
$\text{TBS}=(-4 + 2)-(-2\times 2 + \lfloor \frac{75}{5} \rfloor)=-2-11=-13$
@@ -221,4 +221,4 @@ When implementing a new move attribute, it's important to override `MoveAttr`'s
- A move's **user benefit score (UBS)** incentivizes (or discourages) the move's usage in general. A positive UBS gives the move more incentive to be used, while a negative UBS gives the move less incentive.
- A move's **target benefit score (TBS)** incentivizes (or discourages) the move's usage on a specific target. A positive TBS indicates the move is better used on the user or its allies, while a negative TBS indicates the move is better used on enemies.
- **The total benefit score (UBS + TBS) of a move should never be 0.** The move selection algorithm assumes the move's benefit score is unimplemented if the total score is 0 and penalizes the move's usage as a result. With status moves especially, it's important to have some form of implementation among the move's attributes to avoid this scenario.
-- **Score functions that use formulas should include comments.** If your attribute requires complex logic or formulas to calculate benefit scores, please add comments to explain how the logic works and its intended effect on the enemy's decision making.
\ No newline at end of file
+- **Score functions that use formulas should include comments.** If your attribute requires complex logic or formulas to calculate benefit scores, please add comments to explain how the logic works and its intended effect on the enemy's decision making.
diff --git a/index.css b/index.css
index abf4f9f708c..1274f2fcead 100644
--- a/index.css
+++ b/index.css
@@ -23,15 +23,6 @@ body {
}
}
-#links {
- width: 90%;
- text-align: center;
- position: fixed;
- bottom: 0;
- display: flex;
- justify-content: space-around;
-}
-
#app {
display: flex;
justify-content: center;
@@ -93,7 +84,7 @@ input:-internal-autofill-selected {
@media (orientation: landscape) {
#touchControls {
- --controls-size: 20vh;
+ --controls-size: 20vh;
--text-shadow-size: 1.3vh;
--small-button-offset: 4vh;
}
diff --git a/index.html b/index.html
index dfdcc6e6089..10137d882d0 100644
--- a/index.html
+++ b/index.html
@@ -39,7 +39,6 @@
-