kaplay-plugin-tiled 1.1.1 → 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 +2 -2
- package/dist/plugin.cjs +1 -1
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +12 -20
- package/dist/plugin.d.mts +12 -20
- package/dist/plugin.d.ts +12 -20
- package/dist/plugin.mjs +15 -23
- package/dist/plugin.mjs.map +1 -1
- package/dist/plugin.umd.js +1 -1
- package/dist/plugin.umd.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -57,9 +57,9 @@ k.onLoad(() => {
|
|
|
57
57
|
objects: [
|
|
58
58
|
{
|
|
59
59
|
match: { properties: { collides: true } },
|
|
60
|
-
comps: ({
|
|
60
|
+
comps: ({ width, height }) => [
|
|
61
61
|
k.area({
|
|
62
|
-
shape: new k.Rect(k.vec2(),
|
|
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,
|
|
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
|
package/dist/plugin.cjs.map
CHANGED
|
@@ -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\nexport type AddTiledMap = (map: TiledMap, options: TiledMapOpt) => void;\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
|
+
{"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
|
@@ -41,18 +41,14 @@ declare interface TiledObject {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
declare interface TiledObjectContext {
|
|
44
|
+
height: number;
|
|
44
45
|
id: number;
|
|
45
46
|
layer: string;
|
|
46
47
|
name: string;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
};
|
|
48
|
+
width: number;
|
|
49
|
+
x: number;
|
|
50
|
+
y: number;
|
|
51
51
|
point: boolean;
|
|
52
|
-
pos: {
|
|
53
|
-
x: number;
|
|
54
|
-
y: number;
|
|
55
|
-
};
|
|
56
52
|
properties: Record<string, TiledPropertyValue>;
|
|
57
53
|
rotation: number;
|
|
58
54
|
type: string;
|
|
@@ -108,20 +104,16 @@ declare interface TiledTileContext {
|
|
|
108
104
|
};
|
|
109
105
|
gid: number;
|
|
110
106
|
layer: string;
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
height: number;
|
|
108
|
+
tileHeight: number;
|
|
109
|
+
tileWidth: number;
|
|
110
|
+
tileX: number;
|
|
111
|
+
tileY: number;
|
|
112
|
+
width: number;
|
|
113
|
+
x: number;
|
|
114
|
+
y: number;
|
|
115
115
|
properties: Record<string, TiledPropertyValue>;
|
|
116
|
-
tileSize: {
|
|
117
|
-
height: number;
|
|
118
|
-
width: number;
|
|
119
|
-
};
|
|
120
116
|
tileId: number;
|
|
121
|
-
tilePos: {
|
|
122
|
-
x: number;
|
|
123
|
-
y: number;
|
|
124
|
-
};
|
|
125
117
|
}
|
|
126
118
|
|
|
127
119
|
declare interface TiledTileDefinition {
|
package/dist/plugin.d.mts
CHANGED
|
@@ -41,18 +41,14 @@ declare interface TiledObject {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
declare interface TiledObjectContext {
|
|
44
|
+
height: number;
|
|
44
45
|
id: number;
|
|
45
46
|
layer: string;
|
|
46
47
|
name: string;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
};
|
|
48
|
+
width: number;
|
|
49
|
+
x: number;
|
|
50
|
+
y: number;
|
|
51
51
|
point: boolean;
|
|
52
|
-
pos: {
|
|
53
|
-
x: number;
|
|
54
|
-
y: number;
|
|
55
|
-
};
|
|
56
52
|
properties: Record<string, TiledPropertyValue>;
|
|
57
53
|
rotation: number;
|
|
58
54
|
type: string;
|
|
@@ -108,20 +104,16 @@ declare interface TiledTileContext {
|
|
|
108
104
|
};
|
|
109
105
|
gid: number;
|
|
110
106
|
layer: string;
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
height: number;
|
|
108
|
+
tileHeight: number;
|
|
109
|
+
tileWidth: number;
|
|
110
|
+
tileX: number;
|
|
111
|
+
tileY: number;
|
|
112
|
+
width: number;
|
|
113
|
+
x: number;
|
|
114
|
+
y: number;
|
|
115
115
|
properties: Record<string, TiledPropertyValue>;
|
|
116
|
-
tileSize: {
|
|
117
|
-
height: number;
|
|
118
|
-
width: number;
|
|
119
|
-
};
|
|
120
116
|
tileId: number;
|
|
121
|
-
tilePos: {
|
|
122
|
-
x: number;
|
|
123
|
-
y: number;
|
|
124
|
-
};
|
|
125
117
|
}
|
|
126
118
|
|
|
127
119
|
declare interface TiledTileDefinition {
|
package/dist/plugin.d.ts
CHANGED
|
@@ -41,18 +41,14 @@ declare interface TiledObject {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
declare interface TiledObjectContext {
|
|
44
|
+
height: number;
|
|
44
45
|
id: number;
|
|
45
46
|
layer: string;
|
|
46
47
|
name: string;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
};
|
|
48
|
+
width: number;
|
|
49
|
+
x: number;
|
|
50
|
+
y: number;
|
|
51
51
|
point: boolean;
|
|
52
|
-
pos: {
|
|
53
|
-
x: number;
|
|
54
|
-
y: number;
|
|
55
|
-
};
|
|
56
52
|
properties: Record<string, TiledPropertyValue>;
|
|
57
53
|
rotation: number;
|
|
58
54
|
type: string;
|
|
@@ -108,20 +104,16 @@ declare interface TiledTileContext {
|
|
|
108
104
|
};
|
|
109
105
|
gid: number;
|
|
110
106
|
layer: string;
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
height: number;
|
|
108
|
+
tileHeight: number;
|
|
109
|
+
tileWidth: number;
|
|
110
|
+
tileX: number;
|
|
111
|
+
tileY: number;
|
|
112
|
+
width: number;
|
|
113
|
+
x: number;
|
|
114
|
+
y: number;
|
|
115
115
|
properties: Record<string, TiledPropertyValue>;
|
|
116
|
-
tileSize: {
|
|
117
|
-
height: number;
|
|
118
|
-
width: number;
|
|
119
|
-
};
|
|
120
116
|
tileId: number;
|
|
121
|
-
tilePos: {
|
|
122
|
-
x: number;
|
|
123
|
-
y: number;
|
|
124
|
-
};
|
|
125
117
|
}
|
|
126
118
|
|
|
127
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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.
|
|
176
|
+
e.pos(o.x, o.y),
|
|
185
177
|
e.anchor("topleft"),
|
|
186
178
|
e.z(t.zIndex),
|
|
187
179
|
...n.comps(o)
|
package/dist/plugin.mjs.map
CHANGED
|
@@ -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\nexport type AddTiledMap = (map: TiledMap, options: TiledMapOpt) => void;\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
|
+
{"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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"}
|
package/dist/plugin.umd.js
CHANGED
|
@@ -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,
|
|
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
|
package/dist/plugin.umd.js.map
CHANGED
|
@@ -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\nexport type AddTiledMap = (map: TiledMap, options: TiledMapOpt) => void;\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":"yRAuBA,IAAM,EAA4B,WAC5B,EAA0B,WAC1B,EAA0B,UAC1B,EACwB,EAAA,YAW9B,SAAgB,EAAgB,EAAc,EAA6B,CACzE,GAAI,OAAO,GAAQ,SACjB,OAAO,EAGT,IAAM,EAAQ,EAAE,SAAS,EAAI,CAE7B,GAAI,CAAC,EACH,MAAU,MAAM,oBAAoB,EAAI,kBAAkB,CAG5D,GAAI,CAAC,EAAM,KACT,MAAU,MAAM,oBAAoB,EAAI,qBAAqB,CAG/D,OAAO,EAAM,KAGf,SAAS,EACP,EACoC,CACpC,IAAM,EAA6C,EAAE,CAMrD,OAJA,GAAY,QAAS,GAAa,CAChC,EAAO,EAAS,MAAQ,EAAS,OACjC,CAEK,EAGT,SAAS,EAAc,EAA8C,CACnE,OAAO,EAAM,OAAS,cAGxB,SAAS,EAAY,EAA4C,CAC/D,OAAO,EAAM,OAAS,YAGxB,SAAS,EAAmB,EAAyC,CACnE,MAAO,CACL,KAAM,EAAM,KACZ,OAAQ,EAAM,OACd,KAAM,EAAM,KACZ,QAAS,EAAM,SAAW,EAC1B,KAAM,YACN,QAAS,EAAM,SAAW,GAC1B,MAAO,EAAM,MACb,EAAG,EAAM,GAAK,EACd,EAAG,EAAM,GAAK,EACd,OAAQ,EACT,CAGH,SAAS,EAAqB,EAAiD,CAC7E,MAAO,CACL,KAAM,EAAM,KACZ,QAAS,EAAM,QACf,KAAM,cACN,QAAS,EAAM,SAAW,GAC1B,OAAQ,EACT,CAGH,SAAgB,EAAa,EAAsC,CAKjE,OAJI,IAAW,EACN,KAGF,CACL,KAAM,EAAS,CAAC,KAAgB,EAChC,KAAM,CACJ,UAAW,EAAS,KAA6B,EACjD,YAAa,EAAS,KAA+B,EACrD,UAAW,EAAS,KAA6B,EAClD,CACF,CAGH,SAAS,EAAqB,EAI5B,CAiCA,OAhCK,EAAK,SAQN,EAAK,YAAc,EAAK,SACnB,CACL,MAAO,IACP,MAAO,GACP,MAAO,GACR,CAGC,EAAK,WACA,CACL,MAAO,IACP,MAAO,GACP,MAAO,GACR,CAGC,EAAK,SACA,CACL,MAAO,GACP,MAAO,GACP,MAAO,GACR,CAGI,CACL,MAAO,IACP,MAAO,GACP,MAAO,GACR,CAnCQ,CACL,MAAO,EACP,MAAO,EAAK,WACZ,MAAO,EAAK,SACb,CAkCL,SAAS,EAAY,EAAc,EAAqB,EAAmB,CACzE,IAAM,EAAc,EAAM,EAAI,QAAQ,SAChC,EAAS,EAAc,EAAI,QAAQ,QACnC,EAAM,KAAK,MAAM,EAAc,EAAI,QAAQ,QAAQ,CACnD,EACJ,EAAI,QAAQ,OAAS,GAAU,EAAI,QAAQ,UAAY,EAAI,QAAQ,SAC/D,EACJ,EAAI,QAAQ,OAAS,GAAO,EAAI,QAAQ,WAAa,EAAI,QAAQ,SAEnE,OAAO,EAAE,KACP,EAAI,EAAI,QAAQ,WAChB,EAAI,EAAI,QAAQ,YAChB,EAAI,QAAQ,UAAY,EAAI,QAAQ,WACpC,EAAI,QAAQ,WAAa,EAAI,QAAQ,YACtC,CAGH,SAAgB,EAAc,EAA0C,CAKtE,OAJK,EAAQ,YAAY,OAIlB,IAAI,IAAI,EAAQ,WAAW,CAHzB,KAMX,SAAS,EACP,EACA,EAC6B,CAC7B,OAAO,EAAI,QAAQ,MAAM,GAG3B,SAAS,EACP,EACA,EACS,CAKT,OAJK,EAIE,OAAO,QAAQ,EAAS,CAAC,OAC7B,CAAC,EAAM,KAAW,EAAO,KAAU,EACrC,CALQ,GAQX,SAAS,EACP,EACA,EACS,CAaT,OAZI,EAAM,MAAQ,IAAA,IAAa,EAAM,MAAQ,EAAK,KAI9C,EAAM,SAAW,IAAA,IAAa,EAAM,SAAW,EAAK,QAIpD,EAAM,QAAU,IAAA,IAAa,EAAM,QAAU,EAAK,MAC7C,GAGF,EAAkB,EAAM,WAAY,EAAK,WAAW,CAG7D,SAAS,EACP,EACA,EACS,CAaT,OAZI,EAAM,QAAU,IAAA,IAAa,EAAM,QAAU,EAAO,OAIpD,EAAM,OAAS,IAAA,IAAa,EAAM,OAAS,EAAO,MAIlD,EAAM,OAAS,IAAA,IAAa,EAAM,OAAS,EAAO,KAC7C,GAGF,EAAkB,EAAM,WAAY,EAAO,WAAW,CAG/D,SAAgB,EACd,EACA,EACA,EACA,EACS,CACT,OAAO,EAAE,IAAI,CACX,EAAE,IAAI,EAAG,EAAE,CACX,EAAE,EAAE,EAAM,OAAO,CACjB,CACE,SAAY,CACV,EAAM,KAAK,SAAS,EAAQ,IAAU,CACpC,IAAM,EAAY,EAAa,EAAO,CAEtC,GAAI,CAAC,EACH,OAGF,IAAM,EAAS,EAAQ,EAAM,MACvB,EAAM,KAAK,MAAM,EAAQ,EAAM,MAAM,CACrC,EAAgB,EAAqB,EAAU,KAAK,CAE1D,EAAE,WAAW,CACX,OAAQ,SACR,MAAO,EAAc,MACrB,MAAO,EAAc,MACrB,MAAO,EAAc,MACrB,QAAS,EAAM,QACf,IAAK,EAAE,MACJ,EAAS,EAAM,GAAK,EAAI,UAAY,EAAI,QAAQ,UAAY,GAC5D,EAAM,EAAM,GAAK,EAAI,WAAa,EAAI,QAAQ,WAAa,EAC7D,CACD,KAAM,EAAY,EAAG,EAAK,EAAU,IAAI,CACxC,SACD,CAAC,EACF,EAEJ,GAAI,cACL,CACF,CAA6B,CAGhC,SAAgB,EACd,EACA,EACA,EACA,EACW,CACX,IAAM,EAAQ,EAAQ,MAEtB,GAAI,CAAC,GAAO,OACV,MAAO,EAAE,CAGX,IAAM,EAAmB,EAAE,CAgD3B,OA9CA,EAAM,KAAK,SAAS,EAAQ,IAAU,CACpC,IAAM,EAAY,EAAa,EAAO,CAEtC,GAAI,CAAC,EACH,OAGF,IAAM,EAAa,EAAc,EAAK,EAAU,IAAI,CAC9C,EAAS,EAAQ,EAAM,MACvB,EAAM,KAAK,MAAM,EAAQ,EAAM,MAAM,CACrC,EAAO,CACX,KAAM,EAAU,KAChB,IAAK,EAAU,IACf,MAAO,EAAM,KACb,IAAK,CACH,GAAI,EAAS,EAAM,GAAK,EAAI,UAC5B,GAAI,EAAM,EAAM,GAAK,EAAI,WAC1B,CACD,WAAY,GAAY,YAAc,EAAE,CACxC,SAAU,CACR,OAAQ,EAAI,WACZ,MAAO,EAAI,UACZ,CACD,OAAQ,GAAY,QAAU,EAAU,IAAM,EAAI,QAAQ,SAC1D,QAAS,CACP,EAAG,EAAS,EAAM,EAClB,EAAG,EAAM,EAAM,EAChB,CACF,CAED,EAAM,QAAS,GAAS,CACjB,EAAgB,EAAK,MAAO,EAAK,EAItC,EAAM,KACJ,EAAE,IAAI,CACJ,EAAE,IAAI,EAAK,IAAI,EAAG,EAAK,IAAI,EAAE,CAC7B,EAAE,OAAO,UAAU,CACnB,EAAE,EAAE,EAAM,OAAO,CACjB,GAAG,EAAK,MAAM,EAAK,CACpB,CAAsB,CACxB,EACD,EACF,CAEK,EAGT,SAAgB,EACd,EACA,EACA,EACW,CACX,IAAM,EAAQ,EAAQ,QAEtB,GAAI,CAAC,GAAO,OACV,MAAO,EAAE,CAGX,IAAM,EAAqB,EAAE,CA6C7B,OA3CK,EAAM,SAIX,EAAM,QAAQ,QAAS,GAAW,CAChC,GAAI,CAAC,EAAO,QACV,OAGF,IAAM,EAA8B,CAClC,GAAI,EAAO,GACX,MAAO,EAAM,KACb,KAAM,EAAO,KACb,WAAY,CACV,OAAQ,EAAO,OACf,MAAO,EAAO,MACf,CACD,MAAO,EAAO,OAAS,GACvB,IAAK,CACH,EAAG,EAAO,EACV,EAAG,EAAO,EACX,CACD,WAAY,EAAkB,EAAO,WAAW,CAChD,SAAU,EAAO,SACjB,KAAM,EAAO,KACd,CAED,EAAM,QAAS,GAAS,CACjB,EAAkB,EAAK,MAAO,EAAQ,EAI3C,EAAQ,KACN,EAAE,IAAI,CACJ,EAAE,IAAI,EAAQ,IAAI,EAAG,EAAQ,IAAI,EAAE,CACnC,EAAE,OAAO,UAAU,CACnB,EAAE,EAAE,EAAM,OAAO,CACjB,GAAG,EAAK,MAAM,EAAQ,CACvB,CAAsB,CACxB,EACD,EACF,CAxCO,EA6CX,SAAgB,EAAc,EAAoC,CAChE,GAAI,EAAK,cAAgB,aACvB,MAAU,MACR,kCAAkC,EAAK,YAAY,2BACpD,CAGH,GAAI,EAAK,SACP,MAAU,MAAM,yCAAyC,CAG3D,GAAI,EAAK,SAAS,SAAW,EAC3B,MAAU,MAAM,yCAAyC,CAG3D,GAAM,CAAC,GAAW,EAAK,SAEvB,GAAI,EAAQ,SAAW,EACrB,MAAU,MAAM,gDAAgD,CAGlE,IAAM,EAAS,EAAK,OAAO,KAAK,EAAO,IAAW,CAChD,GAAI,EAAY,EAAM,CAAE,CACtB,GAAI,EAAM,KAAK,SAAW,EAAM,MAAQ,EAAM,OAC5C,MAAU,MACR,UAAU,EAAM,KAAK,8CACtB,CAGH,MAAO,CACL,GAAG,EAAmB,EAAM,CAC5B,SACD,CAGH,GAAI,EAAc,EAAM,CACtB,MAAO,CACL,GAAG,EAAqB,EAAM,CAC9B,SACD,CAGH,MAAU,MAAM,gCAAgC,EAChD,CAEF,MAAO,CACL,OAAQ,EAAK,OACb,SACA,YAAa,aACb,WAAY,EAAK,WACjB,UAAW,EAAK,UAChB,QAAS,CACP,QAAS,EAAQ,QACjB,SAAU,EAAQ,SAClB,MAAO,EAAQ,MACf,YAAa,EAAQ,YACrB,WAAY,EAAQ,WACpB,QAAS,EAAQ,SAAW,EAAQ,UAAY,EAChD,OAAQ,EAAQ,QAAU,EAC1B,KAAM,EAAQ,KACd,QAAS,EAAQ,SAAW,EAC5B,UAAW,EAAQ,UACnB,WAAY,EAAQ,WACpB,MAAO,OAAO,aACX,EAAQ,OAAS,EAAE,EAAE,IAAK,GAAS,CAClC,EAAK,GAAK,EAAQ,SAClB,CACE,IAAK,EAAK,GAAK,EAAQ,SACvB,WAAY,EAAkB,EAAK,WAAW,CAC9C,OAAQ,EAAK,GACd,CACF,CAAC,CACH,CACD,UAAW,EAAQ,UACpB,CACD,MAAO,EAAK,MACb,CCncH,SAAS,EAAY,EAAc,EAAe,EAAwB,CACxE,IAAM,EAAY,EAAc,EAAgB,EAAG,EAAI,CAAC,CAClD,EAAoB,EAAc,EAAI,CAE5C,EAAU,OAAO,QAAS,GAAU,CAC7B,KAAM,SAIP,KAAqB,CAAC,EAAkB,IAAI,EAAM,KAAK,EAI3D,IAAI,EAAM,OAAS,YAAa,CAC9B,EAAM,KAAK,QAAS,GAAW,CAC7B,IAAM,EAAY,EAAa,EAAO,CAEtC,GACE,IACC,EAAU,IAAM,EAAU,QAAQ,UACjC,EAAU,IAAM,EAAU,QAAQ,SAEpC,MAAU,MACR,YAAY,OAAO,EAAO,CAAC,0CAC5B,EAEH,CAEF,EAAoB,EAAG,EAAO,EAAW,EAAI,OAAO,CACpD,EAAyB,EAAG,EAAO,EAAW,EAAI,CAClD,OAGF,EAA2B,EAAG,EAAO,EAAI,GACzC,CAWJ,SAAgB,EAAY,EAAc,CAKxC,MAAO,CAAE,aAJ8B,EAAK,IAAY,CACtD,EAAY,EAAG,EAAK,EAAQ,EAGU"}
|
|
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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"}
|