[Feature] Add number of arena trap layers in menu flyout (#2059)
* add number of trap layers in menu flyout * refactors * change key type to effectType
This commit is contained in:
parent
9463da8797
commit
be208d48b6
|
@ -71,11 +71,18 @@ export class TagAddedEvent extends ArenaEvent {
|
|||
public arenaTagType: ArenaTagType;
|
||||
/** The {@linkcode ArenaTagSide} the tag is being placed on */
|
||||
public arenaTagSide: ArenaTagSide;
|
||||
constructor(arenaTagType: ArenaTagType, arenaTagSide: ArenaTagSide, duration: number) {
|
||||
/** The current number of layers of the arena trap. */
|
||||
public arenaTagLayers: number;
|
||||
/** The maximum amount of layers of the arena trap. */
|
||||
public arenaTagMaxLayers: number;
|
||||
|
||||
constructor(arenaTagType: ArenaTagType, arenaTagSide: ArenaTagSide, duration: number, arenaTagLayers?: number, arenaTagMaxLayers?: number) {
|
||||
super(ArenaEventType.TAG_ADDED, duration);
|
||||
|
||||
this.arenaTagType = arenaTagType;
|
||||
this.arenaTagSide = arenaTagSide;
|
||||
this.arenaTagLayers = arenaTagLayers;
|
||||
this.arenaTagMaxLayers = arenaTagMaxLayers;
|
||||
}
|
||||
}
|
||||
/**
|
||||
|
|
|
@ -7,7 +7,7 @@ import { CommonAnimPhase } from "../phases";
|
|||
import { CommonAnim } from "../data/battle-anims";
|
||||
import { Type } from "../data/type";
|
||||
import Move from "../data/move";
|
||||
import { ArenaTag, ArenaTagSide, getArenaTag } from "../data/arena-tag";
|
||||
import { ArenaTag, ArenaTagSide, ArenaTrapTag, getArenaTag } from "../data/arena-tag";
|
||||
import { BattlerIndex } from "../battle";
|
||||
import { Terrain, TerrainType } from "../data/terrain";
|
||||
import { PostTerrainChangeAbAttr, PostWeatherChangeAbAttr, applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs } from "../data/ability";
|
||||
|
@ -553,6 +553,12 @@ export class Arena {
|
|||
const existingTag = this.getTagOnSide(tagType, side);
|
||||
if (existingTag) {
|
||||
existingTag.onOverlap(this);
|
||||
|
||||
if (existingTag instanceof ArenaTrapTag) {
|
||||
const { tagType, side, turnCount, layers, maxLayers } = existingTag as ArenaTrapTag;
|
||||
this.eventTarget.dispatchEvent(new TagAddedEvent(tagType, side, turnCount, layers, maxLayers));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -560,7 +566,9 @@ export class Arena {
|
|||
this.tags.push(newTag);
|
||||
newTag.onAdd(this, quiet);
|
||||
|
||||
this.eventTarget.dispatchEvent(new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount));
|
||||
const { layers = 0, maxLayers = 0 } = newTag instanceof ArenaTrapTag ? newTag : {};
|
||||
|
||||
this.eventTarget.dispatchEvent(new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount, layers, maxLayers));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { addTextObject, TextStyle } from "./text";
|
||||
import BattleScene from "#app/battle-scene.js";
|
||||
import { ArenaTagSide } from "#app/data/arena-tag.js";
|
||||
import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag.js";
|
||||
import { WeatherType } from "#app/data/weather.js";
|
||||
import { TerrainType } from "#app/data/terrain.js";
|
||||
import { addWindow, WindowVariant } from "./ui-theme";
|
||||
|
@ -23,12 +23,14 @@ interface ArenaEffectInfo {
|
|||
/** The enum string representation of the effect */
|
||||
name: string;
|
||||
/** {@linkcode ArenaEffectType} type of effect */
|
||||
type: ArenaEffectType,
|
||||
effecType: ArenaEffectType,
|
||||
|
||||
/** The maximum duration set by the effect */
|
||||
maxDuration: number;
|
||||
/** The current duration left on the effect */
|
||||
duration: number;
|
||||
/** The arena tag type being added */
|
||||
tagType?: ArenaTagType;
|
||||
}
|
||||
|
||||
export default class ArenaFlyout extends Phaser.GameObjects.Container {
|
||||
|
@ -213,7 +215,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container {
|
|||
|
||||
// Creates a proxy object to decide which text object needs to be updated
|
||||
let textObject: Phaser.GameObjects.Text;
|
||||
switch (fieldEffectInfo.type) {
|
||||
switch (fieldEffectInfo.effecType) {
|
||||
case ArenaEffectType.PLAYER:
|
||||
textObject = this.flyoutTextPlayer;
|
||||
break;
|
||||
|
@ -231,7 +233,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container {
|
|||
}
|
||||
|
||||
textObject.text += this.formatText(fieldEffectInfo.name);
|
||||
if (fieldEffectInfo.type === ArenaEffectType.TERRAIN) {
|
||||
if (fieldEffectInfo.effecType === ArenaEffectType.TERRAIN) {
|
||||
textObject.text += " Terrain"; // Adds 'Terrain' since the enum does not contain it
|
||||
}
|
||||
|
||||
|
@ -257,19 +259,42 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container {
|
|||
switch (arenaEffectChangedEvent.constructor) {
|
||||
case TagAddedEvent:
|
||||
const tagAddedEvent = arenaEffectChangedEvent as TagAddedEvent;
|
||||
const isArenaTrapTag = this.battleScene.arena.getTag(tagAddedEvent.arenaTagType) instanceof ArenaTrapTag;
|
||||
let arenaEffectType: ArenaEffectType;
|
||||
|
||||
if (tagAddedEvent.arenaTagSide === ArenaTagSide.BOTH) {
|
||||
arenaEffectType = ArenaEffectType.FIELD;
|
||||
} else if (tagAddedEvent.arenaTagSide === ArenaTagSide.PLAYER) {
|
||||
arenaEffectType = ArenaEffectType.PLAYER;
|
||||
} else {
|
||||
arenaEffectType = ArenaEffectType.ENEMY;
|
||||
}
|
||||
|
||||
const existingTrapTagIndex = isArenaTrapTag ? this.fieldEffectInfo.findIndex(e => tagAddedEvent.arenaTagType === e.tagType && arenaEffectType === e.effecType) : -1;
|
||||
let name: string = ArenaTagType[tagAddedEvent.arenaTagType];
|
||||
|
||||
if (isArenaTrapTag && tagAddedEvent.arenaTagMaxLayers > 1) {
|
||||
if (existingTrapTagIndex !== -1) {
|
||||
this.fieldEffectInfo[existingTrapTagIndex].name = `${name} (${tagAddedEvent.arenaTagLayers})`;
|
||||
break;
|
||||
} else {
|
||||
name = `${name} (${tagAddedEvent.arenaTagLayers})`;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
this.fieldEffectInfo.push({
|
||||
name: ArenaTagType[tagAddedEvent.arenaTagType],
|
||||
type: tagAddedEvent.arenaTagSide === ArenaTagSide.BOTH
|
||||
? ArenaEffectType.FIELD
|
||||
: tagAddedEvent.arenaTagSide === ArenaTagSide.PLAYER
|
||||
? ArenaEffectType.PLAYER
|
||||
: ArenaEffectType.ENEMY,
|
||||
name,
|
||||
effecType: arenaEffectType,
|
||||
maxDuration: tagAddedEvent.duration,
|
||||
duration: tagAddedEvent.duration});
|
||||
duration: tagAddedEvent.duration,
|
||||
tagType: tagAddedEvent.arenaTagType
|
||||
});
|
||||
break;
|
||||
case TagRemovedEvent:
|
||||
const tagRemovedEvent = arenaEffectChangedEvent as TagRemovedEvent;
|
||||
foundIndex = this.fieldEffectInfo.findIndex(info => info.name === ArenaTagType[tagRemovedEvent.arenaTagType]);
|
||||
foundIndex = this.fieldEffectInfo.findIndex(info => info.tagType === tagRemovedEvent.arenaTagType);
|
||||
|
||||
if (foundIndex !== -1) { // If the tag was being tracked, remove it
|
||||
this.fieldEffectInfo.splice(foundIndex, 1);
|
||||
}
|
||||
|
@ -290,7 +315,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container {
|
|||
fieldEffectChangedEvent instanceof WeatherChangedEvent
|
||||
? WeatherType[fieldEffectChangedEvent.newWeatherType]
|
||||
: TerrainType[fieldEffectChangedEvent.newTerrainType],
|
||||
type: fieldEffectChangedEvent instanceof WeatherChangedEvent
|
||||
effecType: fieldEffectChangedEvent instanceof WeatherChangedEvent
|
||||
? ArenaEffectType.WEATHER
|
||||
: ArenaEffectType.TERRAIN,
|
||||
maxDuration: fieldEffectChangedEvent.duration,
|
||||
|
|
Loading…
Reference in New Issue