@rydr/game-sdk 3.4.0 → 3.7.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 (52) hide show
  1. package/README.md +5 -0
  2. package/dist/client/PlatformClient.d.ts +19 -0
  3. package/dist/client/PlatformClient.d.ts.map +1 -1
  4. package/dist/client/PlatformClient.js +14 -2
  5. package/dist/client/PlatformClient.js.map +1 -1
  6. package/dist/conversations/hash.d.ts +34 -0
  7. package/dist/conversations/hash.d.ts.map +1 -0
  8. package/dist/conversations/hash.js +41 -0
  9. package/dist/conversations/hash.js.map +1 -0
  10. package/dist/conversations/index.d.ts +170 -0
  11. package/dist/conversations/index.d.ts.map +1 -0
  12. package/dist/conversations/index.js +430 -0
  13. package/dist/conversations/index.js.map +1 -0
  14. package/dist/conversations/voices.d.ts +16 -0
  15. package/dist/conversations/voices.d.ts.map +1 -0
  16. package/dist/conversations/voices.js +36 -0
  17. package/dist/conversations/voices.js.map +1 -0
  18. package/dist/host/PlatformHost.d.ts +14 -0
  19. package/dist/host/PlatformHost.d.ts.map +1 -1
  20. package/dist/host/PlatformHost.js +11 -0
  21. package/dist/host/PlatformHost.js.map +1 -1
  22. package/dist/protocol/boards.d.ts +16 -0
  23. package/dist/protocol/boards.d.ts.map +1 -1
  24. package/dist/protocol/boards.js.map +1 -1
  25. package/dist/protocol/characters.d.ts +13 -0
  26. package/dist/protocol/characters.d.ts.map +1 -1
  27. package/dist/protocol/conversations.d.ts +99 -0
  28. package/dist/protocol/conversations.d.ts.map +1 -0
  29. package/dist/protocol/conversations.js +23 -0
  30. package/dist/protocol/conversations.js.map +1 -0
  31. package/dist/protocol/guards.d.ts.map +1 -1
  32. package/dist/protocol/guards.js +1 -0
  33. package/dist/protocol/guards.js.map +1 -1
  34. package/dist/protocol/index.d.ts +1 -0
  35. package/dist/protocol/index.d.ts.map +1 -1
  36. package/dist/protocol/index.js +1 -0
  37. package/dist/protocol/index.js.map +1 -1
  38. package/dist/protocol/messages.d.ts +33 -2
  39. package/dist/protocol/messages.d.ts.map +1 -1
  40. package/dist/protocol/version.d.ts +2 -2
  41. package/dist/protocol/version.d.ts.map +1 -1
  42. package/dist/protocol/version.js +8 -2
  43. package/dist/protocol/version.js.map +1 -1
  44. package/dist/ui/dialogue-card.d.ts +18 -2
  45. package/dist/ui/dialogue-card.d.ts.map +1 -1
  46. package/dist/ui/dialogue-card.js +35 -9
  47. package/dist/ui/dialogue-card.js.map +1 -1
  48. package/dist/voiceover-editor/index.d.ts +60 -0
  49. package/dist/voiceover-editor/index.d.ts.map +1 -0
  50. package/dist/voiceover-editor/index.js +641 -0
  51. package/dist/voiceover-editor/index.js.map +1 -0
  52. package/package.json +9 -1
@@ -42,17 +42,42 @@ export function mountDialogueCard(host, opts = {}) {
42
42
  // runs past the budget is trimmed, not allowed to grow the box and break the surrounding layout.
43
43
  lineEl.style.height = `${(maxLines * 1.4).toFixed(2)}em`;
44
44
  lineEl.style.overflow = "hidden";
45
+ const playAudio = opts.audio !== false;
45
46
  let lines = [];
47
+ let defaultName = "";
46
48
  let idx = 0;
47
49
  let timer = null;
50
+ // One reused <audio> element for line voice-over. Created lazily so a text-only card allocates nothing.
51
+ let audioEl = null;
48
52
  const stop = () => { if (timer !== null) {
49
53
  clearInterval(timer);
50
54
  timer = null;
51
55
  } };
56
+ const stopAudio = () => { if (audioEl) {
57
+ audioEl.pause();
58
+ audioEl.removeAttribute("src");
59
+ audioEl.load();
60
+ } };
61
+ const speak = (url) => {
62
+ if (!playAudio)
63
+ return;
64
+ stopAudio();
65
+ if (!url)
66
+ return;
67
+ if (!audioEl)
68
+ audioEl = new Audio();
69
+ audioEl.src = url;
70
+ // A missing/blocked file must never break the dialogue — voice-over is a pure enhancement.
71
+ void audioEl.play().catch(() => { });
72
+ };
52
73
  const showLine = () => {
53
74
  stop();
54
75
  opts.onLine?.(idx); // a new line is now on screen → let the caller react (e.g. alternate a talking clip)
55
- const full = lines[idx] ?? "";
76
+ const line = lines[idx] ?? { text: "" };
77
+ const full = line.text ?? "";
78
+ if (line.name != null)
79
+ nameEl.textContent = line.name; // per-line speaker override
80
+ speak(line.audioUrl);
56
81
  cueEl.textContent = idx >= lines.length - 1 ? CUE_END : CUE_MORE; // ✓ on the last line, else ▸
57
82
  if (ms <= 0) {
58
83
  lineEl.textContent = full;
@@ -67,19 +92,20 @@ export function mountDialogueCard(host, opts = {}) {
67
92
  stop();
68
93
  }, ms);
69
94
  };
70
- const close = () => { stop(); card.setVisible(false); lines = []; idx = 0; };
95
+ const close = () => { stop(); stopAudio(); card.setVisible(false); lines = []; idx = 0; };
71
96
  return {
72
97
  root: card.root,
73
98
  card,
74
99
  keycap,
75
100
  open(name, ls) {
101
+ defaultName = name;
102
+ lines = ls.map((l) => (typeof l === "string" ? { text: l } : l));
76
103
  // Char count is a rough proxy for "will this fit the box" — enough to flag a likely overflow.
77
- ls.forEach((l, i) => {
78
- if (l.length > maxChars)
79
- console.warn(`[dialogue-card] line ${i} is ${l.length} chars (budget ${maxChars}); it may be clipped: "${l.slice(0, 48)}…"`);
104
+ lines.forEach((l, i) => {
105
+ if (l.text.length > maxChars)
106
+ console.warn(`[dialogue-card] line ${i} is ${l.text.length} chars (budget ${maxChars}); it may be clipped: "${l.text.slice(0, 48)}…"`);
80
107
  });
81
- nameEl.textContent = name;
82
- lines = ls;
108
+ nameEl.textContent = defaultName;
83
109
  idx = 0;
84
110
  card.setVisible(true);
85
111
  showLine();
@@ -87,7 +113,7 @@ export function mountDialogueCard(host, opts = {}) {
87
113
  advance() {
88
114
  if (timer !== null) {
89
115
  stop();
90
- lineEl.textContent = lines[idx] ?? "";
116
+ lineEl.textContent = lines[idx]?.text ?? "";
91
117
  return true;
92
118
  } // finish the line
93
119
  idx++;
@@ -101,7 +127,7 @@ export function mountDialogueCard(host, opts = {}) {
101
127
  close,
102
128
  setVisible: card.setVisible,
103
129
  setScreenPos: card.setScreenPos,
104
- dispose: () => { stop(); card.dispose(); },
130
+ dispose: () => { stop(); stopAudio(); card.dispose(); },
105
131
  };
106
132
  }
107
133
  //# sourceMappingURL=dialogue-card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dialogue-card.js","sourceRoot":"","sources":["../../src/ui/dialogue-card.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dialogue-card.js","sourceRoot":"","sources":["../../src/ui/dialogue-card.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * `@rydr/game-sdk/voiceover-editor` — the reusable per-game voice-over editor UI.
3
+ *
4
+ * Hosted on a game's admin page (`voice-over-editor.html` → `mountVoiceoverEditor`). Two tabs:
5
+ * - **Conversations** — the game's conversations (`shared` gamedata, collection `conversations`).
6
+ * - **Characters** — the per-game "voice cast" (`voice-cast` gamedata): each speaker's voice + English
7
+ * persona context + default speed. Games can't write the shared character catalog, so casting is here.
8
+ *
9
+ * If the host passes `definitions` (the game's `defineConversation`s, from `listDefinedConversations()`),
10
+ * the editor becomes CODE-AWARE: it lists code-defined conversations (text + per-line style/speed are
11
+ * read-only mirrors of code), shows a **sync status chip** (in-sync / push / lossy) diffing code vs
12
+ * stored, and runs `syncConversations({ prune })` from a header button. You can still author extra
13
+ * conversations here ("+ New") for ad-hoc testing — those are editor-authored and NEVER pruned. With no
14
+ * `definitions` (e.g. the platform's own editor) it's a plain authoring surface (no chip).
15
+ *
16
+ * Self-contained like `@rydr/game-sdk/ui`: injects its own scoped `.rydr-vo-*` CSS once. Admin-gate the
17
+ * HOST — the shell also enforces `shared` writes.
18
+ */
19
+ import type { GameDoc } from "../protocol/gamedata.js";
20
+ import type { CatalogCharacter } from "../protocol/characters.js";
21
+ import { type ConversationDef } from "../conversations/index.js";
22
+ /** The session surface the editor needs — a `PlatformSession` satisfies it. */
23
+ export interface VoiceoverEditorSession {
24
+ readonly identity: {
25
+ isAdmin?: boolean;
26
+ };
27
+ listCharacters(filter?: {
28
+ category?: string;
29
+ }): Promise<CatalogCharacter[]>;
30
+ getCharacter(id: string): Promise<CatalogCharacter | null>;
31
+ listContent(collection: string): Promise<GameDoc[]>;
32
+ getContent(collection: string, id: string): Promise<GameDoc | null>;
33
+ saveContent(collection: string, id: string, value: unknown): Promise<void>;
34
+ deleteContent(collection: string, id: string): Promise<void>;
35
+ generateVoiceover(input: {
36
+ text: string;
37
+ voice: string;
38
+ style?: string;
39
+ speed?: number;
40
+ lang?: string;
41
+ }): Promise<{
42
+ url: string;
43
+ hash: string;
44
+ cached: boolean;
45
+ }>;
46
+ }
47
+ export interface VoiceoverEditorOptions {
48
+ session: VoiceoverEditorSession;
49
+ /**
50
+ * The game's code-declared conversations (`listDefinedConversations()`). When non-empty the editor is
51
+ * code-aware (read-only code text + sync chip). Empty/omitted → plain authoring surface, no chip.
52
+ */
53
+ definitions?: ConversationDef[];
54
+ }
55
+ export interface VoiceoverEditor {
56
+ dispose(): void;
57
+ }
58
+ /** Mount the voice-over editor into `root`. */
59
+ export declare function mountVoiceoverEditor(root: HTMLElement, opts: VoiceoverEditorOptions): VoiceoverEditor;
60
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voiceover-editor/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAYlE,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEpF,+EAA+E;AAC/E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACzC,cAAc,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC3D,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACpE,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,iBAAiB,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACnK;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,sBAAsB,CAAC;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,IAAI,IAAI,CAAC;CACjB;AAgFD,+CAA+C;AAC/C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,sBAAsB,GAAG,eAAe,CAiiBrG"}