From dc73bccc04620cf848a2167b868c1e0c2e4ed3ec Mon Sep 17 00:00:00 2001 From: mati-soda Date: Thu, 12 Jun 2025 23:47:01 +0100 Subject: [PATCH 1/2] Implemented AI improvements: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The changes in the game AI were as follows ("pokemon.ts"): - More accurately accounts for the Pokémon's actual moves and their effectiveness against the player instead of only the pokemon type - Introduced logic to decide when a Pokémon should be sacrificed or switched based on its HP and speed. Signed-off-by: Matilde Simões Co-authored-by: Fuad Ali --- src/field/pokemon.ts | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 964d66d352e..217264b3d9d 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2504,14 +2504,39 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { defScore *= 1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[1], opponent, false, false, undefined, true), 0.25); } + atkScore *= 1.25; //give more value for the pokemon's typing + const moveset = this.moveset; + let moveAtkScoreLenght = 0; + for (const move of moveset) { + if (move.getMove().category === MoveCategory.SPECIAL || move.getMove().category === MoveCategory.PHYSICAL) { + atkScore += opponent.getAttackTypeEffectiveness(move.getMove().type, this, false, true, undefined, true); + moveAtkScoreLenght++; + } + } + atkScore = atkScore / (moveAtkScoreLenght + 1); //calculate the median for the attack score /** * Based on this Pokemon's HP ratio compared to that of the opponent. * This ratio is multiplied by 1.5 if this Pokemon outspeeds the opponent; * however, the final ratio cannot be higher than 1. */ - let hpDiffRatio = this.getHpRatio() + (1 - opponent.getHpRatio()); - if (outspeed) { - hpDiffRatio = Math.min(hpDiffRatio * 1.5, 1); + const hpRatio = this.getHpRatio(); + const oppHpRatio = opponent.getHpRatio(); + const isDying = hpRatio <= 0.2; + let hpDiffRatio = hpRatio + (1 - oppHpRatio); + if (isDying && this.isActive(true)) { + //It might be a sacrifice candidate if hp under 20% + const badMatchup = atkScore < 1.5 && defScore < 1.5; + if (!outspeed && badMatchup) { + //It might not be a worthy sacrifice if it doesn't outspeed or doesn't do enough damage + hpDiffRatio *= 0.85; + } else { + hpDiffRatio = Math.min(1 - hpRatio + (outspeed ? 0.2 : 0.1), 1); + } + } else if (outspeed) { + hpDiffRatio = Math.min(hpDiffRatio * 1.25, 1); + } else if (hpRatio > 0.2 && hpRatio <= 0.4) { + //Might be considered to be switched because it's not in low enough health + hpDiffRatio = Math.min(hpDiffRatio * 0.5, 1); } return (atkScore + defScore) * hpDiffRatio; } From 1cbac829a0916144a723ce7b3ce253c1f186f861 Mon Sep 17 00:00:00 2001 From: Fuad Ali Date: Fri, 20 Jun 2025 15:29:59 +0100 Subject: [PATCH 2/2] =?UTF-8?q?Corrected=20grammar=20error=20in=20variable?= =?UTF-8?q?=20declaration=20in=20getMatchupScore=20Signed-off-by:=20Fuad?= =?UTF-8?q?=20Ali=20=20Co-authored-by:=20Mati?= =?UTF-8?q?lde=20Sim=C3=B5es=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/field/pokemon.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index ec99ca43a2f..743c5ca5578 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2505,14 +2505,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } atkScore *= 1.25; //give more value for the pokemon's typing const moveset = this.moveset; - let moveAtkScoreLenght = 0; + let moveAtkScoreLength = 0; for (const move of moveset) { if (move.getMove().category === MoveCategory.SPECIAL || move.getMove().category === MoveCategory.PHYSICAL) { atkScore += opponent.getAttackTypeEffectiveness(move.getMove().type, this, false, true, undefined, true); - moveAtkScoreLenght++; + moveAtkScoreLength++; } } - atkScore = atkScore / (moveAtkScoreLenght + 1); //calculate the median for the attack score + atkScore = atkScore / (moveAtkScoreLength + 1); //calculate the median for the attack score /** * Based on this Pokemon's HP ratio compared to that of the opponent. * This ratio is multiplied by 1.5 if this Pokemon outspeeds the opponent;