diff --git a/ts/src/game/interaction/state/root/inventory/equipActions.ts b/ts/src/game/interaction/state/root/inventory/equipActions.ts deleted file mode 100644 index 8363553..0000000 --- a/ts/src/game/interaction/state/root/inventory/equipActions.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { - InventoryItem, - ItemTag, -} from "../../../../../data/inventory/inventoryItem.js"; -import { - EquipmentComponent, - EquipmentSlot, -} from "../../../../component/inventory/equipmentComponent.js"; -import { InventoryComponent2 } from "../../../../component/inventory/inventoryComponent.js"; -import { Entity } from "../../../../entity/entity.js"; -import { StateContext } from "../../../handler/stateContext.js"; -import { EquipItemConfirmState } from "./equipItemConfirmState.js"; -import { InventoryEquipAction } from "./inventoryState.js"; - -export class ConfirmEquipAction implements InventoryEquipAction { - isApplicable(item: InventoryItem): boolean { - return item.tag?.some((tag) => tag === ItemTag.SkillGear) || false; - } - - onEquip(item: InventoryItem, stateContext: StateContext) { - stateContext.stateChanger.push(new EquipItemConfirmState(item)); - } -} - -export class EquipOnActorAction implements InventoryEquipAction { - constructor( - private entity: Entity, - private equipmentSlot: EquipmentSlot, - ) {} - - isApplicable(item: InventoryItem): boolean { - const applicableItemTags = this.equipmentSlot.applicableItemTags(); - return ( - item.tag?.some((selectedItemTag) => - applicableItemTags.some( - (equipmentSlotItemTag) => - selectedItemTag === equipmentSlotItemTag, - ), - ) || false - ); - } - - onEquip(item: InventoryItem, stateContext: StateContext) { - const inventoryComponent = - this.entity.getComponent(InventoryComponent2); - - inventoryComponent?.removeInventoryItem(item.id, 1); - this.equipmentSlot.setItem(item); - stateContext.stateChanger.pop(null); - } -} diff --git a/ts/src/game/interaction/state/root/inventory/equipItemConfirmState.ts b/ts/src/game/interaction/state/root/inventory/equipItemConfirmState.ts deleted file mode 100644 index 17c0612..0000000 --- a/ts/src/game/interaction/state/root/inventory/equipItemConfirmState.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { sprites2 } from "../../../../../asset/sprite.js"; -import { - InventoryItem, - ItemCategory, -} from "../../../../../data/inventory/inventoryItem.js"; -import { RenderContext } from "../../../../../rendering/renderContext.js"; -import { uiBox } from "../../../../../ui/dsl/uiBoxDsl.js"; -import { fillUiSize } from "../../../../../ui/uiSize.js"; -import { WorkerBehaviorComponent } from "../../../../component/behavior/workerBehaviorComponent.js"; -import { SpriteComponent } from "../../../../component/draw/spriteComponent.js"; -import { EquipmentComponent } from "../../../../component/inventory/equipmentComponent.js"; -import { InventoryComponent2 } from "../../../../component/inventory/inventoryComponent.js"; -import { ChunkMapComponent } from "../../../../component/root/chunk/chunkMapComponent.js"; -import { firstChildWhere } from "../../../../entity/child/first.js"; -import { Entity } from "../../../../entity/entity.js"; -import { GroundTile } from "../../../../map/tile.js"; -import { TileSize } from "../../../../map/tile.js"; -import { InteractionState } from "../../../handler/interactionState.js"; -import { StateContext } from "../../../handler/stateContext.js"; -import { UIActionbarItem } from "../../../view/actionbar/uiActionbar.js"; -import { UIActionbarScaffold } from "../../../view/actionbar/uiActionbarScaffold.js"; -import { AlertMessageState } from "../../common/alertMessageState.js"; -import { InventoryEquipAction } from "./inventoryState.js"; - -export class EquipItemConfirmState extends InteractionState { - private cursorSelection: Entity | null = null; - private inventoryItem: InventoryItem; - - constructor(inventoryItem: InventoryItem) { - super(); - this.inventoryItem = inventoryItem; - } - - override onActive(): void { - this.cursorSelection = firstChildWhere(this.context.root, (child) => { - return isWorker(child); - }); - - const actions: UIActionbarItem[] = [ - { - text: "Confirm", - icon: sprites2.empty_sprite, - onClick: () => { - this.confirmEquip(); - }, - }, - { - text: "Cancel", - icon: sprites2.empty_sprite, - onClick: () => { - this.cancel(); - }, - }, - ]; - - const contentView = uiBox({ - width: fillUiSize, - height: fillUiSize, - }); - - const scaffoldState = new UIActionbarScaffold( - contentView, - actions, - [], - { width: fillUiSize, height: fillUiSize }, - ); - - this.view = scaffoldState; - } - - override onDraw(context: RenderContext): void { - // Draw a scrim below the content - context.drawScreenSpaceRectangle({ - x: 0, - y: 0, - width: context.width, - height: context.height, - fill: "rgba(20, 20, 20, 0.8)", - }); - // Call our super to draw the view - super.onDraw(context); - - // Draw all workers on top of the scrim - this.drawWorker(context, this.context.root); - - // Draw the currently selected worker cursor - if (this.cursorSelection) { - context.drawSprite({ - sprite: sprites2.cursor, - x: this.cursorSelection.position.x * TileSize, - y: this.cursorSelection.position.y * TileSize, - }); - } - } - - override onTileTap(tile: GroundTile): boolean { - const workers = this.context.root - .requireComponent(ChunkMapComponent) - .getEntityAt({ - x: tile.tileX, - y: tile.tileY, - }) - .filter((entity) => { - return isWorker(entity); - }); - - if (workers.length > 0) { - this.cursorSelection = workers[0]; - return true; - } else { - return false; - } - } - - private confirmEquip() { - if (this.cursorSelection == null) { - throw new Error("Cannot confirm equip on empty selection"); - } - - const inventoryComponent = - this.cursorSelection.getComponent(InventoryComponent2); - if (!inventoryComponent) { - throw new Error("No inventory component present on root entity"); - } - - const equipmentComponent = - this.cursorSelection.getComponent(EquipmentComponent); - - if (!equipmentComponent) { - throw new Error("No equipment component on selection"); - } - - const removeResult = inventoryComponent.removeInventoryItem( - this.inventoryItem.id, - 1, - ); - - if (removeResult) { - equipmentComponent.mainItem.setItem(this.inventoryItem); - this.context.stateChanger.clear(); - } else { - this.context.stateChanger.replace( - new AlertMessageState("Uh oh", "Item no longer available"), - ); - } - } - - private cancel() { - this.context.stateChanger.pop(null); - } - - private drawWorker(context: RenderContext, worker: Entity) { - if (isWorker(worker)) { - //worker.onDraw(context); - /* - const screenPosition = context.camera.tileSpaceToScreenSpace( - worker.worldPosition - ); - //Draw the name of the npc - context.drawText({ - text: "Philip", - x: screenPosition.x, - y: screenPosition.y + 40, - color: "white", - font: "Silkscreen", - size: 16, - });*/ - } - - for (const childWorker of worker.children) { - this.drawWorker(context, childWorker); - } - } -} - -function isWorker(entity: Entity) { - const workerComponent = entity.getComponent(WorkerBehaviorComponent); - const equipmentComponent = entity.getComponent(EquipmentComponent); - return !!workerComponent && !!equipmentComponent; -} diff --git a/ts/src/game/interaction/state/root/inventory/inventoryState.ts b/ts/src/game/interaction/state/root/inventory/inventoryState.ts index 2f29c6a..5f10d02 100644 --- a/ts/src/game/interaction/state/root/inventory/inventoryState.ts +++ b/ts/src/game/interaction/state/root/inventory/inventoryState.ts @@ -20,6 +20,7 @@ import { UIView } from "../../../../../ui/uiView.js"; import { UIFlowGrid } from "../../../../../ui/view/uiFlowGrid.js"; import { UIMasterDetails } from "../../../../../ui/view/uiMasterDetail.js"; import { OpenBookUIBackground } from "../../../../../ui/visual/bookBackground.js"; +import { EquipmentComponent } from "../../../../component/inventory/equipmentComponent.js"; import { InventoryComponent2 } from "../../../../component/inventory/inventoryComponent.js"; import { Entity } from "../../../../entity/entity.js"; import { InteractionState } from "../../../handler/interactionState.js"; @@ -27,7 +28,6 @@ import { StateContext } from "../../../handler/stateContext.js"; import { UIActionbarItem } from "../../../view/actionbar/uiActionbar.js"; import { UIActionbarScaffold } from "../../../view/actionbar/uiActionbarScaffold.js"; import { AlertMessageState } from "../../common/alertMessageState.js"; -import { EquipItemConfirmState } from "./equipItemConfirmState.js"; import { UIInventoryGridItem } from "./uiInventoryGridItem.js"; export class InventoryState extends InteractionState { @@ -41,7 +41,8 @@ export class InventoryState extends InteractionState { return true; } - constructor(private forEntity: Entity) { + //Todo: add parameters for filtering and button providers + constructor(private forInventory: InventoryComponent2) { super(); } @@ -94,14 +95,7 @@ export class InventoryState extends InteractionState { } private getInventoryItemList() { - const inventoryComponent = - this.forEntity.getComponent(InventoryComponent2); - - if (!inventoryComponent) { - throw new Error("No inventory component on root entity"); - } - - this._items = inventoryComponent.items; + this._items = this.forInventory.items; } private getMasterGridView(): UIView { @@ -328,7 +322,7 @@ export class InventoryState extends InteractionState { text: "Equip", icon: sprites2.empty_sprite, onClick: () => { - //this._equipAction.onEquip(activeItem.item, this.context); + this.onEquip(activeItem.item); }, }); @@ -343,6 +337,24 @@ export class InventoryState extends InteractionState { return actions; } } + + private onEquip(item: InventoryItem) { + const equipmentComponent = + this.forInventory.entity.getComponent(EquipmentComponent); + + if (!equipmentComponent) { + this.context.stateChanger.push( + new AlertMessageState("Uh oh", "Not available"), + ); + return; + } + + const removeResult = this.forInventory.removeInventoryItem(item.id, 1); + if (removeResult) { + equipmentComponent.mainItem.setItem(item); + this.context.stateChanger.pop(); + } + } } export function getAssetImage(index: number): Sprite2 | null { @@ -359,8 +371,3 @@ export function getAssetImage(index: number): Sprite2 | null { return null; } } - -export interface InventoryEquipAction { - onEquip(item: InventoryItem, stateContext: StateContext); - isApplicable(item: InventoryItem): boolean; -} diff --git a/ts/src/game/interaction/state/root/rootState.ts b/ts/src/game/interaction/state/root/rootState.ts index 13e900d..3385137 100644 --- a/ts/src/game/interaction/state/root/rootState.ts +++ b/ts/src/game/interaction/state/root/rootState.ts @@ -23,7 +23,6 @@ import { UIActionbarScaffold } from "../../view/actionbar/uiActionbarScaffold.js import { AlertMessageState } from "../common/alertMessageState.js"; import { MenuState } from "../menu/menuState.js"; import { BuildingState } from "./building/buildingState.js"; -import { ConfirmEquipAction } from "./inventory/equipActions.js"; import { InventoryState } from "./inventory/inventoryState.js"; export class RootState extends InteractionState { diff --git a/ts/src/game/interaction/state/selection/actor/provider/workerSelectionProvider.ts b/ts/src/game/interaction/state/selection/actor/provider/workerSelectionProvider.ts index 64d04a1..bb91e07 100644 --- a/ts/src/game/interaction/state/selection/actor/provider/workerSelectionProvider.ts +++ b/ts/src/game/interaction/state/selection/actor/provider/workerSelectionProvider.ts @@ -21,7 +21,6 @@ import { ButtonCollection } from "../../../../view/actionbar/buttonCollection.js import { UIActionbarItem } from "../../../../view/actionbar/uiActionbar.js"; import { CharacterSkillState } from "../../../character/characterSkillState.js"; import { AlertMessageState } from "../../../common/alertMessageState.js"; -import { EquipOnActorAction } from "../../../root/inventory/equipActions.js"; import { InventoryState } from "../../../root/inventory/inventoryState.js"; import { ActorMovementState } from "../actorMovementState.js"; import { @@ -208,8 +207,11 @@ export class WorkerSelectionProvider implements ActorSelectionProvider { text: "Stash", icon: sprites2.empty_sprite, onClick: () => { + const inventory = + selectedEntity.requireComponent(InventoryComponent2); + stateContext.stateChanger.push( - new InventoryState(selectedEntity), + new InventoryState(inventory), ); }, }, @@ -239,8 +241,11 @@ export class WorkerSelectionProvider implements ActorSelectionProvider { { text: "Equip", onClick: () => { + const inventory = + selectedEntity.requireComponent(InventoryComponent2); + stateContext.stateChanger.push( - new InventoryState(selectedEntity), + new InventoryState(inventory), ); }, icon: sprites2.empty_sprite, @@ -257,8 +262,11 @@ export class WorkerSelectionProvider implements ActorSelectionProvider { { text: "Equip", onClick: () => { + const inventory = + selectedEntity.requireComponent(InventoryComponent2); + stateContext.stateChanger.push( - new InventoryState(selectedEntity), + new InventoryState(inventory), ); }, icon: sprites2.empty_sprite, diff --git a/ts/test/game/component/inventory/equipmentComponent.test.ts b/ts/test/game/component/inventory/equipmentComponent.test.ts index 10eed72..038314e 100644 --- a/ts/test/game/component/inventory/equipmentComponent.test.ts +++ b/ts/test/game/component/inventory/equipmentComponent.test.ts @@ -1,13 +1,5 @@ import * as assert from "node:assert"; import { describe, it } from "node:test"; -import { EnergyComponent } from "../../../../src/game/component/energy/energyComponent.js"; +import { EquipmentComponent } from "../../../../src/game/component/inventory/equipmentComponent.js"; -describe("EquipmentComponent", () => { - it("Can set inventory item", () => { - assert.equal(1, 1); - }); - - it("Will return item to inventory on existing item equiped", () => { - assert.equal(1, 1); - }); -}); +describe("EquipmentComponent", () => {});