mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-08-20 22:39:31 +02:00
[Beta] Stop Transform giving copied moves negative fractional ppUp
This commit is contained in:
parent
414e0a5447
commit
8496255a04
@ -2455,9 +2455,8 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr {
|
|||||||
|
|
||||||
pokemon.summonData.moveset = target.getMoveset().map(m => {
|
pokemon.summonData.moveset = target.getMoveset().map(m => {
|
||||||
const pp = m?.getMove().pp ?? 0;
|
const pp = m?.getMove().pp ?? 0;
|
||||||
// if PP value is less than 5, do nothing. If greater, we need to reduce the value to 5 using a negative ppUp value.
|
// If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5.
|
||||||
const ppUp = pp <= 5 ? 0 : (5 - pp) / Math.max(Math.floor(pp / 5), 1);
|
return new PokemonMove(m?.moveId!, 0, 0, false, Math.min(pp, 5));
|
||||||
return new PokemonMove(m?.moveId ?? Moves.NONE, 0, ppUp);
|
|
||||||
});
|
});
|
||||||
pokemon.summonData.types = target.getTypes();
|
pokemon.summonData.types = target.getTypes();
|
||||||
promises.push(pokemon.updateInfo());
|
promises.push(pokemon.updateInfo());
|
||||||
|
@ -6670,9 +6670,8 @@ export class TransformAttr extends MoveEffectAttr {
|
|||||||
|
|
||||||
user.summonData.moveset = target.getMoveset().map(m => {
|
user.summonData.moveset = target.getMoveset().map(m => {
|
||||||
const pp = m?.getMove().pp ?? 0;
|
const pp = m?.getMove().pp ?? 0;
|
||||||
// if PP value is less than 5, do nothing. If greater, we need to reduce the value to 5 using a negative ppUp value.
|
// If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5.
|
||||||
const ppUp = pp <= 5 ? 0 : (5 - pp) / Math.max(Math.floor(pp / 5), 1);
|
return new PokemonMove(m?.moveId!, 0, 0, false, Math.min(pp, 5));
|
||||||
return new PokemonMove(m?.moveId!, 0, ppUp);
|
|
||||||
});
|
});
|
||||||
user.summonData.types = target.getTypes();
|
user.summonData.types = target.getTypes();
|
||||||
promises.push(user.updateInfo());
|
promises.push(user.updateInfo());
|
||||||
|
@ -4453,7 +4453,7 @@ export class PlayerPokemon extends Pokemon {
|
|||||||
copyMoveset(): PokemonMove[] {
|
copyMoveset(): PokemonMove[] {
|
||||||
const newMoveset : PokemonMove[] = [];
|
const newMoveset : PokemonMove[] = [];
|
||||||
this.moveset.forEach(move =>
|
this.moveset.forEach(move =>
|
||||||
newMoveset.push(new PokemonMove(move!.moveId, 0, move!.ppUp, move!.virtual))); // TODO: are those bangs correct?
|
newMoveset.push(new PokemonMove(move!.moveId, 0, move!.ppUp, move!.virtual, move!.maxPpOverride))); // TODO: are those bangs correct?
|
||||||
|
|
||||||
return newMoveset;
|
return newMoveset;
|
||||||
}
|
}
|
||||||
@ -5180,15 +5180,22 @@ export interface DamageCalculationResult {
|
|||||||
**/
|
**/
|
||||||
export class PokemonMove {
|
export class PokemonMove {
|
||||||
public moveId: Moves;
|
public moveId: Moves;
|
||||||
public ppUsed: integer;
|
public ppUsed: number;
|
||||||
public ppUp: integer;
|
public ppUp: number;
|
||||||
public virtual: boolean;
|
public virtual: boolean;
|
||||||
|
|
||||||
constructor(moveId: Moves, ppUsed?: integer, ppUp?: integer, virtual?: boolean) {
|
/**
|
||||||
|
* If defined and nonzero, overrides the maximum PP of the move (e.g., due to move being copied by Transform).
|
||||||
|
* This also nullifies all effects of `ppUp`.
|
||||||
|
*/
|
||||||
|
public maxPpOverride?: number;
|
||||||
|
|
||||||
|
constructor(moveId: Moves, ppUsed?: number, ppUp?: number, virtual?: boolean, maxPpOverride?: number) {
|
||||||
this.moveId = moveId;
|
this.moveId = moveId;
|
||||||
this.ppUsed = ppUsed || 0;
|
this.ppUsed = ppUsed || 0;
|
||||||
this.ppUp = ppUp || 0;
|
this.ppUp = ppUp || 0;
|
||||||
this.virtual = !!virtual;
|
this.virtual = !!virtual;
|
||||||
|
this.maxPpOverride = maxPpOverride;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -5225,7 +5232,7 @@ export class PokemonMove {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getMovePp(): integer {
|
getMovePp(): integer {
|
||||||
return this.getMove().pp + this.ppUp * Utils.toDmgValue(this.getMove().pp / 5);
|
return this.maxPpOverride || (this.getMove().pp + this.ppUp * Utils.toDmgValue(this.getMove().pp / 5));
|
||||||
}
|
}
|
||||||
|
|
||||||
getPpRatio(): number {
|
getPpRatio(): number {
|
||||||
@ -5242,6 +5249,6 @@ export class PokemonMove {
|
|||||||
* @return {PokemonMove} A valid pokemonmove object
|
* @return {PokemonMove} A valid pokemonmove object
|
||||||
*/
|
*/
|
||||||
static loadMove(source: PokemonMove | any): PokemonMove {
|
static loadMove(source: PokemonMove | any): PokemonMove {
|
||||||
return new PokemonMove(source.moveId, source.ppUsed, source.ppUp, source.virtual);
|
return new PokemonMove(source.moveId, source.ppUsed, source.ppUp, source.virtual, source.maxPpOverride);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -384,7 +384,7 @@ export class PokemonPpUpModifierType extends PokemonMoveModifierType {
|
|||||||
(_pokemon: PlayerPokemon) => {
|
(_pokemon: PlayerPokemon) => {
|
||||||
return null;
|
return null;
|
||||||
}, (pokemonMove: PokemonMove) => {
|
}, (pokemonMove: PokemonMove) => {
|
||||||
if (pokemonMove.getMove().pp < 5 || pokemonMove.ppUp >= 3) {
|
if (pokemonMove.getMove().pp < 5 || pokemonMove.ppUp >= 3 || pokemonMove.maxPpOverride) {
|
||||||
return PartyUiHandler.NoEffectMessage;
|
return PartyUiHandler.NoEffectMessage;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -2166,7 +2166,7 @@ export class PokemonPpUpModifier extends ConsumablePokemonMoveModifier {
|
|||||||
override apply(playerPokemon: PlayerPokemon): boolean {
|
override apply(playerPokemon: PlayerPokemon): boolean {
|
||||||
const move = playerPokemon.getMoveset()[this.moveIndex];
|
const move = playerPokemon.getMoveset()[this.moveIndex];
|
||||||
|
|
||||||
if (move) {
|
if (move && !move.maxPpOverride) {
|
||||||
move.ppUp = Math.min(move.ppUp + this.upPoints, 3);
|
move.ppUp = Math.min(move.ppUp + this.upPoints, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ export default class PokemonData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.moveset = (source.moveset || [ new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.GROWL) ]).filter(m => m).map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp));
|
this.moveset = (source.moveset || [ new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.GROWL) ]).filter(m => m).map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp, m.virtual, m.maxPpOverride));
|
||||||
if (!forHistory) {
|
if (!forHistory) {
|
||||||
this.status = source.status
|
this.status = source.status
|
||||||
? new Status(source.status.effect, source.status.toxicTurnCount, source.status.sleepTurnsRemaining)
|
? new Status(source.status.effect, source.status.toxicTurnCount, source.status.sleepTurnsRemaining)
|
||||||
|
@ -60,18 +60,19 @@ describe("Abilities - Imposter", () => {
|
|||||||
const playerMoveset = player.getMoveset();
|
const playerMoveset = player.getMoveset();
|
||||||
const enemyMoveset = player.getMoveset();
|
const enemyMoveset = player.getMoveset();
|
||||||
|
|
||||||
|
expect(playerMoveset.length).toBe(enemyMoveset.length);
|
||||||
for (let i = 0; i < playerMoveset.length && i < enemyMoveset.length; i++) {
|
for (let i = 0; i < playerMoveset.length && i < enemyMoveset.length; i++) {
|
||||||
// TODO: Checks for 5 PP should be done here when that gets addressed
|
|
||||||
expect(playerMoveset[i]?.moveId).toBe(enemyMoveset[i]?.moveId);
|
expect(playerMoveset[i]?.moveId).toBe(enemyMoveset[i]?.moveId);
|
||||||
}
|
}
|
||||||
|
|
||||||
const playerTypes = player.getTypes();
|
const playerTypes = player.getTypes();
|
||||||
const enemyTypes = enemy.getTypes();
|
const enemyTypes = enemy.getTypes();
|
||||||
|
|
||||||
|
expect(playerTypes.length).toBe(enemyTypes.length);
|
||||||
for (let i = 0; i < playerTypes.length && i < enemyTypes.length; i++) {
|
for (let i = 0; i < playerTypes.length && i < enemyTypes.length; i++) {
|
||||||
expect(playerTypes[i]).toBe(enemyTypes[i]);
|
expect(playerTypes[i]).toBe(enemyTypes[i]);
|
||||||
}
|
}
|
||||||
}, 20000);
|
});
|
||||||
|
|
||||||
it("should copy in-battle overridden stats", async () => {
|
it("should copy in-battle overridden stats", async () => {
|
||||||
game.override.enemyMoveset([ Moves.POWER_SPLIT ]);
|
game.override.enemyMoveset([ Moves.POWER_SPLIT ]);
|
||||||
@ -104,7 +105,15 @@ describe("Abilities - Imposter", () => {
|
|||||||
await game.phaseInterceptor.to(TurnEndPhase);
|
await game.phaseInterceptor.to(TurnEndPhase);
|
||||||
|
|
||||||
player.getMoveset().forEach(move => {
|
player.getMoveset().forEach(move => {
|
||||||
expect(move!.getMovePp()).toBeLessThanOrEqual(5);
|
// Should set correct maximum PP without touching `ppUp`
|
||||||
|
if (move) {
|
||||||
|
if (move.moveId === Moves.SKETCH) {
|
||||||
|
expect(move.getMovePp()).toBe(1);
|
||||||
|
} else {
|
||||||
|
expect(move.getMovePp()).toBe(5);
|
||||||
|
}
|
||||||
|
expect(move.ppUp).toBe(0);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -60,18 +60,19 @@ describe("Moves - Transform", () => {
|
|||||||
const playerMoveset = player.getMoveset();
|
const playerMoveset = player.getMoveset();
|
||||||
const enemyMoveset = player.getMoveset();
|
const enemyMoveset = player.getMoveset();
|
||||||
|
|
||||||
|
expect(playerMoveset.length).toBe(enemyMoveset.length);
|
||||||
for (let i = 0; i < playerMoveset.length && i < enemyMoveset.length; i++) {
|
for (let i = 0; i < playerMoveset.length && i < enemyMoveset.length; i++) {
|
||||||
// TODO: Checks for 5 PP should be done here when that gets addressed
|
|
||||||
expect(playerMoveset[i]?.moveId).toBe(enemyMoveset[i]?.moveId);
|
expect(playerMoveset[i]?.moveId).toBe(enemyMoveset[i]?.moveId);
|
||||||
}
|
}
|
||||||
|
|
||||||
const playerTypes = player.getTypes();
|
const playerTypes = player.getTypes();
|
||||||
const enemyTypes = enemy.getTypes();
|
const enemyTypes = enemy.getTypes();
|
||||||
|
|
||||||
|
expect(playerTypes.length).toBe(enemyTypes.length);
|
||||||
for (let i = 0; i < playerTypes.length && i < enemyTypes.length; i++) {
|
for (let i = 0; i < playerTypes.length && i < enemyTypes.length; i++) {
|
||||||
expect(playerTypes[i]).toBe(enemyTypes[i]);
|
expect(playerTypes[i]).toBe(enemyTypes[i]);
|
||||||
}
|
}
|
||||||
}, 20000);
|
});
|
||||||
|
|
||||||
it("should copy in-battle overridden stats", async () => {
|
it("should copy in-battle overridden stats", async () => {
|
||||||
game.override.enemyMoveset([ Moves.POWER_SPLIT ]);
|
game.override.enemyMoveset([ Moves.POWER_SPLIT ]);
|
||||||
@ -94,7 +95,7 @@ describe("Moves - Transform", () => {
|
|||||||
expect(enemy.getStat(Stat.SPATK, false)).toBe(avgSpAtk);
|
expect(enemy.getStat(Stat.SPATK, false)).toBe(avgSpAtk);
|
||||||
});
|
});
|
||||||
|
|
||||||
it ("should set each move's pp to a maximum of 5", async () => {
|
it("should set each move's pp to a maximum of 5", async () => {
|
||||||
game.override.enemyMoveset([ Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER ]);
|
game.override.enemyMoveset([ Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER ]);
|
||||||
|
|
||||||
await game.classicMode.startBattle([ Species.DITTO ]);
|
await game.classicMode.startBattle([ Species.DITTO ]);
|
||||||
@ -104,7 +105,15 @@ describe("Moves - Transform", () => {
|
|||||||
await game.phaseInterceptor.to(TurnEndPhase);
|
await game.phaseInterceptor.to(TurnEndPhase);
|
||||||
|
|
||||||
player.getMoveset().forEach(move => {
|
player.getMoveset().forEach(move => {
|
||||||
expect(move!.getMovePp()).toBeLessThanOrEqual(5);
|
// Should set correct maximum PP without touching `ppUp`
|
||||||
|
if (move) {
|
||||||
|
if (move.moveId === Moves.SKETCH) {
|
||||||
|
expect(move.getMovePp()).toBe(1);
|
||||||
|
} else {
|
||||||
|
expect(move.getMovePp()).toBe(5);
|
||||||
|
}
|
||||||
|
expect(move.ppUp).toBe(0);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user