@linxin666/dsh-pet 0.3.2 → 0.3.4

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 (127) hide show
  1. package/README.i18n.yaml +2 -2
  2. package/README.md +25 -7
  3. package/README.zh.md +25 -7
  4. package/assets/ouo-neko/pet.json +31 -0
  5. package/assets/ouo-neko/previews/failed.gif +0 -0
  6. package/assets/ouo-neko/previews/idle.gif +0 -0
  7. package/assets/ouo-neko/previews/jumping.gif +0 -0
  8. package/assets/ouo-neko/previews/review.gif +0 -0
  9. package/assets/ouo-neko/previews/running-left.gif +0 -0
  10. package/assets/ouo-neko/previews/running-right.gif +0 -0
  11. package/assets/ouo-neko/previews/running.gif +0 -0
  12. package/assets/ouo-neko/previews/waiting.gif +0 -0
  13. package/assets/ouo-neko/previews/waving.gif +0 -0
  14. package/assets/ouo-neko/spritesheet.webp +0 -0
  15. package/contracts/pet-manifest-v2.schema.json +102 -1
  16. package/lib/client.js +830 -26
  17. package/lib/client.js.map +1 -1
  18. package/lib/index.js +1226 -24
  19. package/lib/types/client/PetDockEntry.d.ts +3 -0
  20. package/lib/types/client/PetDockEntry.d.ts.map +1 -1
  21. package/lib/types/client/PetDockEntry.js +18 -2
  22. package/lib/types/client/PetSprite.d.ts +23 -0
  23. package/lib/types/client/PetSprite.d.ts.map +1 -1
  24. package/lib/types/client/PetSprite.js +34 -29
  25. package/lib/types/client/PluginSettingsCard.d.ts +2 -0
  26. package/lib/types/client/PluginSettingsCard.d.ts.map +1 -1
  27. package/lib/types/client/PluginSettingsCard.js +2 -2
  28. package/lib/types/client/drag-stream.d.ts +19 -0
  29. package/lib/types/client/drag-stream.d.ts.map +1 -0
  30. package/lib/types/client/drag-stream.js +26 -0
  31. package/lib/types/client/gameplay-hud.d.ts +50 -0
  32. package/lib/types/client/gameplay-hud.d.ts.map +1 -0
  33. package/lib/types/client/gameplay-hud.js +274 -0
  34. package/lib/types/client/index.d.ts +1 -1
  35. package/lib/types/client/index.d.ts.map +1 -1
  36. package/lib/types/client/index.js +16 -0
  37. package/lib/types/client/locales.d.ts +34 -0
  38. package/lib/types/client/locales.d.ts.map +1 -1
  39. package/lib/types/client/locales.js +36 -0
  40. package/lib/types/client/pet-store.d.ts +7 -1
  41. package/lib/types/client/pet-store.d.ts.map +1 -1
  42. package/lib/types/client/pet-store.js +4 -0
  43. package/lib/types/client/renderers/Frames2dVisualMount.d.ts +29 -0
  44. package/lib/types/client/renderers/Frames2dVisualMount.d.ts.map +1 -0
  45. package/lib/types/client/renderers/Frames2dVisualMount.js +83 -0
  46. package/lib/types/client/renderers/PetRendererSwitch.d.ts +6 -0
  47. package/lib/types/client/renderers/PetRendererSwitch.d.ts.map +1 -1
  48. package/lib/types/client/renderers/PetRendererSwitch.js +14 -1
  49. package/lib/types/client/renderers/frames2d.d.ts +36 -0
  50. package/lib/types/client/renderers/frames2d.d.ts.map +1 -0
  51. package/lib/types/client/renderers/frames2d.js +196 -0
  52. package/lib/types/client/settings-form.d.ts +1 -1
  53. package/lib/types/client/settings-form.js +1 -1
  54. package/lib/types/client/telemetry.d.ts +27 -0
  55. package/lib/types/client/telemetry.d.ts.map +1 -0
  56. package/lib/types/client/telemetry.js +97 -0
  57. package/lib/types/defaults.d.ts +6 -0
  58. package/lib/types/defaults.d.ts.map +1 -0
  59. package/lib/types/defaults.js +5 -0
  60. package/lib/types/dsh-home.d.ts.map +1 -1
  61. package/lib/types/dsh-home.js +9 -3
  62. package/lib/types/gameplay.d.ts +182 -0
  63. package/lib/types/gameplay.d.ts.map +1 -0
  64. package/lib/types/gameplay.js +618 -0
  65. package/lib/types/http.d.ts +1 -1
  66. package/lib/types/http.js +1 -1
  67. package/lib/types/index.d.ts +1 -1
  68. package/lib/types/index.js +1 -1
  69. package/lib/types/ledger.d.ts +14 -0
  70. package/lib/types/ledger.d.ts.map +1 -1
  71. package/lib/types/ledger.js +30 -0
  72. package/lib/types/loopback.d.ts +1 -1
  73. package/lib/types/loopback.js +1 -1
  74. package/lib/types/manifest-v2.d.ts +38 -1
  75. package/lib/types/manifest-v2.d.ts.map +1 -1
  76. package/lib/types/manifest-v2.js +182 -2
  77. package/lib/types/mount-once.d.ts +1 -1
  78. package/lib/types/mount-once.js +2 -2
  79. package/lib/types/persist.d.ts +4 -4
  80. package/lib/types/persist.d.ts.map +1 -1
  81. package/lib/types/persist.js +41 -4
  82. package/lib/types/registry.d.ts +29 -0
  83. package/lib/types/registry.d.ts.map +1 -1
  84. package/lib/types/registry.js +170 -1
  85. package/lib/types/routes.d.ts.map +1 -1
  86. package/lib/types/routes.js +22 -0
  87. package/lib/types/service.d.ts +56 -0
  88. package/lib/types/service.d.ts.map +1 -1
  89. package/lib/types/service.js +181 -0
  90. package/package.json +6 -3
  91. package/src/client/PetDockEntry.test.tsx +6 -0
  92. package/src/client/PetDockEntry.tsx +32 -1
  93. package/src/client/PetSprite.test.tsx +36 -6
  94. package/src/client/PetSprite.tsx +42 -21
  95. package/src/client/PluginSettingsCard.tsx +4 -2
  96. package/src/client/drag-stream.ts +35 -0
  97. package/src/client/gameplay-hud.test.tsx +338 -0
  98. package/src/client/gameplay-hud.tsx +403 -0
  99. package/src/client/index.ts +23 -2
  100. package/src/client/locales.ts +36 -0
  101. package/src/client/pet-store.ts +10 -1
  102. package/src/client/pet.module.css +192 -29
  103. package/src/client/renderers/Frames2dVisualMount.tsx +111 -0
  104. package/src/client/renderers/PetRendererSwitch.tsx +28 -1
  105. package/src/client/renderers/frames2d.test.ts +137 -0
  106. package/src/client/renderers/frames2d.ts +216 -0
  107. package/src/client/settings-card.module.css +5 -0
  108. package/src/client/settings-form.ts +1 -1
  109. package/src/client/telemetry.ts +105 -0
  110. package/src/defaults.ts +7 -0
  111. package/src/dsh-home.ts +9 -3
  112. package/src/gameplay.test.ts +239 -0
  113. package/src/gameplay.ts +692 -0
  114. package/src/http.ts +1 -1
  115. package/src/index.ts +1 -1
  116. package/src/ledger.test.ts +16 -0
  117. package/src/ledger.ts +31 -0
  118. package/src/loopback.ts +1 -1
  119. package/src/manifest-v2.test.ts +130 -1
  120. package/src/manifest-v2.ts +181 -2
  121. package/src/mount-once.ts +2 -2
  122. package/src/persist.test.ts +3 -0
  123. package/src/persist.ts +43 -6
  124. package/src/registry.test.ts +168 -1
  125. package/src/registry.ts +199 -1
  126. package/src/routes.ts +19 -0
  127. package/src/service.ts +208 -0
@@ -10,6 +10,7 @@ import { type AffinityConfig, type PetAffinityView, type PetInteraction } from '
10
10
  import { type TreatConfig } from './treats.ts';
11
11
  import { type PetRemarks } from './remarks.ts';
12
12
  import type { PetDisplayConfig, PetPersist } from './persist.ts';
13
+ import type { PetGameplayState } from './gameplay.ts';
13
14
  /** Tuning overrides for the affinity economy. */
14
15
  export interface LedgerConfig {
15
16
  affinity?: Partial<AffinityConfig>;
@@ -59,6 +60,8 @@ export declare class PetLedger {
59
60
  setDisplay(display: PetDisplayConfig): void;
60
61
  /** Replace the selected pet id (validation stays a caller concern). */
61
62
  setPetId(petId: string): void;
63
+ /** Replace one pet's gameplay state (validation/clamping stays a caller concern). */
64
+ setGameplay(petId: string, gameplay: PetGameplayState): void;
62
65
  /** Replace one pet's display name (validation stays a caller concern). */
63
66
  setPetName(petId: string, name: string): void;
64
67
  /**
@@ -73,6 +76,17 @@ export declare class PetLedger {
73
76
  * the in-memory ledger changed and should be persisted.
74
77
  */
75
78
  settleTreats(nowMs: number): boolean;
79
+ /**
80
+ * Grant gameplay treats into the shared stock (capped by the treat cap).
81
+ * This is the unified gameplay currency (wallet removed): work rewards,
82
+ * passive income and lottery prizes land here so one balance feeds the
83
+ * shop and the feeding economy. Returns true when the snapshot changed.
84
+ */
85
+ grantTreats(amount: number): boolean;
86
+ /** Spend gameplay treats from the shared stock; refuses when unaffordable. */
87
+ spendTreats(amount: number): {
88
+ ok: boolean;
89
+ };
76
90
  /**
77
91
  * Award the completed-turn reward once per session+turn (idempotent) and
78
92
  * run the treat settlement that work output feeds. Returns true when the
@@ -1 +1 @@
1
- {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEhE,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC7B,mFAAmF;IACnF,OAAO,CAAC,EAAE,UAAU,CAAA;CACrB;AAED,wEAAwE;AACxE,MAAM,WAAW,uBAAuB;IACtC,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAA;IACb,6DAA6D;IAC7D,QAAQ,EAAE,eAAe,CAAA;CAC1B;AAED;;;;GAIG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAY;IAC3B,oFAAoF;IACpF,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,sBAAsB,CAAI;IAClC,OAAO,CAAC,KAAK,CAAQ;gBAET,OAAO,EAAE,UAAU,EAAE,MAAM,GAAE,YAAiB;IAO1D,iDAAiD;IACjD,IAAI,QAAQ,IAAI,cAAc,CAE7B;IAED,qEAAqE;IACrE,IAAI,QAAQ,IAAI,UAAU,CAEzB;IAED,qCAAqC;IACrC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,+DAA+D;IAC/D,SAAS,IAAI,OAAO;IAMpB;;;OAGG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAItC,mEAAmE;IACnE,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAK3C,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7B,0EAA0E;IAC1E,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAK7C;;;OAGG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAItC;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAapC;;;;OAIG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IASnE,8EAA8E;IAC9E,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IASxC,OAAO,CAAC,eAAe;IASvB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,uBAAuB;IAwCtE,kDAAkD;IAClD,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe;CAG7C"}
1
+ {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAErD,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC7B,mFAAmF;IACnF,OAAO,CAAC,EAAE,UAAU,CAAA;CACrB;AAED,wEAAwE;AACxE,MAAM,WAAW,uBAAuB;IACtC,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAA;IACb,6DAA6D;IAC7D,QAAQ,EAAE,eAAe,CAAA;CAC1B;AAED;;;;GAIG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAY;IAC3B,oFAAoF;IACpF,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,sBAAsB,CAAI;IAClC,OAAO,CAAC,KAAK,CAAQ;gBAET,OAAO,EAAE,UAAU,EAAE,MAAM,GAAE,YAAiB;IAO1D,iDAAiD;IACjD,IAAI,QAAQ,IAAI,cAAc,CAE7B;IAED,qEAAqE;IACrE,IAAI,QAAQ,IAAI,UAAU,CAEzB;IAED,qCAAqC;IACrC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,+DAA+D;IAC/D,SAAS,IAAI,OAAO;IAMpB;;;OAGG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAItC,mEAAmE;IACnE,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAK3C,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7B,qFAAqF;IACrF,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAK5D,0EAA0E;IAC1E,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAK7C;;;OAGG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAItC;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAapC;;;;;OAKG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IASpC,8EAA8E;IAC9E,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE;IAQ5C;;;;OAIG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IASnE,8EAA8E;IAC9E,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IASxC,OAAO,CAAC,eAAe;IASvB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,uBAAuB;IAwCtE,kDAAkD;IAClD,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe;CAG7C"}
@@ -67,6 +67,11 @@ export class PetLedger {
67
67
  this.current = { ...this.current, petId };
68
68
  this.dirty = true;
69
69
  }
70
+ /** Replace one pet's gameplay state (validation/clamping stays a caller concern). */
71
+ setGameplay(petId, gameplay) {
72
+ this.current = { ...this.current, gameplay: { ...this.current.gameplay, [petId]: gameplay } };
73
+ this.dirty = true;
74
+ }
70
75
  /** Replace one pet's display name (validation stays a caller concern). */
71
76
  setPetName(petId, name) {
72
77
  this.current = { ...this.current, names: { ...this.current.names, [petId]: name } };
@@ -93,6 +98,31 @@ export class PetLedger {
93
98
  this.dirty = true;
94
99
  return true;
95
100
  }
101
+ /**
102
+ * Grant gameplay treats into the shared stock (capped by the treat cap).
103
+ * This is the unified gameplay currency (wallet removed): work rewards,
104
+ * passive income and lottery prizes land here so one balance feeds the
105
+ * shop and the feeding economy. Returns true when the snapshot changed.
106
+ */
107
+ grantTreats(amount) {
108
+ if (amount <= 0)
109
+ return false;
110
+ const capped = Math.min(this.treatConfig.maxTreats, this.current.treats.treats + amount);
111
+ if (capped === this.current.treats.treats)
112
+ return false;
113
+ this.current = { ...this.current, treats: { ...this.current.treats, treats: capped } };
114
+ this.dirty = true;
115
+ return true;
116
+ }
117
+ /** Spend gameplay treats from the shared stock; refuses when unaffordable. */
118
+ spendTreats(amount) {
119
+ const stock = this.current.treats.treats;
120
+ if (amount <= 0 || stock < amount)
121
+ return { ok: false };
122
+ this.current = { ...this.current, treats: { ...this.current.treats, treats: stock - amount } };
123
+ this.dirty = true;
124
+ return { ok: true };
125
+ }
96
126
  /**
97
127
  * Award the completed-turn reward once per session+turn (idempotent) and
98
128
  * run the treat settlement that work output feeds. Returns true when the
@@ -7,7 +7,7 @@
7
7
  * Semantics: RFC 5735 IPv4 127/8, ::1, IPv4-mapped ::ffff:127/8 (matching the
8
8
  * remote-web-ui gate), localhost hostnames, plus the browser same-origin
9
9
  * markers (sec-fetch-site and Origin) for the request-level fence.
10
- * @module dsh-web-ui-shared/host/loopback
10
+ * @module dsh-web-shared/host/loopback
11
11
  */
12
12
  import type { IncomingMessage } from 'node:http';
13
13
  /** IPv4 127/8 predicate (four decimal octets, first == 127). */
@@ -8,7 +8,7 @@
8
8
  * Semantics: RFC 5735 IPv4 127/8, ::1, IPv4-mapped ::ffff:127/8 (matching the
9
9
  * remote-web-ui gate), localhost hostnames, plus the browser same-origin
10
10
  * markers (sec-fetch-site and Origin) for the request-level fence.
11
- * @module dsh-web-ui-shared/host/loopback
11
+ * @module dsh-web-shared/host/loopback
12
12
  */
13
13
  /** IPv4 127/8 predicate (four decimal octets, first == 127). */
14
14
  export function isIPv4Loopback(v4) {
@@ -23,10 +23,11 @@
23
23
  * @module @linxin666/dsh-pet/manifest-v2
24
24
  */
25
25
  import type { ActivityPhase, PetAnimation } from './state.ts';
26
+ import { type PetGameplayManifest } from './gameplay.ts';
26
27
  /** Schema version this module validates. */
27
28
  export declare const PET_MANIFEST_V2: 2;
28
29
  /** Renderer kinds the pet center knows how to dispatch (M1 §2). */
29
- export declare const PET_RENDERER_KINDS: readonly ["sprite2d", "live2d"];
30
+ export declare const PET_RENDERER_KINDS: readonly ["sprite2d", "live2d", "frames2d"];
30
31
  export type PetRendererKind = (typeof PET_RENDERER_KINDS)[number];
31
32
  /** The seven ActivityPhase semantics (pet-center owned; M1 §1). */
32
33
  export declare const PET_ACTIVITY_PHASES: readonly ActivityPhase[];
@@ -70,6 +71,35 @@ export interface PetManifestLive2d {
70
71
  /** Whisper-paced lip sync (post-M3). */
71
72
  lipSync?: boolean;
72
73
  }
74
+ /** One frames2d track: an ordered frame sequence plus its rhythm. */
75
+ export interface PetManifestFrames2dTrack {
76
+ /** Explicit ordered frame file names inside <dir>/<track>/; omitted means "list the directory". */
77
+ frames?: string[];
78
+ /** Per-frame durations in ms, same length as frames; wins over filename-encoded ms. */
79
+ frameMs?: number[];
80
+ /** Loop the track (default true); false stops on the last frame, then enters fallback. */
81
+ loop?: boolean;
82
+ /** Track entered when a non-loop track ends (default 'idle'). */
83
+ fallback?: string;
84
+ }
85
+ /**
86
+ * frames2d renderer block: free-form named frame-sequence tracks laid out as
87
+ * <dir>/<track>/<frame>.webp, with phase-direct state selection (the live2d
88
+ * motions precedent). Frame durations resolve frameMs[i] > filename-encoded
89
+ * <base>_<index>_<ms> suffix > defaultFrameMs.
90
+ */
91
+ export interface PetManifestFrames2d {
92
+ /** Frame root directory relative to the manifest directory (default '.'). */
93
+ dir?: string;
94
+ /** Default per-frame duration in ms (default 200). */
95
+ defaultFrameMs?: number;
96
+ /** Named tracks (1..64, kebab ids). */
97
+ tracks: Record<string, PetManifestFrames2dTrack>;
98
+ /** ActivityPhase -> track name; idle is required, unmapped phases fall back to it. */
99
+ phases: Partial<Record<ActivityPhase, string>> & {
100
+ idle: string;
101
+ };
102
+ }
73
103
  /** Normalized v2 manifest the registry consumes. */
74
104
  export interface PetManifestV2 {
75
105
  petManifestVersion: typeof PET_MANIFEST_V2;
@@ -84,6 +114,9 @@ export interface PetManifestV2 {
84
114
  renderer: PetRendererKind;
85
115
  sprite2d?: PetManifestSprite2d;
86
116
  live2d?: PetManifestLive2d;
117
+ frames2d?: PetManifestFrames2d;
118
+ /** Optional gameplay layer (frames2d pets only); fail-closed structure. */
119
+ gameplay?: PetGameplayManifest;
87
120
  sequences?: Partial<Record<ActivityPhase, PetAnimation[]>>;
88
121
  /** Pass-through for the registry's remarks normalizer (v1 shape). */
89
122
  remarks?: unknown;
@@ -113,6 +146,10 @@ export declare const KNOWN_TOP_LEVEL: Set<string>;
113
146
  export declare const KNOWN_SPRITE2D: Set<string>;
114
147
  /** live2d block field allow-list (drift-locked to the schema file). */
115
148
  export declare const KNOWN_LIVE2D: Set<string>;
149
+ /** frames2d block field allow-list (drift-locked to the schema file). */
150
+ export declare const KNOWN_FRAMES2D: Set<string>;
151
+ /** frames2d track field allow-list (drift-locked to the schema file). */
152
+ export declare const KNOWN_FRAMES2D_TRACK: Set<string>;
116
153
  /**
117
154
  * Validate a manifest-relative asset path: no absolute paths, no backslashes,
118
155
  * no traversal, plain safe segments only. Returns the normalized path.
@@ -1 +1 @@
1
- {"version":3,"file":"manifest-v2.d.ts","sourceRoot":"","sources":["../../src/manifest-v2.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest-v2.d.ts","sourceRoot":"","sources":["../../src/manifest-v2.ts"],"names":[],"mappings":"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"}
@@ -23,10 +23,11 @@
23
23
  * @module @linxin666/dsh-pet/manifest-v2
24
24
  */
25
25
  import { isAbsolute } from 'node:path';
26
+ import { parseGameplayManifest } from "./gameplay.js";
26
27
  /** Schema version this module validates. */
27
28
  export const PET_MANIFEST_V2 = 2;
28
29
  /** Renderer kinds the pet center knows how to dispatch (M1 §2). */
29
- export const PET_RENDERER_KINDS = ['sprite2d', 'live2d'];
30
+ export const PET_RENDERER_KINDS = ['sprite2d', 'live2d', 'frames2d'];
30
31
  /** The seven ActivityPhase semantics (pet-center owned; M1 §1). */
31
32
  export const PET_ACTIVITY_PHASES = [
32
33
  'idle', 'waiting', 'thinking', 'tool', 'review', 'done', 'failed',
@@ -41,12 +42,17 @@ const SEMVER_PATTERN = /^\d+\.\d+\.\d+$/;
41
42
  */
42
43
  export const KNOWN_TOP_LEVEL = new Set([
43
44
  '$schema', 'petManifestVersion', 'id', 'displayName', 'description', 'version',
44
- 'author', 'license', 'homepage', 'renderer', 'sprite2d', 'live2d', 'sequences', 'remarks',
45
+ 'author', 'license', 'homepage', 'renderer', 'sprite2d', 'live2d', 'frames2d', 'sequences', 'remarks',
46
+ 'gameplay',
45
47
  ]);
46
48
  /** sprite2d block field allow-list (drift-locked to the schema file). */
47
49
  export const KNOWN_SPRITE2D = new Set(['spritesheetPath', 'cell', 'columns', 'atlasRows', 'frames', 'tracks']);
48
50
  /** live2d block field allow-list (drift-locked to the schema file). */
49
51
  export const KNOWN_LIVE2D = new Set(['model', 'scale', 'translate', 'motions', 'expressions', 'hitAreas', 'lipSync']);
52
+ /** frames2d block field allow-list (drift-locked to the schema file). */
53
+ export const KNOWN_FRAMES2D = new Set(['dir', 'defaultFrameMs', 'tracks', 'phases']);
54
+ /** frames2d track field allow-list (drift-locked to the schema file). */
55
+ export const KNOWN_FRAMES2D_TRACK = new Set(['frames', 'frameMs', 'loop', 'fallback']);
50
56
  class Diagnostics {
51
57
  list = [];
52
58
  source;
@@ -239,6 +245,154 @@ function parseLive2dBlock(raw, diag) {
239
245
  }
240
246
  return diag.hasErrors ? undefined : block;
241
247
  }
248
+ const FRAMES2D_TRACK_NAME = /^[a-z0-9][a-z0-9-]*$/;
249
+ const FRAMES2D_MAX_TRACKS = 64;
250
+ const FRAMES2D_MAX_FRAMES = 64;
251
+ const FRAMES2D_MIN_FRAME_MS = 16;
252
+ const FRAMES2D_MAX_FRAME_MS = 5_000;
253
+ const FRAMES2D_IMAGE_EXTENSIONS = new Set(['.webp', '.png', '.gif', '.jpg', '.jpeg']);
254
+ /** Validate one frames2d track name (kebab id, at most 32 chars). */
255
+ function validTrackName(name) {
256
+ return name.length <= 32 && FRAMES2D_TRACK_NAME.test(name);
257
+ }
258
+ /** A frames2d frame entry is a single image file name inside the track directory. */
259
+ function safeFrameName(raw) {
260
+ if (typeof raw !== 'string' || raw.trim() === '')
261
+ return undefined;
262
+ const value = raw.trim();
263
+ if (value.includes('/') || value.includes('\\') || !PATH_SEGMENT_PATTERN.test(value))
264
+ return undefined;
265
+ const dot = value.lastIndexOf('.');
266
+ if (dot <= 0)
267
+ return undefined;
268
+ if (!FRAMES2D_IMAGE_EXTENSIONS.has(value.slice(dot).toLowerCase()))
269
+ return undefined;
270
+ return value;
271
+ }
272
+ function parseFrames2dTrack(raw, field, diag) {
273
+ if (!isRecord(raw)) {
274
+ diag.error(field + ' must be an object');
275
+ return undefined;
276
+ }
277
+ const extra = unknownKeys(raw, KNOWN_FRAMES2D_TRACK);
278
+ if (extra.length > 0)
279
+ diag.error(field + ': unknown field(s) ' + extra.map(k => JSON.stringify(k)).join(', '));
280
+ const track = {};
281
+ if (raw.frames !== undefined) {
282
+ if (!Array.isArray(raw.frames) || raw.frames.length === 0) {
283
+ diag.error(field + '.frames must be a non-empty array of frame file names');
284
+ }
285
+ else if (raw.frames.length > FRAMES2D_MAX_FRAMES) {
286
+ diag.error(field + '.frames declares too many frames (' + raw.frames.length + ', max ' + FRAMES2D_MAX_FRAMES + ')');
287
+ }
288
+ else {
289
+ const frames = [];
290
+ for (const entry of raw.frames) {
291
+ const safe = safeFrameName(entry);
292
+ if (safe === undefined)
293
+ diag.error(field + '.frames entry ' + JSON.stringify(String(entry)) + ' is not a safe image file name');
294
+ else
295
+ frames.push(safe);
296
+ }
297
+ if (frames.length === raw.frames.length)
298
+ track.frames = frames;
299
+ }
300
+ }
301
+ if (raw.frameMs !== undefined) {
302
+ if (!Array.isArray(raw.frameMs) || raw.frameMs.length === 0
303
+ || raw.frameMs.some(v => typeof v !== 'number' || !Number.isInteger(v) || v < FRAMES2D_MIN_FRAME_MS || v > FRAMES2D_MAX_FRAME_MS)) {
304
+ diag.error(field + '.frameMs must be a non-empty array of integer ms in [' + FRAMES2D_MIN_FRAME_MS + ', ' + FRAMES2D_MAX_FRAME_MS + ']');
305
+ }
306
+ else if (track.frames === undefined) {
307
+ diag.error(field + '.frameMs requires a valid explicit frames list (directory tracks use filename-encoded ms or defaultFrameMs)');
308
+ }
309
+ else if (raw.frameMs.length !== track.frames.length) {
310
+ diag.error(field + '.frameMs must have the same length as frames');
311
+ }
312
+ else {
313
+ track.frameMs = raw.frameMs;
314
+ }
315
+ }
316
+ if (raw.loop !== undefined) {
317
+ if (typeof raw.loop !== 'boolean')
318
+ diag.error(field + '.loop must be a boolean');
319
+ else
320
+ track.loop = raw.loop;
321
+ }
322
+ if (raw.fallback !== undefined) {
323
+ if (typeof raw.fallback !== 'string' || !validTrackName(raw.fallback))
324
+ diag.error(field + '.fallback must be a track name');
325
+ else
326
+ track.fallback = raw.fallback;
327
+ }
328
+ return diag.hasErrors ? undefined : track;
329
+ }
330
+ function parseFrames2dBlock(raw, diag) {
331
+ if (!isRecord(raw)) {
332
+ diag.error('renderer frames2d requires a "frames2d" block object');
333
+ return undefined;
334
+ }
335
+ const extra = unknownKeys(raw, KNOWN_FRAMES2D);
336
+ if (extra.length > 0)
337
+ diag.error('frames2d: unknown field(s) ' + extra.map(k => JSON.stringify(k)).join(', '));
338
+ const block = { tracks: {}, phases: { idle: '' } };
339
+ if (raw.dir !== undefined) {
340
+ const dir = safeManifestPath(raw.dir);
341
+ if (dir === undefined)
342
+ diag.error('frames2d.dir must be a safe manifest-relative directory');
343
+ else
344
+ block.dir = dir;
345
+ }
346
+ if (raw.defaultFrameMs !== undefined) {
347
+ if (typeof raw.defaultFrameMs !== 'number' || !Number.isInteger(raw.defaultFrameMs) || raw.defaultFrameMs < FRAMES2D_MIN_FRAME_MS || raw.defaultFrameMs > FRAMES2D_MAX_FRAME_MS) {
348
+ diag.error('frames2d.defaultFrameMs must be an integer in [' + FRAMES2D_MIN_FRAME_MS + ', ' + FRAMES2D_MAX_FRAME_MS + ']');
349
+ }
350
+ else
351
+ block.defaultFrameMs = raw.defaultFrameMs;
352
+ }
353
+ const tracks = {};
354
+ if (!isRecord(raw.tracks)) {
355
+ diag.error('frames2d.tracks is required and must be an object keyed by track name');
356
+ }
357
+ else {
358
+ const entries = Object.entries(raw.tracks);
359
+ if (entries.length === 0)
360
+ diag.error('frames2d.tracks must declare at least one track');
361
+ if (entries.length > FRAMES2D_MAX_TRACKS)
362
+ diag.error('frames2d.tracks declares too many tracks (' + entries.length + ', max ' + FRAMES2D_MAX_TRACKS + ')');
363
+ for (const [name, value] of entries) {
364
+ if (!validTrackName(name)) {
365
+ diag.error('frames2d.tracks: invalid track name ' + JSON.stringify(name) + ' (lowercase kebab, at most 32 chars)');
366
+ continue;
367
+ }
368
+ const track = parseFrames2dTrack(value, 'frames2d.tracks.' + name, diag);
369
+ if (track !== undefined)
370
+ tracks[name] = track;
371
+ }
372
+ }
373
+ block.tracks = tracks;
374
+ const phases = parsePhaseStringMap(raw.phases, 'frames2d.phases', diag);
375
+ if (raw.phases === undefined)
376
+ diag.error('frames2d.phases is required (at least an "idle" mapping)');
377
+ else if (phases !== undefined && phases.idle === undefined)
378
+ diag.error('frames2d.phases.idle is required (unmapped phases fall back to it)');
379
+ const phasesValid = phases !== undefined && phases.idle !== undefined;
380
+ if (phasesValid)
381
+ block.phases = phases;
382
+ // Dangling references (phases/fallback) are structure: fail closed.
383
+ if (phasesValid) {
384
+ for (const [phase, target] of Object.entries(block.phases)) {
385
+ if (target !== undefined && tracks[target] === undefined)
386
+ diag.error('frames2d.phases.' + phase + ' references unknown track ' + JSON.stringify(target));
387
+ }
388
+ }
389
+ for (const [name, track] of Object.entries(tracks)) {
390
+ if (track.fallback !== undefined && tracks[track.fallback] === undefined) {
391
+ diag.error('frames2d.tracks.' + name + '.fallback references unknown track ' + JSON.stringify(track.fallback));
392
+ }
393
+ }
394
+ return diag.hasErrors ? undefined : block;
395
+ }
242
396
  /** v1 compat read: map the legacy flat manifest onto the v2 sprite2d shape. */
243
397
  function compatV1(source, diag) {
244
398
  const id = parseStringBlock(source, 'id', diag, true);
@@ -343,6 +497,8 @@ function parseV2(source, diag) {
343
497
  manifest.sprite2d = block;
344
498
  if (source.live2d !== undefined)
345
499
  diag.error('renderer sprite2d must not declare a live2d block');
500
+ if (source.frames2d !== undefined)
501
+ diag.error('renderer sprite2d must not declare a frames2d block');
346
502
  }
347
503
  else if (renderer === 'live2d') {
348
504
  const block = parseLive2dBlock(source.live2d, diag);
@@ -350,6 +506,30 @@ function parseV2(source, diag) {
350
506
  manifest.live2d = block;
351
507
  if (source.sprite2d !== undefined)
352
508
  diag.error('renderer live2d must not declare a sprite2d block');
509
+ if (source.frames2d !== undefined)
510
+ diag.error('renderer live2d must not declare a frames2d block');
511
+ }
512
+ else if (renderer === 'frames2d') {
513
+ const block = parseFrames2dBlock(source.frames2d, diag);
514
+ if (block !== undefined)
515
+ manifest.frames2d = block;
516
+ if (source.sprite2d !== undefined)
517
+ diag.error('renderer frames2d must not declare a sprite2d block');
518
+ if (source.live2d !== undefined)
519
+ diag.error('renderer frames2d must not declare a live2d block');
520
+ }
521
+ if (source.gameplay !== undefined) {
522
+ if (renderer !== 'frames2d') {
523
+ diag.error('gameplay currently requires renderer frames2d (its state references name frames2d tracks)');
524
+ }
525
+ else {
526
+ const gameplay = parseGameplayManifest(source.gameplay, {
527
+ stateNames: new Set(Object.keys(manifest.frames2d?.tracks ?? {})),
528
+ error: (message) => diag.error('gameplay: ' + message),
529
+ });
530
+ if (gameplay !== undefined)
531
+ manifest.gameplay = gameplay;
532
+ }
353
533
  }
354
534
  const sequences = parseSequences(source.sequences, diag);
355
535
  if (sequences !== undefined)
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Host single-instance guard shared by the plugin family. The family bundle
3
- * (dsh-web-ui-all / dsh-skins) namespaces every child row id (web-ui-*), so
3
+ * (dsh-web-all / dsh-skins) namespaces every child row id (web-ui-*), so
4
4
  * the loader accepts a standalone install of the same package side by side;
5
5
  * without this guard the second instance would still re-register the same
6
6
  * webserver routes, tools, settings namespaces, and system-prompt sections
@@ -1,7 +1,7 @@
1
1
  // Generated by scripts/sync-shared.mjs from shared/host/mount-once.ts. Do not edit this copy; edit the shared source and run "node scripts/sync-shared.mjs".
2
2
  /**
3
3
  * Host single-instance guard shared by the plugin family. The family bundle
4
- * (dsh-web-ui-all / dsh-skins) namespaces every child row id (web-ui-*), so
4
+ * (dsh-web-all / dsh-skins) namespaces every child row id (web-ui-*), so
5
5
  * the loader accepts a standalone install of the same package side by side;
6
6
  * without this guard the second instance would still re-register the same
7
7
  * webserver routes, tools, settings namespaces, and system-prompt sections
@@ -14,7 +14,7 @@
14
14
  * `ctx.effect` runs its callback immediately and treats the callback's
15
15
  * return value as the fiber disposer, so the unmarker is returned, not run.
16
16
  */
17
- const MOUNTED = Symbol.for('dsh-web-ui.mounted-plugins');
17
+ const MOUNTED = Symbol.for('dsh-web.mounted-plugins');
18
18
  function mountedSet() {
19
19
  const registry = globalThis;
20
20
  return (registry[MOUNTED] ??= new Set());
@@ -6,6 +6,8 @@
6
6
  */
7
7
  import { type AffinityState } from './affinity.ts';
8
8
  import { type TreatLedger } from './treats.ts';
9
+ import type { PetGameplayState } from './gameplay.ts';
10
+ export { DEFAULT_PET_ID, DEFAULT_PET_NAME } from './defaults.ts';
9
11
  /** Display configuration the user can tweak. */
10
12
  export interface PetDisplayConfig {
11
13
  /** Master switch. */
@@ -35,11 +37,9 @@ export interface PetPersist {
35
37
  /** Treat (小鱼干) stock ledger. */
36
38
  treats: TreatLedger;
37
39
  display: PetDisplayConfig;
40
+ /** Per-pet gameplay state (stats/currencies/mode), keyed by pet id. */
41
+ gameplay: Record<string, PetGameplayState>;
38
42
  }
39
- /** Pet id the legacy single-pet installs resolve to on migration. */
40
- export declare const DEFAULT_PET_ID = "whale-girl";
41
- /** Default pet name (used only when a manifest carries no displayName). */
42
- export declare const DEFAULT_PET_NAME = "\u9CB8\u9C7C\u5A18";
43
43
  /** Name constraints. */
44
44
  export declare const PET_NAME_MAX_LENGTH = 20;
45
45
  export declare function emptyPersist(): PetPersist;
@@ -1 +1 @@
1
- {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../src/persist.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAC/E,OAAO,EAAwC,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAEpF,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;IACZ,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAA;IACb,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAA;CACf;AAED,eAAO,MAAM,oBAAoB,EAAE,gBAKlC,CAAA;AAED,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAClC,eAAO,MAAM,gBAAgB,MAAM,CAAA;AACnC,eAAO,MAAM,iBAAiB,QAAS,CAAA;AAEvC,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,QAAQ,EAAE,aAAa,CAAA;IACvB,gCAAgC;IAChC,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,gBAAgB,CAAA;CAC1B;AAED,qEAAqE;AACrE,eAAO,MAAM,cAAc,eAAe,CAAA;AAE1C,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,uBAAQ,CAAA;AAErC,wBAAwB;AACxB,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC,wBAAgB,YAAY,IAAI,UAAU,CAQzC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AA4BD,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAqB,GAAG,UAAU,CAmDrE;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,GAAE,MAAqB,GAAG,IAAI,CAMjF"}
1
+ {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../src/persist.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAC/E,OAAO,EAAwC,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAEpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAErD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhE,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;IACZ,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAA;IACb,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAA;CACf;AAED,eAAO,MAAM,oBAAoB,EAAE,gBAKlC,CAAA;AAED,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAClC,eAAO,MAAM,gBAAgB,MAAM,CAAA;AACnC,eAAO,MAAM,iBAAiB,QAAS,CAAA;AAEvC,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,QAAQ,EAAE,aAAa,CAAA;IACvB,gCAAgC;IAChC,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,gBAAgB,CAAA;IACzB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;CAC3C;AAED,wBAAwB;AACxB,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC,wBAAgB,YAAY,IAAI,UAAU,CASzC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AA+DD,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAqB,GAAG,UAAU,CAoDrE;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,GAAE,MAAqB,GAAG,IAAI,CAMjF"}
@@ -9,6 +9,8 @@ import { join } from 'node:path';
9
9
  import { dshHome } from "./dsh-home.js";
10
10
  import { AFFINITY_MAX, emptyAffinity } from "./affinity.js";
11
11
  import { defaultTreatConfig, emptyTreatLedger } from "./treats.js";
12
+ import { DEFAULT_PET_ID } from "./defaults.js";
13
+ export { DEFAULT_PET_ID, DEFAULT_PET_NAME } from "./defaults.js";
12
14
  export const defaultDisplayConfig = {
13
15
  visible: true,
14
16
  size: 160,
@@ -19,10 +21,6 @@ export const defaultDisplayConfig = {
19
21
  export const DISPLAY_SIZE_MIN = 32;
20
22
  export const DISPLAY_SIZE_MAX = 512;
21
23
  export const DISPLAY_INSET_MAX = 10_000;
22
- /** Pet id the legacy single-pet installs resolve to on migration. */
23
- export const DEFAULT_PET_ID = 'whale-girl';
24
- /** Default pet name (used only when a manifest carries no displayName). */
25
- export const DEFAULT_PET_NAME = '鲸鱼娘';
26
24
  /** Name constraints. */
27
25
  export const PET_NAME_MAX_LENGTH = 20;
28
26
  export function emptyPersist() {
@@ -32,6 +30,7 @@ export function emptyPersist() {
32
30
  affinity: emptyAffinity(),
33
31
  treats: emptyTreatLedger(),
34
32
  display: { ...defaultDisplayConfig },
33
+ gameplay: {},
35
34
  };
36
35
  }
37
36
  /**
@@ -65,6 +64,43 @@ function loadPetNames(parsed) {
65
64
  function clamp(value, max) {
66
65
  return Math.min(max, Math.max(0, value));
67
66
  }
67
+ /** Absolute numeric ceilings applied at load (manifest clamps refine these). */
68
+ const GAMEPLAY_LOAD_STAT_CAP = 1_000_000;
69
+ const GAMEPLAY_LOAD_CURRENCY_CAP = 9_999_999;
70
+ /** Sanitize the persisted per-pet gameplay map. */
71
+ function loadGameplay(parsed) {
72
+ const result = {};
73
+ if (typeof parsed.gameplay !== 'object' || parsed.gameplay === null)
74
+ return result;
75
+ for (const [petId, raw] of Object.entries(parsed.gameplay)) {
76
+ if (petId === '' || typeof raw !== 'object' || raw === null)
77
+ continue;
78
+ const record = raw;
79
+ const stats = {};
80
+ if (typeof record.stats === 'object' && record.stats !== null) {
81
+ for (const [key, value] of Object.entries(record.stats)) {
82
+ if (key === '' || typeof value !== 'number' || !Number.isFinite(value))
83
+ continue;
84
+ stats[key] = Math.min(GAMEPLAY_LOAD_STAT_CAP, Math.max(0, value));
85
+ }
86
+ }
87
+ const currencies = {};
88
+ if (typeof record.currencies === 'object' && record.currencies !== null) {
89
+ for (const [key, value] of Object.entries(record.currencies)) {
90
+ if (key === '' || typeof value !== 'number' || !Number.isFinite(value))
91
+ continue;
92
+ currencies[key] = Math.min(GAMEPLAY_LOAD_CURRENCY_CAP, Math.max(0, Math.floor(value)));
93
+ }
94
+ }
95
+ result[petId] = {
96
+ stats,
97
+ currencies,
98
+ mode: record.mode === 'work' || record.mode === 'sleep' ? record.mode : null,
99
+ settledAt: clamp(finiteNum(record.settledAt, 0), Number.MAX_SAFE_INTEGER),
100
+ };
101
+ }
102
+ return result;
103
+ }
68
104
  /** Load persisted state; missing or corrupt files fall back to defaults. */
69
105
  export function loadPetPersist(dir = petHomeDir()) {
70
106
  try {
@@ -113,6 +149,7 @@ export function loadPetPersist(dir = petHomeDir()) {
113
149
  affinity,
114
150
  treats,
115
151
  display,
152
+ gameplay: loadGameplay(parsed),
116
153
  };
117
154
  }
118
155
  catch {
@@ -31,6 +31,7 @@ import { type PetRemarks, type PetRemarksManifest } from './remarks.ts';
31
31
  import { type PetPanelView, type VoicePack } from './voice-pack.ts';
32
32
  import { type DecorationView } from './contracts/status-decoration.ts';
33
33
  import { type PetRendererKind } from './manifest-v2.ts';
34
+ import type { PetGameplayManifest } from './gameplay.ts';
34
35
  /** Fixed row order of the 9-state animation contract. */
35
36
  export declare const PET_ROW_ORDER: readonly PetAnimation[];
36
37
  /** Atlas cell size in px. */
@@ -139,6 +140,26 @@ export interface PetLive2dDefinition {
139
140
  /** Hit area names triggering the tap motion; defaults to every model HitArea. */
140
141
  hitAreas?: string[];
141
142
  }
143
+ /** One frames2d track as served to the browser half. */
144
+ export interface PetFrames2dTrackView {
145
+ /** Browser URLs of the frames in play order. */
146
+ frames: string[];
147
+ /** Per-frame durations in ms; same length as frames. */
148
+ durations: number[];
149
+ /** Whether the track loops; a non-looping track ends into fallback. */
150
+ loop: boolean;
151
+ /** Track entered when a non-looping track finishes (defaults to the idle track). */
152
+ fallback?: string;
153
+ }
154
+ /** The frames2d renderer block as served to the browser half. */
155
+ export interface PetFrames2dDefinition {
156
+ /** Named tracks keyed by track id. */
157
+ tracks: Record<string, PetFrames2dTrackView>;
158
+ /** ActivityPhase -> track id; unmapped phases fall back to idle. */
159
+ phases: Partial<Record<ActivityPhase, string>> & {
160
+ idle: string;
161
+ };
162
+ }
142
163
  /** A normalized pet as served to the browser half. */
143
164
  export interface PetDefinition {
144
165
  id: string;
@@ -148,6 +169,14 @@ export interface PetDefinition {
148
169
  renderer: PetRendererKind;
149
170
  /** Live2d render block; present exactly when renderer is 'live2d' (M3). */
150
171
  live2d?: PetLive2dDefinition;
172
+ /** Frames2d render block; present exactly when renderer is 'frames2d'. */
173
+ frames2d?: PetFrames2dDefinition;
174
+ /**
175
+ * The pet's gameplay layer (miku-pet generalization), present when the
176
+ * manifest declares 'gameplay'. Shop item images are served as browser
177
+ * URLs; every other field is the validated manifest block verbatim.
178
+ */
179
+ gameplay?: PetGameplayManifest;
151
180
  /** Atlas cell size in px. */
152
181
  cell: PetCell;
153
182
  /** Columns per row. */
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAuB,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAC5F,OAAO,EAAuC,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGxG,OAAO,EAA8B,KAAK,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAElG,OAAO,EAAgE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGrH,yDAAyD;AACzD,eAAO,MAAM,aAAa,EAAE,SAAS,YAAY,EAUhD,CAAA;AAED,6BAA6B;AAC7B,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,OAAqC,CAAA;AACpE,8CAA8C;AAC9C,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,IAAI,CAAA;AAEtC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAAgC,CAAA;AAElF,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,CAQnG;AAeD,yDAAyD;AACzD,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,uDAAuD;IACvD,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,yEAAyE;IACzE,IAAI,EAAE,OAAO,CAAA;IACb,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,YAAY,CAAA;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,YAAY,EAAE;IACxD,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,CAAC,EAAE,YAAY,CAAA;CACxB,CAUA,CAAA;AAED,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAA;IACV,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAA;IACnB,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAA;IACvB,+DAA+D;IAC/D,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAA;IACxD,wFAAwF;IACxF,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;IAC1D;;;;;OAKG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAA;CAC7B;AAED,uDAAuD;AACvD,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,YAAY,CAAA;CACxB;AAED,+EAA+E;AAC/E,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAA;IAChB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAA;IACjB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+DAA+D;IAC/D,SAAS,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACtC,wEAAwE;IACxE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAClE,yEAAyE;IACzE,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAA;IACpD,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,2DAA2D;IAC3D,QAAQ,EAAE,eAAe,CAAA;IACzB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,6BAA6B;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,wDAAwD;IACxD,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAA;IACjB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IACzC,sFAAsF;IACtF,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;IAC1D,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAA;IACnB,wEAAwE;IACxE,KAAK,CAAC,EAAE,YAAY,CAAA;CACrB;AAED,uDAAuD;AACvD,MAAM,WAAW,QAAS,SAAQ,aAAa;IAC7C,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAA;IACX,+DAA+D;IAC/D,eAAe,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,QAAQ,EAAE,CAAA;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,uFAAuF;IACvF,WAAW,EAAE,qBAAqB,EAAE,CAAA;IACpC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;IACtC,2EAA2E;IAC3E,YAAY,IAAI,QAAQ,CAAA;IACxB;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;IAC/B,oCAAoC;IACpC,cAAc,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAA;CACzD;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAA;IACX,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAA;IACjB,sEAAsE;IACtE,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,4DAA4D;AAC5D,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,GAAG,SAAS,CAAA;IAC1B,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAwB;AACxB,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAA;IACnB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,oEAAoE;IACpE,KAAK,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;CAC/B;AAkFD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAC1D,QAAQ,GAAG,SAAS,CAoEtB;AAuLD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,QAAY,CAAA;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,QAAmB,CAAA;AA8DzD,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,wBAAwB,CAAA;AAuG5D;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAiFxE;AAED,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,UAAU,CAAA;AAE5C,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,CAYrE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,aAAa,CAoBpF;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAEpD"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"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"}