kaplay-plugin-tiled 1.1.0 → 1.1.2

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.
package/README.md CHANGED
@@ -57,9 +57,9 @@ k.onLoad(() => {
57
57
  objects: [
58
58
  {
59
59
  match: { properties: { collides: true } },
60
- comps: ({ objectSize }) => [
60
+ comps: ({ width, height }) => [
61
61
  k.area({
62
- shape: new k.Rect(k.vec2(), objectSize.width, objectSize.height),
62
+ shape: new k.Rect(k.vec2(), width, height),
63
63
  }),
64
64
  k.body({ isStatic: true }),
65
65
  ],
package/dist/plugin.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=2147483648,t=1073741824,n=536870912,r=t|-1610612736;function i(e,t){if(typeof t!=`string`)return t;let n=e.getAsset(t);if(!n)throw Error(`Tiled map asset "${t}" is not loaded.`);if(!n.data)throw Error(`Tiled map asset "${t}" is not ready yet.`);return n.data}function a(e){let t={};return e?.forEach(e=>{t[e.name]=e.value}),t}function o(e){return e.type===`objectgroup`}function s(e){return e.type===`tilelayer`}function c(e){return{data:e.data,height:e.height,name:e.name,opacity:e.opacity??1,type:`tilelayer`,visible:e.visible??!0,width:e.width,x:e.x??0,y:e.y??0,zIndex:0}}function l(e){return{name:e.name,objects:e.objects,type:`objectgroup`,visible:e.visible??!0,zIndex:0}}function u(i){return i===0?null:{gid:(i&~r)>>>0,flip:{diagonal:(i&n)!==0,horizontal:(i&e)!==0,vertical:(i&t)!==0}}}function d(e){return e.diagonal?e.horizontal&&e.vertical?{angle:270,flipX:!0,flipY:!1}:e.horizontal?{angle:270,flipX:!1,flipY:!1}:e.vertical?{angle:90,flipX:!1,flipY:!1}:{angle:270,flipX:!1,flipY:!0}:{angle:0,flipX:e.horizontal,flipY:e.vertical}}function f(e,t,n){let r=n-t.tileset.firstGid,i=r%t.tileset.columns,a=Math.floor(r/t.tileset.columns),o=t.tileset.margin+i*(t.tileset.tileWidth+t.tileset.spacing),s=t.tileset.margin+a*(t.tileset.tileHeight+t.tileset.spacing);return e.quad(o/t.tileset.imageWidth,s/t.tileset.imageHeight,t.tileset.tileWidth/t.tileset.imageWidth,t.tileset.tileHeight/t.tileset.imageHeight)}function p(e){return e.layerNames?.length?new Set(e.layerNames):null}function m(e,t){return e.tileset.tiles[t]}function h(e,t){return e?Object.entries(e).every(([e,n])=>t[e]===n):!0}function g(e,t){return e.gid!==void 0&&e.gid!==t.gid||e.tileId!==void 0&&e.tileId!==t.tileId||e.layer!==void 0&&e.layer!==t.layer?!1:h(e.properties,t.properties)}function _(e,t){return e.layer!==void 0&&e.layer!==t.layer||e.name!==void 0&&e.name!==t.name||e.type!==void 0&&e.type!==t.type?!1:h(e.properties,t.properties)}function v(e,t,n,r){return e.add([e.pos(0,0),e.z(t.zIndex),{draw:()=>{t.data.forEach((i,a)=>{let o=u(i);if(!o)return;let s=a%t.width,c=Math.floor(a/t.width),l=d(o.flip);e.drawSprite({anchor:`center`,angle:l.angle,flipX:l.flipX,flipY:l.flipY,opacity:t.opacity,pos:e.vec2((s+t.x)*n.tileWidth+n.tileset.tileWidth/2,(c+t.y)*n.tileHeight+n.tileset.tileHeight/2),quad:f(e,n,o.gid),sprite:r})})},id:`tiled-layer`}])}function y(e,t,n,r){let i=r.tiles;if(!i?.length)return[];let a=[];return t.data.forEach((r,o)=>{let s=u(r);if(!s)return;let c=m(n,s.gid),l=o%t.width,d=Math.floor(o/t.width),f={flip:s.flip,gid:s.gid,layer:t.name,pos:{x:(l+t.x)*n.tileWidth,y:(d+t.y)*n.tileHeight},properties:c?.properties??{},tileSize:{height:n.tileHeight,width:n.tileWidth},tileId:c?.tileId??s.gid-n.tileset.firstGid,tilePos:{x:l+t.x,y:d+t.y}};i.forEach(n=>{g(n.match,f)&&a.push(e.add([e.pos(f.pos.x,f.pos.y),e.anchor(`topleft`),e.z(t.zIndex),...n.comps(f)]))})}),a}function b(e,t,n){let r=n.objects;if(!r?.length)return[];let i=[];return t.visible&&t.objects.forEach(n=>{if(!n.visible)return;let o={id:n.id,layer:t.name,name:n.name,objectSize:{height:n.height,width:n.width},point:n.point??!1,pos:{x:n.x,y:n.y},properties:a(n.properties),rotation:n.rotation,type:n.type};r.forEach(n=>{_(n.match,o)&&i.push(e.add([e.pos(o.pos.x,o.pos.y),e.anchor(`topleft`),e.z(t.zIndex),...n.comps(o)]))})}),i}function x(e){if(e.orientation!==`orthogonal`)throw Error(`Unsupported Tiled orientation "${e.orientation}". Expected "orthogonal".`);if(e.infinite)throw Error(`Infinite Tiled maps are not supported.`);if(e.tilesets.length!==1)throw Error(`Exactly one Tiled tileset is required.`);let[t]=e.tilesets;if(t.columns<=0)throw Error(`Tiled tileset columns must be greater than 0.`);let n=e.layers.map((e,t)=>{if(s(e)){if(e.data.length!==e.width*e.height)throw Error(`Layer "${e.name}" data length does not match its dimensions.`);return{...c(e),zIndex:t}}if(o(e))return{...l(e),zIndex:t};throw Error(`Unsupported Tiled layer type.`)});return{height:e.height,layers:n,orientation:`orthogonal`,tileHeight:e.tileheight,tileWidth:e.tilewidth,tileset:{columns:t.columns,firstGid:t.firstgid,image:t.image,imageHeight:t.imageheight,imageWidth:t.imagewidth,lastGid:t.firstgid+t.tilecount-1,margin:t.margin??0,name:t.name,spacing:t.spacing??0,tileCount:t.tilecount,tileHeight:t.tileheight,tiles:Object.fromEntries((t.tiles??[]).map(e=>[e.id+t.firstgid,{gid:e.id+t.firstgid,properties:a(e.properties),tileId:e.id}])),tileWidth:t.tilewidth},width:e.width}}function S(e,t,n){let r=x(i(e,t)),a=p(n);r.layers.forEach(t=>{if(t.visible&&!(a&&!a.has(t.name))){if(t.type===`tilelayer`){t.data.forEach(e=>{let t=u(e);if(t&&(t.gid<r.tileset.firstGid||t.gid>r.tileset.lastGid))throw Error(`Tile gid ${String(e)} is outside the supported tileset range.`)}),v(e,t,r,n.sprite),y(e,t,r,n);return}b(e,t,n)}})}function C(e){return{addTiledMap(t,n){S(e,t,n)}}}exports.tiledPlugin=C;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=2147483648,t=1073741824,n=536870912,r=t|-1610612736;function i(e,t){if(typeof t!=`string`)return t;let n=e.getAsset(t);if(!n)throw Error(`Tiled map asset "${t}" is not loaded.`);if(!n.data)throw Error(`Tiled map asset "${t}" is not ready yet.`);return n.data}function a(e){let t={};return e?.forEach(e=>{t[e.name]=e.value}),t}function o(e){return e.type===`objectgroup`}function s(e){return e.type===`tilelayer`}function c(e){return{data:e.data,height:e.height,name:e.name,opacity:e.opacity??1,type:`tilelayer`,visible:e.visible??!0,width:e.width,x:e.x??0,y:e.y??0,zIndex:0}}function l(e){return{name:e.name,objects:e.objects,type:`objectgroup`,visible:e.visible??!0,zIndex:0}}function u(i){return i===0?null:{gid:(i&~r)>>>0,flip:{diagonal:(i&n)!==0,horizontal:(i&e)!==0,vertical:(i&t)!==0}}}function d(e){return e.diagonal?e.horizontal&&e.vertical?{angle:270,flipX:!0,flipY:!1}:e.horizontal?{angle:270,flipX:!1,flipY:!1}:e.vertical?{angle:90,flipX:!1,flipY:!1}:{angle:270,flipX:!1,flipY:!0}:{angle:0,flipX:e.horizontal,flipY:e.vertical}}function f(e,t,n){let r=n-t.tileset.firstGid,i=r%t.tileset.columns,a=Math.floor(r/t.tileset.columns),o=t.tileset.margin+i*(t.tileset.tileWidth+t.tileset.spacing),s=t.tileset.margin+a*(t.tileset.tileHeight+t.tileset.spacing);return e.quad(o/t.tileset.imageWidth,s/t.tileset.imageHeight,t.tileset.tileWidth/t.tileset.imageWidth,t.tileset.tileHeight/t.tileset.imageHeight)}function p(e){return e.layerNames?.length?new Set(e.layerNames):null}function m(e,t){return e.tileset.tiles[t]}function h(e,t){return e?Object.entries(e).every(([e,n])=>t[e]===n):!0}function g(e,t){return e.gid!==void 0&&e.gid!==t.gid||e.tileId!==void 0&&e.tileId!==t.tileId||e.layer!==void 0&&e.layer!==t.layer?!1:h(e.properties,t.properties)}function _(e,t){return e.layer!==void 0&&e.layer!==t.layer||e.name!==void 0&&e.name!==t.name||e.type!==void 0&&e.type!==t.type?!1:h(e.properties,t.properties)}function v(e,t,n,r){return e.add([e.pos(0,0),e.z(t.zIndex),{draw:()=>{t.data.forEach((i,a)=>{let o=u(i);if(!o)return;let s=a%t.width,c=Math.floor(a/t.width),l=d(o.flip);e.drawSprite({anchor:`center`,angle:l.angle,flipX:l.flipX,flipY:l.flipY,opacity:t.opacity,pos:e.vec2((s+t.x)*n.tileWidth+n.tileset.tileWidth/2,(c+t.y)*n.tileHeight+n.tileset.tileHeight/2),quad:f(e,n,o.gid),sprite:r})})},id:`tiled-layer`}])}function y(e,t,n,r){let i=r.tiles;if(!i?.length)return[];let a=[];return t.data.forEach((r,o)=>{let s=u(r);if(!s)return;let c=m(n,s.gid),l=o%t.width,d=Math.floor(o/t.width),f={flip:s.flip,gid:s.gid,height:n.tileHeight,layer:t.name,tileHeight:n.tileHeight,tileWidth:n.tileWidth,tileX:l+t.x,tileY:d+t.y,width:n.tileWidth,x:(l+t.x)*n.tileWidth,y:(d+t.y)*n.tileHeight,properties:c?.properties??{},tileId:c?.tileId??s.gid-n.tileset.firstGid};i.forEach(n=>{g(n.match,f)&&a.push(e.add([e.pos(f.x,f.y),e.anchor(`topleft`),e.z(t.zIndex),...n.comps(f)]))})}),a}function b(e,t,n){let r=n.objects;if(!r?.length)return[];let i=[];return t.visible&&t.objects.forEach(n=>{if(!n.visible)return;let o={height:n.height,id:n.id,layer:t.name,name:n.name,width:n.width,x:n.x,y:n.y,point:n.point??!1,properties:a(n.properties),rotation:n.rotation,type:n.type};r.forEach(n=>{_(n.match,o)&&i.push(e.add([e.pos(o.x,o.y),e.anchor(`topleft`),e.z(t.zIndex),...n.comps(o)]))})}),i}function x(e){if(e.orientation!==`orthogonal`)throw Error(`Unsupported Tiled orientation "${e.orientation}". Expected "orthogonal".`);if(e.infinite)throw Error(`Infinite Tiled maps are not supported.`);if(e.tilesets.length!==1)throw Error(`Exactly one Tiled tileset is required.`);let[t]=e.tilesets;if(t.columns<=0)throw Error(`Tiled tileset columns must be greater than 0.`);let n=e.layers.map((e,t)=>{if(s(e)){if(e.data.length!==e.width*e.height)throw Error(`Layer "${e.name}" data length does not match its dimensions.`);return{...c(e),zIndex:t}}if(o(e))return{...l(e),zIndex:t};throw Error(`Unsupported Tiled layer type.`)});return{height:e.height,layers:n,orientation:`orthogonal`,tileHeight:e.tileheight,tileWidth:e.tilewidth,tileset:{columns:t.columns,firstGid:t.firstgid,image:t.image,imageHeight:t.imageheight,imageWidth:t.imagewidth,lastGid:t.firstgid+t.tilecount-1,margin:t.margin??0,name:t.name,spacing:t.spacing??0,tileCount:t.tilecount,tileHeight:t.tileheight,tiles:Object.fromEntries((t.tiles??[]).map(e=>[e.id+t.firstgid,{gid:e.id+t.firstgid,properties:a(e.properties),tileId:e.id}])),tileWidth:t.tilewidth},width:e.width}}function S(e,t,n){let r=x(i(e,t)),a=p(n);r.layers.forEach(t=>{if(t.visible&&!(a&&!a.has(t.name))){if(t.type===`tilelayer`){t.data.forEach(e=>{let t=u(e);if(t&&(t.gid<r.tileset.firstGid||t.gid>r.tileset.lastGid))throw Error(`Tile gid ${String(e)} is outside the supported tileset range.`)}),v(e,t,r,n.sprite),y(e,t,r,n);return}b(e,t,n)}})}function C(e){return{addTiledMap:(t,n)=>{S(e,t,n)}}}exports.tiledPlugin=C;
2
2
  //# sourceMappingURL=plugin.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs","names":[],"sources":["../src/utils.ts","../src/plugin.ts"],"sourcesContent":["import type { CompList, GameObj, KAPLAYCtx, Quad } from 'kaplay';\n\nimport type {\n ParsedTiledLayer,\n ParsedTiledMap,\n ParsedTiledObjectLayer,\n ParsedTiledTile,\n ParsedTiledTileLayer,\n TiledLayer,\n TiledLayerComp,\n TiledMap,\n TiledMapData,\n TiledMapOpt,\n TiledObjectContext,\n TiledObjectLayer,\n TiledObjectMatch,\n TiledProperty,\n TiledPropertyValue,\n TiledTileContext,\n TiledTileLayer,\n TiledTileMatch,\n} from './types';\n\nconst FLIPPED_HORIZONTALLY_FLAG = 0x80000000;\nconst FLIPPED_VERTICALLY_FLAG = 0x40000000;\nconst FLIPPED_DIAGONALLY_FLAG = 0x20000000;\nconst FLIP_FLAGS =\n FLIPPED_HORIZONTALLY_FLAG | FLIPPED_VERTICALLY_FLAG | FLIPPED_DIAGONALLY_FLAG;\n\ninterface ParsedTileGid {\n gid: number;\n flip: {\n diagonal: boolean;\n horizontal: boolean;\n vertical: boolean;\n };\n}\n\nexport function resolveTiledMap(k: KAPLAYCtx, map: TiledMap): TiledMapData {\n if (typeof map !== 'string') {\n return map;\n }\n\n const asset = k.getAsset(map);\n\n if (!asset) {\n throw new Error(`Tiled map asset \"${map}\" is not loaded.`);\n }\n\n if (!asset.data) {\n throw new Error(`Tiled map asset \"${map}\" is not ready yet.`);\n }\n\n return asset.data as TiledMapData;\n}\n\nfunction getPropertyRecord(\n properties: TiledProperty[] | undefined,\n): Record<string, TiledPropertyValue> {\n const record: Record<string, TiledPropertyValue> = {};\n\n properties?.forEach((property) => {\n record[property.name] = property.value;\n });\n\n return record;\n}\n\nfunction isObjectLayer(layer: TiledLayer): layer is TiledObjectLayer {\n return layer.type === 'objectgroup';\n}\n\nfunction isTileLayer(layer: TiledLayer): layer is TiledTileLayer {\n return layer.type === 'tilelayer';\n}\n\nfunction normalizeTileLayer(layer: TiledTileLayer): ParsedTiledLayer {\n return {\n data: layer.data,\n height: layer.height,\n name: layer.name,\n opacity: layer.opacity ?? 1,\n type: 'tilelayer',\n visible: layer.visible ?? true,\n width: layer.width,\n x: layer.x ?? 0,\n y: layer.y ?? 0,\n zIndex: 0,\n };\n}\n\nfunction normalizeObjectLayer(layer: TiledObjectLayer): ParsedTiledObjectLayer {\n return {\n name: layer.name,\n objects: layer.objects,\n type: 'objectgroup',\n visible: layer.visible ?? true,\n zIndex: 0,\n };\n}\n\nexport function parseTileGid(rawGid: number): ParsedTileGid | null {\n if (rawGid === 0) {\n return null;\n }\n\n return {\n gid: (rawGid & ~FLIP_FLAGS) >>> 0,\n flip: {\n diagonal: (rawGid & FLIPPED_DIAGONALLY_FLAG) !== 0,\n horizontal: (rawGid & FLIPPED_HORIZONTALLY_FLAG) !== 0,\n vertical: (rawGid & FLIPPED_VERTICALLY_FLAG) !== 0,\n },\n };\n}\n\nfunction getTileDrawTransform(flip: ParsedTileGid['flip']): {\n angle: number;\n flipX: boolean;\n flipY: boolean;\n} {\n if (!flip.diagonal) {\n return {\n angle: 0,\n flipX: flip.horizontal,\n flipY: flip.vertical,\n };\n }\n\n if (flip.horizontal && flip.vertical) {\n return {\n angle: 270,\n flipX: true,\n flipY: false,\n };\n }\n\n if (flip.horizontal) {\n return {\n angle: 270,\n flipX: false,\n flipY: false,\n };\n }\n\n if (flip.vertical) {\n return {\n angle: 90,\n flipX: false,\n flipY: false,\n };\n }\n\n return {\n angle: 270,\n flipX: false,\n flipY: true,\n };\n}\n\nfunction getTileQuad(k: KAPLAYCtx, map: ParsedTiledMap, gid: number): Quad {\n const localTileId = gid - map.tileset.firstGid;\n const column = localTileId % map.tileset.columns;\n const row = Math.floor(localTileId / map.tileset.columns);\n const x =\n map.tileset.margin + column * (map.tileset.tileWidth + map.tileset.spacing);\n const y =\n map.tileset.margin + row * (map.tileset.tileHeight + map.tileset.spacing);\n\n return k.quad(\n x / map.tileset.imageWidth,\n y / map.tileset.imageHeight,\n map.tileset.tileWidth / map.tileset.imageWidth,\n map.tileset.tileHeight / map.tileset.imageHeight,\n );\n}\n\nexport function getLayerNames(options: TiledMapOpt): Set<string> | null {\n if (!options.layerNames?.length) {\n return null;\n }\n\n return new Set(options.layerNames);\n}\n\nfunction getParsedTile(\n map: ParsedTiledMap,\n gid: number,\n): ParsedTiledTile | undefined {\n return map.tileset.tiles[gid];\n}\n\nfunction matchesProperties(\n expected: Record<string, TiledPropertyValue> | undefined,\n actual: Record<string, TiledPropertyValue>,\n): boolean {\n if (!expected) {\n return true;\n }\n\n return Object.entries(expected).every(\n ([name, value]) => actual[name] === value,\n );\n}\n\nfunction matchesTileRule(\n match: TiledTileMatch,\n tile: TiledTileContext,\n): boolean {\n if (match.gid !== undefined && match.gid !== tile.gid) {\n return false;\n }\n\n if (match.tileId !== undefined && match.tileId !== tile.tileId) {\n return false;\n }\n\n if (match.layer !== undefined && match.layer !== tile.layer) {\n return false;\n }\n\n return matchesProperties(match.properties, tile.properties);\n}\n\nfunction matchesObjectRule(\n match: TiledObjectMatch,\n object: TiledObjectContext,\n): boolean {\n if (match.layer !== undefined && match.layer !== object.layer) {\n return false;\n }\n\n if (match.name !== undefined && match.name !== object.name) {\n return false;\n }\n\n if (match.type !== undefined && match.type !== object.type) {\n return false;\n }\n\n return matchesProperties(match.properties, object.properties);\n}\n\nexport function createLayerRenderer(\n k: KAPLAYCtx,\n layer: ParsedTiledTileLayer,\n map: ParsedTiledMap,\n sprite: string,\n): GameObj {\n return k.add([\n k.pos(0, 0),\n k.z(layer.zIndex),\n {\n draw: () => {\n layer.data.forEach((rawGid, index) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (!parsedGid) {\n return;\n }\n\n const column = index % layer.width;\n const row = Math.floor(index / layer.width);\n const drawTransform = getTileDrawTransform(parsedGid.flip);\n\n k.drawSprite({\n anchor: 'center',\n angle: drawTransform.angle,\n flipX: drawTransform.flipX,\n flipY: drawTransform.flipY,\n opacity: layer.opacity,\n pos: k.vec2(\n (column + layer.x) * map.tileWidth + map.tileset.tileWidth / 2,\n (row + layer.y) * map.tileHeight + map.tileset.tileHeight / 2,\n ),\n quad: getTileQuad(k, map, parsedGid.gid),\n sprite,\n });\n });\n },\n id: 'tiled-layer',\n },\n ] as CompList<TiledLayerComp>);\n}\n\nexport function createMatchedTileObjects(\n k: KAPLAYCtx,\n layer: ParsedTiledTileLayer,\n map: ParsedTiledMap,\n options: TiledMapOpt,\n): GameObj[] {\n const rules = options.tiles;\n\n if (!rules?.length) {\n return [];\n }\n\n const tiles: GameObj[] = [];\n\n layer.data.forEach((rawGid, index) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (!parsedGid) {\n return;\n }\n\n const parsedTile = getParsedTile(map, parsedGid.gid);\n const column = index % layer.width;\n const row = Math.floor(index / layer.width);\n const tile = {\n flip: parsedGid.flip,\n gid: parsedGid.gid,\n layer: layer.name,\n pos: {\n x: (column + layer.x) * map.tileWidth,\n y: (row + layer.y) * map.tileHeight,\n },\n properties: parsedTile?.properties ?? {},\n tileSize: {\n height: map.tileHeight,\n width: map.tileWidth,\n },\n tileId: parsedTile?.tileId ?? parsedGid.gid - map.tileset.firstGid,\n tilePos: {\n x: column + layer.x,\n y: row + layer.y,\n },\n };\n\n rules.forEach((rule) => {\n if (!matchesTileRule(rule.match, tile)) {\n return;\n }\n\n tiles.push(\n k.add([\n k.pos(tile.pos.x, tile.pos.y),\n k.anchor('topleft'),\n k.z(layer.zIndex),\n ...rule.comps(tile),\n ] as CompList<unknown>),\n );\n });\n });\n\n return tiles;\n}\n\nexport function createMatchedObjectObjects(\n k: KAPLAYCtx,\n layer: ParsedTiledObjectLayer,\n options: TiledMapOpt,\n): GameObj[] {\n const rules = options.objects;\n\n if (!rules?.length) {\n return [];\n }\n\n const objects: GameObj[] = [];\n\n if (!layer.visible) {\n return objects;\n }\n\n layer.objects.forEach((object) => {\n if (!object.visible) {\n return;\n }\n\n const context: TiledObjectContext = {\n id: object.id,\n layer: layer.name,\n name: object.name,\n objectSize: {\n height: object.height,\n width: object.width,\n },\n point: object.point ?? false,\n pos: {\n x: object.x,\n y: object.y,\n },\n properties: getPropertyRecord(object.properties),\n rotation: object.rotation,\n type: object.type,\n };\n\n rules.forEach((rule) => {\n if (!matchesObjectRule(rule.match, context)) {\n return;\n }\n\n objects.push(\n k.add([\n k.pos(context.pos.x, context.pos.y),\n k.anchor('topleft'),\n k.z(layer.zIndex),\n ...rule.comps(context),\n ] as CompList<unknown>),\n );\n });\n });\n\n return objects;\n}\n\nexport function parseTiledMap(data: TiledMapData): ParsedTiledMap {\n if (data.orientation !== 'orthogonal') {\n throw new Error(\n `Unsupported Tiled orientation \"${data.orientation}\". Expected \"orthogonal\".`,\n );\n }\n\n if (data.infinite) {\n throw new Error('Infinite Tiled maps are not supported.');\n }\n\n if (data.tilesets.length !== 1) {\n throw new Error('Exactly one Tiled tileset is required.');\n }\n\n const [tileset] = data.tilesets;\n\n if (tileset.columns <= 0) {\n throw new Error('Tiled tileset columns must be greater than 0.');\n }\n\n const layers = data.layers.map((layer, zIndex) => {\n if (isTileLayer(layer)) {\n if (layer.data.length !== layer.width * layer.height) {\n throw new Error(\n `Layer \"${layer.name}\" data length does not match its dimensions.`,\n );\n }\n\n return {\n ...normalizeTileLayer(layer),\n zIndex,\n };\n }\n\n if (isObjectLayer(layer)) {\n return {\n ...normalizeObjectLayer(layer),\n zIndex,\n };\n }\n\n throw new Error('Unsupported Tiled layer type.');\n });\n\n return {\n height: data.height,\n layers,\n orientation: 'orthogonal',\n tileHeight: data.tileheight,\n tileWidth: data.tilewidth,\n tileset: {\n columns: tileset.columns,\n firstGid: tileset.firstgid,\n image: tileset.image,\n imageHeight: tileset.imageheight,\n imageWidth: tileset.imagewidth,\n lastGid: tileset.firstgid + tileset.tilecount - 1,\n margin: tileset.margin ?? 0,\n name: tileset.name,\n spacing: tileset.spacing ?? 0,\n tileCount: tileset.tilecount,\n tileHeight: tileset.tileheight,\n tiles: Object.fromEntries(\n (tileset.tiles ?? []).map((tile) => [\n tile.id + tileset.firstgid,\n {\n gid: tile.id + tileset.firstgid,\n properties: getPropertyRecord(tile.properties),\n tileId: tile.id,\n },\n ]),\n ),\n tileWidth: tileset.tilewidth,\n },\n width: data.width,\n };\n}\n","import type { KAPLAYCtx } from 'kaplay';\n\nimport type { TiledMap, TiledMapOpt } from './types';\nimport {\n createLayerRenderer,\n createMatchedObjectObjects,\n createMatchedTileObjects,\n getLayerNames,\n parseTiledMap,\n parseTileGid,\n resolveTiledMap,\n} from './utils';\n\nexport type { TiledMap, TiledMapOpt } from './types';\n\ndeclare module 'kaplay' {\n interface KAPLAYCtx {\n addTiledMap: (map: TiledMap, options: TiledMapOpt) => void;\n }\n}\n\n/**\n * Add a Tiled map to the current KAPLAY context.\n *\n * The `map` argument can either be:\n * - parsed map JSON, or\n * - the asset key of a map loaded with `loadJSON()`.\n *\n * @param k - The active KAPLAY context.\n * @param map - The Tiled map data.\n * @param opt - The Tiled map options.\n */\nfunction addTiledMap(k: KAPLAYCtx, map: TiledMap, opt: TiledMapOpt): void {\n const parsedMap = parseTiledMap(resolveTiledMap(k, map));\n const allowedLayerNames = getLayerNames(opt);\n\n parsedMap.layers.forEach((layer) => {\n if (!layer.visible) {\n return;\n }\n\n if (allowedLayerNames && !allowedLayerNames.has(layer.name)) {\n return;\n }\n\n if (layer.type === 'tilelayer') {\n layer.data.forEach((rawGid) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (\n parsedGid &&\n (parsedGid.gid < parsedMap.tileset.firstGid ||\n parsedGid.gid > parsedMap.tileset.lastGid)\n ) {\n throw new Error(\n `Tile gid ${String(rawGid)} is outside the supported tileset range.`,\n );\n }\n });\n\n createLayerRenderer(k, layer, parsedMap, opt.sprite);\n createMatchedTileObjects(k, layer, parsedMap, opt);\n return;\n }\n\n createMatchedObjectObjects(k, layer, opt);\n });\n}\n\n/**\n * KAPLAY plugin that adds `addTiledMap()` to the context.\n *\n * @param k - The active KAPLAY context.\n * @returns - The plugin API.\n */\nexport function tiledPlugin(k: KAPLAYCtx) {\n return {\n addTiledMap(map: TiledMap, options: TiledMapOpt) {\n addTiledMap(k, map, options);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.cjs","names":[],"sources":["../src/utils.ts","../src/plugin.ts"],"sourcesContent":["import type { CompList, GameObj, KAPLAYCtx, Quad } from 'kaplay';\n\nimport type {\n ParsedTiledLayer,\n ParsedTiledMap,\n ParsedTiledObjectLayer,\n ParsedTiledTile,\n ParsedTiledTileLayer,\n TiledLayer,\n TiledLayerComp,\n TiledMap,\n TiledMapData,\n TiledMapOpt,\n TiledObjectContext,\n TiledObjectLayer,\n TiledObjectMatch,\n TiledProperty,\n TiledPropertyValue,\n TiledTileContext,\n TiledTileLayer,\n TiledTileMatch,\n} from './types';\n\nconst FLIPPED_HORIZONTALLY_FLAG = 0x80000000;\nconst FLIPPED_VERTICALLY_FLAG = 0x40000000;\nconst FLIPPED_DIAGONALLY_FLAG = 0x20000000;\nconst FLIP_FLAGS =\n FLIPPED_HORIZONTALLY_FLAG | FLIPPED_VERTICALLY_FLAG | FLIPPED_DIAGONALLY_FLAG;\n\ninterface ParsedTileGid {\n gid: number;\n flip: {\n diagonal: boolean;\n horizontal: boolean;\n vertical: boolean;\n };\n}\n\nexport function resolveTiledMap(k: KAPLAYCtx, map: TiledMap): TiledMapData {\n if (typeof map !== 'string') {\n return map;\n }\n\n const asset = k.getAsset(map);\n\n if (!asset) {\n throw new Error(`Tiled map asset \"${map}\" is not loaded.`);\n }\n\n if (!asset.data) {\n throw new Error(`Tiled map asset \"${map}\" is not ready yet.`);\n }\n\n return asset.data as TiledMapData;\n}\n\nfunction getPropertyRecord(\n properties: TiledProperty[] | undefined,\n): Record<string, TiledPropertyValue> {\n const record: Record<string, TiledPropertyValue> = {};\n\n properties?.forEach((property) => {\n record[property.name] = property.value;\n });\n\n return record;\n}\n\nfunction isObjectLayer(layer: TiledLayer): layer is TiledObjectLayer {\n return layer.type === 'objectgroup';\n}\n\nfunction isTileLayer(layer: TiledLayer): layer is TiledTileLayer {\n return layer.type === 'tilelayer';\n}\n\nfunction normalizeTileLayer(layer: TiledTileLayer): ParsedTiledLayer {\n return {\n data: layer.data,\n height: layer.height,\n name: layer.name,\n opacity: layer.opacity ?? 1,\n type: 'tilelayer',\n visible: layer.visible ?? true,\n width: layer.width,\n x: layer.x ?? 0,\n y: layer.y ?? 0,\n zIndex: 0,\n };\n}\n\nfunction normalizeObjectLayer(layer: TiledObjectLayer): ParsedTiledObjectLayer {\n return {\n name: layer.name,\n objects: layer.objects,\n type: 'objectgroup',\n visible: layer.visible ?? true,\n zIndex: 0,\n };\n}\n\nexport function parseTileGid(rawGid: number): ParsedTileGid | null {\n if (rawGid === 0) {\n return null;\n }\n\n return {\n gid: (rawGid & ~FLIP_FLAGS) >>> 0,\n flip: {\n diagonal: (rawGid & FLIPPED_DIAGONALLY_FLAG) !== 0,\n horizontal: (rawGid & FLIPPED_HORIZONTALLY_FLAG) !== 0,\n vertical: (rawGid & FLIPPED_VERTICALLY_FLAG) !== 0,\n },\n };\n}\n\nfunction getTileDrawTransform(flip: ParsedTileGid['flip']): {\n angle: number;\n flipX: boolean;\n flipY: boolean;\n} {\n if (!flip.diagonal) {\n return {\n angle: 0,\n flipX: flip.horizontal,\n flipY: flip.vertical,\n };\n }\n\n if (flip.horizontal && flip.vertical) {\n return {\n angle: 270,\n flipX: true,\n flipY: false,\n };\n }\n\n if (flip.horizontal) {\n return {\n angle: 270,\n flipX: false,\n flipY: false,\n };\n }\n\n if (flip.vertical) {\n return {\n angle: 90,\n flipX: false,\n flipY: false,\n };\n }\n\n return {\n angle: 270,\n flipX: false,\n flipY: true,\n };\n}\n\nfunction getTileQuad(k: KAPLAYCtx, map: ParsedTiledMap, gid: number): Quad {\n const localTileId = gid - map.tileset.firstGid;\n const column = localTileId % map.tileset.columns;\n const row = Math.floor(localTileId / map.tileset.columns);\n const x =\n map.tileset.margin + column * (map.tileset.tileWidth + map.tileset.spacing);\n const y =\n map.tileset.margin + row * (map.tileset.tileHeight + map.tileset.spacing);\n\n return k.quad(\n x / map.tileset.imageWidth,\n y / map.tileset.imageHeight,\n map.tileset.tileWidth / map.tileset.imageWidth,\n map.tileset.tileHeight / map.tileset.imageHeight,\n );\n}\n\nexport function getLayerNames(options: TiledMapOpt): Set<string> | null {\n if (!options.layerNames?.length) {\n return null;\n }\n\n return new Set(options.layerNames);\n}\n\nfunction getParsedTile(\n map: ParsedTiledMap,\n gid: number,\n): ParsedTiledTile | undefined {\n return map.tileset.tiles[gid];\n}\n\nfunction matchesProperties(\n expected: Record<string, TiledPropertyValue> | undefined,\n actual: Record<string, TiledPropertyValue>,\n): boolean {\n if (!expected) {\n return true;\n }\n\n return Object.entries(expected).every(\n ([name, value]) => actual[name] === value,\n );\n}\n\nfunction matchesTileRule(\n match: TiledTileMatch,\n tile: TiledTileContext,\n): boolean {\n if (match.gid !== undefined && match.gid !== tile.gid) {\n return false;\n }\n\n if (match.tileId !== undefined && match.tileId !== tile.tileId) {\n return false;\n }\n\n if (match.layer !== undefined && match.layer !== tile.layer) {\n return false;\n }\n\n return matchesProperties(match.properties, tile.properties);\n}\n\nfunction matchesObjectRule(\n match: TiledObjectMatch,\n object: TiledObjectContext,\n): boolean {\n if (match.layer !== undefined && match.layer !== object.layer) {\n return false;\n }\n\n if (match.name !== undefined && match.name !== object.name) {\n return false;\n }\n\n if (match.type !== undefined && match.type !== object.type) {\n return false;\n }\n\n return matchesProperties(match.properties, object.properties);\n}\n\nexport function createLayerRenderer(\n k: KAPLAYCtx,\n layer: ParsedTiledTileLayer,\n map: ParsedTiledMap,\n sprite: string,\n): GameObj {\n return k.add([\n k.pos(0, 0),\n k.z(layer.zIndex),\n {\n draw: () => {\n layer.data.forEach((rawGid, index) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (!parsedGid) {\n return;\n }\n\n const column = index % layer.width;\n const row = Math.floor(index / layer.width);\n const drawTransform = getTileDrawTransform(parsedGid.flip);\n\n k.drawSprite({\n anchor: 'center',\n angle: drawTransform.angle,\n flipX: drawTransform.flipX,\n flipY: drawTransform.flipY,\n opacity: layer.opacity,\n pos: k.vec2(\n (column + layer.x) * map.tileWidth + map.tileset.tileWidth / 2,\n (row + layer.y) * map.tileHeight + map.tileset.tileHeight / 2,\n ),\n quad: getTileQuad(k, map, parsedGid.gid),\n sprite,\n });\n });\n },\n id: 'tiled-layer',\n },\n ] as CompList<TiledLayerComp>);\n}\n\nexport function createMatchedTileObjects(\n k: KAPLAYCtx,\n layer: ParsedTiledTileLayer,\n map: ParsedTiledMap,\n options: TiledMapOpt,\n): GameObj[] {\n const rules = options.tiles;\n\n if (!rules?.length) {\n return [];\n }\n\n const tiles: GameObj[] = [];\n\n layer.data.forEach((rawGid, index) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (!parsedGid) {\n return;\n }\n\n const parsedTile = getParsedTile(map, parsedGid.gid);\n const column = index % layer.width;\n const row = Math.floor(index / layer.width);\n const tile = {\n flip: parsedGid.flip,\n gid: parsedGid.gid,\n height: map.tileHeight,\n layer: layer.name,\n tileHeight: map.tileHeight,\n tileWidth: map.tileWidth,\n tileX: column + layer.x,\n tileY: row + layer.y,\n width: map.tileWidth,\n x: (column + layer.x) * map.tileWidth,\n y: (row + layer.y) * map.tileHeight,\n properties: parsedTile?.properties ?? {},\n tileId: parsedTile?.tileId ?? parsedGid.gid - map.tileset.firstGid,\n };\n\n rules.forEach((rule) => {\n if (!matchesTileRule(rule.match, tile)) {\n return;\n }\n\n tiles.push(\n k.add([\n k.pos(tile.x, tile.y),\n k.anchor('topleft'),\n k.z(layer.zIndex),\n ...rule.comps(tile),\n ] as CompList<unknown>),\n );\n });\n });\n\n return tiles;\n}\n\nexport function createMatchedObjectObjects(\n k: KAPLAYCtx,\n layer: ParsedTiledObjectLayer,\n options: TiledMapOpt,\n): GameObj[] {\n const rules = options.objects;\n\n if (!rules?.length) {\n return [];\n }\n\n const objects: GameObj[] = [];\n\n if (!layer.visible) {\n return objects;\n }\n\n layer.objects.forEach((object) => {\n if (!object.visible) {\n return;\n }\n\n const context: TiledObjectContext = {\n height: object.height,\n id: object.id,\n layer: layer.name,\n name: object.name,\n width: object.width,\n x: object.x,\n y: object.y,\n point: object.point ?? false,\n properties: getPropertyRecord(object.properties),\n rotation: object.rotation,\n type: object.type,\n };\n\n rules.forEach((rule) => {\n if (!matchesObjectRule(rule.match, context)) {\n return;\n }\n\n objects.push(\n k.add([\n k.pos(context.x, context.y),\n k.anchor('topleft'),\n k.z(layer.zIndex),\n ...rule.comps(context),\n ] as CompList<unknown>),\n );\n });\n });\n\n return objects;\n}\n\nexport function parseTiledMap(data: TiledMapData): ParsedTiledMap {\n if (data.orientation !== 'orthogonal') {\n throw new Error(\n `Unsupported Tiled orientation \"${data.orientation}\". Expected \"orthogonal\".`,\n );\n }\n\n if (data.infinite) {\n throw new Error('Infinite Tiled maps are not supported.');\n }\n\n if (data.tilesets.length !== 1) {\n throw new Error('Exactly one Tiled tileset is required.');\n }\n\n const [tileset] = data.tilesets;\n\n if (tileset.columns <= 0) {\n throw new Error('Tiled tileset columns must be greater than 0.');\n }\n\n const layers = data.layers.map((layer, zIndex) => {\n if (isTileLayer(layer)) {\n if (layer.data.length !== layer.width * layer.height) {\n throw new Error(\n `Layer \"${layer.name}\" data length does not match its dimensions.`,\n );\n }\n\n return {\n ...normalizeTileLayer(layer),\n zIndex,\n };\n }\n\n if (isObjectLayer(layer)) {\n return {\n ...normalizeObjectLayer(layer),\n zIndex,\n };\n }\n\n throw new Error('Unsupported Tiled layer type.');\n });\n\n return {\n height: data.height,\n layers,\n orientation: 'orthogonal',\n tileHeight: data.tileheight,\n tileWidth: data.tilewidth,\n tileset: {\n columns: tileset.columns,\n firstGid: tileset.firstgid,\n image: tileset.image,\n imageHeight: tileset.imageheight,\n imageWidth: tileset.imagewidth,\n lastGid: tileset.firstgid + tileset.tilecount - 1,\n margin: tileset.margin ?? 0,\n name: tileset.name,\n spacing: tileset.spacing ?? 0,\n tileCount: tileset.tilecount,\n tileHeight: tileset.tileheight,\n tiles: Object.fromEntries(\n (tileset.tiles ?? []).map((tile) => [\n tile.id + tileset.firstgid,\n {\n gid: tile.id + tileset.firstgid,\n properties: getPropertyRecord(tile.properties),\n tileId: tile.id,\n },\n ]),\n ),\n tileWidth: tileset.tilewidth,\n },\n width: data.width,\n };\n}\n","import type { KAPLAYCtx } from 'kaplay';\n\nimport type { AddTiledMap, TiledMap, TiledMapOpt } from './types';\nimport {\n createLayerRenderer,\n createMatchedObjectObjects,\n createMatchedTileObjects,\n getLayerNames,\n parseTiledMap,\n parseTileGid,\n resolveTiledMap,\n} from './utils';\n\nexport type { AddTiledMap, TiledMap, TiledMapOpt } from './types';\n\ndeclare module 'kaplay' {\n interface KAPLAYCtx {\n addTiledMap: (map: TiledMap, options: TiledMapOpt) => void;\n }\n}\n\n/**\n * Add a Tiled map to the current KAPLAY context.\n *\n * The `map` argument can either be:\n * - parsed map JSON, or\n * - the asset key of a map loaded with `loadJSON()`.\n *\n * @param k - The active KAPLAY context.\n * @param map - The Tiled map data.\n * @param opt - The Tiled map options.\n */\nfunction addTiledMap(k: KAPLAYCtx, map: TiledMap, opt: TiledMapOpt): void {\n const parsedMap = parseTiledMap(resolveTiledMap(k, map));\n const allowedLayerNames = getLayerNames(opt);\n\n parsedMap.layers.forEach((layer) => {\n if (!layer.visible) {\n return;\n }\n\n if (allowedLayerNames && !allowedLayerNames.has(layer.name)) {\n return;\n }\n\n if (layer.type === 'tilelayer') {\n layer.data.forEach((rawGid) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (\n parsedGid &&\n (parsedGid.gid < parsedMap.tileset.firstGid ||\n parsedGid.gid > parsedMap.tileset.lastGid)\n ) {\n throw new Error(\n `Tile gid ${String(rawGid)} is outside the supported tileset range.`,\n );\n }\n });\n\n createLayerRenderer(k, layer, parsedMap, opt.sprite);\n createMatchedTileObjects(k, layer, parsedMap, opt);\n return;\n }\n\n createMatchedObjectObjects(k, layer, opt);\n });\n}\n\n/**\n * KAPLAY plugin that adds `addTiledMap()` to the context.\n *\n * @param k - The active KAPLAY context.\n * @returns - The plugin API.\n */\nexport function tiledPlugin(k: KAPLAYCtx) {\n const boundAddTiledMap: AddTiledMap = (map, options) => {\n addTiledMap(k, map, options);\n };\n\n return { addTiledMap: boundAddTiledMap };\n}\n"],"mappings":"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"}
package/dist/plugin.d.cts CHANGED
@@ -1,6 +1,8 @@
1
1
  import { CompList } from 'kaplay';
2
2
  import { KAPLAYCtx } from 'kaplay';
3
3
 
4
+ export declare type AddTiledMap = (map: TiledMap, options: TiledMapOpt) => void;
5
+
4
6
  declare type TiledLayer = TiledObjectLayer | TiledTileLayer;
5
7
 
6
8
  export declare type TiledMap = TiledMapData | string;
@@ -39,18 +41,14 @@ declare interface TiledObject {
39
41
  }
40
42
 
41
43
  declare interface TiledObjectContext {
44
+ height: number;
42
45
  id: number;
43
46
  layer: string;
44
47
  name: string;
45
- objectSize: {
46
- height: number;
47
- width: number;
48
- };
48
+ width: number;
49
+ x: number;
50
+ y: number;
49
51
  point: boolean;
50
- pos: {
51
- x: number;
52
- y: number;
53
- };
54
52
  properties: Record<string, TiledPropertyValue>;
55
53
  rotation: number;
56
54
  type: string;
@@ -87,7 +85,7 @@ declare interface TiledObjectRule {
87
85
  * @returns - The plugin API.
88
86
  */
89
87
  export declare function tiledPlugin(k: KAPLAYCtx): {
90
- addTiledMap(map: TiledMap, options: TiledMapOpt): void;
88
+ addTiledMap: AddTiledMap;
91
89
  };
92
90
 
93
91
  declare interface TiledProperty {
@@ -106,20 +104,16 @@ declare interface TiledTileContext {
106
104
  };
107
105
  gid: number;
108
106
  layer: string;
109
- pos: {
110
- x: number;
111
- y: number;
112
- };
107
+ height: number;
108
+ tileHeight: number;
109
+ tileWidth: number;
110
+ tileX: number;
111
+ tileY: number;
112
+ width: number;
113
+ x: number;
114
+ y: number;
113
115
  properties: Record<string, TiledPropertyValue>;
114
- tileSize: {
115
- height: number;
116
- width: number;
117
- };
118
116
  tileId: number;
119
- tilePos: {
120
- x: number;
121
- y: number;
122
- };
123
117
  }
124
118
 
125
119
  declare interface TiledTileDefinition {
package/dist/plugin.d.mts CHANGED
@@ -1,6 +1,8 @@
1
1
  import { CompList } from 'kaplay';
2
2
  import { KAPLAYCtx } from 'kaplay';
3
3
 
4
+ export declare type AddTiledMap = (map: TiledMap, options: TiledMapOpt) => void;
5
+
4
6
  declare type TiledLayer = TiledObjectLayer | TiledTileLayer;
5
7
 
6
8
  export declare type TiledMap = TiledMapData | string;
@@ -39,18 +41,14 @@ declare interface TiledObject {
39
41
  }
40
42
 
41
43
  declare interface TiledObjectContext {
44
+ height: number;
42
45
  id: number;
43
46
  layer: string;
44
47
  name: string;
45
- objectSize: {
46
- height: number;
47
- width: number;
48
- };
48
+ width: number;
49
+ x: number;
50
+ y: number;
49
51
  point: boolean;
50
- pos: {
51
- x: number;
52
- y: number;
53
- };
54
52
  properties: Record<string, TiledPropertyValue>;
55
53
  rotation: number;
56
54
  type: string;
@@ -87,7 +85,7 @@ declare interface TiledObjectRule {
87
85
  * @returns - The plugin API.
88
86
  */
89
87
  export declare function tiledPlugin(k: KAPLAYCtx): {
90
- addTiledMap(map: TiledMap, options: TiledMapOpt): void;
88
+ addTiledMap: AddTiledMap;
91
89
  };
92
90
 
93
91
  declare interface TiledProperty {
@@ -106,20 +104,16 @@ declare interface TiledTileContext {
106
104
  };
107
105
  gid: number;
108
106
  layer: string;
109
- pos: {
110
- x: number;
111
- y: number;
112
- };
107
+ height: number;
108
+ tileHeight: number;
109
+ tileWidth: number;
110
+ tileX: number;
111
+ tileY: number;
112
+ width: number;
113
+ x: number;
114
+ y: number;
113
115
  properties: Record<string, TiledPropertyValue>;
114
- tileSize: {
115
- height: number;
116
- width: number;
117
- };
118
116
  tileId: number;
119
- tilePos: {
120
- x: number;
121
- y: number;
122
- };
123
117
  }
124
118
 
125
119
  declare interface TiledTileDefinition {
package/dist/plugin.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import { CompList } from 'kaplay';
2
2
  import { KAPLAYCtx } from 'kaplay';
3
3
 
4
+ export declare type AddTiledMap = (map: TiledMap, options: TiledMapOpt) => void;
5
+
4
6
  declare type TiledLayer = TiledObjectLayer | TiledTileLayer;
5
7
 
6
8
  export declare type TiledMap = TiledMapData | string;
@@ -39,18 +41,14 @@ declare interface TiledObject {
39
41
  }
40
42
 
41
43
  declare interface TiledObjectContext {
44
+ height: number;
42
45
  id: number;
43
46
  layer: string;
44
47
  name: string;
45
- objectSize: {
46
- height: number;
47
- width: number;
48
- };
48
+ width: number;
49
+ x: number;
50
+ y: number;
49
51
  point: boolean;
50
- pos: {
51
- x: number;
52
- y: number;
53
- };
54
52
  properties: Record<string, TiledPropertyValue>;
55
53
  rotation: number;
56
54
  type: string;
@@ -87,7 +85,7 @@ declare interface TiledObjectRule {
87
85
  * @returns - The plugin API.
88
86
  */
89
87
  export declare function tiledPlugin(k: KAPLAYCtx): {
90
- addTiledMap(map: TiledMap, options: TiledMapOpt): void;
88
+ addTiledMap: AddTiledMap;
91
89
  };
92
90
 
93
91
  declare interface TiledProperty {
@@ -106,20 +104,16 @@ declare interface TiledTileContext {
106
104
  };
107
105
  gid: number;
108
106
  layer: string;
109
- pos: {
110
- x: number;
111
- y: number;
112
- };
107
+ height: number;
108
+ tileHeight: number;
109
+ tileWidth: number;
110
+ tileX: number;
111
+ tileY: number;
112
+ width: number;
113
+ x: number;
114
+ y: number;
113
115
  properties: Record<string, TiledPropertyValue>;
114
- tileSize: {
115
- height: number;
116
- width: number;
117
- };
118
116
  tileId: number;
119
- tilePos: {
120
- x: number;
121
- y: number;
122
- };
123
117
  }
124
118
 
125
119
  declare interface TiledTileDefinition {
package/dist/plugin.mjs CHANGED
@@ -130,25 +130,21 @@ function y(e, t, n, r) {
130
130
  let c = m(n, s.gid), l = o % t.width, d = Math.floor(o / t.width), f = {
131
131
  flip: s.flip,
132
132
  gid: s.gid,
133
+ height: n.tileHeight,
133
134
  layer: t.name,
134
- pos: {
135
- x: (l + t.x) * n.tileWidth,
136
- y: (d + t.y) * n.tileHeight
137
- },
135
+ tileHeight: n.tileHeight,
136
+ tileWidth: n.tileWidth,
137
+ tileX: l + t.x,
138
+ tileY: d + t.y,
139
+ width: n.tileWidth,
140
+ x: (l + t.x) * n.tileWidth,
141
+ y: (d + t.y) * n.tileHeight,
138
142
  properties: c?.properties ?? {},
139
- tileSize: {
140
- height: n.tileHeight,
141
- width: n.tileWidth
142
- },
143
- tileId: c?.tileId ?? s.gid - n.tileset.firstGid,
144
- tilePos: {
145
- x: l + t.x,
146
- y: d + t.y
147
- }
143
+ tileId: c?.tileId ?? s.gid - n.tileset.firstGid
148
144
  };
149
145
  i.forEach((n) => {
150
146
  g(n.match, f) && a.push(e.add([
151
- e.pos(f.pos.x, f.pos.y),
147
+ e.pos(f.x, f.y),
152
148
  e.anchor("topleft"),
153
149
  e.z(t.zIndex),
154
150
  ...n.comps(f)
@@ -163,25 +159,21 @@ function b(e, t, n) {
163
159
  return t.visible && t.objects.forEach((n) => {
164
160
  if (!n.visible) return;
165
161
  let o = {
162
+ height: n.height,
166
163
  id: n.id,
167
164
  layer: t.name,
168
165
  name: n.name,
169
- objectSize: {
170
- height: n.height,
171
- width: n.width
172
- },
166
+ width: n.width,
167
+ x: n.x,
168
+ y: n.y,
173
169
  point: n.point ?? !1,
174
- pos: {
175
- x: n.x,
176
- y: n.y
177
- },
178
170
  properties: a(n.properties),
179
171
  rotation: n.rotation,
180
172
  type: n.type
181
173
  };
182
174
  r.forEach((n) => {
183
175
  _(n.match, o) && i.push(e.add([
184
- e.pos(o.pos.x, o.pos.y),
176
+ e.pos(o.x, o.y),
185
177
  e.anchor("topleft"),
186
178
  e.z(t.zIndex),
187
179
  ...n.comps(o)
@@ -255,7 +247,7 @@ function S(e, t, n) {
255
247
  });
256
248
  }
257
249
  function C(e) {
258
- return { addTiledMap(t, n) {
250
+ return { addTiledMap: (t, n) => {
259
251
  S(e, t, n);
260
252
  } };
261
253
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.mjs","names":[],"sources":["../src/utils.ts","../src/plugin.ts"],"sourcesContent":["import type { CompList, GameObj, KAPLAYCtx, Quad } from 'kaplay';\n\nimport type {\n ParsedTiledLayer,\n ParsedTiledMap,\n ParsedTiledObjectLayer,\n ParsedTiledTile,\n ParsedTiledTileLayer,\n TiledLayer,\n TiledLayerComp,\n TiledMap,\n TiledMapData,\n TiledMapOpt,\n TiledObjectContext,\n TiledObjectLayer,\n TiledObjectMatch,\n TiledProperty,\n TiledPropertyValue,\n TiledTileContext,\n TiledTileLayer,\n TiledTileMatch,\n} from './types';\n\nconst FLIPPED_HORIZONTALLY_FLAG = 0x80000000;\nconst FLIPPED_VERTICALLY_FLAG = 0x40000000;\nconst FLIPPED_DIAGONALLY_FLAG = 0x20000000;\nconst FLIP_FLAGS =\n FLIPPED_HORIZONTALLY_FLAG | FLIPPED_VERTICALLY_FLAG | FLIPPED_DIAGONALLY_FLAG;\n\ninterface ParsedTileGid {\n gid: number;\n flip: {\n diagonal: boolean;\n horizontal: boolean;\n vertical: boolean;\n };\n}\n\nexport function resolveTiledMap(k: KAPLAYCtx, map: TiledMap): TiledMapData {\n if (typeof map !== 'string') {\n return map;\n }\n\n const asset = k.getAsset(map);\n\n if (!asset) {\n throw new Error(`Tiled map asset \"${map}\" is not loaded.`);\n }\n\n if (!asset.data) {\n throw new Error(`Tiled map asset \"${map}\" is not ready yet.`);\n }\n\n return asset.data as TiledMapData;\n}\n\nfunction getPropertyRecord(\n properties: TiledProperty[] | undefined,\n): Record<string, TiledPropertyValue> {\n const record: Record<string, TiledPropertyValue> = {};\n\n properties?.forEach((property) => {\n record[property.name] = property.value;\n });\n\n return record;\n}\n\nfunction isObjectLayer(layer: TiledLayer): layer is TiledObjectLayer {\n return layer.type === 'objectgroup';\n}\n\nfunction isTileLayer(layer: TiledLayer): layer is TiledTileLayer {\n return layer.type === 'tilelayer';\n}\n\nfunction normalizeTileLayer(layer: TiledTileLayer): ParsedTiledLayer {\n return {\n data: layer.data,\n height: layer.height,\n name: layer.name,\n opacity: layer.opacity ?? 1,\n type: 'tilelayer',\n visible: layer.visible ?? true,\n width: layer.width,\n x: layer.x ?? 0,\n y: layer.y ?? 0,\n zIndex: 0,\n };\n}\n\nfunction normalizeObjectLayer(layer: TiledObjectLayer): ParsedTiledObjectLayer {\n return {\n name: layer.name,\n objects: layer.objects,\n type: 'objectgroup',\n visible: layer.visible ?? true,\n zIndex: 0,\n };\n}\n\nexport function parseTileGid(rawGid: number): ParsedTileGid | null {\n if (rawGid === 0) {\n return null;\n }\n\n return {\n gid: (rawGid & ~FLIP_FLAGS) >>> 0,\n flip: {\n diagonal: (rawGid & FLIPPED_DIAGONALLY_FLAG) !== 0,\n horizontal: (rawGid & FLIPPED_HORIZONTALLY_FLAG) !== 0,\n vertical: (rawGid & FLIPPED_VERTICALLY_FLAG) !== 0,\n },\n };\n}\n\nfunction getTileDrawTransform(flip: ParsedTileGid['flip']): {\n angle: number;\n flipX: boolean;\n flipY: boolean;\n} {\n if (!flip.diagonal) {\n return {\n angle: 0,\n flipX: flip.horizontal,\n flipY: flip.vertical,\n };\n }\n\n if (flip.horizontal && flip.vertical) {\n return {\n angle: 270,\n flipX: true,\n flipY: false,\n };\n }\n\n if (flip.horizontal) {\n return {\n angle: 270,\n flipX: false,\n flipY: false,\n };\n }\n\n if (flip.vertical) {\n return {\n angle: 90,\n flipX: false,\n flipY: false,\n };\n }\n\n return {\n angle: 270,\n flipX: false,\n flipY: true,\n };\n}\n\nfunction getTileQuad(k: KAPLAYCtx, map: ParsedTiledMap, gid: number): Quad {\n const localTileId = gid - map.tileset.firstGid;\n const column = localTileId % map.tileset.columns;\n const row = Math.floor(localTileId / map.tileset.columns);\n const x =\n map.tileset.margin + column * (map.tileset.tileWidth + map.tileset.spacing);\n const y =\n map.tileset.margin + row * (map.tileset.tileHeight + map.tileset.spacing);\n\n return k.quad(\n x / map.tileset.imageWidth,\n y / map.tileset.imageHeight,\n map.tileset.tileWidth / map.tileset.imageWidth,\n map.tileset.tileHeight / map.tileset.imageHeight,\n );\n}\n\nexport function getLayerNames(options: TiledMapOpt): Set<string> | null {\n if (!options.layerNames?.length) {\n return null;\n }\n\n return new Set(options.layerNames);\n}\n\nfunction getParsedTile(\n map: ParsedTiledMap,\n gid: number,\n): ParsedTiledTile | undefined {\n return map.tileset.tiles[gid];\n}\n\nfunction matchesProperties(\n expected: Record<string, TiledPropertyValue> | undefined,\n actual: Record<string, TiledPropertyValue>,\n): boolean {\n if (!expected) {\n return true;\n }\n\n return Object.entries(expected).every(\n ([name, value]) => actual[name] === value,\n );\n}\n\nfunction matchesTileRule(\n match: TiledTileMatch,\n tile: TiledTileContext,\n): boolean {\n if (match.gid !== undefined && match.gid !== tile.gid) {\n return false;\n }\n\n if (match.tileId !== undefined && match.tileId !== tile.tileId) {\n return false;\n }\n\n if (match.layer !== undefined && match.layer !== tile.layer) {\n return false;\n }\n\n return matchesProperties(match.properties, tile.properties);\n}\n\nfunction matchesObjectRule(\n match: TiledObjectMatch,\n object: TiledObjectContext,\n): boolean {\n if (match.layer !== undefined && match.layer !== object.layer) {\n return false;\n }\n\n if (match.name !== undefined && match.name !== object.name) {\n return false;\n }\n\n if (match.type !== undefined && match.type !== object.type) {\n return false;\n }\n\n return matchesProperties(match.properties, object.properties);\n}\n\nexport function createLayerRenderer(\n k: KAPLAYCtx,\n layer: ParsedTiledTileLayer,\n map: ParsedTiledMap,\n sprite: string,\n): GameObj {\n return k.add([\n k.pos(0, 0),\n k.z(layer.zIndex),\n {\n draw: () => {\n layer.data.forEach((rawGid, index) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (!parsedGid) {\n return;\n }\n\n const column = index % layer.width;\n const row = Math.floor(index / layer.width);\n const drawTransform = getTileDrawTransform(parsedGid.flip);\n\n k.drawSprite({\n anchor: 'center',\n angle: drawTransform.angle,\n flipX: drawTransform.flipX,\n flipY: drawTransform.flipY,\n opacity: layer.opacity,\n pos: k.vec2(\n (column + layer.x) * map.tileWidth + map.tileset.tileWidth / 2,\n (row + layer.y) * map.tileHeight + map.tileset.tileHeight / 2,\n ),\n quad: getTileQuad(k, map, parsedGid.gid),\n sprite,\n });\n });\n },\n id: 'tiled-layer',\n },\n ] as CompList<TiledLayerComp>);\n}\n\nexport function createMatchedTileObjects(\n k: KAPLAYCtx,\n layer: ParsedTiledTileLayer,\n map: ParsedTiledMap,\n options: TiledMapOpt,\n): GameObj[] {\n const rules = options.tiles;\n\n if (!rules?.length) {\n return [];\n }\n\n const tiles: GameObj[] = [];\n\n layer.data.forEach((rawGid, index) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (!parsedGid) {\n return;\n }\n\n const parsedTile = getParsedTile(map, parsedGid.gid);\n const column = index % layer.width;\n const row = Math.floor(index / layer.width);\n const tile = {\n flip: parsedGid.flip,\n gid: parsedGid.gid,\n layer: layer.name,\n pos: {\n x: (column + layer.x) * map.tileWidth,\n y: (row + layer.y) * map.tileHeight,\n },\n properties: parsedTile?.properties ?? {},\n tileSize: {\n height: map.tileHeight,\n width: map.tileWidth,\n },\n tileId: parsedTile?.tileId ?? parsedGid.gid - map.tileset.firstGid,\n tilePos: {\n x: column + layer.x,\n y: row + layer.y,\n },\n };\n\n rules.forEach((rule) => {\n if (!matchesTileRule(rule.match, tile)) {\n return;\n }\n\n tiles.push(\n k.add([\n k.pos(tile.pos.x, tile.pos.y),\n k.anchor('topleft'),\n k.z(layer.zIndex),\n ...rule.comps(tile),\n ] as CompList<unknown>),\n );\n });\n });\n\n return tiles;\n}\n\nexport function createMatchedObjectObjects(\n k: KAPLAYCtx,\n layer: ParsedTiledObjectLayer,\n options: TiledMapOpt,\n): GameObj[] {\n const rules = options.objects;\n\n if (!rules?.length) {\n return [];\n }\n\n const objects: GameObj[] = [];\n\n if (!layer.visible) {\n return objects;\n }\n\n layer.objects.forEach((object) => {\n if (!object.visible) {\n return;\n }\n\n const context: TiledObjectContext = {\n id: object.id,\n layer: layer.name,\n name: object.name,\n objectSize: {\n height: object.height,\n width: object.width,\n },\n point: object.point ?? false,\n pos: {\n x: object.x,\n y: object.y,\n },\n properties: getPropertyRecord(object.properties),\n rotation: object.rotation,\n type: object.type,\n };\n\n rules.forEach((rule) => {\n if (!matchesObjectRule(rule.match, context)) {\n return;\n }\n\n objects.push(\n k.add([\n k.pos(context.pos.x, context.pos.y),\n k.anchor('topleft'),\n k.z(layer.zIndex),\n ...rule.comps(context),\n ] as CompList<unknown>),\n );\n });\n });\n\n return objects;\n}\n\nexport function parseTiledMap(data: TiledMapData): ParsedTiledMap {\n if (data.orientation !== 'orthogonal') {\n throw new Error(\n `Unsupported Tiled orientation \"${data.orientation}\". Expected \"orthogonal\".`,\n );\n }\n\n if (data.infinite) {\n throw new Error('Infinite Tiled maps are not supported.');\n }\n\n if (data.tilesets.length !== 1) {\n throw new Error('Exactly one Tiled tileset is required.');\n }\n\n const [tileset] = data.tilesets;\n\n if (tileset.columns <= 0) {\n throw new Error('Tiled tileset columns must be greater than 0.');\n }\n\n const layers = data.layers.map((layer, zIndex) => {\n if (isTileLayer(layer)) {\n if (layer.data.length !== layer.width * layer.height) {\n throw new Error(\n `Layer \"${layer.name}\" data length does not match its dimensions.`,\n );\n }\n\n return {\n ...normalizeTileLayer(layer),\n zIndex,\n };\n }\n\n if (isObjectLayer(layer)) {\n return {\n ...normalizeObjectLayer(layer),\n zIndex,\n };\n }\n\n throw new Error('Unsupported Tiled layer type.');\n });\n\n return {\n height: data.height,\n layers,\n orientation: 'orthogonal',\n tileHeight: data.tileheight,\n tileWidth: data.tilewidth,\n tileset: {\n columns: tileset.columns,\n firstGid: tileset.firstgid,\n image: tileset.image,\n imageHeight: tileset.imageheight,\n imageWidth: tileset.imagewidth,\n lastGid: tileset.firstgid + tileset.tilecount - 1,\n margin: tileset.margin ?? 0,\n name: tileset.name,\n spacing: tileset.spacing ?? 0,\n tileCount: tileset.tilecount,\n tileHeight: tileset.tileheight,\n tiles: Object.fromEntries(\n (tileset.tiles ?? []).map((tile) => [\n tile.id + tileset.firstgid,\n {\n gid: tile.id + tileset.firstgid,\n properties: getPropertyRecord(tile.properties),\n tileId: tile.id,\n },\n ]),\n ),\n tileWidth: tileset.tilewidth,\n },\n width: data.width,\n };\n}\n","import type { KAPLAYCtx } from 'kaplay';\n\nimport type { TiledMap, TiledMapOpt } from './types';\nimport {\n createLayerRenderer,\n createMatchedObjectObjects,\n createMatchedTileObjects,\n getLayerNames,\n parseTiledMap,\n parseTileGid,\n resolveTiledMap,\n} from './utils';\n\nexport type { TiledMap, TiledMapOpt } from './types';\n\ndeclare module 'kaplay' {\n interface KAPLAYCtx {\n addTiledMap: (map: TiledMap, options: TiledMapOpt) => void;\n }\n}\n\n/**\n * Add a Tiled map to the current KAPLAY context.\n *\n * The `map` argument can either be:\n * - parsed map JSON, or\n * - the asset key of a map loaded with `loadJSON()`.\n *\n * @param k - The active KAPLAY context.\n * @param map - The Tiled map data.\n * @param opt - The Tiled map options.\n */\nfunction addTiledMap(k: KAPLAYCtx, map: TiledMap, opt: TiledMapOpt): void {\n const parsedMap = parseTiledMap(resolveTiledMap(k, map));\n const allowedLayerNames = getLayerNames(opt);\n\n parsedMap.layers.forEach((layer) => {\n if (!layer.visible) {\n return;\n }\n\n if (allowedLayerNames && !allowedLayerNames.has(layer.name)) {\n return;\n }\n\n if (layer.type === 'tilelayer') {\n layer.data.forEach((rawGid) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (\n parsedGid &&\n (parsedGid.gid < parsedMap.tileset.firstGid ||\n parsedGid.gid > parsedMap.tileset.lastGid)\n ) {\n throw new Error(\n `Tile gid ${String(rawGid)} is outside the supported tileset range.`,\n );\n }\n });\n\n createLayerRenderer(k, layer, parsedMap, opt.sprite);\n createMatchedTileObjects(k, layer, parsedMap, opt);\n return;\n }\n\n createMatchedObjectObjects(k, layer, opt);\n });\n}\n\n/**\n * KAPLAY plugin that adds `addTiledMap()` to the context.\n *\n * @param k - The active KAPLAY context.\n * @returns - The plugin API.\n */\nexport function tiledPlugin(k: KAPLAYCtx) {\n return {\n addTiledMap(map: TiledMap, options: TiledMapOpt) {\n addTiledMap(k, map, options);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.mjs","names":[],"sources":["../src/utils.ts","../src/plugin.ts"],"sourcesContent":["import type { CompList, GameObj, KAPLAYCtx, Quad } from 'kaplay';\n\nimport type {\n ParsedTiledLayer,\n ParsedTiledMap,\n ParsedTiledObjectLayer,\n ParsedTiledTile,\n ParsedTiledTileLayer,\n TiledLayer,\n TiledLayerComp,\n TiledMap,\n TiledMapData,\n TiledMapOpt,\n TiledObjectContext,\n TiledObjectLayer,\n TiledObjectMatch,\n TiledProperty,\n TiledPropertyValue,\n TiledTileContext,\n TiledTileLayer,\n TiledTileMatch,\n} from './types';\n\nconst FLIPPED_HORIZONTALLY_FLAG = 0x80000000;\nconst FLIPPED_VERTICALLY_FLAG = 0x40000000;\nconst FLIPPED_DIAGONALLY_FLAG = 0x20000000;\nconst FLIP_FLAGS =\n FLIPPED_HORIZONTALLY_FLAG | FLIPPED_VERTICALLY_FLAG | FLIPPED_DIAGONALLY_FLAG;\n\ninterface ParsedTileGid {\n gid: number;\n flip: {\n diagonal: boolean;\n horizontal: boolean;\n vertical: boolean;\n };\n}\n\nexport function resolveTiledMap(k: KAPLAYCtx, map: TiledMap): TiledMapData {\n if (typeof map !== 'string') {\n return map;\n }\n\n const asset = k.getAsset(map);\n\n if (!asset) {\n throw new Error(`Tiled map asset \"${map}\" is not loaded.`);\n }\n\n if (!asset.data) {\n throw new Error(`Tiled map asset \"${map}\" is not ready yet.`);\n }\n\n return asset.data as TiledMapData;\n}\n\nfunction getPropertyRecord(\n properties: TiledProperty[] | undefined,\n): Record<string, TiledPropertyValue> {\n const record: Record<string, TiledPropertyValue> = {};\n\n properties?.forEach((property) => {\n record[property.name] = property.value;\n });\n\n return record;\n}\n\nfunction isObjectLayer(layer: TiledLayer): layer is TiledObjectLayer {\n return layer.type === 'objectgroup';\n}\n\nfunction isTileLayer(layer: TiledLayer): layer is TiledTileLayer {\n return layer.type === 'tilelayer';\n}\n\nfunction normalizeTileLayer(layer: TiledTileLayer): ParsedTiledLayer {\n return {\n data: layer.data,\n height: layer.height,\n name: layer.name,\n opacity: layer.opacity ?? 1,\n type: 'tilelayer',\n visible: layer.visible ?? true,\n width: layer.width,\n x: layer.x ?? 0,\n y: layer.y ?? 0,\n zIndex: 0,\n };\n}\n\nfunction normalizeObjectLayer(layer: TiledObjectLayer): ParsedTiledObjectLayer {\n return {\n name: layer.name,\n objects: layer.objects,\n type: 'objectgroup',\n visible: layer.visible ?? true,\n zIndex: 0,\n };\n}\n\nexport function parseTileGid(rawGid: number): ParsedTileGid | null {\n if (rawGid === 0) {\n return null;\n }\n\n return {\n gid: (rawGid & ~FLIP_FLAGS) >>> 0,\n flip: {\n diagonal: (rawGid & FLIPPED_DIAGONALLY_FLAG) !== 0,\n horizontal: (rawGid & FLIPPED_HORIZONTALLY_FLAG) !== 0,\n vertical: (rawGid & FLIPPED_VERTICALLY_FLAG) !== 0,\n },\n };\n}\n\nfunction getTileDrawTransform(flip: ParsedTileGid['flip']): {\n angle: number;\n flipX: boolean;\n flipY: boolean;\n} {\n if (!flip.diagonal) {\n return {\n angle: 0,\n flipX: flip.horizontal,\n flipY: flip.vertical,\n };\n }\n\n if (flip.horizontal && flip.vertical) {\n return {\n angle: 270,\n flipX: true,\n flipY: false,\n };\n }\n\n if (flip.horizontal) {\n return {\n angle: 270,\n flipX: false,\n flipY: false,\n };\n }\n\n if (flip.vertical) {\n return {\n angle: 90,\n flipX: false,\n flipY: false,\n };\n }\n\n return {\n angle: 270,\n flipX: false,\n flipY: true,\n };\n}\n\nfunction getTileQuad(k: KAPLAYCtx, map: ParsedTiledMap, gid: number): Quad {\n const localTileId = gid - map.tileset.firstGid;\n const column = localTileId % map.tileset.columns;\n const row = Math.floor(localTileId / map.tileset.columns);\n const x =\n map.tileset.margin + column * (map.tileset.tileWidth + map.tileset.spacing);\n const y =\n map.tileset.margin + row * (map.tileset.tileHeight + map.tileset.spacing);\n\n return k.quad(\n x / map.tileset.imageWidth,\n y / map.tileset.imageHeight,\n map.tileset.tileWidth / map.tileset.imageWidth,\n map.tileset.tileHeight / map.tileset.imageHeight,\n );\n}\n\nexport function getLayerNames(options: TiledMapOpt): Set<string> | null {\n if (!options.layerNames?.length) {\n return null;\n }\n\n return new Set(options.layerNames);\n}\n\nfunction getParsedTile(\n map: ParsedTiledMap,\n gid: number,\n): ParsedTiledTile | undefined {\n return map.tileset.tiles[gid];\n}\n\nfunction matchesProperties(\n expected: Record<string, TiledPropertyValue> | undefined,\n actual: Record<string, TiledPropertyValue>,\n): boolean {\n if (!expected) {\n return true;\n }\n\n return Object.entries(expected).every(\n ([name, value]) => actual[name] === value,\n );\n}\n\nfunction matchesTileRule(\n match: TiledTileMatch,\n tile: TiledTileContext,\n): boolean {\n if (match.gid !== undefined && match.gid !== tile.gid) {\n return false;\n }\n\n if (match.tileId !== undefined && match.tileId !== tile.tileId) {\n return false;\n }\n\n if (match.layer !== undefined && match.layer !== tile.layer) {\n return false;\n }\n\n return matchesProperties(match.properties, tile.properties);\n}\n\nfunction matchesObjectRule(\n match: TiledObjectMatch,\n object: TiledObjectContext,\n): boolean {\n if (match.layer !== undefined && match.layer !== object.layer) {\n return false;\n }\n\n if (match.name !== undefined && match.name !== object.name) {\n return false;\n }\n\n if (match.type !== undefined && match.type !== object.type) {\n return false;\n }\n\n return matchesProperties(match.properties, object.properties);\n}\n\nexport function createLayerRenderer(\n k: KAPLAYCtx,\n layer: ParsedTiledTileLayer,\n map: ParsedTiledMap,\n sprite: string,\n): GameObj {\n return k.add([\n k.pos(0, 0),\n k.z(layer.zIndex),\n {\n draw: () => {\n layer.data.forEach((rawGid, index) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (!parsedGid) {\n return;\n }\n\n const column = index % layer.width;\n const row = Math.floor(index / layer.width);\n const drawTransform = getTileDrawTransform(parsedGid.flip);\n\n k.drawSprite({\n anchor: 'center',\n angle: drawTransform.angle,\n flipX: drawTransform.flipX,\n flipY: drawTransform.flipY,\n opacity: layer.opacity,\n pos: k.vec2(\n (column + layer.x) * map.tileWidth + map.tileset.tileWidth / 2,\n (row + layer.y) * map.tileHeight + map.tileset.tileHeight / 2,\n ),\n quad: getTileQuad(k, map, parsedGid.gid),\n sprite,\n });\n });\n },\n id: 'tiled-layer',\n },\n ] as CompList<TiledLayerComp>);\n}\n\nexport function createMatchedTileObjects(\n k: KAPLAYCtx,\n layer: ParsedTiledTileLayer,\n map: ParsedTiledMap,\n options: TiledMapOpt,\n): GameObj[] {\n const rules = options.tiles;\n\n if (!rules?.length) {\n return [];\n }\n\n const tiles: GameObj[] = [];\n\n layer.data.forEach((rawGid, index) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (!parsedGid) {\n return;\n }\n\n const parsedTile = getParsedTile(map, parsedGid.gid);\n const column = index % layer.width;\n const row = Math.floor(index / layer.width);\n const tile = {\n flip: parsedGid.flip,\n gid: parsedGid.gid,\n height: map.tileHeight,\n layer: layer.name,\n tileHeight: map.tileHeight,\n tileWidth: map.tileWidth,\n tileX: column + layer.x,\n tileY: row + layer.y,\n width: map.tileWidth,\n x: (column + layer.x) * map.tileWidth,\n y: (row + layer.y) * map.tileHeight,\n properties: parsedTile?.properties ?? {},\n tileId: parsedTile?.tileId ?? parsedGid.gid - map.tileset.firstGid,\n };\n\n rules.forEach((rule) => {\n if (!matchesTileRule(rule.match, tile)) {\n return;\n }\n\n tiles.push(\n k.add([\n k.pos(tile.x, tile.y),\n k.anchor('topleft'),\n k.z(layer.zIndex),\n ...rule.comps(tile),\n ] as CompList<unknown>),\n );\n });\n });\n\n return tiles;\n}\n\nexport function createMatchedObjectObjects(\n k: KAPLAYCtx,\n layer: ParsedTiledObjectLayer,\n options: TiledMapOpt,\n): GameObj[] {\n const rules = options.objects;\n\n if (!rules?.length) {\n return [];\n }\n\n const objects: GameObj[] = [];\n\n if (!layer.visible) {\n return objects;\n }\n\n layer.objects.forEach((object) => {\n if (!object.visible) {\n return;\n }\n\n const context: TiledObjectContext = {\n height: object.height,\n id: object.id,\n layer: layer.name,\n name: object.name,\n width: object.width,\n x: object.x,\n y: object.y,\n point: object.point ?? false,\n properties: getPropertyRecord(object.properties),\n rotation: object.rotation,\n type: object.type,\n };\n\n rules.forEach((rule) => {\n if (!matchesObjectRule(rule.match, context)) {\n return;\n }\n\n objects.push(\n k.add([\n k.pos(context.x, context.y),\n k.anchor('topleft'),\n k.z(layer.zIndex),\n ...rule.comps(context),\n ] as CompList<unknown>),\n );\n });\n });\n\n return objects;\n}\n\nexport function parseTiledMap(data: TiledMapData): ParsedTiledMap {\n if (data.orientation !== 'orthogonal') {\n throw new Error(\n `Unsupported Tiled orientation \"${data.orientation}\". Expected \"orthogonal\".`,\n );\n }\n\n if (data.infinite) {\n throw new Error('Infinite Tiled maps are not supported.');\n }\n\n if (data.tilesets.length !== 1) {\n throw new Error('Exactly one Tiled tileset is required.');\n }\n\n const [tileset] = data.tilesets;\n\n if (tileset.columns <= 0) {\n throw new Error('Tiled tileset columns must be greater than 0.');\n }\n\n const layers = data.layers.map((layer, zIndex) => {\n if (isTileLayer(layer)) {\n if (layer.data.length !== layer.width * layer.height) {\n throw new Error(\n `Layer \"${layer.name}\" data length does not match its dimensions.`,\n );\n }\n\n return {\n ...normalizeTileLayer(layer),\n zIndex,\n };\n }\n\n if (isObjectLayer(layer)) {\n return {\n ...normalizeObjectLayer(layer),\n zIndex,\n };\n }\n\n throw new Error('Unsupported Tiled layer type.');\n });\n\n return {\n height: data.height,\n layers,\n orientation: 'orthogonal',\n tileHeight: data.tileheight,\n tileWidth: data.tilewidth,\n tileset: {\n columns: tileset.columns,\n firstGid: tileset.firstgid,\n image: tileset.image,\n imageHeight: tileset.imageheight,\n imageWidth: tileset.imagewidth,\n lastGid: tileset.firstgid + tileset.tilecount - 1,\n margin: tileset.margin ?? 0,\n name: tileset.name,\n spacing: tileset.spacing ?? 0,\n tileCount: tileset.tilecount,\n tileHeight: tileset.tileheight,\n tiles: Object.fromEntries(\n (tileset.tiles ?? []).map((tile) => [\n tile.id + tileset.firstgid,\n {\n gid: tile.id + tileset.firstgid,\n properties: getPropertyRecord(tile.properties),\n tileId: tile.id,\n },\n ]),\n ),\n tileWidth: tileset.tilewidth,\n },\n width: data.width,\n };\n}\n","import type { KAPLAYCtx } from 'kaplay';\n\nimport type { AddTiledMap, TiledMap, TiledMapOpt } from './types';\nimport {\n createLayerRenderer,\n createMatchedObjectObjects,\n createMatchedTileObjects,\n getLayerNames,\n parseTiledMap,\n parseTileGid,\n resolveTiledMap,\n} from './utils';\n\nexport type { AddTiledMap, TiledMap, TiledMapOpt } from './types';\n\ndeclare module 'kaplay' {\n interface KAPLAYCtx {\n addTiledMap: (map: TiledMap, options: TiledMapOpt) => void;\n }\n}\n\n/**\n * Add a Tiled map to the current KAPLAY context.\n *\n * The `map` argument can either be:\n * - parsed map JSON, or\n * - the asset key of a map loaded with `loadJSON()`.\n *\n * @param k - The active KAPLAY context.\n * @param map - The Tiled map data.\n * @param opt - The Tiled map options.\n */\nfunction addTiledMap(k: KAPLAYCtx, map: TiledMap, opt: TiledMapOpt): void {\n const parsedMap = parseTiledMap(resolveTiledMap(k, map));\n const allowedLayerNames = getLayerNames(opt);\n\n parsedMap.layers.forEach((layer) => {\n if (!layer.visible) {\n return;\n }\n\n if (allowedLayerNames && !allowedLayerNames.has(layer.name)) {\n return;\n }\n\n if (layer.type === 'tilelayer') {\n layer.data.forEach((rawGid) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (\n parsedGid &&\n (parsedGid.gid < parsedMap.tileset.firstGid ||\n parsedGid.gid > parsedMap.tileset.lastGid)\n ) {\n throw new Error(\n `Tile gid ${String(rawGid)} is outside the supported tileset range.`,\n );\n }\n });\n\n createLayerRenderer(k, layer, parsedMap, opt.sprite);\n createMatchedTileObjects(k, layer, parsedMap, opt);\n return;\n }\n\n createMatchedObjectObjects(k, layer, opt);\n });\n}\n\n/**\n * KAPLAY plugin that adds `addTiledMap()` to the context.\n *\n * @param k - The active KAPLAY context.\n * @returns - The plugin API.\n */\nexport function tiledPlugin(k: KAPLAYCtx) {\n const boundAddTiledMap: AddTiledMap = (map, options) => {\n addTiledMap(k, map, options);\n };\n\n return { addTiledMap: boundAddTiledMap };\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.KaplayPluginTiled={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=2147483648,n=1073741824,r=536870912,i=n|-1610612736;function a(e,t){if(typeof t!=`string`)return t;let n=e.getAsset(t);if(!n)throw Error(`Tiled map asset "${t}" is not loaded.`);if(!n.data)throw Error(`Tiled map asset "${t}" is not ready yet.`);return n.data}function o(e){let t={};return e?.forEach(e=>{t[e.name]=e.value}),t}function s(e){return e.type===`objectgroup`}function c(e){return e.type===`tilelayer`}function l(e){return{data:e.data,height:e.height,name:e.name,opacity:e.opacity??1,type:`tilelayer`,visible:e.visible??!0,width:e.width,x:e.x??0,y:e.y??0,zIndex:0}}function u(e){return{name:e.name,objects:e.objects,type:`objectgroup`,visible:e.visible??!0,zIndex:0}}function d(e){return e===0?null:{gid:(e&~i)>>>0,flip:{diagonal:(e&r)!==0,horizontal:(e&t)!==0,vertical:(e&n)!==0}}}function f(e){return e.diagonal?e.horizontal&&e.vertical?{angle:270,flipX:!0,flipY:!1}:e.horizontal?{angle:270,flipX:!1,flipY:!1}:e.vertical?{angle:90,flipX:!1,flipY:!1}:{angle:270,flipX:!1,flipY:!0}:{angle:0,flipX:e.horizontal,flipY:e.vertical}}function p(e,t,n){let r=n-t.tileset.firstGid,i=r%t.tileset.columns,a=Math.floor(r/t.tileset.columns),o=t.tileset.margin+i*(t.tileset.tileWidth+t.tileset.spacing),s=t.tileset.margin+a*(t.tileset.tileHeight+t.tileset.spacing);return e.quad(o/t.tileset.imageWidth,s/t.tileset.imageHeight,t.tileset.tileWidth/t.tileset.imageWidth,t.tileset.tileHeight/t.tileset.imageHeight)}function m(e){return e.layerNames?.length?new Set(e.layerNames):null}function h(e,t){return e.tileset.tiles[t]}function g(e,t){return e?Object.entries(e).every(([e,n])=>t[e]===n):!0}function _(e,t){return e.gid!==void 0&&e.gid!==t.gid||e.tileId!==void 0&&e.tileId!==t.tileId||e.layer!==void 0&&e.layer!==t.layer?!1:g(e.properties,t.properties)}function v(e,t){return e.layer!==void 0&&e.layer!==t.layer||e.name!==void 0&&e.name!==t.name||e.type!==void 0&&e.type!==t.type?!1:g(e.properties,t.properties)}function y(e,t,n,r){return e.add([e.pos(0,0),e.z(t.zIndex),{draw:()=>{t.data.forEach((i,a)=>{let o=d(i);if(!o)return;let s=a%t.width,c=Math.floor(a/t.width),l=f(o.flip);e.drawSprite({anchor:`center`,angle:l.angle,flipX:l.flipX,flipY:l.flipY,opacity:t.opacity,pos:e.vec2((s+t.x)*n.tileWidth+n.tileset.tileWidth/2,(c+t.y)*n.tileHeight+n.tileset.tileHeight/2),quad:p(e,n,o.gid),sprite:r})})},id:`tiled-layer`}])}function b(e,t,n,r){let i=r.tiles;if(!i?.length)return[];let a=[];return t.data.forEach((r,o)=>{let s=d(r);if(!s)return;let c=h(n,s.gid),l=o%t.width,u=Math.floor(o/t.width),f={flip:s.flip,gid:s.gid,layer:t.name,pos:{x:(l+t.x)*n.tileWidth,y:(u+t.y)*n.tileHeight},properties:c?.properties??{},tileSize:{height:n.tileHeight,width:n.tileWidth},tileId:c?.tileId??s.gid-n.tileset.firstGid,tilePos:{x:l+t.x,y:u+t.y}};i.forEach(n=>{_(n.match,f)&&a.push(e.add([e.pos(f.pos.x,f.pos.y),e.anchor(`topleft`),e.z(t.zIndex),...n.comps(f)]))})}),a}function x(e,t,n){let r=n.objects;if(!r?.length)return[];let i=[];return t.visible&&t.objects.forEach(n=>{if(!n.visible)return;let a={id:n.id,layer:t.name,name:n.name,objectSize:{height:n.height,width:n.width},point:n.point??!1,pos:{x:n.x,y:n.y},properties:o(n.properties),rotation:n.rotation,type:n.type};r.forEach(n=>{v(n.match,a)&&i.push(e.add([e.pos(a.pos.x,a.pos.y),e.anchor(`topleft`),e.z(t.zIndex),...n.comps(a)]))})}),i}function S(e){if(e.orientation!==`orthogonal`)throw Error(`Unsupported Tiled orientation "${e.orientation}". Expected "orthogonal".`);if(e.infinite)throw Error(`Infinite Tiled maps are not supported.`);if(e.tilesets.length!==1)throw Error(`Exactly one Tiled tileset is required.`);let[t]=e.tilesets;if(t.columns<=0)throw Error(`Tiled tileset columns must be greater than 0.`);let n=e.layers.map((e,t)=>{if(c(e)){if(e.data.length!==e.width*e.height)throw Error(`Layer "${e.name}" data length does not match its dimensions.`);return{...l(e),zIndex:t}}if(s(e))return{...u(e),zIndex:t};throw Error(`Unsupported Tiled layer type.`)});return{height:e.height,layers:n,orientation:`orthogonal`,tileHeight:e.tileheight,tileWidth:e.tilewidth,tileset:{columns:t.columns,firstGid:t.firstgid,image:t.image,imageHeight:t.imageheight,imageWidth:t.imagewidth,lastGid:t.firstgid+t.tilecount-1,margin:t.margin??0,name:t.name,spacing:t.spacing??0,tileCount:t.tilecount,tileHeight:t.tileheight,tiles:Object.fromEntries((t.tiles??[]).map(e=>[e.id+t.firstgid,{gid:e.id+t.firstgid,properties:o(e.properties),tileId:e.id}])),tileWidth:t.tilewidth},width:e.width}}function C(e,t,n){let r=S(a(e,t)),i=m(n);r.layers.forEach(t=>{if(t.visible&&!(i&&!i.has(t.name))){if(t.type===`tilelayer`){t.data.forEach(e=>{let t=d(e);if(t&&(t.gid<r.tileset.firstGid||t.gid>r.tileset.lastGid))throw Error(`Tile gid ${String(e)} is outside the supported tileset range.`)}),y(e,t,r,n.sprite),b(e,t,r,n);return}x(e,t,n)}})}function w(e){return{addTiledMap(t,n){C(e,t,n)}}}e.tiledPlugin=w});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.KaplayPluginTiled={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=2147483648,n=1073741824,r=536870912,i=n|-1610612736;function a(e,t){if(typeof t!=`string`)return t;let n=e.getAsset(t);if(!n)throw Error(`Tiled map asset "${t}" is not loaded.`);if(!n.data)throw Error(`Tiled map asset "${t}" is not ready yet.`);return n.data}function o(e){let t={};return e?.forEach(e=>{t[e.name]=e.value}),t}function s(e){return e.type===`objectgroup`}function c(e){return e.type===`tilelayer`}function l(e){return{data:e.data,height:e.height,name:e.name,opacity:e.opacity??1,type:`tilelayer`,visible:e.visible??!0,width:e.width,x:e.x??0,y:e.y??0,zIndex:0}}function u(e){return{name:e.name,objects:e.objects,type:`objectgroup`,visible:e.visible??!0,zIndex:0}}function d(e){return e===0?null:{gid:(e&~i)>>>0,flip:{diagonal:(e&r)!==0,horizontal:(e&t)!==0,vertical:(e&n)!==0}}}function f(e){return e.diagonal?e.horizontal&&e.vertical?{angle:270,flipX:!0,flipY:!1}:e.horizontal?{angle:270,flipX:!1,flipY:!1}:e.vertical?{angle:90,flipX:!1,flipY:!1}:{angle:270,flipX:!1,flipY:!0}:{angle:0,flipX:e.horizontal,flipY:e.vertical}}function p(e,t,n){let r=n-t.tileset.firstGid,i=r%t.tileset.columns,a=Math.floor(r/t.tileset.columns),o=t.tileset.margin+i*(t.tileset.tileWidth+t.tileset.spacing),s=t.tileset.margin+a*(t.tileset.tileHeight+t.tileset.spacing);return e.quad(o/t.tileset.imageWidth,s/t.tileset.imageHeight,t.tileset.tileWidth/t.tileset.imageWidth,t.tileset.tileHeight/t.tileset.imageHeight)}function m(e){return e.layerNames?.length?new Set(e.layerNames):null}function h(e,t){return e.tileset.tiles[t]}function g(e,t){return e?Object.entries(e).every(([e,n])=>t[e]===n):!0}function _(e,t){return e.gid!==void 0&&e.gid!==t.gid||e.tileId!==void 0&&e.tileId!==t.tileId||e.layer!==void 0&&e.layer!==t.layer?!1:g(e.properties,t.properties)}function v(e,t){return e.layer!==void 0&&e.layer!==t.layer||e.name!==void 0&&e.name!==t.name||e.type!==void 0&&e.type!==t.type?!1:g(e.properties,t.properties)}function y(e,t,n,r){return e.add([e.pos(0,0),e.z(t.zIndex),{draw:()=>{t.data.forEach((i,a)=>{let o=d(i);if(!o)return;let s=a%t.width,c=Math.floor(a/t.width),l=f(o.flip);e.drawSprite({anchor:`center`,angle:l.angle,flipX:l.flipX,flipY:l.flipY,opacity:t.opacity,pos:e.vec2((s+t.x)*n.tileWidth+n.tileset.tileWidth/2,(c+t.y)*n.tileHeight+n.tileset.tileHeight/2),quad:p(e,n,o.gid),sprite:r})})},id:`tiled-layer`}])}function b(e,t,n,r){let i=r.tiles;if(!i?.length)return[];let a=[];return t.data.forEach((r,o)=>{let s=d(r);if(!s)return;let c=h(n,s.gid),l=o%t.width,u=Math.floor(o/t.width),f={flip:s.flip,gid:s.gid,height:n.tileHeight,layer:t.name,tileHeight:n.tileHeight,tileWidth:n.tileWidth,tileX:l+t.x,tileY:u+t.y,width:n.tileWidth,x:(l+t.x)*n.tileWidth,y:(u+t.y)*n.tileHeight,properties:c?.properties??{},tileId:c?.tileId??s.gid-n.tileset.firstGid};i.forEach(n=>{_(n.match,f)&&a.push(e.add([e.pos(f.x,f.y),e.anchor(`topleft`),e.z(t.zIndex),...n.comps(f)]))})}),a}function x(e,t,n){let r=n.objects;if(!r?.length)return[];let i=[];return t.visible&&t.objects.forEach(n=>{if(!n.visible)return;let a={height:n.height,id:n.id,layer:t.name,name:n.name,width:n.width,x:n.x,y:n.y,point:n.point??!1,properties:o(n.properties),rotation:n.rotation,type:n.type};r.forEach(n=>{v(n.match,a)&&i.push(e.add([e.pos(a.x,a.y),e.anchor(`topleft`),e.z(t.zIndex),...n.comps(a)]))})}),i}function S(e){if(e.orientation!==`orthogonal`)throw Error(`Unsupported Tiled orientation "${e.orientation}". Expected "orthogonal".`);if(e.infinite)throw Error(`Infinite Tiled maps are not supported.`);if(e.tilesets.length!==1)throw Error(`Exactly one Tiled tileset is required.`);let[t]=e.tilesets;if(t.columns<=0)throw Error(`Tiled tileset columns must be greater than 0.`);let n=e.layers.map((e,t)=>{if(c(e)){if(e.data.length!==e.width*e.height)throw Error(`Layer "${e.name}" data length does not match its dimensions.`);return{...l(e),zIndex:t}}if(s(e))return{...u(e),zIndex:t};throw Error(`Unsupported Tiled layer type.`)});return{height:e.height,layers:n,orientation:`orthogonal`,tileHeight:e.tileheight,tileWidth:e.tilewidth,tileset:{columns:t.columns,firstGid:t.firstgid,image:t.image,imageHeight:t.imageheight,imageWidth:t.imagewidth,lastGid:t.firstgid+t.tilecount-1,margin:t.margin??0,name:t.name,spacing:t.spacing??0,tileCount:t.tilecount,tileHeight:t.tileheight,tiles:Object.fromEntries((t.tiles??[]).map(e=>[e.id+t.firstgid,{gid:e.id+t.firstgid,properties:o(e.properties),tileId:e.id}])),tileWidth:t.tilewidth},width:e.width}}function C(e,t,n){let r=S(a(e,t)),i=m(n);r.layers.forEach(t=>{if(t.visible&&!(i&&!i.has(t.name))){if(t.type===`tilelayer`){t.data.forEach(e=>{let t=d(e);if(t&&(t.gid<r.tileset.firstGid||t.gid>r.tileset.lastGid))throw Error(`Tile gid ${String(e)} is outside the supported tileset range.`)}),y(e,t,r,n.sprite),b(e,t,r,n);return}x(e,t,n)}})}function w(e){return{addTiledMap:(t,n)=>{C(e,t,n)}}}e.tiledPlugin=w});
2
2
  //# sourceMappingURL=plugin.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.umd.js","names":[],"sources":["../src/utils.ts","../src/plugin.ts"],"sourcesContent":["import type { CompList, GameObj, KAPLAYCtx, Quad } from 'kaplay';\n\nimport type {\n ParsedTiledLayer,\n ParsedTiledMap,\n ParsedTiledObjectLayer,\n ParsedTiledTile,\n ParsedTiledTileLayer,\n TiledLayer,\n TiledLayerComp,\n TiledMap,\n TiledMapData,\n TiledMapOpt,\n TiledObjectContext,\n TiledObjectLayer,\n TiledObjectMatch,\n TiledProperty,\n TiledPropertyValue,\n TiledTileContext,\n TiledTileLayer,\n TiledTileMatch,\n} from './types';\n\nconst FLIPPED_HORIZONTALLY_FLAG = 0x80000000;\nconst FLIPPED_VERTICALLY_FLAG = 0x40000000;\nconst FLIPPED_DIAGONALLY_FLAG = 0x20000000;\nconst FLIP_FLAGS =\n FLIPPED_HORIZONTALLY_FLAG | FLIPPED_VERTICALLY_FLAG | FLIPPED_DIAGONALLY_FLAG;\n\ninterface ParsedTileGid {\n gid: number;\n flip: {\n diagonal: boolean;\n horizontal: boolean;\n vertical: boolean;\n };\n}\n\nexport function resolveTiledMap(k: KAPLAYCtx, map: TiledMap): TiledMapData {\n if (typeof map !== 'string') {\n return map;\n }\n\n const asset = k.getAsset(map);\n\n if (!asset) {\n throw new Error(`Tiled map asset \"${map}\" is not loaded.`);\n }\n\n if (!asset.data) {\n throw new Error(`Tiled map asset \"${map}\" is not ready yet.`);\n }\n\n return asset.data as TiledMapData;\n}\n\nfunction getPropertyRecord(\n properties: TiledProperty[] | undefined,\n): Record<string, TiledPropertyValue> {\n const record: Record<string, TiledPropertyValue> = {};\n\n properties?.forEach((property) => {\n record[property.name] = property.value;\n });\n\n return record;\n}\n\nfunction isObjectLayer(layer: TiledLayer): layer is TiledObjectLayer {\n return layer.type === 'objectgroup';\n}\n\nfunction isTileLayer(layer: TiledLayer): layer is TiledTileLayer {\n return layer.type === 'tilelayer';\n}\n\nfunction normalizeTileLayer(layer: TiledTileLayer): ParsedTiledLayer {\n return {\n data: layer.data,\n height: layer.height,\n name: layer.name,\n opacity: layer.opacity ?? 1,\n type: 'tilelayer',\n visible: layer.visible ?? true,\n width: layer.width,\n x: layer.x ?? 0,\n y: layer.y ?? 0,\n zIndex: 0,\n };\n}\n\nfunction normalizeObjectLayer(layer: TiledObjectLayer): ParsedTiledObjectLayer {\n return {\n name: layer.name,\n objects: layer.objects,\n type: 'objectgroup',\n visible: layer.visible ?? true,\n zIndex: 0,\n };\n}\n\nexport function parseTileGid(rawGid: number): ParsedTileGid | null {\n if (rawGid === 0) {\n return null;\n }\n\n return {\n gid: (rawGid & ~FLIP_FLAGS) >>> 0,\n flip: {\n diagonal: (rawGid & FLIPPED_DIAGONALLY_FLAG) !== 0,\n horizontal: (rawGid & FLIPPED_HORIZONTALLY_FLAG) !== 0,\n vertical: (rawGid & FLIPPED_VERTICALLY_FLAG) !== 0,\n },\n };\n}\n\nfunction getTileDrawTransform(flip: ParsedTileGid['flip']): {\n angle: number;\n flipX: boolean;\n flipY: boolean;\n} {\n if (!flip.diagonal) {\n return {\n angle: 0,\n flipX: flip.horizontal,\n flipY: flip.vertical,\n };\n }\n\n if (flip.horizontal && flip.vertical) {\n return {\n angle: 270,\n flipX: true,\n flipY: false,\n };\n }\n\n if (flip.horizontal) {\n return {\n angle: 270,\n flipX: false,\n flipY: false,\n };\n }\n\n if (flip.vertical) {\n return {\n angle: 90,\n flipX: false,\n flipY: false,\n };\n }\n\n return {\n angle: 270,\n flipX: false,\n flipY: true,\n };\n}\n\nfunction getTileQuad(k: KAPLAYCtx, map: ParsedTiledMap, gid: number): Quad {\n const localTileId = gid - map.tileset.firstGid;\n const column = localTileId % map.tileset.columns;\n const row = Math.floor(localTileId / map.tileset.columns);\n const x =\n map.tileset.margin + column * (map.tileset.tileWidth + map.tileset.spacing);\n const y =\n map.tileset.margin + row * (map.tileset.tileHeight + map.tileset.spacing);\n\n return k.quad(\n x / map.tileset.imageWidth,\n y / map.tileset.imageHeight,\n map.tileset.tileWidth / map.tileset.imageWidth,\n map.tileset.tileHeight / map.tileset.imageHeight,\n );\n}\n\nexport function getLayerNames(options: TiledMapOpt): Set<string> | null {\n if (!options.layerNames?.length) {\n return null;\n }\n\n return new Set(options.layerNames);\n}\n\nfunction getParsedTile(\n map: ParsedTiledMap,\n gid: number,\n): ParsedTiledTile | undefined {\n return map.tileset.tiles[gid];\n}\n\nfunction matchesProperties(\n expected: Record<string, TiledPropertyValue> | undefined,\n actual: Record<string, TiledPropertyValue>,\n): boolean {\n if (!expected) {\n return true;\n }\n\n return Object.entries(expected).every(\n ([name, value]) => actual[name] === value,\n );\n}\n\nfunction matchesTileRule(\n match: TiledTileMatch,\n tile: TiledTileContext,\n): boolean {\n if (match.gid !== undefined && match.gid !== tile.gid) {\n return false;\n }\n\n if (match.tileId !== undefined && match.tileId !== tile.tileId) {\n return false;\n }\n\n if (match.layer !== undefined && match.layer !== tile.layer) {\n return false;\n }\n\n return matchesProperties(match.properties, tile.properties);\n}\n\nfunction matchesObjectRule(\n match: TiledObjectMatch,\n object: TiledObjectContext,\n): boolean {\n if (match.layer !== undefined && match.layer !== object.layer) {\n return false;\n }\n\n if (match.name !== undefined && match.name !== object.name) {\n return false;\n }\n\n if (match.type !== undefined && match.type !== object.type) {\n return false;\n }\n\n return matchesProperties(match.properties, object.properties);\n}\n\nexport function createLayerRenderer(\n k: KAPLAYCtx,\n layer: ParsedTiledTileLayer,\n map: ParsedTiledMap,\n sprite: string,\n): GameObj {\n return k.add([\n k.pos(0, 0),\n k.z(layer.zIndex),\n {\n draw: () => {\n layer.data.forEach((rawGid, index) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (!parsedGid) {\n return;\n }\n\n const column = index % layer.width;\n const row = Math.floor(index / layer.width);\n const drawTransform = getTileDrawTransform(parsedGid.flip);\n\n k.drawSprite({\n anchor: 'center',\n angle: drawTransform.angle,\n flipX: drawTransform.flipX,\n flipY: drawTransform.flipY,\n opacity: layer.opacity,\n pos: k.vec2(\n (column + layer.x) * map.tileWidth + map.tileset.tileWidth / 2,\n (row + layer.y) * map.tileHeight + map.tileset.tileHeight / 2,\n ),\n quad: getTileQuad(k, map, parsedGid.gid),\n sprite,\n });\n });\n },\n id: 'tiled-layer',\n },\n ] as CompList<TiledLayerComp>);\n}\n\nexport function createMatchedTileObjects(\n k: KAPLAYCtx,\n layer: ParsedTiledTileLayer,\n map: ParsedTiledMap,\n options: TiledMapOpt,\n): GameObj[] {\n const rules = options.tiles;\n\n if (!rules?.length) {\n return [];\n }\n\n const tiles: GameObj[] = [];\n\n layer.data.forEach((rawGid, index) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (!parsedGid) {\n return;\n }\n\n const parsedTile = getParsedTile(map, parsedGid.gid);\n const column = index % layer.width;\n const row = Math.floor(index / layer.width);\n const tile = {\n flip: parsedGid.flip,\n gid: parsedGid.gid,\n layer: layer.name,\n pos: {\n x: (column + layer.x) * map.tileWidth,\n y: (row + layer.y) * map.tileHeight,\n },\n properties: parsedTile?.properties ?? {},\n tileSize: {\n height: map.tileHeight,\n width: map.tileWidth,\n },\n tileId: parsedTile?.tileId ?? parsedGid.gid - map.tileset.firstGid,\n tilePos: {\n x: column + layer.x,\n y: row + layer.y,\n },\n };\n\n rules.forEach((rule) => {\n if (!matchesTileRule(rule.match, tile)) {\n return;\n }\n\n tiles.push(\n k.add([\n k.pos(tile.pos.x, tile.pos.y),\n k.anchor('topleft'),\n k.z(layer.zIndex),\n ...rule.comps(tile),\n ] as CompList<unknown>),\n );\n });\n });\n\n return tiles;\n}\n\nexport function createMatchedObjectObjects(\n k: KAPLAYCtx,\n layer: ParsedTiledObjectLayer,\n options: TiledMapOpt,\n): GameObj[] {\n const rules = options.objects;\n\n if (!rules?.length) {\n return [];\n }\n\n const objects: GameObj[] = [];\n\n if (!layer.visible) {\n return objects;\n }\n\n layer.objects.forEach((object) => {\n if (!object.visible) {\n return;\n }\n\n const context: TiledObjectContext = {\n id: object.id,\n layer: layer.name,\n name: object.name,\n objectSize: {\n height: object.height,\n width: object.width,\n },\n point: object.point ?? false,\n pos: {\n x: object.x,\n y: object.y,\n },\n properties: getPropertyRecord(object.properties),\n rotation: object.rotation,\n type: object.type,\n };\n\n rules.forEach((rule) => {\n if (!matchesObjectRule(rule.match, context)) {\n return;\n }\n\n objects.push(\n k.add([\n k.pos(context.pos.x, context.pos.y),\n k.anchor('topleft'),\n k.z(layer.zIndex),\n ...rule.comps(context),\n ] as CompList<unknown>),\n );\n });\n });\n\n return objects;\n}\n\nexport function parseTiledMap(data: TiledMapData): ParsedTiledMap {\n if (data.orientation !== 'orthogonal') {\n throw new Error(\n `Unsupported Tiled orientation \"${data.orientation}\". Expected \"orthogonal\".`,\n );\n }\n\n if (data.infinite) {\n throw new Error('Infinite Tiled maps are not supported.');\n }\n\n if (data.tilesets.length !== 1) {\n throw new Error('Exactly one Tiled tileset is required.');\n }\n\n const [tileset] = data.tilesets;\n\n if (tileset.columns <= 0) {\n throw new Error('Tiled tileset columns must be greater than 0.');\n }\n\n const layers = data.layers.map((layer, zIndex) => {\n if (isTileLayer(layer)) {\n if (layer.data.length !== layer.width * layer.height) {\n throw new Error(\n `Layer \"${layer.name}\" data length does not match its dimensions.`,\n );\n }\n\n return {\n ...normalizeTileLayer(layer),\n zIndex,\n };\n }\n\n if (isObjectLayer(layer)) {\n return {\n ...normalizeObjectLayer(layer),\n zIndex,\n };\n }\n\n throw new Error('Unsupported Tiled layer type.');\n });\n\n return {\n height: data.height,\n layers,\n orientation: 'orthogonal',\n tileHeight: data.tileheight,\n tileWidth: data.tilewidth,\n tileset: {\n columns: tileset.columns,\n firstGid: tileset.firstgid,\n image: tileset.image,\n imageHeight: tileset.imageheight,\n imageWidth: tileset.imagewidth,\n lastGid: tileset.firstgid + tileset.tilecount - 1,\n margin: tileset.margin ?? 0,\n name: tileset.name,\n spacing: tileset.spacing ?? 0,\n tileCount: tileset.tilecount,\n tileHeight: tileset.tileheight,\n tiles: Object.fromEntries(\n (tileset.tiles ?? []).map((tile) => [\n tile.id + tileset.firstgid,\n {\n gid: tile.id + tileset.firstgid,\n properties: getPropertyRecord(tile.properties),\n tileId: tile.id,\n },\n ]),\n ),\n tileWidth: tileset.tilewidth,\n },\n width: data.width,\n };\n}\n","import type { KAPLAYCtx } from 'kaplay';\n\nimport type { TiledMap, TiledMapOpt } from './types';\nimport {\n createLayerRenderer,\n createMatchedObjectObjects,\n createMatchedTileObjects,\n getLayerNames,\n parseTiledMap,\n parseTileGid,\n resolveTiledMap,\n} from './utils';\n\nexport type { TiledMap, TiledMapOpt } from './types';\n\ndeclare module 'kaplay' {\n interface KAPLAYCtx {\n addTiledMap: (map: TiledMap, options: TiledMapOpt) => void;\n }\n}\n\n/**\n * Add a Tiled map to the current KAPLAY context.\n *\n * The `map` argument can either be:\n * - parsed map JSON, or\n * - the asset key of a map loaded with `loadJSON()`.\n *\n * @param k - The active KAPLAY context.\n * @param map - The Tiled map data.\n * @param opt - The Tiled map options.\n */\nfunction addTiledMap(k: KAPLAYCtx, map: TiledMap, opt: TiledMapOpt): void {\n const parsedMap = parseTiledMap(resolveTiledMap(k, map));\n const allowedLayerNames = getLayerNames(opt);\n\n parsedMap.layers.forEach((layer) => {\n if (!layer.visible) {\n return;\n }\n\n if (allowedLayerNames && !allowedLayerNames.has(layer.name)) {\n return;\n }\n\n if (layer.type === 'tilelayer') {\n layer.data.forEach((rawGid) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (\n parsedGid &&\n (parsedGid.gid < parsedMap.tileset.firstGid ||\n parsedGid.gid > parsedMap.tileset.lastGid)\n ) {\n throw new Error(\n `Tile gid ${String(rawGid)} is outside the supported tileset range.`,\n );\n }\n });\n\n createLayerRenderer(k, layer, parsedMap, opt.sprite);\n createMatchedTileObjects(k, layer, parsedMap, opt);\n return;\n }\n\n createMatchedObjectObjects(k, layer, opt);\n });\n}\n\n/**\n * KAPLAY plugin that adds `addTiledMap()` to the context.\n *\n * @param k - The active KAPLAY context.\n * @returns - The plugin API.\n */\nexport function tiledPlugin(k: KAPLAYCtx) {\n return {\n addTiledMap(map: TiledMap, options: TiledMapOpt) {\n addTiledMap(k, map, options);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.umd.js","names":[],"sources":["../src/utils.ts","../src/plugin.ts"],"sourcesContent":["import type { CompList, GameObj, KAPLAYCtx, Quad } from 'kaplay';\n\nimport type {\n ParsedTiledLayer,\n ParsedTiledMap,\n ParsedTiledObjectLayer,\n ParsedTiledTile,\n ParsedTiledTileLayer,\n TiledLayer,\n TiledLayerComp,\n TiledMap,\n TiledMapData,\n TiledMapOpt,\n TiledObjectContext,\n TiledObjectLayer,\n TiledObjectMatch,\n TiledProperty,\n TiledPropertyValue,\n TiledTileContext,\n TiledTileLayer,\n TiledTileMatch,\n} from './types';\n\nconst FLIPPED_HORIZONTALLY_FLAG = 0x80000000;\nconst FLIPPED_VERTICALLY_FLAG = 0x40000000;\nconst FLIPPED_DIAGONALLY_FLAG = 0x20000000;\nconst FLIP_FLAGS =\n FLIPPED_HORIZONTALLY_FLAG | FLIPPED_VERTICALLY_FLAG | FLIPPED_DIAGONALLY_FLAG;\n\ninterface ParsedTileGid {\n gid: number;\n flip: {\n diagonal: boolean;\n horizontal: boolean;\n vertical: boolean;\n };\n}\n\nexport function resolveTiledMap(k: KAPLAYCtx, map: TiledMap): TiledMapData {\n if (typeof map !== 'string') {\n return map;\n }\n\n const asset = k.getAsset(map);\n\n if (!asset) {\n throw new Error(`Tiled map asset \"${map}\" is not loaded.`);\n }\n\n if (!asset.data) {\n throw new Error(`Tiled map asset \"${map}\" is not ready yet.`);\n }\n\n return asset.data as TiledMapData;\n}\n\nfunction getPropertyRecord(\n properties: TiledProperty[] | undefined,\n): Record<string, TiledPropertyValue> {\n const record: Record<string, TiledPropertyValue> = {};\n\n properties?.forEach((property) => {\n record[property.name] = property.value;\n });\n\n return record;\n}\n\nfunction isObjectLayer(layer: TiledLayer): layer is TiledObjectLayer {\n return layer.type === 'objectgroup';\n}\n\nfunction isTileLayer(layer: TiledLayer): layer is TiledTileLayer {\n return layer.type === 'tilelayer';\n}\n\nfunction normalizeTileLayer(layer: TiledTileLayer): ParsedTiledLayer {\n return {\n data: layer.data,\n height: layer.height,\n name: layer.name,\n opacity: layer.opacity ?? 1,\n type: 'tilelayer',\n visible: layer.visible ?? true,\n width: layer.width,\n x: layer.x ?? 0,\n y: layer.y ?? 0,\n zIndex: 0,\n };\n}\n\nfunction normalizeObjectLayer(layer: TiledObjectLayer): ParsedTiledObjectLayer {\n return {\n name: layer.name,\n objects: layer.objects,\n type: 'objectgroup',\n visible: layer.visible ?? true,\n zIndex: 0,\n };\n}\n\nexport function parseTileGid(rawGid: number): ParsedTileGid | null {\n if (rawGid === 0) {\n return null;\n }\n\n return {\n gid: (rawGid & ~FLIP_FLAGS) >>> 0,\n flip: {\n diagonal: (rawGid & FLIPPED_DIAGONALLY_FLAG) !== 0,\n horizontal: (rawGid & FLIPPED_HORIZONTALLY_FLAG) !== 0,\n vertical: (rawGid & FLIPPED_VERTICALLY_FLAG) !== 0,\n },\n };\n}\n\nfunction getTileDrawTransform(flip: ParsedTileGid['flip']): {\n angle: number;\n flipX: boolean;\n flipY: boolean;\n} {\n if (!flip.diagonal) {\n return {\n angle: 0,\n flipX: flip.horizontal,\n flipY: flip.vertical,\n };\n }\n\n if (flip.horizontal && flip.vertical) {\n return {\n angle: 270,\n flipX: true,\n flipY: false,\n };\n }\n\n if (flip.horizontal) {\n return {\n angle: 270,\n flipX: false,\n flipY: false,\n };\n }\n\n if (flip.vertical) {\n return {\n angle: 90,\n flipX: false,\n flipY: false,\n };\n }\n\n return {\n angle: 270,\n flipX: false,\n flipY: true,\n };\n}\n\nfunction getTileQuad(k: KAPLAYCtx, map: ParsedTiledMap, gid: number): Quad {\n const localTileId = gid - map.tileset.firstGid;\n const column = localTileId % map.tileset.columns;\n const row = Math.floor(localTileId / map.tileset.columns);\n const x =\n map.tileset.margin + column * (map.tileset.tileWidth + map.tileset.spacing);\n const y =\n map.tileset.margin + row * (map.tileset.tileHeight + map.tileset.spacing);\n\n return k.quad(\n x / map.tileset.imageWidth,\n y / map.tileset.imageHeight,\n map.tileset.tileWidth / map.tileset.imageWidth,\n map.tileset.tileHeight / map.tileset.imageHeight,\n );\n}\n\nexport function getLayerNames(options: TiledMapOpt): Set<string> | null {\n if (!options.layerNames?.length) {\n return null;\n }\n\n return new Set(options.layerNames);\n}\n\nfunction getParsedTile(\n map: ParsedTiledMap,\n gid: number,\n): ParsedTiledTile | undefined {\n return map.tileset.tiles[gid];\n}\n\nfunction matchesProperties(\n expected: Record<string, TiledPropertyValue> | undefined,\n actual: Record<string, TiledPropertyValue>,\n): boolean {\n if (!expected) {\n return true;\n }\n\n return Object.entries(expected).every(\n ([name, value]) => actual[name] === value,\n );\n}\n\nfunction matchesTileRule(\n match: TiledTileMatch,\n tile: TiledTileContext,\n): boolean {\n if (match.gid !== undefined && match.gid !== tile.gid) {\n return false;\n }\n\n if (match.tileId !== undefined && match.tileId !== tile.tileId) {\n return false;\n }\n\n if (match.layer !== undefined && match.layer !== tile.layer) {\n return false;\n }\n\n return matchesProperties(match.properties, tile.properties);\n}\n\nfunction matchesObjectRule(\n match: TiledObjectMatch,\n object: TiledObjectContext,\n): boolean {\n if (match.layer !== undefined && match.layer !== object.layer) {\n return false;\n }\n\n if (match.name !== undefined && match.name !== object.name) {\n return false;\n }\n\n if (match.type !== undefined && match.type !== object.type) {\n return false;\n }\n\n return matchesProperties(match.properties, object.properties);\n}\n\nexport function createLayerRenderer(\n k: KAPLAYCtx,\n layer: ParsedTiledTileLayer,\n map: ParsedTiledMap,\n sprite: string,\n): GameObj {\n return k.add([\n k.pos(0, 0),\n k.z(layer.zIndex),\n {\n draw: () => {\n layer.data.forEach((rawGid, index) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (!parsedGid) {\n return;\n }\n\n const column = index % layer.width;\n const row = Math.floor(index / layer.width);\n const drawTransform = getTileDrawTransform(parsedGid.flip);\n\n k.drawSprite({\n anchor: 'center',\n angle: drawTransform.angle,\n flipX: drawTransform.flipX,\n flipY: drawTransform.flipY,\n opacity: layer.opacity,\n pos: k.vec2(\n (column + layer.x) * map.tileWidth + map.tileset.tileWidth / 2,\n (row + layer.y) * map.tileHeight + map.tileset.tileHeight / 2,\n ),\n quad: getTileQuad(k, map, parsedGid.gid),\n sprite,\n });\n });\n },\n id: 'tiled-layer',\n },\n ] as CompList<TiledLayerComp>);\n}\n\nexport function createMatchedTileObjects(\n k: KAPLAYCtx,\n layer: ParsedTiledTileLayer,\n map: ParsedTiledMap,\n options: TiledMapOpt,\n): GameObj[] {\n const rules = options.tiles;\n\n if (!rules?.length) {\n return [];\n }\n\n const tiles: GameObj[] = [];\n\n layer.data.forEach((rawGid, index) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (!parsedGid) {\n return;\n }\n\n const parsedTile = getParsedTile(map, parsedGid.gid);\n const column = index % layer.width;\n const row = Math.floor(index / layer.width);\n const tile = {\n flip: parsedGid.flip,\n gid: parsedGid.gid,\n height: map.tileHeight,\n layer: layer.name,\n tileHeight: map.tileHeight,\n tileWidth: map.tileWidth,\n tileX: column + layer.x,\n tileY: row + layer.y,\n width: map.tileWidth,\n x: (column + layer.x) * map.tileWidth,\n y: (row + layer.y) * map.tileHeight,\n properties: parsedTile?.properties ?? {},\n tileId: parsedTile?.tileId ?? parsedGid.gid - map.tileset.firstGid,\n };\n\n rules.forEach((rule) => {\n if (!matchesTileRule(rule.match, tile)) {\n return;\n }\n\n tiles.push(\n k.add([\n k.pos(tile.x, tile.y),\n k.anchor('topleft'),\n k.z(layer.zIndex),\n ...rule.comps(tile),\n ] as CompList<unknown>),\n );\n });\n });\n\n return tiles;\n}\n\nexport function createMatchedObjectObjects(\n k: KAPLAYCtx,\n layer: ParsedTiledObjectLayer,\n options: TiledMapOpt,\n): GameObj[] {\n const rules = options.objects;\n\n if (!rules?.length) {\n return [];\n }\n\n const objects: GameObj[] = [];\n\n if (!layer.visible) {\n return objects;\n }\n\n layer.objects.forEach((object) => {\n if (!object.visible) {\n return;\n }\n\n const context: TiledObjectContext = {\n height: object.height,\n id: object.id,\n layer: layer.name,\n name: object.name,\n width: object.width,\n x: object.x,\n y: object.y,\n point: object.point ?? false,\n properties: getPropertyRecord(object.properties),\n rotation: object.rotation,\n type: object.type,\n };\n\n rules.forEach((rule) => {\n if (!matchesObjectRule(rule.match, context)) {\n return;\n }\n\n objects.push(\n k.add([\n k.pos(context.x, context.y),\n k.anchor('topleft'),\n k.z(layer.zIndex),\n ...rule.comps(context),\n ] as CompList<unknown>),\n );\n });\n });\n\n return objects;\n}\n\nexport function parseTiledMap(data: TiledMapData): ParsedTiledMap {\n if (data.orientation !== 'orthogonal') {\n throw new Error(\n `Unsupported Tiled orientation \"${data.orientation}\". Expected \"orthogonal\".`,\n );\n }\n\n if (data.infinite) {\n throw new Error('Infinite Tiled maps are not supported.');\n }\n\n if (data.tilesets.length !== 1) {\n throw new Error('Exactly one Tiled tileset is required.');\n }\n\n const [tileset] = data.tilesets;\n\n if (tileset.columns <= 0) {\n throw new Error('Tiled tileset columns must be greater than 0.');\n }\n\n const layers = data.layers.map((layer, zIndex) => {\n if (isTileLayer(layer)) {\n if (layer.data.length !== layer.width * layer.height) {\n throw new Error(\n `Layer \"${layer.name}\" data length does not match its dimensions.`,\n );\n }\n\n return {\n ...normalizeTileLayer(layer),\n zIndex,\n };\n }\n\n if (isObjectLayer(layer)) {\n return {\n ...normalizeObjectLayer(layer),\n zIndex,\n };\n }\n\n throw new Error('Unsupported Tiled layer type.');\n });\n\n return {\n height: data.height,\n layers,\n orientation: 'orthogonal',\n tileHeight: data.tileheight,\n tileWidth: data.tilewidth,\n tileset: {\n columns: tileset.columns,\n firstGid: tileset.firstgid,\n image: tileset.image,\n imageHeight: tileset.imageheight,\n imageWidth: tileset.imagewidth,\n lastGid: tileset.firstgid + tileset.tilecount - 1,\n margin: tileset.margin ?? 0,\n name: tileset.name,\n spacing: tileset.spacing ?? 0,\n tileCount: tileset.tilecount,\n tileHeight: tileset.tileheight,\n tiles: Object.fromEntries(\n (tileset.tiles ?? []).map((tile) => [\n tile.id + tileset.firstgid,\n {\n gid: tile.id + tileset.firstgid,\n properties: getPropertyRecord(tile.properties),\n tileId: tile.id,\n },\n ]),\n ),\n tileWidth: tileset.tilewidth,\n },\n width: data.width,\n };\n}\n","import type { KAPLAYCtx } from 'kaplay';\n\nimport type { AddTiledMap, TiledMap, TiledMapOpt } from './types';\nimport {\n createLayerRenderer,\n createMatchedObjectObjects,\n createMatchedTileObjects,\n getLayerNames,\n parseTiledMap,\n parseTileGid,\n resolveTiledMap,\n} from './utils';\n\nexport type { AddTiledMap, TiledMap, TiledMapOpt } from './types';\n\ndeclare module 'kaplay' {\n interface KAPLAYCtx {\n addTiledMap: (map: TiledMap, options: TiledMapOpt) => void;\n }\n}\n\n/**\n * Add a Tiled map to the current KAPLAY context.\n *\n * The `map` argument can either be:\n * - parsed map JSON, or\n * - the asset key of a map loaded with `loadJSON()`.\n *\n * @param k - The active KAPLAY context.\n * @param map - The Tiled map data.\n * @param opt - The Tiled map options.\n */\nfunction addTiledMap(k: KAPLAYCtx, map: TiledMap, opt: TiledMapOpt): void {\n const parsedMap = parseTiledMap(resolveTiledMap(k, map));\n const allowedLayerNames = getLayerNames(opt);\n\n parsedMap.layers.forEach((layer) => {\n if (!layer.visible) {\n return;\n }\n\n if (allowedLayerNames && !allowedLayerNames.has(layer.name)) {\n return;\n }\n\n if (layer.type === 'tilelayer') {\n layer.data.forEach((rawGid) => {\n const parsedGid = parseTileGid(rawGid);\n\n if (\n parsedGid &&\n (parsedGid.gid < parsedMap.tileset.firstGid ||\n parsedGid.gid > parsedMap.tileset.lastGid)\n ) {\n throw new Error(\n `Tile gid ${String(rawGid)} is outside the supported tileset range.`,\n );\n }\n });\n\n createLayerRenderer(k, layer, parsedMap, opt.sprite);\n createMatchedTileObjects(k, layer, parsedMap, opt);\n return;\n }\n\n createMatchedObjectObjects(k, layer, opt);\n });\n}\n\n/**\n * KAPLAY plugin that adds `addTiledMap()` to the context.\n *\n * @param k - The active KAPLAY context.\n * @returns - The plugin API.\n */\nexport function tiledPlugin(k: KAPLAYCtx) {\n const boundAddTiledMap: AddTiledMap = (map, options) => {\n addTiledMap(k, map, options);\n };\n\n return { addTiledMap: boundAddTiledMap };\n}\n"],"mappings":"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"}
package/global.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import type { TiledMap, TiledMapOpt } from './dist/plugin';
1
+ import type { AddTiledMap } from './dist/plugin';
2
2
 
3
3
  declare global {
4
- var addTiledMap: (map: TiledMap, options: TiledMapOpt) => void;
4
+ var addTiledMap: AddTiledMap;
5
5
  }
6
6
 
7
7
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kaplay-plugin-tiled",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "KAPLAY plugin for Tiled maps",
5
5
  "author": "Mark <mark@remarkablemark.org> (https://remarkablemark.org)",
6
6
  "main": "./dist/plugin.cjs",