@canvasengine/presets 2.0.0-beta.19 → 2.0.0-beta.20

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
@@ -52,4 +52,61 @@ declare function Joystick(opts?: JoystickSettings): canvasengine.Element<canvase
52
52
 
53
53
  declare function TiledMap(props: any): canvasengine.Element<canvasengine.ComponentInstance> | Promise<canvasengine.Element<canvasengine.ComponentInstance>>;
54
54
 
55
- export { Bar, Direction, Joystick, type JoystickChangeEvent, type JoystickSettings, LightSpot, NightAmbiant, Particle, TiledMap };
55
+ /**
56
+ * Weather Effect Component
57
+ *
58
+ * Creates a realistic rain effect using WebGL shaders with customizable parameters.
59
+ * The effect simulates raindrops falling with wind influence, density control, and speed adjustment.
60
+ *
61
+ * ## Design
62
+ *
63
+ * The component uses a fragment shader to generate procedural rain drops with:
64
+ * - **Procedural generation**: Each raindrop is generated using hash functions for randomness
65
+ * - **Wind simulation**: Raindrops are affected by wind direction and strength as they fall
66
+ * - **Density control**: Number of visible raindrops can be adjusted
67
+ * - **Speed variation**: Each drop has slightly different falling speed for realism
68
+ * - **Visual styling**: Zelda-inspired rain appearance with proper fade effects
69
+ *
70
+ * @param {Object} options - Configuration options for the weather effect
71
+ * @param {number} [options.speed=0.5] - Rain falling speed (0.1 = slow, 2.0 = fast)
72
+ * @param {number} [options.windDirection=0.0] - Wind direction (-1.0 = left, 1.0 = right)
73
+ * @param {number} [options.windStrength=0.2] - Wind strength (0.0 = no wind, 1.0 = strong)
74
+ * @param {number} [options.density=180.0] - Rain density (number of raindrops, 50-400)
75
+ * @param {Array<number>} [options.resolution=[1000, 1000]] - Screen resolution for proper scaling
76
+ *
77
+ * @example
78
+ * ```jsx
79
+ * // Basic usage with default settings
80
+ * <Weather />
81
+ *
82
+ * // Customized heavy rain with strong wind
83
+ * <Weather
84
+ * speed={1.5}
85
+ * windDirection={0.8}
86
+ * windStrength={0.6}
87
+ * density={300}
88
+ * />
89
+ *
90
+ * // Light drizzle
91
+ * <Weather
92
+ * speed={0.2}
93
+ * density={80}
94
+ * windStrength={0.1}
95
+ * />
96
+ *
97
+ * // Using signals for dynamic control
98
+ * const rainSpeed = signal(0.5);
99
+ * const windDir = signal(0.0);
100
+ *
101
+ * <Weather
102
+ * speed={rainSpeed}
103
+ * windDirection={windDir}
104
+ * />
105
+ * ```
106
+ *
107
+ * @returns {JSX.Element} A mesh component with the weather shader effect
108
+ */
109
+ declare const WeatherEffect: (options: any) => canvasengine.Element<canvasengine.ComponentInstance> | Promise<canvasengine.Element<canvasengine.ComponentInstance>>;
110
+ declare const Weather: (options: any) => canvasengine.Element<canvasengine.ComponentInstance> | Promise<canvasengine.Element<canvasengine.ComponentInstance>>;
111
+
112
+ export { Bar, Direction, Joystick, type JoystickChangeEvent, type JoystickSettings, LightSpot, NightAmbiant, Particle, TiledMap, Weather, WeatherEffect };
package/dist/index.js CHANGED
@@ -55,11 +55,11 @@ function Bar(opts) {
55
55
  value() / maxValue() * (width() - 2 * margin)
56
56
  )
57
57
  );
58
- const h6 = height() - 2 * margin;
58
+ const h7 = height() - 2 * margin;
59
59
  if (borderRadius) {
60
- graphics.roundRect(margin, margin, w, h6, _borderRadius);
60
+ graphics.roundRect(margin, margin, w, h7, _borderRadius);
61
61
  } else {
62
- graphics.rect(margin, margin, w, h6);
62
+ graphics.rect(margin, margin, w, h7);
63
63
  }
64
64
  const color = foregroundColor();
65
65
  if (color.startsWith("rgba")) {
@@ -183,10 +183,10 @@ function NightAmbiant(props) {
183
183
  effect(() => {
184
184
  const { displayWidth, displayHeight } = el2.componentInstance;
185
185
  const w = +displayWidth();
186
- const h6 = +displayHeight();
186
+ const h7 = +displayHeight();
187
187
  setTimeout(() => {
188
188
  width.update(() => w);
189
- height.update(() => h6);
189
+ height.update(() => h7);
190
190
  }, 0);
191
191
  });
192
192
  });
@@ -564,8 +564,8 @@ var CanvasTileLayer = class _CanvasTileLayer extends DisplayObject(CompositeTile
564
564
  },
565
565
  this.tileSets
566
566
  );
567
- const tick2 = props.context.tick;
568
- this.subscriptionTick = tick2.observable.subscribe(({ value }) => {
567
+ const tick3 = props.context.tick;
568
+ this.subscriptionTick = tick3.observable.subscribe(({ value }) => {
569
569
  if (value.frame % this.frameRateAnimation == 0) {
570
570
  this.tileAnim = [this.frameTile, this.frameTile];
571
571
  this.frameTile++;
@@ -710,7 +710,10 @@ function reorganizeLayersByTileZ(originalLayers, tilesets, mapData) {
710
710
  return reorganizedLayers;
711
711
  }
712
712
  function TiledMap(props) {
713
- const { map, basePath, createLayersPerTilesZ } = useProps4(props);
713
+ const { map, basePath, createLayersPerTilesZ } = useProps4(props, {
714
+ createLayersPerTilesZ: false,
715
+ basePath: ""
716
+ });
714
717
  const layers = signal3([]);
715
718
  const objectLayer = props.objectLayer;
716
719
  let tilesets = [];
@@ -738,6 +741,7 @@ function TiledMap(props) {
738
741
  mapData = await parseTmx(_map, basePath());
739
742
  tilesets = [];
740
743
  for (let tileSet of mapData.tilesets) {
744
+ if (tileSet.tile) tileSet.tiles = tileSet.tile;
741
745
  tilesets.push(await new TileSet(tileSet).load(tileSet.image.source));
742
746
  }
743
747
  let finalLayers = mapData.layers;
@@ -781,6 +785,162 @@ function TiledMap(props) {
781
785
  };
782
786
  return h5(Container4, props, createLayer(layers));
783
787
  }
788
+
789
+ // src/Weathers/index.ts
790
+ import {
791
+ tick as tick2,
792
+ useProps as useProps5,
793
+ h as h6,
794
+ Mesh,
795
+ signal as signal4
796
+ } from "canvasengine";
797
+ import { Geometry, Shader, GlProgram, UniformGroup } from "pixi.js";
798
+ var WeatherEffect = (options) => {
799
+ const {
800
+ speed = signal4(0.5),
801
+ windDirection = signal4(0),
802
+ windStrength = signal4(0.2),
803
+ density = signal4(180),
804
+ resolution = signal4([1e3, 1e3])
805
+ } = useProps5(options);
806
+ const speedSignal = typeof speed === "function" ? speed : signal4(speed);
807
+ const windDirectionSignal = typeof windDirection === "function" ? windDirection : signal4(windDirection);
808
+ const windStrengthSignal = typeof windStrength === "function" ? windStrength : signal4(windStrength);
809
+ const densitySignal = typeof density === "function" ? density : signal4(density);
810
+ const resolutionSignal = typeof resolution === "function" ? resolution : signal4(resolution);
811
+ const vertexSrc = (
812
+ /* glsl */
813
+ `
814
+ precision mediump float;
815
+ attribute vec2 aPosition;
816
+ attribute vec2 aUV;
817
+ varying vec2 vUV;
818
+ void main() {
819
+ vUV = aUV;
820
+ gl_Position = vec4(aPosition, 0.0, 1.0);
821
+ }
822
+ `
823
+ );
824
+ const fragmentSrc = (
825
+ /* glsl */
826
+ `
827
+ precision mediump float;
828
+ varying vec2 vUV;
829
+ uniform float uTime;
830
+ uniform vec2 uResolution;
831
+ uniform float uRainSpeed;
832
+ uniform float uWindDirection;
833
+ uniform float uWindStrength;
834
+ uniform float uRainDensity;
835
+
836
+ // Hash function for pseudo-random number generation
837
+ float hash(float n){ return fract(sin(n)*43758.5453); }
838
+
839
+ // Generate a single raindrop at given UV coordinates
840
+ float rainDrop(vec2 uv, float t, float seed) {
841
+ // Random X position with wider coverage for screen edges
842
+ float x = hash(seed) * 2.4 - 1.2;
843
+
844
+ // Falling speed with variation per drop
845
+ float baseSpeed = 1.0 + hash(seed + 1.0) * 1.5;
846
+ float speed = baseSpeed * uRainSpeed;
847
+
848
+ // Y position falling from top (1.0) to bottom (-1.0)
849
+ float y = 1.2 - fract(t * speed + hash(seed + 2.0)) * 2.4;
850
+
851
+ // Wind effect: more drift as drop falls further
852
+ float fallProgress = (1.2 - y) / 2.4; // 0 = top, 1 = bottom
853
+ float windOffset = uWindDirection * uWindStrength * fallProgress * 0.5;
854
+ x += windOffset;
855
+
856
+ vec2 dropPos = vec2(x, y);
857
+ vec2 diff = uv - dropPos;
858
+
859
+ // Raindrop shape (thin streaks)
860
+ float dropWidth = 0.0015 + hash(seed + 3.0) * 0.0005;
861
+ float dropLength = 0.025 + hash(seed + 4.0) * 0.015;
862
+
863
+ // Slight tilt based on wind
864
+ float windAngle = uWindDirection * uWindStrength * 0.2;
865
+ float cosA = cos(windAngle);
866
+ float sinA = sin(windAngle);
867
+ vec2 rotatedDiff = vec2(
868
+ diff.x * cosA - diff.y * sinA,
869
+ diff.x * sinA + diff.y * cosA
870
+ );
871
+
872
+ // Distance calculation for thin streaks
873
+ float distX = abs(rotatedDiff.x) / dropWidth;
874
+ float distY = abs(rotatedDiff.y) / dropLength;
875
+ float dist = max(distX, distY * 0.4);
876
+
877
+ // Intensity with fade and variation (Zelda-style)
878
+ float intensity = 1.0 - smoothstep(0.0, 1.2, dist);
879
+ intensity *= 0.7 + 0.3 * hash(seed + 5.0);
880
+
881
+ // Natural fade at top and bottom edges
882
+ intensity *= smoothstep(-1.2, -0.8, y) * smoothstep(1.2, 0.8, y);
883
+
884
+ return intensity;
885
+ }
886
+
887
+ void main(){
888
+ // Normalized UV coordinates centered on screen
889
+ vec2 uv = (gl_FragCoord.xy - 0.5 * uResolution.xy) / min(uResolution.x, uResolution.y);
890
+
891
+ float rain = 0.0;
892
+
893
+ // Generate multiple raindrops
894
+ for(float i = 0.0; i < 200.0; i++) {
895
+ rain += rainDrop(uv, uTime, i * 12.34);
896
+ }
897
+
898
+ // Adjust intensity based on density setting
899
+ rain *= (uRainDensity / 200.0);
900
+
901
+ // Zelda-style rain color (bright and visible)
902
+ vec3 rainColor = vec3(0.85, 0.9, 1.0);
903
+
904
+ gl_FragColor = vec4(rainColor * rain, rain * 0.8);
905
+ }
906
+ `
907
+ );
908
+ const glProgram = new GlProgram({ vertex: vertexSrc, fragment: fragmentSrc });
909
+ const uniformGroup = new UniformGroup({
910
+ uTime: { value: 0, type: "f32" },
911
+ uResolution: { value: resolutionSignal(), type: "vec2<f32>" },
912
+ uRainSpeed: { value: speedSignal(), type: "f32" },
913
+ uWindDirection: { value: windDirectionSignal(), type: "f32" },
914
+ uWindStrength: { value: windStrengthSignal(), type: "f32" },
915
+ uRainDensity: { value: densitySignal(), type: "f32" }
916
+ });
917
+ const shader = new Shader({
918
+ glProgram,
919
+ resources: {
920
+ uniforms: uniformGroup
921
+ }
922
+ });
923
+ const geometry = new Geometry({
924
+ attributes: {
925
+ aPosition: [-1, -1, 1, -1, 1, 1, -1, 1],
926
+ aUV: [0, 0, 1, 0, 1, 1, 0, 1]
927
+ },
928
+ indexBuffer: [0, 1, 2, 0, 2, 3]
929
+ });
930
+ tick2(({ deltaTime }) => {
931
+ uniformGroup.uniforms.uTime += deltaTime;
932
+ uniformGroup.uniforms.uRainSpeed = speedSignal();
933
+ uniformGroup.uniforms.uWindDirection = windDirectionSignal();
934
+ uniformGroup.uniforms.uWindStrength = windStrengthSignal();
935
+ uniformGroup.uniforms.uRainDensity = densitySignal();
936
+ uniformGroup.uniforms.uResolution = resolutionSignal();
937
+ });
938
+ return h6(Mesh, {
939
+ geometry,
940
+ shader
941
+ });
942
+ };
943
+ var Weather = WeatherEffect;
784
944
  export {
785
945
  Bar,
786
946
  Direction,
@@ -788,6 +948,8 @@ export {
788
948
  LightSpot,
789
949
  NightAmbiant,
790
950
  Particle,
791
- TiledMap
951
+ TiledMap,
952
+ Weather,
953
+ WeatherEffect
792
954
  };
793
955
  //# sourceMappingURL=index.js.map
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"],"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 \"@canvasengine/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"]}
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/Weathers/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 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 createLayersPerTilesZ: false,\n basePath: ''\n })\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 // @ts-ignore\n if (tileSet.tile) tileSet.tiles = tileSet.tile\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 \"@canvasengine/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","import {\n tick,\n useProps,\n h,\n Mesh,\n signal,\n} from \"canvasengine\";\nimport { Geometry, Shader, GlProgram, UniformGroup } from \"pixi.js\";\n\n/**\n * Weather Effect Component\n * \n * Creates a realistic rain effect using WebGL shaders with customizable parameters.\n * The effect simulates raindrops falling with wind influence, density control, and speed adjustment.\n * \n * ## Design\n * \n * The component uses a fragment shader to generate procedural rain drops with:\n * - **Procedural generation**: Each raindrop is generated using hash functions for randomness\n * - **Wind simulation**: Raindrops are affected by wind direction and strength as they fall\n * - **Density control**: Number of visible raindrops can be adjusted\n * - **Speed variation**: Each drop has slightly different falling speed for realism\n * - **Visual styling**: Zelda-inspired rain appearance with proper fade effects\n * \n * @param {Object} options - Configuration options for the weather effect\n * @param {number} [options.speed=0.5] - Rain falling speed (0.1 = slow, 2.0 = fast)\n * @param {number} [options.windDirection=0.0] - Wind direction (-1.0 = left, 1.0 = right)\n * @param {number} [options.windStrength=0.2] - Wind strength (0.0 = no wind, 1.0 = strong)\n * @param {number} [options.density=180.0] - Rain density (number of raindrops, 50-400)\n * @param {Array<number>} [options.resolution=[1000, 1000]] - Screen resolution for proper scaling\n * \n * @example\n * ```jsx\n * // Basic usage with default settings\n * <Weather />\n * \n * // Customized heavy rain with strong wind\n * <Weather \n * speed={1.5}\n * windDirection={0.8}\n * windStrength={0.6}\n * density={300}\n * />\n * \n * // Light drizzle\n * <Weather \n * speed={0.2}\n * density={80}\n * windStrength={0.1}\n * />\n * \n * // Using signals for dynamic control\n * const rainSpeed = signal(0.5);\n * const windDir = signal(0.0);\n * \n * <Weather \n * speed={rainSpeed}\n * windDirection={windDir}\n * />\n * ```\n * \n * @returns {JSX.Element} A mesh component with the weather shader effect\n */\nexport const WeatherEffect = (options) => {\n const { \n speed = signal(0.5),\n windDirection = signal(0.0),\n windStrength = signal(0.2),\n density = signal(180.0),\n resolution = signal([1000, 1000])\n } = useProps(options);\n\n // Convert to signals if not already\n const speedSignal = typeof speed === 'function' ? speed : signal(speed);\n const windDirectionSignal = typeof windDirection === 'function' ? windDirection : signal(windDirection);\n const windStrengthSignal = typeof windStrength === 'function' ? windStrength : signal(windStrength);\n const densitySignal = typeof density === 'function' ? density : signal(density);\n const resolutionSignal = typeof resolution === 'function' ? resolution : signal(resolution);\n\n // Vertex shader - handles vertex positioning and UV mapping\n const vertexSrc = /* glsl */ `\n precision mediump float;\n attribute vec2 aPosition;\n attribute vec2 aUV;\n varying vec2 vUV;\n void main() {\n vUV = aUV;\n gl_Position = vec4(aPosition, 0.0, 1.0);\n }\n `;\n\n // Fragment shader - generates the rain effect\n const fragmentSrc = /* glsl */ `\n precision mediump float;\n varying vec2 vUV;\n uniform float uTime;\n uniform vec2 uResolution;\n uniform float uRainSpeed;\n uniform float uWindDirection;\n uniform float uWindStrength;\n uniform float uRainDensity;\n \n // Hash function for pseudo-random number generation\n float hash(float n){ return fract(sin(n)*43758.5453); }\n \n // Generate a single raindrop at given UV coordinates\n float rainDrop(vec2 uv, float t, float seed) {\n // Random X position with wider coverage for screen edges\n float x = hash(seed) * 2.4 - 1.2;\n \n // Falling speed with variation per drop\n float baseSpeed = 1.0 + hash(seed + 1.0) * 1.5;\n float speed = baseSpeed * uRainSpeed;\n \n // Y position falling from top (1.0) to bottom (-1.0)\n float y = 1.2 - fract(t * speed + hash(seed + 2.0)) * 2.4;\n \n // Wind effect: more drift as drop falls further\n float fallProgress = (1.2 - y) / 2.4; // 0 = top, 1 = bottom\n float windOffset = uWindDirection * uWindStrength * fallProgress * 0.5;\n x += windOffset;\n \n vec2 dropPos = vec2(x, y);\n vec2 diff = uv - dropPos;\n \n // Raindrop shape (thin streaks)\n float dropWidth = 0.0015 + hash(seed + 3.0) * 0.0005;\n float dropLength = 0.025 + hash(seed + 4.0) * 0.015;\n \n // Slight tilt based on wind\n float windAngle = uWindDirection * uWindStrength * 0.2;\n float cosA = cos(windAngle);\n float sinA = sin(windAngle);\n vec2 rotatedDiff = vec2(\n diff.x * cosA - diff.y * sinA,\n diff.x * sinA + diff.y * cosA\n );\n \n // Distance calculation for thin streaks\n float distX = abs(rotatedDiff.x) / dropWidth;\n float distY = abs(rotatedDiff.y) / dropLength;\n float dist = max(distX, distY * 0.4);\n \n // Intensity with fade and variation (Zelda-style)\n float intensity = 1.0 - smoothstep(0.0, 1.2, dist);\n intensity *= 0.7 + 0.3 * hash(seed + 5.0);\n \n // Natural fade at top and bottom edges\n intensity *= smoothstep(-1.2, -0.8, y) * smoothstep(1.2, 0.8, y);\n \n return intensity;\n }\n \n void main(){\n // Normalized UV coordinates centered on screen\n vec2 uv = (gl_FragCoord.xy - 0.5 * uResolution.xy) / min(uResolution.x, uResolution.y);\n \n float rain = 0.0;\n \n // Generate multiple raindrops\n for(float i = 0.0; i < 200.0; i++) {\n rain += rainDrop(uv, uTime, i * 12.34);\n }\n \n // Adjust intensity based on density setting\n rain *= (uRainDensity / 200.0);\n \n // Zelda-style rain color (bright and visible)\n vec3 rainColor = vec3(0.85, 0.9, 1.0);\n \n gl_FragColor = vec4(rainColor * rain, rain * 0.8);\n }\n `;\n\n // Create WebGL program\n const glProgram = new GlProgram({ vertex: vertexSrc, fragment: fragmentSrc });\n\n // Uniform group for shader parameters\n const uniformGroup = new UniformGroup({\n uTime: { value: 0, type: \"f32\" },\n uResolution: { value: resolutionSignal(), type: \"vec2<f32>\" },\n uRainSpeed: { value: speedSignal(), type: \"f32\" },\n uWindDirection: { value: windDirectionSignal(), type: \"f32\" },\n uWindStrength: { value: windStrengthSignal(), type: \"f32\" },\n uRainDensity: { value: densitySignal(), type: \"f32\" },\n });\n\n // Create shader with program and resources\n const shader = new Shader({\n glProgram,\n resources: {\n uniforms: uniformGroup,\n },\n });\n\n // Full-screen quad geometry\n const geometry = new Geometry({\n attributes: {\n aPosition: [-1, -1, 1, -1, 1, 1, -1, 1],\n aUV: [0, 0, 1, 0, 1, 1, 0, 1],\n },\n indexBuffer: [0, 1, 2, 0, 2, 3],\n });\n\n // Animation loop - update time and reactive uniforms\n tick(({ deltaTime }) => {\n uniformGroup.uniforms.uTime += deltaTime;\n \n // Update uniforms from signals\n uniformGroup.uniforms.uRainSpeed = speedSignal();\n uniformGroup.uniforms.uWindDirection = windDirectionSignal();\n uniformGroup.uniforms.uWindStrength = windStrengthSignal();\n uniformGroup.uniforms.uRainDensity = densitySignal();\n uniformGroup.uniforms.uResolution = resolutionSignal();\n });\n\n return h(Mesh, {\n geometry,\n shader,\n });\n};\n\n// Export as Weather for easier usage\nexport const Weather = WeatherEffect;\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","tick","useProps","h","signal"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canvasengine/presets",
3
- "version": "2.0.0-beta.19",
3
+ "version": "2.0.0-beta.20",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -13,7 +13,7 @@
13
13
  "pixi.js": "^8.9.2",
14
14
  "revolt-fx": "^1.3.5",
15
15
  "rxjs": "^7.8.1",
16
- "canvasengine": "2.0.0-beta.19"
16
+ "canvasengine": "2.0.0-beta.20"
17
17
  },
18
18
  "publishConfig": {
19
19
  "access": "public"
@@ -134,7 +134,10 @@ function reorganizeLayersByTileZ(originalLayers: TiledLayer[], tilesets: TileSet
134
134
  }
135
135
 
136
136
  export function TiledMap(props) {
137
- const { map, basePath, createLayersPerTilesZ } = useProps(props)
137
+ const { map, basePath, createLayersPerTilesZ } = useProps(props, {
138
+ createLayersPerTilesZ: false,
139
+ basePath: ''
140
+ })
138
141
  const layers = signal<TiledLayer[]>([])
139
142
  const objectLayer = props.objectLayer
140
143
  let tilesets: TileSet[] = []
@@ -166,6 +169,8 @@ export function TiledMap(props) {
166
169
  mapData = await parseTmx(_map, basePath())
167
170
  tilesets = [] // Reset tilesets array
168
171
  for (let tileSet of mapData.tilesets) {
172
+ // @ts-ignore
173
+ if (tileSet.tile) tileSet.tiles = tileSet.tile
169
174
  tilesets.push(await new TileSet(tileSet).load(tileSet.image.source))
170
175
  }
171
176
 
@@ -0,0 +1,224 @@
1
+ import {
2
+ tick,
3
+ useProps,
4
+ h,
5
+ Mesh,
6
+ signal,
7
+ } from "canvasengine";
8
+ import { Geometry, Shader, GlProgram, UniformGroup } from "pixi.js";
9
+
10
+ /**
11
+ * Weather Effect Component
12
+ *
13
+ * Creates a realistic rain effect using WebGL shaders with customizable parameters.
14
+ * The effect simulates raindrops falling with wind influence, density control, and speed adjustment.
15
+ *
16
+ * ## Design
17
+ *
18
+ * The component uses a fragment shader to generate procedural rain drops with:
19
+ * - **Procedural generation**: Each raindrop is generated using hash functions for randomness
20
+ * - **Wind simulation**: Raindrops are affected by wind direction and strength as they fall
21
+ * - **Density control**: Number of visible raindrops can be adjusted
22
+ * - **Speed variation**: Each drop has slightly different falling speed for realism
23
+ * - **Visual styling**: Zelda-inspired rain appearance with proper fade effects
24
+ *
25
+ * @param {Object} options - Configuration options for the weather effect
26
+ * @param {number} [options.speed=0.5] - Rain falling speed (0.1 = slow, 2.0 = fast)
27
+ * @param {number} [options.windDirection=0.0] - Wind direction (-1.0 = left, 1.0 = right)
28
+ * @param {number} [options.windStrength=0.2] - Wind strength (0.0 = no wind, 1.0 = strong)
29
+ * @param {number} [options.density=180.0] - Rain density (number of raindrops, 50-400)
30
+ * @param {Array<number>} [options.resolution=[1000, 1000]] - Screen resolution for proper scaling
31
+ *
32
+ * @example
33
+ * ```jsx
34
+ * // Basic usage with default settings
35
+ * <Weather />
36
+ *
37
+ * // Customized heavy rain with strong wind
38
+ * <Weather
39
+ * speed={1.5}
40
+ * windDirection={0.8}
41
+ * windStrength={0.6}
42
+ * density={300}
43
+ * />
44
+ *
45
+ * // Light drizzle
46
+ * <Weather
47
+ * speed={0.2}
48
+ * density={80}
49
+ * windStrength={0.1}
50
+ * />
51
+ *
52
+ * // Using signals for dynamic control
53
+ * const rainSpeed = signal(0.5);
54
+ * const windDir = signal(0.0);
55
+ *
56
+ * <Weather
57
+ * speed={rainSpeed}
58
+ * windDirection={windDir}
59
+ * />
60
+ * ```
61
+ *
62
+ * @returns {JSX.Element} A mesh component with the weather shader effect
63
+ */
64
+ export const WeatherEffect = (options) => {
65
+ const {
66
+ speed = signal(0.5),
67
+ windDirection = signal(0.0),
68
+ windStrength = signal(0.2),
69
+ density = signal(180.0),
70
+ resolution = signal([1000, 1000])
71
+ } = useProps(options);
72
+
73
+ // Convert to signals if not already
74
+ const speedSignal = typeof speed === 'function' ? speed : signal(speed);
75
+ const windDirectionSignal = typeof windDirection === 'function' ? windDirection : signal(windDirection);
76
+ const windStrengthSignal = typeof windStrength === 'function' ? windStrength : signal(windStrength);
77
+ const densitySignal = typeof density === 'function' ? density : signal(density);
78
+ const resolutionSignal = typeof resolution === 'function' ? resolution : signal(resolution);
79
+
80
+ // Vertex shader - handles vertex positioning and UV mapping
81
+ const vertexSrc = /* glsl */ `
82
+ precision mediump float;
83
+ attribute vec2 aPosition;
84
+ attribute vec2 aUV;
85
+ varying vec2 vUV;
86
+ void main() {
87
+ vUV = aUV;
88
+ gl_Position = vec4(aPosition, 0.0, 1.0);
89
+ }
90
+ `;
91
+
92
+ // Fragment shader - generates the rain effect
93
+ const fragmentSrc = /* glsl */ `
94
+ precision mediump float;
95
+ varying vec2 vUV;
96
+ uniform float uTime;
97
+ uniform vec2 uResolution;
98
+ uniform float uRainSpeed;
99
+ uniform float uWindDirection;
100
+ uniform float uWindStrength;
101
+ uniform float uRainDensity;
102
+
103
+ // Hash function for pseudo-random number generation
104
+ float hash(float n){ return fract(sin(n)*43758.5453); }
105
+
106
+ // Generate a single raindrop at given UV coordinates
107
+ float rainDrop(vec2 uv, float t, float seed) {
108
+ // Random X position with wider coverage for screen edges
109
+ float x = hash(seed) * 2.4 - 1.2;
110
+
111
+ // Falling speed with variation per drop
112
+ float baseSpeed = 1.0 + hash(seed + 1.0) * 1.5;
113
+ float speed = baseSpeed * uRainSpeed;
114
+
115
+ // Y position falling from top (1.0) to bottom (-1.0)
116
+ float y = 1.2 - fract(t * speed + hash(seed + 2.0)) * 2.4;
117
+
118
+ // Wind effect: more drift as drop falls further
119
+ float fallProgress = (1.2 - y) / 2.4; // 0 = top, 1 = bottom
120
+ float windOffset = uWindDirection * uWindStrength * fallProgress * 0.5;
121
+ x += windOffset;
122
+
123
+ vec2 dropPos = vec2(x, y);
124
+ vec2 diff = uv - dropPos;
125
+
126
+ // Raindrop shape (thin streaks)
127
+ float dropWidth = 0.0015 + hash(seed + 3.0) * 0.0005;
128
+ float dropLength = 0.025 + hash(seed + 4.0) * 0.015;
129
+
130
+ // Slight tilt based on wind
131
+ float windAngle = uWindDirection * uWindStrength * 0.2;
132
+ float cosA = cos(windAngle);
133
+ float sinA = sin(windAngle);
134
+ vec2 rotatedDiff = vec2(
135
+ diff.x * cosA - diff.y * sinA,
136
+ diff.x * sinA + diff.y * cosA
137
+ );
138
+
139
+ // Distance calculation for thin streaks
140
+ float distX = abs(rotatedDiff.x) / dropWidth;
141
+ float distY = abs(rotatedDiff.y) / dropLength;
142
+ float dist = max(distX, distY * 0.4);
143
+
144
+ // Intensity with fade and variation (Zelda-style)
145
+ float intensity = 1.0 - smoothstep(0.0, 1.2, dist);
146
+ intensity *= 0.7 + 0.3 * hash(seed + 5.0);
147
+
148
+ // Natural fade at top and bottom edges
149
+ intensity *= smoothstep(-1.2, -0.8, y) * smoothstep(1.2, 0.8, y);
150
+
151
+ return intensity;
152
+ }
153
+
154
+ void main(){
155
+ // Normalized UV coordinates centered on screen
156
+ vec2 uv = (gl_FragCoord.xy - 0.5 * uResolution.xy) / min(uResolution.x, uResolution.y);
157
+
158
+ float rain = 0.0;
159
+
160
+ // Generate multiple raindrops
161
+ for(float i = 0.0; i < 200.0; i++) {
162
+ rain += rainDrop(uv, uTime, i * 12.34);
163
+ }
164
+
165
+ // Adjust intensity based on density setting
166
+ rain *= (uRainDensity / 200.0);
167
+
168
+ // Zelda-style rain color (bright and visible)
169
+ vec3 rainColor = vec3(0.85, 0.9, 1.0);
170
+
171
+ gl_FragColor = vec4(rainColor * rain, rain * 0.8);
172
+ }
173
+ `;
174
+
175
+ // Create WebGL program
176
+ const glProgram = new GlProgram({ vertex: vertexSrc, fragment: fragmentSrc });
177
+
178
+ // Uniform group for shader parameters
179
+ const uniformGroup = new UniformGroup({
180
+ uTime: { value: 0, type: "f32" },
181
+ uResolution: { value: resolutionSignal(), type: "vec2<f32>" },
182
+ uRainSpeed: { value: speedSignal(), type: "f32" },
183
+ uWindDirection: { value: windDirectionSignal(), type: "f32" },
184
+ uWindStrength: { value: windStrengthSignal(), type: "f32" },
185
+ uRainDensity: { value: densitySignal(), type: "f32" },
186
+ });
187
+
188
+ // Create shader with program and resources
189
+ const shader = new Shader({
190
+ glProgram,
191
+ resources: {
192
+ uniforms: uniformGroup,
193
+ },
194
+ });
195
+
196
+ // Full-screen quad geometry
197
+ const geometry = new Geometry({
198
+ attributes: {
199
+ aPosition: [-1, -1, 1, -1, 1, 1, -1, 1],
200
+ aUV: [0, 0, 1, 0, 1, 1, 0, 1],
201
+ },
202
+ indexBuffer: [0, 1, 2, 0, 2, 3],
203
+ });
204
+
205
+ // Animation loop - update time and reactive uniforms
206
+ tick(({ deltaTime }) => {
207
+ uniformGroup.uniforms.uTime += deltaTime;
208
+
209
+ // Update uniforms from signals
210
+ uniformGroup.uniforms.uRainSpeed = speedSignal();
211
+ uniformGroup.uniforms.uWindDirection = windDirectionSignal();
212
+ uniformGroup.uniforms.uWindStrength = windStrengthSignal();
213
+ uniformGroup.uniforms.uRainDensity = densitySignal();
214
+ uniformGroup.uniforms.uResolution = resolutionSignal();
215
+ });
216
+
217
+ return h(Mesh, {
218
+ geometry,
219
+ shader,
220
+ });
221
+ };
222
+
223
+ // Export as Weather for easier usage
224
+ export const Weather = WeatherEffect;
package/src/index.ts CHANGED
@@ -2,4 +2,5 @@ export * from './Bar'
2
2
  export * from './Particle'
3
3
  export * from './NightAmbiant'
4
4
  export * from './Joystick'
5
- export * from './Tilemap'
5
+ export * from './Tilemap'
6
+ export * from './Weathers'