Add rare candy modifier
parent
2c71550b35
commit
a1b857fbc6
Binary file not shown.
|
@ -102,8 +102,11 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||||
}
|
}
|
||||||
|
|
||||||
updateInfo(pokemon: Pokemon, callback?: Function) {
|
updateInfo(pokemon: Pokemon, callback?: Function) {
|
||||||
if (!this.scene)
|
if (!this.scene) {
|
||||||
|
if (callback)
|
||||||
|
callback();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const updatePokemonHp = () => {
|
const updatePokemonHp = () => {
|
||||||
const duration = Utils.clampInt(Math.abs((this.lastHp) - pokemon.hp) * 5, 250, 5000);
|
const duration = Utils.clampInt(Math.abs((this.lastHp) - pokemon.hp) * 5, 250, 5000);
|
||||||
|
@ -158,8 +161,9 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||||
const relLevelExp = getLevelRelExp(this.lastLevel + 1, battler.species.growthRate);
|
const relLevelExp = getLevelRelExp(this.lastLevel + 1, battler.species.growthRate);
|
||||||
const levelExp = levelUp ? relLevelExp : battler.levelExp;
|
const levelExp = levelUp ? relLevelExp : battler.levelExp;
|
||||||
let ratio = levelExp / relLevelExp;
|
let ratio = levelExp / relLevelExp;
|
||||||
let duration = ((levelExp - this.lastLevelExp) / relLevelExp) * 1650;
|
let duration = this.visible ? ((levelExp - this.lastLevelExp) / relLevelExp) * 1650 : 0;
|
||||||
this.scene.sound.play('exp');
|
if (duration)
|
||||||
|
this.scene.sound.play('exp');
|
||||||
this.scene.tweens.add({
|
this.scene.tweens.add({
|
||||||
targets: this.expBar,
|
targets: this.expBar,
|
||||||
ease: 'Sine.easeIn',
|
ease: 'Sine.easeIn',
|
||||||
|
@ -179,7 +183,8 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onComplete: () => {
|
onComplete: () => {
|
||||||
this.scene.sound.stopByKey('exp');
|
if (duration)
|
||||||
|
this.scene.sound.stopByKey('exp');
|
||||||
if (ratio === 1) {
|
if (ratio === 1) {
|
||||||
this.lastLevelExp = 0;
|
this.lastLevelExp = 0;
|
||||||
this.lastLevel++;
|
this.lastLevel++;
|
||||||
|
|
|
@ -9,7 +9,7 @@ import { ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, getModifie
|
||||||
import PartyUiHandler from "./ui/party-ui-handler";
|
import PartyUiHandler from "./ui/party-ui-handler";
|
||||||
import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor as getPokeballTintColor, PokeballType } from "./pokeball";
|
import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor as getPokeballTintColor, PokeballType } from "./pokeball";
|
||||||
import { pokemonLevelMoves } from "./pokemon-level-moves";
|
import { pokemonLevelMoves } from "./pokemon-level-moves";
|
||||||
import { MoveAnim, loadMoveAnimAssets } from "./battle-anims";
|
import { MoveAnim, initAnim, loadMoveAnimAssets } from "./battle-anims";
|
||||||
import { StatusEffect } from "./status-effect";
|
import { StatusEffect } from "./status-effect";
|
||||||
|
|
||||||
export class BattlePhase {
|
export class BattlePhase {
|
||||||
|
@ -776,10 +776,12 @@ export class LearnMovePhase extends PartyMemberPokemonPhase {
|
||||||
|
|
||||||
if (pokemon.moveset.length < 4) {
|
if (pokemon.moveset.length < 4) {
|
||||||
pokemon.moveset.push(new PokemonMove(this.moveId, 0, 0));
|
pokemon.moveset.push(new PokemonMove(this.moveId, 0, 0));
|
||||||
loadMoveAnimAssets(this.scene, [ this.moveId ])
|
initAnim(this.moveId).then(() => {
|
||||||
.then(() => {
|
loadMoveAnimAssets(this.scene, [ this.moveId ], true)
|
||||||
this.scene.sound.play('level_up_fanfare');
|
.then(() => {
|
||||||
this.scene.ui.showText(`${pokemon.name} learned\n${Utils.toPokemonUpperCase(move.name)}!`, null, () => this.end(), null, true);
|
this.scene.sound.play('level_up_fanfare');
|
||||||
|
this.scene.ui.showText(`${pokemon.name} learned\n${Utils.toPokemonUpperCase(move.name)}!`, null, () => this.end(), null, true);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
} else
|
} else
|
||||||
this.end();
|
this.end();
|
||||||
|
@ -965,16 +967,14 @@ export class SelectModifierPhase extends BattlePhase {
|
||||||
this.scene.ui.setModeWithoutClear(Mode.PARTY, false, (slotIndex: integer) => {
|
this.scene.ui.setModeWithoutClear(Mode.PARTY, false, (slotIndex: integer) => {
|
||||||
if (slotIndex < 6) {
|
if (slotIndex < 6) {
|
||||||
this.scene.ui.setMode(Mode.MODIFIER_SELECT);
|
this.scene.ui.setMode(Mode.MODIFIER_SELECT);
|
||||||
this.scene.addModifier(types[cursor].newModifier(this.scene.getParty()[slotIndex]));
|
this.scene.addModifier(types[cursor].newModifier(this.scene.getParty()[slotIndex])).then(() => super.end());
|
||||||
this.scene.ui.setMode(Mode.MESSAGE);
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
super.end();
|
|
||||||
} else
|
} else
|
||||||
this.scene.ui.setMode(Mode.MODIFIER_SELECT);
|
this.scene.ui.setMode(Mode.MODIFIER_SELECT);
|
||||||
}, pokemonModifierType.selectFilter);
|
}, pokemonModifierType.selectFilter);
|
||||||
} else {
|
} else {
|
||||||
this.scene.addModifier(types[cursor].newModifier())
|
this.scene.addModifier(types[cursor].newModifier()).then(() => super.end());
|
||||||
this.scene.ui.setMode(Mode.MESSAGE);
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
super.end();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -410,31 +410,44 @@ export default class BattleScene extends Phaser.Scene {
|
||||||
this.phaseQueue.push(new CommandPhase(this));
|
this.phaseQueue.push(new CommandPhase(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
addModifier(modifier: Modifier): void {
|
addModifier(modifier: Modifier): Promise<void> {
|
||||||
if (modifier.add(this.modifierBar, this.modifiers))
|
return new Promise(resolve => {
|
||||||
this.sound.play('restore');
|
if (modifier.add(this.modifierBar, this.modifiers))
|
||||||
|
this.sound.play('restore');
|
||||||
|
|
||||||
if (modifier instanceof ConsumableModifier) {
|
if (modifier instanceof ConsumableModifier) {
|
||||||
const args = [ this ];
|
const args = [ this ];
|
||||||
if (modifier.shouldApply(args))
|
if (modifier.shouldApply(args))
|
||||||
modifier.apply(args);
|
modifier.apply(args);
|
||||||
return;
|
resolve();
|
||||||
}
|
return;
|
||||||
|
|
||||||
if (modifier instanceof PokemonModifier) {
|
|
||||||
for (let p in this.party) {
|
|
||||||
const pokemon = this.party[p];
|
|
||||||
|
|
||||||
if (modifier instanceof ConsumablePokemonModifier) {
|
|
||||||
const args = [ pokemon ];
|
|
||||||
if (modifier.shouldApply(args))
|
|
||||||
modifier.apply(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
pokemon.calculateStats();
|
|
||||||
pokemon.updateInfo();
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
let pokemonToUpdate = 0;
|
||||||
|
|
||||||
|
if (modifier instanceof PokemonModifier) {
|
||||||
|
for (let p in this.party) {
|
||||||
|
const pokemon = this.party[p];
|
||||||
|
|
||||||
|
if (modifier instanceof ConsumablePokemonModifier) {
|
||||||
|
const args = [ pokemon ];
|
||||||
|
if (modifier.shouldApply(args))
|
||||||
|
modifier.apply(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
pokemonToUpdate++;
|
||||||
|
|
||||||
|
pokemon.calculateStats();
|
||||||
|
pokemon.updateInfo(() => {
|
||||||
|
if (!(--pokemonToUpdate))
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pokemonToUpdate)
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getModifier(modifierType: { new(...args: any[]): Modifier }): Modifier {
|
getModifier(modifierType: { new(...args: any[]): Modifier }): Modifier {
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
|
import { LevelUpPhase } from "./battle-phase";
|
||||||
import BattleScene from "./battle-scene";
|
import BattleScene from "./battle-scene";
|
||||||
|
import { getLevelTotalExp } from "./exp";
|
||||||
import { getPokeballName, PokeballType } from "./pokeball";
|
import { getPokeballName, PokeballType } from "./pokeball";
|
||||||
import Pokemon, { PlayerPokemon } from "./pokemon";
|
import Pokemon, { PlayerPokemon } from "./pokemon";
|
||||||
import { Stat, getStatName } from "./pokemon-stat";
|
import { Stat, getStatName } from "./pokemon-stat";
|
||||||
|
@ -240,6 +242,24 @@ export class PokemonHpRestoreModifier extends ConsumablePokemonModifier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier {
|
||||||
|
constructor(type: ModifierType, pokemonId: integer) {
|
||||||
|
super(type, pokemonId);
|
||||||
|
}
|
||||||
|
|
||||||
|
apply(args: any[]): boolean {
|
||||||
|
const pokemon = args[0] as PlayerPokemon;
|
||||||
|
pokemon.level++;
|
||||||
|
pokemon.exp = getLevelTotalExp(pokemon.level, pokemon.species.growthRate);
|
||||||
|
pokemon.levelExp = 0;
|
||||||
|
|
||||||
|
const scene = pokemon.scene as BattleScene;
|
||||||
|
scene.unshiftPhase(new LevelUpPhase(scene, scene.getParty().indexOf(pokemon), pokemon.level));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class ExpBoosterModifier extends Modifier {
|
export class ExpBoosterModifier extends Modifier {
|
||||||
private boostMultiplier: integer;
|
private boostMultiplier: integer;
|
||||||
|
|
||||||
|
@ -376,22 +396,34 @@ export abstract class PokemonModifierType extends ModifierType {
|
||||||
export class PokemonHpRestoreModifierType extends PokemonModifierType {
|
export class PokemonHpRestoreModifierType extends PokemonModifierType {
|
||||||
protected restorePercent: integer;
|
protected restorePercent: integer;
|
||||||
|
|
||||||
constructor(name: string, restorePercent: integer, newModifierFunc?: Function, iconImage?: string) {
|
constructor(name: string, restorePercent: integer, newModifierFunc?: Function, selectFilter?: Function, iconImage?: string) {
|
||||||
super(name, `Restore ${restorePercent} HP or ${restorePercent}% HP for one POKéMON, whichever is higher`,
|
super(name, `Restore ${restorePercent} HP or ${restorePercent}% HP for one POKéMON, whichever is higher`,
|
||||||
newModifierFunc || ((_type, args) => new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePercent, false)),
|
newModifierFunc || ((_type, args) => new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePercent, false)),
|
||||||
(pokemon: PlayerPokemon) => {
|
selectFilter || ((pokemon: PlayerPokemon) => {
|
||||||
if (pokemon.hp >= pokemon.getMaxHp())
|
if (!pokemon.hp || pokemon.hp >= pokemon.getMaxHp())
|
||||||
return PartyUiHandler.NoEffectMessage;
|
return PartyUiHandler.NoEffectMessage;
|
||||||
return null;
|
return null;
|
||||||
}, iconImage);
|
}), iconImage);
|
||||||
|
|
||||||
this.restorePercent = restorePercent;
|
this.restorePercent = restorePercent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class PokemonLevelIncrementModifierType extends PokemonModifierType {
|
||||||
|
constructor(name: string, iconImage?: string) {
|
||||||
|
super(name, `Increase a POKéMON\'s level by 1`, (type, args) => new PokemonLevelIncrementModifier(type, (args[0] as PlayerPokemon).id),
|
||||||
|
(_pokemon: PlayerPokemon) => null, iconImage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class PokemonReviveModifierType extends PokemonHpRestoreModifierType {
|
export class PokemonReviveModifierType extends PokemonHpRestoreModifierType {
|
||||||
constructor(name: string, restorePercent: integer, iconImage?: string) {
|
constructor(name: string, restorePercent: integer, iconImage?: string) {
|
||||||
super(name, restorePercent, (_type, args) => new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePercent, true), iconImage);
|
super(name, restorePercent, (_type, args) => new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePercent, true),
|
||||||
|
((pokemon: PlayerPokemon) => {
|
||||||
|
if (pokemon.hp)
|
||||||
|
return PartyUiHandler.NoEffectMessage;
|
||||||
|
return null;
|
||||||
|
}), iconImage);
|
||||||
|
|
||||||
this.description = `Revive one POKéMON and restore ${restorePercent}% HP`;
|
this.description = `Revive one POKéMON and restore ${restorePercent}% HP`;
|
||||||
this.selectFilter = (pokemon: PlayerPokemon) => {
|
this.selectFilter = (pokemon: PlayerPokemon) => {
|
||||||
|
@ -471,6 +503,7 @@ const modifierPool = {
|
||||||
const thresholdPartyMemberCount = party.filter(p => p.getHpRatio() <= 0.6).length;
|
const thresholdPartyMemberCount = party.filter(p => p.getHpRatio() <= 0.6).length;
|
||||||
return thresholdPartyMemberCount;
|
return thresholdPartyMemberCount;
|
||||||
}),
|
}),
|
||||||
|
new PokemonLevelIncrementModifierType('RARE CANDY'),
|
||||||
new PokemonBaseStatBoosterModifierType('HP-UP', Stat.HP),
|
new PokemonBaseStatBoosterModifierType('HP-UP', Stat.HP),
|
||||||
new PokemonBaseStatBoosterModifierType('PROTEIN', Stat.ATK),
|
new PokemonBaseStatBoosterModifierType('PROTEIN', Stat.ATK),
|
||||||
new PokemonBaseStatBoosterModifierType('IRON', Stat.DEF),
|
new PokemonBaseStatBoosterModifierType('IRON', Stat.DEF),
|
||||||
|
|
Loading…
Reference in New Issue