@diffenderfer-games/hub 2.0.0-next.1 → 2.0.0-next.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +173 -5
- package/README.md +27 -15
- package/dist/auto.d.ts +8 -8
- package/dist/auto.js +3 -3
- package/dist/avatar-pixi.d.ts +165 -0
- package/dist/avatar-pixi.d.ts.map +1 -0
- package/dist/avatar-pixi.js +299 -0
- package/dist/avatar-pixi.js.map +1 -0
- package/dist/avatar-svg.d.ts +4 -0
- package/dist/avatar-svg.js +5 -0
- package/dist/avatar-three.d.ts +69 -0
- package/dist/avatar-three.d.ts.map +1 -0
- package/dist/avatar-three.js +49 -0
- package/dist/avatar-three.js.map +1 -0
- package/dist/avatar.d.ts +7 -0
- package/dist/avatar.js +500 -0
- package/dist/avatar.js.map +1 -0
- package/dist/daily.d.ts +2 -2
- package/dist/doctor/cli.mjs +134 -10
- package/dist/doctor/cli.mjs.map +1 -1
- package/dist/index.d.ts +8 -8
- package/dist/index.js +3 -3
- package/dist/input.d.ts +2 -2
- package/dist/input.js +2 -2
- package/dist/mp.d.ts +3 -3
- package/dist/race.d.ts +1 -1
- package/dist/rooms.d.ts +3 -3
- package/dist/rooms.js +1 -1
- package/dist/shared/animator.d.ts +104 -0
- package/dist/shared/animator.d.ts.map +1 -0
- package/dist/shared/art.js +1946 -0
- package/dist/shared/art.js.map +1 -0
- package/dist/shared/atlas.d.ts +138 -0
- package/dist/shared/atlas.d.ts.map +1 -0
- package/dist/shared/avatar.d.ts +123 -0
- package/dist/shared/avatar.d.ts.map +1 -0
- package/dist/shared/bridge.js +18 -4
- package/dist/shared/bridge.js.map +1 -1
- package/dist/shared/client-version.gen.js +1 -1
- package/dist/shared/daily.d.ts +145 -19
- package/dist/shared/daily.d.ts.map +1 -1
- package/dist/shared/daily.js +138 -25
- package/dist/shared/daily.js.map +1 -1
- package/dist/shared/defineProperty.js +39 -0
- package/dist/shared/describe.d.ts +32 -0
- package/dist/shared/describe.d.ts.map +1 -0
- package/dist/shared/describe.js +109 -0
- package/dist/shared/describe.js.map +1 -0
- package/dist/shared/globals.js +1 -39
- package/dist/shared/globals.js.map +1 -1
- package/dist/shared/index.d.ts +1122 -46
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/input.d.ts +74 -14
- package/dist/shared/input.d.ts.map +1 -1
- package/dist/shared/input.js +179 -25
- package/dist/shared/input.js.map +1 -1
- package/dist/shared/json-guards.js +48 -0
- package/dist/shared/json-guards.js.map +1 -0
- package/dist/shared/latest-state.js +1 -1
- package/dist/shared/live-canvas.js +62 -0
- package/dist/shared/live-canvas.js.map +1 -0
- package/dist/shared/mp.js +10 -2
- package/dist/shared/mp.js.map +1 -1
- package/dist/shared/multiplayer-types.d.ts +15 -2
- package/dist/shared/multiplayer-types.d.ts.map +1 -1
- package/dist/shared/overlays.js +800 -0
- package/dist/shared/overlays.js.map +1 -0
- package/dist/shared/page-stack.js +2 -1
- package/dist/shared/page-stack.js.map +1 -1
- package/dist/shared/pose-key.js +249 -0
- package/dist/shared/pose-key.js.map +1 -0
- package/dist/shared/race-types.d.ts +1 -1
- package/dist/shared/race.js +1 -1
- package/dist/shared/room-types.d.ts +28 -3
- package/dist/shared/room-types.d.ts.map +1 -1
- package/dist/shared/rooms.d.ts.map +1 -1
- package/dist/shared/rooms.js +23 -4
- package/dist/shared/rooms.js.map +1 -1
- package/dist/shared/runtime-opener.js +1 -1
- package/dist/shared/scene.d.ts +90 -0
- package/dist/shared/scene.d.ts.map +1 -0
- package/dist/shared/social.d.ts +90 -9
- package/dist/shared/social.d.ts.map +1 -1
- package/dist/shared/social.js +6 -1
- package/dist/shared/social.js.map +1 -1
- package/dist/shared/src.js +4563 -667
- package/dist/shared/src.js.map +1 -1
- package/dist/shared/svg-markup.js +2411 -0
- package/dist/shared/svg-markup.js.map +1 -0
- package/dist/shared/svg.js +27 -0
- package/dist/shared/svg.js.map +1 -0
- package/dist/shared/types.d.ts +174 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/wire-types.d.ts +6 -2
- package/dist/shared/wire-types.d.ts.map +1 -1
- package/dist/social.d.ts +5 -5
- package/dist/social.js +2 -2
- package/dist/turns-rules.d.ts +2 -0
- package/dist/turns-rules.js +1 -0
- package/dist/turns.d.ts +61 -0
- package/dist/turns.d.ts.map +1 -0
- package/dist/turns.js +183 -0
- package/dist/turns.js.map +1 -0
- package/package.json +39 -3
- package/src/avatar/adapters/pixi-avatar.ts +73 -0
- package/src/avatar/adapters/pixi-crowd.ts +329 -0
- package/src/avatar/adapters/pixi-types.ts +84 -0
- package/src/avatar/adapters/three.ts +126 -0
- package/src/avatar/animator/animator.ts +285 -0
- package/src/avatar/animator/reactions.ts +44 -0
- package/src/avatar/animator/schedule.ts +73 -0
- package/src/avatar/art/beard.ts +49 -0
- package/src/avatar/art/glasses.ts +67 -0
- package/src/avatar/art/hair.ts +254 -0
- package/src/avatar/art/headwear.ts +75 -0
- package/src/avatar/art/index.ts +21 -0
- package/src/avatar/art/shape.ts +87 -0
- package/src/avatar/art-store.ts +36 -0
- package/src/avatar/atlas.ts +246 -0
- package/src/avatar/catalog-view.ts +14 -0
- package/src/avatar/colour.ts +109 -0
- package/src/avatar/describe.ts +79 -0
- package/src/avatar/face.ts +187 -0
- package/src/avatar/geom.ts +173 -0
- package/src/avatar/layout.ts +47 -0
- package/src/avatar/look-like.ts +52 -0
- package/src/avatar/outputs/bitmap.ts +75 -0
- package/src/avatar/outputs/canvas-paint.ts +177 -0
- package/src/avatar/outputs/canvas.ts +62 -0
- package/src/avatar/outputs/custom-element.ts +140 -0
- package/src/avatar/outputs/element.ts +58 -0
- package/src/avatar/outputs/live-canvas.ts +57 -0
- package/src/avatar/outputs/overlay-svg.ts +22 -0
- package/src/avatar/outputs/pose-key.ts +30 -0
- package/src/avatar/outputs/svg-markup.ts +113 -0
- package/src/avatar/outputs/svg.ts +41 -0
- package/src/avatar/overlays.ts +128 -0
- package/src/avatar/render/body.ts +116 -0
- package/src/avatar/render/colours.ts +81 -0
- package/src/avatar/render/compose.ts +346 -0
- package/src/avatar/render/context.ts +117 -0
- package/src/avatar/render/eyes.ts +78 -0
- package/src/avatar/render/eyewear.ts +118 -0
- package/src/avatar/render/frame.ts +73 -0
- package/src/avatar/render/head.ts +81 -0
- package/src/avatar/render/mouth.ts +86 -0
- package/src/avatar/render/props.ts +91 -0
- package/src/avatar/render/types.ts +93 -0
- package/src/avatar/render/walker-parts.ts +124 -0
- package/src/avatar/render/walker.ts +239 -0
- package/src/avatar/scene.ts +119 -0
- package/src/avatar-pixi.ts +20 -0
- package/src/avatar-svg.ts +21 -0
- package/src/avatar-three.ts +18 -0
- package/src/avatar.ts +63 -0
- package/src/core/avatar/avatar-cache.ts +95 -0
- package/src/core/avatar/avatar-ref.ts +34 -0
- package/src/core/avatar/avatar-types.ts +43 -0
- package/src/core/avatar/hub-avatar.ts +308 -0
- package/src/core/connection.ts +201 -92
- package/src/core/errors.ts +15 -2
- package/src/core/game-data.ts +11 -9
- package/src/core/hub-economy.ts +47 -10
- package/src/core/hub-progress.ts +94 -30
- package/src/core/hub.ts +228 -7
- package/src/core/offline/cloud-saves.ts +62 -0
- package/src/core/offline/hub-kinds/avatar-kind.ts +42 -0
- package/src/core/offline/hub-kinds/daily-kind.ts +68 -0
- package/src/core/offline/hub-kinds/economy-kinds.ts +86 -0
- package/src/core/offline/hub-kinds/game-fields.ts +2 -0
- package/src/core/offline/hub-kinds/index.ts +52 -0
- package/src/core/offline/hub-kinds/legacy-ops.ts +37 -0
- package/src/core/offline/hub-kinds/progress-kinds.ts +165 -0
- package/src/core/offline/hub-kinds/resume-kind.ts +108 -0
- package/src/core/offline/hub-kinds/saved-kind.ts +93 -0
- package/src/core/offline/kind-adapters.ts +48 -0
- package/src/core/offline/local-inventory.ts +64 -0
- package/src/core/offline/local-store.ts +66 -23
- package/src/core/offline/offline-api.ts +65 -0
- package/src/core/offline/outbox-entry.ts +59 -0
- package/src/core/offline/outbox-kinds.ts +78 -0
- package/src/core/offline/outbox-merge.ts +39 -0
- package/src/core/offline/outbox-replayer.ts +141 -0
- package/src/core/offline/outbox-store.ts +85 -0
- package/src/core/offline/outbox.ts +232 -0
- package/src/core/offline/queue.ts +4 -49
- package/src/core/offline/replay-lease.ts +87 -0
- package/src/core/offline/replay-policy.ts +52 -0
- package/src/core/page-account.ts +121 -0
- package/src/core/page.ts +14 -1
- package/src/core/rest/rest-client.ts +14 -3
- package/src/core/rest/routes.gen.ts +144 -88
- package/src/core/resume/hub-resume.ts +286 -0
- package/src/core/resume/local-resume.ts +130 -0
- package/src/core/resume/resume-list.ts +65 -0
- package/src/core/resume/resume-request.ts +52 -0
- package/src/core/resume/resume-types.ts +64 -0
- package/src/core/saved/daily-saves.ts +196 -0
- package/src/core/saved/daily-seed.ts +16 -0
- package/src/core/saved/hub-saved.ts +221 -0
- package/src/core/saved/local-saved.ts +122 -0
- package/src/core/saved/saved-list.ts +129 -0
- package/src/core/saved/saved-open.ts +104 -0
- package/src/core/saved/saved-order.ts +49 -0
- package/src/core/saved/saved-types.ts +24 -0
- package/src/core/storage/json-guards.ts +6 -0
- package/src/core/turns/hub-turns.ts +161 -0
- package/src/core/turns/turn-game.ts +510 -0
- package/src/core/turns/your-turn-buzz.ts +69 -0
- package/src/core/version/client-version.gen.ts +2 -2
- package/src/daily/daily-system.ts +127 -12
- package/src/daily/page-daily.ts +2 -2
- package/src/daily/types.ts +49 -11
- package/src/doctor/checks.ts +12 -4
- package/src/doctor/cli.ts +8 -2
- package/src/doctor/embed-check.ts +61 -0
- package/src/doctor/hub-version-fetch.ts +43 -43
- package/src/doctor/world-check.ts +61 -0
- package/src/index.ts +20 -2
- package/src/input/focus-ring.ts +13 -0
- package/src/input/input-registry.ts +9 -2
- package/src/input/input-system.ts +14 -1
- package/src/input/modality.ts +122 -0
- package/src/input/nav-state.ts +13 -4
- package/src/input/navigator.ts +11 -0
- package/src/input/zero-config.ts +1 -14
- package/src/input.ts +4 -0
- package/src/mp.ts +1 -1
- package/src/overlay/overlay.ts +30 -4
- package/src/overlay/styles.ts +4 -3
- package/src/realtime/bridge.ts +5 -0
- package/src/realtime/multiplayer-forwarder.ts +13 -1
- package/src/realtime/multiplayer-types.ts +15 -1
- package/src/realtime/room-types.ts +28 -2
- package/src/realtime/rooms-forwarder.ts +27 -2
- package/src/realtime/runtime-api.ts +33 -8
- package/src/realtime/social-forwarder.ts +5 -0
- package/src/realtime/social-types.ts +8 -0
- package/src/realtime/types.ts +1 -0
- package/src/realtime/wire-types.ts +7 -0
- package/src/realtime/world-types.ts +20 -0
- package/src/rooms.ts +1 -1
- package/src/social.ts +1 -0
- package/src/turns-kit/check-rules.ts +281 -0
- package/src/turns-rules.ts +12 -0
- package/src/turns.ts +14 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { C as frameBox, I as toCode, g as expressionFromEmote } from "./shared/svg-markup.js";
|
|
2
|
+
import { a as paintNodes, n as defaultLayer } from "./shared/pose-key.js";
|
|
3
|
+
import { c as drawToCanvas, o as animator, r as layout, t as overlays } from "./shared/overlays.js";
|
|
4
|
+
import { t as liveCanvas } from "./shared/live-canvas.js";
|
|
5
|
+
//#region src/avatar/adapters/pixi-types.ts
|
|
6
|
+
/** Re-uploads a texture after its canvas changed (Pixi 8 and 7). */
|
|
7
|
+
function refresh(texture) {
|
|
8
|
+
if (texture.source) texture.source.update();
|
|
9
|
+
else texture.update?.();
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/avatar/adapters/pixi-avatar.ts
|
|
13
|
+
/** A live avatar sprite: `pixiAvatar(pixi, seat.look, { size: 64, animator })`. */
|
|
14
|
+
function pixiAvatar(pixi, like, opts = {}) {
|
|
15
|
+
const resolution = opts.resolution ?? 2;
|
|
16
|
+
const live = liveCanvas(like, opts, resolution);
|
|
17
|
+
live.draw(opts.pose);
|
|
18
|
+
const texture = pixi.Texture.from(live.canvas);
|
|
19
|
+
const view = new pixi.Sprite(texture);
|
|
20
|
+
view.anchor.set(.5);
|
|
21
|
+
view.scale.set(1 / resolution);
|
|
22
|
+
return {
|
|
23
|
+
view,
|
|
24
|
+
update(t) {
|
|
25
|
+
const pose = typeof t === "number" ? opts.animator?.pose(t) : t;
|
|
26
|
+
if (live.draw(pose ?? opts.pose)) refresh(texture);
|
|
27
|
+
},
|
|
28
|
+
setLook(next) {
|
|
29
|
+
live.setLook(next);
|
|
30
|
+
opts.animator?.setLook(next);
|
|
31
|
+
if (live.draw(opts.pose)) refresh(texture);
|
|
32
|
+
},
|
|
33
|
+
destroy() {
|
|
34
|
+
view.destroy();
|
|
35
|
+
texture.destroy(true);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** A still avatar texture (Pixi 7 games use this from a bitmap-like canvas). */
|
|
40
|
+
function avatarTexture(pixi, like, opts = {}) {
|
|
41
|
+
return pixi.Texture.from(drawToCanvas(like, opts));
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
//#region src/avatar/adapters/pixi-crowd.ts
|
|
45
|
+
/**
|
|
46
|
+
* `createCrowd` (§3.11): the world's whole avatar layer in Pixi 8. One
|
|
47
|
+
* y-sorted container; most avatars are atlas frames (shared page textures,
|
|
48
|
+
* so Pixi batches them), and up to `liveMax` flagged ones (nearest, hovered,
|
|
49
|
+
* talking, friends; the world decides) are live vector avatars with full
|
|
50
|
+
* expressions. Name tags and bubbles are cached textures, re-rendered only
|
|
51
|
+
* when their text changes. Baking is time-sliced; an avatar without a baked
|
|
52
|
+
* frame yet shows the silhouette.
|
|
53
|
+
*/
|
|
54
|
+
const EMOTE_MS = 2500;
|
|
55
|
+
const CYCLE = {
|
|
56
|
+
walk: 520,
|
|
57
|
+
run: 320,
|
|
58
|
+
dance: 900,
|
|
59
|
+
jump: 700,
|
|
60
|
+
cheer: 600,
|
|
61
|
+
idle: 2400
|
|
62
|
+
};
|
|
63
|
+
/** The walker's stubby legs step quicker: a bouncy waddle. */
|
|
64
|
+
const WALKER_CYCLE = {
|
|
65
|
+
...CYCLE,
|
|
66
|
+
walk: 340,
|
|
67
|
+
run: 240,
|
|
68
|
+
idle: 2800
|
|
69
|
+
};
|
|
70
|
+
/** A crowd over an atlas: `createCrowd(pixi, { atlas, container })`. */
|
|
71
|
+
function createCrowd(pixi, opts) {
|
|
72
|
+
const { atlas, container } = opts;
|
|
73
|
+
const overlayLayer = opts.overlays ?? container;
|
|
74
|
+
const displayScale = opts.displayScale ?? 1;
|
|
75
|
+
container.sortableChildren = true;
|
|
76
|
+
overlayLayer.sortableChildren = true;
|
|
77
|
+
const liveMax = opts.liveMax ?? 6;
|
|
78
|
+
const figure = opts.figure ?? "blob";
|
|
79
|
+
const cycles = figure === "walker" ? WALKER_CYCLE : CYCLE;
|
|
80
|
+
const [, liveTop, , liveHeight] = frameBox({
|
|
81
|
+
frame: "full",
|
|
82
|
+
figure
|
|
83
|
+
});
|
|
84
|
+
const entries = /* @__PURE__ */ new Map();
|
|
85
|
+
const pageTextures = [];
|
|
86
|
+
const frameTextures = /* @__PURE__ */ new Map();
|
|
87
|
+
const overlayTextures = /* @__PURE__ */ new Map();
|
|
88
|
+
/** Where the name plate sits above the feet (rig units), cached per look, pose and prop. */
|
|
89
|
+
const nameplates = /* @__PURE__ */ new Map();
|
|
90
|
+
const nameplateY = (look, body, status) => {
|
|
91
|
+
const key = `${toCode(look)}|${body}|${status ?? ""}`;
|
|
92
|
+
let plateY = nameplates.get(key);
|
|
93
|
+
if (plateY === void 0) {
|
|
94
|
+
plateY = layout(look, {
|
|
95
|
+
figure,
|
|
96
|
+
pose: {
|
|
97
|
+
body,
|
|
98
|
+
status
|
|
99
|
+
}
|
|
100
|
+
}).nameplate.y;
|
|
101
|
+
nameplates.set(key, plateY);
|
|
102
|
+
}
|
|
103
|
+
return plateY;
|
|
104
|
+
};
|
|
105
|
+
const overlayTexture = (key, overlay) => {
|
|
106
|
+
const hit = overlayTextures.get(key);
|
|
107
|
+
if (hit) return hit;
|
|
108
|
+
const [left, top, w, h] = overlay.box;
|
|
109
|
+
const resolution = 2;
|
|
110
|
+
const made = defaultLayer(Math.ceil(w * resolution), Math.ceil(h * resolution));
|
|
111
|
+
if (!made || !("getContext" in made.canvas)) return null;
|
|
112
|
+
made.ctx.scale(resolution, resolution);
|
|
113
|
+
made.ctx.translate(-left, -top);
|
|
114
|
+
paintNodes(made.ctx, overlay.nodes);
|
|
115
|
+
const out = {
|
|
116
|
+
texture: pixi.Texture.from(made.canvas),
|
|
117
|
+
ax: -left / w,
|
|
118
|
+
ay: -top / h
|
|
119
|
+
};
|
|
120
|
+
overlayTextures.set(key, out);
|
|
121
|
+
return out;
|
|
122
|
+
};
|
|
123
|
+
const textureFor = (page, left, top, w, h) => {
|
|
124
|
+
const sources = atlas.sources;
|
|
125
|
+
while (pageTextures.length < sources.length) {
|
|
126
|
+
const source = sources[pageTextures.length];
|
|
127
|
+
if (!source || !("getContext" in source)) return null;
|
|
128
|
+
pageTextures.push(pixi.Texture.from(source));
|
|
129
|
+
}
|
|
130
|
+
const base = pageTextures[page]?.source;
|
|
131
|
+
if (!base) return null;
|
|
132
|
+
const key = `${String(page)}:${String(left)}:${String(top)}`;
|
|
133
|
+
let tex = frameTextures.get(key);
|
|
134
|
+
if (!tex) {
|
|
135
|
+
tex = new pixi.Texture({
|
|
136
|
+
source: base,
|
|
137
|
+
frame: new pixi.Rectangle(left, top, w, h)
|
|
138
|
+
});
|
|
139
|
+
frameTextures.set(key, tex);
|
|
140
|
+
}
|
|
141
|
+
return tex;
|
|
142
|
+
};
|
|
143
|
+
const placeOverlay = (slot, key, make, atX, atY) => {
|
|
144
|
+
if (key === "") {
|
|
145
|
+
if (slot.sprite) slot.sprite.visible = false;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
let sprite = slot.sprite;
|
|
149
|
+
if (slot.key !== key || !sprite) {
|
|
150
|
+
const overlay = make();
|
|
151
|
+
const made = overlay ? overlayTexture(key, overlay) : null;
|
|
152
|
+
if (!made) return;
|
|
153
|
+
if (!sprite) {
|
|
154
|
+
sprite = new pixi.Sprite(made.texture);
|
|
155
|
+
overlayLayer.addChild(sprite);
|
|
156
|
+
}
|
|
157
|
+
slot.sprite = sprite;
|
|
158
|
+
sprite.texture = made.texture;
|
|
159
|
+
sprite.anchor.set(made.ax, made.ay);
|
|
160
|
+
sprite.scale.set(.5);
|
|
161
|
+
slot.key = key;
|
|
162
|
+
}
|
|
163
|
+
sprite.visible = true;
|
|
164
|
+
sprite.x = atX;
|
|
165
|
+
sprite.y = atY;
|
|
166
|
+
sprite.zIndex = 1e6 + atY;
|
|
167
|
+
};
|
|
168
|
+
return {
|
|
169
|
+
set(id, member) {
|
|
170
|
+
const key = String(id);
|
|
171
|
+
const entry = entries.get(key);
|
|
172
|
+
if (entry) {
|
|
173
|
+
if (member.emote && member.emote !== entry.member.emote) {
|
|
174
|
+
entry.emoteAt = -1;
|
|
175
|
+
const face = expressionFromEmote(member.emote);
|
|
176
|
+
if (face) entry.anim.express(face);
|
|
177
|
+
}
|
|
178
|
+
if (member.look !== entry.member.look) entry.live?.setLook(member.look);
|
|
179
|
+
entry.member = member;
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const sprite = new pixi.Sprite();
|
|
183
|
+
container.addChild(sprite);
|
|
184
|
+
entries.set(key, {
|
|
185
|
+
member,
|
|
186
|
+
sprite,
|
|
187
|
+
tag: {
|
|
188
|
+
sprite: null,
|
|
189
|
+
key: ""
|
|
190
|
+
},
|
|
191
|
+
bubble: {
|
|
192
|
+
sprite: null,
|
|
193
|
+
key: ""
|
|
194
|
+
},
|
|
195
|
+
emoteAt: member.emote ? -1 : 0,
|
|
196
|
+
hasFrame: false,
|
|
197
|
+
live: null,
|
|
198
|
+
body: null,
|
|
199
|
+
anim: animator(member.look, { seed: key })
|
|
200
|
+
});
|
|
201
|
+
},
|
|
202
|
+
remove(id) {
|
|
203
|
+
const entry = entries.get(String(id));
|
|
204
|
+
if (!entry) return;
|
|
205
|
+
entry.sprite.destroy();
|
|
206
|
+
entry.tag.sprite?.destroy();
|
|
207
|
+
entry.bubble.sprite?.destroy();
|
|
208
|
+
entry.live?.destroy();
|
|
209
|
+
entries.delete(String(id));
|
|
210
|
+
},
|
|
211
|
+
update(t) {
|
|
212
|
+
if (atlas.bake(opts.bakeMs ?? 4) > 0) pageTextures.forEach(refresh);
|
|
213
|
+
const wantsLive = [...entries.values()].filter((e) => e.member.live === true).slice(0, liveMax);
|
|
214
|
+
const liveSet = new Set(wantsLive);
|
|
215
|
+
for (const entry of entries.values()) {
|
|
216
|
+
const m = entry.member;
|
|
217
|
+
const body = m.body ?? "idle";
|
|
218
|
+
if (entry.emoteAt === -1) entry.emoteAt = t;
|
|
219
|
+
const isEmoting = m.emote !== void 0 && t - entry.emoteAt < EMOTE_MS;
|
|
220
|
+
if (liveSet.has(entry)) {
|
|
221
|
+
if (!entry.live) {
|
|
222
|
+
entry.live = pixiAvatar(pixi, m.look, {
|
|
223
|
+
frame: "full",
|
|
224
|
+
figure,
|
|
225
|
+
size: 64,
|
|
226
|
+
rim: true,
|
|
227
|
+
shadow: false,
|
|
228
|
+
animator: entry.anim
|
|
229
|
+
});
|
|
230
|
+
container.addChild(entry.live.view);
|
|
231
|
+
}
|
|
232
|
+
entry.sprite.visible = false;
|
|
233
|
+
const view = entry.live.view;
|
|
234
|
+
if (entry.body !== body) {
|
|
235
|
+
entry.body = body;
|
|
236
|
+
entry.anim.setBody(body, { at: t });
|
|
237
|
+
}
|
|
238
|
+
entry.live.update({
|
|
239
|
+
...entry.anim.pose(t),
|
|
240
|
+
body,
|
|
241
|
+
status: m.status ?? null,
|
|
242
|
+
phase: t / (cycles[body] ?? 600) % 1
|
|
243
|
+
});
|
|
244
|
+
view.x = m.x;
|
|
245
|
+
view.y = m.y + (figure === "walker" ? (liveTop + liveHeight / 2) * (64 / liveHeight) : -32);
|
|
246
|
+
view.zIndex = m.y;
|
|
247
|
+
view.visible = true;
|
|
248
|
+
} else {
|
|
249
|
+
if (entry.live) entry.live.view.visible = false;
|
|
250
|
+
const frame = atlas.frame({
|
|
251
|
+
look: m.look,
|
|
252
|
+
facing: m.facing ?? "S",
|
|
253
|
+
body,
|
|
254
|
+
status: m.status ?? null,
|
|
255
|
+
phase: t / (cycles[body] ?? 600) % 1,
|
|
256
|
+
face: isEmoting ? "happy" : "neutral"
|
|
257
|
+
});
|
|
258
|
+
const shown = frame ?? (entry.hasFrame ? null : atlas.frame({ look: null }));
|
|
259
|
+
entry.hasFrame || (entry.hasFrame = frame !== null);
|
|
260
|
+
const tex = shown ? textureFor(shown.page, shown.x, shown.y, shown.w, shown.h) : null;
|
|
261
|
+
if (tex) {
|
|
262
|
+
entry.sprite.texture = tex;
|
|
263
|
+
entry.sprite.visible = true;
|
|
264
|
+
}
|
|
265
|
+
if (shown) {
|
|
266
|
+
entry.sprite.anchor.set(shown.footX / shown.w, shown.footY / shown.h);
|
|
267
|
+
entry.sprite.scale.set(shown.mirror ? -displayScale : displayScale, displayScale);
|
|
268
|
+
}
|
|
269
|
+
entry.sprite.x = m.x;
|
|
270
|
+
entry.sprite.y = m.y;
|
|
271
|
+
entry.sprite.zIndex = m.y;
|
|
272
|
+
}
|
|
273
|
+
const top = m.y - (m.tagLift ?? 0) + nameplateY(m.look, body, m.status ?? null) * (entry.live?.view.visible === true ? 64 / liveHeight : atlas.scale * displayScale);
|
|
274
|
+
const tagKey = m.name && !m.tagHidden ? `tag:${m.name}:${m.friend ? 1 : 0}:${m.you ? 1 : 0}` : "";
|
|
275
|
+
placeOverlay(entry.tag, tagKey, () => m.name ? overlays.nameTag({
|
|
276
|
+
name: m.name,
|
|
277
|
+
friend: m.friend === true,
|
|
278
|
+
you: m.you === true
|
|
279
|
+
}) : null, m.x, top);
|
|
280
|
+
const bubbleKey = isEmoting && m.emote ? `emote:${m.emote}` : m.reaction ? `react:${m.reaction}` : m.activity ? `act:${m.activity}` : "";
|
|
281
|
+
placeOverlay(entry.bubble, bubbleKey, () => {
|
|
282
|
+
if (isEmoting && m.emote) return overlays.emoteBubble(m.emote);
|
|
283
|
+
if (m.reaction) return overlays.reactionBubble(m.reaction);
|
|
284
|
+
return m.activity ? overlays.activityBubble({ game: m.activity }) : null;
|
|
285
|
+
}, m.x, top - 12);
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
destroy() {
|
|
289
|
+
for (const id of [...entries.keys()]) this.remove(id);
|
|
290
|
+
for (const tex of frameTextures.values()) tex.destroy(false);
|
|
291
|
+
for (const tex of pageTextures) tex.destroy(true);
|
|
292
|
+
for (const o of overlayTextures.values()) o.texture.destroy(true);
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
//#endregion
|
|
297
|
+
export { avatarTexture, createCrowd, pixiAvatar };
|
|
298
|
+
|
|
299
|
+
//# sourceMappingURL=avatar-pixi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar-pixi.js","names":[],"sources":["../src/avatar/adapters/pixi-types.ts","../src/avatar/adapters/pixi-avatar.ts","../src/avatar/adapters/pixi-crowd.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { a as Frame, g as Expression, h as EXPRESSION_NAMES, l as Pose, r as Facing, s as LookLike, u as RenderOptions, x as isExpression } from "./shared/types.js";
|
|
2
|
+
import { a as renderSvg, i as ready, n as describe } from "./shared/describe.js";
|
|
3
|
+
import { AvatarLook, decodeLook, defaultLook, encodeLook } from "@diffenderfer-games/hub-contract/avatar";
|
|
4
|
+
export { type AvatarLook, EXPRESSION_NAMES, type Expression, type Facing, type Frame, type LookLike, type Pose, type RenderOptions, decodeLook, defaultLook, describe, encodeLook, isExpression, ready, renderSvg };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { h as EXPRESSION_NAMES, v as isExpression, x as ready } from "./shared/svg-markup.js";
|
|
2
|
+
import { n as renderSvg } from "./shared/svg.js";
|
|
3
|
+
import { n as describe } from "./shared/describe.js";
|
|
4
|
+
import { decodeLook, defaultLook, encodeLook } from "@diffenderfer-games/hub-contract/avatar";
|
|
5
|
+
export { EXPRESSION_NAMES, decodeLook, defaultLook, describe, encodeLook, isExpression, ready, renderSvg };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { l as Pose, s as LookLike, u as RenderOptions } from "./shared/types.js";
|
|
2
|
+
import { t as Animator } from "./shared/animator.js";
|
|
3
|
+
//#region src/avatar/adapters/three.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* The slice of three.js {@link avatarCanvasTexture} uses: `import * as THREE
|
|
6
|
+
* from 'three'`, or an object of the named imports. Generic over the game's
|
|
7
|
+
* own `CanvasTexture`, inferred from what is passed, so the texture that comes
|
|
8
|
+
* back is three's own type.
|
|
9
|
+
*/
|
|
10
|
+
interface ThreeTextureNs<TTexture extends ThreeTexture = ThreeTexture> {
|
|
11
|
+
readonly CanvasTexture: new (canvas: HTMLCanvasElement | OffscreenCanvas) => TTexture;
|
|
12
|
+
readonly SRGBColorSpace?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The slice of three.js {@link avatarSprite} uses (the namespace, or the named
|
|
16
|
+
* imports). The sprite that comes back is three's own `Sprite`, so
|
|
17
|
+
* `scene.add(sprite)` needs no cast. `TMap` is what the game's
|
|
18
|
+
* `SpriteMaterial` takes as its `map` (three's `Texture`); it is inferred on
|
|
19
|
+
* its own so an inline object of the named imports infers too.
|
|
20
|
+
*/
|
|
21
|
+
interface ThreeNs<TTexture extends ThreeTexture = ThreeTexture, TMaterial extends ThreeMaterial = ThreeMaterial, TSprite extends ThreeSprite = ThreeSprite, TMap = TTexture> extends ThreeTextureNs<TTexture> {
|
|
22
|
+
readonly SpriteMaterial: new (params: {
|
|
23
|
+
map: TMap;
|
|
24
|
+
transparent: boolean;
|
|
25
|
+
}) => TMaterial;
|
|
26
|
+
readonly Sprite: new (material: TMaterial) => TSprite;
|
|
27
|
+
}
|
|
28
|
+
/** A texture. */
|
|
29
|
+
interface ThreeTexture {
|
|
30
|
+
needsUpdate: boolean;
|
|
31
|
+
colorSpace?: string;
|
|
32
|
+
dispose(): void;
|
|
33
|
+
}
|
|
34
|
+
/** A material. */
|
|
35
|
+
interface ThreeMaterial {
|
|
36
|
+
dispose(): void;
|
|
37
|
+
}
|
|
38
|
+
/** A sprite. */
|
|
39
|
+
interface ThreeSprite {
|
|
40
|
+
readonly scale: {
|
|
41
|
+
set(x: number, y: number, z: number): void;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Options for the three.js helpers. */
|
|
45
|
+
interface ThreeAvatarOptions extends RenderOptions {
|
|
46
|
+
readonly animator?: Animator;
|
|
47
|
+
/** Texture pixels per `size` pixel (default 2). */
|
|
48
|
+
readonly resolution?: number;
|
|
49
|
+
}
|
|
50
|
+
/** A live avatar texture; `texture` is the game's own `CanvasTexture`. */
|
|
51
|
+
interface ThreeAvatarTexture<TTexture extends ThreeTexture = ThreeTexture> {
|
|
52
|
+
readonly texture: TTexture;
|
|
53
|
+
/** Redraws for the animator's pose at `t` (or a given pose), at most 30 times a second. */
|
|
54
|
+
update(t: number | Pose): void;
|
|
55
|
+
setLook(like: LookLike): void;
|
|
56
|
+
dispose(): void;
|
|
57
|
+
}
|
|
58
|
+
/** A `CanvasTexture` showing the avatar. */
|
|
59
|
+
export declare function avatarCanvasTexture<TTexture extends ThreeTexture>(three: ThreeTextureNs<TTexture>, like: LookLike, opts?: ThreeAvatarOptions): ThreeAvatarTexture<TTexture>;
|
|
60
|
+
/** A billboard `Sprite` of the avatar, `height` world units tall (default 1). */
|
|
61
|
+
export declare function avatarSprite<TTexture extends ThreeTexture & TMap, TMaterial extends ThreeMaterial, TSprite extends ThreeSprite, TMap>(three: ThreeNs<TTexture, TMaterial, TSprite, TMap>, like: LookLike, opts?: ThreeAvatarOptions & {
|
|
62
|
+
readonly height?: number;
|
|
63
|
+
}): {
|
|
64
|
+
readonly sprite: TSprite;
|
|
65
|
+
readonly avatar: ThreeAvatarTexture<TTexture>;
|
|
66
|
+
};
|
|
67
|
+
//#endregion
|
|
68
|
+
export type { ThreeAvatarOptions, ThreeAvatarTexture, ThreeNs, ThreeTextureNs };
|
|
69
|
+
//# sourceMappingURL=avatar-three.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar-three.d.ts","names":[],"sources":["../src/avatar/adapters/three.ts"],"mappings":";;;;;;;;;UAgBiB,eAAe,iBAAiB,eAAe;WACrD,oBAAoB,QAAQ,oBAAoB,oBAAoB;WACpE;;;;;;;;;UAUM,QACf,iBAAiB,eAAe,cAChC,kBAAkB,gBAAgB,eAClC,gBAAgB,cAAc,aAC9B,OAAO,kBACC,eAAe;WACd,qBAAqB;IAAU,KAAK;IAAM;QAA2B;WACrE,aAAa,UAAU,cAAc;;;UAI/B;EACf;EACA;EACA;;;UAIe;EACf;;;UAIe;WACN;IAAS,IAAI,WAAW,WAAW;;;;UAI7B,2BAA2B;WACjC,WAAW;;WAEX;;;UAIM,mBAAmB,iBAAiB,eAAe;WACzD,SAAS;;EAElB,OAAO,YAAY;EACnB,QAAQ,MAAM;EACd;;;wBAMc,oBAAoB,iBAAiB,cACnD,OAAO,eAAe,WACtB,MAAM,UACN,OAAM,qBACL,mBAAmB;;wBAoCN,aAAa,iBAAiB,eAAe,MAAM,kBAAkB,eAAe,gBAAgB,aAAa,MAC/H,OAAO,QAAQ,UAAU,WAAW,SAAS,OAC7C,MAAM,UACN,OAAM;WAAgC;;WAC1B,QAAQ;WAAkB,QAAQ,mBAAmB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { t as liveCanvas } from "./shared/live-canvas.js";
|
|
2
|
+
//#region src/avatar/adapters/three.ts
|
|
3
|
+
const MIN_FRAME_MS = 1e3 / 30;
|
|
4
|
+
/** A `CanvasTexture` showing the avatar. */
|
|
5
|
+
function avatarCanvasTexture(three, like, opts = {}) {
|
|
6
|
+
const live = liveCanvas(like, opts, opts.resolution ?? 2);
|
|
7
|
+
live.draw(opts.pose);
|
|
8
|
+
const texture = new three.CanvasTexture(live.canvas);
|
|
9
|
+
if (three.SRGBColorSpace) texture.colorSpace = three.SRGBColorSpace;
|
|
10
|
+
let last = -Infinity;
|
|
11
|
+
return {
|
|
12
|
+
texture,
|
|
13
|
+
update(t) {
|
|
14
|
+
if (typeof t === "number") {
|
|
15
|
+
if (t - last < MIN_FRAME_MS) return;
|
|
16
|
+
last = t;
|
|
17
|
+
}
|
|
18
|
+
const pose = typeof t === "number" ? opts.animator?.pose(t) : t;
|
|
19
|
+
if (live.draw(pose ?? opts.pose)) texture.needsUpdate = true;
|
|
20
|
+
},
|
|
21
|
+
setLook(next) {
|
|
22
|
+
live.setLook(next);
|
|
23
|
+
opts.animator?.setLook(next);
|
|
24
|
+
if (live.draw(opts.pose)) texture.needsUpdate = true;
|
|
25
|
+
},
|
|
26
|
+
dispose() {
|
|
27
|
+
texture.dispose();
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** A billboard `Sprite` of the avatar, `height` world units tall (default 1). */
|
|
32
|
+
function avatarSprite(three, like, opts = {}) {
|
|
33
|
+
const avatar = avatarCanvasTexture(three, like, opts);
|
|
34
|
+
const sprite = new three.Sprite(new three.SpriteMaterial({
|
|
35
|
+
map: avatar.texture,
|
|
36
|
+
transparent: true
|
|
37
|
+
}));
|
|
38
|
+
const h = opts.height ?? 1;
|
|
39
|
+
const aspect = opts.frame === "full" ? 172 / 206 : 1;
|
|
40
|
+
sprite.scale.set(h * aspect, h, 1);
|
|
41
|
+
return {
|
|
42
|
+
sprite,
|
|
43
|
+
avatar
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { avatarCanvasTexture, avatarSprite };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=avatar-three.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar-three.js","names":[],"sources":["../src/avatar/adapters/three.ts"],"mappings":";;AAuEA,MAAM,eAAe,MAAO;;AAG5B,SAAgB,oBACd,OACA,MACA,OAA2B,CAAC,GACE;CAC9B,MAAM,OAAO,WAAW,MAAM,MAAM,KAAK,cAAc,CAAC;CACxD,KAAK,KAAK,KAAK,IAAI;CACnB,MAAM,UAAU,IAAI,MAAM,cAAc,KAAK,MAAM;CACnD,IAAI,MAAM,gBACR,QAAQ,aAAa,MAAM;CAE7B,IAAI,OAAO;CACX,OAAO;EACL;EACA,OAAO,GAAG;GACR,IAAI,OAAO,MAAM,UAAU;IACzB,IAAI,IAAI,OAAO,cACb;IAEF,OAAO;GACT;GACA,MAAM,OAAO,OAAO,MAAM,WAAW,KAAK,UAAU,KAAK,CAAC,IAAI;GAC9D,IAAI,KAAK,KAAK,QAAQ,KAAK,IAAI,GAC7B,QAAQ,cAAc;EAE1B;EACA,QAAQ,MAAM;GACZ,KAAK,QAAQ,IAAI;GACjB,KAAK,UAAU,QAAQ,IAAI;GAC3B,IAAI,KAAK,KAAK,KAAK,IAAI,GACrB,QAAQ,cAAc;EAE1B;EACA,UAAU;GACR,QAAQ,QAAQ;EAClB;CACF;AACF;;AAGA,SAAgB,aACd,OACA,MACA,OAA0D,CAAC,GACkB;CAC7E,MAAM,SAAS,oBAAoB,OAAO,MAAM,IAAI;CACpD,MAAM,SAAS,IAAI,MAAM,OAAO,IAAI,MAAM,eAAe;EAAE,KAAK,OAAO;EAAS,aAAa;CAAK,CAAC,CAAC;CACpG,MAAM,IAAI,KAAK,UAAU;CACzB,MAAM,SAAS,KAAK,UAAU,SAAS,MAAM,MAAM;CACnD,OAAO,MAAM,IAAI,IAAI,QAAQ,GAAG,CAAC;CACjC,OAAO;EAAE;EAAQ;CAAO;AAC1B"}
|
package/dist/avatar.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { $ as facingFrom, A as isValidLook, B as seededRng, C as canonicalLook, D as encodeLook, E as distinctLooks, F as partsOf, G as toLook, H as deltaE, I as randomLook, J as WALKER_SEAT_DROP, K as sceneToSvg, L as render, M as normaliseHex, N as partById, O as isLookCode, P as partName, Q as defineAvatarElement, R as resolveColour, T as defaultLook, U as lightness, V as contrast, W as toCode, X as overlaySvg, Y as catalog, Z as paintOverlay, _ as PartCategory, a as CATALOG_REVISION, b as Rng, c as DecodedLook, d as LookAccessory, et as layout, f as LookColour, g as PaletteName, h as PALETTES, i as CATALOG, j as lookProblem, k as isTinted, l as FRAME_PRESETS, m as LookProblem, n as AccessorySlot, nt as AvatarElement, o as CatalogEntry, p as LookPart, q as WALKER_HEAD_SCALE, r as AvatarLook, rt as CanvasPlacement, s as DEFAULT_GEN, t as ACCESSORY_SLOTS, tt as lookToward, u as LOOK_CODE_PREFIX, v as Preset, w as decodeLook, x as SECOND_COLOUR_CODE, y as RandomLookOptions, z as sameLook } from "./shared/avatar.js";
|
|
2
|
+
import { S as mix, _ as FaceExtra, a as Frame, b as expressionFromEmote, c as Point, d as StatusProp, f as View, g as Expression, h as EXPRESSION_NAMES, i as Figure, l as Pose, m as EXPRESSIONS, n as BodyPose, o as LookDir, p as BrowParams, r as Facing, s as LookLike, t as Anchor, u as RenderOptions, v as FaceParams, x as isExpression, y as MouthParams } from "./shared/types.js";
|
|
3
|
+
import { t as SceneNode } from "./shared/scene.js";
|
|
4
|
+
import { a as ActivityIcon, c as overlays, i as createAtlas, l as Ctx2D, n as AtlasOptions, o as Overlay, r as AvatarAtlas, s as ReactionGlyph, t as AtlasFrame, u as paintNodes } from "./shared/atlas.js";
|
|
5
|
+
import { c as composeAvatar, i as ready, n as describe, o as Composed, r as onArtReady, s as HEAD_Y, t as avatarEmoji } from "./shared/describe.js";
|
|
6
|
+
import { a as animator, i as Feeling, n as AnimatorOptions, o as REACTIONS, r as At, s as Reaction, t as Animator } from "./shared/animator.js";
|
|
7
|
+
export { ACCESSORY_SLOTS, type AccessorySlot, type ActivityIcon, type Anchor, Animator, type AnimatorOptions, type At, type AtlasFrame, type AtlasOptions, AvatarAtlas, type AvatarElement, type AvatarLook, type BodyPose, type BrowParams, CATALOG, CATALOG_REVISION, type CanvasPlacement, type CatalogEntry, type Composed, type Ctx2D, DEFAULT_GEN, type DecodedLook, EXPRESSIONS, EXPRESSION_NAMES, type Expression, FRAME_PRESETS, type FaceExtra, type FaceParams, type Facing, type Feeling, type Figure, type Frame, HEAD_Y, LOOK_CODE_PREFIX, type LookAccessory, type LookColour, type LookDir, type LookLike, type LookPart, type LookProblem, type MouthParams, type Overlay, PALETTES, type PaletteName, type PartCategory, type Point, type Pose, type Preset, REACTIONS, type RandomLookOptions, type Reaction, type ReactionGlyph, type RenderOptions, type Rng, SECOND_COLOUR_CODE, type SceneNode, type StatusProp, type View, 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 };
|