@yagejs/tilemap 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,588 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
5
+ var __typeError = (msg) => {
6
+ throw TypeError(msg);
7
+ };
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ var __decoratorStart = (base) => [, , , __create(base?.[__knownSymbol("metadata")] ?? null)];
11
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
12
+ var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
13
+ var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
14
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
15
+ var __runInitializers = (array, flags, self, value) => {
16
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
17
+ return value;
18
+ };
19
+ var __decorateElement = (array, flags, name, decorators, target, extra) => {
20
+ var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
21
+ var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
22
+ var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
23
+ var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : { get [name]() {
24
+ return __privateGet(this, extra);
25
+ }, set [name](x) {
26
+ return __privateSet(this, extra, x);
27
+ } }, name));
28
+ k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name(target, name);
29
+ for (var i = decorators.length - 1; i >= 0; i--) {
30
+ ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
31
+ if (k) {
32
+ ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => name in x };
33
+ if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
34
+ if (k > 2) access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
35
+ }
36
+ it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
37
+ if (k ^ 4 || it === void 0) __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
38
+ else if (typeof it !== "object" || it === null) __typeError("Object expected");
39
+ else __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
40
+ }
41
+ return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
42
+ };
43
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
44
+ var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
45
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
46
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
47
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
48
+
49
+ // src/TilemapPlugin.ts
50
+ import { AssetManagerKey } from "@yagejs/core";
51
+ import { extensions, Assets as Assets4 } from "pixi.js";
52
+
53
+ // src/tiled/tiledMapLoader.ts
54
+ import {
55
+ ExtensionType,
56
+ LoaderParserPriority,
57
+ Assets,
58
+ path,
59
+ Texture,
60
+ Rectangle
61
+ } from "pixi.js";
62
+ var tiledMapLoaderParser = {
63
+ id: "tiledMapLoader",
64
+ extension: {
65
+ type: ExtensionType.LoadParser,
66
+ priority: LoaderParserPriority.High
67
+ },
68
+ async testParse(asset, resolvedAsset) {
69
+ if (!resolvedAsset?.src) return false;
70
+ if (path.extname(resolvedAsset.src).toLowerCase() !== ".json") return false;
71
+ const obj = asset;
72
+ return !!(obj.tilesets && obj.layers);
73
+ },
74
+ async parse(asset, resolvedAsset, loader) {
75
+ const src = resolvedAsset?.src;
76
+ if (!src || !loader) return asset;
77
+ let basePath = path.dirname(src);
78
+ if (basePath && !basePath.endsWith("/")) {
79
+ basePath += "/";
80
+ }
81
+ for (const tilesetRef of asset.tilesets) {
82
+ if (tilesetRef.source) {
83
+ const tilesetPath = basePath + tilesetRef.source;
84
+ const tilesetData = await loader.load({
85
+ src: tilesetPath
86
+ });
87
+ tilesetRef.data = tilesetData;
88
+ }
89
+ const tileset = tilesetRef.data;
90
+ if (!tileset) continue;
91
+ if (tileset.image && !tileset.tiles?.length) {
92
+ const imagePath = basePath + tileset.image;
93
+ const baseTexture = await Assets.load(imagePath);
94
+ const cols = tileset.columns;
95
+ const tw = tileset.tilewidth;
96
+ const th = tileset.tileheight;
97
+ const margin = tileset.margin ?? 0;
98
+ const spacing = tileset.spacing ?? 0;
99
+ for (let id = 0; id < tileset.tilecount; id++) {
100
+ const col = id % cols;
101
+ const row = Math.floor(id / cols);
102
+ const x = margin + col * (tw + spacing);
103
+ const y = margin + row * (th + spacing);
104
+ const frame = new Rectangle(x, y, tw, th);
105
+ const subtex = new Texture({
106
+ source: baseTexture.source,
107
+ frame
108
+ });
109
+ const cacheKey = `${tileset.name}:${id}`;
110
+ Assets.cache.set(cacheKey, subtex);
111
+ }
112
+ }
113
+ }
114
+ return asset;
115
+ },
116
+ unload() {
117
+ }
118
+ };
119
+ var tiledMapAssetExtension = {
120
+ extension: ExtensionType.Asset,
121
+ loader: tiledMapLoaderParser
122
+ };
123
+
124
+ // src/TilemapRenderSystem.ts
125
+ import { System, Phase, Transform as Transform2, QueryCacheKey } from "@yagejs/core";
126
+
127
+ // src/TilemapComponent.ts
128
+ import { Component, Transform, serializable } from "@yagejs/core";
129
+ import { Assets as Assets3, Container } from "pixi.js";
130
+ import { RenderLayerManagerKey } from "@yagejs/renderer";
131
+
132
+ // src/tiled/parseTiledMap.ts
133
+ import { CompositeTilemap } from "@pixi/tilemap";
134
+ import { Assets as Assets2, Texture as Texture2, Rectangle as Rectangle2 } from "pixi.js";
135
+ function toTilemapData(map) {
136
+ const tileLayers = [];
137
+ const objectLayers = [];
138
+ for (const layer of map.layers) {
139
+ if (layer.type === "tilelayer") {
140
+ tileLayers.push({
141
+ name: layer.name,
142
+ data: layer.data,
143
+ width: layer.width,
144
+ height: layer.height,
145
+ visible: layer.visible
146
+ });
147
+ } else if (layer.type === "objectgroup") {
148
+ objectLayers.push({
149
+ name: layer.name,
150
+ objects: layer.objects.map(tiledObjectToMapObject),
151
+ visible: layer.visible
152
+ });
153
+ }
154
+ }
155
+ return {
156
+ width: map.width,
157
+ height: map.height,
158
+ tileWidth: map.tilewidth,
159
+ tileHeight: map.tileheight,
160
+ tileLayers,
161
+ objectLayers
162
+ };
163
+ }
164
+ __name(toTilemapData, "toTilemapData");
165
+ function tiledObjectToMapObject(obj) {
166
+ const result = {
167
+ id: obj.id,
168
+ name: obj.name,
169
+ x: obj.x,
170
+ y: obj.y,
171
+ width: obj.width,
172
+ height: obj.height,
173
+ rotation: obj.rotation,
174
+ visible: obj.visible
175
+ };
176
+ const cls = obj.class ?? obj.type;
177
+ if (cls) result.class = cls;
178
+ if (obj.point === true) result.point = true;
179
+ if (obj.polygon) result.polygon = obj.polygon;
180
+ if (obj.properties) {
181
+ result.properties = obj.properties.map((p) => ({
182
+ name: p.name,
183
+ type: p.type,
184
+ value: p.value
185
+ }));
186
+ }
187
+ return result;
188
+ }
189
+ __name(tiledObjectToMapObject, "tiledObjectToMapObject");
190
+ function findTileset(tilesets, gid) {
191
+ let result = null;
192
+ for (const ts of tilesets) {
193
+ if (ts.firstgid <= gid) {
194
+ if (!result || ts.firstgid > result.firstgid) {
195
+ result = ts;
196
+ }
197
+ }
198
+ }
199
+ return result;
200
+ }
201
+ __name(findTileset, "findTileset");
202
+ function resolveTileTexture(gid, tileset) {
203
+ const data = tileset.data;
204
+ if (!data) return null;
205
+ const localId = gid - tileset.firstgid;
206
+ if (data.tiles?.length) {
207
+ const tileData = data.tiles[localId];
208
+ if (!tileData?.image) return null;
209
+ const filenameMatch = tileData.image.match(/[^/]*$/);
210
+ const filename = filenameMatch?.[0];
211
+ if (!filename) return null;
212
+ const tex = Assets2.get(filename);
213
+ return tex ?? null;
214
+ }
215
+ if (data.image) {
216
+ const cacheKey = `${data.name}:${localId}`;
217
+ const tex = Assets2.get(cacheKey);
218
+ if (tex) return tex;
219
+ const filenameMatch = data.image.match(/[^/]*$/);
220
+ const filename = filenameMatch?.[0];
221
+ if (!filename) return null;
222
+ const baseTex = Assets2.get(filename);
223
+ if (!baseTex) return null;
224
+ const cols = data.columns;
225
+ const tw = data.tilewidth;
226
+ const th = data.tileheight;
227
+ const margin = data.margin ?? 0;
228
+ const spacing = data.spacing ?? 0;
229
+ const col = localId % cols;
230
+ const row = Math.floor(localId / cols);
231
+ const x = margin + col * (tw + spacing);
232
+ const y = margin + row * (th + spacing);
233
+ return new Texture2({
234
+ source: baseTex.source,
235
+ frame: new Rectangle2(x, y, tw, th)
236
+ });
237
+ }
238
+ return null;
239
+ }
240
+ __name(resolveTileTexture, "resolveTileTexture");
241
+ function createTilemapLayers(map, layerNames) {
242
+ const tileLayers = map.layers.filter(
243
+ (l) => l.type === "tilelayer"
244
+ );
245
+ const filtered = layerNames ? tileLayers.filter((l) => layerNames.includes(l.name)) : tileLayers;
246
+ return filtered.map((layer) => {
247
+ const tilemap = new CompositeTilemap();
248
+ const { data, width } = layer;
249
+ for (let index = 0; index < data.length; index++) {
250
+ const gid = data[index];
251
+ if (gid === 0) continue;
252
+ const tileset = findTileset(map.tilesets, gid);
253
+ if (!tileset) {
254
+ throw new Error(`No tileset found for tile GID ${gid}`);
255
+ }
256
+ const texture = resolveTileTexture(gid, tileset);
257
+ if (!texture) {
258
+ throw new Error(
259
+ `Could not resolve texture for tile GID ${gid} in tileset "${tileset.data?.name}"`
260
+ );
261
+ }
262
+ const x = index % width;
263
+ const y = Math.floor(index / width);
264
+ tilemap.tile(texture, x * map.tilewidth, y * map.tileheight);
265
+ }
266
+ return tilemap;
267
+ });
268
+ }
269
+ __name(createTilemapLayers, "createTilemapLayers");
270
+ function extractObjects(map, objectLayerName) {
271
+ const objectLayers = map.layers.filter(
272
+ (l) => l.type === "objectgroup"
273
+ );
274
+ const filtered = objectLayerName ? objectLayers.filter((l) => l.name === objectLayerName) : objectLayers;
275
+ const result = {};
276
+ for (const layer of filtered) {
277
+ for (const obj of layer.objects) {
278
+ const key = obj.class ?? obj.type ?? obj.name;
279
+ if (!result[key]) {
280
+ result[key] = [];
281
+ }
282
+ result[key].push(obj);
283
+ }
284
+ }
285
+ return result;
286
+ }
287
+ __name(extractObjects, "extractObjects");
288
+
289
+ // src/colliders.ts
290
+ function extractCollisionShapes(map, objectLayerName) {
291
+ const filtered = objectLayerName ? map.objectLayers.filter((l) => l.name === objectLayerName) : map.objectLayers;
292
+ const shapes = [];
293
+ for (const layer of filtered) {
294
+ for (const obj of layer.objects) {
295
+ const shape = objectToColliderConfig(obj);
296
+ if (shape) shapes.push(shape);
297
+ }
298
+ }
299
+ return shapes;
300
+ }
301
+ __name(extractCollisionShapes, "extractCollisionShapes");
302
+ function objectToColliderConfig(obj) {
303
+ if (obj.point) return null;
304
+ if (obj.polygon) {
305
+ const config2 = {
306
+ type: "polygon",
307
+ x: obj.x,
308
+ y: obj.y,
309
+ vertices: obj.polygon.map((v) => ({ x: v.x, y: v.y }))
310
+ };
311
+ return config2;
312
+ }
313
+ const config = {
314
+ type: "rect",
315
+ x: obj.x,
316
+ y: obj.y,
317
+ width: obj.width,
318
+ height: obj.height
319
+ };
320
+ return config;
321
+ }
322
+ __name(objectToColliderConfig, "objectToColliderConfig");
323
+
324
+ // src/TilemapComponent.ts
325
+ var _TilemapComponent_decorators, _init, _a;
326
+ _TilemapComponent_decorators = [serializable];
327
+ var _TilemapComponent = class _TilemapComponent extends (_a = Component) {
328
+ static {
329
+ __name(this, "TilemapComponent");
330
+ }
331
+ container;
332
+ data;
333
+ _tiledMap;
334
+ _mapKey;
335
+ layerNames;
336
+ renderLayerName;
337
+ constructor(options) {
338
+ super();
339
+ if (!options.map && !options.mapKey) {
340
+ throw new Error(
341
+ "TilemapComponent requires either `map` or `mapKey`."
342
+ );
343
+ }
344
+ this._mapKey = options.mapKey ?? null;
345
+ const tiledMap2 = options.map ?? Assets3.get(options.mapKey);
346
+ if (!tiledMap2) {
347
+ throw new Error(
348
+ `TilemapComponent: map "${options.mapKey}" is not loaded. Add it to scene preload.`
349
+ );
350
+ }
351
+ this._tiledMap = tiledMap2;
352
+ this.data = toTilemapData(tiledMap2);
353
+ this.layerNames = options.layers;
354
+ this.renderLayerName = options.layer ?? "default";
355
+ this.container = new Container();
356
+ }
357
+ onAdd() {
358
+ const tilemapLayers = createTilemapLayers(this._tiledMap, this.layerNames);
359
+ for (const layer of tilemapLayers) {
360
+ this.container.addChild(layer);
361
+ }
362
+ const layers = this.use(RenderLayerManagerKey);
363
+ const renderLayer = layers.get(this.renderLayerName);
364
+ renderLayer.container.addChild(this.container);
365
+ }
366
+ onDestroy() {
367
+ this.container.removeFromParent();
368
+ this.container.destroy({ children: true });
369
+ }
370
+ serialize() {
371
+ if (!this._mapKey) {
372
+ console.warn(
373
+ `TilemapComponent on "${this.entity?.name}": created with a TiledMapData object. Use { mapKey } for save/load support.`
374
+ );
375
+ return null;
376
+ }
377
+ return {
378
+ mapKey: this._mapKey,
379
+ layer: this.renderLayerName,
380
+ ...this.layerNames && { layers: this.layerNames }
381
+ };
382
+ }
383
+ static fromSnapshot(data) {
384
+ return new _TilemapComponent({
385
+ mapKey: data.mapKey,
386
+ layer: data.layer,
387
+ ...data.layers && { layers: data.layers }
388
+ });
389
+ }
390
+ /** Map width in pixels. */
391
+ get widthPx() {
392
+ return this.data.width * this.data.tileWidth;
393
+ }
394
+ /** Map height in pixels. */
395
+ get heightPx() {
396
+ return this.data.height * this.data.tileHeight;
397
+ }
398
+ /** Tile width in pixels. */
399
+ get tileWidth() {
400
+ return this.data.tileWidth;
401
+ }
402
+ /** Tile height in pixels. */
403
+ get tileHeight() {
404
+ return this.data.tileHeight;
405
+ }
406
+ /**
407
+ * Returns the tile GID at a world position, accounting for entity Transform offset.
408
+ * Returns null if the position is outside the map or the tile is empty.
409
+ */
410
+ getTileAt(worldX, worldY, layerName) {
411
+ const transform = this.entity.tryGet(Transform);
412
+ const offsetX = transform ? transform.position.x : 0;
413
+ const offsetY = transform ? transform.position.y : 0;
414
+ const localX = worldX - offsetX;
415
+ const localY = worldY - offsetY;
416
+ const col = Math.floor(localX / this.data.tileWidth);
417
+ const row = Math.floor(localY / this.data.tileHeight);
418
+ if (col < 0 || col >= this.data.width) return null;
419
+ if (row < 0 || row >= this.data.height) return null;
420
+ const layers = layerName ? this.data.tileLayers.filter((l) => l.name === layerName) : this.data.tileLayers;
421
+ for (let i = layers.length - 1; i >= 0; i--) {
422
+ const layer = layers[i];
423
+ const gid = layer.data[row * layer.width + col];
424
+ if (gid !== void 0 && gid !== 0) return gid;
425
+ }
426
+ return null;
427
+ }
428
+ /** Extract physics-agnostic collision shapes from object layers. */
429
+ getCollisionShapes(objectLayerName) {
430
+ return extractCollisionShapes(this.data, objectLayerName);
431
+ }
432
+ /** Extract objects from object layers grouped by class/name. */
433
+ getObjects(objectLayerName) {
434
+ const filtered = objectLayerName ? this.data.objectLayers.filter((l) => l.name === objectLayerName) : this.data.objectLayers;
435
+ const result = {};
436
+ for (const layer of filtered) {
437
+ for (const obj of layer.objects) {
438
+ const key = obj.class ?? obj.name;
439
+ if (!result[key]) {
440
+ result[key] = [];
441
+ }
442
+ result[key].push(obj);
443
+ }
444
+ }
445
+ return result;
446
+ }
447
+ };
448
+ _init = __decoratorStart(_a);
449
+ _TilemapComponent = __decorateElement(_init, 0, "TilemapComponent", _TilemapComponent_decorators, _TilemapComponent);
450
+ __runInitializers(_init, 1, _TilemapComponent);
451
+ var TilemapComponent = _TilemapComponent;
452
+
453
+ // src/TilemapRenderSystem.ts
454
+ var TilemapRenderSystem = class extends System {
455
+ static {
456
+ __name(this, "TilemapRenderSystem");
457
+ }
458
+ phase = Phase.Render;
459
+ priority = -1;
460
+ // Before DisplaySystem (0), so tilemaps render behind sprites
461
+ query;
462
+ onRegister(context) {
463
+ const queryCache = context.resolve(QueryCacheKey);
464
+ this.query = queryCache.register([Transform2, TilemapComponent]);
465
+ }
466
+ update() {
467
+ for (const entity of this.query) {
468
+ const transform = entity.get(Transform2);
469
+ const tilemap = entity.get(TilemapComponent);
470
+ if (!tilemap.enabled) continue;
471
+ tilemap.container.position.x = transform.worldPosition.x;
472
+ tilemap.container.position.y = transform.worldPosition.y;
473
+ tilemap.container.rotation = transform.worldRotation;
474
+ tilemap.container.scale.x = transform.worldScale.x;
475
+ tilemap.container.scale.y = transform.worldScale.y;
476
+ }
477
+ }
478
+ };
479
+
480
+ // src/TilemapPlugin.ts
481
+ var TilemapPlugin = class {
482
+ static {
483
+ __name(this, "TilemapPlugin");
484
+ }
485
+ name = "tilemap";
486
+ version = "2.0.0";
487
+ dependencies = ["renderer"];
488
+ install(context) {
489
+ extensions.add(tiledMapAssetExtension);
490
+ const am = context.tryResolve(AssetManagerKey);
491
+ am?.registerLoader("tiledMap", {
492
+ load: /* @__PURE__ */ __name((path2) => Assets4.load(path2), "load"),
493
+ unload: /* @__PURE__ */ __name((path2) => {
494
+ Assets4.unload(path2);
495
+ }, "unload")
496
+ });
497
+ }
498
+ registerSystems(scheduler) {
499
+ scheduler.add(new TilemapRenderSystem());
500
+ }
501
+ };
502
+
503
+ // src/assets.ts
504
+ import { AssetHandle } from "@yagejs/core";
505
+ function tiledMap(path2) {
506
+ return new AssetHandle("tiledMap", path2);
507
+ }
508
+ __name(tiledMap, "tiledMap");
509
+
510
+ // src/toPhysicsColliders.ts
511
+ function toPhysicsColliders(shapes) {
512
+ return shapes.map(toPhysicsCollider);
513
+ }
514
+ __name(toPhysicsColliders, "toPhysicsColliders");
515
+ function toPhysicsCollider(config) {
516
+ switch (config.type) {
517
+ case "polygon":
518
+ return {
519
+ shape: {
520
+ type: "polygon",
521
+ vertices: config.vertices
522
+ },
523
+ offset: { x: config.x, y: config.y }
524
+ };
525
+ case "rect":
526
+ return {
527
+ shape: { type: "box", width: config.width, height: config.height },
528
+ offset: {
529
+ x: config.x + config.width / 2,
530
+ y: config.y + config.height / 2
531
+ }
532
+ };
533
+ }
534
+ }
535
+ __name(toPhysicsCollider, "toPhysicsCollider");
536
+
537
+ // src/properties.ts
538
+ function getProperty(obj, name) {
539
+ const prop = obj.properties?.find((p) => p.name === name);
540
+ return prop?.value;
541
+ }
542
+ __name(getProperty, "getProperty");
543
+ function getPropertyArray(obj, name) {
544
+ const pattern = new RegExp(`^${escapeRegex(name)}\\[(\\d+)\\]$`);
545
+ const values = [];
546
+ if (!obj.properties) return values;
547
+ for (const prop of obj.properties) {
548
+ const match = prop.name.match(pattern);
549
+ if (match) {
550
+ const index = Number.parseInt(match[1], 10);
551
+ values[index] = prop.value;
552
+ }
553
+ }
554
+ return values;
555
+ }
556
+ __name(getPropertyArray, "getPropertyArray");
557
+ function resolveObjectRef(obj, propName, allObjects) {
558
+ const id = getProperty(obj, propName);
559
+ if (id === void 0) return void 0;
560
+ return allObjects.find((o) => o.id === id);
561
+ }
562
+ __name(resolveObjectRef, "resolveObjectRef");
563
+ function resolveObjectRefArray(obj, propName, allObjects) {
564
+ const ids = getPropertyArray(obj, propName);
565
+ return ids.map((id) => allObjects.find((o) => o.id === id)).filter((o) => o !== void 0);
566
+ }
567
+ __name(resolveObjectRefArray, "resolveObjectRefArray");
568
+ function escapeRegex(str) {
569
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
570
+ }
571
+ __name(escapeRegex, "escapeRegex");
572
+ export {
573
+ TilemapComponent,
574
+ TilemapPlugin,
575
+ TilemapRenderSystem,
576
+ createTilemapLayers,
577
+ extractCollisionShapes,
578
+ extractObjects,
579
+ getProperty,
580
+ getPropertyArray,
581
+ resolveObjectRef,
582
+ resolveObjectRefArray,
583
+ tiledMap,
584
+ tiledMapAssetExtension,
585
+ toPhysicsColliders,
586
+ toTilemapData
587
+ };
588
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/TilemapPlugin.ts","../src/tiled/tiledMapLoader.ts","../src/TilemapRenderSystem.ts","../src/TilemapComponent.ts","../src/tiled/parseTiledMap.ts","../src/colliders.ts","../src/assets.ts","../src/toPhysicsColliders.ts","../src/properties.ts"],"sourcesContent":["import { AssetManagerKey } from \"@yagejs/core\";\nimport type { EngineContext, Plugin, SystemScheduler } from \"@yagejs/core\";\nimport { extensions, Assets } from \"pixi.js\";\nimport { tiledMapAssetExtension } from \"./tiled/tiledMapLoader.js\";\nimport { TilemapRenderSystem } from \"./TilemapRenderSystem.js\";\nimport type { TiledMapData } from \"./tiled/types.js\";\n\n/** Plugin that adds Tiled map loading and rendering to YAGE. */\nexport class TilemapPlugin implements Plugin {\n readonly name = \"tilemap\";\n readonly version = \"2.0.0\";\n readonly dependencies = [\"renderer\"] as const;\n\n install(context: EngineContext): void {\n // Register PixiJS loader extension for Tiled map JSON files\n extensions.add(tiledMapAssetExtension);\n\n // Register \"tiledMap\" loader with AssetManager\n const am = context.tryResolve(AssetManagerKey);\n am?.registerLoader(\"tiledMap\", {\n load: (path: string) => Assets.load<TiledMapData>(path),\n unload: (path: string) => {\n Assets.unload(path);\n },\n });\n }\n\n registerSystems(scheduler: SystemScheduler): void {\n scheduler.add(new TilemapRenderSystem());\n }\n}\n","import {\n ExtensionType,\n LoaderParserPriority,\n Assets,\n path,\n Texture,\n Rectangle,\n} from \"pixi.js\";\nimport type { LoaderParser, ResolvedAsset, Loader } from \"pixi.js\";\nimport type { TiledMapData, TilesetData, TilesetRef } from \"./types.js\";\n\n/**\n * PixiJS loader extension that detects Tiled map JSON files and resolves\n * their tileset references.\n *\n * Supports two tileset formats:\n * 1. **Collection-of-images** — tileset has `tiles[]` with image paths.\n * Assumes textures are already in the PixiJS cache (e.g. from a\n * pre-loaded spritesheet atlas).\n * 2. **Single-image tileset** — tileset has an `image` property pointing\n * to a spritesheet. The loader loads the image and creates sub-textures\n * for each tile based on grid layout.\n */\nconst tiledMapLoaderParser: LoaderParser<TiledMapData> = {\n id: \"tiledMapLoader\",\n\n extension: {\n type: ExtensionType.LoadParser,\n priority: LoaderParserPriority.High,\n },\n\n async testParse(\n asset: TiledMapData,\n resolvedAsset?: ResolvedAsset,\n ): Promise<boolean> {\n if (!resolvedAsset?.src) return false;\n if (path.extname(resolvedAsset.src).toLowerCase() !== \".json\") return false;\n const obj = asset as unknown as Record<string, unknown>;\n return !!(obj.tilesets && obj.layers);\n },\n\n async parse(\n asset: TiledMapData,\n resolvedAsset?: ResolvedAsset,\n loader?: Loader,\n ): Promise<TiledMapData> {\n const src = resolvedAsset?.src;\n if (!src || !loader) return asset;\n\n let basePath = path.dirname(src);\n if (basePath && !basePath.endsWith(\"/\")) {\n basePath += \"/\";\n }\n\n for (const tilesetRef of asset.tilesets as TilesetRef[]) {\n if (tilesetRef.source) {\n // External tileset JSON — load it\n const tilesetPath = basePath + tilesetRef.source;\n const tilesetData = (await loader.load<TilesetData>({\n src: tilesetPath,\n })) as TilesetData;\n tilesetRef.data = tilesetData;\n }\n\n const tileset = tilesetRef.data;\n if (!tileset) continue;\n\n // Single-image tileset: load the image and create sub-textures\n if (tileset.image && !tileset.tiles?.length) {\n const imagePath = basePath + tileset.image;\n const baseTexture = await Assets.load<Texture>(imagePath);\n const cols = tileset.columns;\n const tw = tileset.tilewidth;\n const th = tileset.tileheight;\n const margin = tileset.margin ?? 0;\n const spacing = tileset.spacing ?? 0;\n\n for (let id = 0; id < tileset.tilecount; id++) {\n const col = id % cols;\n const row = Math.floor(id / cols);\n const x = margin + col * (tw + spacing);\n const y = margin + row * (th + spacing);\n\n const frame = new Rectangle(x, y, tw, th);\n const subtex = new Texture({\n source: baseTexture.source,\n frame,\n });\n\n // Store subtexture in PixiJS cache with a key like \"tileset-name:id\"\n const cacheKey = `${tileset.name}:${id}`;\n Assets.cache.set(cacheKey, subtex);\n }\n }\n // Collection-of-images: textures are expected to already be\n // in the PixiJS cache (loaded via spritesheet atlas).\n }\n\n return asset;\n },\n\n unload() {},\n};\n\n/** PixiJS asset extension bundle for Tiled map JSON files. */\nexport const tiledMapAssetExtension = {\n extension: ExtensionType.Asset,\n loader: tiledMapLoaderParser,\n};\n","import { System, Phase, Transform, QueryCacheKey } from \"@yagejs/core\";\nimport type { EngineContext, QueryResult } from \"@yagejs/core\";\nimport { TilemapComponent } from \"./TilemapComponent.js\";\n\n/** Syncs Transform to TilemapComponent display containers. */\nexport class TilemapRenderSystem extends System {\n readonly phase = Phase.Render;\n readonly priority = -1; // Before DisplaySystem (0), so tilemaps render behind sprites\n\n private query!: QueryResult;\n\n onRegister(context: EngineContext): void {\n const queryCache = context.resolve(QueryCacheKey);\n this.query = queryCache.register([Transform, TilemapComponent]);\n }\n\n update(): void {\n for (const entity of this.query) {\n const transform = entity.get(Transform);\n const tilemap = entity.get(TilemapComponent);\n if (!tilemap.enabled) continue;\n\n tilemap.container.position.x = transform.worldPosition.x;\n tilemap.container.position.y = transform.worldPosition.y;\n tilemap.container.rotation = transform.worldRotation;\n tilemap.container.scale.x = transform.worldScale.x;\n tilemap.container.scale.y = transform.worldScale.y;\n }\n }\n}\n","import { Component, Transform, serializable } from \"@yagejs/core\";\nimport { Assets, Container } from \"pixi.js\";\nimport { RenderLayerManagerKey } from \"@yagejs/renderer\";\nimport { createTilemapLayers, toTilemapData } from \"./tiled/parseTiledMap.js\";\nimport { extractCollisionShapes } from \"./colliders.js\";\nimport type { TiledMapData } from \"./tiled/types.js\";\nimport type {\n TilemapData,\n MapObject,\n TilemapColliderConfig,\n} from \"./types.js\";\n\n/** Options for creating a TilemapComponent. */\nexport interface TilemapComponentOptions {\n /** Parsed Tiled map data (not serializable). */\n map?: TiledMapData;\n /** Asset path to the Tiled JSON (serializable, resolved via Assets.get). */\n mapKey?: string;\n /** Which tile layers to render. Omit to render all. */\n layers?: string[];\n /** Render layer name. Default: \"default\". */\n layer?: string;\n}\n\n/** Serializable snapshot of a TilemapComponent. */\nexport interface TilemapComponentData {\n mapKey: string;\n layers?: string[];\n layer: string;\n}\n\n/** Component that renders a Tiled map using @pixi/tilemap. */\n@serializable\nexport class TilemapComponent extends Component {\n readonly container: Container;\n readonly data: TilemapData;\n private readonly _tiledMap: TiledMapData;\n private readonly _mapKey: string | null;\n private readonly layerNames: string[] | undefined;\n private readonly renderLayerName: string;\n\n constructor(options: TilemapComponentOptions) {\n super();\n\n if (!options.map && !options.mapKey) {\n throw new Error(\n \"TilemapComponent requires either `map` or `mapKey`.\",\n );\n }\n\n this._mapKey = options.mapKey ?? null;\n const tiledMap = options.map ?? Assets.get<TiledMapData>(options.mapKey!);\n if (!tiledMap) {\n throw new Error(\n `TilemapComponent: map \"${options.mapKey}\" is not loaded. Add it to scene preload.`,\n );\n }\n\n this._tiledMap = tiledMap;\n this.data = toTilemapData(tiledMap);\n this.layerNames = options.layers;\n this.renderLayerName = options.layer ?? \"default\";\n this.container = new Container();\n }\n\n onAdd(): void {\n const tilemapLayers = createTilemapLayers(this._tiledMap, this.layerNames);\n for (const layer of tilemapLayers) {\n this.container.addChild(layer);\n }\n\n const layers = this.use(RenderLayerManagerKey);\n const renderLayer = layers.get(this.renderLayerName);\n renderLayer.container.addChild(this.container);\n }\n\n onDestroy(): void {\n this.container.removeFromParent();\n this.container.destroy({ children: true });\n }\n\n serialize(): TilemapComponentData | null {\n if (!this._mapKey) {\n console.warn(\n `TilemapComponent on \"${this.entity?.name}\": created with a TiledMapData object. ` +\n `Use { mapKey } for save/load support.`,\n );\n return null;\n }\n return {\n mapKey: this._mapKey,\n layer: this.renderLayerName,\n ...(this.layerNames && { layers: this.layerNames }),\n };\n }\n\n static fromSnapshot(data: TilemapComponentData): TilemapComponent {\n return new TilemapComponent({\n mapKey: data.mapKey,\n layer: data.layer,\n ...(data.layers && { layers: data.layers }),\n });\n }\n\n /** Map width in pixels. */\n get widthPx(): number {\n return this.data.width * this.data.tileWidth;\n }\n\n /** Map height in pixels. */\n get heightPx(): number {\n return this.data.height * this.data.tileHeight;\n }\n\n /** Tile width in pixels. */\n get tileWidth(): number {\n return this.data.tileWidth;\n }\n\n /** Tile height in pixels. */\n get tileHeight(): number {\n return this.data.tileHeight;\n }\n\n /**\n * Returns the tile GID at a world position, accounting for entity Transform offset.\n * Returns null if the position is outside the map or the tile is empty.\n */\n getTileAt(\n worldX: number,\n worldY: number,\n layerName?: string,\n ): number | null {\n const transform = this.entity.tryGet(Transform);\n const offsetX = transform ? transform.position.x : 0;\n const offsetY = transform ? transform.position.y : 0;\n const localX = worldX - offsetX;\n const localY = worldY - offsetY;\n\n const col = Math.floor(localX / this.data.tileWidth);\n const row = Math.floor(localY / this.data.tileHeight);\n\n if (col < 0 || col >= this.data.width) return null;\n if (row < 0 || row >= this.data.height) return null;\n\n const layers = layerName\n ? this.data.tileLayers.filter((l) => l.name === layerName)\n : this.data.tileLayers;\n\n // Return first non-zero GID found (from last layer to first for top-most)\n for (let i = layers.length - 1; i >= 0; i--) {\n const layer = layers[i]!;\n const gid = layer.data[row * layer.width + col];\n if (gid !== undefined && gid !== 0) return gid;\n }\n\n return null;\n }\n\n /** Extract physics-agnostic collision shapes from object layers. */\n getCollisionShapes(objectLayerName?: string): TilemapColliderConfig[] {\n return extractCollisionShapes(this.data, objectLayerName);\n }\n\n /** Extract objects from object layers grouped by class/name. */\n getObjects(objectLayerName?: string): Record<string, MapObject[]> {\n const filtered = objectLayerName\n ? this.data.objectLayers.filter((l) => l.name === objectLayerName)\n : this.data.objectLayers;\n\n const result: Record<string, MapObject[]> = {};\n\n for (const layer of filtered) {\n for (const obj of layer.objects) {\n const key = obj.class ?? obj.name;\n if (!result[key]) {\n result[key] = [];\n }\n result[key].push(obj);\n }\n }\n\n return result;\n }\n}\n","import { CompositeTilemap } from \"@pixi/tilemap\";\nimport { Assets, Texture, Rectangle } from \"pixi.js\";\nimport type {\n TiledMapData,\n TileLayer,\n TilesetRef,\n ObjectGroup,\n TileObject,\n} from \"./types.js\";\nimport type {\n TilemapData,\n TileLayerData,\n ObjectLayerData,\n MapObject,\n} from \"../types.js\";\n\n// ─── Generic adapter ────────────────────────────────────────────────\n\n/**\n * Convert Tiled JSON data to the generic TilemapData format.\n */\nexport function toTilemapData(map: TiledMapData): TilemapData {\n const tileLayers: TileLayerData[] = [];\n const objectLayers: ObjectLayerData[] = [];\n\n for (const layer of map.layers) {\n if (layer.type === \"tilelayer\") {\n tileLayers.push({\n name: layer.name,\n data: layer.data,\n width: layer.width,\n height: layer.height,\n visible: layer.visible,\n });\n } else if (layer.type === \"objectgroup\") {\n objectLayers.push({\n name: layer.name,\n objects: layer.objects.map(tiledObjectToMapObject),\n visible: layer.visible,\n });\n }\n }\n\n return {\n width: map.width,\n height: map.height,\n tileWidth: map.tilewidth,\n tileHeight: map.tileheight,\n tileLayers,\n objectLayers,\n };\n}\n\nfunction tiledObjectToMapObject(obj: TileObject): MapObject {\n const result: MapObject = {\n id: obj.id,\n name: obj.name,\n x: obj.x,\n y: obj.y,\n width: obj.width,\n height: obj.height,\n rotation: obj.rotation,\n visible: obj.visible,\n };\n\n const cls = obj.class ?? obj.type;\n if (cls) result.class = cls;\n if (obj.point === true) result.point = true;\n if (obj.polygon) result.polygon = obj.polygon;\n if (obj.properties) {\n result.properties = obj.properties.map((p) => ({\n name: p.name,\n type: p.type,\n value: p.value,\n }));\n }\n\n return result;\n}\n\n// ─── Tiled-specific rendering ───────────────────────────────────────\n\n/**\n * Resolve the tileset that owns a given global tile ID.\n * Tilesets are sorted by firstgid; we find the last tileset whose firstgid <= gid.\n */\nfunction findTileset(tilesets: TilesetRef[], gid: number): TilesetRef | null {\n let result: TilesetRef | null = null;\n for (const ts of tilesets) {\n if (ts.firstgid <= gid) {\n if (!result || ts.firstgid > result.firstgid) {\n result = ts;\n }\n }\n }\n return result;\n}\n\n/**\n * Resolve the texture for a tile given its GID and owning tileset.\n */\nfunction resolveTileTexture(\n gid: number,\n tileset: TilesetRef,\n): Texture | null {\n const data = tileset.data;\n if (!data) return null;\n const localId = gid - tileset.firstgid;\n\n if (data.tiles?.length) {\n // Collection-of-images tileset: look up texture by filename from cache\n const tileData = data.tiles[localId];\n if (!tileData?.image) return null;\n const filenameMatch = tileData.image.match(/[^/]*$/);\n const filename = filenameMatch?.[0];\n if (!filename) return null;\n const tex = Assets.get<Texture>(filename);\n return tex ?? null;\n }\n\n if (data.image) {\n // Single-image tileset: sub-textures were created by the loader\n const cacheKey = `${data.name}:${localId}`;\n const tex = Assets.get<Texture>(cacheKey);\n if (tex) return tex;\n\n // Fallback: create sub-texture on the fly from the base image\n const filenameMatch = data.image.match(/[^/]*$/);\n const filename = filenameMatch?.[0];\n if (!filename) return null;\n const baseTex = Assets.get<Texture>(filename);\n if (!baseTex) return null;\n\n const cols = data.columns;\n const tw = data.tilewidth;\n const th = data.tileheight;\n const margin = data.margin ?? 0;\n const spacing = data.spacing ?? 0;\n const col = localId % cols;\n const row = Math.floor(localId / cols);\n const x = margin + col * (tw + spacing);\n const y = margin + row * (th + spacing);\n\n return new Texture({\n source: baseTex.source,\n frame: new Rectangle(x, y, tw, th),\n });\n }\n\n return null;\n}\n\n/**\n * Build CompositeTilemap display objects from a parsed Tiled map.\n *\n * @param map - Parsed TiledMapData (with resolved tilesets).\n * @param layerNames - Optional filter: only process these tile layer names.\n * @returns Array of CompositeTilemap, one per tile layer.\n */\nexport function createTilemapLayers(\n map: TiledMapData,\n layerNames?: string[],\n): CompositeTilemap[] {\n const tileLayers = map.layers.filter(\n (l): l is TileLayer => l.type === \"tilelayer\",\n );\n\n const filtered = layerNames\n ? tileLayers.filter((l) => layerNames.includes(l.name))\n : tileLayers;\n\n return filtered.map((layer) => {\n const tilemap = new CompositeTilemap();\n const { data, width } = layer;\n\n for (let index = 0; index < data.length; index++) {\n const gid = data[index]!;\n if (gid === 0) continue;\n\n const tileset = findTileset(map.tilesets, gid);\n if (!tileset) {\n throw new Error(`No tileset found for tile GID ${gid}`);\n }\n\n const texture = resolveTileTexture(gid, tileset);\n if (!texture) {\n throw new Error(\n `Could not resolve texture for tile GID ${gid} in tileset \"${tileset.data?.name}\"`,\n );\n }\n\n const x = index % width;\n const y = Math.floor(index / width);\n tilemap.tile(texture, x * map.tilewidth, y * map.tileheight);\n }\n\n return tilemap;\n });\n}\n\n/**\n * Extract objects from Tiled object layers, grouped by class/type/name.\n *\n * @param map - Parsed TiledMapData.\n * @param objectLayerName - Optional: only extract from this layer.\n * @returns Record mapping class/type/name to arrays of TileObject.\n */\nexport function extractObjects(\n map: TiledMapData,\n objectLayerName?: string,\n): Record<string, TileObject[]> {\n const objectLayers = map.layers.filter(\n (l): l is ObjectGroup => l.type === \"objectgroup\",\n );\n\n const filtered = objectLayerName\n ? objectLayers.filter((l) => l.name === objectLayerName)\n : objectLayers;\n\n const result: Record<string, TileObject[]> = {};\n\n for (const layer of filtered) {\n for (const obj of layer.objects) {\n const key = obj.class ?? obj.type ?? obj.name;\n if (!result[key]) {\n result[key] = [];\n }\n result[key].push(obj);\n }\n }\n\n return result;\n}\n","import type {\n TilemapData,\n MapObject,\n TilemapColliderConfig,\n RectColliderConfig,\n PolygonColliderConfig,\n} from \"./types.js\";\n\n/**\n * Extract physics-agnostic collision shapes from object layers.\n *\n * - Rectangle objects -> RectColliderConfig\n * - Polygon objects -> PolygonColliderConfig\n * - Point objects -> skipped (not collision shapes)\n *\n * @param map - Generic TilemapData.\n * @param objectLayerName - Optional: only extract from this layer.\n */\nexport function extractCollisionShapes(\n map: TilemapData,\n objectLayerName?: string,\n): TilemapColliderConfig[] {\n const filtered = objectLayerName\n ? map.objectLayers.filter((l) => l.name === objectLayerName)\n : map.objectLayers;\n\n const shapes: TilemapColliderConfig[] = [];\n\n for (const layer of filtered) {\n for (const obj of layer.objects) {\n const shape = objectToColliderConfig(obj);\n if (shape) shapes.push(shape);\n }\n }\n\n return shapes;\n}\n\n/**\n * Convert a single MapObject to a ColliderConfig.\n * Returns null for point objects (not collision shapes).\n */\nfunction objectToColliderConfig(obj: MapObject): TilemapColliderConfig | null {\n // Skip point objects\n if (obj.point) return null;\n\n if (obj.polygon) {\n const config: PolygonColliderConfig = {\n type: \"polygon\",\n x: obj.x,\n y: obj.y,\n vertices: obj.polygon.map((v) => ({ x: v.x, y: v.y })),\n };\n return config;\n }\n\n // Rectangle object\n const config: RectColliderConfig = {\n type: \"rect\",\n x: obj.x,\n y: obj.y,\n width: obj.width,\n height: obj.height,\n };\n return config;\n}\n","import { AssetHandle } from \"@yagejs/core\";\nimport type { TiledMapData } from \"./tiled/types.js\";\n\n/** Create a typed asset handle for a Tiled map JSON. */\nexport function tiledMap(path: string): AssetHandle<TiledMapData> {\n return new AssetHandle(\"tiledMap\", path);\n}\n","import type { ColliderConfig as PhysicsColliderConfig } from \"@yagejs/physics\";\nimport type { TilemapColliderConfig } from \"./types.js\";\n\n/**\n * Convert tilemap TilemapColliderConfig[] (top-left origin rects/polygons) into\n * physics-package ColliderConfig[] (center-origin shape + offset).\n */\nexport function toPhysicsColliders(\n shapes: TilemapColliderConfig[],\n): PhysicsColliderConfig[] {\n return shapes.map(toPhysicsCollider);\n}\n\nfunction toPhysicsCollider(config: TilemapColliderConfig): PhysicsColliderConfig {\n switch (config.type) {\n case \"polygon\":\n return {\n shape: {\n type: \"polygon\",\n vertices: config.vertices,\n },\n offset: { x: config.x, y: config.y },\n };\n case \"rect\":\n return {\n shape: { type: \"box\", width: config.width, height: config.height },\n offset: {\n x: config.x + config.width / 2,\n y: config.y + config.height / 2,\n },\n };\n }\n}\n","import type { HasProperties, MapObject } from \"./types.js\";\n\n/**\n * Get a single property value by name.\n * Returns `undefined` if the property is not found.\n */\nexport function getProperty<T = unknown>(\n obj: HasProperties,\n name: string,\n): T | undefined {\n const prop = obj.properties?.find((p) => p.name === name);\n return prop?.value as T | undefined;\n}\n\n/**\n * Get a pseudo-array of property values.\n *\n * Tiled doesn't support array properties natively, so a common convention\n * is to use indexed names like `spawns[0]`, `spawns[1]`, etc.\n * This function collects them into a proper array, preserving index order.\n */\nexport function getPropertyArray<T = unknown>(\n obj: HasProperties,\n name: string,\n): T[] {\n const pattern = new RegExp(`^${escapeRegex(name)}\\\\[(\\\\d+)\\\\]$`);\n const values: T[] = [];\n\n if (!obj.properties) return values;\n\n for (const prop of obj.properties) {\n const match = prop.name.match(pattern);\n if (match) {\n const index = Number.parseInt(match[1]!, 10);\n values[index] = prop.value as T;\n }\n }\n\n return values;\n}\n\n/**\n * Resolve a property of `type: \"object\"` (an ID reference) to the actual MapObject.\n * Returns `undefined` if the property doesn't exist or the referenced object isn't found.\n */\nexport function resolveObjectRef(\n obj: HasProperties,\n propName: string,\n allObjects: MapObject[],\n): MapObject | undefined {\n const id = getProperty<number>(obj, propName);\n if (id === undefined) return undefined;\n return allObjects.find((o) => o.id === id);\n}\n\n/**\n * Resolve a pseudo-array of object ID references to actual MapObjects.\n * Uses the `name[0]`, `name[1]` convention.\n */\nexport function resolveObjectRefArray(\n obj: HasProperties,\n propName: string,\n allObjects: MapObject[],\n): MapObject[] {\n const ids = getPropertyArray<number>(obj, propName);\n return ids\n .map((id) => allObjects.find((o) => o.id === id))\n .filter((o): o is MapObject => o !== undefined);\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n"],"mappings":"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","names":["Assets","Transform","Assets","Assets","Texture","Rectangle","Assets","Texture","Rectangle","config","tiledMap","Assets","Transform","path","Assets","path"]}