1681-engine 0.5.9 → 0.6.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 (210) hide show
  1. package/CHANGELOG.md +92 -1
  2. package/README.md +15 -6
  3. package/dist/1681-engine.js +588 -465
  4. package/dist/ai/behaviorTree.js +198 -0
  5. package/dist/ai/buildTree.js +54 -0
  6. package/dist/ambient/life/Birds.js +73 -0
  7. package/dist/ambient/life/Butterflies.js +43 -0
  8. package/dist/ambient/life/ChimneySmoke.js +50 -0
  9. package/dist/ambient/life/Drift.js +75 -0
  10. package/dist/ambient/life/Fireflies.js +52 -0
  11. package/dist/ambient/life/lifeMotion.js +49 -0
  12. package/dist/assets/AssetLoader.js +115 -70
  13. package/dist/assets/Prepainter.js +61 -0
  14. package/dist/assets/workerPainter.js +39 -0
  15. package/dist/audio/spatial.js +118 -0
  16. package/dist/cjs/electron/electronLike.d.ts +55 -0
  17. package/dist/cjs/electron/electronLike.js +7 -0
  18. package/dist/cjs/electron/index.d.ts +14 -0
  19. package/dist/cjs/electron/index.js +20 -0
  20. package/dist/cjs/electron/lockdown.d.ts +33 -0
  21. package/dist/cjs/electron/lockdown.js +69 -0
  22. package/dist/cjs/electron/lockdownRules.d.ts +28 -0
  23. package/dist/cjs/electron/lockdownRules.js +61 -0
  24. package/dist/cjs/electron/sessionStore.d.ts +40 -0
  25. package/dist/cjs/electron/sessionStore.js +77 -0
  26. package/dist/cjs/electron/shellId.d.ts +22 -0
  27. package/dist/cjs/electron/shellId.js +31 -0
  28. package/dist/cjs/electron/webFiles.d.ts +13 -0
  29. package/dist/cjs/electron/webFiles.js +52 -0
  30. package/dist/cjs/electron/webPatcher.d.ts +83 -0
  31. package/dist/cjs/electron/webPatcher.js +223 -0
  32. package/dist/cjs/electron/webPointers.d.ts +19 -0
  33. package/dist/cjs/electron/webPointers.js +35 -0
  34. package/dist/cjs/package.json +1 -0
  35. package/dist/cjs/updates/index.d.ts +8 -0
  36. package/dist/cjs/updates/index.js +21 -0
  37. package/dist/cjs/updates/manifest.d.ts +73 -0
  38. package/dist/cjs/updates/manifest.js +67 -0
  39. package/dist/cjs/updates/pickUpdate.d.ts +42 -0
  40. package/dist/cjs/updates/pickUpdate.js +52 -0
  41. package/dist/cjs/updates/webPlan.d.ts +20 -0
  42. package/dist/cjs/updates/webPlan.js +34 -0
  43. package/dist/dialogue/DialogueRunner.js +173 -0
  44. package/dist/dialogue/expr.js +137 -0
  45. package/dist/dialogue/validateDialogue.js +52 -0
  46. package/dist/ecs/prefab.js +94 -0
  47. package/dist/electron/lockdown.js +31 -0
  48. package/dist/electron/lockdownRules.js +42 -0
  49. package/dist/electron/sessionStore.js +48 -0
  50. package/dist/electron/shellId.js +18 -0
  51. package/dist/electron/webFiles.js +36 -0
  52. package/dist/electron/webPatcher.js +153 -0
  53. package/dist/electron/webPointers.js +25 -0
  54. package/dist/electron.js +19 -0
  55. package/dist/input/Actions.js +58 -27
  56. package/dist/input/InputCapture.js +98 -0
  57. package/dist/input/Keymap.js +32 -26
  58. package/dist/input/haptics.js +50 -0
  59. package/dist/input/inputTape.js +68 -0
  60. package/dist/mobile/backButton.js +40 -0
  61. package/dist/mobile/capacitor.js +48 -0
  62. package/dist/mobile/screen.js +31 -0
  63. package/dist/mobile.js +12 -0
  64. package/dist/nav/flowField.js +58 -0
  65. package/dist/nav/steering.js +77 -0
  66. package/dist/net/ApiClient.js +96 -0
  67. package/dist/net/InterpolationBuffer.js +30 -23
  68. package/dist/net/LagCompensator.js +100 -0
  69. package/dist/net/Room.js +122 -43
  70. package/dist/net/RoomHost.js +13 -4
  71. package/dist/net/SpatialHash.js +66 -0
  72. package/dist/pixel/lifeArt.js +83 -0
  73. package/dist/pixel.js +63 -58
  74. package/dist/react/ConfirmButton.js +24 -0
  75. package/dist/react/baseCss.js +1 -0
  76. package/dist/react/labels.js +7 -6
  77. package/dist/react/useJsonSelector.js +13 -0
  78. package/dist/react.js +73 -68
  79. package/dist/tilemap/TilemapView.js +57 -32
  80. package/dist/tilemap/autotile.js +103 -0
  81. package/dist/tilemap/collision.js +29 -18
  82. package/dist/tilemap/ldtk.js +21 -0
  83. package/dist/tilemap/ldtkParse.js +191 -0
  84. package/dist/types/ai/behaviorTree.d.ts +133 -0
  85. package/dist/types/ai/behaviorTree.d.ts.map +1 -0
  86. package/dist/types/ai/buildTree.d.ts +55 -0
  87. package/dist/types/ai/buildTree.d.ts.map +1 -0
  88. package/dist/types/ambient/life/Birds.d.ts +50 -0
  89. package/dist/types/ambient/life/Birds.d.ts.map +1 -0
  90. package/dist/types/ambient/life/Butterflies.d.ts +32 -0
  91. package/dist/types/ambient/life/Butterflies.d.ts.map +1 -0
  92. package/dist/types/ambient/life/ChimneySmoke.d.ts +37 -0
  93. package/dist/types/ambient/life/ChimneySmoke.d.ts.map +1 -0
  94. package/dist/types/ambient/life/Drift.d.ts +58 -0
  95. package/dist/types/ambient/life/Drift.d.ts.map +1 -0
  96. package/dist/types/ambient/life/Fireflies.d.ts +43 -0
  97. package/dist/types/ambient/life/Fireflies.d.ts.map +1 -0
  98. package/dist/types/ambient/life/lifeMotion.d.ts +63 -0
  99. package/dist/types/ambient/life/lifeMotion.d.ts.map +1 -0
  100. package/dist/types/assets/AssetLoader.d.ts +20 -0
  101. package/dist/types/assets/AssetLoader.d.ts.map +1 -1
  102. package/dist/types/assets/Prepainter.d.ts +64 -0
  103. package/dist/types/assets/Prepainter.d.ts.map +1 -0
  104. package/dist/types/assets/workerPainter.d.ts +21 -0
  105. package/dist/types/assets/workerPainter.d.ts.map +1 -0
  106. package/dist/types/audio/spatial.d.ts +107 -0
  107. package/dist/types/audio/spatial.d.ts.map +1 -0
  108. package/dist/types/dialogue/DialogueRunner.d.ts +78 -0
  109. package/dist/types/dialogue/DialogueRunner.d.ts.map +1 -0
  110. package/dist/types/dialogue/expr.d.ts +12 -0
  111. package/dist/types/dialogue/expr.d.ts.map +1 -0
  112. package/dist/types/dialogue/script.d.ts +78 -0
  113. package/dist/types/dialogue/script.d.ts.map +1 -0
  114. package/dist/types/dialogue/validateDialogue.d.ts +21 -0
  115. package/dist/types/dialogue/validateDialogue.d.ts.map +1 -0
  116. package/dist/types/ecs/prefab.d.ts +84 -0
  117. package/dist/types/ecs/prefab.d.ts.map +1 -0
  118. package/dist/types/electron/electronLike.d.ts +56 -0
  119. package/dist/types/electron/electronLike.d.ts.map +1 -0
  120. package/dist/types/electron/index.d.ts +15 -0
  121. package/dist/types/electron/index.d.ts.map +1 -0
  122. package/dist/types/electron/lockdown.d.ts +34 -0
  123. package/dist/types/electron/lockdown.d.ts.map +1 -0
  124. package/dist/types/electron/lockdownRules.d.ts +29 -0
  125. package/dist/types/electron/lockdownRules.d.ts.map +1 -0
  126. package/dist/types/electron/sessionStore.d.ts +41 -0
  127. package/dist/types/electron/sessionStore.d.ts.map +1 -0
  128. package/dist/types/electron/shellId.d.ts +23 -0
  129. package/dist/types/electron/shellId.d.ts.map +1 -0
  130. package/dist/types/electron/webFiles.d.ts +14 -0
  131. package/dist/types/electron/webFiles.d.ts.map +1 -0
  132. package/dist/types/electron/webPatcher.d.ts +84 -0
  133. package/dist/types/electron/webPatcher.d.ts.map +1 -0
  134. package/dist/types/electron/webPointers.d.ts +20 -0
  135. package/dist/types/electron/webPointers.d.ts.map +1 -0
  136. package/dist/types/index.d.ts +30 -3
  137. package/dist/types/index.d.ts.map +1 -1
  138. package/dist/types/input/Actions.d.ts +14 -0
  139. package/dist/types/input/Actions.d.ts.map +1 -1
  140. package/dist/types/input/InputCapture.d.ts +53 -0
  141. package/dist/types/input/InputCapture.d.ts.map +1 -0
  142. package/dist/types/input/Keymap.d.ts +12 -6
  143. package/dist/types/input/Keymap.d.ts.map +1 -1
  144. package/dist/types/input/haptics.d.ts +42 -0
  145. package/dist/types/input/haptics.d.ts.map +1 -0
  146. package/dist/types/input/inputTape.d.ts +66 -0
  147. package/dist/types/input/inputTape.d.ts.map +1 -0
  148. package/dist/types/mobile/backButton.d.ts +30 -0
  149. package/dist/types/mobile/backButton.d.ts.map +1 -0
  150. package/dist/types/mobile/capacitor.d.ts +62 -0
  151. package/dist/types/mobile/capacitor.d.ts.map +1 -0
  152. package/dist/types/mobile/index.d.ts +4 -0
  153. package/dist/types/mobile/index.d.ts.map +1 -0
  154. package/dist/types/mobile/screen.d.ts +27 -0
  155. package/dist/types/mobile/screen.d.ts.map +1 -0
  156. package/dist/types/nav/flowField.d.ts +31 -0
  157. package/dist/types/nav/flowField.d.ts.map +1 -0
  158. package/dist/types/nav/steering.d.ts +47 -0
  159. package/dist/types/nav/steering.d.ts.map +1 -0
  160. package/dist/types/net/ApiClient.d.ts +74 -0
  161. package/dist/types/net/ApiClient.d.ts.map +1 -0
  162. package/dist/types/net/InterpolationBuffer.d.ts +5 -0
  163. package/dist/types/net/InterpolationBuffer.d.ts.map +1 -1
  164. package/dist/types/net/LagCompensator.d.ts +70 -0
  165. package/dist/types/net/LagCompensator.d.ts.map +1 -0
  166. package/dist/types/net/Room.d.ts +72 -3
  167. package/dist/types/net/Room.d.ts.map +1 -1
  168. package/dist/types/net/RoomHost.d.ts +8 -3
  169. package/dist/types/net/RoomHost.d.ts.map +1 -1
  170. package/dist/types/net/SpatialHash.d.ts +25 -0
  171. package/dist/types/net/SpatialHash.d.ts.map +1 -0
  172. package/dist/types/pixel/index.d.ts +1 -0
  173. package/dist/types/pixel/index.d.ts.map +1 -1
  174. package/dist/types/pixel/lifeArt.d.ts +63 -0
  175. package/dist/types/pixel/lifeArt.d.ts.map +1 -0
  176. package/dist/types/react/ConfirmButton.d.ts +26 -0
  177. package/dist/types/react/ConfirmButton.d.ts.map +1 -0
  178. package/dist/types/react/baseCss.d.ts +1 -1
  179. package/dist/types/react/baseCss.d.ts.map +1 -1
  180. package/dist/types/react/index.d.ts +2 -0
  181. package/dist/types/react/index.d.ts.map +1 -1
  182. package/dist/types/react/labels.d.ts +2 -0
  183. package/dist/types/react/labels.d.ts.map +1 -1
  184. package/dist/types/react/useJsonSelector.d.ts +13 -0
  185. package/dist/types/react/useJsonSelector.d.ts.map +1 -0
  186. package/dist/types/tilemap/TilemapView.d.ts +17 -0
  187. package/dist/types/tilemap/TilemapView.d.ts.map +1 -1
  188. package/dist/types/tilemap/autotile.d.ts +95 -0
  189. package/dist/types/tilemap/autotile.d.ts.map +1 -0
  190. package/dist/types/tilemap/collision.d.ts +8 -0
  191. package/dist/types/tilemap/collision.d.ts.map +1 -1
  192. package/dist/types/tilemap/ldtk.d.ts +97 -0
  193. package/dist/types/tilemap/ldtk.d.ts.map +1 -0
  194. package/dist/types/tilemap/ldtkParse.d.ts +26 -0
  195. package/dist/types/tilemap/ldtkParse.d.ts.map +1 -0
  196. package/dist/types/ui/ScrollView.d.ts.map +1 -1
  197. package/dist/types/updates/index.d.ts +9 -0
  198. package/dist/types/updates/index.d.ts.map +1 -0
  199. package/dist/types/updates/manifest.d.ts +74 -0
  200. package/dist/types/updates/manifest.d.ts.map +1 -0
  201. package/dist/types/updates/pickUpdate.d.ts +43 -0
  202. package/dist/types/updates/pickUpdate.d.ts.map +1 -0
  203. package/dist/types/updates/webPlan.d.ts +21 -0
  204. package/dist/types/updates/webPlan.d.ts.map +1 -0
  205. package/dist/ui/ScrollView.js +10 -8
  206. package/dist/updates/manifest.js +35 -0
  207. package/dist/updates/pickUpdate.js +27 -0
  208. package/dist/updates/webPlan.js +14 -0
  209. package/dist/updates.js +15 -0
  210. package/package.json +35 -3
@@ -0,0 +1,198 @@
1
+ class k {
2
+ constructor(t) {
3
+ this.root = t;
4
+ }
5
+ root;
6
+ /** A new agent on this tree, with memory of its own. */
7
+ agent() {
8
+ return new p(this.root);
9
+ }
10
+ }
11
+ class p {
12
+ constructor(t) {
13
+ this.root = t;
14
+ }
15
+ root;
16
+ now = 0;
17
+ memory = /* @__PURE__ */ new Map();
18
+ kept = /* @__PURE__ */ new Map();
19
+ /** Nodes that answered 'running' last time they ticked: the ones a halt must reach. */
20
+ open = /* @__PURE__ */ new Set();
21
+ last = /* @__PURE__ */ new Map();
22
+ seen = /* @__PURE__ */ new Map();
23
+ /** Ticks the tree once at time `now` (ms) and returns the root's answer. */
24
+ update(t, e) {
25
+ this.now = e, this.seen = /* @__PURE__ */ new Map();
26
+ const n = this.tick(this.root, t);
27
+ return this.last = this.seen, n;
28
+ }
29
+ /** Halts whatever is running and forgets all memory: the agent starts the tree afresh (it died, it was stunned). */
30
+ reset(t) {
31
+ this.halt(this.root, t), this.memory.clear(), this.kept.clear(), this.open.clear(), this.last.clear();
32
+ }
33
+ /** Whether a node is running for this agent now. */
34
+ isRunning(t) {
35
+ return this.open.has(t);
36
+ }
37
+ state(t, e) {
38
+ return this.memory.has(t) || this.memory.set(t, e()), this.memory.get(t);
39
+ }
40
+ lasting(t, e) {
41
+ return this.kept.has(t) || this.kept.set(t, e()), this.kept.get(t);
42
+ }
43
+ tick(t, e) {
44
+ const n = t.tick(e, this);
45
+ return this.seen.set(t, n), n === "running" ? this.open.add(t) : (this.open.delete(t), this.memory.delete(t)), n;
46
+ }
47
+ halt(t, e) {
48
+ if (this.open.has(t)) {
49
+ for (const n of t.children) this.halt(n, e);
50
+ t.halt?.(e, this), this.open.delete(t), this.memory.delete(t);
51
+ }
52
+ }
53
+ /** The tree as it ran on the last tick, depth first: for a debug overlay. */
54
+ trace() {
55
+ const t = [], e = (n, r) => {
56
+ t.push({ depth: r, kind: n.kind, name: n.name, status: this.last.get(n) ?? null });
57
+ for (const o of n.children) e(o, r + 1);
58
+ };
59
+ return e(this.root, 0), t;
60
+ }
61
+ }
62
+ function m(s) {
63
+ return s.map((t) => `${" ".repeat(t.depth)}${t.name ?? t.kind} ${t.status ?? "·"}`).join(`
64
+ `);
65
+ }
66
+ const u = (s, t, e, n = {}) => ({
67
+ kind: s,
68
+ children: t,
69
+ tick: e,
70
+ ...n
71
+ });
72
+ function w(...s) {
73
+ const t = u("sequence", s, (e, n) => {
74
+ const r = n.state(t, () => ({ i: 0 }));
75
+ for (; r.i < s.length; r.i++) {
76
+ const o = n.tick(s[r.i], e);
77
+ if (o !== "success") return o;
78
+ }
79
+ return "success";
80
+ });
81
+ return t;
82
+ }
83
+ function y(...s) {
84
+ const t = u("selector", s, (e, n) => {
85
+ const r = n.state(t, () => ({ i: 0 }));
86
+ for (; r.i < s.length; r.i++) {
87
+ const o = n.tick(s[r.i], e);
88
+ if (o !== "failure") return o;
89
+ }
90
+ return "failure";
91
+ });
92
+ return t;
93
+ }
94
+ function v(...s) {
95
+ return g("reactive-sequence", s, "success");
96
+ }
97
+ function M(...s) {
98
+ return g("reactive-selector", s, "failure");
99
+ }
100
+ function g(s, t, e) {
101
+ return u(s, t, (n, r) => {
102
+ for (let o = 0; o < t.length; o++) {
103
+ const i = r.tick(t[o], n);
104
+ if (i !== e) {
105
+ for (let c = o + 1; c < t.length; c++) r.halt(t[c], n);
106
+ return i;
107
+ }
108
+ }
109
+ return e;
110
+ });
111
+ }
112
+ function b(s, ...t) {
113
+ const e = Math.min(t.length, s.succeed ?? t.length), n = Math.min(t.length, s.fail ?? 1), r = u("parallel", t, (o, i) => {
114
+ const c = i.state(r, () => /* @__PURE__ */ new Map());
115
+ for (let a = 0; a < t.length; a++) {
116
+ if (c.has(a)) continue;
117
+ const h = i.tick(t[a], o);
118
+ h !== "running" && c.set(a, h);
119
+ }
120
+ let f = 0, l = 0;
121
+ for (const a of c.values()) a === "success" ? f++ : l++;
122
+ if (f < e && l < n) return "running";
123
+ for (const a of t) i.halt(a, o);
124
+ return f >= e ? "success" : "failure";
125
+ });
126
+ return r;
127
+ }
128
+ function q(s) {
129
+ return u("invert", [s], (t, e) => {
130
+ const n = e.tick(s, t);
131
+ return n === "success" ? "failure" : n === "failure" ? "success" : "running";
132
+ });
133
+ }
134
+ function A(s) {
135
+ return u("succeed", [s], (t, e) => e.tick(s, t) === "running" ? "running" : "success");
136
+ }
137
+ function S(s, t) {
138
+ const e = u("repeat", [t], (n, r) => {
139
+ const o = r.state(e, () => ({ n: 0 })), i = r.tick(t, n);
140
+ return i !== "success" ? i : (o.n++, o.n >= s ? "success" : "running");
141
+ });
142
+ return e;
143
+ }
144
+ function $(s, t) {
145
+ const e = u("retry", [t], (n, r) => {
146
+ const o = r.state(e, () => ({ n: 0 })), i = r.tick(t, n);
147
+ return i !== "failure" ? i : (o.n++, o.n >= s ? "failure" : "running");
148
+ });
149
+ return e;
150
+ }
151
+ function j(s, t) {
152
+ const e = u("cooldown", [t], (n, r) => {
153
+ const o = r.lasting(e, () => ({ readyAt: -1 / 0 }));
154
+ if (r.now < o.readyAt) return "failure";
155
+ const i = r.tick(t, n);
156
+ return i !== "running" && (o.readyAt = r.now + s), i;
157
+ });
158
+ return e;
159
+ }
160
+ function B(s, t) {
161
+ const e = u("timeout", [t], (n, r) => {
162
+ const o = r.state(e, () => ({ began: r.now }));
163
+ return r.now - o.began >= s ? (r.halt(t, n), "failure") : r.tick(t, n);
164
+ });
165
+ return e;
166
+ }
167
+ function H(s) {
168
+ const t = u("wait", [], (e, n) => {
169
+ const r = n.state(t, () => ({ began: n.now }));
170
+ return n.now - r.began >= s ? "success" : "running";
171
+ });
172
+ return t;
173
+ }
174
+ function T(s, t) {
175
+ return u("condition", [], (e) => t(e) ? "success" : "failure", { name: s });
176
+ }
177
+ function F(s, t, e = {}) {
178
+ return u("action", [], (n, r) => t(n, r.now), { name: s, halt: e.onHalt ? (n) => e.onHalt(n) : void 0 });
179
+ }
180
+ export {
181
+ k as BehaviorTree,
182
+ p as BtAgent,
183
+ F as action,
184
+ T as condition,
185
+ j as cooldown,
186
+ m as formatTrace,
187
+ q as invert,
188
+ b as parallel,
189
+ M as reactiveSelector,
190
+ v as reactiveSequence,
191
+ S as repeat,
192
+ $ as retry,
193
+ y as selector,
194
+ w as sequence,
195
+ A as succeed,
196
+ B as timeout,
197
+ H as wait
198
+ };
@@ -0,0 +1,54 @@
1
+ import { action as m, condition as s, wait as h, timeout as $, cooldown as y, retry as b, repeat as w, succeed as q, invert as v, parallel as S, reactiveSelector as k, reactiveSequence as A, selector as H, sequence as T } from "./behaviorTree.js";
2
+ function x(e, t) {
3
+ return l(e, t, "$", []);
4
+ }
5
+ function l(e, t, u, c) {
6
+ const r = (n) => {
7
+ throw new Error(`buildTree: ${u}: ${n}`);
8
+ };
9
+ if (!e || typeof e != "object") return r("not a node");
10
+ const a = (n) => !Array.isArray(n) || n.length === 0 ? r("needs children") : n.map((d, f) => l(d, t, `${u}.children[${f}]`, c)), i = (n) => l(n, t, `${u}.child`, c), o = (n, d) => typeof n == "number" && n >= 0 ? n : r(`${d} must be a number of at least 0`);
11
+ switch (e.type) {
12
+ case "sequence":
13
+ return T(...a(e.children));
14
+ case "selector":
15
+ return H(...a(e.children));
16
+ case "reactiveSequence":
17
+ return A(...a(e.children));
18
+ case "reactiveSelector":
19
+ return k(...a(e.children));
20
+ case "parallel":
21
+ return S({ succeed: e.succeed, fail: e.fail }, ...a(e.children));
22
+ case "invert":
23
+ return v(i(e.child));
24
+ case "succeed":
25
+ return q(i(e.child));
26
+ case "repeat":
27
+ return w(o(e.times, "times"), i(e.child));
28
+ case "retry":
29
+ return b(o(e.times, "times"), i(e.child));
30
+ case "cooldown":
31
+ return y(o(e.ms, "ms"), i(e.child));
32
+ case "timeout":
33
+ return $(o(e.ms, "ms"), i(e.child));
34
+ case "wait":
35
+ return h(o(e.ms, "ms"));
36
+ case "condition": {
37
+ const n = t.conditions?.[e.name];
38
+ return n ? s(e.name, n) : r(`no condition '${e.name}'`);
39
+ }
40
+ case "action": {
41
+ const n = t.actions?.[e.name];
42
+ return n ? typeof n == "function" ? m(e.name, n) : m(e.name, n.run, { onHalt: n.onHalt }) : r(`no action '${e.name}'`);
43
+ }
44
+ case "tree": {
45
+ const n = t.trees?.[e.name];
46
+ return n ? c.includes(e.name) ? r(`tree '${e.name}' contains itself`) : l(n, t, `${u}<${e.name}>`, [...c, e.name]) : r(`no tree '${e.name}'`);
47
+ }
48
+ default:
49
+ return r(`unknown type '${e.type}'`);
50
+ }
51
+ }
52
+ export {
53
+ x as buildTree
54
+ };
@@ -0,0 +1,73 @@
1
+ import { birdFrame as x, flockSlot as m } from "./lifeMotion.js";
2
+ class b {
3
+ constructor(s, t) {
4
+ this.options = t, this.snap = t.snap ?? !0, this.random = t.random ?? Math.random;
5
+ const e = t.maxFlock ?? 6;
6
+ for (let i = 0; i < e; i++) {
7
+ const d = s.add.image(0, 0, t.frames[0]).setOrigin(0.5, 0.5).setDepth(t.depth ?? 95e4).setVisible(!1), n = t.shadow ? s.add.image(0, 0, t.shadow).setOrigin(0.5, 0.5).setDepth(t.shadowDepth ?? -999980).setVisible(!1) : null;
8
+ this.birds.push({ img: d, shadow: n, dx: 0, dy: 0, flap: this.random() * 1e3 });
9
+ }
10
+ }
11
+ options;
12
+ birds = [];
13
+ snap;
14
+ random;
15
+ active = 0;
16
+ nextAt = Number.NaN;
17
+ x = 0;
18
+ y = 0;
19
+ vx = 0;
20
+ vy = 0;
21
+ altitude = 60;
22
+ /** Whether a flock is crossing now. */
23
+ get flying() {
24
+ return this.active > 0;
25
+ }
26
+ update(s, t, e, i, d = !0) {
27
+ if (Number.isNaN(this.nextAt)) {
28
+ const [o, h] = this.options.firstMs ?? [3e3, 9e3];
29
+ this.nextAt = s + o + this.random() * (h - o);
30
+ }
31
+ if (!d) {
32
+ this.active && this.land();
33
+ return;
34
+ }
35
+ if (!this.active) {
36
+ s >= this.nextAt && i.night < (this.options.maxNight ?? 0.5) && this.launch(s, e, i.wind);
37
+ return;
38
+ }
39
+ const n = t / 1e3;
40
+ this.x += this.vx * n, this.y += this.vy * n;
41
+ const [c, l] = this.options.frames;
42
+ for (let o = 0; o < this.active; o++) {
43
+ const h = this.birds[o], a = this.snap ? Math.round(this.x + h.dx) : this.x + h.dx, r = this.snap ? Math.round(this.y + h.dy) : this.y + h.dy;
44
+ h.img.setTexture(x(s, h.flap) ? l : c).setFlipX(this.vx < 0), h.img.setPosition(a, r), h.shadow?.setPosition(a + Math.round(this.altitude * 0.25), r + Math.round(this.altitude));
45
+ }
46
+ (this.x < e.x - 120 || this.x > e.right + 120 || this.y < e.y - 120 || this.y > e.bottom + 120) && this.land();
47
+ }
48
+ destroy() {
49
+ for (const s of this.birds)
50
+ s.img.destroy(), s.shadow?.destroy();
51
+ this.birds.length = 0, this.active = 0;
52
+ }
53
+ launch(s, t, e) {
54
+ const i = this.random, [d, n] = this.options.flock;
55
+ this.active = Math.min(this.birds.length, d + Math.floor(i() * (n - d + 1)));
56
+ const c = i() < 0.5 + e * 0.3, l = 34 + i() * 18 + e * 14;
57
+ this.x = c ? t.x - 30 : t.right + 30, this.y = t.y + t.height * (0.1 + i() * 0.7), this.vx = c ? l : -l, this.vy = (i() - 0.5) * l * 0.35, this.altitude = 46 + i() * 40;
58
+ for (let a = 0; a < this.active; a++) {
59
+ const r = this.birds[a], f = m(a, this.vx, i(), i());
60
+ r.dx = f.dx, r.dy = f.dy, r.img.setVisible(!0), r.shadow?.setVisible(!0);
61
+ }
62
+ const [o, h] = this.options.everyS;
63
+ this.nextAt = s + (o + i() * (h - o)) * 1e3;
64
+ }
65
+ land() {
66
+ for (const s of this.birds)
67
+ s.img.setVisible(!1), s.shadow?.setVisible(!1);
68
+ this.active = 0;
69
+ }
70
+ }
71
+ export {
72
+ b as Birds
73
+ };
@@ -0,0 +1,43 @@
1
+ class g {
2
+ constructor(e, o) {
3
+ if (this.options = o, this.snap = o.snap ?? !0, this.random = o.random ?? Math.random, !!o.looks.length)
4
+ for (let s = 0; s < o.count; s++) {
5
+ const h = o.looks[s % o.looks.length], n = e.add.image(0, 0, h[0]).setOrigin(0.5, 1).setDepth(o.depth ?? 9e5).setVisible(!1);
6
+ this.flies.push({ img: n, look: h, homeX: 0, homeY: 0, x: 0, y: 0, tx: 0, ty: 0, retargetAt: 0, seed: this.random() * 1e3, home: !1 });
7
+ }
8
+ }
9
+ options;
10
+ flies = [];
11
+ snap;
12
+ random;
13
+ update(e, o, s, h, n = !0) {
14
+ const m = o / 1e3, i = this.random, a = n && h.night < (this.options.maxNight ?? 0.4);
15
+ for (const t of this.flies) {
16
+ const l = t.homeX < s.x - 40 || t.homeX > s.right + 40 || t.homeY < s.y - 40 || t.homeY > s.bottom + 40;
17
+ if (!a || t.home && l) {
18
+ t.home = !1, t.img.visible && t.img.setVisible(!1);
19
+ continue;
20
+ }
21
+ if (!t.home) {
22
+ if (i() > 0.02 || !this.settle(t, s)) continue;
23
+ t.img.setVisible(!0);
24
+ }
25
+ e >= t.retargetAt && (t.tx = t.homeX + (i() - 0.5) * 34 + h.wind * 6, t.ty = t.homeY - 4 - i() * 14, t.retargetAt = e + 500 + i() * 1400);
26
+ const r = Math.min(1, m * 2.4);
27
+ t.x += (t.tx - t.x) * r, t.y += (t.ty - t.y) * r;
28
+ const f = Math.floor((e + t.seed) / 90) % 3 !== 0, d = Math.sin((e + t.seed) / 160) > 0 ? 1 : 0;
29
+ t.img.setTexture(f ? t.look[0] : t.look[1]), t.img.setPosition(this.snap ? Math.round(t.x) : t.x, (this.snap ? Math.round(t.y) : t.y) - d);
30
+ }
31
+ }
32
+ destroy() {
33
+ for (const e of this.flies) e.img.destroy();
34
+ this.flies.length = 0;
35
+ }
36
+ settle(e, o) {
37
+ const s = this.options.home(o, this.random);
38
+ return s ? (e.homeX = s.x + (s.w ?? 0) / 2, e.homeY = s.y + (s.h ?? 0) / 2, e.x = e.tx = e.homeX + (this.random() - 0.5) * 16, e.y = e.ty = e.homeY - 6 - this.random() * 6, e.home = !0, !0) : !1;
39
+ }
40
+ }
41
+ export {
42
+ g as Butterflies
43
+ };
@@ -0,0 +1,50 @@
1
+ import { puffOffset as p } from "./lifeMotion.js";
2
+ class b {
3
+ constructor(n, t) {
4
+ if (this.options = t, this.snap = t.snap ?? !0, this.random = t.random ?? Math.random, !t.frames.length) return;
5
+ const h = t.puffs ?? 7;
6
+ for (const r of t.mouths) {
7
+ const o = [];
8
+ for (let f = 0; f < h; f++) {
9
+ const m = n.add.image(0, 0, t.frames[0]).setOrigin(0.5, 1).setDepth(t.depth ?? 9e5).setVisible(!1);
10
+ o.push({ img: m, born: -1, seed: this.random() });
11
+ }
12
+ this.chimneys.push({ x: Math.round(r.x), y: Math.round(r.y), puffs: o, next: 0 });
13
+ }
14
+ }
15
+ options;
16
+ chimneys = [];
17
+ snap;
18
+ random;
19
+ update(n, t, h, r = !0) {
20
+ const o = this.options, f = o.puffEveryMs ?? 650, m = o.lifeMs ?? 4600, u = { rise: o.rise ?? 7, drift: o.drift ?? 9 }, a = o.frames;
21
+ for (const e of this.chimneys) {
22
+ if (!(r && e.x > t.x - 40 && e.x < t.right + 40 && e.y > t.y - 20 && e.y < t.bottom + 120)) {
23
+ for (const s of e.puffs)
24
+ s.born >= 0 && s.img.setVisible(!1), s.born = -1;
25
+ continue;
26
+ }
27
+ if (n >= e.next) {
28
+ const s = e.puffs.find((i) => i.born < 0);
29
+ s && (s.born = n, s.seed = this.random(), s.img.setVisible(!0)), e.next = n + f * (0.7 + this.random() * 0.6);
30
+ }
31
+ for (const s of e.puffs) {
32
+ if (s.born < 0) continue;
33
+ const i = (n - s.born) / m;
34
+ if (i >= 1) {
35
+ s.born = -1, s.img.setVisible(!1);
36
+ continue;
37
+ }
38
+ const { dx: c, dy: d } = p((n - s.born) / 1e3, i, s.seed, h.wind, u);
39
+ s.img.setTexture(a[Math.min(a.length - 1, Math.floor(i * a.length))]), s.img.setPosition(this.snap ? Math.round(e.x + c) : e.x + c, this.snap ? Math.round(e.y + d) : e.y + d);
40
+ }
41
+ }
42
+ }
43
+ destroy() {
44
+ for (const n of this.chimneys) for (const t of n.puffs) t.img.destroy();
45
+ this.chimneys.length = 0;
46
+ }
47
+ }
48
+ export {
49
+ b as ChimneySmoke
50
+ };
@@ -0,0 +1,75 @@
1
+ class l {
2
+ constructor(t, e) {
3
+ if (this.options = e, this.kind = e.kind, this.snap = e.snap ?? !0, this.random = e.random ?? Math.random, !!e.looks.length)
4
+ for (let s = 0; s < e.count; s++) {
5
+ const n = e.looks[s % e.looks.length], i = t.add.image(0, 0, n[0]).setOrigin(0, 0).setDepth(e.depth ?? 9e5).setVisible(!1);
6
+ this.motes.push({ img: i, look: n, x: 0, y: 0, vx: 0, vy: 0, ground: 0, landedAt: -1, rising: !1, seed: this.random() * 1e3 });
7
+ }
8
+ }
9
+ options;
10
+ motes = [];
11
+ kind;
12
+ snap;
13
+ random;
14
+ /** `now` and `dt` in ms. */
15
+ update(t, e, s, n, i = !0) {
16
+ const d = e / 1e3;
17
+ for (let o = 0; o < this.motes.length; o++) {
18
+ const r = this.motes[o];
19
+ if (!i) {
20
+ r.img.visible && r.img.setVisible(!1), r.landedAt = -1;
21
+ continue;
22
+ }
23
+ const h = r.x < s.x - 40 || r.x > s.right + 40 || r.y < s.y - 60 || r.y > s.bottom + 30;
24
+ if (r.landedAt < 0 || h) {
25
+ if (this.random() > 0.08 || !this.spawn(r, s, n.wind, r.landedAt < 0 && this.random() < 0.5)) {
26
+ r.img.visible && r.img.setVisible(!1), r.landedAt = -1;
27
+ continue;
28
+ }
29
+ r.img.setVisible(!0);
30
+ }
31
+ this.step(r, t, d), r.img.setPosition(this.snap ? Math.round(r.x) : r.x, this.snap ? Math.round(r.y) : r.y);
32
+ }
33
+ }
34
+ destroy() {
35
+ for (const t of this.motes) t.img.destroy();
36
+ this.motes.length = 0;
37
+ }
38
+ /** `anywhere`: a first fill lands bodies all over the view, not only at its edge, so a scene opens already alive. */
39
+ spawn(t, e, s, n) {
40
+ const i = this.random;
41
+ t.landedAt = 0, t.rising = !1;
42
+ const d = this.options.from?.(e, i) ?? null;
43
+ return d ? this.spawnFrom(t, d, s) : this.options.sourceOnly ? !1 : (t.x = e.x - 20 + i() * (e.width + 30), this.kind === "ember" ? (t.y = n ? e.y + i() * e.height : e.bottom + 2, t.vx = s * 8 * i(), t.vy = -10 - i() * 12, t.ground = e.y + i() * e.height * 0.6) : this.kind === "mote" ? (t.y = e.y + i() * e.height, t.vx = (i() - 0.5) * 4, t.vy = (i() - 0.5) * 3, t.ground = 0) : (t.y = n ? e.y + i() * e.height : e.y - 6 - i() * 20, t.vx = 4 + s * 16 * (0.5 + i()), t.vy = 6 + i() * 8, t.ground = e.bottom + 10), !0);
44
+ }
45
+ spawnFrom(t, e, s) {
46
+ const n = this.random;
47
+ return t.x = e.x + n() * (e.w ?? 0), t.y = e.y + n() * (e.h ?? 0), this.kind === "ember" || this.kind === "ash" ? (t.rising = !0, t.vx = 2 + s * 10 * n(), this.kind === "ember" ? (t.vy = -10 - n() * 12, t.ground = t.y - 16 - n() * 30) : (t.vy = -3 - n() * 5, t.ground = t.y - 30 - n() * 40), !0) : (t.vx = 2 + s * 14 * (0.5 + n()), t.vy = 9 + n() * 7, t.ground = e.y + (e.h ?? 0) + 10 + n() * 22, !0);
48
+ }
49
+ step(t, e, s) {
50
+ const n = this.kind, i = t.look;
51
+ if (n === "leaf") {
52
+ if (t.landedAt > 0) {
53
+ e - t.landedAt > 1600 && (t.landedAt = -1);
54
+ return;
55
+ }
56
+ t.x += (t.vx + Math.sin(e / 260 + t.seed) * 10) * s, t.y += t.vy * s, t.img.setTexture(i[Math.floor(e / 140 + t.seed) % i.length]), t.y >= t.ground && (t.y = t.ground, t.landedAt = e, t.img.setTexture(i[0]));
57
+ return;
58
+ }
59
+ if (n === "ember") {
60
+ t.x += (t.vx + Math.sin(e / 300 + t.seed) * 4) * s, t.y += t.vy * s;
61
+ const o = t.y - t.ground, r = o < 0 ? 2 : o < 20 ? 1 : 0;
62
+ t.img.setTexture(i[Math.min(i.length - 1, r)]), o < -12 && (t.landedAt = -1);
63
+ return;
64
+ }
65
+ if (t.rising) {
66
+ t.x += (t.vx + Math.sin(e / 500 + t.seed) * 3) * s, t.y += t.vy * s, t.y < t.ground && (t.landedAt = -1);
67
+ return;
68
+ }
69
+ const d = n === "mote" ? 2 : 7;
70
+ t.x += (t.vx + Math.sin(e / 700 + t.seed) * d) * s, t.y += (t.vy + Math.cos(e / 900 + t.seed) * (n === "mote" ? 2 : 1)) * s, n !== "mote" && t.y > t.ground && (t.landedAt = -1), n === "mote" && this.random() < s / 9 && (t.landedAt = -1);
71
+ }
72
+ }
73
+ export {
74
+ l as Drift
75
+ };
@@ -0,0 +1,52 @@
1
+ import { Sprite as y, Container as p } from "pixi.js";
2
+ import { firefliesOut as x, fireflyOffset as g, fireflyGlow as b } from "./lifeMotion.js";
3
+ class Y {
4
+ constructor(s, e) {
5
+ this.stage = s, this.options = e, this.dim = s.textures.get(e.frames[0]), this.lit = s.textures.get(e.frames[1]), this.onScreen = (e.layer ?? "screen") === "screen", this.snap = e.snap ?? !0, this.random = e.random ?? Math.random, this.onScreen ? (s.screen.addChild(this.layer), s.cameras.main.follow(this.layer)) : (this.layer.zIndex = e.depth ?? 9e5, s.world.addChild(this.layer)), this.layer.visible = !1;
6
+ for (let i = 0; i < e.count; i++) {
7
+ const r = new y(this.dim);
8
+ r.anchor.set(0.5), r.visible = !1, this.layer.addChild(r), this.flies.push({ sprite: r, homeX: 0, homeY: 0, seed: this.random() * 1e4, home: !1 });
9
+ }
10
+ }
11
+ stage;
12
+ options;
13
+ layer = new p();
14
+ flies = [];
15
+ dim;
16
+ lit;
17
+ onScreen;
18
+ snap;
19
+ random;
20
+ update(s, e, i, r = !0) {
21
+ if (!this.flies.length) return;
22
+ const n = !r || i.night < 0.5;
23
+ if (this.layer.visible = !n, n) {
24
+ for (const h of this.flies) h.home = !1;
25
+ return;
26
+ }
27
+ const m = x(this.flies.length, i.night);
28
+ for (let h = 0; h < this.flies.length; h++) {
29
+ const t = this.flies[h], d = t.homeX < e.x - 30 || t.homeX > e.right + 30 || t.homeY < e.y - 30 || t.homeY > e.bottom + 30;
30
+ if (h >= m || t.home && d) {
31
+ t.home = !1, t.sprite.visible = !1;
32
+ continue;
33
+ }
34
+ if (!t.home && (this.random() > 0.05 || !this.settle(t, e))) continue;
35
+ const l = (s + t.seed) / 1e3, o = b(l);
36
+ if (t.sprite.visible = o > 0, !o) continue;
37
+ t.sprite.texture = o === 2 ? this.lit : this.dim;
38
+ const { dx: c, dy: u } = g(l), a = t.homeX + c, f = t.homeY + u;
39
+ t.sprite.position.set(this.snap ? Math.round(a) : a, this.snap ? Math.round(f) : f);
40
+ }
41
+ }
42
+ destroy() {
43
+ this.onScreen && this.stage.cameras.main.unfollow(this.layer), this.layer.destroy({ children: !0 }), this.flies.length = 0;
44
+ }
45
+ settle(s, e) {
46
+ const i = this.options.home(e, this.random);
47
+ return i ? (s.homeX = i.x + (i.w ?? 0) / 2 + (this.random() - 0.5) * 24, s.homeY = i.y + (i.h ?? 0) / 2 - 4 - this.random() * 16, s.home = !0, !0) : !1;
48
+ }
49
+ }
50
+ export {
51
+ Y as Fireflies
52
+ };
@@ -0,0 +1,49 @@
1
+ function i(t, n, r = 0) {
2
+ return t.x + (t.w ?? 0) >= n.x - r && t.x <= n.right + r && t.y + (t.h ?? 0) >= n.y - r && t.y <= n.bottom + r;
3
+ }
4
+ function e(t, n, r, f = 8) {
5
+ if (!t.length) return null;
6
+ for (let o = 0; o < f; o++) {
7
+ const u = t[Math.floor(r() * t.length)];
8
+ if (i(u, n)) return u;
9
+ }
10
+ return null;
11
+ }
12
+ function c(t, n = 8) {
13
+ return (r, f) => e(t, r, f, n);
14
+ }
15
+ function l(t, n, r = 110) {
16
+ const f = Math.floor((t + n) / r) % 8;
17
+ return f < 5 ? f % 2 : 0;
18
+ }
19
+ function h(t, n, r, f) {
20
+ const o = Math.ceil(t / 2), u = t % 2 ? 1 : -1;
21
+ return { dx: -Math.sign(n) * o * (6 + r * 3), dy: u * o * (4 + f * 2) };
22
+ }
23
+ function s(t) {
24
+ const n = (t * 0.45 % 1 + 1) % 1;
25
+ return n < 0.18 ? 2 : n < 0.26 || n > 0.94 ? 1 : 0;
26
+ }
27
+ function M(t) {
28
+ return { dx: Math.sin(t * 0.7) * 9 + Math.sin(t * 1.9) * 3, dy: Math.cos(t * 0.5) * 5 };
29
+ }
30
+ function a(t, n) {
31
+ return n < 0.5 ? 0 : Math.round(t * Math.min(1, (n - 0.5) / 0.35));
32
+ }
33
+ function d(t, n, r, f, o) {
34
+ return {
35
+ dx: (r - 0.5) * 2 + o.drift * (0.25 + f) * t * n * 2 + Math.sin(t * 1.3 + r * 6) * 1.2,
36
+ dy: -o.rise * t * (1 - n * 0.25)
37
+ };
38
+ }
39
+ export {
40
+ l as birdFrame,
41
+ i as boxInView,
42
+ a as firefliesOut,
43
+ s as fireflyGlow,
44
+ M as fireflyOffset,
45
+ h as flockSlot,
46
+ e as pickInView,
47
+ d as puffOffset,
48
+ c as sourceOf
49
+ };