@hi-ashleyj/llama 0.13.2 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/Game.svelte +154 -129
  2. package/dist/Game.svelte.d.ts +10 -21
  3. package/dist/Layer.svelte +61 -46
  4. package/dist/Layer.svelte.d.ts +9 -20
  5. package/dist/audio/AudioCompressor.svelte +70 -44
  6. package/dist/audio/AudioCompressor.svelte.d.ts +14 -23
  7. package/dist/audio/AudioGain.svelte +33 -20
  8. package/dist/audio/AudioGain.svelte.d.ts +6 -17
  9. package/dist/audio/AudioListenerPosition.svelte +79 -93
  10. package/dist/audio/AudioListenerPosition.svelte.d.ts +6 -16
  11. package/dist/audio/AudioPanner.svelte +33 -20
  12. package/dist/audio/AudioPanner.svelte.d.ts +6 -17
  13. package/dist/audio/BufferedAudioSource.svelte +59 -44
  14. package/dist/audio/BufferedAudioSource.svelte.d.ts +8 -18
  15. package/dist/audio/MediaAudioSource.svelte +56 -35
  16. package/dist/audio/MediaAudioSource.svelte.d.ts +13 -25
  17. package/dist/audio/context.d.ts +1 -1
  18. package/dist/controllers/MouseClickable.svelte +61 -49
  19. package/dist/controllers/MouseClickable.svelte.d.ts +11 -20
  20. package/dist/controllers/MouseEventArea.svelte +71 -55
  21. package/dist/controllers/MouseEventArea.svelte.d.ts +13 -26
  22. package/dist/controllers/motions.d.ts +4 -5
  23. package/dist/drawables/Arc.svelte +48 -30
  24. package/dist/drawables/Arc.svelte.d.ts +9 -19
  25. package/dist/drawables/Circle.svelte +38 -24
  26. package/dist/drawables/Circle.svelte.d.ts +7 -17
  27. package/dist/drawables/DisplayImage.svelte +26 -16
  28. package/dist/drawables/DisplayImage.svelte.d.ts +11 -21
  29. package/dist/drawables/MultiLineText.svelte +75 -45
  30. package/dist/drawables/MultiLineText.svelte.d.ts +14 -24
  31. package/dist/drawables/Rectangle.svelte +35 -22
  32. package/dist/drawables/Rectangle.svelte.d.ts +7 -17
  33. package/dist/drawables/RoundedRectangle.svelte +41 -23
  34. package/dist/drawables/RoundedRectangle.svelte.d.ts +8 -18
  35. package/dist/drawables/Text.svelte +63 -40
  36. package/dist/drawables/Text.svelte.d.ts +13 -23
  37. package/dist/drawables/Tiled.svelte +79 -61
  38. package/dist/drawables/Tiled.svelte.d.ts +10 -20
  39. package/dist/extras/DefaultFontFace.svelte +35 -17
  40. package/dist/extras/DefaultFontFace.svelte.d.ts +15 -24
  41. package/dist/extras/FullScreenEventHandler.svelte +37 -23
  42. package/dist/extras/FullScreenEventHandler.svelte.d.ts +9 -19
  43. package/dist/extras/LayerPortal.svelte +36 -22
  44. package/dist/extras/LayerPortal.svelte.d.ts +6 -17
  45. package/dist/extras/SensibleDefaultStyles.svelte +8 -2
  46. package/dist/extras/SensibleDefaultStyles.svelte.d.ts +5 -17
  47. package/dist/extras/Tweened.svelte +28 -9
  48. package/dist/extras/Tweened.svelte.d.ts +12 -22
  49. package/dist/primitives/Area.svelte +46 -22
  50. package/dist/primitives/Area.svelte.d.ts +14 -24
  51. package/dist/primitives/Empty.svelte +7 -2
  52. package/dist/primitives/Empty.svelte.d.ts +5 -15
  53. package/dist/primitives/Inset.svelte +45 -26
  54. package/dist/primitives/Inset.svelte.d.ts +9 -20
  55. package/dist/primitives/Node.svelte +32 -19
  56. package/dist/primitives/Node.svelte.d.ts +7 -18
  57. package/dist/primitives/Opacity.svelte +34 -22
  58. package/dist/primitives/Opacity.svelte.d.ts +6 -17
  59. package/dist/primitives/Rotate.svelte +33 -22
  60. package/dist/primitives/Rotate.svelte.d.ts +11 -21
  61. package/dist/primitives/Translate.svelte +32 -19
  62. package/dist/primitives/Translate.svelte.d.ts +7 -18
  63. package/dist/resources/AssetPool.svelte +7 -2
  64. package/dist/resources/AssetPool.svelte.d.ts +5 -15
  65. package/dist/resources/AudioBufferedAsset.svelte +14 -6
  66. package/dist/resources/AudioBufferedAsset.svelte.d.ts +5 -15
  67. package/dist/resources/AudioMediaAsset.svelte +10 -2
  68. package/dist/resources/AudioMediaAsset.svelte.d.ts +5 -15
  69. package/dist/resources/ImageAsset.svelte +16 -9
  70. package/dist/resources/ImageAsset.svelte.d.ts +5 -15
  71. package/dist/resources/audio.d.ts +1 -1
  72. package/dist/resources/images.d.ts +1 -1
  73. package/dist/scenes/SceneSwitcher.svelte +27 -16
  74. package/dist/scenes/SceneSwitcher.svelte.d.ts +5 -16
  75. package/dist/scenes/SceneTransition.svelte +47 -36
  76. package/dist/scenes/SceneTransition.svelte.d.ts +6 -20
  77. package/package.json +10 -9
@@ -1,47 +1,77 @@
1
- <script>import { setupDrawable } from "../drawable.js";
2
- import { onMount } from "svelte";
3
- import { getGame } from "../core-contexts.js";
4
- export let text;
5
- export let size;
6
- export let spacing = 1.4;
7
- export let font = null;
8
- export let style = void 0;
9
- export let fill = void 0;
10
- export let stroke = void 0;
11
- export let strokeWidth = null;
12
- export let alignH = "left";
13
- export let alignV = "top";
14
- const { defaultTextFontFace } = getGame();
15
- $:
16
- effectiveFont = font ? font : typeof $defaultTextFontFace === "string" ? $defaultTextFontFace : "sans-serif";
17
- $:
18
- computedFont = (style ? style + " " : "") + size + "px " + effectiveFont;
19
- $:
20
- splits = text?.split("\n") || [];
21
- $:
22
- offset = alignV === "bottom" ? ((splits?.length || 1) - 1) * size * spacing : alignV === "middle" ? ((splits?.length || 1) - 1) * size * spacing * 0.5 : 0;
23
- const draw = function({ ctx }, { x, y }) {
24
- if (!splits)
25
- return;
26
- for (let i = 0; i < splits.length; i++) {
27
- const line = splits[i];
28
- ctx.beginPath();
29
- ctx.textAlign = alignH;
30
- ctx.textBaseline = alignV;
31
- ctx.font = computedFont;
32
- if (fill) {
33
- ctx.fillStyle = fill;
34
- ctx.fillText(line, x, y + size * spacing * i - offset);
1
+ <script lang="ts">
2
+
3
+ import { setupDrawable, type DrawFunction } from "../drawable.js";
4
+ import { onMount } from "svelte";
5
+ import { getGame } from "../core-contexts.js";
6
+
7
+ interface Props {
8
+ text: string;
9
+ size: number;
10
+ spacing?: number;
11
+ font?: string | null;
12
+ style?: string | undefined;
13
+ fill?: string | undefined;
14
+ stroke?: string | undefined;
15
+ strokeWidth?: number | null;
16
+ alignH?: "left" | "center" | "right";
17
+ alignV?: "top" | "middle" | "bottom" | "alphabetic";
35
18
  }
36
- if (stroke && strokeWidth) {
37
- ctx.strokeStyle = stroke;
38
- ctx.lineWidth = strokeWidth;
39
- ctx.strokeText(line, x, y + size * spacing * i - offset);
40
- }
41
- }
42
- };
43
- let register = setupDrawable({});
44
- onMount(() => {
45
- return register({ draw });
46
- });
19
+
20
+ let {
21
+ text,
22
+ size,
23
+ spacing = 1.4,
24
+ font = null,
25
+ style = undefined,
26
+ fill = undefined,
27
+ stroke = undefined,
28
+ strokeWidth = null,
29
+ alignH = "left",
30
+ alignV = "top"
31
+ }: Props = $props();
32
+
33
+ const { defaultTextFontFace } = getGame();
34
+
35
+ let effectiveFont = $derived(font ? font : typeof $defaultTextFontFace === "string" ? $defaultTextFontFace : "sans-serif");
36
+ let computedFont = $derived((style ? style + " " : "") + size + "px " + effectiveFont);
37
+ let splits = $derived(text?.split("\n") || []);
38
+
39
+ let offset =
40
+ $derived(alignV === "bottom"
41
+ ? ((splits?.length || 1) - 1) * size * spacing
42
+ : alignV === "middle"
43
+ ? ((splits?.length || 1) - 1) * size * spacing * 0.5
44
+ : 0);
45
+
46
+ const draw: DrawFunction<{x: number, y: number, w: number, h: number}> = function (
47
+ { ctx },
48
+ { x, y }: { x: number; y: number; w: number; h: number }
49
+ ) {
50
+ if (!splits) return;
51
+
52
+ for (let i = 0; i < splits.length; i++) {
53
+ const line = splits[i];
54
+
55
+ ctx.beginPath();
56
+ ctx.textAlign = alignH;
57
+ ctx.textBaseline = alignV;
58
+ ctx.font = computedFont;
59
+
60
+ if (fill) {
61
+ ctx.fillStyle = fill;
62
+ ctx.fillText(line, x, y + size * spacing * i - offset);
63
+ }
64
+ if (stroke && strokeWidth) {
65
+ ctx.strokeStyle = stroke;
66
+ ctx.lineWidth = strokeWidth;
67
+ ctx.strokeText(line, x, y + size * spacing * i - offset);
68
+ }
69
+ }
70
+ };
71
+
72
+ let register = setupDrawable<{x: number, y: number, w: number, h: number}, null>({});
73
+
74
+ onMount(() => {
75
+ return register({ draw });
76
+ });
47
77
  </script>
@@ -1,25 +1,15 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- text: string;
5
- size: number;
6
- spacing?: number | undefined;
7
- font?: string | null | undefined;
8
- style?: string | undefined;
9
- fill?: string | undefined;
10
- stroke?: string | undefined;
11
- strokeWidth?: number | null | undefined;
12
- alignH?: "center" | "left" | "right" | undefined;
13
- alignV?: "alphabetic" | "bottom" | "middle" | "top" | undefined;
14
- };
15
- events: {
16
- [evt: string]: CustomEvent<any>;
17
- };
18
- slots: {};
19
- };
20
- export type MultiLineTextProps = typeof __propDef.props;
21
- export type MultiLineTextEvents = typeof __propDef.events;
22
- export type MultiLineTextSlots = typeof __propDef.slots;
23
- export default class MultiLineText extends SvelteComponent<MultiLineTextProps, MultiLineTextEvents, MultiLineTextSlots> {
1
+ interface Props {
2
+ text: string;
3
+ size: number;
4
+ spacing?: number;
5
+ font?: string | null;
6
+ style?: string | undefined;
7
+ fill?: string | undefined;
8
+ stroke?: string | undefined;
9
+ strokeWidth?: number | null;
10
+ alignH?: "left" | "center" | "right";
11
+ alignV?: "top" | "middle" | "bottom" | "alphabetic";
24
12
  }
25
- export {};
13
+ declare const MultiLineText: import("svelte").Component<Props, {}, "">;
14
+ type MultiLineText = ReturnType<typeof MultiLineText>;
15
+ export default MultiLineText;
@@ -1,23 +1,36 @@
1
- <script>import { setupDrawable } from "../drawable.js";
2
- import { onMount } from "svelte";
3
- export let fill = null;
4
- export let stroke = null;
5
- export let strokeWidth = null;
6
- const draw = function({ ctx }, { x, y, w, h }) {
7
- ctx.beginPath();
8
- ctx.rect(x, y, w, h);
9
- if (fill) {
10
- ctx.fillStyle = fill;
11
- ctx.fill();
12
- }
13
- if (stroke && strokeWidth) {
14
- ctx.strokeStyle = stroke;
15
- ctx.lineWidth = strokeWidth;
16
- ctx.stroke();
17
- }
18
- };
19
- let register = setupDrawable({});
20
- onMount(() => {
21
- return register({ draw });
22
- });
1
+ <script lang="ts">
2
+
3
+ import { setupDrawable, type DrawFunction } from "../drawable.js";
4
+ import { onMount } from "svelte";
5
+
6
+ interface Props {
7
+ fill?: string | null;
8
+ stroke?: string | null;
9
+ strokeWidth?: number | null;
10
+ }
11
+
12
+ let { fill = null, stroke = null, strokeWidth = null }: Props = $props();
13
+
14
+ const draw: DrawFunction<{x: number, y: number, w: number, h: number}> = function({ ctx }, { x, y, w, h }) {
15
+ ctx.beginPath();
16
+ ctx.rect(x, y, w, h);
17
+
18
+ if (fill) {
19
+ ctx.fillStyle = fill;
20
+ ctx.fill();
21
+ }
22
+
23
+ if (stroke && strokeWidth) {
24
+ ctx.strokeStyle = stroke;
25
+ ctx.lineWidth = strokeWidth;
26
+ ctx.stroke();
27
+ }
28
+ };
29
+
30
+ let register = setupDrawable<{x: number, y: number, w: number, h: number}, null>({});
31
+
32
+ onMount(() => {
33
+ return register({ draw });
34
+ })
35
+
23
36
  </script>
@@ -1,18 +1,8 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- fill?: string | null | undefined;
5
- stroke?: string | null | undefined;
6
- strokeWidth?: number | null | undefined;
7
- };
8
- events: {
9
- [evt: string]: CustomEvent<any>;
10
- };
11
- slots: {};
12
- };
13
- export type RectangleProps = typeof __propDef.props;
14
- export type RectangleEvents = typeof __propDef.events;
15
- export type RectangleSlots = typeof __propDef.slots;
16
- export default class Rectangle extends SvelteComponent<RectangleProps, RectangleEvents, RectangleSlots> {
1
+ interface Props {
2
+ fill?: string | null;
3
+ stroke?: string | null;
4
+ strokeWidth?: number | null;
17
5
  }
18
- export {};
6
+ declare const Rectangle: import("svelte").Component<Props, {}, "">;
7
+ type Rectangle = ReturnType<typeof Rectangle>;
8
+ export default Rectangle;
@@ -1,24 +1,42 @@
1
- <script>import { setupDrawable } from "../drawable.js";
2
- import { onMount } from "svelte";
3
- export let fill = null;
4
- export let stroke = null;
5
- export let strokeWidth = null;
6
- export let radius = 0;
7
- const draw = function({ ctx }, { x, y, w, h }) {
8
- ctx.beginPath();
9
- ctx.roundRect(x, y, w, h, radius);
10
- if (fill) {
11
- ctx.fillStyle = fill;
12
- ctx.fill();
13
- }
14
- if (stroke && strokeWidth) {
15
- ctx.strokeStyle = stroke;
16
- ctx.lineWidth = strokeWidth;
17
- ctx.stroke();
18
- }
19
- };
20
- let register = setupDrawable({});
21
- onMount(() => {
22
- return register({ draw });
23
- });
1
+ <script lang="ts">
2
+
3
+ import { setupDrawable, type DrawFunction } from "../drawable.js";
4
+ import { onMount } from "svelte";
5
+
6
+ interface Props {
7
+ fill?: string | null;
8
+ stroke?: string | null;
9
+ strokeWidth?: number | null;
10
+ radius?: number | [ number ] | [ number, number ] | [ number, number, number ] | [ number, number, number, number ];
11
+ }
12
+
13
+ let {
14
+ fill = null,
15
+ stroke = null,
16
+ strokeWidth = null,
17
+ radius = 0
18
+ }: Props = $props();
19
+
20
+ const draw: DrawFunction<{x: number, y: number, w: number, h: number}> = function({ ctx }, { x, y, w, h }: { x: number, y: number, w: number, h: number }) {
21
+ ctx.beginPath();
22
+ ctx.roundRect(x, y, w, h, radius);
23
+
24
+ if (fill) {
25
+ ctx.fillStyle = fill;
26
+ ctx.fill();
27
+ }
28
+
29
+ if (stroke && strokeWidth) {
30
+ ctx.strokeStyle = stroke;
31
+ ctx.lineWidth = strokeWidth;
32
+ ctx.stroke();
33
+ }
34
+ };
35
+
36
+ let register = setupDrawable<{x: number, y: number, w: number, h: number}, null>({});
37
+
38
+ onMount(() => {
39
+ return register({ draw });
40
+ })
41
+
24
42
  </script>
@@ -1,19 +1,9 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- fill?: string | null | undefined;
5
- stroke?: string | null | undefined;
6
- strokeWidth?: number | null | undefined;
7
- radius?: number | [number] | [number, number] | [number, number, number] | [number, number, number, number] | undefined;
8
- };
9
- events: {
10
- [evt: string]: CustomEvent<any>;
11
- };
12
- slots: {};
13
- };
14
- export type RoundedRectangleProps = typeof __propDef.props;
15
- export type RoundedRectangleEvents = typeof __propDef.events;
16
- export type RoundedRectangleSlots = typeof __propDef.slots;
17
- export default class RoundedRectangle extends SvelteComponent<RoundedRectangleProps, RoundedRectangleEvents, RoundedRectangleSlots> {
1
+ interface Props {
2
+ fill?: string | null;
3
+ stroke?: string | null;
4
+ strokeWidth?: number | null;
5
+ radius?: number | [number] | [number, number] | [number, number, number] | [number, number, number, number];
18
6
  }
19
- export {};
7
+ declare const RoundedRectangle: import("svelte").Component<Props, {}, "">;
8
+ type RoundedRectangle = ReturnType<typeof RoundedRectangle>;
9
+ export default RoundedRectangle;
@@ -1,41 +1,64 @@
1
- <script>import { setupDrawable } from "../drawable.js";
2
- import { getGame } from "../core-contexts.js";
3
- import { onMount } from "svelte";
4
- export let text;
5
- export let size;
6
- export let font = null;
7
- export let style = void 0;
8
- export let fill = void 0;
9
- export let stroke = void 0;
10
- export let strokeWidth = null;
11
- export let alignH = "left";
12
- export let alignV = "top";
13
- const { defaultTextFontFace } = getGame();
14
- $:
15
- effectiveFont = font ? font : typeof $defaultTextFontFace === "string" ? $defaultTextFontFace : "sans-serif";
16
- $:
17
- computedFont = (style ? style + " " : "") + size + "px " + effectiveFont;
18
- const draw = function({ ctx }, { x, y, w, h }) {
19
- if (!text)
20
- return;
21
- ctx.beginPath();
22
- ctx.textAlign = alignH;
23
- ctx.textBaseline = alignV;
24
- ctx.font = computedFont;
25
- let actualX = x + (alignH === "right" ? w : alignH === "center" ? w / 2 : 0);
26
- let actualY = y + (alignV === "bottom" ? h : alignV === "middle" ? h / 2 + size * 0.1 : 0);
27
- if (fill) {
28
- ctx.fillStyle = fill;
29
- ctx.fillText(text, actualX, actualY);
30
- }
31
- if (stroke && strokeWidth) {
32
- ctx.strokeStyle = stroke;
33
- ctx.lineWidth = strokeWidth;
34
- ctx.strokeText(text, actualX, actualY);
35
- }
36
- };
37
- let register = setupDrawable({});
38
- onMount(() => {
39
- return register({ draw });
40
- });
1
+ <script lang="ts">
2
+
3
+ import { setupDrawable, type DrawFunction } from "../drawable.js";
4
+ import { getGame } from "../core-contexts.js";
5
+ import { onMount } from "svelte";
6
+
7
+ interface Props {
8
+ text: string;
9
+ size: number;
10
+ font?: string | null;
11
+ style?: string | undefined;
12
+ fill?: string | undefined;
13
+ stroke?: string | undefined;
14
+ strokeWidth?: number | null;
15
+ alignH?: "left" | "center" | "right";
16
+ alignV?: "top" | "middle" | "bottom" | "alphabetic";
17
+ }
18
+
19
+ let {
20
+ text,
21
+ size,
22
+ font = null,
23
+ style = undefined,
24
+ fill = undefined,
25
+ stroke = undefined,
26
+ strokeWidth = null,
27
+ alignH = "left",
28
+ alignV = "top"
29
+ }: Props = $props();
30
+
31
+ const { defaultTextFontFace } = getGame();
32
+
33
+ let effectiveFont = $derived(font ? font : typeof $defaultTextFontFace === "string" ? $defaultTextFontFace : "sans-serif");
34
+ let computedFont = $derived(((style) ? style + " ": "") + size + "px " + effectiveFont);
35
+
36
+ const draw: DrawFunction<{x: number, y: number, w: number, h: number}> = function({ ctx }, { x, y, w, h }: { x: number, y: number, w: number, h: number }) {
37
+ if (!text) return;
38
+
39
+ ctx.beginPath();
40
+ ctx.textAlign = alignH;
41
+ ctx.textBaseline = alignV;
42
+ ctx.font = computedFont;
43
+
44
+ let actualX = x + (alignH === "right" ? w : alignH === "center" ? w / 2 : 0);
45
+ let actualY = y + (alignV === "bottom" ? h : alignV === "middle" ? (h / 2) + (size * 0.10) : 0);
46
+
47
+ if (fill) {
48
+ ctx.fillStyle = fill;
49
+ ctx.fillText(text, actualX, actualY);
50
+ }
51
+ if (stroke && strokeWidth) {
52
+ ctx.strokeStyle = stroke;
53
+ ctx.lineWidth = strokeWidth;
54
+ ctx.strokeText(text, actualX, actualY);
55
+ }
56
+ };
57
+
58
+ let register = setupDrawable<{x: number, y: number, w: number, h: number}, null>({});
59
+
60
+ onMount(() => {
61
+ return register({ draw });
62
+ })
63
+
41
64
  </script>
@@ -1,24 +1,14 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- text: string;
5
- size: number;
6
- font?: string | null | undefined;
7
- style?: string | undefined;
8
- fill?: string | undefined;
9
- stroke?: string | undefined;
10
- strokeWidth?: number | null | undefined;
11
- alignH?: "center" | "left" | "right" | undefined;
12
- alignV?: "alphabetic" | "bottom" | "middle" | "top" | undefined;
13
- };
14
- events: {
15
- [evt: string]: CustomEvent<any>;
16
- };
17
- slots: {};
18
- };
19
- export type TextProps = typeof __propDef.props;
20
- export type TextEvents = typeof __propDef.events;
21
- export type TextSlots = typeof __propDef.slots;
22
- export default class Text extends SvelteComponent<TextProps, TextEvents, TextSlots> {
1
+ interface Props {
2
+ text: string;
3
+ size: number;
4
+ font?: string | null;
5
+ style?: string | undefined;
6
+ fill?: string | undefined;
7
+ stroke?: string | undefined;
8
+ strokeWidth?: number | null;
9
+ alignH?: "left" | "center" | "right";
10
+ alignV?: "top" | "middle" | "bottom" | "alphabetic";
23
11
  }
24
- export {};
12
+ declare const Text: import("svelte").Component<Props, {}, "">;
13
+ type Text = ReturnType<typeof Text>;
14
+ export default Text;
@@ -1,63 +1,81 @@
1
- <script>import { setupDrawable } from "../drawable.js";
2
- import { onMount } from "svelte";
3
- export let shiftX;
4
- export let shiftY;
5
- export let drawSize;
6
- export let tileSet;
7
- export let alias;
8
- export let map;
9
- $:
10
- mapWidth = map[0]?.length ?? 0;
11
- $:
12
- mapHeight = map.length ?? 0;
13
- const draw = ({ ctx, width, height }, { x, y, w, h }) => {
14
- if (!map)
15
- return;
16
- if (!alias)
17
- return;
18
- if (shiftX < w * -1)
19
- return;
20
- if (shiftX > mapWidth * drawSize)
21
- return;
22
- if (shiftY < h * -1)
23
- return;
24
- if (shiftY > mapHeight * drawSize)
25
- return;
26
- const leftMostTile = Math.max(Math.floor(shiftX / drawSize), 0);
27
- const leftOffset = shiftX > 0 ? shiftX % drawSize * -1 : shiftX * -1;
28
- const tilesWide = Math.min(mapWidth - leftMostTile, Math.ceil((w - leftOffset) / drawSize), mapWidth - 1);
29
- const topMostTile = Math.max(Math.floor(shiftY / drawSize), 0);
30
- const topOffset = shiftY > 0 ? shiftY % drawSize * -1 : shiftY * -1;
31
- const tilesHigh = Math.min(mapHeight - topMostTile, Math.ceil((h - topOffset) / drawSize), mapHeight - 1);
32
- for (let i = 0; i < tilesWide; i++) {
33
- for (let j = 0; j < tilesHigh; j++) {
34
- try {
35
- const key = map[j + topMostTile][i + leftMostTile];
36
- if (key === " ")
37
- continue;
38
- const dealias = alias[key];
39
- if (!dealias)
40
- continue;
41
- ctx.drawImage(
42
- tileSet.image,
43
- dealias[0] * tileSet.size,
44
- dealias[1] * tileSet.size,
45
- tileSet.size,
46
- tileSet.size,
47
- i * drawSize + leftOffset,
48
- j * drawSize + topOffset,
49
- drawSize,
50
- drawSize
51
- );
52
- } catch (_err) {
53
- console.log(i, j);
54
- throw _err;
55
- }
1
+ <script lang="ts">
2
+
3
+ import type { TileSet } from "../resources/tileset.js";
4
+ import { setupDrawable, type DrawFunction } from "../drawable.js";
5
+ import { onMount } from "svelte";
6
+
7
+ interface Props {
8
+ shiftX: number;
9
+ shiftY: number;
10
+ drawSize: number;
11
+ tileSet: TileSet;
12
+ alias: Record<string, [ number, number ]>;
13
+ map: string[];
56
14
  }
57
- }
58
- };
59
- const register = setupDrawable({});
60
- onMount(() => {
61
- return register({ draw });
62
- });
15
+
16
+ let {
17
+ shiftX,
18
+ shiftY,
19
+ drawSize,
20
+ tileSet,
21
+ alias,
22
+ map
23
+ }: Props = $props();
24
+
25
+ let mapWidth = $derived(map[0]?.length ?? 0);
26
+ let mapHeight = $derived(map.length ?? 0);
27
+
28
+ const draw: DrawFunction<{x: number, y: number, w: number, h: number}> = ({ ctx, width, height }, { x, y, w, h }) => {
29
+
30
+ if (!map) return;
31
+ if (!alias) return;
32
+
33
+ // CHECK BOUNDS
34
+ if (shiftX < w * -1) return;
35
+ if (shiftX > mapWidth * drawSize) return;
36
+
37
+ if (shiftY < h * - 1) return;
38
+ if (shiftY > mapHeight * drawSize) return;
39
+
40
+ // WE DO HAVE TO DRAW SOME TILES
41
+ const leftMostTile = Math.max(Math.floor(shiftX / drawSize), 0);
42
+ const leftOffset = shiftX > 0 ? (shiftX % drawSize) * -1 : shiftX * -1;
43
+ const tilesWide = Math.min(mapWidth - leftMostTile, Math.ceil((w - leftOffset) / drawSize), mapWidth - 1);
44
+
45
+ const topMostTile = Math.max(Math.floor(shiftY / drawSize), 0);
46
+ const topOffset = shiftY > 0 ? (shiftY % drawSize) * -1 : shiftY * -1;
47
+ const tilesHigh = Math.min(mapHeight - topMostTile, Math.ceil((h - topOffset) / drawSize), mapHeight - 1);
48
+
49
+ for ( let i = 0; i < tilesWide; i ++ ) {
50
+ for ( let j = 0; j < tilesHigh; j ++ ) {
51
+ try {
52
+ const key = map[j + topMostTile][i + leftMostTile];
53
+ if (key === " ") continue;
54
+ const dealias = alias[key];
55
+ if (!dealias) continue;
56
+ ctx.drawImage(
57
+ tileSet.image,
58
+ dealias[0] * tileSet.size,
59
+ dealias[1] * tileSet.size,
60
+ tileSet.size,
61
+ tileSet.size,
62
+ i * drawSize + leftOffset,
63
+ j * drawSize + topOffset,
64
+ drawSize,
65
+ drawSize);
66
+ } catch (_err) {
67
+ console.log(i, j);
68
+ throw _err;
69
+ }
70
+
71
+ }
72
+ }
73
+ }
74
+
75
+ const register = setupDrawable<{x: number, y: number, w: number, h: number}, null>({});
76
+
77
+ onMount(() => {
78
+ return register({ draw })
79
+ })
80
+
63
81
  </script>