From 96454a0df01eacaf9b97147ad0f7d4f8aa5ab209 Mon Sep 17 00:00:00 2001 From: koneko <67551503+koneko@users.noreply.github.com> Date: Sun, 2 Feb 2025 22:35:26 +0100 Subject: [PATCH] add more visual feedback to slotting gems --- public/assets/gui/frame_05.png | Bin 0 -> 9167 bytes src/classes/Assets.ts | 2 + src/classes/Bastion.ts | 11 +++-- src/classes/game/Gem.ts | 2 +- src/classes/game/NotificationManager.ts | 4 +- src/classes/game/Tower.ts | 11 ++++- src/classes/game/TowerManager.ts | 4 +- src/classes/gui/GemTab.ts | 21 ++++++---- src/classes/gui/TowerPanel.ts | 52 +++++++++++++++++++----- src/main.ts | 1 + src/scenes/Game.ts | 10 +++-- 11 files changed, 87 insertions(+), 31 deletions(-) create mode 100755 public/assets/gui/frame_05.png diff --git a/public/assets/gui/frame_05.png b/public/assets/gui/frame_05.png new file mode 100755 index 0000000000000000000000000000000000000000..2b24c7e838b9a53a38cc66f64dfd9ac887babb3b GIT binary patch literal 9167 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 bT$Tm^n};_0XgjfgKe5r%x{0jQu#f$J9FKeH literal 0 HcmV?d00001 diff --git a/src/classes/Assets.ts b/src/classes/Assets.ts index 9a92fd3..528aada 100644 --- a/src/classes/Assets.ts +++ b/src/classes/Assets.ts @@ -7,6 +7,7 @@ export default class GameAssets { public static Frame02Texture: PIXI.Texture; public static Frame03Texture: PIXI.Texture; public static Frame04Texture: PIXI.Texture; + public static Frame05Texture: PIXI.Texture; public static FrameInventory: PIXI.Texture; public static FrameBackground: PIXI.Texture; public static FrameTowerTab: PIXI.Texture; @@ -86,6 +87,7 @@ export default class GameAssets { this.Load('./assets/gui/frame_02.png').then((texture) => (this.Frame02Texture = texture)), this.Load('./assets/gui/frame_03.png').then((texture) => (this.Frame03Texture = texture)), this.Load('./assets/gui/frame_04.png').then((texture) => (this.Frame04Texture = texture)), + this.Load('./assets/gui/frame_05.png').then((texture) => (this.Frame05Texture = texture)), this.Load('./assets/gui/frame_inv.png').then((texture) => (this.FrameInventory = texture)), this.Load('./assets/gui/background_01.png').then((texture) => (this.FrameBackground = texture)), this.Load('./assets/gui/background_02.png').then((texture) => (this.FrameTowerTab = texture)), diff --git a/src/classes/Bastion.ts b/src/classes/Bastion.ts index db5ded7..8821991 100644 --- a/src/classes/Bastion.ts +++ b/src/classes/Bastion.ts @@ -9,6 +9,8 @@ import { GameScene } from '../scenes/Game'; import { AnimationManager } from './game/AnimationManager'; import NotificationManager from './game/NotificationManager'; import Gem from './game/Gem'; +import GameAssets from './Assets'; +import { GemType } from './Definitions'; export class Engine { public static app: PIXI.Application; @@ -27,9 +29,12 @@ export class Engine { public static MouseX: number = 0; public static MouseY: number = 0; - public static gemTest() { - for (let i = 0; i < 2; i++) { - this.GameScene.MissionStats.giveGem(new Gem(0)); + public static TestSuite() { + Engine.NotificationManager.Notify('Loaded testing suite.', 'danger'); + Engine.TowerManager.ToggleChoosingTowerLocation('RESET'); + Engine.TowerManager.PlaceTower(GameAssets.Towers[1], 10, 15, GameAssets.Towers[0].behaviour, true); + for (let i = 0; i < 16; i++) { + this.GameScene.MissionStats.giveGem(new Gem(GemType.Fire), true); } } } diff --git a/src/classes/game/Gem.ts b/src/classes/game/Gem.ts index 185a7ba..15c2614 100644 --- a/src/classes/game/Gem.ts +++ b/src/classes/game/Gem.ts @@ -8,7 +8,7 @@ export default class Gem { public texture: PIXI.Texture; public level: number = 1; public definition: GemDefinition; - private id; + public id; constructor(gemType: GemType) { this.definition = GameAssets.Gems[gemType]; this.texture = this.definition.textures[0]; diff --git a/src/classes/game/NotificationManager.ts b/src/classes/game/NotificationManager.ts index 04f2792..737be4e 100644 --- a/src/classes/game/NotificationManager.ts +++ b/src/classes/game/NotificationManager.ts @@ -55,7 +55,7 @@ export default class NotificationManager extends GameObject { this.bb.x = Engine.app.canvas.width / 2; this.bb.y = 40; this.copyBBToContainer(); - this.container.zIndex = 100; + this.container.zIndex = 200; Engine.app.stage.addChild(this.container); } public Notify(text, type: NotificationType) { @@ -74,7 +74,7 @@ export default class NotificationManager extends GameObject { if (this.ticks >= notif.ticksToFadeAway && !notif.animating) { notif.animating = true; Engine.AnimationManager.Animate( - new FadeInOut('out', 240, notif.textObj, () => { + new FadeInOut('out', 300, notif.textObj, () => { notif.destroy(); }) ); diff --git a/src/classes/game/Tower.ts b/src/classes/game/Tower.ts index 95e9448..3e3615d 100644 --- a/src/classes/game/Tower.ts +++ b/src/classes/game/Tower.ts @@ -64,8 +64,15 @@ export class Tower extends GameObject { public UnslotGem(index) { const gem = this.slottedGems.splice(index, 1)[0]; Engine.GameScene.MissionStats.giveGem(gem, true); + for (let i = index; i < this.slottedGems.length - 1; i++) { + if (this.slottedGems[i] == null) { + this.slottedGems[i] = this.slottedGems[i + 1]; + this.slottedGems[i + 1] = null; + } + } + this.slottedGems = this.slottedGems.filter((gem) => gem != null); Engine.NotificationManager.Notify( - `Gem Lv. ${gem.level} ${gem.definition.name} unslotted from ${this.name} and placed back in your inventory.`, + `Lv. ${gem.level} ${gem.definition.name} unslotted and placed back in your inventory.`, 'info' ); } @@ -111,7 +118,7 @@ export class Tower extends GameObject { } } - override destroy(): void { + public destroy(): void { super.destroy(); this.parent.clickDetector.off('pointerenter', this.onParentCellEnter); this.parent.clickDetector.off('pointerleave', this.onParentCellLeave); diff --git a/src/classes/game/TowerManager.ts b/src/classes/game/TowerManager.ts index 1082e62..d63d0e6 100644 --- a/src/classes/game/TowerManager.ts +++ b/src/classes/game/TowerManager.ts @@ -88,7 +88,7 @@ export default class TowerManager { return returnTower; } public PlaceTower(definition: TowerDefinition, row, column, behaviour: string, ignoreCost?) { - const sprite = this.selectedTower.texture; + const sprite = definition.texture; if (!Engine.GameScene.MissionStats.hasEnoughGold(definition.stats.cost) && !ignoreCost) return Engine.NotificationManager.Notify('Not enough gold.', 'warn'); if ( @@ -96,7 +96,7 @@ export default class TowerManager { Engine.Grid.getCellByRowAndCol(row, column).type != TerrainType.Path && Engine.Grid.getCellByRowAndCol(row, column).type != TerrainType.Restricted ) { - Engine.GameScene.MissionStats.spendGold(definition.stats.cost); + if (!ignoreCost) Engine.GameScene.MissionStats.spendGold(definition.stats.cost); let tower = new Tower(row, column, sprite, definition, behaviour); this.towers.push(tower); this.ToggleChoosingTowerLocation('RESET'); diff --git a/src/classes/gui/GemTab.ts b/src/classes/gui/GemTab.ts index 50cbf82..38777c6 100644 --- a/src/classes/gui/GemTab.ts +++ b/src/classes/gui/GemTab.ts @@ -37,12 +37,12 @@ export default class GemTab extends GuiObject { this.RebuildInventoryVisual(); }); } + // TODO: add more visual clarity public TowerPanelSelectingGem(gem: Gem, index: number, tower: Tower) { - console.log(this); - if (this.isSelectingGem) { - this.isSelectingGem = false; - this.selectingGemSlotIndex = -1; - } else { + console.log('TOWER PANEL SELECTING GEM ' + index); + if (index < 0) console.error('TOWER PANEL SELECTING GEM INDEX IS LESS THAN 0, ', index); + // index = Engine.GameScene.towerPanel.vGems.indexOf(gem); + if (!this.isSelectingGem) { this.isSelectingGem = true; if (gem == null) { // Want to select gem to slot in, already checked if player has a Gem. @@ -58,6 +58,13 @@ export default class GemTab extends GuiObject { this.RebuildInventoryVisual(); Engine.GameScene.towerPanel.Hide(); Engine.GameScene.towerPanel.Show(tower); + this.isSelectingGem = false; + this.selectingGemSlotIndex = -1; + this.selectingGemTowerObject = null; + } + } else { + if (gem == null) { + this.isSelectingGem = false; this.selectingGemSlotIndex = -1; this.selectingGemTowerObject = null; } @@ -69,8 +76,8 @@ export default class GemTab extends GuiObject { Engine.GameScene.MissionStats.getInventory().forEach((gem, index) => { let vGem = new VisualGemSlot(0, this.container, gem); - let vGemYCoord = 5; - let vGemXCoord = (index % 4) * 64 + 20; + let vGemYCoord = 10; + let vGemXCoord = (index % 4) * 70 + 10; let vGemYIdx = index; while (true) { if (vGemYIdx <= 3) break; diff --git a/src/classes/gui/TowerPanel.ts b/src/classes/gui/TowerPanel.ts index 167b906..b77e10b 100644 --- a/src/classes/gui/TowerPanel.ts +++ b/src/classes/gui/TowerPanel.ts @@ -11,17 +11,17 @@ import { GemEvents } from '../Events'; export class VisualGemSlot extends GuiObject { public iconSprite: PIXI.Sprite; private background: PIXI.Sprite; - private gem: Gem; - private i: number = 0; + private frame: PIXI.Sprite; + public i: number = 0; constructor(index: number, parent: PIXI.Container, gem: Gem | null) { super(true); let gtexture; + this.i = index; this.container.x = 10; - this.container.y = index * Engine.GridCellSize + 300; + this.container.y = index * (Engine.GridCellSize + 6) + 300; this.background = new PIXI.Sprite({ - texture: GameAssets.FrameInventory, + texture: GameAssets.Frame01Texture, }); - this.gem = gem; if (gem == null) { gtexture = GameAssets.PlusIconTexture; } else { @@ -45,18 +45,47 @@ export class VisualGemSlot extends GuiObject { this.iconSprite.width = Engine.GridCellSize - 8; this.iconSprite.height = Engine.GridCellSize - 8; } + this.frame = new PIXI.Sprite({ + texture: GameAssets.Frame05Texture, + width: 64, + height: 64, + }); + this.container.addChild(this.background); this.container.addChild(this.iconSprite); + this.container.addChild(this.frame); + if (Engine.latestCommit == 'DEVELOPMENT') { + let txt = gem ? gem.id : ''; + let dbgText = new PIXI.Text({ + text: txt, + zIndex: 11, + style: { + fill: 'white', + stroke: { + color: 0x000000, + width: 5, + }, + }, + }); + this.container.addChild(dbgText); + } parent.addChild(this.container); } - public onClick(e: PIXI.FederatedPointerEvent): void {} + + public setTint(color) { + this.frame.tint = color; + } + + public resetTint() { + this.frame.tint = 0xffffff; + } } export default class TowerPanel extends GuiObject { private bounds: PIXI.Rectangle; private towerPanel: PIXI.NineSliceSprite; private closeBtn: Button; - private vGems: VisualGemSlot[] = []; + public vGems: VisualGemSlot[] = []; public isShown: boolean = false; public titleText: PIXI.Text; @@ -119,10 +148,11 @@ export default class TowerPanel extends GuiObject { let amount = tower.definition.stats.gemSlotsAmount; // amount = 6; for (let i = 0; i < amount; i++) { + console.log('BUILDING TOWER PANEL ' + i); let gem = tower.slottedGems[i]; - console.log(gem); if (!gem) gem = null; const vGem = new VisualGemSlot(i, this.container, gem); + vGem.resetTint(); this.vGems.push(vGem); vGem.container.onpointermove = () => { if (!gem) return; @@ -134,8 +164,10 @@ export default class TowerPanel extends GuiObject { }; vGem.onClick = () => { Engine.GameScene.tooltip.Hide(); - console.log('MAKESLOTS ', gem); - Engine.GameScene.events.emit(GemEvents.TowerPanelSelectGem, gem, i, tower); + console.warn('EMITTING TOWER PANEL SELECT GEM', gem, vGem.i, i, tower); + Engine.GameScene.events.emit(GemEvents.TowerPanelSelectGem, gem, vGem.i, tower); + if (!gem && Engine.GameScene.sidebar.gemTab.isSelectingGem) vGem.setTint(0x00ffff); + else vGem.resetTint(); }; } } diff --git a/src/main.ts b/src/main.ts index fac0057..39659c1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -67,4 +67,5 @@ import GameUIConstants from './classes/GameUIConstants'; window.onbeforeunload = () => { return 'You are about to leave.'; }; + else Engine.TestSuite(); })(); diff --git a/src/scenes/Game.ts b/src/scenes/Game.ts index 89a11ff..b6a58d8 100644 --- a/src/scenes/Game.ts +++ b/src/scenes/Game.ts @@ -114,15 +114,17 @@ export class GameScene extends Scene { 'You require atleast 1 Gem in your inventory to slot it in a Gem slot.', 'warn' ); - console.log(gem); - this.sidebar.gemTab.TowerPanelSelectingGem(gem, index, tower); - } else { - this.sidebar.gemTab.TowerPanelSelectingGem(gem, -1, tower); } + this.sidebar.gemTab.TowerPanelSelectingGem(gem, index, tower); }); this.ticker = new PIXI.Ticker(); this.ticker.maxFPS = 60; this.ticker.minFPS = 30; + // fix tooltip behaving weirdly for some reason + this.tooltip.SetContentTower(0, 0, 0, 0); + this.tooltip.Show(Engine.MouseX, Engine.MouseY); + this.tooltip.Hide(); + this.ticker.add(() => { if (this.update) this.update(this.ticker.elapsedMS); });