Fix fusion move learning bug and inaccurate HP in battle info
This commit is contained in:
parent
3e9fdc2d0a
commit
3961550f62
|
@ -1558,6 +1558,7 @@ export default class BattleScene extends SceneBase {
|
||||||
const soundName = modifier.type.soundName;
|
const soundName = modifier.type.soundName;
|
||||||
this.validateAchvs(ModifierAchv, modifier);
|
this.validateAchvs(ModifierAchv, modifier);
|
||||||
const modifiersToRemove: PersistentModifier[] = [];
|
const modifiersToRemove: PersistentModifier[] = [];
|
||||||
|
const modifierPromises: Promise<boolean>[] = [];
|
||||||
if (modifier instanceof PersistentModifier) {
|
if (modifier instanceof PersistentModifier) {
|
||||||
if (modifier instanceof TerastallizeModifier)
|
if (modifier instanceof TerastallizeModifier)
|
||||||
modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId)));
|
modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId)));
|
||||||
|
@ -1596,11 +1597,14 @@ export default class BattleScene extends SceneBase {
|
||||||
} else if (modifier instanceof FusePokemonModifier)
|
} else if (modifier instanceof FusePokemonModifier)
|
||||||
args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon);
|
args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon);
|
||||||
|
|
||||||
if (modifier.shouldApply(args))
|
if (modifier.shouldApply(args)) {
|
||||||
modifier.apply(args);
|
const result = modifier.apply(args);
|
||||||
|
if (result instanceof Promise)
|
||||||
|
modifierPromises.push(result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Promise.allSettled(this.party.map(p => p.updateInfo(instant))).then(() => resolve());
|
return Promise.allSettled([this.party.map(p => p.updateInfo(instant)), ...modifierPromises]).then(() => resolve());
|
||||||
} else {
|
} else {
|
||||||
const args = [ this ];
|
const args = [ this ];
|
||||||
if (modifier.shouldApply(args))
|
if (modifier.shouldApply(args))
|
||||||
|
|
|
@ -601,8 +601,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
return this.getMaxHp() - this.hp;
|
return this.getMaxHp() - this.hp;
|
||||||
}
|
}
|
||||||
|
|
||||||
getHpRatio(): number {
|
getHpRatio(precise: boolean = false): number {
|
||||||
return Math.floor((this.hp / this.getMaxHp()) * 100) / 100;
|
return precise
|
||||||
|
? this.hp / this.getMaxHp()
|
||||||
|
: ((this.hp / this.getMaxHp()) * 100) / 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
generateGender(): void {
|
generateGender(): void {
|
||||||
|
@ -2324,7 +2326,6 @@ export class PlayerPokemon extends Pokemon {
|
||||||
let partyMemberIndex = this.scene.getParty().indexOf(this);
|
let partyMemberIndex = this.scene.getParty().indexOf(this);
|
||||||
if (partyMemberIndex > fusedPartyMemberIndex)
|
if (partyMemberIndex > fusedPartyMemberIndex)
|
||||||
partyMemberIndex--;
|
partyMemberIndex--;
|
||||||
pokemon.getMoveset(true).map(m => this.scene.unshiftPhase(new LearnMovePhase(this.scene, partyMemberIndex, m.getMove().id)));
|
|
||||||
const fusedPartyMemberHeldModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier
|
const fusedPartyMemberHeldModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier
|
||||||
&& (m as PokemonHeldItemModifier).pokemonId === pokemon.id, true) as PokemonHeldItemModifier[];
|
&& (m as PokemonHeldItemModifier).pokemonId === pokemon.id, true) as PokemonHeldItemModifier[];
|
||||||
const transferModifiers: Promise<boolean>[] = [];
|
const transferModifiers: Promise<boolean>[] = [];
|
||||||
|
@ -2334,6 +2335,8 @@ export class PlayerPokemon extends Pokemon {
|
||||||
this.scene.updateModifiers(true, true).then(() => {
|
this.scene.updateModifiers(true, true).then(() => {
|
||||||
this.scene.removePartyMemberModifiers(fusedPartyMemberIndex);
|
this.scene.removePartyMemberModifiers(fusedPartyMemberIndex);
|
||||||
this.scene.getParty().splice(fusedPartyMemberIndex, 1)[0];
|
this.scene.getParty().splice(fusedPartyMemberIndex, 1)[0];
|
||||||
|
const newPartyMemberIndex = this.scene.getParty().indexOf(this);
|
||||||
|
pokemon.getMoveset(true).map(m => this.scene.unshiftPhase(new LearnMovePhase(this.scene, newPartyMemberIndex, m.getMove().id)));
|
||||||
pokemon.destroy();
|
pokemon.destroy();
|
||||||
this.updateFusionPalette();
|
this.updateFusionPalette();
|
||||||
resolve();
|
resolve();
|
||||||
|
|
|
@ -109,7 +109,7 @@ export abstract class Modifier {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract apply(args: any[]): boolean;
|
abstract apply(args: any[]): boolean | Promise<boolean>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export abstract class PersistentModifier extends Modifier {
|
export abstract class PersistentModifier extends Modifier {
|
||||||
|
@ -1203,10 +1203,10 @@ export class FusePokemonModifier extends ConsumablePokemonModifier {
|
||||||
return super.shouldApply(args) && args[1] instanceof PlayerPokemon && this.fusePokemonId === (args[1] as PlayerPokemon).id;
|
return super.shouldApply(args) && args[1] instanceof PlayerPokemon && this.fusePokemonId === (args[1] as PlayerPokemon).id;
|
||||||
}
|
}
|
||||||
|
|
||||||
apply(args: any[]): boolean {
|
apply(args: any[]): Promise<boolean> {
|
||||||
(args[0] as PlayerPokemon).fuse(args[1] as PlayerPokemon);
|
return new Promise<boolean>(resolve => {
|
||||||
|
(args[0] as PlayerPokemon).fuse(args[1] as PlayerPokemon).then(() => resolve(true));
|
||||||
return true;
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4102,16 +4102,22 @@ export class SelectModifierPhase extends BattlePhase {
|
||||||
}
|
}
|
||||||
|
|
||||||
const applyModifier = (modifier: Modifier, playSound: boolean = false) => {
|
const applyModifier = (modifier: Modifier, playSound: boolean = false) => {
|
||||||
this.scene.addModifier(modifier, false, playSound);
|
const result = this.scene.addModifier(modifier, false, playSound);
|
||||||
if (cost) {
|
if (cost) {
|
||||||
this.scene.money -= cost;
|
this.scene.money -= cost;
|
||||||
this.scene.updateMoneyText();
|
this.scene.updateMoneyText();
|
||||||
this.scene.playSound('buy');
|
this.scene.playSound('buy');
|
||||||
(this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText();
|
(this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText();
|
||||||
} else {
|
} else {
|
||||||
this.scene.ui.clearText();
|
const doEnd = () => {
|
||||||
this.scene.ui.setMode(Mode.MESSAGE);
|
this.scene.ui.clearText();
|
||||||
super.end();
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
super.end();
|
||||||
|
};
|
||||||
|
if (result instanceof Promise)
|
||||||
|
result.then(() => doEnd());
|
||||||
|
else
|
||||||
|
doEnd();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -193,7 +193,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||||
this.updateBossSegmentDividers(pokemon as EnemyPokemon);
|
this.updateBossSegmentDividers(pokemon as EnemyPokemon);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.hpBar.setScale(pokemon.getHpRatio(), 1);
|
this.hpBar.setScale(pokemon.getHpRatio(true), 1);
|
||||||
this.lastHpFrame = this.hpBar.scaleX > 0.5 ? 'high' : this.hpBar.scaleX > 0.25 ? 'medium' : 'low';
|
this.lastHpFrame = this.hpBar.scaleX > 0.5 ? 'high' : this.hpBar.scaleX > 0.25 ? 'medium' : 'low';
|
||||||
this.hpBar.setFrame(this.lastHpFrame);
|
this.hpBar.setFrame(this.lastHpFrame);
|
||||||
if (this.player)
|
if (this.player)
|
||||||
|
@ -356,7 +356,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||||
this.scene.tweens.add({
|
this.scene.tweens.add({
|
||||||
targets: this.hpBar,
|
targets: this.hpBar,
|
||||||
ease: 'Sine.easeOut',
|
ease: 'Sine.easeOut',
|
||||||
scaleX: pokemon.getHpRatio(),
|
scaleX: pokemon.getHpRatio(true),
|
||||||
duration: duration,
|
duration: duration,
|
||||||
onUpdate: () => {
|
onUpdate: () => {
|
||||||
if (this.player && this.lastHp !== pokemon.hp) {
|
if (this.player && this.lastHp !== pokemon.hp) {
|
||||||
|
|
Loading…
Reference in New Issue