Begin refactoring GameScene

This commit is contained in:
Peter Stockings
2026-01-26 15:30:14 +11:00
parent 1d7be54fd9
commit ef7d85750f
46 changed files with 2459 additions and 1291 deletions

View File

@@ -1,39 +1,49 @@
import { describe, it, expect, beforeEach } from "vitest";
import { ItemManager } from "../../scenes/systems/ItemManager";
import type { World, CombatantActor, Item } from "../../core/types";
import { EntityManager } from "../../engine/EntityManager";
import type { World, CombatantActor, Item, EntityId } from "../../core/types";
import { EntityAccessor } from "../../engine/EntityAccessor";
import { ECSWorld } from "../../engine/ecs/World";
describe("ItemManager - Stacking Logic", () => {
let itemManager: ItemManager;
let entityManager: EntityManager;
let accessor: EntityAccessor;
let world: World;
let player: CombatantActor;
let ecsWorld: ECSWorld;
beforeEach(() => {
world = {
width: 10,
height: 10,
tiles: [],
actors: new Map(),
tiles: new Array(100).fill(0),
exit: { x: 9, y: 9 }
} as any;
entityManager = new EntityManager(world);
itemManager = new ItemManager(world, entityManager);
ecsWorld = new ECSWorld();
accessor = new EntityAccessor(world, 0 as EntityId, ecsWorld);
itemManager = new ItemManager(world, accessor, ecsWorld);
player = {
id: 0,
id: 0 as EntityId,
pos: { x: 1, y: 1 },
category: "combatant",
isPlayer: true,
type: "player",
inventory: { gold: 0, items: [] },
stats: {} as any,
stats: { hp: 10, maxHp: 10 } as any,
equipment: {} as any,
speed: 1,
speed: 100,
energy: 0
};
world.actors.set(0, player);
// Sync player to ECS
ecsWorld.addComponent(player.id, "position", player.pos);
ecsWorld.addComponent(player.id, "player", {});
ecsWorld.addComponent(player.id, "stats", player.stats);
ecsWorld.addComponent(player.id, "actorType", { type: "player" });
ecsWorld.addComponent(player.id, "inventory", player.inventory!);
ecsWorld.addComponent(player.id, "energy", { current: 0, speed: 100 });
});
it("should stack stackable items when picked up", () => {
@@ -47,25 +57,27 @@ describe("ItemManager - Stacking Logic", () => {
quantity: 1
};
const playerActor = accessor.getPlayer()!;
// First potion
itemManager.spawnItem(potion, { x: 1, y: 1 });
itemManager.tryPickup(player);
itemManager.tryPickup(playerActor);
expect(player.inventory!.items.length).toBe(1);
expect(player.inventory!.items[0].quantity).toBe(1);
expect(playerActor.inventory!.items.length).toBe(1);
expect(playerActor.inventory!.items[0].quantity).toBe(1);
// Second potion
itemManager.spawnItem(potion, { x: 1, y: 1 });
itemManager.tryPickup(player);
itemManager.tryPickup(playerActor);
expect(player.inventory!.items.length).toBe(1);
expect(player.inventory!.items[0].quantity).toBe(2);
expect(playerActor.inventory!.items.length).toBe(1);
expect(playerActor.inventory!.items[0].quantity).toBe(2);
});
it("should NOT stack non-stackable items", () => {
const sword: Item = {
id: "sword",
name: "Sword",
id: "iron_sword",
name: "Iron Sword",
type: "Weapon",
weaponType: "melee",
textureKey: "items",
@@ -74,40 +86,44 @@ describe("ItemManager - Stacking Logic", () => {
stats: { attack: 1 }
} as any;
const playerActor = accessor.getPlayer()!;
// First sword
itemManager.spawnItem(sword, { x: 1, y: 1 });
itemManager.tryPickup(player);
itemManager.tryPickup(playerActor);
expect(player.inventory!.items.length).toBe(1);
expect(playerActor.inventory!.items.length).toBe(1);
// Second sword
itemManager.spawnItem(sword, { x: 1, y: 1 });
itemManager.tryPickup(player);
itemManager.tryPickup(playerActor);
expect(player.inventory!.items.length).toBe(2);
expect(playerActor.inventory!.items.length).toBe(2);
});
it("should sum quantities of stackable items correctly", () => {
const ammo: Item = {
id: "ammo",
name: "Ammo",
id: "9mm_ammo",
name: "9mm Ammo",
type: "Ammo",
textureKey: "items",
spriteIndex: 2,
stackable: true,
quantity: 10,
ammoType: "9mm"
};
} as any;
const playerActor = accessor.getPlayer()!;
itemManager.spawnItem(ammo, { x: 1, y: 1 });
itemManager.tryPickup(player);
itemManager.tryPickup(playerActor);
expect(player.inventory!.items[0].quantity).toBe(10);
expect(playerActor.inventory!.items[0].quantity).toBe(10);
const moreAmmo = { ...ammo, quantity: 5 };
itemManager.spawnItem(moreAmmo, { x: 1, y: 1 });
itemManager.tryPickup(player);
itemManager.tryPickup(playerActor);
expect(player.inventory!.items[0].quantity).toBe(15);
expect(playerActor.inventory!.items[0].quantity).toBe(15);
});
});