@canvasengine/presets 2.0.0-beta.16 → 2.0.0-beta.18

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.d.ts CHANGED
@@ -7,6 +7,9 @@ interface BarProps {
7
7
  maxValue: number;
8
8
  width: number;
9
9
  height: number;
10
+ border?: any;
11
+ innerMargin?: number;
12
+ borderRadius?: number;
10
13
  }
11
14
  declare function Bar(opts: BarProps): canvasengine.Element<canvasengine.ComponentInstance>;
12
15
 
@@ -49,6 +52,4 @@ declare function Joystick(opts?: JoystickSettings): canvasengine.Element<canvase
49
52
 
50
53
  declare function TiledMap(props: any): canvasengine.Element<canvasengine.ComponentInstance> | Promise<canvasengine.Element<canvasengine.ComponentInstance>>;
51
54
 
52
- declare function ImageMap(props: any): canvasengine.Element<canvasengine.ComponentInstance> | Promise<canvasengine.Element<canvasengine.ComponentInstance>>;
53
-
54
- export { Bar, Direction, ImageMap, Joystick, type JoystickChangeEvent, type JoystickSettings, LightSpot, NightAmbiant, Particle, TiledMap };
55
+ export { Bar, Direction, Joystick, type JoystickChangeEvent, type JoystickSettings, LightSpot, NightAmbiant, Particle, TiledMap };
package/dist/index.js CHANGED
@@ -30,22 +30,22 @@ function Bar(opts) {
30
30
  ...opts,
31
31
  width,
32
32
  height,
33
- draw(g) {
33
+ draw(graphics) {
34
34
  if (borderRadius()) {
35
- g.roundRect(0, 0, width(), height(), borderRadius());
35
+ graphics.roundRect(0, 0, width(), height(), borderRadius());
36
36
  } else {
37
- g.rect(0, 0, width(), height());
37
+ graphics.rect(0, 0, width(), height());
38
38
  }
39
39
  if (border) {
40
- g.stroke(border);
40
+ graphics.stroke(border);
41
41
  }
42
- g.fill(backgroundColor());
42
+ graphics.fill(backgroundColor());
43
43
  }
44
44
  },
45
45
  h(Graphics, {
46
46
  width,
47
47
  height,
48
- draw(g) {
48
+ draw(graphics) {
49
49
  const margin = innerMargin();
50
50
  const _borderRadius = borderRadius();
51
51
  const w = Math.max(
@@ -55,18 +55,18 @@ function Bar(opts) {
55
55
  value() / maxValue() * (width() - 2 * margin)
56
56
  )
57
57
  );
58
- const h7 = height() - 2 * margin;
58
+ const h6 = height() - 2 * margin;
59
59
  if (borderRadius) {
60
- g.roundRect(margin, margin, w, h7, _borderRadius);
60
+ graphics.roundRect(margin, margin, w, h6, _borderRadius);
61
61
  } else {
62
- g.rect(margin, margin, w, h7);
62
+ graphics.rect(margin, margin, w, h6);
63
63
  }
64
64
  const color = foregroundColor();
65
65
  if (color.startsWith("rgba")) {
66
- const [r, g2, b, a] = color.match(/\d+(\.\d+)?/g).map(Number);
67
- g2.fill({ color: rgbToHex(r, g2, b), alpha: a });
66
+ const [r, g, b, a] = color.match(/\d+(\.\d+)?/g).map(Number);
67
+ graphics.fill({ color: rgbToHex(r, g, b), alpha: a });
68
68
  } else {
69
- g.fill(color);
69
+ graphics.fill(color);
70
70
  }
71
71
  }
72
72
  })
@@ -183,10 +183,10 @@ function NightAmbiant(props) {
183
183
  effect(() => {
184
184
  const { displayWidth, displayHeight } = el2.componentInstance;
185
185
  const w = +displayWidth();
186
- const h7 = +displayHeight();
186
+ const h6 = +displayHeight();
187
187
  setTimeout(() => {
188
188
  width.update(() => w);
189
- height.update(() => h7);
189
+ height.update(() => h6);
190
190
  }, 0);
191
191
  });
192
192
  });
@@ -424,9 +424,16 @@ import { TiledLayerType, TiledParserFile } from "@rpgjs/tiled";
424
424
  import { loop, h as h5, Container as Container4, TilingSprite, useProps as useProps4, effect as effect2, signal as signal3 } from "canvasengine";
425
425
 
426
426
  // src/Tilemap/TileLayer.ts
427
- import { CompositeTilemap, POINT_STRUCT_SIZE, settings } from "@pixi/tilemap";
427
+ import {
428
+ CompositeTilemap,
429
+ settings
430
+ } from "@pixi/tilemap";
428
431
  import { Layer } from "@rpgjs/tiled";
429
- import { createComponent, registerComponent, DisplayObject } from "canvasengine";
432
+ import {
433
+ createComponent,
434
+ registerComponent,
435
+ DisplayObject
436
+ } from "canvasengine";
430
437
 
431
438
  // src/Tilemap/Tile.ts
432
439
  import { AnimatedSprite, groupD8 } from "pixi.js";
@@ -456,6 +463,9 @@ var Tile = class _Tile extends AnimatedSprite {
456
463
  }
457
464
  return textures;
458
465
  }
466
+ get z() {
467
+ return this.properties.z ?? 0;
468
+ }
459
469
  get gid() {
460
470
  return this.tile.gid;
461
471
  }
@@ -496,8 +506,10 @@ var CanvasTileLayer = class _CanvasTileLayer extends DisplayObject(CompositeTile
496
506
  constructor() {
497
507
  super(...arguments);
498
508
  this._tiles = {};
509
+ // TODO: fix this, remove any. replace with Layer
510
+ this.frameTile = 0;
511
+ this.frameRateAnimation = 10;
499
512
  }
500
- // TODO: fix this, remove any. replace with Layer
501
513
  static findTileSet(gid, tileSets) {
502
514
  let tileset;
503
515
  for (let i = tileSets.length - 1; i >= 0; i--) {
@@ -519,15 +531,9 @@ var CanvasTileLayer = class _CanvasTileLayer extends DisplayObject(CompositeTile
519
531
  const i = x + y * width;
520
532
  const tiledTile = this._layer.getTileByIndex(i);
521
533
  if (!tiledTile || tiledTile && tiledTile.gid == 0) return;
522
- const tileset = _CanvasTileLayer.findTileSet(
523
- tiledTile.gid,
524
- this.tileSets
525
- );
534
+ const tileset = _CanvasTileLayer.findTileSet(tiledTile.gid, this.tileSets);
526
535
  if (!tileset) return;
527
- const tile = new Tile(
528
- tiledTile,
529
- tileset
530
- );
536
+ const tile = new Tile(tiledTile, tileset);
531
537
  tile.x = x * tilewidth;
532
538
  tile.y = y * tileheight + (tileheight - tile.texture.height);
533
539
  tile._x = x;
@@ -542,56 +548,29 @@ var CanvasTileLayer = class _CanvasTileLayer extends DisplayObject(CompositeTile
542
548
  }
543
549
  return tile;
544
550
  }
545
- /** @internal */
546
- changeTile(x, y) {
547
- const { tilewidth, tileheight } = this._layer;
548
- x = Math.floor(x / tilewidth);
549
- y = Math.floor(y / tileheight);
550
- const oldTile = this._tiles[x + ";" + y];
551
- const newTile = this.createTile(x, y);
552
- if (!oldTile && newTile) {
553
- this._addFrame(newTile, x, y);
554
- } else {
555
- if (newTile) {
556
- const bufComposite = new CompositeTilemap();
557
- const frame = bufComposite.tile(newTile.texture, newTile.x, newTile.y);
558
- newTile.setAnimation(frame);
559
- this._tiles[x + ";" + y] = newTile;
560
- const pointsBufComposite = bufComposite.children[0].pointsBuf;
561
- [0, 1, 4, 6, 7, 8].forEach((i) => {
562
- if (this.pointsBuf) this.pointsBuf[oldTile.pointsBufIndex + i] = pointsBufComposite[i];
563
- });
564
- this.children[0].modificationMarker = 0;
565
- this._addFrame(newTile, x, y);
566
- this["modificationMarker"] = 0;
567
- } else {
568
- delete this._tiles[x + ";" + y];
569
- if (this.pointsBuf) this.pointsBuf.splice(oldTile.pointsBufIndex, POINT_STRUCT_SIZE);
570
- }
571
- }
572
- }
573
- /** @internal */
574
- get pointsBuf() {
575
- const child = this.children[0];
576
- if (!child) return null;
577
- return child["pointsBuf"];
578
- }
579
551
  _addFrame(tile, x, y) {
580
552
  const frame = this.tile(tile.texture, tile.x, tile.y, {
581
553
  rotate: tile.texture.rotate
582
554
  });
583
- const pb = this.pointsBuf;
584
- if (!pb) return null;
585
- tile.pointsBufIndex = pb.length - POINT_STRUCT_SIZE;
586
555
  tile.setAnimation(frame);
587
556
  this._tiles[x + ";" + y] = tile;
588
557
  }
589
- onMount(args) {
558
+ async onMount(args) {
590
559
  const { props } = args;
591
560
  this.tileSets = props.tilesets;
592
- this._layer = new Layer({
593
- ...props
594
- }, this.tileSets);
561
+ this._layer = new Layer(
562
+ {
563
+ ...props
564
+ },
565
+ this.tileSets
566
+ );
567
+ const tick2 = props.context.tick;
568
+ this.subscriptionTick = tick2.observable.subscribe(({ value }) => {
569
+ if (value.frame % this.frameRateAnimation == 0) {
570
+ this.tileAnim = [this.frameTile, this.frameTile];
571
+ this.frameTile++;
572
+ }
573
+ });
595
574
  super.onMount(args);
596
575
  }
597
576
  onUpdate(props) {
@@ -613,6 +592,10 @@ var CanvasTileLayer = class _CanvasTileLayer extends DisplayObject(CompositeTile
613
592
  }
614
593
  }
615
594
  }
595
+ async onDestroy(parent) {
596
+ this.subscriptionTick.unsubscribe();
597
+ await super.onDestroy(parent);
598
+ }
616
599
  };
617
600
  registerComponent("CompositeTileLayer", CanvasTileLayer);
618
601
  function CompositeTileLayer(props) {
@@ -649,11 +632,87 @@ var TileSet = class extends TiledTilesetClass {
649
632
  };
650
633
 
651
634
  // src/Tilemap/index.ts
635
+ function reorganizeLayersByTileZ(originalLayers, tilesets, mapData) {
636
+ const reorganizedLayers = [];
637
+ for (const layer of originalLayers) {
638
+ if (layer.type !== TiledLayerType.Tile) {
639
+ reorganizedLayers.push(layer);
640
+ continue;
641
+ }
642
+ const layersByZ = /* @__PURE__ */ new Map();
643
+ let layerData;
644
+ if (Array.isArray(layer.data)) {
645
+ layerData = layer.data.map((gid) => {
646
+ if (typeof gid === "number") {
647
+ return gid;
648
+ } else {
649
+ return parseInt(String(gid), 10);
650
+ }
651
+ });
652
+ } else {
653
+ reorganizedLayers.push(layer);
654
+ continue;
655
+ }
656
+ let tilesProcessed = 0;
657
+ let tilesWithZ = 0;
658
+ for (let i = 0; i < layerData.length; i++) {
659
+ const gid = layerData[i];
660
+ if (gid === 0) continue;
661
+ tilesProcessed++;
662
+ let tileset;
663
+ for (let j = tilesets.length - 1; j >= 0; j--) {
664
+ if (tilesets[j].firstgid && tilesets[j].firstgid <= gid) {
665
+ tileset = tilesets[j];
666
+ break;
667
+ }
668
+ }
669
+ if (!tileset) {
670
+ if (!layersByZ.has(0)) {
671
+ layersByZ.set(0, new Array(layerData.length).fill(0));
672
+ }
673
+ layersByZ.get(0)[i] = gid;
674
+ continue;
675
+ }
676
+ const localTileId = gid - tileset.firstgid;
677
+ const tileProperties = tileset.tileset.tiles?.[localTileId]?.properties;
678
+ const zValue = tileProperties?.z ?? 0;
679
+ if (tileProperties?.z !== void 0) {
680
+ tilesWithZ++;
681
+ }
682
+ if (!layersByZ.has(zValue)) {
683
+ layersByZ.set(zValue, new Array(layerData.length).fill(0));
684
+ }
685
+ layersByZ.get(zValue)[i] = gid;
686
+ }
687
+ const sortedZValues = Array.from(layersByZ.keys()).sort((a, b) => a - b);
688
+ for (const zValue of sortedZValues) {
689
+ const layerDataForZ = layersByZ.get(zValue);
690
+ if (layerDataForZ.some((gid) => gid !== 0)) {
691
+ const newLayer = {
692
+ ...layer,
693
+ name: `${layer.name}_z${zValue}`,
694
+ // Always add _z suffix
695
+ data: layerDataForZ,
696
+ properties: {
697
+ ...layer.properties,
698
+ z: zValue
699
+ }
700
+ };
701
+ reorganizedLayers.push(newLayer);
702
+ }
703
+ }
704
+ }
705
+ reorganizedLayers.sort((a, b) => {
706
+ const zA = a.properties?.z ?? 0.5;
707
+ const zB = b.properties?.z ?? 0.5;
708
+ return zA - zB;
709
+ });
710
+ return reorganizedLayers;
711
+ }
652
712
  function TiledMap(props) {
653
- const { map, basePath } = useProps4(props);
713
+ const { map, basePath, createLayersPerTilesZ } = useProps4(props);
654
714
  const layers = signal3([]);
655
715
  const objectLayer = props.objectLayer;
656
- const child = props.children[0];
657
716
  let tilesets = [];
658
717
  let mapData = {};
659
718
  const parseTmx = async (file, relativePath = "") => {
@@ -677,10 +736,15 @@ function TiledMap(props) {
677
736
  const _map = map();
678
737
  if (_map) {
679
738
  mapData = await parseTmx(_map, basePath());
739
+ tilesets = [];
680
740
  for (let tileSet of mapData.tilesets) {
681
741
  tilesets.push(await new TileSet(tileSet).load(tileSet.image.source));
682
742
  }
683
- layers.set(mapData.layers);
743
+ let finalLayers = mapData.layers;
744
+ if (createLayersPerTilesZ()) {
745
+ finalLayers = reorganizeLayersByTileZ(mapData.layers, tilesets, mapData);
746
+ }
747
+ layers.set(finalLayers);
684
748
  }
685
749
  });
686
750
  const createLayer = (layers2, props2 = {}) => {
@@ -708,8 +772,8 @@ function TiledMap(props) {
708
772
  case TiledLayerType.Group:
709
773
  return createLayer(signal3(layer.layers), layer);
710
774
  case TiledLayerType.ObjectGroup:
711
- const child2 = objectLayer?.(layer);
712
- return h5(Container4, layer, child2);
775
+ const child = objectLayer?.(layer);
776
+ return h5(Container4, layer, child);
713
777
  default:
714
778
  return h5(Container4);
715
779
  }
@@ -717,56 +781,9 @@ function TiledMap(props) {
717
781
  };
718
782
  return h5(Container4, props, createLayer(layers));
719
783
  }
720
-
721
- // src/DrawMap/index.ts
722
- import { effect as effect3, signal as signal4, loop as loop2, h as h6, Container as Container5, Sprite as Sprite2, useProps as useProps5 } from "canvasengine";
723
- function ImageMap(props) {
724
- const { imageSource, tileData } = useProps5(props);
725
- const tiles = signal4([]);
726
- effect3(async () => {
727
- const data = await fetch(tileData()).then((response) => response.json());
728
- const objects = data;
729
- if (props.objects) {
730
- objects.push(...props.objects(data));
731
- }
732
- tiles.set(objects);
733
- });
734
- const createLayeredTiles = () => {
735
- const layers = [createTileLayer(0), createTileLayer(1, true), createTileLayer(2)];
736
- return h6(Container5, props, ...layers);
737
- };
738
- const createTileLayer = (layerIndex, sortableChildren = false) => {
739
- return h6(
740
- Container5,
741
- {
742
- sortableChildren
743
- },
744
- // TODO: fix this (remove any)
745
- loop2(tiles, (object) => {
746
- if (object.tag && layerIndex == 1) {
747
- return object;
748
- }
749
- object.layerIndex || (object.layerIndex = 1);
750
- if (object.layerIndex !== layerIndex) return null;
751
- const [x, y, width, height] = object.rect;
752
- const [drawX, drawY] = object.drawIn;
753
- return h6(Sprite2, {
754
- image: imageSource(),
755
- x: drawX,
756
- y: drawY,
757
- rectangle: { x, y, width, height },
758
- zIndex: drawY + height - 70
759
- // zIndex: 0
760
- });
761
- })
762
- );
763
- };
764
- return createLayeredTiles();
765
- }
766
784
  export {
767
785
  Bar,
768
786
  Direction,
769
- ImageMap,
770
787
  Joystick,
771
788
  LightSpot,
772
789
  NightAmbiant,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Bar.ts","../src/Particle.ts","../src/NightAmbiant.ts","../src/Joystick.ts","../src/Tilemap/index.ts","../src/Tilemap/TileLayer.ts","../src/Tilemap/Tile.ts","../src/Tilemap/TileSet.ts","../src/DrawMap/index.ts"],"sourcesContent":["import { Graphics, h, useProps } from \"canvasengine\";\nimport * as PIXI from \"pixi.js\";\n\ninterface BarProps {\n backgroundColor?: string;\n foregroundColor?: string;\n value: number;\n maxValue: number;\n width: number;\n height: number;\n}\n\nfunction componentToHex(c) {\n var hex = c.toString(16);\n return hex.length == 1 ? \"0\" + hex : hex;\n}\n\nfunction rgbToHex(r, g, b) {\n return \"#\" + componentToHex(r) + componentToHex(g) + componentToHex(b);\n}\n\nexport function Bar(opts: BarProps) {\n const {\n width,\n height,\n value,\n maxValue,\n backgroundColor,\n foregroundColor,\n border,\n innerMargin,\n borderRadius,\n } = useProps(opts, {\n backgroundColor: \"#000000\",\n foregroundColor: \"#FFFFFF\",\n innerMargin: 0,\n borderRadius: 0,\n });\n\n return h(\n Graphics,\n {\n ...opts,\n width,\n height,\n draw(g: PIXI.Graphics) {\n if (borderRadius()) {\n g.roundRect(0, 0, width(), height(), borderRadius());\n } else {\n g.rect(0, 0, width(), height());\n }\n if (border) {\n g.stroke(border);\n }\n g.fill(backgroundColor());\n },\n },\n h(Graphics, {\n width,\n height,\n draw(g: PIXI.Graphics) {\n const margin = innerMargin();\n const _borderRadius = borderRadius();\n const w = Math.max(\n 0,\n Math.min(\n width() - 2 * margin,\n (value() / maxValue()) * (width() - 2 * margin)\n )\n );\n const h = height() - 2 * margin;\n if (borderRadius) {\n g.roundRect(margin, margin, w, h, _borderRadius);\n } else {\n g.rect(margin, margin, w, h);\n }\n const color = foregroundColor();\n if (color.startsWith(\"rgba\")) {\n const [r, g, b, a] = color.match(/\\d+(\\.\\d+)?/g).map(Number);\n g.fill({ color: rgbToHex(r, g, b), alpha: a });\n } else {\n g.fill(color);\n }\n },\n })\n );\n}\n","import * as PIXI from \"pixi.js\";\nimport { FX } from \"revolt-fx\";\nimport { h, mount, tick, Container, on, useProps } from \"canvasengine\";\n\nexport function Particle(options) {\n const { emit, settings = {} } = options;\n const { name } = useProps(options);\n const fx = new FX();\n let element;\n\n PIXI.Assets.add({ alias: \"fx_settings\", src: \"/default-bundle.json\" });\n PIXI.Assets.add({\n alias: \"fx_spritesheet\",\n src: \"/revoltfx-spritesheet.json\",\n });\n\n tick(({deltaRatio}) => {\n fx.update(deltaRatio);\n });\n\n mount(async (_element) => {\n element = _element;\n\n const data = await PIXI.Assets.load([\"fx_settings\", \"fx_spritesheet\"]);\n let fxSettings = {...data.fx_settings};\n\n if (settings.emitters) {\n const lastId = 10000;\n const emittersWithIds = settings.emitters.map((emitter, index) => ({\n ...emitter,\n id: lastId + index\n }));\n\n fxSettings.emitters = [\n ...fxSettings.emitters,\n ...emittersWithIds,\n ];\n\n }\n\n fx.initBundle(fxSettings, true);\n });\n\n on(emit, () => {\n const emitter = fx.getParticleEmitter(name());\n emitter.init(element.componentInstance);\n });\n\n return h(Container);\n}\n","import { Container, Graphics, h, mount, useProps, animatedSignal, RadialGradient, effect, isSignal, signal, isObservable } from \"canvasengine\";\n\nexport function LightSpot(opts) {\n const { radius } = useProps(opts);\n const scale = animatedSignal(1);\n\n const minScale = 1;\n const maxScale = 2; // Reduced max scale for subtler effect\n const scintillationSpeed = 0.001; // Significantly reduced for slower scintillation\n\n const animate = () => {\n // Use time-based animation for smoother, slower scintillation\n const time = Date.now() * scintillationSpeed;\n\n // Combine multiple sine waves for a more natural, less predictable effect\n const scintillationFactor =\n (Math.sin(time) + Math.sin(time * 1.3) + Math.sin(time * 0.7)) / 3;\n\n // Map the scintillation factor to the scale range\n const newScale =\n minScale + (maxScale - minScale) * (scintillationFactor * 0.5 + 0.5);\n\n scale.update(() => newScale);\n\n requestAnimationFrame(animate);\n };\n\n animate();\n\n const draw = (g) => {\n const size = radius() * 2;\n const gradient = new RadialGradient(size, size, 0, size, size, 0);\n gradient.addColorStop(0, \"rgba(255, 255, 0, 1)\");\n gradient.addColorStop(0.5, \"rgba(255, 255, 0, 0.3)\");\n gradient.addColorStop(0.8, \"rgba(255, 255, 0, 0)\");\n\n const translate = size / 2;\n\n g.rect(-translate, -translate, size, size).fill(\n gradient.render({ translate: { x: translate, y: translate } })\n );\n };\n\n return h(Graphics, {\n draw,\n ...opts,\n scale,\n });\n}\n\nexport function NightAmbiant(props) {\n const { children } = props;\n let el\n const width = signal(0);\n const height = signal(0);\n let subscription\n const draw = (rectAndHole) => {\n const margin = 80\n rectAndHole.rect(-margin, -margin, width() + margin*2, height() + margin*2);\n rectAndHole.fill(0x000000);\n const applyChildren = (child) => {\n const x = isSignal(child.propObservables.x)\n ? child.propObservables.x()\n : child.props.x;\n const y = isSignal(child.propObservables.y)\n ? child.propObservables.y()\n : child.props.y;\n const radius = isSignal(child.propObservables.radius)\n ? child.propObservables.radius()\n : child.props.radius;\n rectAndHole.circle(x, y, radius);\n rectAndHole.cut();\n }\n for (let child of children) {\n if (isObservable(child)) {\n if (subscription) {\n subscription.unsubscribe()\n }\n subscription = child.subscribe((event: any) => {\n for (let child of event.fullElements) {\n applyChildren(child)\n }\n })\n return\n }\n applyChildren(child)\n }\n };\n\n mount((el) => {\n effect(() => {\n const { displayWidth, displayHeight } = el.componentInstance as any\n const w = +displayWidth()\n const h = +displayHeight()\n setTimeout(() => {\n width.update(() => w)\n height.update(() => h)\n }, 0) // hack\n });\n });\n\n return h(\n Container,\n {\n width: \"100%\",\n height: \"100%\",\n ...props,\n },\n h(Graphics, {\n draw,\n alpha: 0.8,\n blur: 80,\n }),\n ...children\n );\n}\n","/*\n * Joystick\n *\n * Inspired by https://github.com/endel/pixi-virtual-joystick\n */\n\nimport * as PIXI from \"pixi.js\";\nimport { Container, Graphics, Sprite, h, signal } from \"canvasengine\";\n\nexport interface JoystickChangeEvent {\n angle: number;\n direction: Direction;\n power: number;\n}\n\nexport enum Direction {\n LEFT = \"left\",\n TOP = \"top\",\n BOTTOM = \"bottom\",\n RIGHT = \"right\",\n TOP_LEFT = \"top_left\",\n TOP_RIGHT = \"top_right\",\n BOTTOM_LEFT = \"bottom_left\",\n BOTTOM_RIGHT = \"bottom_right\",\n}\n\nexport interface JoystickSettings {\n outer?: string;\n inner?: string;\n outerScale?: { x: number; y: number };\n innerScale?: { x: number; y: number };\n onChange?: (data: JoystickChangeEvent) => void;\n onStart?: () => void;\n onEnd?: () => void;\n}\n\nexport function Joystick(opts: JoystickSettings = {}) {\n const settings = Object.assign(\n {\n outerScale: { x: 1, y: 1 },\n innerScale: { x: 1, y: 1 },\n },\n opts\n );\n\n let outerRadius = 70;\n let innerRadius = 10;\n const innerAlphaStandby = 0.5;\n\n let dragging = false;\n let startPosition: PIXI.PointData | null = null;\n let power = 0;\n\n const innerPositionX = signal(0);\n const innerPositionY = signal(0);\n const innerAlpha = signal(innerAlphaStandby);\n\n function getPower(centerPoint: PIXI.Point) {\n const a = centerPoint.x - 0;\n const b = centerPoint.y - 0;\n return Math.min(1, Math.sqrt(a * a + b * b) / outerRadius);\n }\n\n function getDirection(center: PIXI.Point) {\n let rad = Math.atan2(center.y, center.x); // [-PI, PI]\n if ((rad >= -Math.PI / 8 && rad < 0) || (rad >= 0 && rad < Math.PI / 8)) {\n return Direction.RIGHT;\n } else if (rad >= Math.PI / 8 && rad < (3 * Math.PI) / 8) {\n return Direction.BOTTOM_RIGHT;\n } else if (rad >= (3 * Math.PI) / 8 && rad < (5 * Math.PI) / 8) {\n return Direction.BOTTOM;\n } else if (rad >= (5 * Math.PI) / 8 && rad < (7 * Math.PI) / 8) {\n return Direction.BOTTOM_LEFT;\n } else if (\n (rad >= (7 * Math.PI) / 8 && rad < Math.PI) ||\n (rad >= -Math.PI && rad < (-7 * Math.PI) / 8)\n ) {\n return Direction.LEFT;\n } else if (rad >= (-7 * Math.PI) / 8 && rad < (-5 * Math.PI) / 8) {\n return Direction.TOP_LEFT;\n } else if (rad >= (-5 * Math.PI) / 8 && rad < (-3 * Math.PI) / 8) {\n return Direction.TOP;\n } else {\n return Direction.TOP_RIGHT;\n }\n }\n\n function handleDragStart(event: PIXI.FederatedPointerEvent) {\n startPosition = event.getLocalPosition(this);\n dragging = true;\n innerAlpha.set(1);\n settings.onStart?.();\n }\n\n function handleDragEnd() {\n if (!dragging) return;\n innerPositionX.set(0);\n innerPositionY.set(0);\n dragging = false;\n innerAlpha.set(innerAlphaStandby);\n settings.onEnd?.();\n }\n\n function handleDragMove(event: PIXI.FederatedPointerEvent) {\n if (dragging == false) {\n return;\n }\n\n let newPosition = event.getLocalPosition(this);\n\n let sideX = newPosition.x - (startPosition?.x ?? 0);\n let sideY = newPosition.y - (startPosition?.y ?? 0);\n\n let centerPoint = new PIXI.Point(0, 0);\n let angle = 0;\n\n if (sideX == 0 && sideY == 0) {\n return;\n }\n\n let calRadius = 0;\n\n if (sideX * sideX + sideY * sideY >= outerRadius * outerRadius) {\n calRadius = outerRadius;\n } else {\n calRadius = outerRadius - innerRadius;\n }\n\n /**\n * x: -1 <-> 1\n * y: -1 <-> 1\n * Y\n * ^\n * |\n * 180 | 90\n * ------------> X\n * 270 | 360\n * |\n * |\n */\n\n let direction = Direction.LEFT;\n\n if (sideX == 0) {\n if (sideY > 0) {\n centerPoint.set(0, sideY > outerRadius ? outerRadius : sideY);\n angle = 270;\n direction = Direction.BOTTOM;\n } else {\n centerPoint.set(\n 0,\n -(Math.abs(sideY) > outerRadius ? outerRadius : Math.abs(sideY))\n );\n angle = 90;\n direction = Direction.TOP;\n }\n innerPositionX.set(centerPoint.x);\n innerPositionY.set(centerPoint.y);\n power = getPower(centerPoint);\n settings.onChange?.({ angle, direction, power });\n return;\n }\n\n if (sideY == 0) {\n if (sideX > 0) {\n centerPoint.set(\n Math.abs(sideX) > outerRadius ? outerRadius : Math.abs(sideX),\n 0\n );\n angle = 0;\n direction = Direction.LEFT;\n } else {\n centerPoint.set(\n -(Math.abs(sideX) > outerRadius ? outerRadius : Math.abs(sideX)),\n 0\n );\n angle = 180;\n direction = Direction.RIGHT;\n }\n\n innerPositionX.set(centerPoint.x);\n innerPositionY.set(centerPoint.y);\n power = getPower(centerPoint);\n settings.onChange?.({ angle, direction, power });\n return;\n }\n\n let tanVal = Math.abs(sideY / sideX);\n let radian = Math.atan(tanVal);\n angle = (radian * 180) / Math.PI;\n\n let centerX = 0;\n let centerY = 0;\n\n if (sideX * sideX + sideY * sideY >= outerRadius * outerRadius) {\n centerX = outerRadius * Math.cos(radian);\n centerY = outerRadius * Math.sin(radian);\n } else {\n centerX = Math.abs(sideX) > outerRadius ? outerRadius : Math.abs(sideX);\n centerY = Math.abs(sideY) > outerRadius ? outerRadius : Math.abs(sideY);\n }\n\n if (sideY < 0) {\n centerY = -Math.abs(centerY);\n }\n if (sideX < 0) {\n centerX = -Math.abs(centerX);\n }\n\n if (sideX > 0 && sideY < 0) {\n // < 90\n } else if (sideX < 0 && sideY < 0) {\n // 90 ~ 180\n angle = 180 - angle;\n } else if (sideX < 0 && sideY > 0) {\n // 180 ~ 270\n angle = angle + 180;\n } else if (sideX > 0 && sideY > 0) {\n // 270 ~ 369\n angle = 360 - angle;\n }\n centerPoint.set(centerX, centerY);\n power = getPower(centerPoint);\n\n direction = getDirection(centerPoint);\n innerPositionX.set(centerPoint.x);\n innerPositionY.set(centerPoint.y);\n\n settings.onChange?.({ angle, direction, power });\n }\n\n let innerElement;\n let outerElement;\n\n if (!settings.outer) {\n outerElement = h(Graphics, {\n draw: (g) => {\n g.circle(0, 0, outerRadius).fill(0x000000);\n },\n alpha: 0.5,\n });\n } else {\n outerElement = h(Sprite, {\n image: settings.outer,\n anchor: { x: 0.5, y: 0.5 },\n scale: settings.outerScale,\n });\n }\n\n const innerOptions: any = {\n scale: settings.innerScale,\n x: innerPositionX,\n y: innerPositionY,\n alpha: innerAlpha,\n };\n\n if (!settings.inner) {\n innerElement = h(Graphics, {\n draw: (g) => {\n g.circle(0, 0, innerRadius * 2.5).fill(0x000000);\n },\n ...innerOptions,\n });\n } else {\n innerElement = h(Sprite, {\n image: settings.inner,\n anchor: { x: 0.5, y: 0.5 },\n ...innerOptions,\n });\n }\n\n return h(\n Container,\n {\n ...opts,\n pointerdown: handleDragStart,\n pointerup: handleDragEnd,\n pointerupoutside: handleDragEnd,\n pointermove: handleDragMove,\n },\n outerElement,\n innerElement\n );\n}\n","import { TiledLayer, TiledLayerType, TiledMap, TiledParserFile, TiledTileset } from \"@rpgjs/tiled\"\nimport { loop, h, Container, TilingSprite, useProps, effect, signal } from \"canvasengine\"\nimport { CompositeTileLayer } from \"./TileLayer\"\nimport { TileSet } from \"./TileSet\"\n\nexport function TiledMap(props) {\n const { map, basePath } = useProps(props)\n const layers = signal<TiledLayer[]>([])\n const objectLayer = props.objectLayer\n const child = props.children[0]\n let tilesets: TiledTileset[] = []\n let mapData: TiledMap = {} as TiledMap\n\n const parseTmx = async (file: string, relativePath: string = '') => {\n if (typeof file !== 'string') {\n return file\n }\n // @ts-ignore\n const parser = new TiledParserFile(\n file,\n {\n basePath: '',\n staticDir: '',\n relativePath\n }\n )\n const data = await parser.parseFilePromise({\n getOnlyBasename: false\n })\n\n return data\n }\n\n effect(async () => {\n const _map = map()\n if (_map) {\n mapData = await parseTmx(_map, basePath())\n for (let tileSet of mapData.tilesets) {\n tilesets.push(await new TileSet(tileSet).load(tileSet.image.source))\n }\n layers.set(mapData.layers)\n }\n })\n\n const createLayer = (layers, props = {}) => {\n return h(Container, props, loop<any>(layers, (layer) => {\n switch (layer.type) {\n case TiledLayerType.Tile:\n return h(CompositeTileLayer, {\n tilewidth: mapData.tilewidth,\n tileheight: mapData.tileheight,\n // @ts-ignore\n width: mapData.width,\n // @ts-ignore\n height: mapData.height,\n ...layer,\n tilesets\n })\n case TiledLayerType.Image:\n const { width, height, source } = layer.image\n return h(TilingSprite, {\n image: source,\n ...layer,\n width: layer.repeatx ? layer.width * layer.tilewidth : width,\n height: layer.repeaty ? layer.height * layer.tileheight : height\n })\n case TiledLayerType.Group:\n return createLayer(signal(layer.layers), layer)\n case TiledLayerType.ObjectGroup:\n const child = objectLayer?.(layer)\n return h(Container, layer, child)\n default:\n return h(Container)\n }\n }))\n }\n\n return h(Container, props, createLayer(layers))\n}","import { CompositeTilemap, POINT_STRUCT_SIZE, Tilemap, settings } from '@pixi/tilemap';\nimport { Layer, Tile as TileClass } from '@rpgjs/tiled';\nimport { createComponent, registerComponent, DisplayObject } from 'canvasengine';\nimport { Tile } from './Tile';\nimport { TileSet } from './TileSet';\n\nsettings.use32bitIndex = true\n\nexport class CanvasTileLayer extends DisplayObject(CompositeTilemap) {\n private _tiles: any = {}\n tiles: (TileClass | null)[]\n private _layer: any // TODO: fix this, remove any. replace with Layer\n\n static findTileSet(gid: number, tileSets: TileSet[]) {\n let tileset: TileSet | undefined\n for (let i = tileSets.length - 1; i >= 0; i--) {\n tileset = tileSets[i]\n if (tileset.firstgid && tileset.firstgid <= gid) {\n break;\n }\n }\n return tileset;\n }\n\n /** @internal */\n createTile(x: number, y: number, options: any = {}): Tile | undefined {\n const { real, filter } = options\n const { tilewidth, tileheight, width } = this._layer\n if (real) {\n x = Math.floor(x / tilewidth)\n y = Math.floor(y / tileheight)\n }\n const i = x + y * width;\n const tiledTile = this._layer.getTileByIndex(i)\n\n if (!tiledTile || (tiledTile && tiledTile.gid == 0)) return\n\n const tileset = CanvasTileLayer.findTileSet(\n tiledTile.gid,\n this.tileSets\n )\n\n if (!tileset) return\n\n const tile = new Tile(\n tiledTile,\n tileset\n )\n\n tile.x = x * tilewidth;\n tile.y =\n y * tileheight +\n (tileheight -\n tile.texture.height);\n\n tile._x = x;\n tile._y = y;\n\n if (tileset.tileoffset) {\n tile.x += tileset.tileoffset.x ?? 0;\n tile.y += tileset.tileoffset.y ?? 0;\n }\n\n if (filter) {\n const ret = filter(tile)\n if (!ret) return\n }\n\n return tile\n }\n\n /** @internal */\n changeTile(x: number, y: number) {\n const { tilewidth, tileheight } = this._layer\n x = Math.floor(x / tilewidth)\n y = Math.floor(y / tileheight)\n const oldTile: Tile = this._tiles[x + ';' + y]\n const newTile = this.createTile(x, y)\n if (!oldTile && newTile) {\n this._addFrame(newTile, x, y)\n }\n else {\n if (newTile) {\n const bufComposite: CompositeTilemap = new CompositeTilemap()\n const frame = bufComposite.tile(newTile.texture, newTile.x, newTile.y)\n newTile.setAnimation(frame)\n this._tiles[x + ';' + y] = newTile\n // @ts-ignore\n const pointsBufComposite = (bufComposite.children[0] as Tilemap).pointsBuf\n // Change Texture (=0, 1 and 7, rotate (=4), animX (=5), animY (=6))\n ;[0, 1, 4, 6, 7, 8].forEach((i) => {\n if (this.pointsBuf) this.pointsBuf[oldTile.pointsBufIndex + i] = pointsBufComposite[i]\n })\n // @ts-ignore\n this.children[0].modificationMarker = 0\n this._addFrame(newTile, x, y)\n this['modificationMarker'] = 0\n }\n else {\n delete this._tiles[x + ';' + y]\n if (this.pointsBuf) this.pointsBuf.splice(oldTile.pointsBufIndex, POINT_STRUCT_SIZE)\n }\n }\n }\n\n /** @internal */\n get pointsBuf(): number[] | null {\n const child = this.children[0] as Tilemap\n if (!child) return null\n return child['pointsBuf']\n }\n\n private _addFrame(tile: Tile, x: number, y: number) {\n const frame = this.tile(tile.texture, tile.x, tile.y, {\n rotate: tile.texture.rotate\n })\n const pb = this.pointsBuf\n if (!pb) return null\n tile.pointsBufIndex = pb.length - POINT_STRUCT_SIZE\n tile.setAnimation(frame)\n this._tiles[x + ';' + y] = tile\n }\n\n onMount(args) {\n const { props } = args\n this.tileSets = props.tilesets\n this._layer = new Layer({\n ...props\n }, this.tileSets)\n super.onMount(args)\n }\n\n onUpdate(props) {\n super.onUpdate(props)\n if (!this.isMounted) return\n if (props.tileheight) this._layer.tileheight = props.tileheight\n if (props.tilewidth) this._layer.tilewidth = props.tilewidth\n if (props.width) this._layer.width = props.width\n if (props.height) this._layer.height = props.height\n if (props.parallaxX) this._layer.parallaxX = props.parallaxx\n if (props.parallaxY) this._layer.parallaxY = props.parallaxy\n\n this.removeChildren()\n\n for (let y = 0; y < this._layer.height; y++) {\n for (let x = 0; x < this._layer.width; x++) {\n const tile = this.createTile(x, y)\n if (tile) {\n this._addFrame(tile, x, y)\n }\n }\n }\n }\n}\n\nexport interface CanvasTileLayer extends CompositeTilemap { }\n\nregisterComponent('CompositeTileLayer', CanvasTileLayer)\n\nexport function CompositeTileLayer(props) {\n return createComponent('CompositeTileLayer', props)\n}","import { CompositeTilemap } from \"@pixi/tilemap\";\nimport { Tile as TiledTileClass } from '@rpgjs/tiled';\nimport { AnimatedSprite, Texture, groupD8 } from \"pixi.js\";\nimport { TileSet } from \"./TileSet\";\n\nexport class Tile extends AnimatedSprite {\n static getTextures(tile: TiledTileClass, tileSet: TileSet) {\n const textures: Texture[] = [];\n\n if (tile.animations && tile.animations.length) {\n tile.animations.forEach(frame => {\n textures.push(tileSet.textures[frame.tileid])\n });\n } else {\n textures.push(tileSet.textures[tile.gid - tileSet.firstgid])\n }\n\n return textures;\n }\n\n animations: { tileid: number, duration: number }[] = []\n _x: number = 0\n _y: number = 0\n pointsBufIndex: number\n properties: any = {}\n\n constructor(\n private tile: TiledTileClass,\n private tileSet: TileSet\n ) {\n super(Tile.getTextures(tile, tileSet));\n this.animations = tile.animations || []\n this.properties = tile.properties\n this.textures = Tile.getTextures(tile, tileSet)\n this.texture = this.textures[0] as Texture\n this.flip()\n }\n\n get gid() {\n return this.tile.gid\n }\n\n setAnimation(frame: CompositeTilemap) {\n const size = this.animations.length\n if (size > 1) {\n const offset = (this.animations[1].tileid - this.animations[0].tileid) * this.width\n frame.tileAnimX(offset, size)\n }\n }\n\n flip() {\n let symmetry\n let i = 0\n const add = (symmetrySecond) => {\n i++\n if (symmetry) symmetry = groupD8.add(symmetry, symmetrySecond)\n else symmetry = symmetrySecond\n }\n\n if (this.tile.horizontalFlip) {\n add(groupD8.MIRROR_HORIZONTAL)\n }\n\n if (this.tile.verticalFlip) {\n add(groupD8.MIRROR_VERTICAL)\n }\n\n if (this.tile.diagonalFlip) {\n if (i % 2 == 0) {\n add(groupD8.MAIN_DIAGONAL)\n }\n else {\n add(groupD8.REVERSE_DIAGONAL)\n }\n }\n\n //if (symmetry) this.texture.rotate = symmetry\n }\n}","import { TiledTileset, Tileset as TiledTilesetClass } from \"@rpgjs/tiled\";\nimport { Assets, Rectangle, Texture } from \"pixi.js\";\n\nexport class TileSet extends TiledTilesetClass {\n public textures: Texture[] = [];\n private tileGroups = {};\n\n constructor(tileSet: TiledTileset) {\n super(tileSet);\n }\n\n loadGroup() {\n // for (let tile of this.tileset.tiles) {\n // }\n }\n\n /** @internal */\n async load(image: string) {\n const texture = await Assets.load(image);\n for (\n let y = this.margin;\n y < this.image.height;\n y += this.tileheight + this.spacing\n ) {\n for (\n let x = this.margin;\n x < this.image.width;\n x += this.tilewidth + this.spacing\n ) {\n this.textures.push(\n new Texture({\n source: texture.source,\n frame: new Rectangle(+x, +y, +this.tilewidth, +this.tileheight),\n })\n );\n }\n }\n this.loadGroup();\n return this;\n }\n}\n","import { effect, signal, loop, h, Container, Sprite, useProps } from \"canvasengine\";\n\ninterface TileData {\n id: number;\n rect: [number, number, number, number];\n drawIn: [number, number];\n layerIndex: number;\n}\n\nexport function ImageMap(props) {\n const { imageSource, tileData } = useProps(props);\n const tiles = signal<TileData[]>([]);\n\n effect(async () => {\n const data = await fetch(tileData()).then((response) => response.json());\n const objects = data;\n if (props.objects) {\n objects.push(...props.objects(data));\n }\n tiles.set(objects);\n });\n\n const createLayeredTiles = () => {\n const layers = [createTileLayer(0), createTileLayer(1, true), createTileLayer(2)];\n\n return h(Container, props, ...layers);\n };\n\n const createTileLayer = (layerIndex: number, sortableChildren = false) => {\n return h(\n Container,\n {\n sortableChildren,\n },\n // TODO: fix this (remove any)\n loop(tiles, (object: any) => {\n if (object.tag && layerIndex == 1) {\n return object\n }\n\n object.layerIndex ||= 1;\n if (object.layerIndex !== layerIndex) return null;\n\n const [x, y, width, height] = object.rect;\n const [drawX, drawY] = object.drawIn;\n\n return h(Sprite, {\n image: imageSource(),\n x: drawX,\n y: drawY,\n rectangle: { x, y, width, height },\n zIndex: drawY + height - 70,\n // zIndex: 0\n });\n })\n );\n };\n\n return createLayeredTiles();\n}\n"],"mappings":";AAAA,SAAS,UAAU,GAAG,gBAAgB;AAYtC,SAAS,eAAe,GAAG;AACzB,MAAI,MAAM,EAAE,SAAS,EAAE;AACvB,SAAO,IAAI,UAAU,IAAI,MAAM,MAAM;AACvC;AAEA,SAAS,SAAS,GAAG,GAAG,GAAG;AACzB,SAAO,MAAM,eAAe,CAAC,IAAI,eAAe,CAAC,IAAI,eAAe,CAAC;AACvE;AAEO,SAAS,IAAI,MAAgB;AAClC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,SAAS,MAAM;AAAA,IACjB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,KAAK,GAAkB;AACrB,YAAI,aAAa,GAAG;AAClB,YAAE,UAAU,GAAG,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC;AAAA,QACrD,OAAO;AACL,YAAE,KAAK,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC;AAAA,QAChC;AACA,YAAI,QAAQ;AACV,YAAE,OAAO,MAAM;AAAA,QACjB;AACA,UAAE,KAAK,gBAAgB,CAAC;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,EAAE,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,KAAK,GAAkB;AACrB,cAAM,SAAS,YAAY;AAC3B,cAAM,gBAAgB,aAAa;AACnC,cAAM,IAAI,KAAK;AAAA,UACb;AAAA,UACA,KAAK;AAAA,YACH,MAAM,IAAI,IAAI;AAAA,YACb,MAAM,IAAI,SAAS,KAAM,MAAM,IAAI,IAAI;AAAA,UAC1C;AAAA,QACF;AACA,cAAMA,KAAI,OAAO,IAAI,IAAI;AACzB,YAAI,cAAc;AAChB,YAAE,UAAU,QAAQ,QAAQ,GAAGA,IAAG,aAAa;AAAA,QACjD,OAAO;AACL,YAAE,KAAK,QAAQ,QAAQ,GAAGA,EAAC;AAAA,QAC7B;AACA,cAAM,QAAQ,gBAAgB;AAC9B,YAAI,MAAM,WAAW,MAAM,GAAG;AAC5B,gBAAM,CAAC,GAAGC,IAAG,GAAG,CAAC,IAAI,MAAM,MAAM,cAAc,EAAE,IAAI,MAAM;AAC3D,UAAAA,GAAE,KAAK,EAAE,OAAO,SAAS,GAAGA,IAAG,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,QAC/C,OAAO;AACL,YAAE,KAAK,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACtFA,YAAY,UAAU;AACtB,SAAS,UAAU;AACnB,SAAS,KAAAC,IAAG,OAAO,MAAM,WAAW,IAAI,YAAAC,iBAAgB;AAEjD,SAAS,SAAS,SAAS;AAChC,QAAM,EAAE,MAAM,UAAAC,YAAW,CAAC,EAAE,IAAI;AAChC,QAAM,EAAE,KAAK,IAAID,UAAS,OAAO;AACjC,QAAM,KAAK,IAAI,GAAG;AAClB,MAAI;AAEJ,EAAK,YAAO,IAAI,EAAE,OAAO,eAAe,KAAK,uBAAuB,CAAC;AACrE,EAAK,YAAO,IAAI;AAAA,IACd,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AAED,OAAK,CAAC,EAAC,WAAU,MAAM;AACrB,OAAG,OAAO,UAAU;AAAA,EACtB,CAAC;AAED,QAAM,OAAO,aAAa;AACxB,cAAU;AAEV,UAAM,OAAO,MAAW,YAAO,KAAK,CAAC,eAAe,gBAAgB,CAAC;AACrE,QAAI,aAAa,EAAC,GAAG,KAAK,YAAW;AAErC,QAAIC,UAAS,UAAU;AACrB,YAAM,SAAS;AACf,YAAM,kBAAkBA,UAAS,SAAS,IAAI,CAAC,SAAS,WAAW;AAAA,QACjE,GAAG;AAAA,QACH,IAAI,SAAS;AAAA,MACf,EAAE;AAEF,iBAAW,WAAW;AAAA,QACpB,GAAG,WAAW;AAAA,QACd,GAAG;AAAA,MACL;AAAA,IAEF;AAEA,OAAG,WAAW,YAAY,IAAI;AAAA,EAChC,CAAC;AAED,KAAG,MAAM,MAAM;AACb,UAAM,UAAU,GAAG,mBAAmB,KAAK,CAAC;AAC5C,YAAQ,KAAK,QAAQ,iBAAiB;AAAA,EACxC,CAAC;AAED,SAAOF,GAAE,SAAS;AACpB;;;ACjDA,SAAS,aAAAG,YAAW,YAAAC,WAAU,KAAAC,IAAG,SAAAC,QAAO,YAAAC,WAAU,gBAAgB,gBAAgB,QAAQ,UAAU,QAAQ,oBAAoB;AAEzH,SAAS,UAAU,MAAM;AAC9B,QAAM,EAAE,OAAO,IAAIA,UAAS,IAAI;AAChC,QAAM,QAAQ,eAAe,CAAC;AAE9B,QAAM,WAAW;AACjB,QAAM,WAAW;AACjB,QAAM,qBAAqB;AAE3B,QAAM,UAAU,MAAM;AAEpB,UAAM,OAAO,KAAK,IAAI,IAAI;AAG1B,UAAM,uBACH,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,OAAO,GAAG,IAAI,KAAK,IAAI,OAAO,GAAG,KAAK;AAGnE,UAAM,WACJ,YAAY,WAAW,aAAa,sBAAsB,MAAM;AAElE,UAAM,OAAO,MAAM,QAAQ;AAE3B,0BAAsB,OAAO;AAAA,EAC/B;AAEA,UAAQ;AAER,QAAM,OAAO,CAAC,MAAM;AAClB,UAAM,OAAO,OAAO,IAAI;AACxB,UAAM,WAAW,IAAI,eAAe,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;AAChE,aAAS,aAAa,GAAG,sBAAsB;AAC/C,aAAS,aAAa,KAAK,wBAAwB;AACnD,aAAS,aAAa,KAAK,sBAAsB;AAEjD,UAAM,YAAY,OAAO;AAEzB,MAAE,KAAK,CAAC,WAAW,CAAC,WAAW,MAAM,IAAI,EAAE;AAAA,MACzC,SAAS,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,GAAG,UAAU,EAAE,CAAC;AAAA,IAC/D;AAAA,EACF;AAEA,SAAOF,GAAED,WAAU;AAAA,IACjB;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEO,SAAS,aAAa,OAAO;AAClC,QAAM,EAAE,SAAS,IAAI;AACrB,MAAI;AACJ,QAAM,QAAQ,OAAO,CAAC;AACtB,QAAM,SAAS,OAAO,CAAC;AACvB,MAAI;AACJ,QAAM,OAAO,CAAC,gBAAgB;AAC5B,UAAM,SAAS;AACf,gBAAY,KAAK,CAAC,QAAQ,CAAC,QAAQ,MAAM,IAAI,SAAO,GAAG,OAAO,IAAI,SAAO,CAAC;AAC1E,gBAAY,KAAK,CAAQ;AACzB,UAAM,gBAAgB,CAAC,UAAU;AAC/B,YAAM,IAAI,SAAS,MAAM,gBAAgB,CAAC,IACtC,MAAM,gBAAgB,EAAE,IACxB,MAAM,MAAM;AAChB,YAAM,IAAI,SAAS,MAAM,gBAAgB,CAAC,IACtC,MAAM,gBAAgB,EAAE,IACxB,MAAM,MAAM;AAChB,YAAM,SAAS,SAAS,MAAM,gBAAgB,MAAM,IAChD,MAAM,gBAAgB,OAAO,IAC7B,MAAM,MAAM;AAChB,kBAAY,OAAO,GAAG,GAAG,MAAM;AAC/B,kBAAY,IAAI;AAAA,IAClB;AACA,aAAS,SAAS,UAAU;AAC1B,UAAI,aAAa,KAAK,GAAG;AACvB,YAAI,cAAc;AAChB,uBAAa,YAAY;AAAA,QAC3B;AACA,uBAAe,MAAM,UAAU,CAAC,UAAe;AAC5C,mBAASI,UAAS,MAAM,cAAc;AACrC,0BAAcA,MAAK;AAAA,UACpB;AAAA,QACH,CAAC;AACD;AAAA,MACF;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,EAAAF,OAAM,CAACG,QAAO;AACZ,WAAO,MAAM;AACX,YAAM,EAAE,cAAc,cAAc,IAAIA,IAAG;AAC3C,YAAM,IAAI,CAAC,aAAa;AACxB,YAAMJ,KAAI,CAAC,cAAc;AACzB,iBAAW,MAAM;AACf,cAAM,OAAO,MAAM,CAAC;AACpB,eAAO,OAAO,MAAMA,EAAC;AAAA,MACvB,GAAG,CAAC;AAAA,IACN,CAAC;AAAA,EACH,CAAC;AAED,SAAOA;AAAA,IACLF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,GAAG;AAAA,IACL;AAAA,IACAE,GAAED,WAAU;AAAA,MACV;AAAA,MACA,OAAO;AAAA,MACP,MAAM;AAAA,IACR,CAAC;AAAA,IACD,GAAG;AAAA,EACL;AACF;;;AC7GA,YAAYM,WAAU;AACtB,SAAS,aAAAC,YAAW,YAAAC,WAAU,QAAQ,KAAAC,IAAG,UAAAC,eAAc;AAQhD,IAAK,YAAL,kBAAKC,eAAL;AACL,EAAAA,WAAA,UAAO;AACP,EAAAA,WAAA,SAAM;AACN,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,WAAQ;AACR,EAAAA,WAAA,cAAW;AACX,EAAAA,WAAA,eAAY;AACZ,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,kBAAe;AARL,SAAAA;AAAA,GAAA;AAqBL,SAAS,SAAS,OAAyB,CAAC,GAAG;AACpD,QAAMC,YAAW,OAAO;AAAA,IACtB;AAAA,MACE,YAAY,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,MACzB,YAAY,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AAEA,MAAI,cAAc;AAClB,MAAI,cAAc;AAClB,QAAM,oBAAoB;AAE1B,MAAI,WAAW;AACf,MAAI,gBAAuC;AAC3C,MAAI,QAAQ;AAEZ,QAAM,iBAAiBF,QAAO,CAAC;AAC/B,QAAM,iBAAiBA,QAAO,CAAC;AAC/B,QAAM,aAAaA,QAAO,iBAAiB;AAE3C,WAAS,SAAS,aAAyB;AACzC,UAAM,IAAI,YAAY,IAAI;AAC1B,UAAM,IAAI,YAAY,IAAI;AAC1B,WAAO,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,WAAW;AAAA,EAC3D;AAEA,WAAS,aAAa,QAAoB;AACxC,QAAI,MAAM,KAAK,MAAM,OAAO,GAAG,OAAO,CAAC;AACvC,QAAK,OAAO,CAAC,KAAK,KAAK,KAAK,MAAM,KAAO,OAAO,KAAK,MAAM,KAAK,KAAK,GAAI;AACvE,aAAO;AAAA,IACT,WAAW,OAAO,KAAK,KAAK,KAAK,MAAO,IAAI,KAAK,KAAM,GAAG;AACxD,aAAO;AAAA,IACT,WAAW,OAAQ,IAAI,KAAK,KAAM,KAAK,MAAO,IAAI,KAAK,KAAM,GAAG;AAC9D,aAAO;AAAA,IACT,WAAW,OAAQ,IAAI,KAAK,KAAM,KAAK,MAAO,IAAI,KAAK,KAAM,GAAG;AAC9D,aAAO;AAAA,IACT,WACG,OAAQ,IAAI,KAAK,KAAM,KAAK,MAAM,KAAK,MACvC,OAAO,CAAC,KAAK,MAAM,MAAO,KAAK,KAAK,KAAM,GAC3C;AACA,aAAO;AAAA,IACT,WAAW,OAAQ,KAAK,KAAK,KAAM,KAAK,MAAO,KAAK,KAAK,KAAM,GAAG;AAChE,aAAO;AAAA,IACT,WAAW,OAAQ,KAAK,KAAK,KAAM,KAAK,MAAO,KAAK,KAAK,KAAM,GAAG;AAChE,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,gBAAgB,OAAmC;AAC1D,oBAAgB,MAAM,iBAAiB,IAAI;AAC3C,eAAW;AACX,eAAW,IAAI,CAAC;AAChB,IAAAE,UAAS,UAAU;AAAA,EACrB;AAEA,WAAS,gBAAgB;AACvB,QAAI,CAAC,SAAU;AACf,mBAAe,IAAI,CAAC;AACpB,mBAAe,IAAI,CAAC;AACpB,eAAW;AACX,eAAW,IAAI,iBAAiB;AAChC,IAAAA,UAAS,QAAQ;AAAA,EACnB;AAEA,WAAS,eAAe,OAAmC;AACzD,QAAI,YAAY,OAAO;AACrB;AAAA,IACF;AAEA,QAAI,cAAc,MAAM,iBAAiB,IAAI;AAE7C,QAAI,QAAQ,YAAY,KAAK,eAAe,KAAK;AACjD,QAAI,QAAQ,YAAY,KAAK,eAAe,KAAK;AAEjD,QAAI,cAAc,IAAS,YAAM,GAAG,CAAC;AACrC,QAAI,QAAQ;AAEZ,QAAI,SAAS,KAAK,SAAS,GAAG;AAC5B;AAAA,IACF;AAEA,QAAI,YAAY;AAEhB,QAAI,QAAQ,QAAQ,QAAQ,SAAS,cAAc,aAAa;AAC9D,kBAAY;AAAA,IACd,OAAO;AACL,kBAAY,cAAc;AAAA,IAC5B;AAeA,QAAI,YAAY;AAEhB,QAAI,SAAS,GAAG;AACd,UAAI,QAAQ,GAAG;AACb,oBAAY,IAAI,GAAG,QAAQ,cAAc,cAAc,KAAK;AAC5D,gBAAQ;AACR,oBAAY;AAAA,MACd,OAAO;AACL,oBAAY;AAAA,UACV;AAAA,UACA,EAAE,KAAK,IAAI,KAAK,IAAI,cAAc,cAAc,KAAK,IAAI,KAAK;AAAA,QAChE;AACA,gBAAQ;AACR,oBAAY;AAAA,MACd;AACA,qBAAe,IAAI,YAAY,CAAC;AAChC,qBAAe,IAAI,YAAY,CAAC;AAChC,cAAQ,SAAS,WAAW;AAC5B,MAAAA,UAAS,WAAW,EAAE,OAAO,WAAW,MAAM,CAAC;AAC/C;AAAA,IACF;AAEA,QAAI,SAAS,GAAG;AACd,UAAI,QAAQ,GAAG;AACb,oBAAY;AAAA,UACV,KAAK,IAAI,KAAK,IAAI,cAAc,cAAc,KAAK,IAAI,KAAK;AAAA,UAC5D;AAAA,QACF;AACA,gBAAQ;AACR,oBAAY;AAAA,MACd,OAAO;AACL,oBAAY;AAAA,UACV,EAAE,KAAK,IAAI,KAAK,IAAI,cAAc,cAAc,KAAK,IAAI,KAAK;AAAA,UAC9D;AAAA,QACF;AACA,gBAAQ;AACR,oBAAY;AAAA,MACd;AAEA,qBAAe,IAAI,YAAY,CAAC;AAChC,qBAAe,IAAI,YAAY,CAAC;AAChC,cAAQ,SAAS,WAAW;AAC5B,MAAAA,UAAS,WAAW,EAAE,OAAO,WAAW,MAAM,CAAC;AAC/C;AAAA,IACF;AAEA,QAAI,SAAS,KAAK,IAAI,QAAQ,KAAK;AACnC,QAAI,SAAS,KAAK,KAAK,MAAM;AAC7B,YAAS,SAAS,MAAO,KAAK;AAE9B,QAAI,UAAU;AACd,QAAI,UAAU;AAEd,QAAI,QAAQ,QAAQ,QAAQ,SAAS,cAAc,aAAa;AAC9D,gBAAU,cAAc,KAAK,IAAI,MAAM;AACvC,gBAAU,cAAc,KAAK,IAAI,MAAM;AAAA,IACzC,OAAO;AACL,gBAAU,KAAK,IAAI,KAAK,IAAI,cAAc,cAAc,KAAK,IAAI,KAAK;AACtE,gBAAU,KAAK,IAAI,KAAK,IAAI,cAAc,cAAc,KAAK,IAAI,KAAK;AAAA,IACxE;AAEA,QAAI,QAAQ,GAAG;AACb,gBAAU,CAAC,KAAK,IAAI,OAAO;AAAA,IAC7B;AACA,QAAI,QAAQ,GAAG;AACb,gBAAU,CAAC,KAAK,IAAI,OAAO;AAAA,IAC7B;AAEA,QAAI,QAAQ,KAAK,QAAQ,GAAG;AAAA,IAE5B,WAAW,QAAQ,KAAK,QAAQ,GAAG;AAEjC,cAAQ,MAAM;AAAA,IAChB,WAAW,QAAQ,KAAK,QAAQ,GAAG;AAEjC,cAAQ,QAAQ;AAAA,IAClB,WAAW,QAAQ,KAAK,QAAQ,GAAG;AAEjC,cAAQ,MAAM;AAAA,IAChB;AACA,gBAAY,IAAI,SAAS,OAAO;AAChC,YAAQ,SAAS,WAAW;AAE5B,gBAAY,aAAa,WAAW;AACpC,mBAAe,IAAI,YAAY,CAAC;AAChC,mBAAe,IAAI,YAAY,CAAC;AAEhC,IAAAA,UAAS,WAAW,EAAE,OAAO,WAAW,MAAM,CAAC;AAAA,EACjD;AAEA,MAAI;AACJ,MAAI;AAEJ,MAAI,CAACA,UAAS,OAAO;AACnB,mBAAeH,GAAED,WAAU;AAAA,MACzB,MAAM,CAAC,MAAM;AACX,UAAE,OAAO,GAAG,GAAG,WAAW,EAAE,KAAK,CAAQ;AAAA,MAC3C;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,EACH,OAAO;AACL,mBAAeC,GAAE,QAAQ;AAAA,MACvB,OAAOG,UAAS;AAAA,MAChB,QAAQ,EAAE,GAAG,KAAK,GAAG,IAAI;AAAA,MACzB,OAAOA,UAAS;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,QAAM,eAAoB;AAAA,IACxB,OAAOA,UAAS;AAAA,IAChB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,EACT;AAEA,MAAI,CAACA,UAAS,OAAO;AACnB,mBAAeH,GAAED,WAAU;AAAA,MACzB,MAAM,CAAC,MAAM;AACX,UAAE,OAAO,GAAG,GAAG,cAAc,GAAG,EAAE,KAAK,CAAQ;AAAA,MACjD;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH,OAAO;AACL,mBAAeC,GAAE,QAAQ;AAAA,MACvB,OAAOG,UAAS;AAAA,MAChB,QAAQ,EAAE,GAAG,KAAK,GAAG,IAAI;AAAA,MACzB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAEA,SAAOH;AAAA,IACLF;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,aAAa;AAAA,MACb,WAAW;AAAA,MACX,kBAAkB;AAAA,MAClB,aAAa;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC3RA,SAAqB,gBAA0B,uBAAqC;AACpF,SAAS,MAAM,KAAAM,IAAG,aAAAC,YAAW,cAAc,YAAAC,WAAU,UAAAC,SAAQ,UAAAC,eAAc;;;ACD3E,SAAS,kBAAkB,mBAA4B,gBAAgB;AACvE,SAAS,aAAgC;AACzC,SAAS,iBAAiB,mBAAmB,qBAAqB;;;ACAlE,SAAS,gBAAyB,eAAe;AAG1C,IAAM,OAAN,MAAM,cAAa,eAAe;AAAA,EAqBrC,YACY,MACA,SACV;AACE,UAAM,MAAK,YAAY,MAAM,OAAO,CAAC;AAH7B;AACA;AARZ,sBAAqD,CAAC;AACtD,cAAa;AACb,cAAa;AAEb,sBAAkB,CAAC;AAOf,SAAK,aAAa,KAAK,cAAc,CAAC;AACtC,SAAK,aAAa,KAAK;AACvB,SAAK,WAAW,MAAK,YAAY,MAAM,OAAO;AAC9C,SAAK,UAAU,KAAK,SAAS,CAAC;AAC9B,SAAK,KAAK;AAAA,EACd;AAAA,EA9BA,OAAO,YAAY,MAAsB,SAAkB;AACvD,UAAM,WAAsB,CAAC;AAE7B,QAAI,KAAK,cAAc,KAAK,WAAW,QAAQ;AAC3C,WAAK,WAAW,QAAQ,WAAS;AAC7B,iBAAS,KAAK,QAAQ,SAAS,MAAM,MAAM,CAAC;AAAA,MAChD,CAAC;AAAA,IACL,OAAO;AACH,eAAS,KAAK,QAAQ,SAAS,KAAK,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAC/D;AAEA,WAAO;AAAA,EACX;AAAA,EAoBA,IAAI,MAAM;AACN,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EAEA,aAAa,OAAyB;AAClC,UAAM,OAAO,KAAK,WAAW;AAC7B,QAAI,OAAO,GAAG;AACV,YAAM,UAAU,KAAK,WAAW,CAAC,EAAE,SAAS,KAAK,WAAW,CAAC,EAAE,UAAU,KAAK;AAC9E,YAAM,UAAU,QAAQ,IAAI;AAAA,IAChC;AAAA,EACJ;AAAA,EAEA,OAAO;AACH,QAAI;AACJ,QAAI,IAAI;AACR,UAAM,MAAM,CAAC,mBAAmB;AAC5B;AACA,UAAI,SAAU,YAAW,QAAQ,IAAI,UAAU,cAAc;AAAA,UACxD,YAAW;AAAA,IACpB;AAEA,QAAI,KAAK,KAAK,gBAAgB;AAC1B,UAAI,QAAQ,iBAAiB;AAAA,IACjC;AAEA,QAAI,KAAK,KAAK,cAAc;AACxB,UAAI,QAAQ,eAAe;AAAA,IAC/B;AAEA,QAAI,KAAK,KAAK,cAAc;AACxB,UAAI,IAAI,KAAK,GAAG;AACZ,YAAI,QAAQ,aAAa;AAAA,MAC7B,OACK;AACD,YAAI,QAAQ,gBAAgB;AAAA,MAChC;AAAA,IACJ;AAAA,EAGJ;AACJ;;;ADxEA,SAAS,gBAAgB;AAElB,IAAM,kBAAN,MAAM,yBAAwB,cAAc,gBAAgB,EAAE;AAAA,EAA9D;AAAA;AACH,SAAQ,SAAc,CAAC;AAAA;AAAA;AAAA,EAIvB,OAAO,YAAY,KAAa,UAAqB;AACjD,QAAI;AACJ,aAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,gBAAU,SAAS,CAAC;AACpB,UAAI,QAAQ,YAAY,QAAQ,YAAY,KAAK;AAC7C;AAAA,MACJ;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,WAAW,GAAW,GAAW,UAAe,CAAC,GAAqB;AAClE,UAAM,EAAE,MAAM,OAAO,IAAI;AACzB,UAAM,EAAE,WAAW,YAAY,MAAM,IAAI,KAAK;AAC9C,QAAI,MAAM;AACN,UAAI,KAAK,MAAM,IAAI,SAAS;AAC5B,UAAI,KAAK,MAAM,IAAI,UAAU;AAAA,IACjC;AACA,UAAM,IAAI,IAAI,IAAI;AAClB,UAAM,YAAY,KAAK,OAAO,eAAe,CAAC;AAE9C,QAAI,CAAC,aAAc,aAAa,UAAU,OAAO,EAAI;AAErD,UAAM,UAAU,iBAAgB;AAAA,MAC5B,UAAU;AAAA,MACV,KAAK;AAAA,IACT;AAEA,QAAI,CAAC,QAAS;AAEd,UAAM,OAAO,IAAI;AAAA,MACb;AAAA,MACA;AAAA,IACJ;AAEA,SAAK,IAAI,IAAI;AACb,SAAK,IACD,IAAI,cACH,aACG,KAAK,QAAQ;AAErB,SAAK,KAAK;AACV,SAAK,KAAK;AAEV,QAAI,QAAQ,YAAY;AACpB,WAAK,KAAK,QAAQ,WAAW,KAAK;AAClC,WAAK,KAAK,QAAQ,WAAW,KAAK;AAAA,IACtC;AAEA,QAAI,QAAQ;AACR,YAAM,MAAM,OAAO,IAAI;AACvB,UAAI,CAAC,IAAK;AAAA,IACd;AAEA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,WAAW,GAAW,GAAW;AAC7B,UAAM,EAAE,WAAW,WAAW,IAAI,KAAK;AACvC,QAAI,KAAK,MAAM,IAAI,SAAS;AAC5B,QAAI,KAAK,MAAM,IAAI,UAAU;AAC7B,UAAM,UAAgB,KAAK,OAAO,IAAI,MAAM,CAAC;AAC7C,UAAM,UAAU,KAAK,WAAW,GAAG,CAAC;AACpC,QAAI,CAAC,WAAW,SAAS;AACrB,WAAK,UAAU,SAAS,GAAG,CAAC;AAAA,IAChC,OACK;AACD,UAAI,SAAS;AACT,cAAM,eAAiC,IAAI,iBAAiB;AAC5D,cAAM,QAAQ,aAAa,KAAK,QAAQ,SAAS,QAAQ,GAAG,QAAQ,CAAC;AACrE,gBAAQ,aAAa,KAAK;AAC1B,aAAK,OAAO,IAAI,MAAM,CAAC,IAAI;AAE3B,cAAM,qBAAsB,aAAa,SAAS,CAAC,EAAc;AAE5D,SAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM;AAC/B,cAAI,KAAK,UAAW,MAAK,UAAU,QAAQ,iBAAiB,CAAC,IAAI,mBAAmB,CAAC;AAAA,QACzF,CAAC;AAEL,aAAK,SAAS,CAAC,EAAE,qBAAqB;AACtC,aAAK,UAAU,SAAS,GAAG,CAAC;AAC5B,aAAK,oBAAoB,IAAI;AAAA,MACjC,OACK;AACD,eAAO,KAAK,OAAO,IAAI,MAAM,CAAC;AAC9B,YAAI,KAAK,UAAW,MAAK,UAAU,OAAO,QAAQ,gBAAgB,iBAAiB;AAAA,MACvF;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,IAAI,YAA6B;AAC7B,UAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,MAAM,WAAW;AAAA,EAC5B;AAAA,EAEQ,UAAU,MAAY,GAAW,GAAW;AAChD,UAAM,QAAQ,KAAK,KAAK,KAAK,SAAS,KAAK,GAAG,KAAK,GAAG;AAAA,MAClD,QAAQ,KAAK,QAAQ;AAAA,IACzB,CAAC;AACD,UAAM,KAAK,KAAK;AAChB,QAAI,CAAC,GAAI,QAAO;AAChB,SAAK,iBAAiB,GAAG,SAAS;AAClC,SAAK,aAAa,KAAK;AACvB,SAAK,OAAO,IAAI,MAAM,CAAC,IAAI;AAAA,EAC/B;AAAA,EAEA,QAAQ,MAAM;AACV,UAAM,EAAE,MAAM,IAAI;AAClB,SAAK,WAAW,MAAM;AACtB,SAAK,SAAS,IAAI,MAAM;AAAA,MACpB,GAAG;AAAA,IACP,GAAG,KAAK,QAAQ;AAChB,UAAM,QAAQ,IAAI;AAAA,EACtB;AAAA,EAEA,SAAS,OAAO;AACZ,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,KAAK,UAAW;AACrB,QAAI,MAAM,WAAY,MAAK,OAAO,aAAa,MAAM;AACrD,QAAI,MAAM,UAAW,MAAK,OAAO,YAAY,MAAM;AACnD,QAAI,MAAM,MAAO,MAAK,OAAO,QAAQ,MAAM;AAC3C,QAAI,MAAM,OAAQ,MAAK,OAAO,SAAS,MAAM;AAC7C,QAAI,MAAM,UAAW,MAAK,OAAO,YAAY,MAAM;AACnD,QAAI,MAAM,UAAW,MAAK,OAAO,YAAY,MAAM;AAEnD,SAAK,eAAe;AAEpB,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;AACzC,eAAS,IAAI,GAAG,IAAI,KAAK,OAAO,OAAO,KAAK;AACxC,cAAM,OAAO,KAAK,WAAW,GAAG,CAAC;AACjC,YAAI,MAAM;AACN,eAAK,UAAU,MAAM,GAAG,CAAC;AAAA,QAC7B;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ;AAIA,kBAAkB,sBAAsB,eAAe;AAEhD,SAAS,mBAAmB,OAAO;AACtC,SAAO,gBAAgB,sBAAsB,KAAK;AACtD;;;AEjKA,SAAuB,WAAW,yBAAyB;AAC3D,SAAS,UAAAC,SAAQ,WAAW,WAAAC,gBAAe;AAEpC,IAAM,UAAN,cAAsB,kBAAkB;AAAA,EAI7C,YAAY,SAAuB;AACjC,UAAM,OAAO;AAJf,SAAO,WAAsB,CAAC;AAC9B,SAAQ,aAAa,CAAC;AAAA,EAItB;AAAA,EAEA,YAAY;AAAA,EAGZ;AAAA;AAAA,EAGA,MAAM,KAAK,OAAe;AACxB,UAAM,UAAU,MAAMD,QAAO,KAAK,KAAK;AACvC,aACM,IAAI,KAAK,QACb,IAAI,KAAK,MAAM,QACf,KAAK,KAAK,aAAa,KAAK,SAC5B;AACA,eACM,IAAI,KAAK,QACb,IAAI,KAAK,MAAM,OACf,KAAK,KAAK,YAAY,KAAK,SAC3B;AACA,aAAK,SAAS;AAAA,UACZ,IAAIC,SAAQ;AAAA,YACV,QAAQ,QAAQ;AAAA,YAChB,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,WAAW,CAAC,KAAK,UAAU;AAAA,UAChE,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AACF;;;AHnCO,SAAS,SAAS,OAAO;AAC5B,QAAM,EAAE,KAAK,SAAS,IAAIC,UAAS,KAAK;AACxC,QAAM,SAASC,QAAqB,CAAC,CAAC;AACtC,QAAM,cAAc,MAAM;AAC1B,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,MAAI,WAA2B,CAAC;AAChC,MAAI,UAAoB,CAAC;AAEzB,QAAM,WAAW,OAAO,MAAc,eAAuB,OAAO;AAChE,QAAI,OAAO,SAAS,UAAU;AAC1B,aAAO;AAAA,IACX;AAEA,UAAM,SAAS,IAAI;AAAA,MACf;AAAA,MACA;AAAA,QACI,UAAU;AAAA,QACV,WAAW;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AACA,UAAM,OAAO,MAAM,OAAO,iBAAiB;AAAA,MACvC,iBAAiB;AAAA,IACrB,CAAC;AAED,WAAO;AAAA,EACX;AAEA,EAAAC,QAAO,YAAY;AACf,UAAM,OAAO,IAAI;AACjB,QAAI,MAAM;AACN,gBAAU,MAAM,SAAS,MAAM,SAAS,CAAC;AACzC,eAAS,WAAW,QAAQ,UAAU;AAClC,iBAAS,KAAK,MAAM,IAAI,QAAQ,OAAO,EAAE,KAAK,QAAQ,MAAM,MAAM,CAAC;AAAA,MACvE;AACA,aAAO,IAAI,QAAQ,MAAM;AAAA,IAC7B;AAAA,EACJ,CAAC;AAED,QAAM,cAAc,CAACC,SAAQC,SAAQ,CAAC,MAAM;AACxC,WAAOC,GAAEC,YAAWF,QAAO,KAAUD,SAAQ,CAAC,UAAU;AACpD,cAAQ,MAAM,MAAM;AAAA,QAChB,KAAK,eAAe;AAChB,iBAAOE,GAAE,oBAAoB;AAAA,YACzB,WAAW,QAAQ;AAAA,YACnB,YAAY,QAAQ;AAAA;AAAA,YAEpB,OAAO,QAAQ;AAAA;AAAA,YAEf,QAAQ,QAAQ;AAAA,YAChB,GAAG;AAAA,YACH;AAAA,UACJ,CAAC;AAAA,QACL,KAAK,eAAe;AAChB,gBAAM,EAAE,OAAO,QAAQ,OAAO,IAAI,MAAM;AACxC,iBAAOA,GAAE,cAAc;AAAA,YACnB,OAAO;AAAA,YACP,GAAG;AAAA,YACH,OAAO,MAAM,UAAU,MAAM,QAAQ,MAAM,YAAY;AAAA,YACvD,QAAQ,MAAM,UAAU,MAAM,SAAS,MAAM,aAAa;AAAA,UAC9D,CAAC;AAAA,QACL,KAAK,eAAe;AAChB,iBAAO,YAAYJ,QAAO,MAAM,MAAM,GAAG,KAAK;AAAA,QAClD,KAAK,eAAe;AAChB,gBAAMM,SAAQ,cAAc,KAAK;AACjC,iBAAOF,GAAEC,YAAW,OAAOC,MAAK;AAAA,QACpC;AACI,iBAAOF,GAAEC,UAAS;AAAA,MAC1B;AAAA,IACJ,CAAC,CAAC;AAAA,EACN;AAEA,SAAOD,GAAEC,YAAW,OAAO,YAAY,MAAM,CAAC;AAClD;;;AI9EA,SAAS,UAAAE,SAAQ,UAAAC,SAAQ,QAAAC,OAAM,KAAAC,IAAG,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAS9D,SAAS,SAAS,OAAO;AAC9B,QAAM,EAAE,aAAa,SAAS,IAAIA,UAAS,KAAK;AAChD,QAAM,QAAQL,QAAmB,CAAC,CAAC;AAEnC,EAAAD,QAAO,YAAY;AACjB,UAAM,OAAO,MAAM,MAAM,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,SAAS,KAAK,CAAC;AACvE,UAAM,UAAU;AAChB,QAAI,MAAM,SAAS;AACjB,cAAQ,KAAK,GAAG,MAAM,QAAQ,IAAI,CAAC;AAAA,IACrC;AACA,UAAM,IAAI,OAAO;AAAA,EACnB,CAAC;AAED,QAAM,qBAAqB,MAAM;AAC/B,UAAM,SAAS,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,GAAG,IAAI,GAAG,gBAAgB,CAAC,CAAC;AAEhF,WAAOG,GAAEC,YAAW,OAAO,GAAG,MAAM;AAAA,EACtC;AAEA,QAAM,kBAAkB,CAAC,YAAoB,mBAAmB,UAAU;AACxE,WAAOD;AAAA,MACLC;AAAA,MACA;AAAA,QACE;AAAA,MACF;AAAA;AAAA,MAEAF,MAAK,OAAO,CAAC,WAAgB;AAC3B,YAAI,OAAO,OAAO,cAAc,GAAG;AAC/B,iBAAO;AAAA,QACX;AAEA,eAAO,eAAP,OAAO,aAAe;AACtB,YAAI,OAAO,eAAe,WAAY,QAAO;AAE7C,cAAM,CAAC,GAAG,GAAG,OAAO,MAAM,IAAI,OAAO;AACrC,cAAM,CAAC,OAAO,KAAK,IAAI,OAAO;AAE9B,eAAOC,GAAEE,SAAQ;AAAA,UACf,OAAO,YAAY;AAAA,UACnB,GAAG;AAAA,UACH,GAAG;AAAA,UACH,WAAW,EAAE,GAAG,GAAG,OAAO,OAAO;AAAA,UACjC,QAAQ,QAAQ,SAAS;AAAA;AAAA,QAE3B,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,mBAAmB;AAC5B;","names":["h","g","h","useProps","settings","Container","Graphics","h","mount","useProps","child","el","PIXI","Container","Graphics","h","signal","Direction","settings","h","Container","useProps","effect","signal","Assets","Texture","useProps","signal","effect","layers","props","h","Container","child","effect","signal","loop","h","Container","Sprite","useProps"]}
1
+ {"version":3,"sources":["../src/Bar.ts","../src/Particle.ts","../src/NightAmbiant.ts","../src/Joystick.ts","../src/Tilemap/index.ts","../src/Tilemap/TileLayer.ts","../src/Tilemap/Tile.ts","../src/Tilemap/TileSet.ts"],"sourcesContent":["import { Graphics, h, useProps } from \"canvasengine\";\nimport * as PIXI from \"pixi.js\";\n\ninterface BarProps {\n backgroundColor?: string;\n foregroundColor?: string;\n value: number;\n maxValue: number;\n width: number;\n height: number;\n border?: any;\n innerMargin?: number;\n borderRadius?: number;\n}\n\nfunction componentToHex(c) {\n var hex = c.toString(16);\n return hex.length == 1 ? \"0\" + hex : hex;\n}\n\nfunction rgbToHex(r, g, b) {\n return \"#\" + componentToHex(r) + componentToHex(g) + componentToHex(b);\n}\n\nexport function Bar(opts: BarProps) {\n const {\n width,\n height,\n value,\n maxValue,\n backgroundColor,\n foregroundColor,\n border,\n innerMargin,\n borderRadius,\n } = useProps(opts, {\n backgroundColor: \"#000000\",\n foregroundColor: \"#FFFFFF\",\n innerMargin: 0,\n borderRadius: 0,\n });\n\n return h(\n Graphics,\n {\n ...opts,\n width,\n height,\n draw(graphics: any) {\n if (borderRadius()) {\n graphics.roundRect(0, 0, width(), height(), borderRadius());\n } else {\n graphics.rect(0, 0, width(), height());\n }\n if (border) {\n graphics.stroke(border);\n }\n graphics.fill(backgroundColor());\n },\n },\n h(Graphics, {\n width,\n height,\n draw(graphics: any) {\n const margin = innerMargin();\n const _borderRadius = borderRadius();\n const w = Math.max(\n 0,\n Math.min(\n width() - 2 * margin,\n (value() / maxValue()) * (width() - 2 * margin)\n )\n );\n const h = height() - 2 * margin;\n if (borderRadius) {\n graphics.roundRect(margin, margin, w, h, _borderRadius);\n } else {\n graphics.rect(margin, margin, w, h);\n }\n const color = foregroundColor();\n if (color.startsWith(\"rgba\")) {\n const [r, g, b, a] = color.match(/\\d+(\\.\\d+)?/g).map(Number);\n graphics.fill({ color: rgbToHex(r, g, b), alpha: a });\n } else {\n graphics.fill(color);\n }\n },\n })\n );\n}\n","import * as PIXI from \"pixi.js\";\nimport { FX } from \"revolt-fx\";\nimport { h, mount, tick, Container, on, useProps } from \"canvasengine\";\n\nexport function Particle(options) {\n const { emit, settings = {} } = options;\n const { name } = useProps(options);\n const fx = new FX();\n let element;\n\n PIXI.Assets.add({ alias: \"fx_settings\", src: \"/default-bundle.json\" });\n PIXI.Assets.add({\n alias: \"fx_spritesheet\",\n src: \"/revoltfx-spritesheet.json\",\n });\n\n tick(({deltaRatio}) => {\n fx.update(deltaRatio);\n });\n\n mount(async (_element) => {\n element = _element;\n\n const data = await PIXI.Assets.load([\"fx_settings\", \"fx_spritesheet\"]);\n let fxSettings = {...data.fx_settings};\n\n if (settings.emitters) {\n const lastId = 10000;\n const emittersWithIds = settings.emitters.map((emitter, index) => ({\n ...emitter,\n id: lastId + index\n }));\n\n fxSettings.emitters = [\n ...fxSettings.emitters,\n ...emittersWithIds,\n ];\n\n }\n\n fx.initBundle(fxSettings, true);\n });\n\n on(emit, () => {\n const emitter = fx.getParticleEmitter(name());\n emitter.init(element.componentInstance);\n });\n\n return h(Container);\n}\n","import { Container, Graphics, h, mount, useProps, animatedSignal, RadialGradient, effect, isSignal, signal, isObservable } from \"canvasengine\";\n\nexport function LightSpot(opts) {\n const { radius } = useProps(opts);\n const scale = animatedSignal(1);\n\n const minScale = 1;\n const maxScale = 2; // Reduced max scale for subtler effect\n const scintillationSpeed = 0.001; // Significantly reduced for slower scintillation\n\n const animate = () => {\n // Use time-based animation for smoother, slower scintillation\n const time = Date.now() * scintillationSpeed;\n\n // Combine multiple sine waves for a more natural, less predictable effect\n const scintillationFactor =\n (Math.sin(time) + Math.sin(time * 1.3) + Math.sin(time * 0.7)) / 3;\n\n // Map the scintillation factor to the scale range\n const newScale =\n minScale + (maxScale - minScale) * (scintillationFactor * 0.5 + 0.5);\n\n scale.update(() => newScale);\n\n requestAnimationFrame(animate);\n };\n\n animate();\n\n const draw = (g) => {\n const size = radius() * 2;\n const gradient = new RadialGradient(size, size, 0, size, size, 0);\n gradient.addColorStop(0, \"rgba(255, 255, 0, 1)\");\n gradient.addColorStop(0.5, \"rgba(255, 255, 0, 0.3)\");\n gradient.addColorStop(0.8, \"rgba(255, 255, 0, 0)\");\n\n const translate = size / 2;\n\n g.rect(-translate, -translate, size, size).fill(\n gradient.render({ translate: { x: translate, y: translate } })\n );\n };\n\n return h(Graphics, {\n draw,\n ...opts,\n scale,\n });\n}\n\nexport function NightAmbiant(props) {\n const { children } = props;\n let el\n const width = signal(0);\n const height = signal(0);\n let subscription\n const draw = (rectAndHole) => {\n const margin = 80\n rectAndHole.rect(-margin, -margin, width() + margin*2, height() + margin*2);\n rectAndHole.fill(0x000000);\n const applyChildren = (child) => {\n const x = isSignal(child.propObservables.x)\n ? child.propObservables.x()\n : child.props.x;\n const y = isSignal(child.propObservables.y)\n ? child.propObservables.y()\n : child.props.y;\n const radius = isSignal(child.propObservables.radius)\n ? child.propObservables.radius()\n : child.props.radius;\n rectAndHole.circle(x, y, radius);\n rectAndHole.cut();\n }\n for (let child of children) {\n if (isObservable(child)) {\n if (subscription) {\n subscription.unsubscribe()\n }\n subscription = child.subscribe((event: any) => {\n for (let child of event.fullElements) {\n applyChildren(child)\n }\n })\n return\n }\n applyChildren(child)\n }\n };\n\n mount((el) => {\n effect(() => {\n const { displayWidth, displayHeight } = el.componentInstance as any\n const w = +displayWidth()\n const h = +displayHeight()\n setTimeout(() => {\n width.update(() => w)\n height.update(() => h)\n }, 0) // hack\n });\n });\n\n return h(\n Container,\n {\n width: \"100%\",\n height: \"100%\",\n ...props,\n },\n h(Graphics, {\n draw,\n alpha: 0.8,\n blur: 80,\n }),\n ...children\n );\n}\n","/*\n * Joystick\n *\n * Inspired by https://github.com/endel/pixi-virtual-joystick\n */\n\nimport * as PIXI from \"pixi.js\";\nimport { Container, Graphics, Sprite, h, signal } from \"canvasengine\";\n\nexport interface JoystickChangeEvent {\n angle: number;\n direction: Direction;\n power: number;\n}\n\nexport enum Direction {\n LEFT = \"left\",\n TOP = \"top\",\n BOTTOM = \"bottom\",\n RIGHT = \"right\",\n TOP_LEFT = \"top_left\",\n TOP_RIGHT = \"top_right\",\n BOTTOM_LEFT = \"bottom_left\",\n BOTTOM_RIGHT = \"bottom_right\",\n}\n\nexport interface JoystickSettings {\n outer?: string;\n inner?: string;\n outerScale?: { x: number; y: number };\n innerScale?: { x: number; y: number };\n onChange?: (data: JoystickChangeEvent) => void;\n onStart?: () => void;\n onEnd?: () => void;\n}\n\nexport function Joystick(opts: JoystickSettings = {}) {\n const settings = Object.assign(\n {\n outerScale: { x: 1, y: 1 },\n innerScale: { x: 1, y: 1 },\n },\n opts\n );\n\n let outerRadius = 70;\n let innerRadius = 10;\n const innerAlphaStandby = 0.5;\n\n let dragging = false;\n let startPosition: PIXI.PointData | null = null;\n let power = 0;\n\n const innerPositionX = signal(0);\n const innerPositionY = signal(0);\n const innerAlpha = signal(innerAlphaStandby);\n\n function getPower(centerPoint: PIXI.Point) {\n const a = centerPoint.x - 0;\n const b = centerPoint.y - 0;\n return Math.min(1, Math.sqrt(a * a + b * b) / outerRadius);\n }\n\n function getDirection(center: PIXI.Point) {\n let rad = Math.atan2(center.y, center.x); // [-PI, PI]\n if ((rad >= -Math.PI / 8 && rad < 0) || (rad >= 0 && rad < Math.PI / 8)) {\n return Direction.RIGHT;\n } else if (rad >= Math.PI / 8 && rad < (3 * Math.PI) / 8) {\n return Direction.BOTTOM_RIGHT;\n } else if (rad >= (3 * Math.PI) / 8 && rad < (5 * Math.PI) / 8) {\n return Direction.BOTTOM;\n } else if (rad >= (5 * Math.PI) / 8 && rad < (7 * Math.PI) / 8) {\n return Direction.BOTTOM_LEFT;\n } else if (\n (rad >= (7 * Math.PI) / 8 && rad < Math.PI) ||\n (rad >= -Math.PI && rad < (-7 * Math.PI) / 8)\n ) {\n return Direction.LEFT;\n } else if (rad >= (-7 * Math.PI) / 8 && rad < (-5 * Math.PI) / 8) {\n return Direction.TOP_LEFT;\n } else if (rad >= (-5 * Math.PI) / 8 && rad < (-3 * Math.PI) / 8) {\n return Direction.TOP;\n } else {\n return Direction.TOP_RIGHT;\n }\n }\n\n function handleDragStart(event: any) {\n startPosition = event.getLocalPosition(this);\n dragging = true;\n innerAlpha.set(1);\n settings.onStart?.();\n }\n\n function handleDragEnd() {\n if (!dragging) return;\n innerPositionX.set(0);\n innerPositionY.set(0);\n dragging = false;\n innerAlpha.set(innerAlphaStandby);\n settings.onEnd?.();\n }\n\n function handleDragMove(event: any) {\n if (dragging == false) {\n return;\n }\n\n let newPosition = event.getLocalPosition(this);\n\n let sideX = newPosition.x - (startPosition?.x ?? 0);\n let sideY = newPosition.y - (startPosition?.y ?? 0);\n\n let centerPoint = new PIXI.Point(0, 0);\n let angle = 0;\n\n if (sideX == 0 && sideY == 0) {\n return;\n }\n\n let calRadius = 0;\n\n if (sideX * sideX + sideY * sideY >= outerRadius * outerRadius) {\n calRadius = outerRadius;\n } else {\n calRadius = outerRadius - innerRadius;\n }\n\n /**\n * x: -1 <-> 1\n * y: -1 <-> 1\n * Y\n * ^\n * |\n * 180 | 90\n * ------------> X\n * 270 | 360\n * |\n * |\n */\n\n let direction = Direction.LEFT;\n\n if (sideX == 0) {\n if (sideY > 0) {\n centerPoint.set(0, sideY > outerRadius ? outerRadius : sideY);\n angle = 270;\n direction = Direction.BOTTOM;\n } else {\n centerPoint.set(\n 0,\n -(Math.abs(sideY) > outerRadius ? outerRadius : Math.abs(sideY))\n );\n angle = 90;\n direction = Direction.TOP;\n }\n innerPositionX.set(centerPoint.x);\n innerPositionY.set(centerPoint.y);\n power = getPower(centerPoint);\n settings.onChange?.({ angle, direction, power });\n return;\n }\n\n if (sideY == 0) {\n if (sideX > 0) {\n centerPoint.set(\n Math.abs(sideX) > outerRadius ? outerRadius : Math.abs(sideX),\n 0\n );\n angle = 0;\n direction = Direction.LEFT;\n } else {\n centerPoint.set(\n -(Math.abs(sideX) > outerRadius ? outerRadius : Math.abs(sideX)),\n 0\n );\n angle = 180;\n direction = Direction.RIGHT;\n }\n\n innerPositionX.set(centerPoint.x);\n innerPositionY.set(centerPoint.y);\n power = getPower(centerPoint);\n settings.onChange?.({ angle, direction, power });\n return;\n }\n\n let tanVal = Math.abs(sideY / sideX);\n let radian = Math.atan(tanVal);\n angle = (radian * 180) / Math.PI;\n\n let centerX = 0;\n let centerY = 0;\n\n if (sideX * sideX + sideY * sideY >= outerRadius * outerRadius) {\n centerX = outerRadius * Math.cos(radian);\n centerY = outerRadius * Math.sin(radian);\n } else {\n centerX = Math.abs(sideX) > outerRadius ? outerRadius : Math.abs(sideX);\n centerY = Math.abs(sideY) > outerRadius ? outerRadius : Math.abs(sideY);\n }\n\n if (sideY < 0) {\n centerY = -Math.abs(centerY);\n }\n if (sideX < 0) {\n centerX = -Math.abs(centerX);\n }\n\n if (sideX > 0 && sideY < 0) {\n // < 90\n } else if (sideX < 0 && sideY < 0) {\n // 90 ~ 180\n angle = 180 - angle;\n } else if (sideX < 0 && sideY > 0) {\n // 180 ~ 270\n angle = angle + 180;\n } else if (sideX > 0 && sideY > 0) {\n // 270 ~ 369\n angle = 360 - angle;\n }\n centerPoint.set(centerX, centerY);\n power = getPower(centerPoint);\n\n direction = getDirection(centerPoint);\n innerPositionX.set(centerPoint.x);\n innerPositionY.set(centerPoint.y);\n\n settings.onChange?.({ angle, direction, power });\n }\n\n let innerElement;\n let outerElement;\n\n if (!settings.outer) {\n outerElement = h(Graphics, {\n draw: (g) => {\n g.circle(0, 0, outerRadius).fill(0x000000);\n },\n alpha: 0.5,\n });\n } else {\n outerElement = h(Sprite, {\n image: settings.outer,\n anchor: { x: 0.5, y: 0.5 },\n scale: settings.outerScale,\n });\n }\n\n const innerOptions: any = {\n scale: settings.innerScale,\n x: innerPositionX,\n y: innerPositionY,\n alpha: innerAlpha,\n };\n\n if (!settings.inner) {\n innerElement = h(Graphics, {\n draw: (g) => {\n g.circle(0, 0, innerRadius * 2.5).fill(0x000000);\n },\n ...innerOptions,\n });\n } else {\n innerElement = h(Sprite, {\n image: settings.inner,\n anchor: { x: 0.5, y: 0.5 },\n ...innerOptions,\n });\n }\n\n return h(\n Container,\n {\n ...opts,\n pointerdown: handleDragStart,\n pointerup: handleDragEnd,\n pointerupoutside: handleDragEnd,\n pointermove: handleDragMove,\n },\n outerElement,\n innerElement\n );\n}\n","import { TiledLayer, TiledLayerType, TiledMap, TiledParserFile, TiledTileset } from \"@rpgjs/tiled\"\nimport { loop, h, Container, TilingSprite, useProps, effect, signal } from \"canvasengine\"\nimport { CompositeTileLayer } from \"./TileLayer\"\nimport { TileSet } from \"./TileSet\"\n\n/**\n * Reorganizes tile layers based on the z property of tiles\n * \n * This function analyzes each tile in the layer data and groups them by their z property.\n * If a tile has a z property different from 0, it creates new layers for each z value.\n * \n * @param {TiledLayer[]} originalLayers - The original layers from the tilemap\n * @param {TileSet[]} tilesets - Array of loaded tilesets\n * @param {TiledMap} mapData - The complete map data\n * @returns {TiledLayer[]} - Reorganized layers with tiles grouped by z property\n * \n * @example\n * ```typescript\n * const reorganizedLayers = reorganizeLayersByTileZ(mapData.layers, tilesets, mapData);\n * ```\n */\nfunction reorganizeLayersByTileZ(originalLayers: TiledLayer[], tilesets: TileSet[], mapData: TiledMap): TiledLayer[] {\n const reorganizedLayers: TiledLayer[] = [];\n \n for (const layer of originalLayers) {\n if (layer.type !== TiledLayerType.Tile) {\n // Keep non-tile layers as they are\n reorganizedLayers.push(layer);\n continue;\n }\n\n // Group tiles by their z property\n const layersByZ = new Map<number, number[]>();\n \n // Initialize empty arrays for all z values we'll find\n // Don't pre-populate with original data anymore\n \n // Ensure layer data is number array\n let layerData: number[];\n if (Array.isArray(layer.data)) {\n layerData = layer.data.map(gid => {\n if (typeof gid === 'number') {\n return gid;\n } else {\n return parseInt(String(gid), 10);\n }\n });\n } else {\n // If data is a string, it might be compressed - for now, skip this layer\n reorganizedLayers.push(layer);\n continue;\n }\n \n let tilesProcessed = 0;\n let tilesWithZ = 0;\n \n // Analyze each tile in the layer\n for (let i = 0; i < layerData.length; i++) {\n const gid = layerData[i];\n \n if (gid === 0) continue; // Empty tile\n \n tilesProcessed++;\n \n // Find the corresponding tileset\n let tileset: TileSet | undefined;\n for (let j = tilesets.length - 1; j >= 0; j--) {\n if (tilesets[j].firstgid && tilesets[j].firstgid <= gid) {\n tileset = tilesets[j];\n break;\n }\n }\n \n if (!tileset) {\n // If no tileset found, put tile in z=0 layer\n if (!layersByZ.has(0)) {\n layersByZ.set(0, new Array(layerData.length).fill(0));\n }\n layersByZ.get(0)![i] = gid;\n continue;\n }\n \n // Get tile properties from tileset\n const localTileId = gid - tileset.firstgid;\n // @ts-ignore\n const tileProperties = tileset.tileset.tiles?.[localTileId]?.properties;\n const zValue = tileProperties?.z ?? 0;\n \n // Count tiles with explicit z property\n if (tileProperties?.z !== undefined) {\n tilesWithZ++;\n }\n \n // Create or get the layer for this z value\n if (!layersByZ.has(zValue)) {\n layersByZ.set(zValue, new Array(layerData.length).fill(0));\n }\n \n // Place tile in the appropriate z layer\n layersByZ.get(zValue)![i] = gid;\n }\n \n // Create layers for each z value, ensuring z=0 comes first\n const sortedZValues = Array.from(layersByZ.keys()).sort((a, b) => a - b);\n \n for (const zValue of sortedZValues) {\n const layerDataForZ = layersByZ.get(zValue)!;\n \n // Only create layer if it has tiles\n if (layerDataForZ.some(gid => gid !== 0)) {\n const newLayer = {\n ...layer,\n name: `${layer.name}_z${zValue}`, // Always add _z suffix\n data: layerDataForZ,\n properties: {\n ...layer.properties,\n z: zValue\n }\n };\n \n reorganizedLayers.push(newLayer);\n }\n }\n }\n \n // Sort final layers to ensure z=0 layers come first, then by z value\n reorganizedLayers.sort((a, b) => {\n const zA = a.properties?.z ?? 0.5;\n const zB = b.properties?.z ?? 0.5;\n return zA - zB;\n });\n \n return reorganizedLayers;\n}\n\nexport function TiledMap(props) {\n const { map, basePath, createLayersPerTilesZ } = useProps(props)\n const layers = signal<TiledLayer[]>([])\n const objectLayer = props.objectLayer\n let tilesets: TileSet[] = []\n let mapData: TiledMap = {} as TiledMap\n\n const parseTmx = async (file: string, relativePath: string = '') => {\n if (typeof file !== 'string') {\n return file\n }\n // @ts-ignore\n const parser = new TiledParserFile(\n file,\n {\n basePath: '',\n staticDir: '',\n relativePath\n }\n )\n const data = await parser.parseFilePromise({\n getOnlyBasename: false\n })\n\n return data\n }\n\n effect(async () => {\n const _map = map()\n if (_map) {\n mapData = await parseTmx(_map, basePath())\n tilesets = [] // Reset tilesets array\n for (let tileSet of mapData.tilesets) {\n tilesets.push(await new TileSet(tileSet).load(tileSet.image.source))\n }\n \n // Reorganize layers by tile z property if enabled\n let finalLayers = mapData.layers;\n if (createLayersPerTilesZ()) {\n finalLayers = reorganizeLayersByTileZ(mapData.layers, tilesets, mapData);\n }\n \n layers.set(finalLayers)\n }\n })\n\n const createLayer = (layers, props = {}) => {\n return h(Container, props, loop<any>(layers, (layer) => {\n switch (layer.type) {\n case TiledLayerType.Tile:\n return h(CompositeTileLayer, {\n tilewidth: mapData.tilewidth,\n tileheight: mapData.tileheight,\n // @ts-ignore\n width: mapData.width,\n // @ts-ignore\n height: mapData.height,\n ...layer,\n tilesets\n })\n case TiledLayerType.Image:\n const { width, height, source } = layer.image\n return h(TilingSprite, {\n image: source,\n ...layer,\n width: layer.repeatx ? layer.width * layer.tilewidth : width,\n height: layer.repeaty ? layer.height * layer.tileheight : height\n })\n case TiledLayerType.Group:\n return createLayer(signal(layer.layers), layer)\n case TiledLayerType.ObjectGroup:\n const child = objectLayer?.(layer)\n return h(Container, layer, child)\n default:\n return h(Container)\n }\n }))\n }\n\n return h(Container, props, createLayer(layers))\n}","import {\n CompositeTilemap,\n POINT_STRUCT_SIZE,\n Tilemap,\n settings,\n} from \"@pixi/tilemap\";\nimport { Layer, Tile as TileClass } from \"@rpgjs/tiled\";\nimport {\n createComponent,\n registerComponent,\n DisplayObject,\n Signal,\n} from \"canvasengine\";\nimport { Tile } from \"./Tile\";\nimport { TileSet } from \"./TileSet\";\nimport { Subscription } from \"rxjs\";\n\nsettings.use32bitIndex = true;\n\nexport class CanvasTileLayer extends DisplayObject(CompositeTilemap) {\n private _tiles: any = {};\n tiles: (TileClass | null)[];\n private _layer: any; // TODO: fix this, remove any. replace with Layer\n private frameTile: number = 0;\n private frameRateAnimation: number = 10;\n private subscriptionTick: Subscription;\n\n static findTileSet(gid: number, tileSets: TileSet[]) {\n let tileset: TileSet | undefined;\n for (let i = tileSets.length - 1; i >= 0; i--) {\n tileset = tileSets[i];\n if (tileset.firstgid && tileset.firstgid <= gid) {\n break;\n }\n }\n return tileset;\n }\n\n /** @internal */\n createTile(x: number, y: number, options: any = {}): Tile | undefined {\n const { real, filter } = options;\n const { tilewidth, tileheight, width } = this._layer;\n if (real) {\n x = Math.floor(x / tilewidth);\n y = Math.floor(y / tileheight);\n }\n const i = x + y * width;\n const tiledTile = this._layer.getTileByIndex(i);\n\n if (!tiledTile || (tiledTile && tiledTile.gid == 0)) return;\n\n const tileset = CanvasTileLayer.findTileSet(tiledTile.gid, this.tileSets);\n\n if (!tileset) return;\n\n const tile = new Tile(tiledTile, tileset);\n\n tile.x = x * tilewidth;\n tile.y = y * tileheight + (tileheight - tile.texture.height);\n\n tile._x = x;\n tile._y = y;\n\n if (tileset.tileoffset) {\n tile.x += tileset.tileoffset.x ?? 0;\n tile.y += tileset.tileoffset.y ?? 0;\n }\n\n if (filter) {\n const ret = filter(tile);\n if (!ret) return;\n }\n\n return tile;\n }\n\n private _addFrame(tile: Tile, x: number, y: number) {\n const frame = this.tile(tile.texture, tile.x, tile.y, {\n rotate: tile.texture.rotate,\n });\n // const pb = this.pointsBuf\n // if (!pb) return null\n // tile.pointsBufIndex = pb.length - POINT_STRUCT_SIZE\n tile.setAnimation(frame);\n this._tiles[x + \";\" + y] = tile;\n }\n\n async onMount(args) {\n const { props } = args;\n\n this.tileSets = props.tilesets;\n this._layer = new Layer(\n {\n ...props,\n },\n this.tileSets\n );\n\n const tick: Signal = props.context.tick;\n\n this.subscriptionTick = tick.observable.subscribe(({ value }) => {\n if (value.frame % this.frameRateAnimation == 0) {\n this.tileAnim = [this.frameTile, this.frameTile];\n this.frameTile++\n }\n });\n\n super.onMount(args);\n }\n\n onUpdate(props) {\n super.onUpdate(props);\n if (!this.isMounted) return;\n if (props.tileheight) this._layer.tileheight = props.tileheight;\n if (props.tilewidth) this._layer.tilewidth = props.tilewidth;\n if (props.width) this._layer.width = props.width;\n if (props.height) this._layer.height = props.height;\n if (props.parallaxX) this._layer.parallaxX = props.parallaxx;\n if (props.parallaxY) this._layer.parallaxY = props.parallaxy;\n\n this.removeChildren();\n\n for (let y = 0; y < this._layer.height; y++) {\n for (let x = 0; x < this._layer.width; x++) {\n const tile = this.createTile(x, y);\n if (tile) {\n this._addFrame(tile, x, y);\n }\n }\n }\n }\n\n async onDestroy(parent: any) {\n this.subscriptionTick.unsubscribe();\n await super.onDestroy(parent);\n }\n}\n\n// @ts-ignore\nexport interface CanvasTileLayer extends CompositeTilemap {}\n\nregisterComponent(\"CompositeTileLayer\", CanvasTileLayer);\n\nexport function CompositeTileLayer(props) {\n return createComponent(\"CompositeTileLayer\", props);\n}\n","import { CompositeTilemap } from \"@pixi/tilemap\";\nimport { Tile as TiledTileClass } from '@rpgjs/tiled';\nimport { AnimatedSprite, Texture, groupD8 } from \"pixi.js\";\nimport { TileSet } from \"./TileSet\";\n\nexport class Tile extends AnimatedSprite {\n static getTextures(tile: TiledTileClass, tileSet: TileSet) {\n const textures: Texture[] = [];\n\n if (tile.animations && tile.animations.length) {\n tile.animations.forEach(frame => {\n textures.push(tileSet.textures[frame.tileid])\n });\n } else {\n textures.push(tileSet.textures[tile.gid - tileSet.firstgid])\n }\n\n return textures;\n }\n\n animations: { tileid: number, duration: number }[] = []\n _x: number = 0\n _y: number = 0\n pointsBufIndex: number\n properties: any = {}\n\n constructor(\n private tile: TiledTileClass,\n private tileSet: TileSet\n ) {\n super(Tile.getTextures(tile, tileSet));\n this.animations = tile.animations || []\n this.properties = tile.properties\n this.textures = Tile.getTextures(tile, tileSet)\n this.texture = this.textures[0] as Texture\n this.flip()\n }\n\n get z() {\n return this.properties.z ?? 0\n }\n\n get gid() {\n return this.tile.gid\n }\n\n setAnimation(frame: CompositeTilemap) {\n const size = this.animations.length\n if (size > 1) {\n const offset = (this.animations[1].tileid - this.animations[0].tileid) * this.width\n frame.tileAnimX(offset, size)\n }\n }\n\n flip() {\n let symmetry\n let i = 0\n const add = (symmetrySecond) => {\n i++\n if (symmetry) symmetry = groupD8.add(symmetry, symmetrySecond)\n else symmetry = symmetrySecond\n }\n\n if (this.tile.horizontalFlip) {\n add(groupD8.MIRROR_HORIZONTAL)\n }\n\n if (this.tile.verticalFlip) {\n add(groupD8.MIRROR_VERTICAL)\n }\n\n if (this.tile.diagonalFlip) {\n if (i % 2 == 0) {\n add(groupD8.MAIN_DIAGONAL)\n }\n else {\n add(groupD8.REVERSE_DIAGONAL)\n }\n }\n\n //if (symmetry) this.texture.rotate = symmetry\n }\n}","import { TiledTileset, Tileset as TiledTilesetClass } from \"@rpgjs/tiled\";\nimport { Assets, Rectangle, Texture } from \"pixi.js\";\n\nexport class TileSet extends TiledTilesetClass {\n public textures: Texture[] = [];\n private tileGroups = {};\n\n constructor(tileSet: TiledTileset) {\n super(tileSet);\n }\n\n loadGroup() {\n // for (let tile of this.tileset.tiles) {\n // }\n }\n\n /** @internal */\n async load(image: string) {\n const texture = await Assets.load(image);\n for (\n let y = this.margin;\n y < this.image.height;\n y += this.tileheight + this.spacing\n ) {\n for (\n let x = this.margin;\n x < this.image.width;\n x += this.tilewidth + this.spacing\n ) {\n this.textures.push(\n new Texture({\n source: texture.source,\n frame: new Rectangle(+x, +y, +this.tilewidth, +this.tileheight),\n })\n );\n }\n }\n this.loadGroup();\n return this;\n }\n}\n"],"mappings":"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","names":["h","h","useProps","settings","Container","Graphics","h","mount","useProps","child","el","PIXI","Container","Graphics","h","signal","Direction","settings","h","Container","useProps","effect","signal","tick","Assets","Texture","useProps","signal","effect","layers","props","h","Container"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canvasengine/presets",
3
- "version": "2.0.0-beta.16",
3
+ "version": "2.0.0-beta.18",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -8,11 +8,12 @@
8
8
  "author": "",
9
9
  "license": "ISC",
10
10
  "dependencies": {
11
- "pixi.js": "^8.6.4",
12
- "revolt-fx": "^1.3.5",
13
11
  "@pixi/tilemap": "^5.0.1",
14
12
  "@rpgjs/tiled": "^4.3.0",
15
- "canvasengine": "2.0.0-beta.16"
13
+ "pixi.js": "^8.9.2",
14
+ "revolt-fx": "^1.3.5",
15
+ "rxjs": "^7.8.1",
16
+ "canvasengine": "2.0.0-beta.18"
16
17
  },
17
18
  "publishConfig": {
18
19
  "access": "public"
package/src/Bar.ts CHANGED
@@ -8,6 +8,9 @@ interface BarProps {
8
8
  maxValue: number;
9
9
  width: number;
10
10
  height: number;
11
+ border?: any;
12
+ innerMargin?: number;
13
+ borderRadius?: number;
11
14
  }
12
15
 
13
16
  function componentToHex(c) {
@@ -43,22 +46,22 @@ export function Bar(opts: BarProps) {
43
46
  ...opts,
44
47
  width,
45
48
  height,
46
- draw(g: PIXI.Graphics) {
49
+ draw(graphics: any) {
47
50
  if (borderRadius()) {
48
- g.roundRect(0, 0, width(), height(), borderRadius());
51
+ graphics.roundRect(0, 0, width(), height(), borderRadius());
49
52
  } else {
50
- g.rect(0, 0, width(), height());
53
+ graphics.rect(0, 0, width(), height());
51
54
  }
52
55
  if (border) {
53
- g.stroke(border);
56
+ graphics.stroke(border);
54
57
  }
55
- g.fill(backgroundColor());
58
+ graphics.fill(backgroundColor());
56
59
  },
57
60
  },
58
61
  h(Graphics, {
59
62
  width,
60
63
  height,
61
- draw(g: PIXI.Graphics) {
64
+ draw(graphics: any) {
62
65
  const margin = innerMargin();
63
66
  const _borderRadius = borderRadius();
64
67
  const w = Math.max(
@@ -70,16 +73,16 @@ export function Bar(opts: BarProps) {
70
73
  );
71
74
  const h = height() - 2 * margin;
72
75
  if (borderRadius) {
73
- g.roundRect(margin, margin, w, h, _borderRadius);
76
+ graphics.roundRect(margin, margin, w, h, _borderRadius);
74
77
  } else {
75
- g.rect(margin, margin, w, h);
78
+ graphics.rect(margin, margin, w, h);
76
79
  }
77
80
  const color = foregroundColor();
78
81
  if (color.startsWith("rgba")) {
79
82
  const [r, g, b, a] = color.match(/\d+(\.\d+)?/g).map(Number);
80
- g.fill({ color: rgbToHex(r, g, b), alpha: a });
83
+ graphics.fill({ color: rgbToHex(r, g, b), alpha: a });
81
84
  } else {
82
- g.fill(color);
85
+ graphics.fill(color);
83
86
  }
84
87
  },
85
88
  })
package/src/Joystick.ts CHANGED
@@ -85,7 +85,7 @@ export function Joystick(opts: JoystickSettings = {}) {
85
85
  }
86
86
  }
87
87
 
88
- function handleDragStart(event: PIXI.FederatedPointerEvent) {
88
+ function handleDragStart(event: any) {
89
89
  startPosition = event.getLocalPosition(this);
90
90
  dragging = true;
91
91
  innerAlpha.set(1);
@@ -101,7 +101,7 @@ export function Joystick(opts: JoystickSettings = {}) {
101
101
  settings.onEnd?.();
102
102
  }
103
103
 
104
- function handleDragMove(event: PIXI.FederatedPointerEvent) {
104
+ function handleDragMove(event: any) {
105
105
  if (dragging == false) {
106
106
  return;
107
107
  }
@@ -36,6 +36,10 @@ export class Tile extends AnimatedSprite {
36
36
  this.flip()
37
37
  }
38
38
 
39
+ get z() {
40
+ return this.properties.z ?? 0
41
+ }
42
+
39
43
  get gid() {
40
44
  return this.tile.gid
41
45
  }
@@ -1,162 +1,146 @@
1
- import { CompositeTilemap, POINT_STRUCT_SIZE, Tilemap, settings } from '@pixi/tilemap';
2
- import { Layer, Tile as TileClass } from '@rpgjs/tiled';
3
- import { createComponent, registerComponent, DisplayObject } from 'canvasengine';
4
- import { Tile } from './Tile';
5
- import { TileSet } from './TileSet';
6
-
7
- settings.use32bitIndex = true
1
+ import {
2
+ CompositeTilemap,
3
+ POINT_STRUCT_SIZE,
4
+ Tilemap,
5
+ settings,
6
+ } from "@pixi/tilemap";
7
+ import { Layer, Tile as TileClass } from "@rpgjs/tiled";
8
+ import {
9
+ createComponent,
10
+ registerComponent,
11
+ DisplayObject,
12
+ Signal,
13
+ } from "canvasengine";
14
+ import { Tile } from "./Tile";
15
+ import { TileSet } from "./TileSet";
16
+ import { Subscription } from "rxjs";
17
+
18
+ settings.use32bitIndex = true;
8
19
 
9
20
  export class CanvasTileLayer extends DisplayObject(CompositeTilemap) {
10
- private _tiles: any = {}
11
- tiles: (TileClass | null)[]
12
- private _layer: any // TODO: fix this, remove any. replace with Layer
13
-
14
- static findTileSet(gid: number, tileSets: TileSet[]) {
15
- let tileset: TileSet | undefined
16
- for (let i = tileSets.length - 1; i >= 0; i--) {
17
- tileset = tileSets[i]
18
- if (tileset.firstgid && tileset.firstgid <= gid) {
19
- break;
20
- }
21
- }
22
- return tileset;
21
+ private _tiles: any = {};
22
+ tiles: (TileClass | null)[];
23
+ private _layer: any; // TODO: fix this, remove any. replace with Layer
24
+ private frameTile: number = 0;
25
+ private frameRateAnimation: number = 10;
26
+ private subscriptionTick: Subscription;
27
+
28
+ static findTileSet(gid: number, tileSets: TileSet[]) {
29
+ let tileset: TileSet | undefined;
30
+ for (let i = tileSets.length - 1; i >= 0; i--) {
31
+ tileset = tileSets[i];
32
+ if (tileset.firstgid && tileset.firstgid <= gid) {
33
+ break;
34
+ }
23
35
  }
36
+ return tileset;
37
+ }
38
+
39
+ /** @internal */
40
+ createTile(x: number, y: number, options: any = {}): Tile | undefined {
41
+ const { real, filter } = options;
42
+ const { tilewidth, tileheight, width } = this._layer;
43
+ if (real) {
44
+ x = Math.floor(x / tilewidth);
45
+ y = Math.floor(y / tileheight);
46
+ }
47
+ const i = x + y * width;
48
+ const tiledTile = this._layer.getTileByIndex(i);
24
49
 
25
- /** @internal */
26
- createTile(x: number, y: number, options: any = {}): Tile | undefined {
27
- const { real, filter } = options
28
- const { tilewidth, tileheight, width } = this._layer
29
- if (real) {
30
- x = Math.floor(x / tilewidth)
31
- y = Math.floor(y / tileheight)
32
- }
33
- const i = x + y * width;
34
- const tiledTile = this._layer.getTileByIndex(i)
35
-
36
- if (!tiledTile || (tiledTile && tiledTile.gid == 0)) return
37
-
38
- const tileset = CanvasTileLayer.findTileSet(
39
- tiledTile.gid,
40
- this.tileSets
41
- )
50
+ if (!tiledTile || (tiledTile && tiledTile.gid == 0)) return;
42
51
 
43
- if (!tileset) return
52
+ const tileset = CanvasTileLayer.findTileSet(tiledTile.gid, this.tileSets);
44
53
 
45
- const tile = new Tile(
46
- tiledTile,
47
- tileset
48
- )
54
+ if (!tileset) return;
49
55
 
50
- tile.x = x * tilewidth;
51
- tile.y =
52
- y * tileheight +
53
- (tileheight -
54
- tile.texture.height);
56
+ const tile = new Tile(tiledTile, tileset);
55
57
 
56
- tile._x = x;
57
- tile._y = y;
58
+ tile.x = x * tilewidth;
59
+ tile.y = y * tileheight + (tileheight - tile.texture.height);
58
60
 
59
- if (tileset.tileoffset) {
60
- tile.x += tileset.tileoffset.x ?? 0;
61
- tile.y += tileset.tileoffset.y ?? 0;
62
- }
61
+ tile._x = x;
62
+ tile._y = y;
63
63
 
64
- if (filter) {
65
- const ret = filter(tile)
66
- if (!ret) return
67
- }
68
-
69
- return tile
64
+ if (tileset.tileoffset) {
65
+ tile.x += tileset.tileoffset.x ?? 0;
66
+ tile.y += tileset.tileoffset.y ?? 0;
70
67
  }
71
68
 
72
- /** @internal */
73
- changeTile(x: number, y: number) {
74
- const { tilewidth, tileheight } = this._layer
75
- x = Math.floor(x / tilewidth)
76
- y = Math.floor(y / tileheight)
77
- const oldTile: Tile = this._tiles[x + ';' + y]
78
- const newTile = this.createTile(x, y)
79
- if (!oldTile && newTile) {
80
- this._addFrame(newTile, x, y)
81
- }
82
- else {
83
- if (newTile) {
84
- const bufComposite: CompositeTilemap = new CompositeTilemap()
85
- const frame = bufComposite.tile(newTile.texture, newTile.x, newTile.y)
86
- newTile.setAnimation(frame)
87
- this._tiles[x + ';' + y] = newTile
88
- // @ts-ignore
89
- const pointsBufComposite = (bufComposite.children[0] as Tilemap).pointsBuf
90
- // Change Texture (=0, 1 and 7, rotate (=4), animX (=5), animY (=6))
91
- ;[0, 1, 4, 6, 7, 8].forEach((i) => {
92
- if (this.pointsBuf) this.pointsBuf[oldTile.pointsBufIndex + i] = pointsBufComposite[i]
93
- })
94
- // @ts-ignore
95
- this.children[0].modificationMarker = 0
96
- this._addFrame(newTile, x, y)
97
- this['modificationMarker'] = 0
98
- }
99
- else {
100
- delete this._tiles[x + ';' + y]
101
- if (this.pointsBuf) this.pointsBuf.splice(oldTile.pointsBufIndex, POINT_STRUCT_SIZE)
102
- }
103
- }
104
- }
105
-
106
- /** @internal */
107
- get pointsBuf(): number[] | null {
108
- const child = this.children[0] as Tilemap
109
- if (!child) return null
110
- return child['pointsBuf']
111
- }
112
-
113
- private _addFrame(tile: Tile, x: number, y: number) {
114
- const frame = this.tile(tile.texture, tile.x, tile.y, {
115
- rotate: tile.texture.rotate
116
- })
117
- const pb = this.pointsBuf
118
- if (!pb) return null
119
- tile.pointsBufIndex = pb.length - POINT_STRUCT_SIZE
120
- tile.setAnimation(frame)
121
- this._tiles[x + ';' + y] = tile
69
+ if (filter) {
70
+ const ret = filter(tile);
71
+ if (!ret) return;
122
72
  }
123
73
 
124
- onMount(args) {
125
- const { props } = args
126
- this.tileSets = props.tilesets
127
- this._layer = new Layer({
128
- ...props
129
- }, this.tileSets)
130
- super.onMount(args)
131
- }
132
-
133
- onUpdate(props) {
134
- super.onUpdate(props)
135
- if (!this.isMounted) return
136
- if (props.tileheight) this._layer.tileheight = props.tileheight
137
- if (props.tilewidth) this._layer.tilewidth = props.tilewidth
138
- if (props.width) this._layer.width = props.width
139
- if (props.height) this._layer.height = props.height
140
- if (props.parallaxX) this._layer.parallaxX = props.parallaxx
141
- if (props.parallaxY) this._layer.parallaxY = props.parallaxy
142
-
143
- this.removeChildren()
144
-
145
- for (let y = 0; y < this._layer.height; y++) {
146
- for (let x = 0; x < this._layer.width; x++) {
147
- const tile = this.createTile(x, y)
148
- if (tile) {
149
- this._addFrame(tile, x, y)
150
- }
151
- }
74
+ return tile;
75
+ }
76
+
77
+ private _addFrame(tile: Tile, x: number, y: number) {
78
+ const frame = this.tile(tile.texture, tile.x, tile.y, {
79
+ rotate: tile.texture.rotate,
80
+ });
81
+ // const pb = this.pointsBuf
82
+ // if (!pb) return null
83
+ // tile.pointsBufIndex = pb.length - POINT_STRUCT_SIZE
84
+ tile.setAnimation(frame);
85
+ this._tiles[x + ";" + y] = tile;
86
+ }
87
+
88
+ async onMount(args) {
89
+ const { props } = args;
90
+
91
+ this.tileSets = props.tilesets;
92
+ this._layer = new Layer(
93
+ {
94
+ ...props,
95
+ },
96
+ this.tileSets
97
+ );
98
+
99
+ const tick: Signal = props.context.tick;
100
+
101
+ this.subscriptionTick = tick.observable.subscribe(({ value }) => {
102
+ if (value.frame % this.frameRateAnimation == 0) {
103
+ this.tileAnim = [this.frameTile, this.frameTile];
104
+ this.frameTile++
105
+ }
106
+ });
107
+
108
+ super.onMount(args);
109
+ }
110
+
111
+ onUpdate(props) {
112
+ super.onUpdate(props);
113
+ if (!this.isMounted) return;
114
+ if (props.tileheight) this._layer.tileheight = props.tileheight;
115
+ if (props.tilewidth) this._layer.tilewidth = props.tilewidth;
116
+ if (props.width) this._layer.width = props.width;
117
+ if (props.height) this._layer.height = props.height;
118
+ if (props.parallaxX) this._layer.parallaxX = props.parallaxx;
119
+ if (props.parallaxY) this._layer.parallaxY = props.parallaxy;
120
+
121
+ this.removeChildren();
122
+
123
+ for (let y = 0; y < this._layer.height; y++) {
124
+ for (let x = 0; x < this._layer.width; x++) {
125
+ const tile = this.createTile(x, y);
126
+ if (tile) {
127
+ this._addFrame(tile, x, y);
152
128
  }
129
+ }
153
130
  }
131
+ }
132
+
133
+ async onDestroy(parent: any) {
134
+ this.subscriptionTick.unsubscribe();
135
+ await super.onDestroy(parent);
136
+ }
154
137
  }
155
138
 
156
- export interface CanvasTileLayer extends CompositeTilemap { }
139
+ // @ts-ignore
140
+ export interface CanvasTileLayer extends CompositeTilemap {}
157
141
 
158
- registerComponent('CompositeTileLayer', CanvasTileLayer)
142
+ registerComponent("CompositeTileLayer", CanvasTileLayer);
159
143
 
160
144
  export function CompositeTileLayer(props) {
161
- return createComponent('CompositeTileLayer', props)
162
- }
145
+ return createComponent("CompositeTileLayer", props);
146
+ }
@@ -3,12 +3,141 @@ import { loop, h, Container, TilingSprite, useProps, effect, signal } from "canv
3
3
  import { CompositeTileLayer } from "./TileLayer"
4
4
  import { TileSet } from "./TileSet"
5
5
 
6
+ /**
7
+ * Reorganizes tile layers based on the z property of tiles
8
+ *
9
+ * This function analyzes each tile in the layer data and groups them by their z property.
10
+ * If a tile has a z property different from 0, it creates new layers for each z value.
11
+ *
12
+ * @param {TiledLayer[]} originalLayers - The original layers from the tilemap
13
+ * @param {TileSet[]} tilesets - Array of loaded tilesets
14
+ * @param {TiledMap} mapData - The complete map data
15
+ * @returns {TiledLayer[]} - Reorganized layers with tiles grouped by z property
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const reorganizedLayers = reorganizeLayersByTileZ(mapData.layers, tilesets, mapData);
20
+ * ```
21
+ */
22
+ function reorganizeLayersByTileZ(originalLayers: TiledLayer[], tilesets: TileSet[], mapData: TiledMap): TiledLayer[] {
23
+ const reorganizedLayers: TiledLayer[] = [];
24
+
25
+ for (const layer of originalLayers) {
26
+ if (layer.type !== TiledLayerType.Tile) {
27
+ // Keep non-tile layers as they are
28
+ reorganizedLayers.push(layer);
29
+ continue;
30
+ }
31
+
32
+ // Group tiles by their z property
33
+ const layersByZ = new Map<number, number[]>();
34
+
35
+ // Initialize empty arrays for all z values we'll find
36
+ // Don't pre-populate with original data anymore
37
+
38
+ // Ensure layer data is number array
39
+ let layerData: number[];
40
+ if (Array.isArray(layer.data)) {
41
+ layerData = layer.data.map(gid => {
42
+ if (typeof gid === 'number') {
43
+ return gid;
44
+ } else {
45
+ return parseInt(String(gid), 10);
46
+ }
47
+ });
48
+ } else {
49
+ // If data is a string, it might be compressed - for now, skip this layer
50
+ reorganizedLayers.push(layer);
51
+ continue;
52
+ }
53
+
54
+ let tilesProcessed = 0;
55
+ let tilesWithZ = 0;
56
+
57
+ // Analyze each tile in the layer
58
+ for (let i = 0; i < layerData.length; i++) {
59
+ const gid = layerData[i];
60
+
61
+ if (gid === 0) continue; // Empty tile
62
+
63
+ tilesProcessed++;
64
+
65
+ // Find the corresponding tileset
66
+ let tileset: TileSet | undefined;
67
+ for (let j = tilesets.length - 1; j >= 0; j--) {
68
+ if (tilesets[j].firstgid && tilesets[j].firstgid <= gid) {
69
+ tileset = tilesets[j];
70
+ break;
71
+ }
72
+ }
73
+
74
+ if (!tileset) {
75
+ // If no tileset found, put tile in z=0 layer
76
+ if (!layersByZ.has(0)) {
77
+ layersByZ.set(0, new Array(layerData.length).fill(0));
78
+ }
79
+ layersByZ.get(0)![i] = gid;
80
+ continue;
81
+ }
82
+
83
+ // Get tile properties from tileset
84
+ const localTileId = gid - tileset.firstgid;
85
+ // @ts-ignore
86
+ const tileProperties = tileset.tileset.tiles?.[localTileId]?.properties;
87
+ const zValue = tileProperties?.z ?? 0;
88
+
89
+ // Count tiles with explicit z property
90
+ if (tileProperties?.z !== undefined) {
91
+ tilesWithZ++;
92
+ }
93
+
94
+ // Create or get the layer for this z value
95
+ if (!layersByZ.has(zValue)) {
96
+ layersByZ.set(zValue, new Array(layerData.length).fill(0));
97
+ }
98
+
99
+ // Place tile in the appropriate z layer
100
+ layersByZ.get(zValue)![i] = gid;
101
+ }
102
+
103
+ // Create layers for each z value, ensuring z=0 comes first
104
+ const sortedZValues = Array.from(layersByZ.keys()).sort((a, b) => a - b);
105
+
106
+ for (const zValue of sortedZValues) {
107
+ const layerDataForZ = layersByZ.get(zValue)!;
108
+
109
+ // Only create layer if it has tiles
110
+ if (layerDataForZ.some(gid => gid !== 0)) {
111
+ const newLayer = {
112
+ ...layer,
113
+ name: `${layer.name}_z${zValue}`, // Always add _z suffix
114
+ data: layerDataForZ,
115
+ properties: {
116
+ ...layer.properties,
117
+ z: zValue
118
+ }
119
+ };
120
+
121
+ reorganizedLayers.push(newLayer);
122
+ }
123
+ }
124
+ }
125
+
126
+ // Sort final layers to ensure z=0 layers come first, then by z value
127
+ reorganizedLayers.sort((a, b) => {
128
+ const zA = a.properties?.z ?? 0.5;
129
+ const zB = b.properties?.z ?? 0.5;
130
+ return zA - zB;
131
+ });
132
+
133
+ return reorganizedLayers;
134
+ }
135
+
6
136
  export function TiledMap(props) {
7
- const { map, basePath } = useProps(props)
137
+ const { map, basePath, createLayersPerTilesZ } = useProps(props)
8
138
  const layers = signal<TiledLayer[]>([])
9
139
  const objectLayer = props.objectLayer
10
- const child = props.children[0]
11
- let tilesets: TiledTileset[] = []
140
+ let tilesets: TileSet[] = []
12
141
  let mapData: TiledMap = {} as TiledMap
13
142
 
14
143
  const parseTmx = async (file: string, relativePath: string = '') => {
@@ -35,10 +164,18 @@ export function TiledMap(props) {
35
164
  const _map = map()
36
165
  if (_map) {
37
166
  mapData = await parseTmx(_map, basePath())
167
+ tilesets = [] // Reset tilesets array
38
168
  for (let tileSet of mapData.tilesets) {
39
169
  tilesets.push(await new TileSet(tileSet).load(tileSet.image.source))
40
170
  }
41
- layers.set(mapData.layers)
171
+
172
+ // Reorganize layers by tile z property if enabled
173
+ let finalLayers = mapData.layers;
174
+ if (createLayersPerTilesZ()) {
175
+ finalLayers = reorganizeLayersByTileZ(mapData.layers, tilesets, mapData);
176
+ }
177
+
178
+ layers.set(finalLayers)
42
179
  }
43
180
  })
44
181
 
package/src/index.ts CHANGED
@@ -2,5 +2,4 @@ export * from './Bar'
2
2
  export * from './Particle'
3
3
  export * from './NightAmbiant'
4
4
  export * from './Joystick'
5
- export * from './Tilemap'
6
- export * from './DrawMap'
5
+ export * from './Tilemap'
@@ -1,60 +0,0 @@
1
- import { effect, signal, loop, h, Container, Sprite, useProps } from "canvasengine";
2
-
3
- interface TileData {
4
- id: number;
5
- rect: [number, number, number, number];
6
- drawIn: [number, number];
7
- layerIndex: number;
8
- }
9
-
10
- export function ImageMap(props) {
11
- const { imageSource, tileData } = useProps(props);
12
- const tiles = signal<TileData[]>([]);
13
-
14
- effect(async () => {
15
- const data = await fetch(tileData()).then((response) => response.json());
16
- const objects = data;
17
- if (props.objects) {
18
- objects.push(...props.objects(data));
19
- }
20
- tiles.set(objects);
21
- });
22
-
23
- const createLayeredTiles = () => {
24
- const layers = [createTileLayer(0), createTileLayer(1, true), createTileLayer(2)];
25
-
26
- return h(Container, props, ...layers);
27
- };
28
-
29
- const createTileLayer = (layerIndex: number, sortableChildren = false) => {
30
- return h(
31
- Container,
32
- {
33
- sortableChildren,
34
- },
35
- // TODO: fix this (remove any)
36
- loop(tiles, (object: any) => {
37
- if (object.tag && layerIndex == 1) {
38
- return object
39
- }
40
-
41
- object.layerIndex ||= 1;
42
- if (object.layerIndex !== layerIndex) return null;
43
-
44
- const [x, y, width, height] = object.rect;
45
- const [drawX, drawY] = object.drawIn;
46
-
47
- return h(Sprite, {
48
- image: imageSource(),
49
- x: drawX,
50
- y: drawY,
51
- rectangle: { x, y, width, height },
52
- zIndex: drawY + height - 70,
53
- // zIndex: 0
54
- });
55
- })
56
- );
57
- };
58
-
59
- return createLayeredTiles();
60
- }