pixi-tiledmap 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["pixiPath"],"sources":["../src/parser/decodeData.ts","../src/types/index.ts","../src/parser/decodeGid.ts","../src/parser/parseTmx.ts","../src/parser/resolveMap.ts","../src/renderer/parseColor.ts","../src/renderer/GroupLayerRenderer.ts","../src/renderer/ImageLayerRenderer.ts","../src/renderer/ObjectLayerRenderer.ts","../src/renderer/tilePlacement.ts","../src/renderer/TileLayerRenderer.ts","../src/renderer/createLayerRenderer.ts","../src/renderer/TileSetRenderer.ts","../src/renderer/TiledMap.ts","../src/renderer/tiledAssetLoader.ts"],"sourcesContent":["import type { TiledCompression, TiledEncoding } from '../types'\n\nexport function decodeLayerData(\n data: number[] | string,\n encoding?: TiledEncoding,\n compression?: TiledCompression\n): number[] {\n if (Array.isArray(data)) {\n return data\n }\n\n if (encoding === 'base64') {\n const bytes = base64ToBytes(data)\n\n if (compression === 'gzip' || compression === 'zlib') {\n const decompressed = decompressBytes(bytes, compression)\n return bytesToGids(decompressed)\n }\n\n if (compression === 'zstd') {\n throw new Error('zstd compression is not supported in the browser')\n }\n\n return bytesToGids(bytes)\n }\n\n throw new Error(`Unsupported encoding: ${encoding ?? 'unknown'}`)\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n const binary = globalThis.atob(base64.trim())\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n}\n\nfunction bytesToGids(bytes: Uint8Array): number[] {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const count = bytes.byteLength / 4\n const gids: number[] = new Array(count)\n\n for (let i = 0; i < count; i++) {\n gids[i] = view.getUint32(i * 4, true)\n }\n\n return gids\n}\n\nasync function decompressBytesAsync(\n bytes: Uint8Array,\n compression: 'gzip' | 'zlib'\n): Promise<Uint8Array> {\n const format = compression === 'gzip' ? 'gzip' : 'deflate'\n const ds = new DecompressionStream(format)\n const writer = ds.writable.getWriter()\n writer.write(bytes as Uint8Array<ArrayBuffer>)\n writer.close()\n\n const reader = ds.readable.getReader()\n const chunks: Uint8Array[] = []\n let totalLength = 0\n\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n chunks.push(value)\n totalLength += value.byteLength\n }\n\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const chunk of chunks) {\n result.set(chunk, offset)\n offset += chunk.byteLength\n }\n return result\n}\n\nfunction decompressBytes(_bytes: Uint8Array, compression: 'gzip' | 'zlib'): Uint8Array {\n if (typeof DecompressionStream !== 'undefined') {\n // Synchronous wrapper is not possible for DecompressionStream.\n // We throw here — the async path should be used instead.\n throw new Error(\n `Compressed tile data (${compression}) requires the async parser. ` +\n 'Use parseMapAsync() instead of parseMap() for compressed maps.'\n )\n }\n\n throw new Error(\n `Compressed tile data (${compression}) is not supported in this environment. ` +\n 'DecompressionStream API is required.'\n )\n}\n\nexport async function decodeLayerDataAsync(\n data: number[] | string,\n encoding?: TiledEncoding,\n compression?: TiledCompression\n): Promise<number[]> {\n if (Array.isArray(data)) {\n return data\n }\n\n if (encoding === 'base64') {\n const bytes = base64ToBytes(data)\n\n if (compression === 'gzip' || compression === 'zlib') {\n const decompressed = await decompressBytesAsync(bytes, compression)\n return bytesToGids(decompressed)\n }\n\n if (compression === 'zstd') {\n throw new Error('zstd compression is not supported in the browser')\n }\n\n return bytesToGids(bytes)\n }\n\n throw new Error(`Unsupported encoding: ${encoding ?? 'unknown'}`)\n}\n","// ─── Tiled JSON Map Format Types ─────────────────────────────────────────────\n// Based on Tiled 1.11 JSON Map Format specification\n// https://doc.mapeditor.org/en/stable/reference/json-map-format/\n\nimport type { Container, Texture } from 'pixi.js'\n\n// ─── Enums / String Unions ───────────────────────────────────────────────────\n\nexport type TiledOrientation = 'orthogonal' | 'isometric' | 'staggered' | 'hexagonal'\n\nexport type TiledRenderOrder = 'right-down' | 'right-up' | 'left-down' | 'left-up'\n\nexport type TiledStaggerAxis = 'x' | 'y'\n\nexport type TiledStaggerIndex = 'odd' | 'even'\n\nexport type TiledLayerType = 'tilelayer' | 'objectgroup' | 'imagelayer' | 'group'\n\nexport type TiledDrawOrder = 'topdown' | 'index'\n\nexport type TiledEncoding = 'csv' | 'base64'\n\nexport type TiledCompression = 'zlib' | 'gzip' | 'zstd' | ''\n\nexport type TiledPropertyType =\n | 'string'\n | 'int'\n | 'float'\n | 'bool'\n | 'color'\n | 'file'\n | 'object'\n | 'class'\n\nexport type TiledObjectAlignment =\n | 'unspecified'\n | 'topleft'\n | 'top'\n | 'topright'\n | 'left'\n | 'center'\n | 'right'\n | 'bottomleft'\n | 'bottom'\n | 'bottomright'\n\nexport type TiledTileRenderSize = 'tile' | 'grid'\n\nexport type TiledFillMode = 'stretch' | 'preserve-aspect-fit'\n\nexport type TiledGridOrientation = 'orthogonal' | 'isometric'\n\nexport type TiledWangSetType = 'corner' | 'edge' | 'mixed'\n\nexport type TiledHAlign = 'center' | 'right' | 'justify' | 'left'\n\nexport type TiledVAlign = 'center' | 'bottom' | 'top'\n\n// ─── Property ────────────────────────────────────────────────────────────────\n\nexport interface TiledProperty {\n name: string\n type: TiledPropertyType\n propertytype?: string\n value: string | number | boolean\n}\n\n// ─── Point ───────────────────────────────────────────────────────────────────\n\nexport interface TiledPoint {\n x: number\n y: number\n}\n\n// ─── Text ────────────────────────────────────────────────────────────────────\n\nexport interface TiledText {\n bold?: boolean\n color?: string\n fontfamily?: string\n halign?: TiledHAlign\n italic?: boolean\n kerning?: boolean\n pixelsize?: number\n strikeout?: boolean\n text: string\n underline?: boolean\n valign?: TiledVAlign\n wrap?: boolean\n}\n\n// ─── Object ──────────────────────────────────────────────────────────────────\n\nexport interface TiledObject {\n ellipse?: boolean\n gid?: number\n height: number\n id: number\n name: string\n point?: boolean\n polygon?: TiledPoint[]\n polyline?: TiledPoint[]\n properties?: TiledProperty[]\n rotation: number\n template?: string\n text?: TiledText\n type: string\n visible: boolean\n width: number\n x: number\n y: number\n}\n\n// ─── Chunk (infinite maps) ───────────────────────────────────────────────────\n\nexport interface TiledChunk {\n data: number[] | string\n height: number\n width: number\n x: number\n y: number\n}\n\n// ─── Layer ───────────────────────────────────────────────────────────────────\n\nexport interface TiledLayer {\n chunks?: TiledChunk[]\n class?: string\n compression?: TiledCompression\n data?: number[] | string\n draworder?: TiledDrawOrder\n encoding?: TiledEncoding\n height?: number\n id: number\n image?: string\n imageheight?: number\n imagewidth?: number\n layers?: TiledLayer[]\n locked?: boolean\n name: string\n objects?: TiledObject[]\n offsetx?: number\n offsety?: number\n opacity: number\n parallaxx?: number\n parallaxy?: number\n properties?: TiledProperty[]\n repeatx?: boolean\n repeaty?: boolean\n startx?: number\n starty?: number\n tintcolor?: string\n transparentcolor?: string\n type: TiledLayerType\n visible: boolean\n width?: number\n x: number\n y: number\n}\n\n// ─── Frame (tile animation) ──────────────────────────────────────────────────\n\nexport interface TiledFrame {\n duration: number\n tileid: number\n}\n\n// ─── Tile Offset ─────────────────────────────────────────────────────────────\n\nexport interface TiledTileOffset {\n x: number\n y: number\n}\n\n// ─── Grid ────────────────────────────────────────────────────────────────────\n\nexport interface TiledGrid {\n height: number\n orientation: TiledGridOrientation\n width: number\n}\n\n// ─── Transformations ─────────────────────────────────────────────────────────\n\nexport interface TiledTransformations {\n hflip: boolean\n vflip: boolean\n rotate: boolean\n preferuntransformed: boolean\n}\n\n// ─── Terrain ─────────────────────────────────────────────────────────────────\n\nexport interface TiledTerrain {\n name: string\n properties?: TiledProperty[]\n tile: number\n}\n\n// ─── Wang Color ──────────────────────────────────────────────────────────────\n\nexport interface TiledWangColor {\n class?: string\n color: string\n name: string\n probability: number\n properties?: TiledProperty[]\n tile: number\n}\n\n// ─── Wang Tile ───────────────────────────────────────────────────────────────\n\nexport interface TiledWangTile {\n tileid: number\n wangid: number[]\n}\n\n// ─── Wang Set ────────────────────────────────────────────────────────────────\n\nexport interface TiledWangSet {\n class?: string\n colors: TiledWangColor[]\n name: string\n properties?: TiledProperty[]\n tile: number\n type: TiledWangSetType\n wangtiles: TiledWangTile[]\n}\n\n// ─── Tile Definition ─────────────────────────────────────────────────────────\n\nexport interface TiledTileDefinition {\n animation?: TiledFrame[]\n id: number\n image?: string\n imageheight?: number\n imagewidth?: number\n x?: number\n y?: number\n width?: number\n height?: number\n objectgroup?: TiledLayer\n probability?: number\n properties?: TiledProperty[]\n terrain?: number[]\n type?: string\n}\n\n// ─── Tileset ─────────────────────────────────────────────────────────────────\n\nexport interface TiledTileset {\n backgroundcolor?: string\n class?: string\n columns: number\n fillmode?: TiledFillMode\n firstgid: number\n grid?: TiledGrid\n image?: string\n imageheight?: number\n imagewidth?: number\n margin: number\n name: string\n objectalignment?: TiledObjectAlignment\n properties?: TiledProperty[]\n source?: string\n spacing: number\n terrains?: TiledTerrain[]\n tilecount: number\n tiledversion?: string\n tileheight: number\n tileoffset?: TiledTileOffset\n tilerendersize?: TiledTileRenderSize\n tiles?: TiledTileDefinition[]\n tilewidth: number\n transformations?: TiledTransformations\n transparentcolor?: string\n type?: string\n version?: string\n wangsets?: TiledWangSet[]\n}\n\n// ─── External tileset reference (before resolution) ──────────────────────────\n\nexport interface TiledTilesetRef {\n firstgid: number\n source: string\n}\n\n// ─── Map ─────────────────────────────────────────────────────────────────────\n\nexport interface TiledMap {\n backgroundcolor?: string\n class?: string\n compressionlevel?: number\n height: number\n hexsidelength?: number\n infinite: boolean\n layers: TiledLayer[]\n nextlayerid: number\n nextobjectid: number\n orientation: TiledOrientation\n parallaxoriginx?: number\n parallaxoriginy?: number\n properties?: TiledProperty[]\n renderorder?: TiledRenderOrder\n staggeraxis?: TiledStaggerAxis\n staggerindex?: TiledStaggerIndex\n tiledversion?: string\n tileheight: number\n tilesets: (TiledTileset | TiledTilesetRef)[]\n tilewidth: number\n type: 'map'\n version: string\n width: number\n}\n\n// ─── Object Template ─────────────────────────────────────────────────────────\n\nexport interface TiledObjectTemplate {\n type: 'template'\n tileset?: TiledTileset\n object: TiledObject\n}\n\n// ─── GID Bit Flags ───────────────────────────────────────────────────────────\n\nexport const FLIPPED_HORIZONTALLY_FLAG = 0x80000000\nexport const FLIPPED_VERTICALLY_FLAG = 0x40000000\nexport const FLIPPED_DIAGONALLY_FLAG = 0x20000000\nexport const ROTATED_HEXAGONAL_120_FLAG = 0x10000000\nexport const GID_MASK = 0x0fffffff\n\n// ─── Resolved types (post-parse, used by renderer) ──────────────────────────\n\nexport interface ResolvedTile {\n gid: number\n localId: number\n tilesetIndex: number\n horizontalFlip: boolean\n verticalFlip: boolean\n diagonalFlip: boolean\n}\n\nexport interface ResolvedChunk {\n x: number\n y: number\n width: number\n height: number\n tiles: (ResolvedTile | null)[]\n}\n\nexport interface ResolvedTileLayer {\n type: 'tilelayer'\n id: number\n name: string\n opacity: number\n visible: boolean\n offsetx: number\n offsety: number\n parallaxx: number\n parallaxy: number\n tintcolor?: string\n properties: TiledProperty[]\n width: number\n height: number\n infinite: boolean\n tiles: (ResolvedTile | null)[]\n chunks?: ResolvedChunk[]\n}\n\nexport interface ResolvedImageLayer {\n type: 'imagelayer'\n id: number\n name: string\n opacity: number\n visible: boolean\n offsetx: number\n offsety: number\n parallaxx: number\n parallaxy: number\n tintcolor?: string\n properties: TiledProperty[]\n image: string\n imagewidth?: number\n imageheight?: number\n repeatx: boolean\n repeaty: boolean\n transparentcolor?: string\n}\n\nexport interface ResolvedObjectLayer {\n type: 'objectgroup'\n id: number\n name: string\n opacity: number\n visible: boolean\n offsetx: number\n offsety: number\n parallaxx: number\n parallaxy: number\n tintcolor?: string\n properties: TiledProperty[]\n draworder: TiledDrawOrder\n objects: TiledObject[]\n}\n\nexport interface ResolvedGroupLayer {\n type: 'group'\n id: number\n name: string\n opacity: number\n visible: boolean\n offsetx: number\n offsety: number\n parallaxx: number\n parallaxy: number\n tintcolor?: string\n properties: TiledProperty[]\n layers: ResolvedLayer[]\n}\n\nexport type ResolvedLayer =\n | ResolvedTileLayer\n | ResolvedImageLayer\n | ResolvedObjectLayer\n | ResolvedGroupLayer\n\nexport interface ResolvedTileset {\n firstgid: number\n name: string\n tilewidth: number\n tileheight: number\n columns: number\n tilecount: number\n margin: number\n spacing: number\n image?: string\n imagewidth?: number\n imageheight?: number\n tileoffset: TiledTileOffset\n objectalignment: TiledObjectAlignment\n tilerendersize: TiledTileRenderSize\n fillmode: TiledFillMode\n tiles: Map<number, TiledTileDefinition>\n properties: TiledProperty[]\n transformations?: TiledTransformations\n grid?: TiledGrid\n wangsets?: TiledWangSet[]\n terrains?: TiledTerrain[]\n}\n\nexport interface ResolvedMap {\n orientation: TiledOrientation\n renderorder: TiledRenderOrder\n width: number\n height: number\n tilewidth: number\n tileheight: number\n infinite: boolean\n backgroundcolor?: string\n hexsidelength?: number\n staggeraxis?: TiledStaggerAxis\n staggerindex?: TiledStaggerIndex\n parallaxoriginx: number\n parallaxoriginy: number\n properties: TiledProperty[]\n tilesets: ResolvedTileset[]\n layers: ResolvedLayer[]\n version: string\n tiledversion?: string\n}\n\n// ─── Parser options ──────────────────────────────────────────────────────────\n\nexport interface ParseOptions {\n externalTilesets?: Map<string, TiledTileset>\n}\n\n// ─── Renderer options ────────────────────────────────────────────────────────\n\nexport interface TiledMapOptions {\n tilesetTextures?: Map<string, Texture>\n imageLayerTextures?: Map<string, Texture>\n tileImageTextures?: Map<string, Texture>\n}\n\nexport interface TiledMapAsset {\n mapData: ResolvedMap\n container: Container\n}\n\n// ─── Tile placement ──────────────────────────────────────────────────────────\n\nexport interface MapContext {\n orientation: TiledOrientation\n renderorder: TiledRenderOrder\n tilewidth: number\n tileheight: number\n hexsidelength?: number\n staggeraxis?: TiledStaggerAxis\n staggerindex?: TiledStaggerIndex\n}\n\nexport interface TilePosition {\n x: number\n y: number\n}\n","import type { ResolvedTile } from '../types'\nimport {\n FLIPPED_DIAGONALLY_FLAG,\n FLIPPED_HORIZONTALLY_FLAG,\n FLIPPED_VERTICALLY_FLAG,\n GID_MASK\n} from '../types'\n\nexport function decodeGid(raw: number): ResolvedTile | null {\n const gid = raw & GID_MASK\n if (gid === 0) return null\n\n return {\n gid,\n localId: 0,\n tilesetIndex: 0,\n horizontalFlip: (raw & FLIPPED_HORIZONTALLY_FLAG) !== 0,\n verticalFlip: (raw & FLIPPED_VERTICALLY_FLAG) !== 0,\n diagonalFlip: (raw & FLIPPED_DIAGONALLY_FLAG) !== 0\n }\n}\n","import type {\n TiledChunk,\n TiledCompression,\n TiledDrawOrder,\n TiledEncoding,\n TiledFillMode,\n TiledFrame,\n TiledGrid,\n TiledGridOrientation,\n TiledHAlign,\n TiledLayer,\n TiledLayerType,\n TiledMap,\n TiledObject,\n TiledObjectAlignment,\n TiledOrientation,\n TiledPoint,\n TiledProperty,\n TiledPropertyType,\n TiledRenderOrder,\n TiledStaggerAxis,\n TiledStaggerIndex,\n TiledTerrain,\n TiledText,\n TiledTileDefinition,\n TiledTileOffset,\n TiledTileRenderSize,\n TiledTileset,\n TiledTilesetRef,\n TiledTransformations,\n TiledVAlign,\n TiledWangColor,\n TiledWangSet,\n TiledWangSetType,\n TiledWangTile\n} from '../types'\n\n// ─── Attribute helpers ──────────────────────────────────────────────────────\n\nfunction str(el: Element, name: string, fallback = ''): string {\n return el.getAttribute(name) ?? fallback\n}\n\nfunction int(el: Element, name: string, fallback = 0): number {\n const v = el.getAttribute(name)\n return v != null ? parseInt(v, 10) : fallback\n}\n\nfunction float(el: Element, name: string, fallback = 0): number {\n const v = el.getAttribute(name)\n return v != null ? parseFloat(v) : fallback\n}\n\nfunction bool(el: Element, name: string, fallback = false): boolean {\n const v = el.getAttribute(name)\n if (v == null) return fallback\n return v === '1' || v === 'true'\n}\n\nfunction optStr(el: Element, name: string): string | undefined {\n const v = el.getAttribute(name)\n return v != null ? v : undefined\n}\n\nfunction optInt(el: Element, name: string): number | undefined {\n const v = el.getAttribute(name)\n return v != null ? parseInt(v, 10) : undefined\n}\n\nfunction optFloat(el: Element, name: string): number | undefined {\n const v = el.getAttribute(name)\n return v != null ? parseFloat(v) : undefined\n}\n\nfunction children(el: Element, tag: string): Element[] {\n const result: Element[] = []\n for (let i = 0; i < el.children.length; i++) {\n const child = el.children[i]!\n if (child.tagName === tag) result.push(child)\n }\n return result\n}\n\nfunction child(el: Element, tag: string): Element | null {\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i]!\n if (c.tagName === tag) return c\n }\n return null\n}\n\n// ─── Properties ─────────────────────────────────────────────────────────────\n\nfunction parseProperties(el: Element): TiledProperty[] | undefined {\n const propsEl = child(el, 'properties')\n if (!propsEl) return undefined\n\n const props: TiledProperty[] = []\n for (const pEl of children(propsEl, 'property')) {\n const type = str(pEl, 'type', 'string') as TiledPropertyType\n let value: string | number | boolean = str(pEl, 'value', '')\n // If value not in attribute, check text content (multiline strings)\n if (!pEl.hasAttribute('value')) {\n value = pEl.textContent ?? ''\n }\n if (type === 'int') value = parseInt(value as string, 10)\n else if (type === 'float') value = parseFloat(value as string)\n else if (type === 'bool') value = value === 'true'\n\n props.push({\n name: str(pEl, 'name'),\n type,\n propertytype: optStr(pEl, 'propertytype'),\n value\n })\n }\n return props.length > 0 ? props : undefined\n}\n\n// ─── Image ──────────────────────────────────────────────────────────────────\n\ninterface ImageInfo {\n image?: string\n imagewidth?: number\n imageheight?: number\n transparentcolor?: string\n}\n\nfunction parseImage(el: Element): ImageInfo {\n const imgEl = child(el, 'image')\n if (!imgEl) return {}\n return {\n image: optStr(imgEl, 'source'),\n imagewidth: optInt(imgEl, 'width'),\n imageheight: optInt(imgEl, 'height'),\n transparentcolor: optStr(imgEl, 'trans')\n }\n}\n\n// ─── Tile offset ────────────────────────────────────────────────────────────\n\nfunction parseTileOffset(el: Element): TiledTileOffset | undefined {\n const to = child(el, 'tileoffset')\n if (!to) return undefined\n return { x: int(to, 'x'), y: int(to, 'y') }\n}\n\n// ─── Grid ───────────────────────────────────────────────────────────────────\n\nfunction parseGrid(el: Element): TiledGrid | undefined {\n const g = child(el, 'grid')\n if (!g) return undefined\n return {\n orientation: str(g, 'orientation', 'orthogonal') as TiledGridOrientation,\n width: int(g, 'width'),\n height: int(g, 'height')\n }\n}\n\n// ─── Transformations ────────────────────────────────────────────────────────\n\nfunction parseTransformations(el: Element): TiledTransformations | undefined {\n const t = child(el, 'transformations')\n if (!t) return undefined\n return {\n hflip: bool(t, 'hflip'),\n vflip: bool(t, 'vflip'),\n rotate: bool(t, 'rotate'),\n preferuntransformed: bool(t, 'preferuntransformed')\n }\n}\n\n// ─── Terrain ────────────────────────────────────────────────────────────────\n\nfunction parseTerrains(el: Element): TiledTerrain[] | undefined {\n const ttEl = child(el, 'terraintypes')\n if (!ttEl) return undefined\n return children(ttEl, 'terrain').map((t) => ({\n name: str(t, 'name'),\n tile: int(t, 'tile'),\n properties: parseProperties(t)\n }))\n}\n\n// ─── Wang sets ──────────────────────────────────────────────────────────────\n\nfunction parseWangSets(el: Element): TiledWangSet[] | undefined {\n const wsEl = child(el, 'wangsets')\n if (!wsEl) return undefined\n\n return children(wsEl, 'wangset').map((ws) => {\n const colors: TiledWangColor[] = children(ws, 'wangcolor').map((wc) => ({\n class: optStr(wc, 'class'),\n color: str(wc, 'color'),\n name: str(wc, 'name'),\n probability: float(wc, 'probability'),\n tile: int(wc, 'tile'),\n properties: parseProperties(wc)\n }))\n\n const tiles: TiledWangTile[] = children(ws, 'wangtile').map((wt) => ({\n tileid: int(wt, 'tileid'),\n wangid: str(wt, 'wangid').split(',').map(Number)\n }))\n\n return {\n class: optStr(ws, 'class'),\n colors,\n name: str(ws, 'name'),\n properties: parseProperties(ws),\n tile: int(ws, 'tile'),\n type: str(ws, 'type', 'corner') as TiledWangSetType,\n wangtiles: tiles\n } satisfies TiledWangSet\n })\n}\n\n// ─── Animation ──────────────────────────────────────────────────────────────\n\nfunction parseAnimation(el: Element): TiledFrame[] | undefined {\n const animEl = child(el, 'animation')\n if (!animEl) return undefined\n return children(animEl, 'frame').map((f) => ({\n tileid: int(f, 'tileid'),\n duration: int(f, 'duration')\n }))\n}\n\n// ─── Tile definitions ───────────────────────────────────────────────────────\n\nfunction parseTileDefinitions(el: Element): TiledTileDefinition[] | undefined {\n const tileEls = children(el, 'tile')\n if (tileEls.length === 0) return undefined\n\n return tileEls.map((t) => {\n const img = parseImage(t)\n const terrainAttr = optStr(t, 'terrain')\n const terrain = terrainAttr\n ? terrainAttr.split(',').map((v) => (v === '' ? -1 : parseInt(v, 10)))\n : undefined\n\n // Object group (collision shapes)\n const ogEl = child(t, 'objectgroup')\n const objectgroup = ogEl ? parseObjectGroup(ogEl) : undefined\n\n const def: TiledTileDefinition = {\n id: int(t, 'id'),\n type: optStr(t, 'type') ?? optStr(t, 'class'),\n probability: optFloat(t, 'probability'),\n x: optInt(t, 'x'),\n y: optInt(t, 'y'),\n width: optInt(t, 'width'),\n height: optInt(t, 'height'),\n properties: parseProperties(t),\n animation: parseAnimation(t),\n terrain,\n objectgroup,\n ...img\n }\n\n return def\n })\n}\n\n// ─── Tileset ────────────────────────────────────────────────────────────────\n\nfunction parseTileset(el: Element): TiledTileset | TiledTilesetRef {\n const source = optStr(el, 'source')\n if (source) {\n return {\n firstgid: int(el, 'firstgid'),\n source\n } satisfies TiledTilesetRef\n }\n\n const img = parseImage(el)\n const tiles = parseTileDefinitions(el)\n\n const tilewidth = int(el, 'tilewidth')\n const spacing = int(el, 'spacing')\n const margin = int(el, 'margin')\n const rawColumns = int(el, 'columns')\n const columns =\n rawColumns > 0\n ? rawColumns\n : img.imagewidth && tilewidth > 0\n ? Math.floor((img.imagewidth - 2 * margin + spacing) / (tilewidth + spacing))\n : 0\n\n return {\n backgroundcolor: optStr(el, 'backgroundcolor'),\n class: optStr(el, 'class'),\n columns,\n fillmode: optStr(el, 'fillmode') as TiledFillMode | undefined,\n firstgid: int(el, 'firstgid'),\n grid: parseGrid(el),\n margin,\n name: str(el, 'name'),\n objectalignment: optStr(el, 'objectalignment') as TiledObjectAlignment | undefined,\n properties: parseProperties(el),\n spacing,\n terrains: parseTerrains(el),\n tilecount: int(el, 'tilecount'),\n tileheight: int(el, 'tileheight'),\n tileoffset: parseTileOffset(el),\n tilerendersize: optStr(el, 'tilerendersize') as TiledTileRenderSize | undefined,\n tiles: tiles,\n tilewidth,\n transformations: parseTransformations(el),\n wangsets: parseWangSets(el),\n ...img\n } satisfies TiledTileset\n}\n\n// ─── Data / Chunks ──────────────────────────────────────────────────────────\n\nfunction parseData(dataEl: Element): {\n data?: number[] | string\n encoding?: TiledEncoding\n compression?: TiledCompression\n chunks?: TiledChunk[]\n} {\n const encoding = optStr(dataEl, 'encoding') as TiledEncoding | undefined\n const compression = optStr(dataEl, 'compression') as TiledCompression | undefined\n\n // Check for chunks (infinite maps)\n const chunkEls = children(dataEl, 'chunk')\n if (chunkEls.length > 0) {\n const chunks: TiledChunk[] = chunkEls.map((c) => ({\n x: int(c, 'x'),\n y: int(c, 'y'),\n width: int(c, 'width'),\n height: int(c, 'height'),\n data: parseDataContent(c, encoding)\n }))\n return { encoding, compression, chunks }\n }\n\n return {\n data: parseDataContent(dataEl, encoding),\n encoding,\n compression\n }\n}\n\nfunction parseDataContent(el: Element, encoding: TiledEncoding | undefined): number[] | string {\n if (encoding === 'base64') {\n return (el.textContent ?? '').trim()\n }\n\n if (encoding === 'csv') {\n return (el.textContent ?? '')\n .trim()\n .split(',')\n .map((s) => parseInt(s.trim(), 10))\n }\n\n // XML tile elements (no encoding)\n const tileEls = children(el, 'tile')\n return tileEls.map((t) => int(t, 'gid'))\n}\n\n// ─── Objects ────────────────────────────────────────────────────────────────\n\nfunction parsePoints(pointStr: string): TiledPoint[] {\n return pointStr\n .trim()\n .split(/\\s+/)\n .map((pair) => {\n const [x, y] = pair.split(',').map(Number)\n return { x: x!, y: y! }\n })\n}\n\nfunction parseTextObject(el: Element): TiledText {\n return {\n text: el.textContent ?? '',\n fontfamily: optStr(el, 'fontfamily'),\n pixelsize: optInt(el, 'pixelsize'),\n wrap: bool(el, 'wrap') ? true : undefined,\n color: optStr(el, 'color'),\n bold: bool(el, 'bold') ? true : undefined,\n italic: bool(el, 'italic') ? true : undefined,\n underline: bool(el, 'underline') ? true : undefined,\n strikeout: bool(el, 'strikeout') ? true : undefined,\n kerning: el.hasAttribute('kerning') ? bool(el, 'kerning', true) : undefined,\n halign: optStr(el, 'halign') as TiledHAlign | undefined,\n valign: optStr(el, 'valign') as TiledVAlign | undefined\n }\n}\n\nfunction parseObject(el: Element): TiledObject {\n const obj: TiledObject = {\n id: int(el, 'id'),\n name: str(el, 'name'),\n type: str(el, 'type') || str(el, 'class'),\n x: float(el, 'x'),\n y: float(el, 'y'),\n width: float(el, 'width'),\n height: float(el, 'height'),\n rotation: float(el, 'rotation'),\n visible: el.hasAttribute('visible') ? bool(el, 'visible', true) : true,\n properties: parseProperties(el)\n }\n\n const gid = optInt(el, 'gid')\n if (gid != null) obj.gid = gid\n\n const template = optStr(el, 'template')\n if (template) obj.template = template\n\n if (child(el, 'ellipse')) obj.ellipse = true\n if (child(el, 'point')) obj.point = true\n\n const polygonEl = child(el, 'polygon')\n if (polygonEl) {\n obj.polygon = parsePoints(str(polygonEl, 'points'))\n }\n\n const polylineEl = child(el, 'polyline')\n if (polylineEl) {\n obj.polyline = parsePoints(str(polylineEl, 'points'))\n }\n\n const textEl = child(el, 'text')\n if (textEl) {\n obj.text = parseTextObject(textEl)\n }\n\n return obj\n}\n\n// ─── Layers ─────────────────────────────────────────────────────────────────\n\nfunction parseLayerCommon(el: Element): Partial<TiledLayer> {\n return {\n id: int(el, 'id'),\n name: str(el, 'name'),\n class: optStr(el, 'class'),\n opacity: float(el, 'opacity', 1),\n visible: el.hasAttribute('visible') ? bool(el, 'visible', true) : true,\n tintcolor: optStr(el, 'tintcolor'),\n offsetx: optFloat(el, 'offsetx'),\n offsety: optFloat(el, 'offsety'),\n parallaxx: optFloat(el, 'parallaxx'),\n parallaxy: optFloat(el, 'parallaxy'),\n locked: el.hasAttribute('locked') ? bool(el, 'locked') : undefined,\n properties: parseProperties(el),\n x: int(el, 'x'),\n y: int(el, 'y')\n }\n}\n\nfunction parseTileLayer(el: Element): TiledLayer {\n const dataEl = child(el, 'data')\n const dataInfo = dataEl ? parseData(dataEl) : {}\n\n return {\n ...parseLayerCommon(el),\n type: 'tilelayer' as TiledLayerType,\n width: optInt(el, 'width'),\n height: optInt(el, 'height'),\n startx: optInt(el, 'startx'),\n starty: optInt(el, 'starty'),\n ...dataInfo\n } as TiledLayer\n}\n\nfunction parseObjectGroup(el: Element): TiledLayer {\n return {\n ...parseLayerCommon(el),\n type: 'objectgroup' as TiledLayerType,\n draworder: optStr(el, 'draworder') as TiledDrawOrder | undefined,\n objects: children(el, 'object').map(parseObject)\n } as TiledLayer\n}\n\nfunction parseImageLayer(el: Element): TiledLayer {\n const img = parseImage(el)\n return {\n ...parseLayerCommon(el),\n type: 'imagelayer' as TiledLayerType,\n repeatx: el.hasAttribute('repeatx') ? bool(el, 'repeatx') : undefined,\n repeaty: el.hasAttribute('repeaty') ? bool(el, 'repeaty') : undefined,\n transparentcolor: img.transparentcolor,\n image: img.image,\n imagewidth: img.imagewidth,\n imageheight: img.imageheight\n } as TiledLayer\n}\n\nfunction parseGroupLayer(el: Element): TiledLayer {\n return {\n ...parseLayerCommon(el),\n type: 'group' as TiledLayerType,\n layers: parseLayers(el)\n } as TiledLayer\n}\n\nfunction parseLayers(parentEl: Element): TiledLayer[] {\n const layers: TiledLayer[] = []\n for (let i = 0; i < parentEl.children.length; i++) {\n const el = parentEl.children[i]!\n switch (el.tagName) {\n case 'layer':\n layers.push(parseTileLayer(el))\n break\n case 'objectgroup':\n layers.push(parseObjectGroup(el))\n break\n case 'imagelayer':\n layers.push(parseImageLayer(el))\n break\n case 'group':\n layers.push(parseGroupLayer(el))\n break\n }\n }\n return layers\n}\n\n// ─── Map ────────────────────────────────────────────────────────────────────\n\nexport function parseTmx(xml: string): TiledMap {\n const parser = new DOMParser()\n const doc = parser.parseFromString(xml, 'text/xml')\n\n const errorNode = doc.querySelector('parsererror')\n if (errorNode) {\n throw new Error(`TMX XML parse error: ${errorNode.textContent}`)\n }\n\n const mapEl = doc.documentElement\n if (mapEl.tagName !== 'map') {\n throw new Error(`Expected root <map> element, got <${mapEl.tagName}>`)\n }\n\n const tilesets: (TiledTileset | TiledTilesetRef)[] = children(mapEl, 'tileset').map(parseTileset)\n\n const layers = parseLayers(mapEl)\n\n return {\n backgroundcolor: optStr(mapEl, 'backgroundcolor'),\n class: optStr(mapEl, 'class'),\n compressionlevel: optInt(mapEl, 'compressionlevel'),\n height: int(mapEl, 'height'),\n hexsidelength: optInt(mapEl, 'hexsidelength'),\n infinite: bool(mapEl, 'infinite'),\n layers,\n nextlayerid: int(mapEl, 'nextlayerid'),\n nextobjectid: int(mapEl, 'nextobjectid'),\n orientation: str(mapEl, 'orientation', 'orthogonal') as TiledOrientation,\n parallaxoriginx: optFloat(mapEl, 'parallaxoriginx'),\n parallaxoriginy: optFloat(mapEl, 'parallaxoriginy'),\n properties: parseProperties(mapEl),\n renderorder: optStr(mapEl, 'renderorder') as TiledRenderOrder | undefined,\n staggeraxis: optStr(mapEl, 'staggeraxis') as TiledStaggerAxis | undefined,\n staggerindex: optStr(mapEl, 'staggerindex') as TiledStaggerIndex | undefined,\n tiledversion: optStr(mapEl, 'tiledversion'),\n tileheight: int(mapEl, 'tileheight'),\n tilesets,\n tilewidth: int(mapEl, 'tilewidth'),\n type: 'map',\n version: str(mapEl, 'version', '1.0'),\n width: int(mapEl, 'width')\n }\n}\n\nexport function parseTsx(xml: string): TiledTileset {\n const parser = new DOMParser()\n const doc = parser.parseFromString(xml, 'text/xml')\n\n const errorNode = doc.querySelector('parsererror')\n if (errorNode) {\n throw new Error(`TSX XML parse error: ${errorNode.textContent}`)\n }\n\n const tsEl = doc.documentElement\n if (tsEl.tagName !== 'tileset') {\n throw new Error(`Expected root <tileset> element, got <${tsEl.tagName}>`)\n }\n\n const result = parseTileset(tsEl)\n if ('source' in result) {\n throw new Error('TSX file should not contain a source reference')\n }\n return result\n}\n","import type {\n ParseOptions,\n ResolvedChunk,\n ResolvedGroupLayer,\n ResolvedImageLayer,\n ResolvedLayer,\n ResolvedMap,\n ResolvedObjectLayer,\n ResolvedTile,\n ResolvedTileLayer,\n ResolvedTileset,\n TiledChunk,\n TiledDrawOrder,\n TiledLayer,\n TiledMap,\n TiledRenderOrder,\n TiledTileDefinition,\n TiledTileset,\n TiledTilesetRef\n} from '../types'\nimport { decodeLayerData, decodeLayerDataAsync } from './decodeData.js'\nimport { decodeGid } from './decodeGid.js'\n\n// ─── Tileset ref check ───────────────────────────────────────────────────────\n\nfunction isTilesetRef(ts: TiledTileset | TiledTilesetRef): ts is TiledTilesetRef {\n return 'source' in ts && !('name' in ts)\n}\n\n// ─── Resolve tileset ─────────────────────────────────────────────────────────\n\nfunction resolveTileset(raw: TiledTileset): ResolvedTileset {\n const tiles = new Map<number, TiledTileDefinition>()\n if (raw.tiles) {\n for (const tile of raw.tiles) {\n tiles.set(tile.id, tile)\n }\n }\n\n return {\n firstgid: raw.firstgid,\n name: raw.name,\n tilewidth: raw.tilewidth,\n tileheight: raw.tileheight,\n columns:\n raw.columns > 0\n ? raw.columns\n : raw.imagewidth && raw.tilewidth > 0\n ? Math.floor(\n (raw.imagewidth - 2 * raw.margin + raw.spacing) / (raw.tilewidth + raw.spacing)\n )\n : 0,\n tilecount: raw.tilecount,\n margin: raw.margin,\n spacing: raw.spacing,\n image: raw.image,\n imagewidth: raw.imagewidth,\n imageheight: raw.imageheight,\n tileoffset: raw.tileoffset ?? { x: 0, y: 0 },\n objectalignment: raw.objectalignment ?? 'unspecified',\n tilerendersize: raw.tilerendersize ?? 'tile',\n fillmode: raw.fillmode ?? 'stretch',\n tiles,\n properties: raw.properties ?? [],\n transformations: raw.transformations,\n grid: raw.grid,\n wangsets: raw.wangsets,\n terrains: raw.terrains\n }\n}\n\n// ─── Find tileset for GID ────────────────────────────────────────────────────\n\nfunction findTilesetIndex(gid: number, tilesets: ResolvedTileset[]): number {\n for (let i = tilesets.length - 1; i >= 0; i--) {\n const ts = tilesets[i]\n if (ts && ts.firstgid <= gid) {\n return i\n }\n }\n return 0\n}\n\n// ─── Resolve tile data ───────────────────────────────────────────────────────\n\nfunction resolveGids(rawGids: number[], tilesets: ResolvedTileset[]): (ResolvedTile | null)[] {\n const result: (ResolvedTile | null)[] = new Array(rawGids.length)\n\n for (let i = 0; i < rawGids.length; i++) {\n const rawGid = rawGids[i]\n if (rawGid === undefined || rawGid === 0) {\n result[i] = null\n continue\n }\n\n const decoded = decodeGid(rawGid)\n if (!decoded) {\n result[i] = null\n continue\n }\n\n const tsIdx = findTilesetIndex(decoded.gid, tilesets)\n const ts = tilesets[tsIdx]\n if (ts) {\n decoded.tilesetIndex = tsIdx\n decoded.localId = decoded.gid - ts.firstgid\n }\n result[i] = decoded\n }\n\n return result\n}\n\n// ─── Layer defaults ──────────────────────────────────────────────────────────\n\nfunction layerDefaults(layer: TiledLayer) {\n return {\n id: layer.id,\n name: layer.name,\n opacity: layer.opacity,\n visible: layer.visible,\n offsetx: layer.offsetx ?? 0,\n offsety: layer.offsety ?? 0,\n parallaxx: layer.parallaxx ?? 1,\n parallaxy: layer.parallaxy ?? 1,\n tintcolor: layer.tintcolor,\n properties: layer.properties ?? []\n }\n}\n\n// ─── Resolve layers (sync) ──────────────────────────────────────────────────\n\nfunction resolveLayer(layer: TiledLayer, tilesets: ResolvedTileset[]): ResolvedLayer {\n switch (layer.type) {\n case 'tilelayer': {\n const hasChunks = layer.chunks && layer.chunks.length > 0\n\n if (hasChunks) {\n const resolvedChunks = resolveChunksSync(\n layer.chunks!,\n layer.encoding,\n layer.compression,\n tilesets\n )\n return {\n type: 'tilelayer',\n ...layerDefaults(layer),\n width: layer.width ?? 0,\n height: layer.height ?? 0,\n infinite: true,\n tiles: [],\n chunks: resolvedChunks\n } satisfies ResolvedTileLayer\n }\n\n const rawGids = decodeLayerData(layer.data ?? [], layer.encoding, layer.compression)\n const tiles = resolveGids(rawGids, tilesets)\n return {\n type: 'tilelayer',\n ...layerDefaults(layer),\n width: layer.width ?? 0,\n height: layer.height ?? 0,\n infinite: false,\n tiles\n } satisfies ResolvedTileLayer\n }\n\n case 'imagelayer':\n return {\n type: 'imagelayer',\n ...layerDefaults(layer),\n image: layer.image ?? '',\n imagewidth: layer.imagewidth,\n imageheight: layer.imageheight,\n repeatx: layer.repeatx ?? false,\n repeaty: layer.repeaty ?? false,\n transparentcolor: layer.transparentcolor\n } satisfies ResolvedImageLayer\n\n case 'objectgroup':\n return {\n type: 'objectgroup',\n ...layerDefaults(layer),\n draworder: (layer.draworder ?? 'topdown') as TiledDrawOrder,\n objects: layer.objects ?? []\n } satisfies ResolvedObjectLayer\n\n case 'group':\n return {\n type: 'group',\n ...layerDefaults(layer),\n layers: (layer.layers ?? []).map((l) => resolveLayer(l, tilesets))\n } satisfies ResolvedGroupLayer\n }\n}\n\n// ─── Resolve layers (async — needed for compressed data) ─────────────────────\n\nasync function resolveLayerAsync(\n layer: TiledLayer,\n tilesets: ResolvedTileset[]\n): Promise<ResolvedLayer> {\n switch (layer.type) {\n case 'tilelayer': {\n const hasChunks = layer.chunks && layer.chunks.length > 0\n\n if (hasChunks) {\n const resolvedChunks = await resolveChunksAsync(\n layer.chunks!,\n layer.encoding,\n layer.compression,\n tilesets\n )\n return {\n type: 'tilelayer',\n ...layerDefaults(layer),\n width: layer.width ?? 0,\n height: layer.height ?? 0,\n infinite: true,\n tiles: [],\n chunks: resolvedChunks\n } satisfies ResolvedTileLayer\n }\n\n const rawGids = await decodeLayerDataAsync(\n layer.data ?? [],\n layer.encoding,\n layer.compression\n )\n const tiles = resolveGids(rawGids, tilesets)\n return {\n type: 'tilelayer',\n ...layerDefaults(layer),\n width: layer.width ?? 0,\n height: layer.height ?? 0,\n infinite: false,\n tiles\n } satisfies ResolvedTileLayer\n }\n\n case 'imagelayer':\n return {\n type: 'imagelayer',\n ...layerDefaults(layer),\n image: layer.image ?? '',\n imagewidth: layer.imagewidth,\n imageheight: layer.imageheight,\n repeatx: layer.repeatx ?? false,\n repeaty: layer.repeaty ?? false,\n transparentcolor: layer.transparentcolor\n } satisfies ResolvedImageLayer\n\n case 'objectgroup':\n return {\n type: 'objectgroup',\n ...layerDefaults(layer),\n draworder: (layer.draworder ?? 'topdown') as TiledDrawOrder,\n objects: layer.objects ?? []\n } satisfies ResolvedObjectLayer\n\n case 'group': {\n const resolvedChildren = await Promise.all(\n (layer.layers ?? []).map((l) => resolveLayerAsync(l, tilesets))\n )\n return {\n type: 'group',\n ...layerDefaults(layer),\n layers: resolvedChildren\n } satisfies ResolvedGroupLayer\n }\n }\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\nexport function parseMap(data: TiledMap, options?: ParseOptions): ResolvedMap {\n const resolvedTilesets = resolveTilesets(data.tilesets, options)\n const layers = data.layers.map((l) => resolveLayer(l, resolvedTilesets))\n\n return buildResolvedMap(data, resolvedTilesets, layers)\n}\n\nexport async function parseMapAsync(data: TiledMap, options?: ParseOptions): Promise<ResolvedMap> {\n const resolvedTilesets = resolveTilesets(data.tilesets, options)\n const layers = await Promise.all(data.layers.map((l) => resolveLayerAsync(l, resolvedTilesets)))\n\n return buildResolvedMap(data, resolvedTilesets, layers)\n}\n\n// ─── Chunk resolution ────────────────────────────────────────────────────────\n\nfunction resolveChunksSync(\n chunks: TiledChunk[],\n encoding: TiledLayer['encoding'],\n compression: TiledLayer['compression'],\n tilesets: ResolvedTileset[]\n): ResolvedChunk[] {\n return chunks.map((chunk) => {\n const rawGids = decodeLayerData(chunk.data, encoding, compression)\n return {\n x: chunk.x,\n y: chunk.y,\n width: chunk.width,\n height: chunk.height,\n tiles: resolveGids(rawGids, tilesets)\n }\n })\n}\n\nasync function resolveChunksAsync(\n chunks: TiledChunk[],\n encoding: TiledLayer['encoding'],\n compression: TiledLayer['compression'],\n tilesets: ResolvedTileset[]\n): Promise<ResolvedChunk[]> {\n return Promise.all(\n chunks.map(async (chunk) => {\n const rawGids = await decodeLayerDataAsync(chunk.data, encoding, compression)\n return {\n x: chunk.x,\n y: chunk.y,\n width: chunk.width,\n height: chunk.height,\n tiles: resolveGids(rawGids, tilesets)\n }\n })\n )\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction resolveTilesets(\n raw: (TiledTileset | TiledTilesetRef)[],\n options?: ParseOptions\n): ResolvedTileset[] {\n return raw.map((ts) => {\n if (isTilesetRef(ts)) {\n const external = options?.externalTilesets?.get(ts.source)\n if (!external) {\n throw new Error(\n `External tileset \"${ts.source}\" not provided. Pass it via options.externalTilesets.`\n )\n }\n return resolveTileset({ ...external, firstgid: ts.firstgid })\n }\n return resolveTileset(ts)\n })\n}\n\nfunction buildResolvedMap(\n data: TiledMap,\n tilesets: ResolvedTileset[],\n layers: ResolvedLayer[]\n): ResolvedMap {\n return {\n orientation: data.orientation,\n renderorder: (data.renderorder ?? 'right-down') as TiledRenderOrder,\n width: data.width,\n height: data.height,\n tilewidth: data.tilewidth,\n tileheight: data.tileheight,\n infinite: data.infinite,\n backgroundcolor: data.backgroundcolor,\n hexsidelength: data.hexsidelength,\n staggeraxis: data.staggeraxis,\n staggerindex: data.staggerindex,\n parallaxoriginx: data.parallaxoriginx ?? 0,\n parallaxoriginy: data.parallaxoriginy ?? 0,\n properties: data.properties ?? [],\n tilesets,\n layers,\n version: data.version,\n tiledversion: data.tiledversion\n }\n}\n","export function parseTintColor(hex: string): number {\n const clean = hex.replace('#', '')\n // #AARRGGBB → strip alpha, use RRGGBB\n if (clean.length === 8) {\n return parseInt(clean.slice(2), 16)\n }\n // #RRGGBB\n return parseInt(clean, 16)\n}\n","import { Container, type Texture } from 'pixi.js'\nimport type { ResolvedGroupLayer } from '../types'\nimport { createLayerRenderer } from './createLayerRenderer.js'\nimport { parseTintColor } from './parseColor.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\nimport type { MapContext } from './tilePlacement.js'\n\nexport class GroupLayerRenderer extends Container {\n readonly layerData: ResolvedGroupLayer\n\n constructor(\n layerData: ResolvedGroupLayer,\n tilesets: TileSetRenderer[],\n ctx: MapContext,\n imageTextures: Map<string, Texture>\n ) {\n super()\n\n this.layerData = layerData\n this.label = layerData.name\n this.alpha = layerData.opacity\n this.visible = layerData.visible\n this.position.set(layerData.offsetx, layerData.offsety)\n if (layerData.tintcolor) {\n this.tint = parseTintColor(layerData.tintcolor)\n }\n\n for (const child of layerData.layers) {\n const renderer = createLayerRenderer(child, tilesets, ctx, imageTextures)\n if (renderer) this.addChild(renderer)\n }\n }\n}\n","import { Container, Sprite, type Texture, TilingSprite } from 'pixi.js'\nimport type { ResolvedImageLayer } from '../types'\nimport { parseTintColor } from './parseColor.js'\n\nexport class ImageLayerRenderer extends Container {\n readonly layerData: ResolvedImageLayer\n\n constructor(layerData: ResolvedImageLayer, texture: Texture | null) {\n super()\n\n this.layerData = layerData\n this.label = layerData.name\n this.alpha = layerData.opacity\n this.visible = layerData.visible\n this.position.set(layerData.offsetx, layerData.offsety)\n if (layerData.tintcolor) {\n this.tint = parseTintColor(layerData.tintcolor)\n }\n\n if (texture) {\n this._buildImage(texture)\n }\n }\n\n private _buildImage(texture: Texture): void {\n const { repeatx, repeaty } = this.layerData\n\n if (repeatx || repeaty) {\n const tiling = new TilingSprite({\n texture,\n width: repeatx ? texture.width * 10 : texture.width,\n height: repeaty ? texture.height * 10 : texture.height\n })\n this.addChild(tiling)\n } else {\n const sprite = new Sprite(texture)\n this.addChild(sprite)\n }\n }\n}\n","import { Container, Graphics, Sprite, Text } from 'pixi.js'\nimport { decodeGid } from '../parser'\nimport type { ResolvedObjectLayer, TiledObject, TiledPoint, TiledText } from '../types'\nimport { parseTintColor } from './parseColor.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\n\nexport class ObjectLayerRenderer extends Container {\n readonly layerData: ResolvedObjectLayer\n\n constructor(layerData: ResolvedObjectLayer, tilesets: TileSetRenderer[]) {\n super()\n\n this.layerData = layerData\n this.label = layerData.name\n this.alpha = layerData.opacity\n this.visible = layerData.visible\n this.position.set(layerData.offsetx, layerData.offsety)\n if (layerData.tintcolor) {\n this.tint = parseTintColor(layerData.tintcolor)\n }\n\n this._buildObjects(tilesets)\n }\n\n private _buildObjects(tilesets: TileSetRenderer[]): void {\n for (const obj of this.layerData.objects) {\n const child = this._createObject(obj, tilesets)\n if (child) {\n child.label = obj.name || `object_${obj.id}`\n this.addChild(child)\n }\n }\n }\n\n private _createObject(obj: TiledObject, tilesets: TileSetRenderer[]): Container | null {\n // Tile object (has gid)\n if (obj.gid !== undefined) {\n return this._createTileObject(obj, tilesets)\n }\n\n // Text object\n if (obj.text) {\n return this._createTextObject(obj)\n }\n\n // Shape objects\n if (obj.ellipse) {\n return this._createEllipse(obj)\n }\n\n if (obj.point) {\n return this._createPoint(obj)\n }\n\n if (obj.polygon) {\n return this._createPolygon(obj, obj.polygon, true)\n }\n\n if (obj.polyline) {\n return this._createPolygon(obj, obj.polyline, false)\n }\n\n // Rectangle (default)\n if (obj.width > 0 && obj.height > 0) {\n return this._createRectangle(obj)\n }\n\n return null\n }\n\n private _createTileObject(obj: TiledObject, tilesets: TileSetRenderer[]): Sprite | null {\n if (obj.gid === undefined) return null\n\n const decoded = decodeGid(obj.gid)\n if (!decoded) return null\n\n // Find the right tileset\n for (let i = tilesets.length - 1; i >= 0; i--) {\n const ts = tilesets[i]\n if (!ts) continue\n if (ts.tileset.firstgid <= decoded.gid) {\n const localId = decoded.gid - ts.tileset.firstgid\n const texture = ts.getTexture(localId)\n if (!texture) return null\n\n const sprite = new Sprite(texture)\n sprite.position.set(obj.x, obj.y - obj.height)\n sprite.width = obj.width\n sprite.height = obj.height\n sprite.angle = obj.rotation\n sprite.visible = obj.visible\n\n if (decoded.horizontalFlip) {\n sprite.scale.x *= -1\n sprite.anchor.x = 1\n }\n if (decoded.verticalFlip) {\n sprite.scale.y *= -1\n sprite.anchor.y = 1\n }\n\n return sprite\n }\n }\n return null\n }\n\n private _createTextObject(obj: TiledObject): Container {\n const td = obj.text as TiledText\n const text = new Text({\n text: td.text,\n style: {\n fontFamily: td.fontfamily ?? 'sans-serif',\n fontSize: td.pixelsize ?? 16,\n fill: td.color ?? '#000000',\n fontWeight: td.bold ? 'bold' : 'normal',\n fontStyle: td.italic ? 'italic' : 'normal',\n wordWrap: td.wrap ?? false,\n wordWrapWidth: obj.width,\n align: td.halign ?? 'left'\n }\n })\n text.position.set(obj.x, obj.y)\n text.angle = obj.rotation\n text.visible = obj.visible\n return text\n }\n\n private _createRectangle(obj: TiledObject): Container {\n const g = new Graphics().rect(0, 0, obj.width, obj.height).stroke({ color: 0xffffff, width: 1 })\n g.position.set(obj.x, obj.y)\n g.angle = obj.rotation\n g.visible = obj.visible\n return g\n }\n\n private _createEllipse(obj: TiledObject): Container {\n const rx = obj.width / 2\n const ry = obj.height / 2\n const g = new Graphics().ellipse(rx, ry, rx, ry).stroke({ color: 0xffffff, width: 1 })\n g.position.set(obj.x, obj.y)\n g.angle = obj.rotation\n g.visible = obj.visible\n return g\n }\n\n private _createPoint(obj: TiledObject): Container {\n const g = new Graphics().circle(0, 0, 3).fill(0xffffff)\n g.position.set(obj.x, obj.y)\n g.visible = obj.visible\n return g\n }\n\n private _createPolygon(obj: TiledObject, points: TiledPoint[], closed: boolean): Container {\n const g = new Graphics()\n\n if (points.length > 0) {\n const first = points[0]!\n g.moveTo(first.x, first.y)\n for (let i = 1; i < points.length; i++) {\n const pt = points[i]!\n g.lineTo(pt.x, pt.y)\n }\n if (closed) {\n g.closePath()\n }\n g.stroke({ color: 0xffffff, width: 1 })\n }\n\n g.position.set(obj.x, obj.y)\n g.angle = obj.rotation\n g.visible = obj.visible\n return g\n }\n}\n","import type { MapContext, TilePosition } from '../types'\n\nexport type { MapContext, TilePosition }\n\nexport function tileToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n switch (ctx.orientation) {\n case 'orthogonal':\n return orthogonalToPixel(col, row, ctx)\n case 'isometric':\n return isometricToPixel(col, row, ctx)\n case 'staggered':\n return staggeredToPixel(col, row, ctx)\n case 'hexagonal':\n return hexagonalToPixel(col, row, ctx)\n }\n}\n\n// ─── Orthogonal ──────────────────────────────────────────────────────────────\n\nfunction orthogonalToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n return {\n x: col * ctx.tilewidth,\n y: row * ctx.tileheight\n }\n}\n\n// ─── Isometric (diamond) ─────────────────────────────────────────────────────\n\nfunction isometricToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n const halfW = ctx.tilewidth / 2\n const halfH = ctx.tileheight / 2\n return {\n x: (col - row) * halfW,\n y: (col + row) * halfH\n }\n}\n\n// ─── Staggered (isometric staggered) ─────────────────────────────────────────\n\nfunction staggeredToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n const staggerX = ctx.staggeraxis === 'x'\n const staggerEven = ctx.staggerindex === 'even'\n\n if (staggerX) {\n const isStaggered = staggerEven ? col % 2 === 0 : col % 2 !== 0\n return {\n x: col * (ctx.tilewidth / 2),\n y: row * ctx.tileheight + (isStaggered ? ctx.tileheight / 2 : 0)\n }\n }\n\n // stagger Y (default)\n const isStaggered = staggerEven ? row % 2 === 0 : row % 2 !== 0\n return {\n x: col * ctx.tilewidth + (isStaggered ? ctx.tilewidth / 2 : 0),\n y: row * (ctx.tileheight / 2)\n }\n}\n\n// ─── Hexagonal ───────────────────────────────────────────────────────────────\n\nfunction hexagonalToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n const hexSide = ctx.hexsidelength ?? 0\n const staggerX = ctx.staggeraxis === 'x'\n const staggerEven = ctx.staggerindex === 'even'\n\n if (staggerX) {\n const colWidth = (ctx.tilewidth + hexSide) / 2\n const isStaggered = staggerEven ? col % 2 === 0 : col % 2 !== 0\n return {\n x: col * colWidth,\n y: row * ctx.tileheight + (isStaggered ? ctx.tileheight / 2 : 0)\n }\n }\n\n // stagger Y (default for hex)\n const rowHeight = (ctx.tileheight + hexSide) / 2\n const isStaggered = staggerEven ? row % 2 === 0 : row % 2 !== 0\n return {\n x: col * ctx.tilewidth + (isStaggered ? ctx.tilewidth / 2 : 0),\n y: row * rowHeight\n }\n}\n","import { AnimatedSprite, Container, Sprite, type Texture } from 'pixi.js'\nimport type {\n ResolvedChunk,\n ResolvedTile,\n ResolvedTileLayer,\n TiledFrame,\n TiledRenderOrder\n} from '../types'\nimport { parseTintColor } from './parseColor.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\nimport { type MapContext, tileToPixel } from './tilePlacement.js'\n\nexport class TileLayerRenderer extends Container {\n readonly layerData: ResolvedTileLayer\n\n constructor(layerData: ResolvedTileLayer, tilesets: TileSetRenderer[], ctx: MapContext) {\n super()\n\n this.layerData = layerData\n this.label = layerData.name\n this.alpha = layerData.opacity\n this.visible = layerData.visible\n this.position.set(layerData.offsetx, layerData.offsety)\n if (layerData.tintcolor) {\n this.tint = parseTintColor(layerData.tintcolor)\n }\n\n if (layerData.infinite && layerData.chunks) {\n this._buildChunks(layerData.chunks, tilesets, ctx)\n } else {\n this._buildTiles(\n layerData.tiles,\n layerData.width,\n Math.floor(layerData.tiles.length / (layerData.width || 1)),\n 0,\n 0,\n tilesets,\n ctx\n )\n }\n }\n\n private _buildChunks(\n chunks: ResolvedChunk[],\n tilesets: TileSetRenderer[],\n ctx: MapContext\n ): void {\n for (const chunk of chunks) {\n this._buildTiles(chunk.tiles, chunk.width, chunk.height, chunk.x, chunk.y, tilesets, ctx)\n }\n }\n\n private _buildTiles(\n tiles: (ResolvedTile | null)[],\n layerWidth: number,\n layerHeight: number,\n originCol: number,\n originRow: number,\n tilesets: TileSetRenderer[],\n ctx: MapContext\n ): void {\n const order = ctx.renderorder\n\n for (const [col, row] of iterateTiles(layerWidth, layerHeight, order)) {\n const i = row * layerWidth + col\n const tile = tiles[i]\n if (!tile) continue\n\n const tsRenderer = tilesets[tile.tilesetIndex]\n if (!tsRenderer) continue\n\n const pos = tileToPixel(originCol + col, originRow + row, ctx)\n const animFrames = tsRenderer.getAnimationFrames(tile.localId)\n\n if (animFrames && animFrames.length > 1) {\n const sprite = this._createAnimatedTile(tsRenderer, animFrames, tile, pos.x, pos.y, ctx)\n if (sprite) this.addChild(sprite)\n } else {\n const texture = tsRenderer.getTexture(tile.localId)\n if (!texture) continue\n\n const sprite = new Sprite(texture)\n // Tiled draws tiles bottom-left aligned to the grid cell, so tiles\n // taller than the map's tileheight extend upward rather than below.\n // We read the tile size from tileset metadata (not texture.height)\n // because textures may still be loading at construction time — a\n // zero-height texture would otherwise shift the sprite one full row.\n const tileSize = tsRenderer.getTileSize(tile.localId)\n sprite.position.set(pos.x, pos.y + ctx.tileheight - tileSize.height)\n applyFlip(sprite, tile, ctx.tilewidth)\n this.addChild(sprite)\n }\n }\n }\n\n private _createAnimatedTile(\n tsRenderer: TileSetRenderer,\n frames: TiledFrame[],\n tile: ResolvedTile,\n x: number,\n y: number,\n ctx: MapContext\n ): AnimatedSprite | null {\n const textures: { texture: Texture; time: number }[] = []\n\n for (const frame of frames) {\n const tex = tsRenderer.getTexture(frame.tileid)\n if (!tex) return null\n textures.push({ texture: tex, time: frame.duration })\n }\n\n const sprite = new AnimatedSprite(textures)\n // Bottom-left align to the grid cell (see _buildTiles for rationale).\n const tileSize = tsRenderer.getTileSize(tile.localId)\n sprite.position.set(x, y + ctx.tileheight - tileSize.height)\n sprite.play()\n applyFlip(sprite, tile, tsRenderer.tileset.tilewidth)\n return sprite\n }\n}\n\nfunction* iterateTiles(\n width: number,\n height: number,\n order: TiledRenderOrder\n): Generator<[number, number]> {\n const rightToLeft = order === 'left-down' || order === 'left-up'\n const bottomToTop = order === 'right-up' || order === 'left-up'\n\n const rowStart = bottomToTop ? height - 1 : 0\n const rowEnd = bottomToTop ? -1 : height\n const rowStep = bottomToTop ? -1 : 1\n\n const colStart = rightToLeft ? width - 1 : 0\n const colEnd = rightToLeft ? -1 : width\n const colStep = rightToLeft ? -1 : 1\n\n for (let row = rowStart; row !== rowEnd; row += rowStep) {\n for (let col = colStart; col !== colEnd; col += colStep) {\n yield [col, row]\n }\n }\n}\n\nfunction applyFlip(sprite: Sprite, tile: ResolvedTile, tileWidth: number): void {\n if (tile.diagonalFlip) {\n sprite.rotation = Math.PI / 2\n sprite.scale.x = tile.horizontalFlip ? -1 : 1\n sprite.scale.y = tile.verticalFlip ? -1 : 1\n sprite.anchor.set(0, 1)\n sprite.position.x += tileWidth\n } else {\n if (tile.horizontalFlip) {\n sprite.scale.x = -1\n sprite.anchor.x = 1\n }\n if (tile.verticalFlip) {\n sprite.scale.y = -1\n sprite.anchor.y = 1\n }\n }\n}\n","import type { Container, Texture } from 'pixi.js'\nimport type { ResolvedLayer } from '../types'\nimport { GroupLayerRenderer } from './GroupLayerRenderer.js'\nimport { ImageLayerRenderer } from './ImageLayerRenderer.js'\nimport { ObjectLayerRenderer } from './ObjectLayerRenderer.js'\nimport { TileLayerRenderer } from './TileLayerRenderer.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\nimport type { MapContext } from './tilePlacement.js'\n\nexport function createLayerRenderer(\n layer: ResolvedLayer,\n tilesets: TileSetRenderer[],\n ctx: MapContext,\n imageTextures: Map<string, Texture>\n): Container | null {\n switch (layer.type) {\n case 'tilelayer':\n return new TileLayerRenderer(layer, tilesets, ctx)\n\n case 'imagelayer': {\n const tex = layer.image ? (imageTextures.get(layer.image) ?? null) : null\n return new ImageLayerRenderer(layer, tex)\n }\n\n case 'objectgroup':\n return new ObjectLayerRenderer(layer, tilesets)\n\n case 'group':\n return new GroupLayerRenderer(layer, tilesets, ctx, imageTextures)\n }\n}\n","import { Rectangle, Texture } from 'pixi.js'\nimport type { ResolvedTileset, TiledTileDefinition } from '../types'\n\nexport class TileSetRenderer {\n readonly tileset: ResolvedTileset\n readonly baseTexture: Texture | null\n private readonly _textureCache = new Map<number, Texture>()\n\n constructor(tileset: ResolvedTileset, baseTexture: Texture | null) {\n this.tileset = tileset\n this.baseTexture = baseTexture\n }\n\n getTexture(localId: number): Texture | null {\n const cached = this._textureCache.get(localId)\n if (cached) return cached\n\n const tileDef = this.tileset.tiles.get(localId)\n\n // Image-collection tileset: each tile has its own image (loaded separately)\n if (tileDef?.image) {\n // For image-collection tilesets, textures must be supplied externally\n // via setTileTexture(). Return null here.\n return null\n }\n\n // Single-image tileset: cut sub-rectangle from baseTexture\n if (!this.baseTexture) return null\n\n const { tilewidth, tileheight, columns, margin, spacing } = this.tileset\n if (columns <= 0) return null\n\n const col = localId % columns\n const row = Math.floor(localId / columns)\n const x = margin + col * (tilewidth + spacing)\n const y = margin + row * (tileheight + spacing)\n\n const frame = new Rectangle(x, y, tilewidth, tileheight)\n const texture = new Texture({ source: this.baseTexture.source, frame })\n\n this._textureCache.set(localId, texture)\n return texture\n }\n\n setTileTexture(localId: number, texture: Texture): void {\n this._textureCache.set(localId, texture)\n }\n\n getAnimationFrames(localId: number): TiledTileDefinition['animation'] | undefined {\n return this.tileset.tiles.get(localId)?.animation\n }\n\n /**\n * Returns the intrinsic pixel size of a tile based on tileset metadata.\n * For image-collection tilesets, each tile has its own image dimensions.\n * For regular tilesets, all tiles share the tileset's tilewidth/tileheight.\n *\n * This does not read from the pixi Texture, so it is safe to call before\n * textures have finished loading.\n */\n getTileSize(localId: number): { width: number; height: number } {\n const tileDef = this.tileset.tiles.get(localId)\n if (tileDef?.image) {\n return {\n width: tileDef.imagewidth ?? this.tileset.tilewidth,\n height: tileDef.imageheight ?? this.tileset.tileheight\n }\n }\n return { width: this.tileset.tilewidth, height: this.tileset.tileheight }\n }\n\n destroy(): void {\n for (const tex of this._textureCache.values()) {\n tex.destroy()\n }\n this._textureCache.clear()\n }\n}\n","import { Container, Graphics, Rectangle } from 'pixi.js'\nimport type { MapContext, ResolvedMap, TiledMapOptions } from '../types'\nimport { createLayerRenderer } from './createLayerRenderer.js'\nimport { parseTintColor } from './parseColor.js'\nimport { TileSetRenderer } from './TileSetRenderer.js'\n\nexport class TiledMap extends Container {\n readonly mapData: ResolvedMap\n readonly tileSetRenderers: TileSetRenderer[]\n\n private _background: Graphics | null = null\n\n constructor(mapData: ResolvedMap, options?: TiledMapOptions) {\n super()\n\n this.mapData = mapData\n this.label = 'TiledMap'\n\n // Force local bounds to the logical map size. Without this, pixi's\n // .width/.height setters (and getLocalBounds) would use the extent of\n // the rendered children — which misbehaves when the map has empty\n // top/left rows (bounds.minY > 0, causing content to overflow the\n // canvas when scaling via `.height = ...`) or when tall decoration\n // tiles extend beyond the grid.\n this.boundsArea = new Rectangle(\n 0,\n 0,\n this._computePixelWidth(mapData),\n this._computePixelHeight(mapData)\n )\n\n // Build tileset renderers\n const tilesetTextures = options?.tilesetTextures ?? new Map()\n const imageLayerTextures = options?.imageLayerTextures ?? new Map()\n const tileImageTextures = options?.tileImageTextures ?? new Map()\n\n this.tileSetRenderers = mapData.tilesets.map((ts) => {\n const baseTex = ts.image ? (tilesetTextures.get(ts.image) ?? null) : null\n const renderer = new TileSetRenderer(ts, baseTex)\n\n // Supply individual tile images for image-collection tilesets\n for (const [localId, tileDef] of ts.tiles) {\n if (tileDef.image) {\n const tex = tileImageTextures.get(tileDef.image)\n if (tex) renderer.setTileTexture(localId, tex)\n }\n }\n\n return renderer\n })\n\n // Build map context for orientation-aware tile placement\n const ctx: MapContext = {\n orientation: mapData.orientation,\n renderorder: mapData.renderorder,\n tilewidth: mapData.tilewidth,\n tileheight: mapData.tileheight,\n hexsidelength: mapData.hexsidelength,\n staggeraxis: mapData.staggeraxis,\n staggerindex: mapData.staggerindex\n }\n\n // Render background\n if (mapData.backgroundcolor) {\n this._buildBackground(mapData)\n }\n\n // Render layers\n for (const layer of mapData.layers) {\n const child = createLayerRenderer(layer, this.tileSetRenderers, ctx, imageLayerTextures)\n if (child) this.addChild(child)\n }\n }\n\n get orientation() {\n return this.mapData.orientation\n }\n get mapWidth() {\n return this.mapData.width\n }\n get mapHeight() {\n return this.mapData.height\n }\n get tileWidth() {\n return this.mapData.tilewidth\n }\n get tileHeight() {\n return this.mapData.tileheight\n }\n\n getLayer(name: string): Container | undefined {\n return this.children.find((c) => c.label === name) as Container | undefined\n }\n\n private _buildBackground(mapData: ResolvedMap): void {\n const color = parseTintColor(mapData.backgroundcolor!)\n const pixelWidth = this._computePixelWidth(mapData)\n const pixelHeight = this._computePixelHeight(mapData)\n\n this._background = new Graphics().rect(0, 0, pixelWidth, pixelHeight).fill(color)\n this._background.label = 'background'\n this.addChild(this._background)\n }\n\n private _computePixelWidth(mapData: ResolvedMap): number {\n switch (mapData.orientation) {\n case 'isometric':\n return (mapData.width + mapData.height) * (mapData.tilewidth / 2)\n case 'staggered':\n case 'hexagonal':\n return mapData.staggeraxis === 'x'\n ? (mapData.width + 1) * (mapData.tilewidth / 2)\n : mapData.width * mapData.tilewidth + mapData.tilewidth / 2\n default:\n return mapData.width * mapData.tilewidth\n }\n }\n\n private _computePixelHeight(mapData: ResolvedMap): number {\n switch (mapData.orientation) {\n case 'isometric':\n return (mapData.width + mapData.height) * (mapData.tileheight / 2)\n case 'staggered':\n case 'hexagonal':\n return mapData.staggeraxis === 'x'\n ? mapData.height * mapData.tileheight + mapData.tileheight / 2\n : (mapData.height + 1) * (mapData.tileheight / 2)\n default:\n return mapData.height * mapData.tileheight\n }\n }\n\n override destroy(options?: Parameters<Container['destroy']>[0]): void {\n for (const ts of this.tileSetRenderers) {\n ts.destroy()\n }\n super.destroy(options)\n }\n}\n","import { Assets, ExtensionType, type LoaderParser, path as pixiPath, type Texture } from 'pixi.js'\nimport { parseMapAsync, parseTmx, parseTsx } from '../parser'\nimport type { ResolvedLayer, TiledMapAsset, TiledMap as TiledMapData, TiledTileset } from '../types'\nimport { TiledMap } from './TiledMap.js'\n\nfunction isXmlExt(ext: string): boolean {\n return ext === '.tmx'\n}\n\nfunction isTsxExt(ext: string): boolean {\n return ext === '.tsx'\n}\n\nexport const tiledMapLoader: LoaderParser<TiledMapAsset> = {\n extension: {\n type: ExtensionType.LoadParser,\n name: 'tiledmap-loader'\n },\n\n id: 'tiledmap-loader',\n name: 'tiledmap-loader',\n\n test(url: string): boolean {\n const ext = pixiPath.extname(url).toLowerCase()\n return ext === '.tmx' || ext === '.tmj'\n },\n\n async load(url: string): Promise<TiledMapAsset> {\n const ext = pixiPath.extname(url).toLowerCase()\n const response = await fetch(url)\n\n let data: TiledMapData\n if (isXmlExt(ext)) {\n const xml = await response.text()\n data = parseTmx(xml)\n } else {\n data = (await response.json()) as TiledMapData\n }\n\n const basePath = pixiPath.dirname(url)\n\n // Resolve external tilesets\n const externalTilesets = new Map<string, TiledTileset>()\n for (const ts of data.tilesets) {\n if ('source' in ts && !('name' in ts)) {\n const tsUrl = pixiPath.join(basePath, ts.source)\n const tsResponse = await fetch(tsUrl)\n const tsExt = pixiPath.extname(ts.source).toLowerCase()\n let tsData: TiledTileset\n if (isTsxExt(tsExt)) {\n const tsXml = await tsResponse.text()\n tsData = parseTsx(tsXml)\n } else {\n tsData = (await tsResponse.json()) as TiledTileset\n }\n externalTilesets.set(ts.source, tsData)\n }\n }\n\n // Parse the map to resolved IR\n const mapData = await parseMapAsync(data, { externalTilesets })\n\n // Load tileset textures\n const tilesetTextures = new Map<string, Texture>()\n const imageLayerTextures = new Map<string, Texture>()\n const tileImageTextures = new Map<string, Texture>()\n\n const textureLoads: Promise<void>[] = []\n\n for (const ts of mapData.tilesets) {\n if (ts.image) {\n const imageUrl = pixiPath.join(basePath, ts.image)\n textureLoads.push(\n Assets.load<Texture>(imageUrl).then((tex) => {\n tilesetTextures.set(ts.image!, tex)\n })\n )\n }\n\n // Image-collection tilesets: each tile has its own image\n for (const [_localId, tileDef] of ts.tiles) {\n if (tileDef.image) {\n const tileImgUrl = pixiPath.join(basePath, tileDef.image)\n textureLoads.push(\n Assets.load<Texture>(tileImgUrl).then((tex) => {\n tileImageTextures.set(tileDef.image!, tex)\n })\n )\n }\n }\n }\n\n // Load image layer textures\n for (const layer of flattenLayers(mapData.layers)) {\n if (layer.type === 'imagelayer' && layer.image) {\n const imgUrl = pixiPath.join(basePath, layer.image)\n textureLoads.push(\n Assets.load<Texture>(imgUrl).then((tex) => {\n imageLayerTextures.set(layer.image, tex)\n })\n )\n }\n }\n\n await Promise.all(textureLoads)\n\n // Build the display tree\n const container = new TiledMap(mapData, {\n tilesetTextures,\n imageLayerTextures,\n tileImageTextures\n })\n\n return { mapData, container }\n }\n}\n\nfunction flattenLayers(layers: ResolvedLayer[]): ResolvedLayer[] {\n const result: ResolvedLayer[] = []\n for (const layer of layers) {\n result.push(layer)\n if (layer.type === 'group') {\n result.push(...flattenLayers(layer.layers))\n }\n }\n return result\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["pixiPath"],"sources":["../src/parser/decodeData.ts","../src/types/index.ts","../src/parser/decodeGid.ts","../src/parser/tilesetHelpers.ts","../src/parser/parseTmx.ts","../src/parser/resolveMap.ts","../src/renderer/parseColor.ts","../src/renderer/GroupLayerRenderer.ts","../src/renderer/ImageLayerRenderer.ts","../src/renderer/ObjectLayerRenderer.ts","../src/renderer/tilePlacement.ts","../src/renderer/TileLayerRenderer.ts","../src/renderer/createLayerRenderer.ts","../src/renderer/mapSize.ts","../src/renderer/TileSetRenderer.ts","../src/renderer/TiledMap.ts","../src/renderer/tiledAssetLoader.ts"],"sourcesContent":["import type { TiledCompression, TiledEncoding } from '../types'\n\nexport function decodeLayerData(\n data: number[] | string,\n encoding?: TiledEncoding,\n compression?: TiledCompression\n): number[] {\n if (Array.isArray(data)) {\n return data\n }\n\n if (encoding === 'csv') {\n return csvToGids(data)\n }\n\n if (encoding === 'base64') {\n const bytes = base64ToBytes(data)\n\n if (compression === 'gzip' || compression === 'zlib') {\n const decompressed = decompressBytes(bytes, compression)\n return bytesToGids(decompressed)\n }\n\n if (compression === 'zstd') {\n throw new Error('zstd compression is not supported in the browser')\n }\n\n return bytesToGids(bytes)\n }\n\n throw new Error(`Unsupported encoding: ${encoding ?? 'unknown'}`)\n}\n\nfunction csvToGids(csv: string): number[] {\n const out: number[] = []\n let cur = 0\n let hasDigit = false\n for (let i = 0; i < csv.length; i++) {\n const code = csv.charCodeAt(i)\n if (code >= 48 && code <= 57) {\n cur = cur * 10 + (code - 48)\n hasDigit = true\n } else if (code === 44) {\n // ','\n if (hasDigit) out.push(cur)\n cur = 0\n hasDigit = false\n }\n // whitespace / newlines: ignore\n }\n if (hasDigit) out.push(cur)\n return out\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n const binary = globalThis.atob(base64.trim())\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n}\n\nfunction bytesToGids(bytes: Uint8Array): number[] {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const count = bytes.byteLength / 4\n const gids: number[] = new Array(count)\n\n for (let i = 0; i < count; i++) {\n gids[i] = view.getUint32(i * 4, true)\n }\n\n return gids\n}\n\nasync function decompressBytesAsync(\n bytes: Uint8Array,\n compression: 'gzip' | 'zlib'\n): Promise<Uint8Array> {\n const format = compression === 'gzip' ? 'gzip' : 'deflate'\n const ds = new DecompressionStream(format)\n const writer = ds.writable.getWriter()\n writer.write(bytes as Uint8Array<ArrayBuffer>)\n writer.close()\n\n const reader = ds.readable.getReader()\n const chunks: Uint8Array[] = []\n let totalLength = 0\n\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n chunks.push(value)\n totalLength += value.byteLength\n }\n\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const chunk of chunks) {\n result.set(chunk, offset)\n offset += chunk.byteLength\n }\n return result\n}\n\nfunction decompressBytes(_bytes: Uint8Array, compression: 'gzip' | 'zlib'): Uint8Array {\n if (typeof DecompressionStream !== 'undefined') {\n // Synchronous wrapper is not possible for DecompressionStream.\n // We throw here — the async path should be used instead.\n throw new Error(\n `Compressed tile data (${compression}) requires the async parser. ` +\n 'Use parseMapAsync() instead of parseMap() for compressed maps.'\n )\n }\n\n throw new Error(\n `Compressed tile data (${compression}) is not supported in this environment. ` +\n 'DecompressionStream API is required.'\n )\n}\n\nexport async function decodeLayerDataAsync(\n data: number[] | string,\n encoding?: TiledEncoding,\n compression?: TiledCompression\n): Promise<number[]> {\n if (Array.isArray(data)) {\n return data\n }\n\n if (encoding === 'csv') {\n return csvToGids(data)\n }\n\n if (encoding === 'base64') {\n const bytes = base64ToBytes(data)\n\n if (compression === 'gzip' || compression === 'zlib') {\n const decompressed = await decompressBytesAsync(bytes, compression)\n return bytesToGids(decompressed)\n }\n\n if (compression === 'zstd') {\n throw new Error('zstd compression is not supported in the browser')\n }\n\n return bytesToGids(bytes)\n }\n\n throw new Error(`Unsupported encoding: ${encoding ?? 'unknown'}`)\n}\n","// ─── Tiled JSON Map Format Types ─────────────────────────────────────────────\n// Based on Tiled 1.11 JSON Map Format specification\n// https://doc.mapeditor.org/en/stable/reference/json-map-format/\n\nimport type { Container, Texture } from 'pixi.js'\n\n// ─── Enums / String Unions ───────────────────────────────────────────────────\n\nexport type TiledOrientation = 'orthogonal' | 'isometric' | 'staggered' | 'hexagonal'\n\nexport type TiledRenderOrder = 'right-down' | 'right-up' | 'left-down' | 'left-up'\n\nexport type TiledStaggerAxis = 'x' | 'y'\n\nexport type TiledStaggerIndex = 'odd' | 'even'\n\nexport type TiledLayerType = 'tilelayer' | 'objectgroup' | 'imagelayer' | 'group'\n\nexport type TiledDrawOrder = 'topdown' | 'index'\n\nexport type TiledEncoding = 'csv' | 'base64'\n\nexport type TiledCompression = 'zlib' | 'gzip' | 'zstd' | ''\n\nexport type TiledPropertyType =\n | 'string'\n | 'int'\n | 'float'\n | 'bool'\n | 'color'\n | 'file'\n | 'object'\n | 'class'\n\nexport type TiledObjectAlignment =\n | 'unspecified'\n | 'topleft'\n | 'top'\n | 'topright'\n | 'left'\n | 'center'\n | 'right'\n | 'bottomleft'\n | 'bottom'\n | 'bottomright'\n\nexport type TiledTileRenderSize = 'tile' | 'grid'\n\nexport type TiledFillMode = 'stretch' | 'preserve-aspect-fit'\n\nexport type TiledGridOrientation = 'orthogonal' | 'isometric'\n\nexport type TiledWangSetType = 'corner' | 'edge' | 'mixed'\n\nexport type TiledHAlign = 'center' | 'right' | 'justify' | 'left'\n\nexport type TiledVAlign = 'center' | 'bottom' | 'top'\n\n// ─── Property ────────────────────────────────────────────────────────────────\n\nexport interface TiledProperty {\n name: string\n type: TiledPropertyType\n propertytype?: string\n value: string | number | boolean\n}\n\n// ─── Point ───────────────────────────────────────────────────────────────────\n\nexport interface TiledPoint {\n x: number\n y: number\n}\n\n// ─── Text ────────────────────────────────────────────────────────────────────\n\nexport interface TiledText {\n bold?: boolean\n color?: string\n fontfamily?: string\n halign?: TiledHAlign\n italic?: boolean\n kerning?: boolean\n pixelsize?: number\n strikeout?: boolean\n text: string\n underline?: boolean\n valign?: TiledVAlign\n wrap?: boolean\n}\n\n// ─── Object ──────────────────────────────────────────────────────────────────\n\nexport interface TiledObject {\n ellipse?: boolean\n gid?: number\n height: number\n id: number\n name: string\n point?: boolean\n polygon?: TiledPoint[]\n polyline?: TiledPoint[]\n properties?: TiledProperty[]\n rotation: number\n template?: string\n text?: TiledText\n type: string\n visible: boolean\n width: number\n x: number\n y: number\n}\n\n// ─── Chunk (infinite maps) ───────────────────────────────────────────────────\n\nexport interface TiledChunk {\n data: number[] | string\n height: number\n width: number\n x: number\n y: number\n}\n\n// ─── Layer ───────────────────────────────────────────────────────────────────\n\nexport interface TiledLayer {\n chunks?: TiledChunk[]\n class?: string\n compression?: TiledCompression\n data?: number[] | string\n draworder?: TiledDrawOrder\n encoding?: TiledEncoding\n height?: number\n id: number\n image?: string\n imageheight?: number\n imagewidth?: number\n layers?: TiledLayer[]\n locked?: boolean\n name: string\n objects?: TiledObject[]\n offsetx?: number\n offsety?: number\n opacity: number\n parallaxx?: number\n parallaxy?: number\n properties?: TiledProperty[]\n repeatx?: boolean\n repeaty?: boolean\n startx?: number\n starty?: number\n tintcolor?: string\n transparentcolor?: string\n type: TiledLayerType\n visible: boolean\n width?: number\n x: number\n y: number\n}\n\n// ─── Frame (tile animation) ──────────────────────────────────────────────────\n\nexport interface TiledFrame {\n duration: number\n tileid: number\n}\n\n// ─── Tile Offset ─────────────────────────────────────────────────────────────\n\nexport interface TiledTileOffset {\n x: number\n y: number\n}\n\n// ─── Grid ────────────────────────────────────────────────────────────────────\n\nexport interface TiledGrid {\n height: number\n orientation: TiledGridOrientation\n width: number\n}\n\n// ─── Transformations ─────────────────────────────────────────────────────────\n\nexport interface TiledTransformations {\n hflip: boolean\n vflip: boolean\n rotate: boolean\n preferuntransformed: boolean\n}\n\n// ─── Terrain ─────────────────────────────────────────────────────────────────\n\nexport interface TiledTerrain {\n name: string\n properties?: TiledProperty[]\n tile: number\n}\n\n// ─── Wang Color ──────────────────────────────────────────────────────────────\n\nexport interface TiledWangColor {\n class?: string\n color: string\n name: string\n probability: number\n properties?: TiledProperty[]\n tile: number\n}\n\n// ─── Wang Tile ───────────────────────────────────────────────────────────────\n\nexport interface TiledWangTile {\n tileid: number\n wangid: number[]\n}\n\n// ─── Wang Set ────────────────────────────────────────────────────────────────\n\nexport interface TiledWangSet {\n class?: string\n colors: TiledWangColor[]\n name: string\n properties?: TiledProperty[]\n tile: number\n type: TiledWangSetType\n wangtiles: TiledWangTile[]\n}\n\n// ─── Tile Definition ─────────────────────────────────────────────────────────\n\nexport interface TiledTileDefinition {\n animation?: TiledFrame[]\n id: number\n image?: string\n imageheight?: number\n imagewidth?: number\n x?: number\n y?: number\n width?: number\n height?: number\n objectgroup?: TiledLayer\n probability?: number\n properties?: TiledProperty[]\n terrain?: number[]\n type?: string\n}\n\n// ─── Tileset ─────────────────────────────────────────────────────────────────\n\nexport interface TiledTileset {\n backgroundcolor?: string\n class?: string\n columns: number\n fillmode?: TiledFillMode\n firstgid: number\n grid?: TiledGrid\n image?: string\n imageheight?: number\n imagewidth?: number\n margin: number\n name: string\n objectalignment?: TiledObjectAlignment\n properties?: TiledProperty[]\n source?: string\n spacing: number\n terrains?: TiledTerrain[]\n tilecount: number\n tiledversion?: string\n tileheight: number\n tileoffset?: TiledTileOffset\n tilerendersize?: TiledTileRenderSize\n tiles?: TiledTileDefinition[]\n tilewidth: number\n transformations?: TiledTransformations\n transparentcolor?: string\n type?: string\n version?: string\n wangsets?: TiledWangSet[]\n}\n\n// ─── External tileset reference (before resolution) ──────────────────────────\n\nexport interface TiledTilesetRef {\n firstgid: number\n source: string\n}\n\n// ─── Map ─────────────────────────────────────────────────────────────────────\n\nexport interface TiledMap {\n backgroundcolor?: string\n class?: string\n compressionlevel?: number\n height: number\n hexsidelength?: number\n infinite: boolean\n layers: TiledLayer[]\n nextlayerid: number\n nextobjectid: number\n orientation: TiledOrientation\n parallaxoriginx?: number\n parallaxoriginy?: number\n properties?: TiledProperty[]\n renderorder?: TiledRenderOrder\n staggeraxis?: TiledStaggerAxis\n staggerindex?: TiledStaggerIndex\n tiledversion?: string\n tileheight: number\n tilesets: (TiledTileset | TiledTilesetRef)[]\n tilewidth: number\n type: 'map'\n version: string\n width: number\n}\n\n// ─── Object Template ─────────────────────────────────────────────────────────\n\nexport interface TiledObjectTemplate {\n type: 'template'\n tileset?: TiledTileset | TiledTilesetRef\n object: TiledObject\n}\n\n// ─── GID Bit Flags ───────────────────────────────────────────────────────────\n\nexport const FLIPPED_HORIZONTALLY_FLAG = 0x80000000\nexport const FLIPPED_VERTICALLY_FLAG = 0x40000000\nexport const FLIPPED_DIAGONALLY_FLAG = 0x20000000\nexport const ROTATED_HEXAGONAL_120_FLAG = 0x10000000\nexport const GID_MASK = 0x0fffffff\n\n// ─── Resolved types (post-parse, used by renderer) ──────────────────────────\n\nexport interface ResolvedTile {\n gid: number\n localId: number\n tilesetIndex: number\n horizontalFlip: boolean\n verticalFlip: boolean\n diagonalFlip: boolean\n}\n\nexport interface ResolvedChunk {\n x: number\n y: number\n width: number\n height: number\n tiles: (ResolvedTile | null)[]\n}\n\nexport interface ResolvedTileLayer {\n type: 'tilelayer'\n id: number\n name: string\n opacity: number\n visible: boolean\n offsetx: number\n offsety: number\n parallaxx: number\n parallaxy: number\n tintcolor?: string\n properties: TiledProperty[]\n width: number\n height: number\n infinite: boolean\n tiles: (ResolvedTile | null)[]\n chunks?: ResolvedChunk[]\n}\n\nexport interface ResolvedImageLayer {\n type: 'imagelayer'\n id: number\n name: string\n opacity: number\n visible: boolean\n offsetx: number\n offsety: number\n parallaxx: number\n parallaxy: number\n tintcolor?: string\n properties: TiledProperty[]\n image: string\n imagewidth?: number\n imageheight?: number\n repeatx: boolean\n repeaty: boolean\n transparentcolor?: string\n}\n\nexport interface ResolvedObjectLayer {\n type: 'objectgroup'\n id: number\n name: string\n opacity: number\n visible: boolean\n offsetx: number\n offsety: number\n parallaxx: number\n parallaxy: number\n tintcolor?: string\n properties: TiledProperty[]\n draworder: TiledDrawOrder\n objects: TiledObject[]\n}\n\nexport interface ResolvedGroupLayer {\n type: 'group'\n id: number\n name: string\n opacity: number\n visible: boolean\n offsetx: number\n offsety: number\n parallaxx: number\n parallaxy: number\n tintcolor?: string\n properties: TiledProperty[]\n layers: ResolvedLayer[]\n}\n\nexport type ResolvedLayer =\n | ResolvedTileLayer\n | ResolvedImageLayer\n | ResolvedObjectLayer\n | ResolvedGroupLayer\n\nexport interface ResolvedTileset {\n firstgid: number\n name: string\n source?: string\n tilewidth: number\n tileheight: number\n columns: number\n tilecount: number\n margin: number\n spacing: number\n image?: string\n imagewidth?: number\n imageheight?: number\n tileoffset: TiledTileOffset\n objectalignment: TiledObjectAlignment\n tilerendersize: TiledTileRenderSize\n fillmode: TiledFillMode\n tiles: Map<number, TiledTileDefinition>\n properties: TiledProperty[]\n transformations?: TiledTransformations\n grid?: TiledGrid\n wangsets?: TiledWangSet[]\n terrains?: TiledTerrain[]\n}\n\nexport interface ResolvedMap {\n orientation: TiledOrientation\n renderorder: TiledRenderOrder\n width: number\n height: number\n tilewidth: number\n tileheight: number\n infinite: boolean\n backgroundcolor?: string\n hexsidelength?: number\n staggeraxis?: TiledStaggerAxis\n staggerindex?: TiledStaggerIndex\n parallaxoriginx: number\n parallaxoriginy: number\n properties: TiledProperty[]\n tilesets: ResolvedTileset[]\n layers: ResolvedLayer[]\n version: string\n tiledversion?: string\n}\n\n// ─── Parser options ──────────────────────────────────────────────────────────\n\nexport interface ParseOptions {\n externalTilesets?: Map<string, TiledTileset>\n templates?: Map<string, TiledObjectTemplate>\n}\n\n// ─── Renderer options ────────────────────────────────────────────────────────\n\nexport interface TiledMapOptions {\n tilesetTextures?: Map<string, Texture>\n imageLayerTextures?: Map<string, Texture>\n tileImageTextures?: Map<string, Texture>\n}\n\nexport interface TiledMapAsset {\n mapData: ResolvedMap\n container: Container\n}\n\n// ─── Tile placement ──────────────────────────────────────────────────────────\n\nexport interface MapContext {\n orientation: TiledOrientation\n renderorder: TiledRenderOrder\n tilewidth: number\n tileheight: number\n hexsidelength?: number\n staggeraxis?: TiledStaggerAxis\n staggerindex?: TiledStaggerIndex\n /** Map width in pixels; used by image layers when tiling (repeatx/repeaty). */\n mapPixelWidth?: number\n /** Map height in pixels; used by image layers when tiling (repeatx/repeaty). */\n mapPixelHeight?: number\n}\n\nexport interface TilePosition {\n x: number\n y: number\n}\n","import type { ResolvedTile } from '../types'\nimport {\n FLIPPED_DIAGONALLY_FLAG,\n FLIPPED_HORIZONTALLY_FLAG,\n FLIPPED_VERTICALLY_FLAG,\n GID_MASK\n} from '../types'\n\nexport function decodeGid(raw: number): ResolvedTile | null {\n const gid = raw & GID_MASK\n if (gid === 0) return null\n\n return {\n gid,\n localId: 0,\n tilesetIndex: 0,\n horizontalFlip: (raw & FLIPPED_HORIZONTALLY_FLAG) !== 0,\n verticalFlip: (raw & FLIPPED_VERTICALLY_FLAG) !== 0,\n diagonalFlip: (raw & FLIPPED_DIAGONALLY_FLAG) !== 0\n }\n}\n","import type { TiledTileset, TiledTilesetRef } from '../types'\n\nexport function isTilesetRef(ts: TiledTileset | TiledTilesetRef): ts is TiledTilesetRef {\n return 'source' in ts && !('name' in ts)\n}\n\ninterface ColumnsSource {\n columns?: number\n imagewidth?: number\n tilewidth: number\n margin: number\n spacing: number\n}\n\nexport function computeTilesetColumns(ts: ColumnsSource): number {\n if (ts.columns && ts.columns > 0) return ts.columns\n if (!ts.imagewidth || ts.tilewidth <= 0) return 0\n return Math.floor((ts.imagewidth - 2 * ts.margin + ts.spacing) / (ts.tilewidth + ts.spacing))\n}\n\n/**\n * Finds the index of the tileset whose firstgid range contains `gid`.\n * Works with any array where each element exposes `firstgid`.\n * Returns -1 when no tileset matches.\n */\nexport function findTilesetIndexForGid(gid: number, tilesets: { firstgid: number }[]): number {\n for (let i = tilesets.length - 1; i >= 0; i--) {\n const ts = tilesets[i]\n if (ts && ts.firstgid <= gid) return i\n }\n return -1\n}\n","import type {\n TiledChunk,\n TiledCompression,\n TiledDrawOrder,\n TiledEncoding,\n TiledFillMode,\n TiledFrame,\n TiledGrid,\n TiledGridOrientation,\n TiledHAlign,\n TiledLayer,\n TiledLayerType,\n TiledMap,\n TiledObject,\n TiledObjectAlignment,\n TiledObjectTemplate,\n TiledOrientation,\n TiledPoint,\n TiledProperty,\n TiledPropertyType,\n TiledRenderOrder,\n TiledStaggerAxis,\n TiledStaggerIndex,\n TiledTerrain,\n TiledText,\n TiledTileDefinition,\n TiledTileOffset,\n TiledTileRenderSize,\n TiledTileset,\n TiledTilesetRef,\n TiledTransformations,\n TiledVAlign,\n TiledWangColor,\n TiledWangSet,\n TiledWangSetType,\n TiledWangTile\n} from '../types'\nimport { computeTilesetColumns } from './tilesetHelpers.js'\n\n// ─── Attribute helpers ──────────────────────────────────────────────────────\n\nfunction str(el: Element, name: string, fallback = ''): string {\n return el.getAttribute(name) ?? fallback\n}\n\nfunction int(el: Element, name: string, fallback = 0): number {\n const v = el.getAttribute(name)\n return v != null ? parseInt(v, 10) : fallback\n}\n\nfunction float(el: Element, name: string, fallback = 0): number {\n const v = el.getAttribute(name)\n return v != null ? parseFloat(v) : fallback\n}\n\nfunction bool(el: Element, name: string, fallback = false): boolean {\n const v = el.getAttribute(name)\n if (v == null) return fallback\n return v === '1' || v === 'true'\n}\n\nfunction optStr(el: Element, name: string): string | undefined {\n const v = el.getAttribute(name)\n return v != null ? v : undefined\n}\n\nfunction optInt(el: Element, name: string): number | undefined {\n const v = el.getAttribute(name)\n return v != null ? parseInt(v, 10) : undefined\n}\n\nfunction optFloat(el: Element, name: string): number | undefined {\n const v = el.getAttribute(name)\n return v != null ? parseFloat(v) : undefined\n}\n\nfunction children(el: Element, tag: string): Element[] {\n const result: Element[] = []\n for (let i = 0; i < el.children.length; i++) {\n const child = el.children[i]!\n if (child.tagName === tag) result.push(child)\n }\n return result\n}\n\nfunction child(el: Element, tag: string): Element | null {\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i]!\n if (c.tagName === tag) return c\n }\n return null\n}\n\n// ─── Properties ─────────────────────────────────────────────────────────────\n\nfunction parseProperties(el: Element): TiledProperty[] | undefined {\n const propsEl = child(el, 'properties')\n if (!propsEl) return undefined\n\n const props: TiledProperty[] = []\n for (const pEl of children(propsEl, 'property')) {\n const type = str(pEl, 'type', 'string') as TiledPropertyType\n let value: string | number | boolean = str(pEl, 'value', '')\n // If value not in attribute, check text content (multiline strings)\n if (!pEl.hasAttribute('value')) {\n value = pEl.textContent ?? ''\n }\n if (type === 'int') value = parseInt(value as string, 10)\n else if (type === 'float') value = parseFloat(value as string)\n else if (type === 'bool') value = value === 'true'\n\n props.push({\n name: str(pEl, 'name'),\n type,\n propertytype: optStr(pEl, 'propertytype'),\n value\n })\n }\n return props.length > 0 ? props : undefined\n}\n\n// ─── Image ──────────────────────────────────────────────────────────────────\n\ninterface ImageInfo {\n image?: string\n imagewidth?: number\n imageheight?: number\n transparentcolor?: string\n}\n\nfunction parseImage(el: Element): ImageInfo {\n const imgEl = child(el, 'image')\n if (!imgEl) return {}\n return {\n image: optStr(imgEl, 'source'),\n imagewidth: optInt(imgEl, 'width'),\n imageheight: optInt(imgEl, 'height'),\n transparentcolor: optStr(imgEl, 'trans')\n }\n}\n\n// ─── Tile offset ────────────────────────────────────────────────────────────\n\nfunction parseTileOffset(el: Element): TiledTileOffset | undefined {\n const to = child(el, 'tileoffset')\n if (!to) return undefined\n return { x: int(to, 'x'), y: int(to, 'y') }\n}\n\n// ─── Grid ───────────────────────────────────────────────────────────────────\n\nfunction parseGrid(el: Element): TiledGrid | undefined {\n const g = child(el, 'grid')\n if (!g) return undefined\n return {\n orientation: str(g, 'orientation', 'orthogonal') as TiledGridOrientation,\n width: int(g, 'width'),\n height: int(g, 'height')\n }\n}\n\n// ─── Transformations ────────────────────────────────────────────────────────\n\nfunction parseTransformations(el: Element): TiledTransformations | undefined {\n const t = child(el, 'transformations')\n if (!t) return undefined\n return {\n hflip: bool(t, 'hflip'),\n vflip: bool(t, 'vflip'),\n rotate: bool(t, 'rotate'),\n preferuntransformed: bool(t, 'preferuntransformed')\n }\n}\n\n// ─── Terrain ────────────────────────────────────────────────────────────────\n\nfunction parseTerrains(el: Element): TiledTerrain[] | undefined {\n const ttEl = child(el, 'terraintypes')\n if (!ttEl) return undefined\n return children(ttEl, 'terrain').map((t) => ({\n name: str(t, 'name'),\n tile: int(t, 'tile'),\n properties: parseProperties(t)\n }))\n}\n\n// ─── Wang sets ──────────────────────────────────────────────────────────────\n\nfunction parseWangSets(el: Element): TiledWangSet[] | undefined {\n const wsEl = child(el, 'wangsets')\n if (!wsEl) return undefined\n\n return children(wsEl, 'wangset').map((ws) => {\n const colors: TiledWangColor[] = children(ws, 'wangcolor').map((wc) => ({\n class: optStr(wc, 'class'),\n color: str(wc, 'color'),\n name: str(wc, 'name'),\n probability: float(wc, 'probability'),\n tile: int(wc, 'tile'),\n properties: parseProperties(wc)\n }))\n\n const tiles: TiledWangTile[] = children(ws, 'wangtile').map((wt) => ({\n tileid: int(wt, 'tileid'),\n wangid: str(wt, 'wangid').split(',').map(Number)\n }))\n\n return {\n class: optStr(ws, 'class'),\n colors,\n name: str(ws, 'name'),\n properties: parseProperties(ws),\n tile: int(ws, 'tile'),\n type: str(ws, 'type', 'corner') as TiledWangSetType,\n wangtiles: tiles\n } satisfies TiledWangSet\n })\n}\n\n// ─── Animation ──────────────────────────────────────────────────────────────\n\nfunction parseAnimation(el: Element): TiledFrame[] | undefined {\n const animEl = child(el, 'animation')\n if (!animEl) return undefined\n return children(animEl, 'frame').map((f) => ({\n tileid: int(f, 'tileid'),\n duration: int(f, 'duration')\n }))\n}\n\n// ─── Tile definitions ───────────────────────────────────────────────────────\n\nfunction parseTileDefinitions(el: Element): TiledTileDefinition[] | undefined {\n const tileEls = children(el, 'tile')\n if (tileEls.length === 0) return undefined\n\n return tileEls.map((t) => {\n const img = parseImage(t)\n const terrainAttr = optStr(t, 'terrain')\n const terrain = terrainAttr\n ? terrainAttr.split(',').map((v) => (v === '' ? -1 : parseInt(v, 10)))\n : undefined\n\n // Object group (collision shapes)\n const ogEl = child(t, 'objectgroup')\n const objectgroup = ogEl ? parseObjectGroup(ogEl) : undefined\n\n const def: TiledTileDefinition = {\n id: int(t, 'id'),\n type: optStr(t, 'type') ?? optStr(t, 'class'),\n probability: optFloat(t, 'probability'),\n x: optInt(t, 'x'),\n y: optInt(t, 'y'),\n width: optInt(t, 'width'),\n height: optInt(t, 'height'),\n properties: parseProperties(t),\n animation: parseAnimation(t),\n terrain,\n objectgroup,\n ...img\n }\n\n return def\n })\n}\n\n// ─── Tileset ────────────────────────────────────────────────────────────────\n\nfunction parseTileset(el: Element): TiledTileset | TiledTilesetRef {\n const source = optStr(el, 'source')\n if (source) {\n return {\n firstgid: int(el, 'firstgid'),\n source\n } satisfies TiledTilesetRef\n }\n\n const img = parseImage(el)\n const tiles = parseTileDefinitions(el)\n\n const tilewidth = int(el, 'tilewidth')\n const spacing = int(el, 'spacing')\n const margin = int(el, 'margin')\n const columns = computeTilesetColumns({\n columns: int(el, 'columns'),\n imagewidth: img.imagewidth,\n tilewidth,\n margin,\n spacing\n })\n\n return {\n backgroundcolor: optStr(el, 'backgroundcolor'),\n class: optStr(el, 'class'),\n columns,\n fillmode: optStr(el, 'fillmode') as TiledFillMode | undefined,\n firstgid: int(el, 'firstgid'),\n grid: parseGrid(el),\n margin,\n name: str(el, 'name'),\n objectalignment: optStr(el, 'objectalignment') as TiledObjectAlignment | undefined,\n properties: parseProperties(el),\n spacing,\n terrains: parseTerrains(el),\n tilecount: int(el, 'tilecount'),\n tileheight: int(el, 'tileheight'),\n tileoffset: parseTileOffset(el),\n tilerendersize: optStr(el, 'tilerendersize') as TiledTileRenderSize | undefined,\n tiles: tiles,\n tilewidth,\n transformations: parseTransformations(el),\n wangsets: parseWangSets(el),\n ...img\n } satisfies TiledTileset\n}\n\n// ─── Data / Chunks ──────────────────────────────────────────────────────────\n\nfunction parseData(dataEl: Element): {\n data?: number[] | string\n encoding?: TiledEncoding\n compression?: TiledCompression\n chunks?: TiledChunk[]\n} {\n const encoding = optStr(dataEl, 'encoding') as TiledEncoding | undefined\n const compression = optStr(dataEl, 'compression') as TiledCompression | undefined\n\n // Check for chunks (infinite maps)\n const chunkEls = children(dataEl, 'chunk')\n if (chunkEls.length > 0) {\n const chunks: TiledChunk[] = chunkEls.map((c) => ({\n x: int(c, 'x'),\n y: int(c, 'y'),\n width: int(c, 'width'),\n height: int(c, 'height'),\n data: parseDataContent(c, encoding)\n }))\n return { encoding, compression, chunks }\n }\n\n return {\n data: parseDataContent(dataEl, encoding),\n encoding,\n compression\n }\n}\n\nfunction parseDataContent(el: Element, encoding: TiledEncoding | undefined): number[] | string {\n if (encoding === 'base64') {\n return (el.textContent ?? '').trim()\n }\n\n if (encoding === 'csv') {\n const out: number[] = []\n for (const token of (el.textContent ?? '').split(',')) {\n const trimmed = token.trim()\n if (trimmed.length === 0) continue\n out.push(parseInt(trimmed, 10))\n }\n return out\n }\n\n // XML tile elements (no encoding)\n const tileEls = children(el, 'tile')\n return tileEls.map((t) => int(t, 'gid'))\n}\n\n// ─── Objects ────────────────────────────────────────────────────────────────\n\nfunction parsePoints(pointStr: string): TiledPoint[] {\n return pointStr\n .trim()\n .split(/\\s+/)\n .map((pair) => {\n const [x, y] = pair.split(',').map(Number)\n return { x: x!, y: y! }\n })\n}\n\nfunction parseTextObject(el: Element): TiledText {\n return {\n text: el.textContent ?? '',\n fontfamily: optStr(el, 'fontfamily'),\n pixelsize: optInt(el, 'pixelsize'),\n wrap: bool(el, 'wrap') ? true : undefined,\n color: optStr(el, 'color'),\n bold: bool(el, 'bold') ? true : undefined,\n italic: bool(el, 'italic') ? true : undefined,\n underline: bool(el, 'underline') ? true : undefined,\n strikeout: bool(el, 'strikeout') ? true : undefined,\n kerning: el.hasAttribute('kerning') ? bool(el, 'kerning', true) : undefined,\n halign: optStr(el, 'halign') as TiledHAlign | undefined,\n valign: optStr(el, 'valign') as TiledVAlign | undefined\n }\n}\n\nfunction parseObject(el: Element): TiledObject {\n const obj: TiledObject = {\n id: int(el, 'id'),\n name: str(el, 'name'),\n type: str(el, 'type') || str(el, 'class'),\n x: float(el, 'x'),\n y: float(el, 'y'),\n width: float(el, 'width'),\n height: float(el, 'height'),\n rotation: float(el, 'rotation'),\n visible: el.hasAttribute('visible') ? bool(el, 'visible', true) : true,\n properties: parseProperties(el)\n }\n\n const gid = optInt(el, 'gid')\n if (gid != null) obj.gid = gid\n\n const template = optStr(el, 'template')\n if (template) obj.template = template\n\n if (child(el, 'ellipse')) obj.ellipse = true\n if (child(el, 'point')) obj.point = true\n\n const polygonEl = child(el, 'polygon')\n if (polygonEl) {\n obj.polygon = parsePoints(str(polygonEl, 'points'))\n }\n\n const polylineEl = child(el, 'polyline')\n if (polylineEl) {\n obj.polyline = parsePoints(str(polylineEl, 'points'))\n }\n\n const textEl = child(el, 'text')\n if (textEl) {\n obj.text = parseTextObject(textEl)\n }\n\n return obj\n}\n\n// ─── Layers ─────────────────────────────────────────────────────────────────\n\nfunction parseLayerCommon(el: Element): Partial<TiledLayer> {\n return {\n id: int(el, 'id'),\n name: str(el, 'name'),\n class: optStr(el, 'class'),\n opacity: float(el, 'opacity', 1),\n visible: el.hasAttribute('visible') ? bool(el, 'visible', true) : true,\n tintcolor: optStr(el, 'tintcolor'),\n offsetx: optFloat(el, 'offsetx'),\n offsety: optFloat(el, 'offsety'),\n parallaxx: optFloat(el, 'parallaxx'),\n parallaxy: optFloat(el, 'parallaxy'),\n locked: el.hasAttribute('locked') ? bool(el, 'locked') : undefined,\n properties: parseProperties(el),\n x: int(el, 'x'),\n y: int(el, 'y')\n }\n}\n\nfunction parseTileLayer(el: Element): TiledLayer {\n const dataEl = child(el, 'data')\n const dataInfo = dataEl ? parseData(dataEl) : {}\n\n return {\n ...parseLayerCommon(el),\n type: 'tilelayer' as TiledLayerType,\n width: optInt(el, 'width'),\n height: optInt(el, 'height'),\n startx: optInt(el, 'startx'),\n starty: optInt(el, 'starty'),\n ...dataInfo\n } as TiledLayer\n}\n\nfunction parseObjectGroup(el: Element): TiledLayer {\n return {\n ...parseLayerCommon(el),\n type: 'objectgroup' as TiledLayerType,\n draworder: optStr(el, 'draworder') as TiledDrawOrder | undefined,\n objects: children(el, 'object').map(parseObject)\n } as TiledLayer\n}\n\nfunction parseImageLayer(el: Element): TiledLayer {\n const img = parseImage(el)\n return {\n ...parseLayerCommon(el),\n type: 'imagelayer' as TiledLayerType,\n repeatx: el.hasAttribute('repeatx') ? bool(el, 'repeatx') : undefined,\n repeaty: el.hasAttribute('repeaty') ? bool(el, 'repeaty') : undefined,\n transparentcolor: img.transparentcolor,\n image: img.image,\n imagewidth: img.imagewidth,\n imageheight: img.imageheight\n } as TiledLayer\n}\n\nfunction parseGroupLayer(el: Element): TiledLayer {\n return {\n ...parseLayerCommon(el),\n type: 'group' as TiledLayerType,\n layers: parseLayers(el)\n } as TiledLayer\n}\n\nfunction parseLayers(parentEl: Element): TiledLayer[] {\n const layers: TiledLayer[] = []\n for (let i = 0; i < parentEl.children.length; i++) {\n const el = parentEl.children[i]!\n switch (el.tagName) {\n case 'layer':\n layers.push(parseTileLayer(el))\n break\n case 'objectgroup':\n layers.push(parseObjectGroup(el))\n break\n case 'imagelayer':\n layers.push(parseImageLayer(el))\n break\n case 'group':\n layers.push(parseGroupLayer(el))\n break\n }\n }\n return layers\n}\n\n// ─── Map ────────────────────────────────────────────────────────────────────\n\nexport function parseTmx(xml: string): TiledMap {\n const parser = new DOMParser()\n const doc = parser.parseFromString(xml, 'text/xml')\n\n const errorNode = doc.querySelector('parsererror')\n if (errorNode) {\n throw new Error(`TMX XML parse error: ${errorNode.textContent}`)\n }\n\n const mapEl = doc.documentElement\n if (mapEl.tagName !== 'map') {\n throw new Error(`Expected root <map> element, got <${mapEl.tagName}>`)\n }\n\n const tilesets: (TiledTileset | TiledTilesetRef)[] = children(mapEl, 'tileset').map(parseTileset)\n\n const layers = parseLayers(mapEl)\n\n return {\n backgroundcolor: optStr(mapEl, 'backgroundcolor'),\n class: optStr(mapEl, 'class'),\n compressionlevel: optInt(mapEl, 'compressionlevel'),\n height: int(mapEl, 'height'),\n hexsidelength: optInt(mapEl, 'hexsidelength'),\n infinite: bool(mapEl, 'infinite'),\n layers,\n nextlayerid: int(mapEl, 'nextlayerid'),\n nextobjectid: int(mapEl, 'nextobjectid'),\n orientation: str(mapEl, 'orientation', 'orthogonal') as TiledOrientation,\n parallaxoriginx: optFloat(mapEl, 'parallaxoriginx'),\n parallaxoriginy: optFloat(mapEl, 'parallaxoriginy'),\n properties: parseProperties(mapEl),\n renderorder: optStr(mapEl, 'renderorder') as TiledRenderOrder | undefined,\n staggeraxis: optStr(mapEl, 'staggeraxis') as TiledStaggerAxis | undefined,\n staggerindex: optStr(mapEl, 'staggerindex') as TiledStaggerIndex | undefined,\n tiledversion: optStr(mapEl, 'tiledversion'),\n tileheight: int(mapEl, 'tileheight'),\n tilesets,\n tilewidth: int(mapEl, 'tilewidth'),\n type: 'map',\n version: str(mapEl, 'version', '1.0'),\n width: int(mapEl, 'width')\n }\n}\n\nexport function parseTsx(xml: string): TiledTileset {\n const parser = new DOMParser()\n const doc = parser.parseFromString(xml, 'text/xml')\n\n const errorNode = doc.querySelector('parsererror')\n if (errorNode) {\n throw new Error(`TSX XML parse error: ${errorNode.textContent}`)\n }\n\n const tsEl = doc.documentElement\n if (tsEl.tagName !== 'tileset') {\n throw new Error(`Expected root <tileset> element, got <${tsEl.tagName}>`)\n }\n\n const result = parseTileset(tsEl)\n if ('source' in result) {\n throw new Error('TSX file should not contain a source reference')\n }\n return result\n}\n\n// ─── Template (TX) ──────────────────────────────────────────────────────────\n\nexport function parseTx(xml: string): TiledObjectTemplate {\n const parser = new DOMParser()\n const doc = parser.parseFromString(xml, 'text/xml')\n\n const errorNode = doc.querySelector('parsererror')\n if (errorNode) {\n throw new Error(`TX XML parse error: ${errorNode.textContent}`)\n }\n\n const tplEl = doc.documentElement\n if (tplEl.tagName !== 'template') {\n throw new Error(`Expected root <template> element, got <${tplEl.tagName}>`)\n }\n\n const tilesetEl = child(tplEl, 'tileset')\n const objectEl = child(tplEl, 'object')\n if (!objectEl) {\n throw new Error('Template is missing <object>')\n }\n\n return {\n type: 'template',\n tileset: tilesetEl ? parseTileset(tilesetEl) : undefined,\n object: parseObject(objectEl)\n }\n}\n","import type {\n ParseOptions,\n ResolvedChunk,\n ResolvedGroupLayer,\n ResolvedImageLayer,\n ResolvedLayer,\n ResolvedMap,\n ResolvedObjectLayer,\n ResolvedTile,\n ResolvedTileLayer,\n ResolvedTileset,\n TiledChunk,\n TiledDrawOrder,\n TiledLayer,\n TiledMap,\n TiledObject,\n TiledObjectTemplate,\n TiledRenderOrder,\n TiledTileDefinition,\n TiledTileset,\n TiledTilesetRef\n} from '../types'\nimport { GID_MASK } from '../types'\nimport { decodeLayerData, decodeLayerDataAsync } from './decodeData.js'\nimport { decodeGid } from './decodeGid.js'\nimport { computeTilesetColumns, findTilesetIndexForGid, isTilesetRef } from './tilesetHelpers.js'\n\n// ─── Resolve tileset ─────────────────────────────────────────────────────────\n\nfunction resolveTileset(raw: TiledTileset, source?: string): ResolvedTileset {\n const tiles = new Map<number, TiledTileDefinition>()\n if (raw.tiles) {\n for (const tile of raw.tiles) {\n tiles.set(tile.id, tile)\n }\n }\n\n return {\n firstgid: raw.firstgid,\n name: raw.name,\n source,\n tilewidth: raw.tilewidth,\n tileheight: raw.tileheight,\n columns: computeTilesetColumns(raw),\n tilecount: raw.tilecount,\n margin: raw.margin,\n spacing: raw.spacing,\n image: raw.image,\n imagewidth: raw.imagewidth,\n imageheight: raw.imageheight,\n tileoffset: raw.tileoffset ?? { x: 0, y: 0 },\n objectalignment: raw.objectalignment ?? 'unspecified',\n tilerendersize: raw.tilerendersize ?? 'tile',\n fillmode: raw.fillmode ?? 'stretch',\n tiles,\n properties: raw.properties ?? [],\n transformations: raw.transformations,\n grid: raw.grid,\n wangsets: raw.wangsets,\n terrains: raw.terrains\n }\n}\n\n// ─── Resolve tile data ───────────────────────────────────────────────────────\n\nfunction resolveGids(rawGids: number[], tilesets: ResolvedTileset[]): (ResolvedTile | null)[] {\n const result: (ResolvedTile | null)[] = new Array(rawGids.length)\n\n for (let i = 0; i < rawGids.length; i++) {\n const rawGid = rawGids[i]\n if (rawGid === undefined || rawGid === 0) {\n result[i] = null\n continue\n }\n\n const decoded = decodeGid(rawGid)\n if (!decoded) {\n result[i] = null\n continue\n }\n\n const tsIdx = findTilesetIndexForGid(decoded.gid, tilesets)\n const ts = tsIdx >= 0 ? tilesets[tsIdx] : undefined\n if (ts) {\n decoded.tilesetIndex = tsIdx\n decoded.localId = decoded.gid - ts.firstgid\n }\n result[i] = decoded\n }\n\n return result\n}\n\n// ─── Layer defaults ──────────────────────────────────────────────────────────\n\nfunction layerDefaults(layer: TiledLayer) {\n return {\n id: layer.id,\n name: layer.name,\n opacity: layer.opacity,\n visible: layer.visible,\n offsetx: layer.offsetx ?? 0,\n offsety: layer.offsety ?? 0,\n parallaxx: layer.parallaxx ?? 1,\n parallaxy: layer.parallaxy ?? 1,\n tintcolor: layer.tintcolor,\n properties: layer.properties ?? []\n }\n}\n\n// ─── Template merging ────────────────────────────────────────────────────────\n\nfunction mergeTemplate(\n obj: TiledObject,\n template: TiledObjectTemplate,\n tilesets: ResolvedTileset[]\n): TiledObject {\n // Start from the template's object, then override with the instance's\n // own fields (only the ones explicitly set — Tiled stores only deltas).\n const base: TiledObject = {\n ...template.object,\n id: obj.id,\n // Non-optional fields on the instance always win when present in TiledObject.\n x: obj.x,\n y: obj.y,\n rotation: obj.rotation,\n visible: obj.visible\n }\n\n // name / type are strings on TiledObject with no explicit \"unset\" sentinel.\n // Prefer the instance only when it provided a non-empty value.\n if (obj.name) base.name = obj.name\n if (obj.type) base.type = obj.type\n if (obj.width) base.width = obj.width\n if (obj.height) base.height = obj.height\n if (obj.properties) base.properties = obj.properties\n if (obj.text) base.text = obj.text\n if (obj.gid !== undefined) base.gid = obj.gid\n if (obj.polygon) base.polygon = obj.polygon\n if (obj.polyline) base.polyline = obj.polyline\n if (obj.ellipse) base.ellipse = obj.ellipse\n if (obj.point) base.point = obj.point\n\n // GID remapping: the template's gid is relative to the template's own\n // embedded tileset firstgid. If the template carried a tileset ref and\n // the map has the same tileset (matched by source), translate the gid\n // into the map's firstgid space so it points at the right tile.\n if (\n base.gid !== undefined &&\n template.tileset &&\n 'source' in template.tileset &&\n template.tileset.source\n ) {\n const src = template.tileset.source\n const mapTs = tilesets.find((t) => t.source === src)\n if (mapTs) {\n const templateFirstGid = template.tileset.firstgid ?? 1\n // Preserve flip flags in the high bits.\n const flipBits = base.gid & ~GID_MASK\n const localId = (base.gid & GID_MASK) - templateFirstGid\n if (localId >= 0) {\n base.gid = (mapTs.firstgid + localId) | flipBits\n }\n }\n }\n\n return base\n}\n\nfunction resolveObjects(\n objects: TiledObject[],\n tilesets: ResolvedTileset[],\n templates?: Map<string, TiledObjectTemplate>\n): TiledObject[] {\n if (!templates || templates.size === 0) return objects\n return objects.map((obj) => {\n if (!obj.template) return obj\n const tpl = templates.get(obj.template)\n if (!tpl) return obj\n return mergeTemplate(obj, tpl, tilesets)\n })\n}\n\n// ─── Resolve layers (sync) ──────────────────────────────────────────────────\n\nfunction resolveLayer(\n layer: TiledLayer,\n tilesets: ResolvedTileset[],\n templates?: Map<string, TiledObjectTemplate>\n): ResolvedLayer {\n switch (layer.type) {\n case 'tilelayer': {\n const hasChunks = layer.chunks && layer.chunks.length > 0\n\n if (hasChunks) {\n const resolvedChunks = resolveChunksSync(\n layer.chunks!,\n layer.encoding,\n layer.compression,\n tilesets\n )\n return {\n type: 'tilelayer',\n ...layerDefaults(layer),\n width: layer.width ?? 0,\n height: layer.height ?? 0,\n infinite: true,\n tiles: [],\n chunks: resolvedChunks\n } satisfies ResolvedTileLayer\n }\n\n const rawGids = decodeLayerData(layer.data ?? [], layer.encoding, layer.compression)\n const tiles = resolveGids(rawGids, tilesets)\n return {\n type: 'tilelayer',\n ...layerDefaults(layer),\n width: layer.width ?? 0,\n height: layer.height ?? 0,\n infinite: false,\n tiles\n } satisfies ResolvedTileLayer\n }\n\n case 'imagelayer':\n return {\n type: 'imagelayer',\n ...layerDefaults(layer),\n image: layer.image ?? '',\n imagewidth: layer.imagewidth,\n imageheight: layer.imageheight,\n repeatx: layer.repeatx ?? false,\n repeaty: layer.repeaty ?? false,\n transparentcolor: layer.transparentcolor\n } satisfies ResolvedImageLayer\n\n case 'objectgroup':\n return {\n type: 'objectgroup',\n ...layerDefaults(layer),\n draworder: (layer.draworder ?? 'topdown') as TiledDrawOrder,\n objects: resolveObjects(layer.objects ?? [], tilesets, templates)\n } satisfies ResolvedObjectLayer\n\n case 'group':\n return {\n type: 'group',\n ...layerDefaults(layer),\n layers: (layer.layers ?? []).map((l) => resolveLayer(l, tilesets, templates))\n } satisfies ResolvedGroupLayer\n }\n}\n\n// ─── Resolve layers (async — needed for compressed data) ─────────────────────\n\nasync function resolveLayerAsync(\n layer: TiledLayer,\n tilesets: ResolvedTileset[],\n templates?: Map<string, TiledObjectTemplate>\n): Promise<ResolvedLayer> {\n switch (layer.type) {\n case 'tilelayer': {\n const hasChunks = layer.chunks && layer.chunks.length > 0\n\n if (hasChunks) {\n const resolvedChunks = await resolveChunksAsync(\n layer.chunks!,\n layer.encoding,\n layer.compression,\n tilesets\n )\n return {\n type: 'tilelayer',\n ...layerDefaults(layer),\n width: layer.width ?? 0,\n height: layer.height ?? 0,\n infinite: true,\n tiles: [],\n chunks: resolvedChunks\n } satisfies ResolvedTileLayer\n }\n\n const rawGids = await decodeLayerDataAsync(\n layer.data ?? [],\n layer.encoding,\n layer.compression\n )\n const tiles = resolveGids(rawGids, tilesets)\n return {\n type: 'tilelayer',\n ...layerDefaults(layer),\n width: layer.width ?? 0,\n height: layer.height ?? 0,\n infinite: false,\n tiles\n } satisfies ResolvedTileLayer\n }\n\n case 'imagelayer':\n return {\n type: 'imagelayer',\n ...layerDefaults(layer),\n image: layer.image ?? '',\n imagewidth: layer.imagewidth,\n imageheight: layer.imageheight,\n repeatx: layer.repeatx ?? false,\n repeaty: layer.repeaty ?? false,\n transparentcolor: layer.transparentcolor\n } satisfies ResolvedImageLayer\n\n case 'objectgroup':\n return {\n type: 'objectgroup',\n ...layerDefaults(layer),\n draworder: (layer.draworder ?? 'topdown') as TiledDrawOrder,\n objects: resolveObjects(layer.objects ?? [], tilesets, templates)\n } satisfies ResolvedObjectLayer\n\n case 'group': {\n const resolvedChildren = await Promise.all(\n (layer.layers ?? []).map((l) => resolveLayerAsync(l, tilesets, templates))\n )\n return {\n type: 'group',\n ...layerDefaults(layer),\n layers: resolvedChildren\n } satisfies ResolvedGroupLayer\n }\n }\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\nexport function parseMap(data: TiledMap, options?: ParseOptions): ResolvedMap {\n const resolvedTilesets = resolveTilesets(data.tilesets, options)\n const layers = data.layers.map((l) => resolveLayer(l, resolvedTilesets, options?.templates))\n\n return buildResolvedMap(data, resolvedTilesets, layers)\n}\n\nexport async function parseMapAsync(data: TiledMap, options?: ParseOptions): Promise<ResolvedMap> {\n const resolvedTilesets = resolveTilesets(data.tilesets, options)\n const layers = await Promise.all(\n data.layers.map((l) => resolveLayerAsync(l, resolvedTilesets, options?.templates))\n )\n\n return buildResolvedMap(data, resolvedTilesets, layers)\n}\n\n// ─── Chunk resolution ────────────────────────────────────────────────────────\n\nfunction resolveChunksSync(\n chunks: TiledChunk[],\n encoding: TiledLayer['encoding'],\n compression: TiledLayer['compression'],\n tilesets: ResolvedTileset[]\n): ResolvedChunk[] {\n return chunks.map((chunk) => {\n const rawGids = decodeLayerData(chunk.data, encoding, compression)\n return {\n x: chunk.x,\n y: chunk.y,\n width: chunk.width,\n height: chunk.height,\n tiles: resolveGids(rawGids, tilesets)\n }\n })\n}\n\nasync function resolveChunksAsync(\n chunks: TiledChunk[],\n encoding: TiledLayer['encoding'],\n compression: TiledLayer['compression'],\n tilesets: ResolvedTileset[]\n): Promise<ResolvedChunk[]> {\n return Promise.all(\n chunks.map(async (chunk) => {\n const rawGids = await decodeLayerDataAsync(chunk.data, encoding, compression)\n return {\n x: chunk.x,\n y: chunk.y,\n width: chunk.width,\n height: chunk.height,\n tiles: resolveGids(rawGids, tilesets)\n }\n })\n )\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction resolveTilesets(\n raw: (TiledTileset | TiledTilesetRef)[],\n options?: ParseOptions\n): ResolvedTileset[] {\n return raw.map((ts) => {\n if (isTilesetRef(ts)) {\n const external = options?.externalTilesets?.get(ts.source)\n if (!external) {\n throw new Error(\n `External tileset \"${ts.source}\" not provided. Pass it via options.externalTilesets.`\n )\n }\n return resolveTileset({ ...external, firstgid: ts.firstgid }, ts.source)\n }\n return resolveTileset(ts)\n })\n}\n\nfunction buildResolvedMap(\n data: TiledMap,\n tilesets: ResolvedTileset[],\n layers: ResolvedLayer[]\n): ResolvedMap {\n return {\n orientation: data.orientation,\n renderorder: (data.renderorder ?? 'right-down') as TiledRenderOrder,\n width: data.width,\n height: data.height,\n tilewidth: data.tilewidth,\n tileheight: data.tileheight,\n infinite: data.infinite,\n backgroundcolor: data.backgroundcolor,\n hexsidelength: data.hexsidelength,\n staggeraxis: data.staggeraxis,\n staggerindex: data.staggerindex,\n parallaxoriginx: data.parallaxoriginx ?? 0,\n parallaxoriginy: data.parallaxoriginy ?? 0,\n properties: data.properties ?? [],\n tilesets,\n layers,\n version: data.version,\n tiledversion: data.tiledversion\n }\n}\n","export function parseTintColor(hex: string): number {\n const clean = hex.replace('#', '')\n // #AARRGGBB → strip alpha, use RRGGBB\n if (clean.length === 8) {\n return parseInt(clean.slice(2), 16)\n }\n // #RRGGBB\n return parseInt(clean, 16)\n}\n","import { Container, type Texture } from 'pixi.js'\nimport type { ResolvedGroupLayer } from '../types'\nimport { createLayerRenderer } from './createLayerRenderer.js'\nimport { parseTintColor } from './parseColor.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\nimport type { MapContext } from './tilePlacement.js'\n\nexport class GroupLayerRenderer extends Container {\n readonly layerData: ResolvedGroupLayer\n readonly layerBaseOffsetX: number\n readonly layerBaseOffsetY: number\n readonly layerParallaxX: number\n readonly layerParallaxY: number\n\n constructor(\n layerData: ResolvedGroupLayer,\n tilesets: TileSetRenderer[],\n ctx: MapContext,\n imageTextures: Map<string, Texture>\n ) {\n super()\n\n this.layerData = layerData\n this.label = layerData.name\n this.alpha = layerData.opacity\n this.visible = layerData.visible\n this.layerBaseOffsetX = layerData.offsetx\n this.layerBaseOffsetY = layerData.offsety\n this.layerParallaxX = layerData.parallaxx\n this.layerParallaxY = layerData.parallaxy\n this.position.set(layerData.offsetx, layerData.offsety)\n if (layerData.tintcolor) {\n this.tint = parseTintColor(layerData.tintcolor)\n }\n\n for (const child of layerData.layers) {\n const renderer = createLayerRenderer(child, tilesets, ctx, imageTextures)\n if (renderer) this.addChild(renderer)\n }\n }\n}\n","import { Container, Sprite, type Texture, TilingSprite } from 'pixi.js'\nimport type { MapContext, ResolvedImageLayer } from '../types'\nimport { parseTintColor } from './parseColor.js'\n\nexport class ImageLayerRenderer extends Container {\n readonly layerData: ResolvedImageLayer\n readonly layerBaseOffsetX: number\n readonly layerBaseOffsetY: number\n readonly layerParallaxX: number\n readonly layerParallaxY: number\n\n constructor(layerData: ResolvedImageLayer, texture: Texture | null, ctx?: MapContext) {\n super()\n\n this.layerData = layerData\n this.label = layerData.name\n this.alpha = layerData.opacity\n this.visible = layerData.visible\n this.layerBaseOffsetX = layerData.offsetx\n this.layerBaseOffsetY = layerData.offsety\n this.layerParallaxX = layerData.parallaxx\n this.layerParallaxY = layerData.parallaxy\n this.position.set(layerData.offsetx, layerData.offsety)\n if (layerData.tintcolor) {\n this.tint = parseTintColor(layerData.tintcolor)\n }\n\n if (texture) {\n this._buildImage(texture, ctx)\n }\n }\n\n private _buildImage(texture: Texture, ctx?: MapContext): void {\n const { repeatx, repeaty } = this.layerData\n\n if (!repeatx && !repeaty) {\n this.addChild(new Sprite(texture))\n return\n }\n\n // Size the tiling sprite so it spans the full map. If the map pixel size\n // is unavailable, fall back to the texture's natural size.\n const spanW = ctx?.mapPixelWidth && ctx.mapPixelWidth > 0 ? ctx.mapPixelWidth : texture.width\n const spanH =\n ctx?.mapPixelHeight && ctx.mapPixelHeight > 0 ? ctx.mapPixelHeight : texture.height\n\n this.addChild(\n new TilingSprite({\n texture,\n width: repeatx ? spanW : texture.width,\n height: repeaty ? spanH : texture.height\n })\n )\n }\n}\n","import { Container, Graphics, Sprite, Text } from 'pixi.js'\nimport { decodeGid } from '../parser'\nimport type { ResolvedObjectLayer, TiledObject, TiledPoint, TiledText } from '../types'\nimport { parseTintColor } from './parseColor.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\n\nexport class ObjectLayerRenderer extends Container {\n readonly layerData: ResolvedObjectLayer\n readonly layerBaseOffsetX: number\n readonly layerBaseOffsetY: number\n readonly layerParallaxX: number\n readonly layerParallaxY: number\n\n constructor(layerData: ResolvedObjectLayer, tilesets: TileSetRenderer[]) {\n super()\n\n this.layerData = layerData\n this.label = layerData.name\n this.alpha = layerData.opacity\n this.visible = layerData.visible\n this.layerBaseOffsetX = layerData.offsetx\n this.layerBaseOffsetY = layerData.offsety\n this.layerParallaxX = layerData.parallaxx\n this.layerParallaxY = layerData.parallaxy\n this.position.set(layerData.offsetx, layerData.offsety)\n if (layerData.tintcolor) {\n this.tint = parseTintColor(layerData.tintcolor)\n }\n\n this._buildObjects(tilesets)\n }\n\n private _buildObjects(tilesets: TileSetRenderer[]): void {\n for (const obj of this.layerData.objects) {\n const child = this._createObject(obj, tilesets)\n if (child) {\n child.label = obj.name || `object_${obj.id}`\n this.addChild(child)\n }\n }\n }\n\n private _createObject(obj: TiledObject, tilesets: TileSetRenderer[]): Container | null {\n // Tile object (has gid)\n if (obj.gid !== undefined) {\n return this._createTileObject(obj, tilesets)\n }\n\n // Text object\n if (obj.text) {\n return this._createTextObject(obj)\n }\n\n // Shape objects\n if (obj.ellipse) {\n return this._createEllipse(obj)\n }\n\n if (obj.point) {\n return this._createPoint(obj)\n }\n\n if (obj.polygon) {\n return this._createPolygon(obj, obj.polygon, true)\n }\n\n if (obj.polyline) {\n return this._createPolygon(obj, obj.polyline, false)\n }\n\n // Rectangle (default)\n if (obj.width > 0 && obj.height > 0) {\n return this._createRectangle(obj)\n }\n\n return null\n }\n\n private _createTileObject(obj: TiledObject, tilesets: TileSetRenderer[]): Sprite | null {\n if (obj.gid === undefined) return null\n\n const decoded = decodeGid(obj.gid)\n if (!decoded) return null\n\n const ts = findRendererForGid(tilesets, decoded.gid)\n if (!ts) return null\n\n const localId = decoded.gid - ts.tileset.firstgid\n const texture = ts.getTexture(localId)\n if (!texture) return null\n\n const sprite = new Sprite(texture)\n const offset = ts.tileset.tileoffset\n // Tile objects are positioned by their bottom-left corner in Tiled,\n // then the tileset tileoffset is applied on top. If obj.width/height\n // are set, the tile is resized (fillmode applies to aspect-fit).\n const sized = this._fitTileSize(ts, localId, obj.width, obj.height)\n sprite.width = sized.width\n sprite.height = sized.height\n sprite.position.set(obj.x + offset.x, obj.y - sized.height + offset.y)\n sprite.angle = obj.rotation\n sprite.visible = obj.visible\n\n if (decoded.horizontalFlip) {\n sprite.scale.x *= -1\n sprite.anchor.x = 1\n }\n if (decoded.verticalFlip) {\n sprite.scale.y *= -1\n sprite.anchor.y = 1\n }\n\n return sprite\n }\n\n private _fitTileSize(\n ts: TileSetRenderer,\n localId: number,\n objWidth: number,\n objHeight: number\n ): { width: number; height: number } {\n if (objWidth <= 0 || objHeight <= 0) {\n return ts.getTileSize(localId)\n }\n if (ts.tileset.fillmode !== 'preserve-aspect-fit') {\n return { width: objWidth, height: objHeight }\n }\n const intrinsic = ts.getTileSize(localId)\n if (intrinsic.width === 0 || intrinsic.height === 0) {\n return { width: objWidth, height: objHeight }\n }\n const scale = Math.min(objWidth / intrinsic.width, objHeight / intrinsic.height)\n return { width: intrinsic.width * scale, height: intrinsic.height * scale }\n }\n\n private _createTextObject(obj: TiledObject): Container {\n const td = obj.text as TiledText\n const color = td.color ?? '#000000'\n const text = new Text({\n text: td.text,\n style: {\n fontFamily: td.fontfamily ?? 'sans-serif',\n fontSize: td.pixelsize ?? 16,\n fill: color,\n fontWeight: td.bold ? 'bold' : 'normal',\n fontStyle: td.italic ? 'italic' : 'normal',\n wordWrap: td.wrap ?? false,\n wordWrapWidth: obj.width,\n align: td.halign ?? 'left'\n }\n })\n\n // PixiJS Text has no built-in underline/strikeout — draw them manually.\n // Wrap in a Container only when decorations are present so simple text\n // stays a single Text node.\n if (!td.underline && !td.strikeout) {\n text.position.set(obj.x, obj.y)\n text.angle = obj.rotation\n text.visible = obj.visible\n return text\n }\n\n const container = new Container()\n container.addChild(text)\n\n const metrics = text.getSize()\n const lineThickness = Math.max(1, (td.pixelsize ?? 16) / 16)\n if (td.underline) {\n const ul = new Graphics()\n .moveTo(0, metrics.height - lineThickness)\n .lineTo(metrics.width, metrics.height - lineThickness)\n .stroke({ color, width: lineThickness })\n container.addChild(ul)\n }\n if (td.strikeout) {\n const y = metrics.height / 2\n const so = new Graphics()\n .moveTo(0, y)\n .lineTo(metrics.width, y)\n .stroke({ color, width: lineThickness })\n container.addChild(so)\n }\n\n container.position.set(obj.x, obj.y)\n container.angle = obj.rotation\n container.visible = obj.visible\n return container\n }\n\n private _createRectangle(obj: TiledObject): Container {\n const g = new Graphics().rect(0, 0, obj.width, obj.height).stroke({ color: 0xffffff, width: 1 })\n g.position.set(obj.x, obj.y)\n g.angle = obj.rotation\n g.visible = obj.visible\n return g\n }\n\n private _createEllipse(obj: TiledObject): Container {\n const rx = obj.width / 2\n const ry = obj.height / 2\n const g = new Graphics().ellipse(rx, ry, rx, ry).stroke({ color: 0xffffff, width: 1 })\n g.position.set(obj.x, obj.y)\n g.angle = obj.rotation\n g.visible = obj.visible\n return g\n }\n\n private _createPoint(obj: TiledObject): Container {\n const g = new Graphics().circle(0, 0, 3).fill(0xffffff)\n g.position.set(obj.x, obj.y)\n g.visible = obj.visible\n return g\n }\n\n private _createPolygon(obj: TiledObject, points: TiledPoint[], closed: boolean): Container {\n const g = new Graphics()\n\n if (points.length > 0) {\n const first = points[0]!\n g.moveTo(first.x, first.y)\n for (let i = 1; i < points.length; i++) {\n const pt = points[i]!\n g.lineTo(pt.x, pt.y)\n }\n if (closed) {\n g.closePath()\n }\n g.stroke({ color: 0xffffff, width: 1 })\n }\n\n g.position.set(obj.x, obj.y)\n g.angle = obj.rotation\n g.visible = obj.visible\n return g\n }\n}\n\nfunction findRendererForGid(tilesets: TileSetRenderer[], gid: number): TileSetRenderer | null {\n for (let i = tilesets.length - 1; i >= 0; i--) {\n const ts = tilesets[i]\n if (ts && ts.tileset.firstgid <= gid) return ts\n }\n return null\n}\n","import type { MapContext, TilePosition } from '../types'\n\nexport type { MapContext, TilePosition }\n\nexport function tileToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n switch (ctx.orientation) {\n case 'orthogonal':\n return orthogonalToPixel(col, row, ctx)\n case 'isometric':\n return isometricToPixel(col, row, ctx)\n case 'staggered':\n return staggeredToPixel(col, row, ctx)\n case 'hexagonal':\n return hexagonalToPixel(col, row, ctx)\n }\n}\n\n// ─── Orthogonal ──────────────────────────────────────────────────────────────\n\nfunction orthogonalToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n return {\n x: col * ctx.tilewidth,\n y: row * ctx.tileheight\n }\n}\n\n// ─── Isometric (diamond) ─────────────────────────────────────────────────────\n\nfunction isometricToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n const halfW = ctx.tilewidth / 2\n const halfH = ctx.tileheight / 2\n return {\n x: (col - row) * halfW,\n y: (col + row) * halfH\n }\n}\n\n// ─── Staggered (isometric staggered) ─────────────────────────────────────────\n\nfunction staggeredToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n const staggerX = ctx.staggeraxis === 'x'\n const staggerEven = ctx.staggerindex === 'even'\n\n if (staggerX) {\n const isStaggered = staggerEven ? col % 2 === 0 : col % 2 !== 0\n return {\n x: col * (ctx.tilewidth / 2),\n y: row * ctx.tileheight + (isStaggered ? ctx.tileheight / 2 : 0)\n }\n }\n\n // stagger Y (default)\n const isStaggered = staggerEven ? row % 2 === 0 : row % 2 !== 0\n return {\n x: col * ctx.tilewidth + (isStaggered ? ctx.tilewidth / 2 : 0),\n y: row * (ctx.tileheight / 2)\n }\n}\n\n// ─── Hexagonal ───────────────────────────────────────────────────────────────\n\nfunction hexagonalToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n const hexSide = ctx.hexsidelength ?? 0\n const staggerX = ctx.staggeraxis === 'x'\n const staggerEven = ctx.staggerindex === 'even'\n\n if (staggerX) {\n const colWidth = (ctx.tilewidth + hexSide) / 2\n const isStaggered = staggerEven ? col % 2 === 0 : col % 2 !== 0\n return {\n x: col * colWidth,\n y: row * ctx.tileheight + (isStaggered ? ctx.tileheight / 2 : 0)\n }\n }\n\n // stagger Y (default for hex)\n const rowHeight = (ctx.tileheight + hexSide) / 2\n const isStaggered = staggerEven ? row % 2 === 0 : row % 2 !== 0\n return {\n x: col * ctx.tilewidth + (isStaggered ? ctx.tilewidth / 2 : 0),\n y: row * rowHeight\n }\n}\n","import { AnimatedSprite, Container, Sprite, type Texture } from 'pixi.js'\nimport type {\n ResolvedChunk,\n ResolvedTile,\n ResolvedTileLayer,\n TiledFrame,\n TiledRenderOrder\n} from '../types'\nimport { parseTintColor } from './parseColor.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\nimport { type MapContext, tileToPixel } from './tilePlacement.js'\n\nexport class TileLayerRenderer extends Container {\n readonly layerData: ResolvedTileLayer\n readonly layerBaseOffsetX: number\n readonly layerBaseOffsetY: number\n readonly layerParallaxX: number\n readonly layerParallaxY: number\n\n constructor(layerData: ResolvedTileLayer, tilesets: TileSetRenderer[], ctx: MapContext) {\n super()\n\n this.layerData = layerData\n this.label = layerData.name\n this.alpha = layerData.opacity\n this.visible = layerData.visible\n this.layerBaseOffsetX = layerData.offsetx\n this.layerBaseOffsetY = layerData.offsety\n this.layerParallaxX = layerData.parallaxx\n this.layerParallaxY = layerData.parallaxy\n this.position.set(layerData.offsetx, layerData.offsety)\n if (layerData.tintcolor) {\n this.tint = parseTintColor(layerData.tintcolor)\n }\n\n if (layerData.infinite && layerData.chunks) {\n this._buildChunks(layerData.chunks, tilesets, ctx)\n } else {\n this._buildTiles(\n layerData.tiles,\n layerData.width,\n Math.floor(layerData.tiles.length / (layerData.width || 1)),\n 0,\n 0,\n tilesets,\n ctx\n )\n }\n }\n\n private _buildChunks(\n chunks: ResolvedChunk[],\n tilesets: TileSetRenderer[],\n ctx: MapContext\n ): void {\n for (const chunk of chunks) {\n this._buildTiles(chunk.tiles, chunk.width, chunk.height, chunk.x, chunk.y, tilesets, ctx)\n }\n }\n\n private _buildTiles(\n tiles: (ResolvedTile | null)[],\n layerWidth: number,\n layerHeight: number,\n originCol: number,\n originRow: number,\n tilesets: TileSetRenderer[],\n ctx: MapContext\n ): void {\n const order = ctx.renderorder\n\n for (const [col, row] of iterateTiles(layerWidth, layerHeight, order)) {\n const i = row * layerWidth + col\n const tile = tiles[i]\n if (!tile) continue\n\n const tsRenderer = tilesets[tile.tilesetIndex]\n if (!tsRenderer) continue\n\n const pos = tileToPixel(originCol + col, originRow + row, ctx)\n const animFrames = tsRenderer.getAnimationFrames(tile.localId)\n\n const offset = tsRenderer.tileset.tileoffset\n\n if (animFrames && animFrames.length > 1) {\n const sprite = this._createAnimatedTile(tsRenderer, animFrames, tile, pos.x, pos.y, ctx)\n if (sprite) {\n sprite.position.x += offset.x\n sprite.position.y += offset.y\n this.addChild(sprite)\n }\n } else {\n const texture = tsRenderer.getTexture(tile.localId)\n if (!texture) continue\n\n const sprite = new Sprite(texture)\n // Tiled draws tiles bottom-left aligned to the grid cell, so tiles\n // taller than the map's tileheight extend upward rather than below.\n // We read the tile size from tileset metadata (not texture.height)\n // because textures may still be loading at construction time — a\n // zero-height texture would otherwise shift the sprite one full row.\n const renderSize = tsRenderer.getRenderSize(tile.localId, ctx)\n sprite.width = renderSize.width\n sprite.height = renderSize.height\n sprite.position.set(pos.x + offset.x, pos.y + offset.y + ctx.tileheight - renderSize.height)\n applyFlip(sprite, tile, renderSize.width)\n this.addChild(sprite)\n }\n }\n }\n\n private _createAnimatedTile(\n tsRenderer: TileSetRenderer,\n frames: TiledFrame[],\n tile: ResolvedTile,\n x: number,\n y: number,\n ctx: MapContext\n ): AnimatedSprite | null {\n const textures: { texture: Texture; time: number }[] = []\n\n for (const frame of frames) {\n const tex = tsRenderer.getTexture(frame.tileid)\n if (!tex) return null\n textures.push({ texture: tex, time: frame.duration })\n }\n\n const sprite = new AnimatedSprite(textures)\n // Bottom-left align to the grid cell (see _buildTiles for rationale).\n const renderSize = tsRenderer.getRenderSize(tile.localId, ctx)\n sprite.width = renderSize.width\n sprite.height = renderSize.height\n sprite.position.set(x, y + ctx.tileheight - renderSize.height)\n sprite.play()\n applyFlip(sprite, tile, renderSize.width)\n return sprite\n }\n}\n\nfunction* iterateTiles(\n width: number,\n height: number,\n order: TiledRenderOrder\n): Generator<[number, number]> {\n const rightToLeft = order === 'left-down' || order === 'left-up'\n const bottomToTop = order === 'right-up' || order === 'left-up'\n\n const rowStart = bottomToTop ? height - 1 : 0\n const rowEnd = bottomToTop ? -1 : height\n const rowStep = bottomToTop ? -1 : 1\n\n const colStart = rightToLeft ? width - 1 : 0\n const colEnd = rightToLeft ? -1 : width\n const colStep = rightToLeft ? -1 : 1\n\n for (let row = rowStart; row !== rowEnd; row += rowStep) {\n for (let col = colStart; col !== colEnd; col += colStep) {\n yield [col, row]\n }\n }\n}\n\nfunction applyFlip(sprite: Sprite, tile: ResolvedTile, tileWidth: number): void {\n if (tile.diagonalFlip) {\n sprite.rotation = Math.PI / 2\n sprite.scale.x = tile.horizontalFlip ? -1 : 1\n sprite.scale.y = tile.verticalFlip ? -1 : 1\n sprite.anchor.set(0, 1)\n sprite.position.x += tileWidth\n } else {\n if (tile.horizontalFlip) {\n sprite.scale.x = -1\n sprite.anchor.x = 1\n }\n if (tile.verticalFlip) {\n sprite.scale.y = -1\n sprite.anchor.y = 1\n }\n }\n}\n","import type { Container, Texture } from 'pixi.js'\nimport type { ResolvedLayer } from '../types'\nimport { GroupLayerRenderer } from './GroupLayerRenderer.js'\nimport { ImageLayerRenderer } from './ImageLayerRenderer.js'\nimport { ObjectLayerRenderer } from './ObjectLayerRenderer.js'\nimport { TileLayerRenderer } from './TileLayerRenderer.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\nimport type { MapContext } from './tilePlacement.js'\n\nexport function createLayerRenderer(\n layer: ResolvedLayer,\n tilesets: TileSetRenderer[],\n ctx: MapContext,\n imageTextures: Map<string, Texture>\n): Container | null {\n switch (layer.type) {\n case 'tilelayer':\n return new TileLayerRenderer(layer, tilesets, ctx)\n\n case 'imagelayer': {\n const tex = layer.image ? (imageTextures.get(layer.image) ?? null) : null\n return new ImageLayerRenderer(layer, tex, ctx)\n }\n\n case 'objectgroup':\n return new ObjectLayerRenderer(layer, tilesets)\n\n case 'group':\n return new GroupLayerRenderer(layer, tilesets, ctx, imageTextures)\n }\n}\n","import type { ResolvedMap } from '../types'\n\nexport function computeMapPixelSize(mapData: ResolvedMap): { width: number; height: number } {\n const { orientation, width, height, tilewidth, tileheight, staggeraxis } = mapData\n\n switch (orientation) {\n case 'isometric':\n return {\n width: (width + height) * (tilewidth / 2),\n height: (width + height) * (tileheight / 2)\n }\n case 'staggered':\n case 'hexagonal':\n return staggeraxis === 'x'\n ? {\n width: (width + 1) * (tilewidth / 2),\n height: height * tileheight + tileheight / 2\n }\n : {\n width: width * tilewidth + tilewidth / 2,\n height: (height + 1) * (tileheight / 2)\n }\n default:\n return { width: width * tilewidth, height: height * tileheight }\n }\n}\n","import { Rectangle, Texture } from 'pixi.js'\nimport type { ResolvedTileset, TiledTileDefinition } from '../types'\nimport type { MapContext } from './tilePlacement.js'\n\nexport class TileSetRenderer {\n readonly tileset: ResolvedTileset\n readonly baseTexture: Texture | null\n private readonly _ownedTextures = new Map<number, Texture>()\n private readonly _externalTextures = new Map<number, Texture>()\n\n constructor(tileset: ResolvedTileset, baseTexture: Texture | null) {\n this.tileset = tileset\n this.baseTexture = baseTexture\n }\n\n getTexture(localId: number): Texture | null {\n const external = this._externalTextures.get(localId)\n if (external) return external\n\n const owned = this._ownedTextures.get(localId)\n if (owned) return owned\n\n const tileDef = this.tileset.tiles.get(localId)\n\n // Image-collection tile with no externally supplied texture yet.\n if (tileDef?.image) return null\n\n // Single-image tileset: cut sub-rectangle from baseTexture\n if (!this.baseTexture) return null\n\n const { tilewidth, tileheight, columns, margin, spacing } = this.tileset\n if (columns <= 0) return null\n\n const col = localId % columns\n const row = Math.floor(localId / columns)\n const x = margin + col * (tilewidth + spacing)\n const y = margin + row * (tileheight + spacing)\n\n const frame = new Rectangle(x, y, tilewidth, tileheight)\n const texture = new Texture({ source: this.baseTexture.source, frame })\n\n this._ownedTextures.set(localId, texture)\n return texture\n }\n\n setTileTexture(localId: number, texture: Texture): void {\n this._externalTextures.set(localId, texture)\n }\n\n getAnimationFrames(localId: number): TiledTileDefinition['animation'] | undefined {\n return this.tileset.tiles.get(localId)?.animation\n }\n\n /**\n * Returns the intrinsic pixel size of a tile based on tileset metadata.\n * For image-collection tilesets, each tile has its own image dimensions.\n * For regular tilesets, all tiles share the tileset's tilewidth/tileheight.\n *\n * This does not read from the pixi Texture, so it is safe to call before\n * textures have finished loading.\n */\n getTileSize(localId: number): { width: number; height: number } {\n const tileDef = this.tileset.tiles.get(localId)\n if (tileDef?.image) {\n return {\n width: tileDef.imagewidth ?? this.tileset.tilewidth,\n height: tileDef.imageheight ?? this.tileset.tileheight\n }\n }\n return { width: this.tileset.tilewidth, height: this.tileset.tileheight }\n }\n\n /**\n * Returns the pixel size a tile should be drawn at on the map grid.\n * When `tilerendersize === 'grid'`, the tile is resized to the map cell\n * size, honouring `fillmode` for non-stretch aspect handling.\n * Otherwise the tile's intrinsic size is used.\n */\n getRenderSize(localId: number, ctx: MapContext): { width: number; height: number } {\n const intrinsic = this.getTileSize(localId)\n if (this.tileset.tilerendersize !== 'grid') return intrinsic\n\n const gridW = ctx.tilewidth\n const gridH = ctx.tileheight\n\n if (this.tileset.fillmode === 'preserve-aspect-fit') {\n if (intrinsic.width === 0 || intrinsic.height === 0) {\n return { width: gridW, height: gridH }\n }\n const scale = Math.min(gridW / intrinsic.width, gridH / intrinsic.height)\n return { width: intrinsic.width * scale, height: intrinsic.height * scale }\n }\n\n return { width: gridW, height: gridH }\n }\n\n destroy(): void {\n for (const tex of this._ownedTextures.values()) {\n tex.destroy()\n }\n this._ownedTextures.clear()\n this._externalTextures.clear()\n }\n}\n","import { Container, Graphics, Rectangle } from 'pixi.js'\nimport type { MapContext, ResolvedMap, TiledMapOptions } from '../types'\nimport { createLayerRenderer } from './createLayerRenderer.js'\nimport { GroupLayerRenderer } from './GroupLayerRenderer.js'\nimport { ImageLayerRenderer } from './ImageLayerRenderer.js'\nimport { computeMapPixelSize } from './mapSize.js'\nimport { ObjectLayerRenderer } from './ObjectLayerRenderer.js'\nimport { parseTintColor } from './parseColor.js'\nimport { TileLayerRenderer } from './TileLayerRenderer.js'\nimport { TileSetRenderer } from './TileSetRenderer.js'\n\ntype ParallaxLayer =\n | TileLayerRenderer\n | ImageLayerRenderer\n | ObjectLayerRenderer\n | GroupLayerRenderer\n\nfunction isParallaxLayer(c: Container): c is ParallaxLayer {\n return (\n c instanceof TileLayerRenderer ||\n c instanceof ImageLayerRenderer ||\n c instanceof ObjectLayerRenderer ||\n c instanceof GroupLayerRenderer\n )\n}\n\nexport class TiledMap extends Container {\n readonly mapData: ResolvedMap\n readonly tileSetRenderers: TileSetRenderer[]\n\n private _background: Graphics | null = null\n\n constructor(mapData: ResolvedMap, options?: TiledMapOptions) {\n super()\n\n this.mapData = mapData\n this.label = 'TiledMap'\n\n const pixelSize = computeMapPixelSize(mapData)\n\n // Force local bounds to the logical map size. Without this, pixi's\n // .width/.height setters (and getLocalBounds) would use the extent of\n // the rendered children — which misbehaves when the map has empty\n // top/left rows (bounds.minY > 0, causing content to overflow the\n // canvas when scaling via `.height = ...`) or when tall decoration\n // tiles extend beyond the grid.\n this.boundsArea = new Rectangle(0, 0, pixelSize.width, pixelSize.height)\n\n // Build tileset renderers\n const tilesetTextures = options?.tilesetTextures ?? new Map()\n const imageLayerTextures = options?.imageLayerTextures ?? new Map()\n const tileImageTextures = options?.tileImageTextures ?? new Map()\n\n this.tileSetRenderers = mapData.tilesets.map((ts) => {\n const baseTex = ts.image ? (tilesetTextures.get(ts.image) ?? null) : null\n const renderer = new TileSetRenderer(ts, baseTex)\n\n // Supply individual tile images for image-collection tilesets\n for (const [localId, tileDef] of ts.tiles) {\n if (tileDef.image) {\n const tex = tileImageTextures.get(tileDef.image)\n if (tex) renderer.setTileTexture(localId, tex)\n }\n }\n\n return renderer\n })\n\n // Build map context for orientation-aware tile placement\n const ctx: MapContext = {\n orientation: mapData.orientation,\n renderorder: mapData.renderorder,\n tilewidth: mapData.tilewidth,\n tileheight: mapData.tileheight,\n hexsidelength: mapData.hexsidelength,\n staggeraxis: mapData.staggeraxis,\n staggerindex: mapData.staggerindex,\n mapPixelWidth: pixelSize.width,\n mapPixelHeight: pixelSize.height\n }\n\n // Render background\n if (mapData.backgroundcolor) {\n this._buildBackground(pixelSize.width, pixelSize.height, mapData.backgroundcolor)\n }\n\n // Render layers\n for (const layer of mapData.layers) {\n const child = createLayerRenderer(layer, this.tileSetRenderers, ctx, imageLayerTextures)\n if (child) this.addChild(child)\n }\n }\n\n get orientation() {\n return this.mapData.orientation\n }\n get mapWidth() {\n return this.mapData.width\n }\n get mapHeight() {\n return this.mapData.height\n }\n get tileWidth() {\n return this.mapData.tilewidth\n }\n get tileHeight() {\n return this.mapData.tileheight\n }\n\n getLayer(name: string): Container | undefined {\n return this.children.find((c) => c.label === name) as Container | undefined\n }\n\n /**\n * Reposition layers to reflect the camera's current position through the\n * map's parallax factors. Call after moving the camera.\n *\n * Effective layer screen position (after your camera transform) is:\n * base_offset - parallax_origin * (1 - parallax) - camera * parallax\n *\n * so a layer with parallax 1 moves normally with the camera and a layer\n * with parallax 0 is pinned in screen space. Nested group layers compose\n * parallax multiplicatively per the Tiled spec.\n */\n applyParallax(cameraX: number, cameraY: number): void {\n const ox = this.mapData.parallaxoriginx\n const oy = this.mapData.parallaxoriginy\n for (const child of this.children) {\n if (isParallaxLayer(child)) {\n applyParallaxRecursive(child, cameraX, cameraY, ox, oy, 1, 1)\n }\n }\n }\n\n private _buildBackground(pixelWidth: number, pixelHeight: number, colorHex: string): void {\n const color = parseTintColor(colorHex)\n this._background = new Graphics().rect(0, 0, pixelWidth, pixelHeight).fill(color)\n this._background.label = 'background'\n this.addChild(this._background)\n }\n\n override destroy(options?: Parameters<Container['destroy']>[0]): void {\n for (const ts of this.tileSetRenderers) {\n ts.destroy()\n }\n super.destroy(options)\n }\n}\n\nfunction applyParallaxRecursive(\n layer: ParallaxLayer,\n cameraX: number,\n cameraY: number,\n originX: number,\n originY: number,\n parentParallaxX: number,\n parentParallaxY: number\n): void {\n const px = layer.layerParallaxX * parentParallaxX\n const py = layer.layerParallaxY * parentParallaxY\n\n layer.position.set(\n layer.layerBaseOffsetX + (cameraX - originX) * (1 - px),\n layer.layerBaseOffsetY + (cameraY - originY) * (1 - py)\n )\n\n if (layer instanceof GroupLayerRenderer) {\n for (const child of layer.children) {\n if (isParallaxLayer(child)) {\n applyParallaxRecursive(child, cameraX, cameraY, originX, originY, px, py)\n }\n }\n }\n}\n","import { Assets, ExtensionType, type LoaderParser, path as pixiPath, type Texture } from 'pixi.js'\nimport { parseMapAsync, parseTmx, parseTsx, parseTx } from '../parser'\nimport { isTilesetRef } from '../parser/tilesetHelpers.js'\nimport type {\n TiledLayer,\n TiledMapAsset,\n TiledMap as TiledMapData,\n TiledObject,\n TiledObjectTemplate,\n TiledTileset\n} from '../types'\nimport { TiledMap } from './TiledMap.js'\n\nexport const tiledMapLoader: LoaderParser<TiledMapAsset> = {\n extension: {\n type: ExtensionType.LoadParser,\n name: 'tiledmap-loader'\n },\n\n id: 'tiledmap-loader',\n name: 'tiledmap-loader',\n\n test(url: string): boolean {\n const ext = pixiPath.extname(url).toLowerCase()\n return ext === '.tmx' || ext === '.tmj'\n },\n\n async load(url: string): Promise<TiledMapAsset> {\n const ext = pixiPath.extname(url).toLowerCase()\n const response = await fetch(url)\n\n let data: TiledMapData\n if (ext === '.tmx') {\n const xml = await response.text()\n data = parseTmx(xml)\n } else {\n data = (await response.json()) as TiledMapData\n }\n\n const basePath = pixiPath.dirname(url)\n\n // Resolve external tilesets\n const externalTilesets = new Map<string, TiledTileset>()\n for (const ts of data.tilesets) {\n if (!isTilesetRef(ts)) continue\n const tsUrl = pixiPath.join(basePath, ts.source)\n const tsResponse = await fetch(tsUrl)\n const tsExt = pixiPath.extname(ts.source).toLowerCase()\n let tsData: TiledTileset\n if (tsExt === '.tsx') {\n const tsXml = await tsResponse.text()\n tsData = parseTsx(tsXml)\n } else {\n tsData = (await tsResponse.json()) as TiledTileset\n }\n externalTilesets.set(ts.source, tsData)\n }\n\n // Resolve object templates — walk every object layer (including nested\n // group layers) to find unique template references, then fetch each one\n // in parallel. Templates may be either .tx (XML) or .tj (JSON).\n const templates = new Map<string, TiledObjectTemplate>()\n const templateSources = new Set<string>()\n for (const obj of walkObjects(data.layers)) {\n if (obj.template) templateSources.add(obj.template)\n }\n await Promise.all(\n Array.from(templateSources).map(async (src) => {\n const tplUrl = pixiPath.join(basePath, src)\n const tplResponse = await fetch(tplUrl)\n const tplExt = pixiPath.extname(src).toLowerCase()\n let tpl: TiledObjectTemplate\n if (tplExt === '.tx') {\n const tplXml = await tplResponse.text()\n tpl = parseTx(tplXml)\n } else {\n tpl = (await tplResponse.json()) as TiledObjectTemplate\n }\n templates.set(src, tpl)\n })\n )\n\n // Parse the map to resolved IR\n const mapData = await parseMapAsync(data, { externalTilesets, templates })\n\n // Load tileset textures\n const tilesetTextures = new Map<string, Texture>()\n const imageLayerTextures = new Map<string, Texture>()\n const tileImageTextures = new Map<string, Texture>()\n\n const textureLoads: Promise<void>[] = []\n\n for (const ts of mapData.tilesets) {\n if (ts.image) {\n const imageUrl = pixiPath.join(basePath, ts.image)\n textureLoads.push(\n Assets.load<Texture>(imageUrl).then((tex) => {\n tilesetTextures.set(ts.image!, tex)\n })\n )\n }\n\n // Image-collection tilesets: each tile has its own image\n for (const [_localId, tileDef] of ts.tiles) {\n if (tileDef.image) {\n const tileImgUrl = pixiPath.join(basePath, tileDef.image)\n textureLoads.push(\n Assets.load<Texture>(tileImgUrl).then((tex) => {\n tileImageTextures.set(tileDef.image!, tex)\n })\n )\n }\n }\n }\n\n // Load image layer textures\n for (const layer of flattenLayers(mapData.layers)) {\n if (layer.type === 'imagelayer' && layer.image) {\n const imgUrl = pixiPath.join(basePath, layer.image)\n textureLoads.push(\n Assets.load<Texture>(imgUrl).then((tex) => {\n imageLayerTextures.set(layer.image, tex)\n })\n )\n }\n }\n\n await Promise.all(textureLoads)\n\n // Build the display tree\n const container = new TiledMap(mapData, {\n tilesetTextures,\n imageLayerTextures,\n tileImageTextures\n })\n\n return { mapData, container }\n }\n}\n\nfunction flattenLayers<L extends { type: string; layers?: L[] }>(layers: L[]): L[] {\n const result: L[] = []\n for (const layer of layers) {\n result.push(layer)\n if (layer.type === 'group' && layer.layers) {\n result.push(...flattenLayers(layer.layers))\n }\n }\n return result\n}\n\nfunction* walkObjects(layers: TiledLayer[]): Generator<TiledObject> {\n for (const layer of flattenLayers(layers)) {\n if (layer.type === 'objectgroup' && layer.objects) {\n for (const obj of layer.objects) yield obj\n }\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixi-tiledmap",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "Tiled Map Editor loader and renderer for PixiJS v8",
5
5
  "keywords": [
6
6
  "pixi",