import ZoneCharacter from './zoneCharacter' import { Character } from '#entities/character' import { Zone } from '#entities/zone' import zoneEventTileRepository from '#repositories/zoneEventTileRepository' class LoadedZone { private readonly zone: Zone private characters: ZoneCharacter[] = [] constructor(zone: Zone) { this.zone = zone } public getZone(): Zone { return this.zone } public addCharacter(character: Character) { const zoneCharacter = new ZoneCharacter(character) this.characters.push(zoneCharacter) } public async removeCharacter(id: number) { const zoneCharacter = this.getCharacterById(id) if (zoneCharacter) { await zoneCharacter.savePosition() this.characters = this.characters.filter((c) => c.character.id !== id) } } public getCharacterById(id: number): ZoneCharacter | undefined { return this.characters.find((c) => c.character.id === id) } public getCharactersInZone(): ZoneCharacter[] { return this.characters } public async getGrid(): Promise { let grid: number[][] = Array.from({ length: this.zone.height }, () => Array.from({ length: this.zone.width }, () => 0)) const eventTiles = await zoneEventTileRepository.getAll(this.zone.id) // Set the grid values based on the event tiles, these are strings eventTiles.forEach((eventTile) => { if (eventTile.type === 'BLOCK') { grid[eventTile.positionY][eventTile.positionX] = 1 } }) return grid } } export default LoadedZone