From 2647d8cfd21f8b741b1bcc72316b41c9e28208fa Mon Sep 17 00:00:00 2001 From: koneko <67551503+koneko@users.noreply.github.com> Date: Tue, 21 Jan 2025 13:32:57 +0100 Subject: [PATCH] begin inventory + gems --- public/assets/gems/fire/1.png | Bin 0 -> 10604 bytes public/assets/gems/fire/2.png | Bin 0 -> 7011 bytes public/assets/json/Gems.json | 0 src/classes/Assets.ts | 2 ++ src/classes/Definitions.ts | 13 +++++----- src/classes/game/Gem.ts | 10 +++++++- src/classes/game/Grid.ts | 2 ++ src/classes/game/Inventory.ts | 5 ++++ src/classes/gui/Tooltip.ts | 2 +- src/classes/gui/TowerPanel.ts | 47 ++++++++++++++++++++++++++++++++-- 10 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 public/assets/gems/fire/1.png create mode 100644 public/assets/gems/fire/2.png create mode 100644 public/assets/json/Gems.json create mode 100644 src/classes/game/Inventory.ts diff --git a/public/assets/gems/fire/1.png b/public/assets/gems/fire/1.png new file mode 100644 index 0000000000000000000000000000000000000000..64c4c3e11cbb200b7584c619636dfe7503400210 GIT binary patch literal 10604 zcmV-yDU;TTP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 BrXv6V literal 0 HcmV?d00001 diff --git a/public/assets/json/Gems.json b/public/assets/json/Gems.json new file mode 100644 index 0000000..e69de29 diff --git a/src/classes/Assets.ts b/src/classes/Assets.ts index ef06319..2579e29 100644 --- a/src/classes/Assets.ts +++ b/src/classes/Assets.ts @@ -29,6 +29,7 @@ export default class GameAssets { public static HomeIconTexture: PIXI.Texture; public static HammerIconTexture: PIXI.Texture; public static XIconTexture: PIXI.Texture; + public static PlusIconTexture: PIXI.Texture; public static GemAmountIcons: PIXI.Texture[] = []; public static Missions: MissionDefinition[]; @@ -101,6 +102,7 @@ export default class GameAssets { this.Load('/assets/gui/icons/home.png').then((texture) => (this.HomeIconTexture = texture)), this.Load('/assets/gui/icons/hammer.png').then((texture) => (this.HammerIconTexture = texture)), this.Load('/assets/gui/icons/cross.png').then((texture) => (this.XIconTexture = texture)), + this.Load('/assets/gui/icons/plus.png').then((texture) => (this.PlusIconTexture = texture)), this.LoadMissions(), this.LoadTowers(), this.LoadCreeps(), diff --git a/src/classes/Definitions.ts b/src/classes/Definitions.ts index da4701d..e3ab53e 100644 --- a/src/classes/Definitions.ts +++ b/src/classes/Definitions.ts @@ -72,18 +72,19 @@ export type TowerStatsDefinition = { export type PathDefinition = [[row: number, column: number]]; -export enum CreepType { - Basic = 0, - Quick = 1, - Tank = 2, -} - export enum TerrainType { Restricted = 0, Buildable = 1, Path = 9, } +// Make sure to sync these with the respective JSON files. +export enum CreepType { + Basic = 0, + Quick = 1, + Tank = 2, +} + export enum GemType { Fire = 0, Yeti = 1, diff --git a/src/classes/game/Gem.ts b/src/classes/game/Gem.ts index 4a51259..ec292ec 100644 --- a/src/classes/game/Gem.ts +++ b/src/classes/game/Gem.ts @@ -1 +1,9 @@ -export default class Gem {} +import * as PIXI from 'pixi.js'; +import { GemType } from '../Definitions'; +export default class Gem { + public texture: PIXI.Texture; + public type: GemType; + public level: number = 1; + // TODO: create and load from Gems.json and also load gem textures + constructor(gemType) {} +} diff --git a/src/classes/game/Grid.ts b/src/classes/game/Grid.ts index 3706226..8169204 100644 --- a/src/classes/game/Grid.ts +++ b/src/classes/game/Grid.ts @@ -84,6 +84,8 @@ export class Cell extends GameObject { if (this.hasTowerPlaced) { const tower = Engine.TowerManager.GetTowerByRowAndCol(this.row, this.column); Engine.GameScene.towerPanel.Show(tower); + } else { + // TODO: hide the sidepanel somehow } } public checkIfCantPlace() { diff --git a/src/classes/game/Inventory.ts b/src/classes/game/Inventory.ts new file mode 100644 index 0000000..d360f8e --- /dev/null +++ b/src/classes/game/Inventory.ts @@ -0,0 +1,5 @@ +import GameObject from '../GameObject'; + +export default class Inventory extends GameObject { + public update() {} +} diff --git a/src/classes/gui/Tooltip.ts b/src/classes/gui/Tooltip.ts index 763176a..93d6558 100644 --- a/src/classes/gui/Tooltip.ts +++ b/src/classes/gui/Tooltip.ts @@ -105,7 +105,7 @@ export default class Tooltip extends GuiObject { }); this.gemAmount = new PIXI.Text({ x: 54, - y: 108, + y: 105, zIndex: 5, text: 'Something went wrong if you see this.', style: { diff --git a/src/classes/gui/TowerPanel.ts b/src/classes/gui/TowerPanel.ts index 53e2b5a..3038fb6 100644 --- a/src/classes/gui/TowerPanel.ts +++ b/src/classes/gui/TowerPanel.ts @@ -5,13 +5,48 @@ import { Engine } from '../Bastion'; import GameUIConstants from '../GameUIConstants'; import Button, { ButtonTexture } from './Button'; import { Tower } from '../game/Tower'; +import Gem from '../game/Gem'; + +class VisualGemSlot extends GuiObject { + private background: PIXI.Sprite; + private iconSprite: PIXI.Sprite; + private i: number = 0; + constructor(index: number, parent: PIXI.Container, gem: Gem | null) { + super(true); + let gtexture; + if (gem == null) { + gtexture = GameAssets.PlusIconTexture; + } else { + gtexture = gem.texture; + } + this.container.x = 10; + this.container.y = index * Engine.GridCellSize + 300; + this.background = new PIXI.Sprite({ + texture: GameAssets.FrameInventory, + }); + this.iconSprite = new PIXI.Sprite({ + texture: gtexture, + }); + this.background.width = Engine.GridCellSize; + this.background.height = Engine.GridCellSize; + this.iconSprite.x = Engine.GridCellSize / 2; + this.iconSprite.y = Engine.GridCellSize / 2; + this.iconSprite.width = Engine.GridCellSize / 2; + this.iconSprite.height = Engine.GridCellSize / 2; + this.iconSprite.anchor.set(0.5, 0.5); + this.container.addChild(this.background); + this.container.addChild(this.iconSprite); + parent.addChild(this.container); + } + public onClick(e: PIXI.FederatedPointerEvent): void {} +} export default class TowerPanel extends GuiObject { private bounds: PIXI.Rectangle; private towerPanel: PIXI.NineSliceSprite; private closeBtn: Button; public isShown: boolean = false; - titleText: PIXI.Text; + public titleText: PIXI.Text; constructor(bounds: PIXI.Rectangle) { super(false); @@ -64,10 +99,18 @@ export default class TowerPanel extends GuiObject { this.titleText.anchor.set(0.5, 0); this.container.addChild(this.titleText); } + private MakeSlots(tower: Tower) { + let amount = tower.definition.stats.gemSlotsAmount; + amount = 6; + for (let i = 0; i < amount; i++) { + const element = new VisualGemSlot(i, this.container, null); + } + } public Show(tower: Tower) { let mouseX = Engine.MouseX; this.isShown = true; this.SetContent(tower); + this.MakeSlots(tower); if (mouseX < 900) { this.ShowRight(); } else { @@ -81,7 +124,7 @@ export default class TowerPanel extends GuiObject { this.towerPanel.x = -100; this.container.x = 0; this.container.alpha = 1; - this.closeBtn.container.x = this.container.width - 150; + this.closeBtn.container.x = this.bounds.width - 150; } private ShowRight() { this.towerPanel.x = -10;