@diffenderfer-games/hub 2.0.0-next.1 → 2.0.0-next.10

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 (245) hide show
  1. package/CHANGELOG.md +160 -6
  2. package/README.md +27 -15
  3. package/dist/auto.d.ts +8 -8
  4. package/dist/auto.js +3 -3
  5. package/dist/avatar-pixi.d.ts +165 -0
  6. package/dist/avatar-pixi.d.ts.map +1 -0
  7. package/dist/avatar-pixi.js +299 -0
  8. package/dist/avatar-pixi.js.map +1 -0
  9. package/dist/avatar-svg.d.ts +4 -0
  10. package/dist/avatar-svg.js +5 -0
  11. package/dist/avatar-three.d.ts +69 -0
  12. package/dist/avatar-three.d.ts.map +1 -0
  13. package/dist/avatar-three.js +49 -0
  14. package/dist/avatar-three.js.map +1 -0
  15. package/dist/avatar.d.ts +7 -0
  16. package/dist/avatar.js +500 -0
  17. package/dist/avatar.js.map +1 -0
  18. package/dist/daily.d.ts +2 -2
  19. package/dist/doctor/cli.mjs +71 -10
  20. package/dist/doctor/cli.mjs.map +1 -1
  21. package/dist/index.d.ts +8 -8
  22. package/dist/index.js +3 -3
  23. package/dist/input.d.ts +2 -2
  24. package/dist/input.js +2 -2
  25. package/dist/mp.d.ts +3 -3
  26. package/dist/race.d.ts +1 -1
  27. package/dist/rooms.d.ts +3 -3
  28. package/dist/rooms.js +1 -1
  29. package/dist/shared/animator.d.ts +104 -0
  30. package/dist/shared/animator.d.ts.map +1 -0
  31. package/dist/shared/art.js +1946 -0
  32. package/dist/shared/art.js.map +1 -0
  33. package/dist/shared/atlas.d.ts +138 -0
  34. package/dist/shared/atlas.d.ts.map +1 -0
  35. package/dist/shared/avatar.d.ts +123 -0
  36. package/dist/shared/avatar.d.ts.map +1 -0
  37. package/dist/shared/bridge.js +18 -4
  38. package/dist/shared/bridge.js.map +1 -1
  39. package/dist/shared/client-version.gen.js +1 -1
  40. package/dist/shared/daily.d.ts +145 -19
  41. package/dist/shared/daily.d.ts.map +1 -1
  42. package/dist/shared/daily.js +138 -25
  43. package/dist/shared/daily.js.map +1 -1
  44. package/dist/shared/defineProperty.js +39 -0
  45. package/dist/shared/describe.d.ts +32 -0
  46. package/dist/shared/describe.d.ts.map +1 -0
  47. package/dist/shared/describe.js +109 -0
  48. package/dist/shared/describe.js.map +1 -0
  49. package/dist/shared/globals.js +1 -39
  50. package/dist/shared/globals.js.map +1 -1
  51. package/dist/shared/index.d.ts +1122 -46
  52. package/dist/shared/index.d.ts.map +1 -1
  53. package/dist/shared/input.d.ts +74 -14
  54. package/dist/shared/input.d.ts.map +1 -1
  55. package/dist/shared/input.js +179 -25
  56. package/dist/shared/input.js.map +1 -1
  57. package/dist/shared/json-guards.js +48 -0
  58. package/dist/shared/json-guards.js.map +1 -0
  59. package/dist/shared/latest-state.js +1 -1
  60. package/dist/shared/live-canvas.js +62 -0
  61. package/dist/shared/live-canvas.js.map +1 -0
  62. package/dist/shared/mp.js +10 -2
  63. package/dist/shared/mp.js.map +1 -1
  64. package/dist/shared/multiplayer-types.d.ts +15 -2
  65. package/dist/shared/multiplayer-types.d.ts.map +1 -1
  66. package/dist/shared/overlays.js +800 -0
  67. package/dist/shared/overlays.js.map +1 -0
  68. package/dist/shared/page-stack.js +2 -1
  69. package/dist/shared/page-stack.js.map +1 -1
  70. package/dist/shared/pose-key.js +249 -0
  71. package/dist/shared/pose-key.js.map +1 -0
  72. package/dist/shared/race-types.d.ts +1 -1
  73. package/dist/shared/race.js +1 -1
  74. package/dist/shared/room-types.d.ts +28 -3
  75. package/dist/shared/room-types.d.ts.map +1 -1
  76. package/dist/shared/rooms.d.ts.map +1 -1
  77. package/dist/shared/rooms.js +23 -4
  78. package/dist/shared/rooms.js.map +1 -1
  79. package/dist/shared/runtime-opener.js +1 -1
  80. package/dist/shared/scene.d.ts +90 -0
  81. package/dist/shared/scene.d.ts.map +1 -0
  82. package/dist/shared/social.d.ts +90 -9
  83. package/dist/shared/social.d.ts.map +1 -1
  84. package/dist/shared/social.js +6 -1
  85. package/dist/shared/social.js.map +1 -1
  86. package/dist/shared/src.js +4563 -667
  87. package/dist/shared/src.js.map +1 -1
  88. package/dist/shared/svg-markup.js +2354 -0
  89. package/dist/shared/svg-markup.js.map +1 -0
  90. package/dist/shared/svg.js +27 -0
  91. package/dist/shared/svg.js.map +1 -0
  92. package/dist/shared/types.d.ts +174 -0
  93. package/dist/shared/types.d.ts.map +1 -0
  94. package/dist/shared/wire-types.d.ts +6 -2
  95. package/dist/shared/wire-types.d.ts.map +1 -1
  96. package/dist/social.d.ts +5 -5
  97. package/dist/social.js +2 -2
  98. package/dist/turns-rules.d.ts +2 -0
  99. package/dist/turns-rules.js +1 -0
  100. package/dist/turns.d.ts +61 -0
  101. package/dist/turns.d.ts.map +1 -0
  102. package/dist/turns.js +183 -0
  103. package/dist/turns.js.map +1 -0
  104. package/package.json +39 -3
  105. package/src/avatar/adapters/pixi-avatar.ts +73 -0
  106. package/src/avatar/adapters/pixi-crowd.ts +329 -0
  107. package/src/avatar/adapters/pixi-types.ts +84 -0
  108. package/src/avatar/adapters/three.ts +126 -0
  109. package/src/avatar/animator/animator.ts +285 -0
  110. package/src/avatar/animator/reactions.ts +44 -0
  111. package/src/avatar/animator/schedule.ts +73 -0
  112. package/src/avatar/art/beard.ts +49 -0
  113. package/src/avatar/art/glasses.ts +67 -0
  114. package/src/avatar/art/hair.ts +254 -0
  115. package/src/avatar/art/headwear.ts +75 -0
  116. package/src/avatar/art/index.ts +21 -0
  117. package/src/avatar/art/shape.ts +87 -0
  118. package/src/avatar/art-store.ts +36 -0
  119. package/src/avatar/atlas.ts +246 -0
  120. package/src/avatar/catalog-view.ts +14 -0
  121. package/src/avatar/colour.ts +109 -0
  122. package/src/avatar/describe.ts +79 -0
  123. package/src/avatar/face.ts +187 -0
  124. package/src/avatar/geom.ts +173 -0
  125. package/src/avatar/layout.ts +47 -0
  126. package/src/avatar/look-like.ts +52 -0
  127. package/src/avatar/outputs/bitmap.ts +75 -0
  128. package/src/avatar/outputs/canvas-paint.ts +177 -0
  129. package/src/avatar/outputs/canvas.ts +62 -0
  130. package/src/avatar/outputs/custom-element.ts +140 -0
  131. package/src/avatar/outputs/element.ts +58 -0
  132. package/src/avatar/outputs/live-canvas.ts +57 -0
  133. package/src/avatar/outputs/overlay-svg.ts +22 -0
  134. package/src/avatar/outputs/pose-key.ts +30 -0
  135. package/src/avatar/outputs/svg-markup.ts +113 -0
  136. package/src/avatar/outputs/svg.ts +41 -0
  137. package/src/avatar/overlays.ts +128 -0
  138. package/src/avatar/render/body.ts +116 -0
  139. package/src/avatar/render/colours.ts +81 -0
  140. package/src/avatar/render/compose.ts +320 -0
  141. package/src/avatar/render/context.ts +117 -0
  142. package/src/avatar/render/eyes.ts +78 -0
  143. package/src/avatar/render/eyewear.ts +118 -0
  144. package/src/avatar/render/frame.ts +73 -0
  145. package/src/avatar/render/head.ts +81 -0
  146. package/src/avatar/render/mouth.ts +86 -0
  147. package/src/avatar/render/props.ts +91 -0
  148. package/src/avatar/render/types.ts +93 -0
  149. package/src/avatar/render/walker-parts.ts +121 -0
  150. package/src/avatar/render/walker.ts +199 -0
  151. package/src/avatar/scene.ts +119 -0
  152. package/src/avatar-pixi.ts +20 -0
  153. package/src/avatar-svg.ts +21 -0
  154. package/src/avatar-three.ts +18 -0
  155. package/src/avatar.ts +63 -0
  156. package/src/core/avatar/avatar-cache.ts +95 -0
  157. package/src/core/avatar/avatar-ref.ts +34 -0
  158. package/src/core/avatar/avatar-types.ts +43 -0
  159. package/src/core/avatar/hub-avatar.ts +308 -0
  160. package/src/core/connection.ts +201 -92
  161. package/src/core/errors.ts +15 -2
  162. package/src/core/game-data.ts +11 -9
  163. package/src/core/hub-economy.ts +47 -10
  164. package/src/core/hub-progress.ts +94 -30
  165. package/src/core/hub.ts +228 -7
  166. package/src/core/offline/cloud-saves.ts +62 -0
  167. package/src/core/offline/hub-kinds/avatar-kind.ts +42 -0
  168. package/src/core/offline/hub-kinds/daily-kind.ts +68 -0
  169. package/src/core/offline/hub-kinds/economy-kinds.ts +86 -0
  170. package/src/core/offline/hub-kinds/game-fields.ts +2 -0
  171. package/src/core/offline/hub-kinds/index.ts +52 -0
  172. package/src/core/offline/hub-kinds/legacy-ops.ts +37 -0
  173. package/src/core/offline/hub-kinds/progress-kinds.ts +165 -0
  174. package/src/core/offline/hub-kinds/resume-kind.ts +108 -0
  175. package/src/core/offline/hub-kinds/saved-kind.ts +93 -0
  176. package/src/core/offline/kind-adapters.ts +48 -0
  177. package/src/core/offline/local-inventory.ts +64 -0
  178. package/src/core/offline/local-store.ts +66 -23
  179. package/src/core/offline/offline-api.ts +65 -0
  180. package/src/core/offline/outbox-entry.ts +59 -0
  181. package/src/core/offline/outbox-kinds.ts +78 -0
  182. package/src/core/offline/outbox-merge.ts +39 -0
  183. package/src/core/offline/outbox-replayer.ts +141 -0
  184. package/src/core/offline/outbox-store.ts +85 -0
  185. package/src/core/offline/outbox.ts +232 -0
  186. package/src/core/offline/queue.ts +4 -49
  187. package/src/core/offline/replay-lease.ts +87 -0
  188. package/src/core/offline/replay-policy.ts +52 -0
  189. package/src/core/page-account.ts +121 -0
  190. package/src/core/page.ts +14 -1
  191. package/src/core/rest/rest-client.ts +14 -3
  192. package/src/core/rest/routes.gen.ts +144 -88
  193. package/src/core/resume/hub-resume.ts +286 -0
  194. package/src/core/resume/local-resume.ts +130 -0
  195. package/src/core/resume/resume-list.ts +65 -0
  196. package/src/core/resume/resume-request.ts +52 -0
  197. package/src/core/resume/resume-types.ts +64 -0
  198. package/src/core/saved/daily-saves.ts +196 -0
  199. package/src/core/saved/daily-seed.ts +16 -0
  200. package/src/core/saved/hub-saved.ts +221 -0
  201. package/src/core/saved/local-saved.ts +122 -0
  202. package/src/core/saved/saved-list.ts +129 -0
  203. package/src/core/saved/saved-open.ts +104 -0
  204. package/src/core/saved/saved-order.ts +49 -0
  205. package/src/core/saved/saved-types.ts +24 -0
  206. package/src/core/storage/json-guards.ts +6 -0
  207. package/src/core/turns/hub-turns.ts +161 -0
  208. package/src/core/turns/turn-game.ts +510 -0
  209. package/src/core/turns/your-turn-buzz.ts +69 -0
  210. package/src/core/version/client-version.gen.ts +2 -2
  211. package/src/daily/daily-system.ts +127 -12
  212. package/src/daily/page-daily.ts +2 -2
  213. package/src/daily/types.ts +49 -11
  214. package/src/doctor/checks.ts +12 -4
  215. package/src/doctor/cli.ts +5 -2
  216. package/src/doctor/hub-version-fetch.ts +43 -43
  217. package/src/doctor/world-check.ts +61 -0
  218. package/src/index.ts +20 -2
  219. package/src/input/focus-ring.ts +13 -0
  220. package/src/input/input-registry.ts +9 -2
  221. package/src/input/input-system.ts +14 -1
  222. package/src/input/modality.ts +122 -0
  223. package/src/input/nav-state.ts +13 -4
  224. package/src/input/navigator.ts +11 -0
  225. package/src/input/zero-config.ts +1 -14
  226. package/src/input.ts +4 -0
  227. package/src/mp.ts +1 -1
  228. package/src/overlay/overlay.ts +30 -4
  229. package/src/overlay/styles.ts +4 -3
  230. package/src/realtime/bridge.ts +5 -0
  231. package/src/realtime/multiplayer-forwarder.ts +13 -1
  232. package/src/realtime/multiplayer-types.ts +15 -1
  233. package/src/realtime/room-types.ts +28 -2
  234. package/src/realtime/rooms-forwarder.ts +27 -2
  235. package/src/realtime/runtime-api.ts +33 -8
  236. package/src/realtime/social-forwarder.ts +5 -0
  237. package/src/realtime/social-types.ts +8 -0
  238. package/src/realtime/types.ts +1 -0
  239. package/src/realtime/wire-types.ts +7 -0
  240. package/src/realtime/world-types.ts +20 -0
  241. package/src/rooms.ts +1 -1
  242. package/src/social.ts +1 -0
  243. package/src/turns-kit/check-rules.ts +281 -0
  244. package/src/turns-rules.ts +12 -0
  245. package/src/turns.ts +14 -0
package/dist/avatar.js ADDED
@@ -0,0 +1,500 @@
1
+ import { t as _defineProperty } from "./shared/defineProperty.js";
2
+ import { F as lightness, I as toCode, L as toLook, N as contrast, P as deltaE, S as WALKER_FULL, a as composeAvatar, b as onArtReady, d as n, g as expressionFromEmote, h as EXPRESSION_NAMES, i as HEAD_Y, m as EXPRESSIONS, o as WALKER_HEAD_SCALE, r as sceneToSvg, s as WALKER_SEAT_DROP, v as isExpression, x as ready, y as mix } from "./shared/svg-markup.js";
3
+ import { a as paintNodes, i as renderCanvasAt, n as defaultLayer, r as renderCanvas, t as renderKey } from "./shared/pose-key.js";
4
+ import { n as renderSvg, t as nextPrefix } from "./shared/svg.js";
5
+ import { a as Animator, i as lookToward, l as renderBitmap, n as facingFrom, o as animator, r as layout, s as REACTIONS, t as overlays, u as renderDataUrl } from "./shared/overlays.js";
6
+ import { n as describe, t as avatarEmoji } from "./shared/describe.js";
7
+ import { ACCESSORY_SLOTS, CATALOG, CATALOG_REVISION, CATALOG_REVISION as CATALOG_REVISION$1, DEFAULT_GEN, FRAME_PRESETS, LOOK_CODE_PREFIX, PALETTES, PALETTES as PALETTES$1, SECOND_COLOUR_CODE, canonicalLook, decodeLook, defaultLook, distinctLooks, encodeLook, isLookCode, isTinted, isValidLook, lookProblem, normaliseHex, partById, partName, partsOf, partsOf as partsOf$1, randomLook, resolveColour, sameLook, seededRng } from "@diffenderfer-games/hub-contract/avatar";
8
+ //#region src/avatar/outputs/element.ts
9
+ /**
10
+ * `render.element`: a live DOM avatar. `update(pose)` re-renders only when
11
+ * the quantised pose changes, which is cheap enough for a dozen avatars at
12
+ * 30 fps in DOM games.
13
+ */
14
+ /** A live avatar element; it upgrades itself from the silhouette when the art loads. */
15
+ function renderElement(like, opts = {}, doc = document) {
16
+ const el = doc.createElement("span");
17
+ el.className = "dg-avatar";
18
+ el.style.display = "inline-block";
19
+ el.style.lineHeight = "0";
20
+ let look = like;
21
+ let options = opts;
22
+ let key = "";
23
+ const draw = (isForced = false) => {
24
+ const next = renderKey(toCode(look), options);
25
+ if (!isForced && next === key) return;
26
+ key = next;
27
+ el.innerHTML = renderSvg(look, options);
28
+ };
29
+ draw(true);
30
+ onArtReady(() => {
31
+ draw(true);
32
+ });
33
+ return {
34
+ el,
35
+ update(pose) {
36
+ options = {
37
+ ...options,
38
+ pose
39
+ };
40
+ draw();
41
+ },
42
+ setLook(next) {
43
+ look = next;
44
+ draw(true);
45
+ },
46
+ setOptions(next) {
47
+ options = {
48
+ ...next,
49
+ ...options.pose ? { pose: options.pose } : {}
50
+ };
51
+ draw(true);
52
+ }
53
+ };
54
+ }
55
+ //#endregion
56
+ //#region src/avatar/outputs/custom-element.ts
57
+ /**
58
+ * `<dg-avatar>` (§3.8), registered by `defineAvatarElement()` (never as a
59
+ * side effect of importing). For DOM and React games and static pages:
60
+ *
61
+ * ```html
62
+ * <dg-avatar look="AV1…" size="48" expression="happy" look-x="-1" animate title="Sam's avatar"></dg-avatar>
63
+ * ```
64
+ *
65
+ * With `animate` it runs its own animator (blinks, idle motion) at up to
66
+ * 30 fps while visible; its `animator` property gives full control.
67
+ */
68
+ const FACINGS = [
69
+ "S",
70
+ "SE",
71
+ "E",
72
+ "NE",
73
+ "N",
74
+ "NW",
75
+ "W",
76
+ "SW"
77
+ ];
78
+ const FRAMES = [
79
+ "head",
80
+ "bust",
81
+ "full"
82
+ ];
83
+ const BODIES = [
84
+ "idle",
85
+ "walk",
86
+ "run",
87
+ "sit",
88
+ "play",
89
+ "wave",
90
+ "cheer",
91
+ "jump",
92
+ "dance",
93
+ "away"
94
+ ];
95
+ const STATUSES = [
96
+ "goggles",
97
+ "headset",
98
+ "cards",
99
+ "controller",
100
+ "trophy",
101
+ "crown",
102
+ "book"
103
+ ];
104
+ const FRAME_MS = 1e3 / 30;
105
+ /** The list member equal to `value`, if any (attribute values are untrusted). */
106
+ const oneOf = (list, value) => list.find((item) => item === value);
107
+ const toNumber = (value) => {
108
+ const parsed = value === null ? NaN : Number(value);
109
+ return Number.isFinite(parsed) ? parsed : void 0;
110
+ };
111
+ /** The attributes `<dg-avatar>` watches. */
112
+ const AVATAR_ATTRIBUTES = [
113
+ "look",
114
+ "size",
115
+ "frame",
116
+ "facing",
117
+ "expression",
118
+ "look-x",
119
+ "look-y",
120
+ "animate",
121
+ "title",
122
+ "background",
123
+ "body",
124
+ "status"
125
+ ];
126
+ /**
127
+ * Registers `<dg-avatar>` (or another tag). Safe to call more than once;
128
+ * a no-op outside a browser.
129
+ */
130
+ function defineAvatarElement(tag = "dg-avatar") {
131
+ if (typeof customElements === "undefined" || customElements.get(tag)) return;
132
+ class DgAvatar extends HTMLElement {
133
+ constructor(..._args) {
134
+ super(..._args);
135
+ _defineProperty(this, "view", null);
136
+ _defineProperty(this, "anim", null);
137
+ _defineProperty(this, "raf", 0);
138
+ _defineProperty(this, "last", 0);
139
+ _defineProperty(this, "base", "neutral");
140
+ }
141
+ /** The animator driving this element (created on first use). */
142
+ get animator() {
143
+ this.anim ?? (this.anim = animator(this.getAttribute("look") ?? "", { seed: this.getAttribute("look") ?? "dg" }));
144
+ return this.anim;
145
+ }
146
+ options() {
147
+ const background = this.getAttribute("background");
148
+ const frame = oneOf(FRAMES, this.getAttribute("frame"));
149
+ const facing = oneOf(FACINGS, this.getAttribute("facing"));
150
+ const title = this.getAttribute("title");
151
+ return {
152
+ size: toNumber(this.getAttribute("size")) ?? 48,
153
+ ...frame ? { frame } : {},
154
+ ...facing ? { facing } : {},
155
+ ...title ? { title } : {},
156
+ ...background === "none" || background === "badge" ? { background } : background?.startsWith("#") ? { background: `#${background.slice(1)}` } : {}
157
+ };
158
+ }
159
+ stillPose() {
160
+ const expression = this.getAttribute("expression") ?? "";
161
+ const body = oneOf(BODIES, this.getAttribute("body"));
162
+ const status = oneOf(STATUSES, this.getAttribute("status"));
163
+ return {
164
+ ...isExpression(expression) ? { expression } : {},
165
+ look: {
166
+ x: toNumber(this.getAttribute("look-x")) ?? 0,
167
+ y: toNumber(this.getAttribute("look-y")) ?? 0
168
+ },
169
+ ...body ? { body } : {},
170
+ ...status ? { status } : {}
171
+ };
172
+ }
173
+ connectedCallback() {
174
+ var _this$style, _this$style2;
175
+ (_this$style = this.style).display || (_this$style.display = "inline-block");
176
+ (_this$style2 = this.style).lineHeight || (_this$style2.lineHeight = "0");
177
+ this.view = renderElement(this.getAttribute("look") ?? "", this.options(), this.ownerDocument);
178
+ this.replaceChildren(this.view.el);
179
+ this.view.update(this.stillPose());
180
+ ready();
181
+ this.loop();
182
+ }
183
+ disconnectedCallback() {
184
+ cancelAnimationFrame(this.raf);
185
+ this.raf = 0;
186
+ }
187
+ attributeChangedCallback(name) {
188
+ if (!this.view) return;
189
+ if (name === "look") {
190
+ const look = this.getAttribute("look") ?? "";
191
+ this.view.setLook(look);
192
+ this.anim?.setLook(look);
193
+ } else this.view.setOptions(this.options());
194
+ this.view.update(this.stillPose());
195
+ this.loop();
196
+ }
197
+ loop() {
198
+ if (!this.hasAttribute("animate") || this.raf !== 0 || !this.isConnected) return;
199
+ const tick = (t) => {
200
+ this.raf = 0;
201
+ if (!this.isConnected || !this.hasAttribute("animate")) return;
202
+ if (t - this.last >= FRAME_MS) {
203
+ this.last = t;
204
+ const expression = this.getAttribute("expression") ?? "neutral";
205
+ if (expression !== this.base && isExpression(expression)) {
206
+ this.base = expression;
207
+ this.animator.setBase(expression, { at: t });
208
+ }
209
+ const still = this.stillPose();
210
+ this.view?.update({
211
+ ...this.animator.pose(t),
212
+ ...still.body ? { body: still.body } : {},
213
+ ...still.status ? { status: still.status } : {}
214
+ });
215
+ }
216
+ this.raf = requestAnimationFrame(tick);
217
+ };
218
+ this.raf = requestAnimationFrame(tick);
219
+ }
220
+ }
221
+ _defineProperty(DgAvatar, "observedAttributes", AVATAR_ATTRIBUTES);
222
+ customElements.define(tag, DgAvatar);
223
+ }
224
+ //#endregion
225
+ //#region src/avatar/outputs/overlay-svg.ts
226
+ /** An overlay as a standalone `<svg>` (for DOM surfaces) or painted on a canvas at its anchor. */
227
+ /** The overlay as an `<svg>` of its own size (decorative). */
228
+ function overlaySvg(overlay, scale = 1) {
229
+ const [left, top, w, h] = overlay.box;
230
+ const { body, defs } = sceneToSvg(overlay.nodes, nextPrefix({}));
231
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${n(left)} ${n(top)} ${n(w)} ${n(h)}" width="${n(w * scale)}" height="${n(h * scale)}" aria-hidden="true">${defs ? `<defs>${defs}</defs>` : ""}${body}</svg>`;
232
+ }
233
+ /** Paints an overlay with its anchor at (x, y). */
234
+ function paintOverlay(ctx, overlay, atX, atY, scale = 1) {
235
+ ctx.save();
236
+ ctx.translate(atX, atY);
237
+ ctx.scale(scale, scale);
238
+ paintNodes(ctx, overlay.nodes);
239
+ ctx.restore();
240
+ }
241
+ //#endregion
242
+ //#region src/avatar/catalog-view.ts
243
+ /** The catalog as the designer and games see it: parts per category, palettes and the revision. */
244
+ /** The catalog view. */
245
+ const catalog = {
246
+ /** The parts of a category in designer order (retired parts hidden). */
247
+ parts(category) {
248
+ return partsOf$1(category);
249
+ },
250
+ /** Every colour palette. */
251
+ palettes: PALETTES$1,
252
+ /** The catalog revision this build knows. */
253
+ revision: CATALOG_REVISION$1
254
+ };
255
+ //#endregion
256
+ //#region src/avatar/atlas.ts
257
+ const MIRRORED = {
258
+ W: "E",
259
+ SW: "SE",
260
+ NW: "NE"
261
+ };
262
+ const STEPS = {
263
+ walk: 8,
264
+ run: 8,
265
+ idle: 4,
266
+ dance: 8,
267
+ jump: 6,
268
+ cheer: 6
269
+ };
270
+ /** The rig box every frame bakes: wide enough for hats, props and the rim. */
271
+ const BOX = {
272
+ x: -90,
273
+ y: -210,
274
+ w: 180,
275
+ h: 226
276
+ };
277
+ /** The walker's box: its full frame plus a margin for the rim. */
278
+ const WALKER_BOX = {
279
+ x: WALKER_FULL[0] + 4,
280
+ y: WALKER_FULL[1] - 2,
281
+ w: WALKER_FULL[2] - 8,
282
+ h: WALKER_FULL[3] + 2
283
+ };
284
+ /** The atlas. */
285
+ var AvatarAtlas = class {
286
+ constructor(opts = {}) {
287
+ _defineProperty(this, "pageSize", void 0);
288
+ _defineProperty(this, "scale", void 0);
289
+ _defineProperty(this, "maxPages", void 0);
290
+ _defineProperty(this, "rim", void 0);
291
+ _defineProperty(this, "figure", void 0);
292
+ _defineProperty(this, "box", void 0);
293
+ _defineProperty(this, "makeCanvas", void 0);
294
+ _defineProperty(this, "pages", []);
295
+ _defineProperty(this, "frames", /* @__PURE__ */ new Map());
296
+ _defineProperty(this, "queue", /* @__PURE__ */ new Map());
297
+ _defineProperty(this, "latestByLook", /* @__PURE__ */ new Map());
298
+ _defineProperty(this, "clock", 0);
299
+ this.pageSize = opts.pageSize ?? 2048;
300
+ this.maxPages = opts.maxPages ?? 4;
301
+ this.scale = opts.scale ?? .32;
302
+ this.rim = opts.rim ?? true;
303
+ this.figure = opts.figure ?? "blob";
304
+ this.box = this.figure === "walker" ? WALKER_BOX : BOX;
305
+ this.makeCanvas = opts.makeCanvas ?? ((size) => defaultLayer(size, size));
306
+ }
307
+ /** The frame for a key: the baked frame, or `null` (queued for {@link bake}). */
308
+ frame(key) {
309
+ const id = this.keyOf(key);
310
+ const isMirror = MIRRORED[key.facing ?? "S"] !== void 0;
311
+ const hit = this.live(id);
312
+ if (hit) return {
313
+ ...hit,
314
+ mirror: isMirror
315
+ };
316
+ this.queue.set(id, key);
317
+ const standIn = this.live(this.latestByLook.get(toCode(key.look)) ?? "");
318
+ return standIn ? {
319
+ ...standIn,
320
+ mirror: isMirror
321
+ } : null;
322
+ }
323
+ /** A baked frame whose page still holds it (touching the page for the LRU). */
324
+ live(id) {
325
+ const hit = this.frames.get(id);
326
+ const page = hit ? this.pages[hit.page] : void 0;
327
+ if (!hit || page?.version !== hit.version) return;
328
+ page.used = this.clock += 1;
329
+ return hit;
330
+ }
331
+ /** Bakes queued frames for up to `budgetMs` (default 4 ms), oldest first. Returns how many were baked. */
332
+ bake(budgetMs = 4, now = () => typeof performance === "undefined" ? Date.now() : performance.now()) {
333
+ const start = now();
334
+ let baked = 0;
335
+ for (const [id, key] of this.queue) {
336
+ if (baked > 0 && now() - start > budgetMs) break;
337
+ this.queue.delete(id);
338
+ if (this.bakeOne(id, key)) baked += 1;
339
+ }
340
+ return baked;
341
+ }
342
+ /** Frames still waiting to bake. */
343
+ get pending() {
344
+ return this.queue.size;
345
+ }
346
+ /** Every page's image (for texture uploads). */
347
+ get sources() {
348
+ return this.pages.map((p) => p.canvas);
349
+ }
350
+ keyOf(key) {
351
+ const facing = MIRRORED[key.facing ?? "S"] ?? key.facing ?? "S";
352
+ const body = key.body ?? "idle";
353
+ const steps = STEPS[body] ?? 1;
354
+ const step = Math.floor((key.phase ?? 0) % 1 * steps);
355
+ return [
356
+ toCode(key.look),
357
+ facing,
358
+ body,
359
+ String(step),
360
+ key.face ?? "neutral",
361
+ key.status ?? "",
362
+ String(key.scale ?? this.scale)
363
+ ].join("~");
364
+ }
365
+ place(w, h) {
366
+ for (let i = 0; i < this.pages.length; i += 1) {
367
+ const p = this.pages[i];
368
+ if (!p) continue;
369
+ if (p.shelfX + w > this.pageSize) {
370
+ p.shelfY += p.shelfH;
371
+ p.shelfX = 0;
372
+ p.shelfH = 0;
373
+ }
374
+ if (p.shelfY + h <= this.pageSize) {
375
+ const spot = {
376
+ page: i,
377
+ x: p.shelfX,
378
+ y: p.shelfY
379
+ };
380
+ p.shelfX += w;
381
+ p.shelfH = Math.max(p.shelfH, h);
382
+ return spot;
383
+ }
384
+ }
385
+ if (this.pages.length < this.maxPages) {
386
+ const made = this.makeCanvas(this.pageSize);
387
+ if (!made) return null;
388
+ this.pages.push({
389
+ canvas: made.canvas,
390
+ ctx: made.ctx,
391
+ shelfX: 0,
392
+ shelfY: 0,
393
+ shelfH: 0,
394
+ used: 0,
395
+ version: 1
396
+ });
397
+ return this.place(w, h);
398
+ }
399
+ let oldest = 0;
400
+ this.pages.forEach((p, i) => {
401
+ if (p.used < (this.pages[oldest]?.used ?? Infinity)) oldest = i;
402
+ });
403
+ const page = this.pages[oldest];
404
+ if (!page) return null;
405
+ page.ctx.clearRect(0, 0, this.pageSize, this.pageSize);
406
+ page.version += 1;
407
+ page.shelfX = 0;
408
+ page.shelfY = 0;
409
+ page.shelfH = 0;
410
+ return this.place(w, h);
411
+ }
412
+ bakeOne(id, key) {
413
+ const scale = key.scale ?? this.scale;
414
+ const box = this.box;
415
+ const w = Math.ceil(box.w * scale) + 2;
416
+ const h = Math.ceil(box.h * scale) + 2;
417
+ const spot = this.place(w, h);
418
+ const page = spot ? this.pages[spot.page] : void 0;
419
+ if (!spot || !page) return false;
420
+ const facing = MIRRORED[key.facing ?? "S"] ?? key.facing ?? "S";
421
+ const body = key.body ?? "idle";
422
+ const steps = STEPS[body] ?? 1;
423
+ const phase = (Math.floor((key.phase ?? 0) % 1 * steps) + .5) / steps;
424
+ const face = key.face ?? "neutral";
425
+ const { nodes } = composeAvatar(toLook(key.look), {
426
+ frame: "full",
427
+ figure: this.figure,
428
+ facing,
429
+ rim: this.rim,
430
+ shadow: false,
431
+ pose: {
432
+ expression: face,
433
+ body,
434
+ phase,
435
+ status: key.status ?? null
436
+ }
437
+ });
438
+ const scratch = defaultLayer(w, h);
439
+ if (!scratch) return false;
440
+ scratch.ctx.translate(1 - box.x * scale, 1 - box.y * scale);
441
+ scratch.ctx.scale(scale, scale);
442
+ paintNodes(scratch.ctx, nodes, defaultLayer);
443
+ page.ctx.clearRect(spot.x, spot.y, w, h);
444
+ page.ctx.drawImage(scratch.canvas, spot.x, spot.y);
445
+ page.used = this.clock += 1;
446
+ this.latestByLook.set(toCode(key.look), id);
447
+ this.frames.set(id, {
448
+ page: spot.page,
449
+ source: page.canvas,
450
+ x: spot.x,
451
+ y: spot.y,
452
+ w,
453
+ h,
454
+ footX: 1 - box.x * scale,
455
+ footY: 1 - box.y * scale,
456
+ mirror: false,
457
+ version: page.version
458
+ });
459
+ return true;
460
+ }
461
+ };
462
+ /** A new atlas (one per scene; pages are shared by every avatar in it). */
463
+ function createAtlas(opts = {}) {
464
+ return new AvatarAtlas(opts);
465
+ }
466
+ //#endregion
467
+ //#region src/avatar.ts
468
+ /**
469
+ * `@diffenderfer-games/hub/avatar`: draw players' avatars in any game.
470
+ *
471
+ * ```ts
472
+ * import { ready, render, animator } from '@diffenderfer-games/hub/avatar';
473
+ *
474
+ * await ready(); // loads the art once
475
+ * el.innerHTML = render.svg(seat.look, { size: 48 });
476
+ * const anim = animator(seat.look, { seed: seat.userId });
477
+ * anim.express('happy');
478
+ * render.canvas(ctx, seat.look, { x, y, size: 64, pose: anim.pose(now) });
479
+ * ```
480
+ *
481
+ * The art loads lazily (`ready()`); before it does, renders draw the
482
+ * silhouette. Zero dependencies; the Pixi and three.js adapters take the
483
+ * library as an argument (`/avatar/pixi`, `/avatar/three`). Docs: "Avatars"
484
+ * in docs/hub.md.
485
+ *
486
+ * @packageDocumentation
487
+ */
488
+ /** Every output: SVG markup, a live element, Canvas 2D, a bitmap or a data URL. */
489
+ const render = {
490
+ svg: renderSvg,
491
+ element: renderElement,
492
+ canvas: renderCanvas,
493
+ canvasAt: renderCanvasAt,
494
+ bitmap: renderBitmap,
495
+ dataUrl: renderDataUrl
496
+ };
497
+ //#endregion
498
+ export { ACCESSORY_SLOTS, Animator, AvatarAtlas, CATALOG, CATALOG_REVISION, DEFAULT_GEN, EXPRESSIONS, EXPRESSION_NAMES, FRAME_PRESETS, HEAD_Y, LOOK_CODE_PREFIX, PALETTES, REACTIONS, SECOND_COLOUR_CODE, WALKER_HEAD_SCALE, WALKER_SEAT_DROP, animator, avatarEmoji, canonicalLook, catalog, composeAvatar, contrast, createAtlas, decodeLook, defaultLook, defineAvatarElement, deltaE, describe, distinctLooks, encodeLook, expressionFromEmote, facingFrom, isExpression, isLookCode, isTinted, isValidLook, layout, lightness, lookProblem, lookToward, mix, normaliseHex, onArtReady, overlaySvg, overlays, paintNodes, paintOverlay, partById, partName, partsOf, randomLook, ready, render, resolveColour, sameLook, sceneToSvg, seededRng, toCode, toLook };
499
+
500
+ //# sourceMappingURL=avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.js","names":["partsOf","PALETTES","CATALOG_REVISION"],"sources":["../src/avatar/outputs/element.ts","../src/avatar/outputs/custom-element.ts","../src/avatar/outputs/overlay-svg.ts","../src/avatar/catalog-view.ts","../src/avatar/atlas.ts","../src/avatar.ts"],"mappings":"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"}
package/dist/daily.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { _ as DailyStatus, a as isDailySystem, c as DailyAll, d as DailyCompletionMeta, f as DailyDefinition, g as DailyStartResponse, h as DailyHost, i as getDaily, l as DailyChallenge, m as DailyGameStatus, n as DailyCompletions, o as DAILY_START_EVENT, p as DailyEventDetail, r as DAILY_SINGLETON_API, s as DailySystem, t as DailyCompletion, u as DailyCompleteResponse } from "./shared/daily.js";
2
- export { DAILY_SINGLETON_API, DAILY_START_EVENT, type DailyAll, type DailyChallenge, type DailyCompleteResponse, type DailyCompletion, type DailyCompletionMeta, type DailyCompletions, type DailyDefinition, type DailyEventDetail, type DailyGameStatus, type DailyHost, type DailyStartResponse, type DailyStatus, DailySystem, getDaily, isDailySystem };
1
+ import { _ as DailyStartResponse, a as isDailySystem, c as DailyAll, d as DailyCompletionMeta, f as DailyDefinition, g as DailySaveInput, h as DailyHost, i as getDaily, l as DailyChallenge, m as DailyGameStatus, n as DailyCompletions, o as DAILY_START_EVENT, p as DailyEventDetail, r as DAILY_SINGLETON_API, s as DailySystem, t as DailyCompletion, u as DailyCompleteResponse, v as DailyStatus } from "./shared/daily.js";
2
+ export { DAILY_SINGLETON_API, DAILY_START_EVENT, type DailyAll, type DailyChallenge, type DailyCompleteResponse, type DailyCompletion, type DailyCompletionMeta, type DailyCompletions, type DailyDefinition, type DailyEventDetail, type DailyGameStatus, type DailyHost, type DailySaveInput, type DailyStartResponse, type DailyStatus, DailySystem, getDaily, isDailySystem };
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import { existsSync, readFileSync } from "node:fs";
2
+ import { existsSync, readFileSync, statSync } from "node:fs";
3
3
  import { join, resolve } from "node:path";
4
4
  import { parseArgs } from "node:util";
5
- import { GamePackageJson, HubVersion } from "@diffenderfer-games/hub-contract";
5
+ import { GAME_LABELS, GamePackageJson, HubVersion, splitGameLabels } from "@diffenderfer-games/hub-contract";
6
+ import { BUILT_IN_WORLD_TYPES, WORLD_LIMITS, parseWorldMapText } from "@diffenderfer-games/world";
6
7
  //#region src/core/version/client-version.gen.ts
7
8
  /** This client's package version, sent as `x-hub-client` on REST calls and `client` in `hello`. */
8
- const HUB_CLIENT_VERSION = "2.0.0-next.1";
9
+ const HUB_CLIENT_VERSION = "2.0.0-next.10";
9
10
  //#endregion
10
11
  //#region src/core/version/semver.ts
11
12
  const VERSION_PATTERN = /^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;
@@ -174,11 +175,18 @@ function checkVendoredCopies(gameDir) {
174
175
  /** The `package.json` `game.*` block against the contract's manifest schema. */
175
176
  function checkManifest(packageJson) {
176
177
  const parsed = GamePackageJson.safeParse(packageJson);
177
- if (parsed.success) return [{
178
- level: "info",
179
- check: "manifest",
180
- message: `the game.* block is valid (${parsed.data.game.type})`
181
- }];
178
+ if (parsed.success) {
179
+ const unknownLabels = splitGameLabels(parsed.data.game.labels ?? []).unknown;
180
+ return [{
181
+ level: "info",
182
+ check: "manifest",
183
+ message: `the game.* block is valid (${parsed.data.game.type})`
184
+ }, ...unknownLabels.map((label) => ({
185
+ level: "warning",
186
+ check: "manifest",
187
+ message: `game.labels: "${label}" is not a known label (the catalog ignores it); use any of ${GAME_LABELS.join(", ")}`
188
+ }))];
189
+ }
182
190
  return parsed.error.issues.map((issue) => ({
183
191
  level: "error",
184
192
  check: "manifest",
@@ -186,6 +194,57 @@ function checkManifest(packageJson) {
186
194
  }));
187
195
  }
188
196
  //#endregion
197
+ //#region src/doctor/world-check.ts
198
+ /**
199
+ * `hub-doctor`'s world check (docs/plans/world.md §14.6): a `game.world.map`
200
+ * file must exist inside the game, be within the size limit and be a valid
201
+ * `dg-world@1` map (the same `parseWorldMapText` the hub runs at load); a
202
+ * `game.world.generate.type` the hub doesn't know is a warning.
203
+ */
204
+ /** The most map problems listed (the rest are counted). */
205
+ const MAX_LISTED_PROBLEMS = 20;
206
+ /** Checks the map file and world type `game.world` names. A manifest that doesn't parse is left to `checkManifest`. */
207
+ function checkWorld(gameDir, packageJson) {
208
+ const parsed = GamePackageJson.safeParse(packageJson);
209
+ const world = parsed.success ? parsed.data.game.world : void 0;
210
+ if (world === void 0) return [];
211
+ const findings = [];
212
+ const type = world.generate?.type;
213
+ if (type !== void 0 && !BUILT_IN_WORLD_TYPES.some((known) => known.id === type)) findings.push({
214
+ level: "warning",
215
+ check: "world",
216
+ message: `game.world.generate.type: the hub has no world type "${type}"; use one of ${BUILT_IN_WORLD_TYPES.map((known) => known.id).join(", ")}`
217
+ });
218
+ return world.map === void 0 ? findings : [...findings, ...checkMapFile(gameDir, world.map)];
219
+ }
220
+ /** One map file's findings. */
221
+ function checkMapFile(gameDir, mapFile) {
222
+ const path = join(gameDir, mapFile);
223
+ const error = (message) => ({
224
+ level: "error",
225
+ check: "world",
226
+ message: `game.world.map (${mapFile}): ${message}`
227
+ });
228
+ if (!existsSync(path) || !statSync(path).isFile()) return [error("the file does not exist (build or commit it)")];
229
+ const bytes = statSync(path).size;
230
+ if (bytes > WORLD_LIMITS.bytes) return [error(`${String(bytes)} bytes is over the ${String(WORLD_LIMITS.bytes)}-byte limit (save layers as "rle")`)];
231
+ const result = parseWorldMapText(readFileSync(path, "utf8"));
232
+ const listed = result.problems.slice(0, MAX_LISTED_PROBLEMS).map((problem) => ({
233
+ level: problem.severity === "error" ? "error" : "warning",
234
+ check: "world",
235
+ message: `game.world.map (${mapFile}): ${problem.message}`
236
+ }));
237
+ const more = result.problems.length - listed.length;
238
+ if (more > 0) listed.push(error(`and ${String(more)} more problems`));
239
+ if (!result.ok) return listed;
240
+ const { map } = result;
241
+ return [...listed, {
242
+ level: "info",
243
+ check: "world",
244
+ message: `game.world.map (${mapFile}) is a valid dg-world@1 map: ${map.title}, ${String(map.width)} × ${String(map.height)}, ${String(map.objects.length)} objects, ${String(bytes)} bytes`
245
+ }];
246
+ }
247
+ //#endregion
189
248
  //#region src/doctor/cli.ts
190
249
  /**
191
250
  * `hub-doctor`: checks a game against the hub (plan §4.3.7). Run it in a
@@ -199,7 +258,8 @@ function checkManifest(packageJson) {
199
258
  * `/_api/version` (`--hub`, default `https://diffenderfer.games`): outside
200
259
  * `supported` fails, `deprecated` warns (`--offline` skips this check);
201
260
  * - a stale vendored `src/hub/` copy or `scripts/sync-hub.mjs` warns;
202
- * - the `package.json` `game.*` block must match the contract's schema.
261
+ * - the `package.json` `game.*` block must match the contract's schema;
262
+ * - a `game.world.map` file must exist and be a valid `dg-world@1` map within the size limit.
203
263
  *
204
264
  * Exits 1 when any check fails.
205
265
  */
@@ -247,7 +307,8 @@ async function runDoctor(options) {
247
307
  if (!options.isOffline) findings.push(...checkClientVersion(installedClientVersion(options.gameDir), await fetchHubVersion(options.hubUrl, options.timeoutMs)));
248
308
  findings.push(...checkVendoredCopies(options.gameDir));
249
309
  try {
250
- findings.push(...checkManifest(readJsonFile(join(options.gameDir, "package.json"))));
310
+ const packageJson = readJsonFile(join(options.gameDir, "package.json"));
311
+ findings.push(...checkManifest(packageJson), ...checkWorld(options.gameDir, packageJson));
251
312
  } catch (failure) {
252
313
  findings.push({
253
314
  level: "error",
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":[],"sources":["../../src/core/version/client-version.gen.ts","../../src/core/version/semver.ts","../../src/core/version/hub-version.ts","../../src/doctor/hub-version-fetch.ts","../../src/doctor/checks.ts","../../src/doctor/cli.ts"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../../src/core/version/client-version.gen.ts","../../src/core/version/semver.ts","../../src/core/version/hub-version.ts","../../src/doctor/hub-version-fetch.ts","../../src/doctor/checks.ts","../../src/doctor/world-check.ts","../../src/doctor/cli.ts"],"mappings":"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"}