From be208d48b64885e8eb04f297900a2c344df1fad1 Mon Sep 17 00:00:00 2001 From: Adrian T <68144167+torranx@users.noreply.github.com> Date: Wed, 19 Jun 2024 12:29:56 +0800 Subject: [PATCH] [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 --- src/events/arena.ts | 9 +++++++- src/field/arena.ts | 12 ++++++++-- src/ui/arena-flyout.ts | 51 +++++++++++++++++++++++++++++++----------- 3 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/events/arena.ts b/src/events/arena.ts index 657acaeae7e..67b423f3b75 100644 --- a/src/events/arena.ts +++ b/src/events/arena.ts @@ -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; } } /** diff --git a/src/field/arena.ts b/src/field/arena.ts index 14280536a5f..de95af69a23 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -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; } diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index 0568d1524aa..963b1ac4eb1 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -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,