Add ability bar UI
parent
c614295b5e
commit
18679241e9
Binary file not shown.
After Width: | Height: | Size: 332 B |
|
@ -1283,6 +1283,13 @@ export class MessagePhase extends BattlePhase {
|
||||||
|
|
||||||
this.scene.ui.showText(this.text, null, () => this.end(), this.callbackDelay || (this.prompt ? 0 : 1500), this.prompt);
|
this.scene.ui.showText(this.text, null, () => this.end(), this.callbackDelay || (this.prompt ? 0 : 1500), this.prompt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
end() {
|
||||||
|
if (this.scene.abilityBar.shown)
|
||||||
|
this.scene.abilityBar.hide();
|
||||||
|
|
||||||
|
super.end();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class DamagePhase extends PokemonPhase {
|
export class DamagePhase extends PokemonPhase {
|
||||||
|
|
|
@ -19,6 +19,7 @@ import StarterSelectUiHandler from './ui/starter-select-ui-handler';
|
||||||
import { TextStyle, addTextObject } from './ui/text';
|
import { TextStyle, addTextObject } from './ui/text';
|
||||||
import { Moves } from './data/move';
|
import { Moves } from './data/move';
|
||||||
import { getDefaultModifierTypeForTier, getEnemyModifierTypesForWave } from './modifier/modifier-type';
|
import { getDefaultModifierTypeForTier, getEnemyModifierTypesForWave } from './modifier/modifier-type';
|
||||||
|
import AbilityBar from './ui/ability-bar';
|
||||||
|
|
||||||
const enableAuto = true;
|
const enableAuto = true;
|
||||||
const quickStart = false;
|
const quickStart = false;
|
||||||
|
@ -60,6 +61,7 @@ export default class BattleScene extends Phaser.Scene {
|
||||||
private currentPhase: BattlePhase;
|
private currentPhase: BattlePhase;
|
||||||
public field: Phaser.GameObjects.Container;
|
public field: Phaser.GameObjects.Container;
|
||||||
public fieldUI: Phaser.GameObjects.Container;
|
public fieldUI: Phaser.GameObjects.Container;
|
||||||
|
public abilityBar: AbilityBar;
|
||||||
public arenaBg: Phaser.GameObjects.Image;
|
public arenaBg: Phaser.GameObjects.Image;
|
||||||
public arenaBgTransition: Phaser.GameObjects.Image;
|
public arenaBgTransition: Phaser.GameObjects.Image;
|
||||||
public arenaPlayer: Phaser.GameObjects.Image;
|
public arenaPlayer: Phaser.GameObjects.Image;
|
||||||
|
@ -153,6 +155,7 @@ export default class BattleScene extends Phaser.Scene {
|
||||||
this.loadImage('overlay_exp', 'ui');
|
this.loadImage('overlay_exp', 'ui');
|
||||||
this.loadImage('icon_owned', 'ui');
|
this.loadImage('icon_owned', 'ui');
|
||||||
this.loadImage('level_up_stats', 'ui');
|
this.loadImage('level_up_stats', 'ui');
|
||||||
|
this.loadImage('ability_bar', 'ui');
|
||||||
this.loadImage('ball_window', 'ui');
|
this.loadImage('ball_window', 'ui');
|
||||||
this.loadImage('boolean_window', 'ui');
|
this.loadImage('boolean_window', 'ui');
|
||||||
|
|
||||||
|
@ -311,6 +314,10 @@ export default class BattleScene extends Phaser.Scene {
|
||||||
this.add.existing(this.enemyModifierBar);
|
this.add.existing(this.enemyModifierBar);
|
||||||
uiContainer.add(this.enemyModifierBar);
|
uiContainer.add(this.enemyModifierBar);
|
||||||
|
|
||||||
|
this.abilityBar = new AbilityBar(this);
|
||||||
|
this.abilityBar.setup();
|
||||||
|
this.fieldUI.add(this.abilityBar);
|
||||||
|
|
||||||
this.waveCountText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, startingWave.toString(), TextStyle.BATTLE_INFO);
|
this.waveCountText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, startingWave.toString(), TextStyle.BATTLE_INFO);
|
||||||
this.waveCountText.setOrigin(1, 0);
|
this.waveCountText.setOrigin(1, 0);
|
||||||
this.updateWaveCountPosition();
|
this.updateWaveCountPosition();
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import Pokemon, { PokemonMove } from "../pokemon";
|
import Pokemon, { PokemonMove } from "../pokemon";
|
||||||
import { Type } from "./type";
|
import { Type } from "./type";
|
||||||
import * as Utils from "../utils";
|
import * as Utils from "../utils";
|
||||||
import { BattleStat } from "./battle-stat";
|
import { BattleStat, getBattleStatName } from "./battle-stat";
|
||||||
import { StatChangePhase } from "../battle-phases";
|
import { StatChangePhase } from "../battle-phases";
|
||||||
|
import { getPokemonMessage } from "../messages";
|
||||||
|
|
||||||
export class Ability {
|
export class Ability {
|
||||||
public id: Abilities;
|
public id: Abilities;
|
||||||
|
@ -13,7 +14,7 @@ export class Ability {
|
||||||
|
|
||||||
constructor(id: Abilities, name: string, description: string, generation: integer) {
|
constructor(id: Abilities, name: string, description: string, generation: integer) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.name = name;
|
this.name = name.toUpperCase();
|
||||||
this.description = description;
|
this.description = description;
|
||||||
this.generation = generation;
|
this.generation = generation;
|
||||||
this.attrs = [];
|
this.attrs = [];
|
||||||
|
@ -31,7 +32,11 @@ export class Ability {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export abstract class AbilityAttr { }
|
export abstract class AbilityAttr {
|
||||||
|
getTriggerMessage(pokemon: Pokemon, ...args: any[]) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class PreDefendAbilityAttr extends AbilityAttr {
|
export class PreDefendAbilityAttr extends AbilityAttr {
|
||||||
applyPreDefend(pokemon: Pokemon, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
applyPreDefend(pokemon: Pokemon, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||||
|
@ -88,22 +93,26 @@ export class PreStatChangeAbilityAttr extends AbilityAttr {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ProtectStatAttr extends PreStatChangeAbilityAttr {
|
export class ProtectStatAttr extends PreStatChangeAbilityAttr {
|
||||||
private protectedStats: BattleStat[];
|
private protectedStat: BattleStat;
|
||||||
|
|
||||||
constructor(...stats: BattleStat[]) {
|
constructor(protectedStat?: BattleStat) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this.protectedStats = stats;
|
this.protectedStat = protectedStat;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPreStatChange(pokemon: Pokemon, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
applyPreStatChange(pokemon: Pokemon, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||||
if (!this.protectedStats.length || this.protectedStats.indexOf(stat) > -1) {
|
if (this.protectedStat === undefined || stat === this.protectedStat) {
|
||||||
cancelled.value = true;
|
cancelled.value = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getTriggerMessage(pokemon: Pokemon, ...args: any[]) {
|
||||||
|
return getPokemonMessage(pokemon, `'s ${pokemon.getAbility().name}\nprevents lowering its ${this.protectedStat !== undefined ? getBattleStatName(this.protectedStat) : 'stats'}!`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function applyPreDefendAbilityAttrs(attrType: { new(...args: any[]): PreDefendAbilityAttr },
|
export function applyPreDefendAbilityAttrs(attrType: { new(...args: any[]): PreDefendAbilityAttr },
|
||||||
|
@ -111,8 +120,12 @@ export function applyPreDefendAbilityAttrs(attrType: { new(...args: any[]): PreD
|
||||||
const ability = pokemon.getAbility();
|
const ability = pokemon.getAbility();
|
||||||
const attrs = ability.getAttrs(attrType) as PreDefendAbilityAttr[];
|
const attrs = ability.getAttrs(attrType) as PreDefendAbilityAttr[];
|
||||||
for (let attr of attrs) {
|
for (let attr of attrs) {
|
||||||
if (attr.applyPreDefend(pokemon, attacker, move, cancelled, args))
|
if (attr.applyPreDefend(pokemon, attacker, move, cancelled, args)) {
|
||||||
console.log('Applied', ability.name, attr);
|
pokemon.scene.abilityBar.showAbility(pokemon);
|
||||||
|
const message = attr.getTriggerMessage(pokemon, attacker, move);
|
||||||
|
if (message)
|
||||||
|
pokemon.scene.queueMessage(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,8 +134,12 @@ export function applyPreStatChangeAbilityAttrs(attrType: { new(...args: any[]):
|
||||||
const ability = pokemon.getAbility();
|
const ability = pokemon.getAbility();
|
||||||
const attrs = ability.getAttrs(attrType) as PreStatChangeAbilityAttr[];
|
const attrs = ability.getAttrs(attrType) as PreStatChangeAbilityAttr[];
|
||||||
for (let attr of attrs) {
|
for (let attr of attrs) {
|
||||||
if (attr.applyPreStatChange(pokemon, stat, cancelled, args))
|
if (attr.applyPreStatChange(pokemon, stat, cancelled, args)) {
|
||||||
console.log('Applied', ability.name, attr);
|
pokemon.scene.abilityBar.showAbility(pokemon);
|
||||||
|
const message = attr.getTriggerMessage(pokemon, stat);
|
||||||
|
if (message)
|
||||||
|
pokemon.scene.queueMessage(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
import BattleScene from "../battle-scene";
|
||||||
|
import Pokemon from "../pokemon";
|
||||||
|
import { TextStyle, addTextObject } from "./text";
|
||||||
|
|
||||||
|
export default class AbilityBar extends Phaser.GameObjects.Container {
|
||||||
|
private bg: Phaser.GameObjects.Image;
|
||||||
|
private pokemonNameText: Phaser.GameObjects.Text;
|
||||||
|
private abilityNameText: Phaser.GameObjects.Text;
|
||||||
|
|
||||||
|
private tween: Phaser.Tweens.Tween;
|
||||||
|
|
||||||
|
public shown: boolean;
|
||||||
|
|
||||||
|
constructor(scene: BattleScene) {
|
||||||
|
super(scene, -91, (-scene.game.canvas.height / 6) + 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
setup(): void {
|
||||||
|
this.bg = this.scene.add.image(0, 0, 'ability_bar');
|
||||||
|
this.bg.setOrigin(0, 0);
|
||||||
|
|
||||||
|
this.add(this.bg);
|
||||||
|
|
||||||
|
this.pokemonNameText = addTextObject(this.scene, 5, 3, 'Pokemon', TextStyle.MESSAGE, { fontSize: '72px' });
|
||||||
|
this.pokemonNameText.setOrigin(0, 0);
|
||||||
|
this.add(this.pokemonNameText);
|
||||||
|
|
||||||
|
this.abilityNameText = addTextObject(this.scene, 87, 16, 'Chlorophyll', TextStyle.WINDOW, { fontSize: '72px' });
|
||||||
|
this.abilityNameText.setOrigin(1, 0);
|
||||||
|
this.add(this.abilityNameText);
|
||||||
|
|
||||||
|
this.setVisible(false);
|
||||||
|
this.shown = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
showAbility(pokemon: Pokemon) {
|
||||||
|
this.pokemonNameText.setText(`${pokemon.name}'s`);
|
||||||
|
this.abilityNameText.setText(pokemon.getAbility().name);
|
||||||
|
|
||||||
|
if (this.tween)
|
||||||
|
this.tween.stop();
|
||||||
|
|
||||||
|
this.tween = this.scene.tweens.add({
|
||||||
|
targets: this,
|
||||||
|
x: 10,
|
||||||
|
duration: 500,
|
||||||
|
ease: 'Sine.easeOut',
|
||||||
|
onComplete: () => this.tween = null
|
||||||
|
});
|
||||||
|
|
||||||
|
this.setVisible(true);
|
||||||
|
this.shown = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
hide() {
|
||||||
|
if (this.tween)
|
||||||
|
this.tween.stop();
|
||||||
|
|
||||||
|
this.tween = this.scene.tweens.add({
|
||||||
|
targets: this,
|
||||||
|
x: -91,
|
||||||
|
duration: 500,
|
||||||
|
ease: 'Sine.easeIn',
|
||||||
|
onComplete: () => {
|
||||||
|
this.tween = null;
|
||||||
|
this.setVisible(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.shown = false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -576,7 +576,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||||
|
|
||||||
if (defaultDexEntry) {
|
if (defaultDexEntry) {
|
||||||
const ability = this.lastSpecies.getAbility(abilityIndex);
|
const ability = this.lastSpecies.getAbility(abilityIndex);
|
||||||
this.pokemonAbilityText.setText(abilities[ability].name.toUpperCase());
|
this.pokemonAbilityText.setText(abilities[ability].name);
|
||||||
|
|
||||||
const isHidden = ability === this.lastSpecies.abilityHidden;
|
const isHidden = ability === this.lastSpecies.abilityHidden;
|
||||||
this.pokemonAbilityText.setColor(getTextColor(!isHidden ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD));
|
this.pokemonAbilityText.setColor(getTextColor(!isHidden ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD));
|
||||||
|
|
|
@ -437,7 +437,7 @@ export default class SummaryUiHandler extends UiHandler {
|
||||||
|
|
||||||
const ability = abilities[this.pokemon.species.getAbility(this.pokemon.abilityIndex)];
|
const ability = abilities[this.pokemon.species.getAbility(this.pokemon.abilityIndex)];
|
||||||
|
|
||||||
const abilityNameText = addTextObject(this.scene, 7, 66, ability.name.toUpperCase(), TextStyle.SUMMARY);
|
const abilityNameText = addTextObject(this.scene, 7, 66, ability.name, TextStyle.SUMMARY);
|
||||||
abilityNameText.setOrigin(0, 1);
|
abilityNameText.setOrigin(0, 1);
|
||||||
profileContainer.add(abilityNameText);
|
profileContainer.add(abilityNameText);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue