Compare commits

...

7 Commits

Author SHA1 Message Date
Matilde Simões
d708efc185
Merge 1cbac829a0 into 4b70fab608 2025-06-20 14:32:10 +00:00
Fuad Ali
1cbac829a0 Corrected grammar error in variable declaration in getMatchupScore
Signed-off-by: Fuad Ali <fuad.ali@tecnico.ulisboa.pt>
Co-authored-by: Matilde Simões <matilde.simoes@tecnico.ulisboa.pt>
2025-06-20 15:29:59 +01:00
NightKev
4b70fab608
[Bug] Remove message for Rock Head activation (#6014) 2025-06-19 20:59:55 -07:00
lnuvy
1ff2701964
[Bug] Fix when using arrow keys in Pokédex after catching a Pokémon from mystery event (#6000)
fix: wrap setOverlayMode args in array to mystery-encounter

Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com>
2025-06-19 20:45:54 -04:00
damocleas
ba8126c86d
Merge branch 'beta' into enemy_ai 2025-06-14 17:40:44 -04:00
Sirz Benjie
b25f4c09c3
Merge branch 'beta' into enemy_ai 2025-06-13 21:52:26 -04:00
mati-soda
dc73bccc04 Implemented AI improvements:
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 <matilde.simoes@tecnico.ulisboa.pt>
Co-authored-by: Fuad Ali <fuad.ali@tecnico.ulisboa.pt>
2025-06-12 23:47:01 +01:00
3 changed files with 29 additions and 11 deletions

View File

@ -306,13 +306,6 @@ export class BlockRecoilDamageAttr extends AbAttr {
): void {
cancelled.value = true;
}
getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]) {
return i18next.t("abilityTriggers:blockRecoilDamage", {
pokemonName: getPokemonNameWithAffix(pokemon),
abilityName: abilityName,
});
}
}
/**

View File

@ -751,7 +751,7 @@ export async function catchPokemon(
UiMode.POKEDEX_PAGE,
pokemon.species,
pokemon.formIndex,
attributes,
[attributes],
null,
() => {
globalScene.ui.setMode(UiMode.MESSAGE).then(() => {

View File

@ -2498,14 +2498,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 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);
moveAtkScoreLength++;
}
}
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;
* 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;
}